[med-svn] [mypy] 02/06: New upstream version 0.470-complete

Michael Crusoe misterc-guest at moszumanska.debian.org
Thu Feb 2 08:22:55 UTC 2017


This is an automated email from the git hooks/post-receive script.

misterc-guest pushed a commit to branch master
in repository mypy.

commit 51ba11b4ca96939e5ae8d1f10f61da6722b79de9
Author: Michael R. Crusoe <michael.crusoe at gmail.com>
Date:   Wed Feb 1 00:51:35 2017 -0800

    New upstream version 0.470-complete
---
 .gitignore                                         |   29 -
 .gitmodules                                        |    3 -
 .travis.yml                                        |   20 -
 CONTRIBUTING.md                                    |  152 -
 CREDITS                                            |  101 -
 LICENSE                                            |  228 --
 PKG-INFO                                           |   30 +
 README.md                                          |  307 --
 appveyor.yml                                       |   32 -
 build-requirements.txt                             |    2 -
 conftest.py                                        |    4 -
 docs/Makefile                                      |  177 -
 docs/README.md                                     |   49 -
 docs/make.bat                                      |  242 --
 docs/requirements-docs.txt                         |    2 -
 docs/source/additional_features.rst                |    9 -
 docs/source/basics.rst                             |  194 --
 docs/source/builtin_types.rst                      |   37 -
 docs/source/casts.rst                              |   39 -
 docs/source/cheat_sheet.rst                        |  241 --
 docs/source/cheat_sheet_py3.rst                    |  288 --
 docs/source/class_basics.rst                       |  157 -
 docs/source/command_line.rst                       |  402 ---
 docs/source/common_issues.rst                      |  386 ---
 docs/source/conf.py                                |  268 --
 docs/source/config_file.rst                        |  184 --
 docs/source/duck_type_compatibility.rst            |   40 -
 docs/source/dynamic_typing.rst                     |   86 -
 docs/source/faq.rst                                |  270 --
 docs/source/function_overloading.rst               |   60 -
 docs/source/generics.rst                           |  390 ---
 docs/source/getting_started.rst                    |   24 -
 docs/source/index.rst                              |   42 -
 docs/source/introduction.rst                       |   30 -
 docs/source/kinds_of_types.rst                     | 1002 ------
 docs/source/python2.rst                            |  136 -
 docs/source/python36.rst                           |  100 -
 docs/source/revision_history.rst                   |  176 -
 docs/source/supported_python_features.rst          |   20 -
 docs/source/type_inference_and_annotations.rst     |  172 -
 extensions/README.md                               |    6 -
 extensions/mypy_extensions.py                      |   97 -
 extensions/setup.py                                |   44 -
 lib-typing/2.7/setup.py                            |   46 -
 lib-typing/2.7/test_typing.py                      | 1629 ----------
 lib-typing/2.7/typing.py                           | 2016 ------------
 lib-typing/3.2/test_typing.py                      | 2063 ------------
 lib-typing/3.2/typing.py                           | 2160 -------------
 misc/actions_stubs.py                              |  111 -
 misc/analyze_cache.py                              |  189 --
 misc/async_matrix.py                               |  120 -
 misc/fix_annotate.py                               |  219 --
 misc/incremental_checker.py                        |  356 --
 misc/macs.el                                       |   22 -
 misc/perf_checker.py                               |   93 -
 misc/remove-eol-whitespace.sh                      |    8 -
 misc/test_case_to_actual.py                        |   71 -
 misc/touch_checker.py                              |  151 -
 misc/variadics.py                                  |   54 -
 mypy.egg-info/PKG-INFO                             |   30 +
 mypy.egg-info/SOURCES.txt                          |  984 ++++++
 mypy.egg-info/dependency_links.txt                 |    1 +
 mypy.egg-info/requires.txt                         |    1 +
 mypy.egg-info/top_level.txt                        |    1 +
 mypy/myunit/__init__.py                            |  380 ---
 mypy/myunit/__main__.py                            |   18 -
 mypy/test/config.py                                |   19 -
 mypy/test/data.py                                  |  468 ---
 mypy/test/helpers.py                               |  285 --
 mypy/test/testargs.py                              |   18 -
 mypy/test/testcheck.py                             |  332 --
 mypy/test/testcmdline.py                           |  104 -
 mypy/test/testextensions.py                        |  125 -
 mypy/test/testgraph.py                             |   69 -
 mypy/test/testinfer.py                             |  223 --
 mypy/test/testlex.py                               |  466 ---
 mypy/test/testmoduleinfo.py                        |   14 -
 mypy/test/testparse.py                             |   79 -
 mypy/test/testpythoneval.py                        |  135 -
 mypy/test/testreports.py                           |   40 -
 mypy/test/testsemanal.py                           |  224 --
 mypy/test/testsolve.py                             |  156 -
 mypy/test/teststubgen.py                           |  186 --
 mypy/test/testsubtypes.py                          |  208 --
 mypy/test/testtransform.py                         |   85 -
 mypy/test/testtypegen.py                           |  128 -
 mypy/test/testtypes.py                             |  847 -----
 mypy_self_check.ini                                |   15 -
 mypy_strict_optional.ini                           |    5 -
 pinfer/.gitignore                                  |    3 -
 pinfer/LICENSE                                     |   27 -
 pinfer/README                                      |   47 -
 pinfer/inspect3.py                                 |  122 -
 pinfer/p.py                                        |   83 -
 pinfer/pinfer.py                                   |  686 ----
 pinfer/test_pinfer.py                              |  302 --
 pinfer/test_pinfer3.py                             |   31 -
 pinfer/unparse.py                                  |  610 ----
 pinfer/unparse3.py                                 |  610 ----
 pytest.ini                                         |   14 -
 runtests.py                                        |  428 ---
 scripts/myunit                                     |    9 -
 setup.cfg                                          |   54 +-
 test-data/.flake8                                  |    1 -
 test-data/samples/bottles.py                       |   13 -
 test-data/samples/class.py                         |   18 -
 test-data/samples/cmdline.py                       |    8 -
 test-data/samples/crawl.py                         |  863 -----
 test-data/samples/crawl2.py                        |  852 -----
 test-data/samples/dict.py                          |    8 -
 test-data/samples/fib.py                           |    5 -
 test-data/samples/files.py                         |   14 -
 test-data/samples/for.py                           |    4 -
 test-data/samples/generators.py                    |   24 -
 test-data/samples/greet.py                         |    8 -
 test-data/samples/guess.py                         |   32 -
 test-data/samples/hello.py                         |    2 -
 test-data/samples/input.py                         |    3 -
 test-data/samples/itertool.py                      |   16 -
 test-data/samples/readme.txt                       |   25 -
 test-data/samples/regexp.py                        |    7 -
 test-data/stdlib-samples/3.2/base64.py             |  411 ---
 test-data/stdlib-samples/3.2/fnmatch.py            |  112 -
 test-data/stdlib-samples/3.2/genericpath.py        |  112 -
 test-data/stdlib-samples/3.2/getopt.py             |  220 --
 test-data/stdlib-samples/3.2/glob.py               |   84 -
 .../3.2/incomplete/logging/__init__.py             | 1873 -----------
 .../stdlib-samples/3.2/incomplete/urllib/parse.py  |  980 ------
 test-data/stdlib-samples/3.2/posixpath.py          |  466 ---
 test-data/stdlib-samples/3.2/pprint.py             |  380 ---
 test-data/stdlib-samples/3.2/random.py             |  743 -----
 test-data/stdlib-samples/3.2/shutil.py             |  790 -----
 test-data/stdlib-samples/3.2/subprocess.py         | 1703 ----------
 test-data/stdlib-samples/3.2/tempfile.py           |  717 -----
 test-data/stdlib-samples/3.2/test/randv2_32.pck    |  633 ----
 test-data/stdlib-samples/3.2/test/randv2_64.pck    |  633 ----
 test-data/stdlib-samples/3.2/test/randv3.pck       |  633 ----
 .../3.2/test/subprocessdata/fd_status.py           |   24 -
 .../3.2/test/subprocessdata/input_reader.py        |    7 -
 .../stdlib-samples/3.2/test/subprocessdata/qcat.py |    7 -
 .../3.2/test/subprocessdata/qgrep.py               |   10 -
 .../3.2/test/subprocessdata/sigchild_ignore.py     |    6 -
 test-data/stdlib-samples/3.2/test/support.py       | 1602 ---------
 test-data/stdlib-samples/3.2/test/test_base64.py   |  267 --
 test-data/stdlib-samples/3.2/test/test_fnmatch.py  |   93 -
 .../stdlib-samples/3.2/test/test_genericpath.py    |  313 --
 test-data/stdlib-samples/3.2/test/test_getopt.py   |  190 --
 test-data/stdlib-samples/3.2/test/test_glob.py     |  122 -
 .../stdlib-samples/3.2/test/test_posixpath.py      |  531 ---
 test-data/stdlib-samples/3.2/test/test_pprint.py   |  488 ---
 test-data/stdlib-samples/3.2/test/test_random.py   |  533 ---
 test-data/stdlib-samples/3.2/test/test_set.py      | 1884 -----------
 test-data/stdlib-samples/3.2/test/test_shutil.py   |  978 ------
 .../stdlib-samples/3.2/test/test_subprocess.py     | 1764 ----------
 test-data/stdlib-samples/3.2/test/test_tempfile.py | 1122 -------
 test-data/stdlib-samples/3.2/test/test_textwrap.py |  601 ----
 .../stdlib-samples/3.2/test/tf_inherit_check.py    |   25 -
 test-data/stdlib-samples/3.2/textwrap.py           |  391 ---
 test-data/unit/check-abstract.test                 |  734 -----
 test-data/unit/check-async-await.test              |  376 ---
 test-data/unit/check-basic.test                    |  310 --
 test-data/unit/check-bound.test                    |  203 --
 test-data/unit/check-callable.test                 |  345 --
 test-data/unit/check-class-namedtuple.test         |  378 ---
 test-data/unit/check-classes.test                  | 2430 --------------
 test-data/unit/check-columns.test                  |   68 -
 test-data/unit/check-dynamic-typing.test           |  676 ----
 test-data/unit/check-expressions.test              | 1652 ----------
 test-data/unit/check-fastparse.test                |  191 --
 test-data/unit/check-flags.test                    |  242 --
 test-data/unit/check-functions.test                | 1666 ----------
 test-data/unit/check-generic-subtyping.test        |  749 -----
 test-data/unit/check-generics.test                 | 1419 --------
 test-data/unit/check-ignore.test                   |  218 --
 test-data/unit/check-incremental.test              | 1780 ----------
 test-data/unit/check-inference-context.test        |  820 -----
 test-data/unit/check-inference.test                | 1765 ----------
 test-data/unit/check-isinstance.test               | 1330 --------
 test-data/unit/check-kwargs.test                   |  339 --
 test-data/unit/check-lists.test                    |   72 -
 test-data/unit/check-modules.test                  | 1408 --------
 test-data/unit/check-multiple-inheritance.test     |  242 --
 test-data/unit/check-namedtuple.test               |  429 ---
 test-data/unit/check-newsyntax.test                |   87 -
 test-data/unit/check-newtype.test                  |  319 --
 test-data/unit/check-optional.test                 |  527 ---
 test-data/unit/check-overloading.test              |  759 -----
 test-data/unit/check-python2.test                  |  221 --
 test-data/unit/check-selftype.test                 |  358 ---
 test-data/unit/check-semanal-error.test            |   81 -
 test-data/unit/check-statements.test               | 1322 --------
 test-data/unit/check-super.test                    |  109 -
 test-data/unit/check-tuples.test                   |  927 ------
 test-data/unit/check-type-aliases.test             |   74 -
 test-data/unit/check-type-checks.test              |  113 -
 test-data/unit/check-type-promotion.test           |   39 -
 test-data/unit/check-typeddict.test                |  462 ---
 test-data/unit/check-typevar-values.test           |  505 ---
 test-data/unit/check-underscores.test              |   16 -
 test-data/unit/check-unions.test                   |  140 -
 test-data/unit/check-unreachable-code.test         |  459 ---
 test-data/unit/check-unsupported.test              |   15 -
 test-data/unit/check-varargs.test                  |  590 ----
 test-data/unit/check-warnings.test                 |  132 -
 test-data/unit/cmdline.test                        |  479 ---
 test-data/unit/fixtures/__new__.pyi                |   14 -
 test-data/unit/fixtures/alias.pyi                  |   12 -
 test-data/unit/fixtures/args.pyi                   |   29 -
 test-data/unit/fixtures/async_await.pyi            |    9 -
 test-data/unit/fixtures/bool.pyi                   |   14 -
 test-data/unit/fixtures/callable.pyi               |   26 -
 test-data/unit/fixtures/classmethod.pyi            |   22 -
 test-data/unit/fixtures/complex.pyi                |   11 -
 test-data/unit/fixtures/dict.pyi                   |   34 -
 test-data/unit/fixtures/exception.pyi              |   12 -
 test-data/unit/fixtures/for.pyi                    |   19 -
 test-data/unit/fixtures/function.pyi               |   10 -
 test-data/unit/fixtures/isinstance.pyi             |   22 -
 test-data/unit/fixtures/isinstancelist.pyi         |   44 -
 test-data/unit/fixtures/list.pyi                   |   30 -
 test-data/unit/fixtures/module.pyi                 |   18 -
 test-data/unit/fixtures/module_all.pyi             |   15 -
 test-data/unit/fixtures/module_all_python2.pyi     |   16 -
 test-data/unit/fixtures/ops.pyi                    |   56 -
 test-data/unit/fixtures/primitives.pyi             |   17 -
 test-data/unit/fixtures/property.pyi               |   17 -
 test-data/unit/fixtures/python2.pyi                |   18 -
 test-data/unit/fixtures/set.pyi                    |   21 -
 test-data/unit/fixtures/slice.pyi                  |   13 -
 test-data/unit/fixtures/staticmethod.pyi           |   18 -
 test-data/unit/fixtures/transform.pyi              |   30 -
 test-data/unit/fixtures/tuple-simple.pyi           |   20 -
 test-data/unit/fixtures/tuple.pyi                  |   28 -
 test-data/unit/fixtures/union.pyi                  |   18 -
 test-data/unit/lib-stub/__builtin__.pyi            |   27 -
 test-data/unit/lib-stub/abc.pyi                    |    3 -
 test-data/unit/lib-stub/builtins.pyi               |   23 -
 test-data/unit/lib-stub/collections.pyi            |    3 -
 test-data/unit/lib-stub/mypy_extensions.pyi        |    6 -
 test-data/unit/lib-stub/sys.pyi                    |    2 -
 test-data/unit/lib-stub/types.pyi                  |    4 -
 test-data/unit/lib-stub/typing.pyi                 |   90 -
 test-data/unit/parse-errors.test                   |  496 ---
 test-data/unit/parse-python2.test                  |  399 ---
 test-data/unit/parse.test                          | 3401 --------------------
 test-data/unit/python2eval.test                    |  471 ---
 test-data/unit/pythoneval-asyncio.test             |  486 ---
 test-data/unit/pythoneval-enum.test                |  134 -
 test-data/unit/pythoneval.test                     | 1214 -------
 test-data/unit/semanal-abstractclasses.test        |  119 -
 test-data/unit/semanal-basic.test                  |  459 ---
 test-data/unit/semanal-classes.test                |  623 ----
 test-data/unit/semanal-errors.test                 | 1323 --------
 test-data/unit/semanal-expressions.test            |  395 ---
 test-data/unit/semanal-modules.test                |  877 -----
 test-data/unit/semanal-namedtuple.test             |  177 -
 test-data/unit/semanal-python2.test                |   76 -
 test-data/unit/semanal-statements.test             |  925 ------
 test-data/unit/semanal-symtable.test               |   52 -
 test-data/unit/semanal-typealiases.test            |  440 ---
 test-data/unit/semanal-typeddict.test              |   81 -
 test-data/unit/semanal-typeinfo.test               |   80 -
 test-data/unit/semanal-types.test                  | 1476 ---------
 test-data/unit/stubgen.test                        |  565 ----
 test-data/unit/typexport-basic.test                | 1159 -------
 test-requirements.txt                              |    9 -
 tmp-test-dirs/.gitignore                           |    4 -
 typeshed/stdlib/2/BaseHTTPServer.pyi               |   47 +
 typeshed/stdlib/2/ConfigParser.pyi                 |   96 +
 typeshed/stdlib/2/Cookie.pyi                       |   44 +
 typeshed/stdlib/2/HTMLParser.pyi                   |   31 +
 typeshed/stdlib/2/Queue.pyi                        |   29 +
 typeshed/stdlib/2/SocketServer.pyi                 |   93 +
 typeshed/stdlib/2/StringIO.pyi                     |   30 +
 typeshed/stdlib/2/UserDict.pyi                     |   38 +
 typeshed/stdlib/2/UserList.pyi                     |    3 +
 typeshed/stdlib/2/UserString.pyi                   |    4 +
 typeshed/stdlib/2/__builtin__.pyi                  |  947 ++++++
 typeshed/stdlib/2/__future__.pyi                   |   13 +
 typeshed/stdlib/2/_ast.pyi                         |  328 ++
 typeshed/stdlib/2/_codecs.pyi                      |   55 +
 typeshed/stdlib/2/_collections.pyi                 |   41 +
 typeshed/stdlib/2/_functools.pyi                   |   20 +
 typeshed/stdlib/2/_hotshot.pyi                     |   34 +
 typeshed/stdlib/2/_io.pyi                          |  107 +
 typeshed/stdlib/2/_json.pyi                        |   19 +
 typeshed/stdlib/2/_md5.pyi                         |   13 +
 typeshed/stdlib/2/_random.pyi                      |   13 +
 typeshed/stdlib/2/_sha.pyi                         |   15 +
 typeshed/stdlib/2/_sha256.pyi                      |   23 +
 typeshed/stdlib/2/_sha512.pyi                      |   23 +
 typeshed/stdlib/2/_socket.pyi                      |  287 ++
 typeshed/stdlib/2/_sre.pyi                         |   53 +
 typeshed/stdlib/2/_struct.pyi                      |   22 +
 typeshed/stdlib/2/_symtable.pyi                    |   39 +
 typeshed/stdlib/2/_warnings.pyi                    |   11 +
 typeshed/stdlib/2/_weakref.pyi                     |   21 +
 typeshed/stdlib/2/_weakrefset.pyi                  |   14 +
 typeshed/stdlib/2/abc.pyi                          |   37 +
 typeshed/stdlib/2/array.pyi                        |   56 +
 typeshed/stdlib/2/ast.pyi                          |   40 +
 typeshed/stdlib/2/atexit.pyi                       |    5 +
 typeshed/stdlib/2/base64.pyi                       |   25 +
 typeshed/stdlib/2/binascii.pyi                     |   21 +
 typeshed/stdlib/2/builtins.pyi                     |  947 ++++++
 typeshed/stdlib/2/cPickle.pyi                      |   32 +
 typeshed/stdlib/2/cStringIO.pyi                    |   50 +
 typeshed/stdlib/2/calendar.pyi                     |   92 +
 typeshed/stdlib/2/codecs.pyi                       |  203 ++
 typeshed/stdlib/2/collections.pyi                  |  108 +
 typeshed/stdlib/2/commands.pyi                     |    5 +
 typeshed/stdlib/2/compileall.pyi                   |    7 +
 typeshed/stdlib/2/cookielib.pyi                    |  110 +
 typeshed/stdlib/2/copy.pyi                         |   10 +
 typeshed/stdlib/2/csv.pyi                          |   88 +
 typeshed/stdlib/2/datetime.pyi                     |  212 ++
 typeshed/stdlib/2/decimal.pyi                      |  245 ++
 typeshed/stdlib/2/difflib.pyi                      |   64 +
 .../stdlib/2/distutils/__init__.pyi                |    0
 typeshed/stdlib/2/distutils/emxccompiler.pyi       |    5 +
 typeshed/stdlib/2/doctest.pyi                      |    9 +
 typeshed/stdlib/2/email/MIMEText.pyi               |    8 +
 typeshed/stdlib/2/email/__init__.pyi               |    6 +
 typeshed/stdlib/2/email/_parseaddr.pyi             |   44 +
 .../stdlib/2/email/mime/__init__.pyi               |    0
 typeshed/stdlib/2/email/mime/base.pyi              |   10 +
 typeshed/stdlib/2/email/mime/multipart.pyi         |    8 +
 typeshed/stdlib/2/email/mime/nonmultipart.pyi      |    8 +
 typeshed/stdlib/2/email/mime/text.pyi              |    8 +
 typeshed/stdlib/2/email/utils.pyi                  |   22 +
 typeshed/stdlib/2/encodings/__init__.pyi           |    6 +
 typeshed/stdlib/2/encodings/utf_8.pyi              |   14 +
 typeshed/stdlib/2/exceptions.pyi                   |   80 +
 typeshed/stdlib/2/fcntl.pyi                        |   87 +
 typeshed/stdlib/2/fileinput.pyi                    |   46 +
 typeshed/stdlib/2/fnmatch.pyi                      |    6 +
 typeshed/stdlib/2/functools.pyi                    |   34 +
 typeshed/stdlib/2/future_builtins.pyi              |   14 +
 typeshed/stdlib/2/gc.pyi                           |   29 +
 typeshed/stdlib/2/genericpath.pyi                  |   14 +
 typeshed/stdlib/2/getopt.pyi                       |   17 +
 typeshed/stdlib/2/getpass.pyi                      |    8 +
 typeshed/stdlib/2/gettext.pyi                      |   43 +
 typeshed/stdlib/2/glob.pyi                         |    4 +
 typeshed/stdlib/2/grp.pyi                          |   11 +
 typeshed/stdlib/2/gzip.pyi                         |   41 +
 typeshed/stdlib/2/hashlib.pyi                      |   27 +
 typeshed/stdlib/2/heapq.pyi                        |   15 +
 typeshed/stdlib/2/htmlentitydefs.pyi               |    9 +
 typeshed/stdlib/2/httplib.pyi                      |  189 ++
 typeshed/stdlib/2/imp.pyi                          |   35 +
 typeshed/stdlib/2/importlib.pyi                    |    3 +
 typeshed/stdlib/2/inspect.pyi                      |   88 +
 typeshed/stdlib/2/io.pyi                           |  105 +
 typeshed/stdlib/2/itertools.pyi                    |   87 +
 typeshed/stdlib/2/json.pyi                         |   97 +
 typeshed/stdlib/2/linecache.pyi                    |    7 +
 typeshed/stdlib/2/markupbase.pyi                   |    9 +
 typeshed/stdlib/2/md5.pyi                          |   11 +
 typeshed/stdlib/2/mimetools.pyi                    |   31 +
 typeshed/stdlib/2/multiprocessing/__init__.pyi     |   32 +
 typeshed/stdlib/2/multiprocessing/process.pyi      |   39 +
 typeshed/stdlib/2/multiprocessing/util.pyi         |   33 +
 typeshed/stdlib/2/optparse.pyi                     |  249 ++
 typeshed/stdlib/2/os/__init__.pyi                  |  303 ++
 typeshed/stdlib/2/os/path.pyi                      |   65 +
 typeshed/stdlib/2/pdb.pyi                          |   30 +
 typeshed/stdlib/2/pickle.pyi                       |   38 +
 typeshed/stdlib/2/pipes.pyi                        |   13 +
 typeshed/stdlib/2/platform.pyi                     |   45 +
 typeshed/stdlib/2/posix.pyi                        |  205 ++
 typeshed/stdlib/2/posixpath.pyi                    |   50 +
 typeshed/stdlib/2/pprint.pyi                       |   24 +
 typeshed/stdlib/2/pwd.pyi                          |   17 +
 typeshed/stdlib/2/quopri.pyi                       |    8 +
 typeshed/stdlib/2/random.pyi                       |   76 +
 typeshed/stdlib/2/re.pyi                           |   99 +
 typeshed/stdlib/2/resource.pyi                     |   33 +
 typeshed/stdlib/2/rfc822.pyi                       |   79 +
 typeshed/stdlib/2/robotparser.pyi                  |    7 +
 typeshed/stdlib/2/runpy.pyi                        |   21 +
 typeshed/stdlib/2/select.pyi                       |  100 +
 typeshed/stdlib/2/sha.pyi                          |   11 +
 typeshed/stdlib/2/shelve.pyi                       |   33 +
 typeshed/stdlib/2/shlex.pyi                        |   27 +
 typeshed/stdlib/2/shutil.pyi                       |   30 +
 typeshed/stdlib/2/signal.pyi                       |   62 +
 typeshed/stdlib/2/smtplib.pyi                      |   90 +
 typeshed/stdlib/2/socket.pyi                       |  362 +++
 typeshed/stdlib/2/spwd.pyi                         |   15 +
 typeshed/stdlib/2/sqlite3/__init__.pyi             |    5 +
 typeshed/stdlib/2/sqlite3/dbapi2.pyi               |  256 ++
 typeshed/stdlib/2/ssl.pyi                          |  204 ++
 typeshed/stdlib/2/stat.pyi                         |   59 +
 typeshed/stdlib/2/string.pyi                       |   74 +
 typeshed/stdlib/2/strop.pyi                        |   72 +
 typeshed/stdlib/2/struct.pyi                       |   28 +
 typeshed/stdlib/2/subprocess.pyi                   |  109 +
 typeshed/stdlib/2/sys.pyi                          |  137 +
 typeshed/stdlib/2/syslog.pyi                       |   38 +
 typeshed/stdlib/2/tempfile.pyi                     |  104 +
 typeshed/stdlib/2/textwrap.pyi                     |   33 +
 typeshed/stdlib/2/thread.pyi                       |   33 +
 typeshed/stdlib/2/time.pyi                         |   51 +
 typeshed/stdlib/2/token.pyi                        |   62 +
 typeshed/stdlib/2/tokenize.pyi                     |  143 +
 typeshed/stdlib/2/types.pyi                        |  161 +
 typeshed/stdlib/2/typing.pyi                       |  360 +++
 typeshed/stdlib/2/unicodedata.pyi                  |   40 +
 typeshed/stdlib/2/unittest.pyi                     |  176 +
 typeshed/stdlib/2/urllib.pyi                       |  135 +
 typeshed/stdlib/2/urllib2.pyi                      |  160 +
 typeshed/stdlib/2/urlparse.pyi                     |   68 +
 typeshed/stdlib/2/uuid.pyi                         |   36 +
 typeshed/stdlib/2/weakref.pyi                      |   47 +
 .../stdlib/2/wsgiref/__init__.pyi                  |    0
 typeshed/stdlib/2/wsgiref/validate.pyi             |   47 +
 .../stdlib/2/xml/__init__.pyi                      |    0
 typeshed/stdlib/2/xml/etree/ElementInclude.pyi     |   19 +
 typeshed/stdlib/2/xml/etree/ElementPath.pyi        |   35 +
 typeshed/stdlib/2/xml/etree/ElementTree.pyi        |  116 +
 .../stdlib/2/xml/etree/__init__.pyi                |    0
 typeshed/stdlib/2/xml/etree/cElementTree.pyi       |    5 +
 typeshed/stdlib/2/xxsubtype.pyi                    |   17 +
 typeshed/stdlib/2/zlib.pyi                         |   42 +
 typeshed/stdlib/2and3/_bisect.pyi                  |   11 +
 typeshed/stdlib/2and3/_heapq.pyi                   |   15 +
 typeshed/stdlib/2and3/argparse.pyi                 |  155 +
 typeshed/stdlib/2and3/asynchat.pyi                 |   41 +
 typeshed/stdlib/2and3/asyncore.pyi                 |  132 +
 typeshed/stdlib/2and3/bisect.pyi                   |   22 +
 typeshed/stdlib/2and3/bz2.pyi                      |   33 +
 typeshed/stdlib/2and3/cProfile.pyi                 |   18 +
 typeshed/stdlib/2and3/cmath.pyi                    |   34 +
 typeshed/stdlib/2and3/code.pyi                     |   27 +
 typeshed/stdlib/2and3/colorsys.pyi                 |   15 +
 typeshed/stdlib/2and3/contextlib.pyi               |   53 +
 .../stdlib/2and3/distutils/__init__.pyi            |    0
 typeshed/stdlib/2and3/distutils/archive_util.pyi   |   12 +
 typeshed/stdlib/2and3/distutils/bcppcompiler.pyi   |    6 +
 typeshed/stdlib/2and3/distutils/ccompiler.pyi      |  119 +
 typeshed/stdlib/2and3/distutils/cmd.pyi            |   15 +
 .../stdlib/2and3/distutils/command/__init__.pyi    |    0
 .../stdlib/2and3/distutils/command/bdist.pyi       |    0
 .../stdlib/2and3/distutils/command/bdist_dumb.pyi  |    0
 .../stdlib/2and3/distutils/command/bdist_msi.pyi   |    5 +
 .../2and3/distutils/command/bdist_packager.pyi     |    0
 .../stdlib/2and3/distutils/command/bdist_rpm.pyi   |    0
 .../2and3/distutils/command/bdist_wininst.pyi      |    0
 .../stdlib/2and3/distutils/command/build.pyi       |    0
 .../stdlib/2and3/distutils/command/build_clib.pyi  |    0
 .../stdlib/2and3/distutils/command/build_ext.pyi   |    0
 .../stdlib/2and3/distutils/command/build_py.pyi    |    8 +
 .../2and3/distutils/command/build_scripts.pyi      |    0
 .../stdlib/2and3/distutils/command/check.pyi       |    0
 .../stdlib/2and3/distutils/command/clean.pyi       |    0
 .../stdlib/2and3/distutils/command/config.pyi      |    0
 .../stdlib/2and3/distutils/command/install.pyi     |    0
 .../2and3/distutils/command/install_data.pyi       |    0
 .../2and3/distutils/command/install_headers.pyi    |    0
 .../stdlib/2and3/distutils/command/install_lib.pyi |    0
 .../2and3/distutils/command/install_scripts.pyi    |    0
 .../stdlib/2and3/distutils/command/register.pyi    |    0
 .../stdlib/2and3/distutils/command/sdist.pyi       |    0
 typeshed/stdlib/2and3/distutils/core.pyi           |   35 +
 .../stdlib/2and3/distutils/cygwinccompiler.pyi     |    7 +
 typeshed/stdlib/2and3/distutils/debug.pyi          |    3 +
 typeshed/stdlib/2and3/distutils/dep_util.pyi       |    8 +
 typeshed/stdlib/2and3/distutils/dir_util.pyi       |   15 +
 typeshed/stdlib/2and3/distutils/dist.pyi           |    7 +
 typeshed/stdlib/2and3/distutils/errors.pyi         |    4 +
 typeshed/stdlib/2and3/distutils/extension.pyi      |   39 +
 typeshed/stdlib/2and3/distutils/fancy_getopt.pyi   |   27 +
 typeshed/stdlib/2and3/distutils/file_util.pyi      |   12 +
 typeshed/stdlib/2and3/distutils/filelist.pyi       |    3 +
 .../stdlib/2and3/distutils/log.pyi                 |    0
 typeshed/stdlib/2and3/distutils/msvccompiler.pyi   |    6 +
 typeshed/stdlib/2and3/distutils/spawn.pyi          |    8 +
 typeshed/stdlib/2and3/distutils/sysconfig.pyi      |   19 +
 typeshed/stdlib/2and3/distutils/text_file.pyi      |   18 +
 typeshed/stdlib/2and3/distutils/unixccompiler.pyi  |    6 +
 typeshed/stdlib/2and3/distutils/util.pyi           |   20 +
 typeshed/stdlib/2and3/distutils/version.pyi        |   35 +
 typeshed/stdlib/2and3/errno.pyi                    |  129 +
 typeshed/stdlib/2and3/fractions.pyi                |   94 +
 typeshed/stdlib/2and3/hmac.pyi                     |   35 +
 typeshed/stdlib/2and3/keyword.pyi                  |    6 +
 typeshed/stdlib/2and3/locale.pyi                   |  104 +
 typeshed/stdlib/2and3/logging/__init__.pyi         |  397 +++
 typeshed/stdlib/2and3/logging/config.pyi           |   25 +
 typeshed/stdlib/2and3/logging/handlers.pyi         |  200 ++
 typeshed/stdlib/2and3/marshal.pyi                  |    8 +
 typeshed/stdlib/2and3/math.pyi                     |   66 +
 typeshed/stdlib/2and3/mimetypes.pyi                |   38 +
 typeshed/stdlib/2and3/mmap.pyi                     |   79 +
 typeshed/stdlib/2and3/numbers.pyi                  |  140 +
 typeshed/stdlib/2and3/operator.pyi                 |  227 ++
 typeshed/stdlib/2and3/pkgutil.pyi                  |   31 +
 typeshed/stdlib/2and3/plistlib.pyi                 |   60 +
 typeshed/stdlib/2and3/profile.pyi                  |   21 +
 typeshed/stdlib/2and3/pstats.pyi                   |   33 +
 typeshed/stdlib/2and3/readline.pyi                 |   41 +
 typeshed/stdlib/2and3/rlcompleter.pyi              |   13 +
 typeshed/stdlib/2and3/site.pyi                     |   17 +
 typeshed/stdlib/2and3/tarfile.pyi                  |  178 +
 typeshed/stdlib/2and3/termios.pyi                  |  246 ++
 typeshed/stdlib/2and3/threading.pyi                |  191 ++
 typeshed/stdlib/2and3/traceback.pyi                |  100 +
 typeshed/stdlib/2and3/warnings.pyi                 |   39 +
 typeshed/stdlib/2and3/webbrowser.pyi               |  100 +
 typeshed/stdlib/2and3/xml/__init__.pyi             |   20 +
 typeshed/stdlib/2and3/xml/sax/__init__.pyi         |   34 +
 typeshed/stdlib/2and3/xml/sax/handler.pyi          |   50 +
 typeshed/stdlib/2and3/xml/sax/saxutils.pyi         |   58 +
 typeshed/stdlib/2and3/xml/sax/xmlreader.pyi        |   75 +
 typeshed/stdlib/2and3/zipfile.pyi                  |   94 +
 typeshed/stdlib/2and3/zipimport.pyi                |   18 +
 .../stdlib/3.2/xml/__init__.pyi                    |    0
 typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi   |   19 +
 typeshed/stdlib/3.2/xml/etree/ElementPath.pyi      |   35 +
 typeshed/stdlib/3.2/xml/etree/ElementTree.pyi      |  120 +
 .../stdlib/3.2/xml/etree/__init__.pyi              |    0
 typeshed/stdlib/3.2/xml/etree/cElementTree.pyi     |    5 +
 typeshed/stdlib/3.3/ipaddress.pyi                  |  200 ++
 .../stdlib/3.3/xml/__init__.pyi                    |    0
 typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi   |   19 +
 typeshed/stdlib/3.3/xml/etree/ElementPath.pyi      |   35 +
 typeshed/stdlib/3.3/xml/etree/ElementTree.pyi      |  113 +
 .../stdlib/3.3/xml/etree/__init__.pyi              |    0
 typeshed/stdlib/3.3/xml/etree/cElementTree.pyi     |    5 +
 typeshed/stdlib/3.4/_stat.pyi                      |   69 +
 typeshed/stdlib/3.4/_tracemalloc.pyi               |   26 +
 typeshed/stdlib/3.4/asyncio/__init__.pyi           |   97 +
 typeshed/stdlib/3.4/asyncio/coroutines.pyi         |    9 +
 typeshed/stdlib/3.4/asyncio/events.pyi             |  177 +
 typeshed/stdlib/3.4/asyncio/futures.pyi            |   46 +
 typeshed/stdlib/3.4/asyncio/locks.pyi              |   59 +
 typeshed/stdlib/3.4/asyncio/protocols.pyi          |   24 +
 typeshed/stdlib/3.4/asyncio/queues.pyi             |   46 +
 typeshed/stdlib/3.4/asyncio/streams.pyi            |  105 +
 typeshed/stdlib/3.4/asyncio/subprocess.pyi         |   60 +
 typeshed/stdlib/3.4/asyncio/tasks.pyi              |   55 +
 typeshed/stdlib/3.4/asyncio/transports.pyi         |   38 +
 typeshed/stdlib/3.4/enum.pyi                       |   50 +
 typeshed/stdlib/3.4/pathlib.pyi                    |  111 +
 typeshed/stdlib/3.4/selectors.pyi                  |   90 +
 .../stdlib/3.4/xml/__init__.pyi                    |    0
 typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi   |   19 +
 typeshed/stdlib/3.4/xml/etree/ElementPath.pyi      |   35 +
 typeshed/stdlib/3.4/xml/etree/ElementTree.pyi      |  118 +
 .../stdlib/3.4/xml/etree/__init__.pyi              |    0
 typeshed/stdlib/3.4/xml/etree/cElementTree.pyi     |    5 +
 .../stdlib/3.5/xml/__init__.pyi                    |    0
 typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi   |   19 +
 typeshed/stdlib/3.5/xml/etree/ElementPath.pyi      |   35 +
 typeshed/stdlib/3.5/xml/etree/ElementTree.pyi      |  118 +
 .../stdlib/3.5/xml/etree/__init__.pyi              |    0
 typeshed/stdlib/3.5/xml/etree/cElementTree.pyi     |    5 +
 typeshed/stdlib/3.6/secrets.pyi                    |   14 +
 typeshed/stdlib/3/__future__.pyi                   |   16 +
 typeshed/stdlib/3/_ast.pyi                         |  358 +++
 typeshed/stdlib/3/_codecs.pyi                      |   51 +
 typeshed/stdlib/3/_compression.pyi                 |   20 +
 typeshed/stdlib/3/_curses.pyi                      |  297 ++
 typeshed/stdlib/3/_dummy_thread.pyi                |   11 +
 typeshed/stdlib/3/_importlib_modulespec.pyi        |   43 +
 typeshed/stdlib/3/_json.pyi                        |   30 +
 typeshed/stdlib/3/_markupbase.pyi                  |    9 +
 typeshed/stdlib/3/_operator.pyi                    |   71 +
 typeshed/stdlib/3/_posixsubprocess.pyi             |   13 +
 typeshed/stdlib/3/_random.pyi                      |   12 +
 typeshed/stdlib/3/_subprocess.pyi                  |   38 +
 typeshed/stdlib/3/_thread.pyi                      |   15 +
 typeshed/stdlib/3/_warnings.pyi                    |   11 +
 typeshed/stdlib/3/abc.pyi                          |   13 +
 typeshed/stdlib/3/array.pyi                        |   49 +
 typeshed/stdlib/3/ast.pyi                          |   39 +
 typeshed/stdlib/3/atexit.pyi                       |    9 +
 typeshed/stdlib/3/base64.pyi                       |   42 +
 typeshed/stdlib/3/binascii.pyi                     |   26 +
 typeshed/stdlib/3/builtins.pyi                     |  908 ++++++
 typeshed/stdlib/3/calendar.pyi                     |   92 +
 typeshed/stdlib/3/cgi.pyi                          |    4 +
 typeshed/stdlib/3/codecs.pyi                       |  194 ++
 typeshed/stdlib/3/collections/__init__.pyi         |  178 +
 typeshed/stdlib/3/collections/abc.pyi              |   38 +
 .../stdlib/3/concurrent/__init__.pyi               |    0
 typeshed/stdlib/3/concurrent/futures/__init__.pyi  |    3 +
 typeshed/stdlib/3/concurrent/futures/_base.pyi     |   44 +
 typeshed/stdlib/3/concurrent/futures/process.pyi   |   14 +
 typeshed/stdlib/3/concurrent/futures/thread.pyi    |   10 +
 typeshed/stdlib/3/configparser.pyi                 |  188 ++
 typeshed/stdlib/3/copy.pyi                         |   10 +
 typeshed/stdlib/3/csv.pyi                          |   77 +
 typeshed/stdlib/3/curses/__init__.pyi              |   12 +
 typeshed/stdlib/3/datetime.pyi                     |  223 ++
 typeshed/stdlib/3/decimal.pyi                      |  256 ++
 typeshed/stdlib/3/difflib.pyi                      |   62 +
 typeshed/stdlib/3/dis.pyi                          |   63 +
 typeshed/stdlib/3/doctest.pyi                      |    9 +
 typeshed/stdlib/3/email/__init__.pyi               |   46 +
 typeshed/stdlib/3/email/charset.pyi                |   27 +
 typeshed/stdlib/3/email/contentmanager.pyi         |   22 +
 typeshed/stdlib/3/email/encoders.pyi               |    8 +
 typeshed/stdlib/3/email/errors.pyi                 |   22 +
 typeshed/stdlib/3/email/feedparser.pyi             |   28 +
 typeshed/stdlib/3/email/generator.pyi              |   45 +
 typeshed/stdlib/3/email/header.pyi                 |   25 +
 typeshed/stdlib/3/email/headerregistry.pyi         |  102 +
 typeshed/stdlib/3/email/iterators.pyi              |    8 +
 typeshed/stdlib/3/email/message.pyi                |  130 +
 .../stdlib/3/email/mime}/__init__.py               |    0
 typeshed/stdlib/3/email/mime/application.pyi       |   11 +
 typeshed/stdlib/3/email/mime/audio.pyi             |   11 +
 typeshed/stdlib/3/email/mime/base.pyi              |   10 +
 typeshed/stdlib/3/email/mime/image.pyi             |   11 +
 typeshed/stdlib/3/email/mime/message.pyi           |    7 +
 typeshed/stdlib/3/email/mime/multipart.pyi         |   12 +
 typeshed/stdlib/3/email/mime/nonmultipart.pyi      |    5 +
 typeshed/stdlib/3/email/mime/text.pyi              |    8 +
 typeshed/stdlib/3/email/parser.pyi                 |   61 +
 typeshed/stdlib/3/email/policy.pyi                 |   69 +
 typeshed/stdlib/3/email/utils.pyi                  |   33 +
 typeshed/stdlib/3/encodings/__init__.pyi           |    6 +
 typeshed/stdlib/3/encodings/utf_8.pyi              |   14 +
 typeshed/stdlib/3/fcntl.pyi                        |   96 +
 typeshed/stdlib/3/fileinput.pyi                    |   48 +
 typeshed/stdlib/3/fnmatch.pyi                      |   11 +
 typeshed/stdlib/3/functools.pyi                    |   64 +
 typeshed/stdlib/3/gc.pyi                           |   28 +
 typeshed/stdlib/3/getopt.pyi                       |   19 +
 typeshed/stdlib/3/getpass.pyi                      |   13 +
 typeshed/stdlib/3/gettext.pyi                      |   44 +
 typeshed/stdlib/3/glob.pyi                         |   15 +
 typeshed/stdlib/3/grp.pyi                          |   13 +
 typeshed/stdlib/3/gzip.pyi                         |   51 +
 typeshed/stdlib/3/hashlib.pyi                      |   40 +
 typeshed/stdlib/3/heapq.pyi                        |   23 +
 typeshed/stdlib/3/html/__init__.pyi                |    4 +
 typeshed/stdlib/3/html/entities.pyi                |   10 +
 typeshed/stdlib/3/html/parser.pyi                  |   33 +
 typeshed/stdlib/3/http/__init__.pyi                |   68 +
 typeshed/stdlib/3/http/client.pyi                  |  194 ++
 typeshed/stdlib/3/http/cookiejar.pyi               |  112 +
 typeshed/stdlib/3/http/cookies.pyi                 |   31 +
 typeshed/stdlib/3/http/server.pyi                  |   63 +
 typeshed/stdlib/3/imp.pyi                          |   10 +
 typeshed/stdlib/3/importlib/__init__.pyi           |   18 +
 typeshed/stdlib/3/importlib/abc.pyi                |   89 +
 typeshed/stdlib/3/importlib/machinery.pyi          |  185 ++
 typeshed/stdlib/3/importlib/util.pyi               |   55 +
 typeshed/stdlib/3/inspect.pyi                      |  289 ++
 typeshed/stdlib/3/io.pyi                           |  259 ++
 typeshed/stdlib/3/itertools.pyi                    |   63 +
 typeshed/stdlib/3/json.pyi                         |   88 +
 typeshed/stdlib/3/linecache.pyi                    |    5 +
 typeshed/stdlib/3/msvcrt.pyi                       |    8 +
 typeshed/stdlib/3/multiprocessing/__init__.pyi     |   99 +
 typeshed/stdlib/3/multiprocessing/managers.pyi     |   10 +
 typeshed/stdlib/3/multiprocessing/pool.pyi         |   58 +
 typeshed/stdlib/3/multiprocessing/process.pyi      |    5 +
 typeshed/stdlib/3/opcode.pyi                       |   18 +
 typeshed/stdlib/3/os/__init__.pyi                  |  386 +++
 typeshed/stdlib/3/os/path.pyi                      |   65 +
 typeshed/stdlib/3/pdb.pyi                          |   30 +
 typeshed/stdlib/3/pickle.pyi                       |   67 +
 typeshed/stdlib/3/pipes.pyi                        |   19 +
 typeshed/stdlib/3/platform.pyi                     |   34 +
 typeshed/stdlib/3/posix.pyi                        |    6 +
 typeshed/stdlib/3/posixpath.pyi                    |   46 +
 typeshed/stdlib/3/pprint.pyi                       |   23 +
 typeshed/stdlib/3/pwd.pyi                          |   18 +
 typeshed/stdlib/3/pyclbr.pyi                       |   40 +
 typeshed/stdlib/3/queue.pyi                        |   24 +
 typeshed/stdlib/3/random.pyi                       |   67 +
 typeshed/stdlib/3/re.pyi                           |  106 +
 typeshed/stdlib/3/resource.pyi                     |   32 +
 typeshed/stdlib/3/runpy.pyi                        |   21 +
 typeshed/stdlib/3/select.pyi                       |   27 +
 typeshed/stdlib/3/shelve.pyi                       |   31 +
 typeshed/stdlib/3/shlex.pyi                        |   39 +
 typeshed/stdlib/3/shutil.pyi                       |   51 +
 typeshed/stdlib/3/signal.pyi                       |  180 ++
 typeshed/stdlib/3/smtplib.pyi                      |   94 +
 typeshed/stdlib/3/socket.pyi                       |  361 +++
 typeshed/stdlib/3/socketserver.pyi                 |   93 +
 typeshed/stdlib/3/sqlite3/__init__.pyi             |    5 +
 typeshed/stdlib/3/sqlite3/dbapi2.pyi               |  256 ++
 typeshed/stdlib/3/ssl.pyi                          |  285 ++
 typeshed/stdlib/3/stat.pyi                         |   73 +
 typeshed/stdlib/3/string.pyi                       |   42 +
 typeshed/stdlib/3/struct.pyi                       |   30 +
 typeshed/stdlib/3/subprocess.pyi                   |  249 ++
 typeshed/stdlib/3/sys.pyi                          |  161 +
 typeshed/stdlib/3/sysconfig.pyi                    |    8 +
 typeshed/stdlib/3/tempfile.pyi                     |   51 +
 typeshed/stdlib/3/textwrap.pyi                     |  122 +
 typeshed/stdlib/3/time.pyi                         |   84 +
 typeshed/stdlib/3/tkinter/__init__.pyi             |  660 ++++
 typeshed/stdlib/3/tkinter/constants.pyi            |   83 +
 typeshed/stdlib/3/tkinter/ttk.pyi                  |  158 +
 typeshed/stdlib/3/token.pyi                        |   63 +
 typeshed/stdlib/3/tokenize.pyi                     |   99 +
 typeshed/stdlib/3/types.pyi                        |  151 +
 typeshed/stdlib/3/typing.pyi                       |  449 +++
 typeshed/stdlib/3/unicodedata.pyi                  |   37 +
 typeshed/stdlib/3/unittest/__init__.pyi            |  333 ++
 typeshed/stdlib/3/unittest/mock.pyi                |  163 +
 .../stdlib/3/urllib/__init__.pyi                   |    0
 typeshed/stdlib/3/urllib/error.pyi                 |   11 +
 typeshed/stdlib/3/urllib/parse.pyi                 |  152 +
 typeshed/stdlib/3/urllib/request.pyi               |  201 ++
 typeshed/stdlib/3/urllib/response.pyi              |    8 +
 typeshed/stdlib/3/urllib/robotparser.pyi           |   18 +
 typeshed/stdlib/3/uuid.pyi                         |   73 +
 typeshed/stdlib/3/weakref.pyi                      |  120 +
 .../stdlib/3/wsgiref/__init__.pyi                  |    0
 typeshed/stdlib/3/wsgiref/validate.pyi             |   47 +
 typeshed/stdlib/3/xml/etree/ElementInclude.pyi     |   19 +
 typeshed/stdlib/3/xml/etree/ElementPath.pyi        |   25 +
 typeshed/stdlib/3/xml/etree/ElementTree.pyi        |   98 +
 .../stdlib/3/xml/etree/__init__.pyi                |    0
 typeshed/stdlib/3/xml/etree/cElementTree.pyi       |    5 +
 typeshed/stdlib/3/zlib.pyi                         |   46 +
 typeshed/tests/mypy_test.py                        |  149 +
 typeshed/tests/pytype_test.py                      |  109 +
 .../third_party/2/OpenSSL/__init__.pyi             |    0
 typeshed/third_party/2/OpenSSL/crypto.pyi          |    6 +
 .../third_party/2/concurrent/__init__.pyi          |    0
 .../third_party/2/concurrent/futures/__init__.pyi  |   37 +
 typeshed/third_party/2/croniter.pyi                |   27 +
 .../third_party/2/dateutil/__init__.pyi            |    0
 typeshed/third_party/2/dateutil/parser.pyi         |   39 +
 typeshed/third_party/2/dateutil/relativedelta.pyi  |   86 +
 typeshed/third_party/2/enum.pyi                    |   19 +
 typeshed/third_party/2/fb303/FacebookService.pyi   |  301 ++
 .../third_party/2/fb303/__init__.pyi               |    0
 typeshed/third_party/2/gflags.pyi                  |  214 ++
 .../third_party/2/google/__init__.pyi              |    0
 .../third_party/2/google/protobuf/__init__.pyi     |    1 +
 .../third_party/2/google/protobuf/descriptor.pyi   |  165 +
 .../2/google/protobuf/descriptor_pb2.pyi           |    2 +
 .../2/google/protobuf/descriptor_pool.pyi          |   22 +
 .../2/google/protobuf/internal/__init__.pyi        |    0
 .../2/google/protobuf/internal/decoder.pyi         |   34 +
 .../2/google/protobuf/internal/encoder.pyi         |   38 +
 .../google/protobuf/internal/enum_type_wrapper.pyi |   11 +
 .../2/google/protobuf/internal/wire_format.pyi     |   54 +
 typeshed/third_party/2/google/protobuf/message.pyi |   36 +
 .../2/google/protobuf/message_factory.pyi          |   17 +
 .../third_party/2/google/protobuf/reflection.pyi   |   10 +
 .../2/google/protobuf/symbol_database.pyi          |   18 +
 typeshed/third_party/2/itsdangerous.pyi            |  153 +
 typeshed/third_party/2/kazoo/__init__.pyi          |    3 +
 typeshed/third_party/2/kazoo/client.pyi            |  100 +
 typeshed/third_party/2/kazoo/exceptions.pyi        |   62 +
 typeshed/third_party/2/kazoo/recipe/__init__.pyi   |    3 +
 typeshed/third_party/2/kazoo/recipe/watchers.pyi   |   25 +
 typeshed/third_party/2/pycurl.pyi                  |  378 +++
 typeshed/third_party/2/pymssql.pyi                 |   48 +
 typeshed/third_party/2/redis/__init__.pyi          |   28 +
 typeshed/third_party/2/redis/client.pyi            |  293 ++
 typeshed/third_party/2/redis/connection.pyi        |  135 +
 typeshed/third_party/2/redis/exceptions.pyi        |   21 +
 typeshed/third_party/2/redis/utils.pyi             |   12 +
 typeshed/third_party/2/requests/__init__.pyi       |   39 +
 typeshed/third_party/2/requests/adapters.pyi       |   72 +
 typeshed/third_party/2/requests/api.pyi            |   21 +
 typeshed/third_party/2/requests/auth.pyi           |   41 +
 typeshed/third_party/2/requests/compat.pyi         |    6 +
 typeshed/third_party/2/requests/cookies.pyi        |   61 +
 typeshed/third_party/2/requests/exceptions.pyi     |   26 +
 typeshed/third_party/2/requests/hooks.pyi          |    8 +
 typeshed/third_party/2/requests/models.pyi         |  135 +
 .../third_party/2/requests/packages/__init__.pyi   |    8 +
 .../2/requests/packages/urllib3/__init__.pyi       |   12 +
 .../2/requests/packages/urllib3/_collections.pyi   |   51 +
 .../2/requests/packages/urllib3/connection.pyi     |   51 +
 .../2/requests/packages/urllib3/connectionpool.pyi |   87 +
 .../requests/packages/urllib3/contrib/__init__.pyi |    3 +
 .../2/requests/packages/urllib3/exceptions.pyi     |   54 +
 .../2/requests/packages/urllib3/fields.pyi         |   16 +
 .../2/requests/packages/urllib3/filepost.pyi       |   19 +
 .../packages/urllib3/packages/__init__.pyi         |    3 +
 .../packages/ssl_match_hostname/__init__.pyi       |    1 +
 .../ssl_match_hostname/_implementation.pyi         |    7 +
 .../2/requests/packages/urllib3/poolmanager.pyi    |   31 +
 .../2/requests/packages/urllib3/request.pyi        |   13 +
 .../2/requests/packages/urllib3/response.pyi       |   58 +
 .../2/requests/packages/urllib3/util/__init__.pyi  |    6 +
 .../requests/packages/urllib3/util/connection.pyi  |   11 +
 .../2/requests/packages/urllib3/util/request.pyi   |   12 +
 .../2/requests/packages/urllib3/util/response.pyi  |    5 +
 .../2/requests/packages/urllib3/util/retry.pyi     |   36 +
 .../2/requests/packages/urllib3/util/timeout.pyi   |   24 +
 .../2/requests/packages/urllib3/util/url.pyi       |   26 +
 typeshed/third_party/2/requests/sessions.pyi       |  106 +
 typeshed/third_party/2/requests/status_codes.pyi   |    8 +
 typeshed/third_party/2/requests/structures.pyi     |   12 +
 typeshed/third_party/2/requests/utils.pyi          |   52 +
 typeshed/third_party/2/routes/__init__.pyi         |   19 +
 typeshed/third_party/2/routes/mapper.pyi           |   70 +
 typeshed/third_party/2/routes/util.pyi             |   24 +
 .../third_party/2/scribe/__init__.pyi              |    0
 typeshed/third_party/2/scribe/scribe.pyi           |   43 +
 typeshed/third_party/2/scribe/ttypes.pyi           |   22 +
 .../2/selenium/webdriver/remote/webdriver.pyi      |  111 +
 .../2/selenium/webdriver/remote/webelement.pyi     |   65 +
 typeshed/third_party/2/simplejson/__init__.pyi     |   10 +
 typeshed/third_party/2/simplejson/decoder.pyi      |    6 +
 typeshed/third_party/2/simplejson/encoder.pyi      |    9 +
 typeshed/third_party/2/simplejson/scanner.pyi      |    7 +
 typeshed/third_party/2/six/__init__.pyi            |   91 +
 typeshed/third_party/2/six/moves/__init__.pyi      |   31 +
 typeshed/third_party/2/six/moves/cPickle.pyi       |    6 +
 .../third_party/2/six/moves/urllib/__init__.pyi    |   10 +
 typeshed/third_party/2/six/moves/urllib/error.pyi  |    8 +
 typeshed/third_party/2/six/moves/urllib/parse.pyi  |   30 +
 .../third_party/2/six/moves/urllib/request.pyi     |   38 +
 .../third_party/2/six/moves/urllib/response.pyi    |    9 +
 .../third_party/2/six/moves/urllib/robotparser.pyi |    6 +
 typeshed/third_party/2/six/moves/urllib_error.pyi  |   10 +
 typeshed/third_party/2/six/moves/urllib_parse.pyi  |   28 +
 .../third_party/2/six/moves/urllib_request.pyi     |   40 +
 .../third_party/2/six/moves/urllib_response.pyi    |   11 +
 .../third_party/2/six/moves/urllib_robotparser.pyi |    8 +
 typeshed/third_party/2/sqlalchemy/__init__.pyi     |  124 +
 .../2/sqlalchemy/databases/__init__.pyi            |   12 +
 .../third_party/2/sqlalchemy/databases/mysql.pyi   |    1 +
 .../third_party/2/sqlalchemy/dialects/__init__.pyi |   12 +
 .../2/sqlalchemy/dialects/mysql/__init__.pyi       |   40 +
 .../2/sqlalchemy/dialects/mysql/base.pyi           |  413 +++
 .../third_party/2/sqlalchemy/engine/__init__.pyi   |   11 +
 typeshed/third_party/2/sqlalchemy/engine/base.pyi  |   21 +
 .../third_party/2/sqlalchemy/engine/strategies.pyi |   39 +
 typeshed/third_party/2/sqlalchemy/engine/url.pyi   |   27 +
 typeshed/third_party/2/sqlalchemy/exc.pyi          |   77 +
 typeshed/third_party/2/sqlalchemy/inspection.pyi   |    5 +
 typeshed/third_party/2/sqlalchemy/log.pyi          |   14 +
 typeshed/third_party/2/sqlalchemy/orm/__init__.pyi |   95 +
 typeshed/third_party/2/sqlalchemy/orm/session.pyi  |   93 +
 typeshed/third_party/2/sqlalchemy/pool.pyi         |  118 +
 typeshed/third_party/2/sqlalchemy/schema.pyi       |   50 +
 typeshed/third_party/2/sqlalchemy/sql/__init__.pyi |   66 +
 .../third_party/2/sqlalchemy/sql/annotation.pyi    |   11 +
 typeshed/third_party/2/sqlalchemy/sql/base.pyi     |   42 +
 typeshed/third_party/2/sqlalchemy/sql/ddl.pyi      |   25 +
 typeshed/third_party/2/sqlalchemy/sql/dml.pyi      |   20 +
 typeshed/third_party/2/sqlalchemy/sql/elements.pyi |   60 +
 .../third_party/2/sqlalchemy/sql/expression.pyi    |   87 +
 .../third_party/2/sqlalchemy/sql/functions.pyi     |   47 +
 typeshed/third_party/2/sqlalchemy/sql/naming.pyi   |    1 +
 .../third_party/2/sqlalchemy/sql/operators.pyi     |   99 +
 typeshed/third_party/2/sqlalchemy/sql/schema.pyi   |  126 +
 .../third_party/2/sqlalchemy/sql/selectable.pyi    |   74 +
 typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi |   57 +
 typeshed/third_party/2/sqlalchemy/sql/type_api.pyi |   16 +
 typeshed/third_party/2/sqlalchemy/sql/visitors.pyi |   33 +
 typeshed/third_party/2/sqlalchemy/types.pyi        |   51 +
 .../third_party/2/sqlalchemy/util/__init__.pyi     |  133 +
 .../third_party/2/sqlalchemy/util/_collections.pyi |  214 ++
 typeshed/third_party/2/sqlalchemy/util/compat.pyi  |   67 +
 .../third_party/2/sqlalchemy/util/deprecations.pyi |   13 +
 .../third_party/2/sqlalchemy/util/langhelpers.pyi  |  134 +
 typeshed/third_party/2/thrift/Thrift.pyi           |   55 +
 .../third_party/2/thrift/__init__.pyi              |    0
 .../2/thrift/protocol/TBinaryProtocol.pyi          |   66 +
 .../third_party/2/thrift/protocol/TProtocol.pyi    |   80 +
 .../third_party/2/thrift/protocol/__init__.pyi     |   11 +
 .../third_party/2/thrift/transport/TSocket.pyi     |   33 +
 .../third_party/2/thrift/transport/TTransport.pyi  |  111 +
 .../third_party/2/thrift/transport/__init__.pyi    |    9 +
 .../third_party/2/tornado/__init__.pyi             |    0
 typeshed/third_party/2/tornado/concurrent.pyi      |   47 +
 typeshed/third_party/2/tornado/gen.pyi             |  113 +
 typeshed/third_party/2/tornado/httpclient.pyi      |  112 +
 typeshed/third_party/2/tornado/httpserver.pyi      |   45 +
 typeshed/third_party/2/tornado/httputil.pyi        |   93 +
 typeshed/third_party/2/tornado/ioloop.pyi          |   88 +
 typeshed/third_party/2/tornado/locks.pyi           |   49 +
 typeshed/third_party/2/tornado/netutil.pyi         |   49 +
 typeshed/third_party/2/tornado/tcpserver.pyi       |   21 +
 typeshed/third_party/2/tornado/testing.pyi         |   64 +
 typeshed/third_party/2/tornado/util.pyi            |   50 +
 typeshed/third_party/2/tornado/web.pyi             |  261 ++
 typeshed/third_party/2/werkzeug/__init__.pyi       |  155 +
 typeshed/third_party/2/werkzeug/_compat.pyi        |   47 +
 typeshed/third_party/2/werkzeug/_internal.pyi      |   22 +
 typeshed/third_party/2/werkzeug/_reloader.pyi      |   33 +
 .../third_party/2/werkzeug/contrib/__init__.pyi    |    3 +
 typeshed/third_party/2/werkzeug/contrib/atom.pyi   |   54 +
 typeshed/third_party/2/werkzeug/contrib/cache.pyi  |   77 +
 typeshed/third_party/2/werkzeug/contrib/fixers.pyi |   41 +
 typeshed/third_party/2/werkzeug/contrib/iterio.pyi |   42 +
 .../third_party/2/werkzeug/contrib/jsrouting.pyi   |   14 +
 .../third_party/2/werkzeug/contrib/limiter.pyi     |   11 +
 typeshed/third_party/2/werkzeug/contrib/lint.pyi   |   47 +
 .../third_party/2/werkzeug/contrib/profiler.pyi    |   18 +
 .../2/werkzeug/contrib/securecookie.pyi            |   30 +
 .../third_party/2/werkzeug/contrib/sessions.pyi    |   58 +
 .../third_party/2/werkzeug/contrib/testtools.pyi   |   13 +
 .../third_party/2/werkzeug/contrib/wrappers.pyi    |   31 +
 typeshed/third_party/2/werkzeug/datastructures.pyi |  389 +++
 typeshed/third_party/2/werkzeug/debug/__init__.pyi |   40 +
 typeshed/third_party/2/werkzeug/debug/console.pyi  |   48 +
 typeshed/third_party/2/werkzeug/debug/repr.pyi     |   37 +
 typeshed/third_party/2/werkzeug/debug/tbtools.pyi  |   67 +
 typeshed/third_party/2/werkzeug/exceptions.pyi     |  140 +
 typeshed/third_party/2/werkzeug/filesystem.pyi     |   11 +
 typeshed/third_party/2/werkzeug/formparser.pyi     |   44 +
 typeshed/third_party/2/werkzeug/http.pyi           |   41 +
 typeshed/third_party/2/werkzeug/local.pyi          |  104 +
 typeshed/third_party/2/werkzeug/posixemulation.pyi |   11 +
 typeshed/third_party/2/werkzeug/routing.pyi        |  181 ++
 typeshed/third_party/2/werkzeug/script.pyi         |   16 +
 typeshed/third_party/2/werkzeug/security.pyi       |   16 +
 typeshed/third_party/2/werkzeug/serving.pyi        |   83 +
 typeshed/third_party/2/werkzeug/test.pyi           |   85 +
 typeshed/third_party/2/werkzeug/testapp.pyi        |   13 +
 typeshed/third_party/2/werkzeug/urls.pyi           |   69 +
 typeshed/third_party/2/werkzeug/useragents.pyi     |   18 +
 typeshed/third_party/2/werkzeug/utils.pyi          |   53 +
 typeshed/third_party/2/werkzeug/wrappers.pyi       |  194 ++
 typeshed/third_party/2/werkzeug/wsgi.pyi           |   88 +
 typeshed/third_party/2/yaml/__init__.pyi           |   51 +
 typeshed/third_party/2/yaml/composer.pyi           |   21 +
 typeshed/third_party/2/yaml/constructor.pyi        |   70 +
 typeshed/third_party/2/yaml/dumper.pyi             |   17 +
 typeshed/third_party/2/yaml/emitter.pyi            |  110 +
 typeshed/third_party/2/yaml/error.pyi              |   25 +
 typeshed/third_party/2/yaml/events.pyi             |   66 +
 typeshed/third_party/2/yaml/loader.pyi             |   19 +
 typeshed/third_party/2/yaml/nodes.pyi              |   35 +
 typeshed/third_party/2/yaml/parser.pyi             |   48 +
 typeshed/third_party/2/yaml/reader.pyi             |   38 +
 typeshed/third_party/2/yaml/representer.pyi        |   56 +
 typeshed/third_party/2/yaml/resolver.pyi           |   26 +
 typeshed/third_party/2/yaml/scanner.pyi            |  100 +
 typeshed/third_party/2/yaml/serializer.pyi         |   27 +
 typeshed/third_party/2/yaml/tokens.pyi             |   97 +
 typeshed/third_party/2and3/Crypto/Cipher/AES.pyi   |   23 +
 typeshed/third_party/2and3/Crypto/Cipher/ARC2.pyi  |   23 +
 typeshed/third_party/2and3/Crypto/Cipher/ARC4.pyi  |   19 +
 .../third_party/2and3/Crypto/Cipher/Blowfish.pyi   |   23 +
 typeshed/third_party/2and3/Crypto/Cipher/CAST.pyi  |   23 +
 typeshed/third_party/2and3/Crypto/Cipher/DES.pyi   |   23 +
 typeshed/third_party/2and3/Crypto/Cipher/DES3.pyi  |   24 +
 .../third_party/2and3/Crypto/Cipher/PKCS1_OAEP.pyi |   17 +
 .../third_party/2and3/Crypto/Cipher/PKCS1_v1_5.pyi |   17 +
 typeshed/third_party/2and3/Crypto/Cipher/XOR.pyi   |   20 +
 .../third_party/2and3/Crypto/Cipher/__init__.pyi   |   15 +
 .../third_party/2and3/Crypto/Cipher/blockalgo.pyi  |   21 +
 typeshed/third_party/2and3/Crypto/Hash/HMAC.pyi    |   20 +
 typeshed/third_party/2and3/Crypto/Hash/MD2.pyi     |   17 +
 typeshed/third_party/2and3/Crypto/Hash/MD4.pyi     |   17 +
 typeshed/third_party/2and3/Crypto/Hash/MD5.pyi     |   17 +
 typeshed/third_party/2and3/Crypto/Hash/RIPEMD.pyi  |   17 +
 typeshed/third_party/2and3/Crypto/Hash/SHA.pyi     |   17 +
 typeshed/third_party/2and3/Crypto/Hash/SHA224.pyi  |   17 +
 typeshed/third_party/2and3/Crypto/Hash/SHA256.pyi  |   17 +
 typeshed/third_party/2and3/Crypto/Hash/SHA384.pyi  |   17 +
 typeshed/third_party/2and3/Crypto/Hash/SHA512.pyi  |   17 +
 .../third_party/2and3/Crypto/Hash/__init__.pyi     |   15 +
 .../third_party/2and3/Crypto/Hash/hashalgo.pyi     |   15 +
 .../2and3/Crypto/Protocol/AllOrNothing.pyi         |   14 +
 .../third_party/2and3/Crypto/Protocol/Chaffing.pyi |    9 +
 typeshed/third_party/2and3/Crypto/Protocol/KDF.pyi |   11 +
 .../third_party/2and3/Crypto/Protocol/__init__.pyi |    8 +
 .../third_party/2and3/Crypto/PublicKey/DSA.pyi     |   31 +
 .../third_party/2and3/Crypto/PublicKey/ElGamal.pyi |   23 +
 .../third_party/2and3/Crypto/PublicKey/RSA.pyi     |   36 +
 .../2and3/Crypto/PublicKey/__init__.pyi            |    8 +
 .../third_party/2and3/Crypto/PublicKey/pubkey.pyi  |   25 +
 .../Crypto/Random/Fortuna/FortunaAccumulator.pyi   |   29 +
 .../Crypto/Random/Fortuna/FortunaGenerator.pyi     |   20 +
 .../2and3/Crypto/Random/Fortuna/SHAd256.pyi        |   17 +
 .../2and3/Crypto/Random/Fortuna/__init__.pyi       |    3 +
 .../2and3/Crypto/Random/OSRNG/__init__.pyi         |    5 +
 .../2and3/Crypto/Random/OSRNG/fallback.pyi         |    9 +
 .../2and3/Crypto/Random/OSRNG/posix.pyi            |   10 +
 .../2and3/Crypto/Random/OSRNG/rng_base.pyi         |   15 +
 .../third_party/2and3/Crypto/Random/__init__.pyi   |    5 +
 .../third_party/2and3/Crypto/Random/random.pyi     |   21 +
 .../2and3/Crypto/Signature/PKCS1_PSS.pyi           |   13 +
 .../2and3/Crypto/Signature/PKCS1_v1_5.pyi          |   12 +
 .../2and3/Crypto/Signature/__init__.pyi            |    7 +
 typeshed/third_party/2and3/Crypto/Util/Counter.pyi |    7 +
 typeshed/third_party/2and3/Crypto/Util/RFC1751.pyi |   13 +
 .../third_party/2and3/Crypto/Util/__init__.pyi     |   10 +
 typeshed/third_party/2and3/Crypto/Util/asn1.pyi    |   49 +
 typeshed/third_party/2and3/Crypto/Util/number.pyi  |   26 +
 .../third_party/2and3/Crypto/Util/randpool.pyi     |   20 +
 typeshed/third_party/2and3/Crypto/Util/strxor.pyi  |    6 +
 typeshed/third_party/2and3/Crypto/__init__.pyi     |   11 +
 typeshed/third_party/2and3/Crypto/pct_warnings.pyi |   11 +
 .../third_party/2and3/atomicwrites/__init__.pyi    |   16 +
 .../third_party/2and3/backports/__init__.pyi       |    0
 .../2and3/backports/ssl_match_hostname.pyi         |    3 +
 typeshed/third_party/2and3/backports_abc.pyi       |   19 +
 typeshed/third_party/2and3/boto/__init__.pyi       |   80 +
 typeshed/third_party/2and3/boto/auth.pyi           |  112 +
 typeshed/third_party/2and3/boto/auth_handler.pyi   |   13 +
 typeshed/third_party/2and3/boto/compat.pyi         |   14 +
 typeshed/third_party/2and3/boto/connection.pyi     |  119 +
 typeshed/third_party/2and3/boto/ec2/__init__.pyi   |   11 +
 typeshed/third_party/2and3/boto/elb/__init__.pyi   |   43 +
 typeshed/third_party/2and3/boto/exception.pyi      |  150 +
 typeshed/third_party/2and3/boto/plugin.pyi         |   13 +
 typeshed/third_party/2and3/boto/regioninfo.pyi     |   20 +
 typeshed/third_party/2and3/boto/s3/__init__.pyi    |   16 +
 typeshed/third_party/2and3/boto/s3/acl.pyi         |   43 +
 typeshed/third_party/2and3/boto/s3/bucket.pyi      |   98 +
 .../2and3/boto/s3/bucketlistresultset.pyi          |   44 +
 .../third_party/2and3/boto/s3/bucketlogging.pyi    |   15 +
 typeshed/third_party/2and3/boto/s3/connection.pyi  |   71 +
 typeshed/third_party/2and3/boto/s3/cors.pyi        |   23 +
 .../third_party/2and3/boto/s3/deletemarker.pyi     |   16 +
 typeshed/third_party/2and3/boto/s3/key.pyi         |   91 +
 typeshed/third_party/2and3/boto/s3/keyfile.pyi     |   33 +
 typeshed/third_party/2and3/boto/s3/lifecycle.pyi   |   55 +
 typeshed/third_party/2and3/boto/s3/multidelete.pyi |   31 +
 typeshed/third_party/2and3/boto/s3/multipart.pyi   |   53 +
 typeshed/third_party/2and3/boto/s3/prefix.pyi      |   14 +
 typeshed/third_party/2and3/boto/s3/tagging.pyi     |   26 +
 typeshed/third_party/2and3/boto/s3/user.pyi        |   14 +
 typeshed/third_party/2and3/boto/s3/website.pyi     |   66 +
 typeshed/third_party/2and3/certifi.pyi             |    2 +
 .../third_party/2and3/characteristic/__init__.pyi  |   34 +
 typeshed/third_party/2and3/jinja2/__init__.pyi     |   11 +
 typeshed/third_party/2and3/jinja2/_compat.pyi      |   38 +
 typeshed/third_party/2and3/jinja2/_stringdefs.pyi  |   44 +
 typeshed/third_party/2and3/jinja2/bccache.pyi      |   48 +
 typeshed/third_party/2and3/jinja2/compiler.pyi     |  180 ++
 typeshed/third_party/2and3/jinja2/constants.pyi    |    5 +
 typeshed/third_party/2and3/jinja2/debug.pyi        |   41 +
 typeshed/third_party/2and3/jinja2/defaults.pyi     |   25 +
 typeshed/third_party/2and3/jinja2/environment.pyi  |  109 +
 typeshed/third_party/2and3/jinja2/exceptions.pyi   |   37 +
 typeshed/third_party/2and3/jinja2/ext.pyi          |   62 +
 typeshed/third_party/2and3/jinja2/filters.pyi      |   61 +
 typeshed/third_party/2and3/jinja2/lexer.pyi        |  121 +
 typeshed/third_party/2and3/jinja2/loaders.pyi      |   74 +
 typeshed/third_party/2and3/jinja2/meta.pyi         |   15 +
 typeshed/third_party/2and3/jinja2/nodes.pyi        |  254 ++
 typeshed/third_party/2and3/jinja2/optimizer.pyi    |   33 +
 typeshed/third_party/2and3/jinja2/parser.pyi       |   64 +
 typeshed/third_party/2and3/jinja2/runtime.pyi      |  134 +
 typeshed/third_party/2and3/jinja2/sandbox.pyi      |   38 +
 typeshed/third_party/2and3/jinja2/tests.pyi        |   28 +
 typeshed/third_party/2and3/jinja2/utils.pyi        |   64 +
 typeshed/third_party/2and3/jinja2/visitor.pyi      |   12 +
 typeshed/third_party/2and3/markupsafe/__init__.pyi |   58 +
 typeshed/third_party/2and3/markupsafe/_compat.pyi  |   23 +
 .../third_party/2and3/markupsafe/_constants.pyi    |    7 +
 typeshed/third_party/2and3/markupsafe/_native.pyi  |   11 +
 .../third_party/2and3/markupsafe/_speedups.pyi     |   11 +
 typeshed/third_party/2and3/mypy_extensions.pyi     |   11 +
 typeshed/third_party/2and3/pytz/__init__.pyi       |   26 +
 typeshed/third_party/2and3/pytz/lazy.pyi           |   13 +
 typeshed/third_party/2and3/singledispatch.pyi      |   17 +
 typeshed/third_party/2and3/ujson.pyi               |   51 +
 typeshed/third_party/3.6/click/__init__.pyi        |   98 +
 typeshed/third_party/3.6/click/core.pyi            |  435 +++
 typeshed/third_party/3.6/click/decorators.pyi      |  218 ++
 typeshed/third_party/3.6/click/exceptions.pyi      |   91 +
 typeshed/third_party/3.6/click/formatting.pyi      |   89 +
 typeshed/third_party/3.6/click/globals.pyi         |   17 +
 typeshed/third_party/3.6/click/parser.pyi          |  102 +
 typeshed/third_party/3.6/click/termui.pyi          |  147 +
 typeshed/third_party/3.6/click/types.pyi           |  283 ++
 typeshed/third_party/3.6/click/utils.pyi           |  118 +
 .../third_party/3/dateutil/__init__.pyi            |    0
 typeshed/third_party/3/dateutil/parser.pyi         |   52 +
 typeshed/third_party/3/dateutil/relativedelta.pyi  |  112 +
 typeshed/third_party/3/docutils/__init__.pyi       |    1 +
 typeshed/third_party/3/docutils/examples.pyi       |    3 +
 typeshed/third_party/3/docutils/nodes.pyi          |    8 +
 .../third_party/3/docutils/parsers/__init__.pyi    |    1 +
 .../3/docutils/parsers/rst/__init__.pyi            |    0
 .../third_party/3/docutils/parsers/rst/nodes.pyi   |    1 +
 .../third_party/3/docutils/parsers/rst/roles.pyi   |   10 +
 .../third_party/3/docutils/parsers/rst/states.pyi  |    5 +
 typeshed/third_party/3/enum.pyi                    |   50 +
 typeshed/third_party/3/itsdangerous.pyi            |  156 +
 .../third_party/3/lxml/__init__.pyi                |    0
 typeshed/third_party/3/lxml/etree.pyi              |  169 +
 typeshed/third_party/3/lxml/objectify.pyi          |   13 +
 typeshed/third_party/3/pkg_resources.pyi           |  313 ++
 typeshed/third_party/3/requests/__init__.pyi       |   39 +
 typeshed/third_party/3/requests/adapters.pyi       |   72 +
 typeshed/third_party/3/requests/api.pyi            |   18 +
 typeshed/third_party/3/requests/auth.pyi           |   41 +
 typeshed/third_party/3/requests/compat.pyi         |    6 +
 typeshed/third_party/3/requests/cookies.pyi        |   65 +
 typeshed/third_party/3/requests/exceptions.pyi     |   26 +
 typeshed/third_party/3/requests/hooks.pyi          |    8 +
 typeshed/third_party/3/requests/models.pyi         |  136 +
 .../third_party/3/requests/packages/__init__.pyi   |    8 +
 .../3/requests/packages/urllib3/__init__.pyi       |   35 +
 .../3/requests/packages/urllib3/_collections.pyi   |   51 +
 .../3/requests/packages/urllib3/connection.pyi     |   64 +
 .../3/requests/packages/urllib3/connectionpool.pyi |   89 +
 .../requests/packages/urllib3/contrib/__init__.pyi |    3 +
 .../3/requests/packages/urllib3/exceptions.pyi     |   54 +
 .../3/requests/packages/urllib3/fields.pyi         |   16 +
 .../3/requests/packages/urllib3/filepost.pyi       |   19 +
 .../packages/urllib3/packages/__init__.pyi         |    3 +
 .../packages/ssl_match_hostname/__init__.pyi       |    8 +
 .../ssl_match_hostname/_implementation.pyi         |    7 +
 .../3/requests/packages/urllib3/poolmanager.pyi    |   31 +
 .../3/requests/packages/urllib3/request.pyi        |   13 +
 .../3/requests/packages/urllib3/response.pyi       |   58 +
 .../3/requests/packages/urllib3/util/__init__.pyi  |   29 +
 .../requests/packages/urllib3/util/connection.pyi  |   11 +
 .../3/requests/packages/urllib3/util/request.pyi   |   12 +
 .../3/requests/packages/urllib3/util/response.pyi  |    5 +
 .../3/requests/packages/urllib3/util/retry.pyi     |   36 +
 .../3/requests/packages/urllib3/util/ssl_.pyi      |   24 +
 .../3/requests/packages/urllib3/util/timeout.pyi   |   24 +
 .../3/requests/packages/urllib3/util/url.pyi       |   26 +
 typeshed/third_party/3/requests/sessions.pyi       |  108 +
 typeshed/third_party/3/requests/status_codes.pyi   |    8 +
 typeshed/third_party/3/requests/structures.pyi     |   12 +
 typeshed/third_party/3/requests/utils.pyi          |   52 +
 typeshed/third_party/3/six/__init__.pyi            |  103 +
 typeshed/third_party/3/six/moves/__init__.pyi      |   34 +
 typeshed/third_party/3/six/moves/cPickle.pyi       |    6 +
 .../third_party/3/six/moves/urllib/__init__.pyi    |   10 +
 typeshed/third_party/3/six/moves/urllib/error.pyi  |    8 +
 typeshed/third_party/3/six/moves/urllib/parse.pyi  |   22 +
 .../third_party/3/six/moves/urllib/request.pyi     |   40 +
 .../third_party/3/six/moves/urllib/response.pyi    |    1 +
 .../third_party/3/six/moves/urllib/robotparser.pyi |    6 +
 typeshed/third_party/3/six/moves/urllib_error.pyi  |   10 +
 typeshed/third_party/3/six/moves/urllib_parse.pyi  |   20 +
 .../third_party/3/six/moves/urllib_request.pyi     |   41 +
 .../third_party/3/six/moves/urllib_response.pyi    |    1 +
 .../third_party/3/six/moves/urllib_robotparser.pyi |    8 +
 typeshed/third_party/3/typed_ast/__init__.pyi      |    2 +
 typeshed/third_party/3/typed_ast/ast27.pyi         |  360 +++
 typeshed/third_party/3/typed_ast/ast35.pyi         |  392 +++
 typeshed/third_party/3/typed_ast/conversions.pyi   |    4 +
 typeshed/third_party/3/werkzeug/__init__.pyi       |  154 +
 typeshed/third_party/3/werkzeug/_compat.pyi        |   47 +
 typeshed/third_party/3/werkzeug/_internal.pyi      |   22 +
 typeshed/third_party/3/werkzeug/_reloader.pyi      |   33 +
 .../third_party/3/werkzeug/contrib/__init__.pyi    |    3 +
 typeshed/third_party/3/werkzeug/contrib/atom.pyi   |   54 +
 typeshed/third_party/3/werkzeug/contrib/cache.pyi  |   87 +
 typeshed/third_party/3/werkzeug/contrib/fixers.pyi |   41 +
 typeshed/third_party/3/werkzeug/contrib/iterio.pyi |   42 +
 .../third_party/3/werkzeug/contrib/jsrouting.pyi   |   14 +
 .../third_party/3/werkzeug/contrib/limiter.pyi     |   11 +
 typeshed/third_party/3/werkzeug/contrib/lint.pyi   |   47 +
 .../third_party/3/werkzeug/contrib/profiler.pyi    |   18 +
 .../3/werkzeug/contrib/securecookie.pyi            |   30 +
 .../third_party/3/werkzeug/contrib/sessions.pyi    |   58 +
 .../third_party/3/werkzeug/contrib/testtools.pyi   |   13 +
 .../third_party/3/werkzeug/contrib/wrappers.pyi    |   31 +
 typeshed/third_party/3/werkzeug/datastructures.pyi |  389 +++
 typeshed/third_party/3/werkzeug/debug/__init__.pyi |   43 +
 typeshed/third_party/3/werkzeug/debug/console.pyi  |   48 +
 typeshed/third_party/3/werkzeug/debug/repr.pyi     |   37 +
 typeshed/third_party/3/werkzeug/debug/tbtools.pyi  |   67 +
 typeshed/third_party/3/werkzeug/exceptions.pyi     |  152 +
 typeshed/third_party/3/werkzeug/filesystem.pyi     |   11 +
 typeshed/third_party/3/werkzeug/formparser.pyi     |   44 +
 typeshed/third_party/3/werkzeug/http.pyi           |   42 +
 typeshed/third_party/3/werkzeug/local.pyi          |  104 +
 typeshed/third_party/3/werkzeug/posixemulation.pyi |   11 +
 typeshed/third_party/3/werkzeug/routing.pyi        |  182 ++
 typeshed/third_party/3/werkzeug/script.pyi         |   16 +
 typeshed/third_party/3/werkzeug/security.pyi       |   16 +
 typeshed/third_party/3/werkzeug/serving.pyi        |   84 +
 typeshed/third_party/3/werkzeug/test.pyi           |   85 +
 typeshed/third_party/3/werkzeug/testapp.pyi        |   13 +
 typeshed/third_party/3/werkzeug/urls.pyi           |   71 +
 typeshed/third_party/3/werkzeug/useragents.pyi     |   18 +
 typeshed/third_party/3/werkzeug/utils.pyi          |   53 +
 typeshed/third_party/3/werkzeug/wrappers.pyi       |  194 ++
 typeshed/third_party/3/werkzeug/wsgi.pyi           |   88 +
 1181 files changed, 53894 insertions(+), 90333 deletions(-)

diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 731180e..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,29 +0,0 @@
-build/
-__pycache__
-*.py[cod]
-*~
-@*
-/build
-/env
-docs/build/
-*.iml
-/out/
-.venv/
-.mypy_cache/
-.incremental_checker_cache.json
-.cache
-
-# Packages
-*.egg
-*.egg-info
-
-# IDEs
-.idea
-*.swp
-
-# Operating Systems
-.DS_store
-
-# Coverage Files
-htmlcov
-.coverage*
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 6b366ad..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "typeshed"]
-	path = typeshed
-	url = http://github.com/python/typeshed
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 4c25d0e..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-sudo: false
-language: python
-python:
-  - "3.3"
-  - "3.4"
-  # Specifically request 3.5.1 because we need to be compatible with that.
-  - "3.5.1"
-  - "3.6"
-  - "3.7-dev"
-  # Pypy build is disabled because it doubles the travis build time, and it rarely fails
-  # unless one one of the other builds fails.
-  # - "pypy3"
-
-install:
-  - pip install -r test-requirements.txt
-  - python setup.py install
-
-script:
-  - python runtests.py -x lint
-  - if [[ $TRAVIS_PYTHON_VERSION == '3.6' ]]; then flake8; fi
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index c01af3b..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,152 +0,0 @@
-Contributing to Mypy
-====================
-
-Welcome!  Mypy is a community project that aims to work for a wide
-range of Python users and Python codebases.  If you're trying Mypy on
-your Python code, your experience and what you can contribute are
-important to the project's success.
-
-
-Getting started, building, and testing
---------------------------------------
-
-If you haven't already, take a look at the project's
-[README.md file](README.md)
-and the [Mypy documentation](http://mypy.readthedocs.io/en/latest/),
-and try adding type annotations to your file and type-checking it with Mypy.
-
-
-Discussion
-----------
-
-If you've run into behavior in Mypy you don't understand, or you're
-having trouble working out a good way to apply it to your code, or
-you've found a bug or would like a feature it doesn't have, we want to
-hear from you!
-
-Our main forum for discussion is the project's [GitHub issue
-tracker](https://github.com/python/mypy/issues).  This is the right
-place to start a discussion of any of the above or most any other
-topic concerning the project.
-
-For less formal discussion we have a chat room on
-[gitter.im](https://gitter.im/python/mypy).  Some Mypy core developers
-are almost always present; feel free to find us there and we're happy
-to chat.  Substantive technical discussion will be directed to the
-issue tracker.
-
-(We also have an IRC channel, `#python-mypy` on irc.freenode.net.
-This is lightly used, we have mostly switched to the gitter room
-mentioned above.)
-
-#### Code of Conduct
-
-Everyone participating in the Mypy community, and in particular in our
-issue tracker, pull requests, and IRC channel, is expected to treat
-other people with respect and more generally to follow the guidelines
-articulated in the [Python Community Code of
-Conduct](https://www.python.org/psf/codeofconduct/).
-
-
-Submitting Changes
-------------------
-
-Even more excellent than a good bug report is a fix for a bug, or the
-implementation of a much-needed new feature. (*)  We'd love to have
-your contributions.
-
-(*) If your new feature will be a lot of work, we recommend talking to
-    us early -- see below.
-
-We use the usual GitHub pull-request flow, which may be familiar to
-you if you've contributed to other projects on GitHub.  For the mechanics,
-see [our git and GitHub workflow help page](https://github.com/python/mypy/wiki/Using-Git-And-GitHub),
-or [GitHub's own documentation](https://help.github.com/articles/using-pull-requests/).
-
-Anyone interested in Mypy may review your code.  One of the Mypy core
-developers will merge your pull request when they think it's ready.
-For every pull request, we aim to promptly either merge it or say why
-it's not yet ready; if you go a few days without a reply, please feel
-free to ping the thread by adding a new comment.
-
-At present the core developers are (alphabetically):
-* David Fisher (@ddfisher)
-* Jukka Lehtosalo (@JukkaL)
-* Greg Price (@gnprice)
-* Guido van Rossum (@gvanrossum)
-
-
-Preparing Changes
------------------
-
-Before you begin: if your change will be a significant amount of work
-to write, we highly recommend starting by opening an issue laying out
-what you want to do.  That lets a conversation happen early in case
-other contributors disagree with what you'd like to do or have ideas
-that will help you do it.
-
-The best pull requests are focused, clearly describe what they're for
-and why they're correct, and contain tests for whatever changes they
-make to the code's behavior.  As a bonus these are easiest for someone
-to review, which helps your pull request get merged quickly!  Standard
-advice about good pull requests for open-source projects applies; we
-have [our own writeup](https://github.com/python/mypy/wiki/Good-Pull-Request)
-of this advice.
-
-See also our [coding conventions](https://github.com/python/mypy/wiki/Code-Conventions) --
-which consist mainly of a reference to
-[PEP 8](https://www.python.org/dev/peps/pep-0008/) -- for the code you
-put in the pull request.
-
-You may also find other pages in the
-[Mypy developer guide](https://github.com/python/mypy/wiki/Developer-Guides)
-helpful in developing your change.
-
-
-Issue-tracker conventions
--------------------------
-
-We aim to reply to all new issues promptly.  We'll assign a milestone
-to help us track which issues we intend to get to when, and may apply
-labels to carry some other information.  Here's what our milestones
-and labels mean.
-
-### Task priority and sizing
-
-We use GitHub "labels" ([see our
-list](https://github.com/python/mypy/labels)) to roughly order what we
-want to do soon and less soon.  There's two dimensions taken into
-account: **priority** (does it matter to our users) and **size** (how
-long will it take to complete).
-
-Bugs that aren't a huge deal but do matter to users and don't seem
-like a lot of work to fix generally will be dealt with sooner; things
-that will take longer may go further out.
-
-We are trying to keep the backlog at a manageable size, an issue that is
-unlikely to be acted upon in foreseeable future is going to be
-respectfully closed.  This doesn't mean the issue is not important, but
-rather reflects the limits of the team.
-
-The **question** label is for issue threads where a user is asking a
-question but it isn't yet clear that it represents something to actually
-change.  We use the issue tracker as the preferred venue for such
-questions, even when they aren't literally issues, to keep down the
-number of distinct discussion venues anyone needs to track.  These might
-evolve into a bug or feature request.
-
-Issues **without a priority or size** haven't been triaged.  We aim to
-triage all new issues promptly, but there are some issues from previous
-years that we haven't yet re-reviewed since adopting these conventions.
-
-### Other labels
-
-* **needs discussion**: This issue needs agreement on some kind of
-  design before it makes sense to implement it, and it either doesn't
-  yet have a design or doesn't yet have agreement on one.
-* **feature**, **bug**, **crash**, **refactoring**, **documentation**:
-  These classify the user-facing impact of the change.  Specifically
-  "refactoring" means there should be no user-facing effect.
-* **topic-** labels group issues touching a similar aspect of the
-  project, for example PEP 484 compatibility, a specific command-line
-  option or dependency.
diff --git a/CREDITS b/CREDITS
deleted file mode 100644
index d4fe9ee..0000000
--- a/CREDITS
+++ /dev/null
@@ -1,101 +0,0 @@
-Credits
--------
-
-Lead developer:
-
-  Jukka Lehtosalo <jukka.lehtosalo at iki.fi>
-
-Core team:
-
-  Guido <guido at dropbox.com>
-  David Fisher <ddfisher at dropbox.com>
-  Greg Price <gregprice at dropbox.com>
-
-Contributors (in alphabetical order, including typeshed):
-
-  Tim Abbott
-  Steven Allen (@Stebalien)
-  Della Anjeh
-  Reid Barton (@rwbarton)
-  Matthias Bussonnier
-  Anup Chenthamarakshan
-  Kyle Consalus
-  Ian Cordasco
-  ctcutler
-  Ben Darnell
-  Miguel Garcia (@rockneurotiko)
-  Mihnea Giurgea
-  Ryan Gonzalez (@kirbyfan64)
-  James Guthrie
-  Jared Hance
-  Ashley Hewson (@ashleyh)
-  icoxfog417
-  Bob Ippolito (@etrepum)
-  ismail-s
-  Sander Kersten (@spkersten)
-  Matthias Kramm
-  Ian Kronquist (@iankronquist)
-  Yuval Langer
-  Howard Lee
-  Tad Leonard
-  Li Haoyi
-  Darjus Loktevic
-  Ben Longbons
-  Florian Ludwig (@FlorianLudwig)
-  Robert T. McGibbon
-  Ron Murawski <ron at horizonchess.com>
-  Motoki Naruse
-  Jared Pochtar (@jaredp)
-  Michal Pokorný
-  Eric Price (@ecprice)
-  Brodie Rao
-  Sebastian Reuße
-  Sebastian Riikonen
-  Seo Sanghyeon
-  Marek Sapota
-  Gigi Sayfan
-  Vlad Shcherbina
-  Anders Schuller
-  Daniel Shaulov
-  David Shea
-  Vita Smid
-  Schuyler Smith
-  Marcell Vazquez-Chanlatte (@mvcisback)
-  Prayag Verma
-  Igor Vuk (@ivuk)
-  Jeff Walden (@jswalden)
-  Michael Walter
-  Jing Wang
-  Wen Zhang
-  Roy Williams
-  wizzardx
-  Matthew Wright
-  Yuanchao Zhu (@yczhu)
-  Gennadiy Zlobin (@gennad)
-
-Additional thanks to:
-
-  Alex Allain
-  Max Bolingbroke
-  Peter Calvert
-  Kannan Goundan
-  Kathy Gray
-  David J Greaves
-  Riitta Ikonen
-  Terho Ikonen
-  Stephen Kell
-  Łukasz Langa
-  Laura Lehtosalo
-  Peter Ludemann
-  Seppo Mattila
-  Robin Message
-  Alan Mycroft
-  Dominic Orchard
-  Pekka Rapinoja
-  Matt Robben
-  Satnam Singh
-  Juha Sorva
-  Clay Sweetser
-  Jorma Tarhio
-  Jussi Tuovila
-  Andrey Vlasovskikh
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 8145cc3..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,228 +0,0 @@
-Mypy is licensed under the terms of the MIT license, reproduced below.
-
-= = = = =
-
-The MIT License
-
-Copyright (c) 2015-2016 Jukka Lehtosalo and contributors
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-= = = = =
-
-Portions of mypy are licensed under different licenses.  The files
-under stdlib-samples and lib-typing are licensed under the PSF 2
-License, reproduced below.
-
-= = = = =
-
-PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
---------------------------------------------
-
-1. This LICENSE AGREEMENT is between the Python Software Foundation
-("PSF"), and the Individual or Organization ("Licensee") accessing and
-otherwise using this software ("Python") in source or binary form and
-its associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement, PSF hereby
-grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
-analyze, test, perform and/or display publicly, prepare derivative works,
-distribute, and otherwise use Python alone or in any derivative version,
-provided, however, that PSF's License Agreement and PSF's notice of copyright,
-i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-2011, 2012 Python Software Foundation; All Rights Reserved" are retained in Python
-alone or in any derivative version prepared by Licensee.
-
-3. In the event Licensee prepares a derivative work that is based on
-or incorporates Python or any part thereof, and wants to make
-the derivative work available to others as provided herein, then
-Licensee hereby agrees to include in any such work a brief summary of
-the changes made to Python.
-
-4. PSF is making Python available to Licensee on an "AS IS"
-basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
-FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-7. Nothing in this License Agreement shall be deemed to create any
-relationship of agency, partnership, or joint venture between PSF and
-Licensee.  This License Agreement does not grant permission to use PSF
-trademarks or trade name in a trademark sense to endorse or promote
-products or services of Licensee, or any third party.
-
-8. By copying, installing or otherwise using Python, Licensee
-agrees to be bound by the terms and conditions of this License
-Agreement.
-
-
-BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
--------------------------------------------
-
-BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
-
-1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
-office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
-Individual or Organization ("Licensee") accessing and otherwise using
-this software in source or binary form and its associated
-documentation ("the Software").
-
-2. Subject to the terms and conditions of this BeOpen Python License
-Agreement, BeOpen hereby grants Licensee a non-exclusive,
-royalty-free, world-wide license to reproduce, analyze, test, perform
-and/or display publicly, prepare derivative works, distribute, and
-otherwise use the Software alone or in any derivative version,
-provided, however, that the BeOpen Python License is retained in the
-Software, alone or in any derivative version prepared by Licensee.
-
-3. BeOpen is making the Software available to Licensee on an "AS IS"
-basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
-
-4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
-SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
-AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
-DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-5. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-6. This License Agreement shall be governed by and interpreted in all
-respects by the law of the State of California, excluding conflict of
-law provisions.  Nothing in this License Agreement shall be deemed to
-create any relationship of agency, partnership, or joint venture
-between BeOpen and Licensee.  This License Agreement does not grant
-permission to use BeOpen trademarks or trade names in a trademark
-sense to endorse or promote products or services of Licensee, or any
-third party.  As an exception, the "BeOpen Python" logos available at
-http://www.pythonlabs.com/logos.html may be used according to the
-permissions granted on that web page.
-
-7. By copying, installing or otherwise using the software, Licensee
-agrees to be bound by the terms and conditions of this License
-Agreement.
-
-
-CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
----------------------------------------
-
-1. This LICENSE AGREEMENT is between the Corporation for National
-Research Initiatives, having an office at 1895 Preston White Drive,
-Reston, VA 20191 ("CNRI"), and the Individual or Organization
-("Licensee") accessing and otherwise using Python 1.6.1 software in
-source or binary form and its associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement, CNRI
-hereby grants Licensee a nonexclusive, royalty-free, world-wide
-license to reproduce, analyze, test, perform and/or display publicly,
-prepare derivative works, distribute, and otherwise use Python 1.6.1
-alone or in any derivative version, provided, however, that CNRI's
-License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
-1995-2001 Corporation for National Research Initiatives; All Rights
-Reserved" are retained in Python 1.6.1 alone or in any derivative
-version prepared by Licensee.  Alternately, in lieu of CNRI's License
-Agreement, Licensee may substitute the following text (omitting the
-quotes): "Python 1.6.1 is made available subject to the terms and
-conditions in CNRI's License Agreement.  This Agreement together with
-Python 1.6.1 may be located on the Internet using the following
-unique, persistent identifier (known as a handle): 1895.22/1013.  This
-Agreement may also be obtained from a proxy server on the Internet
-using the following URL: http://hdl.handle.net/1895.22/1013".
-
-3. In the event Licensee prepares a derivative work that is based on
-or incorporates Python 1.6.1 or any part thereof, and wants to make
-the derivative work available to others as provided herein, then
-Licensee hereby agrees to include in any such work a brief summary of
-the changes made to Python 1.6.1.
-
-4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
-basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
-1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-7. This License Agreement shall be governed by the federal
-intellectual property law of the United States, including without
-limitation the federal copyright law, and, to the extent such
-U.S. federal law does not apply, by the law of the Commonwealth of
-Virginia, excluding Virginia's conflict of law provisions.
-Notwithstanding the foregoing, with regard to derivative works based
-on Python 1.6.1 that incorporate non-separable material that was
-previously distributed under the GNU General Public License (GPL), the
-law of the Commonwealth of Virginia shall govern this License
-Agreement only as to issues arising under or with respect to
-Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
-License Agreement shall be deemed to create any relationship of
-agency, partnership, or joint venture between CNRI and Licensee.  This
-License Agreement does not grant permission to use CNRI trademarks or
-trade name in a trademark sense to endorse or promote products or
-services of Licensee, or any third party.
-
-8. By clicking on the "ACCEPT" button where indicated, or by copying,
-installing or otherwise using Python 1.6.1, Licensee agrees to be
-bound by the terms and conditions of this License Agreement.
-
-        ACCEPT
-
-
-CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
---------------------------------------------------
-
-Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
-The Netherlands.  All rights reserved.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Stichting Mathematisch
-Centrum or CWI not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior
-permission.
-
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-= = = = =
\ No newline at end of file
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..c9cf741
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,30 @@
+Metadata-Version: 1.1
+Name: mypy
+Version: 0.470
+Summary: Optional static typing for Python
+Home-page: http://www.mypy-lang.org/
+Author: Jukka Lehtosalo
+Author-email: jukka.lehtosalo at iki.fi
+License: MIT License
+Description: Mypy -- Optional Static Typing for Python
+        =========================================
+        
+        Add type annotations to your Python programs, and use mypy to type
+        check them.  Mypy is essentially a Python linter on steroids, and it
+        can catch many programming errors by analyzing your program, without
+        actually having to run it.  Mypy has a powerful type system with
+        features such as type inference, gradual typing, generics and union
+        types.
+        
+Platform: POSIX
+Classifier: Development Status :: 2 - Pre-Alpha
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Topic :: Software Development
diff --git a/README.md b/README.md
deleted file mode 100644
index d4db725..0000000
--- a/README.md
+++ /dev/null
@@ -1,307 +0,0 @@
-Mypy: Optional Static Typing for Python
-=======================================
-
-[![Build Status](https://travis-ci.org/python/mypy.svg)](https://travis-ci.org/python/mypy)
-[![Chat at https://gitter.im/python/mypy](https://badges.gitter.im/python/mypy.svg)](https://gitter.im/python/mypy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-
-Got a question? File an issue!
-------------------------------
-
-We don't have a mailing list; but we are always happy to answer
-questions on [gitter chat](https://gitter.im/python/mypy) or filed as
-issues in our trackers:
-
-- [mypy tracker](https://github.com/python/mypy/issues)
-  for mypy isues
-- [typeshed tracker](https://github.com/python/typeshed/issues)
-  for issues with specific modules
-- [typing tracker](https://github.com/python/typing/issues)
-  for discussion of new type system features (PEP 484 changes) and
-  runtime bugs in the typing module
-
-What is mypy?
--------------
-
-Mypy is an optional static type checker for Python.  You can add type
-hints to your Python programs using the standard for type
-annotations introduced in Python 3.5 ([PEP 484](https://www.python.org/dev/peps/pep-0484/)), and use mypy to
-type check them statically. Find bugs in your programs without even
-running them!
-
-The type annotation standard has also been backported to earlier
-Python 3.x versions.  Mypy supports Python 3.3 and later.
-
-For Python 2.7, you can add annotations as comments (this is also
-specified in [PEP 484](https://www.python.org/dev/peps/pep-0484/)).
-
-You can mix dynamic and static typing in your programs. You can always
-fall back to dynamic typing when static typing is not convenient, such
-as for legacy code.
-
-Here is a small example to whet your appetite:
-
-```python
-from typing import Iterator
-
-def fib(n: int) -> Iterator[int]:
-    a, b = 0, 1
-    while a < n:
-        yield a
-        a, b = b, a + b
-```
-
-Mypy is in development; some features are missing and there are bugs.
-See 'Development status' below.
-
-
-Requirements
-------------
-
-You need Python 3.3 or later to run mypy.  You can have multiple Python
-versions (2.x and 3.x) installed on the same system without problems.
-
-In Ubuntu, Mint and Debian you can install Python 3 like this:
-
-    $ sudo apt-get install python3 python3-pip
-
-For other Linux flavors, OS X and Windows, packages are available at
-
-  http://www.python.org/getit/
-
-
-Quick start
------------
-
-Mypy can be installed using pip:
-
-    $ python3 -m pip install -U mypy
-
-If you want to run the latest version of the code, you can install from git:
-
-    $ python3 -m pip install -U git+git://github.com/python/mypy.git
-
-
-Now, if Python on your system is configured properly (else see
-"Troubleshooting" below), you can type-check a program like this:
-
-    $ mypy PROGRAM
-
-You can always use a Python interpreter to run your statically typed
-programs, even if they have type errors:
-
-    $ python3 PROGRAM
-
-
-Web site and documentation
---------------------------
-
-Documentation and additional information is available at the web site:
-
-  http://www.mypy-lang.org/
-
-Or you can jump straight to the documentation:
-
-  http://mypy.readthedocs.io/
-
-
-Troubleshooting
----------------
-
-Depending on your configuration, you may have to run `pip3` like
-this:
-
-    $ python3 -m pip install -U mypy
-
-Except on Windows, it's best to always use the `--fast-parser`
-option to mypy; this requires installing `typed-ast`:
-
-    $ python3 -m pip install -U typed-ast
-
-If the `mypy` command isn't found after installation: After either
-`pip3 install` or `setup.py install`, the `mypy` script and
-dependencies, including the `typing` module, will be installed to
-system-dependent locations.  Sometimes the script directory will not
-be in `PATH`, and you have to add the target directory to `PATH`
-manually or create a symbolic link to the script.  In particular, on
-Mac OS X, the script may be installed under `/Library/Frameworks`:
-
-    /Library/Frameworks/Python.framework/Versions/<version>/bin
-
-In Windows, the script is generally installed in
-`\PythonNN\Scripts`. So, type check a program like this (replace
-`\Python34` with your Python installation path):
-
-    C:\>\Python34\python \Python34\Scripts\mypy PROGRAM
-
-### Working with `virtualenv`
-
-If you are using [`virtualenv`](https://virtualenv.pypa.io/en/stable/),
-make sure you are running a python3 environment. Installing via `pip3`
-in a v2 environment will not configure the environment to run installed
-modules from the command line.
-
-    $ python3 -m pip install -U virtualenv
-    $ python3 -m virtualenv env
-
-
-Quick start for contributing to mypy
-------------------------------------
-
-If you want to contribute, first clone the mypy git repository:
-
-    $ git clone --recurse-submodules https://github.com/python/mypy.git
-
-From the mypy directory, use pip to install mypy:
-
-    $ cd mypy
-    $ python3 -m pip install -U .
-
-Replace `python3` with your Python 3 interpreter.  You may have to do
-the above as root. For example, in Ubuntu:
-
-    $ sudo python3 -m pip install -U .
-
-Now you can use the `mypy` program just as above.  In case of trouble
-see "Troubleshooting" above.
-
-The mypy wiki contains some useful information for contributors:
-
-  https://github.com/python/mypy/wiki/Developer-Guides
-
-Working with the git version of mypy
-------------------------------------
-
-mypy contains a submodule, "typeshed". See http://github.com/python/typeshed.
-This submodule contains types for the Python standard library.
-
-Due to the way git submodules work, you'll have to do
-```
-  git submodule update typeshed
-```
-whenever you change branches, merge, rebase, or pull.
-
-(It's possible to automate this: Search Google for "git hook update submodule")
-
-Running tests and linting
--------------------------
-
-First install any additional dependencies needed for testing:
-
-    $ python3 -m pip install -U -r test-requirements.txt
-
-To run all tests, run the script `runtests.py` in the mypy repository:
-
-    $ ./runtests.py
-
-Note that some tests will be disabled for older python versions.
-
-This will run all tests, including integration and regression tests,
-and will type check mypy and verify that all stubs are valid.
-
-You can run a subset of test suites by passing positive or negative
-filters:
-
-    $ ./runtests.py lex parse -x lint -x stub
-
-For example, to run unit tests only, which run pretty quickly:
-
-    $ ./runtests.py unit-test pytest
-
-The unit test suites are driven by a mixture of test frameworks:
-mypy's own `myunit` framework, and `pytest`, which we're in the
-process of migrating to.  For finer control over which unit tests are
-run and how, you can run `py.test` or `scripts/myunit` directly, or
-pass inferior arguments via `-a`:
-
-    $ py.test mypy/test/testcheck.py -v -k MethodCall
-    $ ./runtests.py -v 'pytest mypy/test/testcheck' -a -v -a -k -a MethodCall
-
-    $ PYTHONPATH=$PWD scripts/myunit -m mypy.test.testlex -v '*backslash*'
-    $ ./runtests.py mypy.test.testlex -a -v -a '*backslash*'
-
-You can also run the type checker for manual testing without
-installing anything by setting up the Python module search path
-suitably (the lib-typing/3.2 path entry is not needed for Python 3.5
-or when you have manually installed the `typing` module):
-
-    $ export PYTHONPATH=$PWD:$PWD/lib-typing/3.2
-    $ python<version> -m mypy PROGRAM.py
-
-You can add the entry scripts to PATH for a single python3 version:
-
-    $ export PATH=$PWD/scripts
-    $ mypy PROGRAM.py
-
-You can check a module or string instead of a file:
-
-    $ mypy PROGRAM.py
-    $ mypy -m MODULE
-    $ mypy -c 'import MODULE'
-
-To run the linter:
-
-    $ ./runtests.py lint
-
-
-Coverage reports
-----------------
-
-There is an experimental feature to generate coverage reports.  To use
-this feature, you need to `pip install -U lxml`.  This is an extension
-module and requires various library headers to install; on a
-Debian-derived system the command
-  `apt-get install python3-dev libxml2-dev libxslt1-dev`
-may provide the necessary dependencies.
-
-To use the feature, pass e.g. `--txt-report "$(mktemp -d)"`.
-
-
-Development status
-------------------
-
-Mypy is work in progress and is not yet production quality, though
-mypy development has been done using mypy for a while!
-
-Here are some of the more significant Python features not supported
-right now (but all of these will improve):
-
- - properties with setters not supported
- - limited metaclass support
- - only a subset of Python standard library modules are supported, and some
-   only partially
- - 3rd party module support is limited
-
-The current development focus is to have a good coverage of Python
-features and the standard library (both 3.x and 2.7).
-
-
-Issue tracker
--------------
-
-Please report any bugs and enhancement ideas using the mypy issue
-tracker:
-
-  https://github.com/python/mypy/issues
-
-Feel free to also ask questions on the tracker.
-
-
-Help wanted
------------
-
-Any help in testing, development, documentation and other tasks is
-highly appreciated and useful to the project. There are tasks for
-contributors of all experience levels. If you're just getting started,
-check out the
-[difficulty/easy](https://github.com/python/mypy/labels/difficulty%2Feasy)
-label.
-
-For more details, see the file [CONTRIBUTING.md](CONTRIBUTING.md).
-
-
-License
--------
-
-Mypy is licensed under the terms of the MIT License (see the file
-LICENSE).
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index 80fd0f8..0000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-environment:
-  matrix:
-
-    - PYTHON: "C:\\Python35"
-      PYTHON_VERSION: "3.5.1"
-      PYTHON_ARCH: "32"
-      
-    - PYTHON: "C:\\Python35-x64"
-      PYTHON_VERSION: "3.5.1"
-      PYTHON_ARCH: "64"
-    
-    - PYTHON: "C:\\Python36"
-      PYTHON_VERSION: "3.6.x"
-      PYTHON_ARCH: "32"
-      
-    - PYTHON: "C:\\Python36-x64"
-      PYTHON_VERSION: "3.6.x"
-      PYTHON_ARCH: "64"
-     
-     
-install:
-    - "%PYTHON%\\python.exe -m pip install -r test-requirements.txt"
-    - "git submodule update --init typeshed"
-    - "%PYTHON%\\python.exe setup.py -q install"
-   
-build: off
-
-test_script:
-    # Ignore lint (it's run separately below), reports (since we don't have lxml),
-    # and cmdline (since one of its tests depend on lxml)
-    - "%PYTHON%\\python.exe runtests.py -x lint -x reports -x cmdline"
-    - ps: if ($env:PYTHON_VERSION -Match "3.6.x" -And $env:PYTHON_ARCH -Match "64") { iex "$env:PYTHON\\python.exe -m flake8" }
diff --git a/build-requirements.txt b/build-requirements.txt
deleted file mode 100644
index 0a8547b..0000000
--- a/build-requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-setuptools
-wheel
diff --git a/conftest.py b/conftest.py
deleted file mode 100644
index b2f3824..0000000
--- a/conftest.py
+++ /dev/null
@@ -1,4 +0,0 @@
-pytest_plugins = [
-    'mypy.test.data',
-    'pytest_cov',
-]
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index be69e9d..0000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,177 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS    =
-SPHINXBUILD   = sphinx-build
-PAPER         =
-BUILDDIR      = build
-
-# User-friendly check for sphinx-build
-ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
-$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
-endif
-
-# Internal variables.
-PAPEROPT_a4     = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
-
-help:
-	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  html       to make standalone HTML files"
-	@echo "  dirhtml    to make HTML files named index.html in directories"
-	@echo "  singlehtml to make a single large HTML file"
-	@echo "  pickle     to make pickle files"
-	@echo "  json       to make JSON files"
-	@echo "  htmlhelp   to make HTML files and a HTML help project"
-	@echo "  qthelp     to make HTML files and a qthelp project"
-	@echo "  devhelp    to make HTML files and a Devhelp project"
-	@echo "  epub       to make an epub"
-	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
-	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
-	@echo "  text       to make text files"
-	@echo "  man        to make manual pages"
-	@echo "  texinfo    to make Texinfo files"
-	@echo "  info       to make Texinfo files and run them through makeinfo"
-	@echo "  gettext    to make PO message catalogs"
-	@echo "  changes    to make an overview of all changed/added/deprecated items"
-	@echo "  xml        to make Docutils-native XML files"
-	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
-	@echo "  linkcheck  to check all external links for integrity"
-	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
-
-clean:
-	rm -rf $(BUILDDIR)/*
-
-html:
-	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
-	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
-	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
-	@echo
-	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
-	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
-	@echo
-	@echo "Build finished; now you can process the pickle files."
-
-json:
-	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
-	@echo
-	@echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
-	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
-	@echo
-	@echo "Build finished; now you can run HTML Help Workshop with the" \
-	      ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
-	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
-	@echo
-	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
-	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
-	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Mypy.qhcp"
-	@echo "To view the help file:"
-	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Mypy.qhc"
-
-devhelp:
-	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
-	@echo
-	@echo "Build finished."
-	@echo "To view the help file:"
-	@echo "# mkdir -p $$HOME/.local/share/devhelp/Mypy"
-	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Mypy"
-	@echo "# devhelp"
-
-epub:
-	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
-	@echo
-	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo
-	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
-	@echo "Run \`make' in that directory to run these through (pdf)latex" \
-	      "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through pdflatex..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-latexpdfja:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through platex and dvipdfmx..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
-	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
-	@echo
-	@echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
-	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
-	@echo
-	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo
-	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
-	@echo "Run \`make' in that directory to run these through makeinfo" \
-	      "(use \`make info' here to do that automatically)."
-
-info:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo "Running Texinfo files through makeinfo..."
-	make -C $(BUILDDIR)/texinfo info
-	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
-	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
-	@echo
-	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
-	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
-	@echo
-	@echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
-	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
-	@echo
-	@echo "Link check complete; look for any errors in the above output " \
-	      "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
-	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
-	@echo "Testing of doctests in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/doctest/output.txt."
-
-xml:
-	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
-	@echo
-	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-pseudoxml:
-	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
-	@echo
-	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 2122eef..0000000
--- a/docs/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-Mypy Documentation
-==================
-
-What's this?
-------------
-
-This directory contains the source code for Mypy documentation (under `source/`)
-and build scripts. The documentation uses Sphinx and reStructuredText. We use
-`sphinx-rtd-theme` as the documentation theme.
-
-Building the documentation
---------------------------
-
-Install Sphinx and other dependencies (i.e. theme) needed for the documentation.
-From the `docs` directory, use `pip`:
-
-```
-$ pip install -r requirements-docs.txt
-```
-
-Build the documentation like this:
-
-```
-$ make html
-```
-
-The built documentation will be placed in the `docs/build` directory. Open
-`docs/build/index.html` to view the documentation.
-
-Helpful documentation build commands
-------------------------------------
-
-Clean the documentation build:
-
-```
-$ make clean
-```
-
-Test and check the links found in the documentation:
-
-```
-$ make linkcheck
-```
-
-Documentation on Read The Docs
-------------------------------
-
-The mypy documentation is hosted on Read The Docs, and the latest version
-can be found at https://mypy.readthedocs.io/en/latest.
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100755
index 1e3d843..0000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,242 +0,0 @@
- at ECHO OFF
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
-	set SPHINXBUILD=sphinx-build
-)
-set BUILDDIR=build
-set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
-set I18NSPHINXOPTS=%SPHINXOPTS% source
-if NOT "%PAPER%" == "" (
-	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
-	set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
-)
-
-if "%1" == "" goto help
-
-if "%1" == "help" (
-	:help
-	echo.Please use `make ^<target^>` where ^<target^> is one of
-	echo.  html       to make standalone HTML files
-	echo.  dirhtml    to make HTML files named index.html in directories
-	echo.  singlehtml to make a single large HTML file
-	echo.  pickle     to make pickle files
-	echo.  json       to make JSON files
-	echo.  htmlhelp   to make HTML files and a HTML help project
-	echo.  qthelp     to make HTML files and a qthelp project
-	echo.  devhelp    to make HTML files and a Devhelp project
-	echo.  epub       to make an epub
-	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
-	echo.  text       to make text files
-	echo.  man        to make manual pages
-	echo.  texinfo    to make Texinfo files
-	echo.  gettext    to make PO message catalogs
-	echo.  changes    to make an overview over all changed/added/deprecated items
-	echo.  xml        to make Docutils-native XML files
-	echo.  pseudoxml  to make pseudoxml-XML files for display purposes
-	echo.  linkcheck  to check all external links for integrity
-	echo.  doctest    to run all doctests embedded in the documentation if enabled
-	goto end
-)
-
-if "%1" == "clean" (
-	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
-	del /q /s %BUILDDIR%\*
-	goto end
-)
-
-
-%SPHINXBUILD% 2> nul
-if errorlevel 9009 (
-	echo.
-	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
-	echo.installed, then set the SPHINXBUILD environment variable to point
-	echo.to the full path of the 'sphinx-build' executable. Alternatively you
-	echo.may add the Sphinx directory to PATH.
-	echo.
-	echo.If you don't have Sphinx installed, grab it from
-	echo.http://sphinx-doc.org/
-	exit /b 1
-)
-
-if "%1" == "html" (
-	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
-	goto end
-)
-
-if "%1" == "dirhtml" (
-	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
-	goto end
-)
-
-if "%1" == "singlehtml" (
-	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
-	goto end
-)
-
-if "%1" == "pickle" (
-	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can process the pickle files.
-	goto end
-)
-
-if "%1" == "json" (
-	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can process the JSON files.
-	goto end
-)
-
-if "%1" == "htmlhelp" (
-	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can run HTML Help Workshop with the ^
-.hhp project file in %BUILDDIR%/htmlhelp.
-	goto end
-)
-
-if "%1" == "qthelp" (
-	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can run "qcollectiongenerator" with the ^
-.qhcp project file in %BUILDDIR%/qthelp, like this:
-	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Mypy.qhcp
-	echo.To view the help file:
-	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Mypy.ghc
-	goto end
-)
-
-if "%1" == "devhelp" (
-	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished.
-	goto end
-)
-
-if "%1" == "epub" (
-	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The epub file is in %BUILDDIR%/epub.
-	goto end
-)
-
-if "%1" == "latex" (
-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
-	goto end
-)
-
-if "%1" == "latexpdf" (
-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
-	cd %BUILDDIR%/latex
-	make all-pdf
-	cd %BUILDDIR%/..
-	echo.
-	echo.Build finished; the PDF files are in %BUILDDIR%/latex.
-	goto end
-)
-
-if "%1" == "latexpdfja" (
-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
-	cd %BUILDDIR%/latex
-	make all-pdf-ja
-	cd %BUILDDIR%/..
-	echo.
-	echo.Build finished; the PDF files are in %BUILDDIR%/latex.
-	goto end
-)
-
-if "%1" == "text" (
-	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The text files are in %BUILDDIR%/text.
-	goto end
-)
-
-if "%1" == "man" (
-	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The manual pages are in %BUILDDIR%/man.
-	goto end
-)
-
-if "%1" == "texinfo" (
-	%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
-	goto end
-)
-
-if "%1" == "gettext" (
-	%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
-	goto end
-)
-
-if "%1" == "changes" (
-	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.The overview file is in %BUILDDIR%/changes.
-	goto end
-)
-
-if "%1" == "linkcheck" (
-	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Link check complete; look for any errors in the above output ^
-or in %BUILDDIR%/linkcheck/output.txt.
-	goto end
-)
-
-if "%1" == "doctest" (
-	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Testing of doctests in the sources finished, look at the ^
-results in %BUILDDIR%/doctest/output.txt.
-	goto end
-)
-
-if "%1" == "xml" (
-	%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The XML files are in %BUILDDIR%/xml.
-	goto end
-)
-
-if "%1" == "pseudoxml" (
-	%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
-	goto end
-)
-
-:end
diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt
deleted file mode 100644
index d20641e..0000000
--- a/docs/requirements-docs.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Sphinx >= 1.4.4
-sphinx-rtd-theme >= 0.1.9
diff --git a/docs/source/additional_features.rst b/docs/source/additional_features.rst
deleted file mode 100644
index b9dd07f..0000000
--- a/docs/source/additional_features.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-Additional features
--------------------
-
-Several mypy features are not currently covered by this tutorial,
-including the following:
-
-- inheritance between generic classes
-- compatibility and subtyping of generic types, including covariance of generic types
-- ``super()``
diff --git a/docs/source/basics.rst b/docs/source/basics.rst
deleted file mode 100644
index 572364d..0000000
--- a/docs/source/basics.rst
+++ /dev/null
@@ -1,194 +0,0 @@
-Basics
-======
-
-This chapter introduces some core concepts of mypy, including function
-annotations, the ``typing`` module and library stubs. Read it carefully,
-as the rest of documentation may not make much sense otherwise.
-
-Function signatures
-*******************
-
-A function without a type annotation is considered dynamically typed:
-
-.. code-block:: python
-
-   def greeting(name):
-       return 'Hello, {}'.format(name)
-
-You can declare the signature of a function using the Python 3
-annotation syntax (Python 2 is discussed later in :ref:`python2`).
-This makes the the function statically typed, and that causes type
-checker report type errors within the function.
-
-Here's a version of the above function that is statically typed and
-will be type checked:
-
-.. code-block:: python
-
-   def greeting(name: str) -> str:
-       return 'Hello, {}'.format(name)
-
-If a function does not explicitly return a value we give the return
-type as ``None``. Using a ``None`` result in a statically typed
-context results in a type check error:
-
-.. code-block:: python
-
-   def p() -> None:
-       print('hello')
-
-   a = p()   # Type check error: p has None return value
-
-Arguments with default values can be annotated as follows:
-
-.. code-block:: python
-
-   def greeting(name: str, prefix: str = 'Mr.') -> str:
-      return 'Hello, {} {}'.format(name, prefix)
-
-Mixing dynamic and static typing
-********************************
-
-Mixing dynamic and static typing within a single file is often
-useful. For example, if you are migrating existing Python code to
-static typing, it may be easiest to do this incrementally, such as by
-migrating a few functions at a time. Also, when prototyping a new
-feature, you may decide to first implement the relevant code using
-dynamic typing and only add type signatures later, when the code is
-more stable.
-
-.. code-block:: python
-
-   def f():
-       1 + 'x'  # No static type error (dynamically typed)
-
-   def g() -> None:
-       1 + 'x'  # Type check error (statically typed)
-
-.. note::
-
-   The earlier stages of mypy, known as the semantic analysis, may
-   report errors even for dynamically typed functions. However, you
-   should not rely on this, as this may change in the future.
-
-The typing module
-*****************
-
-The ``typing`` module contains many definitions that are useful in
-statically typed code. You typically use ``from ... import`` to import
-them (we'll explain ``Iterable`` later in this document):
-
-.. code-block:: python
-
-   from typing import Iterable
-
-   def greet_all(names: Iterable[str]) -> None:
-       for name in names:
-           print('Hello, {}'.format(name))
-
-For brevity, we often omit the ``typing`` import in code examples, but
-you should always include it in modules that contain statically typed
-code.
-
-The presence or absence of the ``typing`` module does not affect
-whether your code is type checked; it is only required when you use
-one or more special features it defines.
-
-Type checking programs
-**********************
-
-You can type check a program by using the ``mypy`` tool, which is
-basically a linter -- it checks your program for errors without actually
-running it::
-
-   $ mypy program.py
-
-All errors reported by mypy are essentially warnings that you are free
-to ignore, if you so wish.
-
-The next chapter explains how to download and install mypy:
-:ref:`getting-started`.
-
-More command line options are documented in :ref:`command-line`.
-
-.. note::
-
-   Depending on how mypy is configured, you may have to explicitly use
-   the Python 3 interpreter to run mypy. The mypy tool is an ordinary
-   mypy (and so also Python) program. For example::
-
-     $ python3 -m mypy program.py
-
-.. _library-stubs:
-
-Library stubs and the Typeshed repo
-***********************************
-
-In order to type check code that uses library modules such as those
-included in the Python standard library, you need to have library
-*stubs*. A library stub defines a skeleton of the public interface
-of the library, including classes, variables and functions and
-their types, but dummy function bodies.
-
-For example, consider this code:
-
-.. code-block:: python
-
-  x = chr(4)
-
-Without a library stub, the type checker would have no way of
-inferring the type of ``x`` and checking that the argument to ``chr``
-has a valid type. Mypy incorporates the `typeshed
-<https://github.com/python/typeshed>`_ project, which contains library
-stubs for the Python builtins and the standard library. The stub for
-the builtins contains a definition like this for ``chr``:
-
-.. code-block:: python
-
-    def chr(code: int) -> str: ...
-
-In stub files we don't care about the function bodies, so we use 
-an ellipsis instead.  That ``...`` is three literal dots!
-
-Mypy complains if it can't find a stub (or a real module) for a
-library module that you import. You can create a stub easily; here is
-an overview:
-
-* Write a stub file for the library and store it as a ``.pyi`` file in
-  the same directory as the library module.
-* Alternatively, put your stubs (``.pyi`` files) in a directory
-  reserved for stubs (e.g., ``myproject/stubs``). In this case you
-  have to set the environment variable ``MYPYPATH`` to refer to the
-  directory.  For example::
-
-    $ export MYPYPATH=~/work/myproject/stubs
-
-Use the normal Python file name conventions for modules, e.g. ``csv.pyi``
-for module ``csv``. Use a subdirectory with ``__init__.pyi`` for packages.
-
-If a directory contains both a ``.py`` and a ``.pyi`` file for the
-same module, the ``.pyi`` file takes precedence. This way you can
-easily add annotations for a module even if you don't want to modify
-the source code. This can be useful, for example, if you use 3rd party
-open source libraries in your program (and there are no stubs in
-typeshed yet).
-
-That's it! Now you can access the module in mypy programs and type check
-code that uses the library. If you write a stub for a library module,
-consider making it available for other programmers that use mypy 
-by contributing it back to the typeshed repo.
-
-There is more information about creating stubs in the
-`mypy wiki <https://github.com/python/mypy/wiki/Creating-Stubs-For-Python-Modules>`_.
-The following sections explain the kinds of type annotations you can use
-in your programs and stub files.
-
-.. note::
-
-   You may be tempted to point ``MYPYPATH`` to the standard library or
-   to the ``site-packages`` directory where your 3rd party packages
-   are installed. This is almost always a bad idea -- you will likely
-   get tons of error messages about code you didn't write and that
-   mypy can't analyze all that well yet, and in the worst case
-   scenario mypy may crash due to some construct in a 3rd party
-   package that it didn't expect.
diff --git a/docs/source/builtin_types.rst b/docs/source/builtin_types.rst
deleted file mode 100644
index 4426df7..0000000
--- a/docs/source/builtin_types.rst
+++ /dev/null
@@ -1,37 +0,0 @@
-Built-in types
-==============
-
-These are examples of some of the most common built-in types:
-
-=================== ===============================
-Type                Description
-=================== ===============================
-``int``             integer of arbitrary size
-``float``           floating point number
-``bool``            boolean value
-``str``             unicode string
-``bytes``           8-bit string
-``object``          an arbitrary object (``object`` is the common base class)
-``List[str]``       list of ``str`` objects
-``Dict[str, int]``  dictionary from ``str`` keys to ``int`` values
-``Iterable[int]``   iterable object containing ints
-``Sequence[bool]``  sequence of booleans
-``Any``             dynamically typed value with an arbitrary type
-=================== ===============================
-
-The type ``Any`` and type constructors ``List``, ``Dict``,
-``Iterable`` and ``Sequence`` are defined in the ``typing`` module.
-
-The type ``Dict`` is a *generic* class, signified by type arguments within
-``[...]``. For example, ``Dict[int, str]`` is a dictionary from integers to
-strings and and ``Dict[Any, Any]`` is a dictionary of dynamically typed
-(arbitrary) values and keys. ``List`` is another generic class. ``Dict`` and
-``List`` are aliases for the built-ins ``dict`` and ``list``, respectively.
-
-``Iterable`` and ``Sequence`` are generic abstract base classes that
-correspond to Python protocols. For example, a ``str`` object or a
-``List[str]`` object is valid
-when ``Iterable[str]`` or ``Sequence[str]`` is expected. Note that even though
-they are similar to abstract base classes defined in ``abc.collections``
-(formerly ``collections``), they are not identical, since the built-in
-collection type objects do not support indexing.
diff --git a/docs/source/casts.rst b/docs/source/casts.rst
deleted file mode 100644
index 900ee0c..0000000
--- a/docs/source/casts.rst
+++ /dev/null
@@ -1,39 +0,0 @@
-.. _casts:
-
-Casts
-=====
-
-Mypy supports type casts that are usually used to coerce a statically
-typed value to a subtype. Unlike languages such as Java or C#,
-however, mypy casts are only used as hints for the type checker, and they
-don't perform a runtime type check. Use the function ``cast`` to perform a
-cast:
-
-.. code-block:: python
-
-   from typing import cast, List
-
-   o = [1] # type: object
-   x = cast(List[int], o)  # OK
-   y = cast(List[str], o)  # OK (cast performs no actual runtime check)
-
-To support runtime checking of casts such as the above, we'd have to check
-the types of all list items, which would be very inefficient for large lists.
-Use assertions if you want to
-perform an actual runtime check. Casts are used to silence spurious
-type checker warnings and give the type checker a little help when it can't
-quite understand what is going on.
-
-You don't need a cast for expressions with type ``Any``, or when
-assigning to a variable with type ``Any``, as was explained earlier.
-You can also use ``Any`` as the cast target type -- this lets you perform
-any operations on the result. For example:
-
-.. code-block:: python
-
-    from typing import cast, Any
-
-    x = 1
-    x + 'x'   # Type check error
-    y = cast(Any, x)
-    y + 'x'   # Type check OK (runtime error)
diff --git a/docs/source/cheat_sheet.rst b/docs/source/cheat_sheet.rst
deleted file mode 100644
index 3c74d6f..0000000
--- a/docs/source/cheat_sheet.rst
+++ /dev/null
@@ -1,241 +0,0 @@
-.. _cheat-sheet-py2:
-
-Mypy syntax cheat sheet (Python 2)
-==================================
-
-This document is a quick cheat sheet showing how the `PEP 484 <https://www.python.org/dev/peps/pep-0484/>`_ type
-language represents various common types in Python 2.
-
-.. note::
-
-   Technically many of the type annotations shown below are redundant,
-   because mypy can derive them from the type of the expression.  So
-   many of the examples have a dual purpose: show how to write the
-   annotation, and show the inferred types.
-
-
-Built-in types
-**************
-
-.. code-block:: python
-
-   from typing import List, Set, Dict, Tuple, Text, Optional
-
-   # For simple built-in types, just use the name of the type.
-   x = 1 # type: int
-   x = 1.0 # type: float
-   x = True # type: bool
-   x = "test" # type: str
-   x = u"test" # type: unicode
-
-   # For collections, the name of the type is capitalized, and the
-   # name of the type inside the collection is in brackets.
-   x = [1] # type: List[int]
-   x = set([6, 7]) # type: Set[int]
-
-   # For mappings, we need the types of both keys and values.
-   x = dict(field=2.0) # type: Dict[str, float]
-
-   # For tuples, we specify the types of all the elements.
-   x = (3, "yes", 7.5) # type: Tuple[int, str, float]
-
-   # For textual data, use Text.
-   # This is `unicode` in Python 2 and `str` in Python 3.
-   x = ["string", u"unicode"] # type: List[Text]
-
-   # Use Optional for values that could be None.
-   input_str = f() # type: Optional[str]
-   if input_str is not None:
-      print input_str
-
-
-Functions
-*********
-
-.. code-block:: python
-
-   from typing import Callable, Iterable
-
-   # This is how you annotate a function definition.
-   def stringify(num):
-       # type: (int) -> str
-       """Your function docstring goes here after the type definition."""
-       return str(num)
-
-   # This function has no parameters and also returns nothing. Annotations
-   # can also be placed on the same line as their function headers.
-   def greet_world(): # type: () -> None
-       print "Hello, world!"
-
-   # And here's how you specify multiple arguments.
-   def plus(num1, num2):
-       # type: (int, int) -> int
-       return num1 + num2
-
-   # Add type annotations for kwargs as though they were positional args.
-   def f(num1, my_float=3.5):
-       # type: (int, float) -> float
-       return num1 + my_float
-
-   # An argument can be declared positional-only by giving it a name
-   # starting with two underscores:
-   def quux(__x):
-       # type: (int) -> None
-       pass
-   quux(3)  # Fine
-   quux(__x=3)  # Error
-
-   # This is how you annotate a function value.
-   x = f # type: Callable[[int, float], float]
-
-   # A generator function that yields ints is secretly just a function that
-   # returns an iterable (see below) of ints, so that's how we annotate it.
-   def f(n):
-       # type: (int) -> Iterable[int]
-       i = 0
-       while i < n:
-           yield i
-           i += 1
-
-   # There's alternative syntax for functions with many arguments.
-   def send_email(address,     # type: Union[str, List[str]]
-                  sender,      # type: str
-                  cc,          # type: Optional[List[str]]
-                  bcc,         # type: Optional[List[str]]
-                  subject='',
-                  body=None    # type: List[str]
-                  ):
-       # type: (...) -> bool
-        <code>
-
-
-When you're puzzled or when things are complicated
-**************************************************
-
-.. code-block:: python
-
-   from typing import Union, Any, cast
-
-   # To find out what type mypy infers for an expression anywhere in
-   # your program, wrap it in reveal_type.  Mypy will print an error
-   # message with the type; remove it again before running the code.
-   reveal_type(1) # -> error: Revealed type is 'builtins.int'
-
-   # Use Union when something could be one of a few types.
-   x = [3, 5, "test", "fun"] # type: List[Union[int, str]]
-
-   # Use Any if you don't know the type of something or it's too
-   # dynamic to write a type for.
-   x = mystery_function() # type: Any
-
-   # This is how to deal with varargs.
-   # This makes each positional arg and each keyword arg a 'str'.
-   def call(self, *args, **kwargs):
-            # type: (*str, **str) -> str
-            request = make_request(*args, **kwargs)
-            return self.do_api_query(request)
-
-   
-   # Use `ignore` to suppress type-checking on a given line, when your
-   # code confuses mypy or runs into an outright bug in mypy.
-   # Good practice is to comment every `ignore` with a bug link
-   # (in mypy, typeshed, or your own code) or an explanation of the issue.
-   x = confusing_function() # type: ignore # https://github.com/python/mypy/issues/1167
-
-   # cast is a helper function for mypy that allows for guidance of how to convert types.
-   # it does not cast at runtime
-   a = [4]
-   b = cast(List[int], a)  # passes fine
-   c = cast(List[str], a)  # passes fine (no runtime check)
-   reveal_type(c)  # -> error: Revealed type is 'builtins.list[builtins.str]'
-   print(c)  # -> [4] the object is not cast
-
-   # TODO: explain "Need type annotation for variable" when
-   # initializing with None or an empty container
-
-
-Standard duck types
-*******************
-
-In typical Python code, many functions that can take a list or a dict
-as an argument only need their argument to be somehow "list-like" or
-"dict-like".  A specific meaning of "list-like" or "dict-like" (or
-something-else-like) is called a "duck type", and several duck types
-that are common in idiomatic Python are standardized.
-
-.. code-block:: python
-
-   from typing import Mapping, MutableMapping, Sequence, Iterator
-
-   # Use Iterable for generic iterables (anything usable in `for`),
-   # and Sequence where a sequence (supporting `len` and `__getitem__`) is required.
-   def f(iterable_of_ints):
-       # type: (Iterable[int]) -> List[str]
-       return [str(x) for x in iterator_of_ints]
-   f(range(1, 3))
-
-   # Mapping describes a dict-like object (with `__getitem__`) that we won't mutate,
-   # and MutableMapping one (with `__setitem__`) that we might.
-   def f(my_dict):
-       # type: (Mapping[int, str]) -> List[int]
-       return list(my_dict.keys())
-   f({3: 'yes', 4: 'no'})
-   def f(my_mapping):
-       # type: (MutableMapping[int, str]) -> Set[str]
-       my_dict[5] = 'maybe'
-       return set(my_dict.values())
-   f({3: 'yes', 4: 'no'})
-
-
-Classes
-*******
-
-.. code-block:: python
-
-   class MyClass(object):
-
-       # For instance methods, omit `self`.
-       def my_class_method(self, num, str1):
-           # type: (int, str) -> str
-           return num * str1
-
-       # The __init__ method doesn't return anything, so it gets return
-       # type None just like any other method that doesn't return anything.
-       def __init__(self):
-           # type: () -> None
-           pass
-
-   # User-defined classes are written with just their own names.
-   x = MyClass() # type: MyClass
-
-
-Other stuff
-***********
-
-.. code-block:: python
-
-   import sys
-   # typing.Match describes regex matches from the re module.
-   from typing import Match, AnyStr, IO
-   x = re.match(r'[0-9]+', "15") # type: Match[str]
-
-   # Use AnyStr for functions that should accept any kind of string
-   # without allowing different kinds of strings to mix.
-   def concat(a: AnyStr, b: AnyStr) -> AnyStr:
-       return a + b
-   concat(u"foo", u"bar")  # type: unicode
-   concat(b"foo", b"bar")  # type: bytes
-
-   # Use IO[] for functions that should accept or return any
-   # object that comes from an open() call. The IO[] does not
-   # distinguish between reading, writing or other modes.
-   def get_sys_IO(mode='w') -> IO[str]:
-       if mode == 'w':
-           return sys.stdout
-       elif mode == 'r':
-           return sys.stdin
-       else:
-           return sys.stdout
-
-   # TODO: add TypeVar and a simple generic function
-
diff --git a/docs/source/cheat_sheet_py3.rst b/docs/source/cheat_sheet_py3.rst
deleted file mode 100644
index cc9fef3..0000000
--- a/docs/source/cheat_sheet_py3.rst
+++ /dev/null
@@ -1,288 +0,0 @@
-.. _cheat-sheet-py3:
-
-Mypy syntax cheat sheet (Python 3)
-==================================
-
-This document is a quick cheat sheet showing how the `PEP 484 <https://www.python.org/dev/peps/pep-0484/>`_ type
-language represents various common types in Python 3. Unless otherwise noted, the syntax is valid on all versions of Python 3.
-
-.. note::
-
-   Technically many of the type annotations shown below are redundant,
-   because mypy can derive them from the type of the expression.  So
-   many of the examples have a dual purpose: show how to write the
-   annotation, and show the inferred types.
-
-
-Built-in types
-**************
-
-.. code-block:: python
-
-   from typing import List, Set, Dict, Tuple, Text, Optional, AnyStr
-
-   # For simple built-in types, just use the name of the type.
-   x = 1  # type: int
-   x = 1.0  # type: float
-   x = True  # type: bool
-   x = "test"  # type: str
-   x = u"test"  # type: str
-   x = b"test"  # type: bytes
-
-   # For collections, the name of the type is capitalized, and the
-   # name of the type inside the collection is in brackets.
-   x = [1]  # type: List[int]
-   x = {6, 7}  # type: Set[int]
-
-   # For mappings, we need the types of both keys and values.
-   x = {'field': 2.0}  # type: Dict[str, float]
-
-   # For tuples, we specify the types of all the elements.
-   x = (3, "yes", 7.5)  # type: Tuple[int, str, float]
-
-   # For textual data, use Text.
-   # This is `unicode` in Python 2 and `str` in Python 3.
-   x = ["string", u"unicode"]  # type: List[Text]
-
-
-
-   # Use Optional for values that could be None.
-   input_str = f()  # type: Optional[str]
-   if input_str is not None:
-      print(input_str)
-
-
-Functions
-*********
-
-Python 3 introduces an annotation syntax for function declarations in `PEP 3107 <https://www.python.org/dev/peps/pep-3107/>`_.
-
-.. code-block:: python
-
-   from typing import Callable, Iterable, Union, Optional, List
-
-   # This is how you annotate a function definition.
-   def stringify(num: int) -> str:
-       return str(num)
-       
-   # And here's how you specify multiple arguments.
-   def plus(num1: int, num2: int) -> int:
-       return num1 + num2
-
-   # Add type annotations for kwargs as though they were positional args.
-   def f(num1: int, my_float: float = 3.5) -> float:
-       return num1 + my_float
-
-   # An argument can be declared positional-only by giving it a name
-   # starting with two underscores:
-   def quux(__x: int) -> None:
-       pass
-   quux(3)  # Fine
-   quux(__x=3)  # Error
-
-   # This is how you annotate a function value.
-   x = f # type: Callable[[int, float], float]
-
-   # A generator function that yields ints is secretly just a function that
-   # returns an iterable (see below) of ints, so that's how we annotate it.
-   def f(n: int) -> Iterable[int]:
-       i = 0
-       while i < n:
-           yield i
-           i += 1
-
-   # For a function with many arguments, you can of course split it over multiple lines
-   def send_email(address: Union[str, List[str]],
-                  sender: str,
-                  cc: Optional[List[str]],
-                  bcc: Optional[List[str]],
-                  subject='',
-                  body: List[str] = None
-                  ) -> bool:
-       
-       ...
-
-
-When you're puzzled or when things are complicated
-**************************************************
-
-.. code-block:: python
-
-   from typing import Union, Any, List, cast
-
-   # To find out what type mypy infers for an expression anywhere in
-   # your program, wrap it in reveal_type.  Mypy will print an error
-   # message with the type; remove it again before running the code.
-   reveal_type(1)  # -> error: Revealed type is 'builtins.int'
-
-   # Use Union when something could be one of a few types.
-   x = [3, 5, "test", "fun"]  # type: List[Union[int, str]]
-
-   # Use Any if you don't know the type of something or it's too
-   # dynamic to write a type for.
-   x = mystery_function()  # type: Any
-
-   # Use `ignore` to suppress type-checking on a given line, when your
-   # code confuses mypy or runs into an outright bug in mypy.
-   # Good practice is to comment every `ignore` with a bug link
-   # (in mypy, typeshed, or your own code) or an explanation of the issue.
-   x = confusing_function()  # type: ignore # https://github.com/python/mypy/issues/1167
-
-   # cast is a helper function for mypy that allows for guidance of how to convert types.
-   # it does not cast at runtime
-   a = [4]
-   b = cast(List[int], a)  # passes fine
-   c = cast(List[str], a)  # passes fine (no runtime check)
-   reveal_type(c)  # -> error: Revealed type is 'builtins.list[builtins.str]'
-   print(c)  # -> [4] the object is not cast
-
-   # TODO: explain "Need type annotation for variable" when
-   # initializing with None or an empty container
-
-
-Standard duck types
-*******************
-
-In typical Python code, many functions that can take a list or a dict
-as an argument only need their argument to be somehow "list-like" or
-"dict-like".  A specific meaning of "list-like" or "dict-like" (or
-something-else-like) is called a "duck type", and several duck types
-that are common in idiomatic Python are standardized.
-
-.. code-block:: python
-
-   from typing import Mapping, MutableMapping, Sequence, Iterable, List, Set
-
-   # Use Iterable for generic iterables (anything usable in `for`),
-   # and Sequence where a sequence (supporting `len` and `__getitem__`) is required.
-   def f(iterable_of_ints: Iterable[int]) -> List[str]:
-       return [str(x) for x in iterable_of_ints]
-   f(range(1, 3))
-
-   # Mapping describes a dict-like object (with `__getitem__`) that we won't mutate,
-   # and MutableMapping one (with `__setitem__`) that we might.
-   def f(my_dict: Mapping[int, str])-> List[int]:
-       return list(my_dict.keys())
-   f({3: 'yes', 4: 'no'})
-   def f(my_mapping: MutableMapping[int, str]) -> Set[str]:
-       my_mapping[5] = 'maybe'
-       return set(my_mapping.values())
-   f({3: 'yes', 4: 'no'})
-
-
-Classes
-*******
-
-.. code-block:: python
-
-   class MyClass:
-       # The __init__ method doesn't return anything, so it gets return
-       # type None just like any other method that doesn't return anything.
-       def __init__(self) -> None:
-           ...
-       # For instance methods, omit `self`.
-       def my_class_method(self, num: int, str1: str) -> str:
-           return num * str1
-
-
-
-   # User-defined classes are written with just their own names.
-   x = MyClass() # type: MyClass
-
-
-Other stuff
-***********
-
-.. code-block:: python
-
-   import sys
-   import re
-   # typing.Match describes regex matches from the re module.
-   from typing import Match, AnyStr, IO
-   x = re.match(r'[0-9]+', "15")  # type: Match[str]
-
-   # You can use AnyStr to indicate that any string type will work
-   # but not to mix types
-   def full_name(first: AnyStr, last: AnyStr) -> AnyStr:
-       return first+last
-   full_name('Jon','Doe')  # same str ok
-   full_name(b'Bill', b'Bit')  # same binary ok
-   full_name(b'Terry', 'Trouble')  # different str types, fails
-
-   # Use IO[] for functions that should accept or return any
-   # object that comes from an open() call. The IO[] does not
-   # distinguish between reading, writing or other modes.
-   def get_sys_IO(mode='w') -> IO[str]:
-       if mode == 'w':
-           return sys.stdout
-       elif mode == 'r':
-           return sys.stdin
-       else:
-           return sys.stdout
-
-   # forward references are useful if you want to referemce a class before it is designed
-   
-   def f(foo: A) -> int:  # this will fail
-       ...
-   
-   class A:
-       ...
-       
-   # however, using the string 'A', it will pass as long as there is a class of that name later on
-   def f(foo: 'A') -> int:
-       ...
-
-   # TODO: add TypeVar and a simple generic function
-
-Variable Annotation in Python 3.6 with PEP 526
-**********************************************
-
-Python 3.6 brings new syntax for annotating variables with `PEP 526 <https://www.python.org/dev/peps/pep-0526/>`_.
-Mypy brings limited support for PEP 526 annotations.
-
-
-.. code-block:: python
-
-   # annotation is similar to arguments to functions
-   name: str = "Eric Idle"
-   
-   # class instances can be annotated as follows
-   mc : MyClass = MyClass()
-   
-   # tuple packing can be done as follows
-   tu: Tuple[str, ...] = ('a', 'b', 'c')
-   
-   # annotations are not checked at runtime
-   year: int = '1972'  # error in type checking, but works at runtime
-   
-   # these are all equivalent
-   hour = 24 # type: int
-   hour: int; hour = 24
-   hour: int = 24
-   
-   # you do not (!) need to initialize a variable to annotate it
-   a: int # ok for type checking and runtime
-   
-   # which is useful in conditional branches
-   child: bool
-   if age < 18:
-       child = True
-   else:
-       child = False
-   
-   # annotations for classes are for instance variables (those created in __init__ or __new__)
-   class Battery:
-       charge_percent: int = 100  # this is an instance variable with a default value
-       capacity: int  # an instance variable without a default
-       
-   # you can use the ClassVar annotation to make the variable a class variable instead of an instance variable.
-   class Car:
-       seats: ClassVar[int] = 4
-       passengers: ClassVar[List[str]]
-       
-    # You can also declare the type of an attribute in __init__
-    class Box:
-        def __init__(self) -> None:
-            self.items: List[str] = []
-   
-Please see :ref:`python-36` for more on mypy's compatability with Python 3.6's new features.
diff --git a/docs/source/class_basics.rst b/docs/source/class_basics.rst
deleted file mode 100644
index dc778d3..0000000
--- a/docs/source/class_basics.rst
+++ /dev/null
@@ -1,157 +0,0 @@
-Class basics
-============
-
-Instance and class attributes
-*****************************
-
-Mypy type checker detects if you are trying to access a missing
-attribute, which is a very common programming error. For this to work
-correctly, instance and class attributes must be defined or
-initialized within the class. Mypy infers the types of attributes:
-
-.. code-block:: python
-
-   class A:
-       def __init__(self, x: int) -> None:
-           self.x = x     # Attribute x of type int
-
-   a = A(1)
-   a.x = 2       # OK
-   a.y = 3       # Error: A has no attribute y
-
-This is a bit like each class having an implicitly defined
-``__slots__`` attribute. This is only enforced during type
-checking and not when your program is running.
-
-You can declare types of variables in the class body explicitly using
-a type comment:
-
-.. code-block:: python
-
-   class A:
-       x = None  # type: List[int]  # Declare attribute x of type List[int]
-
-   a = A()
-   a.x = [1]     # OK
-
-As in Python, a variable defined in the class body can used as a class
-or an instance variable.
-
-Similarly, you can give explicit types to instance variables defined
-in a method:
-
-.. code-block:: python
-
-   class A:
-       def __init__(self) -> None:
-           self.x = []  # type: List[int]
-
-       def f(self) -> None:
-           self.y = 0  # type: Any
-
-You can only define an instance variable within a method if you assign
-to it explicitly using ``self``:
-
-.. code-block:: python
-
-   class A:
-       def __init__(self) -> None:
-           self.y = 1   # Define y
-           a = self
-           a.x = 1      # Error: x not defined
-
-Overriding statically typed methods
-***********************************
-
-When overriding a statically typed method, mypy checks that the
-override has a compatible signature:
-
-.. code-block:: python
-
-   class A:
-       def f(self, x: int) -> None:
-           ...
-
-   class B(A):
-       def f(self, x: str) -> None:   # Error: type of x incompatible
-           ...
-
-   class C(A):
-       def f(self, x: int, y: int) -> None:  # Error: too many arguments
-           ...
-
-   class D(A):
-       def f(self, x: int) -> None:   # OK
-           ...
-
-.. note::
-
-   You can also vary return types **covariantly** in overriding. For
-   example, you could override the return type ``object`` with a subtype
-   such as ``int``.
-
-You can also override a statically typed method with a dynamically
-typed one. This allows dynamically typed code to override methods
-defined in library classes without worrying about their type
-signatures.
-
-There is no runtime enforcement that the method override returns a
-value that is compatible with the original return type, since
-annotations have no effect at runtime:
-
-.. code-block:: python
-
-   class A:
-       def inc(self, x: int) -> int:
-           return x + 1
-
-   class B(A):
-       def inc(self, x):       # Override, dynamically typed
-           return 'hello'
-
-   b = B()
-   print(b.inc(1))   # hello
-   a = b # type: A
-   print(a.inc(1))   # hello
-
-Abstract base classes and multiple inheritance
-**********************************************
-
-Mypy uses Python abstract base classes for protocol types. There are
-several built-in abstract base classes types (for example,
-``Sequence``, ``Iterable`` and ``Iterator``). You can define abstract
-base classes using the ``abc.ABCMeta`` metaclass and the
-``abc.abstractmethod`` function decorator.
-
-.. code-block:: python
-
-   from abc import ABCMeta, abstractmethod
-   import typing
-
-   class A(metaclass=ABCMeta):
-       @abstractmethod
-       def foo(self, x: int) -> None: pass
-
-       @abstractmethod
-       def bar(self) -> str: pass
-
-   class B(A):
-       def foo(self, x: int) -> None: ...
-       def bar(self) -> str:
-           return 'x'
-
-   a = A() # Error: A is abstract
-   b = B() # OK
-
-Unlike most Python code, abstract base classes are likely to play a
-significant role in many complex mypy programs.
-
-A class can inherit any number of classes, both abstract and
-concrete. As with normal overrides, a dynamically typed method can
-implement a statically typed abstract method defined in an abstract
-base class.
-
-.. note::
-
-   There are also plans to support more Python-style "duck typing" in
-   the type system. The details are still open.
diff --git a/docs/source/command_line.rst b/docs/source/command_line.rst
deleted file mode 100644
index e5d1a80..0000000
--- a/docs/source/command_line.rst
+++ /dev/null
@@ -1,402 +0,0 @@
-.. _command-line:
-
-The mypy command line
-=====================
-
-This section documents many of mypy's command line flags.  A quick
-summary of command line flags can always be printed using the ``-h``
-flag (or its long form ``--help``)::
-
-  $ mypy -h
-  usage: mypy [-h] [-v] [-V] [--python-version x.y] [--platform PLATFORM] [-2]
-              [--ignore-missing-imports]
-              [--follow-imports {normal,silent,skip,error}]
-              [--disallow-untyped-calls] [--disallow-untyped-defs]
-              [--check-untyped-defs] [--disallow-subclassing-any]
-              [--warn-incomplete-stub] [--warn-redundant-casts]
-              [--warn-no-return] [--warn-unused-ignores] [--show-error-context]
-              [--fast-parser] [-i] [--cache-dir DIR] [--strict-optional]
-              [--strict-optional-whitelist [GLOB [GLOB ...]]]
-              [--junit-xml JUNIT_XML] [--pdb] [--show-traceback] [--stats]
-              [--inferstats] [--custom-typing MODULE]
-              [--custom-typeshed-dir DIR] [--scripts-are-modules]
-              [--config-file CONFIG_FILE] [--show-column-numbers]
-              [--find-occurrences CLASS.MEMBER] [--cobertura-xml-report DIR]
-              [--html-report DIR] [--linecount-report DIR]
-              [--linecoverage-report DIR] [--memory-xml-report DIR]
-              [--old-html-report DIR] [--txt-report DIR] [--xml-report DIR]
-              [--xslt-html-report DIR] [--xslt-txt-report DIR] [-m MODULE]
-              [-c PROGRAM_TEXT] [-p PACKAGE]
-              [files [files ...]]
-
-  (etc., too long to show everything here)
-
-Specifying files and directories to be checked
-**********************************************
-
-You've already seen ``mypy program.py`` as a way to type check the
-file ``program.py``.  More generally you can pass any number of files
-and directories on the command line and they will all be type checked
-together.
-
-- Files ending in ``.py`` (and stub files ending in ``.pyi``) are
-  checked as Python modules.
-
-- Files not ending in ``.py`` or ``.pyi`` are assumed to be Python
-  scripts and checked as such.
-
-- Directories representing Python packages (i.e. containing a
-  ``__init__.py[i]`` file) are checked as Python packages; all
-  submodules and subpackages will be checked (subpackages must
-  themselves have a ``__init__.py[i]`` file).
-
-- Directories that don't represent Python packages (i.e. not directly
-  containing an ``__init__.py[i]`` file) are checked as follows:
-
-  - All ``*.py[i]`` files contained directly therein are checked as
-    toplevel Python modules;
-
-  - All packages contained directly therein (i.e. immediate
-    subdirectories with an ``__init__.py[i]`` file) are checked as
-    toplevel Python packages.
-
-One more thing about checking modules and packages: if the directory
-*containing* a module or package specified on the command line has an
-``__init__.py[i]`` file, mypy assigns these an absolute module name by
-crawling up the path until no ``__init__.py[i]`` file is found.  For
-example, suppose we run the command ``mypy foo/bar/baz.py`` where
-``foo/bar/__init__.py`` exists but ``foo/__init__.py`` does not.  Then
-the module name assumed is ``bar.baz`` and the directory ``foo`` is
-added to mypy's module search path.  On the other hand, if
-``foo/bar/__init__.py`` did not exist, ``foo/bar`` would be added to
-the module search path instead, and the module name assumed is just
-``baz``.
-
-If a script (a file not ending in ``.py[i]``) is processed, the module
-name assumed is always ``__main__`` (matching the behavior of the
-Python interpreter).
-
-Other ways of specifying code to be checked
-*******************************************
-
-The flag ``-m`` (long form: ``--module``) lets you specify a module
-name to be found using the default module search path.  The module
-name may contain dots.  For example::
-
-  $ mypy -m html.parser
-
-will type check the module ``html.parser`` (this happens to be a
-library stub).
-
-The flag ``-p`` (long form: ``--package``) is similar to ``-m`` but
-you give it a package name and it will type check all submodules and
-subpackages (recursively) of that package.  (If you pass a package
-name to ``-m`` it will just type check the package's ``__init__.py``
-and anything imported from there.)  For example::
-
-  $ mypy -p html
-
-will type check the entire ``html`` package (of library stubs).
-
-Finally the flag ``-c`` (long form: ``--command``) will take a string
-from the command line and type check it as a small program.  For
-example::
-
-  $ mypy -c 'x = [1, 2]; print(x())'
-
-will type check that little program (and complain that ``List[int]``
-is not callable).
-
-Reading a list of files from a file
-***********************************
-
-Finally, any command-line argument starting with ``@`` reads additional
-command-line arguments from the file following the ``@`` character.
-This is primarily useful if you have a file containing a list of files
-that you want to be type-checked: instead of using shell syntax like::
-
-  mypy $(cat file_of_files)
-
-you can use this instead::
-
-  mypy @file_of_files
-
-Such a file can also contain other flags, but a preferred way of
-reading flags (not files) from a file is to use a
-:ref:`configuration file <config-file>`.
-
-
-.. _finding-imports:
-
-How imports are found
-*********************
-
-When mypy encounters an `import` statement it tries to find the module
-on the file system, similar to the way Python finds it.
-However, there are some differences.
-
-First, mypy has its own search path.
-This is computed from the following items:
-
-- The ``MYPYPATH`` environment variable
-  (a colon-separated list of directories).
-- The directories containing the sources given on the command line
-  (see below).
-- The relevant directories of the
-  `typeshed <https://github.com/python/typeshed>`_ repo.
-
-For sources given on the command line, the path is adjusted by crawling
-up from the given file or package to the nearest directory that does not
-contain an ``__init__.py`` or ``__init__.pyi`` file.
-
-Second, mypy searches for stub files in addition to regular Python files
-and packages.
-The rules for searching a module ``foo`` are as follows:
-
-- The search looks in each of the directories in the search path
-  (see above) until a match is found.
-- If a package named ``foo`` is found (i.e. a directory
-  ``foo`` containing an ``__init__.py`` or ``__init__.pyi`` file)
-  that's a match.
-- If a stub file named ``foo.pyi`` is found, that's a match.
-- If a Python module named ``foo.py`` is found, that's a match.
-
-These matches are tried in order, so that if multiple matches are found
-in the same directory on the search path
-(e.g. a package and a Python file, or a stub file and a Python file)
-the first one in the above list wins.
-
-In particular, if a Python file and a stub file are both present in the
-same directory on the search path, only the stub file is used.
-(However, if the files are in different directories, the one found
-in the earlier directory is used.)
-
-NOTE: These rules are relevant to the following section too:
-the ``--follow-imports`` flag described below is applied _after_ the
-above algorithm has determined which package, stub or module to use.
-
-.. _follow-imports:
-
-Following imports or not?
-*************************
-
-When you're first attacking a large existing codebase with mypy, you
-may only want to check selected files.  For example, you may only want
-to check those files to which you have already added annotations.
-This is easily accomplished using a shell pipeline like this::
-
-  mypy $(find . -name \*.py | xargs grep -l '# type:')
-
-(While there are many improvements possible to make this example more
-robust, this is not the place for a tutorial in shell programming.)
-
-However, by default mypy doggedly tries to :ref:`follow imports
-<finding-imports>`.  This may cause several types of problems that you
-may want to silence during your initial conquest:
-
-- Your code may import library modules for which no stub files exist
-  yet.  This can cause a lot of errors like the following::
-
-    main.py:1: error: No library stub file for standard library module 'antigravity'
-    main.py:2: error: No library stub file for module 'flask'
-    main.py:3: error: Cannot find module named 'sir_not_appearing_in_this_film'
-
-  If you see only a few of these you may be able to silence them by
-  putting ``# type: ignore`` on the respective ``import`` statements,
-  but it's usually easier to silence all such errors by using
-  :ref:`--ignore-missing-imports <ignore-missing-imports>`.
-
-- Your project's directory structure may hinder mypy in finding
-  certain modules that are part of your project, e.g. modules hidden
-  away in a subdirectory that's not a package.  You can usually deal
-  with this by setting the ``MYPYPATH`` variable (see
-  :ref:`finding-imports`).
-
-- When following imports mypy may find a module that's part of your
-  project but which you haven't annotated yet, mypy may report errors
-  for the top level code in that module (where the top level includes
-  class bodies and function/method default values).  Here the
-  ``--follow-imports`` flag comes in handy.
-
-The ``--follow-imports`` flag takes a mandatory string value that can
-take one of four values.  It only applies to modules for which a
-``.py`` file is found (but no corresponding ``.pyi`` stub file) and
-that are not given on the command line.  Passing a package or
-directory on the command line implies all modules in that package or
-directory.  The four possible values are:
-
-- ``normal`` (the default) follow imports normally and type check all
-  top level code (as well as the bodies of all functions and methods
-  with at least one type annotation in the signature).
-
-- ``silent`` follow imports normally and even "type check" them
-  normally, but *suppress any error messages*. This is typically the
-  best option for a new codebase.
-
-- ``skip`` *don't* follow imports, silently replacing the module (and
-  everything imported *from* it) with an object of type ``Any``.
-  (This option used to be known as ``--silent-imports`` and while it
-  is very powerful it can also cause hard-to-debug errors, hence the
-  recommendation of using ``silent`` instead.)
-
-- ``error`` the same behavior as ``skip`` but not quite as silent --
-  it flags the import as an error, like this::
-
-    main.py:1: note: Import of 'submodule' ignored
-    main.py:1: note: (Using --follow-imports=error, module not passed on command line)
-
-
-Additional command line flags
-*****************************
-
-Here are some more useful flags:
-
-.. _ignore-missing-imports:
-
-- ``--ignore-missing-imports`` suppresses error messages about imports
-  that cannot be resolved (see :ref:`follow-imports` for some examples).
-
-- ``--strict-optional`` enables experimental strict checking of ``Optional[...]``
-  types and ``None`` values. Without this option, mypy doesn't generally check the
-  use of ``None`` values -- they are valid everywhere. See :ref:`strict_optional` for
-  more about this feature.
-
-- ``--strict-optional-whitelist`` attempts to suppress strict Optional-related
-  errors in non-whitelisted files.  Takes an arbitrary number of globs as the
-  whitelist.  This option is intended to be used to incrementally roll out
-  ``--strict-optional`` to a large codebase that already has mypy annotations.
-  However, this flag comes with some significant caveats.  It does not suppress
-  all errors caused by turning on ``--strict-optional``, only most of them, so
-  there may still be a bit of upfront work to be done before it can be used in
-  CI.  It will also suppress some errors that would be caught in a
-  non-strict-Optional run.  Therefore, when using this flag, you should also
-  re-check your code without ``--strict-optional`` to ensure new type errors
-  are not introduced.
-
-- ``--disallow-untyped-defs`` reports an error whenever it encounters
-  a function definition without type annotations.
-
-- ``--check-untyped-defs`` is less severe than the previous option --
-  it type checks the body of every function, regardless of whether it
-  has type annotations.  (By default the bodies of functions without
-  annotations are not type checked.)  It will assume all arguments
-  have type ``Any`` and always infer ``Any`` as the return type.
-
-- ``--disallow-untyped-calls`` reports an error whenever a function
-  with type annotations calls a function defined without annotations.
-
-.. _disallow-subclassing-any:
-
-- ``--disallow-subclassing-any`` reports an error whenever a class
-  subclasses a value of type ``Any``.  This may occur when the base
-  class is imported from a module that doesn't exist (when using
-  :ref:`--ignore-missing-imports <ignore-missing-imports>`) or is
-  ignored due to :ref:`--follow-imports=skip <follow-imports>` or a
-  ``# type: ignore`` comment on the ``import`` statement.  Since the
-  module is silenced, the imported class is given a type of ``Any``.
-  By default mypy will assume that the subclass correctly inherited
-  the base class even though that may not actually be the case.  This
-  flag makes mypy raise an error instead.
-
-- ``--incremental`` is an experimental option that enables incremental
-  type checking. When enabled, mypy caches results from previous runs
-  to speed up type checking. Incremental mode can help when most parts
-  of your program haven't changed since the previous mypy run.
-
-- ``--fast-parser`` enables an experimental parser implemented in C that
-  is faster than the default parser and supports multi-line comment
-  function annotations (see :ref:`multi_line_annotation` for the details).
-
-- ``--python-version X.Y`` will make mypy typecheck your code as if it were
-  run under Python version X.Y. Without this option, mypy will default to using
-  whatever version of Python is running mypy. Note that the ``-2`` and
-  ``--py2`` flags are aliases for ``--python-version 2.7``. See
-  :ref:`version_and_platform_checks` for more about this feature.
-
-- ``--platform PLATFORM`` will make mypy typecheck your code as if it were
-  run under the the given operating system. Without this option, mypy will
-  default to using whatever operating system you are currently using. See
-  :ref:`version_and_platform_checks` for more about this feature.
-
-- ``--show-column-numbers`` will add column offsets to error messages,
-  for example, the following indicates an error in line 12, column 9
-  (note that column offsets are 0-based):
-
-  .. code-block:: python
-
-     main.py:12:9: error: Unsupported operand types for / ("int" and "str")
-
-- ``--scripts-are-modules`` will give command line arguments that
-  appear to be scripts (i.e. files whose name does not end in ``.py``)
-  a module name derived from the script name rather than the fixed
-  name ``__main__``.  This allows checking more than one script in a
-  single mypy invocation.  (The default ``__main__`` is technically
-  more correct, but if you have many scripts that import a large
-  package, the behavior enabled by this flag is often more
-  convenient.)
-
-- ``--custom-typeshed-dir DIR`` specifies the directory where mypy looks for
-  typeshed stubs, instead of the typeshed that ships with mypy.  This is
-  primarily intended to make it easier to test typeshed changes before
-  submitting them upstream, but also allows you to use a forked version of
-  typeshed.
-
-.. _config-file-flag:
-
-- ``--config-file CONFIG_FILE`` causes configuration settings to be
-  read from the given file.  By default settings are read from ``mypy.ini``
-  in the current directory.  Settings override mypy's built-in defaults
-  and command line flags can override settings.  See :ref:`config-file`
-  for the syntax of configuration files.
-
-- ``--junit-xml JUNIT_XML`` will make mypy generate a JUnit XML test
-  result document with type checking results. This can make it easier
-  to integrate mypy with continuous integration (CI) tools.
-
-- ``--find-occurrences CLASS.MEMBER`` will make mypy print out all
-  usages of a class member based on static type information. This
-  feature is experimental.
-
-- ``--cobertura-xml-report DIR`` causes mypy to generate a Cobertura
-  XML type checking coverage report.
-
-- ``--warn-no-return`` causes mypy to generate errors for missing return
-  statements on some execution paths. Mypy doesn't generate these errors
-  for functions with ``None`` or ``Any`` return types. Mypy
-  also currently ignores functions with an empty body or a body that is
-  just ellipsis (``...``), since these can be valid as abstract methods.
-
-For the remaining flags you can read the full ``mypy -h`` output.
-
-.. note::
-
-   Command line flags are liable to change between releases.
-
-.. _integrating-mypy:
-
-Integrating mypy into another Python application
-************************************************
-
-It is possible to integrate mypy into another Python 3 application by
-importing ``mypy.api`` and calling the ``run`` function with exactly the string
-you would have passed to mypy from the command line.
-
-Function ``run`` returns a tuple of strings:
-``(<normal_report>, <error_report>)``, in which ``<normal_report>`` is what mypy
-normally writes to ``sys.stdout`` and ``<error_report>`` is what mypy normally
-writes to ``sys.stderr``.
-
-A trivial example of this is the following::
-
-    import sys
-    from mypy import api
-
-    result = api.run(' '.join(sys.argv[1:]))
-
-    if result[0]:
-        print('\nType checking report:\n')
-        print(result[0])  # stdout
-
-    if result[1]:
-        print('\nError report:\n')
-        print(result[1])  # stderr
diff --git a/docs/source/common_issues.rst b/docs/source/common_issues.rst
deleted file mode 100644
index 3477d90..0000000
--- a/docs/source/common_issues.rst
+++ /dev/null
@@ -1,386 +0,0 @@
-.. _common_issues:
-
-Common issues
-=============
-
-This section has examples of cases when you need to update your code
-to use static typing, and ideas for working around issues if mypy
-doesn't work as expected. Statically typed code is often identical to
-normal Python code, but sometimes you need to do things slightly
-differently.
-
-Can't install mypy using pip
-----------------------------
-
-If installation fails, you've probably hit one of these issues:
-
-* Mypy needs Python 3.3 or later to run.
-* You may have to run pip like this:
-  ``python3 -m pip install mypy``.
-
-.. _annotations_needed:
-
-No errors reported for obviously wrong code
--------------------------------------------
-
-There are several common reasons why obviously wrong code is not
-flagged as an error.
-
-- **The function containing the error is not annotated.** Functions that
-  do not have any annotations (neither for any argument nor for the
-  return type) are not type-checked, and even the most blatant type
-  errors (e.g. ``2 + 'a'``) pass silently.  The solution is to add
-  annotations.
-
-  Example:
-
-  .. code-block:: python
-
-      def foo(a):
-          return '(' + a.split() + ')'  # No error!
-
-  This gives no error even though ``a.split()`` is "obviously" a list
-  (the author probably meant ``a.strip()``).  The error is reported
-  once you add annotations:
-
-  .. code-block:: python
-
-      def foo(a: str) -> str:
-          return '(' + a.split() + ')'
-      # error: Unsupported operand types for + ("str" and List[str])
-
-  If you don't know what types to add, you can use ``Any``, but beware:
-
-- **One of the values involved has type ``Any``.** Extending the above
-  example, if we were to leave out the annotation for ``a``, we'd get
-  no error:
-
-  .. code-block:: python
-
-      def foo(a) -> str:
-          return '(' + a.split() + ')'  # No error!
-
-  The reason is that if the type of ``a`` is unknown, the type of
-  ``a.split()`` is also unknown, so it is inferred as having type
-  ``Any``, and it is no error to add a string to an ``Any``.
-
-  If you're having trouble debugging such situations,
-  :ref:`reveal_type() <reveal-type>` might come in handy.
-
-  Note that sometimes library stubs have imprecise type information,
-  e.g. the ``pow()`` builtin returns ``Any`` (see `typeshed issue 285
-  <https://github.com/python/typeshed/issues/285>`_ for the reason).
-
-- **Some imports may be silently ignored**.  Another source of
-  unexpected ``Any`` values are the :ref:`"--ignore-missing-imports"
-  <ignore-missing-imports>` and :ref:`"--follow-imports=skip"
-  <follow-imports>` flags.  When you use ``--ignore-missing-imports``,
-  any imported module that cannot be found is silently replaced with
-  ``Any``.  When using ``--follow-imports=skip`` the same is true for
-  modules for which a ``.py`` file is found but that are not specified
-  on the command line.  (If a ``.pyi`` stub is found it is always
-  processed normally, regardless of the value of
-  ``--follow-imports``.)  To help debug the former situation (no
-  module found at all) leave out ``--ignore-missing-imports``; to get
-  clarity about the latter use ``--follow-imports=error``.  You can
-  read up about these and other useful flags in :ref:`command-line`.
-
-.. _silencing_checker:
-
-Spurious errors and locally silencing the checker
--------------------------------------------------
-
-You can use a ``# type: ignore`` comment to silence the type checker
-on a particular line. For example, let's say our code is using
-the C extension module ``frobnicate``, and there's no stub available.
-Mypy will complain about this, as it has no information about the
-module:
-
-.. code-block:: python
-
-    import frobnicate  # Error: No module "frobnicate"
-    frobnicate.start()
-
-You can add a ``# type: ignore`` comment to tell mypy to ignore this
-error:
-
-.. code-block:: python
-
-    import frobnicate  # type: ignore
-    frobnicate.start()  # Okay!
-
-The second line is now fine, since the ignore comment causes the name
-``frobnicate`` to get an implicit ``Any`` type.
-
-.. note::
-
-    The ``# type: ignore`` comment will only assign the implicit ``Any``
-    type if mypy cannot find information about that particular module. So,
-    if we did have a stub available for ``frobnicate`` then mypy would
-    ignore the ``# type: ignore`` comment and typecheck the stub as usual.
-
-Types of empty collections
---------------------------
-
-You often need to specify the type when you assign an empty list or
-dict to a new variable, as mentioned earlier:
-
-.. code-block:: python
-
-   a = []  # type: List[int]
-
-Without the annotation mypy can't always figure out the
-precise type of ``a``.
-
-You can use a simple empty list literal in a dynamically typed function (as the
-type of ``a`` would be implicitly ``Any`` and need not be inferred), if type
-of the variable has been declared or inferred before, or if you perform a simple
-modification operation in the same scope (such as ``append`` for a list):
-
-.. code-block:: python
-
-   a = []  # Okay because followed by append, inferred type List[int]
-   for i in range(n):
-       a.append(i * i)
-
-However, in more complex cases an explicit type annotation can be
-required (mypy will tell you this). Often the annotation can
-make your code easier to understand, so it doesn't only help mypy but
-everybody who is reading the code!
-
-Redefinitions with incompatible types
--------------------------------------
-
-Each name within a function only has a single 'declared' type. You can
-reuse for loop indices etc., but if you want to use a variable with
-multiple types within a single function, you may need to declare it
-with the ``Any`` type.
-
-.. code-block:: python
-
-   def f() -> None:
-       n = 1
-       ...
-       n = 'x'        # Type error: n has type int
-
-.. note::
-
-   This limitation could be lifted in a future mypy
-   release.
-
-Note that you can redefine a variable with a more *precise* or a more
-concrete type. For example, you can redefine a sequence (which does
-not support ``sort()``) as a list and sort it in-place:
-
-.. code-block:: python
-
-    def f(x: Sequence[int]) -> None:
-        # Type of x is Sequence[int] here; we don't know the concrete type.
-        x = list(x)
-        # Type of x is List[int] here.
-        x.sort()  # Okay!
-
-Declaring a supertype as variable type
---------------------------------------
-
-Sometimes the inferred type is a subtype (subclass) of the desired
-type. The type inference uses the first assignment to infer the type
-of a name (assume here that ``Shape`` is the base class of both
-``Circle`` and ``Triangle``):
-
-.. code-block:: python
-
-   shape = Circle()    # Infer shape to be Circle
-   ...
-   shape = Triangle()  # Type error: Triangle is not a Circle
-
-You can just give an explicit type for the variable in cases such the
-above example:
-
-.. code-block:: python
-
-   shape = Circle() # type: Shape   # The variable s can be any Shape,
-                                    # not just Circle
-   ...
-   shape = Triangle()               # OK
-
-Complex type tests
-------------------
-
-Mypy can usually infer the types correctly when using ``isinstance()``
-type tests, but for other kinds of checks you may need to add an
-explicit type cast:
-
-.. code-block:: python
-
-   def f(o: object) -> None:
-       if type(o) is int:
-           o = cast(int, o)
-           g(o + 1)    # This would be an error without the cast
-           ...
-       else:
-           ...
-
-.. note::
-
-    Note that the ``object`` type used in the above example is similar
-    to ``Object`` in Java: it only supports operations defined for *all*
-    objects, such as equality and ``isinstance()``. The type ``Any``,
-    in contrast, supports all operations, even if they may fail at
-    runtime. The cast above would have been unnecessary if the type of
-    ``o`` was ``Any``.
-
-Mypy can't infer the type of ``o`` after the ``type()`` check
-because it only knows about ``isinstance()`` (and the latter is better
-style anyway).  We can write the above code without a cast by using
-``isinstance()``:
-
-.. code-block:: python
-
-   def f(o: object) -> None:
-       if isinstance(o, int):  # Mypy understands isinstance checks
-           g(o + 1)        # Okay; type of o is inferred as int here
-           ...
-
-Type inference in mypy is designed to work well in common cases, to be
-predictable and to let the type checker give useful error
-messages. More powerful type inference strategies often have complex
-and difficult-to-predict failure modes and could result in very
-confusing error messages. The tradeoff is that you as a programmer
-sometimes have to give the type checker a little help.
-
-.. _version_and_platform_checks:
-
-Python version and system platform checks
------------------------------------------
-
-Mypy supports the ability to perform Python version checks and platform
-checks (e.g. Windows vs Posix), ignoring code paths that won't be run on
-the targeted Python version or platform. This allows you to more effectively
-typecheck code that supports multiple versions of Python or multiple operating
-systems.
-
-More specifically, mypy will understand the use of ``sys.version_info`` and
-``sys.platform`` checks within ``if/elif/else`` statements. For example:
-
-.. code-block:: python
-
-   import sys
-
-   # Distinguishing between different versions of Python:
-   if sys.version_info >= (3, 5):
-       # Python 3.5+ specific definitions and imports
-   elif sys.version_info[0] >= 3:
-       # Python 3 specific definitions and imports
-   else:
-       # Python 2 specific definitions and imports
-
-   # Distinguishing between different operating systems:
-   if sys.platform.startswith("linux"):
-       # Linux-specific code
-   elif sys.platform == "darwin":
-       # Mac-specific code
-   elif sys.platform == "win32":
-       # Windows-specific code
-   else:
-       # Other systems
-
-.. note::
-
-   Mypy currently does not support more complex checks, and does not assign
-   any special meaning when assigning a ``sys.version_info`` or ``sys.platform``
-   check to a variable. This may change in future versions of mypy.
-
-By default, mypy will use your current version of Python and your current
-operating system as default values for ``sys.version_info`` and
-``sys.platform``.
-
-To target a different Python version, use the ``--python-version X.Y`` flag.
-For example, to verify your code typechecks if were run using Python 2, pass
-in ``--python-version 2.7`` from the command line. Note that you do not need
-to have Python 2.7 installed to perform this check.
-
-To target a different operating system, use the ``--platform PLATFORM`` flag.
-For example, to verify your code typechecks if it were run in Windows, pass
-in ``--platform win32``. See the documentation for
-`sys.platform <https://docs.python.org/3/library/sys.html#sys.platform>`_
-for examples of valid platform parameters.
-
-.. _reveal-type:
-
-Displaying the type of an expression
-------------------------------------
-
-You can use ``reveal_type(expr)`` to ask mypy to display the inferred
-static type of an expression. This can be useful when you don't quite
-understand how mypy handles a particular piece of code. Example:
-
-.. code-block:: python
-
-   reveal_type((1, 'hello'))  # Revealed type is 'Tuple[builtins.int, builtins.str]'
-
-.. note::
-
-   ``reveal_type`` is only understood by mypy and doesn't exist
-   in Python, if you try to run your program. You'll have to remove
-   any ``reveal_type`` calls before you can run your code.
-   ``reveal_type`` is always available and you don't need to import it.
-
-.. _import-cycles:
-
-Import cycles
--------------
-
-An import cycle occurs where module A imports module B and module B
-imports module A (perhaps indirectly, e.g. ``A -> B -> C -> A``).
-Sometimes in order to add type annotations you have to add extra
-imports to a module and those imports cause cycles that didn't exist
-before.  If those cycles become a problem when running your program,
-there's a trick: if the import is only needed for type annotations in
-forward references (string literals) or comments, you can write the
-imports inside ``if TYPE_CHECKING:`` so that they are not executed at runtime.
-Example:
-
-File ``foo.py``:
-
-.. code-block:: python
-
-   from typing import List, TYPE_CHECKING
-
-   if TYPE_CHECKING:
-       import bar
-
-   def listify(arg: 'bar.BarClass') -> 'List[bar.BarClass]':
-       return [arg]
-
-File ``bar.py``:
-
-.. code-block:: python
-
-   from typing import List
-   from foo import listify
-
-   class BarClass:
-       def listifyme(self) -> 'List[BarClass]':
-           return listify(self)
-
-.. note::
-
-   The ``TYPE_CHECKING`` constant defined by the ``typing`` module
-   is ``False`` at runtime but ``True`` while type checking.
-
-Python 3.5.1 doesn't have ``typing.TYPE_CHECKING``. An alternative is
-to define a constant named ``MYPY`` that has the value ``False``
-at runtime. Mypy considers it to be ``True`` when type checking.
-Here's the above example modified to use ``MYPY``:
-
-.. code-block:: python
-
-   from typing import List
-
-   MYPY = False
-   if MYPY:
-       import bar
-
-   def listify(arg: 'bar.BarClass') -> 'List[bar.BarClass]':
-       return [arg]
diff --git a/docs/source/conf.py b/docs/source/conf.py
deleted file mode 100644
index cf64842..0000000
--- a/docs/source/conf.py
+++ /dev/null
@@ -1,268 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Mypy documentation build configuration file, created by
-# sphinx-quickstart on Sun Sep 14 19:50:35 2014.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys
-import os
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-sys.path.insert(0, os.path.abspath('../..'))
-
-from mypy.version import __version__ as mypy_version
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'Mypy'
-copyright = u'2016, Jukka Lehtosalo'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = mypy_version.split('-')[0]
-# The full version, including alpha/beta/rc tags.
-release = mypy_version
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = []
-
-# The reST default role (used for this markup: `text`) to use for all
-# documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-# If true, keep warnings as "system message" paragraphs in the built documents.
-#keep_warnings = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-try:
-    import sphinx_rtd_theme
-except:
-    html_theme = 'default'
-else:
-    html_theme = 'sphinx_rtd_theme'
-    html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further.  For a list of options available for each theme, see the
-# documentation.
-#html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
-
-# The name for this set of Sphinx documents.  If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar.  Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-#html_static_path = ['_static']
-
-# Add any extra paths that contain custom files (such as robots.txt or
-# .htaccess) here, relative to this directory. These files are copied
-# directly to the root of the documentation.
-#html_extra_path = []
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it.  The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'Mypydoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
-# The paper size ('letterpaper' or 'a4paper').
-#'papersize': 'letterpaper',
-
-# The font size ('10pt', '11pt' or '12pt').
-#'pointsize': '10pt',
-
-# Additional stuff for the LaTeX preamble.
-#'preamble': '',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-#  author, documentclass [howto, manual, or own class]).
-latex_documents = [
-  ('index', 'Mypy.tex', u'Mypy Documentation',
-   u'Jukka', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
-    ('index', 'mypy', u'Mypy Documentation',
-     [u'Jukka Lehtosalo'], 1)
-]
-
-# If true, show URL addresses after external links.
-#man_show_urls = False
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-#  dir menu entry, description, category)
-texinfo_documents = [
-  ('index', 'Mypy', u'Mypy Documentation',
-   u'Jukka', 'Mypy', 'One line description of project.',
-   'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
-
-# If false, no module index is generated.
-#texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
-
-# If true, do not generate a @detailmenu in the "Top" node's menu.
-#texinfo_no_detailmenu = False
-
-rst_prolog = '.. |...| unicode:: U+2026   .. ellipsis\n'
diff --git a/docs/source/config_file.rst b/docs/source/config_file.rst
deleted file mode 100644
index 001f6c9..0000000
--- a/docs/source/config_file.rst
+++ /dev/null
@@ -1,184 +0,0 @@
-.. _config-file:
-
-The mypy configuration file
-===========================
-
-Mypy supports reading configuration settings from a file.  By default
-it uses the file ``mypy.ini`` in the current directory; the
-``--config-file`` command-line flag can be used to read a different
-file instead (see :ref:`--config-file <config-file-flag>`).
-
-Most flags correspond closely to :ref:`command-line flags
-<command-line>` but there are some differences in flag names and some
-flags may take a different value based on the module being processed.
-
-The configuration file format is the usual
-`ini file <https://docs.python.org/3.6/library/configparser.html>`_
-format.  It should contain section names in square brackets and flag
-settings of the form `NAME = VALUE`.  Comments start with ``#``
-characters.
-
-- A section named ``[mypy]`` must be present.  This specifies
-  the global flags.
-
-- Additional sections named ``[mypy-PATTERN1,PATTERN2,...]`` may be
-  present, where ``PATTERN1``, ``PATTERN2`` etc. are `fnmatch patterns
-  <https://docs.python.org/3.6/library/fnmatch.html>`_
-  separated by commas.  These sections specify additional flags that
-  only apply to *modules* whose name matches at least one of the patterns.
-
-Global flags
-************
-
-The following global flags may only be set in the global section
-(``[mypy]``).
-
-- ``python_version`` (string) specifies the Python version used to
-  parse and check the target program.  The format is ``DIGIT.DIGIT``
-  for example ``2.7``.  The default is the version of the Python
-  interpreter used to run mypy.
-
-- ``platform`` (string) specifies the OS platform for the target
-  program, for example ``darwin`` or ``win32`` (meaning OS X or
-  Windows, respectively).  The default is the current platform as
-  revealed by Python's ``sys.platform`` variable.
-
-- ``custom_typing_module`` (string) specifies the name of an
-  alternative module which is to be considered equivalent to the
-  ``typing`` module.
-
-- ``custom_typeshed_dir`` (string) specifies the name of an
-  alternative directory which is used to look for stubs instead of the
-  default ``typeshed`` directory.
-
-- ``mypy_path`` (string) specifies the paths to use, after trying the paths
-  from ``MYPYPATH`` environment variable.  Useful if you'd like to keep stubs
-  in your repo, along with the config file.
-
-- ``warn_incomplete_stub`` (Boolean, default False) warns for missing
-  type annotation in typeshed.  This is only relevant in combination
-  with ``check_untyped_defs``.
-
-- ``warn_redundant_casts`` (Boolean, default False) warns about
-  casting an expression to its inferred type.
-
-- ``warn_unused_ignores`` (Boolean, default False) warns about
-  unneeded ``# type: ignore`` comments.
-
-- ``strict_optional`` (Boolean, default False) enables experimental
-  strict Optional checks.
-
-- ``scripts_are_modules`` (Boolean, default False) makes script ``x``
-  become module ``x`` instead of ``__main__``.  This is useful when
-  checking multiple scripts in a single run.
-
-- ``verbosity`` (integer, default 0) controls how much debug output
-  will be generated.  Higher numbers are more verbose.
-
-- ``pdb`` (Boolean, default False) invokes pdb on fatal error.
-
-- ``show_traceback`` (Boolean, default False) shows traceback on fatal
-  error.
-
-- ``dump_type_stats`` (Boolean, default False) dumps stats about type
-  definitions.
-
-- ``dump_inference_stats`` (Boolean, default False) dumps stats about
-  type inference.
-
-- ``fast_parser`` (Boolean, default False) enables the experimental
-  fast parser.
-
-- ``incremental`` (Boolean, default False) enables the experimental
-  module cache.
-
-- ``cache_dir`` (string, default ``.mypy_cache``) stores module cache
-  info in the given folder in incremental mode.
-
-- ``show_error_context`` (Boolean, default False) shows
-  context notes before errors.
-
-- ``show_column_numbers`` (Boolean, default False) shows column numbers in
-  error messages.
-
-
-.. _per-module-flags:
-
-Per-module flags
-****************
-
-The following flags may vary per module.  They may also be specified in
-the global section; the global section provides defaults which are
-overridden by the pattern sections matching the module name.
-
-.. note::
-
-   If multiple pattern sections match a module they are processed in
-   unspecified order.
-
-- ``follow_imports`` (string, default ``normal``) directs what to do
-  with imports when the imported module is found as a ``.py`` file and
-  not part of the files, modules and packages on the command line.
-  The four possible values are ``normal``, ``silent``, ``skip`` and
-  ``error``.  For explanations see the discussion for the
-  :ref:`--follow-imports <follow-imports>` command line flag.  Note
-  that if pattern matching is used, the pattern should match the name
-  of the _imported_ module, not the module containing the import
-  statement.
-
-- ``ignore_missing_imports`` (Boolean, default False) suppress error
-  messages about imports that cannot be resolved.  Note that if
-  pattern matching is used, the pattern should match the name of the
-  _imported_ module, not the module containing the import statement.
-
-- ``silent_imports`` (Boolean, deprecated) equivalent to
-  ``follow_imports=skip`` plus ``ignore_missing_imports=True``.
-
-- ``almost_silent`` (Boolean, deprecated) equivalent to
-  ``follow_imports=skip``.
-
-- ``disallow_untyped_calls`` (Boolean, default False) disallows
-  calling functions without type annotations from functions with type
-  annotations.
-
-- ``disallow_untyped_defs`` (Boolean, default False) disallows
-  defining functions without type annotations or with incomplete type
-  annotations.
-
-- ``check_untyped_defs`` (Boolean, default False) type-checks the
-  interior of functions without type annotations.
-
-- ``debug_cache`` (Boolean, default False) writes the incremental
-  cache JSON files using a more readable, but slower format.
-
-- ``show_none_errors`` (Boolean, default True) shows errors related
-  to strict ``None`` checking, if the global ``strict_optional`` flag
-  is enabled.
-
-- ``ignore_errors`` (Boolean, default False) ignores all non-fatal
-  errors.
-
-- ``warn_no_return`` (Boolean, default False) shows errors for
-  missing return statements on some execution paths.
-
-Example
-*******
-
-You might put this in your ``mypy.ini`` file at the root of your repo:
-
-.. code-block:: text
-
-    [mypy]
-    python_version = 2.7
-    [mypy-foo.*]
-    disallow_untyped_defs = True
-
-This automatically sets ``--python-version 2.7`` (a.k.a. ``--py2``)
-for all mypy runs in this tree, and also selectively turns on the
-``--disallow-untyped-defs`` flag for all modules in the ``foo``
-package.  This issues an error for function definitions without
-type annotations in that subdirectory only.
-
-.. note::
-
-   Configuration flags are liable to change between releases.
diff --git a/docs/source/duck_type_compatibility.rst b/docs/source/duck_type_compatibility.rst
deleted file mode 100644
index a128b69..0000000
--- a/docs/source/duck_type_compatibility.rst
+++ /dev/null
@@ -1,40 +0,0 @@
-Duck type compatibility
------------------------
-
-In Python, certain types are compatible even though they aren't subclasses of
-each other. For example, ``int`` objects are valid whenever ``float`` objects
-are expected. Mypy supports this idiom via *duck type compatibility*. As of
-now, this is only supported for a small set of built-in types:
-
-* ``int`` is duck type compatible with ``float`` and ``complex``.
-* ``float`` is duck type compatible with ``complex``.
-* In Python 2, ``str`` is duck type compatible with ``unicode``.
-
-.. note::
-
-   Mypy support for Python 2 is still work in progress.
-
-For example, mypy considers an ``int`` object to be valid whenever a
-``float`` object is expected.  Thus code like this is nice and clean
-and also behaves as expected:
-
-.. code-block:: python
-
-   def degrees_to_radians(x: float) -> float:
-       return math.pi * degrees / 180
-
-   n = 90  # Inferred type 'int'
-   print(degrees_to_radians(n))   # Okay!
-
-.. note::
-
-   Note that in Python 2 a ``str`` object with non-ASCII characters is
-   often *not valid* when a unicode string is expected. The mypy type
-   system does not consider a string with non-ASCII values as a
-   separate type so some programs with this kind of error will
-   silently pass type checking. In Python 3 ``str`` and ``bytes`` are
-   separate, unrelated types and this kind of error is easy to
-   detect. This a good reason for preferring Python 3 over Python 2!
-
-   See :ref:`text-and-anystr` for details on how to enforce that a
-   value must be a unicode string in a cross-compatible way.
diff --git a/docs/source/dynamic_typing.rst b/docs/source/dynamic_typing.rst
deleted file mode 100644
index ba76442..0000000
--- a/docs/source/dynamic_typing.rst
+++ /dev/null
@@ -1,86 +0,0 @@
-.. _dynamic_typing:
-
-
-Dynamically typed code
-======================
-
-As mentioned earlier, bodies of functions that don't have have any
-explicit types in their function annotation are dynamically typed
-(operations are checked at runtime). Code outside functions is
-statically typed by default, and types of variables are inferred. This
-does usually the right thing, but you can also make any variable
-dynamically typed by defining it explicitly with the type ``Any``:
-
-.. code-block:: python
-
-   from typing import Any
-
-   s = 1                 # Statically typed (type int)
-   d = 1  # type: Any    # Dynamically typed (type Any)
-   s = 'x'               # Type check error
-   d = 'x'               # OK
-
-Operations on Any values
-------------------------
-
-You can do anything using a value with type ``Any``, and type checker
-does not complain:
-
-.. code-block:: python
-
-    def f(x: Any) -> int:
-        # All of these are valid!
-        x.foobar(1, y=2)
-        print(x[3] + 'f')
-        if x:
-            x.z = x(2)
-        open(x).read()
-        return x
-
-Values derived from an ``Any`` value also often have the type ``Any``
-implicitly, as mypy can't infer a more precise result type. For
-example, if you get the attribute of an ``Any`` value or call a
-``Any`` value the result is ``Any``:
-
-.. code-block:: python
-
-    def f(x: Any) -> None:
-        y = x.foo()  # y has type Any
-        y.bar()      # Okay as well!
-
-``Any`` types may propagate through your program, making type checking
-less effective, unless you are careful.
-
-Any vs. object
---------------
-
-The type ``object`` is another type that can have an instance of arbitrary
-type as a value. Unlike ``Any``, ``object`` is an ordinary static type (it
-is similar to ``Object`` in Java), and only operations valid for *all*
-types are accepted for ``object`` values. These are all valid:
-
-.. code-block:: python
-
-    def f(o: object) -> None:
-        if o:
-            print(o)
-        print(isinstance(o, int))
-        o = 2
-        o = 'foo'
-
-These are, however, flagged as errors, since not all objects support these
-operations:
-
-.. code-block:: python
-
-    def f(o: object) -> None:
-        o.foo()       # Error!
-        o + 2         # Error!
-        open(o)       # Error!
-        n = 1  # type: int
-        n = o         # Error!
-
-You can use ``cast()`` (see chapter :ref:`casts`) or ``isinstance`` to
-go from a general type such as ``object`` to a more specific
-type (subtype) such as ``int``.  ``cast()`` is not needed with
-dynamically typed values (values with type ``Any``).
diff --git a/docs/source/faq.rst b/docs/source/faq.rst
deleted file mode 100644
index 9fd73b4..0000000
--- a/docs/source/faq.rst
+++ /dev/null
@@ -1,270 +0,0 @@
-Frequently Asked Questions
-==========================
-
-Why have both dynamic and static typing?
-****************************************
-
-Dynamic typing can be flexible, powerful, convenient and easy. But
-it's not always the best approach; there are good reasons why many
-developers choose to use statically typed languages.
-
-Here are some potential benefits of mypy-style static typing:
-
-- Static typing can make programs easier to understand and
-  maintain. Type declarations can serve as machine-checked
-  documentation. This is important as code is typically read much more
-  often than modified, and this is especially important for large and
-  complex programs.
-
-- Static typing can help you find bugs earlier and with less testing
-  and debugging. Especially in large and complex projects this can be
-  a major time-saver.
-
-- Static typing can help you find difficult-to-find bugs before your
-  code goes into production. This can improve reliability and reduce
-  the number of security issues.
-
-- Static typing makes it practical to build very useful development
-  tools that can improve programming productivity or software quality,
-  including IDEs with precise and reliable code completion, static
-  analysis tools, etc.
-
-- You can get the benefits of both dynamic and static typing in a
-  single language. Dynamic typing can be perfect for a small project
-  or for writing the UI of your program, for example. As your program
-  grows, you can adapt tricky application logic to static typing to
-  help maintenance.
-
-See also the `front page <http://www.mypy-lang.org>`_ of the mypy web
-site.
-
-Would my project benefit from static typing?
-********************************************
-
-For many projects dynamic typing is perfectly fine (we think that
-Python is a great language). But sometimes your projects demand bigger
-guns, and that's when mypy may come in handy.
-
-If some of these ring true for your projects, mypy (and static typing)
-may be useful:
-
-- Your project is large or complex.
-
-- Your codebase must be maintained for a long time.
-
-- Multiple developers are working on the same code.
-
-- Running tests takes a lot of time or work (type checking may help
-  you find errors early in development, reducing the number of testing
-  iterations).
-
-- Some project members (devs or management) don't like dynamic typing,
-  but others prefer dynamic typing and Python syntax. Mypy could be a
-  solution that everybody finds easy to accept.
-
-- You want to future-proof your project even if currently none of the
-  above really apply.
-
-Can I use mypy to type check my existing Python code?
-*****************************************************
-
-It depends. Compatibility is pretty good, but some Python features are
-not yet implemented or fully supported. The ultimate goal is to make
-using mypy practical for most Python code. Code that uses complex
-introspection or metaprogramming may be impractical to type check, but
-it should still be possible to use static typing in other parts of a
-program.
-
-Will static typing make my programs run faster?
-***********************************************
-
-Mypy only does static type checking and it does not improve
-performance. It has a minimal performance impact. In the future, there
-could be other tools that can compile statically typed mypy code to C
-modules or to efficient JVM bytecode, for example, but this is outside
-the scope of the mypy project. It may also be possible to modify
-existing Python VMs to take advantage of static type information, but
-whether this is feasible is still unknown. This is nontrivial since
-the runtime types do not necessarily correspond to the static types.
-
-How do I type check my Python 2 code?
-*************************************
-
-You can use a `comment-based function annotation syntax
-<https://www.python.org/dev/peps/pep-0484/#suggested-syntax-for-python-2-7-and-straddling-code>`_
-and use the ``--py2`` command-line option to type check your Python 2 code.
-You'll also need to install ``typing`` for Python 2 via ``pip install typing``.
-
-Is mypy free?
-*************
-
-Yes. Mypy is free software, and it can also be used for commercial and
-proprietary projects. Mypy is available under the MIT license.
-
-Why not use structural subtyping?
-*********************************
-
-Mypy primarily uses `nominal subtyping
-<https://en.wikipedia.org/wiki/Nominative_type_system>`_ instead of
-`structural subtyping
-<https://en.wikipedia.org/wiki/Structural_type_system>`_. Some argue
-that structural subtyping is better suited for languages with duck
-typing such as Python.
-
-Here are some reasons why mypy uses nominal subtyping:
-
-1. It is easy to generate short and informative error messages when
-   using a nominal type system. This is especially important when
-   using type inference.
-
-2. Python supports basically nominal isinstance tests and they are
-   widely used in programs. It is not clear how to support isinstance
-   in a purely structural type system while remaining compatible with
-   Python idioms.
-
-3. Many programmers are already familiar with nominal subtyping and it
-   has been successfully used in languages such as Java, C++ and
-   C#. Only few languages use structural subtyping.
-
-However, structural subtyping can also be useful. Structural subtyping
-is a likely feature to be added to mypy in the future, even though we
-expect that most mypy programs will still primarily use nominal
-subtyping.
-
-I like Python and I have no need for static typing
-**************************************************
-
-That wasn't really a question, was it? Mypy is not aimed at replacing
-Python. The goal is to give more options for Python programmers, to
-make Python a more competitive alternative to other statically typed
-languages in large projects, to improve programmer productivity and to
-improve software quality.
-
-How are mypy programs different from normal Python?
-***************************************************
-
-Since you use a vanilla Python implementation to run mypy programs,
-mypy programs are also Python programs. The type checker may give
-warnings for some valid Python code, but the code is still always
-runnable. Also, some Python features and syntax are still not
-supported by mypy, but this is gradually improving.
-
-The obvious difference is the availability of static type
-checking. The section :ref:`common_issues` mentions some
-modifications to Python code that may be required to make code type
-check without errors. Also, your code must make attributes explicit and
-use a explicit protocol representation. For example, you may want to
-subclass an Abstract Base Class such as ``typing.Iterable``.
-
-Mypy will support modular, efficient type checking, and this seems to
-rule out type checking some language features, such as arbitrary
-runtime addition of methods. However, it is likely that many of these
-features will be supported in a restricted form (for example, runtime
-modification is only supported for classes or methods registered as
-dynamic or 'patchable').
-
-How is mypy different from PyPy?
-********************************
-
-*This answer relates to PyPy as a Python implementation. See also the answer related to RPython below.*
-
-Mypy and PyPy are orthogonal. Mypy does static type checking, i.e. it
-is basically a linter, but static typing has no runtime effect,
-whereas the PyPy is an Python implementation. You can use PyPy to run
-mypy programs.
-
-How is mypy different from Cython?
-**********************************
-
-`Cython <http://cython.org/>`_ is a variant of Python that supports
-compilation to CPython C modules. It can give major speedups to
-certain classes of programs compared to CPython, and it provides
-static typing (though this is different from mypy). Mypy differs in
-the following aspects, among others:
-
-- Cython is much more focused on performance than mypy. Mypy is only
-  about static type checking, and increasing performance is not a
-  direct goal.
-
-- The mypy syntax is arguably simpler and more "Pythonic" (no cdef/cpdef, etc.) for statically typed code.
-
-- The mypy syntax is compatible with Python. Mypy programs are normal
-  Python programs that can be run using any Python
-  implementation. Cython has many incompatible extensions to Python
-  syntax, and Cython programs generally cannot be run without first
-  compiling them to CPython extension modules via C. Cython also has a
-  pure Python mode, but it seems to support only a subset of Cython
-  functionality, and the syntax is quite verbose.
-
-- Mypy has a different set of type system features. For example, mypy
-  has genericity (parametric polymorphism), function types and
-  bidirectional type inference, which are not supported by
-  Cython. (Cython has fused types that are different but related to
-  mypy generics. Mypy also has a similar feature as an extension of
-  generics.)
-
-- The mypy type checker knows about the static types of many Python
-  stdlib modules and can effectively type check code that uses them.
-
-- Cython supports accessing C functions directly and many features are
-  defined in terms of translating them to C or C++. Mypy just uses
-  Python semantics, and mypy does not deal with accessing C library
-  functionality.
-
-How is mypy different from Nuitka?
-**********************************
-
-`Nuitka <http://nuitka.net/>`_ is a static compiler that can translate
-Python programs to C++. Nuitka integrates with the CPython
-runtime. Nuitka has additional future goals, such as using type
-inference and whole-program analysis to further speed up code. Here
-are some differences:
-
-- Nuitka is primarily focused on speeding up Python code. Mypy focuses
-  on static type checking and facilitating better tools.
-
-- Whole-program analysis tends to be slow and scale poorly to large or
-  complex programs. It is still unclear if Nuitka can solve these
-  issues. Mypy does not use whole-program analysis and will support
-  modular type checking (though this has not been implemented yet).
-
-How is mypy different from RPython or Shed Skin?
-************************************************
-
-`RPython <http://doc.pypy.org/en/latest/coding-guide.html>`_ and `Shed
-Skin <http://shed-skin.blogspot.co.uk/>`_ are basically statically
-typed subsets of Python. Mypy does the following important things
-differently:
-
-- RPython is primarily designed for implementing virtual machines;
-  mypy is a general-purpose tool.
-
-- Mypy supports both static and dynamic typing. Dynamically typed and
-  statically typed code can be freely mixed and can interact
-  seamlessly.
-
-- Mypy aims to support (in the future) fast and modular type
-  checking. Both RPython and Shed Skin use whole-program type
-  inference which is very slow, does not scale well to large programs
-  and often produces confusing error messages. Mypy can support
-  modularity since it only uses local type inference; static type
-  checking depends on having type annotations for functions
-  signatures.
-
-- Mypy will support introspection, dynamic loading of code and many
-  other dynamic language features (though using these may make static
-  typing less effective). RPython and Shed Skin only support a
-  restricted Python subset without several of these features.
-
-- Mypy supports user-defined generic types.
-
-Mypy is a cool project. Can I help?
-***********************************
-
-Any help is much appreciated! `Contact
-<http://www.mypy-lang.org/contact.html>`_ the developers if you would
-like to contribute. Any help related to development, design,
-publicity, documentation, testing, web site maintenance, financing,
-etc. can be helpful. You can learn a lot by contributing, and anybody
-can help, even beginners! However, some knowledge of compilers and/or
-type systems is essential if you want to work on mypy internals.
diff --git a/docs/source/function_overloading.rst b/docs/source/function_overloading.rst
deleted file mode 100644
index b55cddd..0000000
--- a/docs/source/function_overloading.rst
+++ /dev/null
@@ -1,60 +0,0 @@
-Function overloading in stubs
-=============================
-
-Sometimes you have a library function that seems to call for two or
-more signatures.  That's okay -- you can define multiple *overloaded*
-instances of a function with the same name but different signatures in
-a stub file (this feature is not supported for user code, at least not
-yet) using the ``@overload`` decorator. For example, we can define an
-``abs`` function that works for both ``int`` and ``float`` arguments:
-
-.. code-block:: python
-
-   # This is a stub file!
-
-   from typing import overload
-
-   @overload
-   def abs(n: int) -> int: pass
-
-   @overload
-   def abs(n: float) -> float: pass
-
-Note that we can't use ``Union[int, float]`` as the argument type,
-since this wouldn't allow us to express that the return
-type depends on the argument type.
-
-Now if we import ``abs`` as defined in the above library stub, we can
-write code like this, and the types are inferred correctly:
-
-.. code-block:: python
-
-   n = abs(-2)     # 2 (int)
-   f = abs(-1.5)   # 1.5 (float)
-
-Overloaded function variants are still ordinary Python functions and
-they still define a single runtime object. The following code is
-thus valid:
-
-.. code-block:: python
-
-   my_abs = abs
-   my_abs(-2)      # 2 (int)
-   my_abs(-1.5)    # 1.5 (float)
-
-The overload variants must be adjacent in the code. This makes code
-clearer, as you don't have to hunt for overload variants across the
-file.
-
-.. note::
-
-   As generic type variables are erased at runtime when constructing
-   instances of generic types, an overloaded function cannot have
-   variants that only differ in a generic type argument,
-   e.g. ``List[int]`` versus ``List[str]``.
-
-.. note::
-
-   If you are writing a regular module rather than a stub, you can
-   often use a type variable with a value restriction to represent
-   functions as ``abs`` above (see :ref:`type-variable-value-restriction`).
diff --git a/docs/source/generics.rst b/docs/source/generics.rst
deleted file mode 100644
index f6c0640..0000000
--- a/docs/source/generics.rst
+++ /dev/null
@@ -1,390 +0,0 @@
-Generics
-========
-
-Defining generic classes
-************************
-
-The built-in collection classes are generic classes. Generic types
-have one or more type parameters, which can be arbitrary types. For
-example, ``Dict[int, str]`` has the type parameters ``int`` and
-``str``, and ``List[int]`` has a type parameter ``int``.
-
-Programs can also define new generic classes. Here is a very simple
-generic class that represents a stack:
-
-.. code-block:: python
-
-   from typing import TypeVar, Generic
-
-   T = TypeVar('T')
-
-   class Stack(Generic[T]):
-       def __init__(self) -> None:
-           # Create an empty list with items of type T
-           self.items = []  # type: List[T]
-
-       def push(self, item: T) -> None:
-           self.items.append(item)
-
-       def pop(self) -> T:
-           return self.items.pop()
-
-       def empty(self) -> bool:
-           return not self.items
-
-The ``Stack`` class can be used to represent a stack of any type:
-``Stack[int]``, ``Stack[Tuple[int, str]]``, etc.
-
-Using ``Stack`` is similar to built-in container types:
-
-.. code-block:: python
-
-   # Construct an empty Stack[int] instance
-   stack = Stack[int]()
-   stack.push(2)
-   stack.pop()
-   stack.push('x')        # Type error
-
-Type inference works for user-defined generic types as well:
-
-.. code-block:: python
-
-   def process(stack: Stack[int]) -> None: ...
-
-   process(Stack())   # Argument has inferred type Stack[int]
-
-Construction of instances of generic types is also type checked:
-
-.. code-block:: python
-
-   class Box(Generic[T]):
-       def __init__(self, content: T) -> None:
-           self.content = content
-
-   Box(1)  # OK, inferred type is Box[int]
-   Box[int](1)  # Also OK
-   s = 'some string'
-   Box[int](s)  # Type error
-
-Generic class internals
-***********************
-
-You may wonder what happens at runtime when you index
-``Stack``. Actually, indexing ``Stack`` returns essentially a copy
-of ``Stack`` that returns instances of the original class on
-instantiation:
-
->>> print(Stack)
-__main__.Stack
->>> print(Stack[int])
-__main__.Stack[int]
->>> print(Stack[int]().__class__)
-__main__.Stack
-
-Note that built-in types ``list``, ``dict`` and so on do not support
-indexing in Python. This is why we have the aliases ``List``, ``Dict``
-and so on in the ``typing`` module. Indexing these aliases gives
-you a class that directly inherits from the target class in Python:
-
->>> from typing import List
->>> List[int]
-typing.List[int]
->>> List[int].__bases__
-(<class 'list'>, typing.MutableSequence)
-
-Generic types could be instantiated or subclassed as usual classes,
-but the above examples illustrate that type variables are erased at
-runtime. Generic ``Stack`` instances are just ordinary
-Python objects, and they have no extra runtime overhead or magic due
-to being generic, other than a metaclass that overloads the indexing
-operator.
-
-.. _generic-functions:
-
-Generic functions
-*****************
-
-Generic type variables can also be used to define generic functions:
-
-.. code-block:: python
-
-   from typing import TypeVar, Sequence
-
-   T = TypeVar('T')      # Declare type variable
-
-   def first(seq: Sequence[T]) -> T:   # Generic function
-       return seq[0]
-
-As with generic classes, the type variable can be replaced with any
-type. That means ``first`` can be used with any sequence type, and the
-return type is derived from the sequence item type. For example:
-
-.. code-block:: python
-
-   # Assume first defined as above.
-
-   s = first('foo')      # s has type str.
-   n = first([1, 2, 3])  # n has type int.
-
-Note also that a single definition of a type variable (such as ``T``
-above) can be used in multiple generic functions or classes. In this
-example we use the same type variable in two generic functions:
-
-.. code-block:: python
-
-   from typing import TypeVar, Sequence
-
-   T = TypeVar('T')      # Declare type variable
-
-   def first(seq: Sequence[T]) -> T:
-       return seq[0]
-
-   def last(seq: Sequence[T]) -> T:
-       return seq[-1]
-
-.. _generic-methods-and-generic-self:
-
-Generic methods and generic self
-********************************
-
-You can also define generic methods — just use a type variable in the
-method signature that is different from class type variables. In particular,
-``self`` may also be generic, allowing a method to return the most precise
-type known at the point of access.
-
-.. note::
-
-   This feature is experimental. Checking code with type annotations for self
-   arguments is still not fully implemented. Mypy may disallow valid code or
-   allow unsafe code.
-
-In this way, for example, you can typecheck chaining of setter methods:
-
-.. code-block:: python
-
-   from typing import TypeVar
-
-   T = TypeVar('T', bound='Shape')
-
-   class Shape:
-       def set_scale(self: T, scale: float) -> T:
-           self.scale = scale
-           return self
-
-   class Circle(Shape):
-       def set_radius(self, r: float) -> 'Circle':
-           self.radius = r
-           return self
-
-   class Square(Shape):
-       def set_width(self, w: float) -> 'Square':
-           self.width = w
-           return self
-
-   circle = Circle().set_scale(0.5).set_radius(2.7)  # type: Circle
-   square = Square().set_scale(0.5).set_width(3.2)  # type: Square
-
-Without using generic ``self``, the last two lines could not be type-checked properly.
-
-Other uses are factory methods, such as copy and deserialization.
-For class methods, you can also define generic ``cls``, using ``Type[T]``:
-
-.. code-block:: python
-
-   from typing import TypeVar, Tuple, Type
-
-   T = TypeVar('T', bound='Friend')
-
-   class Friend:
-       other = None  # type: Friend
-
-       @classmethod
-       def make_pair(cls: Type[T]) -> Tuple[T, T]:
-           a, b = cls(), cls()
-           a.other = b
-           b.other = a
-           return a, b
-
-   class SuperFriend(Friend):
-       pass
-
-   a, b = SuperFriend.make_pair()
-
-Note that when overriding a method with generic ``self``, you must either
-return a generic ``self`` too, or return an instance of the current class.
-In the latter case, you must implement this method in all future subclasses.
-
-Note also that mypy cannot always verify that the implementation of a copy
-or a deserialization method returns the actual type of self. Therefore
-you may need to silence mypy inside these methods (but not at the call site),
-possibly by making use of the ``Any`` type.
-
-.. _type-variable-value-restriction:
-
-Type variables with value restriction
-*************************************
-
-By default, a type variable can be replaced with any type. However, sometimes
-it's useful to have a type variable that can only have some specific types
-as its value. A typical example is a type variable that can only have values
-``str`` and ``bytes``:
-
-.. code-block:: python
-
-   from typing import TypeVar
-
-   AnyStr = TypeVar('AnyStr', str, bytes)
-
-This is actually such a common type variable that ``AnyStr`` is
-defined in ``typing`` and we don't need to define it ourselves.
-
-We can use ``AnyStr`` to define a function that can concatenate
-two strings or bytes objects, but it can't be called with other
-argument types:
-
-.. code-block:: python
-
-   from typing import AnyStr
-
-   def concat(x: AnyStr, y: AnyStr) -> AnyStr:
-       return x + y
-
-   concat('a', 'b')    # Okay
-   concat(b'a', b'b')  # Okay
-   concat(1, 2)        # Error!
-
-Note that this is different from a union type, since combinations
-of ``str`` and ``bytes`` are not accepted:
-
-.. code-block:: python
-
-   concat('string', b'bytes')   # Error!
-
-In this case, this is exactly what we want, since it's not possible
-to concatenate a string and a bytes object! The type checker
-will reject this function:
-
-.. code-block:: python
-
-   def union_concat(x: Union[str, bytes], y: Union[str, bytes]) -> Union[str, bytes]:
-       return x + y  # Error: can't concatenate str and bytes
-
-Another interesting special case is calling ``concat()`` with a
-subtype of ``str``:
-
-.. code-block:: python
-
-    class S(str): pass
-
-    ss = concat(S('foo'), S('bar')))
-
-You may expect that the type of ``ss`` is ``S``, but the type is
-actually ``str``: a subtype gets promoted to one of the valid values
-for the type variable, which in this case is ``str``. This is thus
-subtly different from *bounded quantification* in languages such as
-Java, where the return type would be ``S``. The way mypy implements
-this is correct for ``concat``, since ``concat`` actually returns a
-``str`` instance in the above example:
-
-.. code-block:: python
-
-    >>> print(type(ss))
-    <class 'str'>
-
-You can also use a ``TypeVar`` with a restricted set of possible
-values when defining a generic class. For example, mypy uses the type
-``typing.Pattern[AnyStr]`` for the return value of ``re.compile``,
-since regular expressions can be based on a string or a bytes pattern.
-
-.. _type-variable-upper-bound:
-
-Type variables with upper bounds
-********************************
-
-A type variable can also be restricted to having values that are
-subtypes of a specific type. This type is called the upper bound of
-the type variable, and is specified with the ``bound=...`` keyword
-argument to ``TypeVar``.
-
-.. code-block:: python
-
-   from typing import TypeVar, SupportsAbs
-
-   T = TypeVar('T', bound=SupportsAbs[float])
-
-In the definition of a generic function that uses such a type variable
-``T``, the type represented by ``T`` is assumed to be a subtype of
-its upper bound, so the function can use methods of the upper bound on
-values of type ``T``.
-
-.. code-block:: python
-
-   def largest_in_absolute_value(*xs: T) -> T:
-       return max(xs, key=abs)  # Okay, because T is a subtype of SupportsAbs[float].
-
-In a call to such a function, the type ``T`` must be replaced by a
-type that is a subtype of its upper bound. Continuing the example
-above,
-
-.. code-block:: python
-
-   largest_in_absolute_value(-3.5, 2)   # Okay, has type float.
-   largest_in_absolute_value(5+6j, 7)   # Okay, has type complex.
-   largest_in_absolute_value('a', 'b')  # Error: 'str' is not a subtype of SupportsAbs[float].
-
-Type parameters of generic classes may also have upper bounds, which
-restrict the valid values for the type parameter in the same way.
-
-A type variable may not have both a value restriction (see
-:ref:`type-variable-value-restriction`) and an upper bound.
-
-.. _declaring-decorators:
-
-Declaring decorators
-********************
-
-One common application of type variable upper bounds is in declaring a
-decorator that preserves the signature of the function it decorates,
-regardless of that signature. Here's a complete example:
-
-.. code-block:: python
-
-   from typing import Any, Callable, TypeVar, Tuple, cast
-
-   FuncType = Callable[..., Any]
-   F = TypeVar('F', bound=FuncType)
-
-   # A decorator that preserves the signature.
-   def my_decorator(func: F) -> F:
-       def wrapper(*args, **kwds):
-           print("Calling", func)
-           return func(*args, **kwds)
-       return cast(F, wrapper)
-
-   # A decorated function.
-   @my_decorator
-   def foo(a: int) -> str:
-       return str(a)
-
-   # Another.
-   @my_decorator
-   def bar(x: float, y: float) -> Tuple[float, float, bool]:
-       return (x, y, x > y)
-
-   a = foo(12)
-   reveal_type(a)  # str
-   b = bar(3.14, 0)
-   reveal_type(b)  # Tuple[float, float, bool]
-   foo('x')    # Type check error: incompatible type "str"; expected "int"
-
-From the final block we see that the signatures of the decorated
-functions ``foo()`` and ``bar()`` are the same as those of the original
-functions (before the decorator is applied).
-
-The bound on ``F`` is used so that calling the decorator on a
-non-function (e.g. ``my_decorator(1)``) will be rejected.
-
-Also note that the ``wrapper()`` function is not type-checked. Wrapper
-functions are typically small enough that this is not a big
-problem. This is also the reason for the ``cast()`` call in the
-``return`` statement in ``my_decorator()``. See :ref:`casts`.
diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst
deleted file mode 100644
index a41c125..0000000
--- a/docs/source/getting_started.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-.. _getting-started:
-
-Getting started
-===============
-
-Installation
-************
-
-Mypy requires Python 3.3 or later.  Once you've `installed Python 3 <https://www.python.org/downloads/>`_, you can install mypy with:
-
-.. code-block:: text
-
-    $ python3 -m pip install mypy
-
-Installing from source
-**********************
-
-To install mypy from source, clone the github repository and then run pip install locally:
-
-.. code-block:: text
-
-    $ git clone https://github.com/python/mypy.git
-    $ cd mypy
-    $ sudo python3 -m pip install --upgrade .
diff --git a/docs/source/index.rst b/docs/source/index.rst
deleted file mode 100644
index 90cc749..0000000
--- a/docs/source/index.rst
+++ /dev/null
@@ -1,42 +0,0 @@
-.. Mypy documentation master file, created by
-   sphinx-quickstart on Sun Sep 14 19:50:35 2014.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
-Welcome to Mypy documentation!
-==============================
-
-Mypy is a static type checker for Python.
-
-.. toctree::
-   :maxdepth: 2
-
-   introduction
-   basics
-   getting_started
-   builtin_types
-   python2
-   type_inference_and_annotations
-   kinds_of_types
-   class_basics
-   dynamic_typing
-   function_overloading
-   casts
-   duck_type_compatibility
-   common_issues
-   generics
-   supported_python_features
-   additional_features
-   command_line
-   config_file
-   python36
-   faq
-   cheat_sheet
-   cheat_sheet_py3
-   revision_history
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`search`
diff --git a/docs/source/introduction.rst b/docs/source/introduction.rst
deleted file mode 100644
index 3bcd0ad..0000000
--- a/docs/source/introduction.rst
+++ /dev/null
@@ -1,30 +0,0 @@
-Introduction
-============
-
-Mypy is a static type checker for Python. If you sprinkle your code
-with type annotations, mypy can type check your code and find common bugs.
-As mypy is a static analyzer, or a lint-like tool, your code's type
-annotations are just hints and don't interfere when running your program.
-You run your program with a standard Python interpreter, and the annotations
-are treated primarily as comments.
-
-Using the Python 3 function annotation syntax (using the PEP 484 notation) or
-a comment-based annotation syntax for Python 2 code, you will be able to
-efficiently annotate your code and use mypy to check the code for common
-errors. Mypy has a powerful, easy-to-use, type system with modern features
-such as type inference, generics, function types, tuple types and
-union types.
-
-As a developer, you decide how to use mypy in your workflow. You can always
-escape to dynamic typing as mypy's approach to static typing doesn't restrict
-what you can do in your programs. Using mypy will make your programs easier to
-debug, maintain, and understand.
-
-This documentation provides a short introduction to mypy. It will help you
-get started writing statically typed code. Knowledge of Python and a
-statically typed object-oriented language, such as Java, are assumed.
-
-.. note::
-
-   Mypy is still experimental. There will be changes
-   that break backward compatibility.
diff --git a/docs/source/kinds_of_types.rst b/docs/source/kinds_of_types.rst
deleted file mode 100644
index dc639d9..0000000
--- a/docs/source/kinds_of_types.rst
+++ /dev/null
@@ -1,1002 +0,0 @@
-Kinds of types
-==============
-
-User-defined types
-******************
-
-Each class is also a type. Any instance of a subclass is also
-compatible with all superclasses. All values are compatible with the
-``object`` type (and also the ``Any`` type).
-
-.. code-block:: python
-
-   class A:
-       def f(self) -> int:        # Type of self inferred (A)
-           return 2
-
-   class B(A):
-       def f(self) -> int:
-            return 3
-       def g(self) -> int:
-           return 4
-
-   a = B() # type: A  # OK (explicit type for a; override type inference)
-   print(a.f())       # 3
-   a.g()              # Type check error: A has no method g
-
-The Any type
-************
-
-A value with the ``Any`` type is dynamically typed. Mypy doesn't know
-anything about the possible runtime types of such value. Any
-operations are permitted on the value, and the operations are checked
-at runtime, similar to normal Python code without type annotations.
-
-``Any`` is compatible with every other type, and vice versa. No
-implicit type check is inserted when assigning a value of type ``Any``
-to a variable with a more precise type:
-
-.. code-block:: python
-
-   a = None  # type: Any
-   s = ''    # type: str
-   a = 2     # OK
-   s = a     # OK
-
-Declared (and inferred) types are *erased* at runtime. They are
-basically treated as comments, and thus the above code does not
-generate a runtime error, even though ``s`` gets an ``int`` value when
-the program is run. Note that the declared type of ``s`` is actually
-``str``!
-
-If you do not define a function return value or argument types, these
-default to ``Any``:
-
-.. code-block:: python
-
-   def show_heading(s) -> None:
-       print('=== ' + s + ' ===')  # No static type checking, as s has type Any
-
-   show_heading(1)  # OK (runtime error only; mypy won't generate an error)
-
-You should give a statically typed function an explicit ``None``
-return type even if it doesn't return a value, as this lets mypy catch
-additional type errors:
-
-.. code-block:: python
-
-   def wait(t: float):  # Implicit Any return value
-       print('Waiting...')
-       time.sleep(t)
-
-   if wait(2) > 1:   # Mypy doesn't catch this error!
-       ...
-
-If we had used an explicit ``None`` return type, mypy would have caught
-the error:
-
-.. code-block:: python
-
-   def wait(t: float) -> None:
-       print('Waiting...')
-       time.sleep(t)
-
-   if wait(2) > 1:   # Error: can't compare None and int
-       ...
-
-The ``Any`` type is discussed in more detail in section :ref:`dynamic_typing`.
-
-.. note::
-
-  A function without any types in the signature is dynamically
-  typed. The body of a dynamically typed function is not checked
-  statically, and local variables have implicit ``Any`` types.
-  This makes it easier to migrate legacy Python code to mypy, as
-  mypy won't complain about dynamically typed functions.
-
-.. _tuple-types:
-
-Tuple types
-***********
-
-The type ``Tuple[T1, ..., Tn]`` represents a tuple with the item types ``T1``, ..., ``Tn``:
-
-.. code-block:: python
-
-   def f(t: Tuple[int, str]) -> None:
-       t = 1, 'foo'    # OK
-       t = 'foo', 1    # Type check error
-
-A tuple type of this kind has exactly a specific number of items (2 in
-the above example). Tuples can also be used as immutable,
-varying-length sequences. You can use the type ``Tuple[T, ...]`` (with
-a literal ``...`` -- it's part of the syntax) for this
-purpose. Example:
-
-.. code-block:: python
-
-    def print_squared(t: Tuple[int, ...]) -> None:
-        for n in t:
-            print(n, n ** 2)
-
-    print_squared(())           # OK
-    print_squared((1, 3, 5))    # OK
-    print_squared([1, 2])       # Error: only a tuple is valid
-
-.. note::
-
-   Usually it's a better idea to use ``Sequence[T]`` instead of ``Tuple[T, ...]``, as
-   ``Sequence`` is also compatible with lists and other non-tuple sequences.
-
-.. note::
-
-   ``Tuple[...]`` is not valid as a base class outside stub files. This is a
-   limitation of the ``typing`` module. One way to work around
-   this is to use a named tuple as a base class (see section :ref:`named-tuples`).
-
-.. _callable-types:
-
-Callable types (and lambdas)
-****************************
-
-You can pass around function objects and bound methods in statically
-typed code. The type of a function that accepts arguments ``A1``, ..., ``An``
-and returns ``Rt`` is ``Callable[[A1, ..., An], Rt]``. Example:
-
-.. code-block:: python
-
-   from typing import Callable
-
-   def twice(i: int, next: Callable[[int], int]) -> int:
-       return next(next(i))
-
-   def add(i: int) -> int:
-       return i + 1
-
-   print(twice(3, add))   # 5
-
-You can only have positional arguments, and only ones without default
-values, in callable types. These cover the vast majority of uses of
-callable types, but sometimes this isn't quite enough. Mypy recognizes
-a special form ``Callable[..., T]`` (with a literal ``...``) which can
-be used in less typical cases. It is compatible with arbitrary
-callable objects that return a type compatible with ``T``, independent
-of the number, types or kinds of arguments. Mypy lets you call such
-callable values with arbitrary arguments, without any checking -- in
-this respect they are treated similar to a ``(*args: Any, **kwargs:
-Any)`` function signature. Example:
-
-.. code-block:: python
-
-   from typing import Callable
-
-    def arbitrary_call(f: Callable[..., int]) -> int:
-        return f('x') + f(y=2)  # OK
-
-    arbitrary_call(ord)   # No static error, but fails at runtime
-    arbitrary_call(open)  # Error: does not return an int
-    arbitrary_call(1)     # Error: 'int' is not callable
-
-Lambdas are also supported. The lambda argument and return value types
-cannot be given explicitly; they are always inferred based on context
-using bidirectional type inference:
-
-.. code-block:: python
-
-   l = map(lambda x: x + 1, [1, 2, 3])   # Infer x as int and l as List[int]
-
-If you want to give the argument or return value types explicitly, use
-an ordinary, perhaps nested function definition.
-
-.. _union-types:
-
-Union types
-***********
-
-Python functions often accept values of two or more different
-types. You can use overloading to model this in statically typed code,
-but union types can make code like this easier to write.
-
-Use the ``Union[T1, ..., Tn]`` type constructor to construct a union
-type. For example, the type ``Union[int, str]`` is compatible with
-both integers and strings. You can use an ``isinstance()`` check to
-narrow down the type to a specific type:
-
-.. code-block:: python
-
-   from typing import Union
-
-   def f(x: Union[int, str]) -> None:
-       x + 1     # Error: str + int is not valid
-       if isinstance(x, int):
-           # Here type of x is int.
-           x + 1      # OK
-       else:
-           # Here type of x is str.
-           x + 'a'    # OK
-
-   f(1)    # OK
-   f('x')  # OK
-   f(1.1)  # Error
-
-.. _optional:
-
-The type of None and optional types
-***********************************
-
-Mypy treats the type of ``None`` as special. ``None`` is a valid value
-for every type, which resembles ``null`` in Java. Unlike Java, mypy
-doesn't treat primitives types
-specially: ``None`` is also valid for primitive types such as ``int``
-and ``float``.
-
-.. note::
-
-   See :ref:`strict_optional` for an experimental mode which allows
-   mypy to check ``None`` values precisely.
-
-When initializing a variable as ``None``, ``None`` is usually an
-empty place-holder value, and the actual value has a different type.
-This is why you need to annotate an attribute in a case like this:
-
-.. code-block:: python
-
-    class A:
-        def __init__(self) -> None:
-            self.count = None  # type: int
-
-Mypy will complain if you omit the type annotation, as it wouldn't be
-able to infer a non-trivial type for the ``count`` attribute
-otherwise.
-
-Mypy generally uses the first assignment to a variable to
-infer the type of the variable. However, if you assign both a ``None``
-value and a non-``None`` value in the same scope, mypy can often do
-the right thing:
-
-.. code-block:: python
-
-   def f(i: int) -> None:
-       n = None  # Inferred type int because of the assignment below
-       if i > 0:
-            n = i
-       ...
-
-Often it's useful to know whether a variable can be
-``None``. For example, this function accepts a ``None`` argument,
-but it's not obvious from its signature:
-
-.. code-block:: python
-
-    def greeting(name: str) -> str:
-        if name:
-            return 'Hello, {}'.format(name)
-        else:
-            return 'Hello, stranger'
-
-    print(greeting('Python'))  # Okay!
-    print(greeting(None))      # Also okay!
-
-Mypy lets you use ``Optional[t]`` to document that ``None`` is a
-valid argument type:
-
-.. code-block:: python
-
-    from typing import Optional
-
-    def greeting(name: Optional[str]) -> str:
-        if name:
-            return 'Hello, {}'.format(name)
-        else:
-            return 'Hello, stranger'
-
-Mypy treats this as semantically equivalent to the previous example,
-since ``None`` is implicitly valid for any type, but it's much more
-useful for a programmer who is reading the code. You can equivalently
-use ``Union[str, None]``, but ``Optional`` is shorter and more
-idiomatic.
-
-.. note::
-
-    ``None`` is also used as the return type for functions that don't
-    return a value, i.e. that implicitly return ``None``. Mypy doesn't
-    use ``NoneType`` for this, since it would
-    look awkward, even though that is the real name of the type of ``None``
-    (try ``type(None)`` in the interactive interpreter to see for yourself).
-
-.. _strict_optional:
-
-Experimental strict optional type and None checking
-***************************************************
-
-Currently, ``None`` is a valid value for each type, similar to
-``null`` or ``NULL`` in many languages. However, you can use the
-experimental ``--strict-optional`` command line option to tell mypy
-that types should not include ``None``
-by default. The ``Optional`` type modifier is then used to define
-a type variant that includes ``None``, such as ``Optional[int]``:
-
-.. code-block:: python
-
-   from typing import Optional
-
-   def f() -> Optional[int]:
-       return None  # OK
-
-   def g() -> int:
-       ...
-       return None  # Error: None not compatible with int
-
-Also, most operations will not be allowed on unguarded ``None``
-or ``Optional`` values:
-
-.. code-block:: python
-
-   def f(x: Optional[int]) -> int:
-       return x + 1  # Error: Cannot add None and int
-
-Instead, an explicit ``None`` check is required. Mypy has
-powerful type inference that lets you use regular Python
-idioms to guard against ``None`` values. For example, mypy
-recognizes ``is None`` checks:
-
-.. code-block:: python
-
-   def f(x: Optional[int]) -> int:
-       if x is None:
-           return 0
-       else:
-           # The inferred type of x is just int here.
-           return x + 1
-
-Mypy will infer the type of ``x`` to be ``int`` in the else block due to the
-check against ``None`` in the if condition.
-
-.. note::
-
-    ``--strict-optional`` is experimental and still has known issues.
-
-Class name forward references
-*****************************
-
-Python does not allow references to a class object before the class is
-defined. Thus this code does not work as expected:
-
-.. code-block:: python
-
-   def f(x: A) -> None:  # Error: Name A not defined
-       ....
-
-   class A:
-       ...
-
-In cases like these you can enter the type as a string literal — this
-is a *forward reference*:
-
-.. code-block:: python
-
-   def f(x: 'A') -> None:  # OK
-       ...
-
-   class A:
-       ...
-
-Of course, instead of using a string literal type, you could move the
-function definition after the class definition. This is not always
-desirable or even possible, though.
-
-Any type can be entered as a string literal, and you can combine
-string-literal types with non-string-literal types freely:
-
-.. code-block:: python
-
-   def f(a: List['A']) -> None: ...  # OK
-   def g(n: 'int') -> None: ...      # OK, though not useful
-
-   class A: pass
-
-String literal types are never needed in ``# type:`` comments.
-
-String literal types must be defined (or imported) later *in the same
-module*.  They cannot be used to leave cross-module references
-unresolved.  (For dealing with import cycles, see
-:ref:`import-cycles`.)
-
-.. _type-aliases:
-
-Type aliases
-************
-
-In certain situations, type names may end up being long and painful to type:
-
-.. code-block:: python
-
-   def f() -> Union[List[Dict[Tuple[int, str], Set[int]]], Tuple[str, List[str]]]:
-       ...
-
-When cases like this arise, you can define a type alias by simply
-assigning the type to a variable:
-
-.. code-block:: python
-
-   AliasType = Union[List[Dict[Tuple[int, str], Set[int]]], Tuple[str, List[str]]]
-
-   # Now we can use AliasType in place of the full name:
-
-   def f() -> AliasType:
-       ...
-
-Type aliases can be generic, in this case they could be used in two variants:
-Subscripted aliases are equivalent to original types with substituted type variables,
-number of type arguments must match the number of free type variables
-in generic type alias. Unsubscripted aliases are treated as original types with free
-variables replaced with ``Any``. Examples (following `PEP 484
-<https://www.python.org/dev/peps/pep-0484/#type-aliases>`_):
-
-.. code-block:: python
-
-    from typing import TypeVar, Iterable, Tuple, Union, Callable
-    S = TypeVar('S')
-    TInt = Tuple[int, S]
-    UInt = Union[S, int]
-    CBack = Callable[..., S]
-
-    def response(query: str) -> UInt[str]:  # Same as Union[str, int]
-        ...
-    def activate(cb: CBack[S]) -> S:        # Same as Callable[..., S]
-        ...
-    table_entry: TInt  # Same as Tuple[int, Any]
-
-    T = TypeVar('T', int, float, complex)
-    Vec = Iterable[Tuple[T, T]]
-
-    def inproduct(v: Vec[T]) -> T:
-        return sum(x*y for x, y in v)
-
-    def dilate(v: Vec[T], scale: T) -> Vec[T]:
-        return ((x * scale, y * scale) for x, y in v)
-
-    v1: Vec[int] = []      # Same as Iterable[Tuple[int, int]]
-    v2: Vec = []           # Same as Iterable[Tuple[Any, Any]]
-    v3: Vec[int, int] = [] # Error: Invalid alias, too many type arguments!
-
-Type aliases can be imported from modules like any names. Aliases can target another
-aliases (although building complex chains of aliases is not recommended, this
-impedes code readability, thus defeating the purpose of using aliases).
-Following previous examples:
-
-.. code-block:: python
-
-    from typing import TypeVar, Generic, Optional
-    from first_example import AliasType
-    from second_example import Vec
-
-    def fun() -> AliasType:
-        ...
-
-    T = TypeVar('T')
-    class NewVec(Generic[T], Vec[T]):
-        ...
-    for i, j in NewVec[int]():
-        ...
-
-    OIntVec = Optional[Vec[int]]
-
-.. note::
-
-    A type alias does not create a new type. It's just a shorthand notation for
-    another type -- it's equivalent to the target type. For generic type aliases
-    this means that variance of type variables used for alias definition does not
-    apply to aliases. A parameterized generic alias is treated simply as an original
-    type with the corresponding type variables substituted.
-
-.. _newtypes:
-
-NewTypes
-********
-
-(Freely after `PEP 484
-<https://www.python.org/dev/peps/pep-0484/#newtype-helper-function>`_.)
-
-There are also situations where a programmer might want to avoid logical errors by
-creating simple classes. For example:
-
-.. code-block:: python
-
-    class UserId(int):
-        pass
-
-    get_by_user_id(user_id: UserId):
-        ...
-
-However, this approach introduces some runtime overhead. To avoid this, the typing
-module provides a helper function ``NewType`` that creates simple unique types with
-almost zero runtime overhead. Mypy will treat the statement
-``Derived = NewType('Derived', Base)`` as being roughly equivalent to the following
-definition:
-
-.. code-block:: python
-
-    class Derived(Base):
-        def __init__(self, _x: Base) -> None:
-            ...
-
-However, at runtime, ``NewType('Derived', Base)`` will return a dummy function that
-simply returns its argument:
-
-.. code-block:: python
-
-    def Derived(_x):
-        return _x
-
-Mypy will require explicit casts from ``int`` where ``UserId`` is expected, while
-implicitly casting from ``UserId`` where ``int`` is expected. Examples:
-
-.. code-block:: python
-
-    from typing import NewType
-
-    UserId = NewType('UserId', int)
-
-    def name_by_id(user_id: UserId) -> str:
-        ...
-
-    UserId('user')          # Fails type check
-
-    name_by_id(42)          # Fails type check
-    name_by_id(UserId(42))  # OK
-
-    num = UserId(5) + 1     # type: int
-
-``NewType`` accepts exactly two arguments. The first argument must be a string literal
-containing the name of the new type and must equal the name of the variable to which the new
-type is assigned. The second argument must be a properly subclassable class, i.e.,
-not a type construct like ``Union``, etc.
-
-The function returned by ``NewType`` accepts only one argument; this is equivalent to
-supporting only one constructor accepting an instance of the base class (see above).
-Example:
-
-.. code-block:: python
-
-    from typing import NewType
-
-    class PacketId:
-        def __init__(self, major: int, minor: int) -> None:
-            self._major = major
-            self._minor = minor
-
-    TcpPacketId = NewType('TcpPacketId', PacketId)
-
-    packet = PacketId(100, 100)
-    tcp_packet = TcpPacketId(packet)  # OK
-
-    tcp_packet = TcpPacketId(127, 0)  # Fails in type checker and at runtime
-
-Both ``isinstance`` and ``issubclass``, as well as subclassing will fail for
-``NewType('Derived', Base)`` since function objects don't support these operations.
-
-.. note::
-
-    Note that unlike type aliases, ``NewType`` will create an entirely new and
-    unique type when used. The intended purpose of ``NewType`` is to help you
-    detect cases where you accidentally mixed together the old base type and the
-    new derived type.
-
-    For example, the following will successfully typecheck when using type
-    aliases:
-
-    .. code-block:: python
-
-        UserId = int
-
-        def name_by_id(user_id: UserId) -> str:
-            ...
-
-        name_by_id(3)  # ints and UserId are synonymous
-
-    But a similar example using ``NewType`` will not typecheck:
-
-    .. code-block:: python
-
-        from typing import NewType
-
-        UserId = NewType('UserId', int)
-
-        def name_by_id(user_id: UserId) -> str:
-            ...
-
-        name_by_id(3)  # int is not the same as UserId
-
-.. _named-tuples:
-
-Named tuples
-************
-
-Mypy recognizes named tuples and can type check code that defines or
-uses them.  In this example, we can detect code trying to access a
-missing attribute:
-
-.. code-block:: python
-
-    Point = namedtuple('Point', ['x', 'y'])
-    p = Point(x=1, y=2)
-    print(p.z)  # Error: Point has no attribute 'z'
-
-If you use ``namedtuple`` to define your named tuple, all the items
-are assumed to have ``Any`` types. That is, mypy doesn't know anything
-about item types. You can use ``typing.NamedTuple`` to also define
-item types:
-
-.. code-block:: python
-
-    from typing import NamedTuple
-
-    Point = NamedTuple('Point', [('x', int),
-                                 ('y', int)])
-    p = Point(x=1, y='x')  # Argument has incompatible type "str"; expected "int"
-
-Python 3.6 will have an alternative, class-based syntax for named tuples with types.
-Mypy supports it already:
-
-.. code-block:: python
-
-    from typing import NamedTuple
-
-    class Point(NamedTuple):
-        x: int
-        y: int
-
-    p = Point(x=1, y='x')  # Argument has incompatible type "str"; expected "int"
-
-.. note::
-
-   The Python 3.6 syntax requires the ``--fast-parser`` flag. You must also have the
-   `typed_ast <https://pypi.python.org/pypi/typed-ast>`_ package
-   installed and have at least version 0.6.1.  Use ``pip3 install -U typed_ast``.
-
-.. _type-of-class:
-
-The type of class objects
-*************************
-
-(Freely after `PEP 484
-<https://www.python.org/dev/peps/pep-0484/#the-type-of-class-objects>`_.)
-
-Sometimes you want to talk about class objects that inherit from a
-given class.  This can be spelled as ``Type[C]`` where ``C`` is a
-class.  In other words, when ``C`` is the name of a class, using ``C``
-to annotate an argument declares that the argument is an instance of
-``C`` (or of a subclass of ``C``), but using ``Type[C]`` as an
-argument annotation declares that the argument is a class object
-deriving from ``C`` (or ``C`` itself).
-
-For example, assume the following classes:
-
-.. code-block:: python
-
-   class User:
-       # Defines fields like name, email
-
-   class BasicUser(User):
-       def upgrade(self):
-           """Upgrade to Pro"""
-
-   class ProUser(User):
-       def pay(self):
-           """Pay bill"""
-
-Note that ``ProUser`` doesn't inherit from ``BasicUser``.
-
-Here's a function that creates an instance of one of these classes if
-you pass it the right class object:
-
-.. code-block:: python
-
-   def new_user(user_class):
-       user = user_class()
-       # (Here we could write the user object to a database)
-       return user
-
-How would we annotate this function?  Without ``Type[]`` the best we
-could do would be:
-
-.. code-block:: python
-
-   def new_user(user_class: type) -> User:
-       # Same  implementation as before
-
-This seems reasonable, except that in the following example, mypy
-doesn't see that the ``buyer`` variable has type ``ProUser``:
-
-.. code-block:: python
-
-   buyer = new_user(ProUser)
-   buyer.pay()  # Rejected, not a method on User
-
-However, using ``Type[]`` and a type variable with an upper bound (see
-:ref:`type-variable-upper-bound`) we can do better:
-
-.. code-block:: python
-
-   U = TypeVar('U', bound=User)
-
-   def new_user(user_class: Type[U]) -> U:
-       # Same  implementation as before
-
-Now mypy will infer the correct type of the result when we call
-``new_user()`` with a specific subclass of ``User``:
-
-.. code-block:: python
-
-   beginner = new_user(BasicUser)  # Inferred type is BasicUser
-   beginner.upgrade()  # OK
-
-.. note::
-
-   The value corresponding to ``Type[C]`` must be an actual class
-   object that's a subtype of ``C``.  Its constructor must be
-   compatible with the constructor of ``C``.  If ``C`` is a type
-   variable, its upper bound must be a class object.
-
-For more details about ``Type[]`` see `PEP 484
-<https://www.python.org/dev/peps/pep-0484/#the-type-of-class-objects>`_.
-
-.. _text-and-anystr:
-
-Text and AnyStr
-***************
-
-Sometimes you may want to write a function which will accept only unicode
-strings. This can be challenging to do in a codebase intended to run in
-both Python 2 and Python 3 since ``str`` means something different in both
-versions and ``unicode`` is not a keyword in Python 3.
-
-To help solve this issue, use ``typing.Text`` which is aliased to
-``unicode`` in Python 2 and to ``str`` in Python 3. This allows you to
-indicate that a function should accept only unicode strings in a
-cross-compatible way:
-
-.. code-block:: python
-
-   from typing import Text
-
-   def unicode_only(s: Text) -> Text:
-       return s + u'\u2713'
-
-In other cases, you may want to write a function that will work with any
-kind of string but will not let you mix two different string types. To do
-so use ``typing.AnyStr``:
-
-.. code-block:: python
-
-   from typing import AnyStr
-
-   def concat(x: AnyStr, y: AnyStr) -> AnyStr:
-       return x + y
-
-   concat('a', 'b')     # Okay
-   concat(b'a', b'b')   # Okay
-   concat('a', b'b')    # Error: cannot mix bytes and unicode
-
-For more details, see :ref:`type-variable-value-restriction`.
-
-.. note::
-
-   How ``bytes``, ``str``, and ``unicode`` are handled between Python 2 and
-   Python 3 may change in future versions of mypy.
-
-.. _generators:
-
-Generators
-**********
-
-A basic generator that only yields values can be annotated as having a return
-type of either ``Iterator[YieldType]`` or ``Iterable[YieldType]``. For example:
-
-.. code-block:: python
-
-   def squares(n: int) -> Iterator[int]:
-       for i in range(n):
-           yield i * i
-
-If you want your generator to accept values via the ``send`` method or return
-a value, you should use the
-``Generator[YieldType, SendType, ReturnType]`` generic type instead. For example:
-
-.. code-block:: python
-
-   def echo_round() -> Generator[int, float, str]:
-       sent = yield 0
-       while sent >= 0:
-           sent = yield round(sent)
-       return 'Done'
-
-Note that unlike many other generics in the typing module, the ``SendType`` of
-``Generator`` behaves contravariantly, not covariantly or invariantly.
-
-If you do not plan on recieving or returning values, then set the ``SendType``
-or ``ReturnType`` to ``None``, as appropriate. For example, we could have
-annotated the first example as the following:
-
-.. code-block:: python
-
-   def squares(n: int) -> Generator[int, None, None]:
-       for i in range(n):
-           yield i * i
-
-.. _async-and-await:
-
-Typing async/await
-******************
-
-.. note::
-
-   Currently, you must pass in the ``--fast-parser`` flag if you want to run
-   mypy against code containing the ``async/await`` keywords. The fast parser
-   will be enabled by default in a future version of mypy.
-
-   Note that mypy will understand coroutines created using the ``@asyncio.coroutine``
-   decorator both with and without the fast parser enabled.
-
-Mypy supports the ability to type coroutines that use the ``async/await``
-syntax introduced in Python 3.5. For more information regarding coroutines and
-this new syntax, see `PEP 492 <https://www.python.org/dev/peps/pep-0492/>`_.
-
-Functions defined using ``async def`` are typed just like normal functions.
-The return type annotation should be the same as the type of the value you
-expect to get back when ``await``-ing the coroutine.
-
-.. code-block:: python
-
-   import asyncio
-
-   async def format_string(tag: str, count: int) -> str:
-       return 'T-minus {} ({})'.format(count, tag)
-
-   async def countdown_1(tag: str, count: int) -> str:
-       while count > 0:
-           my_str = await format_string(tag, count)  # has type 'str'
-           print(my_str)
-           await asyncio.sleep(0.1)
-           count -= 1
-       return "Blastoff!"
-
-   loop = asyncio.get_event_loop()
-   loop.run_until_complete(countdown_1("Millennium Falcon", 5))
-   loop.close()
-
-The result of calling an ``async def`` function *without awaiting* will be a
-value of type ``Awaitable[T]``:
-
-.. code-block:: python
-
-   my_coroutine = countdown_1("Millennium Falcon", 5)
-   reveal_type(my_coroutine)  # has type 'Awaitable[str]'
-
-If you want to use coroutines in older versions of Python that do not support
-the ``async def`` syntax, you can instead use the ``@asyncio.coroutine``
-decorator to convert a generator into a coroutine.
-
-Note that we set the ``YieldType`` of the generator to be ``Any`` in the
-following example. This is because the exact yield type is an implementation
-detail of the coroutine runner (e.g. the ``asyncio`` event loop) and your
-coroutine shouldn't have to know or care about what precisely that type is.
-
-.. code-block:: python
-
-   from typing import Any, Generator
-   import asyncio
-
-   @asyncio.coroutine
-   def countdown_2(tag: str, count: int) -> Generator[Any, None, str]:
-       while count > 0:
-           print('T-minus {} ({})'.format(count, tag))
-           yield from asyncio.sleep(0.1)
-           count -= 1
-      return "Blastoff!"
-
-   loop = asyncio.get_event_loop()
-   loop.run_until_complete(countdown_2("USS Enterprise", 5))
-   loop.close()
-
-As before, the result of calling a generator decorated with ``@asyncio.coroutine``
-will be a value of type ``Awaitable[T]``.
-
-.. note::
-
-   At runtime, you are allowed to add the ``@asyncio.coroutine`` decorator to
-   both functions and generators. This is useful when you want to mark a
-   work-in-progress function as a coroutine, but have not yet added ``yield`` or
-   ``yield from`` statements:
-
-   .. code-block:: python
-
-      import asyncio
-
-      @asyncio.coroutine
-      def serialize(obj: object) -> str:
-          # todo: add yield/yield from to turn this into a generator
-          return "placeholder"
-
-   However, mypy currently does not support converting functions into
-   coroutines. Support for this feature will be added in a future version, but
-   for now, you can manually force the function to be a generator by doing
-   something like this:
-
-   .. code-block:: python
-
-      from typing import Generator
-      import asyncio
-
-      @asyncio.coroutine
-      def serialize(obj: object) -> Generator[None, None, str]:
-          # todo: add yield/yield from to turn this into a generator
-          if False:
-              yield
-          return "placeholder"
-
-You may also choose to create a subclass of ``Awaitable`` instead:
-
-.. code-block:: python
-
-   from typing import Any, Awaitable, Generator
-   import asyncio
-
-   class MyAwaitable(Awaitable[str]):
-       def __init__(self, tag: str, count: int) -> None:
-           self.tag = tag
-           self.count = count
-
-       def __await__(self) -> Generator[Any, None, str]:
-           for i in range(n, 0, -1):
-               print('T-minus {} ({})'.format(i, tag))
-               yield from asyncio.sleep(0.1)
-           return "Blastoff!"
-
-   def countdown_3(tag: str, count: int) -> Awaitable[str]:
-       return MyAwaitable(tag, count)
-
-   loop = asyncio.get_event_loop()
-   loop.run_until_complete(countdown_3("Heart of Gold", 5))
-   loop.close()
-
-To create an iterable coroutine, subclass ``AsyncIterator``:
-
-.. code-block:: python
-
-   from typing import Optional, AsyncIterator
-   import asyncio
-
-   class arange(AsyncIterator[int]):
-       def __init__(self, start: int, stop: int, step: int) -> None:
-           self.start = start
-           self.stop = stop
-           self.step = step
-           self.count = start - step
-
-       def __aiter__(self) -> AsyncIterator[int]:
-           return self
-
-       async def __anext__(self) -> int:
-           self.count += self.step
-           if self.count == self.stop:
-               raise StopAsyncIteration
-           else:
-               return self.count
-
-   async def countdown_4(tag: str, n: int) -> str:
-       async for i in arange(n, 0, -1):
-           print('T-minus {} ({})'.format(i, tag))
-           await asyncio.sleep(0.1)
-       return "Blastoff!"
-
-   loop = asyncio.get_event_loop()
-   loop.run_until_complete(countdown_4("Serenity", 5))
-   loop.close()
-
-For a more concrete example, the mypy repo has a toy webcrawler that
-demonstrates how to work with coroutines. One version
-`uses async/await <https://github.com/python/mypy/blob/master/test-data/samples/crawl2.py>`_
-and one
-`uses yield from <https://github.com/python/mypy/blob/master/test-data/samples/crawl.py>`_.
diff --git a/docs/source/python2.rst b/docs/source/python2.rst
deleted file mode 100644
index 2cb8f32..0000000
--- a/docs/source/python2.rst
+++ /dev/null
@@ -1,136 +0,0 @@
-.. _python2:
-
-Type checking Python 2 code
-===========================
-
-For code that needs to be Python 2.7 compatible, function type
-annotations are given in comments, since the function annotation
-syntax was introduced in Python 3. The comment-based syntax is
-specified in `PEP 484 <https://www.python.org/dev/peps/pep-0484>`_.
-
-Run mypy in Python 2 mode by using the ``--py2`` option::
-
-    $ mypy --py2 program.py
-
-To run your program, you must have the ``typing`` module in your
-Python 2 module search path. Use ``pip install typing`` to install the
-module. This also works for Python 3 versions prior to 3.5 that don't
-include ``typing`` in the standard library.
-
-The example below illustrates the Python 2 function type annotation
-syntax. This syntax is also valid in Python 3 mode:
-
-.. code-block:: python
-
-    from typing import List
-
-    def hello(): # type: () -> None
-        print 'hello'
-
-    class Example:
-        def method(self, lst, opt=0, *args, **kwargs):
-            # type: (List[str], int, *str, **bool) -> int
-            """Docstring comes after type comment."""
-            ...
-
-It's worth going through these details carefully to avoid surprises:
-
-- You don't provide an annotation for the ``self`` / ``cls`` variable of
-  methods.
-
-- Docstring always comes *after* the type comment.
-
-- For ``*args`` and ``**kwargs`` the type should be prefixed with
-  ``*`` or ``**``, respectively (except when using the multi-line
-  annotation syntax described below). Again, the above example
-  illustrates this.
-
-- Things like ``Any`` must be imported from ``typing``, even if they
-  are only used in comments.
-
-- In Python 2 mode ``str`` is implicitly promoted to ``unicode``, similar
-  to how ``int`` is compatible with ``float``. This is unlike ``bytes`` and
-  ``str`` in Python 3, which are incompatible. ``bytes`` in Python 2 is
-  equivalent to ``str``. (This might change in the future.)
-
-.. _multi_line_annotation:
-
-Multi-line Python 2 function annotations
-----------------------------------------
-
-Mypy also supports a multi-line comment annotation syntax. You
-can provide a separate annotation for each argument using the variable
-annotation syntax. When using the single-line annotation syntax
-described above, functions with long argument lists tend to result in
-overly long type comments and it's often tricky to see which argument
-type corresponds to which argument. The alternative, multi-line
-annotation syntax makes long annotations easier to read and write.
-
-.. note::
-
-    Multi-line comment annotations currently only work when using the
-    ``--fast-parser`` command line option.  This is not enabled by
-    default because the option isn’t supported on Windows yet.
-
-Here is an example (from PEP 484):
-
-.. code-block:: python
-
-    def send_email(address,     # type: Union[str, List[str]]
-                   sender,      # type: str
-                   cc,          # type: Optional[List[str]]
-                   bcc,         # type: Optional[List[str]]
-                   subject='',
-                   body=None    # type: List[str]
-                   ):
-        # type: (...) -> bool
-        """Send an email message.  Return True if successful."""
-        <code>
-
-You write a separate annotation for each function argument on the same
-line as the argument. Each annotation must be on a separate line. If
-you leave out an annotation for an argument, it defaults to
-``Any``. You provide a return type annotation in the body of the
-function using the form ``# type: (...) -> rt``, where ``rt`` is the
-return type. Note that the  return type annotation contains literal
-three dots.
-
-Note that when using multi-line comments, you do not need to prefix the
-types of your ``*arg`` and ``**kwarg`` parameters with ``*`` or ``**``.
-For example, here is how you would annotate the first example using
-multi-line comments.
-
-.. code-block:: python
-
-    from typing import List
-
-    class Example:
-        def method(self,
-                   lst,      # type: List[str]
-                   opt=0,    # type: int
-                   *args,    # type: str
-                   **kwargs  # type: bool
-                   ):
-            # type: (...) -> int
-            """Docstring comes after type comment."""
-            ...
-
-
-Additional notes
-----------------
-
-- You should include types for arguments with default values in the
-  annotation. The ``opt`` argument of ``method`` in the example at the
-  beginning of this section is an example of this.
-
-- The annotation can be on the same line as the function header or on
-  the following line.
-
-- The type syntax for variables is the same as for Python 3.
-
-- You don't need to use string literal escapes for forward references
-  within comments.
-
-- Mypy uses a separate set of library stub files in `typeshed
-  <https://github.com/python/typeshed>`_ for Python 2. Library support
-  may vary between Python 2 and Python 3.
diff --git a/docs/source/python36.rst b/docs/source/python36.rst
deleted file mode 100644
index f676864..0000000
--- a/docs/source/python36.rst
+++ /dev/null
@@ -1,100 +0,0 @@
-.. _python-36:
-
-New features in Python 3.6
-==========================
-
-Python 3.6 will be `released
-<https://www.python.org/dev/peps/pep-0494>`_ in December 2016.  The
-`first beta <https://www.python.org/downloads/release/python-360b1/>`_
-came out in September and adds some exciting features.  Here's the
-support matrix for these in mypy (to be updated with each new mypy
-release).  The intention is to support all of these by the time Python
-3.6 is released.
-
-.. note::
-
-   Mypy only understands Python 3.6 syntax if you use the ``--fast-parser`` flag.
-   This requires that the `typed_ast <https://pypi.python.org/pypi/typed-ast>`_ package is
-   installed and has at least version 0.6.1.  Use ``pip3 install -U typed_ast``.
-   If running mypy on an earlier Python version, you also need to enable 3.6 support
-   through ``--python-version 3.6``.
-
-   Example command line (or use :ref:`config-file`):
-
-     .. code-block:: text
-
-        $ pip3 install -U typed_ast
-        $ mypy --fast-parser --python-version 3.6 program.py
-
-Syntax for variable annotations (`PEP 526 <https://www.python.org/dev/peps/pep-0526>`_)
----------------------------------------------------------------------------------------
-
-Python 3.6 feature: variables (in global, class or local scope) can
-now have type annotations using either of the two forms:
-
-.. code-block:: python
-
-   foo: Optional[int]
-   bar: List[str] = []
-
-Mypy fully supports this syntax, interpreting them as equivalent to
-
-.. code-block:: python
-
-   foo = None  # type: Optional[int]
-   bar = []  # type: List[str]
-
-.. note::
-
-   See above for how to enable Python 3.6 syntax.
-
-Literal string formatting (`PEP 498 <https://www.python.org/dev/peps/pep-0498>`_)
----------------------------------------------------------------------------------
-
-Python 3.6 feature: string literals of the form
-``f"text {expression} text"`` evaluate ``expression`` using the
-current evaluation context (locals and globals).
-
-Mypy does not yet support this.
-
-Underscores in numeric literals (`PEP 515 <https://www.python.org/dev/peps/pep-0515>`_)
----------------------------------------------------------------------------------------
-
-Python 3.6 feature: numeric literals can contain underscores,
-e.g. ``1_000_000``.
-
-Mypy fully supports this syntax:
-
-.. code-block:: python
-
-   precise_val = 1_000_000.000_000_1
-   hexes: List[int] = []
-   hexes.append(0x_FF_FF_FF_FF)
-
-.. note::
-
-   This requires the ``--fast-parser`` flag and it requires that the
-   `typed_ast <https://pypi.python.org/pypi/typed-ast>`_ package is
-   installed and has at least version 0.6.2.  Use ``pip3 install -U typed_ast``.
-
-Asynchronous generators (`PEP 525 <https://www.python.org/dev/peps/pep-0525>`_)
--------------------------------------------------------------------------------
-
-Python 3.6 feature: coroutines defined with ``async def`` (PEP 492)
-can now also be generators, i.e. contain ``yield`` expressions.
-
-Mypy does not yet support this.
-
-Asynchronous comprehensions (`PEP 530 <https://www.python.org/dev/peps/pep-0530>`_)
------------------------------------------------------------------------------------
-
-Python 3.6 feature: coroutines defined with ``async def`` (PEP 492)
-can now also contain list, set and dict comprehensions that use
-``async for`` syntax.
-
-Mypy does not yet support this.
-
-New named tuple syntax
-----------------------
-
-Python 3.6 supports an alternative syntax for named tuples. See :ref:`named-tuples`.
diff --git a/docs/source/revision_history.rst b/docs/source/revision_history.rst
deleted file mode 100644
index 2537c51..0000000
--- a/docs/source/revision_history.rst
+++ /dev/null
@@ -1,176 +0,0 @@
-Revision history
-================
-
-List of major changes to this document:
-
-- January 2017
-    * Publish ``mypy`` version 0.470 on PyPI.
-
-    * Change package name from ``mypy-lang`` to ``mypy``.
-
-    * Add :ref:`integrating-mypy`.
-
-    * Add :ref:`cheat-sheet-py3`.
-
-    * Major update to :ref:`finding-imports`.
-
-    * Add :ref:`--ignore-missing-imports <ignore-missing-imports>`.
-
-    * Updates to :ref:`config-file`.
-
-    * Document underscore support in numeric literals.
-
-    * Document that arguments prefixed with ``__`` are positional-only.
-
-    * Document that ``--hide-error-context`` is now on by default,
-      and there is a new flag ``--show-error-context``.
-
-    * Add ``ignore_errors`` to :ref:`per-module-flags`.
-
-- November 2016
-    * Publish ``mypy-lang`` version 0.4.6 on PyPI.
-
-    * Add :ref:`getting-started`.
-
-    * Add :ref:`generic-methods-and-generic-self` (experimental).
-
-    * Add :ref:`declaring-decorators`.
-
-    * Discuss generic type aliases in :ref:`type-aliases`.
-
-    * Discuss Python 3.6 named tuple syntax in :ref:`named-tuples`.
-
-    * Updates to :ref:`common_issues`.
-
-    * Updates to :ref:`python-36`.
-
-    * Updates to :ref:`command-line`:
-
-      * ``--custom-typeshed-dir``
-
-      * ``--junit-xml``
-
-      * ``--find-occurrences``
-
-      * ``--cobertura-xml-report``
-
-      * ``--warn-no-return``
-
-    * Updates to :ref:`config-file`:
-
-      * Sections with fnmatch patterns now use
-        module name patterns (previously they were path patterns).
-      * Added ``custom_typeshed_dir``, ``mypy_path`` and ``show_column_numbers``.
-
-    * Mention the magic ``MYPY`` constant in :ref:`import-cycles`.
-
-- October 2016
-    * Publish ``mypy-lang`` version 0.4.5 on PyPI.
-
-    * Add :ref:`python-36`.
-
-    * Add :ref:`config-file`.
-
-    * Updates to :ref:`command-line`: ``--strict-optional-white-list``,
-      ``--disallow-subclassing-any``, ``--config-file``, ``@flagfile``,
-      ``--hide-error-context`` (replaces ``--suppress-error-context``),
-      ``--show-column-numbers`` and ``--scripts-are-modules``.
-
-    * Mention ``typing.TYPE_CHECKING`` in :ref:`import-cycles`.
-
-- August 2016
-    * Publish ``mypy-lang`` version 0.4.4 on PyPI.
-
-    * Add :ref:`newtypes`.
-
-    * Add :ref:`async-and-await`.
-
-    * Add :ref:`text-and-anystr`.
-
-    * Add :ref:`version_and_platform_checks`.
-
-- July 2016
-    * Publish ``mypy-lang`` version 0.4.3 on PyPI.
-
-    * Add :ref:`strict_optional`.
-
-    * Add :ref:`multi_line_annotation`.
-
-- June 2016
-    * Publish ``mypy-lang`` version 0.4.2 on PyPI.
-
-    * Add :ref:`type-of-class`.
-
-    * Add :ref:`cheat-sheet-py2`.
-
-    * Add :ref:`reveal-type`.
-
-- May 2016
-    * Publish ``mypy-lang`` version 0.4 on PyPI.
-
-    * Add :ref:`type-variable-upper-bound`.
-
-    * Document :ref:`command-line`.
-
-- Feb 2016
-    * Publish ``mypy-lang`` version 0.3.1 on PyPI.
-
-    * Document Python 2 support.
-
-- Nov 2015
-    Add :ref:`library-stubs`.
-
-- Jun 2015
-    Remove ``Undefined`` and ``Dynamic``, as they are not in PEP 484.
-
-- Apr 2015
-    Publish ``mypy-lang`` version 0.2.0 on PyPI.
-
-- Mar 2015
-    Update documentation to reflect PEP 484:
-
-    * Add :ref:`named-tuples` and :ref:`optional`.
-
-    * Do not mention type application syntax (for
-      example, ``List[int]()``), as it's no longer supported,
-      due to PEP 484 compatibility.
-
-    * Rename ``typevar`` to ``TypeVar``.
-
-    * Document ``# type: ignore`` which allows
-      locally ignoring spurious errors (:ref:`silencing_checker`).
-
-    * No longer mention
-      ``Any(x)`` as a valid cast, as it will be phased out soon.
-
-    * Mention the new ``.pyi`` stub file extension. Stubs can live
-      in the same directory as the rest of the program.
-
-- Jan 2015
-    Mypy moves closer to PEP 484:
-
-    * Add :ref:`type-aliases`.
-
-    * Update discussion of overloading -- it's now only supported in stubs.
-
-    * Rename ``Function[...]`` to ``Callable[...]``.
-
-- Dec 2014
-    Publish mypy version 0.1.0 on PyPI.
-
-- Oct 2014
-    Major restructuring.
-    Split the HTML documentation into
-    multiple pages.
-
-- Sep 2014
-    Migrated docs to Sphinx.
-
-- Aug 2014
-    Don't discuss native semantics. There is only Python
-    semantics.
-
-- Jul 2013
-    Rewrite to use new syntax. Shift focus to discussing
-    Python semantics. Add more content, including short discussions of
-    :ref:`generic-functions` and :ref:`union-types`.
diff --git a/docs/source/supported_python_features.rst b/docs/source/supported_python_features.rst
deleted file mode 100644
index ca68d4c..0000000
--- a/docs/source/supported_python_features.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-Supported Python features and modules
-=====================================
-
-A list of unsupported Python features is maintained in the mypy wiki:
-
-- `Unsupported Python features <https://github.com/python/mypy/wiki/Unsupported-Python-Features>`_
-
-Runtime definition of methods and functions
-*******************************************
-
-By default, mypy will complain if you add a function to a class
-or module outside its definition -- but only if this is visible to the
-type checker. This only affects static checking, as mypy performs no
-additional type checking at runtime. You can easily work around
-this. For example, you can use dynamically typed code or values with
-``Any`` types, or you can use ``setattr`` or other introspection
-features. However, you need to be careful if you decide to do this. If
-used indiscriminately, you may have difficulty using static typing
-effectively, since the type checker cannot see functions defined at
-runtime.
diff --git a/docs/source/type_inference_and_annotations.rst b/docs/source/type_inference_and_annotations.rst
deleted file mode 100644
index 76e9cf9..0000000
--- a/docs/source/type_inference_and_annotations.rst
+++ /dev/null
@@ -1,172 +0,0 @@
-Type inference and type annotations
-===================================
-
-Type inference
-**************
-
-The initial assignment defines a variable. If you do not explicitly
-specify the type of the variable, mypy infers the type based on the
-static type of the value expression:
-
-.. code-block:: python
-
-   i = 1           # Infer type int for i
-   l = [1, 2]      # Infer type List[int] for l
-
-Type inference is bidirectional and takes context into account. For
-example, the following is valid:
-
-.. code-block:: python
-
-   def f(l: List[object]) -> None:
-       l = [1, 2]  # Infer type List[object] for [1, 2]
-
-In an assignment, the type context is determined by the assignment
-target. In this case this is ``l``, which has the type
-``List[object]``. The value expression ``[1, 2]`` is type checked in
-this context and given the type ``List[object]``. In the previous
-example we introduced a new variable ``l``, and here the type context
-was empty.
-
-Note that the following is not valid, since ``List[int]`` is not
-compatible with ``List[object]``:
-
-.. code-block:: python
-
-   def f(l: List[object], k: List[int]) -> None:
-       l = k       # Type check error: incompatible types in assignment
-
-The reason why the above assignment is disallowed is that allowing the
-assignment could result in non-int values stored in a list of ``int``:
-
-.. code-block:: python
-
-   def f(l: List[object], k: List[int]) -> None:
-       l = k
-       l.append('x')
-       print(k[-1])  # Ouch; a string in List[int]
-
-You can still run the above program; it prints ``x``. This illustrates
-the fact that static types are used during type checking, but they do
-not affect the runtime behavior of programs. You can run programs with
-type check failures, which is often very handy when performing a large
-refactoring. Thus you can always 'work around' the type system, and it
-doesn't really limit what you can do in your program.
-
-Type inference is not used in dynamically typed functions (those
-without an explicit return type) — every local variable type defaults
-to ``Any``, which is discussed later.
-
-Explicit types for variables
-****************************
-
-You can override the inferred type of a variable by using a
-special type comment after an assignment statement:
-
-.. code-block:: python
-
-   x = 1  # type: Union[int, str]
-
-Without the type comment, the type of ``x`` would be just ``int``. We
-use an annotation to give it a more general type ``Union[int, str]``.
-Mypy checks that the type of the initializer is compatible with the
-declared type. The following example is not valid, since the initializer is
-a floating point number, and this is incompatible with the declared
-type:
-
-.. code-block:: python
-
-   x = 1.1  # type: Union[int, str]  # Error!
-
-.. note::
-
-   The best way to think about this is that the type comment sets the
-   type of the variable, not the type of the expression. To force the
-   type of an expression you can use ``cast(<type>, <expression>)``.
-
-Explicit types for collections
-******************************
-
-The type checker cannot always infer the type of a list or a
-dictionary. This often arises when creating an empty list or
-dictionary and assigning it to a new variable that doesn't have an explicit
-variable type. In these cases you can give the type explicitly using
-a type annotation comment:
-
-.. code-block:: python
-
-   l = []  # type: List[int]       # Create empty list with type List[int]
-   d = {}  # type: Dict[str, int]  # Create empty dictionary (str -> int)
-
-Similarly, you can also give an explicit type when creating an empty set:
-
-.. code-block:: python
-
-   s = set()  # type: Set[int]
-
-Declaring multiple variable types at a time
-*******************************************
-
-You can declare more than a single variable at a time. In order to
-nicely work with multiple assignment, you must give each variable a
-type separately:
-
-.. code-block:: python
-
-   i, found = 0, False # type: int, bool
-
-You can optionally use parentheses around the types, assignment targets
-and assigned expression:
-
-.. code-block:: python
-
-   i, found = 0, False # type: (int, bool)      # OK
-   (i, found) = 0, False # type: int, bool      # OK
-   i, found = (0, False) # type: int, bool      # OK
-   (i, found) = (0, False) # type: (int, bool)  # OK
-
-Starred expressions
-*******************
-
-In most cases, mypy can infer the type of starred expressions from the
-right-hand side of an assignment, but not always:
-
-.. code-block:: python
-
-    a, *bs = 1, 2, 3   # OK
-    p, q, *rs = 1, 2   # Error: Type of rs cannot be inferred
-
-On first line, the type of ``bs`` is inferred to be
-``List[int]``. However, on the second line, mypy cannot infer the type
-of ``rs``, because there is no right-hand side value for ``rs`` to
-infer the type from. In cases like these, the starred expression needs
-to be annotated with a starred type:
-
-.. code-block:: python
-
-    p, q, *rs = 1, 2  # type: int, int, *List[int]
-
-Here, the type of ``rs`` is set to ``List[int]``.
-
-Types in stub files
-*******************
-
-:ref:`Stub files <library-stubs>` are written in normal Python 3
-syntax, but generally leaving out runtime logic like variable
-initializers, function bodies, and default arguments, replacing them
-with ellipses.
-
-In this example, each ellipsis ``...`` is literally written in the
-stub file as three dots:
-
-.. code-block:: python
-
-    x = ...  # type: int
-    def afunc(code: str) -> int: ...
-    def afunc(a: int, b: int=...) -> int: ...
-
-.. note::
-
-    The ellipsis ``...`` is also used with a different meaning in
-    :ref:`callable types <callable-types>` and :ref:`tuple types
-    <tuple-types>`.
diff --git a/extensions/README.md b/extensions/README.md
deleted file mode 100644
index 73b786b..0000000
--- a/extensions/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Mypy Extensions
-===============
-
-The "mypy_extensions" module defines experimental extensions to the
-standard "typing" module that are supported by the mypy typechecker.
-
diff --git a/extensions/mypy_extensions.py b/extensions/mypy_extensions.py
deleted file mode 100644
index 26e568c..0000000
--- a/extensions/mypy_extensions.py
+++ /dev/null
@@ -1,97 +0,0 @@
-"""Defines experimental extensions to the standard "typing" module that are
-supported by the mypy typechecker.
-
-Example usage:
-    from mypy_extensions import TypedDict
-"""
-
-# NOTE: This module must support Python 2.7 in addition to Python 3.x
-
-import sys
-# _type_check is NOT a part of public typing API, it is used here only to mimic
-# the (convenient) behavior of types provided by typing module.
-from typing import _type_check  # type: ignore
-
-
-def _check_fails(cls, other):
-    try:
-        if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools', 'typing']:
-            # Typed dicts are only for static structural subtyping.
-            raise TypeError('TypedDict does not support instance and class checks')
-    except (AttributeError, ValueError):
-        pass
-    return False
-
-
-def _dict_new(cls, *args, **kwargs):
-    return dict(*args, **kwargs)
-
-
-def _typeddict_new(cls, _typename, _fields=None, **kwargs):
-    if _fields is None:
-        _fields = kwargs
-    elif kwargs:
-        raise TypeError("TypedDict takes either a dict or keyword arguments,"
-                        " but not both")
-    return _TypedDictMeta(_typename, (), {'__annotations__': dict(_fields)})
-
-
-class _TypedDictMeta(type):
-    def __new__(cls, name, bases, ns):
-        # Create new typed dict class object.
-        # This method is called directly when TypedDict is subclassed,
-        # or via _typeddict_new when TypedDict is instantiated. This way
-        # TypedDict supports all three syntaxes described in its docstring.
-        # Subclasses and instanes of TypedDict return actual dictionaries
-        # via _dict_new.
-        ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new
-        tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns)
-        try:
-            # Setting correct module is necessary to make typed dict classes pickleable.
-            tp_dict.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__')
-        except (AttributeError, ValueError):
-            pass
-        anns = ns.get('__annotations__', {})
-        msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
-        anns = {n: _type_check(tp, msg) for n, tp in anns.items()}
-        for base in bases:
-            anns.update(base.__dict__.get('__annotations__', {}))
-        tp_dict.__annotations__ = anns
-        return tp_dict
-
-    __instancecheck__ = __subclasscheck__ = _check_fails
-
-
-TypedDict = _TypedDictMeta('TypedDict', (dict,), {})
-TypedDict.__module__ = __name__
-TypedDict.__doc__ = \
-    """A simple typed name space. At runtime it is equivalent to a plain dict.
-
-    TypedDict creates a dictionary type that expects all of its
-    instances to have a certain set of keys, with each key
-    associated with a value of a consistent type. This expectation
-    is not checked at runtime but is only enforced by typecheckers.
-    Usage::
-
-        Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
-        a: Point2D = {'x': 1, 'y': 2, 'label': 'good'}  # OK
-        b: Point2D = {'z': 3, 'label': 'bad'}           # Fails type check
-        assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
-
-    The type info could be accessed via Point2D.__annotations__. TypedDict
-    supports two additional equivalent forms::
-
-        Point2D = TypedDict('Point2D', x=int, y=int, label=str)
-
-        class Point2D(TypedDict):
-            x: int
-            y: int
-            label: str
-
-    The latter syntax is only supported in Python 3.6+, while two other
-    syntax forms work for Python 2.7 and 3.2+
-    """
-
-
-# Return type that indicates a function does not return
-class NoReturn: pass
diff --git a/extensions/setup.py b/extensions/setup.py
deleted file mode 100644
index 3490840..0000000
--- a/extensions/setup.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python
-
-# NOTE: This package must support Python 2.7 in addition to Python 3.x
-
-from distutils.core import setup
-
-version = '0.2.0-dev'
-description = 'Experimental type system extensions for programs checked with the mypy typechecker.'
-long_description = '''
-Mypy Extensions
-===============
-
-The "mypy_extensions" module defines experimental extensions to the
-standard "typing" module that are supported by the mypy typechecker.
-'''.lstrip()
-
-classifiers = [
-    'Development Status :: 2 - Pre-Alpha',
-    'Environment :: Console',
-    'Intended Audience :: Developers',
-    'License :: OSI Approved :: MIT License',
-    'Operating System :: POSIX',
-    'Programming Language :: Python :: 2',
-    'Programming Language :: Python :: 2.7',
-    'Programming Language :: Python :: 3',
-    'Programming Language :: Python :: 3.3',
-    'Programming Language :: Python :: 3.4',
-    'Programming Language :: Python :: 3.5',
-    'Topic :: Software Development',
-]
-
-setup(
-    name='mypy_extensions',
-    version=version,
-    description=description,
-    long_description=long_description,
-    author='David Foster',
-    author_email='david at dafoster.net',
-    url='http://www.mypy-lang.org/',
-    license='MIT License',
-    platforms=['POSIX'],
-    py_modules=['mypy_extensions'],
-    classifiers=classifiers,
-)
diff --git a/lib-typing/2.7/setup.py b/lib-typing/2.7/setup.py
deleted file mode 100644
index 18c34d8..0000000
--- a/lib-typing/2.7/setup.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env python
-
-"""setup.py for Python 2.x typing module"""
-
-import glob
-import os
-import os.path
-import sys
-
-from distutils.core import setup
-
-if sys.version_info >= (3, 0, 0):
-    sys.stderr.write("ERROR: You need Python 2.x to install this module.\n")
-    exit(1)
-
-version = '0.0.1.dev1'
-description = 'typing (Python 2.x)'
-long_description = '''
-typing (Python 2.x)
-===================
-
-This module is part of mypy, a static type checker for Python.
-'''.lstrip()
-
-classifiers = [
-    'Development Status :: 2 - Pre-Alpha',
-    'Environment :: Console',
-    'Intended Audience :: Developers',
-    'License :: OSI Approved :: MIT License',
-    'Operating System :: POSIX',
-    'Programming Language :: Python :: 2.7',
-    'Topic :: Software Development',
-]
-
-setup(name='typing',
-      version=version,
-      description=description,
-      long_description=long_description,
-      author='Jukka Lehtosalo',
-      author_email='jukka.lehtosalo at iki.fi',
-      url='http://www.mypy-lang.org/',
-      license='MIT License',
-      platforms=['POSIX'],
-      py_modules=['typing'],
-      classifiers=classifiers,
-      )
diff --git a/lib-typing/2.7/test_typing.py b/lib-typing/2.7/test_typing.py
deleted file mode 100644
index 39eb7c1..0000000
--- a/lib-typing/2.7/test_typing.py
+++ /dev/null
@@ -1,1629 +0,0 @@
-from __future__ import absolute_import, unicode_literals
-
-import collections
-import pickle
-import re
-import sys
-from unittest import TestCase, main, SkipTest
-from copy import copy, deepcopy
-
-from typing import Any
-from typing import TypeVar, AnyStr
-from typing import T, KT, VT  # Not in __all__.
-from typing import Union, Optional
-from typing import Tuple, List, MutableMapping
-from typing import Callable
-from typing import Generic, ClassVar
-from typing import cast
-from typing import Type
-from typing import NewType
-from typing import NamedTuple
-from typing import IO, TextIO, BinaryIO
-from typing import Pattern, Match
-import abc
-import typing
-try:
-    import collections.abc as collections_abc
-except ImportError:
-    import collections as collections_abc  # Fallback for PY3.2.
-
-
-class BaseTestCase(TestCase):
-
-    def assertIsSubclass(self, cls, class_or_tuple, msg=None):
-        if not issubclass(cls, class_or_tuple):
-            message = '%r is not a subclass of %r' % (cls, class_or_tuple)
-            if msg is not None:
-                message += ' : %s' % msg
-            raise self.failureException(message)
-
-    def assertNotIsSubclass(self, cls, class_or_tuple, msg=None):
-        if issubclass(cls, class_or_tuple):
-            message = '%r is a subclass of %r' % (cls, class_or_tuple)
-            if msg is not None:
-                message += ' : %s' % msg
-            raise self.failureException(message)
-
-    def clear_caches(self):
-        for f in typing._cleanups:
-            f()
-
-
-class Employee(object):
-    pass
-
-
-class Manager(Employee):
-    pass
-
-
-class Founder(Employee):
-    pass
-
-
-class ManagingFounder(Manager, Founder):
-    pass
-
-
-class AnyTests(BaseTestCase):
-
-    def test_any_instance_type_error(self):
-        with self.assertRaises(TypeError):
-            isinstance(42, Any)
-
-    def test_any_subclass_type_error(self):
-        with self.assertRaises(TypeError):
-            issubclass(Employee, Any)
-        with self.assertRaises(TypeError):
-            issubclass(Any, Employee)
-
-    def test_repr(self):
-        self.assertEqual(repr(Any), 'typing.Any')
-
-    def test_errors(self):
-        with self.assertRaises(TypeError):
-            issubclass(42, Any)
-        with self.assertRaises(TypeError):
-            Any[int]  # Any is not a generic type.
-
-    def test_cannot_subclass(self):
-        with self.assertRaises(TypeError):
-            class A(Any):
-                pass
-        with self.assertRaises(TypeError):
-            class A(type(Any)):
-                pass
-
-    def test_cannot_instantiate(self):
-        with self.assertRaises(TypeError):
-            Any()
-        with self.assertRaises(TypeError):
-            type(Any)()
-
-    def test_cannot_subscript(self):
-        with self.assertRaises(TypeError):
-            Any[int]
-
-    def test_any_is_subclass(self):
-        # These expressions must simply not fail.
-        typing.Match[Any]
-        typing.Pattern[Any]
-        typing.IO[Any]
-
-
-class TypeVarTests(BaseTestCase):
-
-    def test_basic_plain(self):
-        T = TypeVar('T')
-        # T equals itself.
-        self.assertEqual(T, T)
-        # T is an instance of TypeVar
-        self.assertIsInstance(T, TypeVar)
-
-    def test_typevar_instance_type_error(self):
-        T = TypeVar('T')
-        with self.assertRaises(TypeError):
-            isinstance(42, T)
-
-    def test_typevar_subclass_type_error(self):
-        T = TypeVar('T')
-        with self.assertRaises(TypeError):
-            issubclass(int, T)
-        with self.assertRaises(TypeError):
-            issubclass(T, int)
-
-    def test_constrained_error(self):
-        with self.assertRaises(TypeError):
-            X = TypeVar('X', int)
-            X
-
-    def test_union_unique(self):
-        X = TypeVar('X')
-        Y = TypeVar('Y')
-        self.assertNotEqual(X, Y)
-        self.assertEqual(Union[X], X)
-        self.assertNotEqual(Union[X], Union[X, Y])
-        self.assertEqual(Union[X, X], X)
-        self.assertNotEqual(Union[X, int], Union[X])
-        self.assertNotEqual(Union[X, int], Union[int])
-        self.assertEqual(Union[X, int].__args__, (X, int))
-        self.assertEqual(Union[X, int].__parameters__, (X,))
-        self.assertIs(Union[X, int].__origin__, Union)
-
-    def test_union_constrained(self):
-        A = TypeVar('A', str, bytes)
-        self.assertNotEqual(Union[A, str], Union[A])
-
-    def test_repr(self):
-        self.assertEqual(repr(T), '~T')
-        self.assertEqual(repr(KT), '~KT')
-        self.assertEqual(repr(VT), '~VT')
-        self.assertEqual(repr(AnyStr), '~AnyStr')
-        T_co = TypeVar('T_co', covariant=True)
-        self.assertEqual(repr(T_co), '+T_co')
-        T_contra = TypeVar('T_contra', contravariant=True)
-        self.assertEqual(repr(T_contra), '-T_contra')
-
-    def test_no_redefinition(self):
-        self.assertNotEqual(TypeVar('T'), TypeVar('T'))
-        self.assertNotEqual(TypeVar('T', int, str), TypeVar('T', int, str))
-
-    def test_cannot_subclass_vars(self):
-        with self.assertRaises(TypeError):
-            class V(TypeVar('T')):
-                pass
-
-    def test_cannot_subclass_var_itself(self):
-        with self.assertRaises(TypeError):
-            class V(TypeVar):
-                pass
-
-    def test_cannot_instantiate_vars(self):
-        with self.assertRaises(TypeError):
-            TypeVar('A')()
-
-    def test_bound_errors(self):
-        with self.assertRaises(TypeError):
-            TypeVar('X', bound=42)
-        with self.assertRaises(TypeError):
-            TypeVar('X', str, float, bound=Employee)
-
-
-class UnionTests(BaseTestCase):
-
-    def test_basics(self):
-        u = Union[int, float]
-        self.assertNotEqual(u, Union)
-
-    def test_subclass_error(self):
-        with self.assertRaises(TypeError):
-            issubclass(int, Union)
-        with self.assertRaises(TypeError):
-            issubclass(Union, int)
-        with self.assertRaises(TypeError):
-            issubclass(int, Union[int, str])
-        with self.assertRaises(TypeError):
-            issubclass(Union[int, str], int)
-
-    def test_union_any(self):
-        u = Union[Any]
-        self.assertEqual(u, Any)
-        u1 = Union[int, Any]
-        u2 = Union[Any, int]
-        u3 = Union[Any, object]
-        self.assertEqual(u1, u2)
-        self.assertNotEqual(u1, Any)
-        self.assertNotEqual(u2, Any)
-        self.assertNotEqual(u3, Any)
-
-    def test_union_object(self):
-        u = Union[object]
-        self.assertEqual(u, object)
-        u = Union[int, object]
-        self.assertEqual(u, object)
-        u = Union[object, int]
-        self.assertEqual(u, object)
-
-    def test_unordered(self):
-        u1 = Union[int, float]
-        u2 = Union[float, int]
-        self.assertEqual(u1, u2)
-
-    def test_single_class_disappears(self):
-        t = Union[Employee]
-        self.assertIs(t, Employee)
-
-    def test_base_class_disappears(self):
-        u = Union[Employee, Manager, int]
-        self.assertEqual(u, Union[int, Employee])
-        u = Union[Manager, int, Employee]
-        self.assertEqual(u, Union[int, Employee])
-        u = Union[Employee, Manager]
-        self.assertIs(u, Employee)
-
-    def test_union_union(self):
-        u = Union[int, float]
-        v = Union[u, Employee]
-        self.assertEqual(v, Union[int, float, Employee])
-
-    def test_repr(self):
-        self.assertEqual(repr(Union), 'typing.Union')
-        u = Union[Employee, int]
-        self.assertEqual(repr(u), 'typing.Union[%s.Employee, int]' % __name__)
-        u = Union[int, Employee]
-        self.assertEqual(repr(u), 'typing.Union[int, %s.Employee]' % __name__)
-
-    def test_cannot_subclass(self):
-        with self.assertRaises(TypeError):
-            class C(Union):
-                pass
-        with self.assertRaises(TypeError):
-            class C(type(Union)):
-                pass
-        with self.assertRaises(TypeError):
-            class C(Union[int, str]):
-                pass
-
-    def test_cannot_instantiate(self):
-        with self.assertRaises(TypeError):
-            Union()
-        u = Union[int, float]
-        with self.assertRaises(TypeError):
-            u()
-        with self.assertRaises(TypeError):
-            type(u)()
-
-    def test_union_generalization(self):
-        self.assertFalse(Union[str, typing.Iterable[int]] == str)
-        self.assertFalse(Union[str, typing.Iterable[int]] == typing.Iterable[int])
-        self.assertTrue(Union[str, typing.Iterable] == typing.Iterable)
-
-    def test_optional(self):
-        o = Optional[int]
-        u = Union[int, None]
-        self.assertEqual(o, u)
-
-    def test_empty(self):
-        with self.assertRaises(TypeError):
-            Union[()]
-
-    def test_union_instance_type_error(self):
-        with self.assertRaises(TypeError):
-            isinstance(42, Union[int, str])
-
-    def test_union_str_pattern(self):
-        # Shouldn't crash; see http://bugs.python.org/issue25390
-        A = Union[str, Pattern]
-        A
-
-    def test_etree(self):
-        # See https://github.com/python/typing/issues/229
-        # (Only relevant for Python 2.)
-        try:
-            from xml.etree.cElementTree import Element
-        except ImportError:
-            raise SkipTest("cElementTree not found")
-        Union[Element, str]  # Shouldn't crash
-
-        def Elem(*args):
-            return Element(*args)
-
-        Union[Elem, str]  # Nor should this
-
-
-class TupleTests(BaseTestCase):
-
-    def test_basics(self):
-        with self.assertRaises(TypeError):
-            issubclass(Tuple, Tuple[int, str])
-        with self.assertRaises(TypeError):
-            issubclass(tuple, Tuple[int, str])
-
-        class TP(tuple): pass
-        self.assertTrue(issubclass(tuple, Tuple))
-        self.assertTrue(issubclass(TP, Tuple))
-
-    def test_equality(self):
-        self.assertEqual(Tuple[int], Tuple[int])
-        self.assertEqual(Tuple[int, ...], Tuple[int, ...])
-        self.assertNotEqual(Tuple[int], Tuple[int, int])
-        self.assertNotEqual(Tuple[int], Tuple[int, ...])
-
-    def test_tuple_subclass(self):
-        class MyTuple(tuple):
-            pass
-        self.assertTrue(issubclass(MyTuple, Tuple))
-
-    def test_tuple_instance_type_error(self):
-        with self.assertRaises(TypeError):
-            isinstance((0, 0), Tuple[int, int])
-        isinstance((0, 0), Tuple)
-
-    def test_repr(self):
-        self.assertEqual(repr(Tuple), 'typing.Tuple')
-        self.assertEqual(repr(Tuple[()]), 'typing.Tuple[()]')
-        self.assertEqual(repr(Tuple[int, float]), 'typing.Tuple[int, float]')
-        self.assertEqual(repr(Tuple[int, ...]), 'typing.Tuple[int, ...]')
-
-    def test_errors(self):
-        with self.assertRaises(TypeError):
-            issubclass(42, Tuple)
-        with self.assertRaises(TypeError):
-            issubclass(42, Tuple[int])
-
-
-class CallableTests(BaseTestCase):
-
-    def test_self_subclass(self):
-        with self.assertRaises(TypeError):
-            self.assertTrue(issubclass(type(lambda x: x), Callable[[int], int]))
-        self.assertTrue(issubclass(type(lambda x: x), Callable))
-
-    def test_eq_hash(self):
-        self.assertEqual(Callable[[int], int], Callable[[int], int])
-        self.assertEqual(len({Callable[[int], int], Callable[[int], int]}), 1)
-        self.assertNotEqual(Callable[[int], int], Callable[[int], str])
-        self.assertNotEqual(Callable[[int], int], Callable[[str], int])
-        self.assertNotEqual(Callable[[int], int], Callable[[int, int], int])
-        self.assertNotEqual(Callable[[int], int], Callable[[], int])
-        self.assertNotEqual(Callable[[int], int], Callable)
-
-    def test_cannot_instantiate(self):
-        with self.assertRaises(TypeError):
-            Callable()
-        with self.assertRaises(TypeError):
-            type(Callable)()
-        c = Callable[[int], str]
-        with self.assertRaises(TypeError):
-            c()
-        with self.assertRaises(TypeError):
-            type(c)()
-
-    def test_callable_wrong_forms(self):
-        with self.assertRaises(TypeError):
-            Callable[(), int]
-        with self.assertRaises(TypeError):
-            Callable[[()], int]
-        with self.assertRaises(TypeError):
-            Callable[[int, 1], 2]
-
-    def test_callable_instance_works(self):
-        def f():
-            pass
-        self.assertIsInstance(f, Callable)
-        self.assertNotIsInstance(None, Callable)
-
-    def test_callable_instance_type_error(self):
-        def f():
-            pass
-        with self.assertRaises(TypeError):
-            self.assertIsInstance(f, Callable[[], None])
-        with self.assertRaises(TypeError):
-            self.assertIsInstance(f, Callable[[], Any])
-        with self.assertRaises(TypeError):
-            self.assertNotIsInstance(None, Callable[[], None])
-        with self.assertRaises(TypeError):
-            self.assertNotIsInstance(None, Callable[[], Any])
-
-    def test_repr(self):
-        ct0 = Callable[[], bool]
-        self.assertEqual(repr(ct0), 'typing.Callable[[], bool]')
-        ct2 = Callable[[str, float], int]
-        self.assertEqual(repr(ct2), 'typing.Callable[[str, float], int]')
-        ctv = Callable[..., str]
-        self.assertEqual(repr(ctv), 'typing.Callable[..., str]')
-
-    def test_ellipsis_in_generic(self):
-        # Shouldn't crash; see https://github.com/python/typing/issues/259
-        typing.List[Callable[..., str]]
-
-
-XK = TypeVar('XK', unicode, bytes)
-XV = TypeVar('XV')
-
-
-class SimpleMapping(Generic[XK, XV]):
-
-    def __getitem__(self, key):
-        pass
-
-    def __setitem__(self, key, value):
-        pass
-
-    def get(self, key, default=None):
-        pass
-
-
-class MySimpleMapping(SimpleMapping[XK, XV]):
-
-    def __init__(self):
-        self.store = {}
-
-    def __getitem__(self, key):
-        return self.store[key]
-
-    def __setitem__(self, key, value):
-        self.store[key] = value
-
-    def get(self, key, default=None):
-        try:
-            return self.store[key]
-        except KeyError:
-            return default
-
-
-class ProtocolTests(BaseTestCase):
-
-    def test_supports_int(self):
-        self.assertIsSubclass(int, typing.SupportsInt)
-        self.assertNotIsSubclass(str, typing.SupportsInt)
-
-    def test_supports_float(self):
-        self.assertIsSubclass(float, typing.SupportsFloat)
-        self.assertNotIsSubclass(str, typing.SupportsFloat)
-
-    def test_supports_complex(self):
-
-        # Note: complex itself doesn't have __complex__.
-        class C(object):
-            def __complex__(self):
-                return 0j
-
-        self.assertIsSubclass(C, typing.SupportsComplex)
-        self.assertNotIsSubclass(str, typing.SupportsComplex)
-
-    def test_supports_abs(self):
-        self.assertIsSubclass(float, typing.SupportsAbs)
-        self.assertIsSubclass(int, typing.SupportsAbs)
-        self.assertNotIsSubclass(str, typing.SupportsAbs)
-
-    def test_reversible(self):
-        self.assertIsSubclass(list, typing.Reversible)
-        self.assertNotIsSubclass(int, typing.Reversible)
-
-    def test_protocol_instance_type_error(self):
-        with self.assertRaises(TypeError):
-            isinstance(0, typing.SupportsAbs)
-        class C1(typing.SupportsInt):
-            def __int__(self):
-                return 42
-        class C2(C1):
-            pass
-        c = C2()
-        self.assertIsInstance(c, C1)
-
-class GenericTests(BaseTestCase):
-
-    def test_basics(self):
-        X = SimpleMapping[str, Any]
-        self.assertEqual(X.__parameters__, ())
-        with self.assertRaises(TypeError):
-            X[unicode]
-        with self.assertRaises(TypeError):
-            X[unicode, unicode]
-        Y = SimpleMapping[XK, unicode]
-        self.assertEqual(Y.__parameters__, (XK,))
-        Y[unicode]
-        with self.assertRaises(TypeError):
-            Y[unicode, unicode]
-
-    def test_generic_errors(self):
-        T = TypeVar('T')
-        with self.assertRaises(TypeError):
-            Generic[T]()
-        with self.assertRaises(TypeError):
-            isinstance([], List[int])
-        with self.assertRaises(TypeError):
-            issubclass(list, List[int])
-
-    def test_init(self):
-        T = TypeVar('T')
-        S = TypeVar('S')
-        with self.assertRaises(TypeError):
-            Generic[T, T]
-        with self.assertRaises(TypeError):
-            Generic[T, S, T]
-
-    def test_repr(self):
-        self.assertEqual(repr(SimpleMapping),
-                         __name__ + '.' + 'SimpleMapping')
-        self.assertEqual(repr(MySimpleMapping),
-                         __name__ + '.' + 'MySimpleMapping')
-
-    def test_chain_repr(self):
-        T = TypeVar('T')
-        S = TypeVar('S')
-
-        class C(Generic[T]):
-            pass
-
-        X = C[Tuple[S, T]]
-        self.assertEqual(X, C[Tuple[S, T]])
-        self.assertNotEqual(X, C[Tuple[T, S]])
-
-        Y = X[T, int]
-        self.assertEqual(Y, X[T, int])
-        self.assertNotEqual(Y, X[S, int])
-        self.assertNotEqual(Y, X[T, str])
-
-        Z = Y[str]
-        self.assertEqual(Z, Y[str])
-        self.assertNotEqual(Z, Y[int])
-        self.assertNotEqual(Z, Y[T])
-
-        self.assertTrue(str(Z).endswith(
-            '.C[typing.Tuple[str, int]]'))
-
-    def test_new_repr(self):
-        T = TypeVar('T')
-        U = TypeVar('U', covariant=True)
-        S = TypeVar('S')
-
-        self.assertEqual(repr(List), 'typing.List')
-        self.assertEqual(repr(List[T]), 'typing.List[~T]')
-        self.assertEqual(repr(List[U]), 'typing.List[+U]')
-        self.assertEqual(repr(List[S][T][int]), 'typing.List[int]')
-        self.assertEqual(repr(List[int]), 'typing.List[int]')
-
-    def test_new_repr_complex(self):
-        T = TypeVar('T')
-        TS = TypeVar('TS')
-
-        self.assertEqual(repr(typing.Mapping[T, TS][TS, T]), 'typing.Mapping[~TS, ~T]')
-        self.assertEqual(repr(List[Tuple[T, TS]][int, T]),
-                         'typing.List[typing.Tuple[int, ~T]]')
-        self.assertEqual(repr(List[Tuple[T, T]][List[int]]),
-                 'typing.List[typing.Tuple[typing.List[int], typing.List[int]]]')
-
-    def test_new_repr_bare(self):
-        T = TypeVar('T')
-        self.assertEqual(repr(Generic[T]), 'typing.Generic[~T]')
-        self.assertEqual(repr(typing._Protocol[T]), 'typing.Protocol[~T]')
-        class C(typing.Dict[Any, Any]): pass
-        # this line should just work
-        repr(C.__mro__)
-
-    def test_dict(self):
-        T = TypeVar('T')
-
-        class B(Generic[T]):
-            pass
-
-        b = B()
-        b.foo = 42
-        self.assertEqual(b.__dict__, {'foo': 42})
-
-        class C(B[int]):
-            pass
-
-        c = C()
-        c.bar = 'abc'
-        self.assertEqual(c.__dict__, {'bar': 'abc'})
-
-    def test_false_subclasses(self):
-        class MyMapping(MutableMapping[str, str]): pass
-        self.assertNotIsInstance({}, MyMapping)
-        self.assertNotIsSubclass(dict, MyMapping)
-
-    def test_abc_bases(self):
-        class MM(MutableMapping[str, str]):
-            def __getitem__(self, k):
-                return None
-            def __setitem__(self, k, v):
-                pass
-            def __delitem__(self, k):
-                pass
-            def __iter__(self):
-                return iter(())
-            def __len__(self):
-                return 0
-        # this should just work
-        MM().update()
-        self.assertIsInstance(MM(), collections_abc.MutableMapping)
-        self.assertIsInstance(MM(), MutableMapping)
-        self.assertNotIsInstance(MM(), List)
-        self.assertNotIsInstance({}, MM)
-
-    def test_multiple_bases(self):
-        class MM1(MutableMapping[str, str], collections_abc.MutableMapping):
-            pass
-        with self.assertRaises(TypeError):
-            # consistent MRO not possible
-            class MM2(collections_abc.MutableMapping, MutableMapping[str, str]):
-                pass
-
-    def test_orig_bases(self):
-        T = TypeVar('T')
-        class C(typing.Dict[str, T]): pass
-        self.assertEqual(C.__orig_bases__, (typing.Dict[str, T],))
-
-    def test_naive_runtime_checks(self):
-        def naive_dict_check(obj, tp):
-            # Check if a dictionary conforms to Dict type
-            if len(tp.__parameters__) > 0:
-                raise NotImplementedError
-            if tp.__args__:
-                KT, VT = tp.__args__
-                return all(isinstance(k, KT) and isinstance(v, VT)
-                   for k, v in obj.items())
-        self.assertTrue(naive_dict_check({'x': 1}, typing.Dict[typing.Text, int]))
-        self.assertFalse(naive_dict_check({1: 'x'}, typing.Dict[typing.Text, int]))
-        with self.assertRaises(NotImplementedError):
-            naive_dict_check({1: 'x'}, typing.Dict[typing.Text, T])
-
-        def naive_generic_check(obj, tp):
-            # Check if an instance conforms to the generic class
-            if not hasattr(obj, '__orig_class__'):
-                raise NotImplementedError
-            return obj.__orig_class__ == tp
-        class Node(Generic[T]): pass
-        self.assertTrue(naive_generic_check(Node[int](), Node[int]))
-        self.assertFalse(naive_generic_check(Node[str](), Node[int]))
-        self.assertFalse(naive_generic_check(Node[str](), List))
-        with self.assertRaises(NotImplementedError):
-            naive_generic_check([1,2,3], Node[int])
-
-        def naive_list_base_check(obj, tp):
-            # Check if list conforms to a List subclass
-            return all(isinstance(x, tp.__orig_bases__[0].__args__[0])
-                       for x in obj)
-        class C(List[int]): pass
-        self.assertTrue(naive_list_base_check([1, 2, 3], C))
-        self.assertFalse(naive_list_base_check(['a', 'b'], C))
-
-    def test_multi_subscr_base(self):
-        T = TypeVar('T')
-        U = TypeVar('U')
-        V = TypeVar('V')
-        class C(List[T][U][V]): pass
-        class D(C, List[T][U][V]): pass
-        self.assertEqual(C.__parameters__, (V,))
-        self.assertEqual(D.__parameters__, (V,))
-        self.assertEqual(C[int].__parameters__, ())
-        self.assertEqual(D[int].__parameters__, ())
-        self.assertEqual(C[int].__args__, (int,))
-        self.assertEqual(D[int].__args__, (int,))
-        self.assertEqual(C.__bases__, (List,))
-        self.assertEqual(D.__bases__, (C, List))
-        self.assertEqual(C.__orig_bases__, (List[T][U][V],))
-        self.assertEqual(D.__orig_bases__, (C, List[T][U][V]))
-
-    def test_extended_generic_rules_eq(self):
-        T = TypeVar('T')
-        U = TypeVar('U')
-        self.assertEqual(Tuple[T, T][int], Tuple[int, int])
-        self.assertEqual(typing.Iterable[Tuple[T, T]][T], typing.Iterable[Tuple[T, T]])
-        with self.assertRaises(TypeError):
-            Tuple[T, int][()]
-        with self.assertRaises(TypeError):
-            Tuple[T, U][T, ...]
-
-        self.assertEqual(Union[T, int][int], int)
-        self.assertEqual(Union[T, U][int, Union[int, str]], Union[int, str])
-        class Base(object): pass
-        class Derived(Base): pass
-        self.assertEqual(Union[T, Base][Derived], Base)
-        with self.assertRaises(TypeError):
-            Union[T, int][1]
-
-        self.assertEqual(Callable[[T], T][KT], Callable[[KT], KT])
-        self.assertEqual(Callable[..., List[T]][int], Callable[..., List[int]])
-        with self.assertRaises(TypeError):
-            Callable[[T], U][..., int]
-        with self.assertRaises(TypeError):
-            Callable[[T], U][[], int]
-
-    def test_extended_generic_rules_repr(self):
-        T = TypeVar('T')
-        self.assertEqual(repr(Union[Tuple, Callable]).replace('typing.', ''),
-                         'Union[Tuple, Callable]')
-        self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''),
-                         'Tuple')
-        self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''),
-                         'Callable[..., Union[int, NoneType]]')
-        self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''),
-                         'Callable[[], List[int]]')
-
-    def test_generic_forvard_ref(self):
-        LLT = List[List['CC']]
-        class CC: pass
-        self.assertEqual(typing._eval_type(LLT, globals(), locals()), List[List[CC]])
-        T = TypeVar('T')
-        AT = Tuple[T, ...]
-        self.assertIs(typing._eval_type(AT, globals(), locals()), AT)
-        CT = Callable[..., List[T]]
-        self.assertIs(typing._eval_type(CT, globals(), locals()), CT)
-
-    def test_extended_generic_rules_subclassing(self):
-        class T1(Tuple[T, KT]): pass
-        class T2(Tuple[T, ...]): pass
-        class C1(Callable[[T], T]): pass
-        class C2(Callable[..., int]):
-            def __call__(self):
-                return None
-
-        self.assertEqual(T1.__parameters__, (T, KT))
-        self.assertEqual(T1[int, str].__args__, (int, str))
-        self.assertEqual(T1[int, T].__origin__, T1)
-
-        self.assertEqual(T2.__parameters__, (T,))
-        with self.assertRaises(TypeError):
-            T1[int]
-        with self.assertRaises(TypeError):
-            T2[int, str]
-
-        self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]')
-        self.assertEqual(C2.__parameters__, ())
-        self.assertIsInstance(C2(), collections_abc.Callable)
-        self.assertIsSubclass(C2, collections_abc.Callable)
-        self.assertIsSubclass(C1, collections_abc.Callable)
-        self.assertIsInstance(T1(), tuple)
-        self.assertIsSubclass(T2, tuple)
-        self.assertIsSubclass(Tuple[int, ...], typing.Sequence)
-        self.assertIsSubclass(Tuple[int, ...], typing.Iterable)
-
-    def test_fail_with_bare_union(self):
-        with self.assertRaises(TypeError):
-            List[Union]
-        with self.assertRaises(TypeError):
-            Tuple[Optional]
-        with self.assertRaises(TypeError):
-            ClassVar[ClassVar]
-        with self.assertRaises(TypeError):
-            List[ClassVar[int]]
-
-    def test_fail_with_bare_generic(self):
-        T = TypeVar('T')
-        with self.assertRaises(TypeError):
-            List[Generic]
-        with self.assertRaises(TypeError):
-            Tuple[Generic[T]]
-        with self.assertRaises(TypeError):
-            List[typing._Protocol]
-
-    def test_type_erasure_special(self):
-        T = TypeVar('T')
-        # this is the only test that checks type caching
-        self.clear_caches()
-        class MyTup(Tuple[T, T]): pass
-        self.assertIs(MyTup[int]().__class__, MyTup)
-        self.assertIs(MyTup[int]().__orig_class__, MyTup[int])
-        class MyCall(Callable[..., T]):
-            def __call__(self): return None
-        self.assertIs(MyCall[T]().__class__, MyCall)
-        self.assertIs(MyCall[T]().__orig_class__, MyCall[T])
-        class MyDict(typing.Dict[T, T]): pass
-        self.assertIs(MyDict[int]().__class__, MyDict)
-        self.assertIs(MyDict[int]().__orig_class__, MyDict[int])
-        class MyDef(typing.DefaultDict[str, T]): pass
-        self.assertIs(MyDef[int]().__class__, MyDef)
-        self.assertIs(MyDef[int]().__orig_class__, MyDef[int])
-
-    def test_all_repr_eq_any(self):
-        objs = (getattr(typing, el) for el in typing.__all__)
-        for obj in objs:
-            self.assertNotEqual(repr(obj), '')
-            self.assertEqual(obj, obj)
-            if getattr(obj, '__parameters__', None) and len(obj.__parameters__) == 1:
-                self.assertEqual(obj[Any].__args__, (Any,))
-            if isinstance(obj, type):
-                for base in obj.__mro__:
-                    self.assertNotEqual(repr(base), '')
-                    self.assertEqual(base, base)
-
-    def test_pickle(self):
-        global C  # pickle wants to reference the class by name
-        T = TypeVar('T')
-
-        class B(Generic[T]):
-            pass
-
-        class C(B[int]):
-            pass
-
-        c = C()
-        c.foo = 42
-        c.bar = 'abc'
-        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
-            z = pickle.dumps(c, proto)
-            x = pickle.loads(z)
-            self.assertEqual(x.foo, 42)
-            self.assertEqual(x.bar, 'abc')
-            self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'})
-        simples = [Any, Union, Tuple, Callable, ClassVar, List, typing.Iterable]
-        for s in simples:
-            for proto in range(pickle.HIGHEST_PROTOCOL + 1):
-                z = pickle.dumps(s, proto)
-                x = pickle.loads(z)
-                self.assertEqual(s, x)
-
-    def test_copy_and_deepcopy(self):
-        T = TypeVar('T')
-        class Node(Generic[T]): pass
-        things = [Any, Union[T, int], Tuple[T, int], Callable[..., T], Callable[[int], int],
-                  Tuple[Any, Any], Node[T], Node[int], Node[Any], typing.Iterable[T],
-                  typing.Iterable[Any], typing.Iterable[int], typing.Dict[int, str],
-                  typing.Dict[T, Any], ClassVar[int], ClassVar[List[T]], Tuple['T', 'T'],
-                  Union['T', int], List['T'], typing.Mapping['T', int]]
-        for t in things:
-            self.assertEqual(t, deepcopy(t))
-            self.assertEqual(t, copy(t))
-
-    def test_parameterized_slots(self):
-        T = TypeVar('T')
-        class C(Generic[T]):
-            __slots__ = ('potato',)
-
-        c = C()
-        c_int = C[int]()
-        self.assertEqual(C.__slots__, C[str].__slots__)
-
-        c.potato = 0
-        c_int.potato = 0
-        with self.assertRaises(AttributeError):
-            c.tomato = 0
-        with self.assertRaises(AttributeError):
-            c_int.tomato = 0
-
-        self.assertEqual(typing._eval_type(C['C'], globals(), locals()), C[C])
-        self.assertEqual(typing._eval_type(C['C'], globals(), locals()).__slots__,
-                         C.__slots__)
-        self.assertEqual(copy(C[int]), deepcopy(C[int]))
-
-    def test_parameterized_slots_dict(self):
-        T = TypeVar('T')
-        class D(Generic[T]):
-            __slots__ = {'banana': 42}
-
-        d = D()
-        d_int = D[int]()
-        self.assertEqual(D.__slots__, D[str].__slots__)
-
-        d.banana = 'yes'
-        d_int.banana = 'yes'
-        with self.assertRaises(AttributeError):
-            d.foobar = 'no'
-        with self.assertRaises(AttributeError):
-            d_int.foobar = 'no'
-
-    def test_errors(self):
-        with self.assertRaises(TypeError):
-            B = SimpleMapping[XK, Any]
-
-            class C(Generic[B]):
-                pass
-
-    def test_repr_2(self):
-        PY32 = sys.version_info[:2] < (3, 3)
-
-        class C(Generic[T]):
-            pass
-
-        self.assertEqual(C.__module__, __name__)
-        if not PY32:
-            self.assertEqual(C.__qualname__,
-                             'GenericTests.test_repr_2.<locals>.C')
-        self.assertEqual(repr(C).split('.')[-1], 'C')
-        X = C[int]
-        self.assertEqual(X.__module__, __name__)
-        if not PY32:
-            self.assertTrue(X.__qualname__.endswith('.<locals>.C'))
-        self.assertEqual(repr(X).split('.')[-1], 'C[int]')
-
-        class Y(C[int]):
-            pass
-
-        self.assertEqual(Y.__module__, __name__)
-        if not PY32:
-            self.assertEqual(Y.__qualname__,
-                             'GenericTests.test_repr_2.<locals>.Y')
-        self.assertEqual(repr(Y).split('.')[-1], 'Y')
-
-    def test_eq_1(self):
-        self.assertEqual(Generic, Generic)
-        self.assertEqual(Generic[T], Generic[T])
-        self.assertNotEqual(Generic[KT], Generic[VT])
-
-    def test_eq_2(self):
-
-        class A(Generic[T]):
-            pass
-
-        class B(Generic[T]):
-            pass
-
-        self.assertEqual(A, A)
-        self.assertNotEqual(A, B)
-        self.assertEqual(A[T], A[T])
-        self.assertNotEqual(A[T], B[T])
-
-    def test_multiple_inheritance(self):
-
-        class A(Generic[T, VT]):
-            pass
-
-        class B(Generic[KT, T]):
-            pass
-
-        class C(A[T, VT], Generic[VT, T, KT], B[KT, T]):
-            pass
-
-        self.assertEqual(C.__parameters__, (VT, T, KT))
-
-    def test_nested(self):
-
-        G = Generic
-
-        class Visitor(G[T]):
-
-            a = None
-
-            def set(self, a):
-                self.a = a
-
-            def get(self):
-                return self.a
-
-            def visit(self):
-                return self.a
-
-        V = Visitor[typing.List[int]]
-
-        class IntListVisitor(V):
-
-            def append(self, x):
-                self.a.append(x)
-
-        a = IntListVisitor()
-        a.set([])
-        a.append(1)
-        a.append(42)
-        self.assertEqual(a.get(), [1, 42])
-
-    def test_type_erasure(self):
-        T = TypeVar('T')
-
-        class Node(Generic[T]):
-            def __init__(self, label,
-                         left = None,
-                         right = None):
-                self.label = label  # type: T
-                self.left = left  # type: Optional[Node[T]]
-                self.right = right  # type: Optional[Node[T]]
-
-        def foo(x):
-            a = Node(x)
-            b = Node[T](x)
-            c = Node[Any](x)
-            self.assertIs(type(a), Node)
-            self.assertIs(type(b), Node)
-            self.assertIs(type(c), Node)
-            self.assertEqual(a.label, x)
-            self.assertEqual(b.label, x)
-            self.assertEqual(c.label, x)
-
-        foo(42)
-
-    def test_implicit_any(self):
-        T = TypeVar('T')
-
-        class C(Generic[T]):
-            pass
-
-        class D(C):
-            pass
-
-        self.assertEqual(D.__parameters__, ())
-
-        with self.assertRaises(Exception):
-            D[int]
-        with self.assertRaises(Exception):
-            D[Any]
-        with self.assertRaises(Exception):
-            D[T]
-
-class ClassVarTests(BaseTestCase):
-
-    def test_basics(self):
-        with self.assertRaises(TypeError):
-            ClassVar[1]
-        with self.assertRaises(TypeError):
-            ClassVar[int, str]
-        with self.assertRaises(TypeError):
-            ClassVar[int][str]
-
-    def test_repr(self):
-        self.assertEqual(repr(ClassVar), 'typing.ClassVar')
-        cv = ClassVar[int]
-        self.assertEqual(repr(cv), 'typing.ClassVar[int]')
-        cv = ClassVar[Employee]
-        self.assertEqual(repr(cv), 'typing.ClassVar[%s.Employee]' % __name__)
-
-    def test_cannot_subclass(self):
-        with self.assertRaises(TypeError):
-            class C(type(ClassVar)):
-                pass
-        with self.assertRaises(TypeError):
-            class C(type(ClassVar[int])):
-                pass
-
-    def test_cannot_init(self):
-        with self.assertRaises(TypeError):
-            ClassVar()
-        with self.assertRaises(TypeError):
-            type(ClassVar)()
-        with self.assertRaises(TypeError):
-            type(ClassVar[Optional[int]])()
-
-    def test_no_isinstance(self):
-        with self.assertRaises(TypeError):
-            isinstance(1, ClassVar[int])
-        with self.assertRaises(TypeError):
-            issubclass(int, ClassVar)
-
-
-class CastTests(BaseTestCase):
-
-    def test_basics(self):
-        self.assertEqual(cast(int, 42), 42)
-        self.assertEqual(cast(float, 42), 42)
-        self.assertIs(type(cast(float, 42)), int)
-        self.assertEqual(cast(Any, 42), 42)
-        self.assertEqual(cast(list, 42), 42)
-        self.assertEqual(cast(Union[str, float], 42), 42)
-        self.assertEqual(cast(AnyStr, 42), 42)
-        self.assertEqual(cast(None, 42), 42)
-
-    def test_errors(self):
-        # Bogus calls are not expected to fail.
-        cast(42, 42)
-        cast('hello', 42)
-
-
-class ForwardRefTests(BaseTestCase):
-
-    def test_forwardref_instance_type_error(self):
-        fr = typing._ForwardRef('int')
-        with self.assertRaises(TypeError):
-            isinstance(42, fr)
-
-    def test_syntax_error(self):
-
-        with self.assertRaises(SyntaxError):
-            Generic['/T']
-
-
-class OverloadTests(BaseTestCase):
-
-    def test_overload_exists(self):
-        from typing import overload
-
-    def test_overload_fails(self):
-        from typing import overload
-
-        with self.assertRaises(RuntimeError):
-
-            @overload
-            def blah():
-                pass
-
-            blah()
-
-    def test_overload_succeeds(self):
-        from typing import overload
-
-        @overload
-        def blah():
-            pass
-
-        def blah():
-            pass
-
-        blah()
-
-
-class CollectionsAbcTests(BaseTestCase):
-
-    def test_hashable(self):
-        self.assertIsInstance(42, typing.Hashable)
-        self.assertNotIsInstance([], typing.Hashable)
-
-    def test_iterable(self):
-        self.assertIsInstance([], typing.Iterable)
-        # Due to ABC caching, the second time takes a separate code
-        # path and could fail.  So call this a few times.
-        self.assertIsInstance([], typing.Iterable)
-        self.assertIsInstance([], typing.Iterable)
-        self.assertNotIsInstance(42, typing.Iterable)
-        # Just in case, also test issubclass() a few times.
-        self.assertIsSubclass(list, typing.Iterable)
-        self.assertIsSubclass(list, typing.Iterable)
-
-    def test_iterator(self):
-        it = iter([])
-        self.assertIsInstance(it, typing.Iterator)
-        self.assertNotIsInstance(42, typing.Iterator)
-
-    def test_sized(self):
-        self.assertIsInstance([], typing.Sized)
-        self.assertNotIsInstance(42, typing.Sized)
-
-    def test_container(self):
-        self.assertIsInstance([], typing.Container)
-        self.assertNotIsInstance(42, typing.Container)
-
-    def test_abstractset(self):
-        self.assertIsInstance(set(), typing.AbstractSet)
-        self.assertNotIsInstance(42, typing.AbstractSet)
-
-    def test_mutableset(self):
-        self.assertIsInstance(set(), typing.MutableSet)
-        self.assertNotIsInstance(frozenset(), typing.MutableSet)
-
-    def test_mapping(self):
-        self.assertIsInstance({}, typing.Mapping)
-        self.assertNotIsInstance(42, typing.Mapping)
-
-    def test_mutablemapping(self):
-        self.assertIsInstance({}, typing.MutableMapping)
-        self.assertNotIsInstance(42, typing.MutableMapping)
-
-    def test_sequence(self):
-        self.assertIsInstance([], typing.Sequence)
-        self.assertNotIsInstance(42, typing.Sequence)
-
-    def test_mutablesequence(self):
-        self.assertIsInstance([], typing.MutableSequence)
-        self.assertNotIsInstance((), typing.MutableSequence)
-
-    def test_bytestring(self):
-        self.assertIsInstance(b'', typing.ByteString)
-        self.assertIsInstance(bytearray(b''), typing.ByteString)
-
-    def test_list(self):
-        self.assertIsSubclass(list, typing.List)
-
-    def test_set(self):
-        self.assertIsSubclass(set, typing.Set)
-        self.assertNotIsSubclass(frozenset, typing.Set)
-
-    def test_frozenset(self):
-        self.assertIsSubclass(frozenset, typing.FrozenSet)
-        self.assertNotIsSubclass(set, typing.FrozenSet)
-
-    def test_dict(self):
-        self.assertIsSubclass(dict, typing.Dict)
-
-    def test_no_list_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.List()
-        with self.assertRaises(TypeError):
-            typing.List[T]()
-        with self.assertRaises(TypeError):
-            typing.List[int]()
-
-    def test_list_subclass(self):
-
-        class MyList(typing.List[int]):
-            pass
-
-        a = MyList()
-        self.assertIsInstance(a, MyList)
-        self.assertIsInstance(a, typing.Sequence)
-
-        self.assertIsSubclass(MyList, list)
-        self.assertNotIsSubclass(list, MyList)
-
-    def test_no_dict_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.Dict()
-        with self.assertRaises(TypeError):
-            typing.Dict[KT, VT]()
-        with self.assertRaises(TypeError):
-            typing.Dict[str, int]()
-
-    def test_dict_subclass(self):
-
-        class MyDict(typing.Dict[str, int]):
-            pass
-
-        d = MyDict()
-        self.assertIsInstance(d, MyDict)
-        self.assertIsInstance(d, typing.MutableMapping)
-
-        self.assertIsSubclass(MyDict, dict)
-        self.assertNotIsSubclass(dict, MyDict)
-
-    def test_no_defaultdict_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.DefaultDict()
-        with self.assertRaises(TypeError):
-            typing.DefaultDict[KT, VT]()
-        with self.assertRaises(TypeError):
-            typing.DefaultDict[str, int]()
-
-    def test_defaultdict_subclass(self):
-
-        class MyDefDict(typing.DefaultDict[str, int]):
-            pass
-
-        dd = MyDefDict()
-        self.assertIsInstance(dd, MyDefDict)
-
-        self.assertIsSubclass(MyDefDict, collections.defaultdict)
-        self.assertNotIsSubclass(collections.defaultdict, MyDefDict)
-
-    def test_no_set_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.Set()
-        with self.assertRaises(TypeError):
-            typing.Set[T]()
-        with self.assertRaises(TypeError):
-            typing.Set[int]()
-
-    def test_set_subclass_instantiation(self):
-
-        class MySet(typing.Set[int]):
-            pass
-
-        d = MySet()
-        self.assertIsInstance(d, MySet)
-
-    def test_no_frozenset_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.FrozenSet()
-        with self.assertRaises(TypeError):
-            typing.FrozenSet[T]()
-        with self.assertRaises(TypeError):
-            typing.FrozenSet[int]()
-
-    def test_frozenset_subclass_instantiation(self):
-
-        class MyFrozenSet(typing.FrozenSet[int]):
-            pass
-
-        d = MyFrozenSet()
-        self.assertIsInstance(d, MyFrozenSet)
-
-    def test_no_tuple_instantiation(self):
-        with self.assertRaises(TypeError):
-            Tuple()
-        with self.assertRaises(TypeError):
-            Tuple[T]()
-        with self.assertRaises(TypeError):
-            Tuple[int]()
-
-    def test_generator(self):
-        def foo():
-            yield 42
-        g = foo()
-        self.assertIsSubclass(type(g), typing.Generator)
-
-    def test_no_generator_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.Generator()
-        with self.assertRaises(TypeError):
-            typing.Generator[T, T, T]()
-        with self.assertRaises(TypeError):
-            typing.Generator[int, int, int]()
-
-    def test_subclassing(self):
-
-        class MMA(typing.MutableMapping):
-            pass
-
-        with self.assertRaises(TypeError):  # It's abstract
-            MMA()
-
-        class MMC(MMA):
-            def __getitem__(self, k):
-                return None
-            def __setitem__(self, k, v):
-                pass
-            def __delitem__(self, k):
-                pass
-            def __iter__(self):
-                return iter(())
-            def __len__(self):
-                return 0
-
-        self.assertEqual(len(MMC()), 0)
-        assert callable(MMC.update)
-        self.assertIsInstance(MMC(), typing.Mapping)
-
-        class MMB(typing.MutableMapping[KT, VT]):
-            def __getitem__(self, k):
-                return None
-            def __setitem__(self, k, v):
-                pass
-            def __delitem__(self, k):
-                pass
-            def __iter__(self):
-                return iter(())
-            def __len__(self):
-                return 0
-
-        self.assertEqual(len(MMB()), 0)
-        self.assertEqual(len(MMB[str, str]()), 0)
-        self.assertEqual(len(MMB[KT, VT]()), 0)
-
-        self.assertNotIsSubclass(dict, MMA)
-        self.assertNotIsSubclass(dict, MMB)
-
-        self.assertIsSubclass(MMA, typing.Mapping)
-        self.assertIsSubclass(MMB, typing.Mapping)
-        self.assertIsSubclass(MMC, typing.Mapping)
-
-        self.assertIsInstance(MMB[KT, VT](), typing.Mapping)
-        self.assertIsInstance(MMB[KT, VT](), collections.Mapping)
-
-        self.assertIsSubclass(MMA, collections.Mapping)
-        self.assertIsSubclass(MMB, collections.Mapping)
-        self.assertIsSubclass(MMC, collections.Mapping)
-
-        self.assertIsSubclass(MMB[str, str], typing.Mapping)
-        self.assertIsSubclass(MMC, MMA)
-
-        class I(typing.Iterable): pass
-        self.assertNotIsSubclass(list, I)
-
-        class G(typing.Generator[int, int, int]): pass
-        def g(): yield 0
-        self.assertIsSubclass(G, typing.Generator)
-        self.assertIsSubclass(G, typing.Iterable)
-        if hasattr(collections, 'Generator'):
-            self.assertIsSubclass(G, collections.Generator)
-        self.assertIsSubclass(G, collections.Iterable)
-        self.assertNotIsSubclass(type(g), G)
-
-    def test_subclassing_subclasshook(self):
-
-        class Base(typing.Iterable):
-            @classmethod
-            def __subclasshook__(cls, other):
-                if other.__name__ == 'Foo':
-                    return True
-                else:
-                    return False
-
-        class C(Base): pass
-        class Foo: pass
-        class Bar: pass
-        self.assertIsSubclass(Foo, Base)
-        self.assertIsSubclass(Foo, C)
-        self.assertNotIsSubclass(Bar, C)
-
-    def test_subclassing_register(self):
-
-        class A(typing.Container): pass
-        class B(A): pass
-
-        class C: pass
-        A.register(C)
-        self.assertIsSubclass(C, A)
-        self.assertNotIsSubclass(C, B)
-
-        class D: pass
-        B.register(D)
-        self.assertIsSubclass(D, A)
-        self.assertIsSubclass(D, B)
-
-        class M(): pass
-        collections.MutableMapping.register(M)
-        self.assertIsSubclass(M, typing.Mapping)
-
-    def test_collections_as_base(self):
-
-        class M(collections.Mapping): pass
-        self.assertIsSubclass(M, typing.Mapping)
-        self.assertIsSubclass(M, typing.Iterable)
-
-        class S(collections.MutableSequence): pass
-        self.assertIsSubclass(S, typing.MutableSequence)
-        self.assertIsSubclass(S, typing.Iterable)
-
-        class I(collections.Iterable): pass
-        self.assertIsSubclass(I, typing.Iterable)
-
-        class A(collections.Mapping): pass
-        class B: pass
-        A.register(B)
-        self.assertIsSubclass(B, typing.Mapping)
-
-class TypeTests(BaseTestCase):
-
-    def test_type_basic(self):
-
-        class User(object): pass
-        class BasicUser(User): pass
-        class ProUser(User): pass
-
-        def new_user(user_class):
-            # type: (Type[User]) -> User
-            return user_class()
-
-        joe = new_user(BasicUser)
-
-    def test_type_typevar(self):
-
-        class User(object): pass
-        class BasicUser(User): pass
-        class ProUser(User): pass
-
-        global U
-        U = TypeVar('U', bound=User)
-
-        def new_user(user_class):
-            # type: (Type[U]) -> U
-            return user_class()
-
-        joe = new_user(BasicUser)
-
-    def test_type_optional(self):
-        A = Optional[Type[BaseException]]
-
-        def foo(a):
-            # type: (A) -> Optional[BaseException]
-            if a is None:
-                return None
-            else:
-                return a()
-
-        assert isinstance(foo(KeyboardInterrupt), KeyboardInterrupt)
-        assert foo(None) is None
-
-
-class NewTypeTests(BaseTestCase):
-
-    def test_basic(self):
-        UserId = NewType('UserId', int)
-        UserName = NewType('UserName', str)
-        self.assertIsInstance(UserId(5), int)
-        self.assertIsInstance(UserName('Joe'), type('Joe'))
-        self.assertEqual(UserId(5) + 1, 6)
-
-    def test_errors(self):
-        UserId = NewType('UserId', int)
-        UserName = NewType('UserName', str)
-        with self.assertRaises(TypeError):
-            issubclass(UserId, int)
-        with self.assertRaises(TypeError):
-            class D(UserName):
-                pass
-
-
-class NamedTupleTests(BaseTestCase):
-
-    def test_basics(self):
-        Emp = NamedTuple('Emp', [('name', str), ('id', int)])
-        self.assertIsSubclass(Emp, tuple)
-        joe = Emp('Joe', 42)
-        jim = Emp(name='Jim', id=1)
-        self.assertIsInstance(joe, Emp)
-        self.assertIsInstance(joe, tuple)
-        self.assertEqual(joe.name, 'Joe')
-        self.assertEqual(joe.id, 42)
-        self.assertEqual(jim.name, 'Jim')
-        self.assertEqual(jim.id, 1)
-        self.assertEqual(Emp.__name__, 'Emp')
-        self.assertEqual(Emp._fields, ('name', 'id'))
-        self.assertEqual(Emp._field_types, dict(name=str, id=int))
-
-    def test_pickle(self):
-        global Emp  # pickle wants to reference the class by name
-        Emp = NamedTuple('Emp', [('name', str), ('id', int)])
-        jane = Emp('jane', 37)
-        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
-            z = pickle.dumps(jane, proto)
-            jane2 = pickle.loads(z)
-            self.assertEqual(jane2, jane)
-
-
-class IOTests(BaseTestCase):
-
-    def test_io_submodule(self):
-        from typing.io import IO, TextIO, BinaryIO, __all__, __name__
-        self.assertIs(IO, typing.IO)
-        self.assertIs(TextIO, typing.TextIO)
-        self.assertIs(BinaryIO, typing.BinaryIO)
-        self.assertEqual(set(__all__), set(['IO', 'TextIO', 'BinaryIO']))
-        self.assertEqual(__name__, 'typing.io')
-
-
-class RETests(BaseTestCase):
-    # Much of this is really testing _TypeAlias.
-
-    def test_basics(self):
-        pat = re.compile('[a-z]+', re.I)
-        self.assertIsSubclass(pat.__class__, Pattern)
-        self.assertIsSubclass(type(pat), Pattern)
-        self.assertIsInstance(pat, Pattern)
-
-        mat = pat.search('12345abcde.....')
-        self.assertIsSubclass(mat.__class__, Match)
-        self.assertIsSubclass(type(mat), Match)
-        self.assertIsInstance(mat, Match)
-
-        # these should just work
-        p = Pattern[Union[str, bytes]]
-        m = Match[Union[bytes, str]]
-
-    def test_errors(self):
-        with self.assertRaises(TypeError):
-            # Doesn't fit AnyStr.
-            Pattern[int]
-        with self.assertRaises(TypeError):
-            # Can't change type vars?
-            Match[T]
-        m = Match[Union[str, bytes]]
-        with self.assertRaises(TypeError):
-            # Too complicated?
-            m[str]
-        with self.assertRaises(TypeError):
-            # We don't support isinstance().
-            isinstance(42, Pattern[str])
-
-    def test_repr(self):
-        self.assertEqual(repr(Pattern), 'Pattern[~AnyStr]')
-        self.assertEqual(repr(Pattern[unicode]), 'Pattern[unicode]')
-        self.assertEqual(repr(Pattern[str]), 'Pattern[str]')
-        self.assertEqual(repr(Match), 'Match[~AnyStr]')
-        self.assertEqual(repr(Match[unicode]), 'Match[unicode]')
-        self.assertEqual(repr(Match[str]), 'Match[str]')
-
-    def test_re_submodule(self):
-        from typing.re import Match, Pattern, __all__, __name__
-        self.assertIs(Match, typing.Match)
-        self.assertIs(Pattern, typing.Pattern)
-        self.assertEqual(set(__all__), set(['Match', 'Pattern']))
-        self.assertEqual(__name__, 'typing.re')
-
-    def test_cannot_subclass(self):
-        with self.assertRaises(TypeError) as ex:
-
-            class A(typing.Match):
-                pass
-
-        self.assertEqual(str(ex.exception),
-                         "Cannot subclass typing._TypeAlias")
-
-
-class AllTests(BaseTestCase):
-    """Tests for __all__."""
-
-    def test_all(self):
-        from typing import __all__ as a
-        # Just spot-check the first and last of every category.
-        self.assertIn('AbstractSet', a)
-        self.assertIn('ValuesView', a)
-        self.assertIn('cast', a)
-        self.assertIn('overload', a)
-        # Check that io and re are not exported.
-        self.assertNotIn('io', a)
-        self.assertNotIn('re', a)
-        # Spot-check that stdlib modules aren't exported.
-        self.assertNotIn('os', a)
-        self.assertNotIn('sys', a)
-        # Check that Text is defined.
-        self.assertIn('Text', a)
-
-    def test_respect_no_type_check(self):
-        @typing.no_type_check
-        class NoTpCheck(object):
-            class Inn(object):
-                def __init__(self, x): pass
-                    # type: (this is not actualy a type) -> None
-        self.assertTrue(NoTpCheck.__no_type_check__)
-        self.assertTrue(NoTpCheck.Inn.__init__.__no_type_check__)
-
-    def test_get_type_hints_dummy(self):
-
-        def foo(x):
-            # type: (int) -> int
-            return x + 1
-
-        self.assertIsNone(typing.get_type_hints(foo))
-
-
-if __name__ == '__main__':
-    main()
diff --git a/lib-typing/2.7/typing.py b/lib-typing/2.7/typing.py
deleted file mode 100644
index 5627697..0000000
--- a/lib-typing/2.7/typing.py
+++ /dev/null
@@ -1,2016 +0,0 @@
-from __future__ import absolute_import, unicode_literals
-
-import abc
-from abc import abstractmethod, abstractproperty
-import collections
-import functools
-import re as stdlib_re  # Avoid confusion with the re we export.
-import sys
-import types
-try:
-    import collections.abc as collections_abc
-except ImportError:
-    import collections as collections_abc  # Fallback for PY3.2.
-
-
-# Please keep __all__ alphabetized within each category.
-__all__ = [
-    # Super-special typing primitives.
-    'Any',
-    'Callable',
-    'ClassVar',
-    'Generic',
-    'Optional',
-    'Tuple',
-    'Type',
-    'TypeVar',
-    'Union',
-
-    # ABCs (from collections.abc).
-    'AbstractSet',  # collections.abc.Set.
-    'ByteString',
-    'Container',
-    'Hashable',
-    'ItemsView',
-    'Iterable',
-    'Iterator',
-    'KeysView',
-    'Mapping',
-    'MappingView',
-    'MutableMapping',
-    'MutableSequence',
-    'MutableSet',
-    'Sequence',
-    'Sized',
-    'ValuesView',
-
-    # Structural checks, a.k.a. protocols.
-    'Reversible',
-    'SupportsAbs',
-    'SupportsFloat',
-    'SupportsInt',
-
-    # Concrete collection types.
-    'Dict',
-    'DefaultDict',
-    'List',
-    'Set',
-    'FrozenSet',
-    'NamedTuple',  # Not really a type.
-    'Generator',
-
-    # One-off things.
-    'AnyStr',
-    'cast',
-    'get_type_hints',
-    'NewType',
-    'no_type_check',
-    'no_type_check_decorator',
-    'overload',
-    'Text',
-    'TYPE_CHECKING',
-]
-
-# The pseudo-submodules 're' and 'io' are part of the public
-# namespace, but excluded from __all__ because they might stomp on
-# legitimate imports of those modules.
-
-
-def _qualname(x):
-    if sys.version_info[:2] >= (3, 3):
-        return x.__qualname__
-    else:
-        # Fall back to just name.
-        return x.__name__
-
-def _trim_name(nm):
-    if nm.startswith('_') and nm not in ('_TypeAlias',
-                    '_ForwardRef', '_TypingBase', '_FinalTypingBase'):
-        nm = nm[1:]
-    return nm
-
-
-class TypingMeta(type):
-    """Metaclass for most types defined in typing module
-    (not a part of public API).
-
-    This also defines a dummy constructor (all the work for most typing
-    constructs is done in __new__) and a nicer repr().
-    """
-
-    _is_protocol = False
-
-    def __new__(cls, name, bases, namespace):
-        return super(TypingMeta, cls).__new__(cls, str(name), bases, namespace)
-
-    @classmethod
-    def assert_no_subclassing(cls, bases):
-        for base in bases:
-            if isinstance(base, cls):
-                raise TypeError("Cannot subclass %s" %
-                                (', '.join(map(_type_repr, bases)) or '()'))
-
-    def __init__(self, *args, **kwds):
-        pass
-
-    def _eval_type(self, globalns, localns):
-        """Override this in subclasses to interpret forward references.
-
-        For example, List['C'] is internally stored as
-        List[_ForwardRef('C')], which should evaluate to List[C],
-        where C is an object found in globalns or localns (searching
-        localns first, of course).
-        """
-        return self
-
-    def _get_type_vars(self, tvars):
-        pass
-
-    def __repr__(self):
-        qname = _trim_name(_qualname(self))
-        return '%s.%s' % (self.__module__, qname)
-
-
-class _TypingBase(object):
-    """Internal indicator of special typing constructs."""
-    __metaclass__ = TypingMeta
-    __slots__ = ()
-
-    def __init__(self, *args, **kwds):
-        pass
-
-    def __new__(cls, *args, **kwds):
-        """Constructor.
-
-        This only exists to give a better error message in case
-        someone tries to subclass a special typing object (not a good idea).
-        """
-        if (len(args) == 3 and
-                isinstance(args[0], str) and
-                isinstance(args[1], tuple)):
-            # Close enough.
-            raise TypeError("Cannot subclass %r" % cls)
-        return super(_TypingBase, cls).__new__(cls)
-
-    # Things that are not classes also need these.
-    def _eval_type(self, globalns, localns):
-        return self
-
-    def _get_type_vars(self, tvars):
-        pass
-
-    def __repr__(self):
-        cls = type(self)
-        qname = _trim_name(_qualname(cls))
-        return '%s.%s' % (cls.__module__, qname)
-
-    def __call__(self, *args, **kwds):
-        raise TypeError("Cannot instantiate %r" % type(self))
-
-
-class _FinalTypingBase(_TypingBase):
-    """Internal mix-in class to prevent instantiation.
-
-    Prevents instantiation unless _root=True is given in class call.
-    It is used to create pseudo-singleton instances Any, Union, Optional, etc.
-    """
-
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        self = super(_FinalTypingBase, cls).__new__(cls, *args, **kwds)
-        if '_root' in kwds and kwds['_root'] is True:
-            return self
-        raise TypeError("Cannot instantiate %r" % cls)
-
-    def __reduce__(self):
-        return _trim_name(type(self).__name__)
-
-
-class _ForwardRef(_TypingBase):
-    """Internal wrapper to hold a forward reference."""
-
-    __slots__ = ('__forward_arg__', '__forward_code__',
-                 '__forward_evaluated__', '__forward_value__')
-
-    def __init__(self, arg):
-        super(_ForwardRef, self).__init__(arg)
-        if not isinstance(arg, basestring):
-            raise TypeError('Forward reference must be a string -- got %r' % (arg,))
-        try:
-            code = compile(arg, '<string>', 'eval')
-        except SyntaxError:
-            raise SyntaxError('Forward reference must be an expression -- got %r' %
-                              (arg,))
-        self.__forward_arg__ = arg
-        self.__forward_code__ = code
-        self.__forward_evaluated__ = False
-        self.__forward_value__ = None
-
-    def _eval_type(self, globalns, localns):
-        if not self.__forward_evaluated__ or localns is not globalns:
-            if globalns is None and localns is None:
-                globalns = localns = {}
-            elif globalns is None:
-                globalns = localns
-            elif localns is None:
-                localns = globalns
-            self.__forward_value__ = _type_check(
-                eval(self.__forward_code__, globalns, localns),
-                "Forward references must evaluate to types.")
-            self.__forward_evaluated__ = True
-        return self.__forward_value__
-
-    def __instancecheck__(self, obj):
-        raise TypeError("Forward references cannot be used with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        raise TypeError("Forward references cannot be used with issubclass().")
-
-    def __repr__(self):
-        return '_ForwardRef(%r)' % (self.__forward_arg__,)
-
-
-class _TypeAlias(_TypingBase):
-    """Internal helper class for defining generic variants of concrete types.
-
-    Note that this is not a type; let's call it a pseudo-type.  It cannot
-    be used in instance and subclass checks in parameterized form, i.e.
-    ``isinstance(42, Match[str])`` raises ``TypeError`` instead of returning
-    ``False``.
-    """
-
-    __slots__ = ('name', 'type_var', 'impl_type', 'type_checker')
-
-
-    def __init__(self, name, type_var, impl_type, type_checker):
-        """Initializer.
-
-        Args:
-            name: The name, e.g. 'Pattern'.
-            type_var: The type parameter, e.g. AnyStr, or the
-                specific type, e.g. str.
-            impl_type: The implementation type.
-            type_checker: Function that takes an impl_type instance.
-                and returns a value that should be a type_var instance.
-        """
-        assert isinstance(name, basestring), repr(name)
-        assert isinstance(impl_type, type), repr(impl_type)
-        assert not isinstance(impl_type, TypingMeta), repr(impl_type)
-        assert isinstance(type_var, (type, _TypingBase)), repr(type_var)
-        self.name = name
-        self.type_var = type_var
-        self.impl_type = impl_type
-        self.type_checker = type_checker
-
-    def __repr__(self):
-        return "%s[%s]" % (self.name, _type_repr(self.type_var))
-
-    def __getitem__(self, parameter):
-        if not isinstance(self.type_var, TypeVar):
-            raise TypeError("%s cannot be further parameterized." % self)
-        if self.type_var.__constraints__ and isinstance(parameter, type):
-            if not issubclass(parameter, self.type_var.__constraints__):
-                raise TypeError("%s is not a valid substitution for %s." %
-                                (parameter, self.type_var))
-        if isinstance(parameter, TypeVar) and parameter is not self.type_var:
-            raise TypeError("%s cannot be re-parameterized." % self)
-        return self.__class__(self.name, parameter,
-                              self.impl_type, self.type_checker)
-
-    def __instancecheck__(self, obj):
-        if not isinstance(self.type_var, TypeVar):
-            raise TypeError("Parameterized type aliases cannot be used "
-                            "with isinstance().")
-        return isinstance(obj, self.impl_type)
-
-    def __subclasscheck__(self, cls):
-        if not isinstance(self.type_var, TypeVar):
-            raise TypeError("Parameterized type aliases cannot be used "
-                            "with issubclass().")
-        return issubclass(cls, self.impl_type)
-
-
-def _get_type_vars(types, tvars):
-    for t in types:
-        if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
-            t._get_type_vars(tvars)
-
-
-def _type_vars(types):
-    tvars = []
-    _get_type_vars(types, tvars)
-    return tuple(tvars)
-
-
-def _eval_type(t, globalns, localns):
-    if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
-        return t._eval_type(globalns, localns)
-    return t
-
-
-def _type_check(arg, msg):
-    """Check that the argument is a type, and return it (internal helper).
-
-    As a special case, accept None and return type(None) instead.
-    Also, _TypeAlias instances (e.g. Match, Pattern) are acceptable.
-
-    The msg argument is a human-readable error message, e.g.
-
-        "Union[arg, ...]: arg should be a type."
-
-    We append the repr() of the actual value (truncated to 100 chars).
-    """
-    if arg is None:
-        return type(None)
-    if isinstance(arg, basestring):
-        arg = _ForwardRef(arg)
-    if (isinstance(arg, _TypingBase) and type(arg).__name__ == '_ClassVar' or
-        not isinstance(arg, (type, _TypingBase)) and not callable(arg)):
-        raise TypeError(msg + " Got %.100r." % (arg,))
-    # Bare Union etc. are not valid as type arguments
-    if (type(arg).__name__ in ('_Union', '_Optional')
-        and not getattr(arg, '__origin__', None)
-        or isinstance(arg, TypingMeta) and _gorg(arg) in (Generic, _Protocol)):
-        raise TypeError("Plain %s is not valid as type argument" % arg)
-    return arg
-
-
-def _type_repr(obj):
-    """Return the repr() of an object, special-casing types (internal helper).
-
-    If obj is a type, we return a shorter version than the default
-    type.__repr__, based on the module and qualified name, which is
-    typically enough to uniquely identify a type.  For everything
-    else, we fall back on repr(obj).
-    """
-    if isinstance(obj, type) and not isinstance(obj, TypingMeta):
-        if obj.__module__ == '__builtin__':
-            return _qualname(obj)
-        return '%s.%s' % (obj.__module__, _qualname(obj))
-    if obj is Ellipsis:
-        return('...')
-    if isinstance(obj, types.FunctionType):
-        return obj.__name__
-    return repr(obj)
-
-
-class ClassVarMeta(TypingMeta):
-    """Metaclass for _ClassVar"""
-
-    def __new__(cls, name, bases, namespace):
-        cls.assert_no_subclassing(bases)
-        self = super(ClassVarMeta, cls).__new__(cls, name, bases, namespace)
-        return self
-
-
-class _ClassVar(_FinalTypingBase):
-    """Special type construct to mark class variables.
-
-    An annotation wrapped in ClassVar indicates that a given
-    attribute is intended to be used as a class variable and
-    should not be set on instances of that class. Usage::
-
-      class Starship:
-          stats = {}  # type: ClassVar[Dict[str, int]] # class variable
-          damage = 10 # type: int                      # instance variable
-
-    ClassVar accepts only types and cannot be further subscribed.
-
-    Note that ClassVar is not a class itself, and should not
-    be used with isinstance() or issubclass().
-    """
-
-    __metaclass__ = ClassVarMeta
-    __slots__ = ('__type__',)
-
-    def __init__(self, tp=None, _root=False):
-        self.__type__ = tp
-
-    def __getitem__(self, item):
-        cls = type(self)
-        if self.__type__ is None:
-            return cls(_type_check(item,
-                       '{} accepts only types.'.format(cls.__name__[1:])),
-                       _root=True)
-        raise TypeError('{} cannot be further subscripted'
-                        .format(cls.__name__[1:]))
-
-    def _eval_type(self, globalns, localns):
-        return type(self)(_eval_type(self.__type__, globalns, localns),
-                          _root=True)
-
-    def __repr__(self):
-        r = super(_ClassVar, self).__repr__()
-        if self.__type__ is not None:
-            r += '[{}]'.format(_type_repr(self.__type__))
-        return r
-
-    def __hash__(self):
-        return hash((type(self).__name__, self.__type__))
-
-    def __eq__(self, other):
-        if not isinstance(other, _ClassVar):
-            return NotImplemented
-        if self.__type__ is not None:
-            return self.__type__ == other.__type__
-        return self is other
-
-ClassVar = _ClassVar(_root=True)
-
-
-class AnyMeta(TypingMeta):
-    """Metaclass for Any."""
-
-    def __new__(cls, name, bases, namespace):
-        cls.assert_no_subclassing(bases)
-        self = super(AnyMeta, cls).__new__(cls, name, bases, namespace)
-        return self
-
-
-class _Any(_FinalTypingBase):
-    """Special type indicating an unconstrained type.
-
-    - Any is compatible with every type.
-    - Any assumed to have all methods.
-    - All values assumed to be instances of Any.
-
-    Note that all the above statements are true from the point of view of
-    static type checkers. At runtime, Any should not be used with instance
-    or class checks.
-    """
-    __metaclass__ = AnyMeta
-    __slots__ = ()
-
-    def __instancecheck__(self, obj):
-        raise TypeError("Any cannot be used with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        raise TypeError("Any cannot be used with issubclass().")
-
-
-Any = _Any(_root=True)
-
-
-class TypeVarMeta(TypingMeta):
-    def __new__(cls, name, bases, namespace):
-        cls.assert_no_subclassing(bases)
-        return super(TypeVarMeta, cls).__new__(cls, name, bases, namespace)
-
-
-class TypeVar(_TypingBase):
-    """Type variable.
-
-    Usage::
-
-      T = TypeVar('T')  # Can be anything
-      A = TypeVar('A', str, bytes)  # Must be str or bytes
-
-    Type variables exist primarily for the benefit of static type
-    checkers.  They serve as the parameters for generic types as well
-    as for generic function definitions.  See class Generic for more
-    information on generic types.  Generic functions work as follows:
-
-      def repeat(x: T, n: int) -> List[T]:
-          '''Return a list containing n references to x.'''
-          return [x]*n
-
-      def longest(x: A, y: A) -> A:
-          '''Return the longest of two strings.'''
-          return x if len(x) >= len(y) else y
-
-    The latter example's signature is essentially the overloading
-    of (str, str) -> str and (bytes, bytes) -> bytes.  Also note
-    that if the arguments are instances of some subclass of str,
-    the return type is still plain str.
-
-    At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
-
-    Type variables defined with covariant=True or contravariant=True
-    can be used do declare covariant or contravariant generic types.
-    See PEP 484 for more details. By default generic types are invariant
-    in all type variables.
-
-    Type variables can be introspected. e.g.:
-
-      T.__name__ == 'T'
-      T.__constraints__ == ()
-      T.__covariant__ == False
-      T.__contravariant__ = False
-      A.__constraints__ == (str, bytes)
-    """
-
-    __metaclass__ = TypeVarMeta
-    __slots__ = ('__name__', '__bound__', '__constraints__',
-                 '__covariant__', '__contravariant__')
-
-    def __init__(self, name, *constraints, **kwargs):
-        super(TypeVar, self).__init__(name, *constraints, **kwargs)
-        bound = kwargs.get('bound', None)
-        covariant = kwargs.get('covariant', False)
-        contravariant = kwargs.get('contravariant', False)
-        self.__name__ = name
-        if covariant and contravariant:
-            raise ValueError("Bivariant types are not supported.")
-        self.__covariant__ = bool(covariant)
-        self.__contravariant__ = bool(contravariant)
-        if constraints and bound is not None:
-            raise TypeError("Constraints cannot be combined with bound=...")
-        if constraints and len(constraints) == 1:
-            raise TypeError("A single constraint is not allowed")
-        msg = "TypeVar(name, constraint, ...): constraints must be types."
-        self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
-        if bound:
-            self.__bound__ = _type_check(bound, "Bound must be a type.")
-        else:
-            self.__bound__ = None
-
-    def _get_type_vars(self, tvars):
-        if self not in tvars:
-            tvars.append(self)
-
-    def __repr__(self):
-        if self.__covariant__:
-            prefix = '+'
-        elif self.__contravariant__:
-            prefix = '-'
-        else:
-            prefix = '~'
-        return prefix + self.__name__
-
-    def __instancecheck__(self, instance):
-        raise TypeError("Type variables cannot be used with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        raise TypeError("Type variables cannot be used with issubclass().")
-
-
-# Some unconstrained type variables.  These are used by the container types.
-# (These are not for export.)
-T = TypeVar('T')  # Any type.
-KT = TypeVar('KT')  # Key type.
-VT = TypeVar('VT')  # Value type.
-T_co = TypeVar('T_co', covariant=True)  # Any type covariant containers.
-V_co = TypeVar('V_co', covariant=True)  # Any type covariant containers.
-VT_co = TypeVar('VT_co', covariant=True)  # Value type covariant containers.
-T_contra = TypeVar('T_contra', contravariant=True)  # Ditto contravariant.
-
-# A useful type variable with constraints.  This represents string types.
-# (This one *is* for export!)
-AnyStr = TypeVar('AnyStr', bytes, unicode)
-
-
-def _replace_arg(arg, tvars, args):
-    """An internal helper function: replace arg if it is a type variable
-    found in tvars with corresponding substitution from args or
-    with corresponding substitution sub-tree if arg is a generic type.
-    """
-
-    if tvars is None:
-        tvars = []
-    if hasattr(arg, '_subs_tree'):
-        return arg._subs_tree(tvars, args)
-    if isinstance(arg, TypeVar):
-        for i, tvar in enumerate(tvars):
-            if arg == tvar:
-                return args[i]
-    return arg
-
-
-def _subs_tree(cls, tvars=None, args=None):
-    """An internal helper function: calculate substitution tree
-    for generic cls after replacing its type parameters with
-    substitutions in tvars -> args (if any).
-    Repeat the same following __origin__'s.
-
-    Return a list of arguments with all possible substitutions
-    performed. Arguments that are generic classes themselves are represented
-    as tuples (so that no new classes are created by this function).
-    For example: _subs_tree(List[Tuple[int, T]][str]) == [(Tuple, int, str)]
-    """
-
-    if cls.__origin__ is None:
-        return cls
-    # Make of chain of origins (i.e. cls -> cls.__origin__)
-    current = cls.__origin__
-    orig_chain = []
-    while current.__origin__ is not None:
-        orig_chain.append(current)
-        current = current.__origin__
-    # Replace type variables in __args__ if asked ...
-    tree_args = []
-    for arg in cls.__args__:
-        tree_args.append(_replace_arg(arg, tvars, args))
-    # ... then continue replacing down the origin chain.
-    for ocls in orig_chain:
-        new_tree_args = []
-        for i, arg in enumerate(ocls.__args__):
-            new_tree_args.append(_replace_arg(arg, ocls.__parameters__, tree_args))
-        tree_args = new_tree_args
-    return tree_args
-
-
-def _remove_dups_flatten(parameters):
-    """An internal helper for Union creation and substitution: flatten Union's
-    among parameters, then remove duplicates and strict subclasses.
-    """
-
-    # Flatten out Union[Union[...], ...].
-    params = []
-    for p in parameters:
-        if isinstance(p, _Union) and p.__origin__ is Union:
-            params.extend(p.__args__)
-        elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
-            params.extend(p[1:])
-        else:
-            params.append(p)
-    # Weed out strict duplicates, preserving the first of each occurrence.
-    all_params = set(params)
-    if len(all_params) < len(params):
-        new_params = []
-        for t in params:
-            if t in all_params:
-                new_params.append(t)
-                all_params.remove(t)
-        params = new_params
-        assert not all_params, all_params
-    # Weed out subclasses.
-    # E.g. Union[int, Employee, Manager] == Union[int, Employee].
-    # If object is present it will be sole survivor among proper classes.
-    # Never discard type variables.
-    # (In particular, Union[str, AnyStr] != AnyStr.)
-    all_params = set(params)
-    for t1 in params:
-        if not isinstance(t1, type):
-            continue
-        if any(isinstance(t2, type) and issubclass(t1, t2)
-               for t2 in all_params - {t1}
-               if not (isinstance(t2, GenericMeta) and
-                       t2.__origin__ is not None)):
-            all_params.remove(t1)
-    return tuple(t for t in params if t in all_params)
-
-
-def _check_generic(cls, parameters):
-    # Check correct count for parameters of a generic cls (internal helper).
-    if not cls.__parameters__:
-        raise TypeError("%s is not a generic class" % repr(cls))
-    alen = len(parameters)
-    elen = len(cls.__parameters__)
-    if alen != elen:
-        raise TypeError("Too %s parameters for %s; actual %s, expected %s" %
-                        ("many" if alen > elen else "few", repr(cls), alen, elen))
-
-
-_cleanups = []
-
-
-def _tp_cache(func):
-    maxsize = 128
-    cache = {}
-    _cleanups.append(cache.clear)
-
-    @functools.wraps(func)
-    def inner(*args):
-        key = args
-        try:
-            return cache[key]
-        except TypeError:
-            # Assume it's an unhashable argument.
-            return func(*args)
-        except KeyError:
-            value = func(*args)
-            if len(cache) >= maxsize:
-                # If the cache grows too much, just start over.
-                cache.clear()
-            cache[key] = value
-            return value
-
-    return inner
-
-
-class UnionMeta(TypingMeta):
-    """Metaclass for Union."""
-
-    def __new__(cls, name, bases, namespace):
-        cls.assert_no_subclassing(bases)
-        return super(UnionMeta, cls).__new__(cls, name, bases, namespace)
-
-
-class _Union(_FinalTypingBase):
-    """Union type; Union[X, Y] means either X or Y.
-
-    To define a union, use e.g. Union[int, str].  Details:
-
-    - The arguments must be types and there must be at least one.
-
-    - None as an argument is a special case and is replaced by
-      type(None).
-
-    - Unions of unions are flattened, e.g.::
-
-        Union[Union[int, str], float] == Union[int, str, float]
-
-    - Unions of a single argument vanish, e.g.::
-
-        Union[int] == int  # The constructor actually returns int
-
-    - Redundant arguments are skipped, e.g.::
-
-        Union[int, str, int] == Union[int, str]
-
-    - When comparing unions, the argument order is ignored, e.g.::
-
-        Union[int, str] == Union[str, int]
-
-    - When two arguments have a subclass relationship, the least
-      derived argument is kept, e.g.::
-
-        class Employee: pass
-        class Manager(Employee): pass
-        Union[int, Employee, Manager] == Union[int, Employee]
-        Union[Manager, int, Employee] == Union[int, Employee]
-        Union[Employee, Manager] == Employee
-
-    - Similar for object::
-
-        Union[int, object] == object
-
-    - You cannot subclass or instantiate a union.
-
-    - You can use Optional[X] as a shorthand for Union[X, None].
-    """
-
-    __metaclass__ = UnionMeta
-    __slots__ = ('__parameters__', '__args__', '__origin__', '__tree_hash__')
-
-    def __new__(cls, parameters=None, origin=None, *args, **kwds):
-        self = super(_Union, cls).__new__(cls, parameters, origin, *args, **kwds)
-        if origin is None:
-            self.__parameters__ = None
-            self.__args__ = None
-            self.__origin__ = None
-            self.__tree_hash__ = hash(frozenset(('Union',)))
-            return self
-        if not isinstance(parameters, tuple):
-            raise TypeError("Expected parameters=<tuple>")
-        if origin is Union:
-            parameters = _remove_dups_flatten(parameters)
-            # It's not a union if there's only one type left.
-            if len(parameters) == 1:
-                return parameters[0]
-        self.__parameters__ = _type_vars(parameters)
-        self.__args__ = parameters
-        self.__origin__ = origin
-        # Pre-calculate the __hash__ on instantiation.
-        # This improves speed for complex substitutions.
-        subs_tree = self._subs_tree()
-        if isinstance(subs_tree, tuple):
-            self.__tree_hash__ = hash(frozenset(subs_tree))
-        else:
-            self.__tree_hash__ = hash(subs_tree)
-        return self
-
-    def _eval_type(self, globalns, localns):
-        if self.__args__ is None:
-            return self
-        ev_args = tuple(_eval_type(t, globalns, localns) for t in self.__args__)
-        ev_origin = _eval_type(self.__origin__, globalns, localns)
-        if ev_args == self.__args__ and ev_origin == self.__origin__:
-            # Everything is already evaluated.
-            return self
-        return self.__class__(ev_args, ev_origin, _root=True)
-
-    def _get_type_vars(self, tvars):
-        if self.__origin__ and self.__parameters__:
-            _get_type_vars(self.__parameters__, tvars)
-
-    def __repr__(self):
-        if self.__origin__ is None:
-            return super(_Union, self).__repr__()
-        tree = self._subs_tree()
-        if not isinstance(tree, tuple):
-            return repr(tree)
-        return tree[0]._tree_repr(tree)
-
-    def _tree_repr(self, tree):
-        arg_list = []
-        for arg in tree[1:]:
-            if not isinstance(arg, tuple):
-                arg_list.append(_type_repr(arg))
-            else:
-                arg_list.append(arg[0]._tree_repr(arg))
-        return super(_Union, self).__repr__() + '[%s]' % ', '.join(arg_list)
-
-    @_tp_cache
-    def __getitem__(self, parameters):
-        if parameters == ():
-            raise TypeError("Cannot take a Union of no types.")
-        if not isinstance(parameters, tuple):
-            parameters = (parameters,)
-        if self.__origin__ is None:
-            msg = "Union[arg, ...]: each arg must be a type."
-        else:
-            msg = "Parameters to generic types must be types."
-        parameters = tuple(_type_check(p, msg) for p in parameters)
-        if self is not Union:
-            _check_generic(self, parameters)
-        return self.__class__(parameters, origin=self, _root=True)
-
-    def _subs_tree(self, tvars=None, args=None):
-        if self is Union:
-            return Union  # Nothing to substitute
-        tree_args = _subs_tree(self, tvars, args)
-        tree_args = _remove_dups_flatten(tree_args)
-        if len(tree_args) == 1:
-            return tree_args[0]  # Union of a single type is that type
-        return (Union,) + tree_args
-
-    def __eq__(self, other):
-        if not isinstance(other, _Union):
-            return self._subs_tree() == other
-        return self.__tree_hash__ == other.__tree_hash__
-
-    def __hash__(self):
-        return self.__tree_hash__
-
-    def __instancecheck__(self, obj):
-        raise TypeError("Unions cannot be used with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        raise TypeError("Unions cannot be used with issubclass().")
-
-
-Union = _Union(_root=True)
-
-
-class OptionalMeta(TypingMeta):
-    """Metaclass for Optional."""
-
-    def __new__(cls, name, bases, namespace):
-        cls.assert_no_subclassing(bases)
-        return super(OptionalMeta, cls).__new__(cls, name, bases, namespace)
-
-
-class _Optional(_FinalTypingBase):
-    """Optional type.
-
-    Optional[X] is equivalent to Union[X, None].
-    """
-
-    __metaclass__ = OptionalMeta
-    __slots__ = ()
-
-    @_tp_cache
-    def __getitem__(self, arg):
-        arg = _type_check(arg, "Optional[t] requires a single type.")
-        return Union[arg, type(None)]
-
-
-Optional = _Optional(_root=True)
-
-
-def _gorg(a):
-    """Return the farthest origin of a generic class (internal helper)."""
-    assert isinstance(a, GenericMeta)
-    while a.__origin__ is not None:
-        a = a.__origin__
-    return a
-
-
-def _geqv(a, b):
-    """Return whether two generic classes are equivalent (internal helper).
-
-    The intention is to consider generic class X and any of its
-    parameterized forms (X[T], X[int], etc.) as equivalent.
-
-    However, X is not equivalent to a subclass of X.
-
-    The relation is reflexive, symmetric and transitive.
-    """
-    assert isinstance(a, GenericMeta) and isinstance(b, GenericMeta)
-    # Reduce each to its origin.
-    return _gorg(a) is _gorg(b)
-
-
-def _next_in_mro(cls):
-    """Helper for Generic.__new__.
-
-    Returns the class after the last occurrence of Generic or
-    Generic[...] in cls.__mro__.
-    """
-    next_in_mro = object
-    # Look for the last occurrence of Generic or Generic[...].
-    for i, c in enumerate(cls.__mro__[:-1]):
-        if isinstance(c, GenericMeta) and _gorg(c) is Generic:
-            next_in_mro = cls.__mro__[i+1]
-    return next_in_mro
-
-
-def _valid_for_check(cls):
-    """An internal helper to prohibit isinstance([1], List[str]) etc."""
-    if cls is Generic:
-        raise TypeError("Class %r cannot be used with class "
-                        "or instance checks" % cls)
-    if (cls.__origin__ is not None and
-        sys._getframe(3).f_globals['__name__'] not in ['abc', 'functools']):
-        raise TypeError("Parameterized generics cannot be used with class "
-                        "or instance checks")
-
-
-def _make_subclasshook(cls):
-    """Construct a __subclasshook__ callable that incorporates
-    the associated __extra__ class in subclass checks performed
-    against cls.
-    """
-    if isinstance(cls.__extra__, abc.ABCMeta):
-        # The logic mirrors that of ABCMeta.__subclasscheck__.
-        # Registered classes need not be checked here because
-        # cls and its extra share the same _abc_registry.
-        def __extrahook__(cls, subclass):
-            _valid_for_check(cls)
-            res = cls.__extra__.__subclasshook__(subclass)
-            if res is not NotImplemented:
-                return res
-            if cls.__extra__ in getattr(subclass, '__mro__', ()):
-                return True
-            for scls in cls.__extra__.__subclasses__():
-                if isinstance(scls, GenericMeta):
-                    continue
-                if issubclass(subclass, scls):
-                    return True
-            return NotImplemented
-    else:
-        # For non-ABC extras we'll just call issubclass().
-        def __extrahook__(cls, subclass):
-            _valid_for_check(cls)
-            if cls.__extra__ and issubclass(subclass, cls.__extra__):
-                return True
-            return NotImplemented
-    return classmethod(__extrahook__)
-
-
-class GenericMeta(TypingMeta, abc.ABCMeta):
-    """Metaclass for generic types."""
-
-    def __new__(cls, name, bases, namespace,
-                tvars=None, args=None, origin=None, extra=None, orig_bases=None):
-        if tvars is not None:
-            # Called from __getitem__() below.
-            assert origin is not None
-            assert all(isinstance(t, TypeVar) for t in tvars), tvars
-        else:
-            # Called from class statement.
-            assert tvars is None, tvars
-            assert args is None, args
-            assert origin is None, origin
-
-            # Get the full set of tvars from the bases.
-            tvars = _type_vars(bases)
-            # Look for Generic[T1, ..., Tn].
-            # If found, tvars must be a subset of it.
-            # If not found, tvars is it.
-            # Also check for and reject plain Generic,
-            # and reject multiple Generic[...].
-            gvars = None
-            for base in bases:
-                if base is Generic:
-                    raise TypeError("Cannot inherit from plain Generic")
-                if (isinstance(base, GenericMeta) and
-                        base.__origin__ is Generic):
-                    if gvars is not None:
-                        raise TypeError(
-                            "Cannot inherit from Generic[...] multiple types.")
-                    gvars = base.__parameters__
-            if gvars is None:
-                gvars = tvars
-            else:
-                tvarset = set(tvars)
-                gvarset = set(gvars)
-                if not tvarset <= gvarset:
-                    raise TypeError(
-                        "Some type variables (%s) "
-                        "are not listed in Generic[%s]" %
-                        (", ".join(str(t) for t in tvars if t not in gvarset),
-                         ", ".join(str(g) for g in gvars)))
-                tvars = gvars
-
-        initial_bases = bases
-        if extra is None:
-            extra = namespace.get('__extra__')
-        if extra is not None and type(extra) is abc.ABCMeta and extra not in bases:
-            bases = (extra,) + bases
-        bases = tuple(_gorg(b) if isinstance(b, GenericMeta) else b for b in bases)
-
-        # remove bare Generic from bases if there are other generic bases
-        if any(isinstance(b, GenericMeta) and b is not Generic for b in bases):
-            bases = tuple(b for b in bases if b is not Generic)
-        self = super(GenericMeta, cls).__new__(cls, name, bases, namespace)
-
-        self.__parameters__ = tvars
-        # Be prepared that GenericMeta will be subclassed by TupleMeta
-        # and CallableMeta, those two allow ..., (), or [] in __args___.
-        self.__args__ = tuple(Ellipsis if a is _TypingEllipsis else
-                              () if a is _TypingEmpty else
-                              a for a in args) if args else None
-        self.__origin__ = origin
-        self.__extra__ = extra
-        # Speed hack (https://github.com/python/typing/issues/196).
-        self.__next_in_mro__ = _next_in_mro(self)
-        # Preserve base classes on subclassing (__bases__ are type erased now).
-        if orig_bases is None:
-            self.__orig_bases__ = initial_bases
-
-        # This allows unparameterized generic collections to be used
-        # with issubclass() and isinstance() in the same way as their
-        # collections.abc counterparts (e.g., isinstance([], Iterable)).
-        if ('__subclasshook__' not in namespace and extra  # allow overriding
-            or hasattr(self.__subclasshook__, '__name__') and
-            self.__subclasshook__.__name__ == '__extrahook__'):
-            self.__subclasshook__ = _make_subclasshook(self)
-
-        if origin and hasattr(origin, '__qualname__'):  # Fix for Python 3.2.
-            self.__qualname__ = origin.__qualname__
-        self.__tree_hash__ = hash(self._subs_tree()) if origin else hash((self.__name__,))
-        return self
-
-    def __init__(self, *args, **kwargs):
-        super(GenericMeta, self).__init__(*args, **kwargs)
-        if isinstance(self.__extra__, abc.ABCMeta):
-            self._abc_registry = self.__extra__._abc_registry
-
-    def _get_type_vars(self, tvars):
-        if self.__origin__ and self.__parameters__:
-            _get_type_vars(self.__parameters__, tvars)
-
-    def _eval_type(self, globalns, localns):
-        ev_origin = (self.__origin__._eval_type(globalns, localns)
-                     if self.__origin__ else None)
-        ev_args = tuple(_eval_type(a, globalns, localns) for a
-                        in self.__args__) if self.__args__ else None
-        if ev_origin == self.__origin__ and ev_args == self.__args__:
-            return self
-        return self.__class__(self.__name__,
-                              self.__bases__,
-                              dict(self.__dict__),
-                              tvars=_type_vars(ev_args) if ev_args else None,
-                              args=ev_args,
-                              origin=ev_origin,
-                              extra=self.__extra__,
-                              orig_bases=self.__orig_bases__)
-
-    def __repr__(self):
-        if self.__origin__ is None:
-            return super(GenericMeta, self).__repr__()
-        return self._tree_repr(self._subs_tree())
-
-    def _tree_repr(self, tree):
-        arg_list = []
-        for arg in tree[1:]:
-            if arg == ():
-                arg_list.append('()')
-            elif not isinstance(arg, tuple):
-                arg_list.append(_type_repr(arg))
-            else:
-                arg_list.append(arg[0]._tree_repr(arg))
-        return super(GenericMeta, self).__repr__() + '[%s]' % ', '.join(arg_list)
-
-    def _subs_tree(self, tvars=None, args=None):
-        if self.__origin__ is None:
-            return self
-        tree_args = _subs_tree(self, tvars, args)
-        return (_gorg(self),) + tuple(tree_args)
-
-    def __eq__(self, other):
-        if not isinstance(other, GenericMeta):
-            return NotImplemented
-        if self.__origin__ is None or other.__origin__ is None:
-            return self is other
-        return self.__tree_hash__ == other.__tree_hash__
-
-    def __hash__(self):
-        return self.__tree_hash__
-
-    @_tp_cache
-    def __getitem__(self, params):
-        if not isinstance(params, tuple):
-            params = (params,)
-        if not params and not _gorg(self) is Tuple:
-            raise TypeError(
-                "Parameter list to %s[...] cannot be empty" % _qualname(self))
-        msg = "Parameters to generic types must be types."
-        params = tuple(_type_check(p, msg) for p in params)
-        if self is Generic:
-            # Generic can only be subscripted with unique type variables.
-            if not all(isinstance(p, TypeVar) for p in params):
-                raise TypeError(
-                    "Parameters to Generic[...] must all be type variables")
-            if len(set(params)) != len(params):
-                raise TypeError(
-                    "Parameters to Generic[...] must all be unique")
-            tvars = params
-            args = params
-        elif self in (Tuple, Callable):
-            tvars = _type_vars(params)
-            args = params
-        elif self is _Protocol:
-            # _Protocol is internal, don't check anything.
-            tvars = params
-            args = params
-        elif self.__origin__ in (Generic, _Protocol):
-            # Can't subscript Generic[...] or _Protocol[...].
-            raise TypeError("Cannot subscript already-subscripted %s" %
-                            repr(self))
-        else:
-            # Subscripting a regular Generic subclass.
-            _check_generic(self, params)
-            tvars = _type_vars(params)
-            args = params
-        return self.__class__(self.__name__,
-                              self.__bases__,
-                              dict(self.__dict__),
-                              tvars=tvars,
-                              args=args,
-                              origin=self,
-                              extra=self.__extra__,
-                              orig_bases=self.__orig_bases__)
-
-    def __instancecheck__(self, instance):
-        # Since we extend ABC.__subclasscheck__ and
-        # ABC.__instancecheck__ inlines the cache checking done by the
-        # latter, we must extend __instancecheck__ too. For simplicity
-        # we just skip the cache check -- instance checks for generic
-        # classes are supposed to be rare anyways.
-        if not isinstance(instance, type):
-            return issubclass(instance.__class__, self)
-        return False
-
-    def __copy__(self):
-        return self.__class__(self.__name__, self.__bases__, dict(self.__dict__),
-                              self.__parameters__, self.__args__, self.__origin__,
-                              self.__extra__, self.__orig_bases__)
-
-
-# Prevent checks for Generic to crash when defining Generic.
-Generic = None
-
-
-def _generic_new(base_cls, cls, *args, **kwds):
-    # Assure type is erased on instantiation,
-    # but attempt to store it in __orig_class__
-    if cls.__origin__ is None:
-        return base_cls.__new__(cls)
-    else:
-        origin = _gorg(cls)
-        obj = base_cls.__new__(origin)
-        try:
-            obj.__orig_class__ = cls
-        except AttributeError:
-            pass
-        obj.__init__(*args, **kwds)
-        return obj
-
-
-class Generic(object):
-    """Abstract base class for generic types.
-
-    A generic type is typically declared by inheriting from
-    this class parameterized with one or more type variables.
-    For example, a generic mapping type might be defined as::
-
-      class Mapping(Generic[KT, VT]):
-          def __getitem__(self, key: KT) -> VT:
-              ...
-          # Etc.
-
-    This class can then be used as follows::
-
-      def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
-          try:
-              return mapping[key]
-          except KeyError:
-              return default
-    """
-
-    __metaclass__ = GenericMeta
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Generic):
-            raise TypeError("Type Generic cannot be instantiated; "
-                            "it can be used only as a base class")
-        return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
-
-
-class _TypingEmpty(object):
-    """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
-    to allow empty list/tuple in specific places, without allowing them
-    to sneak in where prohibited.
-    """
-
-
-class _TypingEllipsis(object):
-    """Internal placeholder for ... (ellipsis)."""
-
-
-class TupleMeta(GenericMeta):
-    """Metaclass for Tuple (internal)."""
-
-    @_tp_cache
-    def __getitem__(self, parameters):
-        if self.__origin__ is not None or not _geqv(self, Tuple):
-            # Normal generic rules apply if this is not the first subscription
-            # or a subscription of a subclass.
-            return super(TupleMeta, self).__getitem__(parameters)
-        if parameters == ():
-            return super(TupleMeta, self).__getitem__((_TypingEmpty,))
-        if not isinstance(parameters, tuple):
-            parameters = (parameters,)
-        if len(parameters) == 2 and parameters[1] is Ellipsis:
-            msg = "Tuple[t, ...]: t must be a type."
-            p = _type_check(parameters[0], msg)
-            return super(TupleMeta, self).__getitem__((p, _TypingEllipsis))
-        msg = "Tuple[t0, t1, ...]: each t must be a type."
-        parameters = tuple(_type_check(p, msg) for p in parameters)
-        return super(TupleMeta, self).__getitem__(parameters)
-
-    def __instancecheck__(self, obj):
-        if self.__args__ == None:
-            return isinstance(obj, tuple)
-        raise TypeError("Parameterized Tuple cannot be used "
-                        "with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        if self.__args__ == None:
-            return issubclass(cls, tuple)
-        raise TypeError("Parameterized Tuple cannot be used "
-                        "with issubclass().")
-
-
-class Tuple(tuple):
-    """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
-
-    Example: Tuple[T1, T2] is a tuple of two elements corresponding
-    to type variables T1 and T2.  Tuple[int, float, str] is a tuple
-    of an int, a float and a string.
-
-    To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
-    """
-
-    __metaclass__ = TupleMeta
-    __extra__ = tuple
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Tuple):
-            raise TypeError("Type Tuple cannot be instantiated; "
-                            "use tuple() instead")
-        return _generic_new(tuple, cls, *args, **kwds)
-
-
-class CallableMeta(GenericMeta):
-    """ Metaclass for Callable."""
-
-    def __repr__(self):
-        if self.__origin__ is None:
-            return super(CallableMeta, self).__repr__()
-        return self._tree_repr(self._subs_tree())
-
-    def _tree_repr(self, tree):
-        if _gorg(self) is not Callable:
-            return super(CallableMeta, self)._tree_repr(tree)
-        # For actual Callable (not its subclass) we override
-        # super(CallableMeta, self)._tree_repr() for nice formatting.
-        arg_list = []
-        for arg in tree[1:]:
-            if not isinstance(arg, tuple):
-                arg_list.append(_type_repr(arg))
-            else:
-                arg_list.append(arg[0]._tree_repr(arg))
-        if arg_list[0] == '...':
-            return repr(tree[0]) + '[..., %s]' % arg_list[1]
-        return (repr(tree[0]) +
-                '[[%s], %s]' % (', '.join(arg_list[:-1]), arg_list[-1]))
-
-    def __getitem__(self, parameters):
-        """A thin wrapper around __getitem_inner__ to provide the latter
-        with hashable arguments to improve speed.
-        """
-
-        if  self.__origin__ is not None or not _geqv(self, Callable):
-            return super(CallableMeta, self).__getitem__(parameters)
-        if not isinstance(parameters, tuple) or len(parameters) != 2:
-            raise TypeError("Callable must be used as "
-                            "Callable[[arg, ...], result].")
-        args, result = parameters
-        if args is Ellipsis:
-            parameters = (Ellipsis, result)
-        else:
-            if not isinstance(args, list):
-                raise TypeError("Callable[args, result]: args must be a list."
-                                " Got %.100r." % (args,))
-            parameters = (tuple(args), result)
-        return self.__getitem_inner__(parameters)
-
-    @_tp_cache
-    def __getitem_inner__(self, parameters):
-        args, result = parameters
-        msg = "Callable[args, result]: result must be a type."
-        result = _type_check(result, msg)
-        if args is Ellipsis:
-            return super(CallableMeta, self).__getitem__((_TypingEllipsis, result))
-        msg = "Callable[[arg, ...], result]: each arg must be a type."
-        args = tuple(_type_check(arg, msg) for arg in args)
-        parameters = args + (result,)
-        return super(CallableMeta, self).__getitem__(parameters)
-
-
-class Callable(object):
-    """Callable type; Callable[[int], str] is a function of (int) -> str.
-
-    The subscription syntax must always be used with exactly two
-    values: the argument list and the return type.  The argument list
-    must be a list of types or ellipsis; the return type must be a single type.
-
-    There is no syntax to indicate optional or keyword arguments,
-    such function types are rarely used as callback types.
-    """
-
-    __metaclass__ = CallableMeta
-    __extra__ = collections_abc.Callable
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Callable):
-            raise TypeError("Type Callable cannot be instantiated; "
-                            "use a non-abstract subclass instead")
-        return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
-
-
-def cast(typ, val):
-    """Cast a value to a type.
-
-    This returns the value unchanged.  To the type checker this
-    signals that the return value has the designated type, but at
-    runtime we intentionally don't check anything (we want this
-    to be as fast as possible).
-    """
-    return val
-
-
-def _get_defaults(func):
-    """Internal helper to extract the default arguments, by name."""
-    code = func.__code__
-    pos_count = code.co_argcount
-    arg_names = code.co_varnames
-    arg_names = arg_names[:pos_count]
-    defaults = func.__defaults__ or ()
-    kwdefaults = func.__kwdefaults__
-    res = dict(kwdefaults) if kwdefaults else {}
-    pos_offset = pos_count - len(defaults)
-    for name, value in zip(arg_names[pos_offset:], defaults):
-        assert name not in res
-        res[name] = value
-    return res
-
-
-def get_type_hints(obj, globalns=None, localns=None):
-    """In Python 2 this is not supported and always returns None."""
-    return None
-
-
-def no_type_check(arg):
-    """Decorator to indicate that annotations are not type hints.
-
-    The argument must be a class or function; if it is a class, it
-    applies recursively to all methods and classes defined in that class
-    (but not to methods defined in its superclasses or subclasses).
-
-    This mutates the function(s) or class(es) in place.
-    """
-    if isinstance(arg, type):
-        arg_attrs = arg.__dict__.copy()
-        for attr, val in arg.__dict__.items():
-            if val in arg.__bases__:
-                arg_attrs.pop(attr)
-        for obj in arg_attrs.values():
-            if isinstance(obj, types.FunctionType):
-                obj.__no_type_check__ = True
-            if isinstance(obj, type):
-                no_type_check(obj)
-    try:
-        arg.__no_type_check__ = True
-    except TypeError: # built-in classes
-        pass
-    return arg
-
-
-def no_type_check_decorator(decorator):
-    """Decorator to give another decorator the @no_type_check effect.
-
-    This wraps the decorator with something that wraps the decorated
-    function in @no_type_check.
-    """
-
-    @functools.wraps(decorator)
-    def wrapped_decorator(*args, **kwds):
-        func = decorator(*args, **kwds)
-        func = no_type_check(func)
-        return func
-
-    return wrapped_decorator
-
-
-def _overload_dummy(*args, **kwds):
-    """Helper for @overload to raise when called."""
-    raise NotImplementedError(
-        "You should not call an overloaded function. "
-        "A series of @overload-decorated functions "
-        "outside a stub module should always be followed "
-        "by an implementation that is not @overload-ed.")
-
-
-def overload(func):
-    """Decorator for overloaded functions/methods.
-
-    In a stub file, place two or more stub definitions for the same
-    function in a row, each decorated with @overload.  For example:
-
-      @overload
-      def utf8(value: None) -> None: ...
-      @overload
-      def utf8(value: bytes) -> bytes: ...
-      @overload
-      def utf8(value: str) -> bytes: ...
-
-    In a non-stub file (i.e. a regular .py file), do the same but
-    follow it with an implementation.  The implementation should *not*
-    be decorated with @overload.  For example:
-
-      @overload
-      def utf8(value: None) -> None: ...
-      @overload
-      def utf8(value: bytes) -> bytes: ...
-      @overload
-      def utf8(value: str) -> bytes: ...
-      def utf8(value):
-          # implementation goes here
-    """
-    return _overload_dummy
-
-
-class _ProtocolMeta(GenericMeta):
-    """Internal metaclass for _Protocol.
-
-    This exists so _Protocol classes can be generic without deriving
-    from Generic.
-    """
-
-    def __instancecheck__(self, obj):
-        if _Protocol not in self.__bases__:
-            return super(_ProtocolMeta, self).__instancecheck__(obj)
-        raise TypeError("Protocols cannot be used with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        if not self._is_protocol:
-            # No structural checks since this isn't a protocol.
-            return NotImplemented
-
-        if self is _Protocol:
-            # Every class is a subclass of the empty protocol.
-            return True
-
-        # Find all attributes defined in the protocol.
-        attrs = self._get_protocol_attrs()
-
-        for attr in attrs:
-            if not any(attr in d.__dict__ for d in cls.__mro__):
-                return False
-        return True
-
-    def _get_protocol_attrs(self):
-        # Get all Protocol base classes.
-        protocol_bases = []
-        for c in self.__mro__:
-            if getattr(c, '_is_protocol', False) and c.__name__ != '_Protocol':
-                protocol_bases.append(c)
-
-        # Get attributes included in protocol.
-        attrs = set()
-        for base in protocol_bases:
-            for attr in base.__dict__.keys():
-                # Include attributes not defined in any non-protocol bases.
-                for c in self.__mro__:
-                    if (c is not base and attr in c.__dict__ and
-                            not getattr(c, '_is_protocol', False)):
-                        break
-                else:
-                    if (not attr.startswith('_abc_') and
-                            attr != '__abstractmethods__' and
-                            attr != '_is_protocol' and
-                            attr != '__dict__' and
-                            attr != '__args__' and
-                            attr != '__slots__' and
-                            attr != '_get_protocol_attrs' and
-                            attr != '__next_in_mro__' and
-                            attr != '__parameters__' and
-                            attr != '__origin__' and
-                            attr != '__orig_bases__' and
-                            attr != '__extra__' and
-                            attr != '__tree_hash__' and
-                            attr != '__module__'):
-                        attrs.add(attr)
-
-        return attrs
-
-
-class _Protocol(object):
-    """Internal base class for protocol classes.
-
-    This implements a simple-minded structural issubclass check
-    (similar but more general than the one-offs in collections.abc
-    such as Hashable).
-    """
-
-    __metaclass__ = _ProtocolMeta
-    __slots__ = ()
-
-    _is_protocol = True
-
-
-# Various ABCs mimicking those in collections.abc.
-# A few are simply re-exported for completeness.
-
-Hashable = collections_abc.Hashable  # Not generic.
-
-
-class Iterable(Generic[T_co]):
-    __slots__ = ()
-    __extra__ = collections_abc.Iterable
-
-
-class Iterator(Iterable[T_co]):
-    __slots__ = ()
-    __extra__ = collections_abc.Iterator
-
-
-class SupportsInt(_Protocol):
-    __slots__ = ()
-
-    @abstractmethod
-    def __int__(self):
-        pass
-
-
-class SupportsFloat(_Protocol):
-    __slots__ = ()
-
-    @abstractmethod
-    def __float__(self):
-        pass
-
-
-class SupportsComplex(_Protocol):
-    __slots__ = ()
-
-    @abstractmethod
-    def __complex__(self):
-        pass
-
-
-class SupportsAbs(_Protocol[T_co]):
-    __slots__ = ()
-
-    @abstractmethod
-    def __abs__(self):
-        pass
-
-
-if hasattr(collections_abc, 'Reversible'):
-    class Reversible(Iterable[T_co]):
-        __slots__ = ()
-        __extra__ = collections_abc.Reversible
-else:
-    class Reversible(_Protocol[T_co]):
-        __slots__ = ()
-
-        @abstractmethod
-        def __reversed__(self):
-            pass
-
-
-Sized = collections_abc.Sized  # Not generic.
-
-
-class Container(Generic[T_co]):
-    __slots__ = ()
-    __extra__ = collections_abc.Container
-
-
-# Callable was defined earlier.
-
-
-class AbstractSet(Sized, Iterable[T_co], Container[T_co]):
-    __slots__ = ()
-    __extra__ = collections_abc.Set
-
-
-class MutableSet(AbstractSet[T]):
-    __slots__ = ()
-    __extra__ = collections_abc.MutableSet
-
-
-# NOTE: It is only covariant in the value type.
-class Mapping(Sized, Iterable[KT], Container[KT], Generic[KT, VT_co]):
-    __slots__ = ()
-    __extra__ = collections_abc.Mapping
-
-
-class MutableMapping(Mapping[KT, VT]):
-    __slots__ = ()
-    __extra__ = collections_abc.MutableMapping
-
-
-if hasattr(collections_abc, 'Reversible'):
-    class Sequence(Sized, Reversible[T_co], Container[T_co]):
-        __slots__ = ()
-        __extra__ = collections_abc.Sequence
-else:
-    class Sequence(Sized, Iterable[T_co], Container[T_co]):
-        __slots__ = ()
-        __extra__ = collections_abc.Sequence
-
-
-class MutableSequence(Sequence[T]):
-    __slots__ = ()
-    __extra__ = collections_abc.MutableSequence
-
-
-class ByteString(Sequence[int]):
-    pass
-
-
-ByteString.register(str)
-ByteString.register(bytearray)
-
-
-class List(list, MutableSequence[T]):
-    __slots__ = ()
-    __extra__ = list
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, List):
-            raise TypeError("Type List cannot be instantiated; "
-                            "use list() instead")
-        return _generic_new(list, cls, *args, **kwds)
-
-
-class Set(set, MutableSet[T]):
-    __slots__ = ()
-    __extra__ = set
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Set):
-            raise TypeError("Type Set cannot be instantiated; "
-                            "use set() instead")
-        return _generic_new(set, cls, *args, **kwds)
-
-
-class FrozenSet(frozenset, AbstractSet[T_co]):
-    __slots__ = ()
-    __extra__ = frozenset
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, FrozenSet):
-            raise TypeError("Type FrozenSet cannot be instantiated; "
-                            "use frozenset() instead")
-        return _generic_new(frozenset, cls, *args, **kwds)
-
-
-class MappingView(Sized, Iterable[T_co]):
-    __slots__ = ()
-    __extra__ = collections_abc.MappingView
-
-
-class KeysView(MappingView[KT], AbstractSet[KT]):
-    __slots__ = ()
-    __extra__ = collections_abc.KeysView
-
-
-class ItemsView(MappingView[Tuple[KT, VT_co]],
-                AbstractSet[Tuple[KT, VT_co]],
-                Generic[KT, VT_co]):
-    __slots__ = ()
-    __extra__ = collections_abc.ItemsView
-
-
-class ValuesView(MappingView[VT_co]):
-    __slots__ = ()
-    __extra__ = collections_abc.ValuesView
-
-
-class Dict(dict, MutableMapping[KT, VT]):
-    __slots__ = ()
-    __extra__ = dict
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Dict):
-            raise TypeError("Type Dict cannot be instantiated; "
-                            "use dict() instead")
-        return _generic_new(dict, cls, *args, **kwds)
-
-
-class DefaultDict(collections.defaultdict, MutableMapping[KT, VT]):
-    __slots__ = ()
-    __extra__ = collections.defaultdict
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, DefaultDict):
-            raise TypeError("Type DefaultDict cannot be instantiated; "
-                            "use collections.defaultdict() instead")
-        return _generic_new(collections.defaultdict, cls, *args, **kwds)
-
-
-# Determine what base class to use for Generator.
-if hasattr(collections_abc, 'Generator'):
-    # Sufficiently recent versions of 3.5 have a Generator ABC.
-    _G_base = collections_abc.Generator
-else:
-    # Fall back on the exact type.
-    _G_base = types.GeneratorType
-
-
-class Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]):
-    __slots__ = ()
-    __extra__ = _G_base
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Generator):
-            raise TypeError("Type Generator cannot be instantiated; "
-                            "create a subclass instead")
-        return _generic_new(_G_base, cls, *args, **kwds)
-
-
-# Internal type variable used for Type[].
-CT_co = TypeVar('CT_co', covariant=True, bound=type)
-
-
-# This is not a real generic class.  Don't use outside annotations.
-class Type(Generic[CT_co]):
-    """A special construct usable to annotate class objects.
-
-    For example, suppose we have the following classes::
-
-      class User: ...  # Abstract base for User classes
-      class BasicUser(User): ...
-      class ProUser(User): ...
-      class TeamUser(User): ...
-
-    And a function that takes a class argument that's a subclass of
-    User and returns an instance of the corresponding class::
-
-      U = TypeVar('U', bound=User)
-      def new_user(user_class: Type[U]) -> U:
-          user = user_class()
-          # (Here we could write the user object to a database)
-          return user
-
-      joe = new_user(BasicUser)
-
-    At this point the type checker knows that joe has type BasicUser.
-    """
-    __slots__ = ()
-    __extra__ = type
-
-
-def NamedTuple(typename, fields):
-    """Typed version of namedtuple.
-
-    Usage::
-
-        Employee = typing.NamedTuple('Employee', [('name', str), 'id', int)])
-
-    This is equivalent to::
-
-        Employee = collections.namedtuple('Employee', ['name', 'id'])
-
-    The resulting class has one extra attribute: _field_types,
-    giving a dict mapping field names to types.  (The field names
-    are in the _fields attribute, which is part of the namedtuple
-    API.)
-    """
-    fields = [(n, t) for n, t in fields]
-    cls = collections.namedtuple(typename, [n for n, t in fields])
-    cls._field_types = dict(fields)
-    # Set the module to the caller's module (otherwise it'd be 'typing').
-    try:
-        cls.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__')
-    except (AttributeError, ValueError):
-        pass
-    return cls
-
-
-def NewType(name, tp):
-    """NewType creates simple unique types with almost zero
-    runtime overhead. NewType(name, tp) is considered a subtype of tp
-    by static type checkers. At runtime, NewType(name, tp) returns
-    a dummy function that simply returns its argument. Usage::
-
-        UserId = NewType('UserId', int)
-
-        def name_by_id(user_id):
-            # type: (UserId) -> str
-            ...
-
-        UserId('user')          # Fails type check
-
-        name_by_id(42)          # Fails type check
-        name_by_id(UserId(42))  # OK
-
-        num = UserId(5) + 1     # type: int
-    """
-
-    def new_type(x):
-        return x
-
-    # Some versions of Python 2 complain because of making all strings unicode
-    new_type.__name__ = str(name)
-    new_type.__supertype__ = tp
-    return new_type
-
-
-# Python-version-specific alias (Python 2: unicode; Python 3: str)
-Text = unicode
-
-
-# Constant that's True when type checking, but False here.
-TYPE_CHECKING = False
-
-
-class IO(Generic[AnyStr]):
-    """Generic base class for TextIO and BinaryIO.
-
-    This is an abstract, generic version of the return of open().
-
-    NOTE: This does not distinguish between the different possible
-    classes (text vs. binary, read vs. write vs. read/write,
-    append-only, unbuffered).  The TextIO and BinaryIO subclasses
-    below capture the distinctions between text vs. binary, which is
-    pervasive in the interface; however we currently do not offer a
-    way to track the other distinctions in the type system.
-    """
-
-    __slots__ = ()
-
-    @abstractproperty
-    def mode(self):
-        pass
-
-    @abstractproperty
-    def name(self):
-        pass
-
-    @abstractmethod
-    def close(self):
-        pass
-
-    @abstractmethod
-    def closed(self):
-        pass
-
-    @abstractmethod
-    def fileno(self):
-        pass
-
-    @abstractmethod
-    def flush(self):
-        pass
-
-    @abstractmethod
-    def isatty(self):
-        pass
-
-    @abstractmethod
-    def read(self, n = -1):
-        pass
-
-    @abstractmethod
-    def readable(self):
-        pass
-
-    @abstractmethod
-    def readline(self, limit = -1):
-        pass
-
-    @abstractmethod
-    def readlines(self, hint = -1):
-        pass
-
-    @abstractmethod
-    def seek(self, offset, whence = 0):
-        pass
-
-    @abstractmethod
-    def seekable(self):
-        pass
-
-    @abstractmethod
-    def tell(self):
-        pass
-
-    @abstractmethod
-    def truncate(self, size = None):
-        pass
-
-    @abstractmethod
-    def writable(self):
-        pass
-
-    @abstractmethod
-    def write(self, s):
-        pass
-
-    @abstractmethod
-    def writelines(self, lines):
-        pass
-
-    @abstractmethod
-    def __enter__(self):
-        pass
-
-    @abstractmethod
-    def __exit__(self, type, value, traceback):
-        pass
-
-
-class BinaryIO(IO[bytes]):
-    """Typed version of the return of open() in binary mode."""
-
-    __slots__ = ()
-
-    @abstractmethod
-    def write(self, s):
-        pass
-
-    @abstractmethod
-    def __enter__(self):
-        pass
-
-
-class TextIO(IO[unicode]):
-    """Typed version of the return of open() in text mode."""
-
-    __slots__ = ()
-
-    @abstractproperty
-    def buffer(self):
-        pass
-
-    @abstractproperty
-    def encoding(self):
-        pass
-
-    @abstractproperty
-    def errors(self):
-        pass
-
-    @abstractproperty
-    def line_buffering(self):
-        pass
-
-    @abstractproperty
-    def newlines(self):
-        pass
-
-    @abstractmethod
-    def __enter__(self):
-        pass
-
-
-class io(object):
-    """Wrapper namespace for IO generic classes."""
-
-    __all__ = ['IO', 'TextIO', 'BinaryIO']
-    IO = IO
-    TextIO = TextIO
-    BinaryIO = BinaryIO
-
-io.__name__ = __name__ + b'.io'
-sys.modules[io.__name__] = io
-
-
-Pattern = _TypeAlias('Pattern', AnyStr, type(stdlib_re.compile('')),
-                     lambda p: p.pattern)
-Match = _TypeAlias('Match', AnyStr, type(stdlib_re.match('', '')),
-                   lambda m: m.re.pattern)
-
-
-class re(object):
-    """Wrapper namespace for re type aliases."""
-
-    __all__ = ['Pattern', 'Match']
-    Pattern = Pattern
-    Match = Match
-
-re.__name__ = __name__ + b'.re'
-sys.modules[re.__name__] = re
diff --git a/lib-typing/3.2/test_typing.py b/lib-typing/3.2/test_typing.py
deleted file mode 100644
index d203ce3..0000000
--- a/lib-typing/3.2/test_typing.py
+++ /dev/null
@@ -1,2063 +0,0 @@
-import contextlib
-import collections
-import pickle
-import re
-import sys
-from unittest import TestCase, main, skipUnless, SkipTest
-from copy import copy, deepcopy
-
-from typing import Any
-from typing import TypeVar, AnyStr
-from typing import T, KT, VT  # Not in __all__.
-from typing import Union, Optional
-from typing import Tuple, List, MutableMapping
-from typing import Callable
-from typing import Generic, ClassVar
-from typing import cast
-from typing import get_type_hints
-from typing import no_type_check, no_type_check_decorator
-from typing import Type
-from typing import NewType
-from typing import NamedTuple
-from typing import IO, TextIO, BinaryIO
-from typing import Pattern, Match
-import abc
-import typing
-try:
-    import collections.abc as collections_abc
-except ImportError:
-    import collections as collections_abc  # Fallback for PY3.2.
-
-
-class BaseTestCase(TestCase):
-
-    def assertIsSubclass(self, cls, class_or_tuple, msg=None):
-        if not issubclass(cls, class_or_tuple):
-            message = '%r is not a subclass of %r' % (cls, class_or_tuple)
-            if msg is not None:
-                message += ' : %s' % msg
-            raise self.failureException(message)
-
-    def assertNotIsSubclass(self, cls, class_or_tuple, msg=None):
-        if issubclass(cls, class_or_tuple):
-            message = '%r is a subclass of %r' % (cls, class_or_tuple)
-            if msg is not None:
-                message += ' : %s' % msg
-            raise self.failureException(message)
-
-    def clear_caches(self):
-        for f in typing._cleanups:
-            f()
-
-
-class Employee:
-    pass
-
-
-class Manager(Employee):
-    pass
-
-
-class Founder(Employee):
-    pass
-
-
-class ManagingFounder(Manager, Founder):
-    pass
-
-
-class AnyTests(BaseTestCase):
-
-    def test_any_instance_type_error(self):
-        with self.assertRaises(TypeError):
-            isinstance(42, Any)
-
-    def test_any_subclass_type_error(self):
-        with self.assertRaises(TypeError):
-            issubclass(Employee, Any)
-        with self.assertRaises(TypeError):
-            issubclass(Any, Employee)
-
-    def test_repr(self):
-        self.assertEqual(repr(Any), 'typing.Any')
-
-    def test_errors(self):
-        with self.assertRaises(TypeError):
-            issubclass(42, Any)
-        with self.assertRaises(TypeError):
-            Any[int]  # Any is not a generic type.
-
-    def test_cannot_subclass(self):
-        with self.assertRaises(TypeError):
-            class A(Any):
-                pass
-        with self.assertRaises(TypeError):
-            class A(type(Any)):
-                pass
-
-    def test_cannot_instantiate(self):
-        with self.assertRaises(TypeError):
-            Any()
-        with self.assertRaises(TypeError):
-            type(Any)()
-
-    def test_cannot_subscript(self):
-        with self.assertRaises(TypeError):
-            Any[int]
-
-    def test_any_works_with_alias(self):
-        # These expressions must simply not fail.
-        typing.Match[Any]
-        typing.Pattern[Any]
-        typing.IO[Any]
-
-
-class TypeVarTests(BaseTestCase):
-
-    def test_basic_plain(self):
-        T = TypeVar('T')
-        # T equals itself.
-        self.assertEqual(T, T)
-        # T is an instance of TypeVar
-        self.assertIsInstance(T, TypeVar)
-
-    def test_typevar_instance_type_error(self):
-        T = TypeVar('T')
-        with self.assertRaises(TypeError):
-            isinstance(42, T)
-
-    def test_typevar_subclass_type_error(self):
-        T = TypeVar('T')
-        with self.assertRaises(TypeError):
-            issubclass(int, T)
-        with self.assertRaises(TypeError):
-            issubclass(T, int)
-
-    def test_constrained_error(self):
-        with self.assertRaises(TypeError):
-            X = TypeVar('X', int)
-            X
-
-    def test_union_unique(self):
-        X = TypeVar('X')
-        Y = TypeVar('Y')
-        self.assertNotEqual(X, Y)
-        self.assertEqual(Union[X], X)
-        self.assertNotEqual(Union[X], Union[X, Y])
-        self.assertEqual(Union[X, X], X)
-        self.assertNotEqual(Union[X, int], Union[X])
-        self.assertNotEqual(Union[X, int], Union[int])
-        self.assertEqual(Union[X, int].__args__, (X, int))
-        self.assertEqual(Union[X, int].__parameters__, (X,))
-        self.assertIs(Union[X, int].__origin__, Union)
-
-    def test_union_constrained(self):
-        A = TypeVar('A', str, bytes)
-        self.assertNotEqual(Union[A, str], Union[A])
-
-    def test_repr(self):
-        self.assertEqual(repr(T), '~T')
-        self.assertEqual(repr(KT), '~KT')
-        self.assertEqual(repr(VT), '~VT')
-        self.assertEqual(repr(AnyStr), '~AnyStr')
-        T_co = TypeVar('T_co', covariant=True)
-        self.assertEqual(repr(T_co), '+T_co')
-        T_contra = TypeVar('T_contra', contravariant=True)
-        self.assertEqual(repr(T_contra), '-T_contra')
-
-    def test_no_redefinition(self):
-        self.assertNotEqual(TypeVar('T'), TypeVar('T'))
-        self.assertNotEqual(TypeVar('T', int, str), TypeVar('T', int, str))
-
-    def test_cannot_subclass_vars(self):
-        with self.assertRaises(TypeError):
-            class V(TypeVar('T')):
-                pass
-
-    def test_cannot_subclass_var_itself(self):
-        with self.assertRaises(TypeError):
-            class V(TypeVar):
-                pass
-
-    def test_cannot_instantiate_vars(self):
-        with self.assertRaises(TypeError):
-            TypeVar('A')()
-
-    def test_bound_errors(self):
-        with self.assertRaises(TypeError):
-            TypeVar('X', bound=42)
-        with self.assertRaises(TypeError):
-            TypeVar('X', str, float, bound=Employee)
-
-
-class UnionTests(BaseTestCase):
-
-    def test_basics(self):
-        u = Union[int, float]
-        self.assertNotEqual(u, Union)
-
-    def test_subclass_error(self):
-        with self.assertRaises(TypeError):
-            issubclass(int, Union)
-        with self.assertRaises(TypeError):
-            issubclass(Union, int)
-        with self.assertRaises(TypeError):
-            issubclass(int, Union[int, str])
-        with self.assertRaises(TypeError):
-            issubclass(Union[int, str], int)
-
-    def test_union_any(self):
-        u = Union[Any]
-        self.assertEqual(u, Any)
-        u1 = Union[int, Any]
-        u2 = Union[Any, int]
-        u3 = Union[Any, object]
-        self.assertEqual(u1, u2)
-        self.assertNotEqual(u1, Any)
-        self.assertNotEqual(u2, Any)
-        self.assertNotEqual(u3, Any)
-
-    def test_union_object(self):
-        u = Union[object]
-        self.assertEqual(u, object)
-        u = Union[int, object]
-        self.assertEqual(u, object)
-        u = Union[object, int]
-        self.assertEqual(u, object)
-
-    def test_unordered(self):
-        u1 = Union[int, float]
-        u2 = Union[float, int]
-        self.assertEqual(u1, u2)
-
-    def test_single_class_disappears(self):
-        t = Union[Employee]
-        self.assertIs(t, Employee)
-
-    def test_base_class_disappears(self):
-        u = Union[Employee, Manager, int]
-        self.assertEqual(u, Union[int, Employee])
-        u = Union[Manager, int, Employee]
-        self.assertEqual(u, Union[int, Employee])
-        u = Union[Employee, Manager]
-        self.assertIs(u, Employee)
-
-    def test_union_union(self):
-        u = Union[int, float]
-        v = Union[u, Employee]
-        self.assertEqual(v, Union[int, float, Employee])
-
-    def test_repr(self):
-        self.assertEqual(repr(Union), 'typing.Union')
-        u = Union[Employee, int]
-        self.assertEqual(repr(u), 'typing.Union[%s.Employee, int]' % __name__)
-        u = Union[int, Employee]
-        self.assertEqual(repr(u), 'typing.Union[int, %s.Employee]' % __name__)
-
-    def test_cannot_subclass(self):
-        with self.assertRaises(TypeError):
-            class C(Union):
-                pass
-        with self.assertRaises(TypeError):
-            class C(type(Union)):
-                pass
-        with self.assertRaises(TypeError):
-            class C(Union[int, str]):
-                pass
-
-    def test_cannot_instantiate(self):
-        with self.assertRaises(TypeError):
-            Union()
-        with self.assertRaises(TypeError):
-            type(Union)()
-        u = Union[int, float]
-        with self.assertRaises(TypeError):
-            u()
-        with self.assertRaises(TypeError):
-            type(u)()
-
-    def test_union_generalization(self):
-        self.assertFalse(Union[str, typing.Iterable[int]] == str)
-        self.assertFalse(Union[str, typing.Iterable[int]] == typing.Iterable[int])
-        self.assertTrue(Union[str, typing.Iterable] == typing.Iterable)
-
-    def test_optional(self):
-        o = Optional[int]
-        u = Union[int, None]
-        self.assertEqual(o, u)
-
-    def test_empty(self):
-        with self.assertRaises(TypeError):
-            Union[()]
-
-    def test_union_instance_type_error(self):
-        with self.assertRaises(TypeError):
-            isinstance(42, Union[int, str])
-
-    def test_union_str_pattern(self):
-        # Shouldn't crash; see http://bugs.python.org/issue25390
-        A = Union[str, Pattern]
-        A
-
-    def test_etree(self):
-        # See https://github.com/python/typing/issues/229
-        # (Only relevant for Python 2.)
-        try:
-            from xml.etree.cElementTree import Element
-        except ImportError:
-            raise SkipTest("cElementTree not found")
-        Union[Element, str]  # Shouldn't crash
-
-        def Elem(*args):
-            return Element(*args)
-
-        Union[Elem, str]  # Nor should this
-
-
-class TupleTests(BaseTestCase):
-
-    def test_basics(self):
-        with self.assertRaises(TypeError):
-            issubclass(Tuple, Tuple[int, str])
-        with self.assertRaises(TypeError):
-            issubclass(tuple, Tuple[int, str])
-
-        class TP(tuple): ...
-        self.assertTrue(issubclass(tuple, Tuple))
-        self.assertTrue(issubclass(TP, Tuple))
-
-    def test_equality(self):
-        self.assertEqual(Tuple[int], Tuple[int])
-        self.assertEqual(Tuple[int, ...], Tuple[int, ...])
-        self.assertNotEqual(Tuple[int], Tuple[int, int])
-        self.assertNotEqual(Tuple[int], Tuple[int, ...])
-
-    def test_tuple_subclass(self):
-        class MyTuple(tuple):
-            pass
-        self.assertTrue(issubclass(MyTuple, Tuple))
-
-    def test_tuple_instance_type_error(self):
-        with self.assertRaises(TypeError):
-            isinstance((0, 0), Tuple[int, int])
-        self.assertIsInstance((0, 0), Tuple)
-
-    def test_repr(self):
-        self.assertEqual(repr(Tuple), 'typing.Tuple')
-        self.assertEqual(repr(Tuple[()]), 'typing.Tuple[()]')
-        self.assertEqual(repr(Tuple[int, float]), 'typing.Tuple[int, float]')
-        self.assertEqual(repr(Tuple[int, ...]), 'typing.Tuple[int, ...]')
-
-    def test_errors(self):
-        with self.assertRaises(TypeError):
-            issubclass(42, Tuple)
-        with self.assertRaises(TypeError):
-            issubclass(42, Tuple[int])
-
-
-class CallableTests(BaseTestCase):
-
-    def test_self_subclass(self):
-        with self.assertRaises(TypeError):
-            self.assertTrue(issubclass(type(lambda x: x), Callable[[int], int]))
-        self.assertTrue(issubclass(type(lambda x: x), Callable))
-
-    def test_eq_hash(self):
-        self.assertEqual(Callable[[int], int], Callable[[int], int])
-        self.assertEqual(len({Callable[[int], int], Callable[[int], int]}), 1)
-        self.assertNotEqual(Callable[[int], int], Callable[[int], str])
-        self.assertNotEqual(Callable[[int], int], Callable[[str], int])
-        self.assertNotEqual(Callable[[int], int], Callable[[int, int], int])
-        self.assertNotEqual(Callable[[int], int], Callable[[], int])
-        self.assertNotEqual(Callable[[int], int], Callable)
-
-    def test_cannot_instantiate(self):
-        with self.assertRaises(TypeError):
-            Callable()
-        with self.assertRaises(TypeError):
-            type(Callable)()
-        c = Callable[[int], str]
-        with self.assertRaises(TypeError):
-            c()
-        with self.assertRaises(TypeError):
-            type(c)()
-
-    def test_callable_wrong_forms(self):
-        with self.assertRaises(TypeError):
-            Callable[[...], int]
-        with self.assertRaises(TypeError):
-            Callable[(), int]
-        with self.assertRaises(TypeError):
-            Callable[[()], int]
-        with self.assertRaises(TypeError):
-            Callable[[int, 1], 2]
-
-    def test_callable_instance_works(self):
-        def f():
-            pass
-        self.assertIsInstance(f, Callable)
-        self.assertNotIsInstance(None, Callable)
-
-    def test_callable_instance_type_error(self):
-        def f():
-            pass
-        with self.assertRaises(TypeError):
-            self.assertIsInstance(f, Callable[[], None])
-        with self.assertRaises(TypeError):
-            self.assertIsInstance(f, Callable[[], Any])
-        with self.assertRaises(TypeError):
-            self.assertNotIsInstance(None, Callable[[], None])
-        with self.assertRaises(TypeError):
-            self.assertNotIsInstance(None, Callable[[], Any])
-
-    def test_repr(self):
-        ct0 = Callable[[], bool]
-        self.assertEqual(repr(ct0), 'typing.Callable[[], bool]')
-        ct2 = Callable[[str, float], int]
-        self.assertEqual(repr(ct2), 'typing.Callable[[str, float], int]')
-        ctv = Callable[..., str]
-        self.assertEqual(repr(ctv), 'typing.Callable[..., str]')
-
-    def test_callable_with_ellipsis(self):
-
-        def foo(a: Callable[..., T]):
-            pass
-
-        self.assertEqual(get_type_hints(foo, globals(), locals()),
-                         {'a': Callable[..., T]})
-
-    def test_ellipsis_in_generic(self):
-        # Shouldn't crash; see https://github.com/python/typing/issues/259
-        typing.List[Callable[..., str]]
-
-
-XK = TypeVar('XK', str, bytes)
-XV = TypeVar('XV')
-
-
-class SimpleMapping(Generic[XK, XV]):
-
-    def __getitem__(self, key: XK) -> XV:
-        ...
-
-    def __setitem__(self, key: XK, value: XV):
-        ...
-
-    def get(self, key: XK, default: XV = None) -> XV:
-        ...
-
-
-class MySimpleMapping(SimpleMapping[XK, XV]):
-
-    def __init__(self):
-        self.store = {}
-
-    def __getitem__(self, key: str):
-        return self.store[key]
-
-    def __setitem__(self, key: str, value):
-        self.store[key] = value
-
-    def get(self, key: str, default=None):
-        try:
-            return self.store[key]
-        except KeyError:
-            return default
-
-
-class ProtocolTests(BaseTestCase):
-
-    def test_supports_int(self):
-        self.assertIsSubclass(int, typing.SupportsInt)
-        self.assertNotIsSubclass(str, typing.SupportsInt)
-
-    def test_supports_float(self):
-        self.assertIsSubclass(float, typing.SupportsFloat)
-        self.assertNotIsSubclass(str, typing.SupportsFloat)
-
-    def test_supports_complex(self):
-
-        # Note: complex itself doesn't have __complex__.
-        class C:
-            def __complex__(self):
-                return 0j
-
-        self.assertIsSubclass(C, typing.SupportsComplex)
-        self.assertNotIsSubclass(str, typing.SupportsComplex)
-
-    def test_supports_bytes(self):
-
-        # Note: bytes itself doesn't have __bytes__.
-        class B:
-            def __bytes__(self):
-                return b''
-
-        self.assertIsSubclass(B, typing.SupportsBytes)
-        self.assertNotIsSubclass(str, typing.SupportsBytes)
-
-    def test_supports_abs(self):
-        self.assertIsSubclass(float, typing.SupportsAbs)
-        self.assertIsSubclass(int, typing.SupportsAbs)
-        self.assertNotIsSubclass(str, typing.SupportsAbs)
-
-    def test_supports_round(self):
-        issubclass(float, typing.SupportsRound)
-        self.assertIsSubclass(float, typing.SupportsRound)
-        self.assertIsSubclass(int, typing.SupportsRound)
-        self.assertNotIsSubclass(str, typing.SupportsRound)
-
-    def test_reversible(self):
-        self.assertIsSubclass(list, typing.Reversible)
-        self.assertNotIsSubclass(int, typing.Reversible)
-
-    def test_protocol_instance_type_error(self):
-        with self.assertRaises(TypeError):
-            isinstance(0, typing.SupportsAbs)
-        class C1(typing.SupportsInt):
-            def __int__(self) -> int:
-                return 42
-        class C2(C1):
-            pass
-        c = C2()
-        self.assertIsInstance(c, C1)
-
-
-class GenericTests(BaseTestCase):
-
-    def test_basics(self):
-        X = SimpleMapping[str, Any]
-        self.assertEqual(X.__parameters__, ())
-        with self.assertRaises(TypeError):
-            X[str]
-        with self.assertRaises(TypeError):
-            X[str, str]
-        Y = SimpleMapping[XK, str]
-        self.assertEqual(Y.__parameters__, (XK,))
-        Y[str]
-        with self.assertRaises(TypeError):
-            Y[str, str]
-
-    def test_generic_errors(self):
-        T = TypeVar('T')
-        with self.assertRaises(TypeError):
-            Generic[T]()
-        with self.assertRaises(TypeError):
-            isinstance([], List[int])
-        with self.assertRaises(TypeError):
-            issubclass(list, List[int])
-
-    def test_init(self):
-        T = TypeVar('T')
-        S = TypeVar('S')
-        with self.assertRaises(TypeError):
-            Generic[T, T]
-        with self.assertRaises(TypeError):
-            Generic[T, S, T]
-
-    def test_repr(self):
-        self.assertEqual(repr(SimpleMapping),
-                         __name__ + '.' + 'SimpleMapping')
-        self.assertEqual(repr(MySimpleMapping),
-                         __name__ + '.' + 'MySimpleMapping')
-
-    def test_chain_repr(self):
-        T = TypeVar('T')
-        S = TypeVar('S')
-
-        class C(Generic[T]):
-            pass
-
-        X = C[Tuple[S, T]]
-        self.assertEqual(X, C[Tuple[S, T]])
-        self.assertNotEqual(X, C[Tuple[T, S]])
-
-        Y = X[T, int]
-        self.assertEqual(Y, X[T, int])
-        self.assertNotEqual(Y, X[S, int])
-        self.assertNotEqual(Y, X[T, str])
-
-        Z = Y[str]
-        self.assertEqual(Z, Y[str])
-        self.assertNotEqual(Z, Y[int])
-        self.assertNotEqual(Z, Y[T])
-
-        self.assertTrue(str(Z).endswith(
-            '.C[typing.Tuple[str, int]]'))
-
-    def test_new_repr(self):
-        T = TypeVar('T')
-        U = TypeVar('U', covariant=True)
-        S = TypeVar('S')
-
-        self.assertEqual(repr(List), 'typing.List')
-        self.assertEqual(repr(List[T]), 'typing.List[~T]')
-        self.assertEqual(repr(List[U]), 'typing.List[+U]')
-        self.assertEqual(repr(List[S][T][int]), 'typing.List[int]')
-        self.assertEqual(repr(List[int]), 'typing.List[int]')
-
-    def test_new_repr_complex(self):
-        T = TypeVar('T')
-        TS = TypeVar('TS')
-
-        self.assertEqual(repr(typing.Mapping[T, TS][TS, T]), 'typing.Mapping[~TS, ~T]')
-        self.assertEqual(repr(List[Tuple[T, TS]][int, T]),
-                         'typing.List[typing.Tuple[int, ~T]]')
-        self.assertEqual(repr(List[Tuple[T, T]][List[int]]),
-                 'typing.List[typing.Tuple[typing.List[int], typing.List[int]]]')
-
-    def test_new_repr_bare(self):
-        T = TypeVar('T')
-        self.assertEqual(repr(Generic[T]), 'typing.Generic[~T]')
-        self.assertEqual(repr(typing._Protocol[T]), 'typing.Protocol[~T]')
-        class C(typing.Dict[Any, Any]): ...
-        # this line should just work
-        repr(C.__mro__)
-
-    def test_dict(self):
-        T = TypeVar('T')
-
-        class B(Generic[T]):
-            pass
-
-        b = B()
-        b.foo = 42
-        self.assertEqual(b.__dict__, {'foo': 42})
-
-        class C(B[int]):
-            pass
-
-        c = C()
-        c.bar = 'abc'
-        self.assertEqual(c.__dict__, {'bar': 'abc'})
-
-    def test_false_subclasses(self):
-        class MyMapping(MutableMapping[str, str]): pass
-        self.assertNotIsInstance({}, MyMapping)
-        self.assertNotIsSubclass(dict, MyMapping)
-
-    def test_abc_bases(self):
-        class MM(MutableMapping[str, str]):
-            def __getitem__(self, k):
-                return None
-            def __setitem__(self, k, v):
-                pass
-            def __delitem__(self, k):
-                pass
-            def __iter__(self):
-                return iter(())
-            def __len__(self):
-                return 0
-        # this should just work
-        MM().update()
-        self.assertIsInstance(MM(), collections_abc.MutableMapping)
-        self.assertIsInstance(MM(), MutableMapping)
-        self.assertNotIsInstance(MM(), List)
-        self.assertNotIsInstance({}, MM)
-
-    def test_multiple_bases(self):
-        class MM1(MutableMapping[str, str], collections_abc.MutableMapping):
-            pass
-        with self.assertRaises(TypeError):
-            # consistent MRO not possible
-            class MM2(collections_abc.MutableMapping, MutableMapping[str, str]):
-                pass
-
-    def test_orig_bases(self):
-        T = TypeVar('T')
-        class C(typing.Dict[str, T]): ...
-        self.assertEqual(C.__orig_bases__, (typing.Dict[str, T],))
-
-    def test_naive_runtime_checks(self):
-        def naive_dict_check(obj, tp):
-            # Check if a dictionary conforms to Dict type
-            if len(tp.__parameters__) > 0:
-                raise NotImplementedError
-            if tp.__args__:
-                KT, VT = tp.__args__
-                return all(isinstance(k, KT) and isinstance(v, VT)
-                   for k, v in obj.items())
-        self.assertTrue(naive_dict_check({'x': 1}, typing.Dict[str, int]))
-        self.assertFalse(naive_dict_check({1: 'x'}, typing.Dict[str, int]))
-        with self.assertRaises(NotImplementedError):
-            naive_dict_check({1: 'x'}, typing.Dict[str, T])
-
-        def naive_generic_check(obj, tp):
-            # Check if an instance conforms to the generic class
-            if not hasattr(obj, '__orig_class__'):
-                raise NotImplementedError
-            return obj.__orig_class__ == tp
-        class Node(Generic[T]): ...
-        self.assertTrue(naive_generic_check(Node[int](), Node[int]))
-        self.assertFalse(naive_generic_check(Node[str](), Node[int]))
-        self.assertFalse(naive_generic_check(Node[str](), List))
-        with self.assertRaises(NotImplementedError):
-            naive_generic_check([1,2,3], Node[int])
-
-        def naive_list_base_check(obj, tp):
-            # Check if list conforms to a List subclass
-            return all(isinstance(x, tp.__orig_bases__[0].__args__[0])
-                       for x in obj)
-        class C(List[int]): ...
-        self.assertTrue(naive_list_base_check([1, 2, 3], C))
-        self.assertFalse(naive_list_base_check(['a', 'b'], C))
-
-    def test_multi_subscr_base(self):
-        T = TypeVar('T')
-        U = TypeVar('U')
-        V = TypeVar('V')
-        class C(List[T][U][V]): ...
-        class D(C, List[T][U][V]): ...
-        self.assertEqual(C.__parameters__, (V,))
-        self.assertEqual(D.__parameters__, (V,))
-        self.assertEqual(C[int].__parameters__, ())
-        self.assertEqual(D[int].__parameters__, ())
-        self.assertEqual(C[int].__args__, (int,))
-        self.assertEqual(D[int].__args__, (int,))
-        self.assertEqual(C.__bases__, (List,))
-        self.assertEqual(D.__bases__, (C, List))
-        self.assertEqual(C.__orig_bases__, (List[T][U][V],))
-        self.assertEqual(D.__orig_bases__, (C, List[T][U][V]))
-
-    def test_extended_generic_rules_eq(self):
-        T = TypeVar('T')
-        U = TypeVar('U')
-        self.assertEqual(Tuple[T, T][int], Tuple[int, int])
-        self.assertEqual(typing.Iterable[Tuple[T, T]][T], typing.Iterable[Tuple[T, T]])
-        with self.assertRaises(TypeError):
-            Tuple[T, int][()]
-        with self.assertRaises(TypeError):
-            Tuple[T, U][T, ...]
-
-        self.assertEqual(Union[T, int][int], int)
-        self.assertEqual(Union[T, U][int, Union[int, str]], Union[int, str])
-        class Base: ...
-        class Derived(Base): ...
-        self.assertEqual(Union[T, Base][Derived], Base)
-        with self.assertRaises(TypeError):
-            Union[T, int][1]
-
-        self.assertEqual(Callable[[T], T][KT], Callable[[KT], KT])
-        self.assertEqual(Callable[..., List[T]][int], Callable[..., List[int]])
-        with self.assertRaises(TypeError):
-            Callable[[T], U][..., int]
-        with self.assertRaises(TypeError):
-            Callable[[T], U][[], int]
-
-    def test_extended_generic_rules_repr(self):
-        T = TypeVar('T')
-        self.assertEqual(repr(Union[Tuple, Callable]).replace('typing.', ''),
-                         'Union[Tuple, Callable]')
-        self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''),
-                         'Tuple')
-        self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''),
-                         'Callable[..., Union[int, NoneType]]')
-        self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''),
-                         'Callable[[], List[int]]')
-
-    def test_generic_forward_ref(self):
-        def foobar(x: List[List['CC']]): ...
-        class CC: ...
-        self.assertEqual(get_type_hints(foobar, globals(), locals()), {'x': List[List[CC]]})
-        T = TypeVar('T')
-        AT = Tuple[T, ...]
-        def barfoo(x: AT): ...
-        self.assertIs(get_type_hints(barfoo, globals(), locals())['x'], AT)
-        CT = Callable[..., List[T]]
-        def barfoo2(x: CT): ...
-        self.assertIs(get_type_hints(barfoo2, globals(), locals())['x'], CT)
-
-    def test_extended_generic_rules_subclassing(self):
-        class T1(Tuple[T, KT]): ...
-        class T2(Tuple[T, ...]): ...
-        class C1(Callable[[T], T]): ...
-        class C2(Callable[..., int]):
-            def __call__(self):
-                return None
-
-        self.assertEqual(T1.__parameters__, (T, KT))
-        self.assertEqual(T1[int, str].__args__, (int, str))
-        self.assertEqual(T1[int, T].__origin__, T1)
-
-        self.assertEqual(T2.__parameters__, (T,))
-        with self.assertRaises(TypeError):
-            T1[int]
-        with self.assertRaises(TypeError):
-            T2[int, str]
-
-        self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]')
-        self.assertEqual(C2.__parameters__, ())
-        self.assertIsInstance(C2(), collections_abc.Callable)
-        self.assertIsSubclass(C2, collections_abc.Callable)
-        self.assertIsSubclass(C1, collections_abc.Callable)
-        self.assertIsInstance(T1(), tuple)
-        self.assertIsSubclass(T2, tuple)
-        self.assertIsSubclass(Tuple[int, ...], typing.Sequence)
-        self.assertIsSubclass(Tuple[int, ...], typing.Iterable)
-
-    def test_fail_with_bare_union(self):
-        with self.assertRaises(TypeError):
-            List[Union]
-        with self.assertRaises(TypeError):
-            Tuple[Optional]
-        with self.assertRaises(TypeError):
-            ClassVar[ClassVar]
-        with self.assertRaises(TypeError):
-            List[ClassVar[int]]
-
-    def test_fail_with_bare_generic(self):
-        T = TypeVar('T')
-        with self.assertRaises(TypeError):
-            List[Generic]
-        with self.assertRaises(TypeError):
-            Tuple[Generic[T]]
-        with self.assertRaises(TypeError):
-            List[typing._Protocol]
-
-    def test_type_erasure_special(self):
-        T = TypeVar('T')
-        # this is the only test that checks type caching
-        self.clear_caches()
-        class MyTup(Tuple[T, T]): ...
-        self.assertIs(MyTup[int]().__class__, MyTup)
-        self.assertIs(MyTup[int]().__orig_class__, MyTup[int])
-        class MyCall(Callable[..., T]):
-            def __call__(self): return None
-        self.assertIs(MyCall[T]().__class__, MyCall)
-        self.assertIs(MyCall[T]().__orig_class__, MyCall[T])
-        class MyDict(typing.Dict[T, T]): ...
-        self.assertIs(MyDict[int]().__class__, MyDict)
-        self.assertIs(MyDict[int]().__orig_class__, MyDict[int])
-        class MyDef(typing.DefaultDict[str, T]): ...
-        self.assertIs(MyDef[int]().__class__, MyDef)
-        self.assertIs(MyDef[int]().__orig_class__, MyDef[int])
-
-    def test_all_repr_eq_any(self):
-        objs = (getattr(typing, el) for el in typing.__all__)
-        for obj in objs:
-            self.assertNotEqual(repr(obj), '')
-            self.assertEqual(obj, obj)
-            if getattr(obj, '__parameters__', None) and len(obj.__parameters__) == 1:
-                self.assertEqual(obj[Any].__args__, (Any,))
-            if isinstance(obj, type):
-                for base in obj.__mro__:
-                    self.assertNotEqual(repr(base), '')
-                    self.assertEqual(base, base)
-
-    def test_substitution_helper(self):
-        T = TypeVar('T')
-        KT = TypeVar('KT')
-        VT = TypeVar('VT')
-        class Map(Generic[KT, VT]):
-            def meth(self, k: KT, v: VT): ...
-        StrMap = Map[str, T]
-        obj = StrMap[int]()
-
-        new_args = typing._subs_tree(obj.__orig_class__)
-        new_annots = {k: typing._replace_arg(v, type(obj).__parameters__, new_args)
-                      for k, v in obj.meth.__annotations__.items()}
-
-        self.assertEqual(new_annots, {'k': str, 'v': int})
-
-    def test_pickle(self):
-        global C  # pickle wants to reference the class by name
-        T = TypeVar('T')
-
-        class B(Generic[T]):
-            pass
-
-        class C(B[int]):
-            pass
-
-        c = C()
-        c.foo = 42
-        c.bar = 'abc'
-        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
-            z = pickle.dumps(c, proto)
-            x = pickle.loads(z)
-            self.assertEqual(x.foo, 42)
-            self.assertEqual(x.bar, 'abc')
-            self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'})
-        simples = [Any, Union, Tuple, Callable, ClassVar, List, typing.Iterable]
-        for s in simples:
-            for proto in range(pickle.HIGHEST_PROTOCOL + 1):
-                z = pickle.dumps(s, proto)
-                x = pickle.loads(z)
-                self.assertEqual(s, x)
-
-    def test_copy_and_deepcopy(self):
-        T = TypeVar('T')
-        class Node(Generic[T]): ...
-        things = [Union[T, int], Tuple[T, int], Callable[..., T], Callable[[int], int],
-                  Tuple[Any, Any], Node[T], Node[int], Node[Any], typing.Iterable[T],
-                  typing.Iterable[Any], typing.Iterable[int], typing.Dict[int, str],
-                  typing.Dict[T, Any], ClassVar[int], ClassVar[List[T]], Tuple['T', 'T'],
-                  Union['T', int], List['T'], typing.Mapping['T', int]]
-        for t in things + [Any]:
-            self.assertEqual(t, copy(t))
-            self.assertEqual(t, deepcopy(t))
-
-    def test_parameterized_slots(self):
-        T = TypeVar('T')
-        class C(Generic[T]):
-            __slots__ = ('potato',)
-
-        c = C()
-        c_int = C[int]()
-        self.assertEqual(C.__slots__, C[str].__slots__)
-
-        c.potato = 0
-        c_int.potato = 0
-        with self.assertRaises(AttributeError):
-            c.tomato = 0
-        with self.assertRaises(AttributeError):
-            c_int.tomato = 0
-
-        def foo(x: C['C']): ...
-        self.assertEqual(get_type_hints(foo, globals(), locals())['x'], C[C])
-        self.assertEqual(get_type_hints(foo, globals(), locals())['x'].__slots__,
-                         C.__slots__)
-        self.assertEqual(copy(C[int]), deepcopy(C[int]))
-
-    def test_parameterized_slots_dict(self):
-        T = TypeVar('T')
-        class D(Generic[T]):
-            __slots__ = {'banana': 42}
-
-        d = D()
-        d_int = D[int]()
-        self.assertEqual(D.__slots__, D[str].__slots__)
-
-        d.banana = 'yes'
-        d_int.banana = 'yes'
-        with self.assertRaises(AttributeError):
-            d.foobar = 'no'
-        with self.assertRaises(AttributeError):
-            d_int.foobar = 'no'
-
-    def test_errors(self):
-        with self.assertRaises(TypeError):
-            B = SimpleMapping[XK, Any]
-
-            class C(Generic[B]):
-                pass
-
-    def test_repr_2(self):
-        PY32 = sys.version_info[:2] < (3, 3)
-
-        class C(Generic[T]):
-            pass
-
-        self.assertEqual(C.__module__, __name__)
-        if not PY32:
-            self.assertEqual(C.__qualname__,
-                             'GenericTests.test_repr_2.<locals>.C')
-        self.assertEqual(repr(C).split('.')[-1], 'C')
-        X = C[int]
-        self.assertEqual(X.__module__, __name__)
-        if not PY32:
-            self.assertTrue(X.__qualname__.endswith('.<locals>.C'))
-        self.assertEqual(repr(X).split('.')[-1], 'C[int]')
-
-        class Y(C[int]):
-            pass
-
-        self.assertEqual(Y.__module__, __name__)
-        if not PY32:
-            self.assertEqual(Y.__qualname__,
-                             'GenericTests.test_repr_2.<locals>.Y')
-        self.assertEqual(repr(Y).split('.')[-1], 'Y')
-
-    def test_eq_1(self):
-        self.assertEqual(Generic, Generic)
-        self.assertEqual(Generic[T], Generic[T])
-        self.assertNotEqual(Generic[KT], Generic[VT])
-
-    def test_eq_2(self):
-
-        class A(Generic[T]):
-            pass
-
-        class B(Generic[T]):
-            pass
-
-        self.assertEqual(A, A)
-        self.assertNotEqual(A, B)
-        self.assertEqual(A[T], A[T])
-        self.assertNotEqual(A[T], B[T])
-
-    def test_multiple_inheritance(self):
-
-        class A(Generic[T, VT]):
-            pass
-
-        class B(Generic[KT, T]):
-            pass
-
-        class C(A[T, VT], Generic[VT, T, KT], B[KT, T]):
-            pass
-
-        self.assertEqual(C.__parameters__, (VT, T, KT))
-
-    def test_nested(self):
-
-        G = Generic
-
-        class Visitor(G[T]):
-
-            a = None
-
-            def set(self, a: T):
-                self.a = a
-
-            def get(self):
-                return self.a
-
-            def visit(self) -> T:
-                return self.a
-
-        V = Visitor[typing.List[int]]
-
-        class IntListVisitor(V):
-
-            def append(self, x: int):
-                self.a.append(x)
-
-        a = IntListVisitor()
-        a.set([])
-        a.append(1)
-        a.append(42)
-        self.assertEqual(a.get(), [1, 42])
-
-    def test_type_erasure(self):
-        T = TypeVar('T')
-
-        class Node(Generic[T]):
-            def __init__(self, label: T,
-                         left: 'Node[T]' = None,
-                         right: 'Node[T]' = None):
-                self.label = label  # type: T
-                self.left = left  # type: Optional[Node[T]]
-                self.right = right  # type: Optional[Node[T]]
-
-        def foo(x: T):
-            a = Node(x)
-            b = Node[T](x)
-            c = Node[Any](x)
-            self.assertIs(type(a), Node)
-            self.assertIs(type(b), Node)
-            self.assertIs(type(c), Node)
-            self.assertEqual(a.label, x)
-            self.assertEqual(b.label, x)
-            self.assertEqual(c.label, x)
-
-        foo(42)
-
-    def test_implicit_any(self):
-        T = TypeVar('T')
-
-        class C(Generic[T]):
-            pass
-
-        class D(C):
-            pass
-
-        self.assertEqual(D.__parameters__, ())
-
-        with self.assertRaises(Exception):
-            D[int]
-        with self.assertRaises(Exception):
-            D[Any]
-        with self.assertRaises(Exception):
-            D[T]
-
-class ClassVarTests(BaseTestCase):
-
-    def test_basics(self):
-        with self.assertRaises(TypeError):
-            ClassVar[1]
-        with self.assertRaises(TypeError):
-            ClassVar[int, str]
-        with self.assertRaises(TypeError):
-            ClassVar[int][str]
-
-    def test_repr(self):
-        self.assertEqual(repr(ClassVar), 'typing.ClassVar')
-        cv = ClassVar[int]
-        self.assertEqual(repr(cv), 'typing.ClassVar[int]')
-        cv = ClassVar[Employee]
-        self.assertEqual(repr(cv), 'typing.ClassVar[%s.Employee]' % __name__)
-
-    def test_cannot_subclass(self):
-        with self.assertRaises(TypeError):
-            class C(type(ClassVar)):
-                pass
-        with self.assertRaises(TypeError):
-            class C(type(ClassVar[int])):
-                pass
-
-    def test_cannot_init(self):
-        with self.assertRaises(TypeError):
-            ClassVar()
-        with self.assertRaises(TypeError):
-            type(ClassVar)()
-        with self.assertRaises(TypeError):
-            type(ClassVar[Optional[int]])()
-
-    def test_no_isinstance(self):
-        with self.assertRaises(TypeError):
-            isinstance(1, ClassVar[int])
-        with self.assertRaises(TypeError):
-            issubclass(int, ClassVar)
-
-
-class CastTests(BaseTestCase):
-
-    def test_basics(self):
-        self.assertEqual(cast(int, 42), 42)
-        self.assertEqual(cast(float, 42), 42)
-        self.assertIs(type(cast(float, 42)), int)
-        self.assertEqual(cast(Any, 42), 42)
-        self.assertEqual(cast(list, 42), 42)
-        self.assertEqual(cast(Union[str, float], 42), 42)
-        self.assertEqual(cast(AnyStr, 42), 42)
-        self.assertEqual(cast(None, 42), 42)
-
-    def test_errors(self):
-        # Bogus calls are not expected to fail.
-        cast(42, 42)
-        cast('hello', 42)
-
-
-class ForwardRefTests(BaseTestCase):
-
-    def test_basics(self):
-
-        class Node(Generic[T]):
-
-            def __init__(self, label: T):
-                self.label = label
-                self.left = self.right = None
-
-            def add_both(self,
-                         left: 'Optional[Node[T]]',
-                         right: 'Node[T]' = None,
-                         stuff: int = None,
-                         blah=None):
-                self.left = left
-                self.right = right
-
-            def add_left(self, node: Optional['Node[T]']):
-                self.add_both(node, None)
-
-            def add_right(self, node: 'Node[T]' = None):
-                self.add_both(None, node)
-
-        t = Node[int]
-        both_hints = get_type_hints(t.add_both, globals(), locals())
-        self.assertEqual(both_hints['left'], Optional[Node[T]])
-        self.assertEqual(both_hints['right'], Optional[Node[T]])
-        self.assertEqual(both_hints['left'], both_hints['right'])
-        self.assertEqual(both_hints['stuff'], Optional[int])
-        self.assertNotIn('blah', both_hints)
-
-        left_hints = get_type_hints(t.add_left, globals(), locals())
-        self.assertEqual(left_hints['node'], Optional[Node[T]])
-
-        right_hints = get_type_hints(t.add_right, globals(), locals())
-        self.assertEqual(right_hints['node'], Optional[Node[T]])
-
-    def test_forwardref_instance_type_error(self):
-        fr = typing._ForwardRef('int')
-        with self.assertRaises(TypeError):
-            isinstance(42, fr)
-
-    def test_union_forward(self):
-
-        def foo(a: Union['T']):
-            pass
-
-        self.assertEqual(get_type_hints(foo, globals(), locals()),
-                         {'a': Union[T]})
-
-    def test_tuple_forward(self):
-
-        def foo(a: Tuple['T']):
-            pass
-
-        self.assertEqual(get_type_hints(foo, globals(), locals()),
-                         {'a': Tuple[T]})
-
-    def test_callable_forward(self):
-
-        def foo(a: Callable[['T'], 'T']):
-            pass
-
-        self.assertEqual(get_type_hints(foo, globals(), locals()),
-                         {'a': Callable[[T], T]})
-
-    def test_callable_with_ellipsis_forward(self):
-
-        def foo(a: 'Callable[..., T]'):
-            pass
-
-        self.assertEqual(get_type_hints(foo, globals(), locals()),
-                         {'a': Callable[..., T]})
-
-    def test_syntax_error(self):
-
-        with self.assertRaises(SyntaxError):
-            Generic['/T']
-
-    def test_delayed_syntax_error(self):
-
-        def foo(a: 'Node[T'):
-            pass
-
-        with self.assertRaises(SyntaxError):
-            get_type_hints(foo)
-
-    def test_type_error(self):
-
-        def foo(a: Tuple['42']):
-            pass
-
-        with self.assertRaises(TypeError):
-            get_type_hints(foo)
-
-    def test_name_error(self):
-
-        def foo(a: 'Noode[T]'):
-            pass
-
-        with self.assertRaises(NameError):
-            get_type_hints(foo, locals())
-
-    def test_no_type_check(self):
-
-        @no_type_check
-        def foo(a: 'whatevers') -> {}:
-            pass
-
-        th = get_type_hints(foo)
-        self.assertEqual(th, {})
-
-    def test_no_type_check_class(self):
-
-        @no_type_check
-        class C:
-            def foo(a: 'whatevers') -> {}:
-                pass
-
-        cth = get_type_hints(C.foo)
-        self.assertEqual(cth, {})
-        ith = get_type_hints(C().foo)
-        self.assertEqual(ith, {})
-
-    def test_meta_no_type_check(self):
-
-        @no_type_check_decorator
-        def magic_decorator(deco):
-            return deco
-
-        self.assertEqual(magic_decorator.__name__, 'magic_decorator')
-
-        @magic_decorator
-        def foo(a: 'whatevers') -> {}:
-            pass
-
-        @magic_decorator
-        class C:
-            def foo(a: 'whatevers') -> {}:
-                pass
-
-        self.assertEqual(foo.__name__, 'foo')
-        th = get_type_hints(foo)
-        self.assertEqual(th, {})
-        cth = get_type_hints(C.foo)
-        self.assertEqual(cth, {})
-        ith = get_type_hints(C().foo)
-        self.assertEqual(ith, {})
-
-    def test_default_globals(self):
-        code = ("class C:\n"
-                "    def foo(self, a: 'C') -> 'D': pass\n"
-                "class D:\n"
-                "    def bar(self, b: 'D') -> C: pass\n"
-                )
-        ns = {}
-        exec(code, ns)
-        hints = get_type_hints(ns['C'].foo)
-        self.assertEqual(hints, {'a': ns['C'], 'return': ns['D']})
-
-
-class OverloadTests(BaseTestCase):
-
-    def test_overload_exists(self):
-        from typing import overload
-
-    def test_overload_fails(self):
-        from typing import overload
-
-        with self.assertRaises(RuntimeError):
-
-            @overload
-            def blah():
-                pass
-
-            blah()
-
-    def test_overload_succeeds(self):
-        from typing import overload
-
-        @overload
-        def blah():
-            pass
-
-        def blah():
-            pass
-
-        blah()
-
-
-ASYNCIO = sys.version_info[:2] >= (3, 5)
-
-ASYNCIO_TESTS = """
-import asyncio
-
-T_a = TypeVar('T_a')
-
-class AwaitableWrapper(typing.Awaitable[T_a]):
-
-    def __init__(self, value):
-        self.value = value
-
-    def __await__(self) -> typing.Iterator[T_a]:
-        yield
-        return self.value
-
-class AsyncIteratorWrapper(typing.AsyncIterator[T_a]):
-
-    def __init__(self, value: typing.Iterable[T_a]):
-        self.value = value
-
-    def __aiter__(self) -> typing.AsyncIterator[T_a]:
-        return self
-
-    @asyncio.coroutine
-    def __anext__(self) -> T_a:
-        data = yield from self.value
-        if data:
-            return data
-        else:
-            raise StopAsyncIteration
-"""
-
-if ASYNCIO:
-    try:
-        exec(ASYNCIO_TESTS)
-    except ImportError:
-        ASYNCIO = False
-
-PY36 = sys.version_info[:2] >= (3, 6)
-
-PY36_TESTS = """
-from test import ann_module, ann_module2, ann_module3
-
-class A:
-    y: float
-class B(A):
-    x: ClassVar[Optional['B']] = None
-    y: int
-class CSub(B):
-    z: ClassVar['CSub'] = B()
-class G(Generic[T]):
-    lst: ClassVar[List[T]] = []
-
-class CoolEmployee(NamedTuple):
-    name: str
-    cool: int
-"""
-
-if PY36:
-    exec(PY36_TESTS)
-
-gth = get_type_hints
-
-class GetTypeHintTests(BaseTestCase):
-    def test_get_type_hints_from_various_objects(self):
-        # For invalid objects should fail with TypeError (not AttributeError etc).
-        with self.assertRaises(TypeError):
-            gth(123)
-        with self.assertRaises(TypeError):
-            gth('abc')
-        with self.assertRaises(TypeError):
-            gth(None)
-
-    @skipUnless(PY36, 'Python 3.6 required')
-    def test_get_type_hints_modules(self):
-        self.assertEqual(gth(ann_module), {1: 2, 'f': Tuple[int, int], 'x': int, 'y': str})
-        self.assertEqual(gth(ann_module2), {})
-        self.assertEqual(gth(ann_module3), {})
-
-    @skipUnless(PY36, 'Python 3.6 required')
-    def test_get_type_hints_classes(self):
-        self.assertEqual(gth(ann_module.C, ann_module.__dict__),
-                         {'y': Optional[ann_module.C]})
-        self.assertIsInstance(gth(ann_module.j_class), dict)
-        self.assertEqual(gth(ann_module.M), {'123': 123, 'o': type})
-        self.assertEqual(gth(ann_module.D),
-                         {'j': str, 'k': str, 'y': Optional[ann_module.C]})
-        self.assertEqual(gth(ann_module.Y), {'z': int})
-        self.assertEqual(gth(ann_module.h_class),
-                         {'y': Optional[ann_module.C]})
-        self.assertEqual(gth(ann_module.S), {'x': str, 'y': str})
-        self.assertEqual(gth(ann_module.foo), {'x': int})
-
-    @skipUnless(PY36, 'Python 3.6 required')
-    def test_respect_no_type_check(self):
-        @no_type_check
-        class NoTpCheck:
-            class Inn:
-                def __init__(self, x: 'not a type'): ...
-        self.assertTrue(NoTpCheck.__no_type_check__)
-        self.assertTrue(NoTpCheck.Inn.__init__.__no_type_check__)
-        self.assertEqual(gth(ann_module2.NTC.meth), {})
-        class ABase(Generic[T]):
-            def meth(x: int): ...
-        @no_type_check
-        class Der(ABase): ...
-        self.assertEqual(gth(ABase.meth), {'x': int})
-
-    def test_get_type_hints_for_builins(self):
-        # Should not fail for built-in classes and functions.
-        self.assertEqual(gth(int), {})
-        self.assertEqual(gth(type), {})
-        self.assertEqual(gth(dir), {})
-        self.assertEqual(gth(len), {})
-
-    def test_previous_behavior(self):
-        def testf(x, y): ...
-        testf.__annotations__['x'] = 'int'
-        self.assertEqual(gth(testf), {'x': int})
-
-    def test_get_type_hints_for_object_with_annotations(self):
-        class A: ...
-        class B: ...
-        b = B()
-        b.__annotations__ = {'x': 'A'}
-        self.assertEqual(gth(b, locals()), {'x': A})
-
-    @skipUnless(PY36, 'Python 3.6 required')
-    def test_get_type_hints_ClassVar(self):
-        self.assertEqual(gth(ann_module2.CV, ann_module2.__dict__),
-                         {'var': typing.ClassVar[ann_module2.CV]})
-        self.assertEqual(gth(B, globals()),
-                         {'y': int, 'x': ClassVar[Optional[B]]})
-        self.assertEqual(gth(CSub, globals()),
-                         {'z': ClassVar[CSub], 'y': int, 'x': ClassVar[Optional[B]]})
-        self.assertEqual(gth(G), {'lst': ClassVar[List[T]]})
-
-
-class CollectionsAbcTests(BaseTestCase):
-
-    def test_hashable(self):
-        self.assertIsInstance(42, typing.Hashable)
-        self.assertNotIsInstance([], typing.Hashable)
-
-    def test_iterable(self):
-        self.assertIsInstance([], typing.Iterable)
-        # Due to ABC caching, the second time takes a separate code
-        # path and could fail.  So call this a few times.
-        self.assertIsInstance([], typing.Iterable)
-        self.assertIsInstance([], typing.Iterable)
-        self.assertNotIsInstance(42, typing.Iterable)
-        # Just in case, also test issubclass() a few times.
-        self.assertIsSubclass(list, typing.Iterable)
-        self.assertIsSubclass(list, typing.Iterable)
-
-    def test_iterator(self):
-        it = iter([])
-        self.assertIsInstance(it, typing.Iterator)
-        self.assertNotIsInstance(42, typing.Iterator)
-
-    @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
-    def test_awaitable(self):
-        ns = {}
-        exec(
-            "async def foo() -> typing.Awaitable[int]:\n"
-            "    return await AwaitableWrapper(42)\n",
-            globals(), ns)
-        foo = ns['foo']
-        g = foo()
-        self.assertIsInstance(g, typing.Awaitable)
-        self.assertNotIsInstance(foo, typing.Awaitable)
-        g.send(None)  # Run foo() till completion, to avoid warning.
-
-    @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
-    def test_coroutine(self):
-        ns = {}
-        exec(
-            "async def foo():\n"
-            "    return\n",
-            globals(), ns)
-        foo = ns['foo']
-        g = foo()
-        self.assertIsInstance(g, typing.Coroutine)
-        with self.assertRaises(TypeError):
-            isinstance(g, typing.Coroutine[int])
-        self.assertNotIsInstance(foo, typing.Coroutine)
-        try:
-            g.send(None)
-        except StopIteration:
-            pass
-
-    @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
-    def test_async_iterable(self):
-        base_it = range(10)  # type: Iterator[int]
-        it = AsyncIteratorWrapper(base_it)
-        self.assertIsInstance(it, typing.AsyncIterable)
-        self.assertIsInstance(it, typing.AsyncIterable)
-        self.assertNotIsInstance(42, typing.AsyncIterable)
-
-    @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
-    def test_async_iterator(self):
-        base_it = range(10)  # type: Iterator[int]
-        it = AsyncIteratorWrapper(base_it)
-        self.assertIsInstance(it, typing.AsyncIterator)
-        self.assertNotIsInstance(42, typing.AsyncIterator)
-
-    def test_sized(self):
-        self.assertIsInstance([], typing.Sized)
-        self.assertNotIsInstance(42, typing.Sized)
-
-    def test_container(self):
-        self.assertIsInstance([], typing.Container)
-        self.assertNotIsInstance(42, typing.Container)
-
-    def test_collection(self):
-        if hasattr(typing, 'Collection'):
-            self.assertIsInstance(tuple(), typing.Collection)
-            self.assertIsInstance(frozenset(), typing.Collection)
-            self.assertIsSubclass(dict, typing.Collection)
-            self.assertNotIsInstance(42, typing.Collection)
-
-    def test_abstractset(self):
-        self.assertIsInstance(set(), typing.AbstractSet)
-        self.assertNotIsInstance(42, typing.AbstractSet)
-
-    def test_mutableset(self):
-        self.assertIsInstance(set(), typing.MutableSet)
-        self.assertNotIsInstance(frozenset(), typing.MutableSet)
-
-    def test_mapping(self):
-        self.assertIsInstance({}, typing.Mapping)
-        self.assertNotIsInstance(42, typing.Mapping)
-
-    def test_mutablemapping(self):
-        self.assertIsInstance({}, typing.MutableMapping)
-        self.assertNotIsInstance(42, typing.MutableMapping)
-
-    def test_sequence(self):
-        self.assertIsInstance([], typing.Sequence)
-        self.assertNotIsInstance(42, typing.Sequence)
-
-    def test_mutablesequence(self):
-        self.assertIsInstance([], typing.MutableSequence)
-        self.assertNotIsInstance((), typing.MutableSequence)
-
-    def test_bytestring(self):
-        self.assertIsInstance(b'', typing.ByteString)
-        self.assertIsInstance(bytearray(b''), typing.ByteString)
-
-    def test_list(self):
-        self.assertIsSubclass(list, typing.List)
-
-    def test_set(self):
-        self.assertIsSubclass(set, typing.Set)
-        self.assertNotIsSubclass(frozenset, typing.Set)
-
-    def test_frozenset(self):
-        self.assertIsSubclass(frozenset, typing.FrozenSet)
-        self.assertNotIsSubclass(set, typing.FrozenSet)
-
-    def test_dict(self):
-        self.assertIsSubclass(dict, typing.Dict)
-
-    def test_no_list_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.List()
-        with self.assertRaises(TypeError):
-            typing.List[T]()
-        with self.assertRaises(TypeError):
-            typing.List[int]()
-
-    def test_list_subclass(self):
-
-        class MyList(typing.List[int]):
-            pass
-
-        a = MyList()
-        self.assertIsInstance(a, MyList)
-        self.assertIsInstance(a, typing.Sequence)
-
-        self.assertIsSubclass(MyList, list)
-        self.assertNotIsSubclass(list, MyList)
-
-    def test_no_dict_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.Dict()
-        with self.assertRaises(TypeError):
-            typing.Dict[KT, VT]()
-        with self.assertRaises(TypeError):
-            typing.Dict[str, int]()
-
-    def test_dict_subclass(self):
-
-        class MyDict(typing.Dict[str, int]):
-            pass
-
-        d = MyDict()
-        self.assertIsInstance(d, MyDict)
-        self.assertIsInstance(d, typing.MutableMapping)
-
-        self.assertIsSubclass(MyDict, dict)
-        self.assertNotIsSubclass(dict, MyDict)
-
-    def test_no_defaultdict_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.DefaultDict()
-        with self.assertRaises(TypeError):
-            typing.DefaultDict[KT, VT]()
-        with self.assertRaises(TypeError):
-            typing.DefaultDict[str, int]()
-
-    def test_defaultdict_subclass(self):
-
-        class MyDefDict(typing.DefaultDict[str, int]):
-            pass
-
-        dd = MyDefDict()
-        self.assertIsInstance(dd, MyDefDict)
-
-        self.assertIsSubclass(MyDefDict, collections.defaultdict)
-        self.assertNotIsSubclass(collections.defaultdict, MyDefDict)
-
-    def test_no_set_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.Set()
-        with self.assertRaises(TypeError):
-            typing.Set[T]()
-        with self.assertRaises(TypeError):
-            typing.Set[int]()
-
-    def test_set_subclass_instantiation(self):
-
-        class MySet(typing.Set[int]):
-            pass
-
-        d = MySet()
-        self.assertIsInstance(d, MySet)
-
-    def test_no_frozenset_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.FrozenSet()
-        with self.assertRaises(TypeError):
-            typing.FrozenSet[T]()
-        with self.assertRaises(TypeError):
-            typing.FrozenSet[int]()
-
-    def test_frozenset_subclass_instantiation(self):
-
-        class MyFrozenSet(typing.FrozenSet[int]):
-            pass
-
-        d = MyFrozenSet()
-        self.assertIsInstance(d, MyFrozenSet)
-
-    def test_no_tuple_instantiation(self):
-        with self.assertRaises(TypeError):
-            Tuple()
-        with self.assertRaises(TypeError):
-            Tuple[T]()
-        with self.assertRaises(TypeError):
-            Tuple[int]()
-
-    def test_generator(self):
-        def foo():
-            yield 42
-        g = foo()
-        self.assertIsSubclass(type(g), typing.Generator)
-
-    def test_no_generator_instantiation(self):
-        with self.assertRaises(TypeError):
-            typing.Generator()
-        with self.assertRaises(TypeError):
-            typing.Generator[T, T, T]()
-        with self.assertRaises(TypeError):
-            typing.Generator[int, int, int]()
-
-    def test_subclassing(self):
-
-        class MMA(typing.MutableMapping):
-            pass
-
-        with self.assertRaises(TypeError):  # It's abstract
-            MMA()
-
-        class MMC(MMA):
-            def __getitem__(self, k):
-                return None
-            def __setitem__(self, k, v):
-                pass
-            def __delitem__(self, k):
-                pass
-            def __iter__(self):
-                return iter(())
-            def __len__(self):
-                return 0
-
-        self.assertEqual(len(MMC()), 0)
-        assert callable(MMC.update)
-        self.assertIsInstance(MMC(), typing.Mapping)
-
-        class MMB(typing.MutableMapping[KT, VT]):
-            def __getitem__(self, k):
-                return None
-            def __setitem__(self, k, v):
-                pass
-            def __delitem__(self, k):
-                pass
-            def __iter__(self):
-                return iter(())
-            def __len__(self):
-                return 0
-
-        self.assertEqual(len(MMB()), 0)
-        self.assertEqual(len(MMB[str, str]()), 0)
-        self.assertEqual(len(MMB[KT, VT]()), 0)
-
-        self.assertNotIsSubclass(dict, MMA)
-        self.assertNotIsSubclass(dict, MMB)
-
-        self.assertIsSubclass(MMA, typing.Mapping)
-        self.assertIsSubclass(MMB, typing.Mapping)
-        self.assertIsSubclass(MMC, typing.Mapping)
-
-        self.assertIsInstance(MMB[KT, VT](), typing.Mapping)
-        self.assertIsInstance(MMB[KT, VT](), collections.Mapping)
-
-        self.assertIsSubclass(MMA, collections.Mapping)
-        self.assertIsSubclass(MMB, collections.Mapping)
-        self.assertIsSubclass(MMC, collections.Mapping)
-
-        self.assertIsSubclass(MMB[str, str], typing.Mapping)
-        self.assertIsSubclass(MMC, MMA)
-
-        class I(typing.Iterable): ...
-        self.assertNotIsSubclass(list, I)
-
-        class G(typing.Generator[int, int, int]): ...
-        def g(): yield 0
-        self.assertIsSubclass(G, typing.Generator)
-        self.assertIsSubclass(G, typing.Iterable)
-        if hasattr(collections, 'Generator'):
-            self.assertIsSubclass(G, collections.Generator)
-        self.assertIsSubclass(G, collections.Iterable)
-        self.assertNotIsSubclass(type(g), G)
-
-    def test_subclassing_subclasshook(self):
-
-        class Base(typing.Iterable):
-            @classmethod
-            def __subclasshook__(cls, other):
-                if other.__name__ == 'Foo':
-                    return True
-                else:
-                    return False
-
-        class C(Base): ...
-        class Foo: ...
-        class Bar: ...
-        self.assertIsSubclass(Foo, Base)
-        self.assertIsSubclass(Foo, C)
-        self.assertNotIsSubclass(Bar, C)
-
-    def test_subclassing_register(self):
-
-        class A(typing.Container): ...
-        class B(A): ...
-
-        class C: ...
-        A.register(C)
-        self.assertIsSubclass(C, A)
-        self.assertNotIsSubclass(C, B)
-
-        class D: ...
-        B.register(D)
-        self.assertIsSubclass(D, A)
-        self.assertIsSubclass(D, B)
-
-        class M(): ...
-        collections.MutableMapping.register(M)
-        self.assertIsSubclass(M, typing.Mapping)
-
-    def test_collections_as_base(self):
-
-        class M(collections.Mapping): ...
-        self.assertIsSubclass(M, typing.Mapping)
-        self.assertIsSubclass(M, typing.Iterable)
-
-        class S(collections.MutableSequence): ...
-        self.assertIsSubclass(S, typing.MutableSequence)
-        self.assertIsSubclass(S, typing.Iterable)
-
-        class I(collections.Iterable): ...
-        self.assertIsSubclass(I, typing.Iterable)
-
-        class A(collections.Mapping, metaclass=abc.ABCMeta): ...
-        class B: ...
-        A.register(B)
-        self.assertIsSubclass(B, typing.Mapping)
-
-
-class OtherABCTests(BaseTestCase):
-
-    @skipUnless(hasattr(typing, 'ContextManager'),
-                'requires typing.ContextManager')
-    def test_contextmanager(self):
-        @contextlib.contextmanager
-        def manager():
-            yield 42
-
-        cm = manager()
-        self.assertIsInstance(cm, typing.ContextManager)
-        self.assertNotIsInstance(42, typing.ContextManager)
-
-
-class TypeTests(BaseTestCase):
-
-    def test_type_basic(self):
-
-        class User: pass
-        class BasicUser(User): pass
-        class ProUser(User): pass
-
-        def new_user(user_class: Type[User]) -> User:
-            return user_class()
-
-        joe = new_user(BasicUser)
-
-    def test_type_typevar(self):
-
-        class User: pass
-        class BasicUser(User): pass
-        class ProUser(User): pass
-
-        U = TypeVar('U', bound=User)
-
-        def new_user(user_class: Type[U]) -> U:
-            return user_class()
-
-        joe = new_user(BasicUser)
-
-    def test_type_optional(self):
-        A = Optional[Type[BaseException]]
-
-        def foo(a: A) -> Optional[BaseException]:
-            if a is None:
-                return None
-            else:
-                return a()
-
-        assert isinstance(foo(KeyboardInterrupt), KeyboardInterrupt)
-        assert foo(None) is None
-
-
-class NewTypeTests(BaseTestCase):
-
-    def test_basic(self):
-        UserId = NewType('UserId', int)
-        UserName = NewType('UserName', str)
-        self.assertIsInstance(UserId(5), int)
-        self.assertIsInstance(UserName('Joe'), str)
-        self.assertEqual(UserId(5) + 1, 6)
-
-    def test_errors(self):
-        UserId = NewType('UserId', int)
-        UserName = NewType('UserName', str)
-        with self.assertRaises(TypeError):
-            issubclass(UserId, int)
-        with self.assertRaises(TypeError):
-            class D(UserName):
-                pass
-
-
-class NamedTupleTests(BaseTestCase):
-
-    def test_basics(self):
-        Emp = NamedTuple('Emp', [('name', str), ('id', int)])
-        self.assertIsSubclass(Emp, tuple)
-        joe = Emp('Joe', 42)
-        jim = Emp(name='Jim', id=1)
-        self.assertIsInstance(joe, Emp)
-        self.assertIsInstance(joe, tuple)
-        self.assertEqual(joe.name, 'Joe')
-        self.assertEqual(joe.id, 42)
-        self.assertEqual(jim.name, 'Jim')
-        self.assertEqual(jim.id, 1)
-        self.assertEqual(Emp.__name__, 'Emp')
-        self.assertEqual(Emp._fields, ('name', 'id'))
-        self.assertEqual(Emp._field_types, dict(name=str, id=int))
-
-    @skipUnless(PY36, 'Python 3.6 required')
-    def test_annotation_usage(self):
-        tim = CoolEmployee('Tim', 9000)
-        self.assertIsInstance(tim, CoolEmployee)
-        self.assertIsInstance(tim, tuple)
-        self.assertEqual(tim.name, 'Tim')
-        self.assertEqual(tim.cool, 9000)
-        self.assertEqual(CoolEmployee.__name__, 'CoolEmployee')
-        self.assertEqual(CoolEmployee._fields, ('name', 'cool'))
-        self.assertEqual(CoolEmployee._field_types, dict(name=str, cool=int))
-
-    @skipUnless(PY36, 'Python 3.6 required')
-    def test_namedtuple_keyword_usage(self):
-        LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int)
-        nick = LocalEmployee('Nick', 25)
-        self.assertIsInstance(nick, tuple)
-        self.assertEqual(nick.name, 'Nick')
-        self.assertEqual(LocalEmployee.__name__, 'LocalEmployee')
-        self.assertEqual(LocalEmployee._fields, ('name', 'age'))
-        self.assertEqual(LocalEmployee._field_types, dict(name=str, age=int))
-        with self.assertRaises(TypeError):
-            NamedTuple('Name', [('x', int)], y=str)
-        with self.assertRaises(TypeError):
-            NamedTuple('Name', x=1, y='a')
-
-    def test_pickle(self):
-        global Emp  # pickle wants to reference the class by name
-        Emp = NamedTuple('Emp', [('name', str), ('id', int)])
-        jane = Emp('jane', 37)
-        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
-            z = pickle.dumps(jane, proto)
-            jane2 = pickle.loads(z)
-            self.assertEqual(jane2, jane)
-
-
-class IOTests(BaseTestCase):
-
-    def test_io(self):
-
-        def stuff(a: IO) -> AnyStr:
-            return a.readline()
-
-        a = stuff.__annotations__['a']
-        self.assertEqual(a.__parameters__, (AnyStr,))
-
-    def test_textio(self):
-
-        def stuff(a: TextIO) -> str:
-            return a.readline()
-
-        a = stuff.__annotations__['a']
-        self.assertEqual(a.__parameters__, ())
-
-    def test_binaryio(self):
-
-        def stuff(a: BinaryIO) -> bytes:
-            return a.readline()
-
-        a = stuff.__annotations__['a']
-        self.assertEqual(a.__parameters__, ())
-
-    def test_io_submodule(self):
-        from typing.io import IO, TextIO, BinaryIO, __all__, __name__
-        self.assertIs(IO, typing.IO)
-        self.assertIs(TextIO, typing.TextIO)
-        self.assertIs(BinaryIO, typing.BinaryIO)
-        self.assertEqual(set(__all__), set(['IO', 'TextIO', 'BinaryIO']))
-        self.assertEqual(__name__, 'typing.io')
-
-
-class RETests(BaseTestCase):
-    # Much of this is really testing _TypeAlias.
-
-    def test_basics(self):
-        pat = re.compile('[a-z]+', re.I)
-        self.assertIsSubclass(pat.__class__, Pattern)
-        self.assertIsSubclass(type(pat), Pattern)
-        self.assertIsInstance(pat, Pattern)
-
-        mat = pat.search('12345abcde.....')
-        self.assertIsSubclass(mat.__class__, Match)
-        self.assertIsSubclass(type(mat), Match)
-        self.assertIsInstance(mat, Match)
-
-        # these should just work
-        p = Pattern[Union[str, bytes]]
-        m = Match[Union[bytes, str]]
-
-    def test_errors(self):
-        with self.assertRaises(TypeError):
-            # Doesn't fit AnyStr.
-            Pattern[int]
-        with self.assertRaises(TypeError):
-            # Can't change type vars?
-            Match[T]
-        m = Match[Union[str, bytes]]
-        with self.assertRaises(TypeError):
-            # Too complicated?
-            m[str]
-        with self.assertRaises(TypeError):
-            # We don't support isinstance().
-            isinstance(42, Pattern[str])
-
-    def test_repr(self):
-        self.assertEqual(repr(Pattern), 'Pattern[~AnyStr]')
-        self.assertEqual(repr(Pattern[str]), 'Pattern[str]')
-        self.assertEqual(repr(Pattern[bytes]), 'Pattern[bytes]')
-        self.assertEqual(repr(Match), 'Match[~AnyStr]')
-        self.assertEqual(repr(Match[str]), 'Match[str]')
-        self.assertEqual(repr(Match[bytes]), 'Match[bytes]')
-
-    def test_re_submodule(self):
-        from typing.re import Match, Pattern, __all__, __name__
-        self.assertIs(Match, typing.Match)
-        self.assertIs(Pattern, typing.Pattern)
-        self.assertEqual(set(__all__), set(['Match', 'Pattern']))
-        self.assertEqual(__name__, 'typing.re')
-
-    def test_cannot_subclass(self):
-        with self.assertRaises(TypeError) as ex:
-
-            class A(typing.Match):
-                pass
-
-        self.assertEqual(str(ex.exception),
-                         "Cannot subclass typing._TypeAlias")
-
-
-class AllTests(BaseTestCase):
-    """Tests for __all__."""
-
-    def test_all(self):
-        from typing import __all__ as a
-        # Just spot-check the first and last of every category.
-        self.assertIn('AbstractSet', a)
-        self.assertIn('ValuesView', a)
-        self.assertIn('cast', a)
-        self.assertIn('overload', a)
-        if hasattr(contextlib, 'AbstractContextManager'):
-            self.assertIn('ContextManager', a)
-        # Check that io and re are not exported.
-        self.assertNotIn('io', a)
-        self.assertNotIn('re', a)
-        # Spot-check that stdlib modules aren't exported.
-        self.assertNotIn('os', a)
-        self.assertNotIn('sys', a)
-        # Check that Text is defined.
-        self.assertIn('Text', a)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/lib-typing/3.2/typing.py b/lib-typing/3.2/typing.py
deleted file mode 100644
index 34845b7..0000000
--- a/lib-typing/3.2/typing.py
+++ /dev/null
@@ -1,2160 +0,0 @@
-import abc
-from abc import abstractmethod, abstractproperty
-import collections
-import contextlib
-import functools
-import re as stdlib_re  # Avoid confusion with the re we export.
-import sys
-import types
-try:
-    import collections.abc as collections_abc
-except ImportError:
-    import collections as collections_abc  # Fallback for PY3.2.
-
-
-# Please keep __all__ alphabetized within each category.
-__all__ = [
-    # Super-special typing primitives.
-    'Any',
-    'Callable',
-    'ClassVar',
-    'Generic',
-    'Optional',
-    'Tuple',
-    'Type',
-    'TypeVar',
-    'Union',
-
-    # ABCs (from collections.abc).
-    'AbstractSet',  # collections.abc.Set.
-    'ByteString',
-    'Container',
-    'Hashable',
-    'ItemsView',
-    'Iterable',
-    'Iterator',
-    'KeysView',
-    'Mapping',
-    'MappingView',
-    'MutableMapping',
-    'MutableSequence',
-    'MutableSet',
-    'Sequence',
-    'Sized',
-    'ValuesView',
-    # The following are added depending on presence
-    # of their non-generic counterparts in stdlib:
-    # Awaitable,
-    # AsyncIterator,
-    # AsyncIterable,
-    # Coroutine,
-    # Collection,
-    # ContextManager
-
-    # Structural checks, a.k.a. protocols.
-    'Reversible',
-    'SupportsAbs',
-    'SupportsFloat',
-    'SupportsInt',
-    'SupportsRound',
-
-    # Concrete collection types.
-    'Dict',
-    'DefaultDict',
-    'List',
-    'Set',
-    'FrozenSet',
-    'NamedTuple',  # Not really a type.
-    'Generator',
-
-    # One-off things.
-    'AnyStr',
-    'cast',
-    'get_type_hints',
-    'NewType',
-    'no_type_check',
-    'no_type_check_decorator',
-    'overload',
-    'Text',
-    'TYPE_CHECKING',
-]
-
-# The pseudo-submodules 're' and 'io' are part of the public
-# namespace, but excluded from __all__ because they might stomp on
-# legitimate imports of those modules.
-
-
-def _qualname(x):
-    if sys.version_info[:2] >= (3, 3):
-        return x.__qualname__
-    else:
-        # Fall back to just name.
-        return x.__name__
-
-
-def _trim_name(nm):
-    if nm.startswith('_') and nm not in ('_TypeAlias',
-                    '_ForwardRef', '_TypingBase', '_FinalTypingBase'):
-        nm = nm[1:]
-    return nm
-
-
-class TypingMeta(type):
-    """Metaclass for most types defined in typing module
-    (not a part of public API).
-
-    This overrides __new__() to require an extra keyword parameter
-    '_root', which serves as a guard against naive subclassing of the
-    typing classes.  Any legitimate class defined using a metaclass
-    derived from TypingMeta must pass _root=True.
-
-    This also defines a dummy constructor (all the work for most typing
-    constructs is done in __new__) and a nicer repr().
-    """
-
-    _is_protocol = False
-
-    def __new__(cls, name, bases, namespace, *, _root=False):
-        if not _root:
-            raise TypeError("Cannot subclass %s" %
-                            (', '.join(map(_type_repr, bases)) or '()'))
-        return super().__new__(cls, name, bases, namespace)
-
-    def __init__(self, *args, **kwds):
-        pass
-
-    def _eval_type(self, globalns, localns):
-        """Override this in subclasses to interpret forward references.
-
-        For example, List['C'] is internally stored as
-        List[_ForwardRef('C')], which should evaluate to List[C],
-        where C is an object found in globalns or localns (searching
-        localns first, of course).
-        """
-        return self
-
-    def _get_type_vars(self, tvars):
-        pass
-
-    def __repr__(self):
-        qname = _trim_name(_qualname(self))
-        return '%s.%s' % (self.__module__, qname)
-
-
-class _TypingBase(metaclass=TypingMeta, _root=True):
-    """Internal indicator of special typing constructs."""
-
-    __slots__ = ()
-
-    def __init__(self, *args, **kwds):
-        pass
-
-    def __new__(cls, *args, **kwds):
-        """Constructor.
-
-        This only exists to give a better error message in case
-        someone tries to subclass a special typing object (not a good idea).
-        """
-        if (len(args) == 3 and
-                isinstance(args[0], str) and
-                isinstance(args[1], tuple)):
-            # Close enough.
-            raise TypeError("Cannot subclass %r" % cls)
-        return super().__new__(cls)
-
-    # Things that are not classes also need these.
-    def _eval_type(self, globalns, localns):
-        return self
-
-    def _get_type_vars(self, tvars):
-        pass
-
-    def __repr__(self):
-        cls = type(self)
-        qname = _trim_name(_qualname(cls))
-        return '%s.%s' % (cls.__module__, qname)
-
-    def __call__(self, *args, **kwds):
-        raise TypeError("Cannot instantiate %r" % type(self))
-
-
-class _FinalTypingBase(_TypingBase, _root=True):
-    """Internal mix-in class to prevent instantiation.
-
-    Prevents instantiation unless _root=True is given in class call.
-    It is used to create pseudo-singleton instances Any, Union, Optional, etc.
-    """
-
-    __slots__ = ()
-
-    def __new__(cls, *args, _root=False, **kwds):
-        self = super().__new__(cls, *args, **kwds)
-        if _root is True:
-            return self
-        raise TypeError("Cannot instantiate %r" % cls)
-
-    def __reduce__(self):
-        return _trim_name(type(self).__name__)
-
-
-class _ForwardRef(_TypingBase, _root=True):
-    """Internal wrapper to hold a forward reference."""
-
-    __slots__ = ('__forward_arg__', '__forward_code__',
-                 '__forward_evaluated__', '__forward_value__')
-
-    def __init__(self, arg):
-        super().__init__(arg)
-        if not isinstance(arg, str):
-            raise TypeError('Forward reference must be a string -- got %r' % (arg,))
-        try:
-            code = compile(arg, '<string>', 'eval')
-        except SyntaxError:
-            raise SyntaxError('Forward reference must be an expression -- got %r' %
-                              (arg,))
-        self.__forward_arg__ = arg
-        self.__forward_code__ = code
-        self.__forward_evaluated__ = False
-        self.__forward_value__ = None
-
-    def _eval_type(self, globalns, localns):
-        if not self.__forward_evaluated__ or localns is not globalns:
-            if globalns is None and localns is None:
-                globalns = localns = {}
-            elif globalns is None:
-                globalns = localns
-            elif localns is None:
-                localns = globalns
-            self.__forward_value__ = _type_check(
-                eval(self.__forward_code__, globalns, localns),
-                "Forward references must evaluate to types.")
-            self.__forward_evaluated__ = True
-        return self.__forward_value__
-
-    def __eq__(self, other):
-        if not isinstance(other, _ForwardRef):
-            return NotImplemented
-        return (self.__forward_arg__ == other.__forward_arg__ and
-                self.__forward_value__ == other.__forward_value__)
-
-    def __hash__(self):
-        return hash((self.__forward_arg__, self.__forward_value__))
-
-    def __instancecheck__(self, obj):
-        raise TypeError("Forward references cannot be used with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        raise TypeError("Forward references cannot be used with issubclass().")
-
-    def __repr__(self):
-        return '_ForwardRef(%r)' % (self.__forward_arg__,)
-
-
-class _TypeAlias(_TypingBase, _root=True):
-    """Internal helper class for defining generic variants of concrete types.
-
-    Note that this is not a type; let's call it a pseudo-type.  It cannot
-    be used in instance and subclass checks in parameterized form, i.e.
-    ``isinstance(42, Match[str])`` raises ``TypeError`` instead of returning
-    ``False``.
-    """
-
-    __slots__ = ('name', 'type_var', 'impl_type', 'type_checker')
-
-    def __init__(self, name, type_var, impl_type, type_checker):
-        """Initializer.
-
-        Args:
-            name: The name, e.g. 'Pattern'.
-            type_var: The type parameter, e.g. AnyStr, or the
-                specific type, e.g. str.
-            impl_type: The implementation type.
-            type_checker: Function that takes an impl_type instance.
-                and returns a value that should be a type_var instance.
-        """
-        assert isinstance(name, str), repr(name)
-        assert isinstance(impl_type, type), repr(impl_type)
-        assert not isinstance(impl_type, TypingMeta), repr(impl_type)
-        assert isinstance(type_var, (type, _TypingBase)), repr(type_var)
-        self.name = name
-        self.type_var = type_var
-        self.impl_type = impl_type
-        self.type_checker = type_checker
-
-    def __repr__(self):
-        return "%s[%s]" % (self.name, _type_repr(self.type_var))
-
-    def __getitem__(self, parameter):
-        if not isinstance(self.type_var, TypeVar):
-            raise TypeError("%s cannot be further parameterized." % self)
-        if self.type_var.__constraints__ and isinstance(parameter, type):
-            if not issubclass(parameter, self.type_var.__constraints__):
-                raise TypeError("%s is not a valid substitution for %s." %
-                                (parameter, self.type_var))
-        if isinstance(parameter, TypeVar) and parameter is not self.type_var:
-            raise TypeError("%s cannot be re-parameterized." % self)
-        return self.__class__(self.name, parameter,
-                              self.impl_type, self.type_checker)
-
-    def __eq__(self, other):
-        if not isinstance(other, _TypeAlias):
-            return NotImplemented
-        return self.name == other.name and self.type_var == other.type_var
-
-    def __hash__(self):
-        return hash((self.name, self.type_var))
-
-    def __instancecheck__(self, obj):
-        if not isinstance(self.type_var, TypeVar):
-            raise TypeError("Parameterized type aliases cannot be used "
-                            "with isinstance().")
-        return isinstance(obj, self.impl_type)
-
-    def __subclasscheck__(self, cls):
-        if not isinstance(self.type_var, TypeVar):
-            raise TypeError("Parameterized type aliases cannot be used "
-                            "with issubclass().")
-        return issubclass(cls, self.impl_type)
-
-
-def _get_type_vars(types, tvars):
-    for t in types:
-        if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
-            t._get_type_vars(tvars)
-
-
-def _type_vars(types):
-    tvars = []
-    _get_type_vars(types, tvars)
-    return tuple(tvars)
-
-
-def _eval_type(t, globalns, localns):
-    if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
-        return t._eval_type(globalns, localns)
-    return t
-
-
-def _type_check(arg, msg):
-    """Check that the argument is a type, and return it (internal helper).
-
-    As a special case, accept None and return type(None) instead.
-    Also, _TypeAlias instances (e.g. Match, Pattern) are acceptable.
-
-    The msg argument is a human-readable error message, e.g.
-
-        "Union[arg, ...]: arg should be a type."
-
-    We append the repr() of the actual value (truncated to 100 chars).
-    """
-    if arg is None:
-        return type(None)
-    if isinstance(arg, str):
-        arg = _ForwardRef(arg)
-    if (isinstance(arg, _TypingBase) and type(arg).__name__ == '_ClassVar' or
-        not isinstance(arg, (type, _TypingBase)) and not callable(arg)):
-        raise TypeError(msg + " Got %.100r." % (arg,))
-    # Bare Union etc. are not valid as type arguments
-    if (type(arg).__name__ in ('_Union', '_Optional')
-        and not getattr(arg, '__origin__', None)
-        or isinstance(arg, TypingMeta) and _gorg(arg) in (Generic, _Protocol)):
-        raise TypeError("Plain %s is not valid as type argument" % arg)
-    return arg
-
-
-def _type_repr(obj):
-    """Return the repr() of an object, special-casing types (internal helper).
-
-    If obj is a type, we return a shorter version than the default
-    type.__repr__, based on the module and qualified name, which is
-    typically enough to uniquely identify a type.  For everything
-    else, we fall back on repr(obj).
-    """
-    if isinstance(obj, type) and not isinstance(obj, TypingMeta):
-        if obj.__module__ == 'builtins':
-            return _qualname(obj)
-        return '%s.%s' % (obj.__module__, _qualname(obj))
-    if obj is ...:
-        return('...')
-    if isinstance(obj, types.FunctionType):
-        return obj.__name__
-    return repr(obj)
-
-
-class _Any(_FinalTypingBase, _root=True):
-    """Special type indicating an unconstrained type.
-
-    - Any is compatible with every type.
-    - Any assumed to have all methods.
-    - All values assumed to be instances of Any.
-
-    Note that all the above statements are true from the point of view of
-    static type checkers. At runtime, Any should not be used with instance
-    or class checks.
-    """
-
-    __slots__ = ()
-
-    def __instancecheck__(self, obj):
-        raise TypeError("Any cannot be used with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        raise TypeError("Any cannot be used with issubclass().")
-
-
-Any = _Any(_root=True)
-
-
-class TypeVar(_TypingBase, _root=True):
-    """Type variable.
-
-    Usage::
-
-      T = TypeVar('T')  # Can be anything
-      A = TypeVar('A', str, bytes)  # Must be str or bytes
-
-    Type variables exist primarily for the benefit of static type
-    checkers.  They serve as the parameters for generic types as well
-    as for generic function definitions.  See class Generic for more
-    information on generic types.  Generic functions work as follows:
-
-      def repeat(x: T, n: int) -> List[T]:
-          '''Return a list containing n references to x.'''
-          return [x]*n
-
-      def longest(x: A, y: A) -> A:
-          '''Return the longest of two strings.'''
-          return x if len(x) >= len(y) else y
-
-    The latter example's signature is essentially the overloading
-    of (str, str) -> str and (bytes, bytes) -> bytes.  Also note
-    that if the arguments are instances of some subclass of str,
-    the return type is still plain str.
-
-    At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
-
-    Type variables defined with covariant=True or contravariant=True
-    can be used do declare covariant or contravariant generic types.
-    See PEP 484 for more details. By default generic types are invariant
-    in all type variables.
-
-    Type variables can be introspected. e.g.:
-
-      T.__name__ == 'T'
-      T.__constraints__ == ()
-      T.__covariant__ == False
-      T.__contravariant__ = False
-      A.__constraints__ == (str, bytes)
-    """
-
-    __slots__ = ('__name__', '__bound__', '__constraints__',
-                 '__covariant__', '__contravariant__')
-
-    def __init__(self, name, *constraints, bound=None,
-                covariant=False, contravariant=False):
-        super().__init__(name, *constraints, bound=bound,
-                         covariant=covariant, contravariant=contravariant)
-        self.__name__ = name
-        if covariant and contravariant:
-            raise ValueError("Bivariant types are not supported.")
-        self.__covariant__ = bool(covariant)
-        self.__contravariant__ = bool(contravariant)
-        if constraints and bound is not None:
-            raise TypeError("Constraints cannot be combined with bound=...")
-        if constraints and len(constraints) == 1:
-            raise TypeError("A single constraint is not allowed")
-        msg = "TypeVar(name, constraint, ...): constraints must be types."
-        self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
-        if bound:
-            self.__bound__ = _type_check(bound, "Bound must be a type.")
-        else:
-            self.__bound__ = None
-
-    def _get_type_vars(self, tvars):
-        if self not in tvars:
-            tvars.append(self)
-
-    def __repr__(self):
-        if self.__covariant__:
-            prefix = '+'
-        elif self.__contravariant__:
-            prefix = '-'
-        else:
-            prefix = '~'
-        return prefix + self.__name__
-
-    def __instancecheck__(self, instance):
-        raise TypeError("Type variables cannot be used with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        raise TypeError("Type variables cannot be used with issubclass().")
-
-
-# Some unconstrained type variables.  These are used by the container types.
-# (These are not for export.)
-T = TypeVar('T')  # Any type.
-KT = TypeVar('KT')  # Key type.
-VT = TypeVar('VT')  # Value type.
-T_co = TypeVar('T_co', covariant=True)  # Any type covariant containers.
-V_co = TypeVar('V_co', covariant=True)  # Any type covariant containers.
-VT_co = TypeVar('VT_co', covariant=True)  # Value type covariant containers.
-T_contra = TypeVar('T_contra', contravariant=True)  # Ditto contravariant.
-
-# A useful type variable with constraints.  This represents string types.
-# (This one *is* for export!)
-AnyStr = TypeVar('AnyStr', bytes, str)
-
-
-def _replace_arg(arg, tvars, args):
-    """An internal helper function: replace arg if it is a type variable
-    found in tvars with corresponding substitution from args or
-    with corresponding substitution sub-tree if arg is a generic type.
-    """
-
-    if tvars is None:
-        tvars = []
-    if hasattr(arg, '_subs_tree'):
-        return arg._subs_tree(tvars, args)
-    if isinstance(arg, TypeVar):
-        for i, tvar in enumerate(tvars):
-            if arg == tvar:
-                return args[i]
-    return arg
-
-
-def _subs_tree(cls, tvars=None, args=None):
-    """An internal helper function: calculate substitution tree
-    for generic cls after replacing its type parameters with
-    substitutions in tvars -> args (if any).
-    Repeat the same following __origin__'s.
-
-    Return a list of arguments with all possible substitutions
-    performed. Arguments that are generic classes themselves are represented
-    as tuples (so that no new classes are created by this function).
-    For example: _subs_tree(List[Tuple[int, T]][str]) == [(Tuple, int, str)]
-    """
-
-    if cls.__origin__ is None:
-        return cls
-    # Make of chain of origins (i.e. cls -> cls.__origin__)
-    current = cls.__origin__
-    orig_chain = []
-    while current.__origin__ is not None:
-        orig_chain.append(current)
-        current = current.__origin__
-    # Replace type variables in __args__ if asked ...
-    tree_args = []
-    for arg in cls.__args__:
-        tree_args.append(_replace_arg(arg, tvars, args))
-    # ... then continue replacing down the origin chain.
-    for ocls in orig_chain:
-        new_tree_args = []
-        for i, arg in enumerate(ocls.__args__):
-            new_tree_args.append(_replace_arg(arg, ocls.__parameters__, tree_args))
-        tree_args = new_tree_args
-    return tree_args
-
-
-def _remove_dups_flatten(parameters):
-    """An internal helper for Union creation and substitution: flatten Union's
-    among parameters, then remove duplicates and strict subclasses.
-    """
-
-    # Flatten out Union[Union[...], ...].
-    params = []
-    for p in parameters:
-        if isinstance(p, _Union) and p.__origin__ is Union:
-            params.extend(p.__args__)
-        elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
-            params.extend(p[1:])
-        else:
-            params.append(p)
-    # Weed out strict duplicates, preserving the first of each occurrence.
-    all_params = set(params)
-    if len(all_params) < len(params):
-        new_params = []
-        for t in params:
-            if t in all_params:
-                new_params.append(t)
-                all_params.remove(t)
-        params = new_params
-        assert not all_params, all_params
-    # Weed out subclasses.
-    # E.g. Union[int, Employee, Manager] == Union[int, Employee].
-    # If object is present it will be sole survivor among proper classes.
-    # Never discard type variables.
-    # (In particular, Union[str, AnyStr] != AnyStr.)
-    all_params = set(params)
-    for t1 in params:
-        if not isinstance(t1, type):
-            continue
-        if any(isinstance(t2, type) and issubclass(t1, t2)
-               for t2 in all_params - {t1}
-               if not (isinstance(t2, GenericMeta) and
-                       t2.__origin__ is not None)):
-            all_params.remove(t1)
-    return tuple(t for t in params if t in all_params)
-
-
-def _check_generic(cls, parameters):
-    # Check correct count for parameters of a generic cls (internal helper).
-    if not cls.__parameters__:
-        raise TypeError("%s is not a generic class" % repr(cls))
-    alen = len(parameters)
-    elen = len(cls.__parameters__)
-    if alen != elen:
-        raise TypeError("Too %s parameters for %s; actual %s, expected %s" %
-                        ("many" if alen > elen else "few", repr(cls), alen, elen))
-
-
-_cleanups = []
-
-
-def _tp_cache(func):
-    """Internal wrapper caching __getitem__ of generic types with a fallback to
-    original function for non-hashable arguments.
-    """
-
-    cached = functools.lru_cache()(func)
-    _cleanups.append(cached.cache_clear)
-    @functools.wraps(func)
-    def inner(*args, **kwds):
-        try:
-            return cached(*args, **kwds)
-        except TypeError:
-            pass  # All real errors (not unhashable args) are raised below.
-        return func(*args, **kwds)
-    return inner
-
-
-class _Union(_FinalTypingBase, _root=True):
-    """Union type; Union[X, Y] means either X or Y.
-
-    To define a union, use e.g. Union[int, str].  Details:
-
-    - The arguments must be types and there must be at least one.
-
-    - None as an argument is a special case and is replaced by
-      type(None).
-
-    - Unions of unions are flattened, e.g.::
-
-        Union[Union[int, str], float] == Union[int, str, float]
-
-    - Unions of a single argument vanish, e.g.::
-
-        Union[int] == int  # The constructor actually returns int
-
-    - Redundant arguments are skipped, e.g.::
-
-        Union[int, str, int] == Union[int, str]
-
-    - When comparing unions, the argument order is ignored, e.g.::
-
-        Union[int, str] == Union[str, int]
-
-    - When two arguments have a subclass relationship, the least
-      derived argument is kept, e.g.::
-
-        class Employee: pass
-        class Manager(Employee): pass
-        Union[int, Employee, Manager] == Union[int, Employee]
-        Union[Manager, int, Employee] == Union[int, Employee]
-        Union[Employee, Manager] == Employee
-
-    - Similar for object::
-
-        Union[int, object] == object
-
-    - You cannot subclass or instantiate a union.
-
-    - You can use Optional[X] as a shorthand for Union[X, None].
-    """
-
-    __slots__ = ('__parameters__', '__args__', '__origin__', '__tree_hash__')
-
-    def __new__(cls, parameters=None, origin=None, *args, _root=False):
-        self = super().__new__(cls, parameters, origin, *args, _root=_root)
-        if origin is None:
-            self.__parameters__ = None
-            self.__args__ = None
-            self.__origin__ = None
-            self.__tree_hash__ = hash(frozenset(('Union',)))
-            return self
-        if not isinstance(parameters, tuple):
-            raise TypeError("Expected parameters=<tuple>")
-        if origin is Union:
-            parameters = _remove_dups_flatten(parameters)
-            # It's not a union if there's only one type left.
-            if len(parameters) == 1:
-                return parameters[0]
-        self.__parameters__ = _type_vars(parameters)
-        self.__args__ = parameters
-        self.__origin__ = origin
-        # Pre-calculate the __hash__ on instantiation.
-        # This improves speed for complex substitutions.
-        subs_tree = self._subs_tree()
-        if isinstance(subs_tree, tuple):
-            self.__tree_hash__ = hash(frozenset(subs_tree))
-        else:
-            self.__tree_hash__ = hash(subs_tree)
-        return self
-
-    def _eval_type(self, globalns, localns):
-        if self.__args__ is None:
-            return self
-        ev_args = tuple(_eval_type(t, globalns, localns) for t in self.__args__)
-        ev_origin = _eval_type(self.__origin__, globalns, localns)
-        if ev_args == self.__args__ and ev_origin == self.__origin__:
-            # Everything is already evaluated.
-            return self
-        return self.__class__(ev_args, ev_origin, _root=True)
-
-    def _get_type_vars(self, tvars):
-        if self.__origin__ and self.__parameters__:
-            _get_type_vars(self.__parameters__, tvars)
-
-    def __repr__(self):
-        if self.__origin__ is None:
-            return super().__repr__()
-        tree = self._subs_tree()
-        if not isinstance(tree, tuple):
-            return repr(tree)
-        return tree[0]._tree_repr(tree)
-
-    def _tree_repr(self, tree):
-        arg_list = []
-        for arg in tree[1:]:
-            if not isinstance(arg, tuple):
-                arg_list.append(_type_repr(arg))
-            else:
-                arg_list.append(arg[0]._tree_repr(arg))
-        return super().__repr__() + '[%s]' % ', '.join(arg_list)
-
-    @_tp_cache
-    def __getitem__(self, parameters):
-        if parameters == ():
-            raise TypeError("Cannot take a Union of no types.")
-        if not isinstance(parameters, tuple):
-            parameters = (parameters,)
-        if self.__origin__ is None:
-            msg = "Union[arg, ...]: each arg must be a type."
-        else:
-            msg = "Parameters to generic types must be types."
-        parameters = tuple(_type_check(p, msg) for p in parameters)
-        if self is not Union:
-            _check_generic(self, parameters)
-        return self.__class__(parameters, origin=self, _root=True)
-
-    def _subs_tree(self, tvars=None, args=None):
-        if self is Union:
-            return Union  # Nothing to substitute
-        tree_args = _subs_tree(self, tvars, args)
-        tree_args = _remove_dups_flatten(tree_args)
-        if len(tree_args) == 1:
-            return tree_args[0]  # Union of a single type is that type
-        return (Union,) + tree_args
-
-    def __eq__(self, other):
-        if not isinstance(other, _Union):
-            return self._subs_tree() == other
-        return self.__tree_hash__ == other.__tree_hash__
-
-    def __hash__(self):
-        return self.__tree_hash__
-
-    def __instancecheck__(self, obj):
-        raise TypeError("Unions cannot be used with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        raise TypeError("Unions cannot be used with issubclass().")
-
-
-Union = _Union(_root=True)
-
-
-class _Optional(_FinalTypingBase, _root=True):
-    """Optional type.
-
-    Optional[X] is equivalent to Union[X, None].
-    """
-
-    __slots__ = ()
-
-    @_tp_cache
-    def __getitem__(self, arg):
-        arg = _type_check(arg, "Optional[t] requires a single type.")
-        return Union[arg, type(None)]
-
-
-Optional = _Optional(_root=True)
-
-
-def _gorg(a):
-    """Return the farthest origin of a generic class (internal helper)."""
-    assert isinstance(a, GenericMeta)
-    while a.__origin__ is not None:
-        a = a.__origin__
-    return a
-
-
-def _geqv(a, b):
-    """Return whether two generic classes are equivalent (internal helper).
-
-    The intention is to consider generic class X and any of its
-    parameterized forms (X[T], X[int], etc.) as equivalent.
-
-    However, X is not equivalent to a subclass of X.
-
-    The relation is reflexive, symmetric and transitive.
-    """
-    assert isinstance(a, GenericMeta) and isinstance(b, GenericMeta)
-    # Reduce each to its origin.
-    return _gorg(a) is _gorg(b)
-
-
-def _next_in_mro(cls):
-    """Helper for Generic.__new__.
-
-    Returns the class after the last occurrence of Generic or
-    Generic[...] in cls.__mro__.
-    """
-    next_in_mro = object
-    # Look for the last occurrence of Generic or Generic[...].
-    for i, c in enumerate(cls.__mro__[:-1]):
-        if isinstance(c, GenericMeta) and _gorg(c) is Generic:
-            next_in_mro = cls.__mro__[i+1]
-    return next_in_mro
-
-
-def _valid_for_check(cls):
-    """An internal helper to prohibit isinstance([1], List[str]) etc."""
-    if cls is Generic:
-        raise TypeError("Class %r cannot be used with class "
-                        "or instance checks" % cls)
-    if (cls.__origin__ is not None and
-        sys._getframe(3).f_globals['__name__'] not in ['abc', 'functools']):
-        raise TypeError("Parameterized generics cannot be used with class "
-                        "or instance checks")
-
-
-def _make_subclasshook(cls):
-    """Construct a __subclasshook__ callable that incorporates
-    the associated __extra__ class in subclass checks performed
-    against cls.
-    """
-    if isinstance(cls.__extra__, abc.ABCMeta):
-        # The logic mirrors that of ABCMeta.__subclasscheck__.
-        # Registered classes need not be checked here because
-        # cls and its extra share the same _abc_registry.
-        def __extrahook__(subclass):
-            _valid_for_check(cls)
-            res = cls.__extra__.__subclasshook__(subclass)
-            if res is not NotImplemented:
-                return res
-            if cls.__extra__ in subclass.__mro__:
-                return True
-            for scls in cls.__extra__.__subclasses__():
-                if isinstance(scls, GenericMeta):
-                    continue
-                if issubclass(subclass, scls):
-                    return True
-            return NotImplemented
-    else:
-        # For non-ABC extras we'll just call issubclass().
-        def __extrahook__(subclass):
-            _valid_for_check(cls)
-            if cls.__extra__ and issubclass(subclass, cls.__extra__):
-                return True
-            return NotImplemented
-    return __extrahook__
-
-
-def _no_slots_copy(dct):
-    """Internal helper: copy class __dict__ and clean slots class variables.
-    (They will be re-created if necessary by normal class machinery.)
-    """
-    dict_copy = dict(dct)
-    if '__slots__' in dict_copy:
-        for slot in dict_copy['__slots__']:
-            dict_copy.pop(slot, None)
-    return dict_copy
-
-
-class GenericMeta(TypingMeta, abc.ABCMeta):
-    """Metaclass for generic types."""
-
-    def __new__(cls, name, bases, namespace,
-                tvars=None, args=None, origin=None, extra=None, orig_bases=None):
-        if tvars is not None:
-            # Called from __getitem__() below.
-            assert origin is not None
-            assert all(isinstance(t, TypeVar) for t in tvars), tvars
-        else:
-            # Called from class statement.
-            assert tvars is None, tvars
-            assert args is None, args
-            assert origin is None, origin
-
-            # Get the full set of tvars from the bases.
-            tvars = _type_vars(bases)
-            # Look for Generic[T1, ..., Tn].
-            # If found, tvars must be a subset of it.
-            # If not found, tvars is it.
-            # Also check for and reject plain Generic,
-            # and reject multiple Generic[...].
-            gvars = None
-            for base in bases:
-                if base is Generic:
-                    raise TypeError("Cannot inherit from plain Generic")
-                if (isinstance(base, GenericMeta) and
-                        base.__origin__ is Generic):
-                    if gvars is not None:
-                        raise TypeError(
-                            "Cannot inherit from Generic[...] multiple types.")
-                    gvars = base.__parameters__
-            if gvars is None:
-                gvars = tvars
-            else:
-                tvarset = set(tvars)
-                gvarset = set(gvars)
-                if not tvarset <= gvarset:
-                    raise TypeError(
-                        "Some type variables (%s) "
-                        "are not listed in Generic[%s]" %
-                        (", ".join(str(t) for t in tvars if t not in gvarset),
-                         ", ".join(str(g) for g in gvars)))
-                tvars = gvars
-
-        initial_bases = bases
-        if extra is not None and type(extra) is abc.ABCMeta and extra not in bases:
-            bases = (extra,) + bases
-        bases = tuple(_gorg(b) if isinstance(b, GenericMeta) else b for b in bases)
-
-        # remove bare Generic from bases if there are other generic bases
-        if any(isinstance(b, GenericMeta) and b is not Generic for b in bases):
-            bases = tuple(b for b in bases if b is not Generic)
-        self = super().__new__(cls, name, bases, namespace, _root=True)
-
-        self.__parameters__ = tvars
-        # Be prepared that GenericMeta will be subclassed by TupleMeta
-        # and CallableMeta, those two allow ..., (), or [] in __args___.
-        self.__args__ = tuple(... if a is _TypingEllipsis else
-                              () if a is _TypingEmpty else
-                              a for a in args) if args else None
-        self.__origin__ = origin
-        self.__extra__ = extra
-        # Speed hack (https://github.com/python/typing/issues/196).
-        self.__next_in_mro__ = _next_in_mro(self)
-        # Preserve base classes on subclassing (__bases__ are type erased now).
-        if orig_bases is None:
-            self.__orig_bases__ = initial_bases
-
-        # This allows unparameterized generic collections to be used
-        # with issubclass() and isinstance() in the same way as their
-        # collections.abc counterparts (e.g., isinstance([], Iterable)).
-        if ('__subclasshook__' not in namespace and extra  # allow overriding
-            or hasattr(self.__subclasshook__, '__name__') and
-            self.__subclasshook__.__name__ == '__extrahook__'):
-            self.__subclasshook__ = _make_subclasshook(self)
-        if isinstance(extra, abc.ABCMeta):
-            self._abc_registry = extra._abc_registry
-
-        if origin and hasattr(origin, '__qualname__'):  # Fix for Python 3.2.
-            self.__qualname__ = origin.__qualname__
-        self.__tree_hash__ = hash(self._subs_tree()) if origin else hash((self.__name__,))
-        return self
-
-    def _get_type_vars(self, tvars):
-        if self.__origin__ and self.__parameters__:
-            _get_type_vars(self.__parameters__, tvars)
-
-    def _eval_type(self, globalns, localns):
-        ev_origin = (self.__origin__._eval_type(globalns, localns)
-                     if self.__origin__ else None)
-        ev_args = tuple(_eval_type(a, globalns, localns) for a
-                        in self.__args__) if self.__args__ else None
-        if ev_origin == self.__origin__ and ev_args == self.__args__:
-            return self
-        return self.__class__(self.__name__,
-                              self.__bases__,
-                              _no_slots_copy(self.__dict__),
-                              tvars=_type_vars(ev_args) if ev_args else None,
-                              args=ev_args,
-                              origin=ev_origin,
-                              extra=self.__extra__,
-                              orig_bases=self.__orig_bases__)
-
-    def __repr__(self):
-        if self.__origin__ is None:
-            return super().__repr__()
-        return self._tree_repr(self._subs_tree())
-
-    def _tree_repr(self, tree):
-        arg_list = []
-        for arg in tree[1:]:
-            if arg == ():
-                arg_list.append('()')
-            elif not isinstance(arg, tuple):
-                arg_list.append(_type_repr(arg))
-            else:
-                arg_list.append(arg[0]._tree_repr(arg))
-        return super().__repr__() + '[%s]' % ', '.join(arg_list)
-
-    def _subs_tree(self, tvars=None, args=None):
-        if self.__origin__ is None:
-            return self
-        tree_args = _subs_tree(self, tvars, args)
-        return (_gorg(self),) + tuple(tree_args)
-
-    def __eq__(self, other):
-        if not isinstance(other, GenericMeta):
-            return NotImplemented
-        if self.__origin__ is None or other.__origin__ is None:
-            return self is other
-        return self.__tree_hash__ == other.__tree_hash__
-
-    def __hash__(self):
-        return self.__tree_hash__
-
-    @_tp_cache
-    def __getitem__(self, params):
-        if not isinstance(params, tuple):
-            params = (params,)
-        if not params and not _gorg(self) is Tuple:
-            raise TypeError(
-                "Parameter list to %s[...] cannot be empty" % _qualname(self))
-        msg = "Parameters to generic types must be types."
-        params = tuple(_type_check(p, msg) for p in params)
-        if self is Generic:
-            # Generic can only be subscripted with unique type variables.
-            if not all(isinstance(p, TypeVar) for p in params):
-                raise TypeError(
-                    "Parameters to Generic[...] must all be type variables")
-            if len(set(params)) != len(params):
-                raise TypeError(
-                    "Parameters to Generic[...] must all be unique")
-            tvars = params
-            args = params
-        elif self in (Tuple, Callable):
-            tvars = _type_vars(params)
-            args = params
-        elif self is _Protocol:
-            # _Protocol is internal, don't check anything.
-            tvars = params
-            args = params
-        elif self.__origin__ in (Generic, _Protocol):
-            # Can't subscript Generic[...] or _Protocol[...].
-            raise TypeError("Cannot subscript already-subscripted %s" %
-                            repr(self))
-        else:
-            # Subscripting a regular Generic subclass.
-            _check_generic(self, params)
-            tvars = _type_vars(params)
-            args = params
-        return self.__class__(self.__name__,
-                              self.__bases__,
-                              _no_slots_copy(self.__dict__),
-                              tvars=tvars,
-                              args=args,
-                              origin=self,
-                              extra=self.__extra__,
-                              orig_bases=self.__orig_bases__)
-
-    def __instancecheck__(self, instance):
-        # Since we extend ABC.__subclasscheck__ and
-        # ABC.__instancecheck__ inlines the cache checking done by the
-        # latter, we must extend __instancecheck__ too. For simplicity
-        # we just skip the cache check -- instance checks for generic
-        # classes are supposed to be rare anyways.
-        return issubclass(instance.__class__, self)
-
-    def __copy__(self):
-        return self.__class__(self.__name__, self.__bases__,
-                              _no_slots_copy(self.__dict__),
-                              self.__parameters__, self.__args__, self.__origin__,
-                              self.__extra__, self.__orig_bases__)
-
-
-# Prevent checks for Generic to crash when defining Generic.
-Generic = None
-
-
-def _generic_new(base_cls, cls, *args, **kwds):
-    # Assure type is erased on instantiation,
-    # but attempt to store it in __orig_class__
-    if cls.__origin__ is None:
-        return base_cls.__new__(cls)
-    else:
-        origin = _gorg(cls)
-        obj = base_cls.__new__(origin)
-        try:
-            obj.__orig_class__ = cls
-        except AttributeError:
-            pass
-        obj.__init__(*args, **kwds)
-        return obj
-
-
-class Generic(metaclass=GenericMeta):
-    """Abstract base class for generic types.
-
-    A generic type is typically declared by inheriting from
-    this class parameterized with one or more type variables.
-    For example, a generic mapping type might be defined as::
-
-      class Mapping(Generic[KT, VT]):
-          def __getitem__(self, key: KT) -> VT:
-              ...
-          # Etc.
-
-    This class can then be used as follows::
-
-      def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
-          try:
-              return mapping[key]
-          except KeyError:
-              return default
-    """
-
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Generic):
-            raise TypeError("Type Generic cannot be instantiated; "
-                            "it can be used only as a base class")
-        return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
-
-
-class _TypingEmpty:
-    """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
-    to allow empty list/tuple in specific places, without allowing them
-    to sneak in where prohibited.
-    """
-
-
-class _TypingEllipsis:
-    """Internal placeholder for ... (ellipsis)."""
-
-
-class TupleMeta(GenericMeta):
-    """Metaclass for Tuple (internal)."""
-
-    @_tp_cache
-    def __getitem__(self, parameters):
-        if self.__origin__ is not None or not _geqv(self, Tuple):
-            # Normal generic rules apply if this is not the first subscription
-            # or a subscription of a subclass.
-            return super().__getitem__(parameters)
-        if parameters == ():
-            return super().__getitem__((_TypingEmpty,))
-        if not isinstance(parameters, tuple):
-            parameters = (parameters,)
-        if len(parameters) == 2 and parameters[1] is ...:
-            msg = "Tuple[t, ...]: t must be a type."
-            p = _type_check(parameters[0], msg)
-            return super().__getitem__((p, _TypingEllipsis))
-        msg = "Tuple[t0, t1, ...]: each t must be a type."
-        parameters = tuple(_type_check(p, msg) for p in parameters)
-        return super().__getitem__(parameters)
-
-    def __instancecheck__(self, obj):
-        if self.__args__ == None:
-            return isinstance(obj, tuple)
-        raise TypeError("Parameterized Tuple cannot be used "
-                        "with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        if self.__args__ == None:
-            return issubclass(cls, tuple)
-        raise TypeError("Parameterized Tuple cannot be used "
-                        "with issubclass().")
-
-
-class Tuple(tuple, extra=tuple, metaclass=TupleMeta):
-    """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
-
-    Example: Tuple[T1, T2] is a tuple of two elements corresponding
-    to type variables T1 and T2.  Tuple[int, float, str] is a tuple
-    of an int, a float and a string.
-
-    To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
-    """
-
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Tuple):
-            raise TypeError("Type Tuple cannot be instantiated; "
-                            "use tuple() instead")
-        return _generic_new(tuple, cls, *args, **kwds)
-
-
-class CallableMeta(GenericMeta):
-    """Metaclass for Callable (internal)."""
-
-    def __repr__(self):
-        if self.__origin__ is None:
-            return super().__repr__()
-        return self._tree_repr(self._subs_tree())
-
-    def _tree_repr(self, tree):
-        if _gorg(self) is not Callable:
-            return super()._tree_repr(tree)
-        # For actual Callable (not its subclass) we override
-        # super()._tree_repr() for nice formatting.
-        arg_list = []
-        for arg in tree[1:]:
-            if not isinstance(arg, tuple):
-                arg_list.append(_type_repr(arg))
-            else:
-                arg_list.append(arg[0]._tree_repr(arg))
-        if arg_list[0] == '...':
-            return repr(tree[0]) + '[..., %s]' % arg_list[1]
-        return (repr(tree[0]) +
-                '[[%s], %s]' % (', '.join(arg_list[:-1]), arg_list[-1]))
-
-    def __getitem__(self, parameters):
-        """A thin wrapper around __getitem_inner__ to provide the latter
-        with hashable arguments to improve speed.
-        """
-
-        if  self.__origin__ is not None or not _geqv(self, Callable):
-            return super().__getitem__(parameters)
-        if not isinstance(parameters, tuple) or len(parameters) != 2:
-            raise TypeError("Callable must be used as "
-                            "Callable[[arg, ...], result].")
-        args, result = parameters
-        if args is Ellipsis:
-            parameters = (Ellipsis, result)
-        else:
-            if not isinstance(args, list):
-                raise TypeError("Callable[args, result]: args must be a list."
-                                " Got %.100r." % (args,))
-            parameters = (tuple(args), result)
-        return self.__getitem_inner__(parameters)
-
-    @_tp_cache
-    def __getitem_inner__(self, parameters):
-        args, result = parameters
-        msg = "Callable[args, result]: result must be a type."
-        result = _type_check(result, msg)
-        if args is Ellipsis:
-            return super().__getitem__((_TypingEllipsis, result))
-        msg = "Callable[[arg, ...], result]: each arg must be a type."
-        args = tuple(_type_check(arg, msg) for arg in args)
-        parameters = args + (result,)
-        return super().__getitem__(parameters)
-
-
-class Callable(extra=collections_abc.Callable, metaclass = CallableMeta):
-    """Callable type; Callable[[int], str] is a function of (int) -> str.
-
-    The subscription syntax must always be used with exactly two
-    values: the argument list and the return type.  The argument list
-    must be a list of types or ellipsis; the return type must be a single type.
-
-    There is no syntax to indicate optional or keyword arguments,
-    such function types are rarely used as callback types.
-    """
-
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Callable):
-            raise TypeError("Type Callable cannot be instantiated; "
-                            "use a non-abstract subclass instead")
-        return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
-
-
-class _ClassVar(_FinalTypingBase, _root=True):
-    """Special type construct to mark class variables.
-
-    An annotation wrapped in ClassVar indicates that a given
-    attribute is intended to be used as a class variable and
-    should not be set on instances of that class. Usage::
-
-      class Starship:
-          stats: ClassVar[Dict[str, int]] = {} # class variable
-          damage: int = 10                     # instance variable
-
-    ClassVar accepts only types and cannot be further subscribed.
-
-    Note that ClassVar is not a class itself, and should not
-    be used with isinstance() or issubclass().
-    """
-
-    __slots__ = ('__type__',)
-
-    def __init__(self, tp=None, **kwds):
-        self.__type__ = tp
-
-    def __getitem__(self, item):
-        cls = type(self)
-        if self.__type__ is None:
-            return cls(_type_check(item,
-                       '{} accepts only single type.'.format(cls.__name__[1:])),
-                       _root=True)
-        raise TypeError('{} cannot be further subscripted'
-                        .format(cls.__name__[1:]))
-
-    def _eval_type(self, globalns, localns):
-        new_tp = _eval_type(self.__type__, globalns, localns)
-        if new_tp == self.__type__:
-            return self
-        return type(self)(new_tp, _root=True)
-
-    def __repr__(self):
-        r = super().__repr__()
-        if self.__type__ is not None:
-            r += '[{}]'.format(_type_repr(self.__type__))
-        return r
-
-    def __hash__(self):
-        return hash((type(self).__name__, self.__type__))
-
-    def __eq__(self, other):
-        if not isinstance(other, _ClassVar):
-            return NotImplemented
-        if self.__type__ is not None:
-            return self.__type__ == other.__type__
-        return self is other
-
-
-ClassVar = _ClassVar(_root=True)
-
-
-def cast(typ, val):
-    """Cast a value to a type.
-
-    This returns the value unchanged.  To the type checker this
-    signals that the return value has the designated type, but at
-    runtime we intentionally don't check anything (we want this
-    to be as fast as possible).
-    """
-    return val
-
-
-def _get_defaults(func):
-    """Internal helper to extract the default arguments, by name."""
-    try:
-        code = func.__code__
-    except AttributeError:
-        # Some built-in functions don't have __code__, __defaults__, etc.
-        return {}
-    pos_count = code.co_argcount
-    arg_names = code.co_varnames
-    arg_names = arg_names[:pos_count]
-    defaults = func.__defaults__ or ()
-    kwdefaults = func.__kwdefaults__
-    res = dict(kwdefaults) if kwdefaults else {}
-    pos_offset = pos_count - len(defaults)
-    for name, value in zip(arg_names[pos_offset:], defaults):
-        assert name not in res
-        res[name] = value
-    return res
-
-
-def get_type_hints(obj, globalns=None, localns=None):
-    """Return type hints for an object.
-
-    This is often the same as obj.__annotations__, but it handles
-    forward references encoded as string literals, and if necessary
-    adds Optional[t] if a default value equal to None is set.
-
-    The argument may be a module, class, method, or function. The annotations
-    are returned as a dictionary. For classes, annotations include also
-    inherited members.
-
-    TypeError is raised if the argument is not of a type that can contain
-    annotations, and an empty dictionary is returned if no annotations are
-    present.
-
-    BEWARE -- the behavior of globalns and localns is counterintuitive
-    (unless you are familiar with how eval() and exec() work).  The
-    search order is locals first, then globals.
-
-    - If no dict arguments are passed, an attempt is made to use the
-      globals from obj, and these are also used as the locals.  If the
-      object does not appear to have globals, an exception is raised.
-
-    - If one dict argument is passed, it is used for both globals and
-      locals.
-
-    - If two dict arguments are passed, they specify globals and
-      locals, respectively.
-    """
-
-    if getattr(obj, '__no_type_check__', None):
-        return {}
-    if globalns is None:
-        globalns = getattr(obj, '__globals__', {})
-        if localns is None:
-            localns = globalns
-    elif localns is None:
-        localns = globalns
-    # Classes require a special treatment.
-    if isinstance(obj, type):
-        hints = {}
-        for base in reversed(obj.__mro__):
-            ann = base.__dict__.get('__annotations__', {})
-            for name, value in ann.items():
-                if value is None:
-                    value = type(None)
-                if isinstance(value, str):
-                    value = _ForwardRef(value)
-                value = _eval_type(value, globalns, localns)
-                hints[name] = value
-        return hints
-    hints = getattr(obj, '__annotations__', None)
-    if hints is None:
-        # Return empty annotations for something that _could_ have them.
-        if (isinstance(obj, types.FunctionType) or
-            isinstance(obj, types.BuiltinFunctionType) or
-            isinstance(obj, types.MethodType) or
-            isinstance(obj, types.ModuleType)):
-            return {}
-        else:
-            raise TypeError('{!r} is not a module, class, method, '
-                            'or function.'.format(obj))
-    defaults = _get_defaults(obj)
-    hints = dict(hints)
-    for name, value in hints.items():
-        if value is None:
-            value = type(None)
-        if isinstance(value, str):
-            value = _ForwardRef(value)
-        value = _eval_type(value, globalns, localns)
-        if name in defaults and defaults[name] is None:
-            value = Optional[value]
-        hints[name] = value
-    return hints
-
-
-def no_type_check(arg):
-    """Decorator to indicate that annotations are not type hints.
-
-    The argument must be a class or function; if it is a class, it
-    applies recursively to all methods and classes defined in that class
-    (but not to methods defined in its superclasses or subclasses).
-
-    This mutates the function(s) or class(es) in place.
-    """
-    if isinstance(arg, type):
-        arg_attrs = arg.__dict__.copy()
-        for attr, val in arg.__dict__.items():
-            if val in arg.__bases__:
-                arg_attrs.pop(attr)
-        for obj in arg_attrs.values():
-            if isinstance(obj, types.FunctionType):
-                obj.__no_type_check__ = True
-            if isinstance(obj, type):
-                no_type_check(obj)
-    try:
-        arg.__no_type_check__ = True
-    except TypeError: # built-in classes
-        pass
-    return arg
-
-
-def no_type_check_decorator(decorator):
-    """Decorator to give another decorator the @no_type_check effect.
-
-    This wraps the decorator with something that wraps the decorated
-    function in @no_type_check.
-    """
-
-    @functools.wraps(decorator)
-    def wrapped_decorator(*args, **kwds):
-        func = decorator(*args, **kwds)
-        func = no_type_check(func)
-        return func
-
-    return wrapped_decorator
-
-
-def _overload_dummy(*args, **kwds):
-    """Helper for @overload to raise when called."""
-    raise NotImplementedError(
-        "You should not call an overloaded function. "
-        "A series of @overload-decorated functions "
-        "outside a stub module should always be followed "
-        "by an implementation that is not @overload-ed.")
-
-
-def overload(func):
-    """Decorator for overloaded functions/methods.
-
-    In a stub file, place two or more stub definitions for the same
-    function in a row, each decorated with @overload.  For example:
-
-      @overload
-      def utf8(value: None) -> None: ...
-      @overload
-      def utf8(value: bytes) -> bytes: ...
-      @overload
-      def utf8(value: str) -> bytes: ...
-
-    In a non-stub file (i.e. a regular .py file), do the same but
-    follow it with an implementation.  The implementation should *not*
-    be decorated with @overload.  For example:
-
-      @overload
-      def utf8(value: None) -> None: ...
-      @overload
-      def utf8(value: bytes) -> bytes: ...
-      @overload
-      def utf8(value: str) -> bytes: ...
-      def utf8(value):
-          # implementation goes here
-    """
-    return _overload_dummy
-
-
-class _ProtocolMeta(GenericMeta):
-    """Internal metaclass for _Protocol.
-
-    This exists so _Protocol classes can be generic without deriving
-    from Generic.
-    """
-
-    def __instancecheck__(self, obj):
-        if _Protocol not in self.__bases__:
-            return super().__instancecheck__(obj)
-        raise TypeError("Protocols cannot be used with isinstance().")
-
-    def __subclasscheck__(self, cls):
-        if not self._is_protocol:
-            # No structural checks since this isn't a protocol.
-            return NotImplemented
-
-        if self is _Protocol:
-            # Every class is a subclass of the empty protocol.
-            return True
-
-        # Find all attributes defined in the protocol.
-        attrs = self._get_protocol_attrs()
-
-        for attr in attrs:
-            if not any(attr in d.__dict__ for d in cls.__mro__):
-                return False
-        return True
-
-    def _get_protocol_attrs(self):
-        # Get all Protocol base classes.
-        protocol_bases = []
-        for c in self.__mro__:
-            if getattr(c, '_is_protocol', False) and c.__name__ != '_Protocol':
-                protocol_bases.append(c)
-
-        # Get attributes included in protocol.
-        attrs = set()
-        for base in protocol_bases:
-            for attr in base.__dict__.keys():
-                # Include attributes not defined in any non-protocol bases.
-                for c in self.__mro__:
-                    if (c is not base and attr in c.__dict__ and
-                            not getattr(c, '_is_protocol', False)):
-                        break
-                else:
-                    if (not attr.startswith('_abc_') and
-                            attr != '__abstractmethods__' and
-                            attr != '__annotations__' and
-                            attr != '__weakref__' and
-                            attr != '_is_protocol' and
-                            attr != '__dict__' and
-                            attr != '__args__' and
-                            attr != '__slots__' and
-                            attr != '_get_protocol_attrs' and
-                            attr != '__next_in_mro__' and
-                            attr != '__parameters__' and
-                            attr != '__origin__' and
-                            attr != '__orig_bases__' and
-                            attr != '__extra__' and
-                            attr != '__tree_hash__' and
-                            attr != '__module__'):
-                        attrs.add(attr)
-
-        return attrs
-
-
-class _Protocol(metaclass=_ProtocolMeta):
-    """Internal base class for protocol classes.
-
-    This implements a simple-minded structural issubclass check
-    (similar but more general than the one-offs in collections.abc
-    such as Hashable).
-    """
-
-    __slots__ = ()
-
-    _is_protocol = True
-
-
-# Various ABCs mimicking those in collections.abc.
-# A few are simply re-exported for completeness.
-
-Hashable = collections_abc.Hashable  # Not generic.
-
-
-if hasattr(collections_abc, 'Awaitable'):
-    class Awaitable(Generic[T_co], extra=collections_abc.Awaitable):
-        __slots__ = ()
-
-    __all__.append('Awaitable')
-
-
-if hasattr(collections_abc, 'Coroutine'):
-    class Coroutine(Awaitable[V_co], Generic[T_co, T_contra, V_co],
-                    extra=collections_abc.Coroutine):
-        __slots__ = ()
-
-    __all__.append('Coroutine')
-
-
-if hasattr(collections_abc, 'AsyncIterable'):
-
-    class AsyncIterable(Generic[T_co], extra=collections_abc.AsyncIterable):
-        __slots__ = ()
-
-    class AsyncIterator(AsyncIterable[T_co],
-                        extra=collections_abc.AsyncIterator):
-        __slots__ = ()
-
-    __all__.append('AsyncIterable')
-    __all__.append('AsyncIterator')
-
-
-class Iterable(Generic[T_co], extra=collections_abc.Iterable):
-    __slots__ = ()
-
-
-class Iterator(Iterable[T_co], extra=collections_abc.Iterator):
-    __slots__ = ()
-
-
-class SupportsInt(_Protocol):
-    __slots__ = ()
-
-    @abstractmethod
-    def __int__(self) -> int:
-        pass
-
-
-class SupportsFloat(_Protocol):
-    __slots__ = ()
-
-    @abstractmethod
-    def __float__(self) -> float:
-        pass
-
-
-class SupportsComplex(_Protocol):
-    __slots__ = ()
-
-    @abstractmethod
-    def __complex__(self) -> complex:
-        pass
-
-
-class SupportsBytes(_Protocol):
-    __slots__ = ()
-
-    @abstractmethod
-    def __bytes__(self) -> bytes:
-        pass
-
-
-class SupportsAbs(_Protocol[T_co]):
-    __slots__ = ()
-
-    @abstractmethod
-    def __abs__(self) -> T_co:
-        pass
-
-
-class SupportsRound(_Protocol[T_co]):
-    __slots__ = ()
-
-    @abstractmethod
-    def __round__(self, ndigits: int = 0) -> T_co:
-        pass
-
-
-if hasattr(collections_abc, 'Reversible'):
-    class Reversible(Iterable[T_co], extra=collections_abc.Reversible):
-        __slots__ = ()
-else:
-    class Reversible(_Protocol[T_co]):
-        __slots__ = ()
-
-        @abstractmethod
-        def __reversed__(self) -> 'Iterator[T_co]':
-            pass
-
-
-Sized = collections_abc.Sized  # Not generic.
-
-
-class Container(Generic[T_co], extra=collections_abc.Container):
-    __slots__ = ()
-
-
-if hasattr(collections_abc, 'Collection'):
-    class Collection(Sized, Iterable[T_co], Container[T_co],
-                     extra=collections_abc.Collection):
-        __slots__ = ()
-
-    __all__.append('Collection')
-
-
-# Callable was defined earlier.
-
-if hasattr(collections_abc, 'Collection'):
-    class AbstractSet(Collection[T_co],
-                      extra=collections_abc.Set):
-        __slots__ = ()
-else:
-    class AbstractSet(Sized, Iterable[T_co], Container[T_co],
-                      extra=collections_abc.Set):
-        __slots__ = ()
-
-
-class MutableSet(AbstractSet[T], extra=collections_abc.MutableSet):
-    __slots__ = ()
-
-
-# NOTE: It is only covariant in the value type.
-if hasattr(collections_abc, 'Collection'):
-    class Mapping(Collection[KT], Generic[KT, VT_co],
-                  extra=collections_abc.Mapping):
-        __slots__ = ()
-else:
-    class Mapping(Sized, Iterable[KT], Container[KT], Generic[KT, VT_co],
-                  extra=collections_abc.Mapping):
-        __slots__ = ()
-
-
-class MutableMapping(Mapping[KT, VT], extra=collections_abc.MutableMapping):
-    __slots__ = ()
-
-if hasattr(collections_abc, 'Reversible'):
-    if hasattr(collections_abc, 'Collection'):
-        class Sequence(Reversible[T_co], Collection[T_co],
-                   extra=collections_abc.Sequence):
-            __slots__ = ()
-    else:
-        class Sequence(Sized, Reversible[T_co], Container[T_co],
-                   extra=collections_abc.Sequence):
-            __slots__ = ()
-else:
-    class Sequence(Sized, Iterable[T_co], Container[T_co],
-                   extra=collections_abc.Sequence):
-        __slots__ = ()
-
-
-class MutableSequence(Sequence[T], extra=collections_abc.MutableSequence):
-    __slots__ = ()
-
-
-class ByteString(Sequence[int], extra=collections_abc.ByteString):
-    __slots__ = ()
-
-
-class List(list, MutableSequence[T], extra=list):
-
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, List):
-            raise TypeError("Type List cannot be instantiated; "
-                            "use list() instead")
-        return _generic_new(list, cls, *args, **kwds)
-
-
-class Set(set, MutableSet[T], extra=set):
-
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Set):
-            raise TypeError("Type Set cannot be instantiated; "
-                            "use set() instead")
-        return _generic_new(set, cls, *args, **kwds)
-
-
-class FrozenSet(frozenset, AbstractSet[T_co], extra=frozenset):
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, FrozenSet):
-            raise TypeError("Type FrozenSet cannot be instantiated; "
-                            "use frozenset() instead")
-        return _generic_new(frozenset, cls, *args, **kwds)
-
-
-class MappingView(Sized, Iterable[T_co], extra=collections_abc.MappingView):
-    __slots__ = ()
-
-
-class KeysView(MappingView[KT], AbstractSet[KT],
-               extra=collections_abc.KeysView):
-    __slots__ = ()
-
-
-class ItemsView(MappingView[Tuple[KT, VT_co]],
-                AbstractSet[Tuple[KT, VT_co]],
-                Generic[KT, VT_co],
-                extra=collections_abc.ItemsView):
-    __slots__ = ()
-
-
-class ValuesView(MappingView[VT_co], extra=collections_abc.ValuesView):
-    __slots__ = ()
-
-
-if hasattr(contextlib, 'AbstractContextManager'):
-    class ContextManager(Generic[T_co], extra=contextlib.AbstractContextManager):
-        __slots__ = ()
-    __all__.append('ContextManager')
-
-
-class Dict(dict, MutableMapping[KT, VT], extra=dict):
-
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Dict):
-            raise TypeError("Type Dict cannot be instantiated; "
-                            "use dict() instead")
-        return _generic_new(dict, cls, *args, **kwds)
-
-class DefaultDict(collections.defaultdict, MutableMapping[KT, VT],
-                  extra=collections.defaultdict):
-
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, DefaultDict):
-            raise TypeError("Type DefaultDict cannot be instantiated; "
-                            "use collections.defaultdict() instead")
-        return _generic_new(collections.defaultdict, cls, *args, **kwds)
-
-# Determine what base class to use for Generator.
-if hasattr(collections_abc, 'Generator'):
-    # Sufficiently recent versions of 3.5 have a Generator ABC.
-    _G_base = collections_abc.Generator
-else:
-    # Fall back on the exact type.
-    _G_base = types.GeneratorType
-
-
-class Generator(Iterator[T_co], Generic[T_co, T_contra, V_co],
-                extra=_G_base):
-    __slots__ = ()
-
-    def __new__(cls, *args, **kwds):
-        if _geqv(cls, Generator):
-            raise TypeError("Type Generator cannot be instantiated; "
-                            "create a subclass instead")
-        return _generic_new(_G_base, cls, *args, **kwds)
-
-
-# Internal type variable used for Type[].
-CT_co = TypeVar('CT_co', covariant=True, bound=type)
-
-
-# This is not a real generic class.  Don't use outside annotations.
-class Type(Generic[CT_co], extra=type):
-    """A special construct usable to annotate class objects.
-
-    For example, suppose we have the following classes::
-
-      class User: ...  # Abstract base for User classes
-      class BasicUser(User): ...
-      class ProUser(User): ...
-      class TeamUser(User): ...
-
-    And a function that takes a class argument that's a subclass of
-    User and returns an instance of the corresponding class::
-
-      U = TypeVar('U', bound=User)
-      def new_user(user_class: Type[U]) -> U:
-          user = user_class()
-          # (Here we could write the user object to a database)
-          return user
-
-      joe = new_user(BasicUser)
-
-    At this point the type checker knows that joe has type BasicUser.
-    """
-
-    __slots__ = ()
-
-
-def _make_nmtuple(name, types):
-    msg = "NamedTuple('Name', [(f0, t0), (f1, t1), ...]); each t must be a type"
-    types = [(n, _type_check(t, msg)) for n, t in types]
-    nm_tpl = collections.namedtuple(name, [n for n, t in types])
-    nm_tpl._field_types = dict(types)
-    try:
-        nm_tpl.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__')
-    except (AttributeError, ValueError):
-        pass
-    return nm_tpl
-
-
-_PY36 = sys.version_info[:2] >= (3, 6)
-
-
-class NamedTupleMeta(type):
-
-    def __new__(cls, typename, bases, ns):
-        if ns.get('_root', False):
-            return super().__new__(cls, typename, bases, ns)
-        if not _PY36:
-            raise TypeError("Class syntax for NamedTuple is only supported"
-                            " in Python 3.6+")
-        types = ns.get('__annotations__', {})
-        return _make_nmtuple(typename, types.items())
-
-class NamedTuple(metaclass=NamedTupleMeta):
-    """Typed version of namedtuple.
-
-    Usage in Python versions >= 3.6::
-
-        class Employee(NamedTuple):
-            name: str
-            id: int
-
-    This is equivalent to::
-
-        Employee = collections.namedtuple('Employee', ['name', 'id'])
-
-    The resulting class has one extra attribute: _field_types,
-    giving a dict mapping field names to types.  (The field names
-    are in the _fields attribute, which is part of the namedtuple
-    API.) Alternative equivalent keyword syntax is also accepted::
-
-        Employee = NamedTuple('Employee', name=str, id=int)
-
-    In Python versions <= 3.5 use::
-
-        Employee = NamedTuple('Employee', [('name', str), ('id', int)])
-    """
-    _root = True
-
-    def __new__(self, typename, fields=None, **kwargs):
-        if kwargs and not _PY36:
-            raise TypeError("Keyword syntax for NamedTuple is only supported"
-                            " in Python 3.6+")
-        if fields is None:
-            fields = kwargs.items()
-        elif kwargs:
-            raise TypeError("Either list of fields or keywords"
-                            " can be provided to NamedTuple, not both")
-        return _make_nmtuple(typename, fields)
-
-
-def NewType(name, tp):
-    """NewType creates simple unique types with almost zero
-    runtime overhead. NewType(name, tp) is considered a subtype of tp
-    by static type checkers. At runtime, NewType(name, tp) returns
-    a dummy function that simply returns its argument. Usage::
-
-        UserId = NewType('UserId', int)
-
-        def name_by_id(user_id: UserId) -> str:
-            ...
-
-        UserId('user')          # Fails type check
-
-        name_by_id(42)          # Fails type check
-        name_by_id(UserId(42))  # OK
-
-        num = UserId(5) + 1     # type: int
-    """
-
-    def new_type(x):
-        return x
-
-    new_type.__name__ = name
-    new_type.__supertype__ = tp
-    return new_type
-
-
-# Python-version-specific alias (Python 2: unicode; Python 3: str)
-Text = str
-
-
-# Constant that's True when type checking, but False here.
-TYPE_CHECKING = False
-
-
-class IO(Generic[AnyStr]):
-    """Generic base class for TextIO and BinaryIO.
-
-    This is an abstract, generic version of the return of open().
-
-    NOTE: This does not distinguish between the different possible
-    classes (text vs. binary, read vs. write vs. read/write,
-    append-only, unbuffered).  The TextIO and BinaryIO subclasses
-    below capture the distinctions between text vs. binary, which is
-    pervasive in the interface; however we currently do not offer a
-    way to track the other distinctions in the type system.
-    """
-
-    __slots__ = ()
-
-    @abstractproperty
-    def mode(self) -> str:
-        pass
-
-    @abstractproperty
-    def name(self) -> str:
-        pass
-
-    @abstractmethod
-    def close(self) -> None:
-        pass
-
-    @abstractmethod
-    def closed(self) -> bool:
-        pass
-
-    @abstractmethod
-    def fileno(self) -> int:
-        pass
-
-    @abstractmethod
-    def flush(self) -> None:
-        pass
-
-    @abstractmethod
-    def isatty(self) -> bool:
-        pass
-
-    @abstractmethod
-    def read(self, n: int = -1) -> AnyStr:
-        pass
-
-    @abstractmethod
-    def readable(self) -> bool:
-        pass
-
-    @abstractmethod
-    def readline(self, limit: int = -1) -> AnyStr:
-        pass
-
-    @abstractmethod
-    def readlines(self, hint: int = -1) -> List[AnyStr]:
-        pass
-
-    @abstractmethod
-    def seek(self, offset: int, whence: int = 0) -> int:
-        pass
-
-    @abstractmethod
-    def seekable(self) -> bool:
-        pass
-
-    @abstractmethod
-    def tell(self) -> int:
-        pass
-
-    @abstractmethod
-    def truncate(self, size: int = None) -> int:
-        pass
-
-    @abstractmethod
-    def writable(self) -> bool:
-        pass
-
-    @abstractmethod
-    def write(self, s: AnyStr) -> int:
-        pass
-
-    @abstractmethod
-    def writelines(self, lines: List[AnyStr]) -> None:
-        pass
-
-    @abstractmethod
-    def __enter__(self) -> 'IO[AnyStr]':
-        pass
-
-    @abstractmethod
-    def __exit__(self, type, value, traceback) -> None:
-        pass
-
-
-class BinaryIO(IO[bytes]):
-    """Typed version of the return of open() in binary mode."""
-
-    __slots__ = ()
-
-    @abstractmethod
-    def write(self, s: Union[bytes, bytearray]) -> int:
-        pass
-
-    @abstractmethod
-    def __enter__(self) -> 'BinaryIO':
-        pass
-
-
-class TextIO(IO[str]):
-    """Typed version of the return of open() in text mode."""
-
-    __slots__ = ()
-
-    @abstractproperty
-    def buffer(self) -> BinaryIO:
-        pass
-
-    @abstractproperty
-    def encoding(self) -> str:
-        pass
-
-    @abstractproperty
-    def errors(self) -> Optional[str]:
-        pass
-
-    @abstractproperty
-    def line_buffering(self) -> bool:
-        pass
-
-    @abstractproperty
-    def newlines(self) -> Any:
-        pass
-
-    @abstractmethod
-    def __enter__(self) -> 'TextIO':
-        pass
-
-
-class io:
-    """Wrapper namespace for IO generic classes."""
-
-    __all__ = ['IO', 'TextIO', 'BinaryIO']
-    IO = IO
-    TextIO = TextIO
-    BinaryIO = BinaryIO
-
-io.__name__ = __name__ + '.io'
-sys.modules[io.__name__] = io
-
-
-Pattern = _TypeAlias('Pattern', AnyStr, type(stdlib_re.compile('')),
-                     lambda p: p.pattern)
-Match = _TypeAlias('Match', AnyStr, type(stdlib_re.match('', '')),
-                   lambda m: m.re.pattern)
-
-
-class re:
-    """Wrapper namespace for re type aliases."""
-
-    __all__ = ['Pattern', 'Match']
-    Pattern = Pattern
-    Match = Match
-
-re.__name__ = __name__ + '.re'
-sys.modules[re.__name__] = re
diff --git a/misc/actions_stubs.py b/misc/actions_stubs.py
deleted file mode 100644
index 978af71..0000000
--- a/misc/actions_stubs.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python3
-import os
-import shutil
-from typing import Tuple, Any
-try:
-    import click
-except ImportError:
-    print("You need the module \'click\'")
-    exit(1)
-
-base_path = os.getcwd()
-
-# I don't know how to set callables with different args
-def apply_all(func: Any, directory: str, extension: str,
-            to_extension: str='', exclude: Tuple[str]=('',),
-            recursive: bool=True, debug: bool=False) -> None:
-    excluded = [x+extension for x in exclude] if exclude else []
-    for p, d, files in os.walk(os.path.join(base_path,directory)):
-        for f in files:
-            if "{}".format(f) in excluded:
-                continue
-            inner_path = os.path.join(p,f)
-            if not inner_path.endswith(extension):
-                continue
-            if to_extension:
-                new_path = "{}{}".format(inner_path[:-len(extension)],to_extension)
-                func(inner_path,new_path)
-            else:
-                func(inner_path)
-        if not recursive:
-            break
-
-def confirm(resp: bool=False, **kargs) -> bool:
-    kargs['rest'] = "to this {f2}/*{e2}".format(**kargs) if kargs.get('f2') else ''
-    prompt = "{act} all files {rec}matching this expression {f1}/*{e1} {rest}".format(**kargs)
-    prompt.format(**kargs)
-    prompt = "{} [{}]|{}: ".format(prompt, 'Y' if resp else 'N', 'n' if resp else 'y')
-    while True:
-        ans = input(prompt).lower()
-        if not ans:
-            return resp
-        if ans not in ['y','n']:
-            print( 'Please, enter (y) or (n).')
-            continue
-        if ans == 'y':
-            return True
-        else:
-            return False
-
-actions = ['cp', 'mv', 'rm']
- at click.command(context_settings=dict(help_option_names=['-h', '--help']))
- at click.option('--action', '-a', type=click.Choice(actions), required=True, help="What do I have to do :-)")
- at click.option('--dir', '-d', 'directory', default='stubs', help="Directory to start search!")
- at click.option('--ext', '-e', 'extension', default='.py', help="Extension \"from\" will be applied the action. Default .py")
- at click.option('--to', '-t', 'to_extension', default='.pyi', help="Extension \"to\" will be applied the action if can. Default .pyi")
- at click.option('--exclude', '-x', multiple=True, default=('__init__',), help="For every appear, will ignore this files. (can set multiples times)")
- at click.option('--not-recursive', '-n', default=True, is_flag=True, help="Set if don't want to walk recursively.")
-def main(action: str, directory: str, extension: str, to_extension: str,
-    exclude: Tuple[str], not_recursive: bool) -> None:
-    """
-    This script helps to copy/move/remove files based on their extension.
-
-    The three actions will ask you for confirmation.
-
-    Examples (by default the script search in stubs directory):
-
-    - Change extension of all stubs from .py to .pyi:
-
-        python <script.py> -a mv
-
-    - Revert the previous action.
-
-        python <script.py> -a mv -e .pyi -t .py
-
-    - If you want to ignore "awesome.py" files.
-
-        python <script.py> -a [cp|mv|rm] -x awesome
-
-    - If you want to ignore "awesome.py" and "__init__.py" files.
-
-        python <script.py> -a [cp|mv|rm] -x awesome -x __init__
-
-    - If you want to remove all ".todo" files in "todo" directory, but not recursively:
-
-        python <script.py> -a rm -e .todo -d todo -r
-
-    """
-    if action not in actions:
-        print("Your action have to be one of this: {}".format(', '.join(actions)))
-        return
-
-    rec = "[Recursively] " if not_recursive else ''
-    if not extension.startswith('.'):
-        extension = ".{}".format(extension)
-    if not to_extension.startswith('.'):
-        to_extension = ".{}".format(to_extension)
-    if directory.endswith('/'):
-        directory = directory[:-1]
-    if action == 'cp':
-        if confirm(act='Copy',rec=rec, f1=directory, e1=extension, f2=directory, e2=to_extension):
-            apply_all(shutil.copy, directory, extension, to_extension, exclude, not_recursive)
-    elif action == 'rm':
-        if confirm(act='Remove',rec=rec, f1=directory, e1=extension):
-            apply_all(os.remove, directory, extension, exclude=exclude, recursive=not_recursive)
-    elif action == 'mv':
-        if confirm(act='Move',rec=rec, f1=directory, e1=extension, f2=directory, e2=to_extension):
-            apply_all(shutil.move, directory, extension, to_extension, exclude, not_recursive)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/misc/analyze_cache.py b/misc/analyze_cache.py
deleted file mode 100644
index 643e2bf..0000000
--- a/misc/analyze_cache.py
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/env python
-
-from typing import Any, Dict, Generator, Iterable, List, Optional
-from collections import Counter
-
-import os
-import os.path
-import json
-
-ROOT = ".mypy_cache/3.5"
-
-JsonDict = Dict[str, Any]
-
-class CacheData:
-    def __init__(self, filename: str, data_json: JsonDict, meta_json: JsonDict,
-                 data_size: int, meta_size: int) -> None:
-        self.filename = filename
-        self.data = data_json
-        self.meta = meta_json
-        self.data_size = data_size
-        self.meta_size = meta_size
-
-    @property
-    def total_size(self):
-        return self.data_size + self.meta_size
-
-
-def extract_classes(chunks: Iterable[CacheData]) -> Iterable[JsonDict]:
-    def extract(chunks: Iterable[JsonDict]) -> Iterable[JsonDict]:
-        for chunk in chunks:
-            if isinstance(chunk, dict):
-                yield chunk
-                yield from extract(chunk.values())
-            elif isinstance(chunk, list):
-                yield from extract(chunk)
-    yield from extract([chunk.data for chunk in chunks])
-
-
-def load_json(data_path: str, meta_path: str) -> CacheData:
-    with open(data_path, 'r') as ds:
-        data_json = json.load(ds)
-
-    with open(meta_path, 'r') as ms:
-        meta_json = json.load(ms)
-
-    data_size = os.path.getsize(data_path)
-    meta_size = os.path.getsize(meta_path)
-
-    return CacheData(data_path.replace(".data.json", ".*.json"),
-                     data_json, meta_json, data_size, meta_size)
-
-
-def get_files(root: str) -> Iterable[CacheData]:
-    for (dirpath, dirnames, filenames) in os.walk(root):
-        for filename in filenames:
-            if filename.endswith(".data.json"):
-                meta_filename = filename.replace(".data.json", ".meta.json")
-                yield load_json(
-                        os.path.join(dirpath, filename),
-                        os.path.join(dirpath, meta_filename))
-
-
-def pluck(name: str, chunks: Iterable[JsonDict]) -> Iterable[JsonDict]:
-    return (chunk for chunk in chunks if chunk['.class'] == name)
-
-
-def report_counter(counter: Counter, amount: Optional[int] = None) -> None:
-    for name, count in counter.most_common(amount):
-        print('    {: <8} {}'.format(count, name))
-    print()
-
-
-def report_most_common(chunks: List[JsonDict], amount: Optional[int] = None) -> None:
-    report_counter(Counter(str(chunk) for chunk in chunks), amount)
-
-
-def compress(chunk: JsonDict) -> JsonDict:
-    cache = {}  # type: Dict[int, JsonDict]
-    counter = 0
-    def helper(chunk: Any) -> Any:
-        nonlocal counter
-        if not isinstance(chunk, dict):
-            return chunk
-
-        if len(chunk) <= 2:
-            return chunk
-        id = hash(str(chunk))
-
-        if id in cache:
-            return cache[id]
-        else:
-            cache[id] = {'.id': counter}
-            chunk['.cache_id'] = counter
-            counter += 1
-
-        for name in sorted(chunk.keys()):
-            value = chunk[name]
-            if isinstance(value, list):
-                chunk[name] = [helper(child) for child in value]
-            elif isinstance(value, dict):
-                chunk[name] = helper(value)
-
-        return chunk
-    out = helper(chunk)
-    return out
-
-def decompress(chunk: JsonDict) -> JsonDict:
-    cache = {}  # type: Dict[int, JsonDict]
-    def helper(chunk: Any) -> Any:
-        if not isinstance(chunk, dict):
-            return chunk
-        if '.id' in chunk:
-            return cache[chunk['.id']]
-
-        counter = None
-        if '.cache_id' in chunk:
-            counter = chunk['.cache_id']
-            del chunk['.cache_id']
-
-        for name in sorted(chunk.keys()):
-            value = chunk[name]
-            if isinstance(value, list):
-                chunk[name] = [helper(child) for child in value]
-            elif isinstance(value, dict):
-                chunk[name] = helper(value)
-
-        if counter is not None:
-            cache[counter] = chunk
-
-        return chunk
-    return helper(chunk)
-
-
-
-
-def main() -> None:
-    json_chunks = list(get_files(ROOT))
-    class_chunks = list(extract_classes(json_chunks))
-
-    total_size = sum(chunk.total_size for chunk in json_chunks)
-    print("Total cache size: {:.3f} megabytes".format(total_size / (1024 * 1024)))
-    print()
-
-    class_name_counter = Counter(chunk[".class"] for chunk in class_chunks)
-    print("Most commonly used classes:")
-    report_counter(class_name_counter)
-
-    print("Most common literal chunks:")
-    report_most_common(class_chunks, 15)
-
-    build = None
-    for chunk in json_chunks:
-        if 'build.*.json' in chunk.filename:
-            build = chunk
-            break
-    original = json.dumps(build.data, sort_keys=True)
-    print("Size of build.data.json, in kilobytes: {:.3f}".format(len(original) / 1024))
-
-    build.data = compress(build.data)
-    compressed = json.dumps(build.data, sort_keys=True)
-    print("Size of compressed build.data.json, in kilobytes: {:.3f}".format(len(compressed) / 1024))
-
-    build.data = decompress(build.data)
-    decompressed = json.dumps(build.data, sort_keys=True)
-    print("Size of decompressed build.data.json, in kilobytes: {:.3f}".format(len(decompressed) / 1024))
-
-    print("Lossless conversion back", original == decompressed)
-
-
-    '''var_chunks = list(pluck("Var", class_chunks))
-    report_most_common(var_chunks, 20)
-    print()
-
-    #for var in var_chunks:
-    #    if var['fullname'] == 'self' and not (isinstance(var['type'], dict) and var['type']['.class'] == 'AnyType'):
-    #        print(var)
-    #argument_chunks = list(pluck("Argument", class_chunks))
-
-    symbol_table_node_chunks = list(pluck("SymbolTableNode", class_chunks))
-    report_most_common(symbol_table_node_chunks, 20)
-
-    print()
-    print("Most common")
-    report_most_common(class_chunks, 20)
-    print()'''
-
-
-if __name__ == '__main__':
-    main()
diff --git a/misc/async_matrix.py b/misc/async_matrix.py
deleted file mode 100644
index e9a758a..0000000
--- a/misc/async_matrix.py
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python3
-"""Test various combinations of generators/coroutines.
-
-This was used to cross-check the errors in the test case
-testFullCoroutineMatrix in test-data/unit/check-async-await.test.
-"""
-
-import sys
-from types import coroutine
-from typing import Any, AsyncIterator, Awaitable, Generator, Iterator
-
-# The various things you might try to use in `await` or `yield from`.
-
-def plain_generator() -> Generator[str, None, int]:
-    yield 'a'
-    return 1
-
-async def plain_coroutine() -> int:
-    return 1
-
- at coroutine
-def decorated_generator() -> Generator[str, None, int]:
-    yield 'a'
-    return 1
-
- at coroutine
-async def decorated_coroutine() -> int:
-    return 1
-
-class It(Iterator[str]):
-    stop = False
-    def __iter__(self) -> 'It':
-        return self
-    def __next__(self) -> str:
-        if self.stop:
-            raise StopIteration('end')
-        else:
-            self.stop = True
-            return 'a'
-
-def other_iterator() -> It:
-    return It()
-
-class Aw(Awaitable[int]):
-    def __await__(self) -> Generator[str, Any, int]:
-        yield 'a'
-        return 1
-
-def other_coroutine() -> Aw:
-    return Aw()
-
-# The various contexts in which `await` or `yield from` might occur.
-
-def plain_host_generator(func) -> Generator[str, None, None]:
-    yield 'a'
-    x = 0
-    f = func()
-    try:
-        x = yield from f
-    finally:
-        try:
-            f.close()
-        except AttributeError:
-            pass
-
-async def plain_host_coroutine(func) -> None:
-    x = 0
-    x = await func()
-
- at coroutine
-def decorated_host_generator(func) -> Generator[str, None, None]:
-    yield 'a'
-    x = 0
-    f = func()
-    try:
-        x = yield from f
-    finally:
-        try:
-            f.close()
-        except AttributeError:
-            pass
-
- at coroutine
-async def decorated_host_coroutine(func) -> None:
-    x = 0
-    x = await func()
-
-# Main driver.
-
-def main():
-    verbose = ('-v' in sys.argv)
-    for host in [plain_host_generator, plain_host_coroutine,
-                 decorated_host_generator, decorated_host_coroutine]:
-        print()
-        print("==== Host:", host.__name__)
-        for func in [plain_generator, plain_coroutine,
-                     decorated_generator, decorated_coroutine,
-                     other_iterator, other_coroutine]:
-            print("  ---- Func:", func.__name__)
-            try:
-                f = host(func)
-                for i in range(10):
-                    try:
-                        x = f.send(None)
-                        if verbose:
-                            print("    yield:", x)
-                    except StopIteration as e:
-                        if verbose:
-                            print("    stop:", e.value)
-                        break
-                else:
-                    if verbose:
-                        print("    ???? still going")
-            except Exception as e:
-                print("    error:", repr(e))
-
-# Run main().
-
-if __name__ == '__main__':
-    main()
diff --git a/misc/fix_annotate.py b/misc/fix_annotate.py
deleted file mode 100644
index 0b552bf..0000000
--- a/misc/fix_annotate.py
+++ /dev/null
@@ -1,219 +0,0 @@
-"""Fixer for lib2to3 that inserts mypy annotations into all methods.
-
-The simplest way to run this is to copy it into lib2to3's "fixes"
-subdirectory and then run "2to3 -f annotate" over your files.
-
-The fixer transforms e.g.
-
-  def foo(self, bar, baz=12):
-      return bar + baz
-
-into
-
-  def foo(self, bar, baz=12):
-      # type: (Any, int) -> Any
-      return bar + baz
-
-It does not do type inference but it recognizes some basic default
-argument values such as numbers and strings (and assumes their type
-implies the argument type).
-
-It also uses some basic heuristics to decide whether to ignore the
-first argument:
-
-  - always if it's named 'self'
-  - if there's a @classmethod decorator
-
-Finally, it knows that __init__() is supposed to return None.
-"""
-
-from __future__ import print_function
-
-import os
-import re
-
-from lib2to3.fixer_base import BaseFix
-from lib2to3.patcomp import compile_pattern
-from lib2to3.pytree import Leaf, Node
-from lib2to3.fixer_util import token, syms, touch_import
-
-
-class FixAnnotate(BaseFix):
-
-    # This fixer is compatible with the bottom matcher.
-    BM_compatible = True
-
-    # This fixer shouldn't run by default.
-    explicit = True
-
-    # The pattern to match.
-    PATTERN = """
-              funcdef< 'def' name=any parameters< '(' [args=any] ')' > ':' suite=any+ >
-              """
-
-    counter = None if not os.getenv('MAXFIXES') else int(os.getenv('MAXFIXES'))
-
-    def transform(self, node, results):
-        if FixAnnotate.counter is not None:
-            if FixAnnotate.counter <= 0:
-                return
-        suite = results['suite']
-        children = suite[0].children
-
-        # NOTE: I've reverse-engineered the structure of the parse tree.
-        # It's always a list of nodes, the first of which contains the
-        # entire suite.  Its children seem to be:
-        #
-        #   [0] NEWLINE
-        #   [1] INDENT
-        #   [2...n-2] statements (the first may be a docstring)
-        #   [n-1] DEDENT
-        #
-        # Comments before the suite are part of the INDENT's prefix.
-        #
-        # "Compact" functions (e.g. "def foo(x, y): return max(x, y)")
-        # have a different structure that isn't matched by PATTERN.
-
-        ## print('-'*60)
-        ## print(node)
-        ## for i, ch in enumerate(children):
-        ##     print(i, repr(ch.prefix), repr(ch))
-
-        # Check if there's already an annotation.
-        for ch in children:
-            if ch.prefix.lstrip().startswith('# type:'):
-                return  # There's already a # type: comment here; don't change anything.
-
-        # Compute the annotation
-        annot = self.make_annotation(node, results)
-
-        # Insert '# type: {annot}' comment.
-        # For reference, see lib2to3/fixes/fix_tuple_params.py in stdlib.
-        if len(children) >= 2 and children[1].type == token.INDENT:
-            children[1].prefix = '%s# type: %s\n%s' % (children[1].value, annot, children[1].prefix)
-            children[1].changed()
-            if FixAnnotate.counter is not None:
-                FixAnnotate.counter -= 1
-
-        # Also add 'from typing import Any' at the top.
-        if 'Any' in annot:
-            touch_import('typing', 'Any', node)
-
-    def make_annotation(self, node, results):
-        name = results['name']
-        assert isinstance(name, Leaf), repr(name)
-        assert name.type == token.NAME, repr(name)
-        decorators = self.get_decorators(node)
-        is_method = self.is_method(node)
-        if name.value == '__init__' or not self.has_return_exprs(node):
-            restype = 'None'
-        else:
-            restype = 'Any'
-        args = results.get('args')
-        argtypes = []
-        if isinstance(args, Node):
-            children = args.children
-        elif isinstance(args, Leaf):
-            children = [args]
-        else:
-            children = []
-        # Interpret children according to the following grammar:
-        # (('*'|'**')? NAME ['=' expr] ','?)*
-        stars = inferred_type = ''
-        in_default = False
-        at_start = True
-        for child in children:
-            if isinstance(child, Leaf):
-                if child.value in ('*', '**'):
-                    stars += child.value
-                elif child.type == token.NAME and not in_default:
-                    if not is_method or not at_start or 'staticmethod' in decorators:
-                        inferred_type = 'Any'
-                    else:
-                        # Always skip the first argument if it's named 'self'.
-                        # Always skip the first argument of a class method.
-                        if  child.value == 'self' or 'classmethod' in decorators:
-                            pass
-                        else:
-                            inferred_type = 'Any'
-                elif child.value == '=':
-                    in_default = True
-                elif in_default and child.value != ',':
-                    if child.type == token.NUMBER:
-                        if re.match(r'\d+[lL]?$', child.value):
-                            inferred_type = 'int'
-                        else:
-                            inferred_type = 'float'  # TODO: complex?
-                    elif child.type == token.STRING:
-                        if child.value.startswith(('u', 'U')):
-                            inferred_type = 'unicode'
-                        else:
-                            inferred_type = 'str'
-                    elif child.type == token.NAME and child.value in ('True', 'False'):
-                        inferred_type = 'bool'
-                elif child.value == ',':
-                    if inferred_type:
-                        argtypes.append(stars + inferred_type)
-                    # Reset
-                    stars = inferred_type = ''
-                    in_default = False
-                    at_start = False
-        if inferred_type:
-            argtypes.append(stars + inferred_type)
-        return '(' + ', '.join(argtypes) + ') -> ' + restype
-
-    # The parse tree has a different shape when there is a single
-    # decorator vs. when there are multiple decorators.
-    DECORATED = "decorated< (d=decorator | decorators< dd=decorator+ >) funcdef >"
-    decorated = compile_pattern(DECORATED)
-
-    def get_decorators(self, node):
-        """Return a list of decorators found on a function definition.
-
-        This is a list of strings; only simple decorators
-        (e.g. @staticmethod) are returned.
-
-        If the function is undecorated or only non-simple decorators
-        are found, return [].
-        """
-        if node.parent is None:
-            return []
-        results = {}
-        if not self.decorated.match(node.parent, results):
-            return []
-        decorators = results.get('dd') or [results['d']]
-        decs = []
-        for d in decorators:
-            for child in d.children:
-                if isinstance(child, Leaf) and child.type == token.NAME:
-                    decs.append(child.value)
-        return decs
-
-    def is_method(self, node):
-        """Return whether the node occurs (directly) inside a class."""
-        node = node.parent
-        while node is not None:
-            if node.type == syms.classdef:
-                return True
-            if node.type == syms.funcdef:
-                return False
-            node = node.parent
-        return False
-
-    RETURN_EXPR = "return_stmt< 'return' any >"
-    return_expr = compile_pattern(RETURN_EXPR)
-
-    def has_return_exprs(self, node):
-        """Traverse the tree below node looking for 'return expr'.
-
-        Return True if at least 'return expr' is found, False if not.
-        (If both 'return' and 'return expr' are found, return True.)
-        """
-        results = {}
-        if self.return_expr.match(node, results):
-            return True
-        for child in node.children:
-            if child.type not in (syms.funcdef, syms.classdef):
-                if self.has_return_exprs(child):
-                    return True
-        return False
diff --git a/misc/incremental_checker.py b/misc/incremental_checker.py
deleted file mode 100755
index 515e662..0000000
--- a/misc/incremental_checker.py
+++ /dev/null
@@ -1,356 +0,0 @@
-#!/usr/bin/env python3
-"""
-This file compares the output and runtime of running normal vs incremental mode
-on the history of any arbitrary git repo as a way of performing a sanity check
-to make sure incremental mode is working correctly and efficiently.
-
-It does so by first running mypy without incremental mode on the specified range
-of commits to find the expected result, then rewinds back to the first commit and
-re-runs mypy on the commits with incremental mode enabled to make sure it returns
-the same results.
-
-This script will download and test the offical mypy repo by default. Running:
-
-    python3 misc/incremental_checker.py last 30
-
-is equivalent to running
-
-    python3 misc/incremental_checker.py last 30 \\
-            --repo_url https://github.com/python/mypy.git \\
-            --file-path mypy
-
-You can chose to run this script against a specific commit id or against the
-last n commits.
-
-To run this script against the last 30 commits:
-
-    python3 misc/incremental_checker.py last 30
-
-To run this script starting from the commit id 2a432b:
-
-    python3 misc/incremental_checker.py commit 2a432b
-"""
-
-from typing import Any, Dict, List, Optional, Tuple
-
-from argparse import (ArgumentParser, RawDescriptionHelpFormatter,
-                      ArgumentDefaultsHelpFormatter, Namespace)
-import base64
-import json
-import os
-import random
-import shutil
-import subprocess
-import sys
-import textwrap
-import time
-
-
-CACHE_PATH = ".incremental_checker_cache.json"
-MYPY_REPO_URL = "https://github.com/python/mypy.git"
-MYPY_TARGET_FILE = "mypy"
-
-JsonDict = Dict[str, Any]
-
-
-def print_offset(text: str, indent_length: int = 4) -> None:
-    print()
-    print(textwrap.indent(text, ' ' * indent_length))
-    print()
-
-
-def delete_folder(folder_path: str) -> None:
-    if os.path.exists(folder_path):
-        shutil.rmtree(folder_path)
-
-
-def execute(command: List[str], fail_on_error: bool = True) -> Tuple[str, str, int]:
-    proc = subprocess.Popen(
-        ' '.join(command),
-        stderr=subprocess.PIPE,
-        stdout=subprocess.PIPE,
-        shell=True)
-    stdout_bytes, stderr_bytes = proc.communicate()  # type: Tuple[bytes, bytes]
-    stdout, stderr = stdout_bytes.decode('utf-8'), stderr_bytes.decode('utf-8')
-    if fail_on_error and proc.returncode != 0:
-        print('EXECUTED COMMAND:', repr(command))
-        print('RETURN CODE:', proc.returncode)
-        print()
-        print('STDOUT:')
-        print_offset(stdout)
-        print('STDERR:')
-        print_offset(stderr)
-        raise RuntimeError('Unexpected error from external tool.')
-    return stdout, stderr, proc.returncode
-
-
-def ensure_environment_is_ready(mypy_path: str, temp_repo_path: str, mypy_cache_path: str) -> None:
-    os.chdir(mypy_path)
-    delete_folder(temp_repo_path)
-    delete_folder(mypy_cache_path)
-
-
-def initialize_repo(repo_url: str, temp_repo_path: str, branch: str) -> None:
-    print("Cloning repo {0} to {1}".format(repo_url, temp_repo_path))
-    execute(["git", "clone", repo_url, temp_repo_path])
-    if branch is not None:
-        print("Checking out branch {}".format(branch))
-        execute(["git", "-C", temp_repo_path, "checkout", branch])
-
-
-def get_commits(repo_folder_path: str, commit_range: str) -> List[Tuple[str, str]]:
-    raw_data, _stderr, _errcode = execute([
-        "git", "-C", repo_folder_path, "log", "--reverse", "--oneline", commit_range])
-    output = []
-    for line in raw_data.strip().split('\n'):
-        commit_id, _, message = line.partition(' ')
-        output.append((commit_id, message))
-    return output
-
-
-def get_commits_starting_at(repo_folder_path: str, start_commit: str) -> List[Tuple[str, str]]:
-    print("Fetching commits starting at {0}".format(start_commit))
-    return get_commits(repo_folder_path, '{0}^..HEAD'.format(start_commit))
-
-
-def get_nth_commit(repo_folder_path, n: int) -> Tuple[str, str]:
-    print("Fetching last {} commits (or all, if there are fewer commits than n)".format(n))
-    return get_commits(repo_folder_path, '-{}'.format(n))[0]
-
-
-def run_mypy(target_file_path: Optional[str],
-             mypy_cache_path: str,
-             mypy_script: Optional[str],
-             incremental: bool = True,
-             verbose: bool = False) -> Tuple[float, str]:
-    """Runs mypy against `target_file_path` and returns what mypy prints to stdout as a string.
-
-    If `incremental` is set to True, this function will use store and retrieve all caching data
-    inside `mypy_cache_path`. If `verbose` is set to True, this function will pass the "-v -v"
-    flags to mypy to make it output debugging information.
-    """
-    if mypy_script is None:
-        command = ["python3", "-m", "mypy"]
-    else:
-        command = [mypy_script]
-    command.extend(["--cache-dir", mypy_cache_path])
-    if incremental:
-        command.append("--incremental")
-    if verbose:
-        command.extend(["-v", "-v"])
-    if target_file_path is not None:
-        command.append(target_file_path)
-    start = time.time()
-    output, stderr, _ = execute(command, False)
-    if stderr != "":
-        output = stderr
-    runtime = time.time() - start
-    return runtime, output
-
-
-def load_cache(incremental_cache_path: str = CACHE_PATH) -> JsonDict:
-    if os.path.exists(incremental_cache_path):
-        with open(incremental_cache_path, 'r') as stream:
-            return json.load(stream)
-    else:
-        return {}
-
-
-def save_cache(cache: JsonDict, incremental_cache_path: str = CACHE_PATH) -> None:
-    with open(incremental_cache_path, 'w') as stream:
-        json.dump(cache, stream, indent=2)
-
-
-def set_expected(commits: List[Tuple[str, str]],
-                 cache: JsonDict,
-                 temp_repo_path: str,
-                 target_file_path: Optional[str],
-                 mypy_cache_path: str,
-                 mypy_script: Optional[str]) -> None:
-    """Populates the given `cache` with the expected results for all of the given `commits`.
-
-    This function runs mypy on the `target_file_path` inside the `temp_repo_path`, and stores
-    the result in the `cache`.
-
-    If `cache` already contains results for a particular commit, this function will
-    skip evaluating that commit and move on to the next."""
-    for commit_id, message in commits:
-        if commit_id in cache:
-            print('Skipping commit (already cached): {0}: "{1}"'.format(commit_id, message))
-        else:
-            print('Caching expected output for commit {0}: "{1}"'.format(commit_id, message))
-            execute(["git", "-C", temp_repo_path, "checkout", commit_id])
-            runtime, output = run_mypy(target_file_path, mypy_cache_path, mypy_script,
-                                       incremental=False)
-            cache[commit_id] = {'runtime': runtime, 'output': output}
-            if output == "":
-                print("    Clean output ({:.3f} sec)".format(runtime))
-            else:
-                print("    Output ({:.3f} sec)".format(runtime))
-                print_offset(output, 8)
-    print()
-
-
-def test_incremental(commits: List[Tuple[str, str]],
-                     cache: JsonDict,
-                     temp_repo_path: str,
-                     target_file_path: Optional[str],
-                     mypy_cache_path: str,
-                     mypy_script: Optional[str]) -> None:
-    """Runs incremental mode on all `commits` to verify the output matches the expected output.
-
-    This function runs mypy on the `target_file_path` inside the `temp_repo_path`. The
-    expected output must be stored inside of the given `cache`.
-    """
-    print("Note: first commit is evaluated twice to warm up cache")
-    commits = [commits[0]] + commits
-    for commit_id, message in commits:
-        print('Now testing commit {0}: "{1}"'.format(commit_id, message))
-        execute(["git", "-C", temp_repo_path, "checkout", commit_id])
-        runtime, output = run_mypy(target_file_path, mypy_cache_path, mypy_script,
-                                   incremental=True)
-        expected_runtime = cache[commit_id]['runtime']  # type: float
-        expected_output = cache[commit_id]['output']  # type: str
-        if output != expected_output:
-            print("    Output does not match expected result!")
-            print("    Expected output ({:.3f} sec):".format(expected_runtime))
-            print_offset(expected_output, 8)
-            print("    Actual output: ({:.3f} sec):".format(runtime))
-            print_offset(output, 8)
-        else:
-            print("    Output matches expected result!")
-            print("    Incremental: {:.3f} sec".format(runtime))
-            print("    Original:    {:.3f} sec".format(expected_runtime))
-
-
-def cleanup(temp_repo_path: str, mypy_cache_path: str) -> None:
-    delete_folder(temp_repo_path)
-    delete_folder(mypy_cache_path)
-
-
-def test_repo(target_repo_url: str, temp_repo_path: str,
-              target_file_path: Optional[str],
-              mypy_path: str, incremental_cache_path: str, mypy_cache_path: str,
-              range_type: str, range_start: str, branch: str,
-              params: Optional[Namespace] = None) -> None:
-    """Tests incremental mode against the repo specified in `target_repo_url`.
-
-    This algorithm runs in five main stages:
-
-    1.  Clones `target_repo_url` into the `temp_repo_path` folder locally,
-        checking out the specified `branch` if applicable.
-    2.  Examines the repo's history to get the list of all commits to
-        to test incremental mode on.
-    3.  Runs mypy WITHOUT incremental mode against the `target_file_path` (which is
-        assumed to be located inside the `temp_repo_path`), testing each commit
-        discovered in stage two.
-        -   If the results of running mypy WITHOUT incremental mode on a
-            particular commit are already cached inside the `incremental_cache_path`,
-            skip that commit to save time.
-        -   Cache the results after finishing.
-    4.  Rewind back to the first commit, and run mypy WITH incremental mode
-        against the `target_file_path` commit-by-commit, and compare to the expected
-        results found in stage 3.
-    5.  Delete all unnecessary temp files.
-    """
-    # Stage 1: Clone repo and get ready to being testing
-    ensure_environment_is_ready(mypy_path, temp_repo_path, mypy_cache_path)
-    initialize_repo(target_repo_url, temp_repo_path, branch)
-
-    # Stage 2: Get all commits we want to test
-    if range_type == "last":
-        start_commit = get_nth_commit(temp_repo_path, int(range_start))[0]
-    elif range_type == "commit":
-        start_commit = range_start
-    else:
-        raise RuntimeError("Invalid option: {}".format(range_type))
-    commits = get_commits_starting_at(temp_repo_path, start_commit)
-    if params is not None and params.sample:
-        seed = params.seed or base64.urlsafe_b64encode(os.urandom(15)).decode('ascii')
-        random.seed(seed)
-        commits = random.sample(commits, params.sample)
-        print("Sampled down to %d commits using random seed %s" % (len(commits), seed))
-
-    # Stage 3: Find and cache expected results for each commit (without incremental mode)
-    cache = load_cache(incremental_cache_path)
-    set_expected(commits, cache, temp_repo_path, target_file_path, mypy_cache_path,
-                 mypy_script=params.mypy_script)
-    save_cache(cache, incremental_cache_path)
-
-    # Stage 4: Rewind and re-run mypy (with incremental mode enabled)
-    test_incremental(commits, cache, temp_repo_path, target_file_path, mypy_cache_path,
-                     mypy_script=params.mypy_script)
-
-    # Stage 5: Remove temp files
-    cleanup(temp_repo_path, mypy_cache_path)
-
-
-def main() -> None:
-    help_factory = (lambda prog: RawDescriptionHelpFormatter(prog=prog, max_help_position=32))
-    parser = ArgumentParser(
-        prog='incremental_checker',
-        description=__doc__,
-        formatter_class=help_factory)
-
-    parser.add_argument("range_type", metavar="START_TYPE", choices=["last", "commit"],
-                        help="must be one of 'last' or 'commit'")
-    parser.add_argument("range_start", metavar="COMMIT_ID_OR_NUMBER",
-                        help="the commit id to start from, or the number of "
-                        "commits to move back (see above)")
-    parser.add_argument("-r", "--repo_url", default=MYPY_REPO_URL, metavar="URL",
-                        help="the repo to clone and run tests on")
-    parser.add_argument("-f", "--file-path", default=MYPY_TARGET_FILE, metavar="FILE",
-                        help="the name of the file or directory to typecheck")
-    parser.add_argument("--cache-path", default=CACHE_PATH, metavar="DIR",
-                        help="sets a custom location to store cache data")
-    parser.add_argument("--branch", default=None, metavar="NAME",
-                        help="check out and test a custom branch"
-                        "uses the default if not specified")
-    parser.add_argument("--sample", type=int, help="use a random sample of size SAMPLE")
-    parser.add_argument("--seed", type=str, help="random seed")
-    parser.add_argument("--mypy-script", type=str, help="alternate mypy script to run")
-
-    if len(sys.argv[1:]) == 0:
-        parser.print_help()
-        parser.exit()
-
-    params = parser.parse_args(sys.argv[1:])
-
-    # Make all paths absolute so we avoid having to worry about being in the right folder
-
-    # The path to this specific script (incremental_checker.py).
-    script_path = os.path.abspath(sys.argv[0])
-
-    # The path to the mypy repo.
-    mypy_path = os.path.abspath(os.path.dirname(os.path.dirname(script_path)))
-
-    # The folder the cloned repo will reside in.
-    temp_repo_path = os.path.abspath(os.path.join(mypy_path, "tmp_repo"))
-
-    # The particular file or package to typecheck inside the repo.
-    if params.file_path:
-        target_file_path = os.path.abspath(os.path.join(temp_repo_path, params.file_path))
-    else:
-        # Allow `-f ''` to clear target_file_path.
-        target_file_path = None
-
-    # The path to where the incremental checker cache data is stored.
-    incremental_cache_path = os.path.abspath(params.cache_path)
-
-    # The path to store the mypy incremental mode cache data
-    mypy_cache_path = os.path.abspath(os.path.join(mypy_path, "misc", ".mypy_cache"))
-
-    print("Assuming mypy is located at {0}".format(mypy_path))
-    print("Temp repo will be cloned at {0}".format(temp_repo_path))
-    print("Testing file/dir located at {0}".format(target_file_path))
-    print("Using cache data located at {0}".format(incremental_cache_path))
-    print()
-
-    test_repo(params.repo_url, temp_repo_path, target_file_path,
-              mypy_path, incremental_cache_path, mypy_cache_path,
-              params.range_type, params.range_start, params.branch,
-              params)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/misc/macs.el b/misc/macs.el
deleted file mode 100644
index 67d80aa..0000000
--- a/misc/macs.el
+++ /dev/null
@@ -1,22 +0,0 @@
-; Example Emacs integration; shows type of expression in region.
-
-(defun mypy-show-region ()
-  "Show type of variable at point."
-  (interactive)
-  (let ((here (region-beginning))
-        (there (region-end))
-        (filename (buffer-file-name)))
-    (let ((hereline (line-number-at-pos here))
-          (herecol (save-excursion (goto-char here) (current-column)))
-          (thereline (line-number-at-pos there))
-          (therecol (save-excursion (goto-char there) (current-column))))
-      (shell-command
-       (format "cd ~/src/mypy; python3 ./scripts/find_type.py %s %s %s %s %s python3 -m mypy -i mypy"
-               filename hereline herecol thereline therecol)
-       )
-      )
-    )
-  )
-
-; I like to bind this to ^X-t.
-(global-set-key "\C-xt" 'mypy-show-region)
diff --git a/misc/perf_checker.py b/misc/perf_checker.py
deleted file mode 100644
index e55f8cc..0000000
--- a/misc/perf_checker.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/usr/bin/env python3
-
-from typing import Callable, List, Tuple
-
-import os
-import shutil
-import statistics
-import subprocess
-import textwrap
-import time
-
-
-class Command:
-    def __init__(self, setup: Callable[[], None], command: Callable[[], None]) -> None:
-        self.setup = setup
-        self.command = command
-
-
-def print_offset(text: str, indent_length: int = 4) -> None:
-    print()
-    print(textwrap.indent(text, ' ' * indent_length))
-    print()
-
-
-def delete_folder(folder_path: str) -> None:
-    if os.path.exists(folder_path):
-        shutil.rmtree(folder_path)
-
-
-def execute(command: List[str]) -> None:
-    proc = subprocess.Popen(
-        ' '.join(command),
-        stderr=subprocess.PIPE,
-        stdout=subprocess.PIPE,
-        shell=True)
-    stdout_bytes, stderr_bytes = proc.communicate()  # type: Tuple[bytes, bytes]
-    stdout, stderr = stdout_bytes.decode('utf-8'), stderr_bytes.decode('utf-8')
-    if proc.returncode != 0:
-        print('EXECUTED COMMAND:', repr(command))
-        print('RETURN CODE:', proc.returncode)
-        print()
-        print('STDOUT:')
-        print_offset(stdout)
-        print('STDERR:')
-        print_offset(stderr)
-        raise RuntimeError('Unexpected error from external tool.')
-
-
-def trial(num_trials: int, command: Command) -> List[float]:
-    trials = []
-    for i in range(num_trials):
-        command.setup()
-        start = time.time()
-        command.command()
-        delta = time.time() - start
-        trials.append(delta)
-    return trials
-
-
-def report(name: str, times: List[float]) -> None:
-    print("{}:".format(name))
-    print("  Times: {}".format(times))
-    print("  Mean:  {}".format(statistics.mean(times)))
-    print("  Stdev: {}".format(statistics.stdev(times)))
-    print()
-
-
-def main() -> None:
-    trials = 3
-
-    print("Testing baseline")
-    baseline = trial(trials, Command(
-        lambda: None,
-        lambda: execute(["python3", "-m", "mypy", "mypy"])))
-    report("Baseline", baseline)
-
-    print("Testing cold cache")
-    cold_cache = trial(trials, Command(
-        lambda: delete_folder(".mypy_cache"),
-        lambda: execute(["python3", "-m", "mypy", "-i", "mypy"])))
-    report("Cold cache", cold_cache)
-
-    print("Testing warm cache")
-    execute(["python3", "-m", "mypy", "-i", "mypy"])
-    warm_cache = trial(trials, Command(
-        lambda: None,
-        lambda: execute(["python3", "-m", "mypy", "-i", "mypy"])))
-    report("Warm cache", warm_cache)
-
-
-if __name__ == '__main__':
-    main()
-
diff --git a/misc/remove-eol-whitespace.sh b/misc/remove-eol-whitespace.sh
deleted file mode 100644
index 3da6b9d..0000000
--- a/misc/remove-eol-whitespace.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-# Remove trailing whitespace from all non-binary files in a git repo.
-
-# From https://gist.github.com/dpaluy/3690668; originally from here:
-# http://unix.stackexchange.com/questions/36233/how-to-skip-file-in-sed-if-it-contains-regex/36240#36240
-
-git grep -I --name-only -z -e '' | xargs -0 sed -i -e 's/[ \t]\+\(\r\?\)$/\1/'
diff --git a/misc/test_case_to_actual.py b/misc/test_case_to_actual.py
deleted file mode 100644
index 9a91bb1..0000000
--- a/misc/test_case_to_actual.py
+++ /dev/null
@@ -1,71 +0,0 @@
-from typing import Iterator, List
-import sys
-import os
-import os.path
-
-
-class Chunk:
-    def __init__(self, header_type: str, args: str) -> None:
-        self.header_type = header_type
-        self.args = args
-        self.lines = []  # type: List[str]
-
-
-def is_header(line: str) -> bool:
-    return line.startswith('[') and line.endswith(']')
-
-
-def normalize(lines: Iterator[str]) -> Iterator[str]:
-    return (line.rstrip() for line in lines)
-
-
-def produce_chunks(lines: Iterator[str]) -> Iterator[Chunk]:
-    current_chunk = None  # type: Chunk
-    for line in normalize(lines):
-        if is_header(line):
-            if current_chunk is not None:
-                yield current_chunk
-            parts = line[1:-1].split(' ', 1)
-            args = parts[1] if len(parts) > 1 else ''
-            current_chunk = Chunk(parts[0], args)
-        else:
-            current_chunk.lines.append(line)
-    if current_chunk is not None:
-        yield current_chunk
-
-
-def write_out(filename: str, lines: List[str]) -> None:
-    os.makedirs(os.path.dirname(filename), exist_ok=True)
-    with open(filename, 'w') as stream:
-        stream.write('\n'.join(lines))
-
-
-def write_tree(root: str, chunks: Iterator[Chunk]) -> None:
-    init = next(chunks)
-    assert init.header_type == 'case'
-    
-    root = os.path.join(root, init.args)
-    write_out(os.path.join(root, 'main.py'), init.lines)
-
-    for chunk in chunks:
-        if chunk.header_type == 'file' and chunk.args.endswith('.py'):
-            write_out(os.path.join(root, chunk.args), chunk.lines)
-
-
-def help() -> None:
-    print("Usage: python misc/test_case_to_actual.py test_file.txt root_path")
-
-
-def main() -> None:
-    if len(sys.argv) != 3:
-        help()
-        return
-
-    test_file_path, root_path = sys.argv[1], sys.argv[2]
-    with open(test_file_path, 'r') as stream:
-        chunks = produce_chunks(iter(stream))
-        write_tree(root_path, chunks)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/misc/touch_checker.py b/misc/touch_checker.py
deleted file mode 100644
index c44afe4..0000000
--- a/misc/touch_checker.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/usr/bin/env python3
-
-from typing import Callable, List, Tuple, Optional
-
-import sys
-import glob
-import os
-import shutil
-import statistics
-import subprocess
-import textwrap
-import time
-
-
-def print_offset(text: str, indent_length: int = 4) -> None:
-    print()
-    print(textwrap.indent(text, ' ' * indent_length))
-    print()
-
-
-def delete_folder(folder_path: str) -> None:
-    if os.path.exists(folder_path):
-        shutil.rmtree(folder_path)
-
-
-def execute(command: List[str]) -> None:
-    proc = subprocess.Popen(
-        ' '.join(command),
-        stderr=subprocess.PIPE,
-        stdout=subprocess.PIPE,
-        shell=True)
-    stdout_bytes, stderr_bytes = proc.communicate()  # type: Tuple[bytes, bytes]
-    stdout, stderr = stdout_bytes.decode('utf-8'), stderr_bytes.decode('utf-8')
-    if proc.returncode != 0:
-        print('EXECUTED COMMAND:', repr(command))
-        print('RETURN CODE:', proc.returncode)
-        print()
-        print('STDOUT:')
-        print_offset(stdout)
-        print('STDERR:')
-        print_offset(stderr)
-        print()
-
-
-Command = Callable[[], None]
-
-
-def test(setup: Command, command: Command, teardown: Command) -> float:
-    setup()
-    start = time.time()
-    command()
-    end = time.time() - start
-    teardown()
-    return end
-
-
-def make_touch_wrappers(filename: str) -> Tuple[Command, Command]:
-    def setup() -> None:
-        execute(["touch", filename])
-    def teardown() -> None:
-        pass
-    return setup, teardown
-
-
-def make_change_wrappers(filename: str) -> Tuple[Command, Command]:
-    copy = None  # type: Optional[str]
-
-    def setup() -> None:
-        nonlocal copy
-        with open(filename, 'r') as stream:
-            copy = stream.read()
-        with open(filename, 'a') as stream:
-            stream.write('\n\nfoo = 3')
-
-    def teardown() -> None:
-        assert copy is not None
-        with open(filename, 'w') as stream:
-            stream.write(copy)
-
-        # Re-run to reset cache
-        execute(["python3", "-m", "mypy", "-i", "mypy"]),
-
-    return setup, teardown
-
-def main() -> None:
-    if len(sys.argv) != 2 or sys.argv[1] not in {'touch', 'change'}:
-        print("First argument should be 'touch' or 'change'")
-        return
-
-    if sys.argv[1] == 'touch':
-        make_wrappers = make_touch_wrappers
-        verb = "Touching"
-    elif sys.argv[1] == 'change':
-        make_wrappers = make_change_wrappers
-        verb = "Changing"
-    else:
-        raise AssertionError()
-
-    print("Setting up...")
-
-    baseline = test(
-        lambda: None,
-        lambda: execute(["python3", "-m", "mypy", "mypy"]),
-        lambda: None)
-    print("Baseline:   {}".format(baseline))
-
-    cold = test(
-        lambda: delete_folder(".mypy_cache"),
-        lambda: execute(["python3", "-m", "mypy", "-i", "mypy"]),
-        lambda: None)
-    print("Cold cache: {}".format(cold))
-
-    warm = test(
-        lambda: None,
-        lambda: execute(["python3", "-m", "mypy", "-i", "mypy"]),
-        lambda: None)
-    print("Warm cache: {}".format(warm))
-
-    print()
-
-    deltas = []
-    for filename in glob.iglob("mypy/**/*.py", recursive=True):
-        print("{} {}".format(verb, filename))
-        
-        setup, teardown = make_wrappers(filename)
-        delta = test(
-            setup,
-            lambda: execute(["python3", "-m", "mypy", "-i", "mypy"]),
-            teardown)
-        print("    Time: {}".format(delta))
-        deltas.append(delta)
-    print()
-
-    print("Initial:")
-    print("    Baseline:   {}".format(baseline))
-    print("    Cold cache: {}".format(cold))
-    print("    Warm cache: {}".format(warm))
-    print()
-    print("Aggregate:")
-    print("    Times:      {}".format(deltas))
-    print("    Mean:       {}".format(statistics.mean(deltas)))
-    print("    Median:     {}".format(statistics.median(deltas)))
-    print("    Stdev:      {}".format(statistics.stdev(deltas)))
-    print("    Min:        {}".format(min(deltas)))
-    print("    Max:        {}".format(max(deltas)))
-    print("    Total:      {}".format(sum(deltas)))
-    print()
-
-if __name__ == '__main__':
-    main()
-
diff --git a/misc/variadics.py b/misc/variadics.py
deleted file mode 100644
index 9200288..0000000
--- a/misc/variadics.py
+++ /dev/null
@@ -1,54 +0,0 @@
-"""Example of code generation approach to variadics.
-
-See https://github.com/python/typing/issues/193#issuecomment-236383893
-"""
-
-LIMIT = 5
-BOUND = 'object'
-
-def prelude(limit: int, bound: str) -> None:
-    print('from typing import Callable, Iterable, Iterator, Tuple, TypeVar, overload')
-    print('Ts = TypeVar(\'Ts\', bound={bound})'.format(bound=bound))
-    print('R = TypeVar(\'R\')')
-    for i in range(LIMIT):
-        print('T{i} = TypeVar(\'T{i}\', bound={bound})'.format(i=i+1, bound=bound))
-
-def expand_template(template: str,
-                    arg_template: str = 'arg{i}: {Ts}',
-                    lower: int = 0,
-                    limit: int = LIMIT) -> None:
-    print()
-    for i in range(lower, limit):
-        tvs = ', '.join('T{i}'.format(i=j+1) for j in range(i))
-        args = ', '.join(arg_template.format(i=j+1, Ts='T{}'.format(j+1))
-                         for j in range(i))
-        print('@overload')
-        s = template.format(Ts=tvs, argsTs=args)
-        s = s.replace('Tuple[]', 'Tuple[()]')
-        print(s)
-    args_l = [arg_template.format(i=j+1, Ts='Ts') for j in range(limit)]
-    args_l.append('*' + (arg_template.format(i='s', Ts='Ts')))
-    args = ', '.join(args_l)
-    s = template.format(Ts='Ts, ...', argsTs=args)
-    s = s.replace('Callable[[Ts, ...]', 'Callable[...')
-    print('@overload')
-    print(s)
-
-def main():
-    prelude(LIMIT, BOUND)
-
-    # map()
-    expand_template('def map(func: Callable[[{Ts}], R], {argsTs}) -> R: ...',
-                    lower=1)
-    # zip()
-    expand_template('def zip({argsTs}) -> Tuple[{Ts}]: ...')
-
-    # Naomi's examples
-    expand_template('def my_zip({argsTs}) -> Iterator[Tuple[{Ts}]]: ...',
-                    'arg{i}: Iterable[{Ts}]')
-    expand_template('def make_check({argsTs}) -> Callable[[{Ts}], bool]: ...')
-    expand_template('def my_map(f: Callable[[{Ts}], R], {argsTs}) -> Iterator[R]: ...',
-                    'arg{i}: Iterable[{Ts}]')
-                    
-
-main()
diff --git a/mypy.egg-info/PKG-INFO b/mypy.egg-info/PKG-INFO
new file mode 100644
index 0000000..c9cf741
--- /dev/null
+++ b/mypy.egg-info/PKG-INFO
@@ -0,0 +1,30 @@
+Metadata-Version: 1.1
+Name: mypy
+Version: 0.470
+Summary: Optional static typing for Python
+Home-page: http://www.mypy-lang.org/
+Author: Jukka Lehtosalo
+Author-email: jukka.lehtosalo at iki.fi
+License: MIT License
+Description: Mypy -- Optional Static Typing for Python
+        =========================================
+        
+        Add type annotations to your Python programs, and use mypy to type
+        check them.  Mypy is essentially a Python linter on steroids, and it
+        can catch many programming errors by analyzing your program, without
+        actually having to run it.  Mypy has a powerful type system with
+        features such as type inference, gradual typing, generics and union
+        types.
+        
+Platform: POSIX
+Classifier: Development Status :: 2 - Pre-Alpha
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Topic :: Software Development
diff --git a/mypy.egg-info/SOURCES.txt b/mypy.egg-info/SOURCES.txt
new file mode 100644
index 0000000..6497a7c
--- /dev/null
+++ b/mypy.egg-info/SOURCES.txt
@@ -0,0 +1,984 @@
+MANIFEST.in
+setup.cfg
+setup.py
+mypy/__init__.py
+mypy/__main__.py
+mypy/api.py
+mypy/applytype.py
+mypy/binder.py
+mypy/build.py
+mypy/checker.py
+mypy/checkexpr.py
+mypy/checkmember.py
+mypy/checkstrformat.py
+mypy/constraints.py
+mypy/defaults.py
+mypy/erasetype.py
+mypy/errors.py
+mypy/expandtype.py
+mypy/experiments.py
+mypy/exprtotype.py
+mypy/fastparse.py
+mypy/fastparse2.py
+mypy/fixup.py
+mypy/git.py
+mypy/indirection.py
+mypy/infer.py
+mypy/join.py
+mypy/lex.py
+mypy/main.py
+mypy/maptype.py
+mypy/meet.py
+mypy/messages.py
+mypy/moduleinfo.py
+mypy/nodes.py
+mypy/options.py
+mypy/parse.py
+mypy/parsetype.py
+mypy/report.py
+mypy/sametypes.py
+mypy/semanal.py
+mypy/sharedparse.py
+mypy/solve.py
+mypy/stats.py
+mypy/strconv.py
+mypy/stubgen.py
+mypy/stubgenc.py
+mypy/stubutil.py
+mypy/subtypes.py
+mypy/traverser.py
+mypy/treetransform.py
+mypy/typeanal.py
+mypy/typefixture.py
+mypy/types.py
+mypy/util.py
+mypy/version.py
+mypy/visitor.py
+mypy/waiter.py
+mypy.egg-info/PKG-INFO
+mypy.egg-info/SOURCES.txt
+mypy.egg-info/dependency_links.txt
+mypy.egg-info/requires.txt
+mypy.egg-info/top_level.txt
+scripts/find_type.py
+scripts/mypy
+scripts/mypy.bat
+scripts/stubgen
+typeshed/stdlib/2/BaseHTTPServer.pyi
+typeshed/stdlib/2/ConfigParser.pyi
+typeshed/stdlib/2/Cookie.pyi
+typeshed/stdlib/2/HTMLParser.pyi
+typeshed/stdlib/2/Queue.pyi
+typeshed/stdlib/2/SocketServer.pyi
+typeshed/stdlib/2/StringIO.pyi
+typeshed/stdlib/2/UserDict.pyi
+typeshed/stdlib/2/UserList.pyi
+typeshed/stdlib/2/UserString.pyi
+typeshed/stdlib/2/__builtin__.pyi
+typeshed/stdlib/2/__future__.pyi
+typeshed/stdlib/2/_ast.pyi
+typeshed/stdlib/2/_codecs.pyi
+typeshed/stdlib/2/_collections.pyi
+typeshed/stdlib/2/_functools.pyi
+typeshed/stdlib/2/_hotshot.pyi
+typeshed/stdlib/2/_io.pyi
+typeshed/stdlib/2/_json.pyi
+typeshed/stdlib/2/_md5.pyi
+typeshed/stdlib/2/_random.pyi
+typeshed/stdlib/2/_sha.pyi
+typeshed/stdlib/2/_sha256.pyi
+typeshed/stdlib/2/_sha512.pyi
+typeshed/stdlib/2/_socket.pyi
+typeshed/stdlib/2/_sre.pyi
+typeshed/stdlib/2/_struct.pyi
+typeshed/stdlib/2/_symtable.pyi
+typeshed/stdlib/2/_warnings.pyi
+typeshed/stdlib/2/_weakref.pyi
+typeshed/stdlib/2/_weakrefset.pyi
+typeshed/stdlib/2/abc.pyi
+typeshed/stdlib/2/array.pyi
+typeshed/stdlib/2/ast.pyi
+typeshed/stdlib/2/atexit.pyi
+typeshed/stdlib/2/base64.pyi
+typeshed/stdlib/2/binascii.pyi
+typeshed/stdlib/2/builtins.pyi
+typeshed/stdlib/2/cPickle.pyi
+typeshed/stdlib/2/cStringIO.pyi
+typeshed/stdlib/2/calendar.pyi
+typeshed/stdlib/2/codecs.pyi
+typeshed/stdlib/2/collections.pyi
+typeshed/stdlib/2/commands.pyi
+typeshed/stdlib/2/compileall.pyi
+typeshed/stdlib/2/cookielib.pyi
+typeshed/stdlib/2/copy.pyi
+typeshed/stdlib/2/csv.pyi
+typeshed/stdlib/2/datetime.pyi
+typeshed/stdlib/2/decimal.pyi
+typeshed/stdlib/2/difflib.pyi
+typeshed/stdlib/2/doctest.pyi
+typeshed/stdlib/2/exceptions.pyi
+typeshed/stdlib/2/fcntl.pyi
+typeshed/stdlib/2/fileinput.pyi
+typeshed/stdlib/2/fnmatch.pyi
+typeshed/stdlib/2/functools.pyi
+typeshed/stdlib/2/future_builtins.pyi
+typeshed/stdlib/2/gc.pyi
+typeshed/stdlib/2/genericpath.pyi
+typeshed/stdlib/2/getopt.pyi
+typeshed/stdlib/2/getpass.pyi
+typeshed/stdlib/2/gettext.pyi
+typeshed/stdlib/2/glob.pyi
+typeshed/stdlib/2/grp.pyi
+typeshed/stdlib/2/gzip.pyi
+typeshed/stdlib/2/hashlib.pyi
+typeshed/stdlib/2/heapq.pyi
+typeshed/stdlib/2/htmlentitydefs.pyi
+typeshed/stdlib/2/httplib.pyi
+typeshed/stdlib/2/imp.pyi
+typeshed/stdlib/2/importlib.pyi
+typeshed/stdlib/2/inspect.pyi
+typeshed/stdlib/2/io.pyi
+typeshed/stdlib/2/itertools.pyi
+typeshed/stdlib/2/json.pyi
+typeshed/stdlib/2/linecache.pyi
+typeshed/stdlib/2/markupbase.pyi
+typeshed/stdlib/2/md5.pyi
+typeshed/stdlib/2/mimetools.pyi
+typeshed/stdlib/2/optparse.pyi
+typeshed/stdlib/2/pdb.pyi
+typeshed/stdlib/2/pickle.pyi
+typeshed/stdlib/2/pipes.pyi
+typeshed/stdlib/2/platform.pyi
+typeshed/stdlib/2/posix.pyi
+typeshed/stdlib/2/posixpath.pyi
+typeshed/stdlib/2/pprint.pyi
+typeshed/stdlib/2/pwd.pyi
+typeshed/stdlib/2/quopri.pyi
+typeshed/stdlib/2/random.pyi
+typeshed/stdlib/2/re.pyi
+typeshed/stdlib/2/resource.pyi
+typeshed/stdlib/2/rfc822.pyi
+typeshed/stdlib/2/robotparser.pyi
+typeshed/stdlib/2/runpy.pyi
+typeshed/stdlib/2/select.pyi
+typeshed/stdlib/2/sha.pyi
+typeshed/stdlib/2/shelve.pyi
+typeshed/stdlib/2/shlex.pyi
+typeshed/stdlib/2/shutil.pyi
+typeshed/stdlib/2/signal.pyi
+typeshed/stdlib/2/smtplib.pyi
+typeshed/stdlib/2/socket.pyi
+typeshed/stdlib/2/spwd.pyi
+typeshed/stdlib/2/ssl.pyi
+typeshed/stdlib/2/stat.pyi
+typeshed/stdlib/2/string.pyi
+typeshed/stdlib/2/strop.pyi
+typeshed/stdlib/2/struct.pyi
+typeshed/stdlib/2/subprocess.pyi
+typeshed/stdlib/2/sys.pyi
+typeshed/stdlib/2/syslog.pyi
+typeshed/stdlib/2/tempfile.pyi
+typeshed/stdlib/2/textwrap.pyi
+typeshed/stdlib/2/thread.pyi
+typeshed/stdlib/2/time.pyi
+typeshed/stdlib/2/token.pyi
+typeshed/stdlib/2/tokenize.pyi
+typeshed/stdlib/2/types.pyi
+typeshed/stdlib/2/typing.pyi
+typeshed/stdlib/2/unicodedata.pyi
+typeshed/stdlib/2/unittest.pyi
+typeshed/stdlib/2/urllib.pyi
+typeshed/stdlib/2/urllib2.pyi
+typeshed/stdlib/2/urlparse.pyi
+typeshed/stdlib/2/uuid.pyi
+typeshed/stdlib/2/weakref.pyi
+typeshed/stdlib/2/xxsubtype.pyi
+typeshed/stdlib/2/zlib.pyi
+typeshed/stdlib/2/distutils/__init__.pyi
+typeshed/stdlib/2/distutils/emxccompiler.pyi
+typeshed/stdlib/2/email/MIMEText.pyi
+typeshed/stdlib/2/email/__init__.pyi
+typeshed/stdlib/2/email/_parseaddr.pyi
+typeshed/stdlib/2/email/utils.pyi
+typeshed/stdlib/2/email/mime/__init__.pyi
+typeshed/stdlib/2/email/mime/base.pyi
+typeshed/stdlib/2/email/mime/multipart.pyi
+typeshed/stdlib/2/email/mime/nonmultipart.pyi
+typeshed/stdlib/2/email/mime/text.pyi
+typeshed/stdlib/2/encodings/__init__.pyi
+typeshed/stdlib/2/encodings/utf_8.pyi
+typeshed/stdlib/2/multiprocessing/__init__.pyi
+typeshed/stdlib/2/multiprocessing/process.pyi
+typeshed/stdlib/2/multiprocessing/util.pyi
+typeshed/stdlib/2/os/__init__.pyi
+typeshed/stdlib/2/os/path.pyi
+typeshed/stdlib/2/sqlite3/__init__.pyi
+typeshed/stdlib/2/sqlite3/dbapi2.pyi
+typeshed/stdlib/2/wsgiref/__init__.pyi
+typeshed/stdlib/2/wsgiref/validate.pyi
+typeshed/stdlib/2/xml/__init__.pyi
+typeshed/stdlib/2/xml/etree/ElementInclude.pyi
+typeshed/stdlib/2/xml/etree/ElementPath.pyi
+typeshed/stdlib/2/xml/etree/ElementTree.pyi
+typeshed/stdlib/2/xml/etree/__init__.pyi
+typeshed/stdlib/2/xml/etree/cElementTree.pyi
+typeshed/stdlib/2and3/_bisect.pyi
+typeshed/stdlib/2and3/_heapq.pyi
+typeshed/stdlib/2and3/argparse.pyi
+typeshed/stdlib/2and3/asynchat.pyi
+typeshed/stdlib/2and3/asyncore.pyi
+typeshed/stdlib/2and3/bisect.pyi
+typeshed/stdlib/2and3/bz2.pyi
+typeshed/stdlib/2and3/cProfile.pyi
+typeshed/stdlib/2and3/cmath.pyi
+typeshed/stdlib/2and3/code.pyi
+typeshed/stdlib/2and3/colorsys.pyi
+typeshed/stdlib/2and3/contextlib.pyi
+typeshed/stdlib/2and3/errno.pyi
+typeshed/stdlib/2and3/fractions.pyi
+typeshed/stdlib/2and3/hmac.pyi
+typeshed/stdlib/2and3/keyword.pyi
+typeshed/stdlib/2and3/locale.pyi
+typeshed/stdlib/2and3/marshal.pyi
+typeshed/stdlib/2and3/math.pyi
+typeshed/stdlib/2and3/mimetypes.pyi
+typeshed/stdlib/2and3/mmap.pyi
+typeshed/stdlib/2and3/numbers.pyi
+typeshed/stdlib/2and3/operator.pyi
+typeshed/stdlib/2and3/pkgutil.pyi
+typeshed/stdlib/2and3/plistlib.pyi
+typeshed/stdlib/2and3/profile.pyi
+typeshed/stdlib/2and3/pstats.pyi
+typeshed/stdlib/2and3/readline.pyi
+typeshed/stdlib/2and3/rlcompleter.pyi
+typeshed/stdlib/2and3/site.pyi
+typeshed/stdlib/2and3/tarfile.pyi
+typeshed/stdlib/2and3/termios.pyi
+typeshed/stdlib/2and3/threading.pyi
+typeshed/stdlib/2and3/traceback.pyi
+typeshed/stdlib/2and3/warnings.pyi
+typeshed/stdlib/2and3/webbrowser.pyi
+typeshed/stdlib/2and3/zipfile.pyi
+typeshed/stdlib/2and3/zipimport.pyi
+typeshed/stdlib/2and3/distutils/__init__.pyi
+typeshed/stdlib/2and3/distutils/archive_util.pyi
+typeshed/stdlib/2and3/distutils/bcppcompiler.pyi
+typeshed/stdlib/2and3/distutils/ccompiler.pyi
+typeshed/stdlib/2and3/distutils/cmd.pyi
+typeshed/stdlib/2and3/distutils/core.pyi
+typeshed/stdlib/2and3/distutils/cygwinccompiler.pyi
+typeshed/stdlib/2and3/distutils/debug.pyi
+typeshed/stdlib/2and3/distutils/dep_util.pyi
+typeshed/stdlib/2and3/distutils/dir_util.pyi
+typeshed/stdlib/2and3/distutils/dist.pyi
+typeshed/stdlib/2and3/distutils/errors.pyi
+typeshed/stdlib/2and3/distutils/extension.pyi
+typeshed/stdlib/2and3/distutils/fancy_getopt.pyi
+typeshed/stdlib/2and3/distutils/file_util.pyi
+typeshed/stdlib/2and3/distutils/filelist.pyi
+typeshed/stdlib/2and3/distutils/log.pyi
+typeshed/stdlib/2and3/distutils/msvccompiler.pyi
+typeshed/stdlib/2and3/distutils/spawn.pyi
+typeshed/stdlib/2and3/distutils/sysconfig.pyi
+typeshed/stdlib/2and3/distutils/text_file.pyi
+typeshed/stdlib/2and3/distutils/unixccompiler.pyi
+typeshed/stdlib/2and3/distutils/util.pyi
+typeshed/stdlib/2and3/distutils/version.pyi
+typeshed/stdlib/2and3/distutils/command/__init__.pyi
+typeshed/stdlib/2and3/distutils/command/bdist.pyi
+typeshed/stdlib/2and3/distutils/command/bdist_dumb.pyi
+typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi
+typeshed/stdlib/2and3/distutils/command/bdist_packager.pyi
+typeshed/stdlib/2and3/distutils/command/bdist_rpm.pyi
+typeshed/stdlib/2and3/distutils/command/bdist_wininst.pyi
+typeshed/stdlib/2and3/distutils/command/build.pyi
+typeshed/stdlib/2and3/distutils/command/build_clib.pyi
+typeshed/stdlib/2and3/distutils/command/build_ext.pyi
+typeshed/stdlib/2and3/distutils/command/build_py.pyi
+typeshed/stdlib/2and3/distutils/command/build_scripts.pyi
+typeshed/stdlib/2and3/distutils/command/check.pyi
+typeshed/stdlib/2and3/distutils/command/clean.pyi
+typeshed/stdlib/2and3/distutils/command/config.pyi
+typeshed/stdlib/2and3/distutils/command/install.pyi
+typeshed/stdlib/2and3/distutils/command/install_data.pyi
+typeshed/stdlib/2and3/distutils/command/install_headers.pyi
+typeshed/stdlib/2and3/distutils/command/install_lib.pyi
+typeshed/stdlib/2and3/distutils/command/install_scripts.pyi
+typeshed/stdlib/2and3/distutils/command/register.pyi
+typeshed/stdlib/2and3/distutils/command/sdist.pyi
+typeshed/stdlib/2and3/logging/__init__.pyi
+typeshed/stdlib/2and3/logging/config.pyi
+typeshed/stdlib/2and3/logging/handlers.pyi
+typeshed/stdlib/2and3/xml/__init__.pyi
+typeshed/stdlib/2and3/xml/sax/__init__.pyi
+typeshed/stdlib/2and3/xml/sax/handler.pyi
+typeshed/stdlib/2and3/xml/sax/saxutils.pyi
+typeshed/stdlib/2and3/xml/sax/xmlreader.pyi
+typeshed/stdlib/3/__future__.pyi
+typeshed/stdlib/3/_ast.pyi
+typeshed/stdlib/3/_codecs.pyi
+typeshed/stdlib/3/_compression.pyi
+typeshed/stdlib/3/_curses.pyi
+typeshed/stdlib/3/_dummy_thread.pyi
+typeshed/stdlib/3/_importlib_modulespec.pyi
+typeshed/stdlib/3/_json.pyi
+typeshed/stdlib/3/_markupbase.pyi
+typeshed/stdlib/3/_operator.pyi
+typeshed/stdlib/3/_posixsubprocess.pyi
+typeshed/stdlib/3/_random.pyi
+typeshed/stdlib/3/_subprocess.pyi
+typeshed/stdlib/3/_thread.pyi
+typeshed/stdlib/3/_warnings.pyi
+typeshed/stdlib/3/abc.pyi
+typeshed/stdlib/3/array.pyi
+typeshed/stdlib/3/ast.pyi
+typeshed/stdlib/3/atexit.pyi
+typeshed/stdlib/3/base64.pyi
+typeshed/stdlib/3/binascii.pyi
+typeshed/stdlib/3/builtins.pyi
+typeshed/stdlib/3/calendar.pyi
+typeshed/stdlib/3/cgi.pyi
+typeshed/stdlib/3/codecs.pyi
+typeshed/stdlib/3/configparser.pyi
+typeshed/stdlib/3/copy.pyi
+typeshed/stdlib/3/csv.pyi
+typeshed/stdlib/3/datetime.pyi
+typeshed/stdlib/3/decimal.pyi
+typeshed/stdlib/3/difflib.pyi
+typeshed/stdlib/3/dis.pyi
+typeshed/stdlib/3/doctest.pyi
+typeshed/stdlib/3/fcntl.pyi
+typeshed/stdlib/3/fileinput.pyi
+typeshed/stdlib/3/fnmatch.pyi
+typeshed/stdlib/3/functools.pyi
+typeshed/stdlib/3/gc.pyi
+typeshed/stdlib/3/getopt.pyi
+typeshed/stdlib/3/getpass.pyi
+typeshed/stdlib/3/gettext.pyi
+typeshed/stdlib/3/glob.pyi
+typeshed/stdlib/3/grp.pyi
+typeshed/stdlib/3/gzip.pyi
+typeshed/stdlib/3/hashlib.pyi
+typeshed/stdlib/3/heapq.pyi
+typeshed/stdlib/3/imp.pyi
+typeshed/stdlib/3/inspect.pyi
+typeshed/stdlib/3/io.pyi
+typeshed/stdlib/3/itertools.pyi
+typeshed/stdlib/3/json.pyi
+typeshed/stdlib/3/linecache.pyi
+typeshed/stdlib/3/msvcrt.pyi
+typeshed/stdlib/3/opcode.pyi
+typeshed/stdlib/3/pdb.pyi
+typeshed/stdlib/3/pickle.pyi
+typeshed/stdlib/3/pipes.pyi
+typeshed/stdlib/3/platform.pyi
+typeshed/stdlib/3/posix.pyi
+typeshed/stdlib/3/posixpath.pyi
+typeshed/stdlib/3/pprint.pyi
+typeshed/stdlib/3/pwd.pyi
+typeshed/stdlib/3/pyclbr.pyi
+typeshed/stdlib/3/queue.pyi
+typeshed/stdlib/3/random.pyi
+typeshed/stdlib/3/re.pyi
+typeshed/stdlib/3/resource.pyi
+typeshed/stdlib/3/runpy.pyi
+typeshed/stdlib/3/select.pyi
+typeshed/stdlib/3/shelve.pyi
+typeshed/stdlib/3/shlex.pyi
+typeshed/stdlib/3/shutil.pyi
+typeshed/stdlib/3/signal.pyi
+typeshed/stdlib/3/smtplib.pyi
+typeshed/stdlib/3/socket.pyi
+typeshed/stdlib/3/socketserver.pyi
+typeshed/stdlib/3/ssl.pyi
+typeshed/stdlib/3/stat.pyi
+typeshed/stdlib/3/string.pyi
+typeshed/stdlib/3/struct.pyi
+typeshed/stdlib/3/subprocess.pyi
+typeshed/stdlib/3/sys.pyi
+typeshed/stdlib/3/sysconfig.pyi
+typeshed/stdlib/3/tempfile.pyi
+typeshed/stdlib/3/textwrap.pyi
+typeshed/stdlib/3/time.pyi
+typeshed/stdlib/3/token.pyi
+typeshed/stdlib/3/tokenize.pyi
+typeshed/stdlib/3/types.pyi
+typeshed/stdlib/3/typing.pyi
+typeshed/stdlib/3/unicodedata.pyi
+typeshed/stdlib/3/uuid.pyi
+typeshed/stdlib/3/weakref.pyi
+typeshed/stdlib/3/zlib.pyi
+typeshed/stdlib/3.2/xml/__init__.pyi
+typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi
+typeshed/stdlib/3.2/xml/etree/ElementPath.pyi
+typeshed/stdlib/3.2/xml/etree/ElementTree.pyi
+typeshed/stdlib/3.2/xml/etree/__init__.pyi
+typeshed/stdlib/3.2/xml/etree/cElementTree.pyi
+typeshed/stdlib/3.3/ipaddress.pyi
+typeshed/stdlib/3.3/xml/__init__.pyi
+typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi
+typeshed/stdlib/3.3/xml/etree/ElementPath.pyi
+typeshed/stdlib/3.3/xml/etree/ElementTree.pyi
+typeshed/stdlib/3.3/xml/etree/__init__.pyi
+typeshed/stdlib/3.3/xml/etree/cElementTree.pyi
+typeshed/stdlib/3.4/_stat.pyi
+typeshed/stdlib/3.4/_tracemalloc.pyi
+typeshed/stdlib/3.4/enum.pyi
+typeshed/stdlib/3.4/pathlib.pyi
+typeshed/stdlib/3.4/selectors.pyi
+typeshed/stdlib/3.4/asyncio/__init__.pyi
+typeshed/stdlib/3.4/asyncio/coroutines.pyi
+typeshed/stdlib/3.4/asyncio/events.pyi
+typeshed/stdlib/3.4/asyncio/futures.pyi
+typeshed/stdlib/3.4/asyncio/locks.pyi
+typeshed/stdlib/3.4/asyncio/protocols.pyi
+typeshed/stdlib/3.4/asyncio/queues.pyi
+typeshed/stdlib/3.4/asyncio/streams.pyi
+typeshed/stdlib/3.4/asyncio/subprocess.pyi
+typeshed/stdlib/3.4/asyncio/tasks.pyi
+typeshed/stdlib/3.4/asyncio/transports.pyi
+typeshed/stdlib/3.4/xml/__init__.pyi
+typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi
+typeshed/stdlib/3.4/xml/etree/ElementPath.pyi
+typeshed/stdlib/3.4/xml/etree/ElementTree.pyi
+typeshed/stdlib/3.4/xml/etree/__init__.pyi
+typeshed/stdlib/3.4/xml/etree/cElementTree.pyi
+typeshed/stdlib/3.5/xml/__init__.pyi
+typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi
+typeshed/stdlib/3.5/xml/etree/ElementPath.pyi
+typeshed/stdlib/3.5/xml/etree/ElementTree.pyi
+typeshed/stdlib/3.5/xml/etree/__init__.pyi
+typeshed/stdlib/3.5/xml/etree/cElementTree.pyi
+typeshed/stdlib/3.6/secrets.pyi
+typeshed/stdlib/3/collections/__init__.pyi
+typeshed/stdlib/3/collections/abc.pyi
+typeshed/stdlib/3/concurrent/__init__.pyi
+typeshed/stdlib/3/concurrent/futures/__init__.pyi
+typeshed/stdlib/3/concurrent/futures/_base.pyi
+typeshed/stdlib/3/concurrent/futures/process.pyi
+typeshed/stdlib/3/concurrent/futures/thread.pyi
+typeshed/stdlib/3/curses/__init__.pyi
+typeshed/stdlib/3/email/__init__.pyi
+typeshed/stdlib/3/email/charset.pyi
+typeshed/stdlib/3/email/contentmanager.pyi
+typeshed/stdlib/3/email/encoders.pyi
+typeshed/stdlib/3/email/errors.pyi
+typeshed/stdlib/3/email/feedparser.pyi
+typeshed/stdlib/3/email/generator.pyi
+typeshed/stdlib/3/email/header.pyi
+typeshed/stdlib/3/email/headerregistry.pyi
+typeshed/stdlib/3/email/iterators.pyi
+typeshed/stdlib/3/email/message.pyi
+typeshed/stdlib/3/email/parser.pyi
+typeshed/stdlib/3/email/policy.pyi
+typeshed/stdlib/3/email/utils.pyi
+typeshed/stdlib/3/email/mime/__init__.py
+typeshed/stdlib/3/email/mime/application.pyi
+typeshed/stdlib/3/email/mime/audio.pyi
+typeshed/stdlib/3/email/mime/base.pyi
+typeshed/stdlib/3/email/mime/image.pyi
+typeshed/stdlib/3/email/mime/message.pyi
+typeshed/stdlib/3/email/mime/multipart.pyi
+typeshed/stdlib/3/email/mime/nonmultipart.pyi
+typeshed/stdlib/3/email/mime/text.pyi
+typeshed/stdlib/3/encodings/__init__.pyi
+typeshed/stdlib/3/encodings/utf_8.pyi
+typeshed/stdlib/3/html/__init__.pyi
+typeshed/stdlib/3/html/entities.pyi
+typeshed/stdlib/3/html/parser.pyi
+typeshed/stdlib/3/http/__init__.pyi
+typeshed/stdlib/3/http/client.pyi
+typeshed/stdlib/3/http/cookiejar.pyi
+typeshed/stdlib/3/http/cookies.pyi
+typeshed/stdlib/3/http/server.pyi
+typeshed/stdlib/3/importlib/__init__.pyi
+typeshed/stdlib/3/importlib/abc.pyi
+typeshed/stdlib/3/importlib/machinery.pyi
+typeshed/stdlib/3/importlib/util.pyi
+typeshed/stdlib/3/multiprocessing/__init__.pyi
+typeshed/stdlib/3/multiprocessing/managers.pyi
+typeshed/stdlib/3/multiprocessing/pool.pyi
+typeshed/stdlib/3/multiprocessing/process.pyi
+typeshed/stdlib/3/os/__init__.pyi
+typeshed/stdlib/3/os/path.pyi
+typeshed/stdlib/3/sqlite3/__init__.pyi
+typeshed/stdlib/3/sqlite3/dbapi2.pyi
+typeshed/stdlib/3/tkinter/__init__.pyi
+typeshed/stdlib/3/tkinter/constants.pyi
+typeshed/stdlib/3/tkinter/ttk.pyi
+typeshed/stdlib/3/unittest/__init__.pyi
+typeshed/stdlib/3/unittest/mock.pyi
+typeshed/stdlib/3/urllib/__init__.pyi
+typeshed/stdlib/3/urllib/error.pyi
+typeshed/stdlib/3/urllib/parse.pyi
+typeshed/stdlib/3/urllib/request.pyi
+typeshed/stdlib/3/urllib/response.pyi
+typeshed/stdlib/3/urllib/robotparser.pyi
+typeshed/stdlib/3/wsgiref/__init__.pyi
+typeshed/stdlib/3/wsgiref/validate.pyi
+typeshed/stdlib/3/xml/etree/ElementInclude.pyi
+typeshed/stdlib/3/xml/etree/ElementPath.pyi
+typeshed/stdlib/3/xml/etree/ElementTree.pyi
+typeshed/stdlib/3/xml/etree/__init__.pyi
+typeshed/stdlib/3/xml/etree/cElementTree.pyi
+typeshed/tests/mypy_test.py
+typeshed/tests/pytype_test.py
+typeshed/third_party/2/croniter.pyi
+typeshed/third_party/2/enum.pyi
+typeshed/third_party/2/gflags.pyi
+typeshed/third_party/2/itsdangerous.pyi
+typeshed/third_party/2/pycurl.pyi
+typeshed/third_party/2/pymssql.pyi
+typeshed/third_party/2/OpenSSL/__init__.pyi
+typeshed/third_party/2/OpenSSL/crypto.pyi
+typeshed/third_party/2/concurrent/__init__.pyi
+typeshed/third_party/2/concurrent/futures/__init__.pyi
+typeshed/third_party/2/dateutil/__init__.pyi
+typeshed/third_party/2/dateutil/parser.pyi
+typeshed/third_party/2/dateutil/relativedelta.pyi
+typeshed/third_party/2/fb303/FacebookService.pyi
+typeshed/third_party/2/fb303/__init__.pyi
+typeshed/third_party/2/google/__init__.pyi
+typeshed/third_party/2/google/protobuf/__init__.pyi
+typeshed/third_party/2/google/protobuf/descriptor.pyi
+typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi
+typeshed/third_party/2/google/protobuf/descriptor_pool.pyi
+typeshed/third_party/2/google/protobuf/message.pyi
+typeshed/third_party/2/google/protobuf/message_factory.pyi
+typeshed/third_party/2/google/protobuf/reflection.pyi
+typeshed/third_party/2/google/protobuf/symbol_database.pyi
+typeshed/third_party/2/google/protobuf/internal/__init__.pyi
+typeshed/third_party/2/google/protobuf/internal/decoder.pyi
+typeshed/third_party/2/google/protobuf/internal/encoder.pyi
+typeshed/third_party/2/google/protobuf/internal/enum_type_wrapper.pyi
+typeshed/third_party/2/google/protobuf/internal/wire_format.pyi
+typeshed/third_party/2/kazoo/__init__.pyi
+typeshed/third_party/2/kazoo/client.pyi
+typeshed/third_party/2/kazoo/exceptions.pyi
+typeshed/third_party/2/kazoo/recipe/__init__.pyi
+typeshed/third_party/2/kazoo/recipe/watchers.pyi
+typeshed/third_party/2/redis/__init__.pyi
+typeshed/third_party/2/redis/client.pyi
+typeshed/third_party/2/redis/connection.pyi
+typeshed/third_party/2/redis/exceptions.pyi
+typeshed/third_party/2/redis/utils.pyi
+typeshed/third_party/2/requests/__init__.pyi
+typeshed/third_party/2/requests/adapters.pyi
+typeshed/third_party/2/requests/api.pyi
+typeshed/third_party/2/requests/auth.pyi
+typeshed/third_party/2/requests/compat.pyi
+typeshed/third_party/2/requests/cookies.pyi
+typeshed/third_party/2/requests/exceptions.pyi
+typeshed/third_party/2/requests/hooks.pyi
+typeshed/third_party/2/requests/models.pyi
+typeshed/third_party/2/requests/sessions.pyi
+typeshed/third_party/2/requests/status_codes.pyi
+typeshed/third_party/2/requests/structures.pyi
+typeshed/third_party/2/requests/utils.pyi
+typeshed/third_party/2/requests/packages/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/_collections.pyi
+typeshed/third_party/2/requests/packages/urllib3/connection.pyi
+typeshed/third_party/2/requests/packages/urllib3/connectionpool.pyi
+typeshed/third_party/2/requests/packages/urllib3/exceptions.pyi
+typeshed/third_party/2/requests/packages/urllib3/fields.pyi
+typeshed/third_party/2/requests/packages/urllib3/filepost.pyi
+typeshed/third_party/2/requests/packages/urllib3/poolmanager.pyi
+typeshed/third_party/2/requests/packages/urllib3/request.pyi
+typeshed/third_party/2/requests/packages/urllib3/response.pyi
+typeshed/third_party/2/requests/packages/urllib3/contrib/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/packages/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/connection.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/request.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/response.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/retry.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/timeout.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/url.pyi
+typeshed/third_party/2/routes/__init__.pyi
+typeshed/third_party/2/routes/mapper.pyi
+typeshed/third_party/2/routes/util.pyi
+typeshed/third_party/2/scribe/__init__.pyi
+typeshed/third_party/2/scribe/scribe.pyi
+typeshed/third_party/2/scribe/ttypes.pyi
+typeshed/third_party/2/selenium/webdriver/remote/webdriver.pyi
+typeshed/third_party/2/selenium/webdriver/remote/webelement.pyi
+typeshed/third_party/2/simplejson/__init__.pyi
+typeshed/third_party/2/simplejson/decoder.pyi
+typeshed/third_party/2/simplejson/encoder.pyi
+typeshed/third_party/2/simplejson/scanner.pyi
+typeshed/third_party/2/six/__init__.pyi
+typeshed/third_party/2/six/moves/__init__.pyi
+typeshed/third_party/2/six/moves/cPickle.pyi
+typeshed/third_party/2/six/moves/urllib_error.pyi
+typeshed/third_party/2/six/moves/urllib_parse.pyi
+typeshed/third_party/2/six/moves/urllib_request.pyi
+typeshed/third_party/2/six/moves/urllib_response.pyi
+typeshed/third_party/2/six/moves/urllib_robotparser.pyi
+typeshed/third_party/2/six/moves/urllib/__init__.pyi
+typeshed/third_party/2/six/moves/urllib/error.pyi
+typeshed/third_party/2/six/moves/urllib/parse.pyi
+typeshed/third_party/2/six/moves/urllib/request.pyi
+typeshed/third_party/2/six/moves/urllib/response.pyi
+typeshed/third_party/2/six/moves/urllib/robotparser.pyi
+typeshed/third_party/2/sqlalchemy/__init__.pyi
+typeshed/third_party/2/sqlalchemy/exc.pyi
+typeshed/third_party/2/sqlalchemy/inspection.pyi
+typeshed/third_party/2/sqlalchemy/log.pyi
+typeshed/third_party/2/sqlalchemy/pool.pyi
+typeshed/third_party/2/sqlalchemy/schema.pyi
+typeshed/third_party/2/sqlalchemy/types.pyi
+typeshed/third_party/2/sqlalchemy/databases/__init__.pyi
+typeshed/third_party/2/sqlalchemy/databases/mysql.pyi
+typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi
+typeshed/third_party/2/sqlalchemy/dialects/mysql/__init__.pyi
+typeshed/third_party/2/sqlalchemy/dialects/mysql/base.pyi
+typeshed/third_party/2/sqlalchemy/engine/__init__.pyi
+typeshed/third_party/2/sqlalchemy/engine/base.pyi
+typeshed/third_party/2/sqlalchemy/engine/strategies.pyi
+typeshed/third_party/2/sqlalchemy/engine/url.pyi
+typeshed/third_party/2/sqlalchemy/orm/__init__.pyi
+typeshed/third_party/2/sqlalchemy/orm/session.pyi
+typeshed/third_party/2/sqlalchemy/sql/__init__.pyi
+typeshed/third_party/2/sqlalchemy/sql/annotation.pyi
+typeshed/third_party/2/sqlalchemy/sql/base.pyi
+typeshed/third_party/2/sqlalchemy/sql/ddl.pyi
+typeshed/third_party/2/sqlalchemy/sql/dml.pyi
+typeshed/third_party/2/sqlalchemy/sql/elements.pyi
+typeshed/third_party/2/sqlalchemy/sql/expression.pyi
+typeshed/third_party/2/sqlalchemy/sql/functions.pyi
+typeshed/third_party/2/sqlalchemy/sql/naming.pyi
+typeshed/third_party/2/sqlalchemy/sql/operators.pyi
+typeshed/third_party/2/sqlalchemy/sql/schema.pyi
+typeshed/third_party/2/sqlalchemy/sql/selectable.pyi
+typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi
+typeshed/third_party/2/sqlalchemy/sql/type_api.pyi
+typeshed/third_party/2/sqlalchemy/sql/visitors.pyi
+typeshed/third_party/2/sqlalchemy/util/__init__.pyi
+typeshed/third_party/2/sqlalchemy/util/_collections.pyi
+typeshed/third_party/2/sqlalchemy/util/compat.pyi
+typeshed/third_party/2/sqlalchemy/util/deprecations.pyi
+typeshed/third_party/2/sqlalchemy/util/langhelpers.pyi
+typeshed/third_party/2/thrift/Thrift.pyi
+typeshed/third_party/2/thrift/__init__.pyi
+typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi
+typeshed/third_party/2/thrift/protocol/TProtocol.pyi
+typeshed/third_party/2/thrift/protocol/__init__.pyi
+typeshed/third_party/2/thrift/transport/TSocket.pyi
+typeshed/third_party/2/thrift/transport/TTransport.pyi
+typeshed/third_party/2/thrift/transport/__init__.pyi
+typeshed/third_party/2/tornado/__init__.pyi
+typeshed/third_party/2/tornado/concurrent.pyi
+typeshed/third_party/2/tornado/gen.pyi
+typeshed/third_party/2/tornado/httpclient.pyi
+typeshed/third_party/2/tornado/httpserver.pyi
+typeshed/third_party/2/tornado/httputil.pyi
+typeshed/third_party/2/tornado/ioloop.pyi
+typeshed/third_party/2/tornado/locks.pyi
+typeshed/third_party/2/tornado/netutil.pyi
+typeshed/third_party/2/tornado/tcpserver.pyi
+typeshed/third_party/2/tornado/testing.pyi
+typeshed/third_party/2/tornado/util.pyi
+typeshed/third_party/2/tornado/web.pyi
+typeshed/third_party/2/werkzeug/__init__.pyi
+typeshed/third_party/2/werkzeug/_compat.pyi
+typeshed/third_party/2/werkzeug/_internal.pyi
+typeshed/third_party/2/werkzeug/_reloader.pyi
+typeshed/third_party/2/werkzeug/datastructures.pyi
+typeshed/third_party/2/werkzeug/exceptions.pyi
+typeshed/third_party/2/werkzeug/filesystem.pyi
+typeshed/third_party/2/werkzeug/formparser.pyi
+typeshed/third_party/2/werkzeug/http.pyi
+typeshed/third_party/2/werkzeug/local.pyi
+typeshed/third_party/2/werkzeug/posixemulation.pyi
+typeshed/third_party/2/werkzeug/routing.pyi
+typeshed/third_party/2/werkzeug/script.pyi
+typeshed/third_party/2/werkzeug/security.pyi
+typeshed/third_party/2/werkzeug/serving.pyi
+typeshed/third_party/2/werkzeug/test.pyi
+typeshed/third_party/2/werkzeug/testapp.pyi
+typeshed/third_party/2/werkzeug/urls.pyi
+typeshed/third_party/2/werkzeug/useragents.pyi
+typeshed/third_party/2/werkzeug/utils.pyi
+typeshed/third_party/2/werkzeug/wrappers.pyi
+typeshed/third_party/2/werkzeug/wsgi.pyi
+typeshed/third_party/2/werkzeug/contrib/__init__.pyi
+typeshed/third_party/2/werkzeug/contrib/atom.pyi
+typeshed/third_party/2/werkzeug/contrib/cache.pyi
+typeshed/third_party/2/werkzeug/contrib/fixers.pyi
+typeshed/third_party/2/werkzeug/contrib/iterio.pyi
+typeshed/third_party/2/werkzeug/contrib/jsrouting.pyi
+typeshed/third_party/2/werkzeug/contrib/limiter.pyi
+typeshed/third_party/2/werkzeug/contrib/lint.pyi
+typeshed/third_party/2/werkzeug/contrib/profiler.pyi
+typeshed/third_party/2/werkzeug/contrib/securecookie.pyi
+typeshed/third_party/2/werkzeug/contrib/sessions.pyi
+typeshed/third_party/2/werkzeug/contrib/testtools.pyi
+typeshed/third_party/2/werkzeug/contrib/wrappers.pyi
+typeshed/third_party/2/werkzeug/debug/__init__.pyi
+typeshed/third_party/2/werkzeug/debug/console.pyi
+typeshed/third_party/2/werkzeug/debug/repr.pyi
+typeshed/third_party/2/werkzeug/debug/tbtools.pyi
+typeshed/third_party/2/yaml/__init__.pyi
+typeshed/third_party/2/yaml/composer.pyi
+typeshed/third_party/2/yaml/constructor.pyi
+typeshed/third_party/2/yaml/dumper.pyi
+typeshed/third_party/2/yaml/emitter.pyi
+typeshed/third_party/2/yaml/error.pyi
+typeshed/third_party/2/yaml/events.pyi
+typeshed/third_party/2/yaml/loader.pyi
+typeshed/third_party/2/yaml/nodes.pyi
+typeshed/third_party/2/yaml/parser.pyi
+typeshed/third_party/2/yaml/reader.pyi
+typeshed/third_party/2/yaml/representer.pyi
+typeshed/third_party/2/yaml/resolver.pyi
+typeshed/third_party/2/yaml/scanner.pyi
+typeshed/third_party/2/yaml/serializer.pyi
+typeshed/third_party/2/yaml/tokens.pyi
+typeshed/third_party/2and3/backports_abc.pyi
+typeshed/third_party/2and3/certifi.pyi
+typeshed/third_party/2and3/mypy_extensions.pyi
+typeshed/third_party/2and3/singledispatch.pyi
+typeshed/third_party/2and3/ujson.pyi
+typeshed/third_party/2and3/Crypto/__init__.pyi
+typeshed/third_party/2and3/Crypto/pct_warnings.pyi
+typeshed/third_party/2and3/Crypto/Cipher/AES.pyi
+typeshed/third_party/2and3/Crypto/Cipher/ARC2.pyi
+typeshed/third_party/2and3/Crypto/Cipher/ARC4.pyi
+typeshed/third_party/2and3/Crypto/Cipher/Blowfish.pyi
+typeshed/third_party/2and3/Crypto/Cipher/CAST.pyi
+typeshed/third_party/2and3/Crypto/Cipher/DES.pyi
+typeshed/third_party/2and3/Crypto/Cipher/DES3.pyi
+typeshed/third_party/2and3/Crypto/Cipher/PKCS1_OAEP.pyi
+typeshed/third_party/2and3/Crypto/Cipher/PKCS1_v1_5.pyi
+typeshed/third_party/2and3/Crypto/Cipher/XOR.pyi
+typeshed/third_party/2and3/Crypto/Cipher/__init__.pyi
+typeshed/third_party/2and3/Crypto/Cipher/blockalgo.pyi
+typeshed/third_party/2and3/Crypto/Hash/HMAC.pyi
+typeshed/third_party/2and3/Crypto/Hash/MD2.pyi
+typeshed/third_party/2and3/Crypto/Hash/MD4.pyi
+typeshed/third_party/2and3/Crypto/Hash/MD5.pyi
+typeshed/third_party/2and3/Crypto/Hash/RIPEMD.pyi
+typeshed/third_party/2and3/Crypto/Hash/SHA.pyi
+typeshed/third_party/2and3/Crypto/Hash/SHA224.pyi
+typeshed/third_party/2and3/Crypto/Hash/SHA256.pyi
+typeshed/third_party/2and3/Crypto/Hash/SHA384.pyi
+typeshed/third_party/2and3/Crypto/Hash/SHA512.pyi
+typeshed/third_party/2and3/Crypto/Hash/__init__.pyi
+typeshed/third_party/2and3/Crypto/Hash/hashalgo.pyi
+typeshed/third_party/2and3/Crypto/Protocol/AllOrNothing.pyi
+typeshed/third_party/2and3/Crypto/Protocol/Chaffing.pyi
+typeshed/third_party/2and3/Crypto/Protocol/KDF.pyi
+typeshed/third_party/2and3/Crypto/Protocol/__init__.pyi
+typeshed/third_party/2and3/Crypto/PublicKey/DSA.pyi
+typeshed/third_party/2and3/Crypto/PublicKey/ElGamal.pyi
+typeshed/third_party/2and3/Crypto/PublicKey/RSA.pyi
+typeshed/third_party/2and3/Crypto/PublicKey/__init__.pyi
+typeshed/third_party/2and3/Crypto/PublicKey/pubkey.pyi
+typeshed/third_party/2and3/Crypto/Random/__init__.pyi
+typeshed/third_party/2and3/Crypto/Random/random.pyi
+typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaAccumulator.pyi
+typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaGenerator.pyi
+typeshed/third_party/2and3/Crypto/Random/Fortuna/SHAd256.pyi
+typeshed/third_party/2and3/Crypto/Random/Fortuna/__init__.pyi
+typeshed/third_party/2and3/Crypto/Random/OSRNG/__init__.pyi
+typeshed/third_party/2and3/Crypto/Random/OSRNG/fallback.pyi
+typeshed/third_party/2and3/Crypto/Random/OSRNG/posix.pyi
+typeshed/third_party/2and3/Crypto/Random/OSRNG/rng_base.pyi
+typeshed/third_party/2and3/Crypto/Signature/PKCS1_PSS.pyi
+typeshed/third_party/2and3/Crypto/Signature/PKCS1_v1_5.pyi
+typeshed/third_party/2and3/Crypto/Signature/__init__.pyi
+typeshed/third_party/2and3/Crypto/Util/Counter.pyi
+typeshed/third_party/2and3/Crypto/Util/RFC1751.pyi
+typeshed/third_party/2and3/Crypto/Util/__init__.pyi
+typeshed/third_party/2and3/Crypto/Util/asn1.pyi
+typeshed/third_party/2and3/Crypto/Util/number.pyi
+typeshed/third_party/2and3/Crypto/Util/randpool.pyi
+typeshed/third_party/2and3/Crypto/Util/strxor.pyi
+typeshed/third_party/2and3/atomicwrites/__init__.pyi
+typeshed/third_party/2and3/backports/__init__.pyi
+typeshed/third_party/2and3/backports/ssl_match_hostname.pyi
+typeshed/third_party/2and3/boto/__init__.pyi
+typeshed/third_party/2and3/boto/auth.pyi
+typeshed/third_party/2and3/boto/auth_handler.pyi
+typeshed/third_party/2and3/boto/compat.pyi
+typeshed/third_party/2and3/boto/connection.pyi
+typeshed/third_party/2and3/boto/exception.pyi
+typeshed/third_party/2and3/boto/plugin.pyi
+typeshed/third_party/2and3/boto/regioninfo.pyi
+typeshed/third_party/2and3/boto/ec2/__init__.pyi
+typeshed/third_party/2and3/boto/elb/__init__.pyi
+typeshed/third_party/2and3/boto/s3/__init__.pyi
+typeshed/third_party/2and3/boto/s3/acl.pyi
+typeshed/third_party/2and3/boto/s3/bucket.pyi
+typeshed/third_party/2and3/boto/s3/bucketlistresultset.pyi
+typeshed/third_party/2and3/boto/s3/bucketlogging.pyi
+typeshed/third_party/2and3/boto/s3/connection.pyi
+typeshed/third_party/2and3/boto/s3/cors.pyi
+typeshed/third_party/2and3/boto/s3/deletemarker.pyi
+typeshed/third_party/2and3/boto/s3/key.pyi
+typeshed/third_party/2and3/boto/s3/keyfile.pyi
+typeshed/third_party/2and3/boto/s3/lifecycle.pyi
+typeshed/third_party/2and3/boto/s3/multidelete.pyi
+typeshed/third_party/2and3/boto/s3/multipart.pyi
+typeshed/third_party/2and3/boto/s3/prefix.pyi
+typeshed/third_party/2and3/boto/s3/tagging.pyi
+typeshed/third_party/2and3/boto/s3/user.pyi
+typeshed/third_party/2and3/boto/s3/website.pyi
+typeshed/third_party/2and3/characteristic/__init__.pyi
+typeshed/third_party/2and3/jinja2/__init__.pyi
+typeshed/third_party/2and3/jinja2/_compat.pyi
+typeshed/third_party/2and3/jinja2/_stringdefs.pyi
+typeshed/third_party/2and3/jinja2/bccache.pyi
+typeshed/third_party/2and3/jinja2/compiler.pyi
+typeshed/third_party/2and3/jinja2/constants.pyi
+typeshed/third_party/2and3/jinja2/debug.pyi
+typeshed/third_party/2and3/jinja2/defaults.pyi
+typeshed/third_party/2and3/jinja2/environment.pyi
+typeshed/third_party/2and3/jinja2/exceptions.pyi
+typeshed/third_party/2and3/jinja2/ext.pyi
+typeshed/third_party/2and3/jinja2/filters.pyi
+typeshed/third_party/2and3/jinja2/lexer.pyi
+typeshed/third_party/2and3/jinja2/loaders.pyi
+typeshed/third_party/2and3/jinja2/meta.pyi
+typeshed/third_party/2and3/jinja2/nodes.pyi
+typeshed/third_party/2and3/jinja2/optimizer.pyi
+typeshed/third_party/2and3/jinja2/parser.pyi
+typeshed/third_party/2and3/jinja2/runtime.pyi
+typeshed/third_party/2and3/jinja2/sandbox.pyi
+typeshed/third_party/2and3/jinja2/tests.pyi
+typeshed/third_party/2and3/jinja2/utils.pyi
+typeshed/third_party/2and3/jinja2/visitor.pyi
+typeshed/third_party/2and3/markupsafe/__init__.pyi
+typeshed/third_party/2and3/markupsafe/_compat.pyi
+typeshed/third_party/2and3/markupsafe/_constants.pyi
+typeshed/third_party/2and3/markupsafe/_native.pyi
+typeshed/third_party/2and3/markupsafe/_speedups.pyi
+typeshed/third_party/2and3/pytz/__init__.pyi
+typeshed/third_party/2and3/pytz/lazy.pyi
+typeshed/third_party/3/enum.pyi
+typeshed/third_party/3/itsdangerous.pyi
+typeshed/third_party/3/pkg_resources.pyi
+typeshed/third_party/3.6/click/__init__.pyi
+typeshed/third_party/3.6/click/core.pyi
+typeshed/third_party/3.6/click/decorators.pyi
+typeshed/third_party/3.6/click/exceptions.pyi
+typeshed/third_party/3.6/click/formatting.pyi
+typeshed/third_party/3.6/click/globals.pyi
+typeshed/third_party/3.6/click/parser.pyi
+typeshed/third_party/3.6/click/termui.pyi
+typeshed/third_party/3.6/click/types.pyi
+typeshed/third_party/3.6/click/utils.pyi
+typeshed/third_party/3/dateutil/__init__.pyi
+typeshed/third_party/3/dateutil/parser.pyi
+typeshed/third_party/3/dateutil/relativedelta.pyi
+typeshed/third_party/3/docutils/__init__.pyi
+typeshed/third_party/3/docutils/examples.pyi
+typeshed/third_party/3/docutils/nodes.pyi
+typeshed/third_party/3/docutils/parsers/__init__.pyi
+typeshed/third_party/3/docutils/parsers/rst/__init__.pyi
+typeshed/third_party/3/docutils/parsers/rst/nodes.pyi
+typeshed/third_party/3/docutils/parsers/rst/roles.pyi
+typeshed/third_party/3/docutils/parsers/rst/states.pyi
+typeshed/third_party/3/lxml/__init__.pyi
+typeshed/third_party/3/lxml/etree.pyi
+typeshed/third_party/3/lxml/objectify.pyi
+typeshed/third_party/3/requests/__init__.pyi
+typeshed/third_party/3/requests/adapters.pyi
+typeshed/third_party/3/requests/api.pyi
+typeshed/third_party/3/requests/auth.pyi
+typeshed/third_party/3/requests/compat.pyi
+typeshed/third_party/3/requests/cookies.pyi
+typeshed/third_party/3/requests/exceptions.pyi
+typeshed/third_party/3/requests/hooks.pyi
+typeshed/third_party/3/requests/models.pyi
+typeshed/third_party/3/requests/sessions.pyi
+typeshed/third_party/3/requests/status_codes.pyi
+typeshed/third_party/3/requests/structures.pyi
+typeshed/third_party/3/requests/utils.pyi
+typeshed/third_party/3/requests/packages/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/_collections.pyi
+typeshed/third_party/3/requests/packages/urllib3/connection.pyi
+typeshed/third_party/3/requests/packages/urllib3/connectionpool.pyi
+typeshed/third_party/3/requests/packages/urllib3/exceptions.pyi
+typeshed/third_party/3/requests/packages/urllib3/fields.pyi
+typeshed/third_party/3/requests/packages/urllib3/filepost.pyi
+typeshed/third_party/3/requests/packages/urllib3/poolmanager.pyi
+typeshed/third_party/3/requests/packages/urllib3/request.pyi
+typeshed/third_party/3/requests/packages/urllib3/response.pyi
+typeshed/third_party/3/requests/packages/urllib3/contrib/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/packages/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/connection.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/request.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/response.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/retry.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/ssl_.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/timeout.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/url.pyi
+typeshed/third_party/3/six/__init__.pyi
+typeshed/third_party/3/six/moves/__init__.pyi
+typeshed/third_party/3/six/moves/cPickle.pyi
+typeshed/third_party/3/six/moves/urllib_error.pyi
+typeshed/third_party/3/six/moves/urllib_parse.pyi
+typeshed/third_party/3/six/moves/urllib_request.pyi
+typeshed/third_party/3/six/moves/urllib_response.pyi
+typeshed/third_party/3/six/moves/urllib_robotparser.pyi
+typeshed/third_party/3/six/moves/urllib/__init__.pyi
+typeshed/third_party/3/six/moves/urllib/error.pyi
+typeshed/third_party/3/six/moves/urllib/parse.pyi
+typeshed/third_party/3/six/moves/urllib/request.pyi
+typeshed/third_party/3/six/moves/urllib/response.pyi
+typeshed/third_party/3/six/moves/urllib/robotparser.pyi
+typeshed/third_party/3/typed_ast/__init__.pyi
+typeshed/third_party/3/typed_ast/ast27.pyi
+typeshed/third_party/3/typed_ast/ast35.pyi
+typeshed/third_party/3/typed_ast/conversions.pyi
+typeshed/third_party/3/werkzeug/__init__.pyi
+typeshed/third_party/3/werkzeug/_compat.pyi
+typeshed/third_party/3/werkzeug/_internal.pyi
+typeshed/third_party/3/werkzeug/_reloader.pyi
+typeshed/third_party/3/werkzeug/datastructures.pyi
+typeshed/third_party/3/werkzeug/exceptions.pyi
+typeshed/third_party/3/werkzeug/filesystem.pyi
+typeshed/third_party/3/werkzeug/formparser.pyi
+typeshed/third_party/3/werkzeug/http.pyi
+typeshed/third_party/3/werkzeug/local.pyi
+typeshed/third_party/3/werkzeug/posixemulation.pyi
+typeshed/third_party/3/werkzeug/routing.pyi
+typeshed/third_party/3/werkzeug/script.pyi
+typeshed/third_party/3/werkzeug/security.pyi
+typeshed/third_party/3/werkzeug/serving.pyi
+typeshed/third_party/3/werkzeug/test.pyi
+typeshed/third_party/3/werkzeug/testapp.pyi
+typeshed/third_party/3/werkzeug/urls.pyi
+typeshed/third_party/3/werkzeug/useragents.pyi
+typeshed/third_party/3/werkzeug/utils.pyi
+typeshed/third_party/3/werkzeug/wrappers.pyi
+typeshed/third_party/3/werkzeug/wsgi.pyi
+typeshed/third_party/3/werkzeug/contrib/__init__.pyi
+typeshed/third_party/3/werkzeug/contrib/atom.pyi
+typeshed/third_party/3/werkzeug/contrib/cache.pyi
+typeshed/third_party/3/werkzeug/contrib/fixers.pyi
+typeshed/third_party/3/werkzeug/contrib/iterio.pyi
+typeshed/third_party/3/werkzeug/contrib/jsrouting.pyi
+typeshed/third_party/3/werkzeug/contrib/limiter.pyi
+typeshed/third_party/3/werkzeug/contrib/lint.pyi
+typeshed/third_party/3/werkzeug/contrib/profiler.pyi
+typeshed/third_party/3/werkzeug/contrib/securecookie.pyi
+typeshed/third_party/3/werkzeug/contrib/sessions.pyi
+typeshed/third_party/3/werkzeug/contrib/testtools.pyi
+typeshed/third_party/3/werkzeug/contrib/wrappers.pyi
+typeshed/third_party/3/werkzeug/debug/__init__.pyi
+typeshed/third_party/3/werkzeug/debug/console.pyi
+typeshed/third_party/3/werkzeug/debug/repr.pyi
+typeshed/third_party/3/werkzeug/debug/tbtools.pyi
+xml/mypy-html.css
+xml/mypy-html.xslt
+xml/mypy-txt.xslt
+xml/mypy.xsd
\ No newline at end of file
diff --git a/mypy.egg-info/dependency_links.txt b/mypy.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/mypy.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/mypy.egg-info/requires.txt b/mypy.egg-info/requires.txt
new file mode 100644
index 0000000..34d5806
--- /dev/null
+++ b/mypy.egg-info/requires.txt
@@ -0,0 +1 @@
+typed-ast >= 0.6.3
diff --git a/mypy.egg-info/top_level.txt b/mypy.egg-info/top_level.txt
new file mode 100644
index 0000000..f0aa93a
--- /dev/null
+++ b/mypy.egg-info/top_level.txt
@@ -0,0 +1 @@
+mypy
diff --git a/mypy/myunit/__init__.py b/mypy/myunit/__init__.py
deleted file mode 100644
index 26b9a45..0000000
--- a/mypy/myunit/__init__.py
+++ /dev/null
@@ -1,380 +0,0 @@
-import importlib
-import os
-import sys
-import re
-import tempfile
-import time
-import traceback
-
-from typing import List, Tuple, Any, Callable, Union, cast
-from types import TracebackType
-
-
-# TODO remove global state
-is_verbose = False
-is_quiet = False
-patterns = []  # type: List[str]
-times = []  # type: List[Tuple[float, str]]
-
-
-class AssertionFailure(Exception):
-    """Exception used to signal failed test cases."""
-    def __init__(self, s: str = None) -> None:
-        if s:
-            super().__init__(s)
-        else:
-            super().__init__()
-
-
-class SkipTestCaseException(Exception):
-    """Exception used to signal skipped test cases."""
-    pass
-
-
-def assert_true(b: bool, msg: str = None) -> None:
-    if not b:
-        raise AssertionFailure(msg)
-
-
-def assert_false(b: bool, msg: str = None) -> None:
-    if b:
-        raise AssertionFailure(msg)
-
-
-def good_repr(obj: object) -> str:
-    if isinstance(obj, str):
-        if obj.count('\n') > 1:
-            bits = ["'''\\"]
-            for line in obj.split('\n'):
-                # force repr to use ' not ", then cut it off
-                bits.append(repr('"' + line)[2:-1])
-            bits[-1] += "'''"
-            return '\n'.join(bits)
-    return repr(obj)
-
-
-def assert_equal(a: object, b: object, fmt: str = '{} != {}') -> None:
-    if a != b:
-        raise AssertionFailure(fmt.format(good_repr(a), good_repr(b)))
-
-
-def assert_not_equal(a: object, b: object, fmt: str = '{} == {}') -> None:
-    if a == b:
-        raise AssertionFailure(fmt.format(good_repr(a), good_repr(b)))
-
-
-def assert_raises(typ: type, *rest: Any) -> None:
-    """Usage: assert_raises(exception class[, message], function[, args])
-
-    Call function with the given arguments and expect an exception of the given
-    type.
-
-    TODO use overloads for better type checking
-    """
-    # Parse arguments.
-    msg = None  # type: str
-    if isinstance(rest[0], str) or rest[0] is None:
-        msg = rest[0]
-        rest = rest[1:]
-    f = rest[0]
-    args = []  # type: List[Any]
-    if len(rest) > 1:
-        args = rest[1]
-        assert len(rest) <= 2
-
-    # Perform call and verify the exception.
-    try:
-        f(*args)
-    except BaseException as e:
-        if isinstance(e, KeyboardInterrupt):
-            raise
-        assert_type(typ, e)
-        if msg:
-            assert_equal(e.args[0], msg, 'Invalid message {}, expected {}')
-    else:
-        raise AssertionFailure('No exception raised')
-
-
-def assert_type(typ: type, value: object) -> None:
-    if type(value) != typ:
-        raise AssertionFailure('Invalid type {}, expected {}'.format(
-            typename(type(value)), typename(typ)))
-
-
-def fail() -> None:
-    raise AssertionFailure()
-
-
-class TestCase:
-    def __init__(self, name: str, suite: 'Suite' = None,
-                 func: Callable[[], None] = None) -> None:
-        self.func = func
-        self.name = name
-        self.suite = suite
-        self.old_cwd = None  # type: str
-        self.tmpdir = None  # type: tempfile.TemporaryDirectory
-
-    def run(self) -> None:
-        if self.func:
-            self.func()
-
-    def set_up(self) -> None:
-        self.old_cwd = os.getcwd()
-        self.tmpdir = tempfile.TemporaryDirectory(prefix='mypy-test-',
-                dir=os.path.abspath('tmp-test-dirs'))
-        os.chdir(self.tmpdir.name)
-        os.mkdir('tmp')
-        if self.suite:
-            self.suite.set_up()
-
-    def tear_down(self) -> None:
-        if self.suite:
-            self.suite.tear_down()
-        os.chdir(self.old_cwd)
-        self.tmpdir.cleanup()
-        self.old_cwd = None
-        self.tmpdir = None
-
-
-class Suite:
-    def __init__(self) -> None:
-        self.prefix = typename(type(self)) + '.'
-        # Each test case is either a TestCase object or (str, function).
-        self._test_cases = []  # type: List[Any]
-        self.init()
-
-    def set_up(self) -> None:
-        pass
-
-    def tear_down(self) -> None:
-        pass
-
-    def init(self) -> None:
-        for m in dir(self):
-            if m.startswith('test'):
-                t = getattr(self, m)
-                if isinstance(t, Suite):
-                    self.add_test((m + '.', t))
-                else:
-                    self.add_test(TestCase(m, self, getattr(self, m)))
-
-    def add_test(self, test: Union[TestCase,
-                                   Tuple[str, Callable[[], None]],
-                                   Tuple[str, 'Suite']]) -> None:
-        self._test_cases.append(test)
-
-    def cases(self) -> List[Any]:
-        return self._test_cases[:]
-
-    def skip(self) -> None:
-        raise SkipTestCaseException()
-
-
-def add_suites_from_module(suites: List[Suite], mod_name: str) -> None:
-    mod = importlib.import_module(mod_name)
-    got_suite = False
-    for suite in mod.__dict__.values():
-        if isinstance(suite, type) and issubclass(suite, Suite) and suite is not Suite:
-            got_suite = True
-            suites.append(cast(Callable[[], Suite], suite)())
-    if not got_suite:
-        # Sanity check in case e.g. it uses unittest instead of a myunit.
-        # The codecs tests do since they need to be python2-compatible.
-        sys.exit('Test module %s had no test!' % mod_name)
-
-
-class ListSuite(Suite):
-    def __init__(self, suites: List[Suite]) -> None:
-        for suite in suites:
-            mod_name = type(suite).__module__.replace('.', '_')
-            mod_name = mod_name.replace('mypy_', '')
-            mod_name = mod_name.replace('test_', '')
-            mod_name = mod_name.strip('_').replace('__', '_')
-            type_name = type(suite).__name__
-            name = 'test_%s_%s' % (mod_name, type_name)
-            setattr(self, name, suite)
-        super().__init__()
-
-
-def main(args: List[str] = None) -> None:
-    global patterns, is_verbose, is_quiet
-    if not args:
-        args = sys.argv[1:]
-    is_verbose = False
-    is_quiet = False
-    suites = []  # type: List[Suite]
-    patterns = []
-    i = 0
-    while i < len(args):
-        a = args[i]
-        if a == '-v':
-            is_verbose = True
-        elif a == '-q':
-            is_quiet = True
-        elif a == '-m':
-            i += 1
-            if i == len(args):
-                sys.exit('-m requires an argument')
-            add_suites_from_module(suites, args[i])
-        elif not a.startswith('-'):
-            patterns.append(a)
-        else:
-            sys.exit('Usage: python -m mypy.myunit [-v] [-q]'
-                    + ' -m mypy.test.module [-m mypy.test.module ...] [filter ...]')
-        i += 1
-    if len(patterns) == 0:
-        patterns.append('*')
-    if not suites:
-        sys.exit('At least one -m argument is required')
-
-    t = ListSuite(suites)
-    num_total, num_fail, num_skip = run_test_recursive(t, 0, 0, 0, '', 0)
-
-    skip_msg = ''
-    if num_skip > 0:
-        skip_msg = ', {} skipped'.format(num_skip)
-
-    if num_fail == 0:
-        if not is_quiet:
-            print('%d test cases run%s, all passed.' % (num_total, skip_msg))
-            print('*** OK ***')
-    else:
-        sys.stderr.write('%d/%d test cases failed%s.\n' % (num_fail,
-                                                           num_total,
-                                                           skip_msg))
-        sys.stderr.write('*** FAILURE ***\n')
-        sys.exit(1)
-
-
-def run_test_recursive(test: Any, num_total: int, num_fail: int, num_skip: int,
-                       prefix: str, depth: int) -> Tuple[int, int, int]:
-    """The first argument may be TestCase, Suite or (str, Suite)."""
-    if isinstance(test, TestCase):
-        name = prefix + test.name
-        for pattern in patterns:
-            if match_pattern(name, pattern):
-                match = True
-                break
-        else:
-            match = False
-        if match:
-            is_fail, is_skip = run_single_test(name, test)
-            if is_fail: num_fail += 1
-            if is_skip: num_skip += 1
-            num_total += 1
-    else:
-        suite = None  # type: Suite
-        suite_prefix = ''
-        if isinstance(test, list) or isinstance(test, tuple):
-            suite = test[1]
-            suite_prefix = test[0]
-        else:
-            suite = test
-            suite_prefix = test.prefix
-
-        for stest in suite.cases():
-            new_prefix = prefix
-            if depth > 0:
-                new_prefix = prefix + suite_prefix
-            num_total, num_fail, num_skip = run_test_recursive(
-                stest, num_total, num_fail, num_skip, new_prefix, depth + 1)
-    return num_total, num_fail, num_skip
-
-
-def run_single_test(name: str, test: Any) -> Tuple[bool, bool]:
-    if is_verbose:
-        sys.stderr.write(name)
-        sys.stderr.flush()
-
-    time0 = time.time()
-    test.set_up()  # FIX: check exceptions
-    exc_traceback = None  # type: Any
-    try:
-        test.run()
-    except BaseException as e:
-        if isinstance(e, KeyboardInterrupt):
-            raise
-        exc_type, exc_value, exc_traceback = sys.exc_info()
-    test.tear_down()  # FIX: check exceptions
-    times.append((time.time() - time0, name))
-
-    if exc_traceback:
-        if isinstance(exc_value, SkipTestCaseException):
-            if is_verbose:
-                sys.stderr.write(' (skipped)\n')
-            return False, True
-        else:
-            handle_failure(name, exc_type, exc_value, exc_traceback)
-            return True, False
-    elif is_verbose:
-        sys.stderr.write('\n')
-
-    return False, False
-
-
-def handle_failure(name: str,
-                   exc_type: type,
-                   exc_value: BaseException,
-                   exc_traceback: TracebackType,
-                   ) -> None:
-    # Report failed test case.
-    if is_verbose:
-        sys.stderr.write('\n\n')
-    msg = ''
-    if exc_value.args and exc_value.args[0]:
-        msg = ': ' + str(exc_value)
-    else:
-        msg = ''
-    if not isinstance(exc_value, SystemExit):
-        # We assume that before doing exit() (which raises SystemExit) we've printed
-        # enough context about what happened so that a stack trace is not useful.
-        # In particular, uncaught exceptions during semantic analysis or type checking
-        # call exit() and they already print out a stack trace.
-        sys.stderr.write('Traceback (most recent call last):\n')
-        tb = traceback.format_tb(exc_traceback)
-        tb = clean_traceback(tb)
-        for s in tb:
-            sys.stderr.write(s)
-    else:
-        sys.stderr.write('\n')
-    exception = typename(exc_type)
-    sys.stderr.write('{}{}\n\n'.format(exception, msg))
-    sys.stderr.write('{} failed\n\n'.format(name))
-
-
-def typename(t: type) -> str:
-    if '.' in str(t):
-        return str(t).split('.')[-1].rstrip("'>")
-    else:
-        return str(t)[8:-2]
-
-
-def match_pattern(s: str, p: str) -> bool:
-    if len(p) == 0:
-        return len(s) == 0
-    elif p[0] == '*':
-        if len(p) == 1:
-            return True
-        else:
-            for i in range(len(s) + 1):
-                if match_pattern(s[i:], p[1:]):
-                    return True
-            return False
-    elif len(s) == 0:
-        return False
-    else:
-        return s[0] == p[0] and match_pattern(s[1:], p[1:])
-
-
-def clean_traceback(tb: List[str]) -> List[str]:
-    # Remove clutter from the traceback.
-    start = 0
-    for i, s in enumerate(tb):
-        if '\n    test.run()\n' in s or '\n    self.func()\n' in s:
-            start = i + 1
-    tb = tb[start:]
-    for f in ['assert_equal', 'assert_not_equal', 'assert_type',
-              'assert_raises', 'assert_true']:
-        if tb != [] and ', in {}\n'.format(f) in tb[-1]:
-            tb = tb[:-1]
-    return tb
diff --git a/mypy/myunit/__main__.py b/mypy/myunit/__main__.py
deleted file mode 100644
index 78ef01f..0000000
--- a/mypy/myunit/__main__.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# This is a separate module from mypy.myunit so it doesn't exist twice.
-"""Myunit test runner command line tool.
-
-Usually used as a slave by runtests.py, but can be used directly.
-"""
-
-from mypy.myunit import main
-
-# In Python 3.3, mypy.__path__ contains a relative path to the mypy module
-# (whereas in later Python versions it contains an absolute path).  Because the
-# test runner changes directories, this breaks non-toplevel mypy imports.  We
-# fix that problem by fixing up the path to be absolute here.
-import os.path
-import mypy
-# User-defined packages always have __path__ attributes, but mypy doesn't know that.
-mypy.__path__ = [os.path.abspath(p) for p in mypy.__path__]  # type: ignore
-
-main()
diff --git a/mypy/test/config.py b/mypy/test/config.py
deleted file mode 100644
index 681f866..0000000
--- a/mypy/test/config.py
+++ /dev/null
@@ -1,19 +0,0 @@
-import os
-import os.path
-
-import typing
-
-
-this_file_dir = os.path.dirname(os.path.realpath(__file__))
-PREFIX = os.path.dirname(os.path.dirname(this_file_dir))
-
-# Location of test data files such as test case descriptions.
-test_data_prefix = os.path.join(PREFIX, 'test-data', 'unit')
-
-assert os.path.isdir(test_data_prefix), \
-    'Test data prefix ({}) not set correctly'.format(test_data_prefix)
-
-# Temp directory used for the temp files created when running test cases.
-# This is *within* the tempfile.TemporaryDirectory that is chroot'ed per testcase.
-# It is also hard-coded in numerous places, so don't change it.
-test_temp_dir = 'tmp'
diff --git a/mypy/test/data.py b/mypy/test/data.py
deleted file mode 100644
index e1b6133..0000000
--- a/mypy/test/data.py
+++ /dev/null
@@ -1,468 +0,0 @@
-"""Utilities for processing .test files containing test case descriptions."""
-
-import os.path
-import os
-import re
-from os import remove, rmdir
-import shutil
-
-import pytest  # type: ignore  # no pytest in typeshed
-from typing import Callable, List, Tuple, Set, Optional
-
-from mypy.myunit import TestCase, SkipTestCaseException
-
-
-def parse_test_cases(
-        path: str,
-        perform: Optional[Callable[['DataDrivenTestCase'], None]],
-        base_path: str = '.',
-        optional_out: bool = False,
-        include_path: str = None,
-        native_sep: bool = False) -> List['DataDrivenTestCase']:
-    """Parse a file with test case descriptions.
-
-    Return an array of test cases.
-
-    NB this function and DataDrivenTestCase are shared between the
-    myunit and pytest codepaths -- if something looks redundant,
-    that's likely the reason.
-    """
-
-    if not include_path:
-        include_path = os.path.dirname(path)
-    with open(path, encoding='utf-8') as f:
-        l = f.readlines()
-    for i in range(len(l)):
-        l[i] = l[i].rstrip('\n')
-    p = parse_test_data(l, path)
-    out = []  # type: List[DataDrivenTestCase]
-
-    # Process the parsed items. Each item has a header of form [id args],
-    # optionally followed by lines of text.
-    i = 0
-    while i < len(p):
-        ok = False
-        i0 = i
-        if p[i].id == 'case':
-            i += 1
-
-            files = []  # type: List[Tuple[str, str]] # path and contents
-            output_files = []  # type: List[Tuple[str, str]] # path and contents for output files
-            tcout = []  # type: List[str]  # Regular output errors
-            tcout2 = []  # type: List[str]  # Output errors for incremental, second run
-            stale_modules = None  # type: Optional[Set[str]]  # module names
-            rechecked_modules = None  # type: Optional[Set[str]]  # module names
-            while i < len(p) and p[i].id != 'case':
-                if p[i].id == 'file' or p[i].id == 'outfile':
-                    # Record an extra file needed for the test case.
-                    arg = p[i].arg
-                    assert arg is not None
-                    file_entry = (os.path.join(base_path, arg), '\n'.join(p[i].data))
-                    if p[i].id == 'file':
-                        files.append(file_entry)
-                    elif p[i].id == 'outfile':
-                        output_files.append(file_entry)
-                elif p[i].id in ('builtins', 'builtins_py2'):
-                    # Use a custom source file for the std module.
-                    arg = p[i].arg
-                    assert arg is not None
-                    mpath = os.path.join(os.path.dirname(path), arg)
-                    if p[i].id == 'builtins':
-                        fnam = 'builtins.pyi'
-                    else:
-                        # Python 2
-                        fnam = '__builtin__.pyi'
-                    with open(mpath) as f:
-                        files.append((os.path.join(base_path, fnam), f.read()))
-                elif p[i].id == 'stale':
-                    arg = p[i].arg
-                    if arg is None:
-                        stale_modules = set()
-                    else:
-                        stale_modules = {item.strip() for item in arg.split(',')}
-                elif p[i].id == 'rechecked':
-                    arg = p[i].arg
-                    if arg is None:
-                        rechecked_modules = set()
-                    else:
-                        rechecked_modules = {item.strip() for item in arg.split(',')}
-                elif p[i].id == 'out' or p[i].id == 'out1':
-                    tcout = p[i].data
-                    if native_sep and os.path.sep == '\\':
-                        tcout = [fix_win_path(line) for line in tcout]
-                    ok = True
-                elif p[i].id == 'out2':
-                    tcout2 = p[i].data
-                    if native_sep and os.path.sep == '\\':
-                        tcout2 = [fix_win_path(line) for line in tcout2]
-                    ok = True
-                else:
-                    raise ValueError(
-                        'Invalid section header {} in {} at line {}'.format(
-                            p[i].id, path, p[i].line))
-                i += 1
-
-            if rechecked_modules is None:
-                # If the set of rechecked modules isn't specified, make it the same as the set of
-                # modules with a stale public interface.
-                rechecked_modules = stale_modules
-            if (stale_modules is not None
-                    and rechecked_modules is not None
-                    and not stale_modules.issubset(rechecked_modules)):
-                raise ValueError(
-                    'Stale modules must be a subset of rechecked modules ({})'.format(path))
-
-            if optional_out:
-                ok = True
-
-            if ok:
-                input = expand_includes(p[i0].data, include_path)
-                expand_errors(input, tcout, 'main')
-                lastline = p[i].line if i < len(p) else p[i - 1].line + 9999
-                tc = DataDrivenTestCase(p[i0].arg, input, tcout, tcout2, path,
-                                        p[i0].line, lastline, perform,
-                                        files, output_files, stale_modules,
-                                        rechecked_modules)
-                out.append(tc)
-        if not ok:
-            raise ValueError(
-                '{}, line {}: Error in test case description'.format(
-                    path, p[i0].line))
-
-    return out
-
-
-class DataDrivenTestCase(TestCase):
-    input = None  # type: List[str]
-    output = None  # type: List[str]
-
-    file = ''
-    line = 0
-
-    perform = None  # type: Callable[['DataDrivenTestCase'], None]
-
-    # (file path, file content) tuples
-    files = None  # type: List[Tuple[str, str]]
-    expected_stale_modules = None  # type: Optional[Set[str]]
-
-    clean_up = None  # type: List[Tuple[bool, str]]
-
-    def __init__(self, name, input, output, output2, file, line, lastline,
-                 perform, files, output_files, expected_stale_modules, expected_rechecked_modules):
-        super().__init__(name)
-        self.input = input
-        self.output = output
-        self.output2 = output2
-        self.lastline = lastline
-        self.file = file
-        self.line = line
-        self.perform = perform
-        self.files = files
-        self.output_files = output_files
-        self.expected_stale_modules = expected_stale_modules
-        self.expected_rechecked_modules = expected_rechecked_modules
-
-    def set_up(self) -> None:
-        super().set_up()
-        encountered_files = set()
-        self.clean_up = []
-        for path, content in self.files:
-            dir = os.path.dirname(path)
-            for d in self.add_dirs(dir):
-                self.clean_up.append((True, d))
-            with open(path, 'w') as f:
-                f.write(content)
-            self.clean_up.append((False, path))
-            encountered_files.add(path)
-            if path.endswith(".next"):
-                # Make sure new files introduced in the second run are accounted for
-                renamed_path = path[:-5]
-                if renamed_path not in encountered_files:
-                    encountered_files.add(renamed_path)
-                    self.clean_up.append((False, renamed_path))
-        for path, _ in self.output_files:
-            # Create directories for expected output and mark them to be cleaned up at the end
-            # of the test case.
-            dir = os.path.dirname(path)
-            for d in self.add_dirs(dir):
-                self.clean_up.append((True, d))
-            self.clean_up.append((False, path))
-
-    def add_dirs(self, dir: str) -> List[str]:
-        """Add all subdirectories required to create dir.
-
-        Return an array of the created directories in the order of creation.
-        """
-        if dir == '' or os.path.isdir(dir):
-            return []
-        else:
-            dirs = self.add_dirs(os.path.dirname(dir)) + [dir]
-            os.mkdir(dir)
-            return dirs
-
-    def run(self):
-        if self.name.endswith('-skip'):
-            raise SkipTestCaseException()
-        else:
-            self.perform(self)
-
-    def tear_down(self) -> None:
-        # First remove files.
-        for is_dir, path in reversed(self.clean_up):
-            if not is_dir:
-                remove(path)
-        # Then remove directories.
-        for is_dir, path in reversed(self.clean_up):
-            if is_dir:
-                pycache = os.path.join(path, '__pycache__')
-                if os.path.isdir(pycache):
-                    shutil.rmtree(pycache)
-                try:
-                    rmdir(path)
-                except OSError as error:
-                    print(' ** Error removing directory %s -- contents:' % path)
-                    for item in os.listdir(path):
-                        print('  ', item)
-                    # Most likely, there are some files in the
-                    # directory. Use rmtree to nuke the directory, but
-                    # fail the test case anyway, since this seems like
-                    # a bug in a test case -- we shouldn't leave
-                    # garbage lying around. By nuking the directory,
-                    # the next test run hopefully passes.
-                    path = error.filename
-                    # Be defensive -- only call rmtree if we're sure we aren't removing anything
-                    # valuable.
-                    if path.startswith('tmp/') and os.path.isdir(path):
-                        shutil.rmtree(path)
-                    raise
-        super().tear_down()
-
-
-class TestItem:
-    """Parsed test caseitem.
-
-    An item is of the form
-      [id arg]
-      .. data ..
-    """
-
-    id = ''
-    arg = ''  # type: Optional[str]
-
-    # Text data, array of 8-bit strings
-    data = None  # type: List[str]
-
-    file = ''
-    line = 0  # Line number in file
-
-    def __init__(self, id: str, arg: Optional[str], data: List[str], file: str,
-                 line: int) -> None:
-        self.id = id
-        self.arg = arg
-        self.data = data
-        self.file = file
-        self.line = line
-
-
-def parse_test_data(l: List[str], fnam: str) -> List[TestItem]:
-    """Parse a list of lines that represent a sequence of test items."""
-
-    ret = []  # type: List[TestItem]
-    data = []  # type: List[str]
-
-    id = None  # type: Optional[str]
-    arg = None  # type: Optional[str]
-
-    i = 0
-    i0 = 0
-    while i < len(l):
-        s = l[i].strip()
-
-        if l[i].startswith('[') and s.endswith(']') and not s.startswith('[['):
-            if id:
-                data = collapse_line_continuation(data)
-                data = strip_list(data)
-                ret.append(TestItem(id, arg, strip_list(data), fnam, i0 + 1))
-            i0 = i
-            id = s[1:-1]
-            arg = None
-            if ' ' in id:
-                arg = id[id.index(' ') + 1:]
-                id = id[:id.index(' ')]
-            data = []
-        elif l[i].startswith('[['):
-            data.append(l[i][1:])
-        elif not l[i].startswith('--'):
-            data.append(l[i])
-        elif l[i].startswith('----'):
-            data.append(l[i][2:])
-        i += 1
-
-    # Process the last item.
-    if id:
-        data = collapse_line_continuation(data)
-        data = strip_list(data)
-        ret.append(TestItem(id, arg, data, fnam, i0 + 1))
-
-    return ret
-
-
-def strip_list(l: List[str]) -> List[str]:
-    """Return a stripped copy of l.
-
-    Strip whitespace at the end of all lines, and strip all empty
-    lines from the end of the array.
-    """
-
-    r = []  # type: List[str]
-    for s in l:
-        # Strip spaces at end of line
-        r.append(re.sub(r'\s+$', '', s))
-
-    while len(r) > 0 and r[-1] == '':
-        r.pop()
-
-    return r
-
-
-def collapse_line_continuation(l: List[str]) -> List[str]:
-    r = []  # type: List[str]
-    cont = False
-    for s in l:
-        ss = re.sub(r'\\$', '', s)
-        if cont:
-            r[-1] += re.sub('^ +', '', ss)
-        else:
-            r.append(ss)
-        cont = s.endswith('\\')
-    return r
-
-
-def expand_includes(a: List[str], base_path: str) -> List[str]:
-    """Expand @includes within a list of lines.
-
-    Replace all lies starting with @include with the contents of the
-    file name following the prefix. Look for the files in base_path.
-    """
-
-    res = []  # type: List[str]
-    for s in a:
-        if s.startswith('@include '):
-            fn = s.split(' ', 1)[1].strip()
-            with open(os.path.join(base_path, fn)) as f:
-                res.extend(f.readlines())
-        else:
-            res.append(s)
-    return res
-
-
-def expand_errors(input: List[str], output: List[str], fnam: str) -> None:
-    """Transform comments such as '# E: message' or
-    '# E:3: message' in input.
-
-    The result is lines like 'fnam:line: error: message'.
-    """
-
-    for i in range(len(input)):
-        # The first in the split things isn't a comment
-        for possible_err_comment in input[i].split('#')[1:]:
-            m = re.search(
-                '^([EN]):((?P<col>\d+):)? (?P<message>.*)$',
-                possible_err_comment.strip())
-            if m:
-                severity = 'error' if m.group(1) == 'E' else 'note'
-                col = m.group('col')
-                if col is None:
-                    output.append(
-                        '{}:{}: {}: {}'.format(fnam, i + 1, severity, m.group('message')))
-                else:
-                    output.append('{}:{}:{}: {}: {}'.format(
-                        fnam, i + 1, col, severity, m.group('message')))
-
-
-def fix_win_path(line: str) -> str:
-    r"""Changes paths to Windows paths in error messages.
-
-    E.g. foo/bar.py -> foo\bar.py.
-    """
-    m = re.match(r'^([\S/]+):(\d+:)?(\s+.*)', line)
-    if not m:
-        return line
-    else:
-        filename, lineno, message = m.groups()
-        return '{}:{}{}'.format(filename.replace('/', '\\'),
-                                lineno or '', message)
-
-
-##
-#
-# pytest setup
-#
-##
-
-
-def pytest_addoption(parser):
-    group = parser.getgroup('mypy')
-    group.addoption('--update-data', action='store_true', default=False,
-                    help='Update test data to reflect actual output'
-                         ' (supported only for certain tests)')
-
-
-def pytest_pycollect_makeitem(collector, name, obj):
-    if not isinstance(obj, type) or not issubclass(obj, DataSuite):
-        return None
-    return MypyDataSuite(name, parent=collector)
-
-
-class MypyDataSuite(pytest.Class):
-    def collect(self):
-        for case in self.obj.cases():
-            yield MypyDataCase(case.name, self, case)
-
-
-class MypyDataCase(pytest.Item):
-    def __init__(self, name: str, parent: MypyDataSuite, obj: DataDrivenTestCase) -> None:
-        self.skip = False
-        if name.endswith('-skip'):
-            self.skip = True
-            name = name[:-len('-skip')]
-
-        super().__init__(name, parent)
-        self.obj = obj
-
-    def runtest(self):
-        if self.skip:
-            pytest.skip()
-        update_data = self.config.getoption('--update-data', False)
-        self.parent.obj(update_data=update_data).run_case(self.obj)
-
-    def setup(self):
-        self.obj.set_up()
-
-    def teardown(self):
-        self.obj.tear_down()
-
-    def reportinfo(self):
-        return self.obj.file, self.obj.line, self.obj.name
-
-    def repr_failure(self, excinfo):
-        if excinfo.errisinstance(SystemExit):
-            # We assume that before doing exit() (which raises SystemExit) we've printed
-            # enough context about what happened so that a stack trace is not useful.
-            # In particular, uncaught exceptions during semantic analysis or type checking
-            # call exit() and they already print out a stack trace.
-            excrepr = excinfo.exconly()
-        else:
-            self.parent._prunetraceback(excinfo)
-            excrepr = excinfo.getrepr(style='short')
-
-        return "data: {}:{}:\n{}".format(self.obj.file, self.obj.line, excrepr)
-
-
-class DataSuite:
-    @classmethod
-    def cases(cls) -> List[DataDrivenTestCase]:
-        return []
-
-    def run_case(self, testcase: DataDrivenTestCase) -> None:
-        raise NotImplementedError
diff --git a/mypy/test/helpers.py b/mypy/test/helpers.py
deleted file mode 100644
index 32d889b..0000000
--- a/mypy/test/helpers.py
+++ /dev/null
@@ -1,285 +0,0 @@
-import sys
-import re
-import os
-
-from typing import List, Dict, Tuple
-
-from mypy import defaults
-from mypy.myunit import AssertionFailure
-from mypy.test.data import DataDrivenTestCase
-
-
-# AssertStringArraysEqual displays special line alignment helper messages if
-# the first different line has at least this many characters,
-MIN_LINE_LENGTH_FOR_ALIGNMENT = 5
-
-
-def assert_string_arrays_equal(expected: List[str], actual: List[str],
-                               msg: str) -> None:
-    """Assert that two string arrays are equal.
-
-    Display any differences in a human-readable form.
-    """
-
-    actual = clean_up(actual)
-
-    if actual != expected:
-        num_skip_start = num_skipped_prefix_lines(expected, actual)
-        num_skip_end = num_skipped_suffix_lines(expected, actual)
-
-        sys.stderr.write('Expected:\n')
-
-        # If omit some lines at the beginning, indicate it by displaying a line
-        # with '...'.
-        if num_skip_start > 0:
-            sys.stderr.write('  ...\n')
-
-        # Keep track of the first different line.
-        first_diff = -1
-
-        # Display only this many first characters of identical lines.
-        width = 75
-
-        for i in range(num_skip_start, len(expected) - num_skip_end):
-            if i >= len(actual) or expected[i] != actual[i]:
-                if first_diff < 0:
-                    first_diff = i
-                sys.stderr.write('  {:<45} (diff)'.format(expected[i]))
-            else:
-                e = expected[i]
-                sys.stderr.write('  ' + e[:width])
-                if len(e) > width:
-                    sys.stderr.write('...')
-            sys.stderr.write('\n')
-        if num_skip_end > 0:
-            sys.stderr.write('  ...\n')
-
-        sys.stderr.write('Actual:\n')
-
-        if num_skip_start > 0:
-            sys.stderr.write('  ...\n')
-
-        for j in range(num_skip_start, len(actual) - num_skip_end):
-            if j >= len(expected) or expected[j] != actual[j]:
-                sys.stderr.write('  {:<45} (diff)'.format(actual[j]))
-            else:
-                a = actual[j]
-                sys.stderr.write('  ' + a[:width])
-                if len(a) > width:
-                    sys.stderr.write('...')
-            sys.stderr.write('\n')
-        if actual == []:
-            sys.stderr.write('  (empty)\n')
-        if num_skip_end > 0:
-            sys.stderr.write('  ...\n')
-
-        sys.stderr.write('\n')
-
-        if first_diff >= 0 and first_diff < len(actual) and (
-                len(expected[first_diff]) >= MIN_LINE_LENGTH_FOR_ALIGNMENT
-                or len(actual[first_diff]) >= MIN_LINE_LENGTH_FOR_ALIGNMENT):
-            # Display message that helps visualize the differences between two
-            # long lines.
-            show_align_message(expected[first_diff], actual[first_diff])
-
-        raise AssertionFailure(msg)
-
-
-def update_testcase_output(testcase: DataDrivenTestCase, output: List[str]) -> None:
-    testcase_path = os.path.join(testcase.old_cwd, testcase.file)
-    with open(testcase_path) as f:
-        data_lines = f.read().splitlines()
-    test = '\n'.join(data_lines[testcase.line:testcase.lastline])
-
-    mapping = {}  # type: Dict[str, List[str]]
-    for old, new in zip(testcase.output, output):
-        PREFIX = 'error:'
-        ind = old.find(PREFIX)
-        if ind != -1 and old[:ind] == new[:ind]:
-            old, new = old[ind + len(PREFIX):], new[ind + len(PREFIX):]
-        mapping.setdefault(old, []).append(new)
-
-    for old in mapping:
-        if test.count(old) == len(mapping[old]):
-            betweens = test.split(old)
-
-            # Interleave betweens and mapping[old]
-            from itertools import chain
-            interleaved = [betweens[0]] + \
-                list(chain.from_iterable(zip(mapping[old], betweens[1:])))
-            test = ''.join(interleaved)
-
-    data_lines[testcase.line:testcase.lastline] = [test]
-    data = '\n'.join(data_lines)
-    with open(testcase_path, 'w') as f:
-        print(data, file=f)
-
-
-def show_align_message(s1: str, s2: str) -> None:
-    """Align s1 and s2 so that the their first difference is highlighted.
-
-    For example, if s1 is 'foobar' and s2 is 'fobar', display the
-    following lines:
-
-      E: foobar
-      A: fobar
-           ^
-
-    If s1 and s2 are long, only display a fragment of the strings around the
-    first difference. If s1 is very short, do nothing.
-    """
-
-    # Seeing what went wrong is trivial even without alignment if the expected
-    # string is very short. In this case do nothing to simplify output.
-    if len(s1) < 4:
-        return
-
-    maxw = 72  # Maximum number of characters shown
-
-    sys.stderr.write('Alignment of first line difference:\n')
-
-    trunc = False
-    while s1[:30] == s2[:30]:
-        s1 = s1[10:]
-        s2 = s2[10:]
-        trunc = True
-
-    if trunc:
-        s1 = '...' + s1
-        s2 = '...' + s2
-
-    max_len = max(len(s1), len(s2))
-    extra = ''
-    if max_len > maxw:
-        extra = '...'
-
-    # Write a chunk of both lines, aligned.
-    sys.stderr.write('  E: {}{}\n'.format(s1[:maxw], extra))
-    sys.stderr.write('  A: {}{}\n'.format(s2[:maxw], extra))
-    # Write an indicator character under the different columns.
-    sys.stderr.write('     ')
-    for j in range(min(maxw, max(len(s1), len(s2)))):
-        if s1[j:j + 1] != s2[j:j + 1]:
-            sys.stderr.write('^')  # Difference
-            break
-        else:
-            sys.stderr.write(' ')  # Equal
-    sys.stderr.write('\n')
-
-
-def assert_string_arrays_equal_wildcards(expected: List[str],
-                                         actual: List[str],
-                                         msg: str) -> None:
-    # Like above, but let a line with only '...' in expected match any number
-    # of lines in actual.
-    actual = clean_up(actual)
-
-    while actual != [] and actual[-1] == '':
-        actual = actual[:-1]
-
-    # Expand "..." wildcards away.
-    expected = match_array(expected, actual)
-    assert_string_arrays_equal(expected, actual, msg)
-
-
-def clean_up(a: List[str]) -> List[str]:
-    """Remove common directory prefix from all strings in a.
-
-    This uses a naive string replace; it seems to work well enough. Also
-    remove trailing carriage returns.
-    """
-    res = []
-    for s in a:
-        prefix = os.sep
-        ss = s
-        for p in prefix, prefix.replace(os.sep, '/'):
-            if p != '/' and p != '//' and p != '\\' and p != '\\\\':
-                ss = ss.replace(p, '')
-        # Ignore spaces at end of line.
-        ss = re.sub(' +$', '', ss)
-        res.append(re.sub('\\r$', '', ss))
-    return res
-
-
-def match_array(pattern: List[str], target: List[str]) -> List[str]:
-    """Expand '...' wildcards in pattern by matching against target."""
-
-    res = []  # type: List[str]
-    i = 0
-    j = 0
-
-    while i < len(pattern):
-        if pattern[i] == '...':
-            # Wildcard in pattern.
-            if i + 1 == len(pattern):
-                # Wildcard at end of pattern; match the rest of target.
-                res.extend(target[j:])
-                # Finished.
-                break
-            else:
-                # Must find the instance of the next pattern line in target.
-                jj = j
-                while jj < len(target):
-                    if target[jj] == pattern[i + 1]:
-                        break
-                    jj += 1
-                if jj == len(target):
-                    # No match. Get out.
-                    res.extend(pattern[i:])
-                    break
-                res.extend(target[j:jj])
-                i += 1
-                j = jj
-        elif (j < len(target) and (pattern[i] == target[j]
-                                   or (i + 1 < len(pattern)
-                                       and j + 1 < len(target)
-                                       and pattern[i + 1] == target[j + 1]))):
-            # In sync; advance one line. The above condition keeps sync also if
-            # only a single line is different, but loses it if two consecutive
-            # lines fail to match.
-            res.append(pattern[i])
-            i += 1
-            j += 1
-        else:
-            # Out of sync. Get out.
-            res.extend(pattern[i:])
-            break
-    return res
-
-
-def num_skipped_prefix_lines(a1: List[str], a2: List[str]) -> int:
-    num_eq = 0
-    while num_eq < min(len(a1), len(a2)) and a1[num_eq] == a2[num_eq]:
-        num_eq += 1
-    return max(0, num_eq - 4)
-
-
-def num_skipped_suffix_lines(a1: List[str], a2: List[str]) -> int:
-    num_eq = 0
-    while (num_eq < min(len(a1), len(a2))
-           and a1[-num_eq - 1] == a2[-num_eq - 1]):
-        num_eq += 1
-    return max(0, num_eq - 4)
-
-
-def testfile_pyversion(path: str) -> Tuple[int, int]:
-    if path.endswith('python2.test'):
-        return defaults.PYTHON2_VERSION
-    else:
-        return defaults.PYTHON3_VERSION
-
-
-def testcase_pyversion(path: str, testcase_name: str) -> Tuple[int, int]:
-    if testcase_name.endswith('python2'):
-        return defaults.PYTHON2_VERSION
-    else:
-        return testfile_pyversion(path)
-
-
-def normalize_error_messages(messages: List[str]) -> List[str]:
-    """Translate an array of error messages to use / as path separator."""
-
-    a = []
-    for m in messages:
-        a.append(m.replace(os.sep, '/'))
-    return a
diff --git a/mypy/test/testargs.py b/mypy/test/testargs.py
deleted file mode 100644
index 4e27e37..0000000
--- a/mypy/test/testargs.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""Ensure the argparse parser and Options class are in sync.
-
-In particular, verify that the argparse defaults are the same as the Options
-defaults, and that argparse doesn't assign any new members to the Options
-object it creates.
-"""
-
-import typing
-from mypy.myunit import Suite, assert_equal
-from mypy.options import Options, BuildType
-from mypy.main import process_options
-
-
-class ArgSuite(Suite):
-    def test_coherence(self) -> None:
-        options = Options()
-        _, parsed_options = process_options([], require_targets=False)
-        assert_equal(options, parsed_options)
diff --git a/mypy/test/testcheck.py b/mypy/test/testcheck.py
deleted file mode 100644
index 970e69d..0000000
--- a/mypy/test/testcheck.py
+++ /dev/null
@@ -1,332 +0,0 @@
-"""Type checker test cases"""
-
-import os.path
-import re
-import shutil
-import sys
-import time
-import typed_ast
-import typed_ast.ast35
-
-from typing import Dict, List, Optional, Set, Tuple
-
-from mypy import build, defaults
-from mypy.main import parse_version, process_options
-from mypy.build import BuildSource, find_module_clear_caches
-from mypy.myunit import AssertionFailure
-from mypy.test.config import test_temp_dir, test_data_prefix
-from mypy.test.data import parse_test_cases, DataDrivenTestCase, DataSuite
-from mypy.test.helpers import (
-    assert_string_arrays_equal, normalize_error_messages,
-    testcase_pyversion, update_testcase_output,
-)
-from mypy.errors import CompileError
-from mypy.options import Options
-
-from mypy import experiments
-
-# List of files that contain test case descriptions.
-files = [
-    'check-columns.test',
-    'check-expressions.test',
-    'check-functions.test',
-    'check-generic-subtyping.test',
-    'check-python2.test',
-    'check-tuples.test',
-    'check-varargs.test',
-]
-fast_parser_files = [
-    'check-basic.test',
-    'check-callable.test',
-    'check-classes.test',
-    'check-statements.test',
-    'check-generics.test',
-    'check-dynamic-typing.test',
-    'check-inference.test',
-    'check-inference-context.test',
-    'check-kwargs.test',
-    'check-overloading.test',
-    'check-type-checks.test',
-    'check-abstract.test',
-    'check-multiple-inheritance.test',
-    'check-super.test',
-    'check-modules.test',
-    'check-typevar-values.test',
-    'check-unsupported.test',
-    'check-unreachable-code.test',
-    'check-unions.test',
-    'check-isinstance.test',
-    'check-lists.test',
-    'check-namedtuple.test',
-    'check-typeddict.test',
-    'check-type-aliases.test',
-    'check-ignore.test',
-    'check-type-promotion.test',
-    'check-semanal-error.test',
-    'check-flags.test',
-    'check-incremental.test',
-    'check-bound.test',
-    'check-optional.test',
-    'check-fastparse.test',
-    'check-warnings.test',
-    'check-async-await.test',
-    'check-newtype.test',
-    'check-class-namedtuple.test',
-    'check-selftype.test',
-]
-
-files.extend(fast_parser_files)
-
-if 'annotation' in typed_ast.ast35.Assign._fields:
-    files.append('check-newsyntax.test')
-
-if 'contains_underscores' in typed_ast.ast35.Num._fields:
-    files.append('check-underscores.test')
-
-
-class TypeCheckSuite(DataSuite):
-    def __init__(self, *, update_data: bool = False) -> None:
-        self.update_data = update_data
-
-    @classmethod
-    def cases(cls) -> List[DataDrivenTestCase]:
-        c = []  # type: List[DataDrivenTestCase]
-        for f in files:
-            c += parse_test_cases(os.path.join(test_data_prefix, f),
-                                  None, test_temp_dir, True)
-        return c
-
-    def run_case(self, testcase: DataDrivenTestCase) -> None:
-        incremental = 'incremental' in testcase.name.lower() or 'incremental' in testcase.file
-        optional = 'optional' in testcase.file
-        if incremental:
-            # Incremental tests are run once with a cold cache, once with a warm cache.
-            # Expect success on first run, errors from testcase.output (if any) on second run.
-            # We briefly sleep to make sure file timestamps are distinct.
-            self.clear_cache()
-            self.run_case_once(testcase, 1)
-            self.run_case_once(testcase, 2)
-        elif optional:
-            try:
-                experiments.STRICT_OPTIONAL = True
-                self.run_case_once(testcase)
-            finally:
-                experiments.STRICT_OPTIONAL = False
-        else:
-            try:
-                old_strict_optional = experiments.STRICT_OPTIONAL
-                self.run_case_once(testcase)
-            finally:
-                experiments.STRICT_OPTIONAL = old_strict_optional
-
-    def clear_cache(self) -> None:
-        dn = defaults.CACHE_DIR
-
-        if os.path.exists(dn):
-            shutil.rmtree(dn)
-
-    def run_case_once(self, testcase: DataDrivenTestCase, incremental: int = 0) -> None:
-        find_module_clear_caches()
-        original_program_text = '\n'.join(testcase.input)
-        module_data = self.parse_module(original_program_text, incremental)
-
-        if incremental:
-            if incremental == 1:
-                # In run 1, copy program text to program file.
-                for module_name, program_path, program_text in module_data:
-                    if module_name == '__main__':
-                        with open(program_path, 'w') as f:
-                            f.write(program_text)
-                        break
-            elif incremental == 2:
-                # In run 2, copy *.next files to * files.
-                for dn, dirs, files in os.walk(os.curdir):
-                    for file in files:
-                        if file.endswith('.next'):
-                            full = os.path.join(dn, file)
-                            target = full[:-5]
-                            shutil.copy(full, target)
-
-                            # In some systems, mtime has a resolution of 1 second which can cause
-                            # annoying-to-debug issues when a file has the same size after a
-                            # change. We manually set the mtime to circumvent this.
-                            new_time = os.stat(target).st_mtime + 1
-                            os.utime(target, times=(new_time, new_time))
-
-        # Parse options after moving files (in case mypy.ini is being moved).
-        options = self.parse_options(original_program_text, testcase)
-        options.use_builtins_fixtures = True
-        options.show_traceback = True
-        if 'optional' in testcase.file:
-            options.strict_optional = True
-        if incremental:
-            options.incremental = True
-        if os.path.split(testcase.file)[1] in fast_parser_files:
-            options.fast_parser = True
-
-        sources = []
-        for module_name, program_path, program_text in module_data:
-            # Always set to none so we're forced to reread the module in incremental mode
-            sources.append(BuildSource(program_path, module_name,
-                                       None if incremental else program_text))
-        res = None
-        try:
-            res = build.build(sources=sources,
-                              options=options,
-                              alt_lib_path=test_temp_dir)
-            a = res.errors
-        except CompileError as e:
-            a = e.messages
-        a = normalize_error_messages(a)
-
-        # Make sure error messages match
-        if incremental == 0:
-            msg = 'Invalid type checker output ({}, line {})'
-            output = testcase.output
-        elif incremental == 1:
-            msg = 'Invalid type checker output in incremental, run 1 ({}, line {})'
-            output = testcase.output
-        elif incremental == 2:
-            msg = 'Invalid type checker output in incremental, run 2 ({}, line {})'
-            output = testcase.output2
-        else:
-            raise AssertionError()
-
-        if output != a and self.update_data:
-            update_testcase_output(testcase, a)
-        assert_string_arrays_equal(output, a, msg.format(testcase.file, testcase.line))
-
-        if incremental and res:
-            if options.follow_imports == 'normal' and testcase.output is None:
-                self.verify_cache(module_data, a, res.manager)
-            if incremental == 2:
-                self.check_module_equivalence(
-                    'rechecked',
-                    testcase.expected_rechecked_modules,
-                    res.manager.rechecked_modules)
-                self.check_module_equivalence(
-                    'stale',
-                    testcase.expected_stale_modules,
-                    res.manager.stale_modules)
-
-    def check_module_equivalence(self, name: str,
-                                 expected: Optional[Set[str]], actual: Set[str]) -> None:
-        if expected is not None:
-            assert_string_arrays_equal(
-                list(sorted(expected)),
-                list(sorted(actual.difference({"__main__"}))),
-                'Set of {} modules does not match expected set'.format(name))
-
-    def verify_cache(self, module_data: List[Tuple[str, str, str]], a: List[str],
-                     manager: build.BuildManager) -> None:
-        # There should be valid cache metadata for each module except
-        # those in error_paths; for those there should not be.
-        #
-        # NOTE: When A imports B and there's an error in B, the cache
-        # data for B is invalidated, but the cache data for A remains.
-        # However build.process_graphs() will ignore A's cache data.
-        #
-        # Also note that when A imports B, and there's an error in A
-        # _due to a valid change in B_, the cache data for B will be
-        # invalidated and updated, but the old cache data for A will
-        # remain unchanged. As before, build.process_graphs() will
-        # ignore A's (old) cache data.
-        error_paths = self.find_error_paths(a)
-        modules = self.find_module_files()
-        modules.update({module_name: path for module_name, path, text in module_data})
-        missing_paths = self.find_missing_cache_files(modules, manager)
-        if not missing_paths.issubset(error_paths):
-            raise AssertionFailure("cache data discrepancy %s != %s" %
-                                   (missing_paths, error_paths))
-
-    def find_error_paths(self, a: List[str]) -> Set[str]:
-        hits = set()
-        for line in a:
-            m = re.match(r'([^\s:]+):\d+: error:', line)
-            if m:
-                p = m.group(1).replace('/', os.path.sep)
-                hits.add(p)
-        return hits
-
-    def find_module_files(self) -> Dict[str, str]:
-        modules = {}
-        for dn, dirs, files in os.walk(test_temp_dir):
-            dnparts = dn.split(os.sep)
-            assert dnparts[0] == test_temp_dir
-            del dnparts[0]
-            for file in files:
-                if file.endswith('.py'):
-                    if file == "__init__.py":
-                        # If the file path is `a/b/__init__.py`, exclude the file name
-                        # and make sure the module id is just `a.b`, not `a.b.__init__`.
-                        id = '.'.join(dnparts)
-                    else:
-                        base, ext = os.path.splitext(file)
-                        id = '.'.join(dnparts + [base])
-                    modules[id] = os.path.join(dn, file)
-        return modules
-
-    def find_missing_cache_files(self, modules: Dict[str, str],
-                                 manager: build.BuildManager) -> Set[str]:
-        missing = {}
-        for id, path in modules.items():
-            meta = build.find_cache_meta(id, path, manager)
-            if not build.is_meta_fresh(meta, id, path, manager):
-                missing[id] = path
-        return set(missing.values())
-
-    def parse_module(self, program_text: str, incremental: int = 0) -> List[Tuple[str, str, str]]:
-        """Return the module and program names for a test case.
-
-        Normally, the unit tests will parse the default ('__main__')
-        module and follow all the imports listed there. You can override
-        this behavior and instruct the tests to check multiple modules
-        by using a comment like this in the test case input:
-
-          # cmd: mypy -m foo.bar foo.baz
-
-        Return a list of tuples (module name, file name, program text).
-        """
-        m = re.search('# cmd: mypy -m ([a-zA-Z0-9_. ]+)$', program_text, flags=re.MULTILINE)
-        m2 = re.search('# cmd2: mypy -m ([a-zA-Z0-9_. ]+)$', program_text, flags=re.MULTILINE)
-        if m2 is not None and incremental == 2:
-            # Optionally return a different command if in the second
-            # stage of incremental mode, otherwise default to reusing
-            # the original cmd.
-            m = m2
-
-        if m:
-            # The test case wants to use a non-default main
-            # module. Look up the module and give it as the thing to
-            # analyze.
-            module_names = m.group(1)
-            out = []
-            for module_name in module_names.split(' '):
-                path = build.find_module(module_name, [test_temp_dir])
-                with open(path) as f:
-                    program_text = f.read()
-                out.append((module_name, path, program_text))
-            return out
-        else:
-            return [('__main__', 'main', program_text)]
-
-    def parse_options(self, program_text: str, testcase: DataDrivenTestCase) -> Options:
-        options = Options()
-        flags = re.search('# flags: (.*)$', program_text, flags=re.MULTILINE)
-
-        flag_list = None
-        if flags:
-            flag_list = flags.group(1).split()
-            targets, options = process_options(flag_list, require_targets=False)
-            if targets:
-                # TODO: support specifying targets via the flags pragma
-                raise RuntimeError('Specifying targets via the flags pragma is not supported.')
-        else:
-            options = Options()
-
-        # Allow custom python version to override testcase_pyversion
-        if (not flag_list or
-                all(flag not in flag_list for flag in ['--python-version', '-2', '--py2'])):
-            options.python_version = testcase_pyversion(testcase.file, testcase.name)
-
-        return options
diff --git a/mypy/test/testcmdline.py b/mypy/test/testcmdline.py
deleted file mode 100644
index f2ddc9b..0000000
--- a/mypy/test/testcmdline.py
+++ /dev/null
@@ -1,104 +0,0 @@
-"""Test cases for the command line.
-
-To begin we test that "mypy <directory>[/]" always recurses down the
-whole tree.
-"""
-
-import os
-import re
-import subprocess
-import sys
-
-from typing import Tuple, List, Dict, Set
-
-from mypy.myunit import Suite, SkipTestCaseException, AssertionFailure
-from mypy.test.config import test_data_prefix, test_temp_dir
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test.helpers import assert_string_arrays_equal
-from mypy.version import __version__, base_version
-
-# Path to Python 3 interpreter
-python3_path = sys.executable
-
-# Files containing test case descriptions.
-cmdline_files = ['cmdline.test']
-
-
-class PythonEvaluationSuite(Suite):
-
-    def cases(self) -> List[DataDrivenTestCase]:
-        c = []  # type: List[DataDrivenTestCase]
-        for f in cmdline_files:
-            c += parse_test_cases(os.path.join(test_data_prefix, f),
-                                  test_python_evaluation,
-                                  base_path=test_temp_dir,
-                                  optional_out=True,
-                                  native_sep=True)
-        return c
-
-
-def test_python_evaluation(testcase: DataDrivenTestCase) -> None:
-    # Write the program to a file.
-    program = '_program.py'
-    program_path = os.path.join(test_temp_dir, program)
-    with open(program_path, 'w') as file:
-        for s in testcase.input:
-            file.write('{}\n'.format(s))
-    args = parse_args(testcase.input[0])
-    args.append('--show-traceback')
-    # Type check the program.
-    fixed = [python3_path,
-             os.path.join(testcase.old_cwd, 'scripts', 'mypy')]
-    process = subprocess.Popen(fixed + args,
-                               stdout=subprocess.PIPE,
-                               stderr=subprocess.STDOUT,
-                               cwd=test_temp_dir)
-    outb = process.stdout.read()
-    # Split output into lines.
-    out = [s.rstrip('\n\r') for s in str(outb, 'utf8').splitlines()]
-    # Remove temp file.
-    os.remove(program_path)
-    # Compare actual output to expected.
-    if testcase.output_files:
-        for path, expected_content in testcase.output_files:
-            if not os.path.exists(path):
-                raise AssertionFailure(
-                    'Expected file {} was not produced by test case'.format(path))
-            with open(path, 'r') as output_file:
-                actual_output_content = output_file.read().splitlines()
-            noramlized_output = normalize_file_output(actual_output_content,
-                                                      os.path.abspath(test_temp_dir))
-            assert_string_arrays_equal(expected_content.splitlines(), noramlized_output,
-                                       'Output file {} did not match its expected output'.format(
-                                           path))
-    else:
-        assert_string_arrays_equal(testcase.output, out,
-                                   'Invalid output ({}, line {})'.format(
-                                       testcase.file, testcase.line))
-
-
-def parse_args(line: str) -> List[str]:
-    """Parse the first line of the program for the command line.
-
-    This should have the form
-
-      # cmd: mypy <options>
-
-    For example:
-
-      # cmd: mypy pkg/
-    """
-    m = re.match('# cmd: mypy (.*)$', line)
-    if not m:
-        return []  # No args; mypy will spit out an error.
-    return m.group(1).split()
-
-
-def normalize_file_output(content: List[str], current_abs_path: str) -> List[str]:
-    """Normalize file output for comparison."""
-    timestamp_regex = re.compile('\d{10}')
-    result = [x.replace(current_abs_path, '$PWD') for x in content]
-    result = [x.replace(__version__, '$VERSION') for x in result]
-    result = [x.replace(base_version, '$VERSION') for x in result]
-    result = [timestamp_regex.sub('$TIMESTAMP', x) for x in result]
-    return result
diff --git a/mypy/test/testextensions.py b/mypy/test/testextensions.py
deleted file mode 100644
index af3916f..0000000
--- a/mypy/test/testextensions.py
+++ /dev/null
@@ -1,125 +0,0 @@
-import sys
-import pickle
-import typing
-try:
-    import collections.abc as collections_abc
-except ImportError:
-    import collections as collections_abc  # type: ignore # PY32 and earlier
-from unittest import TestCase, main, skipUnless
-sys.path[0:0] = ['extensions']
-from mypy_extensions import TypedDict
-
-
-class BaseTestCase(TestCase):
-
-    def assertIsSubclass(self, cls, class_or_tuple, msg=None):
-        if not issubclass(cls, class_or_tuple):
-            message = '%r is not a subclass of %r' % (cls, class_or_tuple)
-            if msg is not None:
-                message += ' : %s' % msg
-            raise self.failureException(message)
-
-    def assertNotIsSubclass(self, cls, class_or_tuple, msg=None):
-        if issubclass(cls, class_or_tuple):
-            message = '%r is a subclass of %r' % (cls, class_or_tuple)
-            if msg is not None:
-                message += ' : %s' % msg
-            raise self.failureException(message)
-
-
-PY36 = sys.version_info[:2] >= (3, 6)
-
-PY36_TESTS = """
-Label = TypedDict('Label', [('label', str)])
-
-class Point2D(TypedDict):
-    x: int
-    y: int
-
-class LabelPoint2D(Point2D, Label): ...
-"""
-
-if PY36:
-    exec(PY36_TESTS)
-
-
-class TypedDictTests(BaseTestCase):
-
-    def test_basics_iterable_syntax(self):
-        Emp = TypedDict('Emp', {'name': str, 'id': int})
-        self.assertIsSubclass(Emp, dict)
-        self.assertIsSubclass(Emp, typing.MutableMapping)
-        self.assertNotIsSubclass(Emp, collections_abc.Sequence)
-        jim = Emp(name='Jim', id=1)
-        self.assertIs(type(jim), dict)
-        self.assertEqual(jim['name'], 'Jim')
-        self.assertEqual(jim['id'], 1)
-        self.assertEqual(Emp.__name__, 'Emp')
-        self.assertEqual(Emp.__module__, 'mypy.test.testextensions')
-        self.assertEqual(Emp.__bases__, (dict,))
-        self.assertEqual(Emp.__annotations__, {'name': str, 'id': int})
-
-    def test_basics_keywords_syntax(self):
-        Emp = TypedDict('Emp', name=str, id=int)
-        self.assertIsSubclass(Emp, dict)
-        self.assertIsSubclass(Emp, typing.MutableMapping)
-        self.assertNotIsSubclass(Emp, collections_abc.Sequence)
-        jim = Emp(name='Jim', id=1)  # type: ignore # mypy doesn't support keyword syntax yet
-        self.assertIs(type(jim), dict)
-        self.assertEqual(jim['name'], 'Jim')
-        self.assertEqual(jim['id'], 1)
-        self.assertEqual(Emp.__name__, 'Emp')
-        self.assertEqual(Emp.__module__, 'mypy.test.testextensions')
-        self.assertEqual(Emp.__bases__, (dict,))
-        self.assertEqual(Emp.__annotations__, {'name': str, 'id': int})
-
-    def test_typeddict_errors(self):
-        Emp = TypedDict('Emp', {'name': str, 'id': int})
-        self.assertEqual(TypedDict.__module__, 'mypy_extensions')
-        jim = Emp(name='Jim', id=1)
-        with self.assertRaises(TypeError):
-            isinstance({}, Emp)
-        with self.assertRaises(TypeError):
-            isinstance(jim, Emp)
-        with self.assertRaises(TypeError):
-            issubclass(dict, Emp)
-        with self.assertRaises(TypeError):
-            TypedDict('Hi', x=1)
-        with self.assertRaises(TypeError):
-            TypedDict('Hi', [('x', int), ('y', 1)])
-        with self.assertRaises(TypeError):
-            TypedDict('Hi', [('x', int)], y=int)
-
-    @skipUnless(PY36, 'Python 3.6 required')
-    def test_py36_class_syntax_usage(self):
-        self.assertEqual(LabelPoint2D.__annotations__, {'x': int, 'y': int, 'label': str})  # noqa
-        self.assertEqual(LabelPoint2D.__bases__, (dict,))  # noqa
-        self.assertNotIsSubclass(LabelPoint2D, typing.Sequence)  # noqa
-        not_origin = Point2D(x=0, y=1)  # noqa
-        self.assertEqual(not_origin['x'], 0)
-        self.assertEqual(not_origin['y'], 1)
-        other = LabelPoint2D(x=0, y=1, label='hi')  # noqa
-        self.assertEqual(other['label'], 'hi')
-
-    def test_pickle(self):
-        global EmpD  # pickle wants to reference the class by name
-        EmpD = TypedDict('EmpD', name=str, id=int)
-        jane = EmpD({'name': 'jane', 'id': 37})
-        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
-            z = pickle.dumps(jane, proto)
-            jane2 = pickle.loads(z)
-            self.assertEqual(jane2, jane)
-            self.assertEqual(jane2, {'name': 'jane', 'id': 37})
-            ZZ = pickle.dumps(EmpD, proto)
-            EmpDnew = pickle.loads(ZZ)
-            self.assertEqual(EmpDnew({'name': 'jane', 'id': 37}), jane)
-
-    def test_optional(self):
-        EmpD = TypedDict('EmpD', name=str, id=int)
-
-        self.assertEqual(typing.Optional[EmpD], typing.Union[None, EmpD])
-        self.assertNotEqual(typing.List[EmpD], typing.Tuple[EmpD])
-
-
-if __name__ == '__main__':
-    main()
diff --git a/mypy/test/testgraph.py b/mypy/test/testgraph.py
deleted file mode 100644
index d88ca1c..0000000
--- a/mypy/test/testgraph.py
+++ /dev/null
@@ -1,69 +0,0 @@
-"""Test cases for graph processing code in build.py."""
-
-from typing import AbstractSet, Dict, Set
-
-from mypy.myunit import Suite, assert_equal
-from mypy.build import BuildManager, State, BuildSourceSet
-from mypy.build import topsort, strongly_connected_components, sorted_components, order_ascc
-from mypy.version import __version__
-from mypy.options import Options
-from mypy.report import Reports
-
-
-class GraphSuite(Suite):
-
-    def test_topsort(self) -> None:
-        a = frozenset({'A'})
-        b = frozenset({'B'})
-        c = frozenset({'C'})
-        d = frozenset({'D'})
-        data = {a: {b, c}, b: {d}, c: {d}}  # type: Dict[AbstractSet[str], Set[AbstractSet[str]]]
-        res = list(topsort(data))
-        assert_equal(res, [{d}, {b, c}, {a}])
-
-    def test_scc(self) -> None:
-        vertices = {'A', 'B', 'C', 'D'}
-        edges = {'A': ['B', 'C'],
-                 'B': ['C'],
-                 'C': ['B', 'D'],
-                 'D': []}  # type: Dict[str, List[str]]
-        sccs = set(frozenset(x) for x in strongly_connected_components(vertices, edges))
-        assert_equal(sccs,
-                     {frozenset({'A'}),
-                      frozenset({'B', 'C'}),
-                      frozenset({'D'})})
-
-    def _make_manager(self) -> BuildManager:
-        manager = BuildManager(
-            data_dir='',
-            lib_path=[],
-            ignore_prefix='',
-            source_set=BuildSourceSet([]),
-            reports=Reports('', {}),
-            options=Options(),
-            version_id=__version__,
-        )
-        return manager
-
-    def test_sorted_components(self) -> None:
-        manager = self._make_manager()
-        graph = {'a': State('a', None, 'import b, c', manager),
-                 'd': State('d', None, 'pass', manager),
-                 'b': State('b', None, 'import c', manager),
-                 'c': State('c', None, 'import b, d', manager),
-                 }
-        res = sorted_components(graph)
-        assert_equal(res, [frozenset({'d'}), frozenset({'c', 'b'}), frozenset({'a'})])
-
-    def test_order_ascc(self) -> None:
-        manager = self._make_manager()
-        graph = {'a': State('a', None, 'import b, c', manager),
-                 'd': State('d', None, 'def f(): import a', manager),
-                 'b': State('b', None, 'import c', manager),
-                 'c': State('c', None, 'import b, d', manager),
-                 }
-        res = sorted_components(graph)
-        assert_equal(res, [frozenset({'a', 'd', 'c', 'b'})])
-        ascc = res[0]
-        scc = order_ascc(graph, ascc)
-        assert_equal(scc, ['d', 'c', 'b', 'a'])
diff --git a/mypy/test/testinfer.py b/mypy/test/testinfer.py
deleted file mode 100644
index 2142456..0000000
--- a/mypy/test/testinfer.py
+++ /dev/null
@@ -1,223 +0,0 @@
-"""Test cases for type inference helper functions."""
-
-from typing import List, Optional, Tuple, Union
-
-from mypy.myunit import Suite, assert_equal, assert_true
-from mypy.checkexpr import map_actuals_to_formals
-from mypy.nodes import ARG_POS, ARG_OPT, ARG_STAR, ARG_STAR2, ARG_NAMED
-from mypy.types import AnyType, TupleType, Type
-
-
-class MapActualsToFormalsSuite(Suite):
-    """Test cases for checkexpr.map_actuals_to_formals."""
-
-    def test_basic(self) -> None:
-        self.assert_map([], [], [])
-
-    def test_positional_only(self) -> None:
-        self.assert_map([ARG_POS],
-                        [ARG_POS],
-                        [[0]])
-        self.assert_map([ARG_POS, ARG_POS],
-                        [ARG_POS, ARG_POS],
-                        [[0], [1]])
-
-    def test_optional(self) -> None:
-        self.assert_map([],
-                        [ARG_OPT],
-                        [[]])
-        self.assert_map([ARG_POS],
-                        [ARG_OPT],
-                        [[0]])
-        self.assert_map([ARG_POS],
-                        [ARG_OPT, ARG_OPT],
-                        [[0], []])
-
-    def test_callee_star(self) -> None:
-        self.assert_map([],
-                        [ARG_STAR],
-                        [[]])
-        self.assert_map([ARG_POS],
-                        [ARG_STAR],
-                        [[0]])
-        self.assert_map([ARG_POS, ARG_POS],
-                        [ARG_STAR],
-                        [[0, 1]])
-
-    def test_caller_star(self) -> None:
-        self.assert_map([ARG_STAR],
-                        [ARG_STAR],
-                        [[0]])
-        self.assert_map([ARG_POS, ARG_STAR],
-                        [ARG_STAR],
-                        [[0, 1]])
-        self.assert_map([ARG_STAR],
-                        [ARG_POS, ARG_STAR],
-                        [[0], [0]])
-        self.assert_map([ARG_STAR],
-                        [ARG_OPT, ARG_STAR],
-                        [[0], [0]])
-
-    def test_too_many_caller_args(self) -> None:
-        self.assert_map([ARG_POS],
-                        [],
-                        [])
-        self.assert_map([ARG_STAR],
-                        [],
-                        [])
-        self.assert_map([ARG_STAR],
-                        [ARG_POS],
-                        [[0]])
-
-    def test_tuple_star(self) -> None:
-        self.assert_vararg_map(
-            [ARG_STAR],
-            [ARG_POS],
-            [[0]],
-            self.tuple(AnyType()))
-        self.assert_vararg_map(
-            [ARG_STAR],
-            [ARG_POS, ARG_POS],
-            [[0], [0]],
-            self.tuple(AnyType(), AnyType()))
-        self.assert_vararg_map(
-            [ARG_STAR],
-            [ARG_POS, ARG_OPT, ARG_OPT],
-            [[0], [0], []],
-            self.tuple(AnyType(), AnyType()))
-
-    def tuple(self, *args: Type) -> TupleType:
-        return TupleType(list(args), None)
-
-    def test_named_args(self) -> None:
-        self.assert_map(
-            ['x'],
-            [(ARG_POS, 'x')],
-            [[0]])
-        self.assert_map(
-            ['y', 'x'],
-            [(ARG_POS, 'x'), (ARG_POS, 'y')],
-            [[1], [0]])
-
-    def test_some_named_args(self) -> None:
-        self.assert_map(
-            ['y'],
-            [(ARG_OPT, 'x'), (ARG_OPT, 'y'), (ARG_OPT, 'z')],
-            [[], [0], []])
-
-    def test_missing_named_arg(self) -> None:
-        self.assert_map(
-            ['y'],
-            [(ARG_OPT, 'x')],
-            [[]])
-
-    def test_duplicate_named_arg(self) -> None:
-        self.assert_map(
-            ['x', 'x'],
-            [(ARG_OPT, 'x')],
-            [[0, 1]])
-
-    def test_varargs_and_bare_asterisk(self) -> None:
-        self.assert_map(
-            [ARG_STAR],
-            [ARG_STAR, (ARG_NAMED, 'x')],
-            [[0], []])
-        self.assert_map(
-            [ARG_STAR, 'x'],
-            [ARG_STAR, (ARG_NAMED, 'x')],
-            [[0], [1]])
-
-    def test_keyword_varargs(self) -> None:
-        self.assert_map(
-            ['x'],
-            [ARG_STAR2],
-            [[0]])
-        self.assert_map(
-            ['x', ARG_STAR2],
-            [ARG_STAR2],
-            [[0, 1]])
-        self.assert_map(
-            ['x', ARG_STAR2],
-            [(ARG_POS, 'x'), ARG_STAR2],
-            [[0], [1]])
-        self.assert_map(
-            [ARG_POS, ARG_STAR2],
-            [(ARG_POS, 'x'), ARG_STAR2],
-            [[0], [1]])
-
-    def test_both_kinds_of_varargs(self) -> None:
-        self.assert_map(
-            [ARG_STAR, ARG_STAR2],
-            [(ARG_POS, 'x'), (ARG_POS, 'y')],
-            [[0, 1], [0, 1]])
-
-    def test_special_cases(self) -> None:
-        self.assert_map([ARG_STAR],
-                        [ARG_STAR, ARG_STAR2],
-                        [[0], []])
-        self.assert_map([ARG_STAR, ARG_STAR2],
-                        [ARG_STAR, ARG_STAR2],
-                        [[0], [1]])
-        self.assert_map([ARG_STAR2],
-                        [(ARG_POS, 'x'), ARG_STAR2],
-                        [[0], [0]])
-        self.assert_map([ARG_STAR2],
-                        [ARG_STAR2],
-                        [[0]])
-
-    def assert_map(self,
-                   caller_kinds_: List[Union[int, str]],
-                   callee_kinds_: List[Union[int, Tuple[int, str]]],
-                   expected: List[List[int]],
-                   ) -> None:
-        caller_kinds, caller_names = expand_caller_kinds(caller_kinds_)
-        callee_kinds, callee_names = expand_callee_kinds(callee_kinds_)
-        result = map_actuals_to_formals(
-            caller_kinds,
-            caller_names,
-            callee_kinds,
-            callee_names,
-            lambda i: AnyType())
-        assert_equal(result, expected)
-
-    def assert_vararg_map(self,
-                          caller_kinds: List[int],
-                          callee_kinds: List[int],
-                          expected: List[List[int]],
-                          vararg_type: Type,
-                          ) -> None:
-        result = map_actuals_to_formals(
-            caller_kinds,
-            [],
-            callee_kinds,
-            [],
-            lambda i: vararg_type)
-        assert_equal(result, expected)
-
-
-def expand_caller_kinds(kinds_or_names: List[Union[int, str]]
-                        ) -> Tuple[List[int], List[Optional[str]]]:
-    kinds = []
-    names = []
-    for k in kinds_or_names:
-        if isinstance(k, str):
-            kinds.append(ARG_NAMED)
-            names.append(k)
-        else:
-            kinds.append(k)
-            names.append(None)
-    return kinds, names
-
-
-def expand_callee_kinds(kinds_and_names: List[Union[int, Tuple[int, str]]]
-                        ) -> Tuple[List[int], List[Optional[str]]]:
-    kinds = []
-    names = []
-    for v in kinds_and_names:
-        if isinstance(v, tuple):
-            kinds.append(v[0])
-            names.append(v[1])
-        else:
-            kinds.append(v)
-            names.append(None)
-    return kinds, names
diff --git a/mypy/test/testlex.py b/mypy/test/testlex.py
deleted file mode 100644
index fb857bd..0000000
--- a/mypy/test/testlex.py
+++ /dev/null
@@ -1,466 +0,0 @@
-"""Lexical analyzer test cases"""
-
-import typing
-
-from mypy.myunit import Suite, assert_equal
-from mypy.lex import lex
-
-
-class LexerSuite(Suite):
-    def test_empty(self):
-        self.assert_lex('', 'Eof()')
-
-    def test_keywords(self):
-        self.assert_lex(
-            'if else elif def return pass',
-            'Keyword(if) Keyword( else) Keyword( elif) Keyword( def) '
-            'Keyword( return) Keyword( pass) Break() Eof()')
-
-        self.assert_lex(
-            'from import as class global',
-            'Keyword(from) Keyword( import) Keyword( as) Keyword( class) '
-            'Keyword( global) ...')
-
-    def test_identifiers(self):
-        self.assert_lex(
-            'i x FooBar FOO_BAR __x var',
-            'Name(i) Name( x) Name( FooBar) Name( FOO_BAR) Name( __x) '
-            'Name( var) Break() Eof()')
-
-        self.assert_lex(
-            'any interface void',
-            'Name(any) Name( interface) Name( void) Break() Eof()')
-
-    def test_int_literals(self):
-        self.assert_lex(
-            '0 00 1 0987654321 10002000300040005000600070008000',
-            'IntLit(0) IntLit( 00) IntLit( 1) LexError( 0987654321) '
-            'IntLit( 10002000300040005000600070008000) Break() Eof()')
-
-    def test_hex_int_literals(self):
-        self.assert_lex('0x0 0xabcedf0189 0xAFe 0X2',
-                        'IntLit(0x0) IntLit( 0xabcedf0189) IntLit( 0xAFe) '
-                        'IntLit( 0X2) ...')
-
-    def test_oct_int_literals(self):
-        self.assert_lex('0o0 0o127 0O1',
-                        'IntLit(0o0) IntLit( 0o127) IntLit( 0O1) ...')
-
-    def test_bin_int_literals(self):
-        self.assert_lex('0b0 0b110 0B1',
-                        'IntLit(0b0) IntLit( 0b110) IntLit( 0B1) ...')
-
-    def test_float_literals(self):
-        self.assert_lex('1.2 .1 1.',
-                        'FloatLit(1.2) FloatLit( .1) FloatLit( 1.) ...')
-
-        self.assert_lex(
-            '1e2 1.2e+3 1.3e-12',
-            'FloatLit(1e2) FloatLit( 1.2e+3) FloatLit( 1.3e-12) ...')
-
-        self.assert_lex('1.e2', 'FloatLit(1.e2) ...')
-
-    def test_comments(self):
-        self.assert_lex('# foo "" bar' + '\n' + 'x #x',
-                        'Name(# foo "" bar\\nx) Break( #x) Eof()')
-
-    def test_empty_lines(self):
-        self.assert_lex(r'\n1', r'IntLit(\n1) ...')
-        self.assert_lex(r'\n\n1', r'IntLit(\n\n1) ...')
-        self.assert_lex(r'1\n\n2', r'IntLit(1) Break(\n\n) IntLit(2) ...')
-
-    def test_line_breaks(self):
-        self.assert_lex('1\\r2', 'IntLit(1) Break(\\r) IntLit(2) ...')
-        self.assert_lex('1\\r\\n2', 'IntLit(1) Break(\\r\\n) IntLit(2) ...')
-
-    def test_operators(self):
-        self.assert_lex('- + < > == != <= >= .',
-                        'Op(-) Op( +) Op( <) Op( >) Op( ==) Op( !=) Op( <=) '
-                        'Op( >=) Op( .) ...')
-
-        self.assert_lex('* / % // **',
-                        'Op(*) Op( /) Op( %) Op( //) Op( **) ...')
-
-        self.assert_lex('& | ^ ~ << >>',
-                        'Op(&) Op( |) Op( ^) Op( ~) Op( <<) Op( >>) ...')
-
-        self.assert_lex('in is and or not',
-                        'Op(in) Op( is) Op( and) Op( or) Op( not) ...')
-
-    def test_punctuators(self):
-        self.assert_lex(': = ,', 'Colon(:) Punct( =) Punct( ,) ...')
-
-        self.assert_lex(
-            '+= -= *= %= //=',
-            'Punct(+=) Punct( -=) Punct( *=) Punct( %=) Punct( //=) ...')
-        self.assert_lex('**=', 'Punct(**=) ...')
-        self.assert_lex(
-            '&= |= ^= <<= >>=',
-            'Punct(&=) Punct( |=) Punct( ^=) Punct( <<=) Punct( >>=) ...')
-
-    def test_basic_indentation(self):
-        self.assert_lex(
-            'y' + '\n' + '  x',
-            'Name(y) Break(\\n) Indent(  ) Name(x) Break() Dedent() Eof()')
-
-        self.assert_lex(
-            'y' + '\n' + '  x' + '\n' + 'z',
-            'Name(y) Break(\\n) Indent(  ) Name(x) Break(\\n) Dedent() '
-            'Name(z) Break() Eof()')
-
-    def test_multiple_indent_levels(self):
-        self.assert_lex('y' + '\n' +
-                        '  x' + '\n' +
-                        '  y' + '\n' +
-                        '    z',
-                        'Name(y) Break(\\n) ' +
-                        'Indent(  ) Name(x) Break(\\n) ' +
-                        'Name(  y) Break(\\n) ' +
-                        'Indent(    ) Name(z) Break() ' +
-                        'Dedent() Dedent() Eof()')
-
-        self.assert_lex('y' + '\n' +
-                        '  x' + '\n' +
-                        '    z' + '\n' +
-                        '  y',
-                        'Name(y) Break(\\n) ' +
-                        'Indent(  ) Name(x) Break(\\n) ' +
-                        'Indent(    ) Name(z) Break(\\n) ' +
-                        'Dedent() Name(  y) Break() ' +
-                        'Dedent() Eof()')
-
-    def test_tab_indent(self):
-        self.assert_lex('y' + '\n' +
-                        '\t' + 'x' + '\n' +
-                        '        y' + '\n' +
-                        ' ' + '\t' + 'z',
-                        'Name(y) Break(\\n) ' +
-                        'Indent(\\t) Name(x) Break(\\n) ' +
-                        'Name(        y) Break(\\n) ' +
-                        'Name( \\tz) Break() ' +
-                        'Dedent() Eof()')
-
-    def test_comment_after_dedent(self):
-        self.assert_lex('y\n'
-                        '  x\n'
-                        '# Foo\n'
-                        'z',
-                        r'Name(y) Break(\n) Indent(  ) Name(x) '
-                        r'Break(\n# Foo\n) '
-                        r'Dedent() Name(z) Break() Eof()')
-
-    def test_parens(self):
-        self.assert_lex('( x )', 'Punct(() Name( x) Punct( )) Break() Eof()')
-        self.assert_lex(
-            '( x' + '\n' + '  y )',
-            'Punct(() Name( x) Name(\\n  y) Punct( )) Break() Eof()')
-
-        self.assert_lex('()' + '\n' + ' y',
-                        'Punct(() Punct()) Break(\\n) Indent( ) Name(y) '
-                        'Break() Dedent() Eof()')
-
-        # [ ... ] and { ... }.
-        self.assert_lex(
-            '[ x' + '\n' + '  y ]',
-            'Punct([) Name( x) Name(\\n  y) Punct( ]) Break() Eof()')
-        self.assert_lex(
-            '{ x' + '\n' + '  y }',
-            'Punct({) Name( x) Name(\\n  y) Punct( }) Break() Eof()')
-
-        # Nested brackets.
-        self.assert_lex(
-            '({}' + '\n' + ' y)',
-            'Punct(() Punct({) Punct(}) Name(\\n y) Punct()) Break() Eof()')
-
-    def test_brackets_and_line_breaks(self):
-        # This used to fail.
-        self.assert_lex('{}' + '\n' + '1',
-                        'Punct({) Punct(}) Break(\\n) IntLit(1) Break() Eof()')
-
-    def test_str_literals(self):
-        self.assert_lex("'' 'foo_bar'",
-                        "StrLit('') StrLit( 'foo_bar') Break() Eof()")
-        self.assert_lex('"" "foo_bar"',
-                        'StrLit("") StrLit( "foo_bar") Break() Eof()')
-
-        self.assert_lex('"\\"" 1', 'StrLit("\\"") IntLit( 1) Break() Eof()')
-        self.assert_lex("'\\'' 1", "StrLit('\\'') IntLit( 1) Break() Eof()")
-
-        self.assert_lex('"\\\\" 1', 'StrLit("\\\\") IntLit( 1) Break() Eof()')
-        self.assert_lex("'\\\\' 1", "StrLit('\\\\') IntLit( 1) Break() Eof()")
-
-    def test_triple_quoted_string_literals(self):
-        # Single-line
-
-        self.assert_lex("''''''", "StrLit('''''') ...")
-        self.assert_lex("1 '''x''y'''1",
-                        "IntLit(1) StrLit( '''x''y''') IntLit(1) ...")
-
-        self.assert_lex('""""""', 'StrLit("""""") ...')
-        self.assert_lex('"""x""y"""', 'StrLit("""x""y""") ...')
-
-        # Multiple-line
-
-        self.assert_lex("'''" + '\n' + "'''", "StrLit('''\\n''') ...")
-        self.assert_lex("'''x''" + '\n' + "''x'''",
-                        "StrLit('''x''\\n''x''') ...")
-        self.assert_lex("'''''" + '\n' + "'''''",
-                        "StrLit('''''\\n''') StrLit('') ...")
-        self.assert_lex("'''x" + '\n' + 'xyz' + '\n' + "''x'''",
-                        "StrLit('''x\\nxyz\\n''x''') ...")
-
-        self.assert_lex('"""x' + '\n' + 'y"""', 'StrLit("""x\\ny""") ...')
-
-    def test_unicode_literals(self):
-        self.assert_lex("u'' u'foo'",
-                        "UnicodeLit(u'') UnicodeLit( u'foo') ...")
-        self.assert_lex('u"" u"foo"',
-                        'UnicodeLit(u"") UnicodeLit( u"foo") ...')
-        self.assert_lex('ur"" ur"foo"',
-                        'UnicodeLit(ur"") UnicodeLit( ur"foo") ...')
-        self.assert_lex('u"""foo\n"""',
-                        r'UnicodeLit(u"""foo\n""") ...')
-
-    def test_unicode_literal_capital_u(self):
-        self.assert_lex("U'foo'", "UnicodeLit(U'foo') ...")
-
-    def test_semicolons(self):
-        self.assert_lex('a;b', 'Name(a) Break(;) Name(b) ...')
-        self.assert_lex('a;', 'Name(a) Break(;) Eof()')
-
-        self.assert_lex(';a', 'Break(;) Name(a) ...')
-        self.assert_lex('a;;b', 'Name(a) Break(;) Break(;) Name(b) ...')
-
-    def test_raw_string(self):
-        self.assert_lex("r'' r'foo bar'",
-                        "StrLit(r'') StrLit( r'foo bar') ...")
-        self.assert_lex('r"" r"foo bar"',
-                        'StrLit(r"") StrLit( r"foo bar") ...')
-
-        self.assert_lex("r'\\x\\''", "StrLit(r'\\x\\'') ...")
-        self.assert_lex('r"\\x\\""', 'StrLit(r"\\x\\"") ...')
-
-        self.assert_lex("r'\\\\' ''", "StrLit(r'\\\\') StrLit( '') ...")
-        self.assert_lex('r"\\\\" ""', 'StrLit(r"\\\\") StrLit( "") ...')
-
-        self.assert_lex("r'''" + '\n' + "x'''", "StrLit(r'''\\nx''') ...")
-
-    def test_raw_string_with_capital_r(self):
-        self.assert_lex("R'foo'", "StrLit(R'foo') ...")
-
-    def test_escapes_in_triple_quoted_literals(self):
-        self.assert_lex(r"'''\''''",
-                        r"StrLit('''\'''') ...")
-        self.assert_lex(r'"""\""""',
-                        r'StrLit("""\"""") ...')
-        self.assert_lex(r'"""\\"""',
-                        r'StrLit("""\\""") ...')
-
-    def test_escapes_in_triple_quoted_raw_literals(self):
-        self.assert_lex(r"r'''\''''",
-                        r"StrLit(r'''\'''') ...")
-        self.assert_lex(r"r'''\\'''",
-                        r"StrLit(r'''\\''') ...")
-        self.assert_lex(r'r"""\""""',
-                        r'StrLit(r"""\"""") ...')
-
-    def test_bytes(self):
-        self.assert_lex("b'\\'' b'foo bar'",
-                        "BytesLit(b'\\'') BytesLit( b'foo bar') ...")
-        self.assert_lex('b"\\"" b"foo bar"',
-                        'BytesLit(b"\\"") BytesLit( b"foo bar") ...')
-
-        self.assert_lex("b'''" + '\n' + " x'''", "BytesLit(b'''\\n x''') ...")
-
-    def test_bytes_with_capital_b(self):
-        self.assert_lex("B'foo'", "BytesLit(B'foo') ...")
-
-    def test_raw_bytes(self):
-        self.assert_lex("br'x\\x\\''", "BytesLit(br'x\\x\\'') ...")
-        self.assert_lex('br"x\\y\\""', 'BytesLit(br"x\\y\\"") ...')
-
-        self.assert_lex('br"""' + '\n' + 'x"""', 'BytesLit(br"""\\nx""") ...')
-
-    def test_raw_bytes_alternative(self):
-        self.assert_lex("rb'x\\x\\''", "BytesLit(rb'x\\x\\'') ...")
-
-    def test_backslash(self):
-        self.assert_lex('a\\' + '\n' + ' b', 'Name(a) Name(\\\\n b) ...')
-        self.assert_lex(
-            'a = \\' + '\n' + ' 1' + '\n' + '=',
-            'Name(a) Punct( =) IntLit( \\\\n 1) Break(\\n) Punct(=) ...')
-
-    def test_backslash_in_string(self):
-        self.assert_lex("'foo\\" + '\n' + "bar'", "StrLit('foo\\\\nbar') ...")
-        self.assert_lex("'foo\\" + '\n' + ' zar\\' + '\n' + "  bar'",
-                        "StrLit('foo\\\\n zar\\\\n  bar') ...")
-
-        self.assert_lex('"foo\\' + '\n' + 'bar"', 'StrLit("foo\\\\nbar") ...')
-
-    def test_backslash_in_raw_string(self):
-        self.assert_lex("r'a\\" + '\n' + "b\\'1",
-                        "StrLit(r'a\\\\nb\\') IntLit(1) ...")
-        self.assert_lex("r'a\\" + '\n' + '-\\' + '\n' + "b\\'1",
-                        "StrLit(r'a\\\\n-\\\\nb\\') IntLit(1) ...")
-        self.assert_lex('r"a\\' + '\n' + 'b\\"1',
-                        'StrLit(r"a\\\\nb\\") IntLit(1) ...')
-        self.assert_lex('r"a\\' + '\n' + '-\\' + '\n' + 'b\\"1',
-                        'StrLit(r"a\\\\n-\\\\nb\\") IntLit(1) ...')
-
-    def test_final_dedent(self):
-        self.assert_lex(
-            '1' + '\n' + ' 1' + '\n',
-            'IntLit(1) Break(\\n) Indent( ) IntLit(1) Break(\\n) Dedent() Eof()')
-
-    def test_empty_line(self):
-        self.assert_lex('1' + '\n' + ' 1' + '\n' + '\n',
-                        r'IntLit(1) Break(\n) Indent( ) IntLit(1) '
-                        r'Break(\n\n) Dedent() Eof()')
-
-    def test_comments_and_indents(self):
-        self.assert_lex('1' + '\n' + ' #x' + '\n' + ' y',
-                        r'IntLit(1) Break(\n #x\n) Indent( ) Name(y) '
-                        r'Break() Dedent() Eof()')
-        self.assert_lex('1' + '\n' + '#x' + '\n' + ' y',
-                        r'IntLit(1) Break(\n#x\n) Indent( ) Name(y) '
-                        r'Break() Dedent() Eof()')
-
-    def test_form_feed(self):
-        self.assert_lex('\x0c' + '\n' + 'x', 'Name(\x0c\\nx) ...')
-
-    def test_comment_after_linebreak(self):
-        self.assert_lex('1\n# foo\n2',
-                        'IntLit(1) Break(\\n# foo\\n) IntLit(2) ...')
-        self.assert_lex('1\n# foo',
-                        'IntLit(1) Break(\\n# foo) Eof()')
-
-    def test_line_numbers(self):
-        self.assert_line('a\\nb', [1, 1, 2, 2, 2])
-
-        self.assert_line('(\\nb)', [1, 2, 2])  # Note: omit break and eof tokens
-
-        self.assert_line('a\\n b', [1, 1,      # a, break
-                                    2, 2, 2,   # indent, b, break
-                                    2, 2])     # dedent, break
-        self.assert_line('a\\n b\\nc', [1, 1,       # a, break
-                                        2, 2, 2,    # indent, b, break
-                                        3, 3])      # dedent, c
-
-        self.assert_line('a\\rb', [1, 1, 2])
-        self.assert_line('a\\r\\nb', [1, 1, 2])
-
-        self.assert_line('"""x""" 1', [1, 1])
-        self.assert_line('"""x\\ny""" 1', [1, 2])
-        self.assert_line('"""x\\r\\ny""" 1', [1, 2])
-        self.assert_line('"""x\\ry""" 1', [1, 2])
-        self.assert_line('"""x\\n\\ny""" 1', [1, 3])
-        self.assert_line('\\n"""x\\ny""" 1', [2, 3])
-
-        self.assert_line('"x" 1', [1, 1])
-        self.assert_line('"\\\\n" 1', [1, 2])
-        self.assert_line('"\\\\nx\\\\n" 1', [1, 3])
-
-        self.assert_line('r"x" 1', [1, 1])
-        self.assert_line('r"\\\\n" 1', [1, 2])
-        self.assert_line('r"\\\\nx\\\\n" 1', [1, 3])
-
-    def test_backslash_line(self):
-        self.assert_line('a\\\\n 1\\n=', [1, 2, 2, 3])
-
-    def test_invalid_parens(self):
-        self.assert_lex('([\\n )\\n1',
-                        'Punct(() Punct([) Punct(\\n )) IntLit(\\n1) ...')
-        self.assert_lex('])', 'Punct(]) Punct()) ...')
-        self.assert_lex('(]\\n )', 'Punct(() Punct(]) Punct(\\n )) ...')
-        self.assert_lex('(\\n ])', 'Punct(() Punct(\\n ]) Punct()) ...')
-
-    def test_invalid_indent(self):
-        self.assert_lex('x\\n  y\\n z',
-                        'Name(x) Break(\\n) Indent(  ) Name(y) ' +
-                        'Break(\\n) Dedent() LexError( ) Name(z) ...')
-
-    def test_invalid_backslash(self):
-        self.assert_lex('\\ \\nx', 'LexError(\\) Break( \\n) Name(x) ...')
-        self.assert_lex('\\ \\nx', 'LexError(\\) Break( \\n) Name(x) ...')
-
-    def test_non_terminated_string_literal(self):
-        self.assert_lex("'", 'LexError(\') ...')
-        self.assert_lex("'\\na", 'LexError(\') Break(\\n) Name(a) ...')
-
-        self.assert_lex('"', 'LexError(") ...')
-        self.assert_lex('"\\na', 'LexError(") Break(\\n) Name(a) ...')
-
-        self.assert_lex("r'", 'LexError(r\') ...')
-        self.assert_lex('r"', 'LexError(r") ...')
-
-        self.assert_lex('"""', 'LexError(""") ...')
-        self.assert_lex('"""\\n', 'LexError("""\\n) ...')
-
-        self.assert_lex("'''", "LexError(''') ...")
-        self.assert_lex("'''\\n", "LexError('''\\n) ...")
-
-        self.assert_lex("'\\", 'LexError(\'\\) ...')
-        self.assert_lex("'\\\\n", 'LexError(\'\\\\n) ...')
-        self.assert_lex("r'\\", 'LexError(r\'\\) ...')
-        self.assert_lex("r'\\\\n", 'LexError(r\'\\\\n) ...')
-
-    def test_invalid_hex_int_literals(self):
-        self.assert_lex('0x', 'LexError(  ) ...')
-        self.assert_lex('0xax', 'LexError(    ) ...')
-
-    def test_latin1_encoding(self):
-        self.assert_lex(b'# coding: latin1\n"\xbb"',
-                        'StrLit(# coding: latin1\\n"\xbb") Break() Eof()')
-
-    def test_utf8_encoding(self):
-        self.assert_lex('"\xbb"'.encode('utf8'),
-                        'StrLit("\xbb") Break() Eof()')
-        self.assert_lex(b'"\xbb"',
-                        "LexError('utf8' codec can't decode byte 187 in column 2) "
-                        'Break() Eof()')
-        self.assert_lex(b'\n"abcde\xbc"',
-                        "LexError('utf8' codec can't decode byte 188 in column 7) "
-                        'Break() Eof()')
-
-    def test_byte_order_mark(self):
-        self.assert_lex('\ufeff"\xbb"'.encode('utf8'),
-                        'Bom(\ufeff) StrLit("\xbb") Break() Eof()')
-
-    def test_long_comment(self):
-        prog = '# pass\n' * 1000
-        self.assert_lex(prog, 'Eof(%s)' % repr(prog)[1:-1])
-
-    # TODO
-    #   invalid escape sequences in string literals etc.
-
-    def assert_lex(self, src, lexed):
-        if isinstance(src, str):
-            src = src.replace('\\n', '\n')
-            src = src.replace('\\r', '\r')
-
-        if lexed.endswith(' ...'):
-            lexed = lexed[:-3] + 'Break() Eof()'
-
-        l = lex(src)[0]
-        r = []
-        for t in l:
-            r.append(str(t))
-        act = ' '.join(r)
-        if act != lexed:
-            print('Actual:  ', act)
-            print('Expected:', lexed)
-        assert_equal(act, lexed)
-
-    def assert_line(self, s, a):
-        s = s.replace('\\n', '\n')
-        s = s.replace('\\r', '\r')
-
-        tt = lex(s)[0]
-        r = []
-        for t in tt:
-            r.append(t.line)
-        if len(r) == len(a) + 2:
-            a = a[:]
-            a.append(a[-1])
-            a.append(a[-1])
-        assert_equal(r, a)
diff --git a/mypy/test/testmoduleinfo.py b/mypy/test/testmoduleinfo.py
deleted file mode 100644
index 5818479..0000000
--- a/mypy/test/testmoduleinfo.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from mypy import moduleinfo
-from mypy.myunit import (
-    Suite, assert_equal, assert_true, assert_false
-)
-
-
-class ModuleInfoSuite(Suite):
-    def test_is_in_module_collection(self) -> None:
-        assert_true(moduleinfo.is_in_module_collection({'foo'}, 'foo'))
-        assert_true(moduleinfo.is_in_module_collection({'foo'}, 'foo.bar'))
-        assert_false(moduleinfo.is_in_module_collection({'foo'}, 'fo'))
-        assert_true(moduleinfo.is_in_module_collection({'foo.bar'}, 'foo.bar'))
-        assert_true(moduleinfo.is_in_module_collection({'foo.bar'}, 'foo.bar.zar'))
-        assert_false(moduleinfo.is_in_module_collection({'foo.bar'}, 'foo'))
diff --git a/mypy/test/testparse.py b/mypy/test/testparse.py
deleted file mode 100644
index d6789c0..0000000
--- a/mypy/test/testparse.py
+++ /dev/null
@@ -1,79 +0,0 @@
-"""Tests for the mypy parser."""
-
-import os.path
-
-from typing import List
-
-from mypy import defaults
-from mypy.myunit import Suite, AssertionFailure
-from mypy.test.helpers import assert_string_arrays_equal
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test import config
-from mypy.parse import parse
-from mypy.errors import CompileError
-from mypy.options import Options
-
-
-class ParserSuite(Suite):
-    parse_files = ['parse.test',
-                   'parse-python2.test']
-
-    def cases(self) -> List[DataDrivenTestCase]:
-        # The test case descriptions are stored in data files.
-        c = []  # type: List[DataDrivenTestCase]
-        for f in self.parse_files:
-            c += parse_test_cases(
-                os.path.join(config.test_data_prefix, f), test_parser)
-        return c
-
-
-def test_parser(testcase: DataDrivenTestCase) -> None:
-    """Perform a single parser test case.
-
-    The argument contains the description of the test case.
-    """
-    options = Options()
-
-    if testcase.file.endswith('python2.test'):
-        options.python_version = defaults.PYTHON2_VERSION
-    else:
-        options.python_version = defaults.PYTHON3_VERSION
-
-    try:
-        n = parse(bytes('\n'.join(testcase.input), 'ascii'),
-                  fnam='main',
-                  errors=None,
-                  options=options)
-        a = str(n).split('\n')
-    except CompileError as e:
-        a = e.messages
-    assert_string_arrays_equal(testcase.output, a,
-                               'Invalid parser output ({}, line {})'.format(
-                                   testcase.file, testcase.line))
-
-
-# The file name shown in test case output. This is displayed in error
-# messages, and must match the file name in the test case descriptions.
-INPUT_FILE_NAME = 'file'
-
-
-class ParseErrorSuite(Suite):
-    def cases(self) -> List[DataDrivenTestCase]:
-        # Test case descriptions are in an external file.
-        return parse_test_cases(os.path.join(config.test_data_prefix,
-                                             'parse-errors.test'),
-                                test_parse_error)
-
-
-def test_parse_error(testcase: DataDrivenTestCase) -> None:
-    try:
-        # Compile temporary file. The test file contains non-ASCII characters.
-        parse(bytes('\n'.join(testcase.input), 'utf-8'), INPUT_FILE_NAME, None, Options())
-        raise AssertionFailure('No errors reported')
-    except CompileError as e:
-        # Verify that there was a compile error and that the error messages
-        # are equivalent.
-        assert_string_arrays_equal(
-            testcase.output, e.messages,
-            'Invalid compiler output ({}, line {})'.format(testcase.file,
-                                                           testcase.line))
diff --git a/mypy/test/testpythoneval.py b/mypy/test/testpythoneval.py
deleted file mode 100644
index cc598d2..0000000
--- a/mypy/test/testpythoneval.py
+++ /dev/null
@@ -1,135 +0,0 @@
-"""Test cases for running mypy programs using a Python interpreter.
-
-Each test case type checks a program then runs it using Python. The
-output (stdout) of the program is compared to expected output. Type checking
-uses full builtins and other stubs.
-
-Note: Currently Python interpreter paths are hard coded.
-
-Note: These test cases are *not* included in the main test suite, as including
-      this suite would slow down the main suite too much.
-"""
-
-from contextlib import contextmanager
-import errno
-import os
-import os.path
-import re
-import subprocess
-import sys
-
-import typing
-from typing import Dict, List, Tuple
-
-from mypy.myunit import Suite, SkipTestCaseException
-from mypy.test.config import test_data_prefix, test_temp_dir
-from mypy.test.data import DataDrivenTestCase, parse_test_cases
-from mypy.test.helpers import assert_string_arrays_equal
-from mypy.util import try_find_python2_interpreter
-
-
-# Files which contain test case descriptions.
-python_eval_files = ['pythoneval.test',
-                     'python2eval.test']
-
-python_34_eval_files = ['pythoneval-asyncio.test',
-                        'pythoneval-enum.test']
-
-# Path to Python 3 interpreter
-python3_path = sys.executable
-program_re = re.compile(r'\b_program.py\b')
-
-
-class PythonEvaluationSuite(Suite):
-    def cases(self) -> List[DataDrivenTestCase]:
-        c = []  # type: List[DataDrivenTestCase]
-        for f in python_eval_files:
-            c += parse_test_cases(os.path.join(test_data_prefix, f),
-                                  test_python_evaluation, test_temp_dir, True)
-        if sys.version_info.major == 3 and sys.version_info.minor >= 4:
-            for f in python_34_eval_files:
-                c += parse_test_cases(os.path.join(test_data_prefix, f),
-                    test_python_evaluation, test_temp_dir, True)
-        return c
-
-
-def test_python_evaluation(testcase: DataDrivenTestCase) -> None:
-    """Runs Mypy in a subprocess.
-
-    If this passes without errors, executes the script again with a given Python
-    version.
-    """
-    mypy_cmdline = [
-        python3_path,
-        os.path.join(testcase.old_cwd, 'scripts', 'mypy'),
-        '--show-traceback',
-    ]
-    py2 = testcase.name.lower().endswith('python2')
-    if py2:
-        mypy_cmdline.append('--py2')
-        interpreter = try_find_python2_interpreter()
-        if not interpreter:
-            # Skip, can't find a Python 2 interpreter.
-            raise SkipTestCaseException()
-    else:
-        interpreter = python3_path
-
-    # Write the program to a file.
-    program = '_' + testcase.name + '.py'
-    mypy_cmdline.append(program)
-    program_path = os.path.join(test_temp_dir, program)
-    with open(program_path, 'w') as file:
-        for s in testcase.input:
-            file.write('{}\n'.format(s))
-    # Type check the program.
-    # This uses the same PYTHONPATH as the current process.
-    returncode, out = run(mypy_cmdline)
-    if returncode == 0:
-        # Set up module path for the execution.
-        # This needs the typing module but *not* the mypy module.
-        vers_dir = '2.7' if py2 else '3.2'
-        typing_path = os.path.join(testcase.old_cwd, 'lib-typing', vers_dir)
-        assert os.path.isdir(typing_path)
-        env = os.environ.copy()
-        env['PYTHONPATH'] = typing_path
-        returncode, interp_out = run([interpreter, program], env=env)
-        out += interp_out
-    # Remove temp file.
-    os.remove(program_path)
-    assert_string_arrays_equal(adapt_output(testcase), out,
-                               'Invalid output ({}, line {})'.format(
-                                   testcase.file, testcase.line))
-
-
-def split_lines(*streams: bytes) -> List[str]:
-    """Returns a single list of string lines from the byte streams in args."""
-    return [
-        s.rstrip('\n\r')
-        for stream in streams
-        for s in str(stream, 'utf8').splitlines()
-    ]
-
-
-def adapt_output(testcase: DataDrivenTestCase) -> List[str]:
-    """Translates the generic _program.py into the actual filename."""
-    program = '_' + testcase.name + '.py'
-    return [program_re.sub(program, line) for line in testcase.output]
-
-
-def run(
-    cmdline: List[str], *, env: Dict[str, str] = None, timeout: int = 30
-) -> Tuple[int, List[str]]:
-    """A poor man's subprocess.run() for 3.3 and 3.4 compatibility."""
-    process = subprocess.Popen(
-        cmdline,
-        env=env,
-        stdout=subprocess.PIPE,
-        stderr=subprocess.PIPE,
-        cwd=test_temp_dir,
-    )
-    try:
-        out, err = process.communicate(timeout=timeout)
-    except subprocess.TimeoutExpired:
-        out = err = b''
-        process.kill()
-    return process.returncode, split_lines(out, err)
diff --git a/mypy/test/testreports.py b/mypy/test/testreports.py
deleted file mode 100644
index 80e6980..0000000
--- a/mypy/test/testreports.py
+++ /dev/null
@@ -1,40 +0,0 @@
-"""Test cases for reports generated by mypy."""
-import textwrap
-
-from mypy.myunit import Suite, assert_equal
-from mypy.report import CoberturaPackage, get_line_rate
-
-import lxml.etree as etree
-
-
-class CoberturaReportSuite(Suite):
-    def test_get_line_rate(self) -> None:
-        assert_equal('1.0', get_line_rate(0, 0))
-        assert_equal('0.3333', get_line_rate(1, 3))
-
-    def test_as_xml(self) -> None:
-        cobertura_package = CoberturaPackage('foobar')
-        cobertura_package.covered_lines = 21
-        cobertura_package.total_lines = 42
-
-        child_package = CoberturaPackage('raz')
-        child_package.covered_lines = 10
-        child_package.total_lines = 10
-        child_package.classes['class'] = etree.Element('class')
-
-        cobertura_package.packages['raz'] = child_package
-
-        expected_output = textwrap.dedent('''\
-            <package complexity="1.0" name="foobar" branch-rate="0" line-rate="0.5000">
-              <classes/>
-              <packages>
-                <package complexity="1.0" name="raz" branch-rate="0" line-rate="1.0000">
-                  <classes>
-                    <class/>
-                  </classes>
-                </package>
-              </packages>
-            </package>
-        ''').encode('ascii')
-        assert_equal(expected_output,
-                     etree.tostring(cobertura_package.as_xml(), pretty_print=True))
diff --git a/mypy/test/testsemanal.py b/mypy/test/testsemanal.py
deleted file mode 100644
index 4870fa8..0000000
--- a/mypy/test/testsemanal.py
+++ /dev/null
@@ -1,224 +0,0 @@
-"""Semantic analyzer test cases"""
-
-import os.path
-
-from typing import Dict, List
-
-from mypy import build
-from mypy.build import BuildSource
-from mypy.myunit import Suite
-from mypy.test.helpers import (
-    assert_string_arrays_equal, normalize_error_messages, testfile_pyversion,
-)
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test.config import test_data_prefix, test_temp_dir
-from mypy.errors import CompileError
-from mypy.nodes import TypeInfo
-from mypy.options import Options
-
-
-# Semantic analyzer test cases: dump parse tree
-
-# Semantic analysis test case description files.
-semanal_files = ['semanal-basic.test',
-                 'semanal-expressions.test',
-                 'semanal-classes.test',
-                 'semanal-types.test',
-                 'semanal-typealiases.test',
-                 'semanal-modules.test',
-                 'semanal-statements.test',
-                 'semanal-abstractclasses.test',
-                 'semanal-namedtuple.test',
-                 'semanal-typeddict.test',
-                 'semanal-python2.test']
-
-
-def get_semanal_options() -> Options:
-    options = Options()
-    options.use_builtins_fixtures = True
-    options.semantic_analysis_only = True
-    options.show_traceback = True
-    return options
-
-
-class SemAnalSuite(Suite):
-    def cases(self) -> List[DataDrivenTestCase]:
-        c = []  # type: List[DataDrivenTestCase]
-        for f in semanal_files:
-            c += parse_test_cases(os.path.join(test_data_prefix, f),
-                                  test_semanal,
-                                  base_path=test_temp_dir,
-                                  optional_out=True,
-                                  native_sep=True)
-        return c
-
-
-def test_semanal(testcase: DataDrivenTestCase) -> None:
-    """Perform a semantic analysis test case.
-
-    The testcase argument contains a description of the test case
-    (inputs and output).
-    """
-
-    try:
-        src = '\n'.join(testcase.input)
-        options = get_semanal_options()
-        options.python_version = testfile_pyversion(testcase.file)
-        result = build.build(sources=[BuildSource('main', None, src)],
-                             options=options,
-                             alt_lib_path=test_temp_dir)
-        a = result.errors
-        if a:
-            raise CompileError(a)
-        # Include string representations of the source files in the actual
-        # output.
-        for fnam in sorted(result.files.keys()):
-            f = result.files[fnam]
-            # Omit the builtins module and files with a special marker in the
-            # path.
-            # TODO the test is not reliable
-            if (not f.path.endswith((os.sep + 'builtins.pyi',
-                                     'typing.pyi',
-                                     'mypy_extensions.pyi',
-                                     'abc.pyi',
-                                     'collections.pyi'))
-                    and not os.path.basename(f.path).startswith('_')
-                    and not os.path.splitext(
-                        os.path.basename(f.path))[0].endswith('_')):
-                a += str(f).split('\n')
-    except CompileError as e:
-        a = e.messages
-    assert_string_arrays_equal(
-        testcase.output, a,
-        'Invalid semantic analyzer output ({}, line {})'.format(testcase.file,
-                                                                testcase.line))
-
-
-# Semantic analyzer error test cases
-
-# Paths to files containing test case descriptions.
-semanal_error_files = ['semanal-errors.test']
-
-
-class SemAnalErrorSuite(Suite):
-    def cases(self) -> List[DataDrivenTestCase]:
-        # Read test cases from test case description files.
-        c = []  # type: List[DataDrivenTestCase]
-        for f in semanal_error_files:
-            c += parse_test_cases(os.path.join(test_data_prefix, f),
-                                  test_semanal_error, test_temp_dir, optional_out=True)
-        return c
-
-
-def test_semanal_error(testcase: DataDrivenTestCase) -> None:
-    """Perform a test case."""
-
-    try:
-        src = '\n'.join(testcase.input)
-        res = build.build(sources=[BuildSource('main', None, src)],
-                          options=get_semanal_options(),
-                          alt_lib_path=test_temp_dir)
-        a = res.errors
-        assert a, 'No errors reported in {}, line {}'.format(testcase.file, testcase.line)
-    except CompileError as e:
-        # Verify that there was a compile error and that the error messages
-        # are equivalent.
-        a = e.messages
-    assert_string_arrays_equal(
-        testcase.output, normalize_error_messages(a),
-        'Invalid compiler output ({}, line {})'.format(testcase.file, testcase.line))
-
-
-# SymbolNode table export test cases
-
-# Test case descriptions
-semanal_symtable_files = ['semanal-symtable.test']
-
-
-class SemAnalSymtableSuite(Suite):
-    def cases(self) -> List[DataDrivenTestCase]:
-        c = []  # type: List[DataDrivenTestCase]
-        for f in semanal_symtable_files:
-            c += parse_test_cases(os.path.join(test_data_prefix, f),
-                                  self.run_test, test_temp_dir)
-        return c
-
-    def run_test(self, testcase: DataDrivenTestCase) -> None:
-        """Perform a test case."""
-        try:
-            # Build test case input.
-            src = '\n'.join(testcase.input)
-            result = build.build(sources=[BuildSource('main', None, src)],
-                                 options=get_semanal_options(),
-                                 alt_lib_path=test_temp_dir)
-            # The output is the symbol table converted into a string.
-            a = result.errors
-            if a:
-                raise CompileError(a)
-            for f in sorted(result.files.keys()):
-                if f not in ('builtins', 'typing', 'abc'):
-                    a.append('{}:'.format(f))
-                    for s in str(result.files[f].names).split('\n'):
-                        a.append('  ' + s)
-        except CompileError as e:
-            a = e.messages
-        assert_string_arrays_equal(
-            testcase.output, a,
-            'Invalid semantic analyzer output ({}, line {})'.format(
-                testcase.file, testcase.line))
-
-
-# Type info export test cases
-
-semanal_typeinfo_files = ['semanal-typeinfo.test']
-
-
-class SemAnalTypeInfoSuite(Suite):
-    def cases(self) -> List[DataDrivenTestCase]:
-        """Test case descriptions"""
-        c = []  # type: List[DataDrivenTestCase]
-        for f in semanal_typeinfo_files:
-            c += parse_test_cases(os.path.join(test_data_prefix, f),
-                                  self.run_test, test_temp_dir)
-        return c
-
-    def run_test(self, testcase: DataDrivenTestCase) -> None:
-        """Perform a test case."""
-        try:
-            # Build test case input.
-            src = '\n'.join(testcase.input)
-            result = build.build(sources=[BuildSource('main', None, src)],
-                                 options=get_semanal_options(),
-                                 alt_lib_path=test_temp_dir)
-            a = result.errors
-            if a:
-                raise CompileError(a)
-
-            # Collect all TypeInfos in top-level modules.
-            typeinfos = TypeInfoMap()
-            for f in result.files.values():
-                for n in f.names.values():
-                    if isinstance(n.node, TypeInfo):
-                        typeinfos[n.fullname] = n.node
-
-            # The output is the symbol table converted into a string.
-            a = str(typeinfos).split('\n')
-        except CompileError as e:
-            a = e.messages
-        assert_string_arrays_equal(
-            testcase.output, a,
-            'Invalid semantic analyzer output ({}, line {})'.format(
-                testcase.file, testcase.line))
-
-
-class TypeInfoMap(Dict[str, TypeInfo]):
-    def __str__(self) -> str:
-        a = ['TypeInfoMap(']  # type: List[str]
-        for x, y in sorted(self.items()):
-            if isinstance(x, str) and (not x.startswith('builtins.') and
-                                       not x.startswith('typing.') and
-                                       not x.startswith('abc.')):
-                ti = ('\n' + '  ').join(str(y).split('\n'))
-                a.append('  {} : {}'.format(x, ti))
-        a[-1] += ')'
-        return '\n'.join(a)
diff --git a/mypy/test/testsolve.py b/mypy/test/testsolve.py
deleted file mode 100644
index e407f75..0000000
--- a/mypy/test/testsolve.py
+++ /dev/null
@@ -1,156 +0,0 @@
-"""Test cases for the constraint solver used in type inference."""
-
-from typing import List, Union, Tuple
-
-from mypy.myunit import Suite, assert_equal
-from mypy.constraints import SUPERTYPE_OF, SUBTYPE_OF, Constraint
-from mypy.solve import solve_constraints
-from mypy.typefixture import TypeFixture
-from mypy.types import Type, TypeVarType, TypeVarId
-
-
-class SolveSuite(Suite):
-    def __init__(self) -> None:
-        super().__init__()
-        self.fx = TypeFixture()
-
-    def test_empty_input(self) -> None:
-        self.assert_solve([], [], [])
-
-    def test_simple_supertype_constraints(self) -> None:
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.a)],
-                          [(self.fx.a, self.fx.o)])
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.a),
-                           self.supc(self.fx.t, self.fx.b)],
-                          [(self.fx.a, self.fx.o)])
-
-    def test_simple_subtype_constraints(self) -> None:
-        self.assert_solve([self.fx.t.id],
-                          [self.subc(self.fx.t, self.fx.a)],
-                          [self.fx.a])
-        self.assert_solve([self.fx.t.id],
-                          [self.subc(self.fx.t, self.fx.a),
-                           self.subc(self.fx.t, self.fx.b)],
-                          [self.fx.b])
-
-    def test_both_kinds_of_constraints(self) -> None:
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.b),
-                           self.subc(self.fx.t, self.fx.a)],
-                          [(self.fx.b, self.fx.a)])
-
-    def test_unsatisfiable_constraints(self) -> None:
-        # The constraints are impossible to satisfy.
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.a),
-                           self.subc(self.fx.t, self.fx.b)],
-                          [None])
-
-    def test_exactly_specified_result(self) -> None:
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.b),
-                           self.subc(self.fx.t, self.fx.b)],
-                          [(self.fx.b, self.fx.b)])
-
-    def test_multiple_variables(self) -> None:
-        self.assert_solve([self.fx.t.id, self.fx.s.id],
-                          [self.supc(self.fx.t, self.fx.b),
-                           self.supc(self.fx.s, self.fx.c),
-                           self.subc(self.fx.t, self.fx.a)],
-                          [(self.fx.b, self.fx.a), (self.fx.c, self.fx.o)])
-
-    def test_no_constraints_for_var(self) -> None:
-        self.assert_solve([self.fx.t.id],
-                          [],
-                          [self.fx.nonet])
-        self.assert_solve([self.fx.t.id, self.fx.s.id],
-                          [],
-                          [self.fx.nonet, self.fx.nonet])
-        self.assert_solve([self.fx.t.id, self.fx.s.id],
-                          [self.supc(self.fx.s, self.fx.a)],
-                          [self.fx.nonet, (self.fx.a, self.fx.o)])
-
-    def test_void_constraints(self) -> None:
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.void)],
-                          [(self.fx.void, self.fx.void)])
-        self.assert_solve([self.fx.t.id],
-                          [self.subc(self.fx.t, self.fx.void)],
-                          [(self.fx.void, self.fx.void)])
-
-        # Both bounds void.
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.void),
-                           self.subc(self.fx.t, self.fx.void)],
-                          [(self.fx.void, self.fx.void)])
-
-        # Cannot infer any type.
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.a),
-                           self.supc(self.fx.t, self.fx.void)],
-                          [None])
-        self.assert_solve([self.fx.t.id],
-                          [self.subc(self.fx.t, self.fx.a),
-                           self.subc(self.fx.t, self.fx.void)],
-                          [None])
-
-    def test_simple_constraints_with_dynamic_type(self) -> None:
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.anyt)],
-                          [(self.fx.anyt, self.fx.anyt)])
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.anyt),
-                           self.supc(self.fx.t, self.fx.anyt)],
-                          [(self.fx.anyt, self.fx.anyt)])
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.anyt),
-                           self.supc(self.fx.t, self.fx.a)],
-                          [(self.fx.anyt, self.fx.anyt)])
-
-        self.assert_solve([self.fx.t.id],
-                          [self.subc(self.fx.t, self.fx.anyt)],
-                          [(self.fx.anyt, self.fx.anyt)])
-        self.assert_solve([self.fx.t.id],
-                          [self.subc(self.fx.t, self.fx.anyt),
-                           self.subc(self.fx.t, self.fx.anyt)],
-                          [(self.fx.anyt, self.fx.anyt)])
-        # self.assert_solve([self.fx.t.id],
-        #                   [self.subc(self.fx.t, self.fx.anyt),
-        #                    self.subc(self.fx.t, self.fx.a)],
-        #                   [(self.fx.anyt, self.fx.anyt)])
-        # TODO: figure out what this should be after changes to meet(any, X)
-
-    def test_both_normal_and_any_types_in_results(self) -> None:
-        # If one of the bounds is any, we promote the other bound to
-        # any as well, since otherwise the type range does not make sense.
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.a),
-                           self.subc(self.fx.t, self.fx.anyt)],
-                          [(self.fx.anyt, self.fx.anyt)])
-
-        self.assert_solve([self.fx.t.id],
-                          [self.supc(self.fx.t, self.fx.anyt),
-                           self.subc(self.fx.t, self.fx.a)],
-                          [(self.fx.anyt, self.fx.anyt)])
-
-    def assert_solve(self,
-                     vars: List[TypeVarId],
-                     constraints: List[Constraint],
-                     results: List[Union[Type, Tuple[Type, Type]]],
-                     ) -> None:
-        res = []
-        for r in results:
-            if isinstance(r, tuple):
-                res.append(r[0])
-            else:
-                res.append(r)
-        actual = solve_constraints(vars, constraints)
-        assert_equal(str(actual), str(res))
-
-    def supc(self, type_var: TypeVarType, bound: Type) -> Constraint:
-        return Constraint(type_var.id, SUPERTYPE_OF, bound)
-
-    def subc(self, type_var: TypeVarType, bound: Type) -> Constraint:
-        return Constraint(type_var.id, SUBTYPE_OF, bound)
diff --git a/mypy/test/teststubgen.py b/mypy/test/teststubgen.py
deleted file mode 100644
index 0be61ca..0000000
--- a/mypy/test/teststubgen.py
+++ /dev/null
@@ -1,186 +0,0 @@
-import glob
-import importlib
-import os.path
-import random
-import shutil
-import sys
-import tempfile
-import time
-
-from typing import List, Tuple
-
-from mypy.myunit import Suite, AssertionFailure, assert_equal
-from mypy.test.helpers import assert_string_arrays_equal
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test import config
-from mypy.parse import parse
-from mypy.errors import CompileError
-from mypy.stubgen import generate_stub, generate_stub_for_module
-from mypy.stubgenc import infer_method_sig
-from mypy.stubutil import (
-    parse_signature, parse_all_signatures, build_signature, find_unique_signatures,
-    infer_sig_from_docstring
-)
-
-
-class StubgenUtilSuite(Suite):
-    def test_parse_signature(self) -> None:
-        self.assert_parse_signature('func()', ('func', [], []))
-
-    def test_parse_signature_with_args(self) -> None:
-        self.assert_parse_signature('func(arg)', ('func', ['arg'], []))
-        self.assert_parse_signature('do(arg, arg2)', ('do', ['arg', 'arg2'], []))
-
-    def test_parse_signature_with_optional_args(self) -> None:
-        self.assert_parse_signature('func([arg])', ('func', [], ['arg']))
-        self.assert_parse_signature('func(arg[, arg2])', ('func', ['arg'], ['arg2']))
-        self.assert_parse_signature('func([arg[, arg2]])', ('func', [], ['arg', 'arg2']))
-
-    def test_parse_signature_with_default_arg(self) -> None:
-        self.assert_parse_signature('func(arg=None)', ('func', [], ['arg']))
-        self.assert_parse_signature('func(arg, arg2=None)', ('func', ['arg'], ['arg2']))
-        self.assert_parse_signature('func(arg=1, arg2="")', ('func', [], ['arg', 'arg2']))
-
-    def test_parse_signature_with_qualified_function(self) -> None:
-        self.assert_parse_signature('ClassName.func(arg)', ('func', ['arg'], []))
-
-    def test_parse_signature_with_kw_only_arg(self) -> None:
-        self.assert_parse_signature('ClassName.func(arg, *, arg2=1)',
-                                    ('func', ['arg', '*'], ['arg2']))
-
-    def test_parse_signature_with_star_arg(self) -> None:
-        self.assert_parse_signature('ClassName.func(arg, *args)',
-                                    ('func', ['arg', '*args'], []))
-
-    def test_parse_signature_with_star_star_arg(self) -> None:
-        self.assert_parse_signature('ClassName.func(arg, **args)',
-                                    ('func', ['arg', '**args'], []))
-
-    def assert_parse_signature(self, sig: str, result: Tuple[str, List[str], List[str]]) -> None:
-        assert_equal(parse_signature(sig), result)
-
-    def test_build_signature(self) -> None:
-        assert_equal(build_signature([], []), '()')
-        assert_equal(build_signature(['arg'], []), '(arg)')
-        assert_equal(build_signature(['arg', 'arg2'], []), '(arg, arg2)')
-        assert_equal(build_signature(['arg'], ['arg2']), '(arg, arg2=...)')
-        assert_equal(build_signature(['arg'], ['arg2', '**x']), '(arg, arg2=..., **x)')
-
-    def test_parse_all_signatures(self) -> None:
-        assert_equal(parse_all_signatures(['random text',
-                                           '.. function:: fn(arg',
-                                           '.. function:: fn()',
-                                           '  .. method:: fn2(arg)']),
-                     ([('fn', '()'),
-                       ('fn2', '(arg)')], []))
-
-    def test_find_unique_signatures(self) -> None:
-        assert_equal(find_unique_signatures(
-            [('func', '()'),
-             ('func', '()'),
-             ('func2', '()'),
-             ('func2', '(arg)'),
-             ('func3', '(arg, arg2)')]),
-            [('func', '()'),
-             ('func3', '(arg, arg2)')])
-
-    def test_infer_sig_from_docstring(self) -> None:
-        assert_equal(infer_sig_from_docstring('\nfunc(x) - y', 'func'), '(x)')
-        assert_equal(infer_sig_from_docstring('\nfunc(x, Y_a=None)', 'func'), '(x, Y_a=None)')
-        assert_equal(infer_sig_from_docstring('\nafunc(x) - y', 'func'), None)
-        assert_equal(infer_sig_from_docstring('\nfunc(x, y', 'func'), None)
-        assert_equal(infer_sig_from_docstring('\nfunc(x=z(y))', 'func'), None)
-        assert_equal(infer_sig_from_docstring('\nfunc x', 'func'), None)
-
-
-class StubgenPythonSuite(Suite):
-    test_data_files = ['stubgen.test']
-
-    def cases(self) -> List[DataDrivenTestCase]:
-        c = []  # type: List[DataDrivenTestCase]
-        for path in self.test_data_files:
-            c += parse_test_cases(os.path.join(config.test_data_prefix, path), test_stubgen)
-        return c
-
-
-def test_stubgen(testcase: DataDrivenTestCase) -> None:
-    if 'stubgen-test-path' not in sys.path:
-        sys.path.insert(0, 'stubgen-test-path')
-    os.mkdir('stubgen-test-path')
-    source = '\n'.join(testcase.input)
-    handle = tempfile.NamedTemporaryFile(prefix='prog_', suffix='.py', dir='stubgen-test-path',
-                                         delete=False)
-    assert os.path.isabs(handle.name)
-    path = os.path.basename(handle.name)
-    name = path[:-3]
-    path = os.path.join('stubgen-test-path', path)
-    out_dir = '_out'
-    os.mkdir(out_dir)
-    try:
-        handle.write(bytes(source, 'ascii'))
-        handle.close()
-        # Without this we may sometimes be unable to import the module below, as importlib
-        # caches os.listdir() results in Python 3.3+ (Guido explained this to me).
-        reset_importlib_caches()
-        try:
-            if testcase.name.endswith('_import'):
-                generate_stub_for_module(name, out_dir, quiet=True)
-            elif testcase.name.endswith('_fast_parser'):
-                generate_stub(path, out_dir, fast_parser=True)
-            else:
-                generate_stub(path, out_dir)
-            a = load_output(out_dir)
-        except CompileError as e:
-            a = e.messages
-        assert_string_arrays_equal(testcase.output, a,
-                                   'Invalid output ({}, line {})'.format(
-                                       testcase.file, testcase.line))
-    finally:
-        handle.close()
-        os.unlink(handle.name)
-        shutil.rmtree(out_dir)
-
-
-def reset_importlib_caches() -> None:
-    try:
-        importlib.invalidate_caches()
-    except (ImportError, AttributeError):
-        pass
-
-
-def load_output(dirname: str) -> List[str]:
-    result = []  # type: List[str]
-    entries = glob.glob('%s/*' % dirname)
-    assert entries, 'No files generated'
-    if len(entries) == 1:
-        add_file(entries[0], result)
-    else:
-        for entry in entries:
-            result.append('## %s ##' % entry)
-            add_file(entry, result)
-    return result
-
-
-def add_file(path: str, result: List[str]) -> None:
-    with open(path) as file:
-        result.extend(file.read().splitlines())
-
-
-class StubgencSuite(Suite):
-    def test_infer_hash_sig(self) -> None:
-        assert_equal(infer_method_sig('__hash__'), '()')
-
-    def test_infer_getitem_sig(self) -> None:
-        assert_equal(infer_method_sig('__getitem__'), '(index)')
-
-    def test_infer_setitem_sig(self) -> None:
-        assert_equal(infer_method_sig('__setitem__'), '(index, object)')
-
-    def test_infer_binary_op_sig(self) -> None:
-        for op in ('eq', 'ne', 'lt', 'le', 'gt', 'ge',
-                   'add', 'radd', 'sub', 'rsub', 'mul', 'rmul'):
-            assert_equal(infer_method_sig('__%s__' % op), '(other)')
-
-    def test_infer_unary_op_sig(self) -> None:
-        for op in ('neg', 'pos'):
-            assert_equal(infer_method_sig('__%s__' % op), '()')
diff --git a/mypy/test/testsubtypes.py b/mypy/test/testsubtypes.py
deleted file mode 100644
index 307cb7a..0000000
--- a/mypy/test/testsubtypes.py
+++ /dev/null
@@ -1,208 +0,0 @@
-from mypy.myunit import Suite, assert_true
-from mypy.nodes import CONTRAVARIANT, INVARIANT, COVARIANT
-from mypy.subtypes import is_subtype
-from mypy.typefixture import TypeFixture, InterfaceTypeFixture
-from mypy.types import Type
-
-
-class SubtypingSuite(Suite):
-    def set_up(self) -> None:
-        self.fx = TypeFixture(INVARIANT)
-        self.fx_contra = TypeFixture(CONTRAVARIANT)
-        self.fx_co = TypeFixture(COVARIANT)
-
-    def test_trivial_cases(self) -> None:
-        for simple in self.fx_co.void, self.fx_co.a, self.fx_co.o, self.fx_co.b:
-            self.assert_subtype(simple, simple)
-
-    def test_instance_subtyping(self) -> None:
-        self.assert_strict_subtype(self.fx.a, self.fx.o)
-        self.assert_strict_subtype(self.fx.b, self.fx.o)
-        self.assert_strict_subtype(self.fx.b, self.fx.a)
-
-        self.assert_not_subtype(self.fx.a, self.fx.d)
-        self.assert_not_subtype(self.fx.b, self.fx.c)
-
-    def test_simple_generic_instance_subtyping_invariant(self) -> None:
-        self.assert_subtype(self.fx.ga, self.fx.ga)
-        self.assert_subtype(self.fx.hab, self.fx.hab)
-
-        self.assert_not_subtype(self.fx.ga, self.fx.g2a)
-        self.assert_not_subtype(self.fx.ga, self.fx.gb)
-        self.assert_not_subtype(self.fx.gb, self.fx.ga)
-
-    def test_simple_generic_instance_subtyping_covariant(self) -> None:
-        self.assert_subtype(self.fx_co.ga, self.fx_co.ga)
-        self.assert_subtype(self.fx_co.hab, self.fx_co.hab)
-
-        self.assert_not_subtype(self.fx_co.ga, self.fx_co.g2a)
-        self.assert_not_subtype(self.fx_co.ga, self.fx_co.gb)
-        self.assert_subtype(self.fx_co.gb, self.fx_co.ga)
-
-    def test_simple_generic_instance_subtyping_contravariant(self) -> None:
-        self.assert_subtype(self.fx_contra.ga, self.fx_contra.ga)
-        self.assert_subtype(self.fx_contra.hab, self.fx_contra.hab)
-
-        self.assert_not_subtype(self.fx_contra.ga, self.fx_contra.g2a)
-        self.assert_subtype(self.fx_contra.ga, self.fx_contra.gb)
-        self.assert_not_subtype(self.fx_contra.gb, self.fx_contra.ga)
-
-    def test_generic_subtyping_with_inheritance_invariant(self) -> None:
-        self.assert_subtype(self.fx.gsab, self.fx.gb)
-        self.assert_not_subtype(self.fx.gsab, self.fx.ga)
-        self.assert_not_subtype(self.fx.gsaa, self.fx.gb)
-
-    def test_generic_subtyping_with_inheritance_covariant(self) -> None:
-        self.assert_subtype(self.fx_co.gsab, self.fx_co.gb)
-        self.assert_subtype(self.fx_co.gsab, self.fx_co.ga)
-        self.assert_not_subtype(self.fx_co.gsaa, self.fx_co.gb)
-
-    def test_generic_subtyping_with_inheritance_contravariant(self) -> None:
-        self.assert_subtype(self.fx_contra.gsab, self.fx_contra.gb)
-        self.assert_not_subtype(self.fx_contra.gsab, self.fx_contra.ga)
-        self.assert_subtype(self.fx_contra.gsaa, self.fx_contra.gb)
-
-    def test_interface_subtyping(self) -> None:
-        self.assert_subtype(self.fx.e, self.fx.f)
-        self.assert_equivalent(self.fx.f, self.fx.f)
-        self.assert_not_subtype(self.fx.a, self.fx.f)
-
-    def test_generic_interface_subtyping(self) -> None:
-        # TODO make this work
-        self.skip()
-
-        fx2 = InterfaceTypeFixture()
-
-        self.assert_subtype(fx2.m1, fx2.gfa)
-        self.assert_not_subtype(fx2.m1, fx2.gfb)
-
-        self.assert_equivalent(fx2.gfa, fx2.gfa)
-
-    def test_basic_callable_subtyping(self) -> None:
-        self.assert_strict_subtype(self.fx.callable(self.fx.o, self.fx.d),
-                                   self.fx.callable(self.fx.a, self.fx.d))
-        self.assert_strict_subtype(self.fx.callable(self.fx.d, self.fx.b),
-                                   self.fx.callable(self.fx.d, self.fx.a))
-
-        self.assert_unrelated(self.fx.callable(self.fx.a, self.fx.a),
-                              self.fx.callable(self.fx.a, self.fx.void))
-
-        self.assert_unrelated(
-            self.fx.callable(self.fx.a, self.fx.a, self.fx.a),
-            self.fx.callable(self.fx.a, self.fx.a))
-
-    def test_default_arg_callable_subtyping(self) -> None:
-        self.assert_strict_subtype(
-            self.fx.callable_default(1, self.fx.a, self.fx.d, self.fx.a),
-            self.fx.callable(self.fx.a, self.fx.d, self.fx.a))
-
-        self.assert_strict_subtype(
-            self.fx.callable_default(1, self.fx.a, self.fx.d, self.fx.a),
-            self.fx.callable(self.fx.a, self.fx.a))
-
-        self.assert_strict_subtype(
-            self.fx.callable_default(0, self.fx.a, self.fx.d, self.fx.a),
-            self.fx.callable_default(1, self.fx.a, self.fx.d, self.fx.a))
-
-        self.assert_unrelated(
-            self.fx.callable_default(1, self.fx.a, self.fx.d, self.fx.a),
-            self.fx.callable(self.fx.d, self.fx.d, self.fx.a))
-
-        self.assert_unrelated(
-            self.fx.callable_default(0, self.fx.a, self.fx.d, self.fx.a),
-            self.fx.callable_default(1, self.fx.a, self.fx.a, self.fx.a))
-
-        self.assert_unrelated(
-            self.fx.callable_default(1, self.fx.a, self.fx.a),
-            self.fx.callable(self.fx.a, self.fx.a, self.fx.a))
-
-    def test_var_arg_callable_subtyping_1(self) -> None:
-        self.assert_strict_subtype(
-            self.fx.callable_var_arg(0, self.fx.a, self.fx.a),
-            self.fx.callable_var_arg(0, self.fx.b, self.fx.a))
-
-    def test_var_arg_callable_subtyping_2(self) -> None:
-        self.assert_strict_subtype(
-            self.fx.callable_var_arg(0, self.fx.a, self.fx.a),
-            self.fx.callable(self.fx.b, self.fx.a))
-
-    def test_var_arg_callable_subtyping_3(self) -> None:
-        self.assert_strict_subtype(
-            self.fx.callable_var_arg(0, self.fx.a, self.fx.a),
-            self.fx.callable(self.fx.a))
-
-    def test_var_arg_callable_subtyping_4(self) -> None:
-        self.assert_strict_subtype(
-            self.fx.callable_var_arg(1, self.fx.a, self.fx.d, self.fx.a),
-            self.fx.callable(self.fx.b, self.fx.a))
-
-    def test_var_arg_callable_subtyping_5(self) -> None:
-        self.assert_strict_subtype(
-            self.fx.callable_var_arg(0, self.fx.a, self.fx.d, self.fx.a),
-            self.fx.callable(self.fx.b, self.fx.a))
-
-    def test_var_arg_callable_subtyping_6(self) -> None:
-        self.assert_strict_subtype(
-            self.fx.callable_var_arg(0, self.fx.a, self.fx.f, self.fx.d),
-            self.fx.callable_var_arg(0, self.fx.b, self.fx.e, self.fx.d))
-
-    def test_var_arg_callable_subtyping_7(self) -> None:
-        self.assert_not_subtype(
-            self.fx.callable_var_arg(0, self.fx.b, self.fx.d),
-            self.fx.callable(self.fx.a, self.fx.d))
-
-    def test_var_arg_callable_subtyping_8(self) -> None:
-        self.assert_not_subtype(
-            self.fx.callable_var_arg(0, self.fx.b, self.fx.d),
-            self.fx.callable_var_arg(0, self.fx.a, self.fx.a, self.fx.d))
-        self.assert_subtype(
-            self.fx.callable_var_arg(0, self.fx.a, self.fx.d),
-            self.fx.callable_var_arg(0, self.fx.b, self.fx.b, self.fx.d))
-
-    def test_var_arg_callable_subtyping_9(self) -> None:
-        self.assert_not_subtype(
-            self.fx.callable_var_arg(0, self.fx.b, self.fx.b, self.fx.d),
-            self.fx.callable_var_arg(0, self.fx.a, self.fx.d))
-        self.assert_subtype(
-            self.fx.callable_var_arg(0, self.fx.a, self.fx.a, self.fx.d),
-            self.fx.callable_var_arg(0, self.fx.b, self.fx.d))
-
-    def test_type_callable_subtyping(self) -> None:
-        self.assert_strict_subtype(
-            self.fx.callable_type(self.fx.d, self.fx.a), self.fx.type_type)
-
-        self.assert_strict_subtype(
-            self.fx.callable_type(self.fx.d, self.fx.b),
-            self.fx.callable(self.fx.d, self.fx.a))
-
-        self.assert_strict_subtype(self.fx.callable_type(self.fx.a, self.fx.b),
-                                   self.fx.callable(self.fx.a, self.fx.b))
-
-    # IDEA: Maybe add these test cases (they are tested pretty well in type
-    #       checker tests already):
-    #  * more interface subtyping test cases
-    #  * more generic interface subtyping test cases
-    #  * type variables
-    #  * tuple types
-    #  * void type
-    #  * None type
-    #  * any type
-    #  * generic function types
-
-    def assert_subtype(self, s: Type, t: Type) -> None:
-        assert_true(is_subtype(s, t), '{} not subtype of {}'.format(s, t))
-
-    def assert_not_subtype(self, s: Type, t: Type) -> None:
-        assert_true(not is_subtype(s, t), '{} subtype of {}'.format(s, t))
-
-    def assert_strict_subtype(self, s: Type, t: Type) -> None:
-        self.assert_subtype(s, t)
-        self.assert_not_subtype(t, s)
-
-    def assert_equivalent(self, s: Type, t: Type) -> None:
-        self.assert_subtype(s, t)
-        self.assert_subtype(t, s)
-
-    def assert_unrelated(self, s: Type, t: Type) -> None:
-        self.assert_not_subtype(s, t)
-        self.assert_not_subtype(t, s)
diff --git a/mypy/test/testtransform.py b/mypy/test/testtransform.py
deleted file mode 100644
index 1dac308..0000000
--- a/mypy/test/testtransform.py
+++ /dev/null
@@ -1,85 +0,0 @@
-"""Identity AST transform test cases"""
-
-import os.path
-
-from typing import Dict, List
-
-from mypy import build
-from mypy.build import BuildSource
-from mypy.myunit import Suite
-from mypy.test.helpers import assert_string_arrays_equal, testfile_pyversion
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test.config import test_data_prefix, test_temp_dir
-from mypy.errors import CompileError
-from mypy.nodes import TypeInfo
-from mypy.treetransform import TransformVisitor
-from mypy.types import Type
-from mypy.options import Options
-
-
-class TransformSuite(Suite):
-    # Reuse semantic analysis test cases.
-    transform_files = ['semanal-basic.test',
-                       'semanal-expressions.test',
-                       'semanal-classes.test',
-                       'semanal-types.test',
-                       'semanal-modules.test',
-                       'semanal-statements.test',
-                       'semanal-abstractclasses.test',
-                       'semanal-python2.test']
-
-    def cases(self) -> List[DataDrivenTestCase]:
-        c = []  # type: List[DataDrivenTestCase]
-        for f in self.transform_files:
-            c += parse_test_cases(os.path.join(test_data_prefix, f),
-                                  test_transform,
-                                  base_path=test_temp_dir,
-                                  native_sep=True)
-        return c
-
-
-def test_transform(testcase: DataDrivenTestCase) -> None:
-    """Perform an identity transform test case."""
-
-    try:
-        src = '\n'.join(testcase.input)
-        options = Options()
-        options.use_builtins_fixtures = True
-        options.semantic_analysis_only = True
-        options.show_traceback = True
-        options.python_version = testfile_pyversion(testcase.file)
-        result = build.build(sources=[BuildSource('main', None, src)],
-                             options=options,
-                             alt_lib_path=test_temp_dir)
-        a = result.errors
-        if a:
-            raise CompileError(a)
-        # Include string representations of the source files in the actual
-        # output.
-        for fnam in sorted(result.files.keys()):
-            f = result.files[fnam]
-
-            # Omit the builtins module and files with a special marker in the
-            # path.
-            # TODO the test is not reliable
-            if (not f.path.endswith((os.sep + 'builtins.pyi',
-                                     'typing.pyi',
-                                     'abc.pyi'))
-                    and not os.path.basename(f.path).startswith('_')
-                    and not os.path.splitext(
-                        os.path.basename(f.path))[0].endswith('_')):
-                t = TestTransformVisitor()
-                f = t.mypyfile(f)
-                a += str(f).split('\n')
-    except CompileError as e:
-        a = e.messages
-    assert_string_arrays_equal(
-        testcase.output, a,
-        'Invalid semantic analyzer output ({}, line {})'.format(testcase.file,
-                                                                testcase.line))
-
-
-class TestTransformVisitor(TransformVisitor):
-    def type(self, type: Type) -> Type:
-        assert type is not None
-        return type
diff --git a/mypy/test/testtypegen.py b/mypy/test/testtypegen.py
deleted file mode 100644
index a465c71..0000000
--- a/mypy/test/testtypegen.py
+++ /dev/null
@@ -1,128 +0,0 @@
-"""Test cases for the type checker: exporting inferred types"""
-
-import os.path
-import re
-
-from typing import Set, List
-
-from mypy import build
-from mypy.build import BuildSource
-from mypy.myunit import Suite
-from mypy.test import config
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test.helpers import assert_string_arrays_equal
-from mypy.util import short_type
-from mypy.nodes import (
-    NameExpr, TypeVarExpr, CallExpr, Expression, MypyFile, AssignmentStmt, IntExpr
-)
-from mypy.traverser import TraverserVisitor
-from mypy.errors import CompileError
-from mypy.options import Options
-
-
-class TypeExportSuite(Suite):
-    # List of files that contain test case descriptions.
-    files = ['typexport-basic.test']
-
-    def cases(self) -> List[DataDrivenTestCase]:
-        c = []  # type: List[DataDrivenTestCase]
-        for f in self.files:
-            c += parse_test_cases(os.path.join(config.test_data_prefix, f),
-                                  self.run_test, config.test_temp_dir)
-        return c
-
-    def run_test(self, testcase: DataDrivenTestCase) -> None:
-        try:
-            line = testcase.input[0]
-            mask = ''
-            if line.startswith('##'):
-                mask = '(' + line[2:].strip() + ')$'
-
-            src = '\n'.join(testcase.input)
-            options = Options()
-            options.use_builtins_fixtures = True
-            options.show_traceback = True
-            result = build.build(sources=[BuildSource('main', None, src)],
-                                 options=options,
-                                 alt_lib_path=config.test_temp_dir)
-            a = result.errors
-            map = result.types
-            nodes = map.keys()
-
-            # Ignore NameExpr nodes of variables with explicit (trivial) types
-            # to simplify output.
-            searcher = SkippedNodeSearcher()
-            for file in result.files.values():
-                file.accept(searcher)
-            ignored = searcher.nodes
-
-            # Filter nodes that should be included in the output.
-            keys = []
-            for node in nodes:
-                if node.line is not None and node.line != -1 and map[node]:
-                    if ignore_node(node) or node in ignored:
-                        continue
-                    if (re.match(mask, short_type(node))
-                            or (isinstance(node, NameExpr)
-                                and re.match(mask, node.name))):
-                        # Include node in output.
-                        keys.append(node)
-
-            for key in sorted(keys,
-                              key=lambda n: (n.line, short_type(n),
-                                             str(n) + str(map[n]))):
-                ts = str(map[key]).replace('*', '')  # Remove erased tags
-                ts = ts.replace('__main__.', '')
-                a.append('{}({}) : {}'.format(short_type(key), key.line, ts))
-        except CompileError as e:
-            a = e.messages
-        assert_string_arrays_equal(
-            testcase.output, a,
-            'Invalid type checker output ({}, line {})'.format(testcase.file,
-                                                               testcase.line))
-
-
-class SkippedNodeSearcher(TraverserVisitor):
-    def __init__(self) -> None:
-        self.nodes = set()  # type: Set[Expression]
-        self.is_typing = False
-
-    def visit_mypy_file(self, f: MypyFile) -> None:
-        self.is_typing = f.fullname() == 'typing'
-        super().visit_mypy_file(f)
-
-    def visit_assignment_stmt(self, s: AssignmentStmt) -> None:
-        if s.type or ignore_node(s.rvalue):
-            for lvalue in s.lvalues:
-                if isinstance(lvalue, NameExpr):
-                    self.nodes.add(lvalue)
-        super().visit_assignment_stmt(s)
-
-    def visit_name_expr(self, n: NameExpr) -> None:
-        self.skip_if_typing(n)
-
-    def visit_int_expr(self, n: IntExpr) -> None:
-        self.skip_if_typing(n)
-
-    def skip_if_typing(self, n: Expression) -> None:
-        if self.is_typing:
-            self.nodes.add(n)
-
-
-def ignore_node(node: Expression) -> bool:
-    """Return True if node is to be omitted from test case output."""
-
-    # We want to get rid of object() expressions in the typing module stub
-    # and also TypeVar(...) expressions. Since detecting whether a node comes
-    # from the typing module is not easy, we just to strip them all away.
-    if isinstance(node, TypeVarExpr):
-        return True
-    if isinstance(node, NameExpr) and node.fullname == 'builtins.object':
-        return True
-    if isinstance(node, NameExpr) and node.fullname == 'builtins.None':
-        return True
-    if isinstance(node, CallExpr) and (ignore_node(node.callee) or
-                                       node.analyzed):
-        return True
-
-    return False
diff --git a/mypy/test/testtypes.py b/mypy/test/testtypes.py
deleted file mode 100644
index 4364848..0000000
--- a/mypy/test/testtypes.py
+++ /dev/null
@@ -1,847 +0,0 @@
-"""Test cases for mypy types and type operations."""
-
-from typing import List, Tuple
-
-from mypy.myunit import (
-    Suite, assert_equal, assert_true, assert_false, assert_type
-)
-from mypy.erasetype import erase_type
-from mypy.expandtype import expand_type
-from mypy.join import join_types, join_simple
-from mypy.meet import meet_types
-from mypy.types import (
-    UnboundType, AnyType, Void, CallableType, TupleType, TypeVarDef, Type,
-    Instance, NoneTyp, ErrorType, Overloaded, TypeType, UnionType, UninhabitedType,
-    true_only, false_only, TypeVarId
-)
-from mypy.nodes import ARG_POS, ARG_OPT, ARG_STAR, CONTRAVARIANT, INVARIANT, COVARIANT
-from mypy.subtypes import is_subtype, is_more_precise, is_proper_subtype
-from mypy.typefixture import TypeFixture, InterfaceTypeFixture
-
-
-class TypesSuite(Suite):
-    def __init__(self) -> None:
-        super().__init__()
-        self.x = UnboundType('X')  # Helpers
-        self.y = UnboundType('Y')
-        self.fx = TypeFixture()
-        self.function = self.fx.function
-
-    def test_any(self) -> None:
-        assert_equal(str(AnyType()), 'Any')
-
-    def test_simple_unbound_type(self) -> None:
-        u = UnboundType('Foo')
-        assert_equal(str(u), 'Foo?')
-
-    def test_generic_unbound_type(self) -> None:
-        u = UnboundType('Foo', [UnboundType('T'), AnyType()])
-        assert_equal(str(u), 'Foo?[T?, Any]')
-
-    def test_void_type(self) -> None:
-        assert_equal(str(Void(None)), 'void')
-
-    def test_callable_type(self) -> None:
-        c = CallableType([self.x, self.y],
-                         [ARG_POS, ARG_POS],
-                         [None, None],
-                         AnyType(), self.function)
-        assert_equal(str(c), 'def (X?, Y?) -> Any')
-
-        c2 = CallableType([], [], [], Void(None), None)
-        assert_equal(str(c2), 'def ()')
-
-    def test_callable_type_with_default_args(self) -> None:
-        c = CallableType([self.x, self.y], [ARG_POS, ARG_OPT], [None, None],
-                     AnyType(), self.function)
-        assert_equal(str(c), 'def (X?, Y? =) -> Any')
-
-        c2 = CallableType([self.x, self.y], [ARG_OPT, ARG_OPT], [None, None],
-                      AnyType(), self.function)
-        assert_equal(str(c2), 'def (X? =, Y? =) -> Any')
-
-    def test_callable_type_with_var_args(self) -> None:
-        c = CallableType([self.x], [ARG_STAR], [None], AnyType(), self.function)
-        assert_equal(str(c), 'def (*X?) -> Any')
-
-        c2 = CallableType([self.x, self.y], [ARG_POS, ARG_STAR],
-                      [None, None], AnyType(), self.function)
-        assert_equal(str(c2), 'def (X?, *Y?) -> Any')
-
-        c3 = CallableType([self.x, self.y], [ARG_OPT, ARG_STAR], [None, None],
-                      AnyType(), self.function)
-        assert_equal(str(c3), 'def (X? =, *Y?) -> Any')
-
-    def test_tuple_type(self) -> None:
-        assert_equal(str(TupleType([], None)), 'Tuple[]')
-        assert_equal(str(TupleType([self.x], None)), 'Tuple[X?]')
-        assert_equal(str(TupleType([self.x, AnyType()], None)), 'Tuple[X?, Any]')
-
-    def test_type_variable_binding(self) -> None:
-        assert_equal(str(TypeVarDef('X', 1, None, self.fx.o)), 'X')
-        assert_equal(str(TypeVarDef('X', 1, [self.x, self.y], self.fx.o)),
-                     'X in (X?, Y?)')
-
-    def test_generic_function_type(self) -> None:
-        c = CallableType([self.x, self.y], [ARG_POS, ARG_POS], [None, None],
-                     self.y, self.function, name=None,
-                     variables=[TypeVarDef('X', -1, None, self.fx.o)])
-        assert_equal(str(c), 'def [X] (X?, Y?) -> Y?')
-
-        v = [TypeVarDef('Y', -1, None, self.fx.o),
-             TypeVarDef('X', -2, None, self.fx.o)]
-        c2 = CallableType([], [], [], Void(None), self.function, name=None, variables=v)
-        assert_equal(str(c2), 'def [Y, X] ()')
-
-
-class TypeOpsSuite(Suite):
-    def set_up(self) -> None:
-        self.fx = TypeFixture(INVARIANT)
-        self.fx_co = TypeFixture(COVARIANT)
-        self.fx_contra = TypeFixture(CONTRAVARIANT)
-
-    # expand_type
-
-    def test_trivial_expand(self) -> None:
-        for t in (self.fx.a, self.fx.o, self.fx.t, self.fx.void, self.fx.nonet,
-                  self.tuple(self.fx.a),
-                  self.callable([], self.fx.a, self.fx.a), self.fx.anyt):
-            self.assert_expand(t, [], t)
-            self.assert_expand(t, [], t)
-            self.assert_expand(t, [], t)
-
-    def test_expand_naked_type_var(self) -> None:
-        self.assert_expand(self.fx.t, [(self.fx.t.id, self.fx.a)], self.fx.a)
-        self.assert_expand(self.fx.t, [(self.fx.s.id, self.fx.a)], self.fx.t)
-
-    def test_expand_basic_generic_types(self) -> None:
-        self.assert_expand(self.fx.gt, [(self.fx.t.id, self.fx.a)], self.fx.ga)
-
-    # IDEA: Add test cases for
-    #   tuple types
-    #   callable types
-    #   multiple arguments
-
-    def assert_expand(self,
-                      orig: Type,
-                      map_items: List[Tuple[TypeVarId, Type]],
-                      result: Type,
-                      ) -> None:
-        lower_bounds = {}
-
-        for id, t in map_items:
-            lower_bounds[id] = t
-
-        exp = expand_type(orig, lower_bounds)
-        # Remove erased tags (asterisks).
-        assert_equal(str(exp).replace('*', ''), str(result))
-
-    # erase_type
-
-    def test_trivial_erase(self) -> None:
-        for t in (self.fx.a, self.fx.o, self.fx.void, self.fx.nonet,
-                  self.fx.anyt, self.fx.err):
-            self.assert_erase(t, t)
-
-    def test_erase_with_type_variable(self) -> None:
-        self.assert_erase(self.fx.t, self.fx.anyt)
-
-    def test_erase_with_generic_type(self) -> None:
-        self.assert_erase(self.fx.ga, self.fx.gdyn)
-        self.assert_erase(self.fx.hab,
-                          Instance(self.fx.hi, [self.fx.anyt, self.fx.anyt]))
-
-    def test_erase_with_tuple_type(self) -> None:
-        self.assert_erase(self.tuple(self.fx.a), self.fx.std_tuple)
-
-    def test_erase_with_function_type(self) -> None:
-        self.assert_erase(self.fx.callable(self.fx.a, self.fx.b),
-                          self.fx.callable_type(self.fx.void))
-
-    def test_erase_with_type_object(self) -> None:
-        self.assert_erase(self.fx.callable_type(self.fx.a, self.fx.b),
-                          self.fx.callable_type(self.fx.void))
-
-    def test_erase_with_type_type(self) -> None:
-        self.assert_erase(self.fx.type_a, self.fx.type_a)
-        self.assert_erase(self.fx.type_t, self.fx.type_any)
-
-    def assert_erase(self, orig: Type, result: Type) -> None:
-        assert_equal(str(erase_type(orig)), str(result))
-
-    # is_more_precise
-
-    def test_is_more_precise(self) -> None:
-        fx = self.fx
-        assert_true(is_more_precise(fx.b, fx.a))
-        assert_true(is_more_precise(fx.b, fx.b))
-        assert_true(is_more_precise(fx.b, fx.b))
-        assert_true(is_more_precise(fx.b, fx.anyt))
-        assert_true(is_more_precise(self.tuple(fx.b, fx.a),
-                                    self.tuple(fx.b, fx.a)))
-
-        assert_false(is_more_precise(fx.a, fx.b))
-        assert_false(is_more_precise(fx.anyt, fx.b))
-        assert_false(is_more_precise(self.tuple(fx.b, fx.b),
-                                     self.tuple(fx.b, fx.a)))
-
-    # is_proper_subtype
-
-    def test_is_proper_subtype(self) -> None:
-        fx = self.fx
-
-        assert_true(is_proper_subtype(fx.a, fx.a))
-        assert_true(is_proper_subtype(fx.b, fx.a))
-        assert_true(is_proper_subtype(fx.b, fx.o))
-        assert_true(is_proper_subtype(fx.b, fx.o))
-
-        assert_false(is_proper_subtype(fx.a, fx.b))
-        assert_false(is_proper_subtype(fx.o, fx.b))
-
-        assert_true(is_proper_subtype(fx.anyt, fx.anyt))
-        assert_false(is_proper_subtype(fx.a, fx.anyt))
-        assert_false(is_proper_subtype(fx.anyt, fx.a))
-
-        assert_true(is_proper_subtype(fx.ga, fx.ga))
-        assert_true(is_proper_subtype(fx.gdyn, fx.gdyn))
-        assert_false(is_proper_subtype(fx.ga, fx.gdyn))
-        assert_false(is_proper_subtype(fx.gdyn, fx.ga))
-
-        assert_true(is_proper_subtype(fx.t, fx.t))
-        assert_false(is_proper_subtype(fx.t, fx.s))
-
-    def test_is_proper_subtype_covariance(self) -> None:
-        fx_co = self.fx_co
-
-        assert_true(is_proper_subtype(fx_co.gsab, fx_co.gb))
-        assert_true(is_proper_subtype(fx_co.gsab, fx_co.ga))
-        assert_false(is_proper_subtype(fx_co.gsaa, fx_co.gb))
-        assert_true(is_proper_subtype(fx_co.gb, fx_co.ga))
-        assert_false(is_proper_subtype(fx_co.ga, fx_co.gb))
-
-    def test_is_proper_subtype_contravariance(self) -> None:
-        fx_contra = self.fx_contra
-
-        assert_true(is_proper_subtype(fx_contra.gsab, fx_contra.gb))
-        assert_false(is_proper_subtype(fx_contra.gsab, fx_contra.ga))
-        assert_true(is_proper_subtype(fx_contra.gsaa, fx_contra.gb))
-        assert_false(is_proper_subtype(fx_contra.gb, fx_contra.ga))
-        assert_true(is_proper_subtype(fx_contra.ga, fx_contra.gb))
-
-    def test_is_proper_subtype_invariance(self) -> None:
-        fx = self.fx
-
-        assert_true(is_proper_subtype(fx.gsab, fx.gb))
-        assert_false(is_proper_subtype(fx.gsab, fx.ga))
-        assert_false(is_proper_subtype(fx.gsaa, fx.gb))
-        assert_false(is_proper_subtype(fx.gb, fx.ga))
-        assert_false(is_proper_subtype(fx.ga, fx.gb))
-
-    # can_be_true / can_be_false
-
-    def test_empty_tuple_always_false(self) -> None:
-        tuple_type = self.tuple()
-        assert_true(tuple_type.can_be_false)
-        assert_false(tuple_type.can_be_true)
-
-    def test_nonempty_tuple_always_true(self) -> None:
-        tuple_type = self.tuple(AnyType(), AnyType())
-        assert_true(tuple_type.can_be_true)
-        assert_false(tuple_type.can_be_false)
-
-    def test_union_can_be_true_if_any_true(self) -> None:
-        union_type = UnionType([self.fx.a, self.tuple()])
-        assert_true(union_type.can_be_true)
-
-    def test_union_can_not_be_true_if_none_true(self) -> None:
-        union_type = UnionType([self.tuple(), self.tuple()])
-        assert_false(union_type.can_be_true)
-
-    def test_union_can_be_false_if_any_false(self) -> None:
-        union_type = UnionType([self.fx.a, self.tuple()])
-        assert_true(union_type.can_be_false)
-
-    def test_union_can_not_be_false_if_none_false(self) -> None:
-        union_type = UnionType([self.tuple(self.fx.a), self.tuple(self.fx.d)])
-        assert_false(union_type.can_be_false)
-
-    # true_only / false_only
-
-    def test_true_only_of_false_type_is_uninhabited(self) -> None:
-        to = true_only(NoneTyp())
-        assert_type(UninhabitedType, to)
-
-    def test_true_only_of_true_type_is_idempotent(self) -> None:
-        always_true = self.tuple(AnyType())
-        to = true_only(always_true)
-        assert_true(always_true is to)
-
-    def test_true_only_of_instance(self) -> None:
-        to = true_only(self.fx.a)
-        assert_equal(str(to), "A")
-        assert_true(to.can_be_true)
-        assert_false(to.can_be_false)
-        assert_type(Instance, to)
-        # The original class still can be false
-        assert_true(self.fx.a.can_be_false)
-
-    def test_true_only_of_union(self) -> None:
-        tup_type = self.tuple(AnyType())
-        # Union of something that is unknown, something that is always true, something
-        # that is always false
-        union_type = UnionType([self.fx.a, tup_type, self.tuple()])
-        to = true_only(union_type)
-        assert isinstance(to, UnionType)
-        assert_equal(len(to.items), 2)
-        assert_true(to.items[0].can_be_true)
-        assert_false(to.items[0].can_be_false)
-        assert_true(to.items[1] is tup_type)
-
-    def test_false_only_of_true_type_is_uninhabited(self) -> None:
-        fo = false_only(self.tuple(AnyType()))
-        assert_type(UninhabitedType, fo)
-
-    def test_false_only_of_false_type_is_idempotent(self) -> None:
-        always_false = NoneTyp()
-        fo = false_only(always_false)
-        assert_true(always_false is fo)
-
-    def test_false_only_of_instance(self) -> None:
-        fo = false_only(self.fx.a)
-        assert_equal(str(fo), "A")
-        assert_false(fo.can_be_true)
-        assert_true(fo.can_be_false)
-        assert_type(Instance, fo)
-        # The original class still can be true
-        assert_true(self.fx.a.can_be_true)
-
-    def test_false_only_of_union(self) -> None:
-        tup_type = self.tuple()
-        # Union of something that is unknown, something that is always true, something
-        # that is always false
-        union_type = UnionType([self.fx.a, self.tuple(AnyType()), tup_type])
-        assert_equal(len(union_type.items), 3)
-        fo = false_only(union_type)
-        assert isinstance(fo, UnionType)
-        assert_equal(len(fo.items), 2)
-        assert_false(fo.items[0].can_be_true)
-        assert_true(fo.items[0].can_be_false)
-        assert_true(fo.items[1] is tup_type)
-
-    # Helpers
-
-    def tuple(self, *a: Type) -> TupleType:
-        return TupleType(list(a), self.fx.std_tuple)
-
-    def callable(self, vars: List[str], *a: Type) -> CallableType:
-        """callable(args, a1, ..., an, r) constructs a callable with
-        argument types a1, ... an and return type r and type arguments
-        vars.
-        """
-        tv = []  # type: List[TypeVarDef]
-        n = -1
-        for v in vars:
-            tv.append(TypeVarDef(v, n, None, self.fx.o))
-            n -= 1
-        return CallableType(list(a[:-1]),
-                            [ARG_POS] * (len(a) - 1),
-                            [None] * (len(a) - 1),
-                            a[-1],
-                            self.fx.function,
-                            name=None,
-                            variables=tv)
-
-
-class JoinSuite(Suite):
-    def set_up(self) -> None:
-        self.fx = TypeFixture()
-
-    def test_trivial_cases(self) -> None:
-        for simple in self.fx.void, self.fx.a, self.fx.o, self.fx.b:
-            self.assert_join(simple, simple, simple)
-
-    def test_class_subtyping(self) -> None:
-        self.assert_join(self.fx.a, self.fx.o, self.fx.o)
-        self.assert_join(self.fx.b, self.fx.o, self.fx.o)
-        self.assert_join(self.fx.a, self.fx.d, self.fx.o)
-        self.assert_join(self.fx.b, self.fx.c, self.fx.a)
-        self.assert_join(self.fx.b, self.fx.d, self.fx.o)
-
-    def test_tuples(self) -> None:
-        self.assert_join(self.tuple(), self.tuple(), self.tuple())
-        self.assert_join(self.tuple(self.fx.a),
-                         self.tuple(self.fx.a),
-                         self.tuple(self.fx.a))
-        self.assert_join(self.tuple(self.fx.b, self.fx.c),
-                         self.tuple(self.fx.a, self.fx.d),
-                         self.tuple(self.fx.a, self.fx.o))
-
-        self.assert_join(self.tuple(self.fx.a, self.fx.a),
-                         self.fx.std_tuple,
-                         self.fx.o)
-        self.assert_join(self.tuple(self.fx.a),
-                         self.tuple(self.fx.a, self.fx.a),
-                         self.fx.o)
-
-    def test_function_types(self) -> None:
-        self.assert_join(self.callable(self.fx.a, self.fx.b),
-                         self.callable(self.fx.a, self.fx.b),
-                         self.callable(self.fx.a, self.fx.b))
-
-        self.assert_join(self.callable(self.fx.a, self.fx.b),
-                         self.callable(self.fx.b, self.fx.b),
-                         self.fx.function)
-        self.assert_join(self.callable(self.fx.a, self.fx.b),
-                         self.callable(self.fx.a, self.fx.a),
-                         self.fx.function)
-        self.assert_join(self.callable(self.fx.a, self.fx.b),
-                         self.fx.function,
-                         self.fx.function)
-
-    def test_type_vars(self) -> None:
-        self.assert_join(self.fx.t, self.fx.t, self.fx.t)
-        self.assert_join(self.fx.s, self.fx.s, self.fx.s)
-        self.assert_join(self.fx.t, self.fx.s, self.fx.o)
-
-    def test_void(self) -> None:
-        self.assert_join(self.fx.void, self.fx.void, self.fx.void)
-        self.assert_join(self.fx.void, self.fx.anyt, self.fx.anyt)
-
-        # Join of any other type against void results in ErrorType, since there
-        # is no other meaningful result.
-        for t in [self.fx.a, self.fx.o, NoneTyp(), UnboundType('x'),
-                  self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b)]:
-            self.assert_join(t, self.fx.void, self.fx.err)
-
-    def test_none(self) -> None:
-        # Any type t joined with None results in t.
-        for t in [NoneTyp(), self.fx.a, self.fx.o, UnboundType('x'),
-                  self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b), self.fx.anyt]:
-            self.assert_join(t, NoneTyp(), t)
-
-    def test_unbound_type(self) -> None:
-        self.assert_join(UnboundType('x'), UnboundType('x'), self.fx.anyt)
-        self.assert_join(UnboundType('x'), UnboundType('y'), self.fx.anyt)
-
-        # Any type t joined with an unbound type results in dynamic. Unbound
-        # type means that there is an error somewhere in the program, so this
-        # does not affect type safety (whatever the result).
-        for t in [self.fx.a, self.fx.o, self.fx.ga, self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b)]:
-            self.assert_join(t, UnboundType('X'), self.fx.anyt)
-
-    def test_any_type(self) -> None:
-        # Join against 'Any' type always results in 'Any'.
-        for t in [self.fx.anyt, self.fx.a, self.fx.o, NoneTyp(),
-                  UnboundType('x'), self.fx.void, self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b)]:
-            self.assert_join(t, self.fx.anyt, self.fx.anyt)
-
-    def test_mixed_truth_restricted_type_simple(self) -> None:
-        # join_simple against differently restricted truthiness types drops restrictions.
-        true_a = true_only(self.fx.a)
-        false_o = false_only(self.fx.o)
-        j = join_simple(self.fx.o, true_a, false_o)
-        assert_true(j.can_be_true)
-        assert_true(j.can_be_false)
-
-    def test_mixed_truth_restricted_type(self) -> None:
-        # join_types against differently restricted truthiness types drops restrictions.
-        true_any = true_only(AnyType())
-        false_o = false_only(self.fx.o)
-        j = join_types(true_any, false_o)
-        assert_true(j.can_be_true)
-        assert_true(j.can_be_false)
-
-    def test_other_mixed_types(self) -> None:
-        # In general, joining unrelated types produces object.
-        for t1 in [self.fx.a, self.fx.t, self.tuple(),
-                   self.callable(self.fx.a, self.fx.b)]:
-            for t2 in [self.fx.a, self.fx.t, self.tuple(),
-                       self.callable(self.fx.a, self.fx.b)]:
-                if str(t1) != str(t2):
-                    self.assert_join(t1, t2, self.fx.o)
-
-    def test_error_type(self) -> None:
-        self.assert_join(self.fx.err, self.fx.anyt, self.fx.anyt)
-
-        # Meet against any type except dynamic results in ErrorType.
-        for t in [self.fx.a, self.fx.o, NoneTyp(), UnboundType('x'),
-                  self.fx.void, self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b)]:
-            self.assert_join(t, self.fx.err, self.fx.err)
-
-    def test_simple_generics(self) -> None:
-        self.assert_join(self.fx.ga, self.fx.ga, self.fx.ga)
-        self.assert_join(self.fx.ga, self.fx.gb, self.fx.ga)
-        self.assert_join(self.fx.ga, self.fx.gd, self.fx.o)
-        self.assert_join(self.fx.ga, self.fx.g2a, self.fx.o)
-
-        self.assert_join(self.fx.ga, self.fx.nonet, self.fx.ga)
-        self.assert_join(self.fx.ga, self.fx.anyt, self.fx.anyt)
-
-        for t in [self.fx.a, self.fx.o, self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b)]:
-            self.assert_join(t, self.fx.ga, self.fx.o)
-
-    def test_generics_with_multiple_args(self) -> None:
-        self.assert_join(self.fx.hab, self.fx.hab, self.fx.hab)
-        self.assert_join(self.fx.hab, self.fx.hbb, self.fx.hab)
-        self.assert_join(self.fx.had, self.fx.haa, self.fx.o)
-
-    def test_generics_with_inheritance(self) -> None:
-        self.assert_join(self.fx.gsab, self.fx.gb, self.fx.gb)
-        self.assert_join(self.fx.gsba, self.fx.gb, self.fx.ga)
-        self.assert_join(self.fx.gsab, self.fx.gd, self.fx.o)
-
-    def test_generics_with_inheritance_and_shared_supertype(self) -> None:
-        self.assert_join(self.fx.gsba, self.fx.gs2a, self.fx.ga)
-        self.assert_join(self.fx.gsab, self.fx.gs2a, self.fx.ga)
-        self.assert_join(self.fx.gsab, self.fx.gs2d, self.fx.o)
-
-    def test_generic_types_and_any(self) -> None:
-        self.assert_join(self.fx.gdyn, self.fx.ga, self.fx.gdyn)
-
-    def test_callables_with_any(self) -> None:
-        self.assert_join(self.callable(self.fx.a, self.fx.a, self.fx.anyt,
-                                       self.fx.a),
-                         self.callable(self.fx.a, self.fx.anyt, self.fx.a,
-                                       self.fx.anyt),
-                         self.callable(self.fx.a, self.fx.anyt, self.fx.anyt,
-                                       self.fx.anyt))
-
-    def test_overloaded(self) -> None:
-        c = self.callable
-
-        def ov(*items: CallableType) -> Overloaded:
-            return Overloaded(list(items))
-
-        fx = self.fx
-        func = fx.function
-        c1 = c(fx.a, fx.a)
-        c2 = c(fx.b, fx.b)
-        c3 = c(fx.c, fx.c)
-        self.assert_join(ov(c1, c2), c1, c1)
-        self.assert_join(ov(c1, c2), c2, c2)
-        self.assert_join(ov(c1, c2), ov(c1, c2), ov(c1, c2))
-        self.assert_join(ov(c1, c2), ov(c1, c3), c1)
-        self.assert_join(ov(c2, c1), ov(c3, c1), c1)
-        self.assert_join(ov(c1, c2), c3, func)
-
-    def test_overloaded_with_any(self) -> None:
-        c = self.callable
-
-        def ov(*items: CallableType) -> Overloaded:
-            return Overloaded(list(items))
-
-        fx = self.fx
-        any = fx.anyt
-        self.assert_join(ov(c(fx.a, fx.a), c(fx.b, fx.b)), c(any, fx.b), c(any, fx.b))
-        self.assert_join(ov(c(fx.a, fx.a), c(any, fx.b)), c(fx.b, fx.b), c(any, fx.b))
-
-    def test_join_interface_types(self) -> None:
-        self.skip()  # FIX
-        self.assert_join(self.fx.f, self.fx.f, self.fx.f)
-        self.assert_join(self.fx.f, self.fx.f2, self.fx.o)
-        self.assert_join(self.fx.f, self.fx.f3, self.fx.f)
-
-    def test_join_interface_and_class_types(self) -> None:
-        self.skip()  # FIX
-
-        self.assert_join(self.fx.o, self.fx.f, self.fx.o)
-        self.assert_join(self.fx.a, self.fx.f, self.fx.o)
-
-        self.assert_join(self.fx.e, self.fx.f, self.fx.f)
-
-    def test_join_class_types_with_interface_result(self) -> None:
-        self.skip()  # FIX
-        # Unique result
-        self.assert_join(self.fx.e, self.fx.e2, self.fx.f)
-
-        # Ambiguous result
-        self.assert_join(self.fx.e2, self.fx.e3, self.fx.err)
-
-    def test_generic_interfaces(self) -> None:
-        self.skip()  # FIX
-
-        fx = InterfaceTypeFixture()
-
-        self.assert_join(fx.gfa, fx.gfa, fx.gfa)
-        self.assert_join(fx.gfa, fx.gfb, fx.o)
-
-        self.assert_join(fx.m1, fx.gfa, fx.gfa)
-
-        self.assert_join(fx.m1, fx.gfb, fx.o)
-
-    def test_simple_type_objects(self) -> None:
-        t1 = self.type_callable(self.fx.a, self.fx.a)
-        t2 = self.type_callable(self.fx.b, self.fx.b)
-
-        self.assert_join(t1, t1, t1)
-        j = join_types(t1, t1)
-        assert isinstance(j, CallableType)
-        assert_true(j.is_type_obj())
-
-        self.assert_join(t1, t2, self.fx.type_type)
-        self.assert_join(t1, self.fx.type_type, self.fx.type_type)
-        self.assert_join(self.fx.type_type, self.fx.type_type,
-                         self.fx.type_type)
-
-    def test_type_type(self) -> None:
-        self.assert_join(self.fx.type_a, self.fx.type_b, self.fx.type_a)
-        self.assert_join(self.fx.type_b, self.fx.type_any, self.fx.type_any)
-        self.assert_join(self.fx.type_b, self.fx.type_type, self.fx.type_type)
-        self.assert_join(self.fx.type_b, self.fx.type_c, self.fx.type_a)
-        self.assert_join(self.fx.type_c, self.fx.type_d, TypeType(self.fx.o))
-        self.assert_join(self.fx.type_type, self.fx.type_any, self.fx.type_type)
-        self.assert_join(self.fx.type_b, self.fx.anyt, self.fx.anyt)
-
-    # There are additional test cases in check-inference.test.
-
-    # TODO: Function types + varargs and default args.
-
-    def assert_join(self, s: Type, t: Type, join: Type) -> None:
-        self.assert_simple_join(s, t, join)
-        self.assert_simple_join(t, s, join)
-
-    def assert_simple_join(self, s: Type, t: Type, join: Type) -> None:
-        result = join_types(s, t)
-        actual = str(result)
-        expected = str(join)
-        assert_equal(actual, expected,
-                     'join({}, {}) == {{}} ({{}} expected)'.format(s, t))
-        if not isinstance(s, ErrorType) and not isinstance(result, ErrorType):
-            assert_true(is_subtype(s, result),
-                        '{} not subtype of {}'.format(s, result))
-        if not isinstance(t, ErrorType) and not isinstance(result, ErrorType):
-            assert_true(is_subtype(t, result),
-                        '{} not subtype of {}'.format(t, result))
-
-    def tuple(self, *a: Type) -> TupleType:
-        return TupleType(list(a), self.fx.std_tuple)
-
-    def callable(self, *a: Type) -> CallableType:
-        """callable(a1, ..., an, r) constructs a callable with argument types
-        a1, ... an and return type r.
-        """
-        n = len(a) - 1
-        return CallableType(list(a[:-1]), [ARG_POS] * n, [None] * n,
-                        a[-1], self.fx.function)
-
-    def type_callable(self, *a: Type) -> CallableType:
-        """type_callable(a1, ..., an, r) constructs a callable with
-        argument types a1, ... an and return type r, and which
-        represents a type.
-        """
-        n = len(a) - 1
-        return CallableType(list(a[:-1]), [ARG_POS] * n, [None] * n,
-                        a[-1], self.fx.type_type)
-
-
-class MeetSuite(Suite):
-    def set_up(self) -> None:
-        self.fx = TypeFixture()
-
-    def test_trivial_cases(self) -> None:
-        for simple in self.fx.void, self.fx.a, self.fx.o, self.fx.b:
-            self.assert_meet(simple, simple, simple)
-
-    def test_class_subtyping(self) -> None:
-        self.assert_meet(self.fx.a, self.fx.o, self.fx.a)
-        self.assert_meet(self.fx.a, self.fx.b, self.fx.b)
-        self.assert_meet(self.fx.b, self.fx.o, self.fx.b)
-        self.assert_meet(self.fx.a, self.fx.d, NoneTyp())
-        self.assert_meet(self.fx.b, self.fx.c, NoneTyp())
-
-    def test_tuples(self) -> None:
-        self.assert_meet(self.tuple(), self.tuple(), self.tuple())
-        self.assert_meet(self.tuple(self.fx.a),
-                         self.tuple(self.fx.a),
-                         self.tuple(self.fx.a))
-        self.assert_meet(self.tuple(self.fx.b, self.fx.c),
-                         self.tuple(self.fx.a, self.fx.d),
-                         self.tuple(self.fx.b, NoneTyp()))
-
-        self.assert_meet(self.tuple(self.fx.a, self.fx.a),
-                         self.fx.std_tuple,
-                         NoneTyp())
-        self.assert_meet(self.tuple(self.fx.a),
-                         self.tuple(self.fx.a, self.fx.a),
-                         NoneTyp())
-
-    def test_function_types(self) -> None:
-        self.assert_meet(self.callable(self.fx.a, self.fx.b),
-                         self.callable(self.fx.a, self.fx.b),
-                         self.callable(self.fx.a, self.fx.b))
-
-        self.assert_meet(self.callable(self.fx.a, self.fx.b),
-                         self.callable(self.fx.b, self.fx.b),
-                         NoneTyp())
-        self.assert_meet(self.callable(self.fx.a, self.fx.b),
-                         self.callable(self.fx.a, self.fx.a),
-                         NoneTyp())
-
-    def test_type_vars(self) -> None:
-        self.assert_meet(self.fx.t, self.fx.t, self.fx.t)
-        self.assert_meet(self.fx.s, self.fx.s, self.fx.s)
-        self.assert_meet(self.fx.t, self.fx.s, NoneTyp())
-
-    def test_void(self) -> None:
-        self.assert_meet(self.fx.void, self.fx.void, self.fx.void)
-        self.assert_meet(self.fx.void, self.fx.anyt, self.fx.void)
-
-        # Meet of any other type against void results in ErrorType, since there
-        # is no meaningful valid result.
-        for t in [self.fx.a, self.fx.o, UnboundType('x'), NoneTyp(),
-                  self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b)]:
-            self.assert_meet(t, self.fx.void, self.fx.err)
-
-    def test_none(self) -> None:
-        self.assert_meet(NoneTyp(), NoneTyp(), NoneTyp())
-
-        self.assert_meet(NoneTyp(), self.fx.anyt, NoneTyp())
-        self.assert_meet(NoneTyp(), self.fx.void, self.fx.err)
-
-        # Any type t joined with None results in None, unless t is any or
-        # void.
-        for t in [self.fx.a, self.fx.o, UnboundType('x'), self.fx.t,
-                  self.tuple(), self.callable(self.fx.a, self.fx.b)]:
-            self.assert_meet(t, NoneTyp(), NoneTyp())
-
-    def test_unbound_type(self) -> None:
-        self.assert_meet(UnboundType('x'), UnboundType('x'), self.fx.anyt)
-        self.assert_meet(UnboundType('x'), UnboundType('y'), self.fx.anyt)
-
-        self.assert_meet(UnboundType('x'), self.fx.void, self.fx.err)
-        self.assert_meet(UnboundType('x'), self.fx.anyt, UnboundType('x'))
-
-        # The meet of any type t with an unbound type results in dynamic
-        # (except for void). Unbound type means that there is an error
-        # somewhere in the program, so this does not affect type safety.
-        for t in [self.fx.a, self.fx.o, self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b)]:
-            self.assert_meet(t, UnboundType('X'), self.fx.anyt)
-
-    def test_dynamic_type(self) -> None:
-        # Meet against dynamic type always results in dynamic.
-        for t in [self.fx.anyt, self.fx.a, self.fx.o, NoneTyp(),
-                  UnboundType('x'), self.fx.void, self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b)]:
-            self.assert_meet(t, self.fx.anyt, t)
-
-    def test_error_type(self) -> None:
-        self.assert_meet(self.fx.err, self.fx.anyt, self.fx.err)
-
-        # Meet against any type except dynamic results in ErrorType.
-        for t in [self.fx.a, self.fx.o, NoneTyp(), UnboundType('x'),
-                  self.fx.void, self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b)]:
-            self.assert_meet(t, self.fx.err, self.fx.err)
-
-    def test_simple_generics(self) -> None:
-        self.assert_meet(self.fx.ga, self.fx.ga, self.fx.ga)
-        self.assert_meet(self.fx.ga, self.fx.o, self.fx.ga)
-        self.assert_meet(self.fx.ga, self.fx.gb, self.fx.gb)
-        self.assert_meet(self.fx.ga, self.fx.gd, self.fx.nonet)
-        self.assert_meet(self.fx.ga, self.fx.g2a, self.fx.nonet)
-
-        self.assert_meet(self.fx.ga, self.fx.nonet, self.fx.nonet)
-        self.assert_meet(self.fx.ga, self.fx.anyt, self.fx.ga)
-
-        for t in [self.fx.a, self.fx.t, self.tuple(),
-                  self.callable(self.fx.a, self.fx.b)]:
-            self.assert_meet(t, self.fx.ga, self.fx.nonet)
-
-    def test_generics_with_multiple_args(self) -> None:
-        self.assert_meet(self.fx.hab, self.fx.hab, self.fx.hab)
-        self.assert_meet(self.fx.hab, self.fx.haa, self.fx.hab)
-        self.assert_meet(self.fx.hab, self.fx.had, self.fx.nonet)
-        self.assert_meet(self.fx.hab, self.fx.hbb, self.fx.hbb)
-
-    def test_generics_with_inheritance(self) -> None:
-        self.assert_meet(self.fx.gsab, self.fx.gb, self.fx.gsab)
-        self.assert_meet(self.fx.gsba, self.fx.gb, self.fx.nonet)
-
-    def test_generics_with_inheritance_and_shared_supertype(self) -> None:
-        self.assert_meet(self.fx.gsba, self.fx.gs2a, self.fx.nonet)
-        self.assert_meet(self.fx.gsab, self.fx.gs2a, self.fx.nonet)
-
-    def test_generic_types_and_dynamic(self) -> None:
-        self.assert_meet(self.fx.gdyn, self.fx.ga, self.fx.ga)
-
-    def test_callables_with_dynamic(self) -> None:
-        self.assert_meet(self.callable(self.fx.a, self.fx.a, self.fx.anyt,
-                                       self.fx.a),
-                         self.callable(self.fx.a, self.fx.anyt, self.fx.a,
-                                       self.fx.anyt),
-                         self.callable(self.fx.a, self.fx.anyt, self.fx.anyt,
-                                       self.fx.anyt))
-
-    def test_meet_interface_types(self) -> None:
-        self.assert_meet(self.fx.f, self.fx.f, self.fx.f)
-        self.assert_meet(self.fx.f, self.fx.f2, self.fx.nonet)
-        self.assert_meet(self.fx.f, self.fx.f3, self.fx.f3)
-
-    def test_meet_interface_and_class_types(self) -> None:
-        self.assert_meet(self.fx.o, self.fx.f, self.fx.f)
-        self.assert_meet(self.fx.a, self.fx.f, self.fx.nonet)
-
-        self.assert_meet(self.fx.e, self.fx.f, self.fx.e)
-
-    def test_meet_class_types_with_shared_interfaces(self) -> None:
-        # These have nothing special with respect to meets, unlike joins. These
-        # are for completeness only.
-        self.assert_meet(self.fx.e, self.fx.e2, self.fx.nonet)
-        self.assert_meet(self.fx.e2, self.fx.e3, self.fx.nonet)
-
-    def test_meet_with_generic_interfaces(self) -> None:
-        # TODO fix
-        self.skip()
-
-        fx = InterfaceTypeFixture()
-        self.assert_meet(fx.gfa, fx.m1, fx.m1)
-        self.assert_meet(fx.gfa, fx.gfa, fx.gfa)
-        self.assert_meet(fx.gfb, fx.m1, fx.nonet)
-
-    def test_type_type(self) -> None:
-        self.assert_meet(self.fx.type_a, self.fx.type_b, self.fx.type_b)
-        self.assert_meet(self.fx.type_b, self.fx.type_any, self.fx.type_b)
-        self.assert_meet(self.fx.type_b, self.fx.type_type, self.fx.type_b)
-        self.assert_meet(self.fx.type_b, self.fx.type_c, self.fx.nonet)
-        self.assert_meet(self.fx.type_c, self.fx.type_d, self.fx.nonet)
-        self.assert_meet(self.fx.type_type, self.fx.type_any, self.fx.type_any)
-        self.assert_meet(self.fx.type_b, self.fx.anyt, self.fx.type_b)
-
-    # FIX generic interfaces + ranges
-
-    def assert_meet(self, s: Type, t: Type, meet: Type) -> None:
-        self.assert_simple_meet(s, t, meet)
-        self.assert_simple_meet(t, s, meet)
-
-    def assert_simple_meet(self, s: Type, t: Type, meet: Type) -> None:
-        result = meet_types(s, t)
-        actual = str(result)
-        expected = str(meet)
-        assert_equal(actual, expected,
-                     'meet({}, {}) == {{}} ({{}} expected)'.format(s, t))
-        if not isinstance(s, ErrorType) and not isinstance(result, ErrorType):
-            assert_true(is_subtype(result, s),
-                        '{} not subtype of {}'.format(result, s))
-        if not isinstance(t, ErrorType) and not isinstance(result, ErrorType):
-            assert_true(is_subtype(result, t),
-                        '{} not subtype of {}'.format(result, t))
-
-    def tuple(self, *a: Type) -> TupleType:
-        return TupleType(list(a), self.fx.std_tuple)
-
-    def callable(self, *a: Type) -> CallableType:
-        """callable(a1, ..., an, r) constructs a callable with argument types
-        a1, ... an and return type r.
-        """
-        n = len(a) - 1
-        return CallableType(list(a[:-1]),
-                            [ARG_POS] * n, [None] * n,
-                            a[-1], self.fx.function)
diff --git a/mypy_self_check.ini b/mypy_self_check.ini
deleted file mode 100644
index 3d54bd3..0000000
--- a/mypy_self_check.ini
+++ /dev/null
@@ -1,15 +0,0 @@
-[mypy]
-disallow_untyped_defs = True
-
-; historical exceptions
-[mypy-mypy.test.testextensions]
-disallow_untyped_defs = False
-
-[mypy-mypy.test.testlex]
-disallow_untyped_defs = False
-
-[mypy-mypy.test.data]
-disallow_untyped_defs = False
-
-[mypy-mypy.typefixture]
-disallow_untyped_defs = False
diff --git a/mypy_strict_optional.ini b/mypy_strict_optional.ini
deleted file mode 100644
index 3b7d272..0000000
--- a/mypy_strict_optional.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-; Mypy is run both with and without this config file in CI.
-; This allows us to make mypy strict Optional compliant over time.
-[mypy]
-strict_optional = True
-ignore_errors = True
diff --git a/pinfer/.gitignore b/pinfer/.gitignore
deleted file mode 100644
index e1dace5..0000000
--- a/pinfer/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-__pycache__
-*~
-*.pyc
diff --git a/pinfer/LICENSE b/pinfer/LICENSE
deleted file mode 100644
index ecdce98..0000000
--- a/pinfer/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-pinfer is licensed under the terms of the MIT license, reproduced below.
-
-= = = = =
-
-The MIT License
-
-Copyright (c) 2013, 2014 Jukka Lehtosalo
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-= = = = =
diff --git a/pinfer/README b/pinfer/README
deleted file mode 100644
index 1f4fe4c..0000000
--- a/pinfer/README
+++ /dev/null
@@ -1,47 +0,0 @@
-ReadMe for pinfer
-=================
-
-Introduction
-------------
-
-Pinfer is tool for runtime type inference of variable types and
-function signatures in Python programs. The inferred types are mostly
-compatible with mypy types. It is intended for coming up with draft
-types when migrating Python code to static typing, but it can also be
-used as a code understanding or analysis tool.
-
-Pinfer is very experimental!
-
-Requirements
-------------
-
- * Python 3.2 or later
-
-Basic usage
------------
-
-To infer types of all functions and methods in a module:
-
-  import foo   # target module
-  import pinfer
-
-  # set up type inference and dumping
-  pinfer.infer_module(foo)
-  pinfer.dump_at_exit()
-
-  # now do something with the module, e.g. run tests
-
-For inferring a Python module, add the above lines to the test suite.
-
-Handy wrapper
--------------
-
-The p.py script provides a handy wrapper for the above.
-
-
-Copyright
--------------
-
-This project includes files from the open source CPython project.  Those files are Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved.  The license can be found at https://github.com/python/cpython/blob/master/LICENSE.
-
diff --git a/pinfer/inspect3.py b/pinfer/inspect3.py
deleted file mode 100644
index 4d74be1..0000000
--- a/pinfer/inspect3.py
+++ /dev/null
@@ -1,122 +0,0 @@
-# from Python 3's inspect.py
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved
-'''
-provide getfullargspec() and getcallargs() for Python 2
-'''
-
-import sys
-import inspect
-
-if sys.version_info.major == 2:
-
-    def getfullargspec(func):
-        (args, varargs, keywords, defaults) = inspect.getargspec(func)
-        return (args, varargs, keywords, defaults, [], [], {})
-
-
-    def getcallargs(*func_and_positional, **named):
-        """Get the mapping of arguments to values.
-
-        A dict is returned, with keys the function argument names (including the
-        names of the * and ** arguments, if any), and values the respective bound
-        values from 'positional' and 'named'."""
-        func = func_and_positional[0]
-        positional = func_and_positional[1:]
-        spec = getfullargspec(func)
-        args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec
-        f_name = func.__name__
-        arg2value = {}
-
-
-        if inspect.ismethod(func) and func.__self__ is not None:
-            # implicit 'self' (or 'cls' for classmethods) argument
-            positional = (func.__self__,) + positional
-        num_pos = len(positional)
-        num_args = len(args)
-        num_defaults = len(defaults) if defaults else 0
-
-        n = min(num_pos, num_args)
-        for i in range(n):
-            arg2value[args[i]] = positional[i]
-        if varargs:
-            arg2value[varargs] = tuple(positional[n:])
-        possible_kwargs = set(args + kwonlyargs)
-        if varkw:
-            arg2value[varkw] = {}
-        for kw, value in named.items():
-            if kw not in possible_kwargs:
-                if not varkw:
-                    raise TypeError("%s() got an unexpected keyword argument %r" %
-                                    (f_name, kw))
-                arg2value[varkw][kw] = value
-                continue
-            if kw in arg2value:
-                raise TypeError("%s() got multiple values for argument %r" %
-                                (f_name, kw))
-            arg2value[kw] = value
-        if num_pos > num_args and not varargs:
-            _too_many(f_name, args, kwonlyargs, varargs, num_defaults,
-                       num_pos, arg2value)
-        if num_pos < num_args:
-            req = args[:num_args - num_defaults]
-            for arg in req:
-                if arg not in arg2value:
-                    _missing_arguments(f_name, req, True, arg2value)
-            for i, arg in enumerate(args[num_args - num_defaults:]):
-                if arg not in arg2value:
-                    arg2value[arg] = defaults[i]
-        missing = 0
-        for kwarg in kwonlyargs:
-            if kwarg not in arg2value:
-                if kwonlydefaults and kwarg in kwonlydefaults:
-                    arg2value[kwarg] = kwonlydefaults[kwarg]
-                else:
-                    missing += 1
-        if missing:
-            _missing_arguments(f_name, kwonlyargs, False, arg2value)
-        return arg2value
-
-
-    def _too_many(f_name, args, kwonly, varargs, defcount, given, values):
-        atleast = len(args) - defcount
-        kwonly_given = len([arg for arg in kwonly if arg in values])
-        if varargs:
-            plural = atleast != 1
-            sig = "at least %d" % (atleast,)
-        elif defcount:
-            plural = True
-            sig = "from %d to %d" % (atleast, len(args))
-        else:
-            plural = len(args) != 1
-            sig = str(len(args))
-        kwonly_sig = ""
-        if kwonly_given:
-            msg = " positional argument%s (and %d keyword-only argument%s)"
-            kwonly_sig = (msg % ("s" if given != 1 else "", kwonly_given,
-                                 "s" if kwonly_given != 1 else ""))
-        raise TypeError("%s() takes %s positional argument%s but %d%s %s given" %
-                (f_name, sig, "s" if plural else "", given, kwonly_sig,
-                 "was" if given == 1 and not kwonly_given else "were"))
-
-
-    def _missing_arguments(f_name, argnames, pos, values):
-        names = [repr(name) for name in argnames if name not in values]
-        missing = len(names)
-        if missing == 1:
-            s = names[0]
-        elif missing == 2:
-            s = "{} and {}".format(*names)
-        else:
-            tail = ", {} and {}".format(*names[-2:])
-            del names[-2:]
-            s = ", ".join(names) + tail
-        raise TypeError("%s() missing %i required %s argument%s: %s" %
-                        (f_name, missing,
-                          "positional" if pos else "keyword-only",
-                          "" if missing == 1 else "s", s))
-
-
-else:
-    getfullargspec = inspect.getfullargspec
-    getcallargs = inspect.getcallargs
diff --git a/pinfer/p.py b/pinfer/p.py
deleted file mode 100644
index 451038d..0000000
--- a/pinfer/p.py
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/usr/bin/env python3
-"""Stub to run pinfer on a module.
-
-Usage:
-
-  p.py targetmod testfile [outfile] [ -- testargs]
-
-Where:
-
-  targetmod:  the full target module (e.g. textwrap)
-  testfile: the full test module file (e.g. test/test_textwrap.py)
-  outfile:  where to write the annotated module.  If unspecified, will
-            write stubs at end of stdout.
-
-Example invocation:
-
-  python3 p.py textwrap test/test_textwrap.py
-"""
-
-
-import sys
-import imp
-import pinfer
-import os
-import atexit
-import inspect
-
-iport = __builtins__.__import__
-watched = set()
-
-
-def inferring_import(*args, **kwargs):
-    module = iport(*args, **kwargs)
-    if module not in watched:
-        watched.add(module)
-        pinfer.infer_module(module)
-    return module
-
-
-def main():
-    if '--' in sys.argv:
-        argslen = sys.argv.index('--')
-    else:
-        argslen = len(sys.argv)
-    args = sys.argv[1:argslen]
-    del sys.argv[1:argslen + 1]
-
-    if len(args) == 2:
-        targetpackage, testfile = args
-        outfile = None
-    elif len(args) == 3:
-        targetpackage, testfile, outfile = args
-    else:
-        sys.stderr.write('Usage: %s targetmodule testfile [outfile] [ -- testargs]\n' %
-                         sys.argv[0])
-        sys.exit(2)
-
-    # help us with local imports
-    filemodule = os.path.dirname(os.path.abspath(testfile))
-    sys.path.append(filemodule)
-
-    targetmod = __import__(targetpackage)
-    targetfile = inspect.getfile(targetmod)
-    pinfer.infer_module(targetmod)
-
-    if outfile:
-        @atexit.register
-        def rewrite_file(targetfile=targetfile, outfile=outfile, pinfer=pinfer):
-            if targetfile.endswith(".pyc"):
-                targetfile = targetfile[0:-1]
-            annotated = pinfer.annotate_file(targetfile)
-            open(outfile, "w").write(annotated)
-    else:
-        pinfer.dump_at_exit()
-
-    pinfer.ignore_files.add(os.path.abspath(testfile))
-
-    # run testfile as main
-    del sys.modules['__main__']
-    imp.load_source('__main__', testfile)
-
-if __name__ == '__main__':
-    main()
diff --git a/pinfer/pinfer.py b/pinfer/pinfer.py
deleted file mode 100644
index 3dd1445..0000000
--- a/pinfer/pinfer.py
+++ /dev/null
@@ -1,686 +0,0 @@
-"""Tools for runtime type inference"""
-
-import inspect
-from inspect3 import getfullargspec, getcallargs
-import types
-import codecs
-import os
-import tokenize
-try:
-    from StringIO import StringIO
-    from unparse import Unparser
-except:
-    from io import StringIO
-    from unparse3 import Unparser
-import ast
-
-
-MAX_INFERRED_TUPLE_LENGTH = 10
-PREFERRED_LINE_LENGTH = 79
-
-
-var_db = {}  # (location, variable) -> type
-func_argid_db = {}  # funcid -> argspec
-func_arg_db = {}  # (funcid, name) -> type
-func_return_db = {}  # funcname -> type
-func_source_db = {}  # funcid -> source string
-#func_info_db = {}  # funcid -> (class, name, argspec, file, line, source)
-ignore_files = set()
-
-# The type inferencing wrapper should not be reentrant.  It's not, in theory, calling
-# out to any external code which we would want to infer the types of.  However,
-# sometimes we do something like infer_type(arg.keys()) or infer_type(arg.values()) if
-# the arg is a collection, and we want to know about the types of its elements.  .keys(),
-# .values(), etc. can be overloaded, possibly to a method we've wrapped.  This can become
-# infinitely recursive, particularly because on something like arg.keys(), keys() gets passed
-# arg as the first parameter, so if we've wrapped keys() we'll try to infer_type(arg),
-# which will detect it's a dictionary, call infer_type(arg.keys()), recurse and so on.
-# We ran in to this problem with collections.OrderedDict.
-# To prevent reentrancy, we set is_performing_inference = True iff we're in the middle of
-# inferring the types of a function.  If we try to run another function we've wrapped,
-# we skip type inferencing so we can't accidentally infinitely recurse.
-is_performing_inference = False
-
-
-def reset():
-    global var_db, func_argid_db, func_arg_db, func_return_db, func_source_db
-    global ignore_files, is_performing_inference
-    var_db = {}
-    func_arg_db = {}
-    func_return_db = {}
-    # we don't actually want to clear these on reset(), or we'll
-    # lose the functions we've already wrapped forever.
-    #func_source_db = {}
-    #func_argid_db = {}
-    is_performing_inference = False
-    ignore_files = set()
-
-
-def format_state(pretty=False):
-    lines = []
-    for loc, var in sorted(var_db.keys()):
-        lines.append('%s: %s' % (var, var_db[(loc, var)]))
-    funcnames = sorted(set(func_return_db.keys()))
-    prevclass = ''
-    indent = ''
-    for funcid in funcnames:
-        curclass, name, sourcefile, sourceline = funcid
-        if curclass != prevclass:
-            if curclass:
-                lines.append('class %s(...):' % curclass)
-                indent = ' ' * 4
-            else:
-                indent = ''
-            prevclass = curclass
-
-        lines.append(format_sig(funcid, name, indent, pretty))
-    return '\n'.join(lines)
-
-
-def unparse_ast(node):
-    buf = StringIO()
-    Unparser(node, buf)
-    return buf.getvalue().strip()
-
-
-def format_sig(funcid, fname, indent, pretty, defaults=[]):
-    (argnames, varargs, varkw, _, kwonlyargs, _, _) = func_argid_db[funcid]
-
-    # to get defaults, parse the function, get the nodes for the
-    # defaults, then unparse them
-    try:
-        fn_ast = ast.parse(func_source_db[funcid].strip()).body[0]
-
-        # override fname if we parsed a different one
-        fname = fn_ast.name
-
-        defaults = [unparse_ast(dn) for dn in fn_ast.args.defaults]
-
-        if hasattr(fn_ast.args, 'kw_defaults'):
-            kwonly_defaults = [unparse_ast(dn) for dn in fn_ast.args.kw_defaults]
-        else:
-            kwonly_defaults = []
-    except:
-        defaults, kwonly_defaults = [], []
-    finally:
-        # pad defaults to match the length of args
-        defaults = ([None] * (len(argnames) - len(defaults))) + defaults
-        kwonly_defaults = ([None] * (len(kwonlyargs) - len(kwonly_defaults))) + kwonly_defaults
-
-    args = [('', arg, default) for (arg, default) in zip(argnames, defaults)]
-
-    if varargs:
-        args += [('*', varargs, None)]
-    elif len(kwonlyargs) > 0:
-        args += [('*', '', None)]
-    if len(kwonlyargs) > 0:
-        args += [('', arg, default) for (arg, default) in zip(kwonlyargs, kwonly_defaults)]
-    if varkw:
-        args += [('**', varkw, None)]
-
-    argstrs = []
-    for i, (prefix, arg, default) in enumerate(args):
-        argstr = prefix + arg
-
-        # Omit type of self argument.
-        if (funcid, arg) in func_arg_db and not (i == 0 and arg == 'self'):
-            argstr += ': %s' % func_arg_db[(funcid, arg)]
-
-        if default:
-            argstr += ' = %s' % default
-
-        argstrs.append(argstr)
-
-    ret = str(func_return_db.get(funcid, Unknown()))
-
-    sig = 'def %s(%s) -> %s' % (fname, ', '.join(argstrs), ret)
-    if not pretty or len(sig) <= PREFERRED_LINE_LENGTH or not args:
-        return indent + sig
-
-    else:
-        # Format into multiple lines to conserve horizontal space.
-        first = indent + 'def %s(' % fname
-        extra_indent = first.index('(') + 1
-
-        decl = indent + first
-        decl += (',\n' + indent + ' ' * extra_indent).join(argstrs)
-        decl += ')\n%s -> %s' % (indent + ' ' * (extra_indent - 4), ret)
-        return decl
-
-
-def annotate_file(path):
-    # this should be documented somewhere...
-    INDENT_TOKEN = 5
-
-    with open(path, 'r') as targetfile:
-        source = targetfile.read()
-
-    line_offsets = []
-    source_length = 0
-    for line in source.split('\n'):
-        line_offsets.append(source_length)
-        source_length = source_length + len(line) + 1
-
-    funcids = set(funcid for funcid, arg in func_arg_db)
-
-    # list of (oldstart, oldend, replacement)
-    replacements = []  # type: List[Tuple[Int, Int, String]]
-
-    for funcid in funcids:
-        class_name, name, sourcefile, def_start_line = funcid
-        if sourcefile != path:
-            continue
-
-        func_source = func_source_db[funcid]
-        tokens = list(tokenize.generate_tokens(StringIO(func_source).readline))
-        assert len(tokens) > 0
-
-        # we're making the assumption that the def at least gets to start on
-        # it's own line, which is fine for non-lambdas
-
-        if tokens[0][0] == INDENT_TOKEN:
-            indent = tokens[0][1]
-            del tokens[0]
-        else:
-            indent = ''
-
-        # Find the first indent, which should be between the end of the def
-        # and before the start of the body.  Then find the preceding colon,
-        # which should be at the end of the def.
-
-        for indent_loc in range(len(tokens)):
-            if tokens[indent_loc][0] == INDENT_TOKEN:
-                function_is_one_line = False
-                break
-            else:
-                function_is_one_line = True
-
-        if function_is_one_line:
-            # we're also making the assumption that the def has an indent on the
-            # line following the signature, which is true almost all of the time.
-            # If this is not the case, we should just leave a comment above the
-            # function, although I might not have time to do that now.
-            continue
-
-        for def_end_loc in range(indent_loc, -1, -1):
-            if tokens[def_end_loc][1] == ':':
-                break
-
-        assert def_end_loc > 0
-
-        def_end_line, def_end_col = tokens[def_end_loc][2]
-        def_end_line -= 1  # the tokenizer apparently 1-indexes lines
-        def_end_line += def_start_line
-
-        def_start_offset = line_offsets[def_start_line]
-        def_end_offset = line_offsets[def_end_line] + def_end_col
-
-        annotated_def = format_sig(funcid, name, indent, True)
-
-        replacements.append((def_start_offset, def_end_offset, annotated_def))
-
-    # ideally, we'd put this after the docstring
-    replacements.append((0, 0, "from typing import List, Dict, Set, Tuple, Callable, Pattern, Match, Union, Optional\n"))
-
-    # absurdly inefficient algorithm: replace with O(n) writer
-
-    for (start, end, replacement) in sorted(replacements, key=lambda r: r[0], reverse=True):
-        source = source[0:start] + replacement + source[end:]
-
-    return source
-
-
-def dump():
-    s = format_state(pretty=True)
-    if s:
-        print()
-        print('INFERRED TYPES:')
-        print(s)
-    reset()
-
-
-def dump_at_exit():
-    import atexit
-    atexit.register(dump)
-
-
-def get_defining_file(obj):
-    try:
-        path = os.path.abspath(inspect.getfile(obj))
-        if path.endswith('.pyc'):
-            path = path[0:-1]
-        return path
-    except:
-        return None
-
-
-def infer_var(name, value):
-    key = (None, name)
-    update_var_db(key, value)
-
-
-def infer_attrs(x):
-    if hasattr(x, '__class__'):
-        t = x.__class__
-    else:
-        t = type(x)
-    cls = t.__name__
-    typedict = t.__dict__
-    for dict in x.__dict__, typedict:
-        for attr, value in dict.items():
-            if attr in ('__dict__', '__doc__', '__module__', '__weakref__'):
-                continue
-            if type(value) is type(infer_attrs) and dict is typedict:
-                # Skip methods.
-                continue
-            key = (None, '%s.%s' % (cls, attr))
-            update_var_db(key, value)
-
-
-def infer_method_signature(class_name):
-    def decorator(func):
-        return infer_signature(func, class_name)
-    return decorator
-
-
-def infer_signature(func, class_name=''):
-    """Decorator that infers the signature of a function."""
-
-    # infer_method_signature should be idempotent
-    if hasattr(func, '__is_inferring_sig'):
-        return func
-
-    assert func.__module__ != infer_method_signature.__module__
-
-    try:
-        funcfile = get_defining_file(func)
-        funcsource, sourceline = inspect.getsourcelines(func)
-        sourceline -= 1  # getsourcelines is apparently 1-indexed
-    except:
-        return func
-
-    funcid = (class_name, func.__name__, funcfile, sourceline)
-    func_source_db[funcid] = ''.join(funcsource)
-
-    try:
-        func_argid_db[funcid] = getfullargspec(func)
-        vargs_name, kwargs_name = func_argid_db[funcid][1], func_argid_db[funcid][2]
-    except TypeError:
-        # Not supported.
-        return func
-
-    def wrapper(*args, **kwargs):
-        global is_performing_inference
-        # If we're already doing inference, we should be in our own code, not code we're checking.
-        # Not doing this check sometimes results in infinite recursion.
-
-        if is_performing_inference:
-            return func(*args, **kwargs)
-
-        expecting_type_error, got_type_error, got_exception = False, False, False
-
-        is_performing_inference = True
-        try:
-            callargs = getcallargs(func, *args, **kwargs)
-
-            # we have to handle *args and **kwargs separately
-            if vargs_name:
-                va = callargs.pop(vargs_name)
-            if kwargs_name:
-                kw = callargs.pop(kwargs_name)
-
-            arg_db = {arg: infer_value_type(value) for arg, value in callargs.items()}
-
-            # *args and **kwargs need to merge the types of all their values
-            if vargs_name:
-                arg_db[vargs_name] = union_many_types(*[infer_value_type(v) for v in va])
-            if kwargs_name:
-                arg_db[kwargs_name] = union_many_types(*[infer_value_type(v) for v in kw.values()])
-
-        except TypeError:
-            got_exception = expecting_type_error = True
-        except:
-            got_exception = True
-        finally:
-            is_performing_inference = False
-
-        try:
-            ret = func(*args, **kwargs)
-        except TypeError:
-            got_type_error = got_exception = True
-            raise
-        except:
-            got_exception = True
-            raise
-        finally:
-            if not got_exception:
-                assert not expecting_type_error
-
-                # if we didn't get a TypeError, update the actual database
-                for arg, t in arg_db.items():
-                    update_db(func_arg_db, (funcid, arg), t)
-
-                # if we got an exception, we don't have a ret
-                if not got_exception:
-                    is_performing_inference = True
-                    try:
-                        type = infer_value_type(ret)
-                        update_db(func_return_db, funcid, type)
-                    except:
-                        pass
-                    finally:
-                        is_performing_inference = False
-
-        return ret
-
-    if hasattr(func, '__name__'):
-        wrapper.__name__ = func.__name__
-    wrapper.__is_inferring_sig = True
-    return wrapper
-
-
-def infer_class(cls):
-    """Class decorator for inferring signatures of all methods of the class."""
-    for attr, value in cls.__dict__.items():
-        if type(value) is type(infer_class):
-            setattr(cls, attr, infer_method_signature(cls.__name__)(value))
-    return cls
-
-
-def infer_module(namespace):
-    if hasattr(namespace, '__dict__'):
-        namespace = namespace.__dict__
-    for name, value in list(namespace.items()):
-        if inspect.isfunction(value):
-            namespace[name] = infer_signature(value)
-        elif inspect.isclass(value):
-            namespace[name] = infer_class(value)
-
-
-def update_var_db(key, value):
-    type = infer_value_type(value)
-    update_db(var_db, key, type)
-
-
-def update_db(db, key, type):
-    if key not in db:
-        db[key] = type
-    else:
-        db[key] = combine_types(db[key], type)
-
-
-def merge_db(db, other):
-    assert id(db) != id(other)
-    for key in other.keys():
-        if key not in db:
-            db[key] = other[key]
-        else:
-            db[key] = combine_types(db[key], other[key])
-
-
-def infer_value_type(value, depth=0):
-    # Prevent infinite recursion
-    if depth > 5:
-        return Unknown()
-    depth += 1
-
-    if value is None:
-        return None
-    elif isinstance(value, list):
-        return Generic('List', [infer_value_types(value, depth)])
-    elif isinstance(value, dict):
-        keytype = infer_value_types(value.keys(), depth)
-        valuetype = infer_value_types(value.values(), depth)
-        return Generic('Dict', (keytype, valuetype))
-    elif isinstance(value, tuple):
-        if len(value) <= MAX_INFERRED_TUPLE_LENGTH:
-            return Tuple(infer_value_type(item, depth)
-                         for item in value)
-        else:
-            return Generic('TupleSequence', [infer_value_types(value, depth)])
-    elif isinstance(value, set):
-        return Generic('Set', [infer_value_types(value, depth)])
-    elif isinstance(value, types.MethodType) or isinstance(value, types.FunctionType):
-        return Instance(Callable)
-    else:
-        for t in type(value).mro():
-            if get_defining_file(t) in ignore_files:
-                continue
-            elif t is object:
-                return Any()
-            elif hasattr(types, 'InstanceType') and t is types.InstanceType:
-                return Any()
-            else:
-                return Instance(t)
-        else:
-            return Any()
-
-
-def infer_value_types(values, depth=0):
-    """Infer a single type for an iterable of values.
-
-    >>> infer_value_types((1, 'x'))
-    Union(int, str)
-    >>> infer_value_types([])
-    Unknown
-    """
-    inferred = Unknown()
-    for value in sample(values):
-        type = infer_value_type(value, depth)
-        inferred = combine_types(inferred, type)
-    return inferred
-
-
-def sample(values):
-    # TODO only return a sample of values
-    return list(values)
-
-
-def union_many_types(*types):
-    union = Unknown()
-    for t in types:
-        union = combine_types(union, t)
-    return union
-
-
-def combine_types(x, y):
-    """Perform a union of two types.
-
-    >>> combine_types(Instance(int), None)
-    Optional[int]
-    """
-    if isinstance(x, Unknown):
-        return y
-    if isinstance(y, Unknown):
-        return x
-    if isinstance(x, Any):
-        return x
-    if isinstance(y, Any):
-        return y
-    if isinstance(x, Union):
-        return combine_either(x, y)
-    if isinstance(y, Union):
-        return combine_either(y, x)
-    if x == y:
-        return x
-    return simplify_either([x], [y])
-
-
-def combine_either(either, x):
-    if isinstance(x, Union):
-        xtypes = x.types
-    else:
-        xtypes = [x]
-    return simplify_either(either.types, xtypes)
-
-
-def simplify_either(x, y):
-    numerics = [Instance(int), Instance(float), Instance(complex)]
-
-    # TODO this is O(n**2); use an O(n) algorithm instead
-    result = list(x)
-    for type in y:
-        if isinstance(type, Generic):
-            for i, rt in enumerate(result):
-                if isinstance(rt, Generic) and type.typename == rt.typename:
-                    result[i] = Generic(rt.typename,
-                                        (combine_types(t, s)
-                                         for t, s in zip(type.args, rt.args)))
-                    break
-            else:
-                result.append(type)
-        elif isinstance(type, Tuple):
-            for i, rt in enumerate(result):
-                if isinstance(rt, Tuple) and len(type) == len(rt):
-                    result[i] = Tuple(combine_types(t, s)
-                                      for t, s in zip(type.itemtypes,
-                                                      rt.itemtypes))
-                    break
-            else:
-                result.append(type)
-        elif type in numerics:
-            for i, rt in enumerate(result):
-                if rt in numerics:
-                    result[i] = numerics[max(numerics.index(rt), numerics.index(type))]
-                    break
-            else:
-                result.append(type)
-        elif isinstance(type, Instance):
-            for i, rt in enumerate(result):
-                if isinstance(rt, Instance):
-                    # Union[A, SubclassOfA] -> A
-                    # Union[A, A] -> A, because issubclass(A, A) == True,
-                    if issubclass(type.typeobj, rt.typeobj):
-                        break
-                    elif issubclass(rt.typeobj, type.typeobj):
-                        result[i] = type
-                        break
-            else:
-                result.append(type)
-        elif type not in result:
-            result.append(type)
-
-    if len(result) > 1:
-        return Union(result)
-    else:
-        return result[0]
-
-
-class TypeBase(object):
-    """Abstract base class of all type objects.
-
-    Type objects use isinstance tests librarally -- they don't support duck
-    typing well.
-    """
-
-    def __eq__(self, other):
-        if type(other) is not type(self):
-            return False
-        for attr in self.__dict__:
-            if getattr(other, attr) != getattr(self, attr):
-                return False
-        return True
-
-    def __ne__(self, other):
-        return not self == other
-
-    def __repr__(self):
-        return str(self)
-
-
-class Instance(TypeBase):
-    def __init__(self, typeobj):
-        assert not inspect.isclass(typeobj) or not issubclass(typeobj, TypeBase)
-        self.typeobj = typeobj
-
-    def __str__(self):
-        # cheat on regular expression objects which have weird class names
-        # to be consistent with typing.py
-        if self.typeobj == Pattern:
-            return "Pattern"
-        elif self.typeobj == Match:
-            return "Match"
-        else:
-            return self.typeobj.__name__
-
-    def __repr__(self):
-        return 'Instance(%s)' % self
-
-
-class Generic(TypeBase):
-    def __init__(self, typename, args):
-        self.typename = typename
-        self.args = tuple(args)
-
-    def __str__(self):
-        return '%s[%s]' % (self.typename, ', '.join(str(t)
-                                                    for t in self.args))
-
-
-class Tuple(TypeBase):
-    def __init__(self, itemtypes):
-        self.itemtypes = tuple(itemtypes)
-
-    def __len__(self):
-        return len(self.itemtypes)
-
-    def __str__(self):
-        return 'Tuple[%s]' % (', '.join(str(t) for t in self.itemtypes))
-
-
-class Union(TypeBase):
-    def __init__(self, types):
-        assert len(types) > 1
-        self.types = tuple(types)
-
-    def __eq__(self, other):
-        if type(other) is not Union:
-            return False
-        # TODO this is O(n**2); use an O(n) algorithm instead
-        for t in self.types:
-            if t not in other.types:
-                return False
-        for t in other.types:
-            if t not in self.types:
-                return False
-        return True
-
-    def __str__(self):
-        types = list(self.types)
-        if str != bytes:  # on Python 2 str == bytes
-            if Instance(bytes) in types and Instance(str) in types:
-                # we Union[bytes, str] -> AnyStr as late as possible so we avoid
-                # corner cases like subclasses of bytes or str
-                types.remove(Instance(bytes))
-                types.remove(Instance(str))
-                types.append(Instance(AnyStr))
-        if len(types) == 1:
-            return str(types[0])
-        elif len(types) == 2 and None in types:
-            type = [t for t in types if t is not None][0]
-            return 'Optional[%s]' % type
-        else:
-            return 'Union[%s]' % (', '.join(sorted(str(t) for t in types)))
-
-
-class Unknown(TypeBase):
-    def __str__(self):
-        return 'Unknown'
-
-    def __repr__(self):
-        return 'Unknown()'
-
-
-class Any(TypeBase):
-    def __str__(self):
-        return 'Any'
-
-    def __repr__(self):
-        return 'Any()'
-
-
-class AnyStr(object): pass
-class Callable(object): pass
-import re
-Pattern = type(re.compile(u''))
-Match = type(re.match(u'', u''))
diff --git a/pinfer/test_pinfer.py b/pinfer/test_pinfer.py
deleted file mode 100644
index d6168db..0000000
--- a/pinfer/test_pinfer.py
+++ /dev/null
@@ -1,302 +0,0 @@
-"""Test cases for the infer module"""
-
-import unittest
-
-from pinfer import Instance, Generic, Tuple, Union, Unknown
-import pinfer
-
-
-class TestInfer(unittest.TestCase):
-    def setUp(self):
-        self.int = Instance(int)
-        self.float = Instance(float)
-
-    def tearDown(self):
-        pinfer.reset()
-
-    def test_instance(self):
-        i = self.int
-        self.assertEqual(i.typeobj, int)
-        self.assertEqual(str(i), 'int')
-        self.assertEqual(repr(i), 'Instance(int)')
-
-        self.assertTrue(i == Instance(int))
-        self.assertFalse(i != Instance(int))
-        self.assertTrue(i != self.float)
-        self.assertFalse(i == self.float)
-        self.assertNotEqual(i, None)
-
-    def test_generic_with_one_arg(self):
-        g = Generic('List', [self.int])
-        self.assertEqual(g.typename, 'List')
-        self.assertEqual(str(g.args), '(Instance(int),)')
-        self.assertEqual(str(g), 'List[int]')
-        self.assertEqual(repr(g), 'List[int]')
-
-        self.assertEqual(g, Generic('List', [self.int]))
-        self.assertNotEqual(g, Generic('Set', [self.int]))
-        self.assertNotEqual(g, Generic('List', [self.float]))
-        self.assertNotEqual(g, self.int)
-
-    def test_generic_with_two_args(self):
-        g = Generic('Dict', (self.int, self.float))
-        self.assertEqual(g.typename, 'Dict')
-        self.assertEqual(str(g), 'Dict[int, float]')
-
-    def test_tuple(self):
-        t0 = Tuple(())
-        t1 = Tuple([self.int])
-        t2 = Tuple((self.float, self.int))
-        self.assertEqual(t0.itemtypes, ())
-        self.assertEqual(str(t1.itemtypes[0]), 'int')
-        self.assertEqual(str(t2.itemtypes[0]), 'float')
-        self.assertEqual(str(t2.itemtypes[1]), 'int')
-        self.assertEqual(str(t0), 'Tuple[]')
-        self.assertEqual(str(t1), 'Tuple[int]')
-        self.assertEqual(str(t2), 'Tuple[float, int]')
-
-        self.assertEqual(t1, Tuple([self.int]))
-        self.assertNotEqual(t1, Tuple([self.float]))
-        self.assertNotEqual(t1, Tuple([self.int, self.int]))
-        self.assertNotEqual(t1, self.int)
-
-    def test_either(self):
-        i = self.int
-        f = self.float
-        s = Instance(str)
-
-        e2 = Union((i, f))
-        self.assertEqual(len(e2.types), 2)
-        self.assertEqual(str(e2), 'Union[float, int]')
-
-        self.assertEqual(e2, Union((i, f)))
-        self.assertEqual(e2, Union((f, i)))
-        self.assertNotEqual(e2, Union((i, s)))
-        self.assertNotEqual(e2, Union((i, f, s)))
-        self.assertNotEqual(Union((i, f, s)), e2)
-        self.assertNotEqual(e2, i)
-
-    def test_either_as_optional(self):
-        optint = Union((self.int, None))
-        self.assertEqual(str(optint), 'Optional[int]')
-        optfloat = Union((None, self.float))
-        self.assertEqual(str(optfloat), 'Optional[float]')
-        eithernone = Union((self.int, self.float, None))
-        self.assertEqual(str(eithernone), 'Union[None, float, int]')
-
-    def test_unknown(self):
-        unknown = Unknown()
-        self.assertEqual(str(unknown), 'Unknown')
-        self.assertEqual(repr(unknown), 'Unknown()')
-
-        self.assertEqual(unknown, Unknown())
-        self.assertNotEqual(unknown, self.int)
-
-    def test_combine_types(self):
-        i = self.int
-        f = self.float
-        s = Instance(str)
-        c = Instance(complex)
-        class Foo: pass
-        o = Instance(Foo)
-
-        # Simple types
-        self.assert_combine(i, i, i)
-        self.assert_combine(s, s, s)
-        self.assert_combine(i, s, Union((i, s)))
-        self.assert_combine(i, None, Union((i, None)))
-        # Unknowns
-        self.assert_combine(i, Unknown(), i)
-        self.assert_combine(Unknown(), Unknown(), Unknown())
-        # Union types
-        self.assert_combine(o, Union((f, s)), Union((o, f, s)))
-        self.assert_combine(i, Union((i, s)), Union((i, s)))
-        self.assert_combine(Union((o, f)), Union((o, s)), Union((o, f, s)))
-        # Tuple types
-        self.assert_combine(Tuple([i, i]), Tuple([i, i]), Tuple([i, i]))
-        self.assert_combine(Tuple([i, i]), Tuple([o, s]),
-                            Tuple([Union([o, i]), Union([s, i])]))
-        # Numeric types
-        self.assert_combine(i, f, f)
-        self.assert_combine(i, c, c)
-        self.assert_combine(c, f, c)
-        # Unions with numerics
-        self.assert_combine(i, Union((o, f)), Union((o, f)))
-        self.assert_combine(Union((o, f)), i, Union((o, f)))
-        self.assert_combine(Union((o, i)), f, Union((o, f)))
-        # Tuples with numerics
-        self.assert_combine(Tuple([i, i]), Tuple([f, i]), Tuple([f, i]))
-        self.assert_combine(Tuple([i, i]), Tuple([f, o]), Tuple([f, Union((i, o))]))
-        self.assert_combine(Tuple([f, i]), Tuple([i, o]), Tuple([f, Union((i, o))]))
-
-    def test_combine_special_cases(self):
-        i = self.int
-        f = self.float
-        u = Unknown()
-        def list_(x):
-            return Generic('List', [x])
-        # Simplify generic types.
-        self.assert_combine(list_(i), list_(u), list_(i))
-
-    def assert_combine(self, t, s, combined):
-        self.assertEqual(pinfer.combine_types(t, s), combined)
-        self.assertEqual(pinfer.combine_types(s, t), combined)
-
-    def test_sample(self):
-        sample = pinfer.sample
-        self.assertEqual(sample(()), [])
-        self.assertEqual(sample((1, 2)), [1, 2])
-        self.assertEqual(sample([]), [])
-        self.assertEqual(sample([1]), [1])
-        self.assertEqual(sample([1, 2]), [1, 2])
-        # TODO larger collections
-
-    def test_infer_simple_value_type(self):
-        self.assert_infer_type(1, 'int')
-        self.assert_infer_type('', 'str')
-        self.assert_infer_type(None, 'None')
-
-    def test_infer_collection_type(self):
-        # List
-        self.assert_infer_type([], 'List[Unknown]')
-        self.assert_infer_type([1], 'List[int]')
-        self.assert_infer_type([1, None], 'List[Optional[int]]')
-        # Dict
-        self.assert_infer_type({1: 'x', 2: None},
-                               'Dict[int, Optional[str]]')
-        # Set
-        self.assert_infer_type({1, None}, 'Set[Optional[int]]')
-        # Tuple
-        self.assert_infer_type((1, 'x'), 'Tuple[int, str]')
-        self.assert_infer_type((1, None) * 100, 'TupleSequence[Optional[int]]')
-
-    def assert_infer_type(self, value, type):
-        self.assertEqual(str(pinfer.infer_value_type(value)), type)
-
-    def test_infer_variables(self):
-        pinfer.infer_var('x', 1)
-        self.assert_infer_state('x: int')
-        pinfer.infer_var('x', 1)
-        pinfer.infer_var('x', None)
-        pinfer.infer_var('y', 1.1)
-        self.assert_infer_state('x: Optional[int]\n'
-                                'y: float')
-
-    def test_infer_instance_var(self):
-        class A: pass
-        a = A()
-        a.x = 1
-        a.y = 'x'
-        pinfer.infer_attrs(a)
-        self.assert_infer_state('A.x: int\n'
-                                'A.y: str')
-
-    def test_infer_class_var(self):
-        class A:
-            x = 1.1
-        pinfer.infer_attrs(A())
-        self.assert_infer_state('A.x: float')
-
-    def test_infer_function_attr(self):
-        class A:
-            def f(self): pass
-        a = A()
-        a.g = lambda x: 1
-        pinfer.infer_attrs(a)
-        self.assert_infer_state('A.g: Callable')
-
-    def test_infer_simple_function_signature(self):
-        @pinfer.infer_signature
-        def f(a):
-            return 'x'
-        f(1)
-        f(None)
-        self.assertEqual(f.__name__, 'f')
-        self.assert_infer_state('def f(a: Optional[int]) -> str')
-
-    def test_infer_function_with_two_args(self):
-        @pinfer.infer_signature
-        def f(x, y):
-            return x * y
-        f(1, 2)
-        f(1, 'x')
-        self.assert_infer_state(
-            'def f(x: int, y: Union[int, str]) -> Union[int, str]')
-
-    def test_infer_method(self):
-        class A:
-            @pinfer.infer_signature
-            def f(self, x): pass
-        A().f('x')
-        self.assert_infer_state('def f(self, x: str) -> None')
-
-    def test_infer_default_arg_values(self):
-        @pinfer.infer_signature
-        def f(x=1, y=None): pass
-        f()
-        self.assert_infer_state('def f(x: int, y: None) -> None')
-        f('x')
-        f('x', 1.1)
-        f()
-        self.assert_infer_state(
-            'def f(x: Union[int, str], y: Optional[float]) -> None')
-
-    def test_infer_varargs(self):
-        @pinfer.infer_signature
-        def f(x, *y): pass
-        f(1)
-        f(1, 'x', None)
-        self.assert_infer_state('def f(x: int, *y: Optional[str]) -> None')
-        f(1)
-        self.assert_infer_state('def f(x: int, *y: Unknown) -> None')
-
-    def test_infer_keyword_args(self):
-        @pinfer.infer_signature
-        def f(x): pass
-        f(x=1)
-        self.assert_infer_state('def f(x: int) -> None')
-
-        @pinfer.infer_signature
-        def f(x='x'): pass
-        f(x=1)
-        self.assert_infer_state('def f(x: int) -> None')
-
-    def test_infer_keyword_varargs(self):
-        @pinfer.infer_signature
-        def f(a, **kwargs): pass
-        f(None, x=1, y='x')
-        self.assert_infer_state(
-            'def f(a: None, **kwargs: Union[int, str]) -> None')
-
-    def test_infer_class(self):
-        @pinfer.infer_class
-        class A:
-            def f(self, x): return 0
-        A().f('x')
-        self.assert_infer_state('class A(...):\n'
-                                '    def f(self, x: str) -> int')
-
-        @pinfer.infer_class
-        class A:
-            def f(self, x): return 0
-        @pinfer.infer_class
-        class B:
-            def f(self): pass
-            def g(self): pass
-        A().f('')
-        B().f()
-        B().g()
-        self.assert_infer_state('class A(...):\n'
-                                '    def f(self, x: str) -> int\n'
-                                'class B(...):\n'
-                                '    def f(self) -> None\n'
-                                '    def g(self) -> None')
-
-    def assert_infer_state(self, expected):
-        state = pinfer.format_state()
-        self.assertEqual(state, expected)
-        pinfer.reset()
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/pinfer/test_pinfer3.py b/pinfer/test_pinfer3.py
deleted file mode 100644
index 688e8c0..0000000
--- a/pinfer/test_pinfer3.py
+++ /dev/null
@@ -1,31 +0,0 @@
-""" tests cases that require python3 syntax """
-
-import unittest
-import pinfer
-
-# Include all of the shared unit tests
-from test_pinfer import TestInfer
-
-
-class TestInfer3(unittest.TestCase):
-    def test_infer_keyword_only_args(self):
-        # decorators break the parsing
-        def f(x, *, y=0): pass
-        f = pinfer.infer_signature(f)
-        f(1, y='x')
-        self.assert_infer_state(
-            'def f(x: int, *, y: str = 0) -> None')
-
-        def f(*, x=None, y=None): pass
-        f = pinfer.infer_signature(f)
-        f(y='x')
-        self.assert_infer_state(
-            'def f(*, x: None = None, y: str = None) -> None')
-
-    def assert_infer_state(self, expected):
-        state = pinfer.format_state()
-        self.assertEqual(state, expected)
-        pinfer.reset()
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/pinfer/unparse.py b/pinfer/unparse.py
deleted file mode 100644
index 6e1e493..0000000
--- a/pinfer/unparse.py
+++ /dev/null
@@ -1,610 +0,0 @@
-# From Python 2's Demo/parser/unparse.py
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved
-
-"Usage: unparse.py <path to source file>"
-import sys
-import ast
-import cStringIO
-import os
-
-# Large float and imaginary literals get turned into infinities in the AST.
-# We unparse those infinities to INFSTR.
-INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1)
-
-def interleave(inter, f, seq):
-    """Call f on each item in seq, calling inter() in between.
-    """
-    seq = iter(seq)
-    try:
-        f(next(seq))
-    except StopIteration:
-        pass
-    else:
-        for x in seq:
-            inter()
-            f(x)
-
-class Unparser:
-    """Methods in this class recursively traverse an AST and
-    output source code for the abstract syntax; original formatting
-    is disregarded. """
-
-    def __init__(self, tree, file = sys.stdout):
-        """Unparser(tree, file=sys.stdout) -> None.
-         Print the source for tree to file."""
-        self.f = file
-        self.future_imports = []
-        self._indent = 0
-        self.dispatch(tree)
-        self.f.write("")
-        self.f.flush()
-
-    def fill(self, text = ""):
-        "Indent a piece of text, according to the current indentation level"
-        self.f.write("\n"+"    "*self._indent + text)
-
-    def write(self, text):
-        "Append a piece of text to the current line."
-        self.f.write(text)
-
-    def enter(self):
-        "Print ':', and increase the indentation."
-        self.write(":")
-        self._indent += 1
-
-    def leave(self):
-        "Decrease the indentation level."
-        self._indent -= 1
-
-    def dispatch(self, tree):
-        "Dispatcher function, dispatching tree type T to method _T."
-        if isinstance(tree, list):
-            for t in tree:
-                self.dispatch(t)
-            return
-        meth = getattr(self, "_"+tree.__class__.__name__)
-        meth(tree)
-
-
-    ############### Unparsing methods ######################
-    # There should be one method per concrete grammar type #
-    # Constructors should be grouped by sum type. Ideally, #
-    # this would follow the order in the grammar, but      #
-    # currently doesn't.                                   #
-    ########################################################
-
-    def _Module(self, tree):
-        for stmt in tree.body:
-            self.dispatch(stmt)
-
-    # stmt
-    def _Expr(self, tree):
-        self.fill()
-        self.dispatch(tree.value)
-
-    def _Import(self, t):
-        self.fill("import ")
-        interleave(lambda: self.write(", "), self.dispatch, t.names)
-
-    def _ImportFrom(self, t):
-        # A from __future__ import may affect unparsing, so record it.
-        if t.module and t.module == '__future__':
-            self.future_imports.extend(n.name for n in t.names)
-
-        self.fill("from ")
-        self.write("." * t.level)
-        if t.module:
-            self.write(t.module)
-        self.write(" import ")
-        interleave(lambda: self.write(", "), self.dispatch, t.names)
-
-    def _Assign(self, t):
-        self.fill()
-        for target in t.targets:
-            self.dispatch(target)
-            self.write(" = ")
-        self.dispatch(t.value)
-
-    def _AugAssign(self, t):
-        self.fill()
-        self.dispatch(t.target)
-        self.write(" "+self.binop[t.op.__class__.__name__]+"= ")
-        self.dispatch(t.value)
-
-    def _Return(self, t):
-        self.fill("return")
-        if t.value:
-            self.write(" ")
-            self.dispatch(t.value)
-
-    def _Pass(self, t):
-        self.fill("pass")
-
-    def _Break(self, t):
-        self.fill("break")
-
-    def _Continue(self, t):
-        self.fill("continue")
-
-    def _Delete(self, t):
-        self.fill("del ")
-        interleave(lambda: self.write(", "), self.dispatch, t.targets)
-
-    def _Assert(self, t):
-        self.fill("assert ")
-        self.dispatch(t.test)
-        if t.msg:
-            self.write(", ")
-            self.dispatch(t.msg)
-
-    def _Exec(self, t):
-        self.fill("exec ")
-        self.dispatch(t.body)
-        if t.globals:
-            self.write(" in ")
-            self.dispatch(t.globals)
-        if t.locals:
-            self.write(", ")
-            self.dispatch(t.locals)
-
-    def _Print(self, t):
-        self.fill("print ")
-        do_comma = False
-        if t.dest:
-            self.write(">>")
-            self.dispatch(t.dest)
-            do_comma = True
-        for e in t.values:
-            if do_comma:self.write(", ")
-            else:do_comma=True
-            self.dispatch(e)
-        if not t.nl:
-            self.write(",")
-
-    def _Global(self, t):
-        self.fill("global ")
-        interleave(lambda: self.write(", "), self.write, t.names)
-
-    def _Yield(self, t):
-        self.write("(")
-        self.write("yield")
-        if t.value:
-            self.write(" ")
-            self.dispatch(t.value)
-        self.write(")")
-
-    def _Raise(self, t):
-        self.fill('raise ')
-        if t.type:
-            self.dispatch(t.type)
-        if t.inst:
-            self.write(", ")
-            self.dispatch(t.inst)
-        if t.tback:
-            self.write(", ")
-            self.dispatch(t.tback)
-
-    def _TryExcept(self, t):
-        self.fill("try")
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-
-        for ex in t.handlers:
-            self.dispatch(ex)
-        if t.orelse:
-            self.fill("else")
-            self.enter()
-            self.dispatch(t.orelse)
-            self.leave()
-
-    def _TryFinally(self, t):
-        if len(t.body) == 1 and isinstance(t.body[0], ast.TryExcept):
-            # try-except-finally
-            self.dispatch(t.body)
-        else:
-            self.fill("try")
-            self.enter()
-            self.dispatch(t.body)
-            self.leave()
-
-        self.fill("finally")
-        self.enter()
-        self.dispatch(t.finalbody)
-        self.leave()
-
-    def _ExceptHandler(self, t):
-        self.fill("except")
-        if t.type:
-            self.write(" ")
-            self.dispatch(t.type)
-        if t.name:
-            self.write(" as ")
-            self.dispatch(t.name)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-
-    def _ClassDef(self, t):
-        self.write("\n")
-        for deco in t.decorator_list:
-            self.fill("@")
-            self.dispatch(deco)
-        self.fill("class "+t.name)
-        if t.bases:
-            self.write("(")
-            for a in t.bases:
-                self.dispatch(a)
-                self.write(", ")
-            self.write(")")
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-
-    def _FunctionDef(self, t):
-        self.write("\n")
-        for deco in t.decorator_list:
-            self.fill("@")
-            self.dispatch(deco)
-        self.fill("def "+t.name + "(")
-        self.dispatch(t.args)
-        self.write(")")
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-
-    def _For(self, t):
-        self.fill("for ")
-        self.dispatch(t.target)
-        self.write(" in ")
-        self.dispatch(t.iter)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-        if t.orelse:
-            self.fill("else")
-            self.enter()
-            self.dispatch(t.orelse)
-            self.leave()
-
-    def _If(self, t):
-        self.fill("if ")
-        self.dispatch(t.test)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-        # collapse nested ifs into equivalent elifs.
-        while (t.orelse and len(t.orelse) == 1 and
-               isinstance(t.orelse[0], ast.If)):
-            t = t.orelse[0]
-            self.fill("elif ")
-            self.dispatch(t.test)
-            self.enter()
-            self.dispatch(t.body)
-            self.leave()
-        # final else
-        if t.orelse:
-            self.fill("else")
-            self.enter()
-            self.dispatch(t.orelse)
-            self.leave()
-
-    def _While(self, t):
-        self.fill("while ")
-        self.dispatch(t.test)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-        if t.orelse:
-            self.fill("else")
-            self.enter()
-            self.dispatch(t.orelse)
-            self.leave()
-
-    def _With(self, t):
-        self.fill("with ")
-        self.dispatch(t.context_expr)
-        if t.optional_vars:
-            self.write(" as ")
-            self.dispatch(t.optional_vars)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-
-    # expr
-    def _Str(self, tree):
-        # if from __future__ import unicode_literals is in effect,
-        # then we want to output string literals using a 'b' prefix
-        # and unicode literals with no prefix.
-        if "unicode_literals" not in self.future_imports:
-            self.write(repr(tree.s))
-        elif isinstance(tree.s, str):
-            self.write("b" + repr(tree.s))
-        elif isinstance(tree.s, unicode):
-            self.write(repr(tree.s).lstrip("u"))
-        else:
-            assert False, "shouldn't get here"
-
-    def _Name(self, t):
-        self.write(t.id)
-
-    def _Repr(self, t):
-        self.write("`")
-        self.dispatch(t.value)
-        self.write("`")
-
-    def _Num(self, t):
-        repr_n = repr(t.n)
-        # Parenthesize negative numbers, to avoid turning (-1)**2 into -1**2.
-        if repr_n.startswith("-"):
-            self.write("(")
-        # Substitute overflowing decimal literal for AST infinities.
-        self.write(repr_n.replace("inf", INFSTR))
-        if repr_n.startswith("-"):
-            self.write(")")
-
-    def _List(self, t):
-        self.write("[")
-        interleave(lambda: self.write(", "), self.dispatch, t.elts)
-        self.write("]")
-
-    def _ListComp(self, t):
-        self.write("[")
-        self.dispatch(t.elt)
-        for gen in t.generators:
-            self.dispatch(gen)
-        self.write("]")
-
-    def _GeneratorExp(self, t):
-        self.write("(")
-        self.dispatch(t.elt)
-        for gen in t.generators:
-            self.dispatch(gen)
-        self.write(")")
-
-    def _SetComp(self, t):
-        self.write("{")
-        self.dispatch(t.elt)
-        for gen in t.generators:
-            self.dispatch(gen)
-        self.write("}")
-
-    def _DictComp(self, t):
-        self.write("{")
-        self.dispatch(t.key)
-        self.write(": ")
-        self.dispatch(t.value)
-        for gen in t.generators:
-            self.dispatch(gen)
-        self.write("}")
-
-    def _comprehension(self, t):
-        self.write(" for ")
-        self.dispatch(t.target)
-        self.write(" in ")
-        self.dispatch(t.iter)
-        for if_clause in t.ifs:
-            self.write(" if ")
-            self.dispatch(if_clause)
-
-    def _IfExp(self, t):
-        self.write("(")
-        self.dispatch(t.body)
-        self.write(" if ")
-        self.dispatch(t.test)
-        self.write(" else ")
-        self.dispatch(t.orelse)
-        self.write(")")
-
-    def _Set(self, t):
-        assert(t.elts) # should be at least one element
-        self.write("{")
-        interleave(lambda: self.write(", "), self.dispatch, t.elts)
-        self.write("}")
-
-    def _Dict(self, t):
-        self.write("{")
-        def write_pair(pair):
-            (k, v) = pair
-            self.dispatch(k)
-            self.write(": ")
-            self.dispatch(v)
-        interleave(lambda: self.write(", "), write_pair, zip(t.keys, t.values))
-        self.write("}")
-
-    def _Tuple(self, t):
-        self.write("(")
-        if len(t.elts) == 1:
-            (elt,) = t.elts
-            self.dispatch(elt)
-            self.write(",")
-        else:
-            interleave(lambda: self.write(", "), self.dispatch, t.elts)
-        self.write(")")
-
-    unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"}
-    def _UnaryOp(self, t):
-        self.write("(")
-        self.write(self.unop[t.op.__class__.__name__])
-        self.write(" ")
-        # If we're applying unary minus to a number, parenthesize the number.
-        # This is necessary: -2147483648 is different from -(2147483648) on
-        # a 32-bit machine (the first is an int, the second a long), and
-        # -7j is different from -(7j).  (The first has real part 0.0, the second
-        # has real part -0.0.)
-        if isinstance(t.op, ast.USub) and isinstance(t.operand, ast.Num):
-            self.write("(")
-            self.dispatch(t.operand)
-            self.write(")")
-        else:
-            self.dispatch(t.operand)
-        self.write(")")
-
-    binop = { "Add":"+", "Sub":"-", "Mult":"*", "Div":"/", "Mod":"%",
-                    "LShift":"<<", "RShift":">>", "BitOr":"|", "BitXor":"^", "BitAnd":"&",
-                    "FloorDiv":"//", "Pow": "**"}
-    def _BinOp(self, t):
-        self.write("(")
-        self.dispatch(t.left)
-        self.write(" " + self.binop[t.op.__class__.__name__] + " ")
-        self.dispatch(t.right)
-        self.write(")")
-
-    cmpops = {"Eq":"==", "NotEq":"!=", "Lt":"<", "LtE":"<=", "Gt":">", "GtE":">=",
-                        "Is":"is", "IsNot":"is not", "In":"in", "NotIn":"not in"}
-    def _Compare(self, t):
-        self.write("(")
-        self.dispatch(t.left)
-        for o, e in zip(t.ops, t.comparators):
-            self.write(" " + self.cmpops[o.__class__.__name__] + " ")
-            self.dispatch(e)
-        self.write(")")
-
-    boolops = {ast.And: 'and', ast.Or: 'or'}
-    def _BoolOp(self, t):
-        self.write("(")
-        s = " %s " % self.boolops[t.op.__class__]
-        interleave(lambda: self.write(s), self.dispatch, t.values)
-        self.write(")")
-
-    def _Attribute(self,t):
-        self.dispatch(t.value)
-        # Special case: 3.__abs__() is a syntax error, so if t.value
-        # is an integer literal then we need to either parenthesize
-        # it or add an extra space to get 3 .__abs__().
-        if isinstance(t.value, ast.Num) and isinstance(t.value.n, int):
-            self.write(" ")
-        self.write(".")
-        self.write(t.attr)
-
-    def _Call(self, t):
-        self.dispatch(t.func)
-        self.write("(")
-        comma = False
-        for e in t.args:
-            if comma: self.write(", ")
-            else: comma = True
-            self.dispatch(e)
-        for e in t.keywords:
-            if comma: self.write(", ")
-            else: comma = True
-            self.dispatch(e)
-        if t.starargs:
-            if comma: self.write(", ")
-            else: comma = True
-            self.write("*")
-            self.dispatch(t.starargs)
-        if t.kwargs:
-            if comma: self.write(", ")
-            else: comma = True
-            self.write("**")
-            self.dispatch(t.kwargs)
-        self.write(")")
-
-    def _Subscript(self, t):
-        self.dispatch(t.value)
-        self.write("[")
-        self.dispatch(t.slice)
-        self.write("]")
-
-    # slice
-    def _Ellipsis(self, t):
-        self.write("...")
-
-    def _Index(self, t):
-        self.dispatch(t.value)
-
-    def _Slice(self, t):
-        if t.lower:
-            self.dispatch(t.lower)
-        self.write(":")
-        if t.upper:
-            self.dispatch(t.upper)
-        if t.step:
-            self.write(":")
-            self.dispatch(t.step)
-
-    def _ExtSlice(self, t):
-        interleave(lambda: self.write(', '), self.dispatch, t.dims)
-
-    # others
-    def _arguments(self, t):
-        first = True
-        # normal arguments
-        defaults = [None] * (len(t.args) - len(t.defaults)) + t.defaults
-        for a,d in zip(t.args, defaults):
-            if first:first = False
-            else: self.write(", ")
-            self.dispatch(a),
-            if d:
-                self.write("=")
-                self.dispatch(d)
-
-        # varargs
-        if t.vararg:
-            if first:first = False
-            else: self.write(", ")
-            self.write("*")
-            self.write(t.vararg)
-
-        # kwargs
-        if t.kwarg:
-            if first:first = False
-            else: self.write(", ")
-            self.write("**"+t.kwarg)
-
-    def _keyword(self, t):
-        self.write(t.arg)
-        self.write("=")
-        self.dispatch(t.value)
-
-    def _Lambda(self, t):
-        self.write("(")
-        self.write("lambda ")
-        self.dispatch(t.args)
-        self.write(": ")
-        self.dispatch(t.body)
-        self.write(")")
-
-    def _alias(self, t):
-        self.write(t.name)
-        if t.asname:
-            self.write(" as "+t.asname)
-
-def roundtrip(filename, output=sys.stdout):
-    with open(filename, "r") as pyfile:
-        source = pyfile.read()
-    tree = compile(source, filename, "exec", ast.PyCF_ONLY_AST)
-    Unparser(tree, output)
-
-
-
-def testdir(a):
-    try:
-        names = [n for n in os.listdir(a) if n.endswith('.py')]
-    except OSError:
-        sys.stderr.write("Directory not readable: %s" % a)
-    else:
-        for n in names:
-            fullname = os.path.join(a, n)
-            if os.path.isfile(fullname):
-                output = cStringIO.StringIO()
-                print 'Testing %s' % fullname
-                try:
-                    roundtrip(fullname, output)
-                except Exception as e:
-                    print '  Failed to compile, exception is %s' % repr(e)
-            elif os.path.isdir(fullname):
-                testdir(fullname)
-
-def main(args):
-    if args[0] == '--testdir':
-        for a in args[1:]:
-            testdir(a)
-    else:
-        for a in args:
-            roundtrip(a)
-
-if __name__=='__main__':
-    main(sys.argv[1:])
diff --git a/pinfer/unparse3.py b/pinfer/unparse3.py
deleted file mode 100644
index 0936cb2..0000000
--- a/pinfer/unparse3.py
+++ /dev/null
@@ -1,610 +0,0 @@
-# From Python 3's Tools/parser/unparse.py
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved
-
-"Usage: unparse.py <path to source file>"
-import sys
-import ast
-import tokenize
-import io
-import os
-
-# Large float and imaginary literals get turned into infinities in the AST.
-# We unparse those infinities to INFSTR.
-INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1)
-
-def interleave(inter, f, seq):
-    """Call f on each item in seq, calling inter() in between.
-    """
-    seq = iter(seq)
-    try:
-        f(next(seq))
-    except StopIteration:
-        pass
-    else:
-        for x in seq:
-            inter()
-            f(x)
-
-class Unparser:
-    """Methods in this class recursively traverse an AST and
-    output source code for the abstract syntax; original formatting
-    is disregarded. """
-
-    def __init__(self, tree, file = sys.stdout):
-        """Unparser(tree, file=sys.stdout) -> None.
-         Print the source for tree to file."""
-        self.f = file
-        self._indent = 0
-        self.dispatch(tree)
-        print("", file=self.f)
-        self.f.flush()
-
-    def fill(self, text = ""):
-        "Indent a piece of text, according to the current indentation level"
-        self.f.write("\n"+"    "*self._indent + text)
-
-    def write(self, text):
-        "Append a piece of text to the current line."
-        self.f.write(text)
-
-    def enter(self):
-        "Print ':', and increase the indentation."
-        self.write(":")
-        self._indent += 1
-
-    def leave(self):
-        "Decrease the indentation level."
-        self._indent -= 1
-
-    def dispatch(self, tree):
-        "Dispatcher function, dispatching tree type T to method _T."
-        if isinstance(tree, list):
-            for t in tree:
-                self.dispatch(t)
-            return
-        meth = getattr(self, "_"+tree.__class__.__name__)
-        meth(tree)
-
-
-    ############### Unparsing methods ######################
-    # There should be one method per concrete grammar type #
-    # Constructors should be grouped by sum type. Ideally, #
-    # this would follow the order in the grammar, but      #
-    # currently doesn't.                                   #
-    ########################################################
-
-    def _Module(self, tree):
-        for stmt in tree.body:
-            self.dispatch(stmt)
-
-    # stmt
-    def _Expr(self, tree):
-        self.fill()
-        self.dispatch(tree.value)
-
-    def _Import(self, t):
-        self.fill("import ")
-        interleave(lambda: self.write(", "), self.dispatch, t.names)
-
-    def _ImportFrom(self, t):
-        self.fill("from ")
-        self.write("." * t.level)
-        if t.module:
-            self.write(t.module)
-        self.write(" import ")
-        interleave(lambda: self.write(", "), self.dispatch, t.names)
-
-    def _Assign(self, t):
-        self.fill()
-        for target in t.targets:
-            self.dispatch(target)
-            self.write(" = ")
-        self.dispatch(t.value)
-
-    def _AugAssign(self, t):
-        self.fill()
-        self.dispatch(t.target)
-        self.write(" "+self.binop[t.op.__class__.__name__]+"= ")
-        self.dispatch(t.value)
-
-    def _Return(self, t):
-        self.fill("return")
-        if t.value:
-            self.write(" ")
-            self.dispatch(t.value)
-
-    def _Pass(self, t):
-        self.fill("pass")
-
-    def _Break(self, t):
-        self.fill("break")
-
-    def _Continue(self, t):
-        self.fill("continue")
-
-    def _Delete(self, t):
-        self.fill("del ")
-        interleave(lambda: self.write(", "), self.dispatch, t.targets)
-
-    def _Assert(self, t):
-        self.fill("assert ")
-        self.dispatch(t.test)
-        if t.msg:
-            self.write(", ")
-            self.dispatch(t.msg)
-
-    def _Global(self, t):
-        self.fill("global ")
-        interleave(lambda: self.write(", "), self.write, t.names)
-
-    def _Nonlocal(self, t):
-        self.fill("nonlocal ")
-        interleave(lambda: self.write(", "), self.write, t.names)
-
-    def _Yield(self, t):
-        self.write("(")
-        self.write("yield")
-        if t.value:
-            self.write(" ")
-            self.dispatch(t.value)
-        self.write(")")
-
-    def _YieldFrom(self, t):
-        self.write("(")
-        self.write("yield from")
-        if t.value:
-            self.write(" ")
-            self.dispatch(t.value)
-        self.write(")")
-
-    def _Raise(self, t):
-        self.fill("raise")
-        if not t.exc:
-            assert not t.cause
-            return
-        self.write(" ")
-        self.dispatch(t.exc)
-        if t.cause:
-            self.write(" from ")
-            self.dispatch(t.cause)
-
-    def _Try(self, t):
-        self.fill("try")
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-        for ex in t.handlers:
-            self.dispatch(ex)
-        if t.orelse:
-            self.fill("else")
-            self.enter()
-            self.dispatch(t.orelse)
-            self.leave()
-        if t.finalbody:
-            self.fill("finally")
-            self.enter()
-            self.dispatch(t.finalbody)
-            self.leave()
-
-    def _ExceptHandler(self, t):
-        self.fill("except")
-        if t.type:
-            self.write(" ")
-            self.dispatch(t.type)
-        if t.name:
-            self.write(" as ")
-            self.write(t.name)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-
-    def _ClassDef(self, t):
-        self.write("\n")
-        for deco in t.decorator_list:
-            self.fill("@")
-            self.dispatch(deco)
-        self.fill("class "+t.name)
-        self.write("(")
-        comma = False
-        for e in t.bases:
-            if comma: self.write(", ")
-            else: comma = True
-            self.dispatch(e)
-        for e in t.keywords:
-            if comma: self.write(", ")
-            else: comma = True
-            self.dispatch(e)
-        if t.starargs:
-            if comma: self.write(", ")
-            else: comma = True
-            self.write("*")
-            self.dispatch(t.starargs)
-        if t.kwargs:
-            if comma: self.write(", ")
-            else: comma = True
-            self.write("**")
-            self.dispatch(t.kwargs)
-        self.write(")")
-
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-
-    def _FunctionDef(self, t):
-        self.write("\n")
-        for deco in t.decorator_list:
-            self.fill("@")
-            self.dispatch(deco)
-        self.fill("def "+t.name + "(")
-        self.dispatch(t.args)
-        self.write(")")
-        if t.returns:
-            self.write(" -> ")
-            self.dispatch(t.returns)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-
-    def _For(self, t):
-        self.fill("for ")
-        self.dispatch(t.target)
-        self.write(" in ")
-        self.dispatch(t.iter)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-        if t.orelse:
-            self.fill("else")
-            self.enter()
-            self.dispatch(t.orelse)
-            self.leave()
-
-    def _If(self, t):
-        self.fill("if ")
-        self.dispatch(t.test)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-        # collapse nested ifs into equivalent elifs.
-        while (t.orelse and len(t.orelse) == 1 and
-               isinstance(t.orelse[0], ast.If)):
-            t = t.orelse[0]
-            self.fill("elif ")
-            self.dispatch(t.test)
-            self.enter()
-            self.dispatch(t.body)
-            self.leave()
-        # final else
-        if t.orelse:
-            self.fill("else")
-            self.enter()
-            self.dispatch(t.orelse)
-            self.leave()
-
-    def _While(self, t):
-        self.fill("while ")
-        self.dispatch(t.test)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-        if t.orelse:
-            self.fill("else")
-            self.enter()
-            self.dispatch(t.orelse)
-            self.leave()
-
-    def _With(self, t):
-        self.fill("with ")
-        interleave(lambda: self.write(", "), self.dispatch, t.items)
-        self.enter()
-        self.dispatch(t.body)
-        self.leave()
-
-    # expr
-    def _Bytes(self, t):
-        self.write(repr(t.s))
-
-    def _Str(self, tree):
-        self.write(repr(tree.s))
-
-    def _Name(self, t):
-        self.write(t.id)
-
-    def _NameConstant(self, t):
-        self.write(repr(t.value))
-
-    def _Num(self, t):
-        # Substitute overflowing decimal literal for AST infinities.
-        self.write(repr(t.n).replace("inf", INFSTR))
-
-    def _List(self, t):
-        self.write("[")
-        interleave(lambda: self.write(", "), self.dispatch, t.elts)
-        self.write("]")
-
-    def _ListComp(self, t):
-        self.write("[")
-        self.dispatch(t.elt)
-        for gen in t.generators:
-            self.dispatch(gen)
-        self.write("]")
-
-    def _GeneratorExp(self, t):
-        self.write("(")
-        self.dispatch(t.elt)
-        for gen in t.generators:
-            self.dispatch(gen)
-        self.write(")")
-
-    def _SetComp(self, t):
-        self.write("{")
-        self.dispatch(t.elt)
-        for gen in t.generators:
-            self.dispatch(gen)
-        self.write("}")
-
-    def _DictComp(self, t):
-        self.write("{")
-        self.dispatch(t.key)
-        self.write(": ")
-        self.dispatch(t.value)
-        for gen in t.generators:
-            self.dispatch(gen)
-        self.write("}")
-
-    def _comprehension(self, t):
-        self.write(" for ")
-        self.dispatch(t.target)
-        self.write(" in ")
-        self.dispatch(t.iter)
-        for if_clause in t.ifs:
-            self.write(" if ")
-            self.dispatch(if_clause)
-
-    def _IfExp(self, t):
-        self.write("(")
-        self.dispatch(t.body)
-        self.write(" if ")
-        self.dispatch(t.test)
-        self.write(" else ")
-        self.dispatch(t.orelse)
-        self.write(")")
-
-    def _Set(self, t):
-        assert(t.elts) # should be at least one element
-        self.write("{")
-        interleave(lambda: self.write(", "), self.dispatch, t.elts)
-        self.write("}")
-
-    def _Dict(self, t):
-        self.write("{")
-        def write_pair(pair):
-            (k, v) = pair
-            self.dispatch(k)
-            self.write(": ")
-            self.dispatch(v)
-        interleave(lambda: self.write(", "), write_pair, zip(t.keys, t.values))
-        self.write("}")
-
-    def _Tuple(self, t):
-        self.write("(")
-        if len(t.elts) == 1:
-            (elt,) = t.elts
-            self.dispatch(elt)
-            self.write(",")
-        else:
-            interleave(lambda: self.write(", "), self.dispatch, t.elts)
-        self.write(")")
-
-    unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"}
-    def _UnaryOp(self, t):
-        self.write("(")
-        self.write(self.unop[t.op.__class__.__name__])
-        self.write(" ")
-        self.dispatch(t.operand)
-        self.write(")")
-
-    binop = { "Add":"+", "Sub":"-", "Mult":"*", "Div":"/", "Mod":"%",
-                    "LShift":"<<", "RShift":">>", "BitOr":"|", "BitXor":"^", "BitAnd":"&",
-                    "FloorDiv":"//", "Pow": "**"}
-    def _BinOp(self, t):
-        self.write("(")
-        self.dispatch(t.left)
-        self.write(" " + self.binop[t.op.__class__.__name__] + " ")
-        self.dispatch(t.right)
-        self.write(")")
-
-    cmpops = {"Eq":"==", "NotEq":"!=", "Lt":"<", "LtE":"<=", "Gt":">", "GtE":">=",
-                        "Is":"is", "IsNot":"is not", "In":"in", "NotIn":"not in"}
-    def _Compare(self, t):
-        self.write("(")
-        self.dispatch(t.left)
-        for o, e in zip(t.ops, t.comparators):
-            self.write(" " + self.cmpops[o.__class__.__name__] + " ")
-            self.dispatch(e)
-        self.write(")")
-
-    boolops = {ast.And: 'and', ast.Or: 'or'}
-    def _BoolOp(self, t):
-        self.write("(")
-        s = " %s " % self.boolops[t.op.__class__]
-        interleave(lambda: self.write(s), self.dispatch, t.values)
-        self.write(")")
-
-    def _Attribute(self,t):
-        self.dispatch(t.value)
-        # Special case: 3.__abs__() is a syntax error, so if t.value
-        # is an integer literal then we need to either parenthesize
-        # it or add an extra space to get 3 .__abs__().
-        if isinstance(t.value, ast.Num) and isinstance(t.value.n, int):
-            self.write(" ")
-        self.write(".")
-        self.write(t.attr)
-
-    def _Call(self, t):
-        self.dispatch(t.func)
-        self.write("(")
-        comma = False
-        for e in t.args:
-            if comma: self.write(", ")
-            else: comma = True
-            self.dispatch(e)
-        for e in t.keywords:
-            if comma: self.write(", ")
-            else: comma = True
-            self.dispatch(e)
-        if t.starargs:
-            if comma: self.write(", ")
-            else: comma = True
-            self.write("*")
-            self.dispatch(t.starargs)
-        if t.kwargs:
-            if comma: self.write(", ")
-            else: comma = True
-            self.write("**")
-            self.dispatch(t.kwargs)
-        self.write(")")
-
-    def _Subscript(self, t):
-        self.dispatch(t.value)
-        self.write("[")
-        self.dispatch(t.slice)
-        self.write("]")
-
-    def _Starred(self, t):
-        self.write("*")
-        self.dispatch(t.value)
-
-    # slice
-    def _Ellipsis(self, t):
-        self.write("...")
-
-    def _Index(self, t):
-        self.dispatch(t.value)
-
-    def _Slice(self, t):
-        if t.lower:
-            self.dispatch(t.lower)
-        self.write(":")
-        if t.upper:
-            self.dispatch(t.upper)
-        if t.step:
-            self.write(":")
-            self.dispatch(t.step)
-
-    def _ExtSlice(self, t):
-        interleave(lambda: self.write(', '), self.dispatch, t.dims)
-
-    # argument
-    def _arg(self, t):
-        self.write(t.arg)
-        if t.annotation:
-            self.write(": ")
-            self.dispatch(t.annotation)
-
-    # others
-    def _arguments(self, t):
-        first = True
-        # normal arguments
-        defaults = [None] * (len(t.args) - len(t.defaults)) + t.defaults
-        for a, d in zip(t.args, defaults):
-            if first:first = False
-            else: self.write(", ")
-            self.dispatch(a)
-            if d:
-                self.write("=")
-                self.dispatch(d)
-
-        # varargs, or bare '*' if no varargs but keyword-only arguments present
-        if t.vararg or t.kwonlyargs:
-            if first:first = False
-            else: self.write(", ")
-            self.write("*")
-            if t.vararg:
-                self.write(t.vararg.arg)
-                if t.vararg.annotation:
-                    self.write(": ")
-                    self.dispatch(t.vararg.annotation)
-
-        # keyword-only arguments
-        if t.kwonlyargs:
-            for a, d in zip(t.kwonlyargs, t.kw_defaults):
-                if first:first = False
-                else: self.write(", ")
-                self.dispatch(a),
-                if d:
-                    self.write("=")
-                    self.dispatch(d)
-
-        # kwargs
-        if t.kwarg:
-            if first:first = False
-            else: self.write(", ")
-            self.write("**"+t.kwarg.arg)
-            if t.kwarg.annotation:
-                self.write(": ")
-                self.dispatch(t.kwarg.annotation)
-
-    def _keyword(self, t):
-        self.write(t.arg)
-        self.write("=")
-        self.dispatch(t.value)
-
-    def _Lambda(self, t):
-        self.write("(")
-        self.write("lambda ")
-        self.dispatch(t.args)
-        self.write(": ")
-        self.dispatch(t.body)
-        self.write(")")
-
-    def _alias(self, t):
-        self.write(t.name)
-        if t.asname:
-            self.write(" as "+t.asname)
-
-    def _withitem(self, t):
-        self.dispatch(t.context_expr)
-        if t.optional_vars:
-            self.write(" as ")
-            self.dispatch(t.optional_vars)
-
-def roundtrip(filename, output=sys.stdout):
-    with open(filename, "rb") as pyfile:
-        encoding = tokenize.detect_encoding(pyfile.readline)[0]
-    with open(filename, "r", encoding=encoding) as pyfile:
-        source = pyfile.read()
-    tree = compile(source, filename, "exec", ast.PyCF_ONLY_AST)
-    Unparser(tree, output)
-
-
-
-def testdir(a):
-    try:
-        names = [n for n in os.listdir(a) if n.endswith('.py')]
-    except OSError:
-        print("Directory not readable: %s" % a, file=sys.stderr)
-    else:
-        for n in names:
-            fullname = os.path.join(a, n)
-            if os.path.isfile(fullname):
-                output = io.StringIO()
-                print('Testing %s' % fullname)
-                try:
-                    roundtrip(fullname, output)
-                except Exception as e:
-                    print('  Failed to compile, exception is %s' % repr(e))
-            elif os.path.isdir(fullname):
-                testdir(fullname)
-
-def main(args):
-    if args[0] == '--testdir':
-        for a in args[1:]:
-            testdir(a)
-    else:
-        for a in args:
-            roundtrip(a)
-
-if __name__=='__main__':
-    main(sys.argv[1:])
diff --git a/pytest.ini b/pytest.ini
deleted file mode 100644
index 2b14288..0000000
--- a/pytest.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[pytest]
-# testpaths is new in 2.8
-minversion = 2.8
-
-testpaths = mypy/test
-
-python_files = test*.py
-
-# empty patterns for default python collector, to stick to our plugin's collector
-python_classes =
-python_functions =
-
-# always run in parallel (requires pytest-xdist, see test-requirements.txt)
-addopts = -nauto --cov-append --cov-report=
diff --git a/runtests.py b/runtests.py
deleted file mode 100755
index 05f6179..0000000
--- a/runtests.py
+++ /dev/null
@@ -1,428 +0,0 @@
-#!/usr/bin/env python3
-"""Mypy test runner."""
-
-if False:
-    import typing
-
-if True:
-    # When this is run as a script, `typing` is not available yet.
-    import sys
-    from os.path import join, isdir
-
-    def get_versions():  # type: () -> typing.List[str]
-        major = sys.version_info[0]
-        minor = sys.version_info[1]
-        if major == 2:
-            return ['2.7']
-        else:
-            # generates list of python versions to use.
-            # For Python2, this is only [2.7].
-            # Otherwise, it is [3.4, 3.3, 3.2, 3.1, 3.0].
-            return ['%d.%d' % (major, i) for i in range(minor, -1, -1)]
-
-    sys.path[0:0] = [v for v in [join('lib-typing', v) for v in get_versions()] if isdir(v)]
-    # Now `typing` is available.
-
-
-from typing import Dict, List, Optional, Set, Iterable
-
-from mypy.waiter import Waiter, LazySubprocess
-from mypy import util
-from mypy.test.config import test_data_prefix
-from mypy.test.testpythoneval import python_eval_files, python_34_eval_files
-
-import itertools
-import os
-import re
-
-
-# Ideally, all tests would be `discover`able so that they can be driven
-# (and parallelized) by an external test driver.
-
-class Driver:
-
-    def __init__(self, whitelist: List[str], blacklist: List[str],
-            arglist: List[str], verbosity: int, parallel_limit: int,
-            xfail: List[str], coverage: bool) -> None:
-        self.whitelist = whitelist
-        self.blacklist = blacklist
-        self.arglist = arglist
-        self.verbosity = verbosity
-        self.waiter = Waiter(verbosity=verbosity, limit=parallel_limit, xfail=xfail)
-        self.versions = get_versions()
-        self.cwd = os.getcwd()
-        self.mypy = os.path.join(self.cwd, 'scripts', 'mypy')
-        self.env = dict(os.environ)
-        self.coverage = coverage
-
-    def prepend_path(self, name: str, paths: List[str]) -> None:
-        old_val = self.env.get(name)
-        paths = [p for p in paths if isdir(p)]
-        if not paths:
-            return
-        if old_val is not None:
-            new_val = ':'.join(itertools.chain(paths, [old_val]))
-        else:
-            new_val = ':'.join(paths)
-        self.env[name] = new_val
-
-    def allow(self, name: str) -> bool:
-        if any(f in name for f in self.whitelist):
-            if not any(f in name for f in self.blacklist):
-                if self.verbosity >= 2:
-                    print('SELECT   #%d %s' % (len(self.waiter.queue), name))
-                return True
-        if self.verbosity >= 3:
-            print('OMIT     %s' % name)
-        return False
-
-    def add_mypy_cmd(self, name: str, mypy_args: List[str], cwd: Optional[str] = None) -> None:
-        full_name = 'check %s' % name
-        if not self.allow(full_name):
-            return
-        args = [sys.executable, self.mypy] + mypy_args
-        args.append('--show-traceback')
-        self.waiter.add(LazySubprocess(full_name, args, cwd=cwd, env=self.env))
-
-    def add_mypy(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
-        self.add_mypy_cmd(name, list(args), cwd=cwd)
-
-    def add_mypy_modules(self, name: str, modules: Iterable[str],
-                         cwd: Optional[str] = None) -> None:
-        args = list(itertools.chain(*(['-m', mod] for mod in modules)))
-        self.add_mypy_cmd(name, args, cwd=cwd)
-
-    def add_mypy_package(self, name: str, packagename: str, *flags: str) -> None:
-        self.add_mypy_cmd(name, ['-p', packagename] + list(flags))
-
-    def add_mypy_string(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
-        self.add_mypy_cmd(name, ['-c'] + list(args), cwd=cwd)
-
-    def add_pytest(self, name: str, pytest_args: List[str], coverage: bool = False) -> None:
-        full_name = 'pytest %s' % name
-        if not self.allow(full_name):
-            return
-        if coverage and self.coverage:
-            args = [sys.executable, '-m', 'pytest', '--cov=mypy'] + pytest_args
-        else:
-            args = [sys.executable, '-m', 'pytest'] + pytest_args
-
-        self.waiter.add(LazySubprocess(full_name, args, env=self.env))
-
-    def add_python(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
-        name = 'run %s' % name
-        if not self.allow(name):
-            return
-        largs = list(args)
-        largs[0:0] = [sys.executable]
-        env = self.env
-        self.waiter.add(LazySubprocess(name, largs, cwd=cwd, env=env))
-
-    def add_python_mod(self, name: str, *args: str, cwd: Optional[str] = None,
-                       coverage: bool = False) -> None:
-        name = 'run %s' % name
-        if not self.allow(name):
-            return
-        largs = list(args)
-        if coverage and self.coverage:
-            largs[0:0] = ['coverage', 'run', '-m']
-        else:
-            largs[0:0] = [sys.executable, '-m']
-        env = self.env
-        self.waiter.add(LazySubprocess(name, largs, cwd=cwd, env=env))
-
-    def add_python_string(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
-        name = 'run %s' % name
-        if not self.allow(name):
-            return
-        largs = list(args)
-        largs[0:0] = [sys.executable, '-c']
-        env = self.env
-        self.waiter.add(LazySubprocess(name, largs, cwd=cwd, env=env))
-
-    def add_python2(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
-        name = 'run2 %s' % name
-        if not self.allow(name):
-            return
-        largs = list(args)
-        python2 = util.try_find_python2_interpreter()
-        assert python2, "Couldn't find a Python 2.7 interpreter"
-        largs[0:0] = [python2]
-        env = self.env
-        self.waiter.add(LazySubprocess(name, largs, cwd=cwd, env=env))
-
-    def add_flake8(self, cwd: Optional[str] = None) -> None:
-        name = 'lint'
-        if not self.allow(name):
-            return
-        largs = ['flake8', '-j{}'.format(self.waiter.limit)]
-        env = self.env
-        self.waiter.add(LazySubprocess(name, largs, cwd=cwd, env=env))
-
-    def list_tasks(self) -> None:
-        for id, task in enumerate(self.waiter.queue):
-            print('{id}:{task}'.format(id=id, task=task.name))
-
-
-def add_basic(driver: Driver) -> None:
-    if False:
-        driver.add_mypy('file setup.py', 'setup.py')
-    driver.add_mypy('file runtests.py', 'runtests.py')
-    driver.add_mypy('legacy entry script', 'scripts/mypy')
-    driver.add_mypy('legacy myunit script', 'scripts/myunit')
-    # needs typed_ast installed:
-    driver.add_mypy('fast-parse', '--fast-parse', 'test-data/samples/hello.py')
-
-
-def add_selftypecheck(driver: Driver) -> None:
-    driver.add_mypy_package('package mypy', 'mypy', '--fast-parser', '--warn-no-return',
-                            '--config-file', 'mypy_self_check.ini')
-    driver.add_mypy_package('package mypy', 'mypy', '--fast-parser',
-                            '--config-file', 'mypy_strict_optional.ini')
-
-
-def find_files(base: str, prefix: str = '', suffix: str = '') -> List[str]:
-    return [join(root, f)
-            for root, dirs, files in os.walk(base)
-            for f in files
-            if f.startswith(prefix) and f.endswith(suffix)]
-
-
-def file_to_module(file: str) -> str:
-    rv = os.path.splitext(file)[0].replace(os.sep, '.')
-    if rv.endswith('.__init__'):
-        rv = rv[:-len('.__init__')]
-    return rv
-
-
-def add_imports(driver: Driver) -> None:
-    # Make sure each module can be imported originally.
-    # There is currently a bug in mypy where a module can pass typecheck
-    # because of *implicit* imports from other modules.
-    for f in find_files('mypy', suffix='.py'):
-        mod = file_to_module(f)
-        if not mod.endswith('.__main__'):
-            driver.add_python_string('import %s' % mod, 'import %s' % mod)
-
-
-PYTEST_FILES = [os.path.join('mypy', 'test', '{}.py'.format(name)) for name in [
-    'testcheck', 'testextensions',
-]]
-
-
-def add_pytest(driver: Driver) -> None:
-    for f in PYTEST_FILES:
-        driver.add_pytest(f, [f] + driver.arglist, True)
-
-
-def add_myunit(driver: Driver) -> None:
-    for f in find_files('mypy', prefix='test', suffix='.py'):
-        mod = file_to_module(f)
-        if mod in ('mypy.test.testpythoneval', 'mypy.test.testcmdline'):
-            # Run Python evaluation integration tests and command-line
-            # parsing tests separately since they are much slower than
-            # proper unit tests.
-            pass
-        elif f in PYTEST_FILES:
-            # This module has been converted to pytest; don't try to use myunit.
-            pass
-        else:
-            driver.add_python_mod('unit-test %s' % mod, 'mypy.myunit', '-m', mod,
-                                  *driver.arglist, coverage=True)
-
-
-def add_pythoneval(driver: Driver) -> None:
-    cases = set()
-    case_re = re.compile(r'^\[case ([^\]]+)\]$')
-    for file in python_eval_files + python_34_eval_files:
-        with open(os.path.join(test_data_prefix, file), 'r') as f:
-            for line in f:
-                m = case_re.match(line)
-                if m:
-                    case_name = m.group(1)
-                    assert case_name[:4] == 'test'
-                    cases.add(case_name[4:5])
-
-    for prefix in sorted(cases):
-        driver.add_python_mod(
-            'eval-test-' + prefix,
-            'mypy.myunit',
-            '-m',
-            'mypy.test.testpythoneval',
-            'test_testpythoneval_PythonEvaluationSuite.test' + prefix + '*',
-            *driver.arglist,
-            coverage=True
-        )
-
-
-def add_cmdline(driver: Driver) -> None:
-    driver.add_python_mod('cmdline-test', 'mypy.myunit',
-                          '-m', 'mypy.test.testcmdline', *driver.arglist,
-                         coverage=True)
-
-
-def add_stubs(driver: Driver) -> None:
-    # We only test each module in the one version mypy prefers to find.
-    # TODO: test stubs for other versions, especially Python 2 stubs.
-
-    modules = set()  # type: Set[str]
-    modules.add('typing')
-    # TODO: This should also test Python 2, and pass pyversion accordingly.
-    for version in ["2and3", "3", "3.3", "3.4", "3.5"]:
-        for stub_type in ['builtins', 'stdlib', 'third_party']:
-            stubdir = join('typeshed', stub_type, version)
-            for f in find_files(stubdir, suffix='.pyi'):
-                module = file_to_module(f[len(stubdir) + 1:])
-                modules.add(module)
-
-    driver.add_mypy_modules('stubs', sorted(modules))
-
-
-def add_stdlibsamples(driver: Driver) -> None:
-    seen = set()  # type: Set[str]
-    for version in driver.versions:
-        stdlibsamples_dir = join(driver.cwd, 'test-data', 'stdlib-samples', version)
-        modules = []  # type: List[str]
-        for f in find_files(stdlibsamples_dir, prefix='test_', suffix='.py'):
-            module = file_to_module(f[len(stdlibsamples_dir) + 1:])
-            if module not in seen:
-                seen.add(module)
-                modules.append(module)
-        if modules:
-            driver.add_mypy_modules('stdlibsamples (%s)' % (version,), modules,
-                                    cwd=stdlibsamples_dir)
-
-
-def add_samples(driver: Driver) -> None:
-    for f in find_files(os.path.join('test-data', 'samples'), suffix='.py'):
-        driver.add_mypy('file %s' % f, f, '--fast-parser')
-
-
-def usage(status: int) -> None:
-    print('Usage: %s [-h | -v | -q | [-x] FILTER | -a ARG] ... [-- FILTER ...]' % sys.argv[0])
-    print()
-    print('Run mypy tests. If given no arguments, run all tests.')
-    print()
-    print('Examples:')
-    print('  %s unit-test  (run unit tests only)' % sys.argv[0])
-    print('  %s unit-test -a "*tuple*"' % sys.argv[0])
-    print('       (run all unit tests with "tuple" in test name)')
-    print()
-    print('Options:')
-    print('  -h, --help             show this help')
-    print('  -v, --verbose          increase driver verbosity')
-    print('  -q, --quiet            decrease driver verbosity')
-    print('  -jN                    run N tasks at once (default: one per CPU)')
-    print('  -a, --argument ARG     pass an argument to myunit tasks')
-    print('                         (-v: verbose; glob pattern: filter by test name)')
-    print('  -l, --list             list included tasks (after filtering) and exit')
-    print('  FILTER                 include tasks matching FILTER')
-    print('  -x, --exclude FILTER   exclude tasks matching FILTER')
-    print('  -c, --coverage         calculate code coverage while running tests')
-    print('  --                     treat all remaining arguments as positional')
-    sys.exit(status)
-
-
-def sanity() -> None:
-    paths = os.getenv('PYTHONPATH')
-    if paths is None:
-        return
-    failed = False
-    for p in paths.split(os.pathsep):
-        if not os.path.isabs(p):
-            print('Relative PYTHONPATH entry %r' % p)
-            failed = True
-    if failed:
-        print('Please use absolute so that chdir() tests can work.')
-        print('Cowardly refusing to continue.')
-        sys.exit(1)
-
-
-def main() -> None:
-    sanity()
-
-    verbosity = 0
-    parallel_limit = 0
-    whitelist = []  # type: List[str]
-    blacklist = []  # type: List[str]
-    arglist = []  # type: List[str]
-    list_only = False
-    coverage = False
-
-    allow_opts = True
-    curlist = whitelist
-    for a in sys.argv[1:]:
-        if curlist is not arglist and allow_opts and a.startswith('-'):
-            if curlist is not whitelist:
-                break
-            if a == '--':
-                allow_opts = False
-            elif a == '-v' or a == '--verbose':
-                verbosity += 1
-            elif a == '-q' or a == '--quiet':
-                verbosity -= 1
-            elif a.startswith('-j'):
-                try:
-                    parallel_limit = int(a[2:])
-                except ValueError:
-                    usage(1)
-            elif a == '-x' or a == '--exclude':
-                curlist = blacklist
-            elif a == '-a' or a == '--argument':
-                curlist = arglist
-            elif a == '-l' or a == '--list':
-                list_only = True
-            elif a == '-c' or a == '--coverage':
-                coverage = True
-            elif a == '-h' or a == '--help':
-                usage(0)
-            else:
-                usage(1)
-        else:
-            curlist.append(a)
-            curlist = whitelist
-    if curlist is blacklist:
-        sys.exit('-x must be followed by a filter')
-    if curlist is arglist:
-        sys.exit('-a must be followed by an argument')
-    # empty string is a substring of all names
-    if not whitelist:
-        whitelist.append('')
-
-    driver = Driver(whitelist=whitelist, blacklist=blacklist, arglist=arglist,
-            verbosity=verbosity, parallel_limit=parallel_limit, xfail=[], coverage=coverage)
-
-    driver.prepend_path('PATH', [join(driver.cwd, 'scripts')])
-    driver.prepend_path('MYPYPATH', [driver.cwd])
-    driver.prepend_path('PYTHONPATH', [driver.cwd])
-    driver.prepend_path('PYTHONPATH', [join(driver.cwd, 'lib-typing', v) for v in driver.versions])
-
-    add_pythoneval(driver)
-    add_cmdline(driver)
-    add_basic(driver)
-    add_selftypecheck(driver)
-    add_pytest(driver)
-    add_myunit(driver)
-    add_imports(driver)
-    add_stubs(driver)
-    add_stdlibsamples(driver)
-    add_samples(driver)
-    driver.add_flake8()
-
-    if list_only:
-        driver.list_tasks()
-        return
-
-    exit_code = driver.waiter.run()
-
-    if verbosity >= 1:
-        times = driver.waiter.times2 if verbosity >= 2 else driver.waiter.times1
-        times_sortable = ((t, tp) for (tp, t) in times.items())
-        for total_time, test_type in sorted(times_sortable, reverse=True):
-            print('total time in %s: %f' % (test_type, total_time))
-
-    sys.exit(exit_code)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/scripts/myunit b/scripts/myunit
deleted file mode 100755
index 43fce06..0000000
--- a/scripts/myunit
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/env python3
-"""Myunit test runner command line tool.
-
-Usually used as a slave by runtests.py, but can be used directly.
-"""
-
-from mypy.myunit import main
-
-main()
diff --git a/setup.cfg b/setup.cfg
index 43ab1b3..8962631 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,35 +1,13 @@
 [flake8]
 max-line-length = 99
-# typeshed and unit test fixtures have .pyi-specific flake8 configuration
-exclude =
-  # Sphinx configuration is irrelevant
-  docs/source/conf.py,
-  # external library with incompatible style
-  lib-typing/*,
-  # conflicting styles
-  misc/*,
-  # external library with incompatible style
-  pinfer/*,
-  # conflicting styles
-  scripts/*,
-  # tests have more relaxed styling requirements
-  # fixtures have their own .pyi-specific configuration
-  test-data/*,
-  # typeshed has its own .pyi-specific configuration
-  typeshed/*
-
-# Things to ignore:
-#   E251: spaces around default arg value (against our style)
-#   E128: continuation line under-indented (too noisy)
-#   F401: unused identifiers (useless, as it doesn't see inside # type: comments)
-#   W601: has_key() deprecated (false positives)
-#   E701: multiple statements on one line (colon) (we use this for classes with empty body)
-#   W503: line break before binary operator
-#   E704: multiple statements on one line (def)
-#   E402: module level import not at top of file
-#   B3??: Python 3 compatibility warnings
-#   B006: use of mutable defaults in function signatures
-#   B007: Loop control variable not used within the loop body.
+exclude = 
+	docs/source/conf.py,
+	lib-typing/*,
+	misc/*,
+	pinfer/*,
+	scripts/*,
+	test-data/*,
+	typeshed/*
 ignore = E251,E128,F401,W601,E701,W503,E704,E402,B3,B006,B007
 
 [coverage:run]
@@ -41,10 +19,12 @@ parallel = true
 show_missing = true
 
 [metadata]
-# This seems to be used only by bdist_wheel.
-# You need "pip3 install wheel".
-# Then run "python3 setup.py bdist_wheel" to build a wheel file
-# (and then upload that to PyPI).
-requires-dist =
-    typed-ast >= 0.6.3
-    typing >= 3.5.3; python_version < "3.5"
+requires-dist = 
+	typed-ast >= 0.6.3
+	typing >= 3.5.3; python_version < "3.5"
+
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/test-data/.flake8 b/test-data/.flake8
deleted file mode 120000
index 3ec8bd5..0000000
--- a/test-data/.flake8
+++ /dev/null
@@ -1 +0,0 @@
-../typeshed/.flake8
\ No newline at end of file
diff --git a/test-data/samples/bottles.py b/test-data/samples/bottles.py
deleted file mode 100644
index ddf77f5..0000000
--- a/test-data/samples/bottles.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import typing
-
-REFRAIN = '''
-%d bottles of beer on the wall,
-%d bottles of beer,
-take one down, pass it around,
-%d bottles of beer on the wall!
-'''
-bottles_of_beer = 99
-while bottles_of_beer > 1:
-    print(REFRAIN % (bottles_of_beer, bottles_of_beer,
-          bottles_of_beer - 1))
-    bottles_of_beer -= 1
diff --git a/test-data/samples/class.py b/test-data/samples/class.py
deleted file mode 100644
index d2eb4ac..0000000
--- a/test-data/samples/class.py
+++ /dev/null
@@ -1,18 +0,0 @@
-import typing
-
-
-class BankAccount(object):
-    def __init__(self, initial_balance: int = 0) -> None:
-        self.balance = initial_balance
-
-    def deposit(self, amount: int) -> None:
-        self.balance += amount
-
-    def withdraw(self, amount: int) -> None:
-        self.balance -= amount
-
-    def overdrawn(self) -> bool:
-        return self.balance < 0
-my_account = BankAccount(15)
-my_account.withdraw(5)
-print(my_account.balance)
diff --git a/test-data/samples/cmdline.py b/test-data/samples/cmdline.py
deleted file mode 100644
index 105c27a..0000000
--- a/test-data/samples/cmdline.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# This program adds up integers in the command line
-import sys
-import typing
-try:
-    total = sum(int(arg) for arg in sys.argv[1:])
-    print('sum =', total)
-except ValueError:
-    print('Please supply integer arguments')
diff --git a/test-data/samples/crawl.py b/test-data/samples/crawl.py
deleted file mode 100644
index 56b6f8f..0000000
--- a/test-data/samples/crawl.py
+++ /dev/null
@@ -1,863 +0,0 @@
-#!/usr/bin/env python3.4
-
-"""A simple web crawler."""
-
-# This is cloned from <asyncio>/examples/crawl.py,
-# with type annotations added (PEP 484).
-#
-# TODO: convert to `async def` + `await` (PEP 492).
-
-import argparse
-import asyncio
-import cgi
-from http.client import BadStatusLine
-import logging
-import re
-import sys
-import time
-import urllib.parse
-from typing import Any, Generator, IO, Optional, Sequence, Set, Tuple
-
-
-ARGS = argparse.ArgumentParser(description="Web crawler")
-ARGS.add_argument(
-    '--iocp', action='store_true', dest='iocp',
-    default=False, help='Use IOCP event loop (Windows only)')
-ARGS.add_argument(
-    '--select', action='store_true', dest='select',
-    default=False, help='Use Select event loop instead of default')
-ARGS.add_argument(
-    'roots', nargs='*',
-    default=[], help='Root URL (may be repeated)')
-ARGS.add_argument(
-    '--max_redirect', action='store', type=int, metavar='N',
-    default=10, help='Limit redirection chains (for 301, 302 etc.)')
-ARGS.add_argument(
-    '--max_tries', action='store', type=int, metavar='N',
-    default=4, help='Limit retries on network errors')
-ARGS.add_argument(
-    '--max_tasks', action='store', type=int, metavar='N',
-    default=100, help='Limit concurrent connections')
-ARGS.add_argument(
-    '--max_pool', action='store', type=int, metavar='N',
-    default=100, help='Limit connection pool size')
-ARGS.add_argument(
-    '--exclude', action='store', metavar='REGEX',
-    help='Exclude matching URLs')
-ARGS.add_argument(
-    '--strict', action='store_true',
-    default=True, help='Strict host matching (default)')
-ARGS.add_argument(
-    '--lenient', action='store_false', dest='strict',
-    default=False, help='Lenient host matching')
-ARGS.add_argument(
-    '-v', '--verbose', action='count', dest='level',
-    default=1, help='Verbose logging (repeat for more verbose)')
-ARGS.add_argument(
-    '-q', '--quiet', action='store_const', const=0, dest='level',
-    default=1, help='Quiet logging (opposite of --verbose)')
-
-
-ESCAPES = [('quot', '"'),
-           ('gt', '>'),
-           ('lt', '<'),
-           ('amp', '&')  # Must be last.
-           ]
-
-
-def unescape(url: str) -> str:
-    """Turn & into &, and so on.
-
-    This is the inverse of cgi.escape().
-    """
-    for name, char in ESCAPES:
-        url = url.replace('&' + name + ';', char)
-    return url
-
-
-def fix_url(url: str) -> str:
-    """Prefix a schema-less URL with http://."""
-    if '://' not in url:
-        url = 'http://' + url
-    return url
-
-
-class Logger:
-
-    def __init__(self, level: int) -> None:
-        self.level = level
-
-    def _log(self, n: int, args: Sequence[Any]) -> None:
-        if self.level >= n:
-            print(*args, file=sys.stderr, flush=True)
-
-    def log(self, n: int, *args: Any) -> None:
-        self._log(n, args)
-
-    def __call__(self, n: int, *args: Any) -> None:
-        self._log(n, args)
-
-
-KeyTuple = Tuple[str, int, bool]
-
-
-class ConnectionPool:
-    """A connection pool.
-
-    To open a connection, use reserve().  To recycle it, use unreserve().
-
-    The pool is mostly just a mapping from (host, port, ssl) tuples to
-    lists of Connections.  The currently active connections are *not*
-    in the data structure; get_connection() takes the connection out,
-    and recycle_connection() puts it back in.  To recycle a
-    connection, call conn.close(recycle=True).
-
-    There are limits to both the overall pool and the per-key pool.
-    """
-
-    def __init__(self, log: Logger, max_pool: int = 10, max_tasks: int = 5) -> None:
-        self.log = log
-        self.max_pool = max_pool  # Overall limit.
-        self.max_tasks = max_tasks  # Per-key limit.
-        self.loop = asyncio.get_event_loop()
-        self.connections = {}  # type: Dict[KeyTuple, List[Connection]]
-        self.queue = []  # type: List[Connection]
-
-    def close(self) -> None:
-        """Close all connections available for reuse."""
-        for conns in self.connections.values():
-            for conn in conns:
-                conn.close()
-        self.connections.clear()
-        self.queue.clear()
-
-    @asyncio.coroutine
-    def get_connection(self, host: str, port: int, ssl: bool) -> Generator[Any, None, 'Connection']:
-        """Create or reuse a connection."""
-        port = port or (443 if ssl else 80)
-        try:
-            ipaddrs = yield from self.loop.getaddrinfo(host, port)
-        except Exception as exc:
-            self.log(0, 'Exception %r for (%r, %r)' % (exc, host, port))
-            raise
-        self.log(1, '* %s resolves to %s' %
-                    (host, ', '.join(ip[4][0] for ip in ipaddrs)))
-
-        # Look for a reusable connection.
-        for _1, _2, _3, _4, (h, p, *_5) in ipaddrs:
-            key = h, p, ssl
-            conn = None
-            conns = self.connections.get(key)
-            while conns:
-                conn = conns.pop(0)
-                self.queue.remove(conn)
-                if not conns:
-                    del self.connections[key]
-                if conn.stale():
-                    self.log(1, 'closing stale connection for', key)
-                    conn.close()  # Just in case.
-                else:
-                    self.log(1, '* Reusing pooled connection', key,
-                                'FD =', conn.fileno())
-                    return conn
-
-        # Create a new connection.
-        conn = Connection(self.log, self, host, port, ssl)
-        yield from conn.connect()
-        self.log(1, '* New connection', conn.key, 'FD =', conn.fileno())
-        return conn
-
-    def recycle_connection(self, conn: 'Connection') -> None:
-        """Make a connection available for reuse.
-
-        This also prunes the pool if it exceeds the size limits.
-        """
-        if conn.stale():
-            conn.close()
-            return
-
-        key = conn.key
-        conns = self.connections.setdefault(key, [])
-        conns.append(conn)
-        self.queue.append(conn)
-
-        if len(conns) <= self.max_tasks and len(self.queue) <= self.max_pool:
-            return
-
-        # Prune the queue.
-
-        # Close stale connections for this key first.
-        stale = [conn for conn in conns if conn.stale()]
-        if stale:
-            for conn in stale:
-                conns.remove(conn)
-                self.queue.remove(conn)
-                self.log(1, 'closing stale connection for', key)
-                conn.close()
-            if not conns:
-                del self.connections[key]
-
-        # Close oldest connection(s) for this key if limit reached.
-        while len(conns) > self.max_tasks:
-            conn = conns.pop(0)
-            self.queue.remove(conn)
-            self.log(1, 'closing oldest connection for', key)
-            conn.close()
-
-        if len(self.queue) <= self.max_pool:
-            return
-
-        # Close overall stale connections.
-        stale = [conn for conn in self.queue if conn.stale()]
-        if stale:
-            for conn in stale:
-                conns = self.connections.get(conn.key)
-                conns.remove(conn)
-                self.queue.remove(conn)
-                self.log(1, 'closing stale connection for', key)
-                conn.close()
-
-        # Close oldest overall connection(s) if limit reached.
-        while len(self.queue) > self.max_pool:
-            conn = self.queue.pop(0)
-            conns = self.connections.get(conn.key)
-            c = conns.pop(0)
-            assert conn == c, (conn.key, conn, c, conns)
-            self.log(1, 'closing overall oldest connection for', conn.key)
-            conn.close()
-
-
-class Connection:
-
-    def __init__(self, log: Logger, pool: ConnectionPool, host: str, port: int, ssl: bool) -> None:
-        self.log = log
-        self.pool = pool
-        self.host = host
-        self.port = port
-        self.ssl = ssl
-        self.reader = None  # type: asyncio.StreamReader
-        self.writer = None  # type: asyncio.StreamWriter
-        self.key = None  # type: KeyTuple
-
-    def stale(self) -> bool:
-        return self.reader is None or self.reader.at_eof()
-
-    def fileno(self) -> Optional[int]:
-        writer = self.writer
-        if writer is not None:
-            transport = writer.transport
-            if transport is not None:
-                sock = transport.get_extra_info('socket')
-                if sock is not None:
-                    return sock.fileno()
-        return None
-
-    @asyncio.coroutine
-    def connect(self) -> Generator[Any, None, None]:
-        self.reader, self.writer = yield from asyncio.open_connection(
-            self.host, self.port, ssl=self.ssl)
-        peername = self.writer.get_extra_info('peername')
-        if peername:
-            self.host, self.port = peername[:2]
-        else:
-            self.log(1, 'NO PEERNAME???', self.host, self.port, self.ssl)
-        self.key = self.host, self.port, self.ssl
-
-    def close(self, recycle: bool = False) -> None:
-        if recycle and not self.stale():
-            self.pool.recycle_connection(self)
-        else:
-            self.writer.close()
-            self.pool = self.reader = self.writer = None
-
-
-class Request:
-    """HTTP request.
-
-    Use connect() to open a connection; send_request() to send the
-    request; get_response() to receive the response headers.
-    """
-
-    def __init__(self, log: Logger, url: str, pool: ConnectionPool) -> None:
-        self.log = log
-        self.url = url
-        self.pool = pool
-        self.parts = urllib.parse.urlparse(self.url)
-        self.scheme = self.parts.scheme
-        assert self.scheme in ('http', 'https'), repr(url)
-        self.ssl = self.parts.scheme == 'https'
-        self.netloc = self.parts.netloc
-        self.hostname = self.parts.hostname
-        self.port = self.parts.port or (443 if self.ssl else 80)
-        self.path = (self.parts.path or '/')
-        self.query = self.parts.query
-        if self.query:
-            self.full_path = '%s?%s' % (self.path, self.query)
-        else:
-            self.full_path = self.path
-        self.http_version = 'HTTP/1.1'
-        self.method = 'GET'
-        self.headers = []  # type: List[Tuple[str, str]]
-        self.conn = None  # type: Connection
-
-    @asyncio.coroutine
-    def connect(self) -> Generator[Any, None, None]:
-        """Open a connection to the server."""
-        self.log(1, '* Connecting to %s:%s using %s for %s' %
-                    (self.hostname, self.port,
-                     'ssl' if self.ssl else 'tcp',
-                     self.url))
-        self.conn = yield from self.pool.get_connection(self.hostname,
-                                                        self.port, self.ssl)
-
-    def close(self, recycle: bool = False) -> None:
-        """Close the connection, recycle if requested."""
-        if self.conn is not None:
-            if not recycle:
-                self.log(1, 'closing connection for', self.conn.key)
-            self.conn.close(recycle)
-            self.conn = None
-
-    @asyncio.coroutine
-    def putline(self, line: str) -> Generator[Any, None, None]:
-        """Write a line to the connection.
-
-        Used for the request line and headers.
-        """
-        self.log(2, '>', line)
-        self.conn.writer.write(line.encode('latin-1') + b'\r\n')
-
-    @asyncio.coroutine
-    def send_request(self) -> Generator[Any, None, None]:
-        """Send the request."""
-        request_line = '%s %s %s' % (self.method, self.full_path,
-                                     self.http_version)
-        yield from self.putline(request_line)
-        # TODO: What if a header is already set?
-        self.headers.append(('User-Agent', 'asyncio-example-crawl/0.0'))
-        self.headers.append(('Host', self.netloc))
-        self.headers.append(('Accept', '*/*'))
-        # self.headers.append(('Accept-Encoding', 'gzip'))
-        for key, value in self.headers:
-            line = '%s: %s' % (key, value)
-            yield from self.putline(line)
-        yield from self.putline('')
-
-    @asyncio.coroutine
-    def get_response(self) -> Generator[Any, None, 'Response']:
-        """Receive the response."""
-        response = Response(self.log, self.conn.reader)
-        yield from response.read_headers()
-        return response
-
-
-class Response:
-    """HTTP response.
-
-    Call read_headers() to receive the request headers.  Then check
-    the status attribute and call get_header() to inspect the headers.
-    Finally call read() to receive the body.
-    """
-
-    def __init__(self, log: Logger, reader: asyncio.StreamReader) -> None:
-        self.log = log
-        self.reader = reader
-        self.http_version = None  # type: str  # 'HTTP/1.1'
-        self.status = None  # type: int  # 200
-        self.reason = None  # type: str  # 'Ok'
-        self.headers = []  # type: List[Tuple[str, str]]  # [('Content-Type', 'text/html')]
-
-    @asyncio.coroutine
-    def getline(self) -> Generator[Any, None, str]:
-        """Read one line from the connection."""
-        line = (yield from self.reader.readline()).decode('latin-1').rstrip()
-        self.log(2, '<', line)
-        return line
-
-    @asyncio.coroutine
-    def read_headers(self) -> Generator[Any, None, None]:
-        """Read the response status and the request headers."""
-        status_line = yield from self.getline()
-        status_parts = status_line.split(None, 2)
-        if len(status_parts) != 3:
-            self.log(0, 'bad status_line', repr(status_line))
-            raise BadStatusLine(status_line)
-        self.http_version, status, self.reason = status_parts
-        self.status = int(status)
-        while True:
-            header_line = yield from self.getline()
-            if not header_line:
-                break
-            # TODO: Continuation lines.
-            key, value = header_line.split(':', 1)
-            self.headers.append((key, value.strip()))
-
-    def get_redirect_url(self, default: str = '') -> str:
-        """Inspect the status and return the redirect url if appropriate."""
-        if self.status not in (300, 301, 302, 303, 307):
-            return default
-        return self.get_header('Location', default)
-
-    def get_header(self, key: str, default: str = '') -> str:
-        """Get one header value, using a case insensitive header name."""
-        key = key.lower()
-        for k, v in self.headers:
-            if k.lower() == key:
-                return v
-        return default
-
-    @asyncio.coroutine
-    def read(self) -> Generator[Any, None, bytes]:
-        """Read the response body.
-
-        This honors Content-Length and Transfer-Encoding: chunked.
-        """
-        nbytes = None
-        for key, value in self.headers:
-            if key.lower() == 'content-length':
-                nbytes = int(value)
-                break
-        if nbytes is None:
-            if self.get_header('transfer-encoding').lower() == 'chunked':
-                self.log(2, 'parsing chunked response')
-                blocks = []
-                while True:
-                    size_header = yield from self.reader.readline()
-                    if not size_header:
-                        self.log(0, 'premature end of chunked response')
-                        break
-                    self.log(3, 'size_header =', repr(size_header))
-                    parts = size_header.split(b';')
-                    size = int(parts[0], 16)
-                    if size:
-                        self.log(3, 'reading chunk of', size, 'bytes')
-                        block = yield from self.reader.readexactly(size)
-                        assert len(block) == size, (len(block), size)
-                        blocks.append(block)
-                    crlf = yield from self.reader.readline()
-                    assert crlf == b'\r\n', repr(crlf)
-                    if not size:
-                        break
-                body = b''.join(blocks)
-                self.log(1, 'chunked response had', len(body),
-                            'bytes in', len(blocks), 'blocks')
-            else:
-                self.log(3, 'reading until EOF')
-                body = yield from self.reader.read()
-                # TODO: Should make sure not to recycle the connection
-                # in this case.
-        else:
-            body = yield from self.reader.readexactly(nbytes)
-        return body
-
-
-class Fetcher:
-    """Logic and state for one URL.
-
-    When found in crawler.busy, this represents a URL to be fetched or
-    in the process of being fetched; when found in crawler.done, this
-    holds the results from fetching it.
-
-    This is usually associated with a task.  This references the
-    crawler for the connection pool and to add more URLs to its todo
-    list.
-
-    Call fetch() to do the fetching, then report() to print the results.
-    """
-
-    def __init__(self, log: Logger, url: str, crawler: 'Crawler',
-                 max_redirect: int = 10, max_tries: int = 4) -> None:
-        self.log = log
-        self.url = url
-        self.crawler = crawler
-        # We don't loop resolving redirects here -- we just use this
-        # to decide whether to add the redirect URL to crawler.todo.
-        self.max_redirect = max_redirect
-        # But we do loop to retry on errors a few times.
-        self.max_tries = max_tries
-        # Everything we collect from the response goes here.
-        self.task = None  # type: asyncio.Task
-        self.exceptions = []  # type: List[Exception]
-        self.tries = 0
-        self.request = None  # type: Request
-        self.response = None  # type: Response
-        self.body = None  # type: bytes
-        self.next_url = None  # type: str
-        self.ctype = None  # type: str
-        self.pdict = None  # type: Dict[str, str]
-        self.encoding = None  # type: str
-        self.urls = None  # type: Set[str]
-        self.new_urls = None  # type: Set[str]
-
-    @asyncio.coroutine
-    def fetch(self) -> Generator[Any, None, None]:
-        """Attempt to fetch the contents of the URL.
-
-        If successful, and the data is HTML, extract further links and
-        add them to the crawler.  Redirects are also added back there.
-        """
-        while self.tries < self.max_tries:
-            self.tries += 1
-            self.request = None
-            try:
-                self.request = Request(self.log, self.url, self.crawler.pool)
-                yield from self.request.connect()
-                yield from self.request.send_request()
-                self.response = yield from self.request.get_response()
-                self.body = yield from self.response.read()
-                h_conn = self.response.get_header('connection').lower()
-                if h_conn != 'close':
-                    self.request.close(recycle=True)
-                    self.request = None
-                if self.tries > 1:
-                    self.log(1, 'try', self.tries, 'for', self.url, 'success')
-                break
-            except (BadStatusLine, OSError) as exc:
-                self.exceptions.append(exc)
-                self.log(1, 'try', self.tries, 'for', self.url,
-                            'raised', repr(exc))
-                # import pdb; pdb.set_trace()
-                # Don't reuse the connection in this case.
-            finally:
-                if self.request is not None:
-                    self.request.close()
-        else:
-            # We never broke out of the while loop, i.e. all tries failed.
-            self.log(0, 'no success for', self.url,
-                        'in', self.max_tries, 'tries')
-            return
-        next_url = self.response.get_redirect_url()
-        if next_url:
-            self.next_url = urllib.parse.urljoin(self.url, next_url)
-            if self.max_redirect > 0:
-                self.log(1, 'redirect to', self.next_url, 'from', self.url)
-                self.crawler.add_url(self.next_url, self.max_redirect - 1)
-            else:
-                self.log(0, 'redirect limit reached for', self.next_url,
-                            'from', self.url)
-        else:
-            if self.response.status == 200:
-                self.ctype = self.response.get_header('content-type')
-                self.pdict = {}
-                if self.ctype:
-                    self.ctype, self.pdict = cgi.parse_header(self.ctype)
-                self.encoding = self.pdict.get('charset', 'utf-8')
-                if self.ctype == 'text/html':
-                    body = self.body.decode(self.encoding, 'replace')
-                    # Replace href with (?:href|src) to follow image links.
-                    self.urls = set(re.findall(r'(?i)href=["\']?([^\s"\'<>]+)',
-                                               body))
-                    if self.urls:
-                        self.log(1, 'got', len(self.urls),
-                                    'distinct urls from', self.url)
-                    self.new_urls = set()
-                    for url in self.urls:
-                        url = unescape(url)
-                        url = urllib.parse.urljoin(self.url, url)
-                        url, frag = urllib.parse.urldefrag(url)
-                        if self.crawler.add_url(url):
-                            self.new_urls.add(url)
-
-    def report(self, stats: 'Stats', file: IO[str] = None) -> None:
-        """Print a report on the state for this URL.
-
-        Also update the Stats instance.
-        """
-        if self.task is not None:
-            if not self.task.done():
-                stats.add('pending')
-                print(self.url, 'pending', file=file)
-                return
-            elif self.task.cancelled():
-                stats.add('cancelled')
-                print(self.url, 'cancelled', file=file)
-                return
-            elif self.task.exception():
-                stats.add('exception')
-                exc = self.task.exception()
-                stats.add('exception_' + exc.__class__.__name__)
-                print(self.url, exc, file=file)
-                return
-        if len(self.exceptions) == self.tries:
-            stats.add('fail')
-            exc = self.exceptions[-1]
-            stats.add('fail_' + str(exc.__class__.__name__))
-            print(self.url, 'error', exc, file=file)
-        elif self.next_url:
-            stats.add('redirect')
-            print(self.url, self.response.status, 'redirect', self.next_url,
-                  file=file)
-        elif self.ctype == 'text/html':
-            stats.add('html')
-            size = len(self.body or b'')
-            stats.add('html_bytes', size)
-            if self.log.level:
-                print(self.url, self.response.status,
-                      self.ctype, self.encoding,
-                      size,
-                      '%d/%d' % (len(self.new_urls or ()), len(self.urls or ())),
-                      file=file)
-        elif self.response is None:
-            print(self.url, 'no response object')
-        else:
-            size = len(self.body or b'')
-            if self.response.status == 200:
-                stats.add('other')
-                stats.add('other_bytes', size)
-            else:
-                stats.add('error')
-                stats.add('error_bytes', size)
-                stats.add('status_%s' % self.response.status)
-            print(self.url, self.response.status,
-                  self.ctype, self.encoding,
-                  size,
-                  file=file)
-
-
-class Stats:
-    """Record stats of various sorts."""
-
-    def __init__(self) -> None:
-        self.stats = {}  # type: Dict[str, int]
-
-    def add(self, key: str, count: int = 1) -> None:
-        self.stats[key] = self.stats.get(key, 0) + count
-
-    def report(self, file: IO[str] = None) -> None:
-        for key, count in sorted(self.stats.items()):
-            print('%10d' % count, key, file=file)
-
-
-class Crawler:
-    """Crawl a set of URLs.
-
-    This manages three disjoint sets of URLs (todo, busy, done).  The
-    data structures actually store dicts -- the values in todo give
-    the redirect limit, while the values in busy and done are Fetcher
-    instances.
-    """
-    def __init__(self, log: Logger,
-                 roots: Set[str], exclude: str = None, strict: bool = True,  # What to crawl.
-                 max_redirect: int = 10, max_tries: int = 4,  # Per-url limits.
-                 max_tasks: int = 10, max_pool: int = 10,  # Global limits.
-                 ) -> None:
-        self.log = log
-        self.roots = roots
-        self.exclude = exclude
-        self.strict = strict
-        self.max_redirect = max_redirect
-        self.max_tries = max_tries
-        self.max_tasks = max_tasks
-        self.max_pool = max_pool
-        self.todo = {}  # type: Dict[str, int]
-        self.busy = {}  # type: Dict[str, Fetcher]
-        self.done = {}  # type: Dict[str, Fetcher]
-        self.pool = ConnectionPool(self.log, max_pool, max_tasks)
-        self.root_domains = set()  # type: Set[str]
-        for root in roots:
-            host = urllib.parse.urlparse(root).hostname
-            if not host:
-                continue
-            if re.match(r'\A[\d\.]*\Z', host):
-                self.root_domains.add(host)
-            else:
-                host = host.lower()
-                if self.strict:
-                    self.root_domains.add(host)
-                    if host.startswith('www.'):
-                        self.root_domains.add(host[4:])
-                    else:
-                        self.root_domains.add('www.' + host)
-                else:
-                    parts = host.split('.')
-                    if len(parts) > 2:
-                        host = '.'.join(parts[-2:])
-                    self.root_domains.add(host)
-        for root in roots:
-            self.add_url(root)
-        self.governor = asyncio.Semaphore(max_tasks)
-        self.termination = asyncio.Condition()
-        self.t0 = time.time()
-        self.t1 = None  # type: Optional[float]
-
-    def close(self) -> None:
-        """Close resources (currently only the pool)."""
-        self.pool.close()
-
-    def host_okay(self, host: str) -> bool:
-        """Check if a host should be crawled.
-
-        A literal match (after lowercasing) is always good.  For hosts
-        that don't look like IP addresses, some approximate matches
-        are okay depending on the strict flag.
-        """
-        host = host.lower()
-        if host in self.root_domains:
-            return True
-        if re.match(r'\A[\d\.]*\Z', host):
-            return False
-        if self.strict:
-            return self._host_okay_strictish(host)
-        else:
-            return self._host_okay_lenient(host)
-
-    def _host_okay_strictish(self, host: str) -> bool:
-        """Check if a host should be crawled, strict-ish version.
-
-        This checks for equality modulo an initial 'www.' component.
-         """
-        if host.startswith('www.'):
-            if host[4:] in self.root_domains:
-                return True
-        else:
-            if 'www.' + host in self.root_domains:
-                return True
-        return False
-
-    def _host_okay_lenient(self, host: str) -> bool:
-        """Check if a host should be crawled, lenient version.
-
-        This compares the last two components of the host.
-        """
-        parts = host.split('.')
-        if len(parts) > 2:
-            host = '.'.join(parts[-2:])
-        return host in self.root_domains
-
-    def add_url(self, url: str, max_redirect: int = None) -> bool:
-        """Add a URL to the todo list if not seen before."""
-        if self.exclude and re.search(self.exclude, url):
-            return False
-        parsed = urllib.parse.urlparse(url)
-        if parsed.scheme not in ('http', 'https'):
-            self.log(2, 'skipping non-http scheme in', url)
-            return False
-        host = parsed.hostname
-        if not self.host_okay(host):
-            self.log(2, 'skipping non-root host in', url)
-            return False
-        if max_redirect is None:
-            max_redirect = self.max_redirect
-        if url in self.todo or url in self.busy or url in self.done:
-            return False
-        self.log(1, 'adding', url, max_redirect)
-        self.todo[url] = max_redirect
-        return True
-
-    @asyncio.coroutine
-    def crawl(self) -> Generator[Any, None, None]:
-        """Run the crawler until all finished."""
-        with (yield from self.termination):
-            while self.todo or self.busy:
-                if self.todo:
-                    url, max_redirect = self.todo.popitem()
-                    fetcher = Fetcher(self.log, url,
-                                      crawler=self,
-                                      max_redirect=max_redirect,
-                                      max_tries=self.max_tries,
-                                      )
-                    self.busy[url] = fetcher
-                    fetcher.task = asyncio.Task(self.fetch(fetcher))
-                else:
-                    yield from self.termination.wait()
-        self.t1 = time.time()
-
-    @asyncio.coroutine
-    def fetch(self, fetcher: Fetcher) -> Generator[Any, None, None]:
-        """Call the Fetcher's fetch(), with a limit on concurrency.
-
-        Once this returns, move the fetcher from busy to done.
-        """
-        url = fetcher.url
-        with (yield from self.governor):
-            try:
-                yield from fetcher.fetch()  # Fetcher gonna fetch.
-            finally:
-                # Force GC of the task, so the error is logged.
-                fetcher.task = None
-        with (yield from self.termination):
-            self.done[url] = fetcher
-            del self.busy[url]
-            self.termination.notify()
-
-    def report(self, file: IO[str] = None) -> None:
-        """Print a report on all completed URLs."""
-        if self.t1 is None:
-            self.t1 = time.time()
-        dt = self.t1 - self.t0
-        if dt and self.max_tasks:
-            speed = len(self.done) / dt / self.max_tasks
-        else:
-            speed = 0
-        stats = Stats()
-        print('*** Report ***', file=file)
-        try:
-            show = []  # type: List[Tuple[str, Fetcher]]
-            show.extend(self.done.items())
-            show.extend(self.busy.items())
-            show.sort()
-            for url, fetcher in show:
-                fetcher.report(stats, file=file)
-        except KeyboardInterrupt:
-            print('\nInterrupted', file=file)
-        print('Finished', len(self.done),
-              'urls in %.3f secs' % dt,
-              '(max_tasks=%d)' % self.max_tasks,
-              '(%.3f urls/sec/task)' % speed,
-              file=file)
-        stats.report(file=file)
-        print('Todo:', len(self.todo), file=file)
-        print('Busy:', len(self.busy), file=file)
-        print('Done:', len(self.done), file=file)
-        print('Date:', time.ctime(), 'local time', file=file)
-
-
-def main() -> None:
-    """Main program.
-
-    Parse arguments, set up event loop, run crawler, print report.
-    """
-    args = ARGS.parse_args()
-    if not args.roots:
-        print('Use --help for command line help')
-        return
-
-    log = Logger(args.level)
-
-    if args.iocp:
-        if sys.platform == 'win32':
-            from asyncio import ProactorEventLoop
-            loop = ProactorEventLoop()  # type: ignore
-            asyncio.set_event_loop(loop)
-        else:
-            assert False
-    elif args.select:
-        loop = asyncio.SelectorEventLoop()  # type: ignore
-        asyncio.set_event_loop(loop)
-    else:
-        loop = asyncio.get_event_loop()
-
-    roots = {fix_url(root) for root in args.roots}
-
-    crawler = Crawler(log,
-                      roots, exclude=args.exclude,
-                      strict=args.strict,
-                      max_redirect=args.max_redirect,
-                      max_tries=args.max_tries,
-                      max_tasks=args.max_tasks,
-                      max_pool=args.max_pool,
-                      )
-    try:
-        loop.run_until_complete(crawler.crawl())  # Crawler gonna crawl.
-    except KeyboardInterrupt:
-        sys.stderr.flush()
-        print('\nInterrupted\n')
-    finally:
-        crawler.report()
-        crawler.close()
-        loop.close()
-
-
-if __name__ == '__main__':
-    logging.basicConfig(level=logging.INFO) # type: ignore
-    main()
diff --git a/test-data/samples/crawl2.py b/test-data/samples/crawl2.py
deleted file mode 100644
index 5eaad70..0000000
--- a/test-data/samples/crawl2.py
+++ /dev/null
@@ -1,852 +0,0 @@
-#!/usr/bin/env python3.4
-
-"""A simple web crawler."""
-
-# This is cloned from <asyncio>/examples/crawl.py,
-# with type annotations added (PEP 484).
-#
-# This version (crawl2.) has also been converted to use `async def` +
-# `await` (PEP 492).
-
-import argparse
-import asyncio
-import cgi
-from http.client import BadStatusLine
-import logging
-import re
-import sys
-import time
-import urllib.parse
-from typing import Any, Awaitable, IO, Optional, Sequence, Set, Tuple
-
-
-ARGS = argparse.ArgumentParser(description="Web crawler")
-ARGS.add_argument(
-    '--iocp', action='store_true', dest='iocp',
-    default=False, help='Use IOCP event loop (Windows only)')
-ARGS.add_argument(
-    '--select', action='store_true', dest='select',
-    default=False, help='Use Select event loop instead of default')
-ARGS.add_argument(
-    'roots', nargs='*',
-    default=[], help='Root URL (may be repeated)')
-ARGS.add_argument(
-    '--max_redirect', action='store', type=int, metavar='N',
-    default=10, help='Limit redirection chains (for 301, 302 etc.)')
-ARGS.add_argument(
-    '--max_tries', action='store', type=int, metavar='N',
-    default=4, help='Limit retries on network errors')
-ARGS.add_argument(
-    '--max_tasks', action='store', type=int, metavar='N',
-    default=100, help='Limit concurrent connections')
-ARGS.add_argument(
-    '--max_pool', action='store', type=int, metavar='N',
-    default=100, help='Limit connection pool size')
-ARGS.add_argument(
-    '--exclude', action='store', metavar='REGEX',
-    help='Exclude matching URLs')
-ARGS.add_argument(
-    '--strict', action='store_true',
-    default=True, help='Strict host matching (default)')
-ARGS.add_argument(
-    '--lenient', action='store_false', dest='strict',
-    default=False, help='Lenient host matching')
-ARGS.add_argument(
-    '-v', '--verbose', action='count', dest='level',
-    default=1, help='Verbose logging (repeat for more verbose)')
-ARGS.add_argument(
-    '-q', '--quiet', action='store_const', const=0, dest='level',
-    default=1, help='Quiet logging (opposite of --verbose)')
-
-
-ESCAPES = [('quot', '"'),
-           ('gt', '>'),
-           ('lt', '<'),
-           ('amp', '&')  # Must be last.
-           ]
-
-
-def unescape(url: str) -> str:
-    """Turn & into &, and so on.
-
-    This is the inverse of cgi.escape().
-    """
-    for name, char in ESCAPES:
-        url = url.replace('&' + name + ';', char)
-    return url
-
-
-def fix_url(url: str) -> str:
-    """Prefix a schema-less URL with http://."""
-    if '://' not in url:
-        url = 'http://' + url
-    return url
-
-
-class Logger:
-
-    def __init__(self, level: int) -> None:
-        self.level = level
-
-    def _log(self, n: int, args: Sequence[Any]) -> None:
-        if self.level >= n:
-            print(*args, file=sys.stderr, flush=True)
-
-    def log(self, n: int, *args: Any) -> None:
-        self._log(n, args)
-
-    def __call__(self, n: int, *args: Any) -> None:
-        self._log(n, args)
-
-
-KeyTuple = Tuple[str, int, bool]
-
-
-class ConnectionPool:
-    """A connection pool.
-
-    To open a connection, use reserve().  To recycle it, use unreserve().
-
-    The pool is mostly just a mapping from (host, port, ssl) tuples to
-    lists of Connections.  The currently active connections are *not*
-    in the data structure; get_connection() takes the connection out,
-    and recycle_connection() puts it back in.  To recycle a
-    connection, call conn.close(recycle=True).
-
-    There are limits to both the overall pool and the per-key pool.
-    """
-
-    def __init__(self, log: Logger, max_pool: int = 10, max_tasks: int = 5) -> None:
-        self.log = log
-        self.max_pool = max_pool  # Overall limit.
-        self.max_tasks = max_tasks  # Per-key limit.
-        self.loop = asyncio.get_event_loop()
-        self.connections = {}  # type: Dict[KeyTuple, List[Connection]]
-        self.queue = []  # type: List[Connection]
-
-    def close(self) -> None:
-        """Close all connections available for reuse."""
-        for conns in self.connections.values():
-            for conn in conns:
-                conn.close()
-        self.connections.clear()
-        self.queue.clear()
-
-    async def get_connection(self, host: str, port: int, ssl: bool) -> 'Connection':
-        """Create or reuse a connection."""
-        port = port or (443 if ssl else 80)
-        try:
-            ipaddrs = await self.loop.getaddrinfo(host, port)
-        except Exception as exc:
-            self.log(0, 'Exception %r for (%r, %r)' % (exc, host, port))
-            raise
-        self.log(1, '* %s resolves to %s' %
-                    (host, ', '.join(ip[4][0] for ip in ipaddrs)))
-
-        # Look for a reusable connection.
-        for _1, _2, _3, _4, (h, p, *_5) in ipaddrs:
-            key = h, p, ssl
-            conn = None
-            conns = self.connections.get(key)
-            while conns:
-                conn = conns.pop(0)
-                self.queue.remove(conn)
-                if not conns:
-                    del self.connections[key]
-                if conn.stale():
-                    self.log(1, 'closing stale connection for', key)
-                    conn.close()  # Just in case.
-                else:
-                    self.log(1, '* Reusing pooled connection', key,
-                                'FD =', conn.fileno())
-                    return conn
-
-        # Create a new connection.
-        conn = Connection(self.log, self, host, port, ssl)
-        await conn.connect()
-        self.log(1, '* New connection', conn.key, 'FD =', conn.fileno())
-        return conn
-
-    def recycle_connection(self, conn: 'Connection') -> None:
-        """Make a connection available for reuse.
-
-        This also prunes the pool if it exceeds the size limits.
-        """
-        if conn.stale():
-            conn.close()
-            return
-
-        key = conn.key
-        conns = self.connections.setdefault(key, [])
-        conns.append(conn)
-        self.queue.append(conn)
-
-        if len(conns) <= self.max_tasks and len(self.queue) <= self.max_pool:
-            return
-
-        # Prune the queue.
-
-        # Close stale connections for this key first.
-        stale = [conn for conn in conns if conn.stale()]
-        if stale:
-            for conn in stale:
-                conns.remove(conn)
-                self.queue.remove(conn)
-                self.log(1, 'closing stale connection for', key)
-                conn.close()
-            if not conns:
-                del self.connections[key]
-
-        # Close oldest connection(s) for this key if limit reached.
-        while len(conns) > self.max_tasks:
-            conn = conns.pop(0)
-            self.queue.remove(conn)
-            self.log(1, 'closing oldest connection for', key)
-            conn.close()
-
-        if len(self.queue) <= self.max_pool:
-            return
-
-        # Close overall stale connections.
-        stale = [conn for conn in self.queue if conn.stale()]
-        if stale:
-            for conn in stale:
-                conns = self.connections.get(conn.key)
-                conns.remove(conn)
-                self.queue.remove(conn)
-                self.log(1, 'closing stale connection for', key)
-                conn.close()
-
-        # Close oldest overall connection(s) if limit reached.
-        while len(self.queue) > self.max_pool:
-            conn = self.queue.pop(0)
-            conns = self.connections.get(conn.key)
-            c = conns.pop(0)
-            assert conn == c, (conn.key, conn, c, conns)
-            self.log(1, 'closing overall oldest connection for', conn.key)
-            conn.close()
-
-
-class Connection:
-
-    def __init__(self, log: Logger, pool: ConnectionPool, host: str, port: int, ssl: bool) -> None:
-        self.log = log
-        self.pool = pool
-        self.host = host
-        self.port = port
-        self.ssl = ssl
-        self.reader = None  # type: asyncio.StreamReader
-        self.writer = None  # type: asyncio.StreamWriter
-        self.key = None  # type: KeyTuple
-
-    def stale(self) -> bool:
-        return self.reader is None or self.reader.at_eof()
-
-    def fileno(self) -> Optional[int]:
-        writer = self.writer
-        if writer is not None:
-            transport = writer.transport
-            if transport is not None:
-                sock = transport.get_extra_info('socket')
-                if sock is not None:
-                    return sock.fileno()
-        return None
-
-    async def connect(self) -> None:
-        self.reader, self.writer = await asyncio.open_connection(
-            self.host, self.port, ssl=self.ssl)
-        peername = self.writer.get_extra_info('peername')
-        if peername:
-            self.host, self.port = peername[:2]
-        else:
-            self.log(1, 'NO PEERNAME???', self.host, self.port, self.ssl)
-        self.key = self.host, self.port, self.ssl
-
-    def close(self, recycle: bool = False) -> None:
-        if recycle and not self.stale():
-            self.pool.recycle_connection(self)
-        else:
-            self.writer.close()
-            self.pool = self.reader = self.writer = None
-
-
-class Request:
-    """HTTP request.
-
-    Use connect() to open a connection; send_request() to send the
-    request; get_response() to receive the response headers.
-    """
-
-    def __init__(self, log: Logger, url: str, pool: ConnectionPool) -> None:
-        self.log = log
-        self.url = url
-        self.pool = pool
-        self.parts = urllib.parse.urlparse(self.url)
-        self.scheme = self.parts.scheme
-        assert self.scheme in ('http', 'https'), repr(url)
-        self.ssl = self.parts.scheme == 'https'
-        self.netloc = self.parts.netloc
-        self.hostname = self.parts.hostname
-        self.port = self.parts.port or (443 if self.ssl else 80)
-        self.path = (self.parts.path or '/')
-        self.query = self.parts.query
-        if self.query:
-            self.full_path = '%s?%s' % (self.path, self.query)
-        else:
-            self.full_path = self.path
-        self.http_version = 'HTTP/1.1'
-        self.method = 'GET'
-        self.headers = []  # type: List[Tuple[str, str]]
-        self.conn = None  # type: Connection
-
-    async def connect(self) -> None:
-        """Open a connection to the server."""
-        self.log(1, '* Connecting to %s:%s using %s for %s' %
-                    (self.hostname, self.port,
-                     'ssl' if self.ssl else 'tcp',
-                     self.url))
-        self.conn = await self.pool.get_connection(self.hostname,
-                                                        self.port, self.ssl)
-
-    def close(self, recycle: bool = False) -> None:
-        """Close the connection, recycle if requested."""
-        if self.conn is not None:
-            if not recycle:
-                self.log(1, 'closing connection for', self.conn.key)
-            self.conn.close(recycle)
-            self.conn = None
-
-    async def putline(self, line: str) -> None:
-        """Write a line to the connection.
-
-        Used for the request line and headers.
-        """
-        self.log(2, '>', line)
-        self.conn.writer.write(line.encode('latin-1') + b'\r\n')
-
-    async def send_request(self) -> None:
-        """Send the request."""
-        request_line = '%s %s %s' % (self.method, self.full_path,
-                                     self.http_version)
-        await self.putline(request_line)
-        # TODO: What if a header is already set?
-        self.headers.append(('User-Agent', 'asyncio-example-crawl/0.0'))
-        self.headers.append(('Host', self.netloc))
-        self.headers.append(('Accept', '*/*'))
-        # self.headers.append(('Accept-Encoding', 'gzip'))
-        for key, value in self.headers:
-            line = '%s: %s' % (key, value)
-            await self.putline(line)
-        await self.putline('')
-
-    async def get_response(self) -> 'Response':
-        """Receive the response."""
-        response = Response(self.log, self.conn.reader)
-        await response.read_headers()
-        return response
-
-
-class Response:
-    """HTTP response.
-
-    Call read_headers() to receive the request headers.  Then check
-    the status attribute and call get_header() to inspect the headers.
-    Finally call read() to receive the body.
-    """
-
-    def __init__(self, log: Logger, reader: asyncio.StreamReader) -> None:
-        self.log = log
-        self.reader = reader
-        self.http_version = None  # type: str  # 'HTTP/1.1'
-        self.status = None  # type: int  # 200
-        self.reason = None  # type: str  # 'Ok'
-        self.headers = []  # type: List[Tuple[str, str]]  # [('Content-Type', 'text/html')]
-
-    async def getline(self) -> str:
-        """Read one line from the connection."""
-        line = (await self.reader.readline()).decode('latin-1').rstrip()
-        self.log(2, '<', line)
-        return line
-
-    async def read_headers(self) -> None:
-        """Read the response status and the request headers."""
-        status_line = await self.getline()
-        status_parts = status_line.split(None, 2)
-        if len(status_parts) != 3:
-            self.log(0, 'bad status_line', repr(status_line))
-            raise BadStatusLine(status_line)
-        self.http_version, status, self.reason = status_parts
-        self.status = int(status)
-        while True:
-            header_line = await self.getline()
-            if not header_line:
-                break
-            # TODO: Continuation lines.
-            key, value = header_line.split(':', 1)
-            self.headers.append((key, value.strip()))
-
-    def get_redirect_url(self, default: str = '') -> str:
-        """Inspect the status and return the redirect url if appropriate."""
-        if self.status not in (300, 301, 302, 303, 307):
-            return default
-        return self.get_header('Location', default)
-
-    def get_header(self, key: str, default: str = '') -> str:
-        """Get one header value, using a case insensitive header name."""
-        key = key.lower()
-        for k, v in self.headers:
-            if k.lower() == key:
-                return v
-        return default
-
-    async def read(self) -> bytes:
-        """Read the response body.
-
-        This honors Content-Length and Transfer-Encoding: chunked.
-        """
-        nbytes = None
-        for key, value in self.headers:
-            if key.lower() == 'content-length':
-                nbytes = int(value)
-                break
-        if nbytes is None:
-            if self.get_header('transfer-encoding').lower() == 'chunked':
-                self.log(2, 'parsing chunked response')
-                blocks = []
-                while True:
-                    size_header = await self.reader.readline()
-                    if not size_header:
-                        self.log(0, 'premature end of chunked response')
-                        break
-                    self.log(3, 'size_header =', repr(size_header))
-                    parts = size_header.split(b';')
-                    size = int(parts[0], 16)
-                    if size:
-                        self.log(3, 'reading chunk of', size, 'bytes')
-                        block = await self.reader.readexactly(size)
-                        assert len(block) == size, (len(block), size)
-                        blocks.append(block)
-                    crlf = await self.reader.readline()
-                    assert crlf == b'\r\n', repr(crlf)
-                    if not size:
-                        break
-                body = b''.join(blocks)
-                self.log(1, 'chunked response had', len(body),
-                            'bytes in', len(blocks), 'blocks')
-            else:
-                self.log(3, 'reading until EOF')
-                body = await self.reader.read()
-                # TODO: Should make sure not to recycle the connection
-                # in this case.
-        else:
-            body = await self.reader.readexactly(nbytes)
-        return body
-
-
-class Fetcher:
-    """Logic and state for one URL.
-
-    When found in crawler.busy, this represents a URL to be fetched or
-    in the process of being fetched; when found in crawler.done, this
-    holds the results from fetching it.
-
-    This is usually associated with a task.  This references the
-    crawler for the connection pool and to add more URLs to its todo
-    list.
-
-    Call fetch() to do the fetching, then report() to print the results.
-    """
-
-    def __init__(self, log: Logger, url: str, crawler: 'Crawler',
-                 max_redirect: int = 10, max_tries: int = 4) -> None:
-        self.log = log
-        self.url = url
-        self.crawler = crawler
-        # We don't loop resolving redirects here -- we just use this
-        # to decide whether to add the redirect URL to crawler.todo.
-        self.max_redirect = max_redirect
-        # But we do loop to retry on errors a few times.
-        self.max_tries = max_tries
-        # Everything we collect from the response goes here.
-        self.task = None  # type: asyncio.Task
-        self.exceptions = []  # type: List[Exception]
-        self.tries = 0
-        self.request = None  # type: Request
-        self.response = None  # type: Response
-        self.body = None  # type: bytes
-        self.next_url = None  # type: str
-        self.ctype = None  # type: str
-        self.pdict = None  # type: Dict[str, str]
-        self.encoding = None  # type: str
-        self.urls = None  # type: Set[str]
-        self.new_urls = None  # type: Set[str]
-
-    async def fetch(self) -> None:
-        """Attempt to fetch the contents of the URL.
-
-        If successful, and the data is HTML, extract further links and
-        add them to the crawler.  Redirects are also added back there.
-        """
-        while self.tries < self.max_tries:
-            self.tries += 1
-            self.request = None
-            try:
-                self.request = Request(self.log, self.url, self.crawler.pool)
-                await self.request.connect()
-                await self.request.send_request()
-                self.response = await self.request.get_response()
-                self.body = await self.response.read()
-                h_conn = self.response.get_header('connection').lower()
-                if h_conn != 'close':
-                    self.request.close(recycle=True)
-                    self.request = None
-                if self.tries > 1:
-                    self.log(1, 'try', self.tries, 'for', self.url, 'success')
-                break
-            except (BadStatusLine, OSError) as exc:
-                self.exceptions.append(exc)
-                self.log(1, 'try', self.tries, 'for', self.url,
-                            'raised', repr(exc))
-                # import pdb; pdb.set_trace()
-                # Don't reuse the connection in this case.
-            finally:
-                if self.request is not None:
-                    self.request.close()
-        else:
-            # We never broke out of the while loop, i.e. all tries failed.
-            self.log(0, 'no success for', self.url,
-                        'in', self.max_tries, 'tries')
-            return
-        next_url = self.response.get_redirect_url()
-        if next_url:
-            self.next_url = urllib.parse.urljoin(self.url, next_url)
-            if self.max_redirect > 0:
-                self.log(1, 'redirect to', self.next_url, 'from', self.url)
-                self.crawler.add_url(self.next_url, self.max_redirect - 1)
-            else:
-                self.log(0, 'redirect limit reached for', self.next_url,
-                            'from', self.url)
-        else:
-            if self.response.status == 200:
-                self.ctype = self.response.get_header('content-type')
-                self.pdict = {}
-                if self.ctype:
-                    self.ctype, self.pdict = cgi.parse_header(self.ctype)
-                self.encoding = self.pdict.get('charset', 'utf-8')
-                if self.ctype == 'text/html':
-                    body = self.body.decode(self.encoding, 'replace')
-                    # Replace href with (?:href|src) to follow image links.
-                    self.urls = set(re.findall(r'(?i)href=["\']?([^\s"\'<>]+)',
-                                               body))
-                    if self.urls:
-                        self.log(1, 'got', len(self.urls),
-                                    'distinct urls from', self.url)
-                    self.new_urls = set()
-                    for url in self.urls:
-                        url = unescape(url)
-                        url = urllib.parse.urljoin(self.url, url)
-                        url, frag = urllib.parse.urldefrag(url)
-                        if self.crawler.add_url(url):
-                            self.new_urls.add(url)
-
-    def report(self, stats: 'Stats', file: IO[str] = None) -> None:
-        """Print a report on the state for this URL.
-
-        Also update the Stats instance.
-        """
-        if self.task is not None:
-            if not self.task.done():
-                stats.add('pending')
-                print(self.url, 'pending', file=file)
-                return
-            elif self.task.cancelled():
-                stats.add('cancelled')
-                print(self.url, 'cancelled', file=file)
-                return
-            elif self.task.exception():
-                stats.add('exception')
-                exc = self.task.exception()
-                stats.add('exception_' + exc.__class__.__name__)
-                print(self.url, exc, file=file)
-                return
-        if len(self.exceptions) == self.tries:
-            stats.add('fail')
-            exc = self.exceptions[-1]
-            stats.add('fail_' + str(exc.__class__.__name__))
-            print(self.url, 'error', exc, file=file)
-        elif self.next_url:
-            stats.add('redirect')
-            print(self.url, self.response.status, 'redirect', self.next_url,
-                  file=file)
-        elif self.ctype == 'text/html':
-            stats.add('html')
-            size = len(self.body or b'')
-            stats.add('html_bytes', size)
-            if self.log.level:
-                print(self.url, self.response.status,
-                      self.ctype, self.encoding,
-                      size,
-                      '%d/%d' % (len(self.new_urls or ()), len(self.urls or ())),
-                      file=file)
-        elif self.response is None:
-            print(self.url, 'no response object')
-        else:
-            size = len(self.body or b'')
-            if self.response.status == 200:
-                stats.add('other')
-                stats.add('other_bytes', size)
-            else:
-                stats.add('error')
-                stats.add('error_bytes', size)
-                stats.add('status_%s' % self.response.status)
-            print(self.url, self.response.status,
-                  self.ctype, self.encoding,
-                  size,
-                  file=file)
-
-
-class Stats:
-    """Record stats of various sorts."""
-
-    def __init__(self) -> None:
-        self.stats = {}  # type: Dict[str, int]
-
-    def add(self, key: str, count: int = 1) -> None:
-        self.stats[key] = self.stats.get(key, 0) + count
-
-    def report(self, file: IO[str] = None) -> None:
-        for key, count in sorted(self.stats.items()):
-            print('%10d' % count, key, file=file)
-
-
-class Crawler:
-    """Crawl a set of URLs.
-
-    This manages three disjoint sets of URLs (todo, busy, done).  The
-    data structures actually store dicts -- the values in todo give
-    the redirect limit, while the values in busy and done are Fetcher
-    instances.
-    """
-    def __init__(self, log: Logger,
-                 roots: Set[str], exclude: str = None, strict: bool = True,  # What to crawl.
-                 max_redirect: int = 10, max_tries: int = 4,  # Per-url limits.
-                 max_tasks: int = 10, max_pool: int = 10,  # Global limits.
-                 ) -> None:
-        self.log = log
-        self.roots = roots
-        self.exclude = exclude
-        self.strict = strict
-        self.max_redirect = max_redirect
-        self.max_tries = max_tries
-        self.max_tasks = max_tasks
-        self.max_pool = max_pool
-        self.todo = {}  # type: Dict[str, int]
-        self.busy = {}  # type: Dict[str, Fetcher]
-        self.done = {}  # type: Dict[str, Fetcher]
-        self.pool = ConnectionPool(self.log, max_pool, max_tasks)
-        self.root_domains = set()  # type: Set[str]
-        for root in roots:
-            host = urllib.parse.urlparse(root).hostname
-            if not host:
-                continue
-            if re.match(r'\A[\d\.]*\Z', host):
-                self.root_domains.add(host)
-            else:
-                host = host.lower()
-                if self.strict:
-                    self.root_domains.add(host)
-                    if host.startswith('www.'):
-                        self.root_domains.add(host[4:])
-                    else:
-                        self.root_domains.add('www.' + host)
-                else:
-                    parts = host.split('.')
-                    if len(parts) > 2:
-                        host = '.'.join(parts[-2:])
-                    self.root_domains.add(host)
-        for root in roots:
-            self.add_url(root)
-        self.governor = asyncio.Semaphore(max_tasks)
-        self.termination = asyncio.Condition()
-        self.t0 = time.time()
-        self.t1 = None  # type: Optional[float]
-
-    def close(self) -> None:
-        """Close resources (currently only the pool)."""
-        self.pool.close()
-
-    def host_okay(self, host: str) -> bool:
-        """Check if a host should be crawled.
-
-        A literal match (after lowercasing) is always good.  For hosts
-        that don't look like IP addresses, some approximate matches
-        are okay depending on the strict flag.
-        """
-        host = host.lower()
-        if host in self.root_domains:
-            return True
-        if re.match(r'\A[\d\.]*\Z', host):
-            return False
-        if self.strict:
-            return self._host_okay_strictish(host)
-        else:
-            return self._host_okay_lenient(host)
-
-    def _host_okay_strictish(self, host: str) -> bool:
-        """Check if a host should be crawled, strict-ish version.
-
-        This checks for equality modulo an initial 'www.' component.
-         """
-        if host.startswith('www.'):
-            if host[4:] in self.root_domains:
-                return True
-        else:
-            if 'www.' + host in self.root_domains:
-                return True
-        return False
-
-    def _host_okay_lenient(self, host: str) -> bool:
-        """Check if a host should be crawled, lenient version.
-
-        This compares the last two components of the host.
-        """
-        parts = host.split('.')
-        if len(parts) > 2:
-            host = '.'.join(parts[-2:])
-        return host in self.root_domains
-
-    def add_url(self, url: str, max_redirect: int = None) -> bool:
-        """Add a URL to the todo list if not seen before."""
-        if self.exclude and re.search(self.exclude, url):
-            return False
-        parsed = urllib.parse.urlparse(url)
-        if parsed.scheme not in ('http', 'https'):
-            self.log(2, 'skipping non-http scheme in', url)
-            return False
-        host = parsed.hostname
-        if not self.host_okay(host):
-            self.log(2, 'skipping non-root host in', url)
-            return False
-        if max_redirect is None:
-            max_redirect = self.max_redirect
-        if url in self.todo or url in self.busy or url in self.done:
-            return False
-        self.log(1, 'adding', url, max_redirect)
-        self.todo[url] = max_redirect
-        return True
-
-    async def crawl(self) -> None:
-        """Run the crawler until all finished."""
-        with (await self.termination):
-            while self.todo or self.busy:
-                if self.todo:
-                    url, max_redirect = self.todo.popitem()
-                    fetcher = Fetcher(self.log, url,
-                                      crawler=self,
-                                      max_redirect=max_redirect,
-                                      max_tries=self.max_tries,
-                                      )
-                    self.busy[url] = fetcher
-                    fetcher.task = asyncio.Task(self.fetch(fetcher))
-                else:
-                    await self.termination.wait()
-        self.t1 = time.time()
-
-    async def fetch(self, fetcher: Fetcher) -> None:
-        """Call the Fetcher's fetch(), with a limit on concurrency.
-
-        Once this returns, move the fetcher from busy to done.
-        """
-        url = fetcher.url
-        with (await self.governor):
-            try:
-                await fetcher.fetch()  # Fetcher gonna fetch.
-            finally:
-                # Force GC of the task, so the error is logged.
-                fetcher.task = None
-        with (await self.termination):
-            self.done[url] = fetcher
-            del self.busy[url]
-            self.termination.notify()
-
-    def report(self, file: IO[str] = None) -> None:
-        """Print a report on all completed URLs."""
-        if self.t1 is None:
-            self.t1 = time.time()
-        dt = self.t1 - self.t0
-        if dt and self.max_tasks:
-            speed = len(self.done) / dt / self.max_tasks
-        else:
-            speed = 0
-        stats = Stats()
-        print('*** Report ***', file=file)
-        try:
-            show = []  # type: List[Tuple[str, Fetcher]]
-            show.extend(self.done.items())
-            show.extend(self.busy.items())
-            show.sort()
-            for url, fetcher in show:
-                fetcher.report(stats, file=file)
-        except KeyboardInterrupt:
-            print('\nInterrupted', file=file)
-        print('Finished', len(self.done),
-              'urls in %.3f secs' % dt,
-              '(max_tasks=%d)' % self.max_tasks,
-              '(%.3f urls/sec/task)' % speed,
-              file=file)
-        stats.report(file=file)
-        print('Todo:', len(self.todo), file=file)
-        print('Busy:', len(self.busy), file=file)
-        print('Done:', len(self.done), file=file)
-        print('Date:', time.ctime(), 'local time', file=file)
-
-
-def main() -> None:
-    """Main program.
-
-    Parse arguments, set up event loop, run crawler, print report.
-    """
-    args = ARGS.parse_args()
-    if not args.roots:
-        print('Use --help for command line help')
-        return
-
-    log = Logger(args.level)
-
-    if args.iocp:
-        if sys.platform == 'win32':
-            from asyncio import ProactorEventLoop
-            loop = ProactorEventLoop()  # type: ignore
-            asyncio.set_event_loop(loop)
-        else:
-            assert False
-    elif args.select:
-        loop = asyncio.SelectorEventLoop()  # type: ignore
-        asyncio.set_event_loop(loop)
-    else:
-        loop = asyncio.get_event_loop()
-
-    roots = {fix_url(root) for root in args.roots}
-
-    crawler = Crawler(log,
-                      roots, exclude=args.exclude,
-                      strict=args.strict,
-                      max_redirect=args.max_redirect,
-                      max_tries=args.max_tries,
-                      max_tasks=args.max_tasks,
-                      max_pool=args.max_pool,
-                      )
-    try:
-        loop.run_until_complete(crawler.crawl())  # Crawler gonna crawl.
-    except KeyboardInterrupt:
-        sys.stderr.flush()
-        print('\nInterrupted\n')
-    finally:
-        crawler.report()
-        crawler.close()
-        loop.close()
-
-
-if __name__ == '__main__':
-    logging.basicConfig(level=logging.INFO) # type: ignore
-    main()
diff --git a/test-data/samples/dict.py b/test-data/samples/dict.py
deleted file mode 100644
index d74a5b5..0000000
--- a/test-data/samples/dict.py
+++ /dev/null
@@ -1,8 +0,0 @@
-import typing
-prices = {'apple': 0.40, 'banana': 0.50}
-my_purchase = {
-    'apple': 1,
-    'banana': 6}
-grocery_bill = sum(prices[fruit] * my_purchase[fruit]
-                   for fruit in my_purchase)
-print('I owe the grocer $%.2f' % grocery_bill)
diff --git a/test-data/samples/fib.py b/test-data/samples/fib.py
deleted file mode 100644
index 26248c8..0000000
--- a/test-data/samples/fib.py
+++ /dev/null
@@ -1,5 +0,0 @@
-import typing
-parents, babies = (1, 1)
-while babies < 100:
-    print('This generation has {0} babies'.format(babies))
-    parents, babies = (babies, parents + babies)
diff --git a/test-data/samples/files.py b/test-data/samples/files.py
deleted file mode 100644
index f540c7c..0000000
--- a/test-data/samples/files.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# indent your Python code to put into an email
-import glob
-import typing
-# glob supports Unix style pathname extensions
-python_files = glob.glob('*.py')
-for file_name in sorted(python_files):
-    print('    ------' + file_name)
-
-    f = open(file_name)
-    for line in f:
-        print('    ' + line.rstrip())
-    f.close()
-
-    print()
diff --git a/test-data/samples/for.py b/test-data/samples/for.py
deleted file mode 100644
index f7eeed4..0000000
--- a/test-data/samples/for.py
+++ /dev/null
@@ -1,4 +0,0 @@
-import typing
-friends = ['john', 'pat', 'gary', 'michael']
-for i, name in enumerate(friends):
-    print("iteration {iteration} is {name}".format(iteration=i, name=name))
diff --git a/test-data/samples/generators.py b/test-data/samples/generators.py
deleted file mode 100644
index 9150c96..0000000
--- a/test-data/samples/generators.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Prime number sieve with generators
-
-import itertools
-from typing import Iterator
-
-
-def iter_primes() -> Iterator[int]:
-    # an iterator of all numbers between 2 and +infinity
-    numbers = itertools.count(2)
-
-    # generate primes forever
-    while True:
-        # get the first number from the iterator (always a prime)
-        prime = next(numbers)
-        yield prime
-
-        # this code iteratively builds up a chain of
-        # filters...slightly tricky, but ponder it a bit
-        numbers = filter(prime.__rmod__, numbers)
-
-for p in iter_primes():
-    if p > 1000:
-        break
-    print(p)
diff --git a/test-data/samples/greet.py b/test-data/samples/greet.py
deleted file mode 100644
index 47e7626..0000000
--- a/test-data/samples/greet.py
+++ /dev/null
@@ -1,8 +0,0 @@
-import typing
-
-
-def greet(name: str) -> None:
-    print('Hello', name)
-greet('Jack')
-greet('Jill')
-greet('Bob')
diff --git a/test-data/samples/guess.py b/test-data/samples/guess.py
deleted file mode 100644
index d3f1cee..0000000
--- a/test-data/samples/guess.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# "Guess the Number" Game (edited) from http://inventwithpython.com
-
-import random
-import typing
-
-guesses_made = 0
-
-name = input('Hello! What is your name?\n')
-
-number = random.randint(1, 20)
-print('Well, {0}, I am thinking of a number between 1 and 20.'.format(name))
-
-while guesses_made < 6:
-
-    guess = int(input('Take a guess: '))
-
-    guesses_made += 1
-
-    if guess < number:
-        print('Your guess is too low.')
-
-    if guess > number:
-        print('Your guess is too high.')
-
-    if guess == number:
-        break
-
-if guess == number:
-    print('Good job, {0}! You guessed my number in {1} guesses!'.format(
-          name, guesses_made))
-else:
-    print('Nope. The number I was thinking of was {0}'.format(number))
diff --git a/test-data/samples/hello.py b/test-data/samples/hello.py
deleted file mode 100644
index 6c0b2ca..0000000
--- a/test-data/samples/hello.py
+++ /dev/null
@@ -1,2 +0,0 @@
-import typing
-print('Hello, world')
diff --git a/test-data/samples/input.py b/test-data/samples/input.py
deleted file mode 100644
index cca9233..0000000
--- a/test-data/samples/input.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import typing
-name = input('What is your name?\n')
-print('Hi, %s.' % name)
diff --git a/test-data/samples/itertool.py b/test-data/samples/itertool.py
deleted file mode 100644
index 9ee2475..0000000
--- a/test-data/samples/itertool.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from itertools import groupby
-import typing
-lines = '''
-This is the
-first paragraph.
-
-This is the second.
-'''.splitlines()
-# Use itertools.groupby and bool to return groups of
-# consecutive lines that either have content or don't.
-for has_chars, frags in groupby(lines, bool):
-    if has_chars:
-        print(' '.join(frags))
-# PRINTS:
-# This is the first paragraph.
-# This is the second.
diff --git a/test-data/samples/readme.txt b/test-data/samples/readme.txt
deleted file mode 100644
index 5889a8e..0000000
--- a/test-data/samples/readme.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-Mypy Sample Programs
---------------------
-
-The sample programs use static typing unless otherwise noted in comments.
-
-Original credits for sample programs:
-
-  fib.py - Python Wiki [1]
-  for.py - Python Wiki [1]
-  greet.py - Python Wiki [1]
-  hello.py - Python Wiki [1]
-  input.py - Python Wiki [1]
-  regexp.py - Python Wiki [1]
-  dict.py - Python Wiki [1]
-  cmdline.py - Python Wiki [1]
-  files.py - Python Wiki [1]
-  bottles.py - Python Wiki [1]
-  class.py - Python Wiki [1]
-  guess.py - Python Wiki [1]
-  generators.py - Python Wiki [1]
-  itertool.py - Python Wiki [1]
-
-The sample programs were ported to mypy by Jukka Lehtosalo.
-
-[1] http://wiki.python.org/moin/SimplePrograms
diff --git a/test-data/samples/regexp.py b/test-data/samples/regexp.py
deleted file mode 100644
index 6d8d799..0000000
--- a/test-data/samples/regexp.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import typing
-import re
-for test_string in ['555-1212', 'ILL-EGAL']:
-    if re.match(r'^\d{3}-\d{4}$', test_string):
-        print(test_string, 'is a valid US local phone number')
-    else:
-        print(test_string, 'rejected')
diff --git a/test-data/stdlib-samples/3.2/base64.py b/test-data/stdlib-samples/3.2/base64.py
deleted file mode 100644
index ef91964..0000000
--- a/test-data/stdlib-samples/3.2/base64.py
+++ /dev/null
@@ -1,411 +0,0 @@
-#! /usr/bin/env python3
-
-"""RFC 3548: Base16, Base32, Base64 Data Encodings"""
-
-# Modified 04-Oct-1995 by Jack Jansen to use binascii module
-# Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support
-# Modified 22-May-2007 by Guido van Rossum to use bytes everywhere
-
-import re
-import struct
-import binascii
-
-from typing import Dict, List, AnyStr, IO
-
-
-__all__ = [
-    # Legacy interface exports traditional RFC 1521 Base64 encodings
-    'encode', 'decode', 'encodebytes', 'decodebytes',
-    # Generalized interface for other encodings
-    'b64encode', 'b64decode', 'b32encode', 'b32decode',
-    'b16encode', 'b16decode',
-    # Standard Base64 encoding
-    'standard_b64encode', 'standard_b64decode',
-    # Some common Base64 alternatives.  As referenced by RFC 3458, see thread
-    # starting at:
-    #
-    # http://zgp.org/pipermail/p2p-hackers/2001-September/000316.html
-    'urlsafe_b64encode', 'urlsafe_b64decode',
-    ]
-
-
-bytes_types = (bytes, bytearray)  # Types acceptable as binary data
-
-
-def _translate(s: bytes, altchars: Dict[AnyStr, bytes]) -> bytes:
-    if not isinstance(s, bytes_types):
-        raise TypeError("expected bytes, not %s" % s.__class__.__name__)
-    translation = bytearray(range(256))
-    for k, v in altchars.items():
-        translation[ord(k)] = v[0]
-    return s.translate(translation)
-
-
-
-# Base64 encoding/decoding uses binascii
-
-def b64encode(s: bytes, altchars: bytes = None) -> bytes:
-    """Encode a byte string using Base64.
-
-    s is the byte string to encode.  Optional altchars must be a byte
-    string of length 2 which specifies an alternative alphabet for the
-    '+' and '/' characters.  This allows an application to
-    e.g. generate url or filesystem safe Base64 strings.
-
-    The encoded byte string is returned.
-    """
-    if not isinstance(s, bytes_types):
-        raise TypeError("expected bytes, not %s" % s.__class__.__name__)
-    # Strip off the trailing newline
-    encoded = binascii.b2a_base64(s)[:-1]
-    if altchars is not None:
-        if not isinstance(altchars, bytes_types):
-            raise TypeError("expected bytes, not %s"
-                            % altchars.__class__.__name__)
-        assert len(altchars) == 2, repr(altchars)
-        return _translate(encoded, {'+': altchars[0:1], '/': altchars[1:2]})
-    return encoded
-
-
-def b64decode(s: bytes, altchars: bytes = None,
-              validate: bool = False) -> bytes:
-    """Decode a Base64 encoded byte string.
-
-    s is the byte string to decode.  Optional altchars must be a
-    string of length 2 which specifies the alternative alphabet used
-    instead of the '+' and '/' characters.
-
-    The decoded string is returned.  A binascii.Error is raised if s is
-    incorrectly padded.
-
-    If validate is False (the default), non-base64-alphabet characters are
-    discarded prior to the padding check.  If validate is True,
-    non-base64-alphabet characters in the input result in a binascii.Error.
-    """
-    if not isinstance(s, bytes_types):
-        raise TypeError("expected bytes, not %s" % s.__class__.__name__)
-    if altchars is not None:
-        if not isinstance(altchars, bytes_types):
-            raise TypeError("expected bytes, not %s"
-                            % altchars.__class__.__name__)
-        assert len(altchars) == 2, repr(altchars)
-        s = _translate(s, {chr(altchars[0]): b'+', chr(altchars[1]): b'/'})
-    if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s):
-        raise binascii.Error('Non-base64 digit found')
-    return binascii.a2b_base64(s)
-
-
-def standard_b64encode(s: bytes) -> bytes:
-    """Encode a byte string using the standard Base64 alphabet.
-
-    s is the byte string to encode.  The encoded byte string is returned.
-    """
-    return b64encode(s)
-
-def standard_b64decode(s: bytes) -> bytes:
-    """Decode a byte string encoded with the standard Base64 alphabet.
-
-    s is the byte string to decode.  The decoded byte string is
-    returned.  binascii.Error is raised if the input is incorrectly
-    padded or if there are non-alphabet characters present in the
-    input.
-    """
-    return b64decode(s)
-
-def urlsafe_b64encode(s: bytes) -> bytes:
-    """Encode a byte string using a url-safe Base64 alphabet.
-
-    s is the byte string to encode.  The encoded byte string is
-    returned.  The alphabet uses '-' instead of '+' and '_' instead of
-    '/'.
-    """
-    return b64encode(s, b'-_')
-
-def urlsafe_b64decode(s: bytes) -> bytes:
-    """Decode a byte string encoded with the standard Base64 alphabet.
-
-    s is the byte string to decode.  The decoded byte string is
-    returned.  binascii.Error is raised if the input is incorrectly
-    padded or if there are non-alphabet characters present in the
-    input.
-
-    The alphabet uses '-' instead of '+' and '_' instead of '/'.
-    """
-    return b64decode(s, b'-_')
-
-
-
-# Base32 encoding/decoding must be done in Python
-_b32alphabet = {
-    0: b'A',  9: b'J', 18: b'S', 27: b'3',
-    1: b'B', 10: b'K', 19: b'T', 28: b'4',
-    2: b'C', 11: b'L', 20: b'U', 29: b'5',
-    3: b'D', 12: b'M', 21: b'V', 30: b'6',
-    4: b'E', 13: b'N', 22: b'W', 31: b'7',
-    5: b'F', 14: b'O', 23: b'X',
-    6: b'G', 15: b'P', 24: b'Y',
-    7: b'H', 16: b'Q', 25: b'Z',
-    8: b'I', 17: b'R', 26: b'2',
-    }
-
-_b32tab = [v[0] for k, v in sorted(_b32alphabet.items())]
-_b32rev = dict([(v[0], k) for k, v in _b32alphabet.items()])
-
-
-def b32encode(s: bytes) -> bytes:
-    """Encode a byte string using Base32.
-
-    s is the byte string to encode.  The encoded byte string is returned.
-    """
-    if not isinstance(s, bytes_types):
-        raise TypeError("expected bytes, not %s" % s.__class__.__name__)
-    quanta, leftover = divmod(len(s), 5)
-    # Pad the last quantum with zero bits if necessary
-    if leftover:
-        s = s + bytes(5 - leftover)  # Don't use += !
-        quanta += 1
-    encoded = bytes()
-    for i in range(quanta):
-        # c1 and c2 are 16 bits wide, c3 is 8 bits wide.  The intent of this
-        # code is to process the 40 bits in units of 5 bits.  So we take the 1
-        # leftover bit of c1 and tack it onto c2.  Then we take the 2 leftover
-        # bits of c2 and tack them onto c3.  The shifts and masks are intended
-        # to give us values of exactly 5 bits in width.
-        c1, c2, c3 = struct.unpack('!HHB', s[i*5:(i+1)*5]) # type: (int, int, int)
-        c2 += (c1 & 1) << 16 # 17 bits wide
-        c3 += (c2 & 3) << 8  # 10 bits wide
-        encoded += bytes([_b32tab[c1 >> 11],         # bits 1 - 5
-                          _b32tab[(c1 >> 6) & 0x1f], # bits 6 - 10
-                          _b32tab[(c1 >> 1) & 0x1f], # bits 11 - 15
-                          _b32tab[c2 >> 12],         # bits 16 - 20 (1 - 5)
-                          _b32tab[(c2 >> 7) & 0x1f], # bits 21 - 25 (6 - 10)
-                          _b32tab[(c2 >> 2) & 0x1f], # bits 26 - 30 (11 - 15)
-                          _b32tab[c3 >> 5],          # bits 31 - 35 (1 - 5)
-                          _b32tab[c3 & 0x1f],        # bits 36 - 40 (1 - 5)
-                          ])
-    # Adjust for any leftover partial quanta
-    if leftover == 1:
-        return encoded[:-6] + b'======'
-    elif leftover == 2:
-        return encoded[:-4] + b'===='
-    elif leftover == 3:
-        return encoded[:-3] + b'==='
-    elif leftover == 4:
-        return encoded[:-1] + b'='
-    return encoded
-
-
-def b32decode(s: bytes, casefold: bool = False, map01: bytes = None) -> bytes:
-    """Decode a Base32 encoded byte string.
-
-    s is the byte string to decode.  Optional casefold is a flag
-    specifying whether a lowercase alphabet is acceptable as input.
-    For security purposes, the default is False.
-
-    RFC 3548 allows for optional mapping of the digit 0 (zero) to the
-    letter O (oh), and for optional mapping of the digit 1 (one) to
-    either the letter I (eye) or letter L (el).  The optional argument
-    map01 when not None, specifies which letter the digit 1 should be
-    mapped to (when map01 is not None, the digit 0 is always mapped to
-    the letter O).  For security purposes the default is None, so that
-    0 and 1 are not allowed in the input.
-
-    The decoded byte string is returned.  binascii.Error is raised if
-    the input is incorrectly padded or if there are non-alphabet
-    characters present in the input.
-    """
-    if not isinstance(s, bytes_types):
-        raise TypeError("expected bytes, not %s" % s.__class__.__name__)
-    quanta, leftover = divmod(len(s), 8)
-    if leftover:
-        raise binascii.Error('Incorrect padding')
-    # Handle section 2.4 zero and one mapping.  The flag map01 will be either
-    # False, or the character to map the digit 1 (one) to.  It should be
-    # either L (el) or I (eye).
-    if map01 is not None:
-        if not isinstance(map01, bytes_types):
-            raise TypeError("expected bytes, not %s" % map01.__class__.__name__)
-        assert len(map01) == 1, repr(map01)
-        s = _translate(s, {b'0': b'O', b'1': map01})
-    if casefold:
-        s = s.upper()
-    # Strip off pad characters from the right.  We need to count the pad
-    # characters because this will tell us how many null bytes to remove from
-    # the end of the decoded string.
-    padchars = 0
-    mo = re.search(b'(?P<pad>[=]*)$', s)
-    if mo:
-        padchars = len(mo.group('pad'))
-        if padchars > 0:
-            s = s[:-padchars]
-    # Now decode the full quanta
-    parts = []  # type: List[bytes]
-    acc = 0
-    shift = 35
-    for c in s:
-        val = _b32rev.get(c)
-        if val is None:
-            raise TypeError('Non-base32 digit found')
-        acc += _b32rev[c] << shift
-        shift -= 5
-        if shift < 0:
-            parts.append(binascii.unhexlify(bytes('%010x' % acc, "ascii")))
-            acc = 0
-            shift = 35
-    # Process the last, partial quanta
-    last = binascii.unhexlify(bytes('%010x' % acc, "ascii"))
-    if padchars == 0:
-        last = b''                      # No characters
-    elif padchars == 1:
-        last = last[:-1]
-    elif padchars == 3:
-        last = last[:-2]
-    elif padchars == 4:
-        last = last[:-3]
-    elif padchars == 6:
-        last = last[:-4]
-    else:
-        raise binascii.Error('Incorrect padding')
-    parts.append(last)
-    return b''.join(parts)
-
-
-
-# RFC 3548, Base 16 Alphabet specifies uppercase, but hexlify() returns
-# lowercase.  The RFC also recommends against accepting input case
-# insensitively.
-def b16encode(s: bytes) -> bytes:
-    """Encode a byte string using Base16.
-
-    s is the byte string to encode.  The encoded byte string is returned.
-    """
-    if not isinstance(s, bytes_types):
-        raise TypeError("expected bytes, not %s" % s.__class__.__name__)
-    return binascii.hexlify(s).upper()
-
-
-def b16decode(s: bytes, casefold: bool = False) -> bytes:
-    """Decode a Base16 encoded byte string.
-
-    s is the byte string to decode.  Optional casefold is a flag
-    specifying whether a lowercase alphabet is acceptable as input.
-    For security purposes, the default is False.
-
-    The decoded byte string is returned.  binascii.Error is raised if
-    s were incorrectly padded or if there are non-alphabet characters
-    present in the string.
-    """
-    if not isinstance(s, bytes_types):
-        raise TypeError("expected bytes, not %s" % s.__class__.__name__)
-    if casefold:
-        s = s.upper()
-    if re.search(b'[^0-9A-F]', s):
-        raise binascii.Error('Non-base16 digit found')
-    return binascii.unhexlify(s)
-
-
-
-# Legacy interface.  This code could be cleaned up since I don't believe
-# binascii has any line length limitations.  It just doesn't seem worth it
-# though.  The files should be opened in binary mode.
-
-MAXLINESIZE = 76 # Excluding the CRLF
-MAXBINSIZE = (MAXLINESIZE//4)*3
-
-def encode(input: IO[bytes], output: IO[bytes]) -> None:
-    """Encode a file; input and output are binary files."""
-    while True:
-        s = input.read(MAXBINSIZE)
-        if not s:
-            break
-        while len(s) < MAXBINSIZE:
-            ns = input.read(MAXBINSIZE-len(s))
-            if not ns:
-                break
-            s += ns
-        line = binascii.b2a_base64(s)
-        output.write(line)
-
-
-def decode(input: IO[bytes], output: IO[bytes]) -> None:
-    """Decode a file; input and output are binary files."""
-    while True:
-        line = input.readline()
-        if not line:
-            break
-        s = binascii.a2b_base64(line)
-        output.write(s)
-
-
-def encodebytes(s: bytes) -> bytes:
-    """Encode a bytestring into a bytestring containing multiple lines
-    of base-64 data."""
-    if not isinstance(s, bytes_types):
-        raise TypeError("expected bytes, not %s" % s.__class__.__name__)
-    pieces = []  # type: List[bytes]
-    for i in range(0, len(s), MAXBINSIZE):
-        chunk = s[i : i + MAXBINSIZE]
-        pieces.append(binascii.b2a_base64(chunk))
-    return b"".join(pieces)
-
-def encodestring(s: bytes) -> bytes:
-    """Legacy alias of encodebytes()."""
-    import warnings
-    warnings.warn("encodestring() is a deprecated alias, use encodebytes()",
-                  DeprecationWarning, 2)
-    return encodebytes(s)
-
-
-def decodebytes(s: bytes) -> bytes:
-    """Decode a bytestring of base-64 data into a bytestring."""
-    if not isinstance(s, bytes_types):
-        raise TypeError("expected bytes, not %s" % s.__class__.__name__)
-    return binascii.a2b_base64(s)
-
-def decodestring(s: bytes) -> bytes:
-    """Legacy alias of decodebytes()."""
-    import warnings
-    warnings.warn("decodestring() is a deprecated alias, use decodebytes()",
-                  DeprecationWarning, 2)
-    return decodebytes(s)
-
-
-# Usable as a script...
-def main() -> None:
-    """Small main program"""
-    import sys, getopt
-    try:
-        opts, args = getopt.getopt(sys.argv[1:], 'deut')
-    except getopt.error as msg:
-        sys.stdout = sys.stderr
-        print(msg)
-        print("""usage: %s [-d|-e|-u|-t] [file|-]
-        -d, -u: decode
-        -e: encode (default)
-        -t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0])
-        sys.exit(2)
-    func = encode
-    for o, a in opts:
-        if o == '-e': func = encode
-        if o == '-d': func = decode
-        if o == '-u': func = decode
-        if o == '-t': test(); return
-    if args and args[0] != '-':
-        with open(args[0], 'rb') as f:
-            func(f, sys.stdout.buffer)
-    else:
-        func(sys.stdin.buffer, sys.stdout.buffer)
-
-
-def test() -> None:
-    s0 = b"Aladdin:open sesame"
-    print(repr(s0))
-    s1 = encodebytes(s0)
-    print(repr(s1))
-    s2 = decodebytes(s1)
-    print(repr(s2))
-    assert s0 == s2
-
-
-if __name__ == '__main__':
-    main()
diff --git a/test-data/stdlib-samples/3.2/fnmatch.py b/test-data/stdlib-samples/3.2/fnmatch.py
deleted file mode 100644
index ec27b90..0000000
--- a/test-data/stdlib-samples/3.2/fnmatch.py
+++ /dev/null
@@ -1,112 +0,0 @@
-"""Filename matching with shell patterns.
-
-fnmatch(FILENAME, PATTERN) matches according to the local convention.
-fnmatchcase(FILENAME, PATTERN) always takes case in account.
-
-The functions operate by translating the pattern into a regular
-expression.  They cache the compiled regular expressions for speed.
-
-The function translate(PATTERN) returns a regular expression
-corresponding to PATTERN.  (It does not compile it.)
-"""
-import os
-import posixpath
-import re
-import functools
-
-from typing import Iterable, List, AnyStr, Any, Callable, Match
-
-__all__ = ["filter", "fnmatch", "fnmatchcase", "translate"]
-
-def fnmatch(name: AnyStr, pat: AnyStr) -> bool:
-    """Test whether FILENAME matches PATTERN.
-
-    Patterns are Unix shell style:
-
-    *       matches everything
-    ?       matches any single character
-    [seq]   matches any character in seq
-    [!seq]  matches any char not in seq
-
-    An initial period in FILENAME is not special.
-    Both FILENAME and PATTERN are first case-normalized
-    if the operating system requires it.
-    If you don't want this, use fnmatchcase(FILENAME, PATTERN).
-    """
-    name = os.path.normcase(name)
-    pat = os.path.normcase(pat)
-    return fnmatchcase(name, pat)
-
- at functools.lru_cache(maxsize=250)
-def _compile_pattern(pat: AnyStr,
-                     is_bytes: bool = False) -> Callable[[AnyStr],
-                                                         Match[AnyStr]]:
-    if isinstance(pat, bytes):
-        pat_str = str(pat, 'ISO-8859-1')
-        res_str = translate(pat_str)
-        res = bytes(res_str, 'ISO-8859-1')
-    else:
-        res = translate(pat)
-    return re.compile(res).match
-
-def filter(names: Iterable[AnyStr], pat: AnyStr) -> List[AnyStr]:
-    """Return the subset of the list NAMES that match PAT."""
-    result = []  # type: List[AnyStr]
-    pat = os.path.normcase(pat)
-    match = _compile_pattern(pat, isinstance(pat, bytes))
-    if os.path is posixpath:
-        # normcase on posix is NOP. Optimize it away from the loop.
-        for name in names:
-            if match(name):
-                result.append(name)
-    else:
-        for name in names:
-            if match(os.path.normcase(name)):
-                result.append(name)
-    return result
-
-def fnmatchcase(name: AnyStr, pat: AnyStr) -> bool:
-    """Test whether FILENAME matches PATTERN, including case.
-
-    This is a version of fnmatch() which doesn't case-normalize
-    its arguments.
-    """
-    match = _compile_pattern(pat, isinstance(pat, bytes))
-    return match(name) is not None
-
-def translate(pat: str) -> str:
-    """Translate a shell PATTERN to a regular expression.
-
-    There is no way to quote meta-characters.
-    """
-
-    i, n = 0, len(pat)
-    res = ''
-    while i < n:
-        c = pat[i]
-        i = i+1
-        if c == '*':
-            res = res + '.*'
-        elif c == '?':
-            res = res + '.'
-        elif c == '[':
-            j = i
-            if j < n and pat[j] == '!':
-                j = j+1
-            if j < n and pat[j] == ']':
-                j = j+1
-            while j < n and pat[j] != ']':
-                j = j+1
-            if j >= n:
-                res = res + '\\['
-            else:
-                stuff = pat[i:j].replace('\\','\\\\')
-                i = j+1
-                if stuff[0] == '!':
-                    stuff = '^' + stuff[1:]
-                elif stuff[0] == '^':
-                    stuff = '\\' + stuff
-                res = '%s[%s]' % (res, stuff)
-        else:
-            res = res + re.escape(c)
-    return res + '\Z(?ms)'
diff --git a/test-data/stdlib-samples/3.2/genericpath.py b/test-data/stdlib-samples/3.2/genericpath.py
deleted file mode 100644
index bd1fddf..0000000
--- a/test-data/stdlib-samples/3.2/genericpath.py
+++ /dev/null
@@ -1,112 +0,0 @@
-"""
-Path operations common to more than one OS
-Do not use directly.  The OS specific modules import the appropriate
-functions from this module themselves.
-"""
-import os
-import stat
-
-from typing import (
-    Any as Any_, List as List_, AnyStr as AnyStr_, Tuple as Tuple_
-)
-
-__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime',
-           'getsize', 'isdir', 'isfile']
-
-
-# Does a path exist?
-# This is false for dangling symbolic links on systems that support them.
-def exists(path: AnyStr_) -> bool:
-    """Test whether a path exists.  Returns False for broken symbolic links"""
-    try:
-        os.stat(path)
-    except os.error:
-        return False
-    return True
-
-
-# This follows symbolic links, so both islink() and isdir() can be true
-# for the same path ono systems that support symlinks
-def isfile(path: AnyStr_) -> bool:
-    """Test whether a path is a regular file"""
-    try:
-        st = os.stat(path)
-    except os.error:
-        return False
-    return stat.S_ISREG(st.st_mode)
-
-
-# Is a path a directory?
-# This follows symbolic links, so both islink() and isdir()
-# can be true for the same path on systems that support symlinks
-def isdir(s: AnyStr_) -> bool:
-    """Return true if the pathname refers to an existing directory."""
-    try:
-        st = os.stat(s)
-    except os.error:
-        return False
-    return stat.S_ISDIR(st.st_mode)
-
-
-def getsize(filename: AnyStr_) -> int:
-    """Return the size of a file, reported by os.stat()."""
-    return os.stat(filename).st_size
-
-
-def getmtime(filename: AnyStr_) -> float:
-    """Return the last modification time of a file, reported by os.stat()."""
-    return os.stat(filename).st_mtime
-
-
-def getatime(filename: AnyStr_) -> float:
-    """Return the last access time of a file, reported by os.stat()."""
-    return os.stat(filename).st_atime
-
-
-def getctime(filename: AnyStr_) -> float:
-    """Return the metadata change time of a file, reported by os.stat()."""
-    return os.stat(filename).st_ctime
-
-
-# Return the longest prefix of all list elements.
-def commonprefix(m: List_[Any_]) -> Any_:
-    "Given a list of pathnames, returns the longest common leading component"
-    if not m: return ''
-    s1 = min(m)
-    s2 = max(m)
-    for i, c in enumerate(s1):
-        if c != s2[i]:
-            return s1[:i]
-    return s1
-
-
-# Split a path in root and extension.
-# The extension is everything starting at the last dot in the last
-# pathname component; the root is everything before that.
-# It is always true that root + ext == p.
-
-# Generic implementation of splitext, to be parametrized with
-# the separators
-def _splitext(p: AnyStr_, sep: AnyStr_, altsep: AnyStr_,
-              extsep: AnyStr_) -> Tuple_[AnyStr_, AnyStr_]:
-    """Split the extension from a pathname.
-
-    Extension is everything from the last dot to the end, ignoring
-    leading dots.  Returns "(root, ext)"; ext may be empty."""
-    # NOTE: This code must work for text and bytes strings.
-
-    sepIndex = p.rfind(sep)
-    if altsep:
-        altsepIndex = p.rfind(altsep)
-        sepIndex = max(sepIndex, altsepIndex)
-
-    dotIndex = p.rfind(extsep)
-    if dotIndex > sepIndex:
-        # skip all leading dots
-        filenameIndex = sepIndex + 1
-        while filenameIndex < dotIndex:
-            if p[filenameIndex:filenameIndex+1] != extsep:
-                return p[:dotIndex], p[dotIndex:]
-            filenameIndex += 1
-
-    return p, p[:0]
diff --git a/test-data/stdlib-samples/3.2/getopt.py b/test-data/stdlib-samples/3.2/getopt.py
deleted file mode 100644
index 32f5bce..0000000
--- a/test-data/stdlib-samples/3.2/getopt.py
+++ /dev/null
@@ -1,220 +0,0 @@
-"""Parser for command line options.
-
-This module helps scripts to parse the command line arguments in
-sys.argv.  It supports the same conventions as the Unix getopt()
-function (including the special meanings of arguments of the form `-'
-and `--').  Long options similar to those supported by GNU software
-may be used as well via an optional third argument.  This module
-provides two functions and an exception:
-
-getopt() -- Parse command line options
-gnu_getopt() -- Like getopt(), but allow option and non-option arguments
-to be intermixed.
-GetoptError -- exception (class) raised with 'opt' attribute, which is the
-option involved with the exception.
-"""
-
-# Long option support added by Lars Wirzenius <liw at iki.fi>.
-#
-# Gerrit Holl <gerrit at nl.linux.org> moved the string-based exceptions
-# to class-based exceptions.
-#
-# Peter Ã
strand <astrand at lysator.liu.se> added gnu_getopt().
-#
-# TODO for gnu_getopt():
-#
-# - GNU getopt_long_only mechanism
-# - allow the caller to specify ordering
-# - RETURN_IN_ORDER option
-# - GNU extension with '-' as first character of option string
-# - optional arguments, specified by double colons
-# - a option string with a W followed by semicolon should
-#   treat "-W foo" as "--foo"
-
-__all__ = ["GetoptError","error","getopt","gnu_getopt"]
-
-import os
-
-from typing import List, Tuple, Iterable
-
-class GetoptError(Exception):
-    opt = ''
-    msg = ''
-    def __init__(self, msg: str, opt: str = '') -> None:
-        self.msg = msg
-        self.opt = opt
-        Exception.__init__(self, msg, opt)
-
-    def __str__(self) -> str:
-        return self.msg
-
-error = GetoptError # backward compatibility
-
-def getopt(args: List[str], shortopts: str,
-           longopts: Iterable[str]  =  []) -> Tuple[List[Tuple[str, str]],
-                                                    List[str]]:
-    """getopt(args, options[, long_options]) -> opts, args
-
-    Parses command line options and parameter list.  args is the
-    argument list to be parsed, without the leading reference to the
-    running program.  Typically, this means "sys.argv[1:]".  shortopts
-    is the string of option letters that the script wants to
-    recognize, with options that require an argument followed by a
-    colon (i.e., the same format that Unix getopt() uses).  If
-    specified, longopts is a list of strings with the names of the
-    long options which should be supported.  The leading '--'
-    characters should not be included in the option name.  Options
-    which require an argument should be followed by an equal sign
-    ('=').
-
-    The return value consists of two elements: the first is a list of
-    (option, value) pairs; the second is the list of program arguments
-    left after the option list was stripped (this is a trailing slice
-    of the first argument).  Each option-and-value pair returned has
-    the option as its first element, prefixed with a hyphen (e.g.,
-    '-x'), and the option argument as its second element, or an empty
-    string if the option has no argument.  The options occur in the
-    list in the same order in which they were found, thus allowing
-    multiple occurrences.  Long and short options may be mixed.
-
-    """
-
-    opts = []  # type: List[Tuple[str, str]]
-    if isinstance(longopts, str):
-        longopts = [longopts]
-    else:
-        longopts = list(longopts)
-    while args and args[0].startswith('-') and args[0] != '-':
-        if args[0] == '--':
-            args = args[1:]
-            break
-        if args[0].startswith('--'):
-            opts, args = do_longs(opts, args[0][2:], longopts, args[1:])
-        else:
-            opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
-
-    return opts, args
-
-def gnu_getopt(args: List[str], shortopts: str,
-               longopts: Iterable[str]  =  []) -> Tuple[List[Tuple[str, str]],
-                                                        List[str]]:
-    """getopt(args, options[, long_options]) -> opts, args
-
-    This function works like getopt(), except that GNU style scanning
-    mode is used by default. This means that option and non-option
-    arguments may be intermixed. The getopt() function stops
-    processing options as soon as a non-option argument is
-    encountered.
-
-    If the first character of the option string is `+', or if the
-    environment variable POSIXLY_CORRECT is set, then option
-    processing stops as soon as a non-option argument is encountered.
-
-    """
-
-    opts = []  # type: List[Tuple[str, str]]
-    prog_args = []  # type: List[str]
-    if isinstance(longopts, str):
-        longopts = [longopts]
-    else:
-        longopts = list(longopts)
-
-    # Allow options after non-option arguments?
-    if shortopts.startswith('+'):
-        shortopts = shortopts[1:]
-        all_options_first = True
-    elif os.environ.get("POSIXLY_CORRECT"):
-        all_options_first = True
-    else:
-        all_options_first = False
-
-    while args:
-        if args[0] == '--':
-            prog_args += args[1:]
-            break
-
-        if args[0][:2] == '--':
-            opts, args = do_longs(opts, args[0][2:], longopts, args[1:])
-        elif args[0][:1] == '-' and args[0] != '-':
-            opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
-        else:
-            if all_options_first:
-                prog_args += args
-                break
-            else:
-                prog_args.append(args[0])
-                args = args[1:]
-
-    return opts, prog_args
-
-def do_longs(opts: List[Tuple[str, str]], opt: str,
-             longopts: List[str],
-             args: List[str]) -> Tuple[List[Tuple[str, str]], List[str]]:
-    try:
-        i = opt.index('=')
-    except ValueError:
-        optarg = None # type: str
-    else:
-        opt, optarg = opt[:i], opt[i+1:]
-
-    has_arg, opt = long_has_args(opt, longopts)
-    if has_arg:
-        if optarg is None:
-            if not args:
-                raise GetoptError('option --%s requires argument' % opt, opt)
-            optarg, args = args[0], args[1:]
-    elif optarg is not None:
-        raise GetoptError('option --%s must not have an argument' % opt, opt)
-    opts.append(('--' + opt, optarg or ''))
-    return opts, args
-
-# Return:
-#   has_arg?
-#   full option name
-def long_has_args(opt: str, longopts: List[str]) -> Tuple[bool, str]:
-    possibilities = [o for o in longopts if o.startswith(opt)]
-    if not possibilities:
-        raise GetoptError('option --%s not recognized' % opt, opt)
-    # Is there an exact match?
-    if opt in possibilities:
-        return False, opt
-    elif opt + '=' in possibilities:
-        return True, opt
-    # No exact match, so better be unique.
-    if len(possibilities) > 1:
-        # XXX since possibilities contains all valid continuations, might be
-        # nice to work them into the error msg
-        raise GetoptError('option --%s not a unique prefix' % opt, opt)
-    assert len(possibilities) == 1
-    unique_match = possibilities[0]
-    has_arg = unique_match.endswith('=')
-    if has_arg:
-        unique_match = unique_match[:-1]
-    return has_arg, unique_match
-
-def do_shorts(opts: List[Tuple[str, str]], optstring: str,
-              shortopts: str, args: List[str]) -> Tuple[List[Tuple[str, str]],
-                                                        List[str]]:
-    while optstring != '':
-        opt, optstring = optstring[0], optstring[1:]
-        if short_has_arg(opt, shortopts):
-            if optstring == '':
-                if not args:
-                    raise GetoptError('option -%s requires argument' % opt,
-                                      opt)
-                optstring, args = args[0], args[1:]
-            optarg, optstring = optstring, ''
-        else:
-            optarg = ''
-        opts.append(('-' + opt, optarg))
-    return opts, args
-
-def short_has_arg(opt: str, shortopts: str) -> bool:
-    for i in range(len(shortopts)):
-        if opt == shortopts[i] != ':':
-            return shortopts.startswith(':', i+1)
-    raise GetoptError('option -%s not recognized' % opt, opt)
-
-if __name__ == '__main__':
-    import sys
-    print(getopt(sys.argv[1:], "a:b", ["alpha=", "beta"]))
diff --git a/test-data/stdlib-samples/3.2/glob.py b/test-data/stdlib-samples/3.2/glob.py
deleted file mode 100644
index 0f3d5f5..0000000
--- a/test-data/stdlib-samples/3.2/glob.py
+++ /dev/null
@@ -1,84 +0,0 @@
-"""Filename globbing utility."""
-
-import os
-import re
-import fnmatch
-
-from typing import List, Iterator, Iterable, Any, AnyStr
-
-__all__ = ["glob", "iglob"]
-
-def glob(pathname: AnyStr) -> List[AnyStr]:
-    """Return a list of paths matching a pathname pattern.
-
-    The pattern may contain simple shell-style wildcards a la fnmatch.
-
-    """
-    return list(iglob(pathname))
-
-def iglob(pathname: AnyStr) -> Iterator[AnyStr]:
-    """Return an iterator which yields the paths matching a pathname pattern.
-
-    The pattern may contain simple shell-style wildcards a la fnmatch.
-
-    """
-    if not has_magic(pathname):
-        if os.path.lexists(pathname):
-            yield pathname
-        return
-    dirname, basename = os.path.split(pathname)
-    if not dirname:
-        for name in glob1(None, basename):
-            yield name
-        return
-    if has_magic(dirname):
-        dirs = iglob(dirname) # type: Iterable[AnyStr]
-    else:
-        dirs = [dirname]
-    if has_magic(basename):
-        glob_in_dir = glob1 # type: Any
-    else:
-        glob_in_dir = glob0
-    for dirname in dirs:
-        for name in glob_in_dir(dirname, basename):
-            yield os.path.join(dirname, name)
-
-# These 2 helper functions non-recursively glob inside a literal directory.
-# They return a list of basenames. `glob1` accepts a pattern while `glob0`
-# takes a literal basename (so it only has to check for its existence).
-
-def glob1(dirname: AnyStr, pattern: AnyStr) -> List[AnyStr]:
-    if not dirname:
-        if isinstance(pattern, bytes):
-            dirname = bytes(os.curdir, 'ASCII')
-        else:
-            dirname = os.curdir
-    try:
-        names = os.listdir(dirname)
-    except os.error:
-        return []
-    if pattern[0] != '.':
-        names = [x for x in names if x[0] != '.']
-    return fnmatch.filter(names, pattern)
-
-def glob0(dirname: AnyStr, basename: AnyStr) -> List[AnyStr]:
-    if basename == '':
-        # `os.path.split()` returns an empty basename for paths ending with a
-        # directory separator.  'q*x/' should match only directories.
-        if os.path.isdir(dirname):
-            return [basename]
-    else:
-        if os.path.lexists(os.path.join(dirname, basename)):
-            return [basename]
-    return []
-
-
-magic_check = re.compile('[*?[]')
-magic_check_bytes = re.compile(b'[*?[]')
-
-def has_magic(s: AnyStr) -> bool:
-    if isinstance(s, bytes):
-        match = magic_check_bytes.search(s)
-    else:
-        match = magic_check.search(s)
-    return match is not None
diff --git a/test-data/stdlib-samples/3.2/incomplete/logging/__init__.py b/test-data/stdlib-samples/3.2/incomplete/logging/__init__.py
deleted file mode 100644
index aa861eb..0000000
--- a/test-data/stdlib-samples/3.2/incomplete/logging/__init__.py
+++ /dev/null
@@ -1,1873 +0,0 @@
-# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose and without fee is hereby granted,
-# provided that the above copyright notice appear in all copies and that
-# both that copyright notice and this permission notice appear in
-# supporting documentation, and that the name of Vinay Sajip
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission.
-# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
-# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""
-Logging package for Python. Based on PEP 282 and comments thereto in
-comp.lang.python, and influenced by Apache's log4j system.
-
-Copyright (C) 2001-2011 Vinay Sajip. All Rights Reserved.
-
-To use, simply 'import logging' and log away!
-"""
-
-import sys, os, time, io, traceback, warnings, weakref
-from string import Template
-
-__all__ = ['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR',
-           'FATAL', 'FileHandler', 'Filter', 'Formatter', 'Handler', 'INFO',
-           'LogRecord', 'Logger', 'LoggerAdapter', 'NOTSET', 'NullHandler',
-           'StreamHandler', 'WARN', 'WARNING', 'addLevelName', 'basicConfig',
-           'captureWarnings', 'critical', 'debug', 'disable', 'error',
-           'exception', 'fatal', 'getLevelName', 'getLogger', 'getLoggerClass',
-           'info', 'log', 'makeLogRecord', 'setLoggerClass', 'warn', 'warning',
-           'getLogRecordFactory', 'setLogRecordFactory', 'lastResort']
-
-import codecs
-
-import _thread as thread
-import threading
-
-__author__  = "Vinay Sajip <vinay_sajip at red-dove.com>"
-__status__  = "production"
-__version__ = "0.5.1.2"
-__date__    = "07 February 2010"
-
-#---------------------------------------------------------------------------
-#   Miscellaneous module data
-#---------------------------------------------------------------------------
-
-#
-# _srcfile is used when walking the stack to check when we've got the first
-# caller stack frame.
-#
-if hasattr(sys, 'frozen'): #support for py2exe
-    _srcfile = "logging%s__init__%s" % (os.sep, __file__[-4:])
-else:
-    _srcfile = __file__
-_srcfile = os.path.normcase(_srcfile)
-
-# next bit filched from 1.5.2's inspect.py
-def _currentframe():
-    """Return the frame object for the caller's stack frame."""
-    try:
-        raise Exception
-    except:
-        return sys.exc_info()[2].tb_frame.f_back
-currentframe = _currentframe
-
-if hasattr(sys, '_getframe'): currentframe = lambda: sys._getframe(3)
-# done filching
-
-# _srcfile is only used in conjunction with sys._getframe().
-# To provide compatibility with older versions of Python, set _srcfile
-# to None if _getframe() is not available; this value will prevent
-# findCaller() from being called.
-#if not hasattr(sys, "_getframe"):
-#    _srcfile = None
-
-#
-#_startTime is used as the base when calculating the relative time of events
-#
-_startTime = time.time()
-
-#
-#raiseExceptions is used to see if exceptions during handling should be
-#propagated
-#
-raiseExceptions = 1
-
-#
-# If you don't want threading information in the log, set this to zero
-#
-logThreads = 1
-
-#
-# If you don't want multiprocessing information in the log, set this to zero
-#
-logMultiprocessing = 1
-
-#
-# If you don't want process information in the log, set this to zero
-#
-logProcesses = 1
-
-#---------------------------------------------------------------------------
-#   Level related stuff
-#---------------------------------------------------------------------------
-#
-# Default levels and level names, these can be replaced with any positive set
-# of values having corresponding names. There is a pseudo-level, NOTSET, which
-# is only really there as a lower limit for user-defined levels. Handlers and
-# loggers are initialized with NOTSET so that they will log all messages, even
-# at user-defined levels.
-#
-
-CRITICAL = 50
-FATAL = CRITICAL
-ERROR = 40
-WARNING = 30
-WARN = WARNING
-INFO = 20
-DEBUG = 10
-NOTSET = 0
-
-_levelNames = {
-    CRITICAL : 'CRITICAL',
-    ERROR : 'ERROR',
-    WARNING : 'WARNING',
-    INFO : 'INFO',
-    DEBUG : 'DEBUG',
-    NOTSET : 'NOTSET',
-    'CRITICAL' : CRITICAL,
-    'ERROR' : ERROR,
-    'WARN' : WARNING,
-    'WARNING' : WARNING,
-    'INFO' : INFO,
-    'DEBUG' : DEBUG,
-    'NOTSET' : NOTSET,
-}
-
-def getLevelName(level):
-    """
-    Return the textual representation of logging level 'level'.
-
-    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
-    INFO, DEBUG) then you get the corresponding string. If you have
-    associated levels with names using addLevelName then the name you have
-    associated with 'level' is returned.
-
-    If a numeric value corresponding to one of the defined levels is passed
-    in, the corresponding string representation is returned.
-
-    Otherwise, the string "Level %s" % level is returned.
-    """
-    return _levelNames.get(level, ("Level %s" % level))
-
-def addLevelName(level, levelName):
-    """
-    Associate 'levelName' with 'level'.
-
-    This is used when converting levels to text during message formatting.
-    """
-    _acquireLock()
-    try:    #unlikely to cause an exception, but you never know...
-        _levelNames[level] = levelName
-        _levelNames[levelName] = level
-    finally:
-        _releaseLock()
-
-def _checkLevel(level):
-    if isinstance(level, int):
-        rv = level
-    elif str(level) == level:
-        if level not in _levelNames:
-            raise ValueError("Unknown level: %r" % level)
-        rv = _levelNames[level]
-    else:
-        raise TypeError("Level not an integer or a valid string: %r" % level)
-    return rv
-
-#---------------------------------------------------------------------------
-#   Thread-related stuff
-#---------------------------------------------------------------------------
-
-#
-#_lock is used to serialize access to shared data structures in this module.
-#This needs to be an RLock because fileConfig() creates and configures
-#Handlers, and so might arbitrary user threads. Since Handler code updates the
-#shared dictionary _handlers, it needs to acquire the lock. But if configuring,
-#the lock would already have been acquired - so we need an RLock.
-#The same argument applies to Loggers and Manager.loggerDict.
-#
-if thread:
-    _lock = threading.RLock()
-else:
-    _lock = None
-
-
-def _acquireLock():
-    """
-    Acquire the module-level lock for serializing access to shared data.
-
-    This should be released with _releaseLock().
-    """
-    if _lock:
-        _lock.acquire()
-
-def _releaseLock():
-    """
-    Release the module-level lock acquired by calling _acquireLock().
-    """
-    if _lock:
-        _lock.release()
-
-#---------------------------------------------------------------------------
-#   The logging record
-#---------------------------------------------------------------------------
-
-class LogRecord(object):
-    """
-    A LogRecord instance represents an event being logged.
-
-    LogRecord instances are created every time something is logged. They
-    contain all the information pertinent to the event being logged. The
-    main information passed in is in msg and args, which are combined
-    using str(msg) % args to create the message field of the record. The
-    record also includes information such as when the record was created,
-    the source line where the logging call was made, and any exception
-    information to be logged.
-    """
-    def __init__(self, name, level, pathname, lineno,
-                 msg, args, exc_info, func=None, sinfo=None, **kwargs):
-        """
-        Initialize a logging record with interesting information.
-        """
-        ct = time.time()
-        self.name = name
-        self.msg = msg
-        #
-        # The following statement allows passing of a dictionary as a sole
-        # argument, so that you can do something like
-        #  logging.debug("a %(a)d b %(b)s", {'a':1, 'b':2})
-        # Suggested by Stefan Behnel.
-        # Note that without the test for args[0], we get a problem because
-        # during formatting, we test to see if the arg is present using
-        # 'if self.args:'. If the event being logged is e.g. 'Value is %d'
-        # and if the passed arg fails 'if self.args:' then no formatting
-        # is done. For example, logger.warn('Value is %d', 0) would log
-        # 'Value is %d' instead of 'Value is 0'.
-        # For the use case of passing a dictionary, this should not be a
-        # problem.
-        if args and len(args) == 1 and isinstance(args[0], dict) and args[0]:
-            args = args[0]
-        self.args = args
-        self.levelname = getLevelName(level)
-        self.levelno = level
-        self.pathname = pathname
-        try:
-            self.filename = os.path.basename(pathname)
-            self.module = os.path.splitext(self.filename)[0]
-        except (TypeError, ValueError, AttributeError):
-            self.filename = pathname
-            self.module = "Unknown module"
-        self.exc_info = exc_info
-        self.exc_text = None      # used to cache the traceback text
-        self.stack_info = sinfo
-        self.lineno = lineno
-        self.funcName = func
-        self.created = ct
-        self.msecs = (ct - int(ct)) * 1000
-        self.relativeCreated = (self.created - _startTime) * 1000
-        if logThreads and thread:
-            self.thread = thread.get_ident()
-            self.threadName = threading.current_thread().name
-        else:
-            self.thread = None
-            self.threadName = None
-        if not logMultiprocessing:
-            self.processName = None
-        else:
-            self.processName = 'MainProcess'
-            mp = sys.modules.get('multiprocessing')
-            if mp is not None:
-                # Errors may occur if multiprocessing has not finished loading
-                # yet - e.g. if a custom import hook causes third-party code
-                # to run when multiprocessing calls import. See issue 8200
-                # for an example
-                try:
-                    self.processName = mp.current_process().name
-                except Exception:
-                    pass
-        if logProcesses and hasattr(os, 'getpid'):
-            self.process = os.getpid()
-        else:
-            self.process = None
-
-    def __str__(self):
-        return '<LogRecord: %s, %s, %s, %s, "%s">'%(self.name, self.levelno,
-            self.pathname, self.lineno, self.msg)
-
-    def getMessage(self):
-        """
-        Return the message for this LogRecord.
-
-        Return the message for this LogRecord after merging any user-supplied
-        arguments with the message.
-        """
-        msg = str(self.msg)
-        if self.args:
-            msg = msg % self.args
-        return msg
-
-#
-#   Determine which class to use when instantiating log records.
-#
-_logRecordFactory = LogRecord
-
-def setLogRecordFactory(factory):
-    """
-    Set the factory to be used when instantiating a log record.
-
-    :param factory: A callable which will be called to instantiate
-    a log record.
-    """
-    global _logRecordFactory
-    _logRecordFactory = factory
-
-def getLogRecordFactory():
-    """
-    Return the factory to be used when instantiating a log record.
-    """
-
-    return _logRecordFactory
-
-def makeLogRecord(dict):
-    """
-    Make a LogRecord whose attributes are defined by the specified dictionary,
-    This function is useful for converting a logging event received over
-    a socket connection (which is sent as a dictionary) into a LogRecord
-    instance.
-    """
-    rv = _logRecordFactory(None, None, "", 0, "", (), None, None)
-    rv.__dict__.update(dict)
-    return rv
-
-#---------------------------------------------------------------------------
-#   Formatter classes and functions
-#---------------------------------------------------------------------------
-
-class PercentStyle(object):
-
-    default_format = '%(message)s'
-    asctime_format = '%(asctime)s'
-    asctime_search = '%(asctime)'
-
-    def __init__(self, fmt):
-        self._fmt = fmt or self.default_format
-
-    def usesTime(self):
-        return self._fmt.find(self.asctime_search) >= 0
-
-    def format(self, record):
-        return self._fmt % record.__dict__
-
-class StrFormatStyle(PercentStyle):
-    default_format = '{message}'
-    asctime_format = '{asctime}'
-    asctime_search = '{asctime'
-
-    def format(self, record):
-        return self._fmt.format(**record.__dict__)
-
-
-class StringTemplateStyle(PercentStyle):
-    default_format = '${message}'
-    asctime_format = '${asctime}'
-    asctime_search = '${asctime}'
-
-    def __init__(self, fmt):
-        self._fmt = fmt or self.default_format
-        self._tpl = Template(self._fmt)
-
-    def usesTime(self):
-        fmt = self._fmt
-        return fmt.find('$asctime') >= 0 or fmt.find(self.asctime_format) >= 0
-
-    def format(self, record):
-        return self._tpl.substitute(**record.__dict__)
-
-_STYLES = {
-    '%': PercentStyle,
-    '{': StrFormatStyle,
-    '$': StringTemplateStyle
-}
-
-class Formatter(object):
-    """
-    Formatter instances are used to convert a LogRecord to text.
-
-    Formatters need to know how a LogRecord is constructed. They are
-    responsible for converting a LogRecord to (usually) a string which can
-    be interpreted by either a human or an external system. The base Formatter
-    allows a formatting string to be specified. If none is supplied, the
-    default value of "%s(message)" is used.
-
-    The Formatter can be initialized with a format string which makes use of
-    knowledge of the LogRecord attributes - e.g. the default value mentioned
-    above makes use of the fact that the user's message and arguments are pre-
-    formatted into a LogRecord's message attribute. Currently, the useful
-    attributes in a LogRecord are described by:
-
-    %(name)s            Name of the logger (logging channel)
-    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
-                        WARNING, ERROR, CRITICAL)
-    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
-                        "WARNING", "ERROR", "CRITICAL")
-    %(pathname)s        Full pathname of the source file where the logging
-                        call was issued (if available)
-    %(filename)s        Filename portion of pathname
-    %(module)s          Module (name portion of filename)
-    %(lineno)d          Source line number where the logging call was issued
-                        (if available)
-    %(funcName)s        Function name
-    %(created)f         Time when the LogRecord was created (time.time()
-                        return value)
-    %(asctime)s         Textual time when the LogRecord was created
-    %(msecs)d           Millisecond portion of the creation time
-    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
-                        relative to the time the logging module was loaded
-                        (typically at application startup time)
-    %(thread)d          Thread ID (if available)
-    %(threadName)s      Thread name (if available)
-    %(process)d         Process ID (if available)
-    %(message)s         The result of record.getMessage(), computed just as
-                        the record is emitted
-    """
-
-    converter = time.localtime
-
-    def __init__(self, fmt=None, datefmt=None, style='%'):
-        """
-        Initialize the formatter with specified format strings.
-
-        Initialize the formatter either with the specified format string, or a
-        default as described above. Allow for specialized date formatting with
-        the optional datefmt argument (if omitted, you get the ISO8601 format).
-
-        Use a style parameter of '%', '{' or '$' to specify that you want to
-        use one of %-formatting, :meth:`str.format` (``{}``) formatting or
-        :class:`string.Template` formatting in your format string.
-
-        .. versionchanged: 3.2
-           Added the ``style`` parameter.
-        """
-        if style not in _STYLES:
-            raise ValueError('Style must be one of: %s' % ','.join(
-                             _STYLES.keys()))
-        self._style = _STYLES[style](fmt)
-        self._fmt = self._style._fmt
-        self.datefmt = datefmt
-
-    def formatTime(self, record, datefmt=None):
-        """
-        Return the creation time of the specified LogRecord as formatted text.
-
-        This method should be called from format() by a formatter which
-        wants to make use of a formatted time. This method can be overridden
-        in formatters to provide for any specific requirement, but the
-        basic behaviour is as follows: if datefmt (a string) is specified,
-        it is used with time.strftime() to format the creation time of the
-        record. Otherwise, the ISO8601 format is used. The resulting
-        string is returned. This function uses a user-configurable function
-        to convert the creation time to a tuple. By default, time.localtime()
-        is used; to change this for a particular formatter instance, set the
-        'converter' attribute to a function with the same signature as
-        time.localtime() or time.gmtime(). To change it for all formatters,
-        for example if you want all logging times to be shown in GMT,
-        set the 'converter' attribute in the Formatter class.
-        """
-        ct = self.converter(record.created)
-        if datefmt:
-            s = time.strftime(datefmt, ct)
-        else:
-            t = time.strftime("%Y-%m-%d %H:%M:%S", ct)
-            s = "%s,%03d" % (t, record.msecs) # the use of % here is internal
-        return s
-
-    def formatException(self, ei):
-        """
-        Format and return the specified exception information as a string.
-
-        This default implementation just uses
-        traceback.print_exception()
-        """
-        sio = io.StringIO()
-        tb = ei[2]
-        # See issues #9427, #1553375. Commented out for now.
-        #if getattr(self, 'fullstack', False):
-        #    traceback.print_stack(tb.tb_frame.f_back, file=sio)
-        traceback.print_exception(ei[0], ei[1], tb, None, sio)
-        s = sio.getvalue()
-        sio.close()
-        if s[-1:] == "\n":
-            s = s[:-1]
-        return s
-
-    def usesTime(self):
-        """
-        Check if the format uses the creation time of the record.
-        """
-        return self._style.usesTime()
-
-    def formatMessage(self, record):
-        return self._style.format(record)
-
-    def formatStack(self, stack_info):
-        """
-        This method is provided as an extension point for specialized
-        formatting of stack information.
-
-        The input data is a string as returned from a call to
-        :func:`traceback.print_stack`, but with the last trailing newline
-        removed.
-
-        The base implementation just returns the value passed in.
-        """
-        return stack_info
-
-    def format(self, record):
-        """
-        Format the specified record as text.
-
-        The record's attribute dictionary is used as the operand to a
-        string formatting operation which yields the returned string.
-        Before formatting the dictionary, a couple of preparatory steps
-        are carried out. The message attribute of the record is computed
-        using LogRecord.getMessage(). If the formatting string uses the
-        time (as determined by a call to usesTime(), formatTime() is
-        called to format the event time. If there is exception information,
-        it is formatted using formatException() and appended to the message.
-        """
-        record.message = record.getMessage()
-        if self.usesTime():
-            record.asctime = self.formatTime(record, self.datefmt)
-        s = self.formatMessage(record)
-        if record.exc_info:
-            # Cache the traceback text to avoid converting it multiple times
-            # (it's constant anyway)
-            if not record.exc_text:
-                record.exc_text = self.formatException(record.exc_info)
-        if record.exc_text:
-            if s[-1:] != "\n":
-                s = s + "\n"
-            s = s + record.exc_text
-        if record.stack_info:
-            if s[-1:] != "\n":
-                s = s + "\n"
-            s = s + self.formatStack(record.stack_info)
-        return s
-
-#
-#   The default formatter to use when no other is specified
-#
-_defaultFormatter = Formatter()
-
-class BufferingFormatter(object):
-    """
-    A formatter suitable for formatting a number of records.
-    """
-    def __init__(self, linefmt=None):
-        """
-        Optionally specify a formatter which will be used to format each
-        individual record.
-        """
-        if linefmt:
-            self.linefmt = linefmt
-        else:
-            self.linefmt = _defaultFormatter
-
-    def formatHeader(self, records):
-        """
-        Return the header string for the specified records.
-        """
-        return ""
-
-    def formatFooter(self, records):
-        """
-        Return the footer string for the specified records.
-        """
-        return ""
-
-    def format(self, records):
-        """
-        Format the specified records and return the result as a string.
-        """
-        rv = ""
-        if len(records) > 0:
-            rv = rv + self.formatHeader(records)
-            for record in records:
-                rv = rv + self.linefmt.format(record)
-            rv = rv + self.formatFooter(records)
-        return rv
-
-#---------------------------------------------------------------------------
-#   Filter classes and functions
-#---------------------------------------------------------------------------
-
-class Filter(object):
-    """
-    Filter instances are used to perform arbitrary filtering of LogRecords.
-
-    Loggers and Handlers can optionally use Filter instances to filter
-    records as desired. The base filter class only allows events which are
-    below a certain point in the logger hierarchy. For example, a filter
-    initialized with "A.B" will allow events logged by loggers "A.B",
-    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
-    initialized with the empty string, all events are passed.
-    """
-    def __init__(self, name=''):
-        """
-        Initialize a filter.
-
-        Initialize with the name of the logger which, together with its
-        children, will have its events allowed through the filter. If no
-        name is specified, allow every event.
-        """
-        self.name = name
-        self.nlen = len(name)
-
-    def filter(self, record):
-        """
-        Determine if the specified record is to be logged.
-
-        Is the specified record to be logged? Returns 0 for no, nonzero for
-        yes. If deemed appropriate, the record may be modified in-place.
-        """
-        if self.nlen == 0:
-            return 1
-        elif self.name == record.name:
-            return 1
-        elif record.name.find(self.name, 0, self.nlen) != 0:
-            return 0
-        return (record.name[self.nlen] == ".")
-
-class Filterer(object):
-    """
-    A base class for loggers and handlers which allows them to share
-    common code.
-    """
-    def __init__(self):
-        """
-        Initialize the list of filters to be an empty list.
-        """
-        self.filters = []
-
-    def addFilter(self, filter):
-        """
-        Add the specified filter to this handler.
-        """
-        if not (filter in self.filters):
-            self.filters.append(filter)
-
-    def removeFilter(self, filter):
-        """
-        Remove the specified filter from this handler.
-        """
-        if filter in self.filters:
-            self.filters.remove(filter)
-
-    def filter(self, record):
-        """
-        Determine if a record is loggable by consulting all the filters.
-
-        The default is to allow the record to be logged; any filter can veto
-        this and the record is then dropped. Returns a zero value if a record
-        is to be dropped, else non-zero.
-
-        .. versionchanged: 3.2
-
-           Allow filters to be just callables.
-        """
-        rv = 1
-        for f in self.filters:
-            if hasattr(f, 'filter'):
-                result = f.filter(record)
-            else:
-                result = f(record) # assume callable - will raise if not
-            if not result:
-                rv = 0
-                break
-        return rv
-
-#---------------------------------------------------------------------------
-#   Handler classes and functions
-#---------------------------------------------------------------------------
-
-any _handlers = weakref.WeakValueDictionary()  #map of handler names to handlers
-any _handlerList = [] # added to allow handlers to be removed in reverse of order initialized
-
-def _removeHandlerRef(wr):
-    """
-    Remove a handler reference from the internal cleanup list.
-    """
-    # This function can be called during module teardown, when globals are
-    # set to None. If _acquireLock is None, assume this is the case and do
-    # nothing.
-    if _acquireLock is not None:
-        _acquireLock()
-        try:
-            if wr in _handlerList:
-                _handlerList.remove(wr)
-        finally:
-            _releaseLock()
-
-def _addHandlerRef(handler):
-    """
-    Add a handler to the internal cleanup list using a weak reference.
-    """
-    _acquireLock()
-    try:
-        _handlerList.append(weakref.ref(handler, _removeHandlerRef))
-    finally:
-        _releaseLock()
-
-class Handler(Filterer):
-    """
-    Handler instances dispatch logging events to specific destinations.
-
-    The base handler class. Acts as a placeholder which defines the Handler
-    interface. Handlers can optionally use Formatter instances to format
-    records as desired. By default, no formatter is specified; in this case,
-    the 'raw' message as determined by record.message is logged.
-    """
-    def __init__(self, level=NOTSET):
-        """
-        Initializes the instance - basically setting the formatter to None
-        and the filter list to empty.
-        """
-        Filterer.__init__(self)
-        self._name = None
-        self.level = _checkLevel(level)
-        self.formatter = None
-        # Add the handler to the global _handlerList (for cleanup on shutdown)
-        _addHandlerRef(self)
-        self.createLock()
-
-    def get_name(self):
-        return self._name
-
-    def set_name(self, name):
-        _acquireLock()
-        try:
-            if self._name in _handlers:
-                del _handlers[self._name]
-            self._name = name
-            if name:
-                _handlers[name] = self
-        finally:
-            _releaseLock()
-
-    #name = property(get_name, set_name)
-
-    def createLock(self):
-        """
-        Acquire a thread lock for serializing access to the underlying I/O.
-        """
-        if thread:
-            self.lock = threading.RLock()
-        else:
-            self.lock = None
-
-    def acquire(self):
-        """
-        Acquire the I/O thread lock.
-        """
-        if self.lock:
-            self.lock.acquire()
-
-    def release(self):
-        """
-        Release the I/O thread lock.
-        """
-        if self.lock:
-            self.lock.release()
-
-    def setLevel(self, level):
-        """
-        Set the logging level of this handler.
-        """
-        self.level = _checkLevel(level)
-
-    def format(self, record):
-        """
-        Format the specified record.
-
-        If a formatter is set, use it. Otherwise, use the default formatter
-        for the module.
-        """
-        if self.formatter:
-            fmt = self.formatter
-        else:
-            fmt = _defaultFormatter
-        return fmt.format(record)
-
-    def emit(self, record):
-        """
-        Do whatever it takes to actually log the specified logging record.
-
-        This version is intended to be implemented by subclasses and so
-        raises a NotImplementedError.
-        """
-        raise NotImplementedError('emit must be implemented '
-                                  'by Handler subclasses')
-
-    def handle(self, record):
-        """
-        Conditionally emit the specified logging record.
-
-        Emission depends on filters which may have been added to the handler.
-        Wrap the actual emission of the record with acquisition/release of
-        the I/O thread lock. Returns whether the filter passed the record for
-        emission.
-        """
-        rv = self.filter(record)
-        if rv:
-            self.acquire()
-            try:
-                self.emit(record)
-            finally:
-                self.release()
-        return rv
-
-    def setFormatter(self, fmt):
-        """
-        Set the formatter for this handler.
-        """
-        self.formatter = fmt
-
-    def flush(self):
-        """
-        Ensure all logging output has been flushed.
-
-        This version does nothing and is intended to be implemented by
-        subclasses.
-        """
-        pass
-
-    def close(self):
-        """
-        Tidy up any resources used by the handler.
-
-        This version removes the handler from an internal map of handlers,
-        _handlers, which is used for handler lookup by name. Subclasses
-        should ensure that this gets called from overridden close()
-        methods.
-        """
-        #get the module data lock, as we're updating a shared structure.
-        _acquireLock()
-        try:    #unlikely to raise an exception, but you never know...
-            if self._name and self._name in _handlers:
-                del _handlers[self._name]
-        finally:
-            _releaseLock()
-
-    def handleError(self, record):
-        """
-        Handle errors which occur during an emit() call.
-
-        This method should be called from handlers when an exception is
-        encountered during an emit() call. If raiseExceptions is false,
-        exceptions get silently ignored. This is what is mostly wanted
-        for a logging system - most users will not care about errors in
-        the logging system, they are more interested in application errors.
-        You could, however, replace this with a custom handler if you wish.
-        The record which was being processed is passed in to this method.
-        """
-        if raiseExceptions and sys.stderr:  # see issue 13807
-            ei = sys.exc_info()
-            try:
-                traceback.print_exception(ei[0], ei[1], ei[2],
-                                          None, sys.stderr)
-                sys.stderr.write('Logged from file %s, line %s\n' % (
-                                 record.filename, record.lineno))
-            except IOError:
-                pass    # see issue 5971
-            finally:
-                ei = None
-
-class StreamHandler(Handler):
-    """
-    A handler class which writes logging records, appropriately formatted,
-    to a stream. Note that this class does not close the stream, as
-    sys.stdout or sys.stderr may be used.
-    """
-
-    terminator = '\n'
-
-    def __init__(self, stream=None):
-        """
-        Initialize the handler.
-
-        If stream is not specified, sys.stderr is used.
-        """
-        Handler.__init__(self)
-        if stream is None:
-            stream = sys.stderr
-        self.stream = stream
-
-    def flush(self):
-        """
-        Flushes the stream.
-        """
-        if self.stream and hasattr(self.stream, "flush"):
-            self.stream.flush()
-
-    def emit(self, record):
-        """
-        Emit a record.
-
-        If a formatter is specified, it is used to format the record.
-        The record is then written to the stream with a trailing newline.  If
-        exception information is present, it is formatted using
-        traceback.print_exception and appended to the stream.  If the stream
-        has an 'encoding' attribute, it is used to determine how to do the
-        output to the stream.
-        """
-        try:
-            msg = self.format(record)
-            stream = self.stream
-            stream.write(msg)
-            stream.write(self.terminator)
-            self.flush()
-        except (KeyboardInterrupt, SystemExit):
-            raise
-        except:
-            self.handleError(record)
-
-class FileHandler(StreamHandler):
-    """
-    A handler class which writes formatted logging records to disk files.
-    """
-    def __init__(self, filename, mode='a', encoding=None, delay=0):
-        """
-        Open the specified file and use it as the stream for logging.
-        """
-        #keep the absolute path, otherwise derived classes which use this
-        #may come a cropper when the current directory changes
-        if codecs is None:
-            encoding = None
-        self.baseFilename = os.path.abspath(filename)
-        self.mode = mode
-        self.encoding = encoding
-        if delay:
-            #We don't open the stream, but we still need to call the
-            #Handler constructor to set level, formatter, lock etc.
-            Handler.__init__(self)
-            self.stream = None
-        else:
-            StreamHandler.__init__(self, self._open())
-
-    def close(self):
-        """
-        Closes the stream.
-        """
-        if self.stream:
-            self.flush()
-            if hasattr(self.stream, "close"):
-                self.stream.close()
-            StreamHandler.close(self)
-            self.stream = None
-
-    def _open(self):
-        """
-        Open the current base file with the (original) mode and encoding.
-        Return the resulting stream.
-        """
-        if self.encoding is None:
-            stream = open(self.baseFilename, self.mode)
-        else:
-            stream = codecs.open(self.baseFilename, self.mode, self.encoding)
-        return stream
-
-    def emit(self, record):
-        """
-        Emit a record.
-
-        If the stream was not opened because 'delay' was specified in the
-        constructor, open it before calling the superclass's emit.
-        """
-        if self.stream is None:
-            self.stream = self._open()
-        StreamHandler.emit(self, record)
-
-class _StderrHandler(StreamHandler):
-    """
-    This class is like a StreamHandler using sys.stderr, but always uses
-    whatever sys.stderr is currently set to rather than the value of
-    sys.stderr at handler construction time.
-    """
-    def __init__(self, level=NOTSET):
-        """
-        Initialize the handler.
-        """
-        Handler.__init__(self, level)
-
-    #@property
-    #def stream(self):
-    #    return sys.stderr
-
-
-_defaultLastResort = _StderrHandler(WARNING)
-lastResort = _defaultLastResort
-
-#---------------------------------------------------------------------------
-#   Manager classes and functions
-#---------------------------------------------------------------------------
-
-class PlaceHolder(object):
-    """
-    PlaceHolder instances are used in the Manager logger hierarchy to take
-    the place of nodes for which no loggers have been defined. This class is
-    intended for internal use only and not as part of the public API.
-    """
-    def __init__(self, alogger):
-        """
-        Initialize with the specified logger being a child of this placeholder.
-        """
-        self.loggerMap = { alogger : None }
-
-    def append(self, alogger):
-        """
-        Add the specified logger as a child of this placeholder.
-        """
-        if alogger not in self.loggerMap:
-            self.loggerMap[alogger] = None
-
-#
-#   Determine which class to use when instantiating loggers.
-#
-any _loggerClass = None
-
-def setLoggerClass(klass):
-    """
-    Set the class to be used when instantiating a logger. The class should
-    define __init__() such that only a name argument is required, and the
-    __init__() should call Logger.__init__()
-    """
-    if klass != Logger:
-        if not issubclass(klass, Logger):
-            raise TypeError("logger not derived from logging.Logger: "
-                            + klass.__name__)
-    global _loggerClass
-    _loggerClass = klass
-
-def getLoggerClass():
-    """
-    Return the class to be used when instantiating a logger.
-    """
-
-    return _loggerClass
-
-class Manager(object):
-    """
-    There is [under normal circumstances] just one Manager instance, which
-    holds the hierarchy of loggers.
-    """
-    def __init__(self, rootnode):
-        """
-        Initialize the manager with the root node of the logger hierarchy.
-        """
-        self.root = rootnode
-        self.disable = 0
-        self.emittedNoHandlerWarning = False
-        self.loggerDict = {}
-        self.loggerClass = None
-        self.logRecordFactory = None
-
-    def getLogger(self, name):
-        """
-        Get a logger with the specified name (channel name), creating it
-        if it doesn't yet exist. This name is a dot-separated hierarchical
-        name, such as "a", "a.b", "a.b.c" or similar.
-
-        If a PlaceHolder existed for the specified name [i.e. the logger
-        didn't exist but a child of it did], replace it with the created
-        logger and fix up the parent/child references which pointed to the
-        placeholder to now point to the logger.
-        """
-        rv = None
-        if not isinstance(name, str):
-            raise TypeError('A logger name must be a string')
-        _acquireLock()
-        try:
-            if name in self.loggerDict:
-                rv = self.loggerDict[name]
-                if isinstance(rv, PlaceHolder):
-                    ph = rv
-                    rv = (self.loggerClass or _loggerClass)(name)
-                    rv.manager = self
-                    self.loggerDict[name] = rv
-                    self._fixupChildren(ph, rv)
-                    self._fixupParents(rv)
-            else:
-                rv = (self.loggerClass or _loggerClass)(name)
-                rv.manager = self
-                self.loggerDict[name] = rv
-                self._fixupParents(rv)
-        finally:
-            _releaseLock()
-        return rv
-
-    def setLoggerClass(self, klass):
-        """
-        Set the class to be used when instantiating a logger with this Manager.
-        """
-        if klass != Logger:
-            if not issubclass(klass, Logger):
-                raise TypeError("logger not derived from logging.Logger: "
-                                + klass.__name__)
-        self.loggerClass = klass
-
-    def setLogRecordFactory(self, factory):
-        """
-        Set the factory to be used when instantiating a log record with this
-        Manager.
-        """
-        self.logRecordFactory = factory
-
-    def _fixupParents(self, alogger):
-        """
-        Ensure that there are either loggers or placeholders all the way
-        from the specified logger to the root of the logger hierarchy.
-        """
-        name = alogger.name
-        i = name.rfind(".")
-        rv = None
-        while (i > 0) and not rv:
-            substr = name[:i]
-            if substr not in self.loggerDict:
-                self.loggerDict[substr] = PlaceHolder(alogger)
-            else:
-                obj = self.loggerDict[substr]
-                if isinstance(obj, Logger):
-                    rv = obj
-                else:
-                    assert isinstance(obj, PlaceHolder)
-                    obj.append(alogger)
-            i = name.rfind(".", 0, i - 1)
-        if not rv:
-            rv = self.root
-        alogger.parent = rv
-
-    def _fixupChildren(self, ph, alogger):
-        """
-        Ensure that children of the placeholder ph are connected to the
-        specified logger.
-        """
-        name = alogger.name
-        namelen = len(name)
-        for c in ph.loggerMap.keys():
-            #The if means ... if not c.parent.name.startswith(nm)
-            if c.parent.name[:namelen] != name:
-                alogger.parent = c.parent
-                c.parent = alogger
-
-#---------------------------------------------------------------------------
-#   Logger classes and functions
-#---------------------------------------------------------------------------
-
-class Logger(Filterer):
-    """
-    Instances of the Logger class represent a single logging channel. A
-    "logging channel" indicates an area of an application. Exactly how an
-    "area" is defined is up to the application developer. Since an
-    application can have any number of areas, logging channels are identified
-    by a unique string. Application areas can be nested (e.g. an area
-    of "input processing" might include sub-areas "read CSV files", "read
-    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
-    channel names are organized into a namespace hierarchy where levels are
-    separated by periods, much like the Java or Python package namespace. So
-    in the instance given above, channel names might be "input" for the upper
-    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
-    There is no arbitrary limit to the depth of nesting.
-    """
-
-    any root
-    any manager
-
-    def __init__(self, name, level=NOTSET):
-        """
-        Initialize the logger with a name and an optional level.
-        """
-        Filterer.__init__(self)
-        self.name = name
-        self.level = _checkLevel(level)
-        self.parent = None
-        self.propagate = 1
-        self.handlers = []
-        self.disabled = 0
-
-    def setLevel(self, level):
-        """
-        Set the logging level of this logger.
-        """
-        self.level = _checkLevel(level)
-
-    def debug(self, msg, *args, **kwargs):
-        """
-        Log 'msg % args' with severity 'DEBUG'.
-
-        To pass exception information, use the keyword argument exc_info with
-        a true value, e.g.
-
-        logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
-        """
-        if self.isEnabledFor(DEBUG):
-            self._log(DEBUG, msg, args, **kwargs)
-
-    def info(self, msg, *args, **kwargs):
-        """
-        Log 'msg % args' with severity 'INFO'.
-
-        To pass exception information, use the keyword argument exc_info with
-        a true value, e.g.
-
-        logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
-        """
-        if self.isEnabledFor(INFO):
-            self._log(INFO, msg, args, **kwargs)
-
-    def warning(self, msg, *args, **kwargs):
-        """
-        Log 'msg % args' with severity 'WARNING'.
-
-        To pass exception information, use the keyword argument exc_info with
-        a true value, e.g.
-
-        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
-        """
-        if self.isEnabledFor(WARNING):
-            self._log(WARNING, msg, args, **kwargs)
-
-    warn = warning
-
-    def error(self, msg, *args, **kwargs):
-        """
-        Log 'msg % args' with severity 'ERROR'.
-
-        To pass exception information, use the keyword argument exc_info with
-        a true value, e.g.
-
-        logger.error("Houston, we have a %s", "major problem", exc_info=1)
-        """
-        if self.isEnabledFor(ERROR):
-            self._log(ERROR, msg, args, **kwargs)
-
-    def exception(self, msg, *args, **kwargs):
-        """
-        Convenience method for logging an ERROR with exception information.
-        """
-        kwargs['exc_info'] = True
-        self.error(msg, *args, **kwargs)
-
-    def critical(self, msg, *args, **kwargs):
-        """
-        Log 'msg % args' with severity 'CRITICAL'.
-
-        To pass exception information, use the keyword argument exc_info with
-        a true value, e.g.
-
-        logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
-        """
-        if self.isEnabledFor(CRITICAL):
-            self._log(CRITICAL, msg, args, **kwargs)
-
-    fatal = critical
-
-    def log(self, level, msg, *args, **kwargs):
-        """
-        Log 'msg % args' with the integer severity 'level'.
-
-        To pass exception information, use the keyword argument exc_info with
-        a true value, e.g.
-
-        logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
-        """
-        if not isinstance(level, int):
-            if raiseExceptions:
-                raise TypeError("level must be an integer")
-            else:
-                return
-        if self.isEnabledFor(level):
-            self._log(level, msg, args, **kwargs)
-
-    def findCaller(self, stack_info=False):
-        """
-        Find the stack frame of the caller so that we can note the source
-        file name, line number and function name.
-        """
-        f = currentframe()
-        #On some versions of IronPython, currentframe() returns None if
-        #IronPython isn't run with -X:Frames.
-        if f is not None:
-            f = f.f_back
-        rv = "(unknown file)", 0, "(unknown function)", None
-        while hasattr(f, "f_code"):
-            co = f.f_code
-            filename = os.path.normcase(co.co_filename)
-            if filename == _srcfile:
-                f = f.f_back
-                continue
-            sinfo = None
-            if stack_info:
-                sio = io.StringIO()
-                sio.write('Stack (most recent call last):\n')
-                traceback.print_stack(f, file=sio)
-                sinfo = sio.getvalue()
-                if sinfo[-1] == '\n':
-                    sinfo = sinfo[:-1]
-                sio.close()
-            rv = (co.co_filename, f.f_lineno, co.co_name, sinfo)
-            break
-        return rv
-
-    def makeRecord(self, name, level, fn, lno, msg, args, exc_info,
-                   func=None, extra=None, sinfo=None):
-        """
-        A factory method which can be overridden in subclasses to create
-        specialized LogRecords.
-        """
-        rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func,
-                             sinfo)
-        if extra is not None:
-            for key in extra:
-                if (key in ["message", "asctime"]) or (key in rv.__dict__):
-                    raise KeyError("Attempt to overwrite %r in LogRecord" % key)
-                rv.__dict__[key] = extra[key]
-        return rv
-
-    def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
-        """
-        Low-level logging routine which creates a LogRecord and then calls
-        all the handlers of this logger to handle the record.
-        """
-        sinfo = None
-        if _srcfile:
-            #IronPython doesn't track Python frames, so findCaller throws an
-            #exception on some versions of IronPython. We trap it here so that
-            #IronPython can use logging.
-            try:
-                fn, lno, func, sinfo = self.findCaller(stack_info)
-            except ValueError:
-                fn, lno, func = "(unknown file)", 0, "(unknown function)"
-        else:
-            fn, lno, func = "(unknown file)", 0, "(unknown function)"
-        if exc_info:
-            if not isinstance(exc_info, tuple):
-                exc_info = sys.exc_info()
-        record = self.makeRecord(self.name, level, fn, lno, msg, args,
-                                 exc_info, func, extra, sinfo)
-        self.handle(record)
-
-    def handle(self, record):
-        """
-        Call the handlers for the specified record.
-
-        This method is used for unpickled records received from a socket, as
-        well as those created locally. Logger-level filtering is applied.
-        """
-        if (not self.disabled) and self.filter(record):
-            self.callHandlers(record)
-
-    def addHandler(self, hdlr):
-        """
-        Add the specified handler to this logger.
-        """
-        _acquireLock()
-        try:
-            if not (hdlr in self.handlers):
-                self.handlers.append(hdlr)
-        finally:
-            _releaseLock()
-
-    def removeHandler(self, hdlr):
-        """
-        Remove the specified handler from this logger.
-        """
-        _acquireLock()
-        try:
-            if hdlr in self.handlers:
-                self.handlers.remove(hdlr)
-        finally:
-            _releaseLock()
-
-    def hasHandlers(self):
-        """
-        See if this logger has any handlers configured.
-
-        Loop through all handlers for this logger and its parents in the
-        logger hierarchy. Return True if a handler was found, else False.
-        Stop searching up the hierarchy whenever a logger with the "propagate"
-        attribute set to zero is found - that will be the last logger which
-        is checked for the existence of handlers.
-        """
-        c = self
-        rv = False
-        while c:
-            if c.handlers:
-                rv = True
-                break
-            if not c.propagate:
-                break
-            else:
-                c = c.parent
-        return rv
-
-    def callHandlers(self, record):
-        """
-        Pass a record to all relevant handlers.
-
-        Loop through all handlers for this logger and its parents in the
-        logger hierarchy. If no handler was found, output a one-off error
-        message to sys.stderr. Stop searching up the hierarchy whenever a
-        logger with the "propagate" attribute set to zero is found - that
-        will be the last logger whose handlers are called.
-        """
-        c = self
-        found = 0
-        while c:
-            for hdlr in c.handlers:
-                found = found + 1
-                if record.levelno >= hdlr.level:
-                    hdlr.handle(record)
-            if not c.propagate:
-                c = None    #break out
-            else:
-                c = c.parent
-        if (found == 0):
-            if lastResort:
-                if record.levelno >= lastResort.level:
-                    lastResort.handle(record)
-            elif raiseExceptions and not self.manager.emittedNoHandlerWarning:
-                sys.stderr.write("No handlers could be found for logger"
-                                 " \"%s\"\n" % self.name)
-                self.manager.emittedNoHandlerWarning = True
-
-    def getEffectiveLevel(self):
-        """
-        Get the effective level for this logger.
-
-        Loop through this logger and its parents in the logger hierarchy,
-        looking for a non-zero logging level. Return the first one found.
-        """
-        logger = self
-        while logger:
-            if logger.level:
-                return logger.level
-            logger = logger.parent
-        return NOTSET
-
-    def isEnabledFor(self, level):
-        """
-        Is this logger enabled for level 'level'?
-        """
-        if self.manager.disable >= level:
-            return 0
-        return level >= self.getEffectiveLevel()
-
-    def getChild(self, suffix):
-        """
-        Get a logger which is a descendant to this one.
-
-        This is a convenience method, such that
-
-        logging.getLogger('abc').getChild('def.ghi')
-
-        is the same as
-
-        logging.getLogger('abc.def.ghi')
-
-        It's useful, for example, when the parent logger is named using
-        __name__ rather than a literal string.
-        """
-        if self.root is not self:
-            suffix = '.'.join((self.name, suffix))
-        return self.manager.getLogger(suffix)
-
-class RootLogger(Logger):
-    """
-    A root logger is not that different to any other logger, except that
-    it must have a logging level and there is only one instance of it in
-    the hierarchy.
-    """
-    def __init__(self, level):
-        """
-        Initialize the logger with the name "root".
-        """
-        Logger.__init__(self, "root", level)
-
-_loggerClass = Logger
-
-class LoggerAdapter(object):
-    """
-    An adapter for loggers which makes it easier to specify contextual
-    information in logging output.
-    """
-
-    def __init__(self, logger, extra):
-        """
-        Initialize the adapter with a logger and a dict-like object which
-        provides contextual information. This constructor signature allows
-        easy stacking of LoggerAdapters, if so desired.
-
-        You can effectively pass keyword arguments as shown in the
-        following example:
-
-        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
-        """
-        self.logger = logger
-        self.extra = extra
-
-    def process(self, msg, kwargs):
-        """
-        Process the logging message and keyword arguments passed in to
-        a logging call to insert contextual information. You can either
-        manipulate the message itself, the keyword args or both. Return
-        the message and kwargs modified (or not) to suit your needs.
-
-        Normally, you'll only need to override this one method in a
-        LoggerAdapter subclass for your specific needs.
-        """
-        kwargs["extra"] = self.extra
-        return msg, kwargs
-
-    #
-    # Boilerplate convenience methods
-    #
-    def debug(self, msg, *args, **kwargs):
-        """
-        Delegate a debug call to the underlying logger.
-        """
-        self.log(DEBUG, msg, *args, **kwargs)
-
-    def info(self, msg, *args, **kwargs):
-        """
-        Delegate an info call to the underlying logger.
-        """
-        self.log(INFO, msg, *args, **kwargs)
-
-    def warning(self, msg, *args, **kwargs):
-        """
-        Delegate a warning call to the underlying logger.
-        """
-        self.log(WARNING, msg, *args, **kwargs)
-
-    warn = warning
-
-    def error(self, msg, *args, **kwargs):
-        """
-        Delegate an error call to the underlying logger.
-        """
-        self.log(ERROR, msg, *args, **kwargs)
-
-    def exception(self, msg, *args, **kwargs):
-        """
-        Delegate an exception call to the underlying logger.
-        """
-        kwargs["exc_info"] = 1
-        self.log(ERROR, msg, *args, **kwargs)
-
-    def critical(self, msg, *args, **kwargs):
-        """
-        Delegate a critical call to the underlying logger.
-        """
-        self.log(CRITICAL, msg, *args, **kwargs)
-
-    def log(self, level, msg, *args, **kwargs):
-        """
-        Delegate a log call to the underlying logger, after adding
-        contextual information from this adapter instance.
-        """
-        if self.isEnabledFor(level):
-            msg, kwargs = self.process(msg, kwargs)
-            self.logger._log(level, msg, args, **kwargs)
-
-    def isEnabledFor(self, level):
-        """
-        Is this logger enabled for level 'level'?
-        """
-        if self.logger.manager.disable >= level:
-            return False
-        return level >= self.getEffectiveLevel()
-
-    def setLevel(self, level):
-        """
-        Set the specified level on the underlying logger.
-        """
-        self.logger.setLevel(level)
-
-    def getEffectiveLevel(self):
-        """
-        Get the effective level for the underlying logger.
-        """
-        return self.logger.getEffectiveLevel()
-
-    def hasHandlers(self):
-        """
-        See if the underlying logger has any handlers.
-        """
-        return self.logger.hasHandlers()
-
-root = RootLogger(WARNING)
-Logger.root = root
-Logger.manager = Manager(Logger.root)
-
-#---------------------------------------------------------------------------
-# Configuration classes and functions
-#---------------------------------------------------------------------------
-
-BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"
-
-def basicConfig(**kwargs):
-    """
-    Do basic configuration for the logging system.
-
-    This function does nothing if the root logger already has handlers
-    configured. It is a convenience method intended for use by simple scripts
-    to do one-shot configuration of the logging package.
-
-    The default behaviour is to create a StreamHandler which writes to
-    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
-    add the handler to the root logger.
-
-    A number of optional keyword arguments may be specified, which can alter
-    the default behaviour.
-
-    filename  Specifies that a FileHandler be created, using the specified
-              filename, rather than a StreamHandler.
-    filemode  Specifies the mode to open the file, if filename is specified
-              (if filemode is unspecified, it defaults to 'a').
-    format    Use the specified format string for the handler.
-    datefmt   Use the specified date/time format.
-    style     If a format string is specified, use this to specify the
-              type of format string (possible values '%', '{', '$', for
-              %-formatting, :meth:`str.format` and :class:`string.Template`
-              - defaults to '%').
-    level     Set the root logger level to the specified level.
-    stream    Use the specified stream to initialize the StreamHandler. Note
-              that this argument is incompatible with 'filename' - if both
-              are present, 'stream' is ignored.
-
-    Note that you could specify a stream created using open(filename, mode)
-    rather than passing the filename and mode in. However, it should be
-    remembered that StreamHandler does not close its stream (since it may be
-    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
-    when the handler is closed.
-
-    .. versionchanged: 3.2
-       Added the ``style`` parameter.
-    """
-    # Add thread safety in case someone mistakenly calls
-    # basicConfig() from multiple threads
-    _acquireLock()
-    try:
-        if len(root.handlers) == 0:
-            filename = kwargs.get("filename")
-            if filename:
-                mode = kwargs.get("filemode", 'a')
-                hdlr = FileHandler(filename, mode)
-            else:
-                stream = kwargs.get("stream")
-                hdlr = StreamHandler(stream)
-            fs = kwargs.get("format", BASIC_FORMAT)
-            dfs = kwargs.get("datefmt", None)
-            style = kwargs.get("style", '%')
-            fmt = Formatter(fs, dfs, style)
-            hdlr.setFormatter(fmt)
-            root.addHandler(hdlr)
-            level = kwargs.get("level")
-            if level is not None:
-                root.setLevel(level)
-    finally:
-        _releaseLock()
-
-#---------------------------------------------------------------------------
-# Utility functions at module level.
-# Basically delegate everything to the root logger.
-#---------------------------------------------------------------------------
-
-def getLogger(name=None):
-    """
-    Return a logger with the specified name, creating it if necessary.
-
-    If no name is specified, return the root logger.
-    """
-    if name:
-        return Logger.manager.getLogger(name)
-    else:
-        return root
-
-def critical(msg, *args, **kwargs):
-    """
-    Log a message with severity 'CRITICAL' on the root logger. If the logger
-    has no handlers, call basicConfig() to add a console handler with a
-    pre-defined format.
-    """
-    if len(root.handlers) == 0:
-        basicConfig()
-    root.critical(msg, *args, **kwargs)
-
-fatal = critical
-
-def error(msg, *args, **kwargs):
-    """
-    Log a message with severity 'ERROR' on the root logger. If the logger has
-    no handlers, call basicConfig() to add a console handler with a pre-defined
-    format.
-    """
-    if len(root.handlers) == 0:
-        basicConfig()
-    root.error(msg, *args, **kwargs)
-
-def exception(msg, *args, **kwargs):
-    """
-    Log a message with severity 'ERROR' on the root logger, with exception
-    information. If the logger has no handlers, basicConfig() is called to add
-    a console handler with a pre-defined format.
-    """
-    kwargs['exc_info'] = True
-    error(msg, *args, **kwargs)
-
-def warning(msg, *args, **kwargs):
-    """
-    Log a message with severity 'WARNING' on the root logger. If the logger has
-    no handlers, call basicConfig() to add a console handler with a pre-defined
-    format.
-    """
-    if len(root.handlers) == 0:
-        basicConfig()
-    root.warning(msg, *args, **kwargs)
-
-warn = warning
-
-def info(msg, *args, **kwargs):
-    """
-    Log a message with severity 'INFO' on the root logger. If the logger has
-    no handlers, call basicConfig() to add a console handler with a pre-defined
-    format.
-    """
-    if len(root.handlers) == 0:
-        basicConfig()
-    root.info(msg, *args, **kwargs)
-
-def debug(msg, *args, **kwargs):
-    """
-    Log a message with severity 'DEBUG' on the root logger. If the logger has
-    no handlers, call basicConfig() to add a console handler with a pre-defined
-    format.
-    """
-    if len(root.handlers) == 0:
-        basicConfig()
-    root.debug(msg, *args, **kwargs)
-
-def log(level, msg, *args, **kwargs):
-    """
-    Log 'msg % args' with the integer severity 'level' on the root logger. If
-    the logger has no handlers, call basicConfig() to add a console handler
-    with a pre-defined format.
-    """
-    if len(root.handlers) == 0:
-        basicConfig()
-    root.log(level, msg, *args, **kwargs)
-
-def disable(level):
-    """
-    Disable all logging calls of severity 'level' and below.
-    """
-    root.manager.disable = level
-
-def shutdown(handlerList=_handlerList):
-    """
-    Perform any cleanup actions in the logging system (e.g. flushing
-    buffers).
-
-    Should be called at application exit.
-    """
-    for wr in reversed(handlerList[:]):
-        #errors might occur, for example, if files are locked
-        #we just ignore them if raiseExceptions is not set
-        try:
-            h = wr()
-            if h:
-                try:
-                    h.acquire()
-                    h.flush()
-                    h.close()
-                except (IOError, ValueError):
-                    # Ignore errors which might be caused
-                    # because handlers have been closed but
-                    # references to them are still around at
-                    # application exit.
-                    pass
-                finally:
-                    h.release()
-        except:
-            if raiseExceptions:
-                raise
-            #else, swallow
-
-#Let's try and shutdown automatically on application exit...
-import atexit
-atexit.register(shutdown)
-
-# Null handler
-
-class NullHandler(Handler):
-    """
-    This handler does nothing. It's intended to be used to avoid the
-    "No handlers could be found for logger XXX" one-off warning. This is
-    important for library code, which may contain code to log events. If a user
-    of the library does not configure logging, the one-off warning might be
-    produced; to avoid this, the library developer simply needs to instantiate
-    a NullHandler and add it to the top-level logger of the library module or
-    package.
-    """
-    def handle(self, record):
-        pass
-
-    def emit(self, record):
-        pass
-
-    def createLock(self):
-        self.lock = None
-
-# Warnings integration
-
-any _warnings_showwarning = None
-
-def _showwarning(message, category, filename, lineno, file=None, line=None):
-    """
-    Implementation of showwarnings which redirects to logging, which will first
-    check to see if the file parameter is None. If a file is specified, it will
-    delegate to the original warnings implementation of showwarning. Otherwise,
-    it will call warnings.formatwarning and will log the resulting string to a
-    warnings logger named "py.warnings" with level logging.WARNING.
-    """
-    if file is not None:
-        if _warnings_showwarning is not None:
-            _warnings_showwarning(message, category, filename, lineno, file, line)
-    else:
-        s = warnings.formatwarning(message, category, filename, lineno, line)
-        logger = getLogger("py.warnings")
-        if not logger.handlers:
-            logger.addHandler(NullHandler())
-        logger.warning("%s", s)
-
-def captureWarnings(capture):
-    """
-    If capture is true, redirect all warnings to the logging package.
-    If capture is False, ensure that warnings are not redirected to logging
-    but to their original destinations.
-    """
-    global _warnings_showwarning
-    if capture:
-        if _warnings_showwarning is None:
-            _warnings_showwarning = warnings.showwarning
-            warnings.showwarning = _showwarning
-    else:
-        if _warnings_showwarning is not None:
-            warnings.showwarning = _warnings_showwarning
-            _warnings_showwarning = None
diff --git a/test-data/stdlib-samples/3.2/incomplete/urllib/parse.py b/test-data/stdlib-samples/3.2/incomplete/urllib/parse.py
deleted file mode 100644
index 4fa65c4..0000000
--- a/test-data/stdlib-samples/3.2/incomplete/urllib/parse.py
+++ /dev/null
@@ -1,980 +0,0 @@
-"""Parse (absolute and relative) URLs.
-
-urlparse module is based upon the following RFC specifications.
-
-RFC 3986 (STD66): "Uniform Resource Identifiers" by T. Berners-Lee, R. Fielding
-and L.  Masinter, January 2005.
-
-RFC 2732 : "Format for Literal IPv6 Addresses in URLs" by R.Hinden, B.Carpenter
-and L.Masinter, December 1999.
-
-RFC 2396:  "Uniform Resource Identifiers (URI)": Generic Syntax by T.
-Berners-Lee, R. Fielding, and L. Masinter, August 1998.
-
-RFC 2368: "The mailto URL scheme", by P.Hoffman , L Masinter, J. Zawinski, July 1998.
-
-RFC 1808: "Relative Uniform Resource Locators", by R. Fielding, UC Irvine, June
-1995.
-
-RFC 1738: "Uniform Resource Locators (URL)" by T. Berners-Lee, L. Masinter, M.
-McCahill, December 1994
-
-RFC 3986 is considered the current standard and any future changes to
-urlparse module should conform with it.  The urlparse module is
-currently not entirely compliant with this RFC due to defacto
-scenarios for parsing, and for backward compatibility purposes, some
-parsing quirks from older RFCs are retained. The testcases in
-test_urlparse.py provides a good indicator of parsing behavior.
-"""
-
-import sys
-import collections
-
-__all__ = ["urlparse", "urlunparse", "urljoin", "urldefrag",
-           "urlsplit", "urlunsplit", "urlencode", "parse_qs",
-           "parse_qsl", "quote", "quote_plus", "quote_from_bytes",
-           "unquote", "unquote_plus", "unquote_to_bytes"]
-
-# A classification of schemes ('' means apply by default)
-uses_relative = ['ftp', 'http', 'gopher', 'nntp', 'imap',
-                 'wais', 'file', 'https', 'shttp', 'mms',
-                 'prospero', 'rtsp', 'rtspu', '', 'sftp',
-                 'svn', 'svn+ssh']
-uses_netloc = ['ftp', 'http', 'gopher', 'nntp', 'telnet',
-               'imap', 'wais', 'file', 'mms', 'https', 'shttp',
-               'snews', 'prospero', 'rtsp', 'rtspu', 'rsync', '',
-               'svn', 'svn+ssh', 'sftp', 'nfs', 'git', 'git+ssh']
-non_hierarchical = ['gopher', 'hdl', 'mailto', 'news',
-                    'telnet', 'wais', 'imap', 'snews', 'sip', 'sips']
-uses_params = ['ftp', 'hdl', 'prospero', 'http', 'imap',
-               'https', 'shttp', 'rtsp', 'rtspu', 'sip', 'sips',
-               'mms', '', 'sftp']
-uses_query = ['http', 'wais', 'imap', 'https', 'shttp', 'mms',
-              'gopher', 'rtsp', 'rtspu', 'sip', 'sips', '']
-uses_fragment = ['ftp', 'hdl', 'http', 'gopher', 'news',
-                 'nntp', 'wais', 'https', 'shttp', 'snews',
-                 'file', 'prospero', '']
-
-# Characters valid in scheme names
-scheme_chars = ('abcdefghijklmnopqrstuvwxyz'
-                'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-                '0123456789'
-                '+-.')
-
-# XXX: Consider replacing with functools.lru_cache
-MAX_CACHE_SIZE = 20
-_parse_cache = {}
-
-def clear_cache():
-    """Clear the parse cache and the quoters cache."""
-    _parse_cache.clear()
-    _safe_quoters.clear()
-
-
-# Helpers for bytes handling
-# For 3.2, we deliberately require applications that
-# handle improperly quoted URLs to do their own
-# decoding and encoding. If valid use cases are
-# presented, we may relax this by using latin-1
-# decoding internally for 3.3
-_implicit_encoding = 'ascii'
-_implicit_errors = 'strict'
-
-def _noop(obj):
-    return obj
-
-def _encode_result(obj, encoding=_implicit_encoding,
-                        errors=_implicit_errors):
-    return obj.encode(encoding, errors)
-
-def _decode_args(args, encoding=_implicit_encoding,
-                       errors=_implicit_errors):
-    return tuple(x.decode(encoding, errors) if x else '' for x in args)
-
-def _coerce_args(*args):
-    # Invokes decode if necessary to create str args
-    # and returns the coerced inputs along with
-    # an appropriate result coercion function
-    #   - noop for str inputs
-    #   - encoding function otherwise
-    str_input = isinstance(args[0], str)
-    for arg in args[1:]:
-        # We special-case the empty string to support the
-        # "scheme=''" default argument to some functions
-        if arg and isinstance(arg, str) != str_input:
-            raise TypeError("Cannot mix str and non-str arguments")
-    if str_input:
-        return args + (_noop,)
-    return _decode_args(args) + (_encode_result,)
-
-# Result objects are more helpful than simple tuples
-class _ResultMixinStr(object):
-    """Standard approach to encoding parsed results from str to bytes"""
-    __slots__ = ()
-
-    def encode(self, encoding='ascii', errors='strict'):
-        return self._encoded_counterpart(*(x.encode(encoding, errors) for x in self))
-
-
-class _ResultMixinBytes(object):
-    """Standard approach to decoding parsed results from bytes to str"""
-    __slots__ = ()
-
-    def decode(self, encoding='ascii', errors='strict'):
-        return self._decoded_counterpart(*(x.decode(encoding, errors) for x in self))
-
-
-class _NetlocResultMixinBase(object):
-    """Shared methods for the parsed result objects containing a netloc element"""
-    __slots__ = ()
-
-    @property
-    def username(self):
-        return self._userinfo[0]
-
-    @property
-    def password(self):
-        return self._userinfo[1]
-
-    @property
-    def hostname(self):
-        hostname = self._hostinfo[0]
-        if not hostname:
-            hostname = None
-        elif hostname is not None:
-            hostname = hostname.lower()
-        return hostname
-
-    @property
-    def port(self):
-        port = self._hostinfo[1]
-        if port is not None:
-            port = int(port, 10)
-        return port
-
-
-class _NetlocResultMixinStr(_NetlocResultMixinBase, _ResultMixinStr):
-    __slots__ = ()
-
-    @property
-    def _userinfo(self):
-        netloc = self.netloc
-        userinfo, have_info, hostinfo = netloc.rpartition('@')
-        if have_info:
-            username, have_password, password = userinfo.partition(':')
-            if not have_password:
-                password = None
-        else:
-            username = password = None
-        return username, password
-
-    @property
-    def _hostinfo(self):
-        netloc = self.netloc
-        _, _, hostinfo = netloc.rpartition('@')
-        _, have_open_br, bracketed = hostinfo.partition('[')
-        if have_open_br:
-            hostname, _, port = bracketed.partition(']')
-            _, have_port, port = port.partition(':')
-        else:
-            hostname, have_port, port = hostinfo.partition(':')
-        if not have_port:
-            port = None
-        return hostname, port
-
-
-class _NetlocResultMixinBytes(_NetlocResultMixinBase, _ResultMixinBytes):
-    __slots__ = ()
-
-    @property
-    def _userinfo(self):
-        netloc = self.netloc
-        userinfo, have_info, hostinfo = netloc.rpartition(b'@')
-        if have_info:
-            username, have_password, password = userinfo.partition(b':')
-            if not have_password:
-                password = None
-        else:
-            username = password = None
-        return username, password
-
-    @property
-    def _hostinfo(self):
-        netloc = self.netloc
-        _, _, hostinfo = netloc.rpartition(b'@')
-        _, have_open_br, bracketed = hostinfo.partition(b'[')
-        if have_open_br:
-            hostname, _, port = bracketed.partition(b']')
-            _, have_port, port = port.partition(b':')
-        else:
-            hostname, have_port, port = hostinfo.partition(b':')
-        if not have_port:
-            port = None
-        return hostname, port
-
-
-from collections import namedtuple
-
-_DefragResultBase = namedtuple('DefragResult', 'url fragment')
-_SplitResultBase = namedtuple('SplitResult', 'scheme netloc path query fragment')
-_ParseResultBase = namedtuple('ParseResult', 'scheme netloc path params query fragment')
-
-# For backwards compatibility, alias _NetlocResultMixinStr
-# ResultBase is no longer part of the documented API, but it is
-# retained since deprecating it isn't worth the hassle
-ResultBase = _NetlocResultMixinStr
-
-# Structured result objects for string data
-class DefragResult(_DefragResultBase, _ResultMixinStr):
-    __slots__ = ()
-    def geturl(self):
-        if self.fragment:
-            return self.url + '#' + self.fragment
-        else:
-            return self.url
-
-class SplitResult(_SplitResultBase, _NetlocResultMixinStr):
-    __slots__ = ()
-    def geturl(self):
-        return urlunsplit(self)
-
-class ParseResult(_ParseResultBase, _NetlocResultMixinStr):
-    __slots__ = ()
-    def geturl(self):
-        return urlunparse(self)
-
-# Structured result objects for bytes data
-class DefragResultBytes(_DefragResultBase, _ResultMixinBytes):
-    __slots__ = ()
-    def geturl(self):
-        if self.fragment:
-            return self.url + b'#' + self.fragment
-        else:
-            return self.url
-
-class SplitResultBytes(_SplitResultBase, _NetlocResultMixinBytes):
-    __slots__ = ()
-    def geturl(self):
-        return urlunsplit(self)
-
-class ParseResultBytes(_ParseResultBase, _NetlocResultMixinBytes):
-    __slots__ = ()
-    def geturl(self):
-        return urlunparse(self)
-
-# Set up the encode/decode result pairs
-def _fix_result_transcoding():
-    _result_pairs = (
-        (DefragResult, DefragResultBytes),
-        (SplitResult, SplitResultBytes),
-        (ParseResult, ParseResultBytes),
-    )
-    for _decoded, _encoded in _result_pairs:
-        _decoded._encoded_counterpart = _encoded
-        _encoded._decoded_counterpart = _decoded
-
-_fix_result_transcoding()
-del _fix_result_transcoding
-
-def urlparse(url, scheme='', allow_fragments=True):
-    """Parse a URL into 6 components:
-    <scheme>://<netloc>/<path>;<params>?<query>#<fragment>
-    Return a 6-tuple: (scheme, netloc, path, params, query, fragment).
-    Note that we don't break the components up in smaller bits
-    (e.g. netloc is a single string) and we don't expand % escapes."""
-    url, scheme, _coerce_result = _coerce_args(url, scheme)
-    tuple = urlsplit(url, scheme, allow_fragments)
-    scheme, netloc, url, query, fragment = tuple
-    if scheme in uses_params and ';' in url:
-        url, params = _splitparams(url)
-    else:
-        params = ''
-    result = ParseResult(scheme, netloc, url, params, query, fragment)
-    return _coerce_result(result)
-
-def _splitparams(url):
-    if '/'  in url:
-        i = url.find(';', url.rfind('/'))
-        if i < 0:
-            return url, ''
-    else:
-        i = url.find(';')
-    return url[:i], url[i+1:]
-
-def _splitnetloc(url, start=0):
-    delim = len(url)   # position of end of domain part of url, default is end
-    for c in '/?#':    # look for delimiters; the order is NOT important
-        wdelim = url.find(c, start)        # find first of this delim
-        if wdelim >= 0:                    # if found
-            delim = min(delim, wdelim)     # use earliest delim position
-    return url[start:delim], url[delim:]   # return (domain, rest)
-
-def urlsplit(url, scheme='', allow_fragments=True):
-    """Parse a URL into 5 components:
-    <scheme>://<netloc>/<path>?<query>#<fragment>
-    Return a 5-tuple: (scheme, netloc, path, query, fragment).
-    Note that we don't break the components up in smaller bits
-    (e.g. netloc is a single string) and we don't expand % escapes."""
-    url, scheme, _coerce_result = _coerce_args(url, scheme)
-    allow_fragments = bool(allow_fragments)
-    key = url, scheme, allow_fragments, type(url), type(scheme)
-    cached = _parse_cache.get(key, None)
-    if cached:
-        return _coerce_result(cached)
-    if len(_parse_cache) >= MAX_CACHE_SIZE: # avoid runaway growth
-        clear_cache()
-    netloc = query = fragment = ''
-    i = url.find(':')
-    if i > 0:
-        if url[:i] == 'http': # optimize the common case
-            scheme = url[:i].lower()
-            url = url[i+1:]
-            if url[:2] == '//':
-                netloc, url = _splitnetloc(url, 2)
-                if (('[' in netloc and ']' not in netloc) or
-                        (']' in netloc and '[' not in netloc)):
-                    raise ValueError("Invalid IPv6 URL")
-            if allow_fragments and '#' in url:
-                url, fragment = url.split('#', 1)
-            if '?' in url:
-                url, query = url.split('?', 1)
-            v = SplitResult(scheme, netloc, url, query, fragment)
-            _parse_cache[key] = v
-            return _coerce_result(v)
-        for c in url[:i]:
-            if c not in scheme_chars:
-                break
-        else:
-            try:
-                # make sure "url" is not actually a port number (in which case
-                # "scheme" is really part of the path
-                _testportnum = int(url[i+1:])
-            except ValueError:
-                scheme, url = url[:i].lower(), url[i+1:]
-
-    if url[:2] == '//':
-        netloc, url = _splitnetloc(url, 2)
-        if (('[' in netloc and ']' not in netloc) or
-                (']' in netloc and '[' not in netloc)):
-            raise ValueError("Invalid IPv6 URL")
-    if allow_fragments and scheme in uses_fragment and '#' in url:
-        url, fragment = url.split('#', 1)
-    if scheme in uses_query and '?' in url:
-        url, query = url.split('?', 1)
-    v = SplitResult(scheme, netloc, url, query, fragment)
-    _parse_cache[key] = v
-    return _coerce_result(v)
-
-def urlunparse(components):
-    """Put a parsed URL back together again.  This may result in a
-    slightly different, but equivalent URL, if the URL that was parsed
-    originally had redundant delimiters, e.g. a ? with an empty query
-    (the draft states that these are equivalent)."""
-    scheme, netloc, url, params, query, fragment, _coerce_result = (
-                                                  _coerce_args(*components))
-    if params:
-        url = "%s;%s" % (url, params)
-    return _coerce_result(urlunsplit((scheme, netloc, url, query, fragment)))
-
-def urlunsplit(components):
-    """Combine the elements of a tuple as returned by urlsplit() into a
-    complete URL as a string. The data argument can be any five-item iterable.
-    This may result in a slightly different, but equivalent URL, if the URL that
-    was parsed originally had unnecessary delimiters (for example, a ? with an
-    empty query; the RFC states that these are equivalent)."""
-    scheme, netloc, url, query, fragment, _coerce_result = (
-                                          _coerce_args(*components))
-    if netloc or (scheme and scheme in uses_netloc and url[:2] != '//'):
-        if url and url[:1] != '/': url = '/' + url
-        url = '//' + (netloc or '') + url
-    if scheme:
-        url = scheme + ':' + url
-    if query:
-        url = url + '?' + query
-    if fragment:
-        url = url + '#' + fragment
-    return _coerce_result(url)
-
-def urljoin(base, url, allow_fragments=True):
-    """Join a base URL and a possibly relative URL to form an absolute
-    interpretation of the latter."""
-    if not base:
-        return url
-    if not url:
-        return base
-    base, url, _coerce_result = _coerce_args(base, url)
-    bscheme, bnetloc, bpath, bparams, bquery, bfragment = \
-            urlparse(base, '', allow_fragments)
-    scheme, netloc, path, params, query, fragment = \
-            urlparse(url, bscheme, allow_fragments)
-    if scheme != bscheme or scheme not in uses_relative:
-        return _coerce_result(url)
-    if scheme in uses_netloc:
-        if netloc:
-            return _coerce_result(urlunparse((scheme, netloc, path,
-                                              params, query, fragment)))
-        netloc = bnetloc
-    if path[:1] == '/':
-        return _coerce_result(urlunparse((scheme, netloc, path,
-                                          params, query, fragment)))
-    if not path and not params:
-        path = bpath
-        params = bparams
-        if not query:
-            query = bquery
-        return _coerce_result(urlunparse((scheme, netloc, path,
-                                          params, query, fragment)))
-    segments = bpath.split('/')[:-1] + path.split('/')
-    # XXX The stuff below is bogus in various ways...
-    if segments[-1] == '.':
-        segments[-1] = ''
-    while '.' in segments:
-        segments.remove('.')
-    while 1:
-        i = 1
-        n = len(segments) - 1
-        while i < n:
-            if (segments[i] == '..'
-                and segments[i-1] not in ('', '..')):
-                del segments[i-1:i+1]
-                break
-            i = i+1
-        else:
-            break
-    if segments == ['', '..']:
-        segments[-1] = ''
-    elif len(segments) >= 2 and segments[-1] == '..':
-        segments[-2:] = ['']
-    return _coerce_result(urlunparse((scheme, netloc, '/'.join(segments),
-                                      params, query, fragment)))
-
-def urldefrag(url):
-    """Removes any existing fragment from URL.
-
-    Returns a tuple of the defragmented URL and the fragment.  If
-    the URL contained no fragments, the second element is the
-    empty string.
-    """
-    url, _coerce_result = _coerce_args(url)
-    if '#' in url:
-        s, n, p, a, q, frag = urlparse(url)
-        defrag = urlunparse((s, n, p, a, q, ''))
-    else:
-        frag = ''
-        defrag = url
-    return _coerce_result(DefragResult(defrag, frag))
-
-def unquote_to_bytes(string):
-    """unquote_to_bytes('abc%20def') -> b'abc def'."""
-    # Note: strings are encoded as UTF-8. This is only an issue if it contains
-    # unescaped non-ASCII characters, which URIs should not.
-    if not string:
-        # Is it a string-like object?
-        string.split
-        return b''
-    if isinstance(string, str):
-        string = string.encode('utf-8')
-    res = string.split(b'%')
-    if len(res) == 1:
-        return string
-    string = res[0]
-    for item in res[1:]:
-        try:
-            string += bytes([int(item[:2], 16)]) + item[2:]
-        except ValueError:
-            string += b'%' + item
-    return string
-
-def unquote(string, encoding='utf-8', errors='replace'):
-    """Replace %xx escapes by their single-character equivalent. The optional
-    encoding and errors parameters specify how to decode percent-encoded
-    sequences into Unicode characters, as accepted by the bytes.decode()
-    method.
-    By default, percent-encoded sequences are decoded with UTF-8, and invalid
-    sequences are replaced by a placeholder character.
-
-    unquote('abc%20def') -> 'abc def'.
-    """
-    if string == '':
-        return string
-    res = string.split('%')
-    if len(res) == 1:
-        return string
-    if encoding is None:
-        encoding = 'utf-8'
-    if errors is None:
-        errors = 'replace'
-    # pct_sequence: contiguous sequence of percent-encoded bytes, decoded
-    pct_sequence = b''
-    string = res[0]
-    for item in res[1:]:
-        try:
-            if not item:
-                raise ValueError
-            pct_sequence += bytes.fromhex(item[:2])
-            rest = item[2:]
-            if not rest:
-                # This segment was just a single percent-encoded character.
-                # May be part of a sequence of code units, so delay decoding.
-                # (Stored in pct_sequence).
-                continue
-        except ValueError:
-            rest = '%' + item
-        # Encountered non-percent-encoded characters. Flush the current
-        # pct_sequence.
-        string += pct_sequence.decode(encoding, errors) + rest
-        pct_sequence = b''
-    if pct_sequence:
-        # Flush the final pct_sequence
-        string += pct_sequence.decode(encoding, errors)
-    return string
-
-def parse_qs(qs, keep_blank_values=False, strict_parsing=False,
-             encoding='utf-8', errors='replace'):
-    """Parse a query given as a string argument.
-
-        Arguments:
-
-        qs: percent-encoded query string to be parsed
-
-        keep_blank_values: flag indicating whether blank values in
-            percent-encoded queries should be treated as blank strings.
-            A true value indicates that blanks should be retained as
-            blank strings.  The default false value indicates that
-            blank values are to be ignored and treated as if they were
-            not included.
-
-        strict_parsing: flag indicating what to do with parsing errors.
-            If false (the default), errors are silently ignored.
-            If true, errors raise a ValueError exception.
-
-        encoding and errors: specify how to decode percent-encoded sequences
-            into Unicode characters, as accepted by the bytes.decode() method.
-    """
-    dict = {}
-    pairs = parse_qsl(qs, keep_blank_values, strict_parsing,
-                      encoding=encoding, errors=errors)
-    for name, value in pairs:
-        if name in dict:
-            dict[name].append(value)
-        else:
-            dict[name] = [value]
-    return dict
-
-def parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
-              encoding='utf-8', errors='replace'):
-    """Parse a query given as a string argument.
-
-    Arguments:
-
-    qs: percent-encoded query string to be parsed
-
-    keep_blank_values: flag indicating whether blank values in
-        percent-encoded queries should be treated as blank strings.  A
-        true value indicates that blanks should be retained as blank
-        strings.  The default false value indicates that blank values
-        are to be ignored and treated as if they were  not included.
-
-    strict_parsing: flag indicating what to do with parsing errors. If
-        false (the default), errors are silently ignored. If true,
-        errors raise a ValueError exception.
-
-    encoding and errors: specify how to decode percent-encoded sequences
-        into Unicode characters, as accepted by the bytes.decode() method.
-
-    Returns a list, as G-d intended.
-    """
-    qs, _coerce_result = _coerce_args(qs)
-    pairs = []
-    for s1 in qs.split('&'):
-        for s2 in s1.split(';'):
-            pairs.append(s2)
-    r = []
-    for name_value in pairs:
-        if not name_value and not strict_parsing:
-            continue
-        nv = name_value.split('=', 1)
-        if len(nv) != 2:
-            if strict_parsing:
-                raise ValueError("bad query field: %r" % (name_value,))
-            # Handle case of a control-name with no equal sign
-            if keep_blank_values:
-                nv.append('')
-            else:
-                continue
-        if len(nv[1]) or keep_blank_values:
-            name = nv[0].replace('+', ' ')
-            name = unquote(name, encoding=encoding, errors=errors)
-            name = _coerce_result(name)
-            value = nv[1].replace('+', ' ')
-            value = unquote(value, encoding=encoding, errors=errors)
-            value = _coerce_result(value)
-            r.append((name, value))
-    return r
-
-def unquote_plus(string, encoding='utf-8', errors='replace'):
-    """Like unquote(), but also replace plus signs by spaces, as required for
-    unquoting HTML form values.
-
-    unquote_plus('%7e/abc+def') -> '~/abc def'
-    """
-    string = string.replace('+', ' ')
-    return unquote(string, encoding, errors)
-
-_ALWAYS_SAFE = frozenset(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-                         b'abcdefghijklmnopqrstuvwxyz'
-                         b'0123456789'
-                         b'_.-')
-_ALWAYS_SAFE_BYTES = bytes(_ALWAYS_SAFE)
-_safe_quoters = {}
-
-class Quoter(collections.defaultdict):
-    """A mapping from bytes (in range(0,256)) to strings.
-
-    String values are percent-encoded byte values, unless the key < 128, and
-    in the "safe" set (either the specified safe set, or default set).
-    """
-    # Keeps a cache internally, using defaultdict, for efficiency (lookups
-    # of cached keys don't call Python code at all).
-    def __init__(self, safe):
-        """safe: bytes object."""
-        self.safe = _ALWAYS_SAFE.union(safe)
-
-    def __repr__(self):
-        # Without this, will just display as a defaultdict
-        return "<Quoter %r>" % dict(self)
-
-    def __missing__(self, b):
-        # Handle a cache miss. Store quoted string in cache and return.
-        res = chr(b) if b in self.safe else '%{:02X}'.format(b)
-        self[b] = res
-        return res
-
-def quote(string, safe='/', encoding=None, errors=None):
-    """quote('abc def') -> 'abc%20def'
-
-    Each part of a URL, e.g. the path info, the query, etc., has a
-    different set of reserved characters that must be quoted.
-
-    RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax lists
-    the following reserved characters.
-
-    reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
-                  "$" | ","
-
-    Each of these characters is reserved in some component of a URL,
-    but not necessarily in all of them.
-
-    By default, the quote function is intended for quoting the path
-    section of a URL.  Thus, it will not encode '/'.  This character
-    is reserved, but in typical usage the quote function is being
-    called on a path where the existing slash characters are used as
-    reserved characters.
-
-    string and safe may be either str or bytes objects. encoding must
-    not be specified if string is a str.
-
-    The optional encoding and errors parameters specify how to deal with
-    non-ASCII characters, as accepted by the str.encode method.
-    By default, encoding='utf-8' (characters are encoded with UTF-8), and
-    errors='strict' (unsupported characters raise a UnicodeEncodeError).
-    """
-    if isinstance(string, str):
-        if not string:
-            return string
-        if encoding is None:
-            encoding = 'utf-8'
-        if errors is None:
-            errors = 'strict'
-        string = string.encode(encoding, errors)
-    else:
-        if encoding is not None:
-            raise TypeError("quote() doesn't support 'encoding' for bytes")
-        if errors is not None:
-            raise TypeError("quote() doesn't support 'errors' for bytes")
-    return quote_from_bytes(string, safe)
-
-def quote_plus(string, safe='', encoding=None, errors=None):
-    """Like quote(), but also replace ' ' with '+', as required for quoting
-    HTML form values. Plus signs in the original string are escaped unless
-    they are included in safe. It also does not have safe default to '/'.
-    """
-    # Check if ' ' in string, where string may either be a str or bytes.  If
-    # there are no spaces, the regular quote will produce the right answer.
-    if ((isinstance(string, str) and ' ' not in string) or
-        (isinstance(string, bytes) and b' ' not in string)):
-        return quote(string, safe, encoding, errors)
-    if isinstance(safe, str):
-        space = ' '
-    else:
-        space = b' '
-    string = quote(string, safe + space, encoding, errors)
-    return string.replace(' ', '+')
-
-def quote_from_bytes(bs, safe='/'):
-    """Like quote(), but accepts a bytes object rather than a str, and does
-    not perform string-to-bytes encoding.  It always returns an ASCII string.
-    quote_from_bytes(b'abc def\xab') -> 'abc%20def%AB'
-    """
-    if not isinstance(bs, (bytes, bytearray)):
-        raise TypeError("quote_from_bytes() expected bytes")
-    if not bs:
-        return ''
-    if isinstance(safe, str):
-        # Normalize 'safe' by converting to bytes and removing non-ASCII chars
-        safe = safe.encode('ascii', 'ignore')
-    else:
-        safe = bytes([c for c in safe if c < 128])
-    if not bs.rstrip(_ALWAYS_SAFE_BYTES + safe):
-        return bs.decode()
-    try:
-        quoter = _safe_quoters[safe]
-    except KeyError:
-        _safe_quoters[safe] = quoter = Quoter(safe).__getitem__
-    return ''.join([quoter(char) for char in bs])
-
-def urlencode(query, doseq=False, safe='', encoding=None, errors=None):
-    """Encode a sequence of two-element tuples or dictionary into a URL query string.
-
-    If any values in the query arg are sequences and doseq is true, each
-    sequence element is converted to a separate parameter.
-
-    If the query arg is a sequence of two-element tuples, the order of the
-    parameters in the output will match the order of parameters in the
-    input.
-
-    The query arg may be either a string or a bytes type. When query arg is a
-    string, the safe, encoding and error parameters are sent the quote_plus for
-    encoding.
-    """
-
-    if hasattr(query, "items"):
-        query = query.items()
-    else:
-        # It's a bother at times that strings and string-like objects are
-        # sequences.
-        try:
-            # non-sequence items should not work with len()
-            # non-empty strings will fail this
-            if len(query) and not isinstance(query[0], tuple):
-                raise TypeError
-            # Zero-length sequences of all types will get here and succeed,
-            # but that's a minor nit.  Since the original implementation
-            # allowed empty dicts that type of behavior probably should be
-            # preserved for consistency
-        except TypeError:
-            ty, va, tb = sys.exc_info()
-            raise TypeError("not a valid non-string sequence "
-                            "or mapping object").with_traceback(tb)
-
-    l = []
-    if not doseq:
-        for k, v in query:
-            if isinstance(k, bytes):
-                k = quote_plus(k, safe)
-            else:
-                k = quote_plus(str(k), safe, encoding, errors)
-
-            if isinstance(v, bytes):
-                v = quote_plus(v, safe)
-            else:
-                v = quote_plus(str(v), safe, encoding, errors)
-            l.append(k + '=' + v)
-    else:
-        for k, v in query:
-            if isinstance(k, bytes):
-                k = quote_plus(k, safe)
-            else:
-                k = quote_plus(str(k), safe, encoding, errors)
-
-            if isinstance(v, bytes):
-                v = quote_plus(v, safe)
-                l.append(k + '=' + v)
-            elif isinstance(v, str):
-                v = quote_plus(v, safe, encoding, errors)
-                l.append(k + '=' + v)
-            else:
-                try:
-                    # Is this a sufficient test for sequence-ness?
-                    x = len(v)
-                except TypeError:
-                    # not a sequence
-                    v = quote_plus(str(v), safe, encoding, errors)
-                    l.append(k + '=' + v)
-                else:
-                    # loop over the sequence
-                    for elt in v:
-                        if isinstance(elt, bytes):
-                            elt = quote_plus(elt, safe)
-                        else:
-                            elt = quote_plus(str(elt), safe, encoding, errors)
-                        l.append(k + '=' + elt)
-    return '&'.join(l)
-
-# Utilities to parse URLs (most of these return None for missing parts):
-# unwrap('<URL:type://host/path>') --> 'type://host/path'
-# splittype('type:opaquestring') --> 'type', 'opaquestring'
-# splithost('//host[:port]/path') --> 'host[:port]', '/path'
-# splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'
-# splitpasswd('user:passwd') -> 'user', 'passwd'
-# splitport('host:port') --> 'host', 'port'
-# splitquery('/path?query') --> '/path', 'query'
-# splittag('/path#tag') --> '/path', 'tag'
-# splitattr('/path;attr1=value1;attr2=value2;...') ->
-#   '/path', ['attr1=value1', 'attr2=value2', ...]
-# splitvalue('attr=value') --> 'attr', 'value'
-# urllib.parse.unquote('abc%20def') -> 'abc def'
-# quote('abc def') -> 'abc%20def')
-
-def to_bytes(url):
-    """to_bytes(u"URL") --> 'URL'."""
-    # Most URL schemes require ASCII. If that changes, the conversion
-    # can be relaxed.
-    # XXX get rid of to_bytes()
-    if isinstance(url, str):
-        try:
-            url = url.encode("ASCII").decode()
-        except UnicodeError:
-            raise UnicodeError("URL " + repr(url) +
-                               " contains non-ASCII characters")
-    return url
-
-def unwrap(url):
-    """unwrap('<URL:type://host/path>') --> 'type://host/path'."""
-    url = str(url).strip()
-    if url[:1] == '<' and url[-1:] == '>':
-        url = url[1:-1].strip()
-    if url[:4] == 'URL:': url = url[4:].strip()
-    return url
-
-_typeprog = None
-def splittype(url):
-    """splittype('type:opaquestring') --> 'type', 'opaquestring'."""
-    global _typeprog
-    if _typeprog is None:
-        import re
-        _typeprog = re.compile('^([^/:]+):')
-
-    match = _typeprog.match(url)
-    if match:
-        scheme = match.group(1)
-        return scheme.lower(), url[len(scheme) + 1:]
-    return None, url
-
-_hostprog = None
-def splithost(url):
-    """splithost('//host[:port]/path') --> 'host[:port]', '/path'."""
-    global _hostprog
-    if _hostprog is None:
-        import re
-        _hostprog = re.compile('^//([^/?]*)(.*)$')
-
-    match = _hostprog.match(url)
-    if match:
-        host_port = match.group(1)
-        path = match.group(2)
-        if path and not path.startswith('/'):
-            path = '/' + path
-        return host_port, path
-    return None, url
-
-_userprog = None
-def splituser(host):
-    """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
-    global _userprog
-    if _userprog is None:
-        import re
-        _userprog = re.compile('^(.*)@(.*)$')
-
-    match = _userprog.match(host)
-    if match: return match.group(1, 2)
-    return None, host
-
-_passwdprog = None
-def splitpasswd(user):
-    """splitpasswd('user:passwd') -> 'user', 'passwd'."""
-    global _passwdprog
-    if _passwdprog is None:
-        import re
-        _passwdprog = re.compile('^([^:]*):(.*)$',re.S)
-
-    match = _passwdprog.match(user)
-    if match: return match.group(1, 2)
-    return user, None
-
-# splittag('/path#tag') --> '/path', 'tag'
-_portprog = None
-def splitport(host):
-    """splitport('host:port') --> 'host', 'port'."""
-    global _portprog
-    if _portprog is None:
-        import re
-        _portprog = re.compile('^(.*):([0-9]+)$')
-
-    match = _portprog.match(host)
-    if match: return match.group(1, 2)
-    return host, None
-
-_nportprog = None
-def splitnport(host, defport=-1):
-    """Split host and port, returning numeric port.
-    Return given default port if no ':' found; defaults to -1.
-    Return numerical port if a valid number are found after ':'.
-    Return None if ':' but not a valid number."""
-    global _nportprog
-    if _nportprog is None:
-        import re
-        _nportprog = re.compile('^(.*):(.*)$')
-
-    match = _nportprog.match(host)
-    if match:
-        host, port = match.group(1, 2)
-        try:
-            if not port: raise ValueError("no digits")
-            nport = int(port)
-        except ValueError:
-            nport = None
-        return host, nport
-    return host, defport
-
-_queryprog = None
-def splitquery(url):
-    """splitquery('/path?query') --> '/path', 'query'."""
-    global _queryprog
-    if _queryprog is None:
-        import re
-        _queryprog = re.compile('^(.*)\?([^?]*)$')
-
-    match = _queryprog.match(url)
-    if match: return match.group(1, 2)
-    return url, None
-
-_tagprog = None
-def splittag(url):
-    """splittag('/path#tag') --> '/path', 'tag'."""
-    global _tagprog
-    if _tagprog is None:
-        import re
-        _tagprog = re.compile('^(.*)#([^#]*)$')
-
-    match = _tagprog.match(url)
-    if match: return match.group(1, 2)
-    return url, None
-
-def splitattr(url):
-    """splitattr('/path;attr1=value1;attr2=value2;...') ->
-        '/path', ['attr1=value1', 'attr2=value2', ...]."""
-    words = url.split(';')
-    return words[0], words[1:]
-
-_valueprog = None
-def splitvalue(attr):
-    """splitvalue('attr=value') --> 'attr', 'value'."""
-    global _valueprog
-    if _valueprog is None:
-        import re
-        _valueprog = re.compile('^([^=]*)=(.*)$')
-
-    match = _valueprog.match(attr)
-    if match: return match.group(1, 2)
-    return attr, None
diff --git a/test-data/stdlib-samples/3.2/posixpath.py b/test-data/stdlib-samples/3.2/posixpath.py
deleted file mode 100644
index cf5d59e..0000000
--- a/test-data/stdlib-samples/3.2/posixpath.py
+++ /dev/null
@@ -1,466 +0,0 @@
-"""Common operations on Posix pathnames.
-
-Instead of importing this module directly, import os and refer to
-this module as os.path.  The "os.path" name is an alias for this
-module on Posix systems; on other systems (e.g. Mac, Windows),
-os.path provides the same operations in a manner specific to that
-platform, and is an alias to another module (e.g. macpath, ntpath).
-
-Some of this can actually be useful on non-Posix systems too, e.g.
-for manipulation of the pathname component of URLs.
-"""
-
-import os
-import sys
-import stat
-import genericpath
-from genericpath import *
-
-from typing import (
-    Tuple, BinaryIO, TextIO, Pattern, AnyStr, List, Set, Any, Union, cast
-)
-
-__all__ = ["normcase","isabs","join","splitdrive","split","splitext",
-           "basename","dirname","commonprefix","getsize","getmtime",
-           "getatime","getctime","islink","exists","lexists","isdir","isfile",
-           "ismount", "expanduser","expandvars","normpath","abspath",
-           "samefile","sameopenfile","samestat",
-           "curdir","pardir","sep","pathsep","defpath","altsep","extsep",
-           "devnull","realpath","supports_unicode_filenames","relpath"]
-
-# Strings representing various path-related bits and pieces.
-# These are primarily for export; internally, they are hardcoded.
-curdir = '.'
-pardir = '..'
-extsep = '.'
-sep = '/'
-pathsep = ':'
-defpath = ':/bin:/usr/bin'
-altsep = None # type: str
-devnull = '/dev/null'
-
-def _get_sep(path: AnyStr) -> AnyStr:
-    if isinstance(path, bytes):
-        return b'/'
-    else:
-        return '/'
-
-# Normalize the case of a pathname.  Trivial in Posix, string.lower on Mac.
-# On MS-DOS this may also turn slashes into backslashes; however, other
-# normalizations (such as optimizing '../' away) are not allowed
-# (another function should be defined to do that).
-
-def normcase(s: AnyStr) -> AnyStr:
-    """Normalize case of pathname.  Has no effect under Posix"""
-    # TODO: on Mac OS X, this should really return s.lower().
-    if not isinstance(s, (bytes, str)):
-        raise TypeError("normcase() argument must be str or bytes, "
-                        "not '{}'".format(s.__class__.__name__))
-    return cast(AnyStr, s)
-
-
-# Return whether a path is absolute.
-# Trivial in Posix, harder on the Mac or MS-DOS.
-
-def isabs(s: AnyStr) -> bool:
-    """Test whether a path is absolute"""
-    sep = _get_sep(s)
-    return s.startswith(sep)
-
-
-# Join pathnames.
-# Ignore the previous parts if a part is absolute.
-# Insert a '/' unless the first part is empty or already ends in '/'.
-
-def join(a: AnyStr, *p: AnyStr) -> AnyStr:
-    """Join two or more pathname components, inserting '/' as needed.
-    If any component is an absolute path, all previous path components
-    will be discarded."""
-    sep = _get_sep(a)
-    path = a
-    for b in p:
-        if b.startswith(sep):
-            path = b
-        elif not path or path.endswith(sep):
-            path +=  b
-        else:
-            path += sep + b
-    return path
-
-
-# Split a path in head (everything up to the last '/') and tail (the
-# rest).  If the path ends in '/', tail will be empty.  If there is no
-# '/' in the path, head  will be empty.
-# Trailing '/'es are stripped from head unless it is the root.
-
-def split(p: AnyStr) -> Tuple[AnyStr, AnyStr]:
-    """Split a pathname.  Returns tuple "(head, tail)" where "tail" is
-    everything after the final slash.  Either part may be empty."""
-    sep = _get_sep(p)
-    i = p.rfind(sep) + 1
-    head, tail = p[:i], p[i:]
-    if head and head != sep*len(head):
-        head = head.rstrip(sep)
-    return head, tail
-
-
-# Split a path in root and extension.
-# The extension is everything starting at the last dot in the last
-# pathname component; the root is everything before that.
-# It is always true that root + ext == p.
-
-def splitext(p: AnyStr) -> Tuple[AnyStr, AnyStr]:
-    if isinstance(p, bytes):
-        sep = b'/'
-        extsep = b'.'
-    else:
-        sep = '/'
-        extsep = '.'
-    return genericpath._splitext(p, sep, None, extsep)
-splitext.__doc__ = genericpath._splitext.__doc__
-
-# Split a pathname into a drive specification and the rest of the
-# path.  Useful on DOS/Windows/NT; on Unix, the drive is always empty.
-
-def splitdrive(p: AnyStr) -> Tuple[AnyStr, AnyStr]:
-    """Split a pathname into drive and path. On Posix, drive is always
-    empty."""
-    return p[:0], p
-
-
-# Return the tail (basename) part of a path, same as split(path)[1].
-
-def basename(p: AnyStr) -> AnyStr:
-    """Returns the final component of a pathname"""
-    sep = _get_sep(p)
-    i = p.rfind(sep) + 1
-    return p[i:]
-
-
-# Return the head (dirname) part of a path, same as split(path)[0].
-
-def dirname(p: AnyStr) -> AnyStr:
-    """Returns the directory component of a pathname"""
-    sep = _get_sep(p)
-    i = p.rfind(sep) + 1
-    head = p[:i]
-    if head and head != sep*len(head):
-        head = head.rstrip(sep)
-    return head
-
-
-# Is a path a symbolic link?
-# This will always return false on systems where os.lstat doesn't exist.
-
-def islink(path: AnyStr) -> bool:
-    """Test whether a path is a symbolic link"""
-    try:
-        st = os.lstat(path)
-    except (os.error, AttributeError):
-        return False
-    return stat.S_ISLNK(st.st_mode)
-
-# Being true for dangling symbolic links is also useful.
-
-def lexists(path: AnyStr) -> bool:
-    """Test whether a path exists.  Returns True for broken symbolic links"""
-    try:
-        os.lstat(path)
-    except os.error:
-        return False
-    return True
-
-
-# Are two filenames really pointing to the same file?
-
-def samefile(f1: AnyStr, f2: AnyStr) -> bool:
-    """Test whether two pathnames reference the same actual file"""
-    s1 = os.stat(f1)
-    s2 = os.stat(f2)
-    return samestat(s1, s2)
-
-
-# Are two open files really referencing the same file?
-# (Not necessarily the same file descriptor!)
-
-def sameopenfile(fp1: int, fp2: int) -> bool:
-    """Test whether two open file objects reference the same file"""
-    s1 = os.fstat(fp1)
-    s2 = os.fstat(fp2)
-    return samestat(s1, s2)
-
-
-# Are two stat buffers (obtained from stat, fstat or lstat)
-# describing the same file?
-
-def samestat(s1: os.stat_result, s2: os.stat_result) -> bool:
-    """Test whether two stat buffers reference the same file"""
-    return s1.st_ino == s2.st_ino and \
-           s1.st_dev == s2.st_dev
-
-
-# Is a path a mount point?
-# (Does this work for all UNIXes?  Is it even guaranteed to work by Posix?)
-
-def ismount(path: AnyStr) -> bool:
-    """Test whether a path is a mount point"""
-    if islink(path):
-        # A symlink can never be a mount point
-        return False
-    try:
-        s1 = os.lstat(path)
-        if isinstance(path, bytes):
-            parent = join(path, b'..')
-        else:
-            parent = join(path, '..')
-        s2 = os.lstat(parent)
-    except os.error:
-        return False # It doesn't exist -- so not a mount point :-)
-    dev1 = s1.st_dev
-    dev2 = s2.st_dev
-    if dev1 != dev2:
-        return True     # path/.. on a different device as path
-    ino1 = s1.st_ino
-    ino2 = s2.st_ino
-    if ino1 == ino2:
-        return True     # path/.. is the same i-node as path
-    return False
-
-
-# Expand paths beginning with '~' or '~user'.
-# '~' means $HOME; '~user' means that user's home directory.
-# If the path doesn't begin with '~', or if the user or $HOME is unknown,
-# the path is returned unchanged (leaving error reporting to whatever
-# function is called with the expanded path as argument).
-# See also module 'glob' for expansion of *, ? and [...] in pathnames.
-# (A function should also be defined to do full *sh-style environment
-# variable expansion.)
-
-def expanduser(path: AnyStr) -> AnyStr:
-    """Expand ~ and ~user constructions.  If user or $HOME is unknown,
-    do nothing."""
-    if isinstance(path, bytes):
-        tilde = b'~'
-    else:
-        tilde = '~'
-    if not path.startswith(tilde):
-        return path
-    sep = _get_sep(path)
-    i = path.find(sep, 1)
-    if i < 0:
-        i = len(path)
-    if i == 1:
-        userhome = None  # type: Union[str, bytes]
-        if 'HOME' not in os.environ:
-            import pwd
-            userhome = pwd.getpwuid(os.getuid()).pw_dir
-        else:
-            userhome = os.environ['HOME']
-    else:
-        import pwd
-        name = path[1:i]  # type: Union[str, bytes]
-        if isinstance(name, bytes):
-            name = str(name, 'ASCII')
-        try:
-            pwent = pwd.getpwnam(name)
-        except KeyError:
-            return path
-        userhome = pwent.pw_dir
-    if isinstance(path, bytes):
-        userhome = os.fsencode(userhome)
-        root = b'/'
-    else:
-        root = '/'
-    userhome = userhome.rstrip(root)
-    return (userhome + path[i:]) or root
-
-
-# Expand paths containing shell variable substitutions.
-# This expands the forms $variable and ${variable} only.
-# Non-existent variables are left unchanged.
-
-_varprog = None # type: Pattern[str]
-_varprogb = None # type: Pattern[bytes]
-
-def expandvars(path: AnyStr) -> AnyStr:
-    """Expand shell variables of form $var and ${var}.  Unknown variables
-    are left unchanged."""
-    global _varprog, _varprogb
-    if isinstance(path, bytes):
-        if b'$' not in path:
-            return path
-        if not _varprogb:
-            import re
-            _varprogb = re.compile(br'\$(\w+|\{[^}]*\})', re.ASCII)
-        search = _varprogb.search
-        start = b'{'
-        end = b'}'
-    else:
-        if '$' not in path:
-            return path
-        if not _varprog:
-            import re
-            _varprog = re.compile(r'\$(\w+|\{[^}]*\})', re.ASCII)
-        search = _varprog.search
-        start = '{'
-        end = '}'
-    i = 0
-    while True:
-        m = search(path, i)
-        if not m:
-            break
-        i, j = m.span(0)
-        name = None  # type: Union[str, bytes]
-        name = m.group(1)
-        if name.startswith(start) and name.endswith(end):
-            name = name[1:-1]
-        if isinstance(name, bytes):
-            name = str(name, 'ASCII')
-        if name in os.environ:
-            tail = path[j:]
-            value = None  # type: Union[str, bytes]
-            value = os.environ[name]
-            if isinstance(path, bytes):
-                value = value.encode('ASCII')
-            path = path[:i] + value
-            i = len(path)
-            path += tail
-        else:
-            i = j
-    return path
-
-
-# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B.
-# It should be understood that this may change the meaning of the path
-# if it contains symbolic links!
-
-def normpath(path: AnyStr) -> AnyStr:
-    """Normalize path, eliminating double slashes, etc."""
-    if isinstance(path, bytes):
-        sep = b'/'
-        empty = b''
-        dot = b'.'
-        dotdot = b'..'
-    else:
-        sep = '/'
-        empty = ''
-        dot = '.'
-        dotdot = '..'
-    if path == empty:
-        return dot
-    initial_slashes = path.startswith(sep) # type: int
-    # POSIX allows one or two initial slashes, but treats three or more
-    # as single slash.
-    if (initial_slashes and
-        path.startswith(sep*2) and not path.startswith(sep*3)):
-        initial_slashes = 2
-    comps = path.split(sep)
-    new_comps = []  # type: List[AnyStr]
-    for comp in comps:
-        if comp in (empty, dot):
-            continue
-        if (comp != dotdot or (not initial_slashes and not new_comps) or
-             (new_comps and new_comps[-1] == dotdot)):
-            new_comps.append(comp)
-        elif new_comps:
-            new_comps.pop()
-    comps = new_comps
-    path = sep.join(comps)
-    if initial_slashes:
-        path = sep*initial_slashes + path
-    return path or dot
-
-
-def abspath(path: AnyStr) -> AnyStr:
-    """Return an absolute path."""
-    if not isabs(path):
-        if isinstance(path, bytes):
-            cwd = os.getcwdb()
-        else:
-            cwd = os.getcwd()
-        path = join(cwd, path)
-    return normpath(path)
-
-
-# Return a canonical path (i.e. the absolute location of a file on the
-# filesystem).
-
-def realpath(filename: AnyStr) -> AnyStr:
-    """Return the canonical path of the specified filename, eliminating any
-symbolic links encountered in the path."""
-    if isinstance(filename, bytes):
-        sep = b'/'
-        empty = b''
-    else:
-        sep = '/'
-        empty = ''
-    if isabs(filename):
-        bits = [sep] + filename.split(sep)[1:]
-    else:
-        bits = [empty] + filename.split(sep)
-
-    for i in range(2, len(bits)+1):
-        component = join(*bits[0:i])
-        # Resolve symbolic links.
-        if islink(component):
-            resolved = _resolve_link(component)
-            if resolved is None:
-                # Infinite loop -- return original component + rest of the path
-                return abspath(join(*([component] + bits[i:])))
-            else:
-                newpath = join(*([resolved] + bits[i:]))
-                return realpath(newpath)
-
-    return abspath(filename)
-
-
-def _resolve_link(path: AnyStr) -> AnyStr:
-    """Internal helper function.  Takes a path and follows symlinks
-    until we either arrive at something that isn't a symlink, or
-    encounter a path we've seen before (meaning that there's a loop).
-    """
-    paths_seen = set()  # type: Set[AnyStr]
-    while islink(path):
-        if path in paths_seen:
-            # Already seen this path, so we must have a symlink loop
-            return None
-        paths_seen.add(path)
-        # Resolve where the link points to
-        resolved = os.readlink(path)
-        if not isabs(resolved):
-            dir = dirname(path)
-            path = normpath(join(dir, resolved))
-        else:
-            path = normpath(resolved)
-    return path
-
-supports_unicode_filenames = (sys.platform == 'darwin')
-
-def relpath(path: AnyStr, start: AnyStr = None) -> AnyStr:
-    """Return a relative version of a path"""
-
-    if not path:
-        raise ValueError("no path specified")
-
-    if isinstance(path, bytes):
-        curdir = b'.'
-        sep = b'/'
-        pardir = b'..'
-    else:
-        curdir = '.'
-        sep = '/'
-        pardir = '..'
-
-    if start is None:
-        start = curdir
-
-    start_list = [x for x in abspath(start).split(sep) if x]
-    path_list = [x for x in abspath(path).split(sep) if x]
-
-    # Work out how much of the filepath is shared by start and path.
-    i = len(commonprefix([start_list, path_list]))
-
-    rel_list = [pardir] * (len(start_list)-i) + path_list[i:]
-    if not rel_list:
-        return curdir
-    return join(*rel_list)
diff --git a/test-data/stdlib-samples/3.2/pprint.py b/test-data/stdlib-samples/3.2/pprint.py
deleted file mode 100644
index 650c1a3..0000000
--- a/test-data/stdlib-samples/3.2/pprint.py
+++ /dev/null
@@ -1,380 +0,0 @@
-#  Author:      Fred L. Drake, Jr.
-#               fdrake at acm.org
-#
-#  This is a simple little module I wrote to make life easier.  I didn't
-#  see anything quite like it in the library, though I may have overlooked
-#  something.  I wrote this when I was trying to read some heavily nested
-#  tuples with fairly non-descriptive content.  This is modeled very much
-#  after Lisp/Scheme - style pretty-printing of lists.  If you find it
-#  useful, thank small children who sleep at night.
-
-"""Support to pretty-print lists, tuples, & dictionaries recursively.
-
-Very simple, but useful, especially in debugging data structures.
-
-Classes
--------
-
-PrettyPrinter()
-    Handle pretty-printing operations onto a stream using a configured
-    set of formatting parameters.
-
-Functions
----------
-
-pformat()
-    Format a Python object into a pretty-printed representation.
-
-pprint()
-    Pretty-print a Python object to a stream [default is sys.stdout].
-
-saferepr()
-    Generate a 'standard' repr()-like value, but protect against recursive
-    data structures.
-
-"""
-
-import sys as _sys
-from collections import OrderedDict as _OrderedDict
-from io import StringIO as _StringIO
-
-from typing import Any, Tuple, Dict, TextIO, cast, List
-
-__all__ = ["pprint","pformat","isreadable","isrecursive","saferepr",
-           "PrettyPrinter"]
-
-# cache these for faster access:
-_commajoin = ", ".join
-_id = id
-_len = len
-_type = type
-
-
-def pprint(object: object, stream: TextIO = None, indent: int = 1,
-           width: int = 80, depth: int = None) -> None:
-    """Pretty-print a Python object to a stream [default is sys.stdout]."""
-    printer = PrettyPrinter(
-        stream=stream, indent=indent, width=width, depth=depth)
-    printer.pprint(object)
-
-def pformat(object: object, indent: int = 1, width: int = 80,
-            depth: int = None) -> str:
-    """Format a Python object into a pretty-printed representation."""
-    return PrettyPrinter(indent=indent, width=width, depth=depth).pformat(object)
-
-def saferepr(object: object) -> str:
-    """Version of repr() which can handle recursive data structures."""
-    return _safe_repr(object, {}, None, 0)[0]
-
-def isreadable(object: object) -> bool:
-    """Determine if saferepr(object) is readable by eval()."""
-    return _safe_repr(object, {}, None, 0)[1]
-
-def isrecursive(object: object) -> bool:
-    """Determine if object requires a recursive representation."""
-    return _safe_repr(object, {}, None, 0)[2]
-
-class _safe_key:
-    """Helper function for key functions when sorting unorderable objects.
-
-    The wrapped-object will fallback to an Py2.x style comparison for
-    unorderable types (sorting first comparing the type name and then by
-    the obj ids).  Does not work recursively, so dict.items() must have
-    _safe_key applied to both the key and the value.
-
-    """
-
-    __slots__ = ['obj']
-
-    def __init__(self, obj: Any) -> None:
-        self.obj = obj
-
-    def __lt__(self, other: Any) -> Any:
-        rv = self.obj.__lt__(other.obj) # type: Any
-        if rv is NotImplemented:
-            rv = (str(type(self.obj)), id(self.obj)) < \
-                 (str(type(other.obj)), id(other.obj))
-        return rv
-
-def _safe_tuple(t: Tuple[Any, Any]) -> Tuple[_safe_key, _safe_key]:
-    "Helper function for comparing 2-tuples"
-    return _safe_key(t[0]), _safe_key(t[1])
-
-class PrettyPrinter:
-    def __init__(self, indent: int = 1, width: int = 80, depth: int = None,
-                 stream: TextIO = None) -> None:
-        """Handle pretty printing operations onto a stream using a set of
-        configured parameters.
-
-        indent
-            Number of spaces to indent for each level of nesting.
-
-        width
-            Attempted maximum number of columns in the output.
-
-        depth
-            The maximum depth to print out nested structures.
-
-        stream
-            The desired output stream.  If omitted (or false), the standard
-            output stream available at construction will be used.
-
-        """
-        indent = int(indent)
-        width = int(width)
-        assert indent >= 0, "indent must be >= 0"
-        assert depth is None or depth > 0, "depth must be > 0"
-        assert width, "width must be != 0"
-        self._depth = depth
-        self._indent_per_level = indent
-        self._width = width
-        if stream is not None:
-            self._stream = stream
-        else:
-            self._stream = _sys.stdout
-
-    def pprint(self, object: object) -> None:
-        self._format(object, self._stream, 0, 0, {}, 0)
-        self._stream.write("\n")
-
-    def pformat(self, object: object) -> str:
-        sio = _StringIO()
-        self._format(object, sio, 0, 0, {}, 0)
-        return sio.getvalue()
-
-    def isrecursive(self, object: object) -> int:
-        return self.format(object, {}, 0, 0)[2]
-
-    def isreadable(self, object: object) -> int:
-        s, readable, recursive = self.format(object, {}, 0, 0)
-        return readable and not recursive
-
-    def _format(self, object: object, stream: TextIO, indent: int,
-                allowance: int, context: Dict[int, int], level: int) -> None:
-        level = level + 1
-        objid = _id(object)
-        if objid in context:
-            stream.write(_recursion(object))
-            self._recursive = True
-            self._readable = False
-            return
-        rep = self._repr(object, context, level - 1)
-        typ = _type(object)
-        sepLines = _len(rep) > (self._width - 1 - indent - allowance)
-        write = stream.write
-
-        if self._depth and level > self._depth:
-            write(rep)
-            return
-
-        if sepLines:
-            r = getattr(typ, "__repr__", None)
-            if isinstance(object, dict):
-                write('{')
-                if self._indent_per_level > 1:
-                    write((self._indent_per_level - 1) * ' ')
-                length = _len(object)
-                if length:
-                    context[objid] = 1
-                    indent = indent + self._indent_per_level
-                    if issubclass(typ, _OrderedDict):
-                        items = list(object.items())
-                    else:
-                        items = sorted(object.items(), key=_safe_tuple)
-                    key, ent = items[0]
-                    rep = self._repr(key, context, level)
-                    write(rep)
-                    write(': ')
-                    self._format(ent, stream, indent + _len(rep) + 2,
-                                  allowance + 1, context, level)
-                    if length > 1:
-                        for key, ent in items[1:]:
-                            rep = self._repr(key, context, level)
-                            write(',\n%s%s: ' % (' '*indent, rep))
-                            self._format(ent, stream, indent + _len(rep) + 2,
-                                          allowance + 1, context, level)
-                    indent = indent - self._indent_per_level
-                    del context[objid]
-                write('}')
-                return
-
-            if ((issubclass(typ, list) and r is list.__repr__) or
-                (issubclass(typ, tuple) and r is tuple.__repr__) or
-                (issubclass(typ, set) and r is set.__repr__) or
-                (issubclass(typ, frozenset) and r is frozenset.__repr__)
-               ):
-                anyobj = cast(Any, object) # TODO Collection?
-                length = _len(anyobj)
-                if issubclass(typ, list):
-                    write('[')
-                    endchar = ']'
-                    lst = anyobj
-                elif issubclass(typ, set):
-                    if not length:
-                        write('set()')
-                        return
-                    write('{')
-                    endchar = '}'
-                    lst = sorted(anyobj, key=_safe_key)
-                elif issubclass(typ, frozenset):
-                    if not length:
-                        write('frozenset()')
-                        return
-                    write('frozenset({')
-                    endchar = '})'
-                    lst = sorted(anyobj, key=_safe_key)
-                    indent += 10
-                else:
-                    write('(')
-                    endchar = ')'
-                    lst = list(anyobj)
-                if self._indent_per_level > 1:
-                    write((self._indent_per_level - 1) * ' ')
-                if length:
-                    context[objid] = 1
-                    indent = indent + self._indent_per_level
-                    self._format(lst[0], stream, indent, allowance + 1,
-                                 context, level)
-                    if length > 1:
-                        for ent in lst[1:]:
-                            write(',\n' + ' '*indent)
-                            self._format(ent, stream, indent,
-                                          allowance + 1, context, level)
-                    indent = indent - self._indent_per_level
-                    del context[objid]
-                if issubclass(typ, tuple) and length == 1:
-                    write(',')
-                write(endchar)
-                return
-
-        write(rep)
-
-    def _repr(self, object: object, context: Dict[int, int],
-              level: int) -> str:
-        repr, readable, recursive = self.format(object, context.copy(),
-                                                self._depth, level)
-        if not readable:
-            self._readable = False
-        if recursive:
-            self._recursive = True
-        return repr
-
-    def format(self, object: object, context: Dict[int, int],
-               maxlevels: int, level: int) -> Tuple[str, int, int]:
-        """Format object for a specific context, returning a string
-        and flags indicating whether the representation is 'readable'
-        and whether the object represents a recursive construct.
-        """
-        return _safe_repr(object, context, maxlevels, level)
-
-
-# Return triple (repr_string, isreadable, isrecursive).
-
-def _safe_repr(object: object, context: Dict[int, int],
-               maxlevels: int, level: int) -> Tuple[str, bool, bool]:
-    typ = _type(object)
-    if typ is str:
-        s = cast(str, object)
-        if 'locale' not in _sys.modules:
-            return repr(object), True, False
-        if "'" in s and '"' not in s:
-            closure = '"'
-            quotes = {'"': '\\"'}
-        else:
-            closure = "'"
-            quotes = {"'": "\\'"}
-        qget = quotes.get
-        sio = _StringIO()
-        write = sio.write
-        for char in s:
-            if char.isalpha():
-                write(char)
-            else:
-                write(qget(char, repr(char)[1:-1]))
-        return ("%s%s%s" % (closure, sio.getvalue(), closure)), True, False
-
-    r = getattr(typ, "__repr__", None)
-    if issubclass(typ, dict) and r is dict.__repr__:
-        if not object:
-            return "{}", True, False
-        objid = _id(object)
-        if maxlevels and level >= maxlevels:
-            return "{...}", False, objid in context
-        if objid in context:
-            return _recursion(object), False, True
-        context[objid] = 1
-        readable = True
-        recursive = False
-        components = []  # type: List[str]
-        append = components.append
-        level += 1
-        saferepr = _safe_repr
-        items = sorted((cast(dict, object)).items(), key=_safe_tuple)
-        for k, v in items:
-            krepr, kreadable, krecur = saferepr(k, context, maxlevels, level)
-            vrepr, vreadable, vrecur = saferepr(v, context, maxlevels, level)
-            append("%s: %s" % (krepr, vrepr))
-            readable = readable and kreadable and vreadable
-            if krecur or vrecur:
-                recursive = True
-        del context[objid]
-        return "{%s}" % _commajoin(components), readable, recursive
-
-    if (issubclass(typ, list) and r is list.__repr__) or \
-       (issubclass(typ, tuple) and r is tuple.__repr__):
-        anyobj = cast(Any, object) # TODO Sequence?
-        if issubclass(typ, list):
-            if not object:
-                return "[]", True, False
-            format = "[%s]"
-        elif _len(anyobj) == 1:
-            format = "(%s,)"
-        else:
-            if not object:
-                return "()", True, False
-            format = "(%s)"
-        objid = _id(object)
-        if maxlevels and level >= maxlevels:
-            return format % "...", False, objid in context
-        if objid in context:
-            return _recursion(object), False, True
-        context[objid] = 1
-        readable = True
-        recursive = False
-        components = []
-        append = components.append
-        level += 1
-        for o in anyobj:
-            orepr, oreadable, orecur = _safe_repr(o, context, maxlevels, level)
-            append(orepr)
-            if not oreadable:
-                readable = False
-            if orecur:
-                recursive = True
-        del context[objid]
-        return format % _commajoin(components), readable, recursive
-
-    rep = repr(object)
-    return rep, bool(rep and not rep.startswith('<')), False
-
-
-def _recursion(object: object) -> str:
-    return ("<Recursion on %s with id=%s>"
-            % (_type(object).__name__, _id(object)))
-
-
-def _perfcheck(object: object = None) -> None:
-    import time
-    if object is None:
-        object = [("string", (1, 2), [3, 4], {5: 6, 7: 8})] * 100000
-    p = PrettyPrinter()
-    t1 = time.time()
-    _safe_repr(object, {}, None, 0)
-    t2 = time.time()
-    p.pformat(object)
-    t3 = time.time()
-    print("_safe_repr:", t2 - t1)
-    print("pformat:", t3 - t2)
-
-if __name__ == "__main__":
-    _perfcheck()
diff --git a/test-data/stdlib-samples/3.2/random.py b/test-data/stdlib-samples/3.2/random.py
deleted file mode 100644
index 8ce0a69..0000000
--- a/test-data/stdlib-samples/3.2/random.py
+++ /dev/null
@@ -1,743 +0,0 @@
-"""Random variable generators.
-
-    integers
-    --------
-           uniform within range
-
-    sequences
-    ---------
-           pick random element
-           pick random sample
-           generate random permutation
-
-    distributions on the real line:
-    ------------------------------
-           uniform
-           triangular
-           normal (Gaussian)
-           lognormal
-           negative exponential
-           gamma
-           beta
-           pareto
-           Weibull
-
-    distributions on the circle (angles 0 to 2pi)
-    ---------------------------------------------
-           circular uniform
-           von Mises
-
-General notes on the underlying Mersenne Twister core generator:
-
-* The period is 2**19937-1.
-* It is one of the most extensively tested generators in existence.
-* The random() method is implemented in C, executes in a single Python step,
-  and is, therefore, threadsafe.
-
-"""
-
-from warnings import warn as _warn
-from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType
-from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
-from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
-from os import urandom as _urandom
-from collections import Set as _Set, Sequence as _Sequence
-from hashlib import sha512 as _sha512
-
-from typing import (
-    Any, TypeVar, Iterable, Sequence, List, Callable, Set, cast, SupportsInt, Union
-)
-
-__all__ = ["Random","seed","random","uniform","randint","choice","sample",
-           "randrange","shuffle","normalvariate","lognormvariate",
-           "expovariate","vonmisesvariate","gammavariate","triangular",
-           "gauss","betavariate","paretovariate","weibullvariate",
-           "getstate","setstate", "getrandbits",
-           "SystemRandom"]
-
-NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
-TWOPI = 2.0*_pi
-LOG4 = _log(4.0)
-SG_MAGICCONST = 1.0 + _log(4.5)
-BPF = 53        # Number of bits in a float
-RECIP_BPF = 2**-BPF # type: float
-
-
-# Translated by Guido van Rossum from C source provided by
-# Adrian Baddeley.  Adapted by Raymond Hettinger for use with
-# the Mersenne Twister  and os.urandom() core generators.
-
-import _random
-
-T = TypeVar('T')
-
-class Random(_random.Random):
-    """Random number generator base class used by bound module functions.
-
-    Used to instantiate instances of Random to get generators that don't
-    share state.
-
-    Class Random can also be subclassed if you want to use a different basic
-    generator of your own devising: in that case, override the following
-    methods:  random(), seed(), getstate(), and setstate().
-    Optionally, implement a getrandbits() method so that randrange()
-    can cover arbitrarily large ranges.
-
-    """
-
-    VERSION = 3     # used by getstate/setstate
-    gauss_next = 0.0
-
-    def __init__(self, x: object = None) -> None:
-        """Initialize an instance.
-
-        Optional argument x controls seeding, as for Random.seed().
-        """
-
-        self.seed(x)
-        self.gauss_next = None
-
-    def seed(self, a: Any = None, version: int = 2) -> None:
-        """Initialize internal state from hashable object.
-
-        None or no argument seeds from current time or from an operating
-        system specific randomness source if available.
-
-        For version 2 (the default), all of the bits are used if *a *is a str,
-        bytes, or bytearray.  For version 1, the hash() of *a* is used instead.
-
-        If *a* is an int, all bits are used.
-
-        """
-
-        if a is None:
-            try:
-                a = int.from_bytes(_urandom(32), 'big')
-            except NotImplementedError:
-                import time
-                a = int(time.time() * 256) # use fractional seconds
-
-        if version == 2:
-            if isinstance(a, (str, bytes, bytearray)):
-                if isinstance(a, str):
-                    a = a.encode()
-                a += _sha512(a).digest()
-                a = int.from_bytes(a, 'big')
-
-        super().seed(a)
-        self.gauss_next = None
-
-    def getstate(self) -> tuple:
-        """Return internal state; can be passed to setstate() later."""
-        return self.VERSION, super().getstate(), self.gauss_next
-
-    def setstate(self, state: tuple) -> None:
-        """Restore internal state from object returned by getstate()."""
-        version = state[0]
-        if version == 3:
-            version, internalstate, self.gauss_next = state
-            super().setstate(internalstate)
-        elif version == 2:
-            version, internalstate, self.gauss_next = state
-            # In version 2, the state was saved as signed ints, which causes
-            #   inconsistencies between 32/64-bit systems. The state is
-            #   really unsigned 32-bit ints, so we convert negative ints from
-            #   version 2 to positive longs for version 3.
-            try:
-                internalstate = tuple(x % (2**32) for x in internalstate)
-            except ValueError as e:
-                raise TypeError()
-            super().setstate(internalstate)
-        else:
-            raise ValueError("state with version %s passed to "
-                             "Random.setstate() of version %s" %
-                             (version, self.VERSION))
-
-## ---- Methods below this point do not need to be overridden when
-## ---- subclassing for the purpose of using a different core generator.
-
-## -------------------- pickle support  -------------------
-
-    def __getstate__(self) -> object: # for pickle
-        return self.getstate()
-
-    def __setstate__(self, state: Any) -> None:  # for pickle
-        self.setstate(state)
-
-    def __reduce__(self) -> object:
-        return self.__class__, (), self.getstate()
-
-## -------------------- integer methods  -------------------
-
-    def randrange(self, start: SupportsInt, stop: SupportsInt = None,
-                  step: int = 1, int: Callable[[SupportsInt],
-                                               int] = int) -> int:
-        """Choose a random item from range(start, stop[, step]).
-
-        This fixes the problem with randint() which includes the
-        endpoint; in Python this is usually not what you want.
-
-        Do not supply the 'int' argument.
-        """
-
-        # This code is a bit messy to make it fast for the
-        # common case while still doing adequate error checking.
-        istart = int(start)
-        if istart != start:
-            raise ValueError("non-integer arg 1 for randrange()")
-        if stop is None:
-            if istart > 0:
-                return self._randbelow(istart)
-            raise ValueError("empty range for randrange()")
-
-        # stop argument supplied.
-        istop = int(stop)
-        if istop != stop:
-            raise ValueError("non-integer stop for randrange()")
-        width = istop - istart
-        if step == 1 and width > 0:
-            return istart + self._randbelow(width)
-        if step == 1:
-            raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width))
-
-        # Non-unit step argument supplied.
-        istep = int(step)
-        if istep != step:
-            raise ValueError("non-integer step for randrange()")
-        if istep > 0:
-            n = (width + istep - 1) // istep
-        elif istep < 0:
-            n = (width + istep + 1) // istep
-        else:
-            raise ValueError("zero step for randrange()")
-
-        if n <= 0:
-            raise ValueError("empty range for randrange()")
-
-        return istart + istep*self._randbelow(n)
-
-    def randint(self, a: int, b: int) -> int:
-        """Return random integer in range [a, b], including both end points.
-        """
-
-        return self.randrange(a, b+1)
-
-    def _randbelow(self, n: int, int: Callable[[float], int] = int,
-                   maxsize: int = 1<<BPF,
-                   type: Callable[[object], type] = type,
-                   Method: type = _MethodType,
-                   BuiltinMethod: type = _BuiltinMethodType) -> int:
-        "Return a random int in the range [0,n).  Raises ValueError if n==0."
-
-        getrandbits = self.getrandbits
-        # Only call self.getrandbits if the original random() builtin method
-        # has not been overridden or if a new getrandbits() was supplied.
-        if type(self.random) is BuiltinMethod or type(getrandbits) is Method:
-            k = n.bit_length()  # don't use (n-1) here because n can be 1
-            r = getrandbits(k)          # 0 <= r < 2**k
-            while r >= n:
-                r = getrandbits(k)
-            return r
-        # There's an overriden random() method but no new getrandbits() method,
-        # so we can only use random() from here.
-        random = self.random
-        if n >= maxsize:
-            _warn("Underlying random() generator does not supply \n"
-                "enough bits to choose from a population range this large.\n"
-                "To remove the range limitation, add a getrandbits() method.")
-            return int(random() * n)
-        rem = maxsize % n
-        limit = (maxsize - rem) / maxsize   # int(limit * maxsize) % n == 0
-        s = random()
-        while s >= limit:
-            s = random()
-        return int(s*maxsize) % n
-
-## -------------------- sequence methods  -------------------
-
-    def choice(self, seq: Sequence[T]) -> T:
-        """Choose a random element from a non-empty sequence."""
-        try:
-            i = self._randbelow(len(seq))
-        except ValueError:
-            raise IndexError('Cannot choose from an empty sequence')
-        return seq[i]
-
-    def shuffle(self, x: List[T],
-                random: Callable[[], float] = None,
-                int: Callable[[float], int] = int) -> None:
-        """x, random=random.random -> shuffle list x in place; return None.
-
-        Optional arg random is a 0-argument function returning a random
-        float in [0.0, 1.0); by default, the standard random.random.
-        """
-
-        randbelow = self._randbelow
-        for i in reversed(range(1, len(x))):
-            # pick an element in x[:i+1] with which to exchange x[i]
-            j = randbelow(i+1) if random is None else int(random() * (i+1))
-            x[i], x[j] = x[j], x[i]
-
-    def sample(self, population: Union[_Set[T], _Sequence[T]], k: int) -> List[T]:
-        """Chooses k unique random elements from a population sequence or set.
-
-        Returns a new list containing elements from the population while
-        leaving the original population unchanged.  The resulting list is
-        in selection order so that all sub-slices will also be valid random
-        samples.  This allows raffle winners (the sample) to be partitioned
-        into grand prize and second place winners (the subslices).
-
-        Members of the population need not be hashable or unique.  If the
-        population contains repeats, then each occurrence is a possible
-        selection in the sample.
-
-        To choose a sample in a range of integers, use range as an argument.
-        This is especially fast and space efficient for sampling from a
-        large population:   sample(range(10000000), 60)
-        """
-
-        # Sampling without replacement entails tracking either potential
-        # selections (the pool) in a list or previous selections in a set.
-
-        # When the number of selections is small compared to the
-        # population, then tracking selections is efficient, requiring
-        # only a small set and an occasional reselection.  For
-        # a larger number of selections, the pool tracking method is
-        # preferred since the list takes less space than the
-        # set and it doesn't suffer from frequent reselections.
-
-        if isinstance(population, _Set):
-            population = list(population)
-        if not isinstance(population, _Sequence):
-            raise TypeError("Population must be a sequence or set.  For dicts, use list(d).")
-        randbelow = self._randbelow
-        n = len(population)
-        if not (0 <= k and k <= n):
-            raise ValueError("Sample larger than population")
-        result = [cast(T, None)] * k
-        setsize = 21        # size of a small set minus size of an empty list
-        if k > 5:
-            setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
-        if n <= setsize:
-            # An n-length list is smaller than a k-length set
-            pool = list(population)
-            for i in range(k):         # invariant:  non-selected at [0,n-i)
-                j = randbelow(n-i)
-                result[i] = pool[j]
-                pool[j] = pool[n-i-1]   # move non-selected item into vacancy
-        else:
-            selected = set()  # type: Set[int]
-            selected_add = selected.add
-            for i in range(k):
-                j = randbelow(n)
-                while j in selected:
-                    j = randbelow(n)
-                selected_add(j)
-                result[i] = population[j]
-        return result
-
-## -------------------- real-valued distributions  -------------------
-
-## -------------------- uniform distribution -------------------
-
-    def uniform(self, a: float, b: float) -> float:
-        "Get a random number in the range [a, b) or [a, b] depending on rounding."
-        return a + (b-a) * self.random()
-
-## -------------------- triangular --------------------
-
-    def triangular(self, low: float = 0.0, high: float = 1.0,
-                   mode: float = None) -> float:
-        """Triangular distribution.
-
-        Continuous distribution bounded by given lower and upper limits,
-        and having a given mode value in-between.
-
-        http://en.wikipedia.org/wiki/Triangular_distribution
-
-        """
-        u = self.random()
-        c = 0.5 if mode is None else (mode - low) / (high - low)
-        if u > c:
-            u = 1.0 - u
-            c = 1.0 - c
-            low, high = high, low
-        return low + (high - low) * (u * c) ** 0.5
-
-## -------------------- normal distribution --------------------
-
-    def normalvariate(self, mu: float, sigma: float) -> float:
-        """Normal distribution.
-
-        mu is the mean, and sigma is the standard deviation.
-
-        """
-        # mu = mean, sigma = standard deviation
-
-        # Uses Kinderman and Monahan method. Reference: Kinderman,
-        # A.J. and Monahan, J.F., "Computer generation of random
-        # variables using the ratio of uniform deviates", ACM Trans
-        # Math Software, 3, (1977), pp257-260.
-
-        random = self.random
-        while 1:
-            u1 = random()
-            u2 = 1.0 - random()
-            z = NV_MAGICCONST*(u1-0.5)/u2
-            zz = z*z/4.0
-            if zz <= -_log(u2):
-                break
-        return mu + z*sigma
-
-## -------------------- lognormal distribution --------------------
-
-    def lognormvariate(self, mu: float, sigma: float) -> float:
-        """Log normal distribution.
-
-        If you take the natural logarithm of this distribution, you'll get a
-        normal distribution with mean mu and standard deviation sigma.
-        mu can have any value, and sigma must be greater than zero.
-
-        """
-        return _exp(self.normalvariate(mu, sigma))
-
-## -------------------- exponential distribution --------------------
-
-    def expovariate(self, lambd: float) -> float:
-        """Exponential distribution.
-
-        lambd is 1.0 divided by the desired mean.  It should be
-        nonzero.  (The parameter would be called "lambda", but that is
-        a reserved word in Python.)  Returned values range from 0 to
-        positive infinity if lambd is positive, and from negative
-        infinity to 0 if lambd is negative.
-
-        """
-        # lambd: rate lambd = 1/mean
-        # ('lambda' is a Python reserved word)
-
-        # we use 1-random() instead of random() to preclude the
-        # possibility of taking the log of zero.
-        return -_log(1.0 - self.random())/lambd
-
-## -------------------- von Mises distribution --------------------
-
-    def vonmisesvariate(self, mu: float, kappa: float) -> float:
-        """Circular data distribution.
-
-        mu is the mean angle, expressed in radians between 0 and 2*pi, and
-        kappa is the concentration parameter, which must be greater than or
-        equal to zero.  If kappa is equal to zero, this distribution reduces
-        to a uniform random angle over the range 0 to 2*pi.
-
-        """
-        # mu:    mean angle (in radians between 0 and 2*pi)
-        # kappa: concentration parameter kappa (>= 0)
-        # if kappa = 0 generate uniform random angle
-
-        # Based upon an algorithm published in: Fisher, N.I.,
-        # "Statistical Analysis of Circular Data", Cambridge
-        # University Press, 1993.
-
-        # Thanks to Magnus Kessler for a correction to the
-        # implementation of step 4.
-
-        random = self.random
-        if kappa <= 1e-6:
-            return TWOPI * random()
-
-        a = 1.0 + _sqrt(1.0 + 4.0 * kappa * kappa)
-        b = (a - _sqrt(2.0 * a))/(2.0 * kappa)
-        r = (1.0 + b * b)/(2.0 * b)
-
-        while 1:
-            u1 = random()
-
-            z = _cos(_pi * u1)
-            f = (1.0 + r * z)/(r + z)
-            c = kappa * (r - f)
-
-            u2 = random()
-
-            if u2 < c * (2.0 - c) or u2 <= c * _exp(1.0 - c):
-                break
-
-        u3 = random()
-        if u3 > 0.5:
-            theta = (mu % TWOPI) + _acos(f)
-        else:
-            theta = (mu % TWOPI) - _acos(f)
-
-        return theta
-
-## -------------------- gamma distribution --------------------
-
-    def gammavariate(self, alpha: float, beta: float) -> float:
-        """Gamma distribution.  Not the gamma function!
-
-        Conditions on the parameters are alpha > 0 and beta > 0.
-
-        The probability distribution function is:
-
-                    x ** (alpha - 1) * math.exp(-x / beta)
-          pdf(x) =  --------------------------------------
-                      math.gamma(alpha) * beta ** alpha
-
-        """
-
-        # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
-
-        # Warning: a few older sources define the gamma distribution in terms
-        # of alpha > -1.0
-        if alpha <= 0.0 or beta <= 0.0:
-            raise ValueError('gammavariate: alpha and beta must be > 0.0')
-
-        random = self.random
-        if alpha > 1.0:
-
-            # Uses R.C.H. Cheng, "The generation of Gamma
-            # variables with non-integral shape parameters",
-            # Applied Statistics, (1977), 26, No. 1, p71-74
-
-            ainv = _sqrt(2.0 * alpha - 1.0)
-            bbb = alpha - LOG4
-            ccc = alpha + ainv
-
-            while 1:
-                u1 = random()
-                if not (1e-7 < u1 and u1 < .9999999):
-                    continue
-                u2 = 1.0 - random()
-                v = _log(u1/(1.0-u1))/ainv
-                x = alpha*_exp(v)
-                z = u1*u1*u2
-                r = bbb+ccc*v-x
-                if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
-                    return x * beta
-
-        elif alpha == 1.0:
-            # expovariate(1)
-            u = random()
-            while u <= 1e-7:
-                u = random()
-            return -_log(u) * beta
-
-        else:   # alpha is between 0 and 1 (exclusive)
-
-            # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
-
-            while 1:
-                u = random()
-                b = (_e + alpha)/_e
-                p = b*u
-                if p <= 1.0:
-                    x = p ** (1.0/alpha)
-                else:
-                    x = -_log((b-p)/alpha)
-                u1 = random()
-                if p > 1.0:
-                    if u1 <= x ** (alpha - 1.0):
-                        break
-                elif u1 <= _exp(-x):
-                    break
-            return x * beta
-
-## -------------------- Gauss (faster alternative) --------------------
-
-    def gauss(self, mu: float, sigma: float) -> float:
-        """Gaussian distribution.
-
-        mu is the mean, and sigma is the standard deviation.  This is
-        slightly faster than the normalvariate() function.
-
-        Not thread-safe without a lock around calls.
-
-        """
-
-        # When x and y are two variables from [0, 1), uniformly
-        # distributed, then
-        #
-        #    cos(2*pi*x)*sqrt(-2*log(1-y))
-        #    sin(2*pi*x)*sqrt(-2*log(1-y))
-        #
-        # are two *independent* variables with normal distribution
-        # (mu = 0, sigma = 1).
-        # (Lambert Meertens)
-        # (corrected version; bug discovered by Mike Miller, fixed by LM)
-
-        # Multithreading note: When two threads call this function
-        # simultaneously, it is possible that they will receive the
-        # same return value.  The window is very small though.  To
-        # avoid this, you have to use a lock around all calls.  (I
-        # didn't want to slow this down in the serial case by using a
-        # lock here.)
-
-        random = self.random
-        z = self.gauss_next
-        self.gauss_next = None
-        if z is None:
-            x2pi = random() * TWOPI
-            g2rad = _sqrt(-2.0 * _log(1.0 - random()))
-            z = _cos(x2pi) * g2rad
-            self.gauss_next = _sin(x2pi) * g2rad
-
-        return mu + z*sigma
-
-## -------------------- beta --------------------
-## See
-## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
-## for Ivan Frohne's insightful analysis of why the original implementation:
-##
-##    def betavariate(self, alpha, beta):
-##        # Discrete Event Simulation in C, pp 87-88.
-##
-##        y = self.expovariate(alpha)
-##        z = self.expovariate(1.0/beta)
-##        return z/(y+z)
-##
-## was dead wrong, and how it probably got that way.
-
-    def betavariate(self, alpha: float, beta: float) -> 'float':
-        """Beta distribution.
-
-        Conditions on the parameters are alpha > 0 and beta > 0.
-        Returned values range between 0 and 1.
-
-        """
-
-        # This version due to Janne Sinkkonen, and matches all the std
-        # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
-        y = self.gammavariate(alpha, 1.)
-        if y == 0:
-            return 0.0
-        else:
-            return y / (y + self.gammavariate(beta, 1.))
-
-## -------------------- Pareto --------------------
-
-    def paretovariate(self, alpha: float) -> float:
-        """Pareto distribution.  alpha is the shape parameter."""
-        # Jain, pg. 495
-
-        u = 1.0 - self.random()
-        return 1.0 / u ** (1.0/alpha)
-
-## -------------------- Weibull --------------------
-
-    def weibullvariate(self, alpha: float, beta: float) -> float:
-        """Weibull distribution.
-
-        alpha is the scale parameter and beta is the shape parameter.
-
-        """
-        # Jain, pg. 499; bug fix courtesy Bill Arms
-
-        u = 1.0 - self.random()
-        return alpha * (-_log(u)) ** (1.0/beta)
-
-## --------------- Operating System Random Source  ------------------
-
-class SystemRandom(Random):
-    """Alternate random number generator using sources provided
-    by the operating system (such as /dev/urandom on Unix or
-    CryptGenRandom on Windows).
-
-     Not available on all systems (see os.urandom() for details).
-    """
-
-    def random(self) -> float:
-        """Get the next random number in the range [0.0, 1.0)."""
-        return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
-
-    def getrandbits(self, k: int) -> int:
-        """getrandbits(k) -> x.  Generates a long int with k random bits."""
-        if k <= 0:
-            raise ValueError('number of bits must be greater than zero')
-        if k != int(k):
-            raise TypeError('number of bits should be an integer')
-        numbytes = (k + 7) // 8                       # bits / 8 and rounded up
-        x = int.from_bytes(_urandom(numbytes), 'big')
-        return x >> (numbytes * 8 - k)                # trim excess bits
-
-    def seed(self, a: object = None, version: int = None) -> None:
-        "Stub method.  Not used for a system random number generator."
-        return
-
-    def _notimplemented(self, *args: Any, **kwds: Any) -> Any:
-        "Method should not be called for a system random number generator."
-        raise NotImplementedError('System entropy source does not have state.')
-    getstate = setstate = _notimplemented
-
-# Create one instance, seeded from current time, and export its methods
-# as module-level functions.  The functions share state across all uses
-#(both in the user's code and in the Python libraries), but that's fine
-# for most programs and is easier for the casual user than making them
-# instantiate their own Random() instance.
-
-_inst = Random()
-seed = _inst.seed
-random = _inst.random
-uniform = _inst.uniform
-triangular = _inst.triangular
-randint = _inst.randint
-choice = _inst.choice
-randrange = _inst.randrange
-sample = _inst.sample
-shuffle = _inst.shuffle
-normalvariate = _inst.normalvariate
-lognormvariate = _inst.lognormvariate
-expovariate = _inst.expovariate
-vonmisesvariate = _inst.vonmisesvariate
-gammavariate = _inst.gammavariate
-gauss = _inst.gauss
-betavariate = _inst.betavariate
-paretovariate = _inst.paretovariate
-weibullvariate = _inst.weibullvariate
-getstate = _inst.getstate
-setstate = _inst.setstate
-getrandbits = _inst.getrandbits
-
-## -------------------- test program --------------------
-
-def _test_generator(n: int, func: Any, args: tuple) -> None:
-    import time
-    print(n, 'times', func.__name__)
-    total = 0.0
-    sqsum = 0.0
-    smallest = 1e10
-    largest = -1e10
-    t0 = time.time()
-    for i in range(n):
-        x = func(*args) # type: float
-        total += x
-        sqsum = sqsum + x*x
-        smallest = min(x, smallest)
-        largest = max(x, largest)
-    t1 = time.time()
-    print(round(t1-t0, 3), 'sec,', end=' ')
-    avg = total/n
-    stddev = _sqrt(sqsum/n - avg*avg)
-    print('avg %g, stddev %g, min %g, max %g' % \
-              (avg, stddev, smallest, largest))
-
-
-def _test(N: int = 2000) -> None:
-    _test_generator(N, random, ())
-    _test_generator(N, normalvariate, (0.0, 1.0))
-    _test_generator(N, lognormvariate, (0.0, 1.0))
-    _test_generator(N, vonmisesvariate, (0.0, 1.0))
-    _test_generator(N, gammavariate, (0.01, 1.0))
-    _test_generator(N, gammavariate, (0.1, 1.0))
-    _test_generator(N, gammavariate, (0.1, 2.0))
-    _test_generator(N, gammavariate, (0.5, 1.0))
-    _test_generator(N, gammavariate, (0.9, 1.0))
-    _test_generator(N, gammavariate, (1.0, 1.0))
-    _test_generator(N, gammavariate, (2.0, 1.0))
-    _test_generator(N, gammavariate, (20.0, 1.0))
-    _test_generator(N, gammavariate, (200.0, 1.0))
-    _test_generator(N, gauss, (0.0, 1.0))
-    _test_generator(N, betavariate, (3.0, 3.0))
-    _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
-
-if __name__ == '__main__':
-    _test()
diff --git a/test-data/stdlib-samples/3.2/shutil.py b/test-data/stdlib-samples/3.2/shutil.py
deleted file mode 100644
index 7204a4d..0000000
--- a/test-data/stdlib-samples/3.2/shutil.py
+++ /dev/null
@@ -1,790 +0,0 @@
-"""Utility functions for copying and archiving files and directory trees.
-
-XXX The functions here don't copy the resource fork or other metadata on Mac.
-
-"""
-
-import os
-import sys
-import stat
-from os.path import abspath
-import fnmatch
-import collections
-import errno
-import tarfile
-import builtins
-
-from typing import (
-    Any, AnyStr, IO, List, Iterable, Callable, Tuple, Dict, Sequence, cast
-)
-from types import TracebackType
-
-try:
-    import bz2
-    _BZ2_SUPPORTED = True
-except ImportError:
-    _BZ2_SUPPORTED = False
-
-try:
-    from pwd import getpwnam as _getpwnam
-    getpwnam = _getpwnam
-except ImportError:
-    getpwnam = None
-
-try:
-    from grp import getgrnam as _getgrnam
-    getgrnam = _getgrnam
-except ImportError:
-    getgrnam = None
-
-__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2",
-           "copytree", "move", "rmtree", "Error", "SpecialFileError",
-           "ExecError", "make_archive", "get_archive_formats",
-           "register_archive_format", "unregister_archive_format",
-           "get_unpack_formats", "register_unpack_format",
-           "unregister_unpack_format", "unpack_archive", "ignore_patterns"]
-
-class Error(EnvironmentError):
-    pass
-
-class SpecialFileError(EnvironmentError):
-    """Raised when trying to do a kind of operation (e.g. copying) which is
-    not supported on a special file (e.g. a named pipe)"""
-
-class ExecError(EnvironmentError):
-    """Raised when a command could not be executed"""
-
-class ReadError(EnvironmentError):
-    """Raised when an archive cannot be read"""
-
-class RegistryError(Exception):
-    """Raised when a registery operation with the archiving
-    and unpacking registeries fails"""
-
-
-try:
-    _WindowsError = WindowsError # type: type
-except NameError:
-    _WindowsError = None
-
-
-# Function aliases to be patched in test cases
-rename = os.rename
-open = builtins.open
-
-
-def copyfileobj(fsrc: IO[AnyStr], fdst: IO[AnyStr],
-                length: int = 16*1024) -> None:
-    """copy data from file-like object fsrc to file-like object fdst"""
-    while 1:
-        buf = fsrc.read(length)
-        if not buf:
-            break
-        fdst.write(buf)
-
-def _samefile(src: str, dst: str) -> bool:
-    # Macintosh, Unix.
-    if hasattr(os.path, 'samefile'):
-        try:
-            return os.path.samefile(src, dst)
-        except OSError:
-            return False
-
-    # All other platforms: check for same pathname.
-    return (os.path.normcase(os.path.abspath(src)) ==
-            os.path.normcase(os.path.abspath(dst)))
-
-def copyfile(src: str, dst: str) -> None:
-    """Copy data from src to dst"""
-    if _samefile(src, dst):
-        raise Error("`%s` and `%s` are the same file" % (src, dst))
-
-    for fn in [src, dst]:
-        try:
-            st = os.stat(fn)
-        except OSError:
-            # File most likely does not exist
-            pass
-        else:
-            # XXX What about other special files? (sockets, devices...)
-            if stat.S_ISFIFO(st.st_mode):
-                raise SpecialFileError("`%s` is a named pipe" % fn)
-
-    with open(src, 'rb') as fsrc:
-        with open(dst, 'wb') as fdst:
-            copyfileobj(fsrc, fdst)
-
-def copymode(src: str, dst: str) -> None:
-    """Copy mode bits from src to dst"""
-    if hasattr(os, 'chmod'):
-        st = os.stat(src)
-        mode = stat.S_IMODE(st.st_mode)
-        os.chmod(dst, mode)
-
-def copystat(src: str, dst: str) -> None:
-    """Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
-    st = os.stat(src)
-    mode = stat.S_IMODE(st.st_mode)
-    if hasattr(os, 'utime'):
-        os.utime(dst, (st.st_atime, st.st_mtime))
-    if hasattr(os, 'chmod'):
-        os.chmod(dst, mode)
-    if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
-        try:
-            os.chflags(dst, st.st_flags)
-        except OSError as why:
-            if (not hasattr(errno, 'EOPNOTSUPP') or
-                why.errno != errno.EOPNOTSUPP):
-                raise
-
-def copy(src: str, dst: str) -> None:
-    """Copy data and mode bits ("cp src dst").
-
-    The destination may be a directory.
-
-    """
-    if os.path.isdir(dst):
-        dst = os.path.join(dst, os.path.basename(src))
-    copyfile(src, dst)
-    copymode(src, dst)
-
-def copy2(src: str, dst: str) -> None:
-    """Copy data and all stat info ("cp -p src dst").
-
-    The destination may be a directory.
-
-    """
-    if os.path.isdir(dst):
-        dst = os.path.join(dst, os.path.basename(src))
-    copyfile(src, dst)
-    copystat(src, dst)
-
-def ignore_patterns(*patterns: str) -> Callable[[str, List[str]],
-                                                Iterable[str]]:
-    """Function that can be used as copytree() ignore parameter.
-
-    Patterns is a sequence of glob-style patterns
-    that are used to exclude files"""
-    def _ignore_patterns(path: str, names: List[str]) -> Iterable[str]:
-        ignored_names = []  # type: List[str]
-        for pattern in patterns:
-            ignored_names.extend(fnmatch.filter(names, pattern))
-        return set(ignored_names)
-    return _ignore_patterns
-
-def copytree(src: str, dst: str, symlinks: bool = False,
-             ignore: Callable[[str, List[str]], Iterable[str]] = None,
-             copy_function: Callable[[str, str], None] = copy2,
-             ignore_dangling_symlinks: bool = False) -> None:
-    """Recursively copy a directory tree.
-
-    The destination directory must not already exist.
-    If exception(s) occur, an Error is raised with a list of reasons.
-
-    If the optional symlinks flag is true, symbolic links in the
-    source tree result in symbolic links in the destination tree; if
-    it is false, the contents of the files pointed to by symbolic
-    links are copied. If the file pointed by the symlink doesn't
-    exist, an exception will be added in the list of errors raised in
-    an Error exception at the end of the copy process.
-
-    You can set the optional ignore_dangling_symlinks flag to true if you
-    want to silence this exception. Notice that this has no effect on
-    platforms that don't support os.symlink.
-
-    The optional ignore argument is a callable. If given, it
-    is called with the `src` parameter, which is the directory
-    being visited by copytree(), and `names` which is the list of
-    `src` contents, as returned by os.listdir():
-
-        callable(src, names) -> ignored_names
-
-    Since copytree() is called recursively, the callable will be
-    called once for each directory that is copied. It returns a
-    list of names relative to the `src` directory that should
-    not be copied.
-
-    The optional copy_function argument is a callable that will be used
-    to copy each file. It will be called with the source path and the
-    destination path as arguments. By default, copy2() is used, but any
-    function that supports the same signature (like copy()) can be used.
-
-    """
-    names = os.listdir(src)
-    if ignore is not None:
-        ignored_names = ignore(src, names)
-    else:
-        ignored_names = set()
-
-    os.makedirs(dst)
-    errors = []  # type: List[Tuple[str, str, str]]
-    for name in names:
-        if name in ignored_names:
-            continue
-        srcname = os.path.join(src, name)
-        dstname = os.path.join(dst, name)
-        try:
-            if os.path.islink(srcname):
-                linkto = os.readlink(srcname)
-                if symlinks:
-                    os.symlink(linkto, dstname)
-                else:
-                    # ignore dangling symlink if the flag is on
-                    if not os.path.exists(linkto) and ignore_dangling_symlinks:
-                        continue
-                    # otherwise let the copy occurs. copy2 will raise an error
-                    copy_function(srcname, dstname)
-            elif os.path.isdir(srcname):
-                copytree(srcname, dstname, symlinks, ignore, copy_function)
-            else:
-                # Will raise a SpecialFileError for unsupported file types
-                copy_function(srcname, dstname)
-        # catch the Error from the recursive copytree so that we can
-        # continue with other files
-        except Error as err:
-            errors.extend(err.args[0])
-        except EnvironmentError as why:
-            errors.append((srcname, dstname, str(why)))
-    try:
-        copystat(src, dst)
-    except OSError as why:
-        if _WindowsError is not None and isinstance(why, _WindowsError):
-            # Copying file access times may fail on Windows
-            pass
-        else:
-            errors.append((src, dst, str(why)))
-    if errors:
-        raise Error(errors)
-
-def rmtree(path: str, ignore_errors: bool = False,
-           onerror: Callable[[Any, str, Tuple[type, BaseException, TracebackType]],
-                              None] = None) -> None:
-    """Recursively delete a directory tree.
-
-    If ignore_errors is set, errors are ignored; otherwise, if onerror
-    is set, it is called to handle the error with arguments (func,
-    path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
-    path is the argument to that function that caused it to fail; and
-    exc_info is a tuple returned by sys.exc_info().  If ignore_errors
-    is false and onerror is None, an exception is raised.
-
-    """
-    if ignore_errors:
-        def _onerror(x: Any, y: str,
-                     z: Tuple[type, BaseException, TracebackType]) -> None:
-            pass
-        onerror = _onerror
-    elif onerror is None:
-        def __onerror(x: Any, y: str,
-                      z: Tuple[type, BaseException, TracebackType]) -> None:
-            raise
-        onerror = __onerror
-    try:
-        if os.path.islink(path):
-            # symlinks to directories are forbidden, see bug #1669
-            raise OSError("Cannot call rmtree on a symbolic link")
-    except OSError:
-        onerror(os.path.islink, path, sys.exc_info())
-        # can't continue even if onerror hook returns
-        return
-    names = []  # type: List[str]
-    try:
-        names = os.listdir(path)
-    except os.error as err:
-        onerror(os.listdir, path, sys.exc_info())
-    for name in names:
-        fullname = os.path.join(path, name)
-        try:
-            mode = os.lstat(fullname).st_mode
-        except os.error:
-            mode = 0
-        if stat.S_ISDIR(mode):
-            rmtree(fullname, ignore_errors, onerror)
-        else:
-            try:
-                os.remove(fullname)
-            except os.error as err:
-                onerror(os.remove, fullname, sys.exc_info())
-    try:
-        os.rmdir(path)
-    except os.error:
-        onerror(os.rmdir, path, sys.exc_info())
-
-
-def _basename(path: str) -> str:
-    # A basename() variant which first strips the trailing slash, if present.
-    # Thus we always get the last component of the path, even for directories.
-    return os.path.basename(path.rstrip(os.path.sep))
-
-def move(src: str, dst: str) -> None:
-    """Recursively move a file or directory to another location. This is
-    similar to the Unix "mv" command.
-
-    If the destination is a directory or a symlink to a directory, the source
-    is moved inside the directory. The destination path must not already
-    exist.
-
-    If the destination already exists but is not a directory, it may be
-    overwritten depending on os.rename() semantics.
-
-    If the destination is on our current filesystem, then rename() is used.
-    Otherwise, src is copied to the destination and then removed.
-    A lot more could be done here...  A look at a mv.c shows a lot of
-    the issues this implementation glosses over.
-
-    """
-    real_dst = dst
-    if os.path.isdir(dst):
-        if _samefile(src, dst):
-            # We might be on a case insensitive filesystem,
-            # perform the rename anyway.
-            os.rename(src, dst)
-            return
-
-        real_dst = os.path.join(dst, _basename(src))
-        if os.path.exists(real_dst):
-            raise Error("Destination path '%s' already exists" % real_dst)
-    try:
-        os.rename(src, real_dst)
-    except OSError as exc:
-        if os.path.isdir(src):
-            if _destinsrc(src, dst):
-                raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst))
-            copytree(src, real_dst, symlinks=True)
-            rmtree(src)
-        else:
-            copy2(src, real_dst)
-            os.unlink(src)
-
-def _destinsrc(src: str, dst: str) -> bool:
-    src = abspath(src)
-    dst = abspath(dst)
-    if not src.endswith(os.path.sep):
-        src += os.path.sep
-    if not dst.endswith(os.path.sep):
-        dst += os.path.sep
-    return dst.startswith(src)
-
-def _get_gid(name: str) -> int:
-    """Returns a gid, given a group name."""
-    if getgrnam is None or name is None:
-        return None
-    try:
-        result = getgrnam(name)
-    except KeyError:
-        result = None
-    if result is not None:
-        return result.gr_gid
-    return None
-
-def _get_uid(name: str) -> int:
-    """Returns an uid, given a user name."""
-    if getpwnam is None or name is None:
-        return None
-    try:
-        result = getpwnam(name)
-    except KeyError:
-        result = None
-    if result is not None:
-        return result.pw_uid
-    return None
-
-def _make_tarball(base_name: str, base_dir: str, compress: str = "gzip",
-                  verbose: bool = False, dry_run: bool = False,
-                  owner: str = None, group: str = None,
-                  logger: Any = None) -> str:
-    """Create a (possibly compressed) tar file from all the files under
-    'base_dir'.
-
-    'compress' must be "gzip" (the default), "bzip2", or None.
-
-    'owner' and 'group' can be used to define an owner and a group for the
-    archive that is being built. If not provided, the current owner and group
-    will be used.
-
-    The output tar file will be named 'base_name' +  ".tar", possibly plus
-    the appropriate compression extension (".gz", or ".bz2").
-
-    Returns the output filename.
-    """
-    tar_compression = {'gzip': 'gz', None: ''}
-    compress_ext = {'gzip': '.gz'}
-
-    if _BZ2_SUPPORTED:
-        tar_compression['bzip2'] = 'bz2'
-        compress_ext['bzip2'] = '.bz2'
-
-    # flags for compression program, each element of list will be an argument
-    if compress is not None and compress not in compress_ext.keys():
-        raise ValueError("bad value for 'compress', or compression format not "
-                         "supported : {0}".format(compress))
-
-    archive_name = base_name + '.tar' + compress_ext.get(compress, '')
-    archive_dir = os.path.dirname(archive_name)
-
-    if not os.path.exists(archive_dir):
-        if logger is not None:
-            logger.info("creating %s", archive_dir)
-        if not dry_run:
-            os.makedirs(archive_dir)
-
-    # creating the tarball
-    if logger is not None:
-        logger.info('Creating tar archive')
-
-    uid = _get_uid(owner)
-    gid = _get_gid(group)
-
-    def _set_uid_gid(tarinfo):
-        if gid is not None:
-            tarinfo.gid = gid
-            tarinfo.gname = group
-        if uid is not None:
-            tarinfo.uid = uid
-            tarinfo.uname = owner
-        return tarinfo
-
-    if not dry_run:
-        tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress])
-        try:
-            tar.add(base_dir, filter=_set_uid_gid)
-        finally:
-            tar.close()
-
-    return archive_name
-
-def _call_external_zip(base_dir: str, zip_filename: str, verbose: bool = False,
-                       dry_run: bool = False) -> None:
-    # XXX see if we want to keep an external call here
-    if verbose:
-        zipoptions = "-r"
-    else:
-        zipoptions = "-rq"
-    from distutils.errors import DistutilsExecError
-    from distutils.spawn import spawn
-    try:
-        spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run)
-    except DistutilsExecError:
-        # XXX really should distinguish between "couldn't find
-        # external 'zip' command" and "zip failed".
-        raise ExecError(("unable to create zip file '%s': "
-            "could neither import the 'zipfile' module nor "
-            "find a standalone zip utility") % zip_filename)
-
-def _make_zipfile(base_name: str, base_dir: str, verbose: bool = False,
-                  dry_run: bool = False, logger: Any = None) -> str:
-    """Create a zip file from all the files under 'base_dir'.
-
-    The output zip file will be named 'base_name' + ".zip".  Uses either the
-    "zipfile" Python module (if available) or the InfoZIP "zip" utility
-    (if installed and found on the default search path).  If neither tool is
-    available, raises ExecError.  Returns the name of the output zip
-    file.
-    """
-    zip_filename = base_name + ".zip"
-    archive_dir = os.path.dirname(base_name)
-
-    if not os.path.exists(archive_dir):
-        if logger is not None:
-            logger.info("creating %s", archive_dir)
-        if not dry_run:
-            os.makedirs(archive_dir)
-
-    # If zipfile module is not available, try spawning an external 'zip'
-    # command.
-    try:
-        import zipfile
-    except ImportError:
-        zipfile = None
-
-    if zipfile is None:
-        _call_external_zip(base_dir, zip_filename, verbose, dry_run)
-    else:
-        if logger is not None:
-            logger.info("creating '%s' and adding '%s' to it",
-                        zip_filename, base_dir)
-
-        if not dry_run:
-            zip = zipfile.ZipFile(zip_filename, "w",
-                                  compression=zipfile.ZIP_DEFLATED)
-
-            for dirpath, dirnames, filenames in os.walk(base_dir):
-                for name in filenames:
-                    path = os.path.normpath(os.path.join(dirpath, name))
-                    if os.path.isfile(path):
-                        zip.write(path, path)
-                        if logger is not None:
-                            logger.info("adding '%s'", path)
-            zip.close()
-
-    return zip_filename
-
-_ARCHIVE_FORMATS = {
-    'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"),
-    'tar':   (_make_tarball, [('compress', None)], "uncompressed tar file"),
-    'zip':   (_make_zipfile, [],"ZIP file")
-    } # type: Dict[str, Tuple[Any, Sequence[Tuple[str, str]], str]]
-
-if _BZ2_SUPPORTED:
-    _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')],
-                                "bzip2'ed tar-file")
-
-def get_archive_formats() -> List[Tuple[str, str]]:
-    """Returns a list of supported formats for archiving and unarchiving.
-
-    Each element of the returned sequence is a tuple (name, description)
-    """
-    formats = [(name, registry[2]) for name, registry in
-               _ARCHIVE_FORMATS.items()]
-    formats.sort()
-    return formats
-
-def register_archive_format(name: str, function: Any,
-                            extra_args: Sequence[Tuple[str, Any]] = None,
-                            description: str = '') -> None:
-    """Registers an archive format.
-
-    name is the name of the format. function is the callable that will be
-    used to create archives. If provided, extra_args is a sequence of
-    (name, value) tuples that will be passed as arguments to the callable.
-    description can be provided to describe the format, and will be returned
-    by the get_archive_formats() function.
-    """
-    if extra_args is None:
-        extra_args = []
-    if not callable(function):
-        raise TypeError('The %s object is not callable' % function)
-    if not isinstance(extra_args, (tuple, list)):
-        raise TypeError('extra_args needs to be a sequence')
-    for element in extra_args:
-        if not isinstance(element, (tuple, list)) or len(cast(tuple, element)) !=2 :
-            raise TypeError('extra_args elements are : (arg_name, value)')
-
-    _ARCHIVE_FORMATS[name] = (function, extra_args, description)
-
-def unregister_archive_format(name: str) -> None:
-    del _ARCHIVE_FORMATS[name]
-
-def make_archive(base_name: str, format: str, root_dir: str = None,
-                 base_dir: str = None, verbose: bool = False,
-                 dry_run: bool = False, owner: str = None,
-                 group: str = None, logger: Any = None) -> str:
-    """Create an archive file (eg. zip or tar).
-
-    'base_name' is the name of the file to create, minus any format-specific
-    extension; 'format' is the archive format: one of "zip", "tar", "bztar"
-    or "gztar".
-
-    'root_dir' is a directory that will be the root directory of the
-    archive; ie. we typically chdir into 'root_dir' before creating the
-    archive.  'base_dir' is the directory where we start archiving from;
-    ie. 'base_dir' will be the common prefix of all files and
-    directories in the archive.  'root_dir' and 'base_dir' both default
-    to the current directory.  Returns the name of the archive file.
-
-    'owner' and 'group' are used when creating a tar archive. By default,
-    uses the current owner and group.
-    """
-    save_cwd = os.getcwd()
-    if root_dir is not None:
-        if logger is not None:
-            logger.debug("changing into '%s'", root_dir)
-        base_name = os.path.abspath(base_name)
-        if not dry_run:
-            os.chdir(root_dir)
-
-    if base_dir is None:
-        base_dir = os.curdir
-
-    kwargs = {'dry_run': dry_run, 'logger': logger}
-
-    try:
-        format_info = _ARCHIVE_FORMATS[format]
-    except KeyError:
-        raise ValueError("unknown archive format '%s'" % format)
-
-    func = format_info[0]
-    for arg, val in format_info[1]:
-        kwargs[arg] = val
-
-    if format != 'zip':
-        kwargs['owner'] = owner
-        kwargs['group'] = group
-
-    try:
-        filename = func(base_name, base_dir, **kwargs)
-    finally:
-        if root_dir is not None:
-            if logger is not None:
-                logger.debug("changing back to '%s'", save_cwd)
-            os.chdir(save_cwd)
-
-    return filename
-
-
-def get_unpack_formats() -> List[Tuple[str, List[str], str]]:
-    """Returns a list of supported formats for unpacking.
-
-    Each element of the returned sequence is a tuple
-    (name, extensions, description)
-    """
-    formats = [(name, info[0], info[3]) for name, info in
-               _UNPACK_FORMATS.items()]
-    formats.sort()
-    return formats
-
-def _check_unpack_options(extensions: List[str], function: Any,
-                          extra_args: Sequence[Tuple[str, Any]]) -> None:
-    """Checks what gets registered as an unpacker."""
-    # first make sure no other unpacker is registered for this extension
-    existing_extensions = {}  # type: Dict[str, str]
-    for name, info in _UNPACK_FORMATS.items():
-        for ext in info[0]:
-            existing_extensions[ext] = name
-
-    for extension in extensions:
-        if extension in existing_extensions:
-            msg = '%s is already registered for "%s"'
-            raise RegistryError(msg % (extension,
-                                       existing_extensions[extension]))
-
-    if not callable(function):
-        raise TypeError('The registered function must be a callable')
-
-
-def register_unpack_format(name: str, extensions: List[str], function: Any,
-                           extra_args: Sequence[Tuple[str, Any]] = None,
-                           description: str = '') -> None:
-    """Registers an unpack format.
-
-    `name` is the name of the format. `extensions` is a list of extensions
-    corresponding to the format.
-
-    `function` is the callable that will be
-    used to unpack archives. The callable will receive archives to unpack.
-    If it's unable to handle an archive, it needs to raise a ReadError
-    exception.
-
-    If provided, `extra_args` is a sequence of
-    (name, value) tuples that will be passed as arguments to the callable.
-    description can be provided to describe the format, and will be returned
-    by the get_unpack_formats() function.
-    """
-    if extra_args is None:
-        extra_args = []
-    _check_unpack_options(extensions, function, extra_args)
-    _UNPACK_FORMATS[name] = extensions, function, extra_args, description
-
-def unregister_unpack_format(name: str) -> None:
-    """Removes the pack format from the registery."""
-    del _UNPACK_FORMATS[name]
-
-def _ensure_directory(path: str) -> None:
-    """Ensure that the parent directory of `path` exists"""
-    dirname = os.path.dirname(path)
-    if not os.path.isdir(dirname):
-        os.makedirs(dirname)
-
-def _unpack_zipfile(filename: str, extract_dir: str) -> None:
-    """Unpack zip `filename` to `extract_dir`
-    """
-    try:
-        import zipfile
-    except ImportError:
-        raise ReadError('zlib not supported, cannot unpack this archive.')
-
-    if not zipfile.is_zipfile(filename):
-        raise ReadError("%s is not a zip file" % filename)
-
-    zip = zipfile.ZipFile(filename)
-    try:
-        for info in zip.infolist():
-            name = info.filename
-
-            # don't extract absolute paths or ones with .. in them
-            if name.startswith('/') or '..' in name:
-                continue
-
-            target = os.path.join(extract_dir, *name.split('/'))
-            if not target:
-                continue
-
-            _ensure_directory(target)
-            if not name.endswith('/'):
-                # file
-                data = zip.read(info.filename)
-                f = open(target,'wb')
-                try:
-                    f.write(data)
-                finally:
-                    f.close()
-                    del data
-    finally:
-        zip.close()
-
-def _unpack_tarfile(filename: str, extract_dir: str) -> None:
-    """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`
-    """
-    try:
-        tarobj = tarfile.open(filename)
-    except tarfile.TarError:
-        raise ReadError(
-            "%s is not a compressed or uncompressed tar file" % filename)
-    try:
-        tarobj.extractall(extract_dir)
-    finally:
-        tarobj.close()
-
-_UNPACK_FORMATS = {
-    'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"),
-    'tar':   (['.tar'], _unpack_tarfile, [], "uncompressed tar file"),
-    'zip':   (['.zip'], _unpack_zipfile, [], "ZIP file")
-    } # type: Dict[str, Tuple[List[str], Any, Sequence[Tuple[str, Any]], str]]
-
-if _BZ2_SUPPORTED:
-    _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [],
-                                "bzip2'ed tar-file")
-
-def _find_unpack_format(filename: str) -> str:
-    for name, info in _UNPACK_FORMATS.items():
-        for extension in info[0]:
-            if filename.endswith(extension):
-                return name
-    return None
-
-def unpack_archive(filename: str, extract_dir: str = None,
-                   format: str = None) -> None:
-    """Unpack an archive.
-
-    `filename` is the name of the archive.
-
-    `extract_dir` is the name of the target directory, where the archive
-    is unpacked. If not provided, the current working directory is used.
-
-    `format` is the archive format: one of "zip", "tar", or "gztar". Or any
-    other registered format. If not provided, unpack_archive will use the
-    filename extension and see if an unpacker was registered for that
-    extension.
-
-    In case none is found, a ValueError is raised.
-    """
-    if extract_dir is None:
-        extract_dir = os.getcwd()
-
-    if format is not None:
-        try:
-            format_info = _UNPACK_FORMATS[format]
-        except KeyError:
-            raise ValueError("Unknown unpack format '{0}'".format(format))
-
-        func = format_info[1]
-        func(filename, extract_dir, **dict(format_info[2]))
-    else:
-        # we need to look at the registered unpackers supported extensions
-        format = _find_unpack_format(filename)
-        if format is None:
-            raise ReadError("Unknown archive format '{0}'".format(filename))
-
-        func = _UNPACK_FORMATS[format][1]
-        kwargs = dict(_UNPACK_FORMATS[format][2])
-        func(filename, extract_dir, **kwargs)
diff --git a/test-data/stdlib-samples/3.2/subprocess.py b/test-data/stdlib-samples/3.2/subprocess.py
deleted file mode 100644
index e286525..0000000
--- a/test-data/stdlib-samples/3.2/subprocess.py
+++ /dev/null
@@ -1,1703 +0,0 @@
-# subprocess - Subprocesses with accessible I/O streams
-#
-# For more information about this module, see PEP 324.
-#
-# Copyright (c) 2003-2005 by Peter Astrand <astrand at lysator.liu.se>
-#
-# Licensed to PSF under a Contributor Agreement.
-# See http://www.python.org/2.4/license for licensing details.
-
-r"""subprocess - Subprocesses with accessible I/O streams
-
-This module allows you to spawn processes, connect to their
-input/output/error pipes, and obtain their return codes.  This module
-intends to replace several other, older modules and functions, like:
-
-os.system
-os.spawn*
-
-Information about how the subprocess module can be used to replace these
-modules and functions can be found below.
-
-
-
-Using the subprocess module
-===========================
-This module defines one class called Popen:
-
-class Popen(args, bufsize=0, executable=None,
-            stdin=None, stdout=None, stderr=None,
-            preexec_fn=None, close_fds=True, shell=False,
-            cwd=None, env=None, universal_newlines=False,
-            startupinfo=None, creationflags=0,
-            restore_signals=True, start_new_session=False, pass_fds=()):
-
-
-Arguments are:
-
-args should be a string, or a sequence of program arguments.  The
-program to execute is normally the first item in the args sequence or
-string, but can be explicitly set by using the executable argument.
-
-On POSIX, with shell=False (default): In this case, the Popen class
-uses os.execvp() to execute the child program.  args should normally
-be a sequence.  A string will be treated as a sequence with the string
-as the only item (the program to execute).
-
-On POSIX, with shell=True: If args is a string, it specifies the
-command string to execute through the shell.  If args is a sequence,
-the first item specifies the command string, and any additional items
-will be treated as additional shell arguments.
-
-On Windows: the Popen class uses CreateProcess() to execute the child
-program, which operates on strings.  If args is a sequence, it will be
-converted to a string using the list2cmdline method.  Please note that
-not all MS Windows applications interpret the command line the same
-way: The list2cmdline is designed for applications using the same
-rules as the MS C runtime.
-
-bufsize, if given, has the same meaning as the corresponding argument
-to the built-in open() function: 0 means unbuffered, 1 means line
-buffered, any other positive value means use a buffer of
-(approximately) that size.  A negative bufsize means to use the system
-default, which usually means fully buffered.  The default value for
-bufsize is 0 (unbuffered).
-
-stdin, stdout and stderr specify the executed programs' standard
-input, standard output and standard error file handles, respectively.
-Valid values are PIPE, an existing file descriptor (a positive
-integer), an existing file object, and None.  PIPE indicates that a
-new pipe to the child should be created.  With None, no redirection
-will occur; the child's file handles will be inherited from the
-parent.  Additionally, stderr can be STDOUT, which indicates that the
-stderr data from the applications should be captured into the same
-file handle as for stdout.
-
-On POSIX, if preexec_fn is set to a callable object, this object will be
-called in the child process just before the child is executed.  The use
-of preexec_fn is not thread safe, using it in the presence of threads
-could lead to a deadlock in the child process before the new executable
-is executed.
-
-If close_fds is true, all file descriptors except 0, 1 and 2 will be
-closed before the child process is executed.  The default for close_fds
-varies by platform:  Always true on POSIX.  True when stdin/stdout/stderr
-are None on Windows, false otherwise.
-
-pass_fds is an optional sequence of file descriptors to keep open between the
-parent and child.  Providing any pass_fds implicitly sets close_fds to true.
-
-if shell is true, the specified command will be executed through the
-shell.
-
-If cwd is not None, the current directory will be changed to cwd
-before the child is executed.
-
-On POSIX, if restore_signals is True all signals that Python sets to
-SIG_IGN are restored to SIG_DFL in the child process before the exec.
-Currently this includes the SIGPIPE, SIGXFZ and SIGXFSZ signals.  This
-parameter does nothing on Windows.
-
-On POSIX, if start_new_session is True, the setsid() system call will be made
-in the child process prior to executing the command.
-
-If env is not None, it defines the environment variables for the new
-process.
-
-If universal_newlines is true, the file objects stdout and stderr are
-opened as a text files, but lines may be terminated by any of '\n',
-the Unix end-of-line convention, '\r', the old Macintosh convention or
-'\r\n', the Windows convention.  All of these external representations
-are seen as '\n' by the Python program.  Note: This feature is only
-available if Python is built with universal newline support (the
-default).  Also, the newlines attribute of the file objects stdout,
-stdin and stderr are not updated by the communicate() method.
-
-The startupinfo and creationflags, if given, will be passed to the
-underlying CreateProcess() function.  They can specify things such as
-appearance of the main window and priority for the new process.
-(Windows only)
-
-
-This module also defines some shortcut functions:
-
-call(*popenargs, **kwargs):
-    Run command with arguments.  Wait for command to complete, then
-    return the returncode attribute.
-
-    The arguments are the same as for the Popen constructor.  Example:
-
-    >>> retcode = subprocess.call(["ls", "-l"])
-
-check_call(*popenargs, **kwargs):
-    Run command with arguments.  Wait for command to complete.  If the
-    exit code was zero then return, otherwise raise
-    CalledProcessError.  The CalledProcessError object will have the
-    return code in the returncode attribute.
-
-    The arguments are the same as for the Popen constructor.  Example:
-
-    >>> subprocess.check_call(["ls", "-l"])
-    0
-
-getstatusoutput(cmd):
-    Return (status, output) of executing cmd in a shell.
-
-    Execute the string 'cmd' in a shell with os.popen() and return a 2-tuple
-    (status, output).  cmd is actually run as '{ cmd ; } 2>&1', so that the
-    returned output will contain output or error messages. A trailing newline
-    is stripped from the output. The exit status for the command can be
-    interpreted according to the rules for the C function wait().  Example:
-
-    >>> subprocess.getstatusoutput('ls /bin/ls')
-    (0, '/bin/ls')
-    >>> subprocess.getstatusoutput('cat /bin/junk')
-    (256, 'cat: /bin/junk: No such file or directory')
-    >>> subprocess.getstatusoutput('/bin/junk')
-    (256, 'sh: /bin/junk: not found')
-
-getoutput(cmd):
-    Return output (stdout or stderr) of executing cmd in a shell.
-
-    Like getstatusoutput(), except the exit status is ignored and the return
-    value is a string containing the command's output.  Example:
-
-    >>> subprocess.getoutput('ls /bin/ls')
-    '/bin/ls'
-
-check_output(*popenargs, **kwargs):
-    Run command with arguments and return its output as a byte string.
-
-    If the exit code was non-zero it raises a CalledProcessError.  The
-    CalledProcessError object will have the return code in the returncode
-    attribute and output in the output attribute.
-
-    The arguments are the same as for the Popen constructor.  Example:
-
-    >>> output = subprocess.check_output(["ls", "-l", "/dev/null"])
-
-
-Exceptions
-----------
-Exceptions raised in the child process, before the new program has
-started to execute, will be re-raised in the parent.  Additionally,
-the exception object will have one extra attribute called
-'child_traceback', which is a string containing traceback information
-from the childs point of view.
-
-The most common exception raised is OSError.  This occurs, for
-example, when trying to execute a non-existent file.  Applications
-should prepare for OSErrors.
-
-A ValueError will be raised if Popen is called with invalid arguments.
-
-check_call() and check_output() will raise CalledProcessError, if the
-called process returns a non-zero return code.
-
-
-Security
---------
-Unlike some other popen functions, this implementation will never call
-/bin/sh implicitly.  This means that all characters, including shell
-metacharacters, can safely be passed to child processes.
-
-
-Popen objects
-=============
-Instances of the Popen class have the following methods:
-
-poll()
-    Check if child process has terminated.  Returns returncode
-    attribute.
-
-wait()
-    Wait for child process to terminate.  Returns returncode attribute.
-
-communicate(input=None)
-    Interact with process: Send data to stdin.  Read data from stdout
-    and stderr, until end-of-file is reached.  Wait for process to
-    terminate.  The optional input argument should be a string to be
-    sent to the child process, or None, if no data should be sent to
-    the child.
-
-    communicate() returns a tuple (stdout, stderr).
-
-    Note: The data read is buffered in memory, so do not use this
-    method if the data size is large or unlimited.
-
-The following attributes are also available:
-
-stdin
-    If the stdin argument is PIPE, this attribute is a file object
-    that provides input to the child process.  Otherwise, it is None.
-
-stdout
-    If the stdout argument is PIPE, this attribute is a file object
-    that provides output from the child process.  Otherwise, it is
-    None.
-
-stderr
-    If the stderr argument is PIPE, this attribute is file object that
-    provides error output from the child process.  Otherwise, it is
-    None.
-
-pid
-    The process ID of the child process.
-
-returncode
-    The child return code.  A None value indicates that the process
-    hasn't terminated yet.  A negative value -N indicates that the
-    child was terminated by signal N (POSIX only).
-
-
-Replacing older functions with the subprocess module
-====================================================
-In this section, "a ==> b" means that b can be used as a replacement
-for a.
-
-Note: All functions in this section fail (more or less) silently if
-the executed program cannot be found; this module raises an OSError
-exception.
-
-In the following examples, we assume that the subprocess module is
-imported with "from subprocess import *".
-
-
-Replacing /bin/sh shell backquote
----------------------------------
-output=`mycmd myarg`
-==>
-output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
-
-
-Replacing shell pipe line
--------------------------
-output=`dmesg | grep hda`
-==>
-p1 = Popen(["dmesg"], stdout=PIPE)
-p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
-output = p2.communicate()[0]
-
-
-Replacing os.system()
----------------------
-sts = os.system("mycmd" + " myarg")
-==>
-p = Popen("mycmd" + " myarg", shell=True)
-pid, sts = os.waitpid(p.pid, 0)
-
-Note:
-
-* Calling the program through the shell is usually not required.
-
-* It's easier to look at the returncode attribute than the
-  exitstatus.
-
-A more real-world example would look like this:
-
-try:
-    retcode = call("mycmd" + " myarg", shell=True)
-    if retcode < 0:
-        print("Child was terminated by signal", -retcode, file=sys.stderr)
-    else:
-        print("Child returned", retcode, file=sys.stderr)
-except OSError as e:
-    print("Execution failed:", e, file=sys.stderr)
-
-
-Replacing os.spawn*
--------------------
-P_NOWAIT example:
-
-pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
-==>
-pid = Popen(["/bin/mycmd", "myarg"]).pid
-
-
-P_WAIT example:
-
-retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
-==>
-retcode = call(["/bin/mycmd", "myarg"])
-
-
-Vector example:
-
-os.spawnvp(os.P_NOWAIT, path, args)
-==>
-Popen([path] + args[1:])
-
-
-Environment example:
-
-os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
-==>
-Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
-"""
-
-import sys
-mswindows = (sys.platform == "win32")
-
-import io
-import os
-import traceback
-import gc
-import signal
-import builtins
-import warnings
-import errno
-
-from typing import (
-    Any, Tuple, List, Sequence, Callable, Mapping, cast, Set, Dict, IO,
-    TextIO, AnyStr
-)
-from types import TracebackType
-
-# Exception classes used by this module.
-class CalledProcessError(Exception):
-    """This exception is raised when a process run by check_call() or
-    check_output() returns a non-zero exit status.
-    The exit status will be stored in the returncode attribute;
-    check_output() will also store the output in the output attribute.
-    """
-    def __init__(self, returncode: int, cmd: str, output: Any = None) -> None:
-        self.returncode = returncode
-        self.cmd = cmd
-        self.output = output
-    def __str__(self) -> str:
-        return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
-
-
-if mswindows:
-    import threading
-    import msvcrt
-    import _subprocess
-    class STARTUPINFO:
-        dwFlags = 0
-        hStdInput = cast(Any, None)
-        hStdOutput = cast(Any, None)
-        hStdError = cast(Any, None)
-        wShowWindow = 0
-    class pywintypes:
-        error = IOError
-else:
-    import select
-    _has_poll = hasattr(select, 'poll')
-    import fcntl
-    import pickle
-
-    try:
-        import _posixsubprocess
-        have_posixsubprocess = True
-    except ImportError:
-        have_posixsubprocess = False
-        warnings.warn("The _posixsubprocess module is not being used. "
-                      "Child process reliability may suffer if your "
-                      "program uses threads.", RuntimeWarning)
-
-    # When select or poll has indicated that the file is writable,
-    # we can write up to _PIPE_BUF bytes without risk of blocking.
-    # POSIX defines PIPE_BUF as >= 512.
-    _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) # type: int
-
-    _FD_CLOEXEC = getattr(fcntl, 'FD_CLOEXEC', 1) # type: int
-
-    def _set_cloexec(fd: int, cloexec: bool) -> None:
-        old = fcntl.fcntl(fd, fcntl.F_GETFD)
-        if cloexec:
-            fcntl.fcntl(fd, fcntl.F_SETFD, old | _FD_CLOEXEC)
-        else:
-            fcntl.fcntl(fd, fcntl.F_SETFD, old & ~_FD_CLOEXEC)
-
-    if have_posixsubprocess:
-        _create_pipe = _posixsubprocess.cloexec_pipe
-    else:
-        def __create_pipe() -> Tuple[int, int]:
-            fds = os.pipe()
-            _set_cloexec(fds[0], True)
-            _set_cloexec(fds[1], True)
-            return fds
-        _create_pipe = __create_pipe
-
-__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
-           "getoutput", "check_output", "CalledProcessError"]
-
-if mswindows:
-    from _subprocess import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
-                             STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
-                             STD_ERROR_HANDLE, SW_HIDE,
-                             STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW)
-
-    __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
-                    "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
-                    "STD_ERROR_HANDLE", "SW_HIDE",
-                    "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW"])
-try:
-    MAXFD = os.sysconf("SC_OPEN_MAX")
-except:
-    MAXFD = 256
-
-# This lists holds Popen instances for which the underlying process had not
-# exited at the time its __del__ method got called: those processes are wait()ed
-# for synchronously from _cleanup() when a new Popen object is created, to avoid
-# zombie processes.
-_active = []  # type: List[Popen]
-
-def _cleanup() -> None:
-    for inst in _active[:]:
-        res = inst._internal_poll(_deadstate=sys.maxsize)
-        if res is not None:
-            try:
-                _active.remove(inst)
-            except ValueError:
-                # This can happen if two threads create a new Popen instance.
-                # It's harmless that it was already removed, so ignore.
-                pass
-
-PIPE = -1
-STDOUT = -2
-
-
-def _eintr_retry_call(func: Any, *args: Any) -> Any:
-    while True:
-        try:
-            return func(*args)
-        except (OSError, IOError) as e:
-            if e.errno == errno.EINTR:
-                continue
-            raise
-
-
-def call(*popenargs: Any, **kwargs: Any) -> int:
-    """Run command with arguments.  Wait for command to complete, then
-    return the returncode attribute.
-
-    The arguments are the same as for the Popen constructor.  Example:
-
-    retcode = call(["ls", "-l"])
-    """
-    return Popen(*popenargs, **kwargs).wait()
-
-
-def check_call(*popenargs: Any, **kwargs: Any) -> int:
-    """Run command with arguments.  Wait for command to complete.  If
-    the exit code was zero then return, otherwise raise
-    CalledProcessError.  The CalledProcessError object will have the
-    return code in the returncode attribute.
-
-    The arguments are the same as for the Popen constructor.  Example:
-
-    check_call(["ls", "-l"])
-    """
-    retcode = call(*popenargs, **kwargs)
-    if retcode:
-        cmd = kwargs.get("args")
-        if cmd is None:
-            cmd = popenargs[0]
-        raise CalledProcessError(retcode, cmd)
-    return 0
-
-
-def check_output(*popenargs: Any, **kwargs: Any) -> bytes:
-    r"""Run command with arguments and return its output as a byte string.
-
-    If the exit code was non-zero it raises a CalledProcessError.  The
-    CalledProcessError object will have the return code in the returncode
-    attribute and output in the output attribute.
-
-    The arguments are the same as for the Popen constructor.  Example:
-
-    >>> check_output(["ls", "-l", "/dev/null"])
-    b'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n'
-
-    The stdout argument is not allowed as it is used internally.
-    To capture standard error in the result, use stderr=STDOUT.
-
-    >>> check_output(["/bin/sh", "-c",
-    ...               "ls -l non_existent_file ; exit 0"],
-    ...              stderr=STDOUT)
-    b'ls: non_existent_file: No such file or directory\n'
-    """
-    if 'stdout' in kwargs:
-        raise ValueError('stdout argument not allowed, it will be overridden.')
-    kwargs['stdout'] = PIPE
-    process = Popen(*popenargs, **kwargs)
-    output, unused_err = process.communicate()
-    retcode = process.poll()
-    if retcode:
-        cmd = kwargs.get("args")
-        if cmd is None:
-            cmd = popenargs[0]
-        raise CalledProcessError(retcode, cmd, output=output)
-    return output
-
-
-def list2cmdline(seq: Sequence[str]) -> str:
-    """
-    Translate a sequence of arguments into a command line
-    string, using the same rules as the MS C runtime:
-
-    1) Arguments are delimited by white space, which is either a
-       space or a tab.
-
-    2) A string surrounded by double quotation marks is
-       interpreted as a single argument, regardless of white space
-       contained within.  A quoted string can be embedded in an
-       argument.
-
-    3) A double quotation mark preceded by a backslash is
-       interpreted as a literal double quotation mark.
-
-    4) Backslashes are interpreted literally, unless they
-       immediately precede a double quotation mark.
-
-    5) If backslashes immediately precede a double quotation mark,
-       every pair of backslashes is interpreted as a literal
-       backslash.  If the number of backslashes is odd, the last
-       backslash escapes the next double quotation mark as
-       described in rule 3.
-    """
-
-    # See
-    # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
-    # or search http://msdn.microsoft.com for
-    # "Parsing C++ Command-Line Arguments"
-    result = []  # type: List[str]
-    needquote = False
-    for arg in seq:
-        bs_buf = []  # type: List[str]
-
-        # Add a space to separate this argument from the others
-        if result:
-            result.append(' ')
-
-        needquote = (" " in arg) or ("\t" in arg) or not arg
-        if needquote:
-            result.append('"')
-
-        for c in arg:
-            if c == '\\':
-                # Don't know if we need to double yet.
-                bs_buf.append(c)
-            elif c == '"':
-                # Double backslashes.
-                result.append('\\' * len(bs_buf)*2)
-                bs_buf = []
-                result.append('\\"')
-            else:
-                # Normal char
-                if bs_buf:
-                    result.extend(bs_buf)
-                    bs_buf = []
-                result.append(c)
-
-        # Add remaining backslashes, if any.
-        if bs_buf:
-            result.extend(bs_buf)
-
-        if needquote:
-            result.extend(bs_buf)
-            result.append('"')
-
-    return ''.join(result)
-
-
-# Various tools for executing commands and looking at their output and status.
-#
-# NB This only works (and is only relevant) for POSIX.
-
-def getstatusoutput(cmd: str) -> Tuple[int, str]:
-    """Return (status, output) of executing cmd in a shell.
-
-    Execute the string 'cmd' in a shell with os.popen() and return a 2-tuple
-    (status, output).  cmd is actually run as '{ cmd ; } 2>&1', so that the
-    returned output will contain output or error messages.  A trailing newline
-    is stripped from the output.  The exit status for the command can be
-    interpreted according to the rules for the C function wait().  Example:
-
-    >>> import subprocess
-    >>> subprocess.getstatusoutput('ls /bin/ls')
-    (0, '/bin/ls')
-    >>> subprocess.getstatusoutput('cat /bin/junk')
-    (256, 'cat: /bin/junk: No such file or directory')
-    >>> subprocess.getstatusoutput('/bin/junk')
-    (256, 'sh: /bin/junk: not found')
-    """
-    pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
-    text = pipe.read()
-    sts = pipe.close()
-    if sts is None: sts = 0
-    if text[-1:] == '\n': text = text[:-1]
-    return sts, text
-
-
-def getoutput(cmd: str) -> str:
-    """Return output (stdout or stderr) of executing cmd in a shell.
-
-    Like getstatusoutput(), except the exit status is ignored and the return
-    value is a string containing the command's output.  Example:
-
-    >>> import subprocess
-    >>> subprocess.getoutput('ls /bin/ls')
-    '/bin/ls'
-    """
-    return getstatusoutput(cmd)[1]
-
-
-_PLATFORM_DEFAULT_CLOSE_FDS = object()
-
-
-class Popen(object):
-    def __init__(self, args: Sequence[Any], bufsize: int = 0,
-                 executable: str = None, stdin: Any = None,
-                 stdout: Any = None, stderr: Any = None,
-                 preexec_fn: Callable[[], Any] = None,
-                 close_fds: Any = _PLATFORM_DEFAULT_CLOSE_FDS,
-                 shell: int = False, cwd: str = None,
-                 env: Mapping[str, str] = None,
-                 universal_newlines: int = False,
-                 startupinfo: 'STARTUPINFO' = None, creationflags: int = 0,
-                 restore_signals: bool = True, start_new_session: bool = False,
-                 pass_fds: Any = ()) -> None:
-        """Create new Popen instance."""
-        _cleanup()
-
-        self._child_created = False
-        if bufsize is None:
-            bufsize = 0  # Restore default
-        if not isinstance(bufsize, int):
-            raise TypeError("bufsize must be an integer")
-
-        if mswindows:
-            if preexec_fn is not None:
-                raise ValueError("preexec_fn is not supported on Windows "
-                                 "platforms")
-            any_stdio_set = (stdin is not None or stdout is not None or
-                             stderr is not None)
-            if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS:
-                if any_stdio_set:
-                    close_fds = False
-                else:
-                    close_fds = True
-            elif close_fds and any_stdio_set:
-                raise ValueError(
-                        "close_fds is not supported on Windows platforms"
-                        " if you redirect stdin/stdout/stderr")
-        else:
-            # POSIX
-            if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS:
-                close_fds = True
-            if pass_fds and not close_fds:
-                warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
-                close_fds = True
-            if startupinfo is not None:
-                raise ValueError("startupinfo is only supported on Windows "
-                                 "platforms")
-            if creationflags != 0:
-                raise ValueError("creationflags is only supported on Windows "
-                                 "platforms")
-
-        self.stdin = None # type: IO[Any]
-        self.stdout = None # type: IO[Any]
-        self.stderr = None # type: IO[Any]
-        self.pid = None # type: int
-        self.returncode = None # type: int
-        self.universal_newlines = universal_newlines
-
-        # Input and output objects. The general principle is like
-        # this:
-        #
-        # Parent                   Child
-        # ------                   -----
-        # p2cwrite   ---stdin--->  p2cread
-        # c2pread    <--stdout---  c2pwrite
-        # errread    <--stderr---  errwrite
-        #
-        # On POSIX, the child objects are file descriptors.  On
-        # Windows, these are Windows file handles.  The parent objects
-        # are file descriptors on both platforms.  The parent objects
-        # are -1 when not using PIPEs. The child objects are -1
-        # when not redirecting.
-
-        (p2cread, p2cwrite,
-         c2pread, c2pwrite,
-         errread, errwrite) = self._get_handles(stdin, stdout, stderr)
-
-        # We wrap OS handles *before* launching the child, otherwise a
-        # quickly terminating child could make our fds unwrappable
-        # (see #8458).
-
-        if mswindows:
-            if p2cwrite != -1:
-                p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
-            if c2pread != -1:
-                c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
-            if errread != -1:
-                errread = msvcrt.open_osfhandle(errread.Detach(), 0)
-
-        if p2cwrite != -1:
-            self.stdin = io.open(p2cwrite, 'wb', bufsize)
-            if self.universal_newlines:
-                self.stdin = io.TextIOWrapper(self.stdin, write_through=True)
-        if c2pread != -1:
-            self.stdout = io.open(c2pread, 'rb', bufsize)
-            if universal_newlines:
-                self.stdout = io.TextIOWrapper(self.stdout)
-        if errread != -1:
-            self.stderr = io.open(errread, 'rb', bufsize)
-            if universal_newlines:
-                self.stderr = io.TextIOWrapper(self.stderr)
-
-        try:
-            self._execute_child(args, executable, preexec_fn, close_fds,
-                                pass_fds, cwd, env, universal_newlines,
-                                startupinfo, creationflags, shell,
-                                p2cread, p2cwrite,
-                                c2pread, c2pwrite,
-                                errread, errwrite,
-                                restore_signals, start_new_session)
-        except:
-            # Cleanup if the child failed starting
-            for f in filter(None, [self.stdin, self.stdout, self.stderr]):
-                try:
-                    f.close()
-                except EnvironmentError:
-                    # Ignore EBADF or other errors
-                    pass
-            raise
-
-
-    def _translate_newlines(self, data: bytes, encoding: str) -> str:
-        data = data.replace(b"\r\n", b"\n").replace(b"\r", b"\n")
-        return data.decode(encoding)
-
-    def __enter__(self) -> 'Popen':
-        return self
-
-    def __exit__(self, type: type, value: BaseException,
-                 traceback: TracebackType) -> bool:
-        if self.stdout:
-            self.stdout.close()
-        if self.stderr:
-            self.stderr.close()
-        if self.stdin:
-            self.stdin.close()
-        # Wait for the process to terminate, to avoid zombies.
-        self.wait()
-
-    def __del__(self, _maxsize: int = sys.maxsize,
-                _active: List['Popen'] = _active) -> None:
-        # If __init__ hasn't had a chance to execute (e.g. if it
-        # was passed an undeclared keyword argument), we don't
-        # have a _child_created attribute at all.
-        if not getattr(self, '_child_created', False):
-            # We didn't get to successfully create a child process.
-            return
-        # In case the child hasn't been waited on, check if it's done.
-        self._internal_poll(_deadstate=_maxsize)
-        if self.returncode is None and _active is not None:
-            # Child is still running, keep us alive until we can wait on it.
-            _active.append(self)
-
-
-    def communicate(self, input: Any = None) -> Tuple[Any, Any]:
-        """Interact with process: Send data to stdin.  Read data from
-        stdout and stderr, until end-of-file is reached.  Wait for
-        process to terminate.  The optional input argument should be a
-        string to be sent to the child process, or None, if no data
-        should be sent to the child.
-
-        communicate() returns a tuple (stdout, stderr)."""
-
-        # Optimization: If we are only using one pipe, or no pipe at
-        # all, using select() or threads is unnecessary.
-        if [self.stdin, self.stdout, self.stderr].count(None) >= 2:
-            stdout = None # type: IO[Any]
-            stderr = None # type: IO[Any]
-            if self.stdin:
-                if input:
-                    try:
-                        self.stdin.write(input)
-                    except IOError as e:
-                        if e.errno != errno.EPIPE and e.errno != errno.EINVAL:
-                            raise
-                self.stdin.close()
-            elif self.stdout:
-                stdout = _eintr_retry_call(self.stdout.read)
-                self.stdout.close()
-            elif self.stderr:
-                stderr = _eintr_retry_call(self.stderr.read)
-                self.stderr.close()
-            self.wait()
-            return (stdout, stderr)
-
-        return self._communicate(input)
-
-
-    def poll(self) -> int:
-        return self._internal_poll()
-
-
-    if mswindows:
-        #
-        # Windows methods
-        #
-        def _get_handles(self, stdin: Any, stdout: Any,
-                         stderr: Any) -> Tuple[Any, Any, Any, Any, Any, Any]:
-            """Construct and return tuple with IO objects:
-            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
-            """
-            if stdin is None and stdout is None and stderr is None:
-                return (-1, -1, -1, -1, -1, -1)
-
-            p2cread, p2cwrite = -1, -1 # type: (Any, Any)
-            c2pread, c2pwrite = -1, -1 # type: (Any, Any)
-            errread, errwrite = -1, -1 # type: (Any, Any)
-
-            if stdin is None:
-                p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE)
-                if p2cread is None:
-                    p2cread, _ = _subprocess.CreatePipe(None, 0)
-            elif stdin == PIPE:
-                p2cread, p2cwrite = _subprocess.CreatePipe(None, 0)
-            elif isinstance(stdin, int):
-                p2cread = msvcrt.get_osfhandle(stdin)
-            else:
-                # Assuming file-like object
-                p2cread = msvcrt.get_osfhandle(stdin.fileno())
-            p2cread = self._make_inheritable(p2cread)
-
-            if stdout is None:
-                c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE)
-                if c2pwrite is None:
-                    _, c2pwrite = _subprocess.CreatePipe(None, 0)
-            elif stdout == PIPE:
-                c2pread, c2pwrite = _subprocess.CreatePipe(None, 0)
-            elif isinstance(stdout, int):
-                c2pwrite = msvcrt.get_osfhandle(stdout)
-            else:
-                # Assuming file-like object
-                c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
-            c2pwrite = self._make_inheritable(c2pwrite)
-
-            if stderr is None:
-                errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE)
-                if errwrite is None:
-                    _, errwrite = _subprocess.CreatePipe(None, 0)
-            elif stderr == PIPE:
-                errread, errwrite = _subprocess.CreatePipe(None, 0)
-            elif stderr == STDOUT:
-                errwrite = c2pwrite
-            elif isinstance(stderr, int):
-                errwrite = msvcrt.get_osfhandle(stderr)
-            else:
-                # Assuming file-like object
-                errwrite = msvcrt.get_osfhandle(stderr.fileno())
-            errwrite = self._make_inheritable(errwrite)
-
-            return (p2cread, p2cwrite,
-                    c2pread, c2pwrite,
-                    errread, errwrite)
-
-
-        def _make_inheritable(self, handle: _subprocess.Handle) -> int:
-            """Return a duplicate of handle, which is inheritable"""
-            return _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(),
-                                handle, _subprocess.GetCurrentProcess(), 0, 1,
-                                _subprocess.DUPLICATE_SAME_ACCESS)
-
-
-        def _find_w9xpopen(self) -> str:
-            """Find and return absolut path to w9xpopen.exe"""
-            w9xpopen = os.path.join(
-                            os.path.dirname(_subprocess.GetModuleFileName(0)),
-                                    "w9xpopen.exe")
-            if not os.path.exists(w9xpopen):
-                # Eeek - file-not-found - possibly an embedding
-                # situation - see if we can locate it in sys.exec_prefix
-                w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
-                                        "w9xpopen.exe")
-                if not os.path.exists(w9xpopen):
-                    raise RuntimeError("Cannot locate w9xpopen.exe, which is "
-                                       "needed for Popen to work with your "
-                                       "shell or platform.")
-            return w9xpopen
-
-
-        def _execute_child(self, args: Sequence[str], executable: str,
-                           preexec_fn: Callable[[], Any], close_fds: Any,
-                           pass_fds: Any, cwd: str, env: Mapping[str, str],
-                           universal_newlines: int,
-                           startupinfo: STARTUPINFO, creationflags: int,
-                           shell: int,
-                           p2cread: Any, p2cwrite: Any,
-                           c2pread: Any, c2pwrite: Any,
-                           errread: Any, errwrite: Any,
-                           restore_signals: bool,
-                           start_new_session: bool) -> None:
-            """Execute program (MS Windows version)"""
-
-            assert not pass_fds, "pass_fds not supported on Windows."
-
-            if not isinstance(args, str):
-                args = list2cmdline(args)
-
-            # Process startup details
-            if startupinfo is None:
-                startupinfo = STARTUPINFO()
-            if -1 not in (p2cread, c2pwrite, errwrite):
-                startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES
-                startupinfo.hStdInput = p2cread
-                startupinfo.hStdOutput = c2pwrite
-                startupinfo.hStdError = errwrite
-
-            if shell:
-                startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
-                startupinfo.wShowWindow = _subprocess.SW_HIDE
-                comspec = os.environ.get("COMSPEC", "cmd.exe")
-                args = '{} /c "{}"'.format (comspec, args)
-                if (_subprocess.GetVersion() >= 0x80000000 or
-                        os.path.basename(comspec).lower() == "command.com"):
-                    # Win9x, or using command.com on NT. We need to
-                    # use the w9xpopen intermediate program. For more
-                    # information, see KB Q150956
-                    # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
-                    w9xpopen = self._find_w9xpopen()
-                    args = '"%s" %s' % (w9xpopen, args)
-                    # Not passing CREATE_NEW_CONSOLE has been known to
-                    # cause random failures on win9x.  Specifically a
-                    # dialog: "Your program accessed mem currently in
-                    # use at xxx" and a hopeful warning about the
-                    # stability of your system.  Cost is Ctrl+C won't
-                    # kill children.
-                    creationflags |= _subprocess.CREATE_NEW_CONSOLE
-
-            # Start the process
-            try:
-                hp, ht, pid, tid = _subprocess.CreateProcess(executable,
-                                         cast(str, args),
-                                         # no special security
-                                         None, None,
-                                         int(not close_fds),
-                                         creationflags,
-                                         env,
-                                         cwd,
-                                         startupinfo)
-            except pywintypes.error as e:
-                # Translate pywintypes.error to WindowsError, which is
-                # a subclass of OSError.  FIXME: We should really
-                # translate errno using _sys_errlist (or similar), but
-                # how can this be done from Python?
-                raise WindowsError(*e.args)
-            finally:
-                # Child is launched. Close the parent's copy of those pipe
-                # handles that only the child should have open.  You need
-                # to make sure that no handles to the write end of the
-                # output pipe are maintained in this process or else the
-                # pipe will not close when the child process exits and the
-                # ReadFile will hang.
-                if p2cread != -1:
-                    p2cread.Close()
-                if c2pwrite != -1:
-                    c2pwrite.Close()
-                if errwrite != -1:
-                    errwrite.Close()
-
-            # Retain the process handle, but close the thread handle
-            self._child_created = True
-            self._handle = hp
-            self.pid = pid
-            ht.Close()
-
-        def _internal_poll(self, _deadstate: int = None) -> int:
-            """Check if child process has terminated.  Returns returncode
-            attribute.
-
-            This method is called by __del__, so it can only refer to objects
-            in its local scope.
-
-            """
-            return self._internal_poll_win(_deadstate)
-
-        from _subprocess import Handle
-
-        def _internal_poll_win(self, _deadstate: int = None,
-                _WaitForSingleObject: Callable[[Handle, int], int] =
-                               _subprocess.WaitForSingleObject,
-                _WAIT_OBJECT_0: int = _subprocess.WAIT_OBJECT_0,
-                _GetExitCodeProcess: Callable[[Handle], int] =
-                                    _subprocess.GetExitCodeProcess) -> int:
-            if self.returncode is None:
-                if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
-                    self.returncode = _GetExitCodeProcess(self._handle)
-            return self.returncode
-
-
-        def wait(self) -> int:
-            """Wait for child process to terminate.  Returns returncode
-            attribute."""
-            if self.returncode is None:
-                _subprocess.WaitForSingleObject(self._handle,
-                                                _subprocess.INFINITE)
-                self.returncode = _subprocess.GetExitCodeProcess(self._handle)
-            return self.returncode
-
-
-        def _readerthread(self, fh: IO[AnyStr], buffer: List[AnyStr]) -> None:
-            buffer.append(fh.read())
-            fh.close()
-
-
-        def _communicate(self, input: Any) -> Tuple[Any, Any]:
-            stdout = cast(Any, None) # Return
-            stderr = cast(Any, None) # Return
-
-            if self.stdout:
-                stdout = []
-                stdout_thread = threading.Thread(target=self._readerthread,
-                                                 args=(self.stdout, stdout))
-                stdout_thread.daemon = True
-                stdout_thread.start()
-            if self.stderr:
-                stderr = []
-                stderr_thread = threading.Thread(target=self._readerthread,
-                                                 args=(self.stderr, stderr))
-                stderr_thread.daemon = True
-                stderr_thread.start()
-
-            if self.stdin:
-                if input is not None:
-                    try:
-                        self.stdin.write(input)
-                    except IOError as e:
-                        if e.errno != errno.EPIPE:
-                            raise
-                self.stdin.close()
-
-            if self.stdout:
-                stdout_thread.join()
-            if self.stderr:
-                stderr_thread.join()
-
-            # All data exchanged.  Translate lists into strings.
-            if stdout is not None:
-                stdout = stdout[0]
-            if stderr is not None:
-                stderr = stderr[0]
-
-            self.wait()
-            return (stdout, stderr)
-
-        def send_signal(self, sig: int) -> None:
-            """Send a signal to the process
-            """
-            if sig == signal.SIGTERM:
-                self.terminate()
-            elif sig == signal.CTRL_C_EVENT:
-                os.kill(self.pid, signal.CTRL_C_EVENT)
-            elif sig == signal.CTRL_BREAK_EVENT:
-                os.kill(self.pid, signal.CTRL_BREAK_EVENT)
-            else:
-                raise ValueError("Unsupported signal: {}".format(sig))
-
-        def terminate(self) -> None:
-            """Terminates the process
-            """
-            _subprocess.TerminateProcess(self._handle, 1)
-
-        def kill(self) -> None:
-            """Terminates the process
-            """
-            self.terminate()
-
-    else:
-        #
-        # POSIX methods
-        #
-        def _get_handles(self, stdin: Any, stdout: Any,
-                         stderr: Any) -> Tuple[Any, Any, Any, Any, Any, Any]:
-            """Construct and return tuple with IO objects:
-            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
-            """
-            p2cread, p2cwrite = -1, -1
-            c2pread, c2pwrite = -1, -1
-            errread, errwrite = -1, -1
-
-            if stdin is None:
-                pass
-            elif stdin == PIPE:
-                p2cread, p2cwrite = _create_pipe()
-            elif isinstance(stdin, int):
-                p2cread = stdin
-            else:
-                # Assuming file-like object
-                p2cread = stdin.fileno()
-
-            if stdout is None:
-                pass
-            elif stdout == PIPE:
-                c2pread, c2pwrite = _create_pipe()
-            elif isinstance(stdout, int):
-                c2pwrite = stdout
-            else:
-                # Assuming file-like object
-                c2pwrite = stdout.fileno()
-
-            if stderr is None:
-                pass
-            elif stderr == PIPE:
-                errread, errwrite = _create_pipe()
-            elif stderr == STDOUT:
-                errwrite = c2pwrite
-            elif isinstance(stderr, int):
-                errwrite = stderr
-            else:
-                # Assuming file-like object
-                errwrite = stderr.fileno()
-
-            return (p2cread, p2cwrite,
-                    c2pread, c2pwrite,
-                    errread, errwrite)
-
-
-        def _close_fds(self, fds_to_keep: Set[int]) -> None:
-            start_fd = 3
-            for fd in sorted(fds_to_keep):
-                if fd >= start_fd:
-                    os.closerange(start_fd, fd)
-                    start_fd = fd + 1
-            if start_fd <= MAXFD:
-                os.closerange(start_fd, MAXFD)
-
-
-        def _execute_child(self, args: Sequence[str], executable: str,
-                           preexec_fn: Callable[[], Any], close_fds: Any,
-                           pass_fds: Any, cwd: str, env: Mapping[str, str],
-                           universal_newlines: int,
-                           startupinfo: 'STARTUPINFO', creationflags: int,
-                           shell: int,
-                           p2cread: Any, p2cwrite: Any,
-                           c2pread: Any, c2pwrite: Any,
-                           errread: Any, errwrite: Any,
-                           restore_signals: bool,
-                           start_new_session: bool) -> None:
-            """Execute program (POSIX version)"""
-
-            if isinstance(args, str):
-                args = [args]
-            else:
-                args = list(args)
-
-            if shell:
-                args = ["/bin/sh", "-c"] + args
-                if executable:
-                    args[0] = executable
-
-            if executable is None:
-                executable = args[0]
-
-            # For transferring possible exec failure from child to parent.
-            # Data format: "exception name:hex errno:description"
-            # Pickle is not used; it is complex and involves memory allocation.
-            errpipe_read, errpipe_write = _create_pipe()
-            try:
-                try:
-
-                    if have_posixsubprocess:
-                        # We must avoid complex work that could involve
-                        # malloc or free in the child process to avoid
-                        # potential deadlocks, thus we do all this here.
-                        # and pass it to fork_exec()
-
-                        if env is not None:
-                            env_list = [os.fsencode(k) + b'=' + os.fsencode(v)
-                                        for k, v in env.items()]
-                        else:
-                            env_list = None  # Use execv instead of execve.
-                        executable_enc = os.fsencode(executable)
-                        if os.path.dirname(executable_enc):
-                            executable_list = (executable_enc,) # type: tuple
-                        else:
-                            # This matches the behavior of os._execvpe().
-                            executable_list = tuple(
-                                os.path.join(os.fsencode(dir), executable_enc)
-                                for dir in os.get_exec_path(env))
-                        fds_to_keep = set(pass_fds)
-                        fds_to_keep.add(errpipe_write)
-                        self.pid = _posixsubprocess.fork_exec(
-                                args, executable_list,
-                                close_fds, sorted(fds_to_keep), cwd, env_list,
-                                p2cread, p2cwrite, c2pread, c2pwrite,
-                                errread, errwrite,
-                                errpipe_read, errpipe_write,
-                                restore_signals, start_new_session, preexec_fn)
-                        self._child_created = True
-                    else:
-                        # Pure Python implementation: It is not thread safe.
-                        # This implementation may deadlock in the child if your
-                        # parent process has any other threads running.
-
-                        gc_was_enabled = gc.isenabled()
-                        # Disable gc to avoid bug where gc -> file_dealloc ->
-                        # write to stderr -> hang.  See issue1336
-                        gc.disable()
-                        try:
-                            self.pid = os.fork()
-                        except:
-                            if gc_was_enabled:
-                                gc.enable()
-                            raise
-                        self._child_created = True
-                        if self.pid == 0:
-                            # Child
-                            try:
-                                # Close parent's pipe ends
-                                if p2cwrite != -1:
-                                    os.close(p2cwrite)
-                                if c2pread != -1:
-                                    os.close(c2pread)
-                                if errread != -1:
-                                    os.close(errread)
-                                os.close(errpipe_read)
-
-                                # When duping fds, if there arises a situation
-                                # where one of the fds is either 0, 1 or 2, it
-                                # is possible that it is overwritten (#12607).
-                                if c2pwrite == 0:
-                                    c2pwrite = os.dup(c2pwrite)
-                                if errwrite == 0 or errwrite == 1:
-                                    errwrite = os.dup(errwrite)
-
-                                # Dup fds for child
-                                def _dup2(a: int, b: int) -> None:
-                                    # dup2() removes the CLOEXEC flag but
-                                    # we must do it ourselves if dup2()
-                                    # would be a no-op (issue #10806).
-                                    if a == b:
-                                        _set_cloexec(a, False)
-                                    elif a != -1:
-                                        os.dup2(a, b)
-                                _dup2(p2cread, 0)
-                                _dup2(c2pwrite, 1)
-                                _dup2(errwrite, 2)
-
-                                # Close pipe fds.  Make sure we don't close the
-                                # same fd more than once, or standard fds.
-                                closed = set()  # type: Set[int]
-                                for fd in [p2cread, c2pwrite, errwrite]:
-                                    if fd > 2 and fd not in closed:
-                                        os.close(fd)
-                                        closed.add(fd)
-
-                                # Close all other fds, if asked for
-                                if close_fds:
-                                    fds_to_keep = set(pass_fds)
-                                    fds_to_keep.add(errpipe_write)
-                                    self._close_fds(fds_to_keep)
-
-
-                                if cwd is not None:
-                                    os.chdir(cwd)
-
-                                # This is a copy of Python/pythonrun.c
-                                # _Py_RestoreSignals().  If that were exposed
-                                # as a sys._py_restoresignals func it would be
-                                # better.. but this pure python implementation
-                                # isn't likely to be used much anymore.
-                                if restore_signals:
-                                    signals = ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ')
-                                    for sig in signals:
-                                        if hasattr(signal, sig):
-                                            signal.signal(getattr(signal, sig),
-                                                          signal.SIG_DFL)
-
-                                if start_new_session and hasattr(os, 'setsid'):
-                                    os.setsid()
-
-                                if preexec_fn:
-                                    preexec_fn()
-
-                                if env is None:
-                                    os.execvp(executable, args)
-                                else:
-                                    os.execvpe(executable, args, env)
-
-                            except:
-                                try:
-                                    exc_type, exc_value = sys.exc_info()[:2]
-                                    if isinstance(exc_value, OSError):
-                                        errno_num = exc_value.errno
-                                    else:
-                                        errno_num = 0
-                                    message = '%s:%x:%s' % (exc_type.__name__,
-                                                            errno_num, exc_value)
-                                    messageb = message.encode(errors="surrogatepass")
-                                    os.write(errpipe_write, messageb)
-                                except Exception:
-                                    # We MUST not allow anything odd happening
-                                    # above to prevent us from exiting below.
-                                    pass
-
-                            # This exitcode won't be reported to applications
-                            # so it really doesn't matter what we return.
-                            os._exit(255)
-
-                        # Parent
-                        if gc_was_enabled:
-                            gc.enable()
-                finally:
-                    # be sure the FD is closed no matter what
-                    os.close(errpipe_write)
-
-                if p2cread != -1 and p2cwrite != -1:
-                    os.close(p2cread)
-                if c2pwrite != -1 and c2pread != -1:
-                    os.close(c2pwrite)
-                if errwrite != -1 and errread != -1:
-                    os.close(errwrite)
-
-                # Wait for exec to fail or succeed; possibly raising an
-                # exception (limited in size)
-                data = bytearray()
-                while True:
-                    part = _eintr_retry_call(os.read, errpipe_read, 50000)
-                    data += part
-                    if not part or len(data) > 50000:
-                        break
-            finally:
-                # be sure the FD is closed no matter what
-                os.close(errpipe_read)
-
-            if data:
-                try:
-                    _eintr_retry_call(os.waitpid, self.pid, 0)
-                except OSError as e:
-                    if e.errno != errno.ECHILD:
-                        raise
-                try:
-                    (exception_name, hex_errno,
-                     err_msg_b) = bytes(data).split(b':', 2)
-                except ValueError:
-                    print('Bad exception data:', repr(data))
-                    exception_name = b'RuntimeError'
-                    hex_errno = b'0'
-                    err_msg_b = b'Unknown'
-                child_exception_type = getattr(
-                        builtins, exception_name.decode('ascii'),
-                        RuntimeError)
-                for fd in (p2cwrite, c2pread, errread):
-                    if fd != -1:
-                        os.close(fd)
-                err_msg = err_msg_b.decode(errors="surrogatepass")
-                if issubclass(child_exception_type, OSError) and hex_errno:
-                    errno_num = int(hex_errno, 16)
-                    if errno_num != 0:
-                        err_msg = os.strerror(errno_num)
-                        if errno_num == errno.ENOENT:
-                            err_msg += ': ' + repr(args[0])
-                    raise child_exception_type(errno_num, err_msg)
-                raise child_exception_type(err_msg)
-
-
-        def _handle_exitstatus(
-                self, sts: int,
-                _WIFSIGNALED: Callable[[int], bool] = os.WIFSIGNALED,
-                _WTERMSIG: Callable[[int], bool] = os.WTERMSIG,
-                _WIFEXITED: Callable[[int], bool] = os.WIFEXITED,
-                _WEXITSTATUS: Callable[[int], bool] = os.WEXITSTATUS) -> None:
-            # This method is called (indirectly) by __del__, so it cannot
-            # refer to anything outside of its local scope."""
-            if _WIFSIGNALED(sts):
-                self.returncode = -_WTERMSIG(sts)
-            elif _WIFEXITED(sts):
-                self.returncode = _WEXITSTATUS(sts)
-            else:
-                # Should never happen
-                raise RuntimeError("Unknown child exit status!")
-
-
-        def _internal_poll(self, _deadstate: int = None) -> int:
-            """Check if child process has terminated.  Returns returncode
-            attribute.
-
-            This method is called by __del__, so it cannot reference anything
-            outside of the local scope (nor can any methods it calls).
-
-            """
-            return self._internal_poll_posix(_deadstate)
-
-        def _internal_poll_posix(self, _deadstate: int = None,
-                                 _waitpid: Callable[[int, int],
-                                                 Tuple[int, int]] = os.waitpid,
-                                 _WNOHANG: int = os.WNOHANG,
-                                 _os_error: Any = os.error) -> int:
-            if self.returncode is None:
-                try:
-                    pid, sts = _waitpid(self.pid, _WNOHANG)
-                    if pid == self.pid:
-                        self._handle_exitstatus(sts)
-                except _os_error:
-                    if _deadstate is not None:
-                        self.returncode = _deadstate
-            return self.returncode
-
-
-        def wait(self) -> int:
-            """Wait for child process to terminate.  Returns returncode
-            attribute."""
-            if self.returncode is None:
-                try:
-                    pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
-                except OSError as e:
-                    if e.errno != errno.ECHILD:
-                        raise
-                    # This happens if SIGCLD is set to be ignored or waiting
-                    # for child processes has otherwise been disabled for our
-                    # process.  This child is dead, we can't get the status.
-                    sts = 0
-                self._handle_exitstatus(sts)
-            return self.returncode
-
-
-        def _communicate(self, input: Any) -> Tuple[Any, Any]:
-            if self.stdin:
-                # Flush stdio buffer.  This might block, if the user has
-                # been writing to .stdin in an uncontrolled fashion.
-                self.stdin.flush()
-                if not input:
-                    self.stdin.close()
-
-            if _has_poll:
-                stdout, stderr = self._communicate_with_poll(input)
-            else:
-                stdout, stderr = self._communicate_with_select(input)
-
-            # All data exchanged.  Translate lists into strings.
-            if stdout is not None:
-                stdout2 = b''.join(stdout)
-            else:
-                stdout2 = None
-            if stderr is not None:
-                stderr2 = b''.join(stderr)
-            else:
-                stderr2 = None
-
-            # Translate newlines, if requested.
-            # This also turns bytes into strings.
-            stdout3 = cast(Any, stdout2)
-            stderr3 = cast(Any, stderr2)
-            if self.universal_newlines:
-                if stdout is not None:
-                    stdout3 = self._translate_newlines(
-                        stdout2, cast(TextIO, self.stdout).encoding)
-                if stderr is not None:
-                    stderr3 = self._translate_newlines(
-                        stderr2, cast(TextIO, self.stderr).encoding)
-
-            self.wait()
-            return (stdout3, stderr3)
-
-
-        def _communicate_with_poll(self, input: Any) -> Tuple[List[bytes],
-                                                              List[bytes]]:
-            stdout = None # type: List[bytes] # Return
-            stderr = None # type: List[bytes] # Return
-            fd2file = {}  # type: Dict[int, Any]
-            fd2output = {}  # type: Dict[int, List[bytes]]
-
-            poller = select.poll()
-            def register_and_append(file_obj: IO[Any], eventmask: int) -> None:
-                poller.register(file_obj.fileno(), eventmask)
-                fd2file[file_obj.fileno()] = file_obj
-
-            def close_unregister_and_remove(fd: int) -> None:
-                poller.unregister(fd)
-                fd2file[fd].close()
-                fd2file.pop(fd)
-
-            if self.stdin and input:
-                register_and_append(self.stdin, select.POLLOUT)
-
-            select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI
-            if self.stdout:
-                register_and_append(self.stdout, select_POLLIN_POLLPRI)
-                fd2output[self.stdout.fileno()] = stdout = []
-            if self.stderr:
-                register_and_append(self.stderr, select_POLLIN_POLLPRI)
-                fd2output[self.stderr.fileno()] = stderr = []
-
-            input_offset = 0
-            while fd2file:
-                try:
-                    ready = poller.poll()
-                except select.error as e:
-                    if e.args[0] == errno.EINTR:
-                        continue
-                    raise
-
-                # XXX Rewrite these to use non-blocking I/O on the
-                # file objects; they are no longer using C stdio!
-
-                for fd, mode in ready:
-                    if mode & select.POLLOUT:
-                        chunk = input[input_offset : input_offset + _PIPE_BUF]
-                        try:
-                            input_offset += os.write(fd, chunk)
-                        except OSError as e2:
-                            if e2.errno == errno.EPIPE:
-                                close_unregister_and_remove(fd)
-                            else:
-                                raise
-                        else:
-                            if input_offset >= len(input):
-                                close_unregister_and_remove(fd)
-                    elif mode & select_POLLIN_POLLPRI:
-                        data = os.read(fd, 4096)
-                        if not data:
-                            close_unregister_and_remove(fd)
-                        fd2output[fd].append(data)
-                    else:
-                        # Ignore hang up or errors.
-                        close_unregister_and_remove(fd)
-
-            return (stdout, stderr)
-
-
-        def _communicate_with_select(self, input: Any) -> Tuple[List[bytes],
-                                                                List[bytes]]:
-            read_set = []  # type: List[IO[Any]]
-            write_set = []  # type: List[IO[Any]]
-            stdout = None # type: List[bytes] # Return
-            stderr = None # type: List[bytes] # Return
-
-            if self.stdin and input:
-                write_set.append(self.stdin)
-            if self.stdout:
-                read_set.append(self.stdout)
-                stdout = []
-            if self.stderr:
-                read_set.append(self.stderr)
-                stderr = []
-
-            input_offset = 0
-            while read_set or write_set:
-                try:
-                    rlist, wlist, xlist = select.select(read_set, write_set, [])
-                except select.error as e:
-                    if e.args[0] == errno.EINTR:
-                        continue
-                    raise
-
-                # XXX Rewrite these to use non-blocking I/O on the
-                # file objects; they are no longer using C stdio!
-
-                if self.stdin in wlist:
-                    chunk = input[input_offset : input_offset + _PIPE_BUF]
-                    try:
-                        bytes_written = os.write(self.stdin.fileno(), chunk)
-                    except OSError as oe:
-                        if oe.errno == errno.EPIPE:
-                            self.stdin.close()
-                            write_set.remove(self.stdin)
-                        else:
-                            raise
-                    else:
-                        input_offset += bytes_written
-                        if input_offset >= len(input):
-                            self.stdin.close()
-                            write_set.remove(self.stdin)
-
-                if self.stdout in rlist:
-                    data = os.read(self.stdout.fileno(), 1024)
-                    if not data:
-                        self.stdout.close()
-                        read_set.remove(self.stdout)
-                    stdout.append(data)
-
-                if self.stderr in rlist:
-                    data = os.read(self.stderr.fileno(), 1024)
-                    if not data:
-                        self.stderr.close()
-                        read_set.remove(self.stderr)
-                    stderr.append(data)
-
-            return (stdout, stderr)
-
-
-        def send_signal(self, sig: int) -> None:
-            """Send a signal to the process
-            """
-            os.kill(self.pid, sig)
-
-        def terminate(self) -> None:
-            """Terminate the process with SIGTERM
-            """
-            self.send_signal(signal.SIGTERM)
-
-        def kill(self) -> None:
-            """Kill the process with SIGKILL
-            """
-            self.send_signal(signal.SIGKILL)
-
-
-def _demo_posix() -> None:
-    #
-    # Example 1: Simple redirection: Get process list
-    #
-    plist = Popen(["ps"], stdout=PIPE).communicate()[0]
-    print("Process list:")
-    print(plist)
-
-    #
-    # Example 2: Change uid before executing child
-    #
-    if os.getuid() == 0:
-        p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
-        p.wait()
-
-    #
-    # Example 3: Connecting several subprocesses
-    #
-    print("Looking for 'hda'...")
-    p1 = Popen(["dmesg"], stdout=PIPE)
-    p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
-    print(repr(p2.communicate()[0]))
-
-    #
-    # Example 4: Catch execution error
-    #
-    print()
-    print("Trying a weird file...")
-    try:
-        print(Popen(["/this/path/does/not/exist"]).communicate())
-    except OSError as e:
-        if e.errno == errno.ENOENT:
-            print("The file didn't exist.  I thought so...")
-        else:
-            print("Error", e.errno)
-    else:
-        print("Gosh.  No error.", file=sys.stderr)
-
-
-def _demo_windows() -> None:
-    #
-    # Example 1: Connecting several subprocesses
-    #
-    print("Looking for 'PROMPT' in set output...")
-    p1 = Popen("set", stdout=PIPE, shell=True)
-    p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
-    print(repr(p2.communicate()[0]))
-
-    #
-    # Example 2: Simple execution of program
-    #
-    print("Executing calc...")
-    p = Popen("calc")
-    p.wait()
-
-
-if __name__ == "__main__":
-    if mswindows:
-        _demo_windows()
-    else:
-        _demo_posix()
diff --git a/test-data/stdlib-samples/3.2/tempfile.py b/test-data/stdlib-samples/3.2/tempfile.py
deleted file mode 100644
index d12e21e..0000000
--- a/test-data/stdlib-samples/3.2/tempfile.py
+++ /dev/null
@@ -1,717 +0,0 @@
-"""Temporary files.
-
-This module provides generic, low- and high-level interfaces for
-creating temporary files and directories.  The interfaces listed
-as "safe" just below can be used without fear of race conditions.
-Those listed as "unsafe" cannot, and are provided for backward
-compatibility only.
-
-This module also provides some data items to the user:
-
-  TMP_MAX  - maximum number of names that will be tried before
-             giving up.
-  template - the default prefix for all temporary names.
-             You may change this to control the default prefix.
-  tempdir  - If this is set to a string before the first use of
-             any routine from this module, it will be considered as
-             another candidate location to store temporary files.
-"""
-
-__all__ = [
-    "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
-    "SpooledTemporaryFile", "TemporaryDirectory",
-    "mkstemp", "mkdtemp",                  # low level safe interfaces
-    "mktemp",                              # deprecated unsafe interface
-    "TMP_MAX", "gettempprefix",            # constants
-    "tempdir", "gettempdir"
-   ]
-
-
-# Imports.
-
-import warnings as _warnings
-import sys as _sys
-import io as _io
-import os as _os
-import errno as _errno
-from random import Random as _Random
-
-from typing import (
-    Any as _Any, Callable as _Callable, Iterator as _Iterator,
-    List as _List, Tuple as _Tuple, Dict as _Dict, Iterable as _Iterable,
-    IO as _IO, cast as _cast, Optional as _Optional, Type as _Type,
-)
-from types import TracebackType as _TracebackType
-
-try:
-    import fcntl as _fcntl
-except ImportError:
-    def _set_cloexec(fd: int) -> None:
-        pass
-else:
-    def _set_cloexec(fd: int) -> None:
-        try:
-            flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
-        except IOError:
-            pass
-        else:
-            # flags read successfully, modify
-            flags |= _fcntl.FD_CLOEXEC
-            _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
-
-
-try:
-    import _thread
-    _allocate_lock = _thread.allocate_lock # type: _Callable[[], _Any]
-except ImportError:
-    import _dummy_thread
-    _allocate_lock = _dummy_thread.allocate_lock
-
-_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
-if hasattr(_os, 'O_NOINHERIT'):
-    _text_openflags |= _os.O_NOINHERIT
-if hasattr(_os, 'O_NOFOLLOW'):
-    _text_openflags |= _os.O_NOFOLLOW
-
-_bin_openflags = _text_openflags
-if hasattr(_os, 'O_BINARY'):
-    _bin_openflags |= _os.O_BINARY
-
-if hasattr(_os, 'TMP_MAX'):
-    TMP_MAX = _os.TMP_MAX
-else:
-    TMP_MAX = 10000
-
-template = "tmp"
-
-# Internal routines.
-
-_once_lock = _allocate_lock()
-
-if hasattr(_os, "lstat"):
-    _stat = _os.lstat # type: _Callable[[str], object]
-elif hasattr(_os, "stat"):
-    _stat = _os.stat
-else:
-    # Fallback.  All we need is something that raises os.error if the
-    # file doesn't exist.
-    def __stat(fn: str) -> object:
-        try:
-            f = open(fn)
-        except IOError:
-            raise _os.error()
-        f.close()
-    _stat = __stat
-
-def _exists(fn: str) -> bool:
-    try:
-        _stat(fn)
-    except _os.error:
-        return False
-    else:
-        return True
-
-class _RandomNameSequence(_Iterator[str]):
-    """An instance of _RandomNameSequence generates an endless
-    sequence of unpredictable strings which can safely be incorporated
-    into file names.  Each string is six characters long.  Multiple
-    threads can safely use the same instance at the same time.
-
-    _RandomNameSequence is an iterator."""
-
-    characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
-
-    @property
-    def rng(self) -> _Random:
-        cur_pid = _os.getpid()
-        if cur_pid != getattr(self, '_rng_pid', None):
-            self._rng = _Random()
-            self._rng_pid = cur_pid
-        return self._rng
-
-    def __iter__(self) -> _Iterator[str]:
-        return self
-
-    def __next__(self) -> str:
-        c = self.characters
-        choose = self.rng.choice
-        letters = [choose(c) for dummy in "123456"]
-        return ''.join(letters)
-
-def _candidate_tempdir_list() -> _List[str]:
-    """Generate a list of candidate temporary directories which
-    _get_default_tempdir will try."""
-
-    dirlist = [] # type: _List[str]
-
-    # First, try the environment.
-    for envname in 'TMPDIR', 'TEMP', 'TMP':
-        dirname = _os.getenv(envname)
-        if dirname: dirlist.append(dirname)
-
-    # Failing that, try OS-specific locations.
-    if _os.name == 'nt':
-        dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
-    else:
-        dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
-
-    # As a last resort, the current directory.
-    try:
-        dirlist.append(_os.getcwd())
-    except (AttributeError, _os.error):
-        dirlist.append(_os.curdir)
-
-    return dirlist
-
-def _get_default_tempdir() -> str:
-    """Calculate the default directory to use for temporary files.
-    This routine should be called exactly once.
-
-    We determine whether or not a candidate temp dir is usable by
-    trying to create and write to a file in that directory.  If this
-    is successful, the test file is deleted.  To prevent denial of
-    service, the name of the test file must be randomized."""
-
-    namer = _RandomNameSequence()
-    dirlist = _candidate_tempdir_list()
-
-    for dir in dirlist:
-        if dir != _os.curdir:
-            dir = _os.path.normcase(_os.path.abspath(dir))
-        # Try only a few names per directory.
-        for seq in range(100):
-            name = next(namer)
-            filename = _os.path.join(dir, name)
-            try:
-                fd = _os.open(filename, _bin_openflags, 0o600)
-                fp = _io.open(fd, 'wb')
-                fp.write(b'blat')
-                fp.close()
-                _os.unlink(filename)
-                fp = fd = None
-                return dir
-            except (OSError, IOError) as e:
-                if e.args[0] != _errno.EEXIST:
-                    break # no point trying more names in this directory
-                pass
-    raise IOError(_errno.ENOENT,
-                  "No usable temporary directory found in %s" % dirlist)
-
-_name_sequence = None # type: _RandomNameSequence
-
-def _get_candidate_names() -> _RandomNameSequence:
-    """Common setup sequence for all user-callable interfaces."""
-
-    global _name_sequence
-    if _name_sequence is None:
-        _once_lock.acquire()
-        try:
-            if _name_sequence is None:
-                _name_sequence = _RandomNameSequence()
-        finally:
-            _once_lock.release()
-    return _name_sequence
-
-
-def _mkstemp_inner(dir: str, pre: str, suf: str,
-                   flags: int) -> _Tuple[int, str]:
-    """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
-
-    names = _get_candidate_names()
-
-    for seq in range(TMP_MAX):
-        name = next(names)
-        file = _os.path.join(dir, pre + name + suf)
-        try:
-            fd = _os.open(file, flags, 0o600)
-            _set_cloexec(fd)
-            return (fd, _os.path.abspath(file))
-        except OSError as e:
-            if e.errno == _errno.EEXIST:
-                continue # try again
-            raise
-
-    raise IOError(_errno.EEXIST, "No usable temporary file name found")
-
-
-# User visible interfaces.
-
-def gettempprefix() -> str:
-    """Accessor for tempdir.template."""
-    return template
-
-tempdir = None # type: str
-
-def gettempdir() -> str:
-    """Accessor for tempfile.tempdir."""
-    global tempdir
-    if tempdir is None:
-        _once_lock.acquire()
-        try:
-            if tempdir is None:
-                tempdir = _get_default_tempdir()
-        finally:
-            _once_lock.release()
-    return tempdir
-
-def mkstemp(suffix: str = "", prefix: str = template, dir: str = None,
-            text: bool = False) -> _Tuple[int, str]:
-    """User-callable function to create and return a unique temporary
-    file.  The return value is a pair (fd, name) where fd is the
-    file descriptor returned by os.open, and name is the filename.
-
-    If 'suffix' is specified, the file name will end with that suffix,
-    otherwise there will be no suffix.
-
-    If 'prefix' is specified, the file name will begin with that prefix,
-    otherwise a default prefix is used.
-
-    If 'dir' is specified, the file will be created in that directory,
-    otherwise a default directory is used.
-
-    If 'text' is specified and true, the file is opened in text
-    mode.  Else (the default) the file is opened in binary mode.  On
-    some operating systems, this makes no difference.
-
-    The file is readable and writable only by the creating user ID.
-    If the operating system uses permission bits to indicate whether a
-    file is executable, the file is executable by no one. The file
-    descriptor is not inherited by children of this process.
-
-    Caller is responsible for deleting the file when done with it.
-    """
-
-    if dir is None:
-        dir = gettempdir()
-
-    if text:
-        flags = _text_openflags
-    else:
-        flags = _bin_openflags
-
-    return _mkstemp_inner(dir, prefix, suffix, flags)
-
-
-def mkdtemp(suffix: str = "", prefix: str = template, dir: str = None) -> str:
-    """User-callable function to create and return a unique temporary
-    directory.  The return value is the pathname of the directory.
-
-    Arguments are as for mkstemp, except that the 'text' argument is
-    not accepted.
-
-    The directory is readable, writable, and searchable only by the
-    creating user.
-
-    Caller is responsible for deleting the directory when done with it.
-    """
-
-    if dir is None:
-        dir = gettempdir()
-
-    names = _get_candidate_names()
-
-    for seq in range(TMP_MAX):
-        name = next(names)
-        file = _os.path.join(dir, prefix + name + suffix)
-        try:
-            _os.mkdir(file, 0o700)
-            return file
-        except OSError as e:
-            if e.errno == _errno.EEXIST:
-                continue # try again
-            raise
-
-    raise IOError(_errno.EEXIST, "No usable temporary directory name found")
-
-def mktemp(suffix: str = "", prefix: str = template, dir: str = None) -> str:
-    """User-callable function to return a unique temporary file name.  The
-    file is not created.
-
-    Arguments are as for mkstemp, except that the 'text' argument is
-    not accepted.
-
-    This function is unsafe and should not be used.  The file name
-    refers to a file that did not exist at some point, but by the time
-    you get around to creating it, someone else may have beaten you to
-    the punch.
-    """
-
-##    from warnings import warn as _warn
-##    _warn("mktemp is a potential security risk to your program",
-##          RuntimeWarning, stacklevel=2)
-
-    if dir is None:
-        dir = gettempdir()
-
-    names = _get_candidate_names()
-    for seq in range(TMP_MAX):
-        name = next(names)
-        file = _os.path.join(dir, prefix + name + suffix)
-        if not _exists(file):
-            return file
-
-    raise IOError(_errno.EEXIST, "No usable temporary filename found")
-
-
-class _TemporaryFileWrapper:
-    """Temporary file wrapper
-
-    This class provides a wrapper around files opened for
-    temporary use.  In particular, it seeks to automatically
-    remove the file when it is no longer needed.
-    """
-
-    def __init__(self, file: _IO[_Any], name: str,
-                 delete: bool = True) -> None:
-        self.file = file
-        self.name = name
-        self.close_called = False
-        self.delete = delete
-
-        if _os.name != 'nt':
-            # Cache the unlinker so we don't get spurious errors at
-            # shutdown when the module-level "os" is None'd out.  Note
-            # that this must be referenced as self.unlink, because the
-            # name TemporaryFileWrapper may also get None'd out before
-            # __del__ is called.
-            self.unlink = _os.unlink
-
-    def __getattr__(self, name: str) -> _Any:
-        # Attribute lookups are delegated to the underlying file
-        # and cached for non-numeric results
-        # (i.e. methods are cached, closed and friends are not)
-        file = _cast(_Any, self).__dict__['file'] # type: _IO[_Any]
-        a = getattr(file, name)
-        if not isinstance(a, int):
-            setattr(self, name, a)
-        return a
-
-    # The underlying __enter__ method returns the wrong object
-    # (self.file) so override it to return the wrapper
-    def __enter__(self) -> '_TemporaryFileWrapper':
-        self.file.__enter__()
-        return self
-
-    # iter() doesn't use __getattr__ to find the __iter__ method
-    def __iter__(self) -> _Iterator[_Any]:
-        return iter(self.file)
-
-    # NT provides delete-on-close as a primitive, so we don't need
-    # the wrapper to do anything special.  We still use it so that
-    # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
-    if _os.name != 'nt':
-        def close(self) -> None:
-            if not self.close_called:
-                self.close_called = True
-                self.file.close()
-                if self.delete:
-                    self.unlink(self.name)
-
-        def __del__(self) -> None:
-            self.close()
-
-        # Need to trap __exit__ as well to ensure the file gets
-        # deleted when used in a with statement
-        def __exit__(self, exc: _Type[BaseException], value: BaseException,
-                     tb: _Optional[_TracebackType]) -> bool:
-            result = self.file.__exit__(exc, value, tb)
-            self.close()
-            return result
-    else:
-        def __exit__(self, exc: _Type[BaseException], value: BaseException,
-                     tb: _Optional[_TracebackType]) -> bool:
-            self.file.__exit__(exc, value, tb)
-
-
-def NamedTemporaryFile(mode: str = 'w+b', buffering: int = -1,
-                       encoding: str = None, newline: str = None,
-                       suffix: str = "", prefix: str = template,
-                       dir: str = None, delete: bool = True) -> _IO[_Any]:
-    """Create and return a temporary file.
-    Arguments:
-    'prefix', 'suffix', 'dir' -- as for mkstemp.
-    'mode' -- the mode argument to io.open (default "w+b").
-    'buffering' -- the buffer size argument to io.open (default -1).
-    'encoding' -- the encoding argument to io.open (default None)
-    'newline' -- the newline argument to io.open (default None)
-    'delete' -- whether the file is deleted on close (default True).
-    The file is created as mkstemp() would do it.
-
-    Returns an object with a file-like interface; the name of the file
-    is accessible as file.name.  The file will be automatically deleted
-    when it is closed unless the 'delete' argument is set to False.
-    """
-
-    if dir is None:
-        dir = gettempdir()
-
-    flags = _bin_openflags
-
-    # Setting O_TEMPORARY in the flags causes the OS to delete
-    # the file when it is closed.  This is only supported by Windows.
-    if _os.name == 'nt' and delete:
-        flags |= _os.O_TEMPORARY
-
-    (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
-    file = _io.open(fd, mode, buffering=buffering,
-                    newline=newline, encoding=encoding)
-
-    return _cast(_IO[_Any], _TemporaryFileWrapper(file, name, delete))
-
-if _os.name != 'posix' or _sys.platform == 'cygwin':
-    # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
-    # while it is open.
-    TemporaryFile = NamedTemporaryFile
-
-else:
-    def _TemporaryFile(mode: str = 'w+b', buffering: int = -1,
-                       encoding: str = None, newline: str = None,
-                       suffix: str = "", prefix: str = template,
-                       dir: str = None, delete: bool = True) -> _IO[_Any]:
-        """Create and return a temporary file.
-        Arguments:
-        'prefix', 'suffix', 'dir' -- as for mkstemp.
-        'mode' -- the mode argument to io.open (default "w+b").
-        'buffering' -- the buffer size argument to io.open (default -1).
-        'encoding' -- the encoding argument to io.open (default None)
-        'newline' -- the newline argument to io.open (default None)
-        The file is created as mkstemp() would do it.
-
-        Returns an object with a file-like interface.  The file has no
-        name, and will cease to exist when it is closed.
-        """
-
-        if dir is None:
-            dir = gettempdir()
-
-        flags = _bin_openflags
-
-        (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
-        try:
-            _os.unlink(name)
-            return _io.open(fd, mode, buffering=buffering,
-                            newline=newline, encoding=encoding)
-        except:
-            _os.close(fd)
-            raise
-    TemporaryFile = _TemporaryFile
-
-class SpooledTemporaryFile:
-    """Temporary file wrapper, specialized to switch from
-    StringIO to a real file when it exceeds a certain size or
-    when a fileno is needed.
-    """
-    _rolled = False
-    _file = None  # type: _Any   # BytesIO, StringIO or TemporaryFile
-
-    def __init__(self, max_size: int = 0, mode: str = 'w+b',
-                 buffering: int = -1, encoding: str = None,
-                 newline: str = None, suffix: str = "",
-                 prefix: str = template, dir: str = None) -> None:
-        if 'b' in mode:
-            self._file = _io.BytesIO()
-        else:
-            # Setting newline="\n" avoids newline translation;
-            # this is important because otherwise on Windows we'd
-            # hget double newline translation upon rollover().
-            self._file = _io.StringIO(newline="\n")
-        self._max_size = max_size
-        self._rolled = False
-        self._TemporaryFileArgs = {
-                                   'mode': mode, 'buffering': buffering,
-                                   'suffix': suffix, 'prefix': prefix,
-                                   'encoding': encoding, 'newline': newline,
-                                   'dir': dir} # type: _Dict[str, _Any]
-
-    def _check(self, file: _IO[_Any]) -> None:
-        if self._rolled: return
-        max_size = self._max_size
-        if max_size and file.tell() > max_size:
-            self.rollover()
-
-    def rollover(self) -> None:
-        if self._rolled: return
-        file = self._file
-        newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
-        self._TemporaryFileArgs = None
-
-        newfile.write(file.getvalue())
-        newfile.seek(file.tell(), 0)
-
-        self._rolled = True
-
-    # The method caching trick from NamedTemporaryFile
-    # won't work here, because _file may change from a
-    # _StringIO instance to a real file. So we list
-    # all the methods directly.
-
-    # Context management protocol
-    def __enter__(self) -> 'SpooledTemporaryFile':
-        if self._file.closed:
-            raise ValueError("Cannot enter context with closed file")
-        return self
-
-    def __exit__(self, exc: type, value: BaseException,
-                 tb: _TracebackType) -> bool:
-        self._file.close()
-
-    # file protocol
-    def __iter__(self) -> _Iterable[_Any]:
-        return self._file.__iter__()
-
-    def close(self) -> None:
-        self._file.close()
-
-    @property
-    def closed(self) -> bool:
-        return self._file.closed
-
-    @property
-    def encoding(self) -> str:
-        return self._file.encoding
-
-    def fileno(self) -> int:
-        self.rollover()
-        return self._file.fileno()
-
-    def flush(self) -> None:
-        self._file.flush()
-
-    def isatty(self) -> bool:
-        return self._file.isatty()
-
-    @property
-    def mode(self) -> str:
-        return self._file.mode
-
-    @property
-    def name(self) -> str:
-        return self._file.name
-
-    @property
-    def newlines(self) -> _Any:
-        return self._file.newlines
-
-    #def next(self):
-    #    return self._file.next
-
-    def read(self, n: int = -1) -> _Any:
-        return self._file.read(n)
-
-    def readline(self, limit: int = -1) -> _Any:
-        return self._file.readline(limit)
-
-    def readlines(self, *args) -> _List[_Any]:
-        return self._file.readlines(*args)
-
-    def seek(self, offset: int, whence: int = 0) -> None:
-        self._file.seek(offset, whence)
-
-    @property
-    def softspace(self) -> bool:
-        return self._file.softspace
-
-    def tell(self) -> int:
-        return self._file.tell()
-
-    def truncate(self) -> None:
-        self._file.truncate()
-
-    def write(self, s: _Any) -> int:
-        file = self._file # type: _IO[_Any]
-        rv = file.write(s)
-        self._check(file)
-        return rv
-
-    def writelines(self, iterable: _Iterable[_Any]) -> None:
-        file = self._file # type: _IO[_Any]
-        file.writelines(iterable)
-        self._check(file)
-
-    #def xreadlines(self, *args) -> _Any:
-    #    return self._file.xreadlines(*args)
-
-
-class TemporaryDirectory(object):
-    """Create and return a temporary directory.  This has the same
-    behavior as mkdtemp but can be used as a context manager.  For
-    example:
-
-        with TemporaryDirectory() as tmpdir:
-            ...
-
-    Upon exiting the context, the directory and everthing contained
-    in it are removed.
-    """
-
-    def __init__(self, suffix: str = "", prefix: str = template,
-                 dir: str = None) -> None:
-        self._closed = False
-        self.name = None # type: str # Handle mkdtemp throwing an exception
-        self.name = mkdtemp(suffix, prefix, dir)
-
-        # XXX (ncoghlan): The following code attempts to make
-        # this class tolerant of the module nulling out process
-        # that happens during CPython interpreter shutdown
-        # Alas, it doesn't actually manage it. See issue #10188
-        self._listdir = _os.listdir
-        self._path_join = _os.path.join
-        self._isdir = _os.path.isdir
-        self._islink = _os.path.islink
-        self._remove = _os.remove
-        self._rmdir = _os.rmdir
-        self._os_error = _os.error
-        self._warn = _warnings.warn
-
-    def __repr__(self) -> str:
-        return "<{} {!r}>".format(self.__class__.__name__, self.name)
-
-    def __enter__(self) -> str:
-        return self.name
-
-    def cleanup(self, _warn: bool = False) -> None:
-        if self.name and not self._closed:
-            try:
-                self._rmtree(self.name)
-            except (TypeError, AttributeError) as ex:
-                # Issue #10188: Emit a warning on stderr
-                # if the directory could not be cleaned
-                # up due to missing globals
-                if "None" not in str(ex):
-                    raise
-                print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
-                      file=_sys.stderr)
-                return
-            self._closed = True
-            if _warn:
-                self._warn("Implicitly cleaning up {!r}".format(self),
-                           ResourceWarning)
-
-    def __exit__(self, exc: type, value: BaseException,
-                 tb: _TracebackType) -> bool:
-        self.cleanup()
-
-    def __del__(self) -> None:
-        # Issue a ResourceWarning if implicit cleanup needed
-        self.cleanup(_warn=True)
-
-    def _rmtree(self, path: str) -> None:
-        # Essentially a stripped down version of shutil.rmtree.  We can't
-        # use globals because they may be None'ed out at shutdown.
-        for name in self._listdir(path):
-            fullname = self._path_join(path, name)
-            try:
-                isdir = self._isdir(fullname) and not self._islink(fullname)
-            except self._os_error:
-                isdir = False
-            if isdir:
-                self._rmtree(fullname)
-            else:
-                try:
-                    self._remove(fullname)
-                except self._os_error:
-                    pass
-        try:
-            self._rmdir(path)
-        except self._os_error:
-            pass
diff --git a/test-data/stdlib-samples/3.2/test/randv2_32.pck b/test-data/stdlib-samples/3.2/test/randv2_32.pck
deleted file mode 100644
index 587ab24..0000000
--- a/test-data/stdlib-samples/3.2/test/randv2_32.pck
+++ /dev/null
@@ -1,633 +0,0 @@
-crandom
-Random
-p0
-(tRp1
-(I2
-(I-2147483648
-I-845974985
-I-1294090086
-I1193659239
-I-1849481736
-I-946579732
-I-34406770
-I1749049471
-I1997774682
-I1432026457
-I1288127073
-I-943175655
-I-1718073964
-I339993548
-I-1045260575
-I582505037
-I-1555108250
-I-1114765620
-I1578648750
-I-350384412
-I-20845848
-I-288255314
-I738790953
-I1901249641
-I1999324672
-I-277361068
-I-1515885839
-I2061761596
-I-809068089
-I1287981136
-I258129492
-I-6303745
-I-765148337
-I1090344911
-I1653434703
-I-1242923628
-I1639171313
-I-1870042660
-I-1655014050
-I345609048
-I2093410138
-I1963263374
-I-2122098342
-I1336859961
-I-810942729
-I945857753
-I2103049942
-I623922684
-I1418349549
-I690877342
-I754973107
-I-1605111847
-I1607137813
-I-1704917131
-I1317536428
-I1714882872
-I-1665385120
-I1823694397
-I-1790836866
-I-1696724812
-I-603979847
-I-498599394
-I-341265291
-I927388804
-I1778562135
-I1716895781
-I1023198122
-I1726145967
-I941955525
-I1240148950
-I-1929634545
-I-1288147083
-I-519318335
-I754559777
-I-707571958
-I374604022
-I420424061
-I-1095443486
-I1621934944
-I-1220502522
-I-140049608
-I-918917122
-I304341024
-I-1637446057
-I-353934485
-I1973436235
-I433380241
-I-686759465
-I-2111563154
-I-573422032
-I804304541
-I1513063483
-I1417381689
-I-804778729
-I211756408
-I544537322
-I890881641
-I150378374
-I1765739392
-I1011604116
-I584889095
-I1400520554
-I413747808
-I-1741992587
-I-1882421574
-I-1373001903
-I-1885348538
-I903819480
-I1083220038
-I-1318105424
-I1740421404
-I1693089625
-I775965557
-I1319608037
-I-2127475785
-I-367562895
-I-1416273451
-I1693000327
-I-1217438421
-I834405522
-I-128287275
-I864057548
-I-973917356
-I7304111
-I1712253182
-I1353897741
-I672982288
-I1778575559
-I-403058377
-I-38540378
-I-1393713496
-I13193171
-I1127196200
-I205176472
-I-2104790506
-I299985416
-I1403541685
-I-1018270667
-I-1980677490
-I-1182625797
-I1637015181
-I-1795357414
-I1514413405
-I-924516237
-I-1841873650
-I-1014591269
-I1576616065
-I-1319103135
-I-120847840
-I2062259778
-I-9285070
-I1160890300
-I-575137313
-I-1509108275
-I46701926
-I-287560914
-I-256824960
-I577558250
-I900598310
-I944607867
-I2121154920
-I-1170505192
-I-1347170575
-I77247778
-I-1899015765
-I1234103327
-I1027053658
-I1934632322
-I-792031234
-I1147322536
-I1290655117
-I1002059715
-I1325898538
-I896029793
-I-790940694
-I-980470721
-I-1922648255
-I-951672814
-I291543943
-I1158740218
-I-1959023736
-I-1977185236
-I1527900076
-I514104195
-I-814154113
-I-593157883
-I-1023704660
-I1285688377
-I-2117525386
-I768954360
-I-38676846
-I-799848659
-I-1305517259
-I-1938213641
-I-462146758
-I-1663302892
-I1899591069
-I-22935388
-I-275856976
-I-443736893
-I-739441156
-I93862068
-I-838105669
-I1735629845
-I-817484206
-I280814555
-I1753547179
-I1811123479
-I1974543632
-I-48447465
-I-642694345
-I-531149613
-I518698953
-I-221642627
-I-686519187
-I776644303
-I257774400
-I-1499134857
-I-1055273455
-I-237023943
-I1981752330
-I-917671662
-I-372905983
-I1588058420
-I1171936660
-I-1730977121
-I1360028989
-I1769469287
-I1910709542
-I-852692959
-I1396944667
-I-1723999155
-I-310975435
-I-1965453954
-I-1636858570
-I2005650794
-I680293715
-I1355629386
-I844514684
-I-1909152807
-I-808646074
-I1936510018
-I1134413810
-I-143411047
-I-1478436304
-I1394969244
-I-1170110660
-I1963112086
-I-1518351049
-I-1506287443
-I-455023090
-I-855366028
-I-1746785568
-I933990882
-I-703625141
-I-285036872
-I188277905
-I1471578620
-I-981382835
-I-586974220
-I945619758
-I1608778444
-I-1708548066
-I-1897629320
-I-42617810
-I-836840790
-I539154487
-I-235706962
-I332074418
-I-575700589
-I1534608003
-I632116560
-I-1819760653
-I642052958
-I-722391771
-I-1104719475
-I-1196847084
-I582413973
-I1563394876
-I642007944
-I108989456
-I361625014
-I677308625
-I-1806529496
-I-959050708
-I-1858251070
-I-216069832
-I701624579
-I501238033
-I12287030
-I1895107107
-I2089098638
-I-874806230
-I1236279203
-I563718890
-I-544352489
-I-1879707498
-I1767583393
-I-1776604656
-I-693294301
-I-88882831
-I169303357
-I1299196152
-I-1122791089
-I-379157172
-I1934671851
-I1575736961
-I-19573174
-I-1401511009
-I9305167
-I-1115174467
-I1670735537
-I1226436501
-I-2004524535
-I1767463878
-I-1722855079
-I-559413926
-I1529810851
-I1201272087
-I-1297130971
-I-1188149982
-I1396557188
-I-370358342
-I-1006619702
-I1600942463
-I906087130
-I-76991909
-I2069580179
-I-1674195181
-I-2098404729
-I-940972459
-I-573399187
-I-1930386277
-I-721311199
-I-647834744
-I1452181671
-I688681916
-I1812793731
-I1704380620
-I-1389615179
-I866287837
-I-1435265007
-I388400782
-I-147986600
-I-1613598851
-I-1040347408
-I782063323
-I-239282031
-I-575966722
-I-1865208174
-I-481365146
-I579572803
-I-1239481494
-I335361280
-I-429722947
-I1881772789
-I1908103808
-I1653690013
-I-1668588344
-I1933787953
-I-2033480609
-I22162797
-I-1516527040
-I-461232482
-I-16201372
-I-2043092030
-I114990337
-I-1524090084
-I1456374020
-I458606440
-I-1928083218
-I227773125
-I-1129028159
-I1678689
-I1575896907
-I-1792935220
-I-151387575
-I64084088
-I-95737215
-I1337335688
-I-1963466345
-I1243315130
-I-1798518411
-I-546013212
-I-607065396
-I1219824160
-I1715218469
-I-1368163783
-I1701552913
-I-381114888
-I1068821717
-I266062971
-I-2066513172
-I1767407229
-I-780936414
-I-705413443
-I-1256268847
-I1646874149
-I1107690353
-I839133072
-I67001749
-I860763503
-I884880613
-I91977084
-I755371933
-I420745153
-I-578480690
-I-1520193551
-I1011369331
-I-99754575
-I-733141064
-I-500598588
-I1081124271
-I-1341266575
-I921002612
-I-848852487
-I-1904467341
-I-1294256973
-I-94074714
-I-1778758498
-I-1401188547
-I2101830578
-I2058864877
-I-272875991
-I-1375854779
-I-1332937870
-I619425525
-I-1034529639
-I-36454393
-I-2030499985
-I-1637127500
-I-1408110287
-I-2108625749
-I-961007436
-I1475654951
-I-791946251
-I1667792115
-I1818978830
-I1897980514
-I1959546477
-I-74478911
-I-508643347
-I461594399
-I538802715
-I-2094970071
-I-2076660253
-I1091358944
-I1944029246
-I-343957436
-I-1915845022
-I1237620188
-I1144125174
-I1522190520
-I-670252952
-I-19469226
-I675626510
-I758750096
-I909724354
-I-1846259652
-I544669343
-I445182495
-I-821519930
-I-1124279685
-I-1668995122
-I1653284793
-I-678555151
-I-687513207
-I1558259445
-I-1978866839
-I1558835601
-I1732138472
-I-1904793363
-I620020296
-I1562597874
-I1942617227
-I-549632552
-I721603795
-I417978456
-I-1355281522
-I-538065208
-I-1079523196
-I187375699
-I449064972
-I1018083947
-I1632388882
-I-493269866
-I92769041
-I1477146750
-I1782708404
-I444873376
-I1085851104
-I-6823272
-I-1302251853
-I1602050688
-I-1042187824
-I287161745
-I-1972094479
-I103271491
-I2131619773
-I-2064115870
-I766815498
-I990861458
-I-1664407378
-I1083746756
-I-1018331904
-I-677315687
-I-951670647
-I-952356874
-I451460609
-I-818615564
-I851439508
-I656362634
-I-1351240485
-I823378078
-I1985597385
-I597757740
-I-1512303057
-I1590872798
-I1108424213
-I818850898
-I-1368594306
-I-201107761
-I1793370378
-I1247597611
-I-1594326264
-I-601653890
-I427642759
-I248322113
-I-292545338
-I1708985870
-I1917042771
-I429354503
-I-478470329
-I793960014
-I369939133
-I1728189157
-I-518963626
-I-278523974
-I-1877289696
-I-2088617658
-I-1367940049
-I-62295925
-I197975119
-I-252900777
-I803430539
-I485759441
-I-528283480
-I-1287443963
-I-478617444
-I-861906946
-I-649095555
-I-893184337
-I2050571322
-I803433133
-I1629574571
-I1649720417
-I-2050225209
-I1208598977
-I720314344
-I-615166251
-I-835077127
-I-1405372429
-I995698064
-I148123240
-I-943016676
-I-594609622
-I-1381596711
-I1017195301
-I-1268893013
-I-1815985179
-I-1393570351
-I-870027364
-I-476064472
-I185582645
-I569863326
-I1098584267
-I-1599147006
-I-485054391
-I-852098365
-I1477320135
-I222316762
-I-1515583064
-I-935051367
-I393383063
-I819617226
-I722921837
-I-1241806499
-I-1358566385
-I1666813591
-I1333875114
-I-1663688317
-I-47254623
-I-885800726
-I307388991
-I-1219459496
-I1374870300
-I2132047877
-I-1385624198
-I-245139206
-I1015139214
-I-926198559
-I1969798868
-I-1950480619
-I-559193432
-I-1256446518
-I-1983476981
-I790179655
-I1004289659
-I1541827617
-I1555805575
-I501127333
-I-1123446797
-I-453230915
-I2035104883
-I1296122398
-I-1843698604
-I-715464588
-I337143971
-I-1972119192
-I606777909
-I726977302
-I-1149501872
-I-1963733522
-I-1797504644
-I624
-tp2
-Ntp3
-b.
\ No newline at end of file
diff --git a/test-data/stdlib-samples/3.2/test/randv2_64.pck b/test-data/stdlib-samples/3.2/test/randv2_64.pck
deleted file mode 100644
index 090dd6f..0000000
--- a/test-data/stdlib-samples/3.2/test/randv2_64.pck
+++ /dev/null
@@ -1,633 +0,0 @@
-crandom
-Random
-p0
-(tRp1
-(I2
-(I2147483648
-I1812115682
-I2741755497
-I1028055730
-I809166036
-I2773628650
-I62321950
-I535290043
-I349877800
-I976167039
-I2490696940
-I3631326955
-I2107991114
-I2941205793
-I3199611605
-I1871971556
-I1456108540
-I2984591044
-I140836801
-I4203227310
-I3652722980
-I4031971234
-I555769760
-I697301296
-I2347638880
-I3302335858
-I320255162
-I2553586608
-I1570224361
-I2838780912
-I2315834918
-I2351348158
-I3545433015
-I2292018579
-I1177569331
-I758497559
-I2913311175
-I1014948880
-I1793619243
-I3982451053
-I3850988342
-I2393984324
-I1583100093
-I3144742543
-I3655047493
-I3507532385
-I3094515442
-I350042434
-I2455294844
-I1038739312
-I313809152
-I189433072
-I1653165452
-I4186650593
-I19281455
-I2589680619
-I4145931590
-I4283266118
-I636283172
-I943618337
-I3170184633
-I2308766231
-I634615159
-I538152647
-I2079576891
-I1029442616
-I3410689412
-I1370292761
-I1071718978
-I2139496322
-I1876699543
-I3485866187
-I3157490130
-I1633105386
-I1453253160
-I3841322080
-I3789608924
-I4110770792
-I95083673
-I931354627
-I2065389591
-I3448339827
-I3348204577
-I3263528560
-I2411324590
-I4003055026
-I1869670093
-I2737231843
-I4150701155
-I2689667621
-I2993263224
-I3239890140
-I1191430483
-I1214399779
-I3623428533
-I1817058866
-I3052274451
-I326030082
-I1505129312
-I2306812262
-I1349150363
-I1099127895
-I2543465574
-I2396380193
-I503926466
-I1607109730
-I3451716817
-I58037114
-I4290081119
-I947517597
-I3083440186
-I520522630
-I2948962496
-I4184319574
-I2957636335
-I668374201
-I2325446473
-I472785314
-I3791932366
-I573017189
-I2185725379
-I1262251492
-I3525089379
-I2951262653
-I1305347305
-I940958122
-I3343754566
-I359371744
-I3874044973
-I396897232
-I147188248
-I716683703
-I4013880315
-I1133359586
-I1794612249
-I3480815192
-I3988787804
-I1729355809
-I573408542
-I1419310934
-I1770030447
-I3552845567
-I1693976502
-I1271189893
-I2298236738
-I2049219027
-I3464198070
-I1233574082
-I1007451781
-I1838253750
-I687096593
-I1131375603
-I1223013895
-I1490478435
-I339265439
-I4232792659
-I491538536
-I2816256769
-I1044097522
-I2566227049
-I748762793
-I1511830494
-I3593259822
-I4121279213
-I3735541309
-I3609794797
-I1939942331
-I377570434
-I1437957554
-I1831285696
-I55062811
-I2046783110
-I1303902283
-I1838349877
-I420993556
-I1256392560
-I2795216506
-I2783687924
-I3322303169
-I512794749
-I308405826
-I517164429
-I3320436022
-I1328403632
-I2269184746
-I3729522810
-I3304314450
-I2238756124
-I1690581361
-I3813277532
-I4119706879
-I2659447875
-I388818978
-I2064580814
-I1586227676
-I2627522685
-I2017792269
-I547928109
-I859107450
-I1062238929
-I858886237
-I3795783146
-I4173914756
-I3835915965
-I3329504821
-I3494579904
-I838863205
-I3399734724
-I4247387481
-I3618414834
-I2984433798
-I2165205561
-I4260685684
-I3045904244
-I3450093836
-I3597307595
-I3215851166
-I3162801328
-I2558283799
-I950068105
-I1829664117
-I3108542987
-I2378860527
-I790023460
-I280087750
-I1171478018
-I2333653728
-I3976932140
-I896746152
-I1802494195
-I1232873794
-I2749440836
-I2032037296
-I2012091682
-I1296131034
-I3892133385
-I908161334
-I2296791795
-I548169794
-I696265
-I893156828
-I426904709
-I3565374535
-I2655906825
-I2792178515
-I2406814632
-I4038847579
-I3123934642
-I2197503004
-I3535032597
-I2266216689
-I2117613462
-I1787448518
-I1875089416
-I2037165384
-I1140676321
-I3606296464
-I3229138231
-I2458267132
-I1874651171
-I3331900867
-I1000557654
-I1432861701
-I473636323
-I2691783927
-I1871437447
-I1328016401
-I4118690062
-I449467602
-I681789035
-I864889442
-I1200888928
-I75769445
-I4008690037
-I2464577667
-I4167795823
-I3070097648
-I2579174882
-I1216886568
-I3810116343
-I2249507485
-I3266903480
-I3671233480
-I100191658
-I3087121334
-I365063087
-I3821275176
-I2165052848
-I1282465245
-I3601570637
-I3132413236
-I2780570459
-I3222142917
-I3129794692
-I2611590811
-I947031677
-I2991908938
-I750997949
-I3632575131
-I1632014461
-I2846484755
-I2347261779
-I2903959448
-I1397316686
-I1904578392
-I774649578
-I3164598558
-I2429587609
-I738244516
-I1563304975
-I1399317414
-I1021316297
-I3187933234
-I2126780757
-I4011907847
-I4095169219
-I3358010054
-I2729978247
-I3736811646
-I3009656410
-I2893043637
-I4027447385
-I1239610110
-I1488806900
-I2674866844
-I442876374
-I2853687260
-I2785921005
-I3151378528
-I1180567
-I2803146964
-I982221759
-I2192919417
-I3087026181
-I2480838002
-I738452921
-I687986185
-I3049371676
-I3636492954
-I3468311299
-I2379621102
-I788988633
-I1643210601
-I2983998168
-I2492730801
-I2586048705
-I604073029
-I4121082815
-I1496476928
-I2972357110
-I2663116968
-I2642628592
-I2116052039
-I487186279
-I2577680328
-I3974766614
-I730776636
-I3842528855
-I1929093695
-I44626622
-I3989908833
-I1695426222
-I3675479382
-I3051784964
-I1514876613
-I1254036595
-I2420450649
-I3034377361
-I2332990590
-I1535175126
-I185834384
-I1107372900
-I1707278185
-I1286285295
-I3332574225
-I2785672437
-I883170645
-I2005666473
-I3403131327
-I4122021352
-I1464032858
-I3702576112
-I260554598
-I1837731650
-I2594435345
-I75771049
-I2012484289
-I3058649775
-I29979703
-I3861335335
-I2506495152
-I3786448704
-I442947790
-I2582724774
-I4291336243
-I2568189843
-I1923072690
-I1121589611
-I837696302
-I3284631720
-I3865021324
-I3576453165
-I2559531629
-I1459231762
-I3506550036
-I3754420159
-I2622000757
-I124228596
-I1084328605
-I1692830753
-I547273558
-I674282621
-I655259103
-I3188629610
-I490502174
-I2081001293
-I3191330704
-I4109943593
-I1859948504
-I3163806460
-I508833168
-I1256371033
-I2709253790
-I2068956572
-I3092842814
-I3913926529
-I2039638759
-I981982529
-I536094190
-I368855295
-I51993975
-I1597480732
-I4058175522
-I2155896702
-I3196251991
-I1081913893
-I3952353788
-I3545548108
-I2370669647
-I2206572308
-I2576392991
-I1732303374
-I1153136290
-I537641955
-I1738691747
-I3232854186
-I2539632206
-I2829760278
-I3058187853
-I1202425792
-I3762361970
-I2863949342
-I2640635867
-I376638744
-I1857679757
-I330798087
-I1457400505
-I1135610046
-I606400715
-I1859536026
-I509811335
-I529772308
-I2579273244
-I1890382004
-I3959908876
-I2612335971
-I2834052227
-I1434475986
-I3684202717
-I4015011345
-I582567852
-I3689969571
-I3934753460
-I3034960691
-I208573292
-I4004113742
-I3992904842
-I2587153719
-I3529179079
-I1565424987
-I779130678
-I1048582935
-I3213591622
-I3607793434
-I3951254937
-I2047811901
-I7508850
-I248544605
-I4210090324
-I2331490884
-I70057213
-I776474945
-I1345528889
-I3290403612
-I1664955269
-I1533143116
-I545003424
-I4141564478
-I1257326139
-I868843601
-I2337603029
-I1918131449
-I1843439523
-I1125519035
-I673340118
-I421408852
-I1520454906
-I1804722630
-I3621254196
-I2329968000
-I39464672
-I430583134
-I294026512
-I53978525
-I2892276105
-I1418863764
-I3419054451
-I1391595797
-I3544981798
-I4191780858
-I825672357
-I2972000844
-I1571305069
-I4231982845
-I3611916419
-I3045163168
-I2982349733
-I278572141
-I4215338078
-I839860504
-I1819151779
-I1412347479
-I1386770353
-I3914589491
-I3783104977
-I4124296733
-I830546258
-I89825624
-I4110601328
-I2545483429
-I300600527
-I516641158
-I3693021034
-I2852912854
-I3240039868
-I4167407959
-I1479557946
-I3621188804
-I1391590944
-I3578441128
-I1227055556
-I406898396
-I3064054983
-I25835338
-I402664165
-I4097682779
-I2106728012
-I203613622
-I3045467686
-I1381726438
-I3798670110
-I1342314961
-I3552497361
-I535913619
-I2625787583
-I1606574307
-I1101269630
-I1950513752
-I1121355862
-I3586816903
-I438529984
-I2473182121
-I1229997203
-I405445940
-I1695535315
-I427014336
-I3916768430
-I392298359
-I1884642868
-I1244730821
-I741058080
-I567479957
-I3527621168
-I3191971011
-I3267069104
-I4108668146
-I1520795587
-I166581006
-I473794477
-I1562126550
-I929843010
-I889533294
-I1266556608
-I874518650
-I3520162092
-I3013765049
-I4220231414
-I547246449
-I3998093769
-I3737193746
-I3872944207
-I793651876
-I2606384318
-I875991012
-I1394836334
-I4102011644
-I854380426
-I2618666767
-I2568302000
-I1995512132
-I229491093
-I2673500286
-I3364550739
-I3836923416
-I243656987
-I3944388983
-I4064949677
-I1416956378
-I1703244487
-I3990798829
-I2023425781
-I3926702214
-I1229015501
-I3174247824
-I624
-tp2
-Ntp3
-b.
\ No newline at end of file
diff --git a/test-data/stdlib-samples/3.2/test/randv3.pck b/test-data/stdlib-samples/3.2/test/randv3.pck
deleted file mode 100644
index 09fc38b..0000000
--- a/test-data/stdlib-samples/3.2/test/randv3.pck
+++ /dev/null
@@ -1,633 +0,0 @@
-crandom
-Random
-p0
-(tRp1
-(I3
-(L2147483648L
-L994081831L
-L2806287265L
-L2228999830L
-L3396498069L
-L2956805457L
-L3273927761L
-L920726507L
-L1862624492L
-L2921292485L
-L1779526843L
-L2469105503L
-L251696293L
-L1254390717L
-L779197080L
-L3165356830L
-L2007365218L
-L1870028812L
-L2896519363L
-L1855578438L
-L979518416L
-L3481710246L
-L3191861507L
-L3993006593L
-L2967971479L
-L3353342753L
-L3576782572L
-L339685558L
-L2367675732L
-L116208555L
-L1220054437L
-L486597056L
-L1912115141L
-L1037044792L
-L4096904723L
-L3409146175L
-L3701651227L
-L315824610L
-L4138604583L
-L1385764892L
-L191878900L
-L2320582219L
-L3420677494L
-L2776503169L
-L1148247403L
-L829555069L
-L902064012L
-L2934642741L
-L2477108577L
-L2583928217L
-L1658612579L
-L2865447913L
-L129147346L
-L3691171887L
-L1569328110L
-L1372860143L
-L1054139183L
-L1617707080L
-L69020592L
-L3810271603L
-L1853953416L
-L3499803073L
-L1027545027L
-L3229043605L
-L250848720L
-L3324932626L
-L3537002962L
-L2494323345L
-L3238103962L
-L4147541579L
-L3636348186L
-L3025455083L
-L2678771977L
-L584700256L
-L3461826909L
-L854511420L
-L943463552L
-L3609239025L
-L3977577989L
-L253070090L
-L777394544L
-L2144086567L
-L1092947992L
-L854327284L
-L2222750082L
-L360183510L
-L1312466483L
-L3227531091L
-L2235022500L
-L3013060530L
-L2541091298L
-L3480126342L
-L1839762775L
-L2632608190L
-L1108889403L
-L3045050923L
-L731513126L
-L3505436788L
-L3062762017L
-L1667392680L
-L1354126500L
-L1143573930L
-L2816645702L
-L2100356873L
-L2817679106L
-L1210746010L
-L2409915248L
-L2910119964L
-L2309001420L
-L220351824L
-L3667352871L
-L3993148590L
-L2886160232L
-L4239393701L
-L1189270581L
-L3067985541L
-L147374573L
-L2355164869L
-L3696013550L
-L4227037846L
-L1905112743L
-L3312843689L
-L2930678266L
-L1828795355L
-L76933594L
-L3987100796L
-L1288361435L
-L3464529151L
-L965498079L
-L1444623093L
-L1372893415L
-L1536235597L
-L1341994850L
-L963594758L
-L2115295754L
-L982098685L
-L1053433904L
-L2078469844L
-L3059765792L
-L1753606181L
-L2130171254L
-L567588194L
-L529629426L
-L3621523534L
-L3027576564L
-L1176438083L
-L4096287858L
-L1168574683L
-L1425058962L
-L1429631655L
-L2902106759L
-L761900641L
-L1329183956L
-L1947050932L
-L447490289L
-L3282516276L
-L200037389L
-L921868197L
-L3331403999L
-L4088760249L
-L2188326318L
-L288401961L
-L1360802675L
-L314302808L
-L3314639210L
-L3749821203L
-L2286081570L
-L2768939062L
-L3200541016L
-L2133495482L
-L385029880L
-L4217232202L
-L3171617231L
-L1660846653L
-L2459987621L
-L2691776124L
-L4225030408L
-L3595396773L
-L1103680661L
-L539064057L
-L1492841101L
-L166195394L
-L757973658L
-L533893054L
-L2784879594L
-L1021821883L
-L2350548162L
-L176852116L
-L3503166025L
-L148079914L
-L1633466236L
-L2773090165L
-L1162846701L
-L3575737795L
-L1624178239L
-L2454894710L
-L3014691938L
-L526355679L
-L1870824081L
-L3362425857L
-L3907566665L
-L3462563184L
-L2229112004L
-L4203735748L
-L1557442481L
-L924133999L
-L1906634214L
-L880459727L
-L4065895870L
-L141426254L
-L1258450159L
-L3243115027L
-L1574958840L
-L313939294L
-L3055664260L
-L3459714255L
-L531778790L
-L509505506L
-L1620227491L
-L2675554942L
-L2516509560L
-L3797299887L
-L237135890L
-L3203142213L
-L1087745310L
-L1897151854L
-L3936590041L
-L132765167L
-L2385908063L
-L1360600289L
-L3574567769L
-L2752788114L
-L2644228966L
-L2377705183L
-L601277909L
-L4046480498L
-L324401408L
-L3279931760L
-L2227059377L
-L1538827493L
-L4220532064L
-L478044564L
-L2917117761L
-L635492832L
-L2319763261L
-L795944206L
-L1820473234L
-L1673151409L
-L1404095402L
-L1661067505L
-L3217106938L
-L2406310683L
-L1931309248L
-L2458622868L
-L3323670524L
-L3266852755L
-L240083943L
-L3168387397L
-L607722198L
-L1256837690L
-L3608124913L
-L4244969357L
-L1289959293L
-L519750328L
-L3229482463L
-L1105196988L
-L1832684479L
-L3761037224L
-L2363631822L
-L3297957711L
-L572766355L
-L1195822137L
-L2239207981L
-L2034241203L
-L163540514L
-L288160255L
-L716403680L
-L4019439143L
-L1536281935L
-L2345100458L
-L2786059178L
-L2822232109L
-L987025395L
-L3061166559L
-L490422513L
-L2551030115L
-L2638707620L
-L1344728502L
-L714108911L
-L2831719700L
-L2188615369L
-L373509061L
-L1351077504L
-L3136217056L
-L783521095L
-L2554949468L
-L2662499550L
-L1203826951L
-L1379632388L
-L1918858985L
-L607465976L
-L1980450237L
-L3540079211L
-L3397813410L
-L2913309266L
-L2289572621L
-L4133935327L
-L4166227663L
-L3371801704L
-L3065474909L
-L3580562343L
-L3832172378L
-L2556130719L
-L310473705L
-L3734014346L
-L2490413810L
-L347233056L
-L526668037L
-L1158393656L
-L544329703L
-L2150085419L
-L3914038146L
-L1060237586L
-L4159394837L
-L113205121L
-L309966775L
-L4098784465L
-L3635222960L
-L2417516569L
-L2089579233L
-L1725807541L
-L2728122526L
-L2365836523L
-L2504078522L
-L1443946869L
-L2384171411L
-L997046534L
-L3249131657L
-L1699875986L
-L3618097146L
-L1716038224L
-L2629818607L
-L2929217876L
-L1367250314L
-L1726434951L
-L1388496325L
-L2107602181L
-L2822366842L
-L3052979190L
-L3796798633L
-L1543813381L
-L959000121L
-L1363845999L
-L2952528150L
-L874184932L
-L1888387194L
-L2328695295L
-L3442959855L
-L841805947L
-L1087739275L
-L3230005434L
-L3045399265L
-L1161817318L
-L2898673139L
-L860011094L
-L940539782L
-L1297818080L
-L4243941623L
-L1577613033L
-L4204131887L
-L3819057225L
-L1969439558L
-L3297963932L
-L241874069L
-L3517033453L
-L2295345664L
-L1098911422L
-L886955008L
-L1477397621L
-L4279347332L
-L3616558791L
-L2384411957L
-L742537731L
-L764221540L
-L2871698900L
-L3530636393L
-L691256644L
-L758730966L
-L1717773090L
-L2751856377L
-L3188484000L
-L3767469670L
-L1623863053L
-L3533236793L
-L4099284176L
-L723921107L
-L310594036L
-L223978745L
-L2266565776L
-L201843303L
-L2969968546L
-L3351170888L
-L3465113624L
-L2712246712L
-L1521383057L
-L2384461798L
-L216357551L
-L2167301975L
-L3144653194L
-L2781220155L
-L3620747666L
-L95971265L
-L4255400243L
-L59999757L
-L4174273472L
-L3974511524L
-L1007123950L
-L3112477628L
-L806461512L
-L3148074008L
-L528352882L
-L2545979588L
-L2562281969L
-L3010249477L
-L1886331611L
-L3210656433L
-L1034099976L
-L2906893579L
-L1197048779L
-L1870004401L
-L3898300490L
-L2686856402L
-L3975723478L
-L613043532L
-L2565674353L
-L3760045310L
-L3468984376L
-L4126258L
-L303855424L
-L3988963552L
-L276256796L
-L544071807L
-L1023872062L
-L1747461519L
-L1975571260L
-L4033766958L
-L2946555557L
-L1492957796L
-L958271685L
-L46480515L
-L907760635L
-L1306626357L
-L819652378L
-L1172300279L
-L1116851319L
-L495601075L
-L1157715330L
-L534220108L
-L377320028L
-L1672286106L
-L2066219284L
-L1842386355L
-L2546059464L
-L1839457336L
-L3476194446L
-L3050550028L
-L594705582L
-L1905813535L
-L1813033412L
-L2700858157L
-L169067972L
-L4252889045L
-L1921944555L
-L497671474L
-L210143935L
-L2688398489L
-L325158375L
-L3450846447L
-L891760597L
-L712802536L
-L1132557436L
-L1417044075L
-L1639889660L
-L1746379970L
-L1478741647L
-L2817563486L
-L2573612532L
-L4266444457L
-L2911601615L
-L804745411L
-L2207254652L
-L1189140646L
-L3829725111L
-L3637367348L
-L1944731747L
-L2193440343L
-L1430195413L
-L1173515229L
-L1582618217L
-L2070767037L
-L247908936L
-L1460675439L
-L556001596L
-L327629335L
-L1036133876L
-L4228129605L
-L999174048L
-L3635804039L
-L1416550481L
-L1270540269L
-L4280743815L
-L39607659L
-L1552540623L
-L2762294062L
-L504137289L
-L4117044239L
-L1417130225L
-L1342970056L
-L1755716449L
-L1169447322L
-L2731401356L
-L2319976745L
-L2869221479L
-L23972655L
-L2251495389L
-L1429860878L
-L3728135992L
-L4241432973L
-L3698275076L
-L216416432L
-L4040046960L
-L246077176L
-L894675685L
-L3932282259L
-L3097205100L
-L2128818650L
-L1319010656L
-L1601974009L
-L2552960957L
-L3554016055L
-L4209395641L
-L2013340102L
-L3370447801L
-L2307272002L
-L1795091354L
-L202109401L
-L988345070L
-L2514870758L
-L1132726850L
-L582746224L
-L3112305421L
-L1843020683L
-L3600189223L
-L1101349165L
-L4211905855L
-L2866677581L
-L2881621130L
-L4165324109L
-L4238773191L
-L3635649550L
-L2670481044L
-L2996248219L
-L1676992480L
-L3473067050L
-L4205793699L
-L4019490897L
-L1579990481L
-L1899617990L
-L1136347713L
-L1802842268L
-L3591752960L
-L1197308739L
-L433629786L
-L4032142790L
-L3148041979L
-L3312138845L
-L3896860449L
-L3298182567L
-L907605170L
-L1658664067L
-L2682980313L
-L2523523173L
-L1208722103L
-L3808530363L
-L1079003946L
-L4282402864L
-L2041010073L
-L2667555071L
-L688018180L
-L1405121012L
-L4167994076L
-L3504695336L
-L1923944749L
-L1143598790L
-L3936268898L
-L3606243846L
-L1017420080L
-L4026211169L
-L596529763L
-L1844259624L
-L2840216282L
-L2673807759L
-L3407202575L
-L2737971083L
-L4075423068L
-L3684057432L
-L3146627241L
-L599650513L
-L69773114L
-L1257035919L
-L807485291L
-L2376230687L
-L3036593147L
-L2642411658L
-L106080044L
-L2199622729L
-L291834511L
-L2697611361L
-L11689733L
-L625123952L
-L3226023062L
-L3229663265L
-L753059444L
-L2843610189L
-L624L
-tp2
-Ntp3
-b.
\ No newline at end of file
diff --git a/test-data/stdlib-samples/3.2/test/subprocessdata/fd_status.py b/test-data/stdlib-samples/3.2/test/subprocessdata/fd_status.py
deleted file mode 100644
index 1f61e13..0000000
--- a/test-data/stdlib-samples/3.2/test/subprocessdata/fd_status.py
+++ /dev/null
@@ -1,24 +0,0 @@
-"""When called as a script, print a comma-separated list of the open
-file descriptors on stdout."""
-
-import errno
-import os
-
-try:
-    _MAXFD = os.sysconf("SC_OPEN_MAX")
-except:
-    _MAXFD = 256
-
-if __name__ == "__main__":
-    fds = []
-    for fd in range(0, _MAXFD):
-        try:
-            st = os.fstat(fd)
-        except OSError as e:
-            if e.errno == errno.EBADF:
-                continue
-            raise
-        # Ignore Solaris door files
-        if st.st_mode & 0xF000 != 0xd000:
-            fds.append(fd)
-    print(','.join(map(str, fds)))
diff --git a/test-data/stdlib-samples/3.2/test/subprocessdata/input_reader.py b/test-data/stdlib-samples/3.2/test/subprocessdata/input_reader.py
deleted file mode 100644
index 1dc3191..0000000
--- a/test-data/stdlib-samples/3.2/test/subprocessdata/input_reader.py
+++ /dev/null
@@ -1,7 +0,0 @@
-"""When called as a script, consumes the input"""
-
-import sys
-
-if __name__ == "__main__":
-    for line in sys.stdin:
-        pass
diff --git a/test-data/stdlib-samples/3.2/test/subprocessdata/qcat.py b/test-data/stdlib-samples/3.2/test/subprocessdata/qcat.py
deleted file mode 100644
index fe6f9db..0000000
--- a/test-data/stdlib-samples/3.2/test/subprocessdata/qcat.py
+++ /dev/null
@@ -1,7 +0,0 @@
-"""When ran as a script, simulates cat with no arguments."""
-
-import sys
-
-if __name__ == "__main__":
-    for line in sys.stdin:
-        sys.stdout.write(line)
diff --git a/test-data/stdlib-samples/3.2/test/subprocessdata/qgrep.py b/test-data/stdlib-samples/3.2/test/subprocessdata/qgrep.py
deleted file mode 100644
index 6990637..0000000
--- a/test-data/stdlib-samples/3.2/test/subprocessdata/qgrep.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""When called with a single argument, simulated fgrep with a single
-argument and no options."""
-
-import sys
-
-if __name__ == "__main__":
-    pattern = sys.argv[1]
-    for line in sys.stdin:
-        if pattern in line:
-            sys.stdout.write(line)
diff --git a/test-data/stdlib-samples/3.2/test/subprocessdata/sigchild_ignore.py b/test-data/stdlib-samples/3.2/test/subprocessdata/sigchild_ignore.py
deleted file mode 100644
index 6072aec..0000000
--- a/test-data/stdlib-samples/3.2/test/subprocessdata/sigchild_ignore.py
+++ /dev/null
@@ -1,6 +0,0 @@
-import signal, subprocess, sys
-# On Linux this causes os.waitpid to fail with OSError as the OS has already
-# reaped our child process.  The wait() passing the OSError on to the caller
-# and causing us to exit with an error is what we are testing against.
-signal.signal(signal.SIGCHLD, signal.SIG_IGN)
-subprocess.Popen([sys.executable, '-c', 'print("albatross")']).wait()
diff --git a/test-data/stdlib-samples/3.2/test/support.py b/test-data/stdlib-samples/3.2/test/support.py
deleted file mode 100644
index a36ba28..0000000
--- a/test-data/stdlib-samples/3.2/test/support.py
+++ /dev/null
@@ -1,1602 +0,0 @@
-"""Supporting definitions for the Python regression tests."""
-
-if __name__ != 'test.support':
-    raise ImportError('support must be imported from the test package')
-
-import contextlib
-import errno
-import functools
-import gc
-import socket
-import sys
-import os
-import platform
-import shutil
-import warnings
-import unittest
-import importlib
-import collections
-import re
-import subprocess
-import imp
-import time
-import sysconfig
-import fnmatch
-import logging.handlers
-
-import _thread, threading
-from typing import Any, Dict, cast
-#try:
-#    import multiprocessing.process
-#except ImportError:
-#    multiprocessing = None
-
-
-__all__ = [
-    "Error", "TestFailed", "ResourceDenied", "import_module",
-    "verbose", "use_resources", "max_memuse", "record_original_stdout",
-    "get_original_stdout", "unload", "unlink", "rmtree", "forget",
-    "is_resource_enabled", "requires", "requires_mac_ver",
-    "find_unused_port", "bind_port",
-    "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "SAVEDCWD", "temp_cwd",
-    "findfile", "sortdict", "check_syntax_error", "open_urlresource",
-    "check_warnings", "CleanImport", "EnvironmentVarGuard",
-    "TransientResource", "captured_output", "captured_stdout",
-    "captured_stdin", "captured_stderr",
-    "time_out", "socket_peer_reset", "ioerror_peer_reset",
-    "run_with_locale", 'temp_umask', "transient_internet",
-    "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
-    "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
-    "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
-    "swap_item", "swap_attr", "requires_IEEE_754",
-    "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
-    "import_fresh_module", "failfast",
-    ]
-
-class Error(Exception):
-    """Base class for regression test exceptions."""
-
-class TestFailed(Error):
-    """Test failed."""
-
-class ResourceDenied(unittest.SkipTest):
-    """Test skipped because it requested a disallowed resource.
-
-    This is raised when a test calls requires() for a resource that
-    has not be enabled.  It is used to distinguish between expected
-    and unexpected skips.
-    """
-
- at contextlib.contextmanager
-def _ignore_deprecated_imports(ignore=True):
-    """Context manager to suppress package and module deprecation
-    warnings when importing them.
-
-    If ignore is False, this context manager has no effect."""
-    if ignore:
-        with warnings.catch_warnings():
-            warnings.filterwarnings("ignore", ".+ (module|package)",
-                                    DeprecationWarning)
-            yield None
-    else:
-        yield None
-
-
-def import_module(name, deprecated=False):
-    """Import and return the module to be tested, raising SkipTest if
-    it is not available.
-
-    If deprecated is True, any module or package deprecation messages
-    will be suppressed."""
-    with _ignore_deprecated_imports(deprecated):
-        try:
-            return importlib.import_module(name)
-        except ImportError as msg:
-            raise unittest.SkipTest(str(msg))
-
-
-def _save_and_remove_module(name, orig_modules):
-    """Helper function to save and remove a module from sys.modules
-
-       Raise ImportError if the module can't be imported."""
-    # try to import the module and raise an error if it can't be imported
-    if name not in sys.modules:
-        __import__(name)
-        del sys.modules[name]
-    for modname in list(sys.modules):
-        if modname == name or modname.startswith(name + '.'):
-            orig_modules[modname] = sys.modules[modname]
-            del sys.modules[modname]
-
-def _save_and_block_module(name, orig_modules):
-    """Helper function to save and block a module in sys.modules
-
-       Return True if the module was in sys.modules, False otherwise."""
-    saved = True
-    try:
-        orig_modules[name] = sys.modules[name]
-    except KeyError:
-        saved = False
-    sys.modules[name] = None
-    return saved
-
-
-def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
-    """Imports and returns a module, deliberately bypassing the sys.modules cache
-    and importing a fresh copy of the module. Once the import is complete,
-    the sys.modules cache is restored to its original state.
-
-    Modules named in fresh are also imported anew if needed by the import.
-    If one of these modules can't be imported, None is returned.
-
-    Importing of modules named in blocked is prevented while the fresh import
-    takes place.
-
-    If deprecated is True, any module or package deprecation messages
-    will be suppressed."""
-    # NOTE: test_heapq, test_json and test_warnings include extra sanity checks
-    # to make sure that this utility function is working as expected
-    with _ignore_deprecated_imports(deprecated):
-        # Keep track of modules saved for later restoration as well
-        # as those which just need a blocking entry removed
-        orig_modules = {}
-        names_to_remove = []
-        _save_and_remove_module(name, orig_modules)
-        try:
-            for fresh_name in fresh:
-                _save_and_remove_module(fresh_name, orig_modules)
-            for blocked_name in blocked:
-                if not _save_and_block_module(blocked_name, orig_modules):
-                    names_to_remove.append(blocked_name)
-            fresh_module = importlib.import_module(name)
-        except ImportError:
-            fresh_module = None
-        finally:
-            for orig_name, module in orig_modules.items():
-                sys.modules[orig_name] = module
-            for name_to_remove in names_to_remove:
-                del sys.modules[name_to_remove]
-        return fresh_module
-
-
-def get_attribute(obj, name):
-    """Get an attribute, raising SkipTest if AttributeError is raised."""
-    try:
-        attribute = getattr(obj, name)
-    except AttributeError:
-        raise unittest.SkipTest("module %s has no attribute %s" % (
-            obj.__name__, name))
-    else:
-        return attribute
-
-verbose = 1              # Flag set to 0 by regrtest.py
-use_resources = None # type: Any     # Flag set to [] by regrtest.py
-max_memuse = 0           # Disable bigmem tests (they will still be run with
-                         # small sizes, to make sure they work.)
-real_max_memuse = 0
-failfast = False
-match_tests = None # type: Any
-
-# _original_stdout is meant to hold stdout at the time regrtest began.
-# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
-# The point is to have some flavor of stdout the user can actually see.
-_original_stdout = None # type: 'Any'
-def record_original_stdout(stdout):
-    global _original_stdout
-    _original_stdout = stdout
-
-def get_original_stdout():
-    return _original_stdout or sys.stdout
-
-def unload(name):
-    try:
-        del sys.modules[name]
-    except KeyError:
-        pass
-
-def unlink(filename):
-    try:
-        os.unlink(filename)
-    except OSError as error:
-        # The filename need not exist.
-        if error.errno not in (errno.ENOENT, errno.ENOTDIR):
-            raise
-
-def rmtree(path):
-    try:
-        shutil.rmtree(path)
-    except OSError as error:
-        # Unix returns ENOENT, Windows returns ESRCH.
-        if error.errno not in (errno.ENOENT, errno.ESRCH):
-            raise
-
-def make_legacy_pyc(source):
-    """Move a PEP 3147 pyc/pyo file to its legacy pyc/pyo location.
-
-    The choice of .pyc or .pyo extension is done based on the __debug__ flag
-    value.
-
-    :param source: The file system path to the source file.  The source file
-        does not need to exist, however the PEP 3147 pyc file must exist.
-    :return: The file system path to the legacy pyc file.
-    """
-    pyc_file = imp.cache_from_source(source)
-    up_one = os.path.dirname(os.path.abspath(source))
-    if __debug__:
-        ch = 'c'
-    else:
-        ch = 'o'
-    legacy_pyc = os.path.join(up_one, source + ch)
-    os.rename(pyc_file, legacy_pyc)
-    return legacy_pyc
-
-def forget(modname):
-    """'Forget' a module was ever imported.
-
-    This removes the module from sys.modules and deletes any PEP 3147 or
-    legacy .pyc and .pyo files.
-    """
-    unload(modname)
-    for dirname in sys.path:
-        source = os.path.join(dirname, modname + '.py')
-        # It doesn't matter if they exist or not, unlink all possible
-        # combinations of PEP 3147 and legacy pyc and pyo files.
-        unlink(source + 'c')
-        unlink(source + 'o')
-        unlink(imp.cache_from_source(source, debug_override=True))
-        unlink(imp.cache_from_source(source, debug_override=False))
-
-# On some platforms, should not run gui test even if it is allowed
-# in `use_resources'.
-#if sys.platform.startswith('win'):
-    #import ctypes
-    #import ctypes.wintypes
-    #def _is_gui_available():
-    #    UOI_FLAGS = 1
-    #    WSF_VISIBLE = 0x0001
-    #    class USEROBJECTFLAGS(ctypes.Structure):
-    #        _fields_ = [("fInherit", ctypes.wintypes.BOOL),
-    #                    ("fReserved", ctypes.wintypes.BOOL),
-    #                    ("dwFlags", ctypes.wintypes.DWORD)]
-    #    dll = ctypes.windll.user32
-    #    h = dll.GetProcessWindowStation()
-    #    if not h:
-    #        raise ctypes.WinError()
-    #    uof = USEROBJECTFLAGS()
-    #    needed = ctypes.wintypes.DWORD()
-    #    res = dll.GetUserObjectInformationW(h,
-    #        UOI_FLAGS,
-    #        ctypes.byref(uof),
-    #        ctypes.sizeof(uof),
-    #        ctypes.byref(needed))
-    #    if not res:
-    #        raise ctypes.WinError()
-    #    return bool(uof.dwFlags & WSF_VISIBLE)
-#else:
-def _is_gui_available():
-    return True
-
-def is_resource_enabled(resource):
-    """Test whether a resource is enabled.  Known resources are set by
-    regrtest.py."""
-    return use_resources is not None and resource in use_resources
-
-def requires(resource, msg=None):
-    """Raise ResourceDenied if the specified resource is not available.
-
-    If the caller's module is __main__ then automatically return True.  The
-    possibility of False being returned occurs when regrtest.py is
-    executing.
-    """
-    if resource == 'gui' and not _is_gui_available():
-        raise unittest.SkipTest("Cannot use the 'gui' resource")
-    # see if the caller's module is __main__ - if so, treat as if
-    # the resource was set
-    if sys._getframe(1).f_globals.get("__name__") == "__main__":
-        return
-    if not is_resource_enabled(resource):
-        if msg is None:
-            msg = "Use of the `%s' resource not enabled" % resource
-        raise ResourceDenied(msg)
-
-def requires_mac_ver(*min_version):
-    """Decorator raising SkipTest if the OS is Mac OS X and the OS X
-    version if less than min_version.
-
-    For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version
-    is lesser than 10.5.
-    """
-    def decorator(func):
-        @functools.wraps(func)
-        def wrapper(*args, **kw):
-            if sys.platform == 'darwin':
-                version_txt = platform.mac_ver()[0]
-                try:
-                    version = tuple(map(int, version_txt.split('.')))
-                except ValueError:
-                    pass
-                else:
-                    if version < min_version:
-                        min_version_txt = '.'.join(map(str, min_version))
-                        raise unittest.SkipTest(
-                            "Mac OS X %s or higher required, not %s"
-                            % (min_version_txt, version_txt))
-            return func(*args, **kw)
-        wrapper.min_version = min_version
-        return wrapper
-    return decorator
-
-HOST = 'localhost'
-
-def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
-    """Returns an unused port that should be suitable for binding.  This is
-    achieved by creating a temporary socket with the same family and type as
-    the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
-    the specified host address (defaults to 0.0.0.0) with the port set to 0,
-    eliciting an unused ephemeral port from the OS.  The temporary socket is
-    then closed and deleted, and the ephemeral port is returned.
-
-    Either this method or bind_port() should be used for any tests where a
-    server socket needs to be bound to a particular port for the duration of
-    the test.  Which one to use depends on whether the calling code is creating
-    a python socket, or if an unused port needs to be provided in a constructor
-    or passed to an external program (i.e. the -accept argument to openssl's
-    s_server mode).  Always prefer bind_port() over find_unused_port() where
-    possible.  Hard coded ports should *NEVER* be used.  As soon as a server
-    socket is bound to a hard coded port, the ability to run multiple instances
-    of the test simultaneously on the same host is compromised, which makes the
-    test a ticking time bomb in a buildbot environment. On Unix buildbots, this
-    may simply manifest as a failed test, which can be recovered from without
-    intervention in most cases, but on Windows, the entire python process can
-    completely and utterly wedge, requiring someone to log in to the buildbot
-    and manually kill the affected process.
-
-    (This is easy to reproduce on Windows, unfortunately, and can be traced to
-    the SO_REUSEADDR socket option having different semantics on Windows versus
-    Unix/Linux.  On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
-    listen and then accept connections on identical host/ports.  An EADDRINUSE
-    socket.error will be raised at some point (depending on the platform and
-    the order bind and listen were called on each socket).
-
-    However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
-    will ever be raised when attempting to bind two identical host/ports. When
-    accept() is called on each socket, the second caller's process will steal
-    the port from the first caller, leaving them both in an awkwardly wedged
-    state where they'll no longer respond to any signals or graceful kills, and
-    must be forcibly killed via OpenProcess()/TerminateProcess().
-
-    The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
-    instead of SO_REUSEADDR, which effectively affords the same semantics as
-    SO_REUSEADDR on Unix.  Given the propensity of Unix developers in the Open
-    Source world compared to Windows ones, this is a common mistake.  A quick
-    look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
-    openssl.exe is called with the 's_server' option, for example. See
-    http://bugs.python.org/issue2550 for more info.  The following site also
-    has a very thorough description about the implications of both REUSEADDR
-    and EXCLUSIVEADDRUSE on Windows:
-    http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
-
-    XXX: although this approach is a vast improvement on previous attempts to
-    elicit unused ports, it rests heavily on the assumption that the ephemeral
-    port returned to us by the OS won't immediately be dished back out to some
-    other process when we close and delete our temporary socket but before our
-    calling code has a chance to bind the returned port.  We can deal with this
-    issue if/when we come across it.
-    """
-
-    tempsock = socket.socket(family, socktype)
-    port = bind_port(tempsock)
-    tempsock.close()
-    #del tempsock
-    return port
-
-def bind_port(sock, host=HOST):
-    """Bind the socket to a free port and return the port number.  Relies on
-    ephemeral ports in order to ensure we are using an unbound port.  This is
-    important as many tests may be running simultaneously, especially in a
-    buildbot environment.  This method raises an exception if the sock.family
-    is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
-    or SO_REUSEPORT set on it.  Tests should *never* set these socket options
-    for TCP/IP sockets.  The only case for setting these options is testing
-    multicasting via multiple UDP sockets.
-
-    Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
-    on Windows), it will be set on the socket.  This will prevent anyone else
-    from bind()'ing to our host/port for the duration of the test.
-    """
-
-    if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
-        if hasattr(socket, 'SO_REUSEADDR'):
-            if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
-                raise TestFailed("tests should never set the SO_REUSEADDR "   \
-                                 "socket option on TCP/IP sockets!")
-        if hasattr(socket, 'SO_REUSEPORT'):
-            if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
-                raise TestFailed("tests should never set the SO_REUSEPORT "   \
-                                 "socket option on TCP/IP sockets!")
-        if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
-            sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
-
-    sock.bind((host, 0))
-    port = sock.getsockname()[1]
-    return port
-
-FUZZ = 1e-6
-
-def fcmp(x, y): # fuzzy comparison function
-    if isinstance(x, float) or isinstance(y, float):
-        try:
-            fuzz = (abs(x) + abs(y)) * FUZZ
-            if abs(x-y) <= fuzz:
-                return 0
-        except:
-            pass
-    elif type(x) == type(y) and isinstance(x, (tuple, list)):
-        for i in range(min(len(x), len(y))):
-            outcome = fcmp(x[i], y[i])
-            if outcome != 0:
-                return outcome
-        return (len(x) > len(y)) - (len(x) < len(y))
-    return (x > y) - (x < y)
-
-# decorator for skipping tests on non-IEEE 754 platforms
-requires_IEEE_754 = unittest.skipUnless(
-    cast(Any, float).__getformat__("double").startswith("IEEE"),
-    "test requires IEEE 754 doubles")
-
-is_jython = sys.platform.startswith('java')
-
-TESTFN = ''
-# Filename used for testing
-if os.name == 'java':
-    # Jython disallows @ in module names
-    TESTFN = '$test'
-else:
-    TESTFN = '@test'
-
-# Disambiguate TESTFN for parallel testing, while letting it remain a valid
-# module name.
-TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
-
-
-# TESTFN_UNICODE is a non-ascii filename
-TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f"
-if sys.platform == 'darwin':
-    # In Mac OS X's VFS API file names are, by definition, canonically
-    # decomposed Unicode, encoded using UTF-8. See QA1173:
-    # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
-    import unicodedata
-    TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE)
-TESTFN_ENCODING = sys.getfilesystemencoding()
-
-# TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be
-# encoded by the filesystem encoding (in strict mode). It can be None if we
-# cannot generate such filename.
-TESTFN_UNENCODABLE = None # type: Any
-if os.name in ('nt', 'ce'):
-    # skip win32s (0) or Windows 9x/ME (1)
-    if sys.getwindowsversion().platform >= 2:
-        # Different kinds of characters from various languages to minimize the
-        # probability that the whole name is encodable to MBCS (issue #9819)
-        TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
-        try:
-            TESTFN_UNENCODABLE.encode(TESTFN_ENCODING)
-        except UnicodeEncodeError:
-            pass
-        else:
-            print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). '
-                  'Unicode filename tests may not be effective'
-                  % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
-            TESTFN_UNENCODABLE = None
-# Mac OS X denies unencodable filenames (invalid utf-8)
-elif sys.platform != 'darwin':
-    try:
-        # ascii and utf-8 cannot encode the byte 0xff
-        b'\xff'.decode(TESTFN_ENCODING)
-    except UnicodeDecodeError:
-        # 0xff will be encoded using the surrogate character u+DCFF
-        TESTFN_UNENCODABLE = TESTFN \
-            + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape')
-    else:
-        # File system encoding (eg. ISO-8859-* encodings) can encode
-        # the byte 0xff. Skip some unicode filename tests.
-        pass
-
-# Save the initial cwd
-SAVEDCWD = os.getcwd()
-
- at contextlib.contextmanager
-def temp_cwd(name='tempcwd', quiet=False, path=None):
-    """
-    Context manager that temporarily changes the CWD.
-
-    An existing path may be provided as *path*, in which case this
-    function makes no changes to the file system.
-
-    Otherwise, the new CWD is created in the current directory and it's
-    named *name*. If *quiet* is False (default) and it's not possible to
-    create or change the CWD, an error is raised.  If it's True, only a
-    warning is raised and the original CWD is used.
-    """
-    saved_dir = os.getcwd()
-    is_temporary = False
-    if path is None:
-        path = name
-        try:
-            os.mkdir(name)
-            is_temporary = True
-        except OSError:
-            if not quiet:
-                raise
-            warnings.warn('tests may fail, unable to create temp CWD ' + name,
-                          RuntimeWarning, stacklevel=3)
-    try:
-        os.chdir(path)
-    except OSError:
-        if not quiet:
-            raise
-        warnings.warn('tests may fail, unable to change the CWD to ' + name,
-                      RuntimeWarning, stacklevel=3)
-    try:
-        yield os.getcwd()
-    finally:
-        os.chdir(saved_dir)
-        if is_temporary:
-            rmtree(name)
-
-
- at contextlib.contextmanager
-def temp_umask(umask):
-    """Context manager that temporarily sets the process umask."""
-    oldmask = os.umask(umask)
-    try:
-        yield None
-    finally:
-        os.umask(oldmask)
-
-
-def findfile(file, here=__file__, subdir=None):
-    """Try to find a file on sys.path and the working directory.  If it is not
-    found the argument passed to the function is returned (this does not
-    necessarily signal failure; could still be the legitimate path)."""
-    if os.path.isabs(file):
-        return file
-    if subdir is not None:
-        file = os.path.join(subdir, file)
-    path = sys.path
-    path = [os.path.dirname(here)] + path
-    for dn in path:
-        fn = os.path.join(dn, file)
-        if os.path.exists(fn): return fn
-    return file
-
-def sortdict(dict):
-    "Like repr(dict), but in sorted order."
-    items = sorted(dict.items())
-    reprpairs = ["%r: %r" % pair for pair in items]
-    withcommas = ", ".join(reprpairs)
-    return "{%s}" % withcommas
-
-def make_bad_fd():
-    """
-    Create an invalid file descriptor by opening and closing a file and return
-    its fd.
-    """
-    file = open(TESTFN, "wb")
-    try:
-        return file.fileno()
-    finally:
-        file.close()
-        unlink(TESTFN)
-
-def check_syntax_error(testcase, statement):
-    raise NotImplementedError('no compile built-in')
-    #testcase.assertRaises(SyntaxError, compile, statement,
-    #                      '<test string>', 'exec')
-
-def open_urlresource(url, *args, **kw):
-    from urllib import request, parse
-
-    check = kw.pop('check', None)
-
-    filename = parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
-
-    fn = os.path.join(os.path.dirname(__file__), "data", filename)
-
-    def check_valid_file(fn):
-        f = open(fn, *args, **kw)
-        if check is None:
-            return f
-        elif check(f):
-            f.seek(0)
-            return f
-        f.close()
-
-    if os.path.exists(fn):
-        f = check_valid_file(fn)
-        if f is not None:
-            return f
-        unlink(fn)
-
-    # Verify the requirement before downloading the file
-    requires('urlfetch')
-
-    print('\tfetching %s ...' % url, file=get_original_stdout())
-    f = request.urlopen(url, timeout=15)
-    try:
-        with open(fn, "wb") as out:
-            s = f.read()
-            while s:
-                out.write(s)
-                s = f.read()
-    finally:
-        f.close()
-
-    f = check_valid_file(fn)
-    if f is not None:
-        return f
-    raise TestFailed('invalid resource "%s"' % fn)
-
-
-class WarningsRecorder(object):
-    """Convenience wrapper for the warnings list returned on
-       entry to the warnings.catch_warnings() context manager.
-    """
-    def __init__(self, warnings_list):
-        self._warnings = warnings_list
-        self._last = 0
-
-    def __getattr__(self, attr):
-        if len(self._warnings) > self._last:
-            return getattr(self._warnings[-1], attr)
-        elif attr in warnings.WarningMessage._WARNING_DETAILS:
-            return None
-        raise AttributeError("%r has no attribute %r" % (self, attr))
-
-    #@property
-    #def warnings(self):
-    #    return self._warnings[self._last:]
-
-    def reset(self):
-        self._last = len(self._warnings)
-
-
-def _filterwarnings(filters, quiet=False):
-    """Catch the warnings, then check if all the expected
-    warnings have been raised and re-raise unexpected warnings.
-    If 'quiet' is True, only re-raise the unexpected warnings.
-    """
-    # Clear the warning registry of the calling module
-    # in order to re-raise the warnings.
-    frame = sys._getframe(2)
-    registry = frame.f_globals.get('__warningregistry__')
-    if registry:
-        registry.clear()
-    with warnings.catch_warnings(record=True) as w:
-        # Set filter "always" to record all warnings.  Because
-        # test_warnings swap the module, we need to look up in
-        # the sys.modules dictionary.
-        sys.modules['warnings'].simplefilter("always")
-        yield WarningsRecorder(w)
-    # Filter the recorded warnings
-    reraise = list(w)
-    missing = []
-    for msg, cat in filters:
-        seen = False
-        for w in reraise[:]:
-            warning = w.message
-            # Filter out the matching messages
-            if (re.match(msg, str(warning), re.I) and
-                issubclass(warning.__class__, cat)):
-                seen = True
-                reraise.remove(w)
-        if not seen and not quiet:
-            # This filter caught nothing
-            missing.append((msg, cat.__name__))
-    if reraise:
-        raise AssertionError("unhandled warning %s" % reraise[0])
-    if missing:
-        raise AssertionError("filter (%r, %s) did not catch any warning" %
-                             missing[0])
-
-
- at contextlib.contextmanager
-def check_warnings(*filters, **kwargs):
-    """Context manager to silence warnings.
-
-    Accept 2-tuples as positional arguments:
-        ("message regexp", WarningCategory)
-
-    Optional argument:
-     - if 'quiet' is True, it does not fail if a filter catches nothing
-        (default True without argument,
-         default False if some filters are defined)
-
-    Without argument, it defaults to:
-        check_warnings(("", Warning), quiet=True)
-    """
-    quiet = kwargs.get('quiet')
-    if not filters:
-        filters = (("", Warning),)
-        # Preserve backward compatibility
-        if quiet is None:
-            quiet = True
-    return _filterwarnings(filters, quiet)
-
-
-class CleanImport(object):
-    """Context manager to force import to return a new module reference.
-
-    This is useful for testing module-level behaviours, such as
-    the emission of a DeprecationWarning on import.
-
-    Use like this:
-
-        with CleanImport("foo"):
-            importlib.import_module("foo") # new reference
-    """
-
-    def __init__(self, *module_names):
-        self.original_modules = sys.modules.copy()
-        for module_name in module_names:
-            if module_name in sys.modules:
-                module = sys.modules[module_name]
-                # It is possible that module_name is just an alias for
-                # another module (e.g. stub for modules renamed in 3.x).
-                # In that case, we also need delete the real module to clear
-                # the import cache.
-                if module.__name__ != module_name:
-                    del sys.modules[module.__name__]
-                del sys.modules[module_name]
-
-    def __enter__(self):
-        return self
-
-    def __exit__(self, *ignore_exc):
-        sys.modules.update(self.original_modules)
-
-
-class EnvironmentVarGuard(dict):
-
-    """Class to help protect the environment variable properly.  Can be used as
-    a context manager."""
-
-    def __init__(self):
-        self._environ = os.environ
-        self._changed = {}
-
-    def __getitem__(self, envvar):
-        return self._environ[envvar]
-
-    def __setitem__(self, envvar, value):
-        # Remember the initial value on the first access
-        if envvar not in self._changed:
-            self._changed[envvar] = self._environ.get(envvar)
-        self._environ[envvar] = value
-
-    def __delitem__(self, envvar):
-        # Remember the initial value on the first access
-        if envvar not in self._changed:
-            self._changed[envvar] = self._environ.get(envvar)
-        if envvar in self._environ:
-            del self._environ[envvar]
-
-    def keys(self):
-        return self._environ.keys()
-
-    def __iter__(self):
-        return iter(self._environ)
-
-    def __len__(self):
-        return len(self._environ)
-
-    def set(self, envvar, value):
-        self[envvar] = value
-
-    def unset(self, envvar):
-        del self[envvar]
-
-    def __enter__(self):
-        return self
-
-    def __exit__(self, *ignore_exc):
-        for k, v in self._changed.items():
-            if v is None:
-                if k in self._environ:
-                    del self._environ[k]
-            else:
-                self._environ[k] = v
-        os.environ = self._environ
-
-
-class DirsOnSysPath(object):
-    """Context manager to temporarily add directories to sys.path.
-
-    This makes a copy of sys.path, appends any directories given
-    as positional arguments, then reverts sys.path to the copied
-    settings when the context ends.
-
-    Note that *all* sys.path modifications in the body of the
-    context manager, including replacement of the object,
-    will be reverted at the end of the block.
-    """
-
-    def __init__(self, *paths):
-        self.original_value = sys.path[:]
-        self.original_object = sys.path
-        sys.path.extend(paths)
-
-    def __enter__(self):
-        return self
-
-    def __exit__(self, *ignore_exc):
-        sys.path = self.original_object
-        sys.path[:] = self.original_value
-
-
-class TransientResource(object):
-
-    """Raise ResourceDenied if an exception is raised while the context manager
-    is in effect that matches the specified exception and attributes."""
-
-    def __init__(self, exc, **kwargs):
-        self.exc = exc
-        self.attrs = kwargs
-
-    def __enter__(self):
-        return self
-
-    def __exit__(self, type_=None, value=None, traceback=None):
-        """If type_ is a subclass of self.exc and value has attributes matching
-        self.attrs, raise ResourceDenied.  Otherwise let the exception
-        propagate (if any)."""
-        if type_ is not None and issubclass(self.exc, type_):
-            for attr, attr_value in self.attrs.items():
-                if not hasattr(value, attr):
-                    break
-                if getattr(value, attr) != attr_value:
-                    break
-            else:
-                raise ResourceDenied("an optional resource is not available")
-
-# Context managers that raise ResourceDenied when various issues
-# with the Internet connection manifest themselves as exceptions.
-# XXX deprecate these and use transient_internet() instead
-time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
-socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
-ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
-
-
- at contextlib.contextmanager
-def transient_internet(resource_name, *, timeout=30.0, errnos=()):
-    """Return a context manager that raises ResourceDenied when various issues
-    with the Internet connection manifest themselves as exceptions."""
-    default_errnos = [
-        ('ECONNREFUSED', 111),
-        ('ECONNRESET', 104),
-        ('EHOSTUNREACH', 113),
-        ('ENETUNREACH', 101),
-        ('ETIMEDOUT', 110),
-    ]
-    default_gai_errnos = [
-        ('EAI_AGAIN', -3),
-        ('EAI_FAIL', -4),
-        ('EAI_NONAME', -2),
-        ('EAI_NODATA', -5),
-        # Encountered when trying to resolve IPv6-only hostnames
-        ('WSANO_DATA', 11004),
-    ]
-
-    denied = ResourceDenied("Resource '%s' is not available" % resource_name)
-    captured_errnos = errnos
-    gai_errnos = []
-    if not captured_errnos:
-        captured_errnos = [getattr(errno, name, num)
-                           for name, num in default_errnos]
-        gai_errnos = [getattr(socket, name, num)
-                      for name, num in default_gai_errnos]
-
-    def filter_error(err):
-        n = getattr(err, 'errno', None)
-        if (isinstance(err, socket.timeout) or
-            (isinstance(err, socket.gaierror) and n in gai_errnos) or
-            n in captured_errnos):
-            if not verbose:
-                sys.stderr.write(denied.args[0] + "\n")
-            raise denied from err
-
-    old_timeout = socket.getdefaulttimeout()
-    try:
-        if timeout is not None:
-            socket.setdefaulttimeout(timeout)
-        yield None
-    except IOError as err:
-        # urllib can wrap original socket errors multiple times (!), we must
-        # unwrap to get at the original error.
-        while True:
-            a = err.args
-            if len(a) >= 1 and isinstance(a[0], IOError):
-                err = a[0]
-            # The error can also be wrapped as args[1]:
-            #    except socket.error as msg:
-            #        raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
-            elif len(a) >= 2 and isinstance(a[1], IOError):
-                err = a[1]
-            else:
-                break
-        filter_error(err)
-        raise
-    # XXX should we catch generic exceptions and look for their
-    # __cause__ or __context__?
-    finally:
-        socket.setdefaulttimeout(old_timeout)
-
-
- at contextlib.contextmanager
-def captured_output(stream_name):
-    """Return a context manager used by captured_stdout/stdin/stderr
-    that temporarily replaces the sys stream *stream_name* with a StringIO."""
-    import io
-    orig_stdout = getattr(sys, stream_name)
-    setattr(sys, stream_name, io.StringIO())
-    try:
-        yield getattr(sys, stream_name)
-    finally:
-        setattr(sys, stream_name, orig_stdout)
-
-def captured_stdout():
-    """Capture the output of sys.stdout:
-
-       with captured_stdout() as s:
-           print("hello")
-       self.assertEqual(s.getvalue(), "hello")
-    """
-    return captured_output("stdout")
-
-def captured_stderr():
-    return captured_output("stderr")
-
-def captured_stdin():
-    return captured_output("stdin")
-
-
-def gc_collect():
-    """Force as many objects as possible to be collected.
-
-    In non-CPython implementations of Python, this is needed because timely
-    deallocation is not guaranteed by the garbage collector.  (Even in CPython
-    this can be the case in case of reference cycles.)  This means that __del__
-    methods may be called later than expected and weakrefs may remain alive for
-    longer than expected.  This function tries its best to force all garbage
-    objects to disappear.
-    """
-    gc.collect()
-    if is_jython:
-        time.sleep(0.1)
-    gc.collect()
-    gc.collect()
-
-
-def python_is_optimized():
-    """Find if Python was built with optimizations."""
-    cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
-    final_opt = ""
-    for opt in cflags.split():
-        if opt.startswith('-O'):
-            final_opt = opt
-    return final_opt and final_opt != '-O0'
-
-
-#=======================================================================
-# Decorator for running a function in a different locale, correctly resetting
-# it afterwards.
-
-def run_with_locale(catstr, *locales):
-    def decorator(func):
-        def inner(*args, **kwds):
-            try:
-                import locale
-                category = getattr(locale, catstr)
-                orig_locale = locale.setlocale(category)
-            except AttributeError:
-                # if the test author gives us an invalid category string
-                raise
-            except:
-                # cannot retrieve original locale, so do nothing
-                locale = orig_locale = None
-            else:
-                for loc in locales:
-                    try:
-                        locale.setlocale(category, loc)
-                        break
-                    except:
-                        pass
-
-            # now run the function, resetting the locale on exceptions
-            try:
-                return func(*args, **kwds)
-            finally:
-                if locale and orig_locale:
-                    locale.setlocale(category, orig_locale)
-        inner.__name__ = func.__name__
-        inner.__doc__ = func.__doc__
-        return inner
-    return decorator
-
-#=======================================================================
-# Big-memory-test support. Separate from 'resources' because memory use
-# should be configurable.
-
-# Some handy shorthands. Note that these are used for byte-limits as well
-# as size-limits, in the various bigmem tests
-_1M = 1024*1024
-_1G = 1024 * _1M
-_2G = 2 * _1G
-_4G = 4 * _1G
-
-MAX_Py_ssize_t = sys.maxsize
-
-def set_memlimit(limit):
-    global max_memuse
-    global real_max_memuse
-    sizes = {
-        'k': 1024,
-        'm': _1M,
-        'g': _1G,
-        't': 1024*_1G,
-    }
-    m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
-                 re.IGNORECASE | re.VERBOSE)
-    if m is None:
-        raise ValueError('Invalid memory limit %r' % (limit,))
-    memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
-    real_max_memuse = memlimit
-    if memlimit > MAX_Py_ssize_t:
-        memlimit = MAX_Py_ssize_t
-    if memlimit < _2G - 1:
-        raise ValueError('Memory limit %r too low to be useful' % (limit,))
-    max_memuse = memlimit
-
-def _memory_watchdog(start_evt, finish_evt, period=10.0):
-    """A function which periodically watches the process' memory consumption
-    and prints it out.
-    """
-    # XXX: because of the GIL, and because the very long operations tested
-    # in most bigmem tests are uninterruptible, the loop below gets woken up
-    # much less often than expected.
-    # The polling code should be rewritten in raw C, without holding the GIL,
-    # and push results onto an anonymous pipe.
-    try:
-        page_size = os.sysconf('SC_PAGESIZE')
-    except (ValueError, AttributeError):
-        try:
-            page_size = os.sysconf('SC_PAGE_SIZE')
-        except (ValueError, AttributeError):
-            page_size = 4096
-    procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
-    try:
-        f = open(procfile, 'rb')
-    except IOError as e:
-        warnings.warn('/proc not available for stats: {}'.format(e),
-                      RuntimeWarning)
-        sys.stderr.flush()
-        return
-    with f:
-        start_evt.set()
-        old_data = -1
-        while not finish_evt.wait(period):
-            f.seek(0)
-            statm = f.read().decode('ascii')
-            data = int(statm.split()[5])
-            if data != old_data:
-                old_data = data
-                print(" ... process data size: {data:.1f}G"
-                       .format(data=data * page_size / (1024 ** 3)))
-
-def bigmemtest(size, memuse, dry_run=True):
-    """Decorator for bigmem tests.
-
-    'minsize' is the minimum useful size for the test (in arbitrary,
-    test-interpreted units.) 'memuse' is the number of 'bytes per size' for
-    the test, or a good estimate of it.
-
-    if 'dry_run' is False, it means the test doesn't support dummy runs
-    when -M is not specified.
-    """
-    def decorator(f):
-        def wrapper(self):
-            size = wrapper.size
-            memuse = wrapper.memuse
-            if not real_max_memuse:
-                maxsize = 5147
-            else:
-                maxsize = size
-
-            if ((real_max_memuse or not dry_run)
-                and real_max_memuse < maxsize * memuse):
-                raise unittest.SkipTest(
-                    "not enough memory: %.1fG minimum needed"
-                    % (size * memuse / (1024 ** 3)))
-
-            if real_max_memuse and verbose and threading:
-                print()
-                print(" ... expected peak memory use: {peak:.1f}G"
-                      .format(peak=size * memuse / (1024 ** 3)))
-                sys.stdout.flush()
-                start_evt = threading.Event()
-                finish_evt = threading.Event()
-                t = threading.Thread(target=_memory_watchdog,
-                                     args=(start_evt, finish_evt, 0.5))
-                t.daemon = True
-                t.start()
-                start_evt.set()
-            else:
-                t = None
-
-            try:
-                return f(self, maxsize)
-            finally:
-                if t:
-                    finish_evt.set()
-                    t.join()
-
-        wrapper.size = size
-        wrapper.memuse = memuse
-        return wrapper
-    return decorator
-
-def bigaddrspacetest(f):
-    """Decorator for tests that fill the address space."""
-    def wrapper(self):
-        if max_memuse < MAX_Py_ssize_t:
-            if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
-                raise unittest.SkipTest(
-                    "not enough memory: try a 32-bit build instead")
-            else:
-                raise unittest.SkipTest(
-                    "not enough memory: %.1fG minimum needed"
-                    % (MAX_Py_ssize_t / (1024 ** 3)))
-        else:
-            return f(self)
-    return wrapper
-
-#=======================================================================
-# unittest integration.
-
-class BasicTestRunner:
-    def run(self, test):
-        result = unittest.TestResult()
-        test(result)
-        return result
-
-def _id(obj):
-    return obj
-
-def requires_resource(resource):
-    if resource == 'gui' and not _is_gui_available():
-        return unittest.skip("resource 'gui' is not available")
-    if is_resource_enabled(resource):
-        return _id
-    else:
-        return unittest.skip("resource {0!r} is not enabled".format(resource))
-
-def cpython_only(test):
-    """
-    Decorator for tests only applicable on CPython.
-    """
-    return impl_detail(cpython=True)(test)
-
-def impl_detail(msg=None, **guards):
-    if check_impl_detail(**guards):
-        return _id
-    if msg is None:
-        guardnames, default = _parse_guards(guards)
-        if default:
-            msg = "implementation detail not available on {0}"
-        else:
-            msg = "implementation detail specific to {0}"
-        guardnames = sorted(guardnames.keys())
-        msg = msg.format(' or '.join(guardnames))
-    return unittest.skip(msg)
-
-def _parse_guards(guards):
-    # Returns a tuple ({platform_name: run_me}, default_value)
-    if not guards:
-        return ({'cpython': True}, False)
-    is_true = list(guards.values())[0]
-    assert list(guards.values()) == [is_true] * len(guards)   # all True or all False
-    return (guards, not is_true)
-
-# Use the following check to guard CPython's implementation-specific tests --
-# or to run them only on the implementation(s) guarded by the arguments.
-def check_impl_detail(**guards):
-    """This function returns True or False depending on the host platform.
-       Examples:
-          if check_impl_detail():               # only on CPython (default)
-          if check_impl_detail(jython=True):    # only on Jython
-          if check_impl_detail(cpython=False):  # everywhere except on CPython
-    """
-    guards, default = _parse_guards(guards)
-    return guards.get(platform.python_implementation().lower(), default)
-
-
-def _filter_suite(suite, pred):
-    """Recursively filter test cases in a suite based on a predicate."""
-    newtests = []
-    for test in suite._tests:
-        if isinstance(test, unittest.TestSuite):
-            _filter_suite(test, pred)
-            newtests.append(test)
-        else:
-            if pred(test):
-                newtests.append(test)
-    suite._tests = newtests
-
-
-def _run_suite(suite):
-    """Run tests from a unittest.TestSuite-derived class."""
-    if verbose:
-        runner = unittest.TextTestRunner(sys.stdout, verbosity=2,
-                                         failfast=failfast)
-    else:
-        runner = BasicTestRunner()
-
-    result = runner.run(suite)
-    if not result.wasSuccessful():
-        if len(result.errors) == 1 and not result.failures:
-            err = result.errors[0][1]
-        elif len(result.failures) == 1 and not result.errors:
-            err = result.failures[0][1]
-        else:
-            err = "multiple errors occurred"
-            if not verbose: err += "; run in verbose mode for details"
-        raise TestFailed(err)
-
-
-def run_unittest(*classes):
-    """Run tests from unittest.TestCase-derived classes."""
-    valid_types = (unittest.TestSuite, unittest.TestCase)
-    suite = unittest.TestSuite()
-    for cls in classes:
-        if isinstance(cls, str):
-            if cls in sys.modules:
-                suite.addTest(unittest.findTestCases(sys.modules[cls]))
-            else:
-                raise ValueError("str arguments must be keys in sys.modules")
-        elif isinstance(cls, valid_types):
-            suite.addTest(cls)
-        else:
-            suite.addTest(unittest.makeSuite(cls))
-    def case_pred(test):
-        if match_tests is None:
-            return True
-        for name in test.id().split("."):
-            if fnmatch.fnmatchcase(name, match_tests):
-                return True
-        return False
-    _filter_suite(suite, case_pred)
-    _run_suite(suite)
-
-
-#=======================================================================
-# doctest driver.
-
-def run_doctest(module, verbosity=None):
-    """Run doctest on the given module.  Return (#failures, #tests).
-
-    If optional argument verbosity is not specified (or is None), pass
-    support's belief about verbosity on to doctest.  Else doctest's
-    usual behavior is used (it searches sys.argv for -v).
-    """
-
-    import doctest
-
-    if verbosity is None:
-        verbosity = verbose
-    else:
-        verbosity = None
-
-    f, t = doctest.testmod(module, verbose=verbosity)
-    if f:
-        raise TestFailed("%d of %d doctests failed" % (f, t))
-    if verbose:
-        print('doctest (%s) ... %d tests with zero failures' %
-              (module.__name__, t))
-    return f, t
-
-
-#=======================================================================
-# Support for saving and restoring the imported modules.
-
-def modules_setup():
-    return sys.modules.copy(),
-
-def modules_cleanup(oldmodules):
-    # Encoders/decoders are registered permanently within the internal
-    # codec cache. If we destroy the corresponding modules their
-    # globals will be set to None which will trip up the cached functions.
-    encodings = [(k, v) for k, v in sys.modules.items()
-                 if k.startswith('encodings.')]
-    sys.modules.clear()
-    sys.modules.update(encodings)
-    # XXX: This kind of problem can affect more than just encodings. In particular
-    # extension modules (such as _ssl) don't cope with reloading properly.
-    # Really, test modules should be cleaning out the test specific modules they
-    # know they added (ala test_runpy) rather than relying on this function (as
-    # test_importhooks and test_pkg do currently).
-    # Implicitly imported *real* modules should be left alone (see issue 10556).
-    sys.modules.update(oldmodules)
-
-#=======================================================================
-# Threading support to prevent reporting refleaks when running regrtest.py -R
-
-# NOTE: we use thread._count() rather than threading.enumerate() (or the
-# moral equivalent thereof) because a threading.Thread object is still alive
-# until its __bootstrap() method has returned, even after it has been
-# unregistered from the threading module.
-# thread._count(), on the other hand, only gets decremented *after* the
-# __bootstrap() method has returned, which gives us reliable reference counts
-# at the end of a test run.
-
-def threading_setup():
-    if _thread:
-        return _thread._count(), threading._dangling.copy()
-    else:
-        return 1, ()
-
-def threading_cleanup(*original_values):
-    if not _thread:
-        return
-    _MAX_COUNT = 10
-    for count in range(_MAX_COUNT):
-        values = _thread._count(), threading._dangling
-        if values == original_values:
-            break
-        time.sleep(0.1)
-        gc_collect()
-    # XXX print a warning in case of failure?
-
-def reap_threads(func):
-    """Use this function when threads are being used.  This will
-    ensure that the threads are cleaned up even when the test fails.
-    If threading is unavailable this function does nothing.
-    """
-    if not _thread:
-        return func
-
-    @functools.wraps(func)
-    def decorator(*args):
-        key = threading_setup()
-        try:
-            return func(*args)
-        finally:
-            threading_cleanup(*key)
-    return decorator
-
-def reap_children():
-    """Use this function at the end of test_main() whenever sub-processes
-    are started.  This will help ensure that no extra children (zombies)
-    stick around to hog resources and create problems when looking
-    for refleaks.
-    """
-
-    # Reap all our dead child processes so we don't leave zombies around.
-    # These hog resources and might be causing some of the buildbots to die.
-    if hasattr(os, 'waitpid'):
-        any_process = -1
-        while True:
-            try:
-                # This will raise an exception on Windows.  That's ok.
-                pid, status = os.waitpid(any_process, os.WNOHANG)
-                if pid == 0:
-                    break
-            except:
-                break
-
- at contextlib.contextmanager
-def swap_attr(obj, attr, new_val):
-    """Temporary swap out an attribute with a new object.
-
-    Usage:
-        with swap_attr(obj, "attr", 5):
-            ...
-
-        This will set obj.attr to 5 for the duration of the with: block,
-        restoring the old value at the end of the block. If `attr` doesn't
-        exist on `obj`, it will be created and then deleted at the end of the
-        block.
-    """
-    if hasattr(obj, attr):
-        real_val = getattr(obj, attr)
-        setattr(obj, attr, new_val)
-        try:
-            yield None
-        finally:
-            setattr(obj, attr, real_val)
-    else:
-        setattr(obj, attr, new_val)
-        try:
-            yield None
-        finally:
-            delattr(obj, attr)
-
- at contextlib.contextmanager
-def swap_item(obj, item, new_val):
-    """Temporary swap out an item with a new object.
-
-    Usage:
-        with swap_item(obj, "item", 5):
-            ...
-
-        This will set obj["item"] to 5 for the duration of the with: block,
-        restoring the old value at the end of the block. If `item` doesn't
-        exist on `obj`, it will be created and then deleted at the end of the
-        block.
-    """
-    if item in obj:
-        real_val = obj[item]
-        obj[item] = new_val
-        try:
-            yield None
-        finally:
-            obj[item] = real_val
-    else:
-        obj[item] = new_val
-        try:
-            yield None
-        finally:
-            del obj[item]
-
-def strip_python_stderr(stderr):
-    """Strip the stderr of a Python process from potential debug output
-    emitted by the interpreter.
-
-    This will typically be run on the result of the communicate() method
-    of a subprocess.Popen object.
-    """
-    stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
-    return stderr
-
-def args_from_interpreter_flags():
-    """Return a list of command-line arguments reproducing the current
-    settings in sys.flags."""
-    flag_opt_map = {
-        'bytes_warning': 'b',
-        'dont_write_bytecode': 'B',
-        'hash_randomization': 'R',
-        'ignore_environment': 'E',
-        'no_user_site': 's',
-        'no_site': 'S',
-        'optimize': 'O',
-        'verbose': 'v',
-    }
-    args = []
-    for flag, opt in flag_opt_map.items():
-        v = getattr(sys.flags, flag)
-        if v > 0:
-            args.append('-' + opt * v)
-    return args
-
-#============================================================
-# Support for assertions about logging.
-#============================================================
-
-class TestHandler(logging.handlers.BufferingHandler):
-    def __init__(self, matcher):
-        # BufferingHandler takes a "capacity" argument
-        # so as to know when to flush. As we're overriding
-        # shouldFlush anyway, we can set a capacity of zero.
-        # You can call flush() manually to clear out the
-        # buffer.
-        logging.handlers.BufferingHandler.__init__(self, 0)
-        self.matcher = matcher
-
-    def shouldFlush(self, record):
-        return False
-
-    def emit(self, record):
-        self.format(record)
-        self.buffer.append(record.__dict__)
-
-    def matches(self, **kwargs):
-        """
-        Look for a saved dict whose keys/values match the supplied arguments.
-        """
-        result = False
-        for d in self.buffer:
-            if self.matcher.matches(d, **kwargs):
-                result = True
-                break
-        return result
-
-class Matcher(object):
-
-    _partial_matches = ('msg', 'message')
-
-    def matches(self, d, **kwargs):
-        """
-        Try to match a single dict with the supplied arguments.
-
-        Keys whose values are strings and which are in self._partial_matches
-        will be checked for partial (i.e. substring) matches. You can extend
-        this scheme to (for example) do regular expression matching, etc.
-        """
-        result = True
-        for k in kwargs:
-            v = kwargs[k]
-            dv = d.get(k)
-            if not self.match_value(k, dv, v):
-                result = False
-                break
-        return result
-
-    def match_value(self, k, dv, v):
-        """
-        Try to match a single stored value (dv) with a supplied value (v).
-        """
-        if type(v) != type(dv):
-            result = False
-        elif type(dv) is not str or k not in self._partial_matches:
-            result = (v == dv)
-        else:
-            result = dv.find(v) >= 0
-        return result
-
-
-_can_symlink = None # type: Any
-def can_symlink():
-    global _can_symlink
-    if _can_symlink is not None:
-        return _can_symlink
-    symlink_path = TESTFN + "can_symlink"
-    try:
-        os.symlink(TESTFN, symlink_path)
-        can = True
-    except (OSError, NotImplementedError, AttributeError):
-        can = False
-    else:
-        os.remove(symlink_path)
-    _can_symlink = can
-    return can
-
-def skip_unless_symlink(test):
-    """Skip decorator for tests that require functional symlink"""
-    ok = can_symlink()
-    msg = "Requires functional symlink implementation"
-    if ok:
-        return test
-    else:
-        return unittest.skip(msg)(test)
-
-def patch(test_instance, object_to_patch, attr_name, new_value):
-    """Override 'object_to_patch'.'attr_name' with 'new_value'.
-
-    Also, add a cleanup procedure to 'test_instance' to restore
-    'object_to_patch' value for 'attr_name'.
-    The 'attr_name' should be a valid attribute for 'object_to_patch'.
-
-    """
-    # check that 'attr_name' is a real attribute for 'object_to_patch'
-    # will raise AttributeError if it does not exist
-    getattr(object_to_patch, attr_name)
-
-    # keep a copy of the old value
-    attr_is_local = False
-    try:
-        old_value = object_to_patch.__dict__[attr_name]
-    except (AttributeError, KeyError):
-        old_value = getattr(object_to_patch, attr_name, None)
-    else:
-        attr_is_local = True
-
-    # restore the value when the test is done
-    def cleanup():
-        if attr_is_local:
-            setattr(object_to_patch, attr_name, old_value)
-        else:
-            delattr(object_to_patch, attr_name)
-
-    test_instance.addCleanup(cleanup)
-
-    # actually override the attribute
-    setattr(object_to_patch, attr_name, new_value)
diff --git a/test-data/stdlib-samples/3.2/test/test_base64.py b/test-data/stdlib-samples/3.2/test/test_base64.py
deleted file mode 100644
index 9e4dcf5..0000000
--- a/test-data/stdlib-samples/3.2/test/test_base64.py
+++ /dev/null
@@ -1,267 +0,0 @@
-import unittest
-from test import support
-import base64
-import binascii
-import sys
-import subprocess
-
-from typing import Any
-
-
-
-class LegacyBase64TestCase(unittest.TestCase):
-    def test_encodebytes(self) -> None:
-        eq = self.assertEqual
-        eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n")
-        eq(base64.encodebytes(b"a"), b"YQ==\n")
-        eq(base64.encodebytes(b"ab"), b"YWI=\n")
-        eq(base64.encodebytes(b"abc"), b"YWJj\n")
-        eq(base64.encodebytes(b""), b"")
-        eq(base64.encodebytes(b"abcdefghijklmnopqrstuvwxyz"
-                               b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                               b"0123456789!@#0^&*();:<>,. []{}"),
-           b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
-           b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
-           b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n")
-        self.assertRaises(TypeError, base64.encodebytes, "")
-
-    def test_decodebytes(self) -> None:
-        eq = self.assertEqual
-        eq(base64.decodebytes(b"d3d3LnB5dGhvbi5vcmc=\n"), b"www.python.org")
-        eq(base64.decodebytes(b"YQ==\n"), b"a")
-        eq(base64.decodebytes(b"YWI=\n"), b"ab")
-        eq(base64.decodebytes(b"YWJj\n"), b"abc")
-        eq(base64.decodebytes(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
-                               b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
-                               b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n"),
-           b"abcdefghijklmnopqrstuvwxyz"
-           b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-           b"0123456789!@#0^&*();:<>,. []{}")
-        eq(base64.decodebytes(b''), b'')
-        self.assertRaises(TypeError, base64.decodebytes, "")
-
-    def test_encode(self) -> None:
-        eq = self.assertEqual
-        from io import BytesIO
-        infp = BytesIO(b'abcdefghijklmnopqrstuvwxyz'
-                       b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-                       b'0123456789!@#0^&*();:<>,. []{}')
-        outfp = BytesIO()
-        base64.encode(infp, outfp)
-        eq(outfp.getvalue(),
-           b'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE'
-           b'RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT'
-           b'Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n')
-
-    def test_decode(self) -> None:
-        from io import BytesIO
-        infp = BytesIO(b'd3d3LnB5dGhvbi5vcmc=')
-        outfp = BytesIO()
-        base64.decode(infp, outfp)
-        self.assertEqual(outfp.getvalue(), b'www.python.org')
-
-
-class BaseXYTestCase(unittest.TestCase):
-    def test_b64encode(self) -> None:
-        eq = self.assertEqual
-        # Test default alphabet
-        eq(base64.b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
-        eq(base64.b64encode(b'\x00'), b'AA==')
-        eq(base64.b64encode(b"a"), b"YQ==")
-        eq(base64.b64encode(b"ab"), b"YWI=")
-        eq(base64.b64encode(b"abc"), b"YWJj")
-        eq(base64.b64encode(b""), b"")
-        eq(base64.b64encode(b"abcdefghijklmnopqrstuvwxyz"
-                            b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                            b"0123456789!@#0^&*();:<>,. []{}"),
-           b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
-           b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
-           b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
-        # Test with arbitrary alternative characters
-        eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=b'*$'), b'01a*b$cd')
-        # Check if passing a str object raises an error
-        self.assertRaises(TypeError, base64.b64encode, "")
-        self.assertRaises(TypeError, base64.b64encode, b"", altchars="")
-        # Test standard alphabet
-        eq(base64.standard_b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
-        eq(base64.standard_b64encode(b"a"), b"YQ==")
-        eq(base64.standard_b64encode(b"ab"), b"YWI=")
-        eq(base64.standard_b64encode(b"abc"), b"YWJj")
-        eq(base64.standard_b64encode(b""), b"")
-        eq(base64.standard_b64encode(b"abcdefghijklmnopqrstuvwxyz"
-                                     b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                                     b"0123456789!@#0^&*();:<>,. []{}"),
-           b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
-           b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
-           b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
-        # Check if passing a str object raises an error
-        self.assertRaises(TypeError, base64.standard_b64encode, "")
-        self.assertRaises(TypeError, base64.standard_b64encode, b"", altchars="")
-        # Test with 'URL safe' alternative characters
-        eq(base64.urlsafe_b64encode(b'\xd3V\xbeo\xf7\x1d'), b'01a-b_cd')
-        # Check if passing a str object raises an error
-        self.assertRaises(TypeError, base64.urlsafe_b64encode, "")
-
-    def test_b64decode(self) -> None:
-        eq = self.assertEqual
-        eq(base64.b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
-        eq(base64.b64decode(b'AA=='), b'\x00')
-        eq(base64.b64decode(b"YQ=="), b"a")
-        eq(base64.b64decode(b"YWI="), b"ab")
-        eq(base64.b64decode(b"YWJj"), b"abc")
-        eq(base64.b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
-                            b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
-                            b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
-           b"abcdefghijklmnopqrstuvwxyz"
-           b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-           b"0123456789!@#0^&*();:<>,. []{}")
-        eq(base64.b64decode(b''), b'')
-        # Test with arbitrary alternative characters
-        eq(base64.b64decode(b'01a*b$cd', altchars=b'*$'), b'\xd3V\xbeo\xf7\x1d')
-        # Check if passing a str object raises an error
-        self.assertRaises(TypeError, base64.b64decode, "")
-        self.assertRaises(TypeError, base64.b64decode, b"", altchars="")
-        # Test standard alphabet
-        eq(base64.standard_b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
-        eq(base64.standard_b64decode(b"YQ=="), b"a")
-        eq(base64.standard_b64decode(b"YWI="), b"ab")
-        eq(base64.standard_b64decode(b"YWJj"), b"abc")
-        eq(base64.standard_b64decode(b""), b"")
-        eq(base64.standard_b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
-                                     b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
-                                     b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
-           b"abcdefghijklmnopqrstuvwxyz"
-           b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-           b"0123456789!@#0^&*();:<>,. []{}")
-        # Check if passing a str object raises an error
-        self.assertRaises(TypeError, base64.standard_b64decode, "")
-        self.assertRaises(TypeError, base64.standard_b64decode, b"", altchars="")
-        # Test with 'URL safe' alternative characters
-        eq(base64.urlsafe_b64decode(b'01a-b_cd'), b'\xd3V\xbeo\xf7\x1d')
-        self.assertRaises(TypeError, base64.urlsafe_b64decode, "")
-
-    def test_b64decode_padding_error(self) -> None:
-        self.assertRaises(binascii.Error, base64.b64decode, b'abc')
-
-    def test_b64decode_invalid_chars(self) -> None:
-        # issue 1466065: Test some invalid characters.
-        tests = ((b'%3d==', b'\xdd'),
-                 (b'$3d==', b'\xdd'),
-                 (b'[==', b''),
-                 (b'YW]3=', b'am'),
-                 (b'3{d==', b'\xdd'),
-                 (b'3d}==', b'\xdd'),
-                 (b'@@', b''),
-                 (b'!', b''),
-                 (b'YWJj\nYWI=', b'abcab'))
-        for bstr, res in tests:
-            self.assertEqual(base64.b64decode(bstr), res)
-            with self.assertRaises(binascii.Error):
-                base64.b64decode(bstr, validate=True)
-
-    def test_b32encode(self) -> None:
-        eq = self.assertEqual
-        eq(base64.b32encode(b''), b'')
-        eq(base64.b32encode(b'\x00'), b'AA======')
-        eq(base64.b32encode(b'a'), b'ME======')
-        eq(base64.b32encode(b'ab'), b'MFRA====')
-        eq(base64.b32encode(b'abc'), b'MFRGG===')
-        eq(base64.b32encode(b'abcd'), b'MFRGGZA=')
-        eq(base64.b32encode(b'abcde'), b'MFRGGZDF')
-        self.assertRaises(TypeError, base64.b32encode, "")
-
-    def test_b32decode(self) -> None:
-        eq = self.assertEqual
-        eq(base64.b32decode(b''), b'')
-        eq(base64.b32decode(b'AA======'), b'\x00')
-        eq(base64.b32decode(b'ME======'), b'a')
-        eq(base64.b32decode(b'MFRA===='), b'ab')
-        eq(base64.b32decode(b'MFRGG==='), b'abc')
-        eq(base64.b32decode(b'MFRGGZA='), b'abcd')
-        eq(base64.b32decode(b'MFRGGZDF'), b'abcde')
-        self.assertRaises(TypeError, base64.b32decode, "")
-
-    def test_b32decode_casefold(self) -> None:
-        eq = self.assertEqual
-        eq(base64.b32decode(b'', True), b'')
-        eq(base64.b32decode(b'ME======', True), b'a')
-        eq(base64.b32decode(b'MFRA====', True), b'ab')
-        eq(base64.b32decode(b'MFRGG===', True), b'abc')
-        eq(base64.b32decode(b'MFRGGZA=', True), b'abcd')
-        eq(base64.b32decode(b'MFRGGZDF', True), b'abcde')
-        # Lower cases
-        eq(base64.b32decode(b'me======', True), b'a')
-        eq(base64.b32decode(b'mfra====', True), b'ab')
-        eq(base64.b32decode(b'mfrgg===', True), b'abc')
-        eq(base64.b32decode(b'mfrggza=', True), b'abcd')
-        eq(base64.b32decode(b'mfrggzdf', True), b'abcde')
-        # Expected exceptions
-        self.assertRaises(TypeError, base64.b32decode, b'me======')
-        # Mapping zero and one
-        eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
-        eq(base64.b32decode(b'M1023456', map01=b'L'), b'b\xdd\xad\xf3\xbe')
-        eq(base64.b32decode(b'M1023456', map01=b'I'), b'b\x1d\xad\xf3\xbe')
-        self.assertRaises(TypeError, base64.b32decode, b"", map01="")
-
-    def test_b32decode_error(self) -> None:
-        self.assertRaises(binascii.Error, base64.b32decode, b'abc')
-        self.assertRaises(binascii.Error, base64.b32decode, b'ABCDEF==')
-
-    def test_b16encode(self) -> None:
-        eq = self.assertEqual
-        eq(base64.b16encode(b'\x01\x02\xab\xcd\xef'), b'0102ABCDEF')
-        eq(base64.b16encode(b'\x00'), b'00')
-        self.assertRaises(TypeError, base64.b16encode, "")
-
-    def test_b16decode(self) -> None:
-        eq = self.assertEqual
-        eq(base64.b16decode(b'0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
-        eq(base64.b16decode(b'00'), b'\x00')
-        # Lower case is not allowed without a flag
-        self.assertRaises(binascii.Error, base64.b16decode, b'0102abcdef')
-        # Case fold
-        eq(base64.b16decode(b'0102abcdef', True), b'\x01\x02\xab\xcd\xef')
-        self.assertRaises(TypeError, base64.b16decode, "")
-
-    def test_ErrorHeritage(self) -> None:
-        self.assertTrue(issubclass(binascii.Error, ValueError))
-
-
-
-class TestMain(unittest.TestCase):
-    def get_output(self, *args_tuple: str, **options: Any) -> Any:
-        args = [sys.executable, '-m', 'base64'] + list(args_tuple)
-        return subprocess.check_output(args, **options)
-
-    def test_encode_decode(self) -> None:
-        output = self.get_output('-t')
-        self.assertSequenceEqual(output.splitlines(), [
-            b"b'Aladdin:open sesame'",
-            br"b'QWxhZGRpbjpvcGVuIHNlc2FtZQ==\n'",
-            b"b'Aladdin:open sesame'",
-        ])
-
-    def test_encode_file(self) -> None:
-        with open(support.TESTFN, 'wb') as fp:
-            fp.write(b'a\xffb\n')
-
-        output = self.get_output('-e', support.TESTFN)
-        self.assertEqual(output.rstrip(), b'Yf9iCg==')
-
-        with open(support.TESTFN, 'rb') as fp:
-            output = self.get_output('-e', stdin=fp)
-        self.assertEqual(output.rstrip(), b'Yf9iCg==')
-
-    def test_decode(self) -> None:
-        with open(support.TESTFN, 'wb') as fp:
-            fp.write(b'Yf9iCg==')
-        output = self.get_output('-d', support.TESTFN)
-        self.assertEqual(output.rstrip(), b'a\xffb')
-
-
-
-def test_main() -> None:
-    support.run_unittest(__name__)
-
-if __name__ == '__main__':
-    test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_fnmatch.py b/test-data/stdlib-samples/3.2/test/test_fnmatch.py
deleted file mode 100644
index 0f5a23b..0000000
--- a/test-data/stdlib-samples/3.2/test/test_fnmatch.py
+++ /dev/null
@@ -1,93 +0,0 @@
-"""Test cases for the fnmatch module."""
-
-from test import support
-import unittest
-
-from fnmatch import fnmatch, fnmatchcase, translate, filter
-
-from typing import Any, AnyStr, Callable
-
-class FnmatchTestCase(unittest.TestCase):
-
-    def check_match(self, filename: AnyStr, pattern: AnyStr,
-                    should_match: int = 1,
-                    fn: Any = fnmatch) -> None:  # see #270
-        if should_match:
-            self.assertTrue(fn(filename, pattern),
-                         "expected %r to match pattern %r"
-                         % (filename, pattern))
-        else:
-            self.assertTrue(not fn(filename, pattern),
-                         "expected %r not to match pattern %r"
-                         % (filename, pattern))
-
-    def test_fnmatch(self) -> None:
-        check = self.check_match
-        check('abc', 'abc')
-        check('abc', '?*?')
-        check('abc', '???*')
-        check('abc', '*???')
-        check('abc', '???')
-        check('abc', '*')
-        check('abc', 'ab[cd]')
-        check('abc', 'ab[!de]')
-        check('abc', 'ab[de]', 0)
-        check('a', '??', 0)
-        check('a', 'b', 0)
-
-        # these test that '\' is handled correctly in character sets;
-        # see SF bug #409651
-        check('\\', r'[\]')
-        check('a', r'[!\]')
-        check('\\', r'[!\]', 0)
-
-        # test that filenames with newlines in them are handled correctly.
-        # http://bugs.python.org/issue6665
-        check('foo\nbar', 'foo*')
-        check('foo\nbar\n', 'foo*')
-        check('\nfoo', 'foo*', False)
-        check('\n', '*')
-
-    def test_mix_bytes_str(self) -> None:
-        self.assertRaises(TypeError, fnmatch, 'test', b'*')
-        self.assertRaises(TypeError, fnmatch, b'test', '*')
-        self.assertRaises(TypeError, fnmatchcase, 'test', b'*')
-        self.assertRaises(TypeError, fnmatchcase, b'test', '*')
-
-    def test_fnmatchcase(self) -> None:
-        check = self.check_match
-        check('AbC', 'abc', 0, fnmatchcase)
-        check('abc', 'AbC', 0, fnmatchcase)
-
-    def test_bytes(self) -> None:
-        self.check_match(b'test', b'te*')
-        self.check_match(b'test\xff', b'te*\xff')
-        self.check_match(b'foo\nbar', b'foo*')
-
-class TranslateTestCase(unittest.TestCase):
-
-    def test_translate(self) -> None:
-        self.assertEqual(translate('*'), '.*\Z(?ms)')
-        self.assertEqual(translate('?'), '.\Z(?ms)')
-        self.assertEqual(translate('a?b*'), 'a.b.*\Z(?ms)')
-        self.assertEqual(translate('[abc]'), '[abc]\Z(?ms)')
-        self.assertEqual(translate('[]]'), '[]]\Z(?ms)')
-        self.assertEqual(translate('[!x]'), '[^x]\Z(?ms)')
-        self.assertEqual(translate('[^x]'), '[\\^x]\Z(?ms)')
-        self.assertEqual(translate('[x'), '\\[x\Z(?ms)')
-
-
-class FilterTestCase(unittest.TestCase):
-
-    def test_filter(self) -> None:
-        self.assertEqual(filter(['a', 'b'], 'a'), ['a'])
-
-
-def test_main() -> None:
-    support.run_unittest(FnmatchTestCase,
-                         TranslateTestCase,
-                         FilterTestCase)
-
-
-if __name__ == "__main__":
-    test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_genericpath.py b/test-data/stdlib-samples/3.2/test/test_genericpath.py
deleted file mode 100644
index 43b78e7..0000000
--- a/test-data/stdlib-samples/3.2/test/test_genericpath.py
+++ /dev/null
@@ -1,313 +0,0 @@
-"""
-Tests common to genericpath, macpath, ntpath and posixpath
-"""
-
-import unittest
-from test import support
-import os
-
-import genericpath
-import imp
-imp.reload(genericpath) # Make sure we are using the local copy
-
-import sys
-from typing import Any, List
-
-
-def safe_rmdir(dirname: str) -> None:
-    try:
-        os.rmdir(dirname)
-    except OSError:
-        pass
-
-
-class GenericTest(unittest.TestCase):
-    # The path module to be tested
-    pathmodule = genericpath # type: Any
-    common_attributes = ['commonprefix', 'getsize', 'getatime', 'getctime',
-                         'getmtime', 'exists', 'isdir', 'isfile']
-    attributes = []  # type: List[str]
-
-    def test_no_argument(self) -> None:
-        for attr in self.common_attributes + self.attributes:
-            with self.assertRaises(TypeError):
-                getattr(self.pathmodule, attr)()
-                self.fail("{}.{}() did not raise a TypeError"
-                          .format(self.pathmodule.__name__, attr))
-
-    def test_commonprefix(self) -> None:
-        commonprefix = self.pathmodule.commonprefix
-        self.assertEqual(
-            commonprefix([]),
-            ""
-        )
-        self.assertEqual(
-            commonprefix(["/home/swenson/spam", "/home/swen/spam"]),
-            "/home/swen"
-        )
-        self.assertEqual(
-            commonprefix(["/home/swen/spam", "/home/swen/eggs"]),
-            "/home/swen/"
-        )
-        self.assertEqual(
-            commonprefix(["/home/swen/spam", "/home/swen/spam"]),
-            "/home/swen/spam"
-        )
-        self.assertEqual(
-            commonprefix(["home:swenson:spam", "home:swen:spam"]),
-            "home:swen"
-        )
-        self.assertEqual(
-            commonprefix([":home:swen:spam", ":home:swen:eggs"]),
-            ":home:swen:"
-        )
-        self.assertEqual(
-            commonprefix([":home:swen:spam", ":home:swen:spam"]),
-            ":home:swen:spam"
-        )
-
-        self.assertEqual(
-            commonprefix([b"/home/swenson/spam", b"/home/swen/spam"]),
-            b"/home/swen"
-        )
-        self.assertEqual(
-            commonprefix([b"/home/swen/spam", b"/home/swen/eggs"]),
-            b"/home/swen/"
-        )
-        self.assertEqual(
-            commonprefix([b"/home/swen/spam", b"/home/swen/spam"]),
-            b"/home/swen/spam"
-        )
-        self.assertEqual(
-            commonprefix([b"home:swenson:spam", b"home:swen:spam"]),
-            b"home:swen"
-        )
-        self.assertEqual(
-            commonprefix([b":home:swen:spam", b":home:swen:eggs"]),
-            b":home:swen:"
-        )
-        self.assertEqual(
-            commonprefix([b":home:swen:spam", b":home:swen:spam"]),
-            b":home:swen:spam"
-        )
-
-        testlist = ['', 'abc', 'Xbcd', 'Xb', 'XY', 'abcd',
-                    'aXc', 'abd', 'ab', 'aX', 'abcX']
-        for s1 in testlist:
-            for s2 in testlist:
-                p = commonprefix([s1, s2])
-                self.assertTrue(s1.startswith(p))
-                self.assertTrue(s2.startswith(p))
-                if s1 != s2:
-                    n = len(p)
-                    self.assertNotEqual(s1[n:n+1], s2[n:n+1])
-
-    def test_getsize(self) -> None:
-        f = open(support.TESTFN, "wb")
-        try:
-            f.write(b"foo")
-            f.close()
-            self.assertEqual(self.pathmodule.getsize(support.TESTFN), 3)
-        finally:
-            if not f.closed:
-                f.close()
-            support.unlink(support.TESTFN)
-
-    def test_time(self) -> None:
-        f = open(support.TESTFN, "wb")
-        try:
-            f.write(b"foo")
-            f.close()
-            f = open(support.TESTFN, "ab")
-            f.write(b"bar")
-            f.close()
-            f = open(support.TESTFN, "rb")
-            d = f.read()
-            f.close()
-            self.assertEqual(d, b"foobar")
-
-            self.assertLessEqual(
-                self.pathmodule.getctime(support.TESTFN),
-                self.pathmodule.getmtime(support.TESTFN)
-            )
-        finally:
-            if not f.closed:
-                f.close()
-            support.unlink(support.TESTFN)
-
-    def test_exists(self) -> None:
-        self.assertIs(self.pathmodule.exists(support.TESTFN), False)
-        f = open(support.TESTFN, "wb")
-        try:
-            f.write(b"foo")
-            f.close()
-            self.assertIs(self.pathmodule.exists(support.TESTFN), True)
-            if not self.pathmodule == genericpath:
-                self.assertIs(self.pathmodule.lexists(support.TESTFN),
-                              True)
-        finally:
-            if not f.closed:
-                f.close()
-            support.unlink(support.TESTFN)
-
-    def test_isdir(self) -> None:
-        self.assertIs(self.pathmodule.isdir(support.TESTFN), False)
-        f = open(support.TESTFN, "wb")
-        try:
-            f.write(b"foo")
-            f.close()
-            self.assertIs(self.pathmodule.isdir(support.TESTFN), False)
-            os.remove(support.TESTFN)
-            os.mkdir(support.TESTFN)
-            self.assertIs(self.pathmodule.isdir(support.TESTFN), True)
-            os.rmdir(support.TESTFN)
-        finally:
-            if not f.closed:
-                f.close()
-            support.unlink(support.TESTFN)
-            safe_rmdir(support.TESTFN)
-
-    def test_isfile(self) -> None:
-        self.assertIs(self.pathmodule.isfile(support.TESTFN), False)
-        f = open(support.TESTFN, "wb")
-        try:
-            f.write(b"foo")
-            f.close()
-            self.assertIs(self.pathmodule.isfile(support.TESTFN), True)
-            os.remove(support.TESTFN)
-            os.mkdir(support.TESTFN)
-            self.assertIs(self.pathmodule.isfile(support.TESTFN), False)
-            os.rmdir(support.TESTFN)
-        finally:
-            if not f.closed:
-                f.close()
-            support.unlink(support.TESTFN)
-            safe_rmdir(support.TESTFN)
-
-
-# Following TestCase is not supposed to be run from test_genericpath.
-# It is inherited by other test modules (macpath, ntpath, posixpath).
-
-class CommonTest(GenericTest):
-    # The path module to be tested
-    pathmodule = None # type: Any
-    common_attributes = GenericTest.common_attributes + [
-        # Properties
-        'curdir', 'pardir', 'extsep', 'sep',
-        'pathsep', 'defpath', 'altsep', 'devnull',
-        # Methods
-        'normcase', 'splitdrive', 'expandvars', 'normpath', 'abspath',
-        'join', 'split', 'splitext', 'isabs', 'basename', 'dirname',
-        'lexists', 'islink', 'ismount', 'expanduser', 'normpath', 'realpath',
-    ]
-
-    def test_normcase(self) -> None:
-        normcase = self.pathmodule.normcase
-        # check that normcase() is idempotent
-        for p in ["FoO/./BaR", b"FoO/./BaR"]:
-            p = normcase(p)
-            self.assertEqual(p, normcase(p))
-
-        self.assertEqual(normcase(''), '')
-        self.assertEqual(normcase(b''), b'')
-
-        # check that normcase raises a TypeError for invalid types
-        for path in (None, True, 0, 2.5, [], bytearray(b''), {'o','o'}):
-            self.assertRaises(TypeError, normcase, path)
-
-    def test_splitdrive(self) -> None:
-        # splitdrive for non-NT paths
-        splitdrive = self.pathmodule.splitdrive
-        self.assertEqual(splitdrive("/foo/bar"), ("", "/foo/bar"))
-        self.assertEqual(splitdrive("foo:bar"), ("", "foo:bar"))
-        self.assertEqual(splitdrive(":foo:bar"), ("", ":foo:bar"))
-
-        self.assertEqual(splitdrive(b"/foo/bar"), (b"", b"/foo/bar"))
-        self.assertEqual(splitdrive(b"foo:bar"), (b"", b"foo:bar"))
-        self.assertEqual(splitdrive(b":foo:bar"), (b"", b":foo:bar"))
-
-    def test_expandvars(self) -> None:
-        if self.pathmodule.__name__ == 'macpath':
-            self.skipTest('macpath.expandvars is a stub')
-        expandvars = self.pathmodule.expandvars
-        with support.EnvironmentVarGuard() as env:
-            env.clear()
-            env["foo"] = "bar"
-            env["{foo"] = "baz1"
-            env["{foo}"] = "baz2"
-            self.assertEqual(expandvars("foo"), "foo")
-            self.assertEqual(expandvars("$foo bar"), "bar bar")
-            self.assertEqual(expandvars("${foo}bar"), "barbar")
-            self.assertEqual(expandvars("$[foo]bar"), "$[foo]bar")
-            self.assertEqual(expandvars("$bar bar"), "$bar bar")
-            self.assertEqual(expandvars("$?bar"), "$?bar")
-            self.assertEqual(expandvars("${foo}bar"), "barbar")
-            self.assertEqual(expandvars("$foo}bar"), "bar}bar")
-            self.assertEqual(expandvars("${foo"), "${foo")
-            self.assertEqual(expandvars("${{foo}}"), "baz1}")
-            self.assertEqual(expandvars("$foo$foo"), "barbar")
-            self.assertEqual(expandvars("$bar$bar"), "$bar$bar")
-
-            self.assertEqual(expandvars(b"foo"), b"foo")
-            self.assertEqual(expandvars(b"$foo bar"), b"bar bar")
-            self.assertEqual(expandvars(b"${foo}bar"), b"barbar")
-            self.assertEqual(expandvars(b"$[foo]bar"), b"$[foo]bar")
-            self.assertEqual(expandvars(b"$bar bar"), b"$bar bar")
-            self.assertEqual(expandvars(b"$?bar"), b"$?bar")
-            self.assertEqual(expandvars(b"${foo}bar"), b"barbar")
-            self.assertEqual(expandvars(b"$foo}bar"), b"bar}bar")
-            self.assertEqual(expandvars(b"${foo"), b"${foo")
-            self.assertEqual(expandvars(b"${{foo}}"), b"baz1}")
-            self.assertEqual(expandvars(b"$foo$foo"), b"barbar")
-            self.assertEqual(expandvars(b"$bar$bar"), b"$bar$bar")
-
-    def test_abspath(self) -> None:
-        self.assertIn("foo", self.pathmodule.abspath("foo"))
-        self.assertIn(b"foo", self.pathmodule.abspath(b"foo"))
-
-        # Abspath returns bytes when the arg is bytes
-        for path in (b'', b'foo', b'f\xf2\xf2', b'/foo', b'C:\\'):
-            self.assertIsInstance(self.pathmodule.abspath(path), bytes)
-
-    def test_realpath(self) -> None:
-        self.assertIn("foo", self.pathmodule.realpath("foo"))
-        self.assertIn(b"foo", self.pathmodule.realpath(b"foo"))
-
-    def test_normpath_issue5827(self) -> None:
-        # Make sure normpath preserves unicode
-        for path in ('', '.', '/', '\\', '///foo/.//bar//'):
-            self.assertIsInstance(self.pathmodule.normpath(path), str)
-
-    def test_abspath_issue3426(self) -> None:
-        # Check that abspath returns unicode when the arg is unicode
-        # with both ASCII and non-ASCII cwds.
-        abspath = self.pathmodule.abspath
-        for path in ('', 'fuu', 'f\xf9\xf9', '/fuu', 'U:\\'):
-            self.assertIsInstance(abspath(path), str)
-
-        unicwd = '\xe7w\xf0'
-        try:
-            fsencoding = support.TESTFN_ENCODING or "ascii"
-            unicwd.encode(fsencoding)
-        except (AttributeError, UnicodeEncodeError):
-            # FS encoding is probably ASCII
-            pass
-        else:
-            with support.temp_cwd(unicwd):
-                for path in ('', 'fuu', 'f\xf9\xf9', '/fuu', 'U:\\'):
-                    self.assertIsInstance(abspath(path), str)
-
-    @unittest.skipIf(sys.platform == 'darwin',
-        "Mac OS X denies the creation of a directory with an invalid utf8 name")
-    def test_nonascii_abspath(self) -> None:
-        # Test non-ASCII, non-UTF8 bytes in the path.
-        with support.temp_cwd(b'\xe7w\xf0'):
-            self.test_abspath()
-
-
-def test_main() -> None:
-    support.run_unittest(GenericTest)
-
-
-if __name__=="__main__":
-    test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_getopt.py b/test-data/stdlib-samples/3.2/test/test_getopt.py
deleted file mode 100644
index 3320552..0000000
--- a/test-data/stdlib-samples/3.2/test/test_getopt.py
+++ /dev/null
@@ -1,190 +0,0 @@
-# test_getopt.py
-# David Goodger <dgoodger at bigfoot.com> 2000-08-19
-
-from test.support import verbose, run_doctest, run_unittest, EnvironmentVarGuard
-import unittest
-
-import getopt
-
-from typing import cast, Any
-
-sentinel = object()
-
-class GetoptTests(unittest.TestCase):
-    def setUp(self) -> None:
-        self.env = EnvironmentVarGuard()
-        if "POSIXLY_CORRECT" in self.env:
-            del self.env["POSIXLY_CORRECT"]
-
-    def tearDown(self) -> None:
-        self.env.__exit__()
-        del self.env
-
-    def assertError(self, *args: Any, **kwargs: Any) -> None:
-        # JLe: work around mypy bug #229
-        cast(Any, self.assertRaises)(getopt.GetoptError, *args, **kwargs)
-
-    def test_short_has_arg(self) -> None:
-        self.assertTrue(getopt.short_has_arg('a', 'a:'))
-        self.assertFalse(getopt.short_has_arg('a', 'a'))
-        self.assertError(getopt.short_has_arg, 'a', 'b')
-
-    def test_long_has_args(self) -> None:
-        has_arg, option = getopt.long_has_args('abc', ['abc='])
-        self.assertTrue(has_arg)
-        self.assertEqual(option, 'abc')
-
-        has_arg, option = getopt.long_has_args('abc', ['abc'])
-        self.assertFalse(has_arg)
-        self.assertEqual(option, 'abc')
-
-        has_arg, option = getopt.long_has_args('abc', ['abcd'])
-        self.assertFalse(has_arg)
-        self.assertEqual(option, 'abcd')
-
-        self.assertError(getopt.long_has_args, 'abc', ['def'])
-        self.assertError(getopt.long_has_args, 'abc', [])
-        self.assertError(getopt.long_has_args, 'abc', ['abcd','abcde'])
-
-    def test_do_shorts(self) -> None:
-        opts, args = getopt.do_shorts([], 'a', 'a', [])
-        self.assertEqual(opts, [('-a', '')])
-        self.assertEqual(args, [])
-
-        opts, args = getopt.do_shorts([], 'a1', 'a:', [])
-        self.assertEqual(opts, [('-a', '1')])
-        self.assertEqual(args, [])
-
-        #opts, args = getopt.do_shorts([], 'a=1', 'a:', [])
-        #self.assertEqual(opts, [('-a', '1')])
-        #self.assertEqual(args, [])
-
-        opts, args = getopt.do_shorts([], 'a', 'a:', ['1'])
-        self.assertEqual(opts, [('-a', '1')])
-        self.assertEqual(args, [])
-
-        opts, args = getopt.do_shorts([], 'a', 'a:', ['1', '2'])
-        self.assertEqual(opts, [('-a', '1')])
-        self.assertEqual(args, ['2'])
-
-        self.assertError(getopt.do_shorts, [], 'a1', 'a', [])
-        self.assertError(getopt.do_shorts, [], 'a', 'a:', [])
-
-    def test_do_longs(self) -> None:
-        opts, args = getopt.do_longs([], 'abc', ['abc'], [])
-        self.assertEqual(opts, [('--abc', '')])
-        self.assertEqual(args, [])
-
-        opts, args = getopt.do_longs([], 'abc=1', ['abc='], [])
-        self.assertEqual(opts, [('--abc', '1')])
-        self.assertEqual(args, [])
-
-        opts, args = getopt.do_longs([], 'abc=1', ['abcd='], [])
-        self.assertEqual(opts, [('--abcd', '1')])
-        self.assertEqual(args, [])
-
-        opts, args = getopt.do_longs([], 'abc', ['ab', 'abc', 'abcd'], [])
-        self.assertEqual(opts, [('--abc', '')])
-        self.assertEqual(args, [])
-
-        # Much like the preceding, except with a non-alpha character ("-") in
-        # option name that precedes "="; failed in
-        # http://python.org/sf/126863
-        opts, args = getopt.do_longs([], 'foo=42', ['foo-bar', 'foo=',], [])
-        self.assertEqual(opts, [('--foo', '42')])
-        self.assertEqual(args, [])
-
-        self.assertError(getopt.do_longs, [], 'abc=1', ['abc'], [])
-        self.assertError(getopt.do_longs, [], 'abc', ['abc='], [])
-
-    def test_getopt(self) -> None:
-        # note: the empty string between '-a' and '--beta' is significant:
-        # it simulates an empty string option argument ('-a ""') on the
-        # command line.
-        cmdline = ['-a', '1', '-b', '--alpha=2', '--beta', '-a', '3', '-a',
-                   '', '--beta', 'arg1', 'arg2']
-
-        opts, args = getopt.getopt(cmdline, 'a:b', ['alpha=', 'beta'])
-        self.assertEqual(opts, [('-a', '1'), ('-b', ''),
-                                ('--alpha', '2'), ('--beta', ''),
-                                ('-a', '3'), ('-a', ''), ('--beta', '')])
-        # Note ambiguity of ('-b', '') and ('-a', '') above. This must be
-        # accounted for in the code that calls getopt().
-        self.assertEqual(args, ['arg1', 'arg2'])
-
-        self.assertError(getopt.getopt, cmdline, 'a:b', ['alpha', 'beta'])
-
-    def test_gnu_getopt(self) -> None:
-        # Test handling of GNU style scanning mode.
-        cmdline = ['-a', 'arg1', '-b', '1', '--alpha', '--beta=2']
-
-        # GNU style
-        opts, args = getopt.gnu_getopt(cmdline, 'ab:', ['alpha', 'beta='])
-        self.assertEqual(args, ['arg1'])
-        self.assertEqual(opts, [('-a', ''), ('-b', '1'),
-                                ('--alpha', ''), ('--beta', '2')])
-
-        # recognize "-" as an argument
-        opts, args = getopt.gnu_getopt(['-a', '-', '-b', '-'], 'ab:', [])
-        self.assertEqual(args, ['-'])
-        self.assertEqual(opts, [('-a', ''), ('-b', '-')])
-
-        # Posix style via +
-        opts, args = getopt.gnu_getopt(cmdline, '+ab:', ['alpha', 'beta='])
-        self.assertEqual(opts, [('-a', '')])
-        self.assertEqual(args, ['arg1', '-b', '1', '--alpha', '--beta=2'])
-
-        # Posix style via POSIXLY_CORRECT
-        self.env["POSIXLY_CORRECT"] = "1"
-        opts, args = getopt.gnu_getopt(cmdline, 'ab:', ['alpha', 'beta='])
-        self.assertEqual(opts, [('-a', '')])
-        self.assertEqual(args, ['arg1', '-b', '1', '--alpha', '--beta=2'])
-
-    def test_libref_examples(self) -> None:
-        s = """
-        Examples from the Library Reference:  Doc/lib/libgetopt.tex
-
-        An example using only Unix style options:
-
-
-        >>> import getopt
-        >>> args = '-a -b -cfoo -d bar a1 a2'.split()
-        >>> args
-        ['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
-        >>> optlist, args = getopt.getopt(args, 'abc:d:')
-        >>> optlist
-        [('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
-        >>> args
-        ['a1', 'a2']
-
-        Using long option names is equally easy:
-
-
-        >>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
-        >>> args = s.split()
-        >>> args
-        ['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
-        >>> optlist, args = getopt.getopt(args, 'x', [
-        ...     'condition=', 'output-file=', 'testing'])
-        >>> optlist
-        [('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]
-        >>> args
-        ['a1', 'a2']
-        """
-
-        import types
-        m = types.ModuleType("libreftest", s)
-        run_doctest(m, verbose)
-
-    def test_issue4629(self) -> None:
-        longopts, shortopts = getopt.getopt(['--help='], '', ['help='])
-        self.assertEqual(longopts, [('--help', '')])
-        longopts, shortopts = getopt.getopt(['--help=x'], '', ['help='])
-        self.assertEqual(longopts, [('--help', 'x')])
-        self.assertRaises(getopt.GetoptError, getopt.getopt, ['--help='], '', ['help'])
-
-def test_main() -> None:
-    run_unittest(GetoptTests)
-
-if __name__ == "__main__":
-    test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_glob.py b/test-data/stdlib-samples/3.2/test/test_glob.py
deleted file mode 100644
index 08c8932..0000000
--- a/test-data/stdlib-samples/3.2/test/test_glob.py
+++ /dev/null
@@ -1,122 +0,0 @@
-import unittest
-from test.support import run_unittest, TESTFN, skip_unless_symlink, can_symlink
-import glob
-import os
-import shutil
-
-from typing import TypeVar, Iterable, List, cast
-
-T = TypeVar('T')
-
-class GlobTests(unittest.TestCase):
-
-    tempdir = ''
-
-    # JLe: work around mypy issue #231
-    def norm(self, first: str, *parts: str) -> str:
-        return os.path.normpath(os.path.join(self.tempdir, first, *parts))
-
-    def mktemp(self, *parts: str) -> None:
-        filename = self.norm(*parts)
-        base, file = os.path.split(filename)
-        if not os.path.exists(base):
-            os.makedirs(base)
-        f = open(filename, 'w')
-        f.close()
-
-    def setUp(self) -> None:
-        self.tempdir = TESTFN+"_dir"
-        self.mktemp('a', 'D')
-        self.mktemp('aab', 'F')
-        self.mktemp('aaa', 'zzzF')
-        self.mktemp('ZZZ')
-        self.mktemp('a', 'bcd', 'EF')
-        self.mktemp('a', 'bcd', 'efg', 'ha')
-        if can_symlink():
-            os.symlink(self.norm('broken'), self.norm('sym1'))
-            os.symlink(self.norm('broken'), self.norm('sym2'))
-
-    def tearDown(self) -> None:
-        shutil.rmtree(self.tempdir)
-
-    def glob(self, *parts: str) -> List[str]:
-        if len(parts) == 1:
-            pattern = parts[0]
-        else:
-            pattern = os.path.join(*parts)
-        p = os.path.join(self.tempdir, pattern)
-        res = glob.glob(p)
-        self.assertEqual(list(glob.iglob(p)), res)
-        return res
-
-    def assertSequencesEqual_noorder(self, l1: Iterable[T],
-                                     l2: Iterable[T]) -> None:
-        self.assertEqual(set(l1), set(l2))
-
-    def test_glob_literal(self) -> None:
-        eq = self.assertSequencesEqual_noorder
-        eq(self.glob('a'), [self.norm('a')])
-        eq(self.glob('a', 'D'), [self.norm('a', 'D')])
-        eq(self.glob('aab'), [self.norm('aab')])
-        eq(self.glob('zymurgy'), cast(List[str], []))  # JLe: work around #230
-
-        # test return types are unicode, but only if os.listdir
-        # returns unicode filenames
-        uniset = set([str])
-        tmp = os.listdir('.')
-        if set(type(x) for x in tmp) == uniset:
-            u1 = glob.glob('*')
-            u2 = glob.glob('./*')
-            self.assertEqual(set(type(r) for r in u1), uniset)
-            self.assertEqual(set(type(r) for r in u2), uniset)
-
-    def test_glob_one_directory(self) -> None:
-        eq = self.assertSequencesEqual_noorder
-        eq(self.glob('a*'), map(self.norm, ['a', 'aab', 'aaa']))
-        eq(self.glob('*a'), map(self.norm, ['a', 'aaa']))
-        eq(self.glob('aa?'), map(self.norm, ['aaa', 'aab']))
-        eq(self.glob('aa[ab]'), map(self.norm, ['aaa', 'aab']))
-        eq(self.glob('*q'), cast(List[str], []))  # JLe: work around #230
-
-    def test_glob_nested_directory(self) -> None:
-        eq = self.assertSequencesEqual_noorder
-        if os.path.normcase("abCD") == "abCD":
-            # case-sensitive filesystem
-            eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF')])
-        else:
-            # case insensitive filesystem
-            eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF'),
-                                             self.norm('a', 'bcd', 'efg')])
-        eq(self.glob('a', 'bcd', '*g'), [self.norm('a', 'bcd', 'efg')])
-
-    def test_glob_directory_names(self) -> None:
-        eq = self.assertSequencesEqual_noorder
-        eq(self.glob('*', 'D'), [self.norm('a', 'D')])
-        eq(self.glob('*', '*a'), cast(List[str], []))  # JLe: work around #230
-        eq(self.glob('a', '*', '*', '*a'),
-           [self.norm('a', 'bcd', 'efg', 'ha')])
-        eq(self.glob('?a?', '*F'), map(self.norm, [os.path.join('aaa', 'zzzF'),
-                                                   os.path.join('aab', 'F')]))
-
-    def test_glob_directory_with_trailing_slash(self) -> None:
-        # We are verifying that when there is wildcard pattern which
-        # ends with os.sep doesn't blow up.
-        res = glob.glob(self.tempdir + '*' + os.sep)
-        self.assertEqual(len(res), 1)
-        # either of these results are reasonable
-        self.assertIn(res[0], [self.tempdir, self.tempdir + os.sep])
-
-    @skip_unless_symlink
-    def test_glob_broken_symlinks(self) -> None:
-        eq = self.assertSequencesEqual_noorder
-        eq(self.glob('sym*'), [self.norm('sym1'), self.norm('sym2')])
-        eq(self.glob('sym1'), [self.norm('sym1')])
-        eq(self.glob('sym2'), [self.norm('sym2')])
-
-
-def test_main() -> None:
-    run_unittest(GlobTests)
-
-
-if __name__ == "__main__":
-    test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_posixpath.py b/test-data/stdlib-samples/3.2/test/test_posixpath.py
deleted file mode 100644
index de98975..0000000
--- a/test-data/stdlib-samples/3.2/test/test_posixpath.py
+++ /dev/null
@@ -1,531 +0,0 @@
-import unittest
-from test import support, test_genericpath
-
-import posixpath
-import genericpath
-
-import imp
-imp.reload(posixpath) # Make sure we are using the local copy
-imp.reload(genericpath)
-
-import os
-import sys
-from posixpath import realpath, abspath, dirname, basename
-
-import posix
-from typing import cast, Any, TypeVar, Callable
-
-T = TypeVar('T')
-
-# An absolute path to a temporary filename for testing. We can't rely on TESTFN
-# being an absolute path, so we need this.
-
-ABSTFN = abspath(support.TESTFN)
-
-def skip_if_ABSTFN_contains_backslash(
-        test: Callable[[T], None]) -> Callable[[T], None]:
-    """
-    On Windows, posixpath.abspath still returns paths with backslashes
-    instead of posix forward slashes. If this is the case, several tests
-    fail, so skip them.
-    """
-    found_backslash = '\\' in ABSTFN
-    msg = "ABSTFN is not a posix path - tests fail"
-    return [test, unittest.skip(msg)(test)][found_backslash]
-
-def safe_rmdir(dirname: str) -> None:
-    try:
-        os.rmdir(dirname)
-    except OSError:
-        pass
-
-class PosixPathTest(unittest.TestCase):
-
-    def setUp(self) -> None:
-        self.tearDown()
-
-    def tearDown(self) -> None:
-        for suffix in ["", "1", "2"]:
-            support.unlink(support.TESTFN + suffix)
-            safe_rmdir(support.TESTFN + suffix)
-
-    def test_join(self) -> None:
-        self.assertEqual(posixpath.join("/foo", "bar", "/bar", "baz"),
-                         "/bar/baz")
-        self.assertEqual(posixpath.join("/foo", "bar", "baz"), "/foo/bar/baz")
-        self.assertEqual(posixpath.join("/foo/", "bar/", "baz/"),
-                         "/foo/bar/baz/")
-
-        self.assertEqual(posixpath.join(b"/foo", b"bar", b"/bar", b"baz"),
-                         b"/bar/baz")
-        self.assertEqual(posixpath.join(b"/foo", b"bar", b"baz"),
-                         b"/foo/bar/baz")
-        self.assertEqual(posixpath.join(b"/foo/", b"bar/", b"baz/"),
-                         b"/foo/bar/baz/")
-
-        self.assertRaises(TypeError, posixpath.join, b"bytes", "str")
-        self.assertRaises(TypeError, posixpath.join, "str", b"bytes")
-
-    def test_split(self) -> None:
-        self.assertEqual(posixpath.split("/foo/bar"), ("/foo", "bar"))
-        self.assertEqual(posixpath.split("/"), ("/", ""))
-        self.assertEqual(posixpath.split("foo"), ("", "foo"))
-        self.assertEqual(posixpath.split("////foo"), ("////", "foo"))
-        self.assertEqual(posixpath.split("//foo//bar"), ("//foo", "bar"))
-
-        self.assertEqual(posixpath.split(b"/foo/bar"), (b"/foo", b"bar"))
-        self.assertEqual(posixpath.split(b"/"), (b"/", b""))
-        self.assertEqual(posixpath.split(b"foo"), (b"", b"foo"))
-        self.assertEqual(posixpath.split(b"////foo"), (b"////", b"foo"))
-        self.assertEqual(posixpath.split(b"//foo//bar"), (b"//foo", b"bar"))
-
-    def splitextTest(self, path: str, filename: str, ext: str) -> None:
-        self.assertEqual(posixpath.splitext(path), (filename, ext))
-        self.assertEqual(posixpath.splitext("/" + path), ("/" + filename, ext))
-        self.assertEqual(posixpath.splitext("abc/" + path),
-                         ("abc/" + filename, ext))
-        self.assertEqual(posixpath.splitext("abc.def/" + path),
-                         ("abc.def/" + filename, ext))
-        self.assertEqual(posixpath.splitext("/abc.def/" + path),
-                         ("/abc.def/" + filename, ext))
-        self.assertEqual(posixpath.splitext(path + "/"),
-                         (filename + ext + "/", ""))
-
-        pathb = bytes(path, "ASCII")
-        filenameb = bytes(filename, "ASCII")
-        extb = bytes(ext, "ASCII")
-
-        self.assertEqual(posixpath.splitext(pathb), (filenameb, extb))
-        self.assertEqual(posixpath.splitext(b"/" + pathb),
-                         (b"/" + filenameb, extb))
-        self.assertEqual(posixpath.splitext(b"abc/" + pathb),
-                         (b"abc/" + filenameb, extb))
-        self.assertEqual(posixpath.splitext(b"abc.def/" + pathb),
-                         (b"abc.def/" + filenameb, extb))
-        self.assertEqual(posixpath.splitext(b"/abc.def/" + pathb),
-                         (b"/abc.def/" + filenameb, extb))
-        self.assertEqual(posixpath.splitext(pathb + b"/"),
-                         (filenameb + extb + b"/", b""))
-
-    def test_splitext(self) -> None:
-        self.splitextTest("foo.bar", "foo", ".bar")
-        self.splitextTest("foo.boo.bar", "foo.boo", ".bar")
-        self.splitextTest("foo.boo.biff.bar", "foo.boo.biff", ".bar")
-        self.splitextTest(".csh.rc", ".csh", ".rc")
-        self.splitextTest("nodots", "nodots", "")
-        self.splitextTest(".cshrc", ".cshrc", "")
-        self.splitextTest("...manydots", "...manydots", "")
-        self.splitextTest("...manydots.ext", "...manydots", ".ext")
-        self.splitextTest(".", ".", "")
-        self.splitextTest("..", "..", "")
-        self.splitextTest("........", "........", "")
-        self.splitextTest("", "", "")
-
-    def test_isabs(self) -> None:
-        self.assertIs(posixpath.isabs(""), False)
-        self.assertIs(posixpath.isabs("/"), True)
-        self.assertIs(posixpath.isabs("/foo"), True)
-        self.assertIs(posixpath.isabs("/foo/bar"), True)
-        self.assertIs(posixpath.isabs("foo/bar"), False)
-
-        self.assertIs(posixpath.isabs(b""), False)
-        self.assertIs(posixpath.isabs(b"/"), True)
-        self.assertIs(posixpath.isabs(b"/foo"), True)
-        self.assertIs(posixpath.isabs(b"/foo/bar"), True)
-        self.assertIs(posixpath.isabs(b"foo/bar"), False)
-
-    def test_basename(self) -> None:
-        self.assertEqual(posixpath.basename("/foo/bar"), "bar")
-        self.assertEqual(posixpath.basename("/"), "")
-        self.assertEqual(posixpath.basename("foo"), "foo")
-        self.assertEqual(posixpath.basename("////foo"), "foo")
-        self.assertEqual(posixpath.basename("//foo//bar"), "bar")
-
-        self.assertEqual(posixpath.basename(b"/foo/bar"), b"bar")
-        self.assertEqual(posixpath.basename(b"/"), b"")
-        self.assertEqual(posixpath.basename(b"foo"), b"foo")
-        self.assertEqual(posixpath.basename(b"////foo"), b"foo")
-        self.assertEqual(posixpath.basename(b"//foo//bar"), b"bar")
-
-    def test_dirname(self) -> None:
-        self.assertEqual(posixpath.dirname("/foo/bar"), "/foo")
-        self.assertEqual(posixpath.dirname("/"), "/")
-        self.assertEqual(posixpath.dirname("foo"), "")
-        self.assertEqual(posixpath.dirname("////foo"), "////")
-        self.assertEqual(posixpath.dirname("//foo//bar"), "//foo")
-
-        self.assertEqual(posixpath.dirname(b"/foo/bar"), b"/foo")
-        self.assertEqual(posixpath.dirname(b"/"), b"/")
-        self.assertEqual(posixpath.dirname(b"foo"), b"")
-        self.assertEqual(posixpath.dirname(b"////foo"), b"////")
-        self.assertEqual(posixpath.dirname(b"//foo//bar"), b"//foo")
-
-    def test_islink(self) -> None:
-        self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
-        self.assertIs(posixpath.lexists(support.TESTFN + "2"), False)
-        f = open(support.TESTFN + "1", "wb")
-        try:
-            f.write(b"foo")
-            f.close()
-            self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
-            if support.can_symlink():
-                os.symlink(support.TESTFN + "1", support.TESTFN + "2")
-                self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
-                os.remove(support.TESTFN + "1")
-                self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
-                self.assertIs(posixpath.exists(support.TESTFN + "2"), False)
-                self.assertIs(posixpath.lexists(support.TESTFN + "2"), True)
-        finally:
-            if not f.closed:
-                f.close()
-
-    @staticmethod
-    def _create_file(filename: str) -> None:
-        with open(filename, 'wb') as f:
-            f.write(b'foo')
-
-    def test_samefile(self) -> None:
-        test_fn = support.TESTFN + "1"
-        self._create_file(test_fn)
-        self.assertTrue(posixpath.samefile(test_fn, test_fn))
-        self.assertRaises(TypeError, posixpath.samefile)
-
-    @unittest.skipIf(
-        sys.platform.startswith('win'),
-        "posixpath.samefile does not work on links in Windows")
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
-    def test_samefile_on_links(self) -> None:
-        test_fn1 = support.TESTFN + "1"
-        test_fn2 = support.TESTFN + "2"
-        self._create_file(test_fn1)
-
-        os.symlink(test_fn1, test_fn2)
-        self.assertTrue(posixpath.samefile(test_fn1, test_fn2))
-        os.remove(test_fn2)
-
-        self._create_file(test_fn2)
-        self.assertFalse(posixpath.samefile(test_fn1, test_fn2))
-
-
-    def test_samestat(self) -> None:
-        test_fn = support.TESTFN + "1"
-        self._create_file(test_fn)
-        test_fns = [test_fn]*2
-        stats = map(os.stat, test_fns)
-        self.assertTrue(posixpath.samestat(*stats))
-
-    @unittest.skipIf(
-        sys.platform.startswith('win'),
-        "posixpath.samestat does not work on links in Windows")
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
-    def test_samestat_on_links(self) -> None:
-        test_fn1 = support.TESTFN + "1"
-        test_fn2 = support.TESTFN + "2"
-        self._create_file(test_fn1)
-        test_fns = [test_fn1, test_fn2]
-        cast(Any, os.symlink)(*test_fns)
-        stats = map(os.stat, test_fns)
-        self.assertTrue(posixpath.samestat(*stats))
-        os.remove(test_fn2)
-
-        self._create_file(test_fn2)
-        stats = map(os.stat, test_fns)
-        self.assertFalse(posixpath.samestat(*stats))
-
-        self.assertRaises(TypeError, posixpath.samestat)
-
-    def test_ismount(self) -> None:
-        self.assertIs(posixpath.ismount("/"), True)
-        self.assertIs(posixpath.ismount(b"/"), True)
-
-    def test_ismount_non_existent(self) -> None:
-        # Non-existent mountpoint.
-        self.assertIs(posixpath.ismount(ABSTFN), False)
-        try:
-            os.mkdir(ABSTFN)
-            self.assertIs(posixpath.ismount(ABSTFN), False)
-        finally:
-            safe_rmdir(ABSTFN)
-
-    @unittest.skipUnless(support.can_symlink(),
-                         "Test requires symlink support")
-    def test_ismount_symlinks(self) -> None:
-        # Symlinks are never mountpoints.
-        try:
-            os.symlink("/", ABSTFN)
-            self.assertIs(posixpath.ismount(ABSTFN), False)
-        finally:
-            os.unlink(ABSTFN)
-
-    @unittest.skipIf(posix is None, "Test requires posix module")
-    def test_ismount_different_device(self) -> None:
-        # Simulate the path being on a different device from its parent by
-        # mocking out st_dev.
-        save_lstat = os.lstat
-        def fake_lstat(path):
-            st_ino = 0
-            st_dev = 0
-            if path == ABSTFN:
-                st_dev = 1
-                st_ino = 1
-            return posix.stat_result((0, st_ino, st_dev, 0, 0, 0, 0, 0, 0, 0))
-        try:
-            setattr(os, 'lstat', fake_lstat) # mypy: can't modify os directly
-            self.assertIs(posixpath.ismount(ABSTFN), True)
-        finally:
-            setattr(os, 'lstat', save_lstat)
-
-    def test_expanduser(self) -> None:
-        self.assertEqual(posixpath.expanduser("foo"), "foo")
-        self.assertEqual(posixpath.expanduser(b"foo"), b"foo")
-        try:
-            import pwd
-        except ImportError:
-            pass
-        else:
-            self.assertIsInstance(posixpath.expanduser("~/"), str)
-            self.assertIsInstance(posixpath.expanduser(b"~/"), bytes)
-            # if home directory == root directory, this test makes no sense
-            if posixpath.expanduser("~") != '/':
-                self.assertEqual(
-                    posixpath.expanduser("~") + "/",
-                    posixpath.expanduser("~/")
-                )
-                self.assertEqual(
-                    posixpath.expanduser(b"~") + b"/",
-                    posixpath.expanduser(b"~/")
-                )
-            self.assertIsInstance(posixpath.expanduser("~root/"), str)
-            self.assertIsInstance(posixpath.expanduser("~foo/"), str)
-            self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes)
-            self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes)
-
-            with support.EnvironmentVarGuard() as env:
-                env['HOME'] = '/'
-                self.assertEqual(posixpath.expanduser("~"), "/")
-                # expanduser should fall back to using the password database
-                del env['HOME']
-                home = pwd.getpwuid(os.getuid()).pw_dir
-                self.assertEqual(posixpath.expanduser("~"), home)
-
-    def test_normpath(self) -> None:
-        self.assertEqual(posixpath.normpath(""), ".")
-        self.assertEqual(posixpath.normpath("/"), "/")
-        self.assertEqual(posixpath.normpath("//"), "//")
-        self.assertEqual(posixpath.normpath("///"), "/")
-        self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
-        self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
-                         "/foo/baz")
-        self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
-
-        self.assertEqual(posixpath.normpath(b""), b".")
-        self.assertEqual(posixpath.normpath(b"/"), b"/")
-        self.assertEqual(posixpath.normpath(b"//"), b"//")
-        self.assertEqual(posixpath.normpath(b"///"), b"/")
-        self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
-        self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
-                         b"/foo/baz")
-        self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
-                         b"/foo/bar")
-
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
-    @skip_if_ABSTFN_contains_backslash
-    def test_realpath_basic(self) -> None:
-        # Basic operation.
-        try:
-            os.symlink(ABSTFN+"1", ABSTFN)
-            self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
-        finally:
-            support.unlink(ABSTFN)
-
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
-    @skip_if_ABSTFN_contains_backslash
-    def test_realpath_relative(self) -> None:
-        try:
-            os.symlink(posixpath.relpath(ABSTFN+"1"), ABSTFN)
-            self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
-        finally:
-            support.unlink(ABSTFN)
-
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
-    @skip_if_ABSTFN_contains_backslash
-    def test_realpath_symlink_loops(self) -> None:
-        # Bug #930024, return the path unchanged if we get into an infinite
-        # symlink loop.
-        try:
-            old_path = abspath('.')
-            os.symlink(ABSTFN, ABSTFN)
-            self.assertEqual(realpath(ABSTFN), ABSTFN)
-
-            os.symlink(ABSTFN+"1", ABSTFN+"2")
-            os.symlink(ABSTFN+"2", ABSTFN+"1")
-            self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
-            self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
-
-            # Test using relative path as well.
-            os.chdir(dirname(ABSTFN))
-            self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
-        finally:
-            os.chdir(old_path)
-            support.unlink(ABSTFN)
-            support.unlink(ABSTFN+"1")
-            support.unlink(ABSTFN+"2")
-
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
-    @skip_if_ABSTFN_contains_backslash
-    def test_realpath_resolve_parents(self) -> None:
-        # We also need to resolve any symlinks in the parents of a relative
-        # path passed to realpath. E.g.: current working directory is
-        # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
-        # realpath("a"). This should return /usr/share/doc/a/.
-        try:
-            old_path = abspath('.')
-            os.mkdir(ABSTFN)
-            os.mkdir(ABSTFN + "/y")
-            os.symlink(ABSTFN + "/y", ABSTFN + "/k")
-
-            os.chdir(ABSTFN + "/k")
-            self.assertEqual(realpath("a"), ABSTFN + "/y/a")
-        finally:
-            os.chdir(old_path)
-            support.unlink(ABSTFN + "/k")
-            safe_rmdir(ABSTFN + "/y")
-            safe_rmdir(ABSTFN)
-
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
-    @skip_if_ABSTFN_contains_backslash
-    def test_realpath_resolve_before_normalizing(self) -> None:
-        # Bug #990669: Symbolic links should be resolved before we
-        # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
-        # in the following hierarchy:
-        # a/k/y
-        #
-        # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
-        # then realpath("link-y/..") should return 'k', not 'a'.
-        try:
-            old_path = abspath('.')
-            os.mkdir(ABSTFN)
-            os.mkdir(ABSTFN + "/k")
-            os.mkdir(ABSTFN + "/k/y")
-            os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
-
-            # Absolute path.
-            self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
-            # Relative path.
-            os.chdir(dirname(ABSTFN))
-            self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."),
-                             ABSTFN + "/k")
-        finally:
-            os.chdir(old_path)
-            support.unlink(ABSTFN + "/link-y")
-            safe_rmdir(ABSTFN + "/k/y")
-            safe_rmdir(ABSTFN + "/k")
-            safe_rmdir(ABSTFN)
-
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
-    @skip_if_ABSTFN_contains_backslash
-    def test_realpath_resolve_first(self) -> None:
-        # Bug #1213894: The first component of the path, if not absolute,
-        # must be resolved too.
-
-        try:
-            old_path = abspath('.')
-            os.mkdir(ABSTFN)
-            os.mkdir(ABSTFN + "/k")
-            os.symlink(ABSTFN, ABSTFN + "link")
-            os.chdir(dirname(ABSTFN))
-
-            base = basename(ABSTFN)
-            self.assertEqual(realpath(base + "link"), ABSTFN)
-            self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
-        finally:
-            os.chdir(old_path)
-            support.unlink(ABSTFN + "link")
-            safe_rmdir(ABSTFN + "/k")
-            safe_rmdir(ABSTFN)
-
-    def test_relpath(self) -> None:
-        real_getcwd = os.getcwd
-        # mypy: can't modify os directly
-        setattr(os, 'getcwd', lambda: r"/home/user/bar")
-        try:
-            curdir = os.path.split(os.getcwd())[-1]
-            self.assertRaises(ValueError, posixpath.relpath, "")
-            self.assertEqual(posixpath.relpath("a"), "a")
-            self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
-            self.assertEqual(posixpath.relpath("a/b"), "a/b")
-            self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
-            self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
-            self.assertEqual(posixpath.relpath("a/b", "../c"),
-                             "../"+curdir+"/a/b")
-            self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
-            self.assertEqual(posixpath.relpath("a", "a"), ".")
-            self.assertEqual(posixpath.relpath("/foo/bar/bat", "/x/y/z"), '../../../foo/bar/bat')
-            self.assertEqual(posixpath.relpath("/foo/bar/bat", "/foo/bar"), 'bat')
-            self.assertEqual(posixpath.relpath("/foo/bar/bat", "/"), 'foo/bar/bat')
-            self.assertEqual(posixpath.relpath("/", "/foo/bar/bat"), '../../..')
-            self.assertEqual(posixpath.relpath("/foo/bar/bat", "/x"), '../foo/bar/bat')
-            self.assertEqual(posixpath.relpath("/x", "/foo/bar/bat"), '../../../x')
-            self.assertEqual(posixpath.relpath("/", "/"), '.')
-            self.assertEqual(posixpath.relpath("/a", "/a"), '.')
-            self.assertEqual(posixpath.relpath("/a/b", "/a/b"), '.')
-        finally:
-            setattr(os, 'getcwd', real_getcwd)
-
-    def test_relpath_bytes(self) -> None:
-        real_getcwdb = os.getcwdb
-        # mypy: can't modify os directly
-        setattr(os, 'getcwdb', lambda: br"/home/user/bar")
-        try:
-            curdir = os.path.split(os.getcwdb())[-1]
-            self.assertRaises(ValueError, posixpath.relpath, b"")
-            self.assertEqual(posixpath.relpath(b"a"), b"a")
-            self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
-            self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
-            self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
-            self.assertEqual(posixpath.relpath(b"a", b"../b"),
-                             b"../"+curdir+b"/a")
-            self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
-                             b"../"+curdir+b"/a/b")
-            self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
-            self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
-            self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/x/y/z"), b'../../../foo/bar/bat')
-            self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/foo/bar"), b'bat')
-            self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/"), b'foo/bar/bat')
-            self.assertEqual(posixpath.relpath(b"/", b"/foo/bar/bat"), b'../../..')
-            self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/x"), b'../foo/bar/bat')
-            self.assertEqual(posixpath.relpath(b"/x", b"/foo/bar/bat"), b'../../../x')
-            self.assertEqual(posixpath.relpath(b"/", b"/"), b'.')
-            self.assertEqual(posixpath.relpath(b"/a", b"/a"), b'.')
-            self.assertEqual(posixpath.relpath(b"/a/b", b"/a/b"), b'.')
-
-            self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
-            self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
-        finally:
-            setattr(os, 'getcwdb', real_getcwdb)
-
-    def test_sameopenfile(self) -> None:
-        fname = support.TESTFN + "1"
-        with open(fname, "wb") as a, open(fname, "wb") as b:
-            self.assertTrue(posixpath.sameopenfile(a.fileno(), b.fileno()))
-
-
-class PosixCommonTest(test_genericpath.CommonTest):
-    pathmodule = posixpath
-    attributes = ['relpath', 'samefile', 'sameopenfile', 'samestat']
-
-
-def test_main() -> None:
-    support.run_unittest(PosixPathTest, PosixCommonTest)
-
-
-if __name__=="__main__":
-    test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_pprint.py b/test-data/stdlib-samples/3.2/test/test_pprint.py
deleted file mode 100644
index cf54ebd..0000000
--- a/test-data/stdlib-samples/3.2/test/test_pprint.py
+++ /dev/null
@@ -1,488 +0,0 @@
-import pprint
-import test.support
-import unittest
-import test.test_set
-import random
-import collections
-import itertools
-
-from typing import List, Any, Dict, Tuple, cast, Callable
-
-# list, tuple and dict subclasses that do or don't overwrite __repr__
-class list2(list):
-    pass
-
-class list3(list):
-    def __repr__(self) -> str:
-        return list.__repr__(self)
-
-class tuple2(tuple):
-    pass
-
-class tuple3(tuple):
-    def __repr__(self) -> str:
-        return tuple.__repr__(self)
-
-class dict2(dict):
-    pass
-
-class dict3(dict):
-    def __repr__(self) -> str:
-        return dict.__repr__(self)
-
-class Unorderable:
-    def __repr__(self) -> str:
-        return str(id(self))
-
-class QueryTestCase(unittest.TestCase):
-
-    def setUp(self) -> None:
-        self.a = list(range(100))  # type: List[Any]
-        self.b = list(range(200))  # type: List[Any]
-        self.a[-12] = self.b
-
-    def test_basic(self) -> None:
-        # Verify .isrecursive() and .isreadable() w/o recursion
-        pp = pprint.PrettyPrinter()
-        for safe in (2, 2.0, complex(0.0, 2.0), "abc", [3], (2,2), {3: 3}, "yaddayadda",
-                     self.a, self.b):
-            # module-level convenience functions
-            self.assertFalse(pprint.isrecursive(safe),
-                             "expected not isrecursive for %r" % (safe,))
-            self.assertTrue(pprint.isreadable(safe),
-                            "expected isreadable for %r" % (safe,))
-            # PrettyPrinter methods
-            self.assertFalse(pp.isrecursive(safe),
-                             "expected not isrecursive for %r" % (safe,))
-            self.assertTrue(pp.isreadable(safe),
-                            "expected isreadable for %r" % (safe,))
-
-    def test_knotted(self) -> None:
-        # Verify .isrecursive() and .isreadable() w/ recursion
-        # Tie a knot.
-        self.b[67] = self.a
-        # Messy dict.
-        self.d = {}  # type: Dict[int, dict]
-        self.d[0] = self.d[1] = self.d[2] = self.d
-
-        pp = pprint.PrettyPrinter()
-
-        for icky in self.a, self.b, self.d, (self.d, self.d):
-            self.assertTrue(pprint.isrecursive(icky), "expected isrecursive")
-            self.assertFalse(pprint.isreadable(icky), "expected not isreadable")
-            self.assertTrue(pp.isrecursive(icky), "expected isrecursive")
-            self.assertFalse(pp.isreadable(icky), "expected not isreadable")
-
-        # Break the cycles.
-        self.d.clear()
-        del self.a[:]
-        del self.b[:]
-
-        for safe in self.a, self.b, self.d, (self.d, self.d):
-            # module-level convenience functions
-            self.assertFalse(pprint.isrecursive(safe),
-                             "expected not isrecursive for %r" % (safe,))
-            self.assertTrue(pprint.isreadable(safe),
-                            "expected isreadable for %r" % (safe,))
-            # PrettyPrinter methods
-            self.assertFalse(pp.isrecursive(safe),
-                             "expected not isrecursive for %r" % (safe,))
-            self.assertTrue(pp.isreadable(safe),
-                            "expected isreadable for %r" % (safe,))
-
-    def test_unreadable(self) -> None:
-        # Not recursive but not readable anyway
-        pp = pprint.PrettyPrinter()
-        for unreadable in type(3), pprint, pprint.isrecursive:
-            # module-level convenience functions
-            self.assertFalse(pprint.isrecursive(unreadable),
-                             "expected not isrecursive for %r" % (unreadable,))
-            self.assertFalse(pprint.isreadable(unreadable),
-                             "expected not isreadable for %r" % (unreadable,))
-            # PrettyPrinter methods
-            self.assertFalse(pp.isrecursive(unreadable),
-                             "expected not isrecursive for %r" % (unreadable,))
-            self.assertFalse(pp.isreadable(unreadable),
-                             "expected not isreadable for %r" % (unreadable,))
-
-    def test_same_as_repr(self) -> None:
-        # Simple objects, small containers and classes that overwrite __repr__
-        # For those the result should be the same as repr().
-        # Ahem.  The docs don't say anything about that -- this appears to
-        # be testing an implementation quirk.  Starting in Python 2.5, it's
-        # not true for dicts:  pprint always sorts dicts by key now; before,
-        # it sorted a dict display if and only if the display required
-        # multiple lines.  For that reason, dicts with more than one element
-        # aren't tested here.
-        for simple in (0, 0, complex(0.0), 0.0, "", b"",
-                       (), tuple2(), tuple3(),
-                       [], list2(), list3(),
-                       {}, dict2(), dict3(),
-                       self.assertTrue, pprint,
-                       -6, -6, complex(-6.,-6.), -1.5, "x", b"x", (3,), [3], {3: 6},
-                       (1,2), [3,4], {5: 6},
-                       tuple2((1,2)), tuple3((1,2)), tuple3(range(100)),  # type: ignore
-                       [3,4], list2(cast(Any, [3,4])), list3(cast(Any, [3,4])),
-                       list3(cast(Any, range(100))), dict2(cast(Any, {5: 6})),
-                       dict3(cast(Any, {5: 6})), # JLe: work around mypy issue #233
-                       range(10, -11, -1)
-                      ):
-            native = repr(simple)
-            for function in "pformat", "saferepr":
-                f = getattr(pprint, function)
-                got = f(simple)
-                self.assertEqual(native, got,
-                                 "expected %s got %s from pprint.%s" %
-                                 (native, got, function))
-
-    def test_basic_line_wrap(self) -> None:
-        # verify basic line-wrapping operation
-        o = {'RPM_cal': 0,
-             'RPM_cal2': 48059,
-             'Speed_cal': 0,
-             'controldesk_runtime_us': 0,
-             'main_code_runtime_us': 0,
-             'read_io_runtime_us': 0,
-             'write_io_runtime_us': 43690}
-        exp = """\
-{'RPM_cal': 0,
- 'RPM_cal2': 48059,
- 'Speed_cal': 0,
- 'controldesk_runtime_us': 0,
- 'main_code_runtime_us': 0,
- 'read_io_runtime_us': 0,
- 'write_io_runtime_us': 43690}"""
-        # JLe: work around mypy issue #232
-        for type in cast(List[Any], [dict, dict2]):
-            self.assertEqual(pprint.pformat(type(o)), exp)
-
-        o2 = range(100)
-        exp = '[%s]' % ',\n '.join(map(str, o2))
-        for type in cast(List[Any], [list, list2]):
-            self.assertEqual(pprint.pformat(type(o2)), exp)
-
-        o3 = tuple(range(100))
-        exp = '(%s)' % ',\n '.join(map(str, o3))
-        for type in cast(List[Any], [tuple, tuple2]):
-            self.assertEqual(pprint.pformat(type(o3)), exp)
-
-        # indent parameter
-        o4 = range(100)
-        exp = '[   %s]' % ',\n    '.join(map(str, o4))
-        for type in cast(List[Any], [list, list2]):
-            self.assertEqual(pprint.pformat(type(o4), indent=4), exp)
-
-    def test_nested_indentations(self) -> None:
-        o1 = list(range(10))
-        o2 = {'first':1, 'second':2, 'third':3}
-        o = [o1, o2]
-        expected = """\
-[   [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
-    {   'first': 1,
-        'second': 2,
-        'third': 3}]"""
-        self.assertEqual(pprint.pformat(o, indent=4, width=42), expected)
-
-    def test_sorted_dict(self) -> None:
-        # Starting in Python 2.5, pprint sorts dict displays by key regardless
-        # of how small the dictionary may be.
-        # Before the change, on 32-bit Windows pformat() gave order
-        # 'a', 'c', 'b' here, so this test failed.
-        d = {'a': 1, 'b': 1, 'c': 1}
-        self.assertEqual(pprint.pformat(d), "{'a': 1, 'b': 1, 'c': 1}")
-        self.assertEqual(pprint.pformat([d, d]),
-            "[{'a': 1, 'b': 1, 'c': 1}, {'a': 1, 'b': 1, 'c': 1}]")
-
-        # The next one is kind of goofy.  The sorted order depends on the
-        # alphabetic order of type names:  "int" < "str" < "tuple".  Before
-        # Python 2.5, this was in the test_same_as_repr() test.  It's worth
-        # keeping around for now because it's one of few tests of pprint
-        # against a crazy mix of types.
-        self.assertEqual(pprint.pformat({"xy\tab\n": (3,), 5: [[]], (): {}}),
-            r"{5: [[]], 'xy\tab\n': (3,), (): {}}")
-
-    def test_ordered_dict(self) -> None:
-        words = 'the quick brown fox jumped over a lazy dog'.split()
-        d = collections.OrderedDict(zip(words, itertools.count()))
-        self.assertEqual(pprint.pformat(d),
-"""\
-{'the': 0,
- 'quick': 1,
- 'brown': 2,
- 'fox': 3,
- 'jumped': 4,
- 'over': 5,
- 'a': 6,
- 'lazy': 7,
- 'dog': 8}""")
-    def test_subclassing(self) -> None:
-        o = {'names with spaces': 'should be presented using repr()',
-             'others.should.not.be': 'like.this'}
-        exp = """\
-{'names with spaces': 'should be presented using repr()',
- others.should.not.be: like.this}"""
-        self.assertEqual(DottedPrettyPrinter().pformat(o), exp)
-
-    @test.support.cpython_only
-    def test_set_reprs(self) -> None:
-        # This test creates a complex arrangement of frozensets and
-        # compares the pretty-printed repr against a string hard-coded in
-        # the test.  The hard-coded repr depends on the sort order of
-        # frozensets.
-        #
-        # However, as the docs point out: "Since sets only define
-        # partial ordering (subset relationships), the output of the
-        # list.sort() method is undefined for lists of sets."
-        #
-        # In a nutshell, the test assumes frozenset({0}) will always
-        # sort before frozenset({1}), but:
-        #
-        # >>> frozenset({0}) < frozenset({1})
-        # False
-        # >>> frozenset({1}) < frozenset({0})
-        # False
-        #
-        # Consequently, this test is fragile and
-        # implementation-dependent.  Small changes to Python's sort
-        # algorithm cause the test to fail when it should pass.
-
-        self.assertEqual(pprint.pformat(set()), 'set()')
-        self.assertEqual(pprint.pformat(set(range(3))), '{0, 1, 2}')
-        self.assertEqual(pprint.pformat(frozenset()), 'frozenset()')
-        self.assertEqual(pprint.pformat(frozenset(range(3))), 'frozenset({0, 1, 2})')
-        cube_repr_tgt = """\
-{frozenset(): frozenset({frozenset({2}), frozenset({0}), frozenset({1})}),
- frozenset({0}): frozenset({frozenset(),
-                            frozenset({0, 2}),
-                            frozenset({0, 1})}),
- frozenset({1}): frozenset({frozenset(),
-                            frozenset({1, 2}),
-                            frozenset({0, 1})}),
- frozenset({2}): frozenset({frozenset(),
-                            frozenset({1, 2}),
-                            frozenset({0, 2})}),
- frozenset({1, 2}): frozenset({frozenset({2}),
-                               frozenset({1}),
-                               frozenset({0, 1, 2})}),
- frozenset({0, 2}): frozenset({frozenset({2}),
-                               frozenset({0}),
-                               frozenset({0, 1, 2})}),
- frozenset({0, 1}): frozenset({frozenset({0}),
-                               frozenset({1}),
-                               frozenset({0, 1, 2})}),
- frozenset({0, 1, 2}): frozenset({frozenset({1, 2}),
-                                  frozenset({0, 2}),
-                                  frozenset({0, 1})})}"""
-        cube = test.test_set.cube(3)
-        self.assertEqual(pprint.pformat(cube), cube_repr_tgt)
-        cubo_repr_tgt = """\
-{frozenset({frozenset({0, 2}), frozenset({0})}): frozenset({frozenset({frozenset({0,
-                                                                                  2}),
-                                                                       frozenset({0,
-                                                                                  1,
-                                                                                  2})}),
-                                                            frozenset({frozenset({0}),
-                                                                       frozenset({0,
-                                                                                  1})}),
-                                                            frozenset({frozenset(),
-                                                                       frozenset({0})}),
-                                                            frozenset({frozenset({2}),
-                                                                       frozenset({0,
-                                                                                  2})})}),
- frozenset({frozenset({0, 1}), frozenset({1})}): frozenset({frozenset({frozenset({0,
-                                                                                  1}),
-                                                                       frozenset({0,
-                                                                                  1,
-                                                                                  2})}),
-                                                            frozenset({frozenset({0}),
-                                                                       frozenset({0,
-                                                                                  1})}),
-                                                            frozenset({frozenset({1}),
-                                                                       frozenset({1,
-                                                                                  2})}),
-                                                            frozenset({frozenset(),
-                                                                       frozenset({1})})}),
- frozenset({frozenset({1, 2}), frozenset({1})}): frozenset({frozenset({frozenset({1,
-                                                                                  2}),
-                                                                       frozenset({0,
-                                                                                  1,
-                                                                                  2})}),
-                                                            frozenset({frozenset({2}),
-                                                                       frozenset({1,
-                                                                                  2})}),
-                                                            frozenset({frozenset(),
-                                                                       frozenset({1})}),
-                                                            frozenset({frozenset({1}),
-                                                                       frozenset({0,
-                                                                                  1})})}),
- frozenset({frozenset({1, 2}), frozenset({2})}): frozenset({frozenset({frozenset({1,
-                                                                                  2}),
-                                                                       frozenset({0,
-                                                                                  1,
-                                                                                  2})}),
-                                                            frozenset({frozenset({1}),
-                                                                       frozenset({1,
-                                                                                  2})}),
-                                                            frozenset({frozenset({2}),
-                                                                       frozenset({0,
-                                                                                  2})}),
-                                                            frozenset({frozenset(),
-                                                                       frozenset({2})})}),
- frozenset({frozenset(), frozenset({0})}): frozenset({frozenset({frozenset({0}),
-                                                                 frozenset({0,
-                                                                            1})}),
-                                                      frozenset({frozenset({0}),
-                                                                 frozenset({0,
-                                                                            2})}),
-                                                      frozenset({frozenset(),
-                                                                 frozenset({1})}),
-                                                      frozenset({frozenset(),
-                                                                 frozenset({2})})}),
- frozenset({frozenset(), frozenset({1})}): frozenset({frozenset({frozenset(),
-                                                                 frozenset({0})}),
-                                                      frozenset({frozenset({1}),
-                                                                 frozenset({1,
-                                                                            2})}),
-                                                      frozenset({frozenset(),
-                                                                 frozenset({2})}),
-                                                      frozenset({frozenset({1}),
-                                                                 frozenset({0,
-                                                                            1})})}),
- frozenset({frozenset({2}), frozenset()}): frozenset({frozenset({frozenset({2}),
-                                                                 frozenset({1,
-                                                                            2})}),
-                                                      frozenset({frozenset(),
-                                                                 frozenset({0})}),
-                                                      frozenset({frozenset(),
-                                                                 frozenset({1})}),
-                                                      frozenset({frozenset({2}),
-                                                                 frozenset({0,
-                                                                            2})})}),
- frozenset({frozenset({0, 1, 2}), frozenset({0, 1})}): frozenset({frozenset({frozenset({1,
-                                                                                        2}),
-                                                                             frozenset({0,
-                                                                                        1,
-                                                                                        2})}),
-                                                                  frozenset({frozenset({0,
-                                                                                        2}),
-                                                                             frozenset({0,
-                                                                                        1,
-                                                                                        2})}),
-                                                                  frozenset({frozenset({0}),
-                                                                             frozenset({0,
-                                                                                        1})}),
-                                                                  frozenset({frozenset({1}),
-                                                                             frozenset({0,
-                                                                                        1})})}),
- frozenset({frozenset({0}), frozenset({0, 1})}): frozenset({frozenset({frozenset(),
-                                                                       frozenset({0})}),
-                                                            frozenset({frozenset({0,
-                                                                                  1}),
-                                                                       frozenset({0,
-                                                                                  1,
-                                                                                  2})}),
-                                                            frozenset({frozenset({0}),
-                                                                       frozenset({0,
-                                                                                  2})}),
-                                                            frozenset({frozenset({1}),
-                                                                       frozenset({0,
-                                                                                  1})})}),
- frozenset({frozenset({2}), frozenset({0, 2})}): frozenset({frozenset({frozenset({0,
-                                                                                  2}),
-                                                                       frozenset({0,
-                                                                                  1,
-                                                                                  2})}),
-                                                            frozenset({frozenset({2}),
-                                                                       frozenset({1,
-                                                                                  2})}),
-                                                            frozenset({frozenset({0}),
-                                                                       frozenset({0,
-                                                                                  2})}),
-                                                            frozenset({frozenset(),
-                                                                       frozenset({2})})}),
- frozenset({frozenset({0, 1, 2}), frozenset({0, 2})}): frozenset({frozenset({frozenset({1,
-                                                                                        2}),
-                                                                             frozenset({0,
-                                                                                        1,
-                                                                                        2})}),
-                                                                  frozenset({frozenset({0,
-                                                                                        1}),
-                                                                             frozenset({0,
-                                                                                        1,
-                                                                                        2})}),
-                                                                  frozenset({frozenset({0}),
-                                                                             frozenset({0,
-                                                                                        2})}),
-                                                                  frozenset({frozenset({2}),
-                                                                             frozenset({0,
-                                                                                        2})})}),
- frozenset({frozenset({1, 2}), frozenset({0, 1, 2})}): frozenset({frozenset({frozenset({0,
-                                                                                        2}),
-                                                                             frozenset({0,
-                                                                                        1,
-                                                                                        2})}),
-                                                                  frozenset({frozenset({0,
-                                                                                        1}),
-                                                                             frozenset({0,
-                                                                                        1,
-                                                                                        2})}),
-                                                                  frozenset({frozenset({2}),
-                                                                             frozenset({1,
-                                                                                        2})}),
-                                                                  frozenset({frozenset({1}),
-                                                                             frozenset({1,
-                                                                                        2})})})}"""
-
-        cubo = test.test_set.linegraph(cube)
-        self.assertEqual(pprint.pformat(cubo), cubo_repr_tgt)
-
-    def test_depth(self) -> None:
-        nested_tuple = (1, (2, (3, (4, (5, 6)))))
-        nested_dict = {1: {2: {3: {4: {5: {6: 6}}}}}}
-        nested_list = [1, [2, [3, [4, [5, [6, []]]]]]]
-        self.assertEqual(pprint.pformat(nested_tuple), repr(nested_tuple))
-        self.assertEqual(pprint.pformat(nested_dict), repr(nested_dict))
-        self.assertEqual(pprint.pformat(nested_list), repr(nested_list))
-
-        lv1_tuple = '(1, (...))'
-        lv1_dict = '{1: {...}}'
-        lv1_list = '[1, [...]]'
-        self.assertEqual(pprint.pformat(nested_tuple, depth=1), lv1_tuple)
-        self.assertEqual(pprint.pformat(nested_dict, depth=1), lv1_dict)
-        self.assertEqual(pprint.pformat(nested_list, depth=1), lv1_list)
-
-    def test_sort_unorderable_values(self) -> None:
-        # Issue 3976:  sorted pprints fail for unorderable values.
-        n = 20
-        keys = [Unorderable() for i in range(n)]
-        random.shuffle(keys)
-        skeys = sorted(keys, key=id)
-        clean = lambda s: s.replace(' ', '').replace('\n','')  # type: Callable[[str], str]
-
-        self.assertEqual(clean(pprint.pformat(set(keys))),
-            '{' + ','.join(map(repr, skeys)) + '}')
-        self.assertEqual(clean(pprint.pformat(frozenset(keys))),
-            'frozenset({' + ','.join(map(repr, skeys)) + '})')
-        self.assertEqual(clean(pprint.pformat(dict.fromkeys(keys))),
-            '{' + ','.join('%r:None' % k for k in skeys) + '}')
-
-class DottedPrettyPrinter(pprint.PrettyPrinter):
-
-    def format(self, object: object, context: Dict[int, Any], maxlevels: int,
-               level: int) -> Tuple[str, int, int]:
-        if isinstance(object, str):
-            if ' ' in object:
-                return repr(object), 1, 0
-            else:
-                return object, 0, 0
-        else:
-            return pprint.PrettyPrinter.format(
-                self, object, context, maxlevels, level)
-
-
-def test_main() -> None:
-    test.support.run_unittest(QueryTestCase)
-
-
-if __name__ == "__main__":
-    test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_random.py b/test-data/stdlib-samples/3.2/test/test_random.py
deleted file mode 100644
index 5989cee..0000000
--- a/test-data/stdlib-samples/3.2/test/test_random.py
+++ /dev/null
@@ -1,533 +0,0 @@
-#!/usr/bin/env python3
-
-import unittest
-import random
-import time
-import pickle
-import warnings
-from math import log, exp, pi, fsum, sin
-from test import support
-
-from typing import Any, Dict, List, Callable, Generic, TypeVar, cast
-
-RT = TypeVar('RT', random.Random, random.SystemRandom)
-
-class TestBasicOps(unittest.TestCase, Generic[RT]):
-    # Superclass with tests common to all generators.
-    # Subclasses must arrange for self.gen to retrieve the Random instance
-    # to be tested.
-
-    gen = None  # type: RT  # Either Random or SystemRandom
-
-    def randomlist(self, n: int) -> List[float]:
-        """Helper function to make a list of random numbers"""
-        return [self.gen.random() for i in range(n)]
-
-    def test_autoseed(self) -> None:
-        self.gen.seed()
-        state1 = self.gen.getstate()
-        time.sleep(0.1)
-        self.gen.seed()      # diffent seeds at different times
-        state2 = self.gen.getstate()
-        self.assertNotEqual(state1, state2)
-
-    def test_saverestore(self) -> None:
-        N = 1000
-        self.gen.seed()
-        state = self.gen.getstate()
-        randseq = self.randomlist(N)
-        self.gen.setstate(state)    # should regenerate the same sequence
-        self.assertEqual(randseq, self.randomlist(N))
-
-    def test_seedargs(self) -> None:
-        for arg in [None, 0, 0, 1, 1, -1, -1, 10**20, -(10**20),
-                    3.14, complex(1., 2.), 'a', tuple('abc')]:
-            self.gen.seed(arg)
-        for arg in [list(range(3)), {'one': 1}]:
-            self.assertRaises(TypeError, self.gen.seed, arg)
-        self.assertRaises(TypeError, self.gen.seed, 1, 2, 3, 4)
-        self.assertRaises(TypeError, type(self.gen), [])  # type: ignore  # mypy issue 1846
-
-    def test_choice(self) -> None:
-        choice = self.gen.choice
-        with self.assertRaises(IndexError):
-            choice([])
-        self.assertEqual(choice([50]), 50)
-        self.assertIn(choice([25, 75]), [25, 75])
-
-    def test_sample(self) -> None:
-        # For the entire allowable range of 0 <= k <= N, validate that
-        # the sample is of the correct length and contains only unique items
-        N = 100
-        population = range(N)
-        for k in range(N+1):
-            s = self.gen.sample(population, k)
-            self.assertEqual(len(s), k)
-            uniq = set(s)
-            self.assertEqual(len(uniq), k)
-            self.assertTrue(uniq <= set(population))
-        self.assertEqual(self.gen.sample([], 0), [])  # test edge case N==k==0
-
-    def test_sample_distribution(self) -> None:
-        # For the entire allowable range of 0 <= k <= N, validate that
-        # sample generates all possible permutations
-        n = 5
-        pop = range(n)
-        trials = 10000  # large num prevents false negatives without slowing normal case
-        def factorial(n: int) -> int:
-            if n == 0:
-                return 1
-            return n * factorial(n - 1)
-        for k in range(n):
-            expected = factorial(n) // factorial(n-k)
-            perms = {}  # type: Dict[tuple, object]
-            for i in range(trials):
-                perms[tuple(self.gen.sample(pop, k))] = None
-                if len(perms) == expected:
-                    break
-            else:
-                self.fail()
-
-    def test_sample_inputs(self) -> None:
-        # SF bug #801342 -- population can be any iterable defining __len__()
-        self.gen.sample(set(range(20)), 2)
-        self.gen.sample(range(20), 2)
-        self.gen.sample(range(20), 2)
-        self.gen.sample(str('abcdefghijklmnopqrst'), 2)
-        self.gen.sample(tuple('abcdefghijklmnopqrst'), 2)
-
-    def test_sample_on_dicts(self) -> None:
-        self.assertRaises(TypeError, self.gen.sample, dict.fromkeys('abcdef'), 2)
-
-    def test_gauss(self) -> None:
-        # Ensure that the seed() method initializes all the hidden state.  In
-        # particular, through 2.2.1 it failed to reset a piece of state used
-        # by (and only by) the .gauss() method.
-
-        for seed in 1, 12, 123, 1234, 12345, 123456, 654321:
-            self.gen.seed(seed)
-            x1 = self.gen.random()
-            y1 = self.gen.gauss(0, 1)
-
-            self.gen.seed(seed)
-            x2 = self.gen.random()
-            y2 = self.gen.gauss(0, 1)
-
-            self.assertEqual(x1, x2)
-            self.assertEqual(y1, y2)
-
-    def test_pickling(self) -> None:
-        state = pickle.dumps(self.gen)
-        origseq = [self.gen.random() for i in range(10)]
-        newgen = pickle.loads(state)
-        restoredseq = [newgen.random() for i in range(10)]
-        self.assertEqual(origseq, restoredseq)
-
-    def test_bug_1727780(self) -> None:
-        # verify that version-2-pickles can be loaded
-        # fine, whether they are created on 32-bit or 64-bit
-        # platforms, and that version-3-pickles load fine.
-        files = [("randv2_32.pck", 780),
-                 ("randv2_64.pck", 866),
-                 ("randv3.pck", 343)]
-        for file, value in files:
-            f = open(support.findfile(file),"rb")
-            r = pickle.load(f)
-            f.close()
-            self.assertEqual(int(r.random()*1000), value)
-
-    def test_bug_9025(self) -> None:
-        # Had problem with an uneven distribution in int(n*random())
-        # Verify the fix by checking that distributions fall within expectations.
-        n = 100000
-        randrange = self.gen.randrange
-        k = sum(randrange(6755399441055744) % 3 == 2 for i in range(n))
-        self.assertTrue(0.30 < k/n and k/n < .37, (k/n))
-
-class SystemRandom_TestBasicOps(TestBasicOps[random.SystemRandom]):
-    gen = random.SystemRandom()
-
-    def test_autoseed(self) -> None:
-        # Doesn't need to do anything except not fail
-        self.gen.seed()
-
-    def test_saverestore(self) -> None:
-        self.assertRaises(NotImplementedError, self.gen.getstate)
-        self.assertRaises(NotImplementedError, self.gen.setstate, None)
-
-    def test_seedargs(self) -> None:
-        # Doesn't need to do anything except not fail
-        self.gen.seed(100)
-
-    def test_gauss(self) -> None:
-        self.gen.gauss_next = None
-        self.gen.seed(100)
-        self.assertEqual(self.gen.gauss_next, None)
-
-    def test_pickling(self) -> None:
-        self.assertRaises(NotImplementedError, pickle.dumps, self.gen)
-
-    def test_53_bits_per_float(self) -> None:
-        # This should pass whenever a C double has 53 bit precision.
-        span = 2 ** 53 # type: int
-        cum = 0
-        for i in range(100):
-            cum |= int(self.gen.random() * span)
-        self.assertEqual(cum, span-1)
-
-    def test_bigrand(self) -> None:
-        # The randrange routine should build-up the required number of bits
-        # in stages so that all bit positions are active.
-        span = 2 ** 500 # type: int
-        cum = 0
-        for i in range(100):
-            r = self.gen.randrange(span)
-            self.assertTrue(0 <= r < span)
-            cum |= r
-        self.assertEqual(cum, span-1)
-
-    def test_bigrand_ranges(self) -> None:
-        for i in [40,80, 160, 200, 211, 250, 375, 512, 550]:
-            start = self.gen.randrange(2 ** i)
-            stop = self.gen.randrange(2 ** (i-2))
-            if stop <= start:
-                return
-            self.assertTrue(start <= self.gen.randrange(start, stop) < stop)
-
-    def test_rangelimits(self) -> None:
-        for start, stop in [(-2,0), (-(2**60)-2,-(2**60)), (2**60,2**60+2)]:
-            self.assertEqual(set(range(start,stop)),
-                set([self.gen.randrange(start,stop) for i in range(100)]))
-
-    def test_genrandbits(self) -> None:
-        # Verify ranges
-        for k in range(1, 1000):
-            self.assertTrue(0 <= self.gen.getrandbits(k) < 2**k)
-
-        # Verify all bits active
-        getbits = self.gen.getrandbits
-        for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]:
-            cum = 0
-            for i in range(100):
-                cum |= getbits(span)
-            self.assertEqual(cum, 2**span-1)
-
-        # Verify argument checking
-        self.assertRaises(TypeError, self.gen.getrandbits)
-        self.assertRaises(TypeError, self.gen.getrandbits, 1, 2)
-        self.assertRaises(ValueError, self.gen.getrandbits, 0)
-        self.assertRaises(ValueError, self.gen.getrandbits, -1)
-        self.assertRaises(TypeError, self.gen.getrandbits, 10.1)
-
-    def test_randbelow_logic(self, _log: Callable[[float, float], float] = log,
-                             int: Callable[[float], int] = int) -> None:
-        # check bitcount transition points:  2**i and 2**(i+1)-1
-        # show that: k = int(1.001 + _log(n, 2))
-        # is equal to or one greater than the number of bits in n
-        for i in range(1, 1000):
-            n = 1 << i # check an exact power of two
-            numbits = i+1
-            k = int(1.00001 + _log(n, 2))
-            self.assertEqual(k, numbits)
-            self.assertEqual(n, 2**(k-1))
-
-            n += n - 1      # check 1 below the next power of two
-            k = int(1.00001 + _log(n, 2))
-            self.assertIn(k, [numbits, numbits+1])
-            self.assertTrue(2**k > n > 2**(k-2))
-
-            n -= n >> 15     # check a little farther below the next power of two
-            k = int(1.00001 + _log(n, 2))
-            self.assertEqual(k, numbits)        # note the stronger assertion
-            self.assertTrue(2**k > n > 2**(k-1))   # note the stronger assertion
-
-
-class MersenneTwister_TestBasicOps(TestBasicOps[random.Random]):
-    gen = random.Random()
-
-    def test_guaranteed_stable(self) -> None:
-        # These sequences are guaranteed to stay the same across versions of python
-        self.gen.seed(3456147, version=1)
-        self.assertEqual([self.gen.random().hex() for i in range(4)],
-            ['0x1.ac362300d90d2p-1', '0x1.9d16f74365005p-1',
-             '0x1.1ebb4352e4c4dp-1', '0x1.1a7422abf9c11p-1'])
-        self.gen.seed("the quick brown fox", version=2)
-        self.assertEqual([self.gen.random().hex() for i in range(4)],
-            ['0x1.1239ddfb11b7cp-3', '0x1.b3cbb5c51b120p-4',
-             '0x1.8c4f55116b60fp-1', '0x1.63eb525174a27p-1'])
-
-    def test_setstate_first_arg(self) -> None:
-        self.assertRaises(ValueError, self.gen.setstate, (1, None, None))
-
-    def test_setstate_middle_arg(self) -> None:
-        # Wrong type, s/b tuple
-        self.assertRaises(TypeError, self.gen.setstate, (2, None, None))
-        # Wrong length, s/b 625
-        self.assertRaises(ValueError, self.gen.setstate, (2, (1,2,3), None))
-        # Wrong type, s/b tuple of 625 ints
-        self.assertRaises(TypeError, self.gen.setstate, (2, tuple(['a',]*625), None))
-        # Last element s/b an int also
-        self.assertRaises(TypeError, self.gen.setstate, (2, cast(Any, (0,))*624+('a',), None))
-
-    def test_referenceImplementation(self) -> None:
-        # Compare the python implementation with results from the original
-        # code.  Create 2000 53-bit precision random floats.  Compare only
-        # the last ten entries to show that the independent implementations
-        # are tracking.  Here is the main() function needed to create the
-        # list of expected random numbers:
-        #    void main(void){
-        #         int i;
-        #         unsigned long init[4]={61731, 24903, 614, 42143}, length=4;
-        #         init_by_array(init, length);
-        #         for (i=0; i<2000; i++) {
-        #           printf("%.15f ", genrand_res53());
-        #           if (i%5==4) printf("\n");
-        #         }
-        #     }
-        expected = [0.45839803073713259,
-                    0.86057815201978782,
-                    0.92848331726782152,
-                    0.35932681119782461,
-                    0.081823493762449573,
-                    0.14332226470169329,
-                    0.084297823823520024,
-                    0.53814864671831453,
-                    0.089215024911993401,
-                    0.78486196105372907]
-
-        self.gen.seed(61731 + (24903<<32) + (614<<64) + (42143<<96))
-        actual = self.randomlist(2000)[-10:]
-        for a, e in zip(actual, expected):
-            self.assertAlmostEqual(a,e,places=14)
-
-    def test_strong_reference_implementation(self) -> None:
-        # Like test_referenceImplementation, but checks for exact bit-level
-        # equality.  This should pass on any box where C double contains
-        # at least 53 bits of precision (the underlying algorithm suffers
-        # no rounding errors -- all results are exact).
-        from math import ldexp
-
-        expected = [0x0eab3258d2231f,
-                    0x1b89db315277a5,
-                    0x1db622a5518016,
-                    0x0b7f9af0d575bf,
-                    0x029e4c4db82240,
-                    0x04961892f5d673,
-                    0x02b291598e4589,
-                    0x11388382c15694,
-                    0x02dad977c9e1fe,
-                    0x191d96d4d334c6]
-        self.gen.seed(61731 + (24903<<32) + (614<<64) + (42143<<96))
-        actual = self.randomlist(2000)[-10:]
-        for a, e in zip(actual, expected):
-            self.assertEqual(int(ldexp(a, 53)), e)
-
-    def test_long_seed(self) -> None:
-        # This is most interesting to run in debug mode, just to make sure
-        # nothing blows up.  Under the covers, a dynamically resized array
-        # is allocated, consuming space proportional to the number of bits
-        # in the seed.  Unfortunately, that's a quadratic-time algorithm,
-        # so don't make this horribly big.
-        seed = (1 << (10000 * 8)) - 1  # about 10K bytes
-        self.gen.seed(seed)
-
-    def test_53_bits_per_float(self) -> None:
-        # This should pass whenever a C double has 53 bit precision.
-        span = 2 ** 53 # type: int
-        cum = 0
-        for i in range(100):
-            cum |= int(self.gen.random() * span)
-        self.assertEqual(cum, span-1)
-
-    def test_bigrand(self) -> None:
-        # The randrange routine should build-up the required number of bits
-        # in stages so that all bit positions are active.
-        span = 2 ** 500 # type: int
-        cum = 0
-        for i in range(100):
-            r = self.gen.randrange(span)
-            self.assertTrue(0 <= r < span)
-            cum |= r
-        self.assertEqual(cum, span-1)
-
-    def test_bigrand_ranges(self) -> None:
-        for i in [40,80, 160, 200, 211, 250, 375, 512, 550]:
-            start = self.gen.randrange(2 ** i)
-            stop = self.gen.randrange(2 ** (i-2))
-            if stop <= start:
-                return
-            self.assertTrue(start <= self.gen.randrange(start, stop) < stop)
-
-    def test_rangelimits(self) -> None:
-        for start, stop in [(-2,0), (-(2**60)-2,-(2**60)), (2**60,2**60+2)]:
-            self.assertEqual(set(range(start,stop)),
-                set([self.gen.randrange(start,stop) for i in range(100)]))
-
-    def test_genrandbits(self) -> None:
-        # Verify cross-platform repeatability
-        self.gen.seed(1234567)
-        self.assertEqual(self.gen.getrandbits(100),
-                         97904845777343510404718956115)
-        # Verify ranges
-        for k in range(1, 1000):
-            self.assertTrue(0 <= self.gen.getrandbits(k) < 2**k)
-
-        # Verify all bits active
-        getbits = self.gen.getrandbits
-        for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]:
-            cum = 0
-            for i in range(100):
-                cum |= getbits(span)
-            self.assertEqual(cum, 2**span-1)
-
-        # Verify argument checking
-        self.assertRaises(TypeError, self.gen.getrandbits)
-        self.assertRaises(TypeError, self.gen.getrandbits, 'a')
-        self.assertRaises(TypeError, self.gen.getrandbits, 1, 2)
-        self.assertRaises(ValueError, self.gen.getrandbits, 0)
-        self.assertRaises(ValueError, self.gen.getrandbits, -1)
-
-    def test_randbelow_logic(self,
-                             _log: Callable[[int, float], float] = log,
-                             int: Callable[[float], int] = int) -> None:
-        # check bitcount transition points:  2**i and 2**(i+1)-1
-        # show that: k = int(1.001 + _log(n, 2))
-        # is equal to or one greater than the number of bits in n
-        for i in range(1, 1000):
-            n = 1 << i # check an exact power of two
-            numbits = i+1
-            k = int(1.00001 + _log(n, 2))
-            self.assertEqual(k, numbits)
-            self.assertEqual(n, 2**(k-1))
-
-            n += n - 1      # check 1 below the next power of two
-            k = int(1.00001 + _log(n, 2))
-            self.assertIn(k, [numbits, numbits+1])
-            self.assertTrue(2**k > n > 2**(k-2))
-
-            n -= n >> 15     # check a little farther below the next power of two
-            k = int(1.00001 + _log(n, 2))
-            self.assertEqual(k, numbits)        # note the stronger assertion
-            self.assertTrue(2**k > n > 2**(k-1))   # note the stronger assertion
-
-    def test_randrange_bug_1590891(self) -> None:
-        start = 1000000000000
-        stop = -100000000000000000000
-        step = -200
-        x = self.gen.randrange(start, stop, step)
-        self.assertTrue(stop < x <= start)
-        self.assertEqual((x+stop)%step, 0)
-
-def gamma(z: float, sqrt2pi: float = (2.0*pi)**0.5) -> float:
-    # Reflection to right half of complex plane
-    if z < 0.5:
-        return pi / sin(pi*z) / gamma(1.0-z)
-    # Lanczos approximation with g=7
-    az = z + (7.0 - 0.5)
-    return az ** (z-0.5) / exp(az) * sqrt2pi * fsum([
-        0.9999999999995183,
-        676.5203681218835 / z,
-        -1259.139216722289 / (z+1.0),
-        771.3234287757674 / (z+2.0),
-        -176.6150291498386 / (z+3.0),
-        12.50734324009056 / (z+4.0),
-        -0.1385710331296526 / (z+5.0),
-        0.9934937113930748e-05 / (z+6.0),
-        0.1659470187408462e-06 / (z+7.0),
-    ])
-
-class TestDistributions(unittest.TestCase):
-    def test_zeroinputs(self) -> None:
-        # Verify that distributions can handle a series of zero inputs'
-        g = random.Random()
-        x = [g.random() for i in range(50)] + [0.0]*5
-        def patch() -> None:
-            setattr(g, 'random', x[:].pop)
-        patch(); g.uniform(1.0,10.0)
-        patch(); g.paretovariate(1.0)
-        patch(); g.expovariate(1.0)
-        patch(); g.weibullvariate(1.0, 1.0)
-        patch(); g.normalvariate(0.0, 1.0)
-        patch(); g.gauss(0.0, 1.0)
-        patch(); g.lognormvariate(0.0, 1.0)
-        patch(); g.vonmisesvariate(0.0, 1.0)
-        patch(); g.gammavariate(0.01, 1.0)
-        patch(); g.gammavariate(1.0, 1.0)
-        patch(); g.gammavariate(200.0, 1.0)
-        patch(); g.betavariate(3.0, 3.0)
-        patch(); g.triangular(0.0, 1.0, 1.0/3.0)
-
-    def test_avg_std(self) -> None:
-        # Use integration to test distribution average and standard deviation.
-        # Only works for distributions which do not consume variates in pairs
-        g = random.Random()
-        N = 5000
-        x = [i/float(N) for i in range(1,N)]
-        variate = None  # type: Any
-        for variate, args, mu, sigmasqrd in [
-                (g.uniform, (1.0,10.0), (10.0+1.0)/2, (10.0-1.0)**2/12),
-                (g.triangular, (0.0, 1.0, 1.0/3.0), 4.0/9.0, 7.0/9.0/18.0),
-                (g.expovariate, (1.5,), 1/1.5, 1/1.5**2),
-                (g.paretovariate, (5.0,), 5.0/(5.0-1),
-                                  5.0/((5.0-1)**2*(5.0-2))),
-                (g.weibullvariate, (1.0, 3.0), gamma(1+1/3.0),
-                                  gamma(1+2/3.0)-gamma(1+1/3.0)**2) ]:
-            setattr(g, 'random', x[:].pop)
-            y = []  # type: List[float]
-            for i in range(len(x)):
-                try:
-                    y.append(variate(*args))
-                except IndexError:
-                    pass
-            s1 = s2 = 0.0
-            for e in y:
-                s1 += e
-                s2 += (e - mu) ** 2
-            N = len(y)
-            self.assertAlmostEqual(s1/N, mu, places=2)
-            self.assertAlmostEqual(s2/(N-1), sigmasqrd, places=2)
-
-class TestModule(unittest.TestCase):
-    def testMagicConstants(self) -> None:
-        self.assertAlmostEqual(random.NV_MAGICCONST, 1.71552776992141)
-        self.assertAlmostEqual(random.TWOPI, 6.28318530718)
-        self.assertAlmostEqual(random.LOG4, 1.38629436111989)
-        self.assertAlmostEqual(random.SG_MAGICCONST, 2.50407739677627)
-
-    def test__all__(self) -> None:
-        # tests validity but not completeness of the __all__ list
-        self.assertTrue(set(random.__all__) <= set(dir(random)))
-
-    def test_random_subclass_with_kwargs(self) -> None:
-        # SF bug #1486663 -- this used to erroneously raise a TypeError
-        class Subclass(random.Random):
-            def __init__(self, newarg: object = None) -> None:
-                random.Random.__init__(self)
-        Subclass(newarg=1)
-
-
-def test_main(verbose: bool = None) -> None:
-    testclasses =    [MersenneTwister_TestBasicOps,
-                      TestDistributions,
-                      TestModule]
-
-    try:
-        random.SystemRandom().random()
-    except NotImplementedError:
-        pass
-    else:
-        testclasses.append(SystemRandom_TestBasicOps)
-
-    support.run_unittest(*testclasses)
-
-    # verify reference counting
-    import sys
-    if verbose and hasattr(sys, "gettotalrefcount"):
-        counts = [None] * 5 # type: List[int]
-        for i in range(len(counts)):
-            support.run_unittest(*testclasses)
-            counts[i] = sys.gettotalrefcount()
-        print(counts)
-
-if __name__ == "__main__":
-    test_main(verbose=True)
diff --git a/test-data/stdlib-samples/3.2/test/test_set.py b/test-data/stdlib-samples/3.2/test/test_set.py
deleted file mode 100644
index 23ae745..0000000
--- a/test-data/stdlib-samples/3.2/test/test_set.py
+++ /dev/null
@@ -1,1884 +0,0 @@
-import unittest
-from test import support
-import gc
-import weakref
-import operator
-import copy
-import pickle
-from random import randrange, shuffle
-import sys
-import warnings
-import collections
-from typing import Set, Any
-
-class PassThru(Exception):
-    pass
-
-def check_pass_thru():
-    raise PassThru
-    yield 1
-
-class BadCmp:
-    def __hash__(self):
-        return 1
-    def __eq__(self, other):
-        raise RuntimeError
-
-class ReprWrapper:
-    'Used to test self-referential repr() calls'
-    def __repr__(self):
-        return repr(self.value)
-
-#class HashCountingInt(int):
-#    'int-like object that counts the number of times __hash__ is called'
-#    def __init__(self, *args):
-#        self.hash_count = 0
-#    def __hash__(self):
-#        self.hash_count += 1
-#        return int.__hash__(self)
-
-class TestJointOps(unittest.TestCase):
-    # Tests common to both set and frozenset
-
-    def setUp(self):
-        self.word = word = 'simsalabim'
-        self.otherword = 'madagascar'
-        self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
-        self.s = self.thetype(word)
-        self.d = dict.fromkeys(word)
-
-    def test_new_or_init(self):
-        self.assertRaises(TypeError, self.thetype, [], 2)
-        self.assertRaises(TypeError, set().__init__, a=1)
-
-    def test_uniquification(self):
-        actual = sorted(self.s)
-        expected = sorted(self.d)
-        self.assertEqual(actual, expected)
-        self.assertRaises(PassThru, self.thetype, check_pass_thru())
-        self.assertRaises(TypeError, self.thetype, [[]])
-
-    def test_len(self):
-        self.assertEqual(len(self.s), len(self.d))
-
-    def test_contains(self):
-        for c in self.letters:
-            self.assertEqual(c in self.s, c in self.d)
-        self.assertRaises(TypeError, self.s.__contains__, [[]])
-        s = self.thetype([frozenset(self.letters)])
-        self.assertIn(self.thetype(self.letters), s)
-
-    def test_union(self):
-        u = self.s.union(self.otherword)
-        for c in self.letters:
-            self.assertEqual(c in u, c in self.d or c in self.otherword)
-        self.assertEqual(self.s, self.thetype(self.word))
-        self.assertEqual(type(u), self.basetype)
-        self.assertRaises(PassThru, self.s.union, check_pass_thru())
-        self.assertRaises(TypeError, self.s.union, [[]])
-        for C in set, frozenset, dict.fromkeys, str, list, tuple:
-            self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
-            self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
-            self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
-            self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
-            self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
-
-        # Issue #6573
-        x = self.thetype()
-        self.assertEqual(x.union(set([1]), x, set([2])), self.thetype([1, 2]))
-
-    def test_or(self):
-        i = self.s.union(self.otherword)
-        self.assertEqual(self.s | set(self.otherword), i)
-        self.assertEqual(self.s | frozenset(self.otherword), i)
-        try:
-            self.s | self.otherword
-        except TypeError:
-            pass
-        else:
-            self.fail("s|t did not screen-out general iterables")
-
-    def test_intersection(self):
-        i = self.s.intersection(self.otherword)
-        for c in self.letters:
-            self.assertEqual(c in i, c in self.d and c in self.otherword)
-        self.assertEqual(self.s, self.thetype(self.word))
-        self.assertEqual(type(i), self.basetype)
-        self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
-        for C in set, frozenset, dict.fromkeys, str, list, tuple:
-            self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
-            self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
-            self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
-            self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
-            self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
-        s = self.thetype('abcba')
-        z = s.intersection()
-        if self.thetype == frozenset():
-            self.assertEqual(id(s), id(z))
-        else:
-            self.assertNotEqual(id(s), id(z))
-
-    def test_isdisjoint(self):
-        def f(s1, s2):
-            'Pure python equivalent of isdisjoint()'
-            return not set(s1).intersection(s2)
-        for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
-            s1 = self.thetype(larg)
-            for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
-                for C in set, frozenset, dict.fromkeys, str, list, tuple:
-                    s2 = C(rarg)
-                    actual = s1.isdisjoint(s2)
-                    expected = f(s1, s2)
-                    self.assertEqual(actual, expected)
-                    self.assertTrue(actual is True or actual is False)
-
-    def test_and(self):
-        i = self.s.intersection(self.otherword)
-        self.assertEqual(self.s & set(self.otherword), i)
-        self.assertEqual(self.s & frozenset(self.otherword), i)
-        try:
-            self.s & self.otherword
-        except TypeError:
-            pass
-        else:
-            self.fail("s&t did not screen-out general iterables")
-
-    def test_difference(self):
-        i = self.s.difference(self.otherword)
-        for c in self.letters:
-            self.assertEqual(c in i, c in self.d and c not in self.otherword)
-        self.assertEqual(self.s, self.thetype(self.word))
-        self.assertEqual(type(i), self.basetype)
-        self.assertRaises(PassThru, self.s.difference, check_pass_thru())
-        self.assertRaises(TypeError, self.s.difference, [[]])
-        for C in set, frozenset, dict.fromkeys, str, list, tuple:
-            self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
-            self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
-            self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
-            self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
-            self.assertEqual(self.thetype('abcba').difference(), set('abc'))
-            self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
-
-    def test_sub(self):
-        i = self.s.difference(self.otherword)
-        self.assertEqual(self.s - set(self.otherword), i)
-        self.assertEqual(self.s - frozenset(self.otherword), i)
-        try:
-            self.s - self.otherword
-        except TypeError:
-            pass
-        else:
-            self.fail("s-t did not screen-out general iterables")
-
-    def test_symmetric_difference(self):
-        i = self.s.symmetric_difference(self.otherword)
-        for c in self.letters:
-            self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
-        self.assertEqual(self.s, self.thetype(self.word))
-        self.assertEqual(type(i), self.basetype)
-        self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
-        self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
-        for C in set, frozenset, dict.fromkeys, str, list, tuple:
-            self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
-            self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
-            self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
-            self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
-
-    def test_xor(self):
-        i = self.s.symmetric_difference(self.otherword)
-        self.assertEqual(self.s ^ set(self.otherword), i)
-        self.assertEqual(self.s ^ frozenset(self.otherword), i)
-        try:
-            self.s ^ self.otherword
-        except TypeError:
-            pass
-        else:
-            self.fail("s^t did not screen-out general iterables")
-
-    def test_equality(self):
-        self.assertEqual(self.s, set(self.word))
-        self.assertEqual(self.s, frozenset(self.word))
-        self.assertEqual(self.s == self.word, False)
-        self.assertNotEqual(self.s, set(self.otherword))
-        self.assertNotEqual(self.s, frozenset(self.otherword))
-        self.assertEqual(self.s != self.word, True)
-
-    def test_setOfFrozensets(self):
-        t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
-        s = self.thetype(t)
-        self.assertEqual(len(s), 3)
-
-    def test_sub_and_super(self):
-        p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
-        self.assertTrue(p < q)
-        self.assertTrue(p <= q)
-        self.assertTrue(q <= q)
-        self.assertTrue(q > p)
-        self.assertTrue(q >= p)
-        self.assertFalse(q < r)
-        self.assertFalse(q <= r)
-        self.assertFalse(q > r)
-        self.assertFalse(q >= r)
-        self.assertTrue(set('a').issubset('abc'))
-        self.assertTrue(set('abc').issuperset('a'))
-        self.assertFalse(set('a').issubset('cbs'))
-        self.assertFalse(set('cbs').issuperset('a'))
-
-    def test_pickling(self):
-        for i in range(pickle.HIGHEST_PROTOCOL + 1):
-            p = pickle.dumps(self.s, i)
-            dup = pickle.loads(p)
-            self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
-            if type(self.s) not in (set, frozenset):
-                self.s.x = 10
-                p = pickle.dumps(self.s)
-                dup = pickle.loads(p)
-                self.assertEqual(self.s.x, dup.x)
-
-    def test_deepcopy(self):
-        class Tracer:
-            def __init__(self, value):
-                self.value = value
-            def __hash__(self):
-                return self.value
-            def __deepcopy__(self, memo=None):
-                return Tracer(self.value + 1)
-        t = Tracer(10)
-        s = self.thetype([t])
-        dup = copy.deepcopy(s)
-        self.assertNotEqual(id(s), id(dup))
-        for elem in dup:
-            newt = elem
-        self.assertNotEqual(id(t), id(newt))
-        self.assertEqual(t.value + 1, newt.value)
-
-    def test_gc(self):
-        # Create a nest of cycles to exercise overall ref count check
-        class A:
-            pass
-        s = set(A() for i in range(1000))
-        for elem in s:
-            elem.cycle = s
-            elem.sub = elem
-            elem.set = set([elem])
-
-    def test_subclass_with_custom_hash(self):
-        raise NotImplementedError() # runtime computed base class below
-        # Bug #1257731
-        class H: # (self.thetype):
-            def __hash__(self):
-                return int(id(self) & 0x7fffffff)
-        s=H()
-        f=set()
-        f.add(s)
-        self.assertIn(s, f)
-        f.remove(s)
-        f.add(s)
-        f.discard(s)
-
-    def test_badcmp(self):
-        s = self.thetype([BadCmp()])
-        # Detect comparison errors during insertion and lookup
-        self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
-        self.assertRaises(RuntimeError, s.__contains__, BadCmp())
-        # Detect errors during mutating operations
-        if hasattr(s, 'add'):
-            self.assertRaises(RuntimeError, s.add, BadCmp())
-            self.assertRaises(RuntimeError, s.discard, BadCmp())
-            self.assertRaises(RuntimeError, s.remove, BadCmp())
-
-    def test_cyclical_repr(self):
-        w = ReprWrapper()
-        s = self.thetype([w])
-        w.value = s
-        if self.thetype == set:
-            self.assertEqual(repr(s), '{set(...)}')
-        else:
-            name = repr(s).partition('(')[0]    # strip class name
-            self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
-
-    def test_cyclical_print(self):
-        w = ReprWrapper()
-        s = self.thetype([w])
-        w.value = s
-        fo = open(support.TESTFN, "w")
-        try:
-            fo.write(str(s))
-            fo.close()
-            fo = open(support.TESTFN, "r")
-            self.assertEqual(fo.read(), repr(s))
-        finally:
-            fo.close()
-            support.unlink(support.TESTFN)
-
-    def test_do_not_rehash_dict_keys(self):
-        raise NotImplementedError() # cannot subclass int
-        n = 10
-        d = None # dict.fromkeys(map(HashCountingInt, range(n)))
-        self.assertEqual(sum(elem.hash_count for elem in d), n)
-        s = self.thetype(d)
-        self.assertEqual(sum(elem.hash_count for elem in d), n)
-        s.difference(d)
-        self.assertEqual(sum(elem.hash_count for elem in d), n)
-        if hasattr(s, 'symmetric_difference_update'):
-            s.symmetric_difference_update(d)
-        self.assertEqual(sum(elem.hash_count for elem in d), n)
-        d2 = dict.fromkeys(set(d))
-        self.assertEqual(sum(elem.hash_count for elem in d), n)
-        d3 = dict.fromkeys(frozenset(d))
-        self.assertEqual(sum(elem.hash_count for elem in d), n)
-        d3 = dict.fromkeys(frozenset(d), 123)
-        self.assertEqual(sum(elem.hash_count for elem in d), n)
-        self.assertEqual(d3, dict.fromkeys(d, 123))
-
-    def test_container_iterator(self):
-        # Bug #3680: tp_traverse was not implemented for set iterator object
-        class C(object):
-            pass
-        obj = C()
-        ref = weakref.ref(obj)
-        container = set([obj, 1])
-        obj.x = iter(container)
-        obj = None
-        container = None
-        gc.collect()
-        self.assertTrue(ref() is None, "Cycle was not collected")
-
-class TestSet(TestJointOps):
-    thetype = set
-    basetype = set
-
-    def test_init(self):
-        s = self.thetype()
-        s.__init__(self.word)
-        self.assertEqual(s, set(self.word))
-        s.__init__(self.otherword)
-        self.assertEqual(s, set(self.otherword))
-        self.assertRaises(TypeError, s.__init__, s, 2);
-        self.assertRaises(TypeError, s.__init__, 1)
-
-    def test_constructor_identity(self):
-        s = self.thetype(range(3))
-        t = self.thetype(s)
-        self.assertNotEqual(id(s), id(t))
-
-    def test_set_literal(self):
-        raise NotImplementedError()
-        #s = set([1,2,3])
-        #t = {1,2,3}
-        #self.assertEqual(s, t)
-
-    def test_hash(self):
-        self.assertRaises(TypeError, hash, self.s)
-
-    def test_clear(self):
-        self.s.clear()
-        self.assertEqual(self.s, set())
-        self.assertEqual(len(self.s), 0)
-
-    def test_copy(self):
-        dup = self.s.copy()
-        self.assertEqual(self.s, dup)
-        self.assertNotEqual(id(self.s), id(dup))
-        self.assertEqual(type(dup), self.basetype)
-
-    def test_add(self):
-        self.s.add('Q')
-        self.assertIn('Q', self.s)
-        dup = self.s.copy()
-        self.s.add('Q')
-        self.assertEqual(self.s, dup)
-        self.assertRaises(TypeError, self.s.add, [])
-
-    def test_remove(self):
-        self.s.remove('a')
-        self.assertNotIn('a', self.s)
-        self.assertRaises(KeyError, self.s.remove, 'Q')
-        self.assertRaises(TypeError, self.s.remove, [])
-        s = self.thetype([frozenset(self.word)])
-        self.assertIn(self.thetype(self.word), s)
-        s.remove(self.thetype(self.word))
-        self.assertNotIn(self.thetype(self.word), s)
-        self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
-
-    def test_remove_keyerror_unpacking(self):
-        # bug:  www.python.org/sf/1576657
-        for v1 in ['Q', (1,)]:
-            try:
-                self.s.remove(v1)
-            except KeyError as e:
-                v2 = e.args[0]
-                self.assertEqual(v1, v2)
-            else:
-                self.fail()
-
-    def test_remove_keyerror_set(self):
-        key = self.thetype([3, 4])
-        try:
-            self.s.remove(key)
-        except KeyError as e:
-            self.assertTrue(e.args[0] is key,
-                         "KeyError should be {0}, not {1}".format(key,
-                                                                  e.args[0]))
-        else:
-            self.fail()
-
-    def test_discard(self):
-        self.s.discard('a')
-        self.assertNotIn('a', self.s)
-        self.s.discard('Q')
-        self.assertRaises(TypeError, self.s.discard, [])
-        s = self.thetype([frozenset(self.word)])
-        self.assertIn(self.thetype(self.word), s)
-        s.discard(self.thetype(self.word))
-        self.assertNotIn(self.thetype(self.word), s)
-        s.discard(self.thetype(self.word))
-
-    def test_pop(self):
-        for i in range(len(self.s)):
-            elem = self.s.pop()
-            self.assertNotIn(elem, self.s)
-        self.assertRaises(KeyError, self.s.pop)
-
-    def test_update(self):
-        retval = self.s.update(self.otherword)
-        self.assertEqual(retval, None)
-        for c in (self.word + self.otherword):
-            self.assertIn(c, self.s)
-        self.assertRaises(PassThru, self.s.update, check_pass_thru())
-        self.assertRaises(TypeError, self.s.update, [[]])
-        for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
-            for C in set, frozenset, dict.fromkeys, str, list, tuple:
-                s = self.thetype('abcba')
-                self.assertEqual(s.update(C(p)), None)
-                self.assertEqual(s, set(q))
-        for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
-            q = 'ahi'
-            for C in set, frozenset, dict.fromkeys, str, list, tuple:
-                s = self.thetype('abcba')
-                self.assertEqual(s.update(C(p), C(q)), None)
-                self.assertEqual(s, set(s) | set(p) | set(q))
-
-    def test_ior(self):
-        self.s |= set(self.otherword)
-        for c in (self.word + self.otherword):
-            self.assertIn(c, self.s)
-
-    def test_intersection_update(self):
-        retval = self.s.intersection_update(self.otherword)
-        self.assertEqual(retval, None)
-        for c in (self.word + self.otherword):
-            if c in self.otherword and c in self.word:
-                self.assertIn(c, self.s)
-            else:
-                self.assertNotIn(c, self.s)
-        self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
-        self.assertRaises(TypeError, self.s.intersection_update, [[]])
-        for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
-            for C in set, frozenset, dict.fromkeys, str, list, tuple:
-                s = self.thetype('abcba')
-                self.assertEqual(s.intersection_update(C(p)), None)
-                self.assertEqual(s, set(q))
-                ss = 'abcba'
-                s = self.thetype(ss)
-                t = 'cbc'
-                self.assertEqual(s.intersection_update(C(p), C(t)), None)
-                self.assertEqual(s, set('abcba')&set(p)&set(t))
-
-    def test_iand(self):
-        self.s &= set(self.otherword)
-        for c in (self.word + self.otherword):
-            if c in self.otherword and c in self.word:
-                self.assertIn(c, self.s)
-            else:
-                self.assertNotIn(c, self.s)
-
-    def test_difference_update(self):
-        retval = self.s.difference_update(self.otherword)
-        self.assertEqual(retval, None)
-        for c in (self.word + self.otherword):
-            if c in self.word and c not in self.otherword:
-                self.assertIn(c, self.s)
-            else:
-                self.assertNotIn(c, self.s)
-        self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
-        self.assertRaises(TypeError, self.s.difference_update, [[]])
-        self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
-        for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
-            for C in set, frozenset, dict.fromkeys, str, list, tuple:
-                s = self.thetype('abcba')
-                self.assertEqual(s.difference_update(C(p)), None)
-                self.assertEqual(s, set(q))
-
-                s = self.thetype('abcdefghih')
-                s.difference_update()
-                self.assertEqual(s, self.thetype('abcdefghih'))
-
-                s = self.thetype('abcdefghih')
-                s.difference_update(C('aba'))
-                self.assertEqual(s, self.thetype('cdefghih'))
-
-                s = self.thetype('abcdefghih')
-                s.difference_update(C('cdc'), C('aba'))
-                self.assertEqual(s, self.thetype('efghih'))
-
-    def test_isub(self):
-        self.s -= set(self.otherword)
-        for c in (self.word + self.otherword):
-            if c in self.word and c not in self.otherword:
-                self.assertIn(c, self.s)
-            else:
-                self.assertNotIn(c, self.s)
-
-    def test_symmetric_difference_update(self):
-        retval = self.s.symmetric_difference_update(self.otherword)
-        self.assertEqual(retval, None)
-        for c in (self.word + self.otherword):
-            if (c in self.word) ^ (c in self.otherword):
-                self.assertIn(c, self.s)
-            else:
-                self.assertNotIn(c, self.s)
-        self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
-        self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
-        for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
-            for C in set, frozenset, dict.fromkeys, str, list, tuple:
-                s = self.thetype('abcba')
-                self.assertEqual(s.symmetric_difference_update(C(p)), None)
-                self.assertEqual(s, set(q))
-
-    def test_ixor(self):
-        self.s ^= set(self.otherword)
-        for c in (self.word + self.otherword):
-            if (c in self.word) ^ (c in self.otherword):
-                self.assertIn(c, self.s)
-            else:
-                self.assertNotIn(c, self.s)
-
-    def test_inplace_on_self(self):
-        t = self.s.copy()
-        t |= t
-        self.assertEqual(t, self.s)
-        t &= t
-        self.assertEqual(t, self.s)
-        t -= t
-        self.assertEqual(t, self.thetype())
-        t = self.s.copy()
-        t ^= t
-        self.assertEqual(t, self.thetype())
-
-    def test_weakref(self):
-        s = self.thetype('gallahad')
-        p = weakref.proxy(s)
-        self.assertEqual(str(p), str(s))
-        s = None
-        self.assertRaises(ReferenceError, str, p)
-
-    def test_rich_compare(self):
-        class TestRichSetCompare:
-            def __gt__(self, some_set):
-                self.gt_called = True
-                return False
-            def __lt__(self, some_set):
-                self.lt_called = True
-                return False
-            def __ge__(self, some_set):
-                self.ge_called = True
-                return False
-            def __le__(self, some_set):
-                self.le_called = True
-                return False
-
-        # This first tries the builtin rich set comparison, which doesn't know
-        # how to handle the custom object. Upon returning NotImplemented, the
-        # corresponding comparison on the right object is invoked.
-        myset = {1, 2, 3}
-
-        myobj = TestRichSetCompare()
-        myset < myobj
-        self.assertTrue(myobj.gt_called)
-
-        myobj = TestRichSetCompare()
-        myset > myobj
-        self.assertTrue(myobj.lt_called)
-
-        myobj = TestRichSetCompare()
-        myset <= myobj
-        self.assertTrue(myobj.ge_called)
-
-        myobj = TestRichSetCompare()
-        myset >= myobj
-        self.assertTrue(myobj.le_called)
-
-    # C API test only available in a debug build
-    if hasattr(set, "test_c_api"):
-        def test_c_api(self):
-            self.assertEqual(set().test_c_api(), True)
-
-class SetSubclass(set):
-    pass
-
-class TestSetSubclass(TestSet):
-    thetype = SetSubclass
-    basetype = set
-
-class SetSubclassWithKeywordArgs(set):
-    def __init__(self, iterable=[], newarg=None):
-        set.__init__(self, iterable)
-
-class TestSetSubclassWithKeywordArgs(TestSet):
-
-    def test_keywords_in_subclass(self):
-        'SF bug #1486663 -- this used to erroneously raise a TypeError'
-        SetSubclassWithKeywordArgs(newarg=1)
-
-class TestFrozenSet(TestJointOps):
-    thetype = frozenset
-    basetype = frozenset
-
-    def test_init(self):
-        s = self.thetype(self.word)
-        s.__init__(self.otherword)
-        self.assertEqual(s, set(self.word))
-
-    def test_singleton_empty_frozenset(self):
-        f = frozenset()
-        efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
-               frozenset(), frozenset([]), frozenset(()), frozenset(''),
-               frozenset(range(0)), frozenset(frozenset()),
-               frozenset(f), f]
-        # All of the empty frozensets should have just one id()
-        self.assertEqual(len(set(map(id, efs))), 1)
-
-    def test_constructor_identity(self):
-        s = self.thetype(range(3))
-        t = self.thetype(s)
-        self.assertEqual(id(s), id(t))
-
-    def test_hash(self):
-        self.assertEqual(hash(self.thetype('abcdeb')),
-                         hash(self.thetype('ebecda')))
-
-        # make sure that all permutations give the same hash value
-        n = 100
-        seq = [randrange(n) for i in range(n)]
-        results = set()
-        for i in range(200):
-            shuffle(seq)
-            results.add(hash(self.thetype(seq)))
-        self.assertEqual(len(results), 1)
-
-    def test_copy(self):
-        dup = self.s.copy()
-        self.assertEqual(id(self.s), id(dup))
-
-    def test_frozen_as_dictkey(self):
-        seq = list(range(10)) + list('abcdefg') + ['apple']
-        key1 = self.thetype(seq)
-        key2 = self.thetype(reversed(seq))
-        self.assertEqual(key1, key2)
-        self.assertNotEqual(id(key1), id(key2))
-        d = {}
-        d[key1] = 42
-        self.assertEqual(d[key2], 42)
-
-    def test_hash_caching(self):
-        f = self.thetype('abcdcda')
-        self.assertEqual(hash(f), hash(f))
-
-    def test_hash_effectiveness(self):
-        n = 13
-        hashvalues = set()
-        addhashvalue = hashvalues.add
-        elemmasks = [(i+1, 1<<i) for i in range(n)]
-        for i in range(2**n):
-            addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
-        self.assertEqual(len(hashvalues), 2**n)
-
-class FrozenSetSubclass(frozenset):
-    pass
-
-class TestFrozenSetSubclass(TestFrozenSet):
-    thetype = FrozenSetSubclass
-    basetype = frozenset
-
-    def test_constructor_identity(self):
-        s = self.thetype(range(3))
-        t = self.thetype(s)
-        self.assertNotEqual(id(s), id(t))
-
-    def test_copy(self):
-        dup = self.s.copy()
-        self.assertNotEqual(id(self.s), id(dup))
-
-    def test_nested_empty_constructor(self):
-        s = self.thetype()
-        t = self.thetype(s)
-        self.assertEqual(s, t)
-
-    def test_singleton_empty_frozenset(self):
-        Frozenset = self.thetype
-        f = frozenset()
-        F = Frozenset()
-        efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
-               Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
-               Frozenset(range(0)), Frozenset(Frozenset()),
-               Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
-        # All empty frozenset subclass instances should have different ids
-        self.assertEqual(len(set(map(id, efs))), len(efs))
-
-# Tests taken from test_sets.py =============================================
-
-empty_set = set() # type: Any
-
-#==============================================================================
-
-class TestBasicOps(unittest.TestCase):
-
-    def test_repr(self):
-        if self.repr is not None:
-            self.assertEqual(repr(self.set), self.repr)
-
-    def check_repr_against_values(self):
-        text = repr(self.set)
-        self.assertTrue(text.startswith('{'))
-        self.assertTrue(text.endswith('}'))
-
-        result = text[1:-1].split(', ')
-        result.sort()
-        sorted_repr_values = [repr(value) for value in self.values]
-        sorted_repr_values.sort()
-        self.assertEqual(result, sorted_repr_values)
-
-    def test_print(self):
-        try:
-            fo = open(support.TESTFN, "w")
-            fo.write(str(self.set))
-            fo.close()
-            fo = open(support.TESTFN, "r")
-            self.assertEqual(fo.read(), repr(self.set))
-        finally:
-            fo.close()
-            support.unlink(support.TESTFN)
-
-    def test_length(self):
-        self.assertEqual(len(self.set), self.length)
-
-    def test_self_equality(self):
-        self.assertEqual(self.set, self.set)
-
-    def test_equivalent_equality(self):
-        self.assertEqual(self.set, self.dup)
-
-    def test_copy(self):
-        self.assertEqual(self.set.copy(), self.dup)
-
-    def test_self_union(self):
-        result = self.set | self.set
-        self.assertEqual(result, self.dup)
-
-    def test_empty_union(self):
-        result = self.set | empty_set
-        self.assertEqual(result, self.dup)
-
-    def test_union_empty(self):
-        result = empty_set | self.set
-        self.assertEqual(result, self.dup)
-
-    def test_self_intersection(self):
-        result = self.set & self.set
-        self.assertEqual(result, self.dup)
-
-    def test_empty_intersection(self):
-        result = self.set & empty_set
-        self.assertEqual(result, empty_set)
-
-    def test_intersection_empty(self):
-        result = empty_set & self.set
-        self.assertEqual(result, empty_set)
-
-    def test_self_isdisjoint(self):
-        result = self.set.isdisjoint(self.set)
-        self.assertEqual(result, not self.set)
-
-    def test_empty_isdisjoint(self):
-        result = self.set.isdisjoint(empty_set)
-        self.assertEqual(result, True)
-
-    def test_isdisjoint_empty(self):
-        result = empty_set.isdisjoint(self.set)
-        self.assertEqual(result, True)
-
-    def test_self_symmetric_difference(self):
-        result = self.set ^ self.set
-        self.assertEqual(result, empty_set)
-
-    def test_empty_symmetric_difference(self):
-        result = self.set ^ empty_set
-        self.assertEqual(result, self.set)
-
-    def test_self_difference(self):
-        result = self.set - self.set
-        self.assertEqual(result, empty_set)
-
-    def test_empty_difference(self):
-        result = self.set - empty_set
-        self.assertEqual(result, self.dup)
-
-    def test_empty_difference_rev(self):
-        result = empty_set - self.set
-        self.assertEqual(result, empty_set)
-
-    def test_iteration(self):
-        for v in self.set:
-            self.assertIn(v, self.values)
-        setiter = iter(self.set)
-        # note: __length_hint__ is an internal undocumented API,
-        # don't rely on it in your own programs
-        self.assertEqual(setiter.__length_hint__(), len(self.set))
-
-    def test_pickling(self):
-        p = pickle.dumps(self.set)
-        copy = pickle.loads(p)
-        self.assertEqual(self.set, copy,
-                         "%s != %s" % (self.set, copy))
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsEmpty(TestBasicOps):
-    def setUp(self):
-        self.case   = "empty set"
-        self.values = []
-        self.set    = set(self.values)
-        self.dup    = set(self.values)
-        self.length = 0
-        self.repr   = "set()"
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsSingleton(TestBasicOps):
-    def setUp(self):
-        self.case   = "unit set (number)"
-        self.values = [3]
-        self.set    = set(self.values)
-        self.dup    = set(self.values)
-        self.length = 1
-        self.repr   = "{3}"
-
-    def test_in(self):
-        self.assertIn(3, self.set)
-
-    def test_not_in(self):
-        self.assertNotIn(2, self.set)
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsTuple(TestBasicOps):
-    def setUp(self):
-        self.case   = "unit set (tuple)"
-        self.values = [(0, "zero")]
-        self.set    = set(self.values)
-        self.dup    = set(self.values)
-        self.length = 1
-        self.repr   = "{(0, 'zero')}"
-
-    def test_in(self):
-        self.assertIn((0, "zero"), self.set)
-
-    def test_not_in(self):
-        self.assertNotIn(9, self.set)
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsTriple(TestBasicOps):
-    def setUp(self):
-        self.case   = "triple set"
-        self.values = [0, "zero", operator.add]
-        self.set    = set(self.values)
-        self.dup    = set(self.values)
-        self.length = 3
-        self.repr   = None
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsString(TestBasicOps):
-    def setUp(self):
-        self.case   = "string set"
-        self.values = ["a", "b", "c"]
-        self.set    = set(self.values)
-        self.dup    = set(self.values)
-        self.length = 3
-
-    def test_repr(self):
-        self.check_repr_against_values()
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsBytes(TestBasicOps):
-    def setUp(self):
-        self.case   = "string set"
-        self.values = [b"a", b"b", b"c"]
-        self.set    = set(self.values)
-        self.dup    = set(self.values)
-        self.length = 3
-
-    def test_repr(self):
-        self.check_repr_against_values()
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsMixedStringBytes(TestBasicOps):
-    def setUp(self):
-        self._warning_filters = support.check_warnings()
-        self._warning_filters.__enter__()
-        warnings.simplefilter('ignore', BytesWarning)
-        self.case   = "string and bytes set"
-        self.values = ["a", "b", b"a", b"b"]
-        self.set    = set(self.values)
-        self.dup    = set(self.values)
-        self.length = 4
-
-    def tearDown(self):
-        self._warning_filters.__exit__(None, None, None)
-
-    def test_repr(self):
-        self.check_repr_against_values()
-
-#==============================================================================
-
-def baditer():
-    raise TypeError
-    yield True
-
-def gooditer():
-    yield True
-
-class TestExceptionPropagation(unittest.TestCase):
-    """SF 628246:  Set constructor should not trap iterator TypeErrors"""
-
-    def test_instanceWithException(self):
-        self.assertRaises(TypeError, set, baditer())
-
-    def test_instancesWithoutException(self):
-        # All of these iterables should load without exception.
-        set([1,2,3])
-        set((1,2,3))
-        set({'one':1, 'two':2, 'three':3})
-        set(range(3))
-        set('abc')
-        set(gooditer())
-
-    def test_changingSizeWhileIterating(self):
-        s = set([1,2,3])
-        try:
-            for i in s:
-                s.update([4])
-        except RuntimeError:
-            pass
-        else:
-            self.fail("no exception when changing size during iteration")
-
-#==============================================================================
-
-class TestSetOfSets(unittest.TestCase):
-    def test_constructor(self):
-        inner = frozenset([1])
-        outer = set([inner])
-        element = outer.pop()
-        self.assertEqual(type(element), frozenset)
-        outer.add(inner)        # Rebuild set of sets with .add method
-        outer.remove(inner)
-        self.assertEqual(outer, set())   # Verify that remove worked
-        outer.discard(inner)    # Absence of KeyError indicates working fine
-
-#==============================================================================
-
-class TestBinaryOps(unittest.TestCase):
-    def setUp(self):
-        self.set = set((2, 4, 6))
-
-    def test_eq(self):              # SF bug 643115
-        self.assertEqual(self.set, set({2:1,4:3,6:5}))
-
-    def test_union_subset(self):
-        result = self.set | set([2])
-        self.assertEqual(result, set((2, 4, 6)))
-
-    def test_union_superset(self):
-        result = self.set | set([2, 4, 6, 8])
-        self.assertEqual(result, set([2, 4, 6, 8]))
-
-    def test_union_overlap(self):
-        result = self.set | set([3, 4, 5])
-        self.assertEqual(result, set([2, 3, 4, 5, 6]))
-
-    def test_union_non_overlap(self):
-        result = self.set | set([8])
-        self.assertEqual(result, set([2, 4, 6, 8]))
-
-    def test_intersection_subset(self):
-        result = self.set & set((2, 4))
-        self.assertEqual(result, set((2, 4)))
-
-    def test_intersection_superset(self):
-        result = self.set & set([2, 4, 6, 8])
-        self.assertEqual(result, set([2, 4, 6]))
-
-    def test_intersection_overlap(self):
-        result = self.set & set([3, 4, 5])
-        self.assertEqual(result, set([4]))
-
-    def test_intersection_non_overlap(self):
-        result = self.set & set([8])
-        self.assertEqual(result, empty_set)
-
-    def test_isdisjoint_subset(self):
-        result = self.set.isdisjoint(set((2, 4)))
-        self.assertEqual(result, False)
-
-    def test_isdisjoint_superset(self):
-        result = self.set.isdisjoint(set([2, 4, 6, 8]))
-        self.assertEqual(result, False)
-
-    def test_isdisjoint_overlap(self):
-        result = self.set.isdisjoint(set([3, 4, 5]))
-        self.assertEqual(result, False)
-
-    def test_isdisjoint_non_overlap(self):
-        result = self.set.isdisjoint(set([8]))
-        self.assertEqual(result, True)
-
-    def test_sym_difference_subset(self):
-        result = self.set ^ set((2, 4))
-        self.assertEqual(result, set([6]))
-
-    def test_sym_difference_superset(self):
-        result = self.set ^ set((2, 4, 6, 8))
-        self.assertEqual(result, set([8]))
-
-    def test_sym_difference_overlap(self):
-        result = self.set ^ set((3, 4, 5))
-        self.assertEqual(result, set([2, 3, 5, 6]))
-
-    def test_sym_difference_non_overlap(self):
-        result = self.set ^ set([8])
-        self.assertEqual(result, set([2, 4, 6, 8]))
-
-#==============================================================================
-
-class TestUpdateOps(unittest.TestCase):
-    def setUp(self):
-        self.set = set((2, 4, 6))
-
-    def test_union_subset(self):
-        self.set |= set([2])
-        self.assertEqual(self.set, set((2, 4, 6)))
-
-    def test_union_superset(self):
-        self.set |= set([2, 4, 6, 8])
-        self.assertEqual(self.set, set([2, 4, 6, 8]))
-
-    def test_union_overlap(self):
-        self.set |= set([3, 4, 5])
-        self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
-
-    def test_union_non_overlap(self):
-        self.set |= set([8])
-        self.assertEqual(self.set, set([2, 4, 6, 8]))
-
-    def test_union_method_call(self):
-        self.set.update(set([3, 4, 5]))
-        self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
-
-    def test_intersection_subset(self):
-        self.set &= set((2, 4))
-        self.assertEqual(self.set, set((2, 4)))
-
-    def test_intersection_superset(self):
-        self.set &= set([2, 4, 6, 8])
-        self.assertEqual(self.set, set([2, 4, 6]))
-
-    def test_intersection_overlap(self):
-        self.set &= set([3, 4, 5])
-        self.assertEqual(self.set, set([4]))
-
-    def test_intersection_non_overlap(self):
-        self.set &= set([8])
-        self.assertEqual(self.set, empty_set)
-
-    def test_intersection_method_call(self):
-        self.set.intersection_update(set([3, 4, 5]))
-        self.assertEqual(self.set, set([4]))
-
-    def test_sym_difference_subset(self):
-        self.set ^= set((2, 4))
-        self.assertEqual(self.set, set([6]))
-
-    def test_sym_difference_superset(self):
-        self.set ^= set((2, 4, 6, 8))
-        self.assertEqual(self.set, set([8]))
-
-    def test_sym_difference_overlap(self):
-        self.set ^= set((3, 4, 5))
-        self.assertEqual(self.set, set([2, 3, 5, 6]))
-
-    def test_sym_difference_non_overlap(self):
-        self.set ^= set([8])
-        self.assertEqual(self.set, set([2, 4, 6, 8]))
-
-    def test_sym_difference_method_call(self):
-        self.set.symmetric_difference_update(set([3, 4, 5]))
-        self.assertEqual(self.set, set([2, 3, 5, 6]))
-
-    def test_difference_subset(self):
-        self.set -= set((2, 4))
-        self.assertEqual(self.set, set([6]))
-
-    def test_difference_superset(self):
-        self.set -= set((2, 4, 6, 8))
-        self.assertEqual(self.set, set([]))
-
-    def test_difference_overlap(self):
-        self.set -= set((3, 4, 5))
-        self.assertEqual(self.set, set([2, 6]))
-
-    def test_difference_non_overlap(self):
-        self.set -= set([8])
-        self.assertEqual(self.set, set([2, 4, 6]))
-
-    def test_difference_method_call(self):
-        self.set.difference_update(set([3, 4, 5]))
-        self.assertEqual(self.set, set([2, 6]))
-
-#==============================================================================
-
-class TestMutate(unittest.TestCase):
-    def setUp(self):
-        self.values = ["a", "b", "c"]
-        self.set = set(self.values)
-
-    def test_add_present(self):
-        self.set.add("c")
-        self.assertEqual(self.set, set("abc"))
-
-    def test_add_absent(self):
-        self.set.add("d")
-        self.assertEqual(self.set, set("abcd"))
-
-    def test_add_until_full(self):
-        tmp = set()
-        expected_len = 0
-        for v in self.values:
-            tmp.add(v)
-            expected_len += 1
-            self.assertEqual(len(tmp), expected_len)
-        self.assertEqual(tmp, self.set)
-
-    def test_remove_present(self):
-        self.set.remove("b")
-        self.assertEqual(self.set, set("ac"))
-
-    def test_remove_absent(self):
-        try:
-            self.set.remove("d")
-            self.fail("Removing missing element should have raised LookupError")
-        except LookupError:
-            pass
-
-    def test_remove_until_empty(self):
-        expected_len = len(self.set)
-        for v in self.values:
-            self.set.remove(v)
-            expected_len -= 1
-            self.assertEqual(len(self.set), expected_len)
-
-    def test_discard_present(self):
-        self.set.discard("c")
-        self.assertEqual(self.set, set("ab"))
-
-    def test_discard_absent(self):
-        self.set.discard("d")
-        self.assertEqual(self.set, set("abc"))
-
-    def test_clear(self):
-        self.set.clear()
-        self.assertEqual(len(self.set), 0)
-
-    def test_pop(self):
-        popped = {}
-        while self.set:
-            popped[self.set.pop()] = None
-        self.assertEqual(len(popped), len(self.values))
-        for v in self.values:
-            self.assertIn(v, popped)
-
-    def test_update_empty_tuple(self):
-        self.set.update(())
-        self.assertEqual(self.set, set(self.values))
-
-    def test_update_unit_tuple_overlap(self):
-        self.set.update(("a",))
-        self.assertEqual(self.set, set(self.values))
-
-    def test_update_unit_tuple_non_overlap(self):
-        self.set.update(("a", "z"))
-        self.assertEqual(self.set, set(self.values + ["z"]))
-
-#==============================================================================
-
-class TestSubsets(unittest.TestCase):
-
-    case2method = {"<=": "issubset",
-                   ">=": "issuperset",
-                  }
-
-    reverse = {"==": "==",
-               "!=": "!=",
-               "<":  ">",
-               ">":  "<",
-               "<=": ">=",
-               ">=": "<=",
-              }
-
-    def test_issubset(self):
-        raise NotImplementedError() # eval not supported below
-        x = self.left
-        y = self.right
-        for case in "!=", "==", "<", "<=", ">", ">=":
-            expected = case in self.cases
-            # Test the binary infix spelling.
-            result = None ## eval("x" + case + "y", locals())
-            self.assertEqual(result, expected)
-            # Test the "friendly" method-name spelling, if one exists.
-            if case in TestSubsets.case2method:
-                method = getattr(x, TestSubsets.case2method[case])
-                result = method(y)
-                self.assertEqual(result, expected)
-
-            # Now do the same for the operands reversed.
-            rcase = TestSubsets.reverse[case]
-            result = None ## eval("y" + rcase + "x", locals())
-            self.assertEqual(result, expected)
-            if rcase in TestSubsets.case2method:
-                method = getattr(y, TestSubsets.case2method[rcase])
-                result = method(x)
-                self.assertEqual(result, expected)
-#------------------------------------------------------------------------------
-
-class TestSubsetEqualEmpty(TestSubsets):
-    left  = set() # type: Any
-    right = set() # type: Any
-    name  = "both empty"
-    cases = "==", "<=", ">="
-
-#------------------------------------------------------------------------------
-
-class TestSubsetEqualNonEmpty(TestSubsets):
-    left  = set([1, 2])
-    right = set([1, 2])
-    name  = "equal pair"
-    cases = "==", "<=", ">="
-
-#------------------------------------------------------------------------------
-
-class TestSubsetEmptyNonEmpty(TestSubsets):
-    left  = set() # type: Any
-    right = set([1, 2])
-    name  = "one empty, one non-empty"
-    cases = "!=", "<", "<="
-
-#------------------------------------------------------------------------------
-
-class TestSubsetPartial(TestSubsets):
-    left  = set([1])
-    right = set([1, 2])
-    name  = "one a non-empty proper subset of other"
-    cases = "!=", "<", "<="
-
-#------------------------------------------------------------------------------
-
-class TestSubsetNonOverlap(TestSubsets):
-    left  = set([1])
-    right = set([2])
-    name  = "neither empty, neither contains"
-    cases = "!="
-
-#==============================================================================
-
-class TestOnlySetsInBinaryOps(unittest.TestCase):
-
-    def test_eq_ne(self):
-        # Unlike the others, this is testing that == and != *are* allowed.
-        self.assertEqual(self.other == self.set, False)
-        self.assertEqual(self.set == self.other, False)
-        self.assertEqual(self.other != self.set, True)
-        self.assertEqual(self.set != self.other, True)
-
-    def test_ge_gt_le_lt(self):
-        self.assertRaises(TypeError, lambda: self.set < self.other)
-        self.assertRaises(TypeError, lambda: self.set <= self.other)
-        self.assertRaises(TypeError, lambda: self.set > self.other)
-        self.assertRaises(TypeError, lambda: self.set >= self.other)
-
-        self.assertRaises(TypeError, lambda: self.other < self.set)
-        self.assertRaises(TypeError, lambda: self.other <= self.set)
-        self.assertRaises(TypeError, lambda: self.other > self.set)
-        self.assertRaises(TypeError, lambda: self.other >= self.set)
-
-    def test_update_operator(self):
-        try:
-            self.set |= self.other
-        except TypeError:
-            pass
-        else:
-            self.fail("expected TypeError")
-
-    def test_update(self):
-        if self.otherIsIterable:
-            self.set.update(self.other)
-        else:
-            self.assertRaises(TypeError, self.set.update, self.other)
-
-    def test_union(self):
-        self.assertRaises(TypeError, lambda: self.set | self.other)
-        self.assertRaises(TypeError, lambda: self.other | self.set)
-        if self.otherIsIterable:
-            self.set.union(self.other)
-        else:
-            self.assertRaises(TypeError, self.set.union, self.other)
-
-    def test_intersection_update_operator(self):
-        try:
-            self.set &= self.other
-        except TypeError:
-            pass
-        else:
-            self.fail("expected TypeError")
-
-    def test_intersection_update(self):
-        if self.otherIsIterable:
-            self.set.intersection_update(self.other)
-        else:
-            self.assertRaises(TypeError,
-                              self.set.intersection_update,
-                              self.other)
-
-    def test_intersection(self):
-        self.assertRaises(TypeError, lambda: self.set & self.other)
-        self.assertRaises(TypeError, lambda: self.other & self.set)
-        if self.otherIsIterable:
-            self.set.intersection(self.other)
-        else:
-            self.assertRaises(TypeError, self.set.intersection, self.other)
-
-    def test_sym_difference_update_operator(self):
-        try:
-            self.set ^= self.other
-        except TypeError:
-            pass
-        else:
-            self.fail("expected TypeError")
-
-    def test_sym_difference_update(self):
-        if self.otherIsIterable:
-            self.set.symmetric_difference_update(self.other)
-        else:
-            self.assertRaises(TypeError,
-                              self.set.symmetric_difference_update,
-                              self.other)
-
-    def test_sym_difference(self):
-        self.assertRaises(TypeError, lambda: self.set ^ self.other)
-        self.assertRaises(TypeError, lambda: self.other ^ self.set)
-        if self.otherIsIterable:
-            self.set.symmetric_difference(self.other)
-        else:
-            self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
-
-    def test_difference_update_operator(self):
-        try:
-            self.set -= self.other
-        except TypeError:
-            pass
-        else:
-            self.fail("expected TypeError")
-
-    def test_difference_update(self):
-        if self.otherIsIterable:
-            self.set.difference_update(self.other)
-        else:
-            self.assertRaises(TypeError,
-                              self.set.difference_update,
-                              self.other)
-
-    def test_difference(self):
-        self.assertRaises(TypeError, lambda: self.set - self.other)
-        self.assertRaises(TypeError, lambda: self.other - self.set)
-        if self.otherIsIterable:
-            self.set.difference(self.other)
-        else:
-            self.assertRaises(TypeError, self.set.difference, self.other)
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
-    def setUp(self):
-        self.set   = set((1, 2, 3))
-        self.other = 19
-        self.otherIsIterable = False
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsDict(TestOnlySetsInBinaryOps):
-    def setUp(self):
-        self.set   = set((1, 2, 3))
-        self.other = {1:2, 3:4}
-        self.otherIsIterable = True
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
-    def setUp(self):
-        self.set   = set((1, 2, 3))
-        self.other = operator.add
-        self.otherIsIterable = False
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
-    def setUp(self):
-        self.set   = set((1, 2, 3))
-        self.other = (2, 4, 6)
-        self.otherIsIterable = True
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsString(TestOnlySetsInBinaryOps):
-    def setUp(self):
-        self.set   = set((1, 2, 3))
-        self.other = 'abc'
-        self.otherIsIterable = True
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
-    def setUp(self):
-        def gen():
-            for i in range(0, 10, 2):
-                yield i
-        self.set   = set((1, 2, 3))
-        self.other = gen()
-        self.otherIsIterable = True
-
-#==============================================================================
-
-class TestCopying(unittest.TestCase):
-
-    def test_copy(self):
-        dup = self.set.copy()
-        dup_list = sorted(dup, key=repr)
-        set_list = sorted(self.set, key=repr)
-        self.assertEqual(len(dup_list), len(set_list))
-        for i in range(len(dup_list)):
-            self.assertTrue(dup_list[i] is set_list[i])
-
-    def test_deep_copy(self):
-        dup = copy.deepcopy(self.set)
-        ##print type(dup), repr(dup)
-        dup_list = sorted(dup, key=repr)
-        set_list = sorted(self.set, key=repr)
-        self.assertEqual(len(dup_list), len(set_list))
-        for i in range(len(dup_list)):
-            self.assertEqual(dup_list[i], set_list[i])
-
-#------------------------------------------------------------------------------
-
-class TestCopyingEmpty(TestCopying):
-    def setUp(self):
-        self.set = set()
-
-#------------------------------------------------------------------------------
-
-class TestCopyingSingleton(TestCopying):
-    def setUp(self):
-        self.set = set(["hello"])
-
-#------------------------------------------------------------------------------
-
-class TestCopyingTriple(TestCopying):
-    def setUp(self):
-        self.set = set(["zero", 0, None])
-
-#------------------------------------------------------------------------------
-
-class TestCopyingTuple(TestCopying):
-    def setUp(self):
-        self.set = set([(1, 2)])
-
-#------------------------------------------------------------------------------
-
-class TestCopyingNested(TestCopying):
-    def setUp(self):
-        self.set = set([((1, 2), (3, 4))])
-
-#==============================================================================
-
-class TestIdentities(unittest.TestCase):
-    def setUp(self):
-        self.a = set('abracadabra')
-        self.b = set('alacazam')
-
-    def test_binopsVsSubsets(self):
-        a, b = self.a, self.b
-        self.assertTrue(a - b < a)
-        self.assertTrue(b - a < b)
-        self.assertTrue(a & b < a)
-        self.assertTrue(a & b < b)
-        self.assertTrue(a | b > a)
-        self.assertTrue(a | b > b)
-        self.assertTrue(a ^ b < a | b)
-
-    def test_commutativity(self):
-        a, b = self.a, self.b
-        self.assertEqual(a&b, b&a)
-        self.assertEqual(a|b, b|a)
-        self.assertEqual(a^b, b^a)
-        if a != b:
-            self.assertNotEqual(a-b, b-a)
-
-    def test_summations(self):
-        # check that sums of parts equal the whole
-        a, b = self.a, self.b
-        self.assertEqual((a-b)|(a&b)|(b-a), a|b)
-        self.assertEqual((a&b)|(a^b), a|b)
-        self.assertEqual(a|(b-a), a|b)
-        self.assertEqual((a-b)|b, a|b)
-        self.assertEqual((a-b)|(a&b), a)
-        self.assertEqual((b-a)|(a&b), b)
-        self.assertEqual((a-b)|(b-a), a^b)
-
-    def test_exclusion(self):
-        # check that inverse operations show non-overlap
-        a, b, zero = self.a, self.b, set()
-        self.assertEqual((a-b)&b, zero)
-        self.assertEqual((b-a)&a, zero)
-        self.assertEqual((a&b)&(a^b), zero)
-
-# Tests derived from test_itertools.py =======================================
-
-def R(seqn):
-    'Regular generator'
-    for i in seqn:
-        yield i
-
-class G:
-    'Sequence using __getitem__'
-    def __init__(self, seqn):
-        self.seqn = seqn
-    def __getitem__(self, i):
-        return self.seqn[i]
-
-class I:
-    'Sequence using iterator protocol'
-    def __init__(self, seqn):
-        self.seqn = seqn
-        self.i = 0
-    def __iter__(self):
-        return self
-    def __next__(self):
-        if self.i >= len(self.seqn): raise StopIteration
-        v = self.seqn[self.i]
-        self.i += 1
-        return v
-
-class Ig:
-    'Sequence using iterator protocol defined with a generator'
-    def __init__(self, seqn):
-        self.seqn = seqn
-        self.i = 0
-    def __iter__(self):
-        for val in self.seqn:
-            yield val
-
-class X:
-    'Missing __getitem__ and __iter__'
-    def __init__(self, seqn):
-        self.seqn = seqn
-        self.i = 0
-    def __next__(self):
-        if self.i >= len(self.seqn): raise StopIteration
-        v = self.seqn[self.i]
-        self.i += 1
-        return v
-
-class N:
-    'Iterator missing __next__()'
-    def __init__(self, seqn):
-        self.seqn = seqn
-        self.i = 0
-    def __iter__(self):
-        return self
-
-class E:
-    'Test propagation of exceptions'
-    def __init__(self, seqn):
-        self.seqn = seqn
-        self.i = 0
-    def __iter__(self):
-        return self
-    def __next__(self):
-        3 // 0
-
-class S:
-    'Test immediate stop'
-    def __init__(self, seqn):
-        pass
-    def __iter__(self):
-        return self
-    def __next__(self):
-        raise StopIteration
-
-from itertools import chain
-def L(seqn):
-    'Test multiple tiers of iterators'
-    return chain(map(lambda x:x, R(Ig(G(seqn)))))
-
-class TestVariousIteratorArgs(unittest.TestCase):
-
-    def test_constructor(self):
-        for cons in (set, frozenset):
-            for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
-                for g in (G, I, Ig, S, L, R):
-                    self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
-                self.assertRaises(TypeError, cons , X(s))
-                self.assertRaises(TypeError, cons , N(s))
-                self.assertRaises(ZeroDivisionError, cons , E(s))
-
-    def test_inline_methods(self):
-        s = set('november')
-        for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
-            for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
-                for g in (G, I, Ig, L, R):
-                    expected = meth(data)
-                    actual = meth(G(data))
-                    if isinstance(expected, bool):
-                        self.assertEqual(actual, expected)
-                    else:
-                        self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
-                self.assertRaises(TypeError, meth, X(s))
-                self.assertRaises(TypeError, meth, N(s))
-                self.assertRaises(ZeroDivisionError, meth, E(s))
-
-    def test_inplace_methods(self):
-        for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
-            for methname in ('update', 'intersection_update',
-                             'difference_update', 'symmetric_difference_update'):
-                for g in (G, I, Ig, S, L, R):
-                    s = set('january')
-                    t = s.copy()
-                    getattr(s, methname)(list(g(data)))
-                    getattr(t, methname)(g(data))
-                    self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
-
-                self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
-                self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
-                self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
-
-be_bad = set2 = dict2 = None  # type: Any
-
-class bad_eq:
-    def __eq__(self, other):
-        if be_bad:
-            set2.clear()
-            raise ZeroDivisionError
-        return self is other
-    def __hash__(self):
-        return 0
-
-class bad_dict_clear:
-    def __eq__(self, other):
-        if be_bad:
-            dict2.clear()
-        return self is other
-    def __hash__(self):
-        return 0
-
-class TestWeirdBugs(unittest.TestCase):
-    def test_8420_set_merge(self):
-        # This used to segfault
-        global be_bad, set2, dict2
-        be_bad = False
-        set1 = {bad_eq()}
-        set2 = {bad_eq() for i in range(75)}
-        be_bad = True
-        self.assertRaises(ZeroDivisionError, set1.update, set2)
-
-        be_bad = False
-        set1 = {bad_dict_clear()}
-        dict2 = {bad_dict_clear(): None}
-        be_bad = True
-        set1.symmetric_difference_update(dict2)
-
-# Application tests (based on David Eppstein's graph recipes ====================================
-
-def powerset(U):
-    """Generates all subsets of a set or sequence U."""
-    U = iter(U)
-    try:
-        x = frozenset([next(U)])
-        for S in powerset(U):
-            yield S
-            yield S | x
-    except StopIteration:
-        yield frozenset()
-
-def cube(n):
-    """Graph of n-dimensional hypercube."""
-    singletons = [frozenset([x]) for x in range(n)]
-    return dict([(x, frozenset([x^s for s in singletons]))
-                 for x in powerset(range(n))])
-
-def linegraph(G):
-    """Graph, the vertices of which are edges of G,
-    with two vertices being adjacent iff the corresponding
-    edges share a vertex."""
-    L = {}
-    for x in G:
-        for y in G[x]:
-            nx = [frozenset([x,z]) for z in G[x] if z != y]
-            ny = [frozenset([y,z]) for z in G[y] if z != x]
-            L[frozenset([x,y])] = frozenset(nx+ny)
-    return L
-
-def faces(G):
-    'Return a set of faces in G.  Where a face is a set of vertices on that face'
-    # currently limited to triangles,squares, and pentagons
-    f = set()
-    for v1, edges in G.items():
-        for v2 in edges:
-            for v3 in G[v2]:
-                if v1 == v3:
-                    continue
-                if v1 in G[v3]:
-                    f.add(frozenset([v1, v2, v3]))
-                else:
-                    for v4 in G[v3]:
-                        if v4 == v2:
-                            continue
-                        if v1 in G[v4]:
-                            f.add(frozenset([v1, v2, v3, v4]))
-                        else:
-                            for v5 in G[v4]:
-                                if v5 == v3 or v5 == v2:
-                                    continue
-                                if v1 in G[v5]:
-                                    f.add(frozenset([v1, v2, v3, v4, v5]))
-    return f
-
-
-class TestGraphs(unittest.TestCase):
-
-    def test_cube(self):
-
-        g = cube(3)                             # vert --> {v1, v2, v3}
-        vertices1 = set(g)
-        self.assertEqual(len(vertices1), 8)     # eight vertices
-        for edge in g.values():
-            self.assertEqual(len(edge), 3)      # each vertex connects to three edges
-        vertices2 = set()
-        for edges in g.values():
-            for v in edges:
-                vertices2.add(v)
-        self.assertEqual(vertices1, vertices2)  # edge vertices in original set
-
-        cubefaces = faces(g)
-        self.assertEqual(len(cubefaces), 6)     # six faces
-        for face in cubefaces:
-            self.assertEqual(len(face), 4)      # each face is a square
-
-    def test_cuboctahedron(self):
-
-        # http://en.wikipedia.org/wiki/Cuboctahedron
-        # 8 triangular faces and 6 square faces
-        # 12 indentical vertices each connecting a triangle and square
-
-        g = cube(3)
-        cuboctahedron = linegraph(g)            # V( --> {V1, V2, V3, V4}
-        self.assertEqual(len(cuboctahedron), 12)# twelve vertices
-
-        vertices = set(cuboctahedron)
-        for edges in cuboctahedron.values():
-            self.assertEqual(len(edges), 4)     # each vertex connects to four other vertices
-        othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
-        self.assertEqual(vertices, othervertices)   # edge vertices in original set
-
-        cubofaces = faces(cuboctahedron)
-        facesizes = collections.defaultdict(int)
-        for face in cubofaces:
-            facesizes[len(face)] += 1
-        self.assertEqual(facesizes[3], 8)       # eight triangular faces
-        self.assertEqual(facesizes[4], 6)       # six square faces
-
-        for vertex in cuboctahedron:
-            edge = vertex                       # Cuboctahedron vertices are edges in Cube
-            self.assertEqual(len(edge), 2)      # Two cube vertices define an edge
-            for cubevert in edge:
-                self.assertIn(cubevert, g)
-
-
-#==============================================================================
-
-def test_main(verbose=None):
-    test_classes = (
-        TestSet,
-        TestSetSubclass,
-        TestSetSubclassWithKeywordArgs,
-        TestFrozenSet,
-        TestFrozenSetSubclass,
-        TestSetOfSets,
-        TestExceptionPropagation,
-        TestBasicOpsEmpty,
-        TestBasicOpsSingleton,
-        TestBasicOpsTuple,
-        TestBasicOpsTriple,
-        TestBasicOpsString,
-        TestBasicOpsBytes,
-        TestBasicOpsMixedStringBytes,
-        TestBinaryOps,
-        TestUpdateOps,
-        TestMutate,
-        TestSubsetEqualEmpty,
-        TestSubsetEqualNonEmpty,
-        TestSubsetEmptyNonEmpty,
-        TestSubsetPartial,
-        TestSubsetNonOverlap,
-        TestOnlySetsNumeric,
-        TestOnlySetsDict,
-        TestOnlySetsOperator,
-        TestOnlySetsTuple,
-        TestOnlySetsString,
-        TestOnlySetsGenerator,
-        TestCopyingEmpty,
-        TestCopyingSingleton,
-        TestCopyingTriple,
-        TestCopyingTuple,
-        TestCopyingNested,
-        TestIdentities,
-        TestVariousIteratorArgs,
-        TestGraphs,
-        TestWeirdBugs,
-        )
-
-    support.run_unittest(*test_classes)
-
-    # verify reference counting
-    if verbose and hasattr(sys, "gettotalrefcount"):
-        import gc
-        counts = [None] * 5
-        for i in range(len(counts)):
-            support.run_unittest(*test_classes)
-            gc.collect()
-            counts[i] = sys.gettotalrefcount()
-        print(counts)
-
-if __name__ == "__main__":
-    test_main(verbose=True)
diff --git a/test-data/stdlib-samples/3.2/test/test_shutil.py b/test-data/stdlib-samples/3.2/test/test_shutil.py
deleted file mode 100644
index 32e0fd1..0000000
--- a/test-data/stdlib-samples/3.2/test/test_shutil.py
+++ /dev/null
@@ -1,978 +0,0 @@
-# Copyright (C) 2003 Python Software Foundation
-
-import unittest
-import shutil
-import tempfile
-import sys
-import stat
-import os
-import os.path
-import functools
-from test import support
-from test.support import TESTFN
-from os.path import splitdrive
-from distutils.spawn import find_executable, spawn
-from shutil import (_make_tarball, _make_zipfile, make_archive,
-                    register_archive_format, unregister_archive_format,
-                    get_archive_formats, Error, unpack_archive,
-                    register_unpack_format, RegistryError,
-                    unregister_unpack_format, get_unpack_formats)
-import tarfile
-import warnings
-
-from test import support
-from test.support import check_warnings, captured_stdout
-
-from typing import (
-    Any, Callable, Tuple, List, Sequence, BinaryIO, IO, Union, cast
-)
-from types import TracebackType
-
-import bz2
-BZ2_SUPPORTED = True
-
-TESTFN2 = TESTFN + "2"
-
-import grp
-import pwd
-UID_GID_SUPPORT = True
-
-import zlib
-
-import zipfile
-ZIP_SUPPORT = True
-
-def _fake_rename(*args: Any, **kwargs: Any) -> None:
-    # Pretend the destination path is on a different filesystem.
-    raise OSError()
-
-def mock_rename(func: Any) -> Any:
-    @functools.wraps(func)
-    def wrap(*args: Any, **kwargs: Any) -> Any:
-        try:
-            builtin_rename = shutil.rename
-            shutil.rename = cast(Any, _fake_rename)
-            return func(*args, **kwargs)
-        finally:
-            shutil.rename = cast(Any, builtin_rename)
-    return wrap
-
-class TestShutil(unittest.TestCase):
-
-    def setUp(self) -> None:
-        super().setUp()
-        self.tempdirs = []  # type: List[str]
-
-    def tearDown(self) -> None:
-        super().tearDown()
-        while self.tempdirs:
-            d = self.tempdirs.pop()
-            shutil.rmtree(d, os.name in ('nt', 'cygwin'))
-
-    def write_file(self, path: Union[str, List[str], tuple], content: str = 'xxx') -> None:
-        """Writes a file in the given path.
-
-
-        path can be a string or a sequence.
-        """
-        if isinstance(path, list):
-            path = os.path.join(*path)
-        elif isinstance(path, tuple):
-            path = cast(str, os.path.join(*path))
-        f = open(path, 'w')
-        try:
-            f.write(content)
-        finally:
-            f.close()
-
-    def mkdtemp(self) -> str:
-        """Create a temporary directory that will be cleaned up.
-
-        Returns the path of the directory.
-        """
-        d = tempfile.mkdtemp()
-        self.tempdirs.append(d)
-        return d
-
-    def test_rmtree_errors(self) -> None:
-        # filename is guaranteed not to exist
-        filename = tempfile.mktemp()
-        self.assertRaises(OSError, shutil.rmtree, filename)
-
-    # See bug #1071513 for why we don't run this on cygwin
-    # and bug #1076467 for why we don't run this as root.
-    if (hasattr(os, 'chmod') and sys.platform[:6] != 'cygwin'
-        and not (hasattr(os, 'geteuid') and os.geteuid() == 0)):
-        def test_on_error(self) -> None:
-            self.errorState = 0
-            os.mkdir(TESTFN)
-            self.childpath = os.path.join(TESTFN, 'a')
-            f = open(self.childpath, 'w')
-            f.close()
-            old_dir_mode = os.stat(TESTFN).st_mode
-            old_child_mode = os.stat(self.childpath).st_mode
-            # Make unwritable.
-            os.chmod(self.childpath, stat.S_IREAD)
-            os.chmod(TESTFN, stat.S_IREAD)
-
-            shutil.rmtree(TESTFN, onerror=self.check_args_to_onerror)
-            # Test whether onerror has actually been called.
-            self.assertEqual(self.errorState, 2,
-                             "Expected call to onerror function did not happen.")
-
-            # Make writable again.
-            os.chmod(TESTFN, old_dir_mode)
-            os.chmod(self.childpath, old_child_mode)
-
-            # Clean up.
-            shutil.rmtree(TESTFN)
-
-    def check_args_to_onerror(self, func: Callable[[str], Any], arg: str,
-                              exc: Tuple[type, BaseException,
-                                         TracebackType]) -> None:
-        # test_rmtree_errors deliberately runs rmtree
-        # on a directory that is chmod 400, which will fail.
-        # This function is run when shutil.rmtree fails.
-        # 99.9% of the time it initially fails to remove
-        # a file in the directory, so the first time through
-        # func is os.remove.
-        # However, some Linux machines running ZFS on
-        # FUSE experienced a failure earlier in the process
-        # at os.listdir.  The first failure may legally
-        # be either.
-        if self.errorState == 0:
-            if func is os.remove:
-                self.assertEqual(arg, self.childpath)
-            else:
-                self.assertIs(func, os.listdir,
-                              "func must be either os.remove or os.listdir")
-                self.assertEqual(arg, TESTFN)
-            self.assertTrue(issubclass(exc[0], OSError))
-            self.errorState = 1
-        else:
-            self.assertEqual(func, os.rmdir)
-            self.assertEqual(arg, TESTFN)
-            self.assertTrue(issubclass(exc[0], OSError))
-            self.errorState = 2
-
-    def test_rmtree_dont_delete_file(self) -> None:
-        # When called on a file instead of a directory, don't delete it.
-        handle, path = tempfile.mkstemp()
-        os.fdopen(handle).close()
-        self.assertRaises(OSError, shutil.rmtree, path)
-        os.remove(path)
-
-    def _write_data(self, path: str, data: str) -> None:
-        f = open(path, "w")
-        f.write(data)
-        f.close()
-
-    def test_copytree_simple(self) -> None:
-
-        def read_data(path: str) -> str:
-            f = open(path)
-            data = f.read()
-            f.close()
-            return data
-
-        src_dir = tempfile.mkdtemp()
-        dst_dir = os.path.join(tempfile.mkdtemp(), 'destination')
-        self._write_data(os.path.join(src_dir, 'test.txt'), '123')
-        os.mkdir(os.path.join(src_dir, 'test_dir'))
-        self._write_data(os.path.join(src_dir, 'test_dir', 'test.txt'), '456')
-
-        try:
-            shutil.copytree(src_dir, dst_dir)
-            self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test.txt')))
-            self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'test_dir')))
-            self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test_dir',
-                                                        'test.txt')))
-            actual = read_data(os.path.join(dst_dir, 'test.txt'))
-            self.assertEqual(actual, '123')
-            actual = read_data(os.path.join(dst_dir, 'test_dir', 'test.txt'))
-            self.assertEqual(actual, '456')
-        finally:
-            for path in (
-                    os.path.join(src_dir, 'test.txt'),
-                    os.path.join(dst_dir, 'test.txt'),
-                    os.path.join(src_dir, 'test_dir', 'test.txt'),
-                    os.path.join(dst_dir, 'test_dir', 'test.txt'),
-                ):
-                if os.path.exists(path):
-                    os.remove(path)
-            for path in (src_dir,
-                    os.path.dirname(dst_dir)
-                ):
-                if os.path.exists(path):
-                    shutil.rmtree(path)
-
-    def test_copytree_with_exclude(self) -> None:
-
-        def read_data(path: str) -> str:
-            f = open(path)
-            data = f.read()
-            f.close()
-            return data
-
-        # creating data
-        join = os.path.join
-        exists = os.path.exists
-        src_dir = tempfile.mkdtemp()
-        try:
-            dst_dir = join(tempfile.mkdtemp(), 'destination')
-            self._write_data(join(src_dir, 'test.txt'), '123')
-            self._write_data(join(src_dir, 'test.tmp'), '123')
-            os.mkdir(join(src_dir, 'test_dir'))
-            self._write_data(join(src_dir, 'test_dir', 'test.txt'), '456')
-            os.mkdir(join(src_dir, 'test_dir2'))
-            self._write_data(join(src_dir, 'test_dir2', 'test.txt'), '456')
-            os.mkdir(join(src_dir, 'test_dir2', 'subdir'))
-            os.mkdir(join(src_dir, 'test_dir2', 'subdir2'))
-            self._write_data(join(src_dir, 'test_dir2', 'subdir', 'test.txt'),
-                             '456')
-            self._write_data(join(src_dir, 'test_dir2', 'subdir2', 'test.py'),
-                             '456')
-
-
-            # testing glob-like patterns
-            try:
-                patterns = shutil.ignore_patterns('*.tmp', 'test_dir2')
-                shutil.copytree(src_dir, dst_dir, ignore=patterns)
-                # checking the result: some elements should not be copied
-                self.assertTrue(exists(join(dst_dir, 'test.txt')))
-                self.assertTrue(not exists(join(dst_dir, 'test.tmp')))
-                self.assertTrue(not exists(join(dst_dir, 'test_dir2')))
-            finally:
-                if os.path.exists(dst_dir):
-                    shutil.rmtree(dst_dir)
-            try:
-                patterns = shutil.ignore_patterns('*.tmp', 'subdir*')
-                shutil.copytree(src_dir, dst_dir, ignore=patterns)
-                # checking the result: some elements should not be copied
-                self.assertTrue(not exists(join(dst_dir, 'test.tmp')))
-                self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir2')))
-                self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir')))
-            finally:
-                if os.path.exists(dst_dir):
-                    shutil.rmtree(dst_dir)
-
-            # testing callable-style
-            try:
-                def _filter(src: str, names: Sequence[str]) -> List[str]:
-                    res = []  # type: List[str]
-                    for name in names:
-                        path = os.path.join(src, name)
-
-                        if (os.path.isdir(path) and
-                            path.split()[-1] == 'subdir'):
-                            res.append(name)
-                        elif os.path.splitext(path)[-1] in ('.py'):
-                            res.append(name)
-                    return res
-
-                shutil.copytree(src_dir, dst_dir, ignore=_filter)
-
-                # checking the result: some elements should not be copied
-                self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir2',
-                                        'test.py')))
-                self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir')))
-
-            finally:
-                if os.path.exists(dst_dir):
-                    shutil.rmtree(dst_dir)
-        finally:
-            shutil.rmtree(src_dir)
-            shutil.rmtree(os.path.dirname(dst_dir))
-
-    @unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
-    def test_dont_copy_file_onto_link_to_itself(self) -> None:
-        # Temporarily disable test on Windows.
-        if os.name == 'nt':
-            return
-        # bug 851123.
-        os.mkdir(TESTFN)
-        src = os.path.join(TESTFN, 'cheese')
-        dst = os.path.join(TESTFN, 'shop')
-        try:
-            with open(src, 'w') as f:
-                f.write('cheddar')
-            os.link(src, dst)
-            self.assertRaises(shutil.Error, shutil.copyfile, src, dst)
-            with open(src, 'r') as f:
-                self.assertEqual(f.read(), 'cheddar')
-            os.remove(dst)
-        finally:
-            shutil.rmtree(TESTFN, ignore_errors=True)
-
-    @support.skip_unless_symlink
-    def test_dont_copy_file_onto_symlink_to_itself(self) -> None:
-        # bug 851123.
-        os.mkdir(TESTFN)
-        src = os.path.join(TESTFN, 'cheese')
-        dst = os.path.join(TESTFN, 'shop')
-        try:
-            with open(src, 'w') as f:
-                f.write('cheddar')
-            # Using `src` here would mean we end up with a symlink pointing
-            # to TESTFN/TESTFN/cheese, while it should point at
-            # TESTFN/cheese.
-            os.symlink('cheese', dst)
-            self.assertRaises(shutil.Error, shutil.copyfile, src, dst)
-            with open(src, 'r') as f:
-                self.assertEqual(f.read(), 'cheddar')
-            os.remove(dst)
-        finally:
-            shutil.rmtree(TESTFN, ignore_errors=True)
-
-    @support.skip_unless_symlink
-    def test_rmtree_on_symlink(self) -> None:
-        # bug 1669.
-        os.mkdir(TESTFN)
-        try:
-            src = os.path.join(TESTFN, 'cheese')
-            dst = os.path.join(TESTFN, 'shop')
-            os.mkdir(src)
-            os.symlink(src, dst)
-            self.assertRaises(OSError, shutil.rmtree, dst)
-        finally:
-            shutil.rmtree(TESTFN, ignore_errors=True)
-
-    if hasattr(os, "mkfifo"):
-        # Issue #3002: copyfile and copytree block indefinitely on named pipes
-        def test_copyfile_named_pipe(self) -> None:
-            os.mkfifo(TESTFN)
-            try:
-                self.assertRaises(shutil.SpecialFileError,
-                                  shutil.copyfile, TESTFN, TESTFN2)
-                self.assertRaises(shutil.SpecialFileError,
-                                  shutil.copyfile, __file__, TESTFN)
-            finally:
-                os.remove(TESTFN)
-
-        @support.skip_unless_symlink
-        def test_copytree_named_pipe(self) -> None:
-            os.mkdir(TESTFN)
-            try:
-                subdir = os.path.join(TESTFN, "subdir")
-                os.mkdir(subdir)
-                pipe = os.path.join(subdir, "mypipe")
-                os.mkfifo(pipe)
-                try:
-                    shutil.copytree(TESTFN, TESTFN2)
-                except shutil.Error as e:
-                    errors = e.args[0]
-                    self.assertEqual(len(errors), 1)
-                    src, dst, error_msg = errors[0]
-                    self.assertEqual("`%s` is a named pipe" % pipe, error_msg)
-                else:
-                    self.fail("shutil.Error should have been raised")
-            finally:
-                shutil.rmtree(TESTFN, ignore_errors=True)
-                shutil.rmtree(TESTFN2, ignore_errors=True)
-
-    def test_copytree_special_func(self) -> None:
-
-        src_dir = self.mkdtemp()
-        dst_dir = os.path.join(self.mkdtemp(), 'destination')
-        self._write_data(os.path.join(src_dir, 'test.txt'), '123')
-        os.mkdir(os.path.join(src_dir, 'test_dir'))
-        self._write_data(os.path.join(src_dir, 'test_dir', 'test.txt'), '456')
-
-        copied = []  # type: List[Tuple[str, str]]
-        def _copy(src: str, dst: str) -> None:
-            copied.append((src, dst))
-
-        shutil.copytree(src_dir, dst_dir, copy_function=_copy)
-        self.assertEqual(len(copied), 2)
-
-    @support.skip_unless_symlink
-    def test_copytree_dangling_symlinks(self) -> None:
-
-        # a dangling symlink raises an error at the end
-        src_dir = self.mkdtemp()
-        dst_dir = os.path.join(self.mkdtemp(), 'destination')
-        os.symlink('IDONTEXIST', os.path.join(src_dir, 'test.txt'))
-        os.mkdir(os.path.join(src_dir, 'test_dir'))
-        self._write_data(os.path.join(src_dir, 'test_dir', 'test.txt'), '456')
-        self.assertRaises(Error, shutil.copytree, src_dir, dst_dir)
-
-        # a dangling symlink is ignored with the proper flag
-        dst_dir = os.path.join(self.mkdtemp(), 'destination2')
-        shutil.copytree(src_dir, dst_dir, ignore_dangling_symlinks=True)
-        self.assertNotIn('test.txt', os.listdir(dst_dir))
-
-        # a dangling symlink is copied if symlinks=True
-        dst_dir = os.path.join(self.mkdtemp(), 'destination3')
-        shutil.copytree(src_dir, dst_dir, symlinks=True)
-        self.assertIn('test.txt', os.listdir(dst_dir))
-
-    def _copy_file(self,
-                   method: Callable[[str, str], None]) -> Tuple[str, str]:
-        fname = 'test.txt'
-        tmpdir = self.mkdtemp()
-        self.write_file([tmpdir, fname])
-        file1 = os.path.join(tmpdir, fname)
-        tmpdir2 = self.mkdtemp()
-        method(file1, tmpdir2)
-        file2 = os.path.join(tmpdir2, fname)
-        return (file1, file2)
-
-    @unittest.skipUnless(hasattr(os, 'chmod'), 'requires os.chmod')
-    def test_copy(self) -> None:
-        # Ensure that the copied file exists and has the same mode bits.
-        file1, file2 = self._copy_file(shutil.copy)
-        self.assertTrue(os.path.exists(file2))
-        self.assertEqual(os.stat(file1).st_mode, os.stat(file2).st_mode)
-
-    @unittest.skipUnless(hasattr(os, 'chmod'), 'requires os.chmod')
-    @unittest.skipUnless(hasattr(os, 'utime'), 'requires os.utime')
-    def test_copy2(self) -> None:
-        # Ensure that the copied file exists and has the same mode and
-        # modification time bits.
-        file1, file2 = self._copy_file(shutil.copy2)
-        self.assertTrue(os.path.exists(file2))
-        file1_stat = os.stat(file1)
-        file2_stat = os.stat(file2)
-        self.assertEqual(file1_stat.st_mode, file2_stat.st_mode)
-        for attr in 'st_atime', 'st_mtime':
-            # The modification times may be truncated in the new file.
-            self.assertLessEqual(getattr(file1_stat, attr),
-                                 getattr(file2_stat, attr) + 1)
-        if hasattr(os, 'chflags') and hasattr(file1_stat, 'st_flags'):
-            self.assertEqual(getattr(file1_stat, 'st_flags'),
-                             getattr(file2_stat, 'st_flags'))
-
-    @unittest.skipUnless(zlib, "requires zlib")
-    def test_make_tarball(self) -> None:
-        # creating something to tar
-        tmpdir = self.mkdtemp()
-        self.write_file([tmpdir, 'file1'], 'xxx')
-        self.write_file([tmpdir, 'file2'], 'xxx')
-        os.mkdir(os.path.join(tmpdir, 'sub'))
-        self.write_file([tmpdir, 'sub', 'file3'], 'xxx')
-
-        tmpdir2 = self.mkdtemp()
-        # force shutil to create the directory
-        os.rmdir(tmpdir2)
-        unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0],
-                            "source and target should be on same drive")
-
-        base_name = os.path.join(tmpdir2, 'archive')
-
-        # working with relative paths to avoid tar warnings
-        old_dir = os.getcwd()
-        os.chdir(tmpdir)
-        try:
-            _make_tarball(splitdrive(base_name)[1], '.')
-        finally:
-            os.chdir(old_dir)
-
-        # check if the compressed tarball was created
-        tarball = base_name + '.tar.gz'
-        self.assertTrue(os.path.exists(tarball))
-
-        # trying an uncompressed one
-        base_name = os.path.join(tmpdir2, 'archive')
-        old_dir = os.getcwd()
-        os.chdir(tmpdir)
-        try:
-            _make_tarball(splitdrive(base_name)[1], '.', compress=None)
-        finally:
-            os.chdir(old_dir)
-        tarball = base_name + '.tar'
-        self.assertTrue(os.path.exists(tarball))
-
-    def _tarinfo(self, path: str) -> tuple:
-        tar = tarfile.open(path)
-        try:
-            names = tar.getnames()
-            names.sort()
-            return tuple(names)
-        finally:
-            tar.close()
-
-    def _create_files(self) -> Tuple[str, str, str]:
-        # creating something to tar
-        tmpdir = self.mkdtemp()
-        dist = os.path.join(tmpdir, 'dist')
-        os.mkdir(dist)
-        self.write_file([dist, 'file1'], 'xxx')
-        self.write_file([dist, 'file2'], 'xxx')
-        os.mkdir(os.path.join(dist, 'sub'))
-        self.write_file([dist, 'sub', 'file3'], 'xxx')
-        os.mkdir(os.path.join(dist, 'sub2'))
-        tmpdir2 = self.mkdtemp()
-        base_name = os.path.join(tmpdir2, 'archive')
-        return tmpdir, tmpdir2, base_name
-
-    @unittest.skipUnless(zlib, "Requires zlib")
-    @unittest.skipUnless(find_executable('tar') and find_executable('gzip'),
-                         'Need the tar command to run')
-    def test_tarfile_vs_tar(self) -> None:
-        tmpdir, tmpdir2, base_name =  self._create_files()
-        old_dir = os.getcwd()
-        os.chdir(tmpdir)
-        try:
-            _make_tarball(base_name, 'dist')
-        finally:
-            os.chdir(old_dir)
-
-        # check if the compressed tarball was created
-        tarball = base_name + '.tar.gz'
-        self.assertTrue(os.path.exists(tarball))
-
-        # now create another tarball using `tar`
-        tarball2 = os.path.join(tmpdir, 'archive2.tar.gz')
-        tar_cmd = ['tar', '-cf', 'archive2.tar', 'dist']
-        gzip_cmd = ['gzip', '-f9', 'archive2.tar']
-        old_dir = os.getcwd()
-        os.chdir(tmpdir)
-        try:
-            with captured_stdout() as s:
-                spawn(tar_cmd)
-                spawn(gzip_cmd)
-        finally:
-            os.chdir(old_dir)
-
-        self.assertTrue(os.path.exists(tarball2))
-        # let's compare both tarballs
-        self.assertEqual(self._tarinfo(tarball), self._tarinfo(tarball2))
-
-        # trying an uncompressed one
-        base_name = os.path.join(tmpdir2, 'archive')
-        old_dir = os.getcwd()
-        os.chdir(tmpdir)
-        try:
-            _make_tarball(base_name, 'dist', compress=None)
-        finally:
-            os.chdir(old_dir)
-        tarball = base_name + '.tar'
-        self.assertTrue(os.path.exists(tarball))
-
-        # now for a dry_run
-        base_name = os.path.join(tmpdir2, 'archive')
-        old_dir = os.getcwd()
-        os.chdir(tmpdir)
-        try:
-            _make_tarball(base_name, 'dist', compress=None, dry_run=True)
-        finally:
-            os.chdir(old_dir)
-        tarball = base_name + '.tar'
-        self.assertTrue(os.path.exists(tarball))
-
-    @unittest.skipUnless(zlib, "Requires zlib")
-    @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')
-    def test_make_zipfile(self) -> None:
-        # creating something to tar
-        tmpdir = self.mkdtemp()
-        self.write_file([tmpdir, 'file1'], 'xxx')
-        self.write_file([tmpdir, 'file2'], 'xxx')
-
-        tmpdir2 = self.mkdtemp()
-        # force shutil to create the directory
-        os.rmdir(tmpdir2)
-        base_name = os.path.join(tmpdir2, 'archive')
-        _make_zipfile(base_name, tmpdir)
-
-        # check if the compressed tarball was created
-        tarball = base_name + '.zip'
-        self.assertTrue(os.path.exists(tarball))
-
-
-    def test_make_archive(self) -> None:
-        tmpdir = self.mkdtemp()
-        base_name = os.path.join(tmpdir, 'archive')
-        self.assertRaises(ValueError, make_archive, base_name, 'xxx')
-
-    @unittest.skipUnless(zlib, "Requires zlib")
-    def test_make_archive_owner_group(self) -> None:
-        # testing make_archive with owner and group, with various combinations
-        # this works even if there's not gid/uid support
-        if UID_GID_SUPPORT:
-            group = grp.getgrgid(0).gr_name
-            owner = pwd.getpwuid(0).pw_name
-        else:
-            group = owner = 'root'
-
-        base_dir, root_dir, base_name =  self._create_files()
-        base_name = os.path.join(self.mkdtemp() , 'archive')
-        res = make_archive(base_name, 'zip', root_dir, base_dir, owner=owner,
-                           group=group)
-        self.assertTrue(os.path.exists(res))
-
-        res = make_archive(base_name, 'zip', root_dir, base_dir)
-        self.assertTrue(os.path.exists(res))
-
-        res = make_archive(base_name, 'tar', root_dir, base_dir,
-                           owner=owner, group=group)
-        self.assertTrue(os.path.exists(res))
-
-        res = make_archive(base_name, 'tar', root_dir, base_dir,
-                           owner='kjhkjhkjg', group='oihohoh')
-        self.assertTrue(os.path.exists(res))
-
-
-    @unittest.skipUnless(zlib, "Requires zlib")
-    @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
-    def test_tarfile_root_owner(self) -> None:
-        tmpdir, tmpdir2, base_name =  self._create_files()
-        old_dir = os.getcwd()
-        os.chdir(tmpdir)
-        group = grp.getgrgid(0).gr_name
-        owner = pwd.getpwuid(0).pw_name
-        try:
-            archive_name = _make_tarball(base_name, 'dist', compress=None,
-                                         owner=owner, group=group)
-        finally:
-            os.chdir(old_dir)
-
-        # check if the compressed tarball was created
-        self.assertTrue(os.path.exists(archive_name))
-
-        # now checks the rights
-        archive = tarfile.open(archive_name)
-        try:
-            for member in archive.getmembers():
-                self.assertEqual(member.uid, 0)
-                self.assertEqual(member.gid, 0)
-        finally:
-            archive.close()
-
-    def test_make_archive_cwd(self) -> None:
-        current_dir = os.getcwd()
-        def _breaks(*args: Any, **kw: Any) -> None:
-            raise RuntimeError()
-
-        register_archive_format('xxx', _breaks, [], 'xxx file')
-        try:
-            try:
-                make_archive('xxx', 'xxx', root_dir=self.mkdtemp())
-            except Exception:
-                pass
-            self.assertEqual(os.getcwd(), current_dir)
-        finally:
-            unregister_archive_format('xxx')
-
-    def test_register_archive_format(self) -> None:
-
-        self.assertRaises(TypeError, register_archive_format, 'xxx', 1)
-        self.assertRaises(TypeError, register_archive_format, 'xxx',
-                          lambda: 1/0,
-                          1)
-        self.assertRaises(TypeError, register_archive_format, 'xxx',
-                          lambda: 1/0,
-                          [(1, 2), (1, 2, 3)])
-
-        register_archive_format('xxx', lambda: 1/0, [('x', 2)], 'xxx file')
-        formats = [name for name, params in get_archive_formats()]
-        self.assertIn('xxx', formats)
-
-        unregister_archive_format('xxx')
-        formats = [name for name, params in get_archive_formats()]
-        self.assertNotIn('xxx', formats)
-
-    def _compare_dirs(self, dir1: str, dir2: str) -> List[str]:
-        # check that dir1 and dir2 are equivalent,
-        # return the diff
-        diff = []  # type: List[str]
-        for root, dirs, files in os.walk(dir1):
-            for file_ in files:
-                path = os.path.join(root, file_)
-                target_path = os.path.join(dir2, os.path.split(path)[-1])
-                if not os.path.exists(target_path):
-                    diff.append(file_)
-        return diff
-
-    @unittest.skipUnless(zlib, "Requires zlib")
-    def test_unpack_archive(self) -> None:
-        formats = ['tar', 'gztar', 'zip']
-        if BZ2_SUPPORTED:
-            formats.append('bztar')
-
-        for format in formats:
-            tmpdir = self.mkdtemp()
-            base_dir, root_dir, base_name =  self._create_files()
-            tmpdir2 = self.mkdtemp()
-            filename = make_archive(base_name, format, root_dir, base_dir)
-
-            # let's try to unpack it now
-            unpack_archive(filename, tmpdir2)
-            diff = self._compare_dirs(tmpdir, tmpdir2)
-            self.assertEqual(diff, [])
-
-            # and again, this time with the format specified
-            tmpdir3 = self.mkdtemp()
-            unpack_archive(filename, tmpdir3, format=format)
-            diff = self._compare_dirs(tmpdir, tmpdir3)
-            self.assertEqual(diff, [])
-        self.assertRaises(shutil.ReadError, unpack_archive, TESTFN)
-        self.assertRaises(ValueError, unpack_archive, TESTFN, format='xxx')
-
-    def test_unpack_registery(self) -> None:
-
-        formats = get_unpack_formats()
-
-        def _boo(filename: str, extract_dir: str, extra: int) -> None:
-            self.assertEqual(extra, 1)
-            self.assertEqual(filename, 'stuff.boo')
-            self.assertEqual(extract_dir, 'xx')
-
-        register_unpack_format('Boo', ['.boo', '.b2'], _boo, [('extra', 1)])
-        unpack_archive('stuff.boo', 'xx')
-
-        # trying to register a .boo unpacker again
-        self.assertRaises(RegistryError, register_unpack_format, 'Boo2',
-                          ['.boo'], _boo)
-
-        # should work now
-        unregister_unpack_format('Boo')
-        register_unpack_format('Boo2', ['.boo'], _boo)
-        self.assertIn(('Boo2', ['.boo'], ''), get_unpack_formats())
-        self.assertNotIn(('Boo', ['.boo'], ''), get_unpack_formats())
-
-        # let's leave a clean state
-        unregister_unpack_format('Boo2')
-        self.assertEqual(get_unpack_formats(), formats)
-
-
-class TestMove(unittest.TestCase):
-
-    def setUp(self) -> None:
-        filename = "foo"
-        self.src_dir = tempfile.mkdtemp()
-        self.dst_dir = tempfile.mkdtemp()
-        self.src_file = os.path.join(self.src_dir, filename)
-        self.dst_file = os.path.join(self.dst_dir, filename)
-        with open(self.src_file, "wb") as f:
-            f.write(b"spam")
-
-    def tearDown(self) -> None:
-        for d in (self.src_dir, self.dst_dir):
-            try:
-                if d:
-                    shutil.rmtree(d)
-            except:
-                pass
-
-    def _check_move_file(self, src: str, dst: str, real_dst: str) -> None:
-        with open(src, "rb") as f:
-            contents = f.read()
-        shutil.move(src, dst)
-        with open(real_dst, "rb") as f:
-            self.assertEqual(contents, f.read())
-        self.assertFalse(os.path.exists(src))
-
-    def _check_move_dir(self, src: str, dst: str, real_dst: str) -> None:
-        contents = sorted(os.listdir(src))
-        shutil.move(src, dst)
-        self.assertEqual(contents, sorted(os.listdir(real_dst)))
-        self.assertFalse(os.path.exists(src))
-
-    def test_move_file(self) -> None:
-        # Move a file to another location on the same filesystem.
-        self._check_move_file(self.src_file, self.dst_file, self.dst_file)
-
-    def test_move_file_to_dir(self) -> None:
-        # Move a file inside an existing dir on the same filesystem.
-        self._check_move_file(self.src_file, self.dst_dir, self.dst_file)
-
-    @mock_rename
-    def test_move_file_other_fs(self) -> None:
-        # Move a file to an existing dir on another filesystem.
-        self.test_move_file()
-
-    @mock_rename
-    def test_move_file_to_dir_other_fs(self) -> None:
-        # Move a file to another location on another filesystem.
-        self.test_move_file_to_dir()
-
-    def test_move_dir(self) -> None:
-        # Move a dir to another location on the same filesystem.
-        dst_dir = tempfile.mktemp()
-        try:
-            self._check_move_dir(self.src_dir, dst_dir, dst_dir)
-        finally:
-            try:
-                shutil.rmtree(dst_dir)
-            except:
-                pass
-
-    @mock_rename
-    def test_move_dir_other_fs(self) -> None:
-        # Move a dir to another location on another filesystem.
-        self.test_move_dir()
-
-    def test_move_dir_to_dir(self) -> None:
-        # Move a dir inside an existing dir on the same filesystem.
-        self._check_move_dir(self.src_dir, self.dst_dir,
-            os.path.join(self.dst_dir, os.path.basename(self.src_dir)))
-
-    @mock_rename
-    def test_move_dir_to_dir_other_fs(self) -> None:
-        # Move a dir inside an existing dir on another filesystem.
-        self.test_move_dir_to_dir()
-
-    def test_existing_file_inside_dest_dir(self) -> None:
-        # A file with the same name inside the destination dir already exists.
-        with open(self.dst_file, "wb"):
-            pass
-        self.assertRaises(shutil.Error, shutil.move, self.src_file, self.dst_dir)
-
-    def test_dont_move_dir_in_itself(self) -> None:
-        # Moving a dir inside itself raises an Error.
-        dst = os.path.join(self.src_dir, "bar")
-        self.assertRaises(shutil.Error, shutil.move, self.src_dir, dst)
-
-    def test_destinsrc_false_negative(self) -> None:
-        os.mkdir(TESTFN)
-        try:
-            for src, dst in [('srcdir', 'srcdir/dest')]:
-                src = os.path.join(TESTFN, src)
-                dst = os.path.join(TESTFN, dst)
-                self.assertTrue(shutil._destinsrc(src, dst),
-                             msg='_destinsrc() wrongly concluded that '
-                             'dst (%s) is not in src (%s)' % (dst, src))
-        finally:
-            shutil.rmtree(TESTFN, ignore_errors=True)
-
-    def test_destinsrc_false_positive(self) -> None:
-        os.mkdir(TESTFN)
-        try:
-            for src, dst in [('srcdir', 'src/dest'), ('srcdir', 'srcdir.new')]:
-                src = os.path.join(TESTFN, src)
-                dst = os.path.join(TESTFN, dst)
-                self.assertFalse(shutil._destinsrc(src, dst),
-                            msg='_destinsrc() wrongly concluded that '
-                            'dst (%s) is in src (%s)' % (dst, src))
-        finally:
-            shutil.rmtree(TESTFN, ignore_errors=True)
-
-
-class TestCopyFile(unittest.TestCase):
-
-    _delete = False
-
-    class Faux(object):
-        _entered = False
-        _exited_with = None # type: tuple
-        _raised = False
-        def __init__(self, raise_in_exit: bool = False,
-                     suppress_at_exit: bool = True) -> None:
-            self._raise_in_exit = raise_in_exit
-            self._suppress_at_exit = suppress_at_exit
-        def read(self, *args: Any) -> str:
-            return ''
-        def __enter__(self) -> None:
-            self._entered = True
-        def __exit__(self, exc_type: type, exc_val: BaseException,
-                     exc_tb: TracebackType) -> bool:
-            self._exited_with = exc_type, exc_val, exc_tb
-            if self._raise_in_exit:
-                self._raised = True
-                raise IOError("Cannot close")
-            return self._suppress_at_exit
-
-    def tearDown(self) -> None:
-        shutil.open = open
-
-    def _set_shutil_open(self, func: Any) -> None:
-        shutil.open = func
-        self._delete = True
-
-    def test_w_source_open_fails(self) -> None:
-        def _open(filename: str, mode: str= 'r') -> BinaryIO:
-            if filename == 'srcfile':
-                raise IOError('Cannot open "srcfile"')
-            assert 0  # shouldn't reach here.
-
-        self._set_shutil_open(_open)
-
-        self.assertRaises(IOError, shutil.copyfile, 'srcfile', 'destfile')
-
-    def test_w_dest_open_fails(self) -> None:
-
-        srcfile = TestCopyFile.Faux()
-
-        def _open(filename: str, mode: str = 'r') -> TestCopyFile.Faux:
-            if filename == 'srcfile':
-                return srcfile
-            if filename == 'destfile':
-                raise IOError('Cannot open "destfile"')
-            assert 0  # shouldn't reach here.
-
-        self._set_shutil_open(_open)
-
-        shutil.copyfile('srcfile', 'destfile')
-        self.assertTrue(srcfile._entered)
-        self.assertTrue(srcfile._exited_with[0] is IOError)
-        self.assertEqual(srcfile._exited_with[1].args,
-                         ('Cannot open "destfile"',))
-
-    def test_w_dest_close_fails(self) -> None:
-
-        srcfile = TestCopyFile.Faux()
-        destfile = TestCopyFile.Faux(True)
-
-        def _open(filename: str, mode: str = 'r') -> TestCopyFile.Faux:
-            if filename == 'srcfile':
-                return srcfile
-            if filename == 'destfile':
-                return destfile
-            assert 0  # shouldn't reach here.
-
-        self._set_shutil_open(_open)
-
-        shutil.copyfile('srcfile', 'destfile')
-        self.assertTrue(srcfile._entered)
-        self.assertTrue(destfile._entered)
-        self.assertTrue(destfile._raised)
-        self.assertTrue(srcfile._exited_with[0] is IOError)
-        self.assertEqual(srcfile._exited_with[1].args,
-                         ('Cannot close',))
-
-    def test_w_source_close_fails(self) -> None:
-
-        srcfile = TestCopyFile.Faux(True)
-        destfile = TestCopyFile.Faux()
-
-        def _open(filename: str, mode: str= 'r') -> TestCopyFile.Faux:
-            if filename == 'srcfile':
-                return srcfile
-            if filename == 'destfile':
-                return destfile
-            assert 0  # shouldn't reach here.
-
-        self._set_shutil_open(_open)
-
-        self.assertRaises(IOError,
-                          shutil.copyfile, 'srcfile', 'destfile')
-        self.assertTrue(srcfile._entered)
-        self.assertTrue(destfile._entered)
-        self.assertFalse(destfile._raised)
-        self.assertTrue(srcfile._exited_with[0] is None)
-        self.assertTrue(srcfile._raised)
-
-    def test_move_dir_caseinsensitive(self) -> None:
-        # Renames a folder to the same name
-        # but a different case.
-
-        self.src_dir = tempfile.mkdtemp()
-        dst_dir = os.path.join(
-                os.path.dirname(self.src_dir),
-                os.path.basename(self.src_dir).upper())
-        self.assertNotEqual(self.src_dir, dst_dir)
-
-        try:
-            shutil.move(self.src_dir, dst_dir)
-            self.assertTrue(os.path.isdir(dst_dir))
-        finally:
-            if os.path.exists(dst_dir):
-                os.rmdir(dst_dir)
-
-
-
-def test_main() -> None:
-    support.run_unittest(TestShutil, TestMove, TestCopyFile)
-
-if __name__ == '__main__':
-    test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_subprocess.py b/test-data/stdlib-samples/3.2/test/test_subprocess.py
deleted file mode 100644
index 772d8cc..0000000
--- a/test-data/stdlib-samples/3.2/test/test_subprocess.py
+++ /dev/null
@@ -1,1764 +0,0 @@
-import unittest
-from test import support
-import subprocess
-import sys
-import signal
-import io
-import os
-import errno
-import tempfile
-import time
-import re
-import sysconfig
-import warnings
-import select
-import shutil
-import gc
-
-import resource
-
-from typing import Any, Dict, Callable, Iterable, List, Set, Tuple, cast
-
-mswindows = (sys.platform == "win32")
-
-#
-# Depends on the following external programs: Python
-#
-
-if mswindows:
-    SETBINARY = ('import msvcrt; msvcrt.setmode(sys.stdout.fileno(), '
-                                                'os.O_BINARY);')
-else:
-    SETBINARY = ''
-
-
-try:
-    mkstemp = tempfile.mkstemp
-except AttributeError:
-    # tempfile.mkstemp is not available
-    def _mkstemp() -> Tuple[int, str]:
-        """Replacement for mkstemp, calling mktemp."""
-        fname = tempfile.mktemp()
-        return os.open(fname, os.O_RDWR|os.O_CREAT), fname
-    mkstemp = cast(Any, _mkstemp)
-
-
-class BaseTestCase(unittest.TestCase):
-    def setUp(self) -> None:
-        # Try to minimize the number of children we have so this test
-        # doesn't crash on some buildbots (Alphas in particular).
-        support.reap_children()
-
-    def tearDown(self) -> None:
-        for inst in subprocess._active:
-            inst.wait()
-        subprocess._cleanup()
-        self.assertFalse(subprocess._active, "subprocess._active not empty")
-
-    def assertStderrEqual(self, stderr: bytes, expected: bytes,
-                          msg: object = None) -> None:
-        # In a debug build, stuff like "[6580 refs]" is printed to stderr at
-        # shutdown time.  That frustrates tests trying to check stderr produced
-        # from a spawned Python process.
-        actual = support.strip_python_stderr(stderr)
-        self.assertEqual(actual, expected, msg)
-
-
-class ProcessTestCase(BaseTestCase):
-
-    def test_call_seq(self) -> None:
-        # call() function with sequence argument
-        rc = subprocess.call([sys.executable, "-c",
-                              "import sys; sys.exit(47)"])
-        self.assertEqual(rc, 47)
-
-    def test_check_call_zero(self) -> None:
-        # check_call() function with zero return code
-        rc = subprocess.check_call([sys.executable, "-c",
-                                    "import sys; sys.exit(0)"])
-        self.assertEqual(rc, 0)
-
-    def test_check_call_nonzero(self) -> None:
-        # check_call() function with non-zero return code
-        with self.assertRaises(subprocess.CalledProcessError) as c:
-            subprocess.check_call([sys.executable, "-c",
-                                   "import sys; sys.exit(47)"])
-        self.assertEqual(c.exception.returncode, 47)
-
-    def test_check_output(self) -> None:
-        # check_output() function with zero return code
-        output = subprocess.check_output(
-                [sys.executable, "-c", "print('BDFL')"])
-        self.assertIn(b'BDFL', cast(Any, output)) # see #39
-
-    def test_check_output_nonzero(self) -> None:
-        # check_call() function with non-zero return code
-        with self.assertRaises(subprocess.CalledProcessError) as c:
-            subprocess.check_output(
-                    [sys.executable, "-c", "import sys; sys.exit(5)"])
-        self.assertEqual(c.exception.returncode, 5)
-
-    def test_check_output_stderr(self) -> None:
-        # check_output() function stderr redirected to stdout
-        output = subprocess.check_output(
-                [sys.executable, "-c", "import sys; sys.stderr.write('BDFL')"],
-                stderr=subprocess.STDOUT)
-        self.assertIn(b'BDFL', cast(Any, output)) # see #39
-
-    def test_check_output_stdout_arg(self) -> None:
-        # check_output() function stderr redirected to stdout
-        with self.assertRaises(ValueError) as c:
-            output = subprocess.check_output(
-                    [sys.executable, "-c", "print('will not be run')"],
-                    stdout=sys.stdout)
-            self.fail("Expected ValueError when stdout arg supplied.")
-        self.assertIn('stdout', c.exception.args[0])
-
-    def test_call_kwargs(self) -> None:
-        # call() function with keyword args
-        newenv = os.environ.copy()
-        newenv["FRUIT"] = "banana"
-        rc = subprocess.call([sys.executable, "-c",
-                              'import sys, os;'
-                              'sys.exit(os.getenv("FRUIT")=="banana")'],
-                             env=newenv)
-        self.assertEqual(rc, 1)
-
-    def test_invalid_args(self) -> None:
-        # Popen() called with invalid arguments should raise TypeError
-        # but Popen.__del__ should not complain (issue #12085)
-        with support.captured_stderr() as s:
-            self.assertRaises(TypeError, subprocess.Popen, invalid_arg_name=1)
-            argcount = subprocess.Popen.__init__.__code__.co_argcount
-            too_many_args = [0] * (argcount + 1)
-            self.assertRaises(TypeError, subprocess.Popen, *too_many_args)
-        self.assertEqual(s.getvalue(), '')
-
-    def test_stdin_none(self) -> None:
-        # .stdin is None when not redirected
-        p = subprocess.Popen([sys.executable, "-c", 'print("banana")'],
-                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        self.addCleanup(p.stdout.close)
-        self.addCleanup(p.stderr.close)
-        p.wait()
-        self.assertEqual(p.stdin, None)
-
-    def test_stdout_none(self) -> None:
-        # .stdout is None when not redirected
-        p = subprocess.Popen([sys.executable, "-c",
-                             'print("    this bit of output is from a '
-                             'test of stdout in a different '
-                             'process ...")'],
-                             stdin=subprocess.PIPE, stderr=subprocess.PIPE)
-        self.addCleanup(p.stdin.close)
-        self.addCleanup(p.stderr.close)
-        p.wait()
-        self.assertEqual(p.stdout, None)
-
-    def test_stderr_none(self) -> None:
-        # .stderr is None when not redirected
-        p = subprocess.Popen([sys.executable, "-c", 'print("banana")'],
-                         stdin=subprocess.PIPE, stdout=subprocess.PIPE)
-        self.addCleanup(p.stdout.close)
-        self.addCleanup(p.stdin.close)
-        p.wait()
-        self.assertEqual(p.stderr, None)
-
-    def test_executable_with_cwd(self) -> None:
-        python_dir = os.path.dirname(os.path.realpath(sys.executable))
-        p = subprocess.Popen(["somethingyoudonthave", "-c",
-                              "import sys; sys.exit(47)"],
-                             executable=sys.executable, cwd=python_dir)
-        p.wait()
-        self.assertEqual(p.returncode, 47)
-
-    @unittest.skipIf(sysconfig.is_python_build(),
-                     "need an installed Python. See #7774")
-    def test_executable_without_cwd(self) -> None:
-        # For a normal installation, it should work without 'cwd'
-        # argument.  For test runs in the build directory, see #7774.
-        p = subprocess.Popen(["somethingyoudonthave", "-c",
-                              "import sys; sys.exit(47)"],
-                             executable=sys.executable)
-        p.wait()
-        self.assertEqual(p.returncode, 47)
-
-    def test_stdin_pipe(self) -> None:
-        # stdin redirection
-        p = subprocess.Popen([sys.executable, "-c",
-                         'import sys; sys.exit(sys.stdin.read() == "pear")'],
-                        stdin=subprocess.PIPE)
-        p.stdin.write(b"pear")
-        p.stdin.close()
-        p.wait()
-        self.assertEqual(p.returncode, 1)
-
-    def test_stdin_filedes(self) -> None:
-        # stdin is set to open file descriptor
-        tf = tempfile.TemporaryFile()
-        self.addCleanup(tf.close)
-        d = tf.fileno()
-        os.write(d, b"pear")
-        os.lseek(d, 0, 0)
-        p = subprocess.Popen([sys.executable, "-c",
-                         'import sys; sys.exit(sys.stdin.read() == "pear")'],
-                         stdin=d)
-        p.wait()
-        self.assertEqual(p.returncode, 1)
-
-    def test_stdin_fileobj(self) -> None:
-        # stdin is set to open file object
-        tf = tempfile.TemporaryFile()
-        self.addCleanup(tf.close)
-        tf.write(b"pear")
-        tf.seek(0)
-        p = subprocess.Popen([sys.executable, "-c",
-                         'import sys; sys.exit(sys.stdin.read() == "pear")'],
-                         stdin=tf)
-        p.wait()
-        self.assertEqual(p.returncode, 1)
-
-    def test_stdout_pipe(self) -> None:
-        # stdout redirection
-        p = subprocess.Popen([sys.executable, "-c",
-                          'import sys; sys.stdout.write("orange")'],
-                         stdout=subprocess.PIPE)
-        self.addCleanup(p.stdout.close)
-        self.assertEqual(p.stdout.read(), b"orange")
-
-    def test_stdout_filedes(self) -> None:
-        # stdout is set to open file descriptor
-        tf = tempfile.TemporaryFile()
-        self.addCleanup(tf.close)
-        d = tf.fileno()
-        p = subprocess.Popen([sys.executable, "-c",
-                          'import sys; sys.stdout.write("orange")'],
-                         stdout=d)
-        p.wait()
-        os.lseek(d, 0, 0)
-        self.assertEqual(os.read(d, 1024), b"orange")
-
-    def test_stdout_fileobj(self) -> None:
-        # stdout is set to open file object
-        tf = tempfile.TemporaryFile()
-        self.addCleanup(tf.close)
-        p = subprocess.Popen([sys.executable, "-c",
-                          'import sys; sys.stdout.write("orange")'],
-                         stdout=tf)
-        p.wait()
-        tf.seek(0)
-        self.assertEqual(tf.read(), b"orange")
-
-    def test_stderr_pipe(self) -> None:
-        # stderr redirection
-        p = subprocess.Popen([sys.executable, "-c",
-                          'import sys; sys.stderr.write("strawberry")'],
-                         stderr=subprocess.PIPE)
-        self.addCleanup(p.stderr.close)
-        self.assertStderrEqual(p.stderr.read(), b"strawberry")
-
-    def test_stderr_filedes(self) -> None:
-        # stderr is set to open file descriptor
-        tf = tempfile.TemporaryFile()
-        self.addCleanup(tf.close)
-        d = tf.fileno()
-        p = subprocess.Popen([sys.executable, "-c",
-                          'import sys; sys.stderr.write("strawberry")'],
-                         stderr=d)
-        p.wait()
-        os.lseek(d, 0, 0)
-        self.assertStderrEqual(os.read(d, 1024), b"strawberry")
-
-    def test_stderr_fileobj(self) -> None:
-        # stderr is set to open file object
-        tf = tempfile.TemporaryFile()
-        self.addCleanup(tf.close)
-        p = subprocess.Popen([sys.executable, "-c",
-                          'import sys; sys.stderr.write("strawberry")'],
-                         stderr=tf)
-        p.wait()
-        tf.seek(0)
-        self.assertStderrEqual(tf.read(), b"strawberry")
-
-    def test_stdout_stderr_pipe(self) -> None:
-        # capture stdout and stderr to the same pipe
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys;'
-                              'sys.stdout.write("apple");'
-                              'sys.stdout.flush();'
-                              'sys.stderr.write("orange")'],
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.STDOUT)
-        self.addCleanup(p.stdout.close)
-        self.assertStderrEqual(p.stdout.read(), b"appleorange")
-
-    def test_stdout_stderr_file(self) -> None:
-        # capture stdout and stderr to the same open file
-        tf = tempfile.TemporaryFile()
-        self.addCleanup(tf.close)
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys;'
-                              'sys.stdout.write("apple");'
-                              'sys.stdout.flush();'
-                              'sys.stderr.write("orange")'],
-                             stdout=tf,
-                             stderr=tf)
-        p.wait()
-        tf.seek(0)
-        self.assertStderrEqual(tf.read(), b"appleorange")
-
-    def test_stdout_filedes_of_stdout(self) -> None:
-        # stdout is set to 1 (#1531862).
-        cmd = r"import sys, os; sys.exit(os.write(sys.stdout.fileno(), b'.\n'))"
-        rc = subprocess.call([sys.executable, "-c", cmd], stdout=1)
-        self.assertEqual(rc, 2)
-
-    def test_cwd(self) -> None:
-        tmpdir = tempfile.gettempdir()
-        # We cannot use os.path.realpath to canonicalize the path,
-        # since it doesn't expand Tru64 {memb} strings. See bug 1063571.
-        cwd = os.getcwd()
-        os.chdir(tmpdir)
-        tmpdir = os.getcwd()
-        os.chdir(cwd)
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys,os;'
-                              'sys.stdout.write(os.getcwd())'],
-                             stdout=subprocess.PIPE,
-                             cwd=tmpdir)
-        self.addCleanup(p.stdout.close)
-        normcase = os.path.normcase
-        self.assertEqual(normcase(p.stdout.read().decode("utf-8")),
-                         normcase(tmpdir))
-
-    def test_env(self) -> None:
-        newenv = os.environ.copy()
-        newenv["FRUIT"] = "orange"
-        with subprocess.Popen([sys.executable, "-c",
-                               'import sys,os;'
-                               'sys.stdout.write(os.getenv("FRUIT"))'],
-                              stdout=subprocess.PIPE,
-                              env=newenv) as p:
-            stdout, stderr = p.communicate()
-            self.assertEqual(stdout, b"orange")
-
-    # Windows requires at least the SYSTEMROOT environment variable to start
-    # Python
-    @unittest.skipIf(sys.platform == 'win32',
-                     'cannot test an empty env on Windows')
-    @unittest.skipIf(sysconfig.get_config_var('Py_ENABLE_SHARED') is not None,
-                     'the python library cannot be loaded '
-                     'with an empty environment')
-    def test_empty_env(self) -> None:
-        with subprocess.Popen([sys.executable, "-c",
-                               'import os; '
-                               'print(list(os.environ.keys()))'],
-                              stdout=subprocess.PIPE,
-                              env={}) as p:
-            stdout, stderr = p.communicate()
-            self.assertIn(stdout.strip(),
-                [b"[]",
-                 # Mac OS X adds __CF_USER_TEXT_ENCODING variable to an empty
-                 # environment
-                 b"['__CF_USER_TEXT_ENCODING']"])
-
-    def test_communicate_stdin(self) -> None:
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys;'
-                              'sys.exit(sys.stdin.read() == "pear")'],
-                             stdin=subprocess.PIPE)
-        p.communicate(b"pear")
-        self.assertEqual(p.returncode, 1)
-
-    def test_communicate_stdout(self) -> None:
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys; sys.stdout.write("pineapple")'],
-                             stdout=subprocess.PIPE)
-        (stdout, stderr) = p.communicate()
-        self.assertEqual(stdout, b"pineapple")
-        self.assertEqual(stderr, None)
-
-    def test_communicate_stderr(self) -> None:
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys; sys.stderr.write("pineapple")'],
-                             stderr=subprocess.PIPE)
-        (stdout, stderr) = p.communicate()
-        self.assertEqual(stdout, None)
-        self.assertStderrEqual(stderr, b"pineapple")
-
-    def test_communicate(self) -> None:
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys,os;'
-                              'sys.stderr.write("pineapple");'
-                              'sys.stdout.write(sys.stdin.read())'],
-                             stdin=subprocess.PIPE,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
-        self.addCleanup(p.stdout.close)
-        self.addCleanup(p.stderr.close)
-        self.addCleanup(p.stdin.close)
-        (stdout, stderr) = p.communicate(b"banana")
-        self.assertEqual(stdout, b"banana")
-        self.assertStderrEqual(stderr, b"pineapple")
-
-    # Test for the fd leak reported in http://bugs.python.org/issue2791.
-    def test_communicate_pipe_fd_leak(self) -> None:
-        for stdin_pipe in (False, True):
-            for stdout_pipe in (False, True):
-                for stderr_pipe in (False, True):
-                    options = {}  # type: Dict[str, Any]
-                    if stdin_pipe:
-                        options['stdin'] = subprocess.PIPE
-                    if stdout_pipe:
-                        options['stdout'] = subprocess.PIPE
-                    if stderr_pipe:
-                        options['stderr'] = subprocess.PIPE
-                    if not options:
-                        continue
-                    p = subprocess.Popen([sys.executable, "-c", "pass"], **options)
-                    p.communicate()
-                    if p.stdin is not None:
-                        self.assertTrue(p.stdin.closed)
-                    if p.stdout is not None:
-                        self.assertTrue(p.stdout.closed)
-                    if p.stderr is not None:
-                        self.assertTrue(p.stderr.closed)
-
-    def test_communicate_returns(self) -> None:
-        # communicate() should return None if no redirection is active
-        p = subprocess.Popen([sys.executable, "-c",
-                              "import sys; sys.exit(47)"])
-        (stdout, stderr) = p.communicate()
-        self.assertEqual(stdout, None)
-        self.assertEqual(stderr, None)
-
-    def test_communicate_pipe_buf(self) -> None:
-        # communicate() with writes larger than pipe_buf
-        # This test will probably deadlock rather than fail, if
-        # communicate() does not work properly.
-        x, y = os.pipe()
-        if mswindows:
-            pipe_buf = 512
-        else:
-            pipe_buf = os.fpathconf(x, "PC_PIPE_BUF")
-        os.close(x)
-        os.close(y)
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys,os;'
-                              'sys.stdout.write(sys.stdin.read(47));'
-                              'sys.stderr.write("xyz"*%d);'
-                              'sys.stdout.write(sys.stdin.read())' % pipe_buf],
-                             stdin=subprocess.PIPE,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
-        self.addCleanup(p.stdout.close)
-        self.addCleanup(p.stderr.close)
-        self.addCleanup(p.stdin.close)
-        string_to_write = b"abc"*pipe_buf
-        (stdout, stderr) = p.communicate(string_to_write)
-        self.assertEqual(stdout, string_to_write)
-
-    def test_writes_before_communicate(self) -> None:
-        # stdin.write before communicate()
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys,os;'
-                              'sys.stdout.write(sys.stdin.read())'],
-                             stdin=subprocess.PIPE,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
-        self.addCleanup(p.stdout.close)
-        self.addCleanup(p.stderr.close)
-        self.addCleanup(p.stdin.close)
-        p.stdin.write(b"banana")
-        (stdout, stderr) = p.communicate(b"split")
-        self.assertEqual(stdout, b"bananasplit")
-        self.assertStderrEqual(stderr, b"")
-
-    def test_universal_newlines(self) -> None:
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys,os;' + SETBINARY +
-                              'sys.stdout.write(sys.stdin.readline());'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("line2\\n");'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write(sys.stdin.read());'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("line4\\n");'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("line5\\r\\n");'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("line6\\r");'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("\\nline7");'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("\\nline8");'],
-                             stdin=subprocess.PIPE,
-                             stdout=subprocess.PIPE,
-                             universal_newlines=1)
-        p.stdin.write("line1\n")
-        self.assertEqual(p.stdout.readline(), "line1\n")
-        p.stdin.write("line3\n")
-        p.stdin.close()
-        self.addCleanup(p.stdout.close)
-        self.assertEqual(p.stdout.readline(),
-                         "line2\n")
-        self.assertEqual(p.stdout.read(6),
-                         "line3\n")
-        self.assertEqual(p.stdout.read(),
-                         "line4\nline5\nline6\nline7\nline8")
-
-    def test_universal_newlines_communicate(self) -> None:
-        # universal newlines through communicate()
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys,os;' + SETBINARY +
-                              'sys.stdout.write("line2\\n");'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("line4\\n");'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("line5\\r\\n");'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("line6\\r");'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("\\nline7");'
-                              'sys.stdout.flush();'
-                              'sys.stdout.write("\\nline8");'],
-                             stderr=subprocess.PIPE,
-                             stdout=subprocess.PIPE,
-                             universal_newlines=1)
-        self.addCleanup(p.stdout.close)
-        self.addCleanup(p.stderr.close)
-        # BUG: can't give a non-empty stdin because it breaks both the
-        # select- and poll-based communicate() implementations.
-        (stdout, stderr) = p.communicate()
-        self.assertEqual(stdout,
-                         "line2\nline4\nline5\nline6\nline7\nline8")
-
-    def test_universal_newlines_communicate_stdin(self) -> None:
-        # universal newlines through communicate(), with only stdin
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys,os;' + SETBINARY + '''\nif True:
-                                  s = sys.stdin.readline()
-                                  assert s == "line1\\n", repr(s)
-                                  s = sys.stdin.read()
-                                  assert s == "line3\\n", repr(s)
-                              '''],
-                             stdin=subprocess.PIPE,
-                             universal_newlines=1)
-        (stdout, stderr) = p.communicate("line1\nline3\n")
-        self.assertEqual(p.returncode, 0)
-
-    def test_no_leaking(self) -> None:
-        # Make sure we leak no resources
-        if not mswindows:
-            max_handles = 1026 # too much for most UNIX systems
-        else:
-            max_handles = 2050 # too much for (at least some) Windows setups
-        handles = []  # type: List[int]
-        tmpdir = tempfile.mkdtemp()
-        try:
-            for i in range(max_handles):
-                try:
-                    tmpfile = os.path.join(tmpdir, support.TESTFN)
-                    handles.append(os.open(tmpfile, os.O_WRONLY|os.O_CREAT))
-                except OSError as e:
-                    if e.errno != errno.EMFILE:
-                        raise
-                    break
-            else:
-                self.skipTest("failed to reach the file descriptor limit "
-                    "(tried %d)" % max_handles)
-            # Close a couple of them (should be enough for a subprocess)
-            for i in range(10):
-                os.close(handles.pop())
-            # Loop creating some subprocesses. If one of them leaks some fds,
-            # the next loop iteration will fail by reaching the max fd limit.
-            for i in range(15):
-                p = subprocess.Popen([sys.executable, "-c",
-                                      "import sys;"
-                                      "sys.stdout.write(sys.stdin.read())"],
-                                     stdin=subprocess.PIPE,
-                                     stdout=subprocess.PIPE,
-                                     stderr=subprocess.PIPE)
-                data = p.communicate(b"lime")[0]
-                self.assertEqual(data, b"lime")
-        finally:
-            for h in handles:
-                os.close(h)
-            shutil.rmtree(tmpdir)
-
-    def test_list2cmdline(self) -> None:
-        self.assertEqual(subprocess.list2cmdline(['a b c', 'd', 'e']),
-                         '"a b c" d e')
-        self.assertEqual(subprocess.list2cmdline(['ab"c', '\\', 'd']),
-                         'ab\\"c \\ d')
-        self.assertEqual(subprocess.list2cmdline(['ab"c', ' \\', 'd']),
-                         'ab\\"c " \\\\" d')
-        self.assertEqual(subprocess.list2cmdline(['a\\\\\\b', 'de fg', 'h']),
-                         'a\\\\\\b "de fg" h')
-        self.assertEqual(subprocess.list2cmdline(['a\\"b', 'c', 'd']),
-                         'a\\\\\\"b c d')
-        self.assertEqual(subprocess.list2cmdline(['a\\\\b c', 'd', 'e']),
-                         '"a\\\\b c" d e')
-        self.assertEqual(subprocess.list2cmdline(['a\\\\b\\ c', 'd', 'e']),
-                         '"a\\\\b\\ c" d e')
-        self.assertEqual(subprocess.list2cmdline(['ab', '']),
-                         'ab ""')
-
-
-    def test_poll(self) -> None:
-        p = subprocess.Popen([sys.executable,
-                          "-c", "import time; time.sleep(1)"])
-        count = 0
-        while p.poll() is None:
-            time.sleep(0.1)
-            count += 1
-        # We expect that the poll loop probably went around about 10 times,
-        # but, based on system scheduling we can't control, it's possible
-        # poll() never returned None.  It "should be" very rare that it
-        # didn't go around at least twice.
-        self.assertGreaterEqual(count, 2)
-        # Subsequent invocations should just return the returncode
-        self.assertEqual(p.poll(), 0)
-
-
-    def test_wait(self) -> None:
-        p = subprocess.Popen([sys.executable,
-                          "-c", "import time; time.sleep(2)"])
-        self.assertEqual(p.wait(), 0)
-        # Subsequent invocations should just return the returncode
-        self.assertEqual(p.wait(), 0)
-
-
-    def test_invalid_bufsize(self) -> None:
-        # an invalid type of the bufsize argument should raise
-        # TypeError.
-        with self.assertRaises(TypeError):
-            subprocess.Popen([sys.executable, "-c", "pass"], cast(Any, "orange"))
-
-    def test_bufsize_is_none(self) -> None:
-        # bufsize=None should be the same as bufsize=0.
-        p = subprocess.Popen([sys.executable, "-c", "pass"], None)
-        self.assertEqual(p.wait(), 0)
-        # Again with keyword arg
-        p = subprocess.Popen([sys.executable, "-c", "pass"], bufsize=None)
-        self.assertEqual(p.wait(), 0)
-
-    def test_leaking_fds_on_error(self) -> None:
-        # see bug #5179: Popen leaks file descriptors to PIPEs if
-        # the child fails to execute; this will eventually exhaust
-        # the maximum number of open fds. 1024 seems a very common
-        # value for that limit, but Windows has 2048, so we loop
-        # 1024 times (each call leaked two fds).
-        for i in range(1024):
-            # Windows raises IOError.  Others raise OSError.
-            with self.assertRaises(EnvironmentError) as c:
-                subprocess.Popen(['nonexisting_i_hope'],
-                                 stdout=subprocess.PIPE,
-                                 stderr=subprocess.PIPE)
-            # ignore errors that indicate the command was not found
-            if c.exception.errno not in (errno.ENOENT, errno.EACCES):
-                raise c.exception
-
-    def test_issue8780(self) -> None:
-        # Ensure that stdout is inherited from the parent
-        # if stdout=PIPE is not used
-        code = ';'.join([
-            'import subprocess, sys',
-            'retcode = subprocess.call('
-                "[sys.executable, '-c', 'print(\"Hello World!\")'])",
-            'assert retcode == 0'])
-        output = subprocess.check_output([sys.executable, '-c', code])
-        self.assertTrue(output.startswith(b'Hello World!'), ascii(output))
-
-    def test_handles_closed_on_exception(self) -> None:
-        # If CreateProcess exits with an error, ensure the
-        # duplicate output handles are released
-        ifhandle, ifname = mkstemp()
-        ofhandle, ofname = mkstemp()
-        efhandle, efname = mkstemp()
-        try:
-            subprocess.Popen (["*"], stdin=ifhandle, stdout=ofhandle,
-              stderr=efhandle)
-        except OSError:
-            os.close(ifhandle)
-            os.remove(ifname)
-            os.close(ofhandle)
-            os.remove(ofname)
-            os.close(efhandle)
-            os.remove(efname)
-        self.assertFalse(os.path.exists(ifname))
-        self.assertFalse(os.path.exists(ofname))
-        self.assertFalse(os.path.exists(efname))
-
-    def test_communicate_epipe(self) -> None:
-        # Issue 10963: communicate() should hide EPIPE
-        p = subprocess.Popen([sys.executable, "-c", 'pass'],
-                             stdin=subprocess.PIPE,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
-        self.addCleanup(p.stdout.close)
-        self.addCleanup(p.stderr.close)
-        self.addCleanup(p.stdin.close)
-        p.communicate(b"x" * 2**20)
-
-    def test_communicate_epipe_only_stdin(self) -> None:
-        # Issue 10963: communicate() should hide EPIPE
-        p = subprocess.Popen([sys.executable, "-c", 'pass'],
-                             stdin=subprocess.PIPE)
-        self.addCleanup(p.stdin.close)
-        time.sleep(2)
-        p.communicate(b"x" * 2**20)
-
-    @unittest.skipUnless(hasattr(signal, 'SIGALRM'),
-                         "Requires signal.SIGALRM")
-    def test_communicate_eintr(self) -> None:
-        # Issue #12493: communicate() should handle EINTR
-        def handler(signum, frame):
-            pass
-        old_handler = signal.signal(signal.SIGALRM, handler)
-        self.addCleanup(signal.signal, signal.SIGALRM, old_handler)
-
-        # the process is running for 2 seconds
-        args = [sys.executable, "-c", 'import time; time.sleep(2)']
-        for stream in ('stdout', 'stderr'):
-            kw = {stream: subprocess.PIPE}  # type: Dict[str, Any]
-            with subprocess.Popen(args, **kw) as process:
-                signal.alarm(1)
-                # communicate() will be interrupted by SIGALRM
-                process.communicate()
-
-
-# context manager
-class _SuppressCoreFiles(object):
-    """Try to prevent core files from being created."""
-    old_limit = None # type: Tuple[int, int]
-
-    def __enter__(self) -> None:
-        """Try to save previous ulimit, then set it to (0, 0)."""
-        if resource is not None:
-            try:
-                self.old_limit = resource.getrlimit(resource.RLIMIT_CORE)
-                resource.setrlimit(resource.RLIMIT_CORE, (0, 0))
-            except (ValueError, resource.error):
-                pass
-
-        if sys.platform == 'darwin':
-            # Check if the 'Crash Reporter' on OSX was configured
-            # in 'Developer' mode and warn that it will get triggered
-            # when it is.
-            #
-            # This assumes that this context manager is used in tests
-            # that might trigger the next manager.
-            value = subprocess.Popen(['/usr/bin/defaults', 'read',
-                    'com.apple.CrashReporter', 'DialogType'],
-                    stdout=subprocess.PIPE).communicate()[0]
-            if value.strip() == b'developer':
-                print("this tests triggers the Crash Reporter, "
-                      "that is intentional", end='')
-                sys.stdout.flush()
-
-    def __exit__(self, *args: Any) -> None:
-        """Return core file behavior to default."""
-        if self.old_limit is None:
-            return
-        if resource is not None:
-            try:
-                resource.setrlimit(resource.RLIMIT_CORE, self.old_limit)
-            except (ValueError, resource.error):
-                pass
-
-
- at unittest.skipIf(mswindows, "POSIX specific tests")
-class POSIXProcessTestCase(BaseTestCase):
-
-    def test_exceptions(self) -> None:
-        nonexistent_dir = "/_this/pa.th/does/not/exist"
-        try:
-            os.chdir(nonexistent_dir)
-        except OSError as e:
-            # This avoids hard coding the errno value or the OS perror()
-            # string and instead capture the exception that we want to see
-            # below for comparison.
-            desired_exception = e
-            desired_exception.strerror += ': ' + repr(sys.executable)
-        else:
-            self.fail("chdir to nonexistant directory %s succeeded." %
-                      nonexistent_dir)
-
-        # Error in the child re-raised in the parent.
-        try:
-            p = subprocess.Popen([sys.executable, "-c", ""],
-                                 cwd=nonexistent_dir)
-        except OSError as e:
-            # Test that the child process chdir failure actually makes
-            # it up to the parent process as the correct exception.
-            self.assertEqual(desired_exception.errno, e.errno)
-            self.assertEqual(desired_exception.strerror, e.strerror)
-        else:
-            self.fail("Expected OSError: %s" % desired_exception)
-
-    def test_restore_signals(self) -> None:
-        # Code coverage for both values of restore_signals to make sure it
-        # at least does not blow up.
-        # A test for behavior would be complex.  Contributions welcome.
-        subprocess.call([sys.executable, "-c", ""], restore_signals=True)
-        subprocess.call([sys.executable, "-c", ""], restore_signals=False)
-
-    def test_start_new_session(self) -> None:
-        # For code coverage of calling setsid().  We don't care if we get an
-        # EPERM error from it depending on the test execution environment, that
-        # still indicates that it was called.
-        try:
-            output = subprocess.check_output(
-                    [sys.executable, "-c",
-                     "import os; print(os.getpgid(os.getpid()))"],
-                    start_new_session=True)
-        except OSError as e:
-            if e.errno != errno.EPERM:
-                raise
-        else:
-            parent_pgid = os.getpgid(os.getpid())
-            child_pgid = int(output)
-            self.assertNotEqual(parent_pgid, child_pgid)
-
-    def test_run_abort(self) -> None:
-        # returncode handles signal termination
-        with _SuppressCoreFiles():
-            p = subprocess.Popen([sys.executable, "-c",
-                                  'import os; os.abort()'])
-            p.wait()
-        self.assertEqual(-p.returncode, signal.SIGABRT)
-
-    def test_preexec(self) -> None:
-        # DISCLAIMER: Setting environment variables is *not* a good use
-        # of a preexec_fn.  This is merely a test.
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys,os;'
-                              'sys.stdout.write(os.getenv("FRUIT"))'],
-                             stdout=subprocess.PIPE,
-                             preexec_fn=lambda: os.putenv("FRUIT", "apple"))
-        self.addCleanup(p.stdout.close)
-        self.assertEqual(p.stdout.read(), b"apple")
-
-    def test_preexec_exception(self) -> None:
-        def raise_it():
-            raise ValueError("What if two swallows carried a coconut?")
-        try:
-            p = subprocess.Popen([sys.executable, "-c", ""],
-                                 preexec_fn=raise_it)
-        except RuntimeError as e:
-            self.assertTrue(
-                    subprocess._posixsubprocess,
-                    "Expected a ValueError from the preexec_fn")
-        except ValueError as e2:
-            self.assertIn("coconut", e2.args[0])
-        else:
-            self.fail("Exception raised by preexec_fn did not make it "
-                      "to the parent process.")
-
-    def test_preexec_gc_module_failure(self) -> None:
-        # This tests the code that disables garbage collection if the child
-        # process will execute any Python.
-        def raise_runtime_error():
-            raise RuntimeError("this shouldn't escape")
-        enabled = gc.isenabled()
-        orig_gc_disable = gc.disable
-        orig_gc_isenabled = gc.isenabled
-        try:
-            gc.disable()
-            self.assertFalse(gc.isenabled())
-            subprocess.call([sys.executable, '-c', ''],
-                            preexec_fn=lambda: None)
-            self.assertFalse(gc.isenabled(),
-                             "Popen enabled gc when it shouldn't.")
-
-            gc.enable()
-            self.assertTrue(gc.isenabled())
-            subprocess.call([sys.executable, '-c', ''],
-                            preexec_fn=lambda: None)
-            self.assertTrue(gc.isenabled(), "Popen left gc disabled.")
-
-            setattr(gc, 'disable', raise_runtime_error)
-            self.assertRaises(RuntimeError, subprocess.Popen,
-                              [sys.executable, '-c', ''],
-                              preexec_fn=lambda: None)
-
-            del gc.isenabled  # force an AttributeError
-            self.assertRaises(AttributeError, subprocess.Popen,
-                              [sys.executable, '-c', ''],
-                              preexec_fn=lambda: None)
-        finally:
-            setattr(gc, 'disable', orig_gc_disable)
-            setattr(gc, 'isenabled', orig_gc_isenabled)
-            if not enabled:
-                gc.disable()
-
-    def test_args_string(self) -> None:
-        # args is a string
-        fd, fname = mkstemp()
-        # reopen in text mode
-        with open(fd, "w", errors=cast(Any, "surrogateescape")) as fobj: # see #260
-            fobj.write("#!/bin/sh\n")
-            fobj.write("exec '%s' -c 'import sys; sys.exit(47)'\n" %
-                       sys.executable)
-        os.chmod(fname, 0o700)
-        p = subprocess.Popen(fname)
-        p.wait()
-        os.remove(fname)
-        self.assertEqual(p.returncode, 47)
-
-    def test_invalid_args(self) -> None:
-        # invalid arguments should raise ValueError
-        self.assertRaises(ValueError, subprocess.call,
-                          [sys.executable, "-c",
-                           "import sys; sys.exit(47)"],
-                          startupinfo=47)
-        self.assertRaises(ValueError, subprocess.call,
-                          [sys.executable, "-c",
-                           "import sys; sys.exit(47)"],
-                          creationflags=47)
-
-    def test_shell_sequence(self) -> None:
-        # Run command through the shell (sequence)
-        newenv = os.environ.copy()
-        newenv["FRUIT"] = "apple"
-        p = subprocess.Popen(["echo $FRUIT"], shell=1,
-                             stdout=subprocess.PIPE,
-                             env=newenv)
-        self.addCleanup(p.stdout.close)
-        self.assertEqual(p.stdout.read().strip(b" \t\r\n\f"), b"apple")
-
-    def test_shell_string(self) -> None:
-        # Run command through the shell (string)
-        newenv = os.environ.copy()
-        newenv["FRUIT"] = "apple"
-        p = subprocess.Popen("echo $FRUIT", shell=1,
-                             stdout=subprocess.PIPE,
-                             env=newenv)
-        self.addCleanup(p.stdout.close)
-        self.assertEqual(p.stdout.read().strip(b" \t\r\n\f"), b"apple")
-
-    def test_call_string(self) -> None:
-        # call() function with string argument on UNIX
-        fd, fname = mkstemp()
-        # reopen in text mode
-        with open(fd, "w", errors=cast(Any, "surrogateescape")) as fobj: # see #260
-            fobj.write("#!/bin/sh\n")
-            fobj.write("exec '%s' -c 'import sys; sys.exit(47)'\n" %
-                       sys.executable)
-        os.chmod(fname, 0o700)
-        rc = subprocess.call(fname)
-        os.remove(fname)
-        self.assertEqual(rc, 47)
-
-    def test_specific_shell(self) -> None:
-        # Issue #9265: Incorrect name passed as arg[0].
-        shells = []  # type: List[str]
-        for prefix in ['/bin', '/usr/bin/', '/usr/local/bin']:
-            for name in ['bash', 'ksh']:
-                sh = os.path.join(prefix, name)
-                if os.path.isfile(sh):
-                    shells.append(sh)
-        if not shells: # Will probably work for any shell but csh.
-            self.skipTest("bash or ksh required for this test")
-        sh = '/bin/sh'
-        if os.path.isfile(sh) and not os.path.islink(sh):
-            # Test will fail if /bin/sh is a symlink to csh.
-            shells.append(sh)
-        for sh in shells:
-            p = subprocess.Popen("echo $0", executable=sh, shell=True,
-                                 stdout=subprocess.PIPE)
-            self.addCleanup(p.stdout.close)
-            self.assertEqual(p.stdout.read().strip(), bytes(sh, 'ascii'))
-
-    def _kill_process(self, method: str, *args: Any) -> subprocess.Popen:
-        # Do not inherit file handles from the parent.
-        # It should fix failures on some platforms.
-        p = subprocess.Popen([sys.executable, "-c", """if 1:
-                             import sys, time
-                             sys.stdout.write('x\\n')
-                             sys.stdout.flush()
-                             time.sleep(30)
-                             """],
-                             close_fds=True,
-                             stdin=subprocess.PIPE,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
-        # Wait for the interpreter to be completely initialized before
-        # sending any signal.
-        p.stdout.read(1)
-        getattr(p, method)(*args)
-        return p
-
-    def test_send_signal(self) -> None:
-        p = self._kill_process('send_signal', signal.SIGINT)
-        _, stderr = p.communicate()
-        self.assertIn(b'KeyboardInterrupt', stderr)
-        self.assertNotEqual(p.wait(), 0)
-
-    def test_kill(self) -> None:
-        p = self._kill_process('kill')
-        _, stderr = p.communicate()
-        self.assertStderrEqual(stderr, b'')
-        self.assertEqual(p.wait(), -signal.SIGKILL)
-
-    def test_terminate(self) -> None:
-        p = self._kill_process('terminate')
-        _, stderr = p.communicate()
-        self.assertStderrEqual(stderr, b'')
-        self.assertEqual(p.wait(), -signal.SIGTERM)
-
-    def check_close_std_fds(self, fds: Iterable[int]) -> None:
-        # Issue #9905: test that subprocess pipes still work properly with
-        # some standard fds closed
-        stdin = 0
-        newfds = []  # type: List[int]
-        for a in fds:
-            b = os.dup(a)
-            newfds.append(b)
-            if a == 0:
-                stdin = b
-        try:
-            for fd in fds:
-                os.close(fd)
-            out, err = subprocess.Popen([sys.executable, "-c",
-                              'import sys;'
-                              'sys.stdout.write("apple");'
-                              'sys.stdout.flush();'
-                              'sys.stderr.write("orange")'],
-                       stdin=stdin,
-                       stdout=subprocess.PIPE,
-                       stderr=subprocess.PIPE).communicate()
-            err = support.strip_python_stderr(err)
-            self.assertEqual((out, err), (b'apple', b'orange'))
-        finally:
-            for b, a in zip(newfds, fds):
-                os.dup2(b, a)
-            for b in newfds:
-                os.close(b)
-
-    def test_close_fd_0(self) -> None:
-        self.check_close_std_fds([0])
-
-    def test_close_fd_1(self) -> None:
-        self.check_close_std_fds([1])
-
-    def test_close_fd_2(self) -> None:
-        self.check_close_std_fds([2])
-
-    def test_close_fds_0_1(self) -> None:
-        self.check_close_std_fds([0, 1])
-
-    def test_close_fds_0_2(self) -> None:
-        self.check_close_std_fds([0, 2])
-
-    def test_close_fds_1_2(self) -> None:
-        self.check_close_std_fds([1, 2])
-
-    def test_close_fds_0_1_2(self) -> None:
-        # Issue #10806: test that subprocess pipes still work properly with
-        # all standard fds closed.
-        self.check_close_std_fds([0, 1, 2])
-
-    def test_remapping_std_fds(self) -> None:
-        # open up some temporary files
-        temps = [mkstemp() for i in range(3)]
-        try:
-            temp_fds = [fd for fd, fname in temps]
-
-            # unlink the files -- we won't need to reopen them
-            for fd, fname in temps:
-                os.unlink(fname)
-
-            # write some data to what will become stdin, and rewind
-            os.write(temp_fds[1], b"STDIN")
-            os.lseek(temp_fds[1], 0, 0)
-
-            # move the standard file descriptors out of the way
-            saved_fds = [os.dup(fd) for fd in range(3)]
-            try:
-                # duplicate the file objects over the standard fd's
-                for fd, temp_fd in enumerate(temp_fds):
-                    os.dup2(temp_fd, fd)
-
-                # now use those files in the "wrong" order, so that subprocess
-                # has to rearrange them in the child
-                p = subprocess.Popen([sys.executable, "-c",
-                    'import sys; got = sys.stdin.read();'
-                    'sys.stdout.write("got %s"%got); sys.stderr.write("err")'],
-                    stdin=temp_fds[1],
-                    stdout=temp_fds[2],
-                    stderr=temp_fds[0])
-                p.wait()
-            finally:
-                # restore the original fd's underneath sys.stdin, etc.
-                for std, saved in enumerate(saved_fds):
-                    os.dup2(saved, std)
-                    os.close(saved)
-
-            for fd in temp_fds:
-                os.lseek(fd, 0, 0)
-
-            out = os.read(temp_fds[2], 1024)
-            err = support.strip_python_stderr(os.read(temp_fds[0], 1024))
-            self.assertEqual(out, b"got STDIN")
-            self.assertEqual(err, b"err")
-
-        finally:
-            for fd in temp_fds:
-                os.close(fd)
-
-    def check_swap_fds(self, stdin_no: int, stdout_no: int,
-                       stderr_no: int) -> None:
-        # open up some temporary files
-        temps = [mkstemp() for i in range(3)]
-        temp_fds = [fd for fd, fname in temps]
-        try:
-            # unlink the files -- we won't need to reopen them
-            for fd, fname in temps:
-                os.unlink(fname)
-
-            # save a copy of the standard file descriptors
-            saved_fds = [os.dup(fd) for fd in range(3)]
-            try:
-                # duplicate the temp files over the standard fd's 0, 1, 2
-                for fd, temp_fd in enumerate(temp_fds):
-                    os.dup2(temp_fd, fd)
-
-                # write some data to what will become stdin, and rewind
-                os.write(stdin_no, b"STDIN")
-                os.lseek(stdin_no, 0, 0)
-
-                # now use those files in the given order, so that subprocess
-                # has to rearrange them in the child
-                p = subprocess.Popen([sys.executable, "-c",
-                    'import sys; got = sys.stdin.read();'
-                    'sys.stdout.write("got %s"%got); sys.stderr.write("err")'],
-                    stdin=stdin_no,
-                    stdout=stdout_no,
-                    stderr=stderr_no)
-                p.wait()
-
-                for fd in temp_fds:
-                    os.lseek(fd, 0, 0)
-
-                out = os.read(stdout_no, 1024)
-                err = support.strip_python_stderr(os.read(stderr_no, 1024))
-            finally:
-                for std, saved in enumerate(saved_fds):
-                    os.dup2(saved, std)
-                    os.close(saved)
-
-            self.assertEqual(out, b"got STDIN")
-            self.assertEqual(err, b"err")
-
-        finally:
-            for fd in temp_fds:
-                os.close(fd)
-
-    # When duping fds, if there arises a situation where one of the fds is
-    # either 0, 1 or 2, it is possible that it is overwritten (#12607).
-    # This tests all combinations of this.
-    def test_swap_fds(self) -> None:
-        self.check_swap_fds(0, 1, 2)
-        self.check_swap_fds(0, 2, 1)
-        self.check_swap_fds(1, 0, 2)
-        self.check_swap_fds(1, 2, 0)
-        self.check_swap_fds(2, 0, 1)
-        self.check_swap_fds(2, 1, 0)
-
-    def test_surrogates_error_message(self) -> None:
-        def prepare() -> None:
-            raise ValueError("surrogate:\uDCff")
-
-        try:
-            subprocess.call(
-                [sys.executable, "-c", "pass"],
-                preexec_fn=prepare)
-        except ValueError as err:
-            # Pure Python implementations keeps the message
-            self.assertIsNone(subprocess._posixsubprocess)
-            self.assertEqual(str(err), "surrogate:\uDCff")
-        except RuntimeError as err2:
-            # _posixsubprocess uses a default message
-            self.assertIsNotNone(subprocess._posixsubprocess)
-            self.assertEqual(str(err2), "Exception occurred in preexec_fn.")
-        else:
-            self.fail("Expected ValueError or RuntimeError")
-
-    def test_undecodable_env(self) -> None:
-        for key, value in (('test', 'abc\uDCFF'), ('test\uDCFF', '42')):
-            # test str with surrogates
-            script = "import os; print(ascii(os.getenv(%s)))" % repr(key)
-            env = os.environ.copy()
-            env[key] = value
-            # Use C locale to get ascii for the locale encoding to force
-            # surrogate-escaping of \xFF in the child process; otherwise it can
-            # be decoded as-is if the default locale is latin-1.
-            env['LC_ALL'] = 'C'
-            stdout = subprocess.check_output(
-                [sys.executable, "-c", script],
-                env=env)
-            stdout = stdout.rstrip(b'\n\r')
-            self.assertEqual(stdout.decode('ascii'), ascii(value))
-
-            # test bytes
-            keyb = key.encode("ascii", "surrogateescape")
-            valueb = value.encode("ascii", "surrogateescape")
-            script = "import os; print(ascii(os.getenvb(%s)))" % repr(keyb)
-            envb = dict(os.environ.copy().items())  # type: Dict[Any, Any]
-            envb[keyb] = valueb
-            stdout = subprocess.check_output(
-                [sys.executable, "-c", script],
-                env=envb)
-            stdout = stdout.rstrip(b'\n\r')
-            self.assertEqual(stdout.decode('ascii'), ascii(valueb))
-
-    def test_bytes_program(self) -> None:
-        abs_program = os.fsencode(sys.executable)
-        path, programs = os.path.split(sys.executable)
-        program = os.fsencode(programs)
-
-        # absolute bytes path
-        exitcode = subprocess.call([abs_program, "-c", "pass"])
-        self.assertEqual(exitcode, 0)
-
-        # bytes program, unicode PATH
-        env = os.environ.copy()
-        env["PATH"] = path
-        exitcode = subprocess.call([program, "-c", "pass"], env=env)
-        self.assertEqual(exitcode, 0)
-
-        # bytes program, bytes PATH
-        envb = os.environb.copy()
-        envb[b"PATH"] = os.fsencode(path)
-        exitcode = subprocess.call([program, "-c", "pass"], env=envb)
-        self.assertEqual(exitcode, 0)
-
-    def test_pipe_cloexec(self) -> None:
-        sleeper = support.findfile("input_reader.py", subdir="subprocessdata")
-        fd_status = support.findfile("fd_status.py", subdir="subprocessdata")
-
-        p1 = subprocess.Popen([sys.executable, sleeper],
-                              stdin=subprocess.PIPE, stdout=subprocess.PIPE,
-                              stderr=subprocess.PIPE, close_fds=False)
-
-        self.addCleanup(p1.communicate, b'')
-
-        p2 = subprocess.Popen([sys.executable, fd_status],
-                              stdout=subprocess.PIPE, close_fds=False)
-
-        output, error = p2.communicate()
-        result_fds = set(map(int, output.split(b',')))
-        unwanted_fds = set([p1.stdin.fileno(), p1.stdout.fileno(),
-                            p1.stderr.fileno()])
-
-        self.assertFalse(result_fds & unwanted_fds,
-                         "Expected no fds from %r to be open in child, "
-                         "found %r" %
-                              (unwanted_fds, result_fds & unwanted_fds))
-
-    def test_pipe_cloexec_real_tools(self) -> None:
-        qcat = support.findfile("qcat.py", subdir="subprocessdata")
-        qgrep = support.findfile("qgrep.py", subdir="subprocessdata")
-
-        subdata = b'zxcvbn'
-        data = subdata * 4 + b'\n'
-
-        p1 = subprocess.Popen([sys.executable, qcat],
-                              stdin=subprocess.PIPE, stdout=subprocess.PIPE,
-                              close_fds=False)
-
-        p2 = subprocess.Popen([sys.executable, qgrep, subdata],
-                              stdin=p1.stdout, stdout=subprocess.PIPE,
-                              close_fds=False)
-
-        self.addCleanup(p1.wait)
-        self.addCleanup(p2.wait)
-        def kill_p1() -> None:
-            #try:
-            p1.terminate()
-            #except ProcessLookupError:
-            #    pass
-        def kill_p2() -> None:
-            #try:
-            p2.terminate()
-            #except ProcessLookupError:
-            #    pass
-        self.addCleanup(kill_p1)
-        self.addCleanup(kill_p2)
-
-        p1.stdin.write(data)
-        p1.stdin.close()
-
-        readfiles, ignored1, ignored2 = select.select([p2.stdout], [], [], 10)
-
-        self.assertTrue(readfiles, "The child hung")
-        self.assertEqual(p2.stdout.read(), data)
-
-        p1.stdout.close()
-        p2.stdout.close()
-
-    def test_close_fds(self) -> None:
-        fd_status = support.findfile("fd_status.py", subdir="subprocessdata")
-
-        fds = os.pipe()
-        self.addCleanup(os.close, fds[0])
-        self.addCleanup(os.close, fds[1])
-
-        open_fds = set([fds[0], fds[1]])
-        # add a bunch more fds
-        for _ in range(9):
-            fd = os.open("/dev/null", os.O_RDONLY)
-            self.addCleanup(os.close, fd)
-            open_fds.add(fd)
-
-        p = subprocess.Popen([sys.executable, fd_status],
-                             stdout=subprocess.PIPE, close_fds=False)
-        output, ignored = p.communicate()
-        remaining_fds = set(map(int, output.split(b',')))
-
-        self.assertEqual(remaining_fds & open_fds, open_fds,
-                         "Some fds were closed")
-
-        p = subprocess.Popen([sys.executable, fd_status],
-                             stdout=subprocess.PIPE, close_fds=True)
-        output, ignored = p.communicate()
-        remaining_fds = set(map(int, output.split(b',')))
-
-        self.assertFalse(remaining_fds & open_fds,
-                         "Some fds were left open")
-        self.assertIn(1, remaining_fds, "Subprocess failed")
-
-        # Keep some of the fd's we opened open in the subprocess.
-        # This tests _posixsubprocess.c's proper handling of fds_to_keep.
-        fds_to_keep = set(open_fds.pop() for _ in range(8))
-        p = subprocess.Popen([sys.executable, fd_status],
-                             stdout=subprocess.PIPE, close_fds=True,
-                             pass_fds=())
-        output, ignored = p.communicate()
-        remaining_fds = set(map(int, output.split(b',')))
-
-        self.assertFalse(remaining_fds & fds_to_keep & open_fds,
-                         "Some fds not in pass_fds were left open")
-        self.assertIn(1, remaining_fds, "Subprocess failed")
-
-    # Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
-    # descriptor of a pipe closed in the parent process is valid in the
-    # child process according to fstat(), but the mode of the file
-    # descriptor is invalid, and read or write raise an error.
-    @support.requires_mac_ver(10, 5)
-    def test_pass_fds(self) -> None:
-        fd_status = support.findfile("fd_status.py", subdir="subprocessdata")
-
-        open_fds = set()  # type: Set[int]
-
-        for x in range(5):
-            fds = os.pipe()
-            self.addCleanup(os.close, fds[0])
-            self.addCleanup(os.close, fds[1])
-            open_fds.update([fds[0], fds[1]])
-
-        for fd in open_fds:
-            p = subprocess.Popen([sys.executable, fd_status],
-                                 stdout=subprocess.PIPE, close_fds=True,
-                                 pass_fds=(fd, ))
-            output, ignored = p.communicate()
-
-            remaining_fds = set(map(int, output.split(b',')))
-            to_be_closed = open_fds - {fd}
-
-            self.assertIn(fd, remaining_fds, "fd to be passed not passed")
-            self.assertFalse(remaining_fds & to_be_closed,
-                             "fd to be closed passed")
-
-            # pass_fds overrides close_fds with a warning.
-            with self.assertWarns(RuntimeWarning) as context:
-                self.assertFalse(subprocess.call(
-                        [sys.executable, "-c", "import sys; sys.exit(0)"],
-                        close_fds=False, pass_fds=(fd, )))
-            self.assertIn('overriding close_fds', str(context.warning))
-
-    def test_stdout_stdin_are_single_inout_fd(self) -> None:
-        with io.open(os.devnull, "r+") as inout:
-            p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
-                                 stdout=inout, stdin=inout)
-            p.wait()
-
-    def test_stdout_stderr_are_single_inout_fd(self) -> None:
-        with io.open(os.devnull, "r+") as inout:
-            p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
-                                 stdout=inout, stderr=inout)
-            p.wait()
-
-    def test_stderr_stdin_are_single_inout_fd(self) -> None:
-        with io.open(os.devnull, "r+") as inout:
-            p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
-                                 stderr=inout, stdin=inout)
-            p.wait()
-
-    def test_wait_when_sigchild_ignored(self) -> None:
-        # NOTE: sigchild_ignore.py may not be an effective test on all OSes.
-        sigchild_ignore = support.findfile("sigchild_ignore.py",
-                                           subdir="subprocessdata")
-        p = subprocess.Popen([sys.executable, sigchild_ignore],
-                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        stdout, stderr = p.communicate()
-        self.assertEqual(0, p.returncode, "sigchild_ignore.py exited"
-                         " non-zero with this error:\n%s" %
-                         stderr.decode('utf8'))
-
-    def test_select_unbuffered(self) -> None:
-        # Issue #11459: bufsize=0 should really set the pipes as
-        # unbuffered (and therefore let select() work properly).
-        select = support.import_module("select")
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys;'
-                              'sys.stdout.write("apple")'],
-                             stdout=subprocess.PIPE,
-                             bufsize=0)
-        f = p.stdout
-        self.addCleanup(f.close)
-        try:
-            self.assertEqual(f.read(4), b"appl")
-            self.assertIn(f, select.select([f], [], [], 0.0)[0])
-        finally:
-            p.wait()
-
-    def test_zombie_fast_process_del(self) -> None:
-        # Issue #12650: on Unix, if Popen.__del__() was called before the
-        # process exited, it wouldn't be added to subprocess._active, and would
-        # remain a zombie.
-        # spawn a Popen, and delete its reference before it exits
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import sys, time;'
-                              'time.sleep(0.2)'],
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
-        self.addCleanup(p.stdout.close)
-        self.addCleanup(p.stderr.close)
-        ident = id(p)
-        pid = p.pid
-        del p
-        # check that p is in the active processes list
-        self.assertIn(ident, [id(o) for o in subprocess._active])
-
-    def test_leak_fast_process_del_killed(self) -> None:
-        # Issue #12650: on Unix, if Popen.__del__() was called before the
-        # process exited, and the process got killed by a signal, it would never
-        # be removed from subprocess._active, which triggered a FD and memory
-        # leak.
-        # spawn a Popen, delete its reference and kill it
-        p = subprocess.Popen([sys.executable, "-c",
-                              'import time;'
-                              'time.sleep(3)'],
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
-        self.addCleanup(p.stdout.close)
-        self.addCleanup(p.stderr.close)
-        ident = id(p)
-        pid = p.pid
-        del p
-        os.kill(pid, signal.SIGKILL)
-        # check that p is in the active processes list
-        self.assertIn(ident, [id(o) for o in subprocess._active])
-
-        # let some time for the process to exit, and create a new Popen: this
-        # should trigger the wait() of p
-        time.sleep(0.2)
-        with self.assertRaises(EnvironmentError) as c:
-            with subprocess.Popen(['nonexisting_i_hope'],
-                                  stdout=subprocess.PIPE,
-                                  stderr=subprocess.PIPE) as proc:
-                pass
-        # p should have been wait()ed on, and removed from the _active list
-        self.assertRaises(OSError, os.waitpid, pid, 0)
-        self.assertNotIn(ident, [id(o) for o in subprocess._active])
-
-
- at unittest.skipUnless(mswindows, "Windows specific tests")
-class Win32ProcessTestCase(BaseTestCase):
-
-    def test_startupinfo(self) -> None:
-        # startupinfo argument
-        # We uses hardcoded constants, because we do not want to
-        # depend on win32all.
-        STARTF_USESHOWWINDOW = 1
-        SW_MAXIMIZE = 3
-        startupinfo = subprocess.STARTUPINFO()
-        startupinfo.dwFlags = STARTF_USESHOWWINDOW
-        startupinfo.wShowWindow = SW_MAXIMIZE
-        # Since Python is a console process, it won't be affected
-        # by wShowWindow, but the argument should be silently
-        # ignored
-        subprocess.call([sys.executable, "-c", "import sys; sys.exit(0)"],
-                        startupinfo=startupinfo)
-
-    def test_creationflags(self) -> None:
-        # creationflags argument
-        CREATE_NEW_CONSOLE = 16
-        sys.stderr.write("    a DOS box should flash briefly ...\n")
-        subprocess.call(sys.executable +
-                        ' -c "import time; time.sleep(0.25)"',
-                        creationflags=CREATE_NEW_CONSOLE)
-
-    def test_invalid_args(self) -> None:
-        # invalid arguments should raise ValueError
-        self.assertRaises(ValueError, subprocess.call,
-                          [sys.executable, "-c",
-                           "import sys; sys.exit(47)"],
-                          preexec_fn=lambda: 1)
-        self.assertRaises(ValueError, subprocess.call,
-                          [sys.executable, "-c",
-                           "import sys; sys.exit(47)"],
-                          stdout=subprocess.PIPE,
-                          close_fds=True)
-
-    def test_close_fds(self) -> None:
-        # close file descriptors
-        rc = subprocess.call([sys.executable, "-c",
-                              "import sys; sys.exit(47)"],
-                              close_fds=True)
-        self.assertEqual(rc, 47)
-
-    def test_shell_sequence(self) -> None:
-        # Run command through the shell (sequence)
-        newenv = os.environ.copy()
-        newenv["FRUIT"] = "physalis"
-        p = subprocess.Popen(["set"], shell=1,
-                             stdout=subprocess.PIPE,
-                             env=newenv)
-        self.addCleanup(p.stdout.close)
-        self.assertIn(b"physalis", p.stdout.read())
-
-    def test_shell_string(self) -> None:
-        # Run command through the shell (string)
-        newenv = os.environ.copy()
-        newenv["FRUIT"] = "physalis"
-        p = subprocess.Popen("set", shell=1,
-                             stdout=subprocess.PIPE,
-                             env=newenv)
-        self.addCleanup(p.stdout.close)
-        self.assertIn(b"physalis", p.stdout.read())
-
-    def test_call_string(self) -> None:
-        # call() function with string argument on Windows
-        rc = subprocess.call(sys.executable +
-                             ' -c "import sys; sys.exit(47)"')
-        self.assertEqual(rc, 47)
-
-    def _kill_process(self, method: str, *args: Any) -> None:
-        # Some win32 buildbot raises EOFError if stdin is inherited
-        p = subprocess.Popen([sys.executable, "-c", """if 1:
-                             import sys, time
-                             sys.stdout.write('x\\n')
-                             sys.stdout.flush()
-                             time.sleep(30)
-                             """],
-                             stdin=subprocess.PIPE,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
-        self.addCleanup(p.stdout.close)
-        self.addCleanup(p.stderr.close)
-        self.addCleanup(p.stdin.close)
-        # Wait for the interpreter to be completely initialized before
-        # sending any signal.
-        p.stdout.read(1)
-        getattr(p, method)(*args)
-        _, stderr = p.communicate()
-        self.assertStderrEqual(stderr, b'')
-        returncode = p.wait()
-        self.assertNotEqual(returncode, 0)
-
-    def test_send_signal(self) -> None:
-        self._kill_process('send_signal', signal.SIGTERM)
-
-    def test_kill(self) -> None:
-        self._kill_process('kill')
-
-    def test_terminate(self) -> None:
-        self._kill_process('terminate')
-
-
-# The module says:
-#   "NB This only works (and is only relevant) for UNIX."
-#
-# Actually, getoutput should work on any platform with an os.popen, but
-# I'll take the comment as given, and skip this suite.
- at unittest.skipUnless(os.name == 'posix', "only relevant for UNIX")
-class CommandTests(unittest.TestCase):
-    def test_getoutput(self) -> None:
-        self.assertEqual(subprocess.getoutput('echo xyzzy'), 'xyzzy')
-        self.assertEqual(subprocess.getstatusoutput('echo xyzzy'),
-                         (0, 'xyzzy'))
-
-        # we use mkdtemp in the next line to create an empty directory
-        # under our exclusive control; from that, we can invent a pathname
-        # that we _know_ won't exist.  This is guaranteed to fail.
-        dir = None # type: str
-        try:
-            dir = tempfile.mkdtemp()
-            name = os.path.join(dir, "foo")
-
-            status, output = subprocess.getstatusoutput('cat ' + name)
-            self.assertNotEqual(status, 0)
-        finally:
-            if dir is not None:
-                os.rmdir(dir)
-
-
- at unittest.skipUnless(getattr(subprocess, '_has_poll', False),
-                     "poll system call not supported")
-class ProcessTestCaseNoPoll(ProcessTestCase):
-    def setUp(self) -> None:
-        subprocess._has_poll = False
-        ProcessTestCase.setUp(self)
-
-    def tearDown(self) -> None:
-        subprocess._has_poll = True
-        ProcessTestCase.tearDown(self)
-
-
-#@unittest.skipUnless(getattr(subprocess, '_posixsubprocess', False),
-#                     "_posixsubprocess extension module not found.")
-#class ProcessTestCasePOSIXPurePython(ProcessTestCase, POSIXProcessTestCase):
-#    @classmethod
-#    def setUpClass(cls):
-#        global subprocess
-#        assert subprocess._posixsubprocess
-#        # Reimport subprocess while forcing _posixsubprocess to not exist.
-#        with support.check_warnings(('.*_posixsubprocess .* not being used.*',
-#                                     RuntimeWarning)):
-#            subprocess = support.import_fresh_module(
-#                    'subprocess', blocked=['_posixsubprocess'])
-#        assert not subprocess._posixsubprocess
-#
-#    @classmethod
-#    def tearDownClass(cls):
-#        global subprocess
-#        # Reimport subprocess as it should be, restoring order to the universe#.
-#        subprocess = support.import_fresh_module('subprocess')
-#        assert subprocess._posixsubprocess
-
-
-class HelperFunctionTests(unittest.TestCase):
-    @unittest.skipIf(mswindows, "errno and EINTR make no sense on windows")
-    def test_eintr_retry_call(self) -> None:
-        record_calls = []  # type: List[Any]
-        def fake_os_func(*args: Any) -> tuple:
-            record_calls.append(args)
-            if len(record_calls) == 2:
-                raise OSError(errno.EINTR, "fake interrupted system call")
-            return tuple(reversed(args))
-
-        self.assertEqual((999, 256),
-                         subprocess._eintr_retry_call(fake_os_func, 256, 999))
-        self.assertEqual([(256, 999)], record_calls)
-        # This time there will be an EINTR so it will loop once.
-        self.assertEqual((666,),
-                         subprocess._eintr_retry_call(fake_os_func, 666))
-        self.assertEqual([(256, 999), (666,), (666,)], record_calls)
-
-
- at unittest.skipUnless(mswindows, "Windows-specific tests")
-class CommandsWithSpaces (BaseTestCase):
-
-    def setUp(self) -> None:
-        super().setUp()
-        f, fname = mkstemp(".py", "te st")
-        self.fname = fname.lower ()
-        os.write(f, b"import sys;"
-                    b"sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv]))"
-        )
-        os.close(f)
-
-    def tearDown(self) -> None:
-        os.remove(self.fname)
-        super().tearDown()
-
-    def with_spaces(self, *args: Any, **kwargs: Any) -> None:
-        kwargs['stdout'] = subprocess.PIPE
-        p = subprocess.Popen(*args, **kwargs)
-        self.addCleanup(p.stdout.close)
-        self.assertEqual(
-          p.stdout.read ().decode("mbcs"),
-          "2 [%r, 'ab cd']" % self.fname
-        )
-
-    def test_shell_string_with_spaces(self) -> None:
-        # call() function with string argument with spaces on Windows
-        self.with_spaces('"%s" "%s" "%s"' % (sys.executable, self.fname,
-                                             "ab cd"), shell=1)
-
-    def test_shell_sequence_with_spaces(self) -> None:
-        # call() function with sequence argument with spaces on Windows
-        self.with_spaces([sys.executable, self.fname, "ab cd"], shell=1)
-
-    def test_noshell_string_with_spaces(self) -> None:
-        # call() function with string argument with spaces on Windows
-        self.with_spaces('"%s" "%s" "%s"' % (sys.executable, self.fname,
-                             "ab cd"))
-
-    def test_noshell_sequence_with_spaces(self) -> None:
-        # call() function with sequence argument with spaces on Windows
-        self.with_spaces([sys.executable, self.fname, "ab cd"])
-
-
-class ContextManagerTests(BaseTestCase):
-
-    def test_pipe(self) -> None:
-        with subprocess.Popen([sys.executable, "-c",
-                               "import sys;"
-                               "sys.stdout.write('stdout');"
-                               "sys.stderr.write('stderr');"],
-                              stdout=subprocess.PIPE,
-                              stderr=subprocess.PIPE) as proc:
-            self.assertEqual(proc.stdout.read(), b"stdout")
-            self.assertStderrEqual(proc.stderr.read(), b"stderr")
-
-        self.assertTrue(proc.stdout.closed)
-        self.assertTrue(proc.stderr.closed)
-
-    def test_returncode(self) -> None:
-        with subprocess.Popen([sys.executable, "-c",
-                               "import sys; sys.exit(100)"]) as proc:
-            pass
-        # __exit__ calls wait(), so the returncode should be set
-        self.assertEqual(proc.returncode, 100)
-
-    def test_communicate_stdin(self) -> None:
-        with subprocess.Popen([sys.executable, "-c",
-                              "import sys;"
-                              "sys.exit(sys.stdin.read() == 'context')"],
-                             stdin=subprocess.PIPE) as proc:
-            proc.communicate(b"context")
-            self.assertEqual(proc.returncode, 1)
-
-    def test_invalid_args(self) -> None:
-        with self.assertRaises(EnvironmentError) as c:
-            with subprocess.Popen(['nonexisting_i_hope'],
-                                  stdout=subprocess.PIPE,
-                                  stderr=subprocess.PIPE) as proc:
-                pass
-
-            if c.exception.errno != errno.ENOENT:  # ignore "no such file"
-                raise c.exception
-
-
-def test_main():
-    unit_tests = (ProcessTestCase,
-                  POSIXProcessTestCase,
-                  Win32ProcessTestCase,
-                  #ProcessTestCasePOSIXPurePython,
-                  CommandTests,
-                  ProcessTestCaseNoPoll,
-                  HelperFunctionTests,
-                  CommandsWithSpaces,
-                  ContextManagerTests,
-                  )
-
-    support.run_unittest(*unit_tests)
-    support.reap_children()
-
-if __name__ == "__main__":
-    unittest.main()
diff --git a/test-data/stdlib-samples/3.2/test/test_tempfile.py b/test-data/stdlib-samples/3.2/test/test_tempfile.py
deleted file mode 100644
index 31b0fec..0000000
--- a/test-data/stdlib-samples/3.2/test/test_tempfile.py
+++ /dev/null
@@ -1,1122 +0,0 @@
-# tempfile.py unit tests.
-import tempfile
-import os
-import signal
-import sys
-import re
-import warnings
-
-import unittest
-from test import support
-
-from typing import Any, AnyStr, List, Dict, IO
-
-
-if hasattr(os, 'stat'):
-    import stat
-    has_stat = 1
-else:
-    has_stat = 0
-
-has_textmode = (tempfile._text_openflags != tempfile._bin_openflags)
-has_spawnl = hasattr(os, 'spawnl')
-
-# TEST_FILES may need to be tweaked for systems depending on the maximum
-# number of files that can be opened at one time (see ulimit -n)
-if sys.platform in ('openbsd3', 'openbsd4'):
-    TEST_FILES = 48
-else:
-    TEST_FILES = 100
-
-# This is organized as one test for each chunk of code in tempfile.py,
-# in order of their appearance in the file.  Testing which requires
-# threads is not done here.
-
-# Common functionality.
-class TC(unittest.TestCase):
-
-    str_check = re.compile(r"[a-zA-Z0-9_-]{6}$")
-
-    def setUp(self) -> None:
-        self._warnings_manager = support.check_warnings()
-        self._warnings_manager.__enter__()
-        warnings.filterwarnings("ignore", category=RuntimeWarning,
-                                message="mktemp", module=__name__)
-
-    def tearDown(self) -> None:
-        self._warnings_manager.__exit__(None, None, None)
-
-
-    def failOnException(self, what: str, ei: tuple = None) -> None:
-        if ei is None:
-            ei = sys.exc_info()
-        self.fail("%s raised %s: %s" % (what, ei[0], ei[1]))
-
-    def nameCheck(self, name: str, dir: str, pre: str, suf: str) -> None:
-        (ndir, nbase) = os.path.split(name)
-        npre  = nbase[:len(pre)]
-        nsuf  = nbase[len(nbase)-len(suf):]
-
-        # check for equality of the absolute paths!
-        self.assertEqual(os.path.abspath(ndir), os.path.abspath(dir),
-                         "file '%s' not in directory '%s'" % (name, dir))
-        self.assertEqual(npre, pre,
-                         "file '%s' does not begin with '%s'" % (nbase, pre))
-        self.assertEqual(nsuf, suf,
-                         "file '%s' does not end with '%s'" % (nbase, suf))
-
-        nbase = nbase[len(pre):len(nbase)-len(suf)]
-        self.assertTrue(self.str_check.match(nbase),
-                     "random string '%s' does not match /^[a-zA-Z0-9_-]{6}$/"
-                     % nbase)
-
-test_classes = [] # type: List[type]
-
-class test_exports(TC):
-    def test_exports(self) -> None:
-        # There are no surprising symbols in the tempfile module
-        dict = tempfile.__dict__
-
-        expected = {
-            "NamedTemporaryFile" : 1,
-            "TemporaryFile" : 1,
-            "mkstemp" : 1,
-            "mkdtemp" : 1,
-            "mktemp" : 1,
-            "TMP_MAX" : 1,
-            "gettempprefix" : 1,
-            "gettempdir" : 1,
-            "tempdir" : 1,
-            "template" : 1,
-            "SpooledTemporaryFile" : 1,
-            "TemporaryDirectory" : 1,
-        }
-
-        unexp = []  # type: List[str]
-        for key in dict:
-            if key[0] != '_' and key not in expected:
-                unexp.append(key)
-        self.assertTrue(len(unexp) == 0,
-                        "unexpected keys: %s" % unexp)
-
-test_classes.append(test_exports)
-
-
-class test__RandomNameSequence(TC):
-    """Test the internal iterator object _RandomNameSequence."""
-
-    def setUp(self) -> None:
-        self.r = tempfile._RandomNameSequence()
-        super().setUp()
-
-    def test_get_six_char_str(self) -> None:
-        # _RandomNameSequence returns a six-character string
-        s = next(self.r)
-        self.nameCheck(s, '', '', '')
-
-    def test_many(self) -> None:
-        # _RandomNameSequence returns no duplicate strings (stochastic)
-
-        dict = {}  # type: Dict[str, int]
-        r = self.r
-        for i in range(TEST_FILES):
-            s = next(r)
-            self.nameCheck(s, '', '', '')
-            self.assertNotIn(s, dict)
-            dict[s] = 1
-
-    def supports_iter(self) -> None:
-        # _RandomNameSequence supports the iterator protocol
-
-        i = 0
-        r = self.r
-        try:
-            for s in r:
-                i += 1
-                if i == 20:
-                    break
-        except:
-            self.failOnException("iteration")
-
-    @unittest.skipUnless(hasattr(os, 'fork'),
-        "os.fork is required for this test")
-    def test_process_awareness(self) -> None:
-        # ensure that the random source differs between
-        # child and parent.
-        read_fd, write_fd = os.pipe()
-        pid = None # type: int
-        try:
-            pid = os.fork()
-            if not pid:
-                os.close(read_fd)
-                os.write(write_fd, next(self.r).encode("ascii"))
-                os.close(write_fd)
-                # bypass the normal exit handlers- leave those to
-                # the parent.
-                os._exit(0)
-            parent_value = next(self.r)
-            child_value = os.read(read_fd, len(parent_value)).decode("ascii")
-        finally:
-            if pid:
-                # best effort to ensure the process can't bleed out
-                # via any bugs above
-                try:
-                    os.kill(pid, signal.SIGKILL)
-                except EnvironmentError:
-                    pass
-            os.close(read_fd)
-            os.close(write_fd)
-        self.assertNotEqual(child_value, parent_value)
-
-
-test_classes.append(test__RandomNameSequence)
-
-
-class test__candidate_tempdir_list(TC):
-    """Test the internal function _candidate_tempdir_list."""
-
-    def test_nonempty_list(self) -> None:
-        # _candidate_tempdir_list returns a nonempty list of strings
-
-        cand = tempfile._candidate_tempdir_list()
-
-        self.assertFalse(len(cand) == 0)
-        for c in cand:
-            self.assertIsInstance(c, str)
-
-    def test_wanted_dirs(self) -> None:
-        # _candidate_tempdir_list contains the expected directories
-
-        # Make sure the interesting environment variables are all set.
-        with support.EnvironmentVarGuard() as env:
-            for envname in 'TMPDIR', 'TEMP', 'TMP':
-                dirname = os.getenv(envname)
-                if not dirname:
-                    env[envname] = os.path.abspath(envname)
-
-            cand = tempfile._candidate_tempdir_list()
-
-            for envname in 'TMPDIR', 'TEMP', 'TMP':
-                dirname = os.getenv(envname)
-                if not dirname: raise ValueError
-                self.assertIn(dirname, cand)
-
-            try:
-                dirname = os.getcwd()
-            except (AttributeError, os.error):
-                dirname = os.curdir
-
-            self.assertIn(dirname, cand)
-
-            # Not practical to try to verify the presence of OS-specific
-            # paths in this list.
-
-test_classes.append(test__candidate_tempdir_list)
-
-
-# We test _get_default_tempdir by testing gettempdir.
-
-
-class test__get_candidate_names(TC):
-    """Test the internal function _get_candidate_names."""
-
-    def test_retval(self) -> None:
-        # _get_candidate_names returns a _RandomNameSequence object
-        obj = tempfile._get_candidate_names()
-        self.assertIsInstance(obj, tempfile._RandomNameSequence)
-
-    def test_same_thing(self) -> None:
-        # _get_candidate_names always returns the same object
-        a = tempfile._get_candidate_names()
-        b = tempfile._get_candidate_names()
-
-        self.assertTrue(a is b)
-
-test_classes.append(test__get_candidate_names)
-
-
-class test__mkstemp_inner(TC):
-    """Test the internal function _mkstemp_inner."""
-
-    class mkstemped:
-        _bflags = tempfile._bin_openflags
-        _tflags = tempfile._text_openflags
-
-        def __init__(self, dir: str, pre: str, suf: str, bin: int) -> None:
-            if bin: flags = self._bflags
-            else:   flags = self._tflags
-
-            (self.fd, self.name) = tempfile._mkstemp_inner(dir, pre, suf, flags)
-
-            self._close = os.close
-            self._unlink = os.unlink
-
-        def write(self, str: bytes) -> None:
-            os.write(self.fd, str)
-
-        def __del__(self) -> None:
-            self._close(self.fd)
-            self._unlink(self.name)
-
-    def do_create(self, dir: str = None, pre: str = "", suf: str= "",
-                  bin: int = 1) -> mkstemped:
-        if dir is None:
-            dir = tempfile.gettempdir()
-        try:
-            file = test__mkstemp_inner.mkstemped(dir, pre, suf, bin) # see #259
-        except:
-            self.failOnException("_mkstemp_inner")
-
-        self.nameCheck(file.name, dir, pre, suf)
-        return file
-
-    def test_basic(self) -> None:
-        # _mkstemp_inner can create files
-        self.do_create().write(b"blat")
-        self.do_create(pre="a").write(b"blat")
-        self.do_create(suf="b").write(b"blat")
-        self.do_create(pre="a", suf="b").write(b"blat")
-        self.do_create(pre="aa", suf=".txt").write(b"blat")
-
-    def test_basic_many(self) -> None:
-        # _mkstemp_inner can create many files (stochastic)
-        extant = list(range(TEST_FILES))  # type: List[Any]
-        for i in extant:
-            extant[i] = self.do_create(pre="aa")
-
-    def test_choose_directory(self) -> None:
-        # _mkstemp_inner can create files in a user-selected directory
-        dir = tempfile.mkdtemp()
-        try:
-            self.do_create(dir=dir).write(b"blat")
-        finally:
-            os.rmdir(dir)
-
-    def test_file_mode(self) -> None:
-        # _mkstemp_inner creates files with the proper mode
-        if not has_stat:
-            return            # ugh, can't use SkipTest.
-
-        file = self.do_create()
-        mode = stat.S_IMODE(os.stat(file.name).st_mode)
-        expected = 0o600
-        if sys.platform in ('win32', 'os2emx'):
-            # There's no distinction among 'user', 'group' and 'world';
-            # replicate the 'user' bits.
-            user = expected >> 6
-            expected = user * (1 + 8 + 64)
-        self.assertEqual(mode, expected)
-
-    def test_noinherit(self) -> None:
-        # _mkstemp_inner file handles are not inherited by child processes
-        if not has_spawnl:
-            return            # ugh, can't use SkipTest.
-
-        if support.verbose:
-            v="v"
-        else:
-            v="q"
-
-        file = self.do_create()
-        fd = "%d" % file.fd
-
-        try:
-            me = __file__ # type: str
-        except NameError:
-            me = sys.argv[0]
-
-        # We have to exec something, so that FD_CLOEXEC will take
-        # effect.  The core of this test is therefore in
-        # tf_inherit_check.py, which see.
-        tester = os.path.join(os.path.dirname(os.path.abspath(me)),
-                              "tf_inherit_check.py")
-
-        # On Windows a spawn* /path/ with embedded spaces shouldn't be quoted,
-        # but an arg with embedded spaces should be decorated with double
-        # quotes on each end
-        if sys.platform in ('win32',):
-            decorated = '"%s"' % sys.executable
-            tester = '"%s"' % tester
-        else:
-            decorated = sys.executable
-
-        retval = os.spawnl(os.P_WAIT, sys.executable, decorated, tester, v, fd)
-        self.assertFalse(retval < 0,
-                    "child process caught fatal signal %d" % -retval)
-        self.assertFalse(retval > 0, "child process reports failure %d"%retval)
-
-    def test_textmode(self) -> None:
-        # _mkstemp_inner can create files in text mode
-        if not has_textmode:
-            return            # ugh, can't use SkipTest.
-
-        # A text file is truncated at the first Ctrl+Z byte
-        f = self.do_create(bin=0)
-        f.write(b"blat\x1a")
-        f.write(b"extra\n")
-        os.lseek(f.fd, 0, os.SEEK_SET)
-        self.assertEqual(os.read(f.fd, 20), b"blat")
-
-test_classes.append(test__mkstemp_inner)
-
-
-class test_gettempprefix(TC):
-    """Test gettempprefix()."""
-
-    def test_sane_template(self) -> None:
-        # gettempprefix returns a nonempty prefix string
-        p = tempfile.gettempprefix()
-
-        self.assertIsInstance(p, str)
-        self.assertTrue(len(p) > 0)
-
-    def test_usable_template(self) -> None:
-        # gettempprefix returns a usable prefix string
-
-        # Create a temp directory, avoiding use of the prefix.
-        # Then attempt to create a file whose name is
-        # prefix + 'xxxxxx.xxx' in that directory.
-        p = tempfile.gettempprefix() + "xxxxxx.xxx"
-        d = tempfile.mkdtemp(prefix="")
-        try:
-            p = os.path.join(d, p)
-            try:
-                fd = os.open(p, os.O_RDWR | os.O_CREAT)
-            except:
-                self.failOnException("os.open")
-            os.close(fd)
-            os.unlink(p)
-        finally:
-            os.rmdir(d)
-
-test_classes.append(test_gettempprefix)
-
-
-class test_gettempdir(TC):
-    """Test gettempdir()."""
-
-    def test_directory_exists(self) -> None:
-        # gettempdir returns a directory which exists
-
-        dir = tempfile.gettempdir()
-        self.assertTrue(os.path.isabs(dir) or dir == os.curdir,
-                     "%s is not an absolute path" % dir)
-        self.assertTrue(os.path.isdir(dir),
-                     "%s is not a directory" % dir)
-
-    def test_directory_writable(self) -> None:
-        # gettempdir returns a directory writable by the user
-
-        # sneaky: just instantiate a NamedTemporaryFile, which
-        # defaults to writing into the directory returned by
-        # gettempdir.
-        try:
-            file = tempfile.NamedTemporaryFile()
-            file.write(b"blat")
-            file.close()
-        except:
-            self.failOnException("create file in %s" % tempfile.gettempdir())
-
-    def test_same_thing(self) -> None:
-        # gettempdir always returns the same object
-        a = tempfile.gettempdir()
-        b = tempfile.gettempdir()
-
-        self.assertTrue(a is b)
-
-test_classes.append(test_gettempdir)
-
-
-class test_mkstemp(TC):
-    """Test mkstemp()."""
-
-    def do_create(self, dir: str = None, pre: str = "", suf: str = "") -> None:
-        if dir is None:
-            dir = tempfile.gettempdir()
-        try:
-            (fd, name) = tempfile.mkstemp(dir=dir, prefix=pre, suffix=suf)
-            (ndir, nbase) = os.path.split(name)
-            adir = os.path.abspath(dir)
-            self.assertEqual(adir, ndir,
-                "Directory '%s' incorrectly returned as '%s'" % (adir, ndir))
-        except:
-            self.failOnException("mkstemp")
-
-        try:
-            self.nameCheck(name, dir, pre, suf)
-        finally:
-            os.close(fd)
-            os.unlink(name)
-
-    def test_basic(self) -> None:
-        # mkstemp can create files
-        self.do_create()
-        self.do_create(pre="a")
-        self.do_create(suf="b")
-        self.do_create(pre="a", suf="b")
-        self.do_create(pre="aa", suf=".txt")
-        self.do_create(dir=".")
-
-    def test_choose_directory(self) -> None:
-        # mkstemp can create directories in a user-selected directory
-        dir = tempfile.mkdtemp()
-        try:
-            self.do_create(dir=dir)
-        finally:
-            os.rmdir(dir)
-
-test_classes.append(test_mkstemp)
-
-
-class test_mkdtemp(TC):
-    """Test mkdtemp()."""
-
-    def do_create(self, dir: str = None, pre: str = "", suf: str = "") -> str:
-        if dir is None:
-            dir = tempfile.gettempdir()
-        try:
-            name = tempfile.mkdtemp(dir=dir, prefix=pre, suffix=suf)
-        except:
-            self.failOnException("mkdtemp")
-
-        try:
-            self.nameCheck(name, dir, pre, suf)
-            return name
-        except:
-            os.rmdir(name)
-            raise
-
-    def test_basic(self) -> None:
-        # mkdtemp can create directories
-        os.rmdir(self.do_create())
-        os.rmdir(self.do_create(pre="a"))
-        os.rmdir(self.do_create(suf="b"))
-        os.rmdir(self.do_create(pre="a", suf="b"))
-        os.rmdir(self.do_create(pre="aa", suf=".txt"))
-
-    def test_basic_many(self) -> None:
-        # mkdtemp can create many directories (stochastic)
-        extant = list(range(TEST_FILES))  # type: List[Any]
-        try:
-            for i in extant:
-                extant[i] = self.do_create(pre="aa")
-        finally:
-            for i in extant:
-                if(isinstance(i, str)):
-                    os.rmdir(i)
-
-    def test_choose_directory(self) -> None:
-        # mkdtemp can create directories in a user-selected directory
-        dir = tempfile.mkdtemp()
-        try:
-            os.rmdir(self.do_create(dir=dir))
-        finally:
-            os.rmdir(dir)
-
-    def test_mode(self) -> None:
-        # mkdtemp creates directories with the proper mode
-        if not has_stat:
-            return            # ugh, can't use SkipTest.
-
-        dir = self.do_create()
-        try:
-            mode = stat.S_IMODE(os.stat(dir).st_mode)
-            mode &= 0o777 # Mask off sticky bits inherited from /tmp
-            expected = 0o700
-            if sys.platform in ('win32', 'os2emx'):
-                # There's no distinction among 'user', 'group' and 'world';
-                # replicate the 'user' bits.
-                user = expected >> 6
-                expected = user * (1 + 8 + 64)
-            self.assertEqual(mode, expected)
-        finally:
-            os.rmdir(dir)
-
-test_classes.append(test_mkdtemp)
-
-
-class test_mktemp(TC):
-    """Test mktemp()."""
-
-    # For safety, all use of mktemp must occur in a private directory.
-    # We must also suppress the RuntimeWarning it generates.
-    def setUp(self) -> None:
-        self.dir = tempfile.mkdtemp()
-        super().setUp()
-
-    def tearDown(self) -> None:
-        if self.dir:
-            os.rmdir(self.dir)
-            self.dir = None
-        super().tearDown()
-
-    class mktemped:
-        def _unlink(self, path: str) -> None:
-            os.unlink(path)
-
-        _bflags = tempfile._bin_openflags
-
-        def __init__(self, dir: str, pre: str, suf: str) -> None:
-            self.name = tempfile.mktemp(dir=dir, prefix=pre, suffix=suf)
-            # Create the file.  This will raise an exception if it's
-            # mysteriously appeared in the meanwhile.
-            os.close(os.open(self.name, self._bflags, 0o600))
-
-        def __del__(self) -> None:
-            self._unlink(self.name)
-
-    def do_create(self, pre: str = "", suf: str = "") -> mktemped:
-        try:
-            file = test_mktemp.mktemped(self.dir, pre, suf) # see #259
-        except:
-            self.failOnException("mktemp")
-
-        self.nameCheck(file.name, self.dir, pre, suf)
-        return file
-
-    def test_basic(self) -> None:
-        # mktemp can choose usable file names
-        self.do_create()
-        self.do_create(pre="a")
-        self.do_create(suf="b")
-        self.do_create(pre="a", suf="b")
-        self.do_create(pre="aa", suf=".txt")
-
-    def test_many(self) -> None:
-        # mktemp can choose many usable file names (stochastic)
-        extant = list(range(TEST_FILES))  # type: List[Any]
-        for i in extant:
-            extant[i] = self.do_create(pre="aa")
-
-##     def test_warning(self):
-##         # mktemp issues a warning when used
-##         warnings.filterwarnings("error",
-##                                 category=RuntimeWarning,
-##                                 message="mktemp")
-##         self.assertRaises(RuntimeWarning,
-##                           tempfile.mktemp, dir=self.dir)
-
-test_classes.append(test_mktemp)
-
-
-# We test _TemporaryFileWrapper by testing NamedTemporaryFile.
-
-
-class test_NamedTemporaryFile(TC):
-    """Test NamedTemporaryFile()."""
-
-    def do_create(self, dir: str = None, pre: str = "", suf: str = "",
-                  delete: bool = True) -> IO[Any]:
-        if dir is None:
-            dir = tempfile.gettempdir()
-        try:
-            file = tempfile.NamedTemporaryFile(dir=dir, prefix=pre, suffix=suf,
-                                               delete=delete)
-        except:
-            self.failOnException("NamedTemporaryFile")
-
-        self.nameCheck(file.name, dir, pre, suf)
-        return file
-
-
-    def test_basic(self) -> None:
-        # NamedTemporaryFile can create files
-        self.do_create()
-        self.do_create(pre="a")
-        self.do_create(suf="b")
-        self.do_create(pre="a", suf="b")
-        self.do_create(pre="aa", suf=".txt")
-
-    def test_creates_named(self) -> None:
-        # NamedTemporaryFile creates files with names
-        f = tempfile.NamedTemporaryFile()
-        self.assertTrue(os.path.exists(f.name),
-                        "NamedTemporaryFile %s does not exist" % f.name)
-
-    def test_del_on_close(self) -> None:
-        # A NamedTemporaryFile is deleted when closed
-        dir = tempfile.mkdtemp()
-        try:
-            f = tempfile.NamedTemporaryFile(dir=dir)
-            f.write(b'blat')
-            f.close()
-            self.assertFalse(os.path.exists(f.name),
-                        "NamedTemporaryFile %s exists after close" % f.name)
-        finally:
-            os.rmdir(dir)
-
-    def test_dis_del_on_close(self) -> None:
-        # Tests that delete-on-close can be disabled
-        dir = tempfile.mkdtemp()
-        tmp = None # type: str
-        try:
-            f = tempfile.NamedTemporaryFile(dir=dir, delete=False)
-            tmp = f.name
-            f.write(b'blat')
-            f.close()
-            self.assertTrue(os.path.exists(f.name),
-                        "NamedTemporaryFile %s missing after close" % f.name)
-        finally:
-            if tmp is not None:
-                os.unlink(tmp)
-            os.rmdir(dir)
-
-    def test_multiple_close(self) -> None:
-        # A NamedTemporaryFile can be closed many times without error
-        f = tempfile.NamedTemporaryFile()
-        f.write(b'abc\n')
-        f.close()
-        try:
-            f.close()
-            f.close()
-        except:
-            self.failOnException("close")
-
-    def test_context_manager(self) -> None:
-        # A NamedTemporaryFile can be used as a context manager
-        with tempfile.NamedTemporaryFile() as f:
-            self.assertTrue(os.path.exists(f.name))
-        self.assertFalse(os.path.exists(f.name))
-        def use_closed():
-            with f:
-                pass
-        self.assertRaises(ValueError, use_closed)
-
-    # How to test the mode and bufsize parameters?
-
-test_classes.append(test_NamedTemporaryFile)
-
-class test_SpooledTemporaryFile(TC):
-    """Test SpooledTemporaryFile()."""
-
-    def do_create(self, max_size: int = 0, dir: str = None, pre: str = "",
-                  suf: str = "") -> tempfile.SpooledTemporaryFile:
-        if dir is None:
-            dir = tempfile.gettempdir()
-        try:
-            file = tempfile.SpooledTemporaryFile(max_size=max_size, dir=dir, prefix=pre, suffix=suf)
-        except:
-            self.failOnException("SpooledTemporaryFile")
-
-        return file
-
-
-    def test_basic(self) -> None:
-        # SpooledTemporaryFile can create files
-        f = self.do_create()
-        self.assertFalse(f._rolled)
-        f = self.do_create(max_size=100, pre="a", suf=".txt")
-        self.assertFalse(f._rolled)
-
-    def test_del_on_close(self) -> None:
-        # A SpooledTemporaryFile is deleted when closed
-        dir = tempfile.mkdtemp()
-        try:
-            f = tempfile.SpooledTemporaryFile(max_size=10, dir=dir)
-            self.assertFalse(f._rolled)
-            f.write(b'blat ' * 5)
-            self.assertTrue(f._rolled)
-            filename = f.name
-            f.close()
-            self.assertFalse(isinstance(filename, str) and os.path.exists(filename),
-                        "SpooledTemporaryFile %s exists after close" % filename)
-        finally:
-            os.rmdir(dir)
-
-    def test_rewrite_small(self) -> None:
-        # A SpooledTemporaryFile can be written to multiple within the max_size
-        f = self.do_create(max_size=30)
-        self.assertFalse(f._rolled)
-        for i in range(5):
-            f.seek(0, 0)
-            f.write(b'x' * 20)
-        self.assertFalse(f._rolled)
-
-    def test_write_sequential(self) -> None:
-        # A SpooledTemporaryFile should hold exactly max_size bytes, and roll
-        # over afterward
-        f = self.do_create(max_size=30)
-        self.assertFalse(f._rolled)
-        f.write(b'x' * 20)
-        self.assertFalse(f._rolled)
-        f.write(b'x' * 10)
-        self.assertFalse(f._rolled)
-        f.write(b'x')
-        self.assertTrue(f._rolled)
-
-    def test_writelines(self) -> None:
-        # Verify writelines with a SpooledTemporaryFile
-        f = self.do_create()
-        f.writelines([b'x', b'y', b'z'])
-        f.seek(0)
-        buf = f.read()
-        self.assertEqual(buf, b'xyz')
-
-    def test_writelines_sequential(self) -> None:
-        # A SpooledTemporaryFile should hold exactly max_size bytes, and roll
-        # over afterward
-        f = self.do_create(max_size=35)
-        f.writelines([b'x' * 20, b'x' * 10, b'x' * 5])
-        self.assertFalse(f._rolled)
-        f.write(b'x')
-        self.assertTrue(f._rolled)
-
-    def test_sparse(self) -> None:
-        # A SpooledTemporaryFile that is written late in the file will extend
-        # when that occurs
-        f = self.do_create(max_size=30)
-        self.assertFalse(f._rolled)
-        f.seek(100, 0)
-        self.assertFalse(f._rolled)
-        f.write(b'x')
-        self.assertTrue(f._rolled)
-
-    def test_fileno(self) -> None:
-        # A SpooledTemporaryFile should roll over to a real file on fileno()
-        f = self.do_create(max_size=30)
-        self.assertFalse(f._rolled)
-        self.assertTrue(f.fileno() > 0)
-        self.assertTrue(f._rolled)
-
-    def test_multiple_close_before_rollover(self) -> None:
-        # A SpooledTemporaryFile can be closed many times without error
-        f = tempfile.SpooledTemporaryFile()
-        f.write(b'abc\n')
-        self.assertFalse(f._rolled)
-        f.close()
-        try:
-            f.close()
-            f.close()
-        except:
-            self.failOnException("close")
-
-    def test_multiple_close_after_rollover(self) -> None:
-        # A SpooledTemporaryFile can be closed many times without error
-        f = tempfile.SpooledTemporaryFile(max_size=1)
-        f.write(b'abc\n')
-        self.assertTrue(f._rolled)
-        f.close()
-        try:
-            f.close()
-            f.close()
-        except:
-            self.failOnException("close")
-
-    def test_bound_methods(self) -> None:
-        # It should be OK to steal a bound method from a SpooledTemporaryFile
-        # and use it independently; when the file rolls over, those bound
-        # methods should continue to function
-        f = self.do_create(max_size=30)
-        read = f.read
-        write = f.write
-        seek = f.seek
-
-        write(b"a" * 35)
-        write(b"b" * 35)
-        seek(0, 0)
-        self.assertEqual(read(70), b'a'*35 + b'b'*35)
-
-    def test_text_mode(self) -> None:
-        # Creating a SpooledTemporaryFile with a text mode should produce
-        # a file object reading and writing (Unicode) text strings.
-        f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10)
-        f.write("abc\n")
-        f.seek(0)
-        self.assertEqual(f.read(), "abc\n")
-        f.write("def\n")
-        f.seek(0)
-        self.assertEqual(f.read(), "abc\ndef\n")
-        f.write("xyzzy\n")
-        f.seek(0)
-        self.assertEqual(f.read(), "abc\ndef\nxyzzy\n")
-        # Check that Ctrl+Z doesn't truncate the file
-        f.write("foo\x1abar\n")
-        f.seek(0)
-        self.assertEqual(f.read(), "abc\ndef\nxyzzy\nfoo\x1abar\n")
-
-    def test_text_newline_and_encoding(self) -> None:
-        f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10,
-                                          newline='', encoding='utf-8')
-        f.write("\u039B\r\n")
-        f.seek(0)
-        self.assertEqual(f.read(), "\u039B\r\n")
-        self.assertFalse(f._rolled)
-
-        f.write("\u039B" * 20 + "\r\n")
-        f.seek(0)
-        self.assertEqual(f.read(), "\u039B\r\n" + ("\u039B" * 20) + "\r\n")
-        self.assertTrue(f._rolled)
-
-    def test_context_manager_before_rollover(self) -> None:
-        # A SpooledTemporaryFile can be used as a context manager
-        with tempfile.SpooledTemporaryFile(max_size=1) as f:
-            self.assertFalse(f._rolled)
-            self.assertFalse(f.closed)
-        self.assertTrue(f.closed)
-        def use_closed():
-            with f:
-                pass
-        self.assertRaises(ValueError, use_closed)
-
-    def test_context_manager_during_rollover(self) -> None:
-        # A SpooledTemporaryFile can be used as a context manager
-        with tempfile.SpooledTemporaryFile(max_size=1) as f:
-            self.assertFalse(f._rolled)
-            f.write(b'abc\n')
-            f.flush()
-            self.assertTrue(f._rolled)
-            self.assertFalse(f.closed)
-        self.assertTrue(f.closed)
-        def use_closed():
-            with f:
-                pass
-        self.assertRaises(ValueError, use_closed)
-
-    def test_context_manager_after_rollover(self) -> None:
-        # A SpooledTemporaryFile can be used as a context manager
-        f = tempfile.SpooledTemporaryFile(max_size=1)
-        f.write(b'abc\n')
-        f.flush()
-        self.assertTrue(f._rolled)
-        with f:
-            self.assertFalse(f.closed)
-        self.assertTrue(f.closed)
-        def use_closed():
-            with f:
-                pass
-        self.assertRaises(ValueError, use_closed)
-
-
-test_classes.append(test_SpooledTemporaryFile)
-
-
-class test_TemporaryFile(TC):
-    """Test TemporaryFile()."""
-
-    def test_basic(self) -> None:
-        # TemporaryFile can create files
-        # No point in testing the name params - the file has no name.
-        try:
-            tempfile.TemporaryFile()
-        except:
-            self.failOnException("TemporaryFile")
-
-    def test_has_no_name(self) -> None:
-        # TemporaryFile creates files with no names (on this system)
-        dir = tempfile.mkdtemp()
-        f = tempfile.TemporaryFile(dir=dir)
-        f.write(b'blat')
-
-        # Sneaky: because this file has no name, it should not prevent
-        # us from removing the directory it was created in.
-        try:
-            os.rmdir(dir)
-        except:
-            ei = sys.exc_info()
-            # cleanup
-            f.close()
-            os.rmdir(dir)
-            self.failOnException("rmdir", ei)
-
-    def test_multiple_close(self) -> None:
-        # A TemporaryFile can be closed many times without error
-        f = tempfile.TemporaryFile()
-        f.write(b'abc\n')
-        f.close()
-        try:
-            f.close()
-            f.close()
-        except:
-            self.failOnException("close")
-
-    # How to test the mode and bufsize parameters?
-    def test_mode_and_encoding(self) -> None:
-
-        def roundtrip(input: AnyStr, *args: Any, **kwargs: Any) -> None:
-            with tempfile.TemporaryFile(*args, **kwargs) as fileobj:
-                fileobj.write(input)
-                fileobj.seek(0)
-                self.assertEqual(input, fileobj.read())
-
-        roundtrip(b"1234", "w+b")
-        roundtrip("abdc\n", "w+")
-        roundtrip("\u039B", "w+", encoding="utf-16")
-        roundtrip("foo\r\n", "w+", newline="")
-
-
-if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:
-    test_classes.append(test_TemporaryFile)
-
-
-# Helper for test_del_on_shutdown
-class NulledModules:
-    def __init__(self, *modules: Any) -> None:
-        self.refs = [mod.__dict__ for mod in modules]
-        self.contents = [ref.copy() for ref in self.refs]
-
-    def __enter__(self) -> None:
-        for d in self.refs:
-            for key in d:
-                d[key] = None
-
-    def __exit__(self, *exc_info: Any) -> None:
-        for d, c in zip(self.refs, self.contents):
-            d.clear()
-            d.update(c)
-
-class test_TemporaryDirectory(TC):
-    """Test TemporaryDirectory()."""
-
-    def do_create(self, dir: str = None, pre: str = "", suf: str = "",
-                  recurse: int = 1) -> tempfile.TemporaryDirectory:
-        if dir is None:
-            dir = tempfile.gettempdir()
-        try:
-            tmp = tempfile.TemporaryDirectory(dir=dir, prefix=pre, suffix=suf)
-        except:
-            self.failOnException("TemporaryDirectory")
-        self.nameCheck(tmp.name, dir, pre, suf)
-        # Create a subdirectory and some files
-        if recurse:
-            self.do_create(tmp.name, pre, suf, recurse-1)
-        with open(os.path.join(tmp.name, "test.txt"), "wb") as f:
-            f.write(b"Hello world!")
-        return tmp
-
-    def test_mkdtemp_failure(self) -> None:
-        # Check no additional exception if mkdtemp fails
-        # Previously would raise AttributeError instead
-        # (noted as part of Issue #10188)
-        with tempfile.TemporaryDirectory() as nonexistent:
-            pass
-        with self.assertRaises(os.error):
-            tempfile.TemporaryDirectory(dir=nonexistent)
-
-    def test_explicit_cleanup(self) -> None:
-        # A TemporaryDirectory is deleted when cleaned up
-        dir = tempfile.mkdtemp()
-        try:
-            d = self.do_create(dir=dir)
-            self.assertTrue(os.path.exists(d.name),
-                            "TemporaryDirectory %s does not exist" % d.name)
-            d.cleanup()
-            self.assertFalse(os.path.exists(d.name),
-                        "TemporaryDirectory %s exists after cleanup" % d.name)
-        finally:
-            os.rmdir(dir)
-
-    @support.skip_unless_symlink
-    def test_cleanup_with_symlink_to_a_directory(self) -> None:
-        # cleanup() should not follow symlinks to directories (issue #12464)
-        d1 = self.do_create()
-        d2 = self.do_create()
-
-        # Symlink d1/foo -> d2
-        os.symlink(d2.name, os.path.join(d1.name, "foo"))
-
-        # This call to cleanup() should not follow the "foo" symlink
-        d1.cleanup()
-
-        self.assertFalse(os.path.exists(d1.name),
-                         "TemporaryDirectory %s exists after cleanup" % d1.name)
-        self.assertTrue(os.path.exists(d2.name),
-                        "Directory pointed to by a symlink was deleted")
-        self.assertEqual(os.listdir(d2.name), ['test.txt'],
-                         "Contents of the directory pointed to by a symlink "
-                         "were deleted")
-        d2.cleanup()
-
-    @support.cpython_only
-    def test_del_on_collection(self) -> None:
-        # A TemporaryDirectory is deleted when garbage collected
-        dir = tempfile.mkdtemp()
-        try:
-            d = self.do_create(dir=dir)
-            name = d.name
-            del d # Rely on refcounting to invoke __del__
-            self.assertFalse(os.path.exists(name),
-                        "TemporaryDirectory %s exists after __del__" % name)
-        finally:
-            os.rmdir(dir)
-
-    @unittest.expectedFailure # See issue #10188
-    def test_del_on_shutdown(self) -> None:
-        # A TemporaryDirectory may be cleaned up during shutdown
-        # Make sure it works with the relevant modules nulled out
-        with self.do_create() as dir:
-            d = self.do_create(dir=dir)
-            # Mimic the nulling out of modules that
-            # occurs during system shutdown
-            modules = [os, os.path]
-            if has_stat:
-                modules.append(stat)
-            # Currently broken, so suppress the warning
-            # that is otherwise emitted on stdout
-            with support.captured_stderr() as err:
-                with NulledModules(*modules):
-                    d.cleanup()
-            # Currently broken, so stop spurious exception by
-            # indicating the object has already been closed
-            d._closed = True
-            # And this assert will fail, as expected by the
-            # unittest decorator...
-            self.assertFalse(os.path.exists(d.name),
-                        "TemporaryDirectory %s exists after cleanup" % d.name)
-
-    def test_warnings_on_cleanup(self) -> None:
-        # Two kinds of warning on shutdown
-        #   Issue 10888: may write to stderr if modules are nulled out
-        #   ResourceWarning will be triggered by __del__
-        with self.do_create() as dir:
-            if os.sep != '\\':
-                # Embed a backslash in order to make sure string escaping
-                # in the displayed error message is dealt with correctly
-                suffix = '\\check_backslash_handling'
-            else:
-                suffix = ''
-            d = self.do_create(dir=dir, suf=suffix)
-
-            #Check for the Issue 10888 message
-            modules = [os, os.path]
-            if has_stat:
-                modules.append(stat)
-            with support.captured_stderr() as err:
-                with NulledModules(*modules):
-                    d.cleanup()
-            message = err.getvalue().replace('\\\\', '\\')
-            self.assertIn("while cleaning up",  message)
-            self.assertIn(d.name,  message)
-
-            # Check for the resource warning
-            with support.check_warnings(('Implicitly', ResourceWarning), quiet=False):
-                warnings.filterwarnings("always", category=ResourceWarning)
-                d.__del__()
-            self.assertFalse(os.path.exists(d.name),
-                        "TemporaryDirectory %s exists after __del__" % d.name)
-
-    def test_multiple_close(self) -> None:
-        # Can be cleaned-up many times without error
-        d = self.do_create()
-        d.cleanup()
-        try:
-            d.cleanup()
-            d.cleanup()
-        except:
-            self.failOnException("cleanup")
-
-    def test_context_manager(self) -> None:
-        # Can be used as a context manager
-        d = self.do_create()
-        with d as name:
-            self.assertTrue(os.path.exists(name))
-            self.assertEqual(name, d.name)
-        self.assertFalse(os.path.exists(name))
-
-
-test_classes.append(test_TemporaryDirectory)
-
-def test_main() -> None:
-    support.run_unittest(*test_classes)
-
-if __name__ == "__main__":
-    test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_textwrap.py b/test-data/stdlib-samples/3.2/test/test_textwrap.py
deleted file mode 100644
index 79d921a..0000000
--- a/test-data/stdlib-samples/3.2/test/test_textwrap.py
+++ /dev/null
@@ -1,601 +0,0 @@
-#
-# Test suite for the textwrap module.
-#
-# Original tests written by Greg Ward <gward at python.net>.
-# Converted to PyUnit by Peter Hansen <peter at engcorp.com>.
-# Currently maintained by Greg Ward.
-#
-# $Id$
-#
-
-import unittest
-from test import support
-
-from typing import Any, List, Sequence
-
-from textwrap import TextWrapper, wrap, fill, dedent
-
-
-class BaseTestCase(unittest.TestCase):
-    '''Parent class with utility methods for textwrap tests.'''
-
-    wrapper = None  # type: TextWrapper
-
-    def show(self, textin: Sequence[str]) -> str:
-        if isinstance(textin, list):
-            results = []  # type: List[str]
-            for i in range(len(textin)):
-                results.append("  %d: %r" % (i, textin[i]))
-            result = '\n'.join(results)
-        elif isinstance(textin, str):
-            result = "  %s\n" % repr(textin)
-        return result
-
-
-    def check(self, result: Sequence[str], expect: Sequence[str]) -> None:
-        self.assertEqual(result, expect,
-            'expected:\n%s\nbut got:\n%s' % (
-                self.show(expect), self.show(result)))
-
-    def check_wrap(self, text: str, width: int, expect: Sequence[str],
-                   **kwargs: Any) -> None:
-        result = wrap(text, width, **kwargs)
-        self.check(result, expect)
-
-    def check_split(self, text: str, expect: Sequence[str]) -> None:
-        result = self.wrapper._split(text)
-        self.assertEqual(result, expect,
-                         "\nexpected %r\n"
-                         "but got  %r" % (expect, result))
-
-
-class WrapTestCase(BaseTestCase):
-
-    def setUp(self) -> None:
-        self.wrapper = TextWrapper(width=45)
-
-    def test_simple(self) -> None:
-        # Simple case: just words, spaces, and a bit of punctuation
-
-        text = "Hello there, how are you this fine day?  I'm glad to hear it!"
-
-        self.check_wrap(text, 12,
-                        ["Hello there,",
-                         "how are you",
-                         "this fine",
-                         "day?  I'm",
-                         "glad to hear",
-                         "it!"])
-        self.check_wrap(text, 42,
-                        ["Hello there, how are you this fine day?",
-                         "I'm glad to hear it!"])
-        self.check_wrap(text, 80, [text])
-
-
-    def test_whitespace(self) -> None:
-        # Whitespace munging and end-of-sentence detection
-
-        text = """\
-This is a paragraph that already has
-line breaks.  But some of its lines are much longer than the others,
-so it needs to be wrapped.
-Some lines are \ttabbed too.
-What a mess!
-"""
-
-        expect = ["This is a paragraph that already has line",
-                  "breaks.  But some of its lines are much",
-                  "longer than the others, so it needs to be",
-                  "wrapped.  Some lines are  tabbed too.  What a",
-                  "mess!"]
-
-        wrapper = TextWrapper(45, fix_sentence_endings=True)
-        result = wrapper.wrap(text)
-        self.check(result, expect)
-
-        results = wrapper.fill(text)
-        self.check(results, '\n'.join(expect))
-
-    def test_fix_sentence_endings(self) -> None:
-        wrapper = TextWrapper(60, fix_sentence_endings=True)
-
-        # SF #847346: ensure that fix_sentence_endings=True does the
-        # right thing even on input short enough that it doesn't need to
-        # be wrapped.
-        text = "A short line. Note the single space."
-        expect = ["A short line.  Note the single space."]
-        self.check(wrapper.wrap(text), expect)
-
-        # Test some of the hairy end cases that _fix_sentence_endings()
-        # is supposed to handle (the easy stuff is tested in
-        # test_whitespace() above).
-        text = "Well, Doctor? What do you think?"
-        expect = ["Well, Doctor?  What do you think?"]
-        self.check(wrapper.wrap(text), expect)
-
-        text = "Well, Doctor?\nWhat do you think?"
-        self.check(wrapper.wrap(text), expect)
-
-        text = 'I say, chaps! Anyone for "tennis?"\nHmmph!'
-        expect = ['I say, chaps!  Anyone for "tennis?"  Hmmph!']
-        self.check(wrapper.wrap(text), expect)
-
-        wrapper.width = 20
-        expect = ['I say, chaps!', 'Anyone for "tennis?"', 'Hmmph!']
-        self.check(wrapper.wrap(text), expect)
-
-        text = 'And she said, "Go to hell!"\nCan you believe that?'
-        expect = ['And she said, "Go to',
-                  'hell!"  Can you',
-                  'believe that?']
-        self.check(wrapper.wrap(text), expect)
-
-        wrapper.width = 60
-        expect = ['And she said, "Go to hell!"  Can you believe that?']
-        self.check(wrapper.wrap(text), expect)
-
-        text = 'File stdio.h is nice.'
-        expect = ['File stdio.h is nice.']
-        self.check(wrapper.wrap(text), expect)
-
-    def test_wrap_short(self) -> None:
-        # Wrapping to make short lines longer
-
-        text = "This is a\nshort paragraph."
-
-        self.check_wrap(text, 20, ["This is a short",
-                                   "paragraph."])
-        self.check_wrap(text, 40, ["This is a short paragraph."])
-
-
-    def test_wrap_short_1line(self) -> None:
-        # Test endcases
-
-        text = "This is a short line."
-
-        self.check_wrap(text, 30, ["This is a short line."])
-        self.check_wrap(text, 30, ["(1) This is a short line."],
-                        initial_indent="(1) ")
-
-
-    def test_hyphenated(self) -> None:
-        # Test breaking hyphenated words
-
-        text = ("this-is-a-useful-feature-for-"
-                "reformatting-posts-from-tim-peters'ly")
-
-        self.check_wrap(text, 40,
-                        ["this-is-a-useful-feature-for-",
-                         "reformatting-posts-from-tim-peters'ly"])
-        self.check_wrap(text, 41,
-                        ["this-is-a-useful-feature-for-",
-                         "reformatting-posts-from-tim-peters'ly"])
-        self.check_wrap(text, 42,
-                        ["this-is-a-useful-feature-for-reformatting-",
-                         "posts-from-tim-peters'ly"])
-
-    def test_hyphenated_numbers(self) -> None:
-        # Test that hyphenated numbers (eg. dates) are not broken like words.
-        text = ("Python 1.0.0 was released on 1994-01-26.  Python 1.0.1 was\n"
-                "released on 1994-02-15.")
-
-        self.check_wrap(text, 30, ['Python 1.0.0 was released on',
-                                   '1994-01-26.  Python 1.0.1 was',
-                                   'released on 1994-02-15.'])
-        self.check_wrap(text, 40, ['Python 1.0.0 was released on 1994-01-26.',
-                                   'Python 1.0.1 was released on 1994-02-15.'])
-
-        text = "I do all my shopping at 7-11."
-        self.check_wrap(text, 25, ["I do all my shopping at",
-                                   "7-11."])
-        self.check_wrap(text, 27, ["I do all my shopping at",
-                                   "7-11."])
-        self.check_wrap(text, 29, ["I do all my shopping at 7-11."])
-
-    def test_em_dash(self) -> None:
-        # Test text with em-dashes
-        text = "Em-dashes should be written -- thus."
-        self.check_wrap(text, 25,
-                        ["Em-dashes should be",
-                         "written -- thus."])
-
-        # Probe the boundaries of the properly written em-dash,
-        # ie. " -- ".
-        self.check_wrap(text, 29,
-                        ["Em-dashes should be written",
-                         "-- thus."])
-        expect = ["Em-dashes should be written --",
-                  "thus."]
-        self.check_wrap(text, 30, expect)
-        self.check_wrap(text, 35, expect)
-        self.check_wrap(text, 36,
-                        ["Em-dashes should be written -- thus."])
-
-        # The improperly written em-dash is handled too, because
-        # it's adjacent to non-whitespace on both sides.
-        text = "You can also do--this or even---this."
-        expect = ["You can also do",
-                  "--this or even",
-                  "---this."]
-        self.check_wrap(text, 15, expect)
-        self.check_wrap(text, 16, expect)
-        expect = ["You can also do--",
-                  "this or even---",
-                  "this."]
-        self.check_wrap(text, 17, expect)
-        self.check_wrap(text, 19, expect)
-        expect = ["You can also do--this or even",
-                  "---this."]
-        self.check_wrap(text, 29, expect)
-        self.check_wrap(text, 31, expect)
-        expect = ["You can also do--this or even---",
-                  "this."]
-        self.check_wrap(text, 32, expect)
-        self.check_wrap(text, 35, expect)
-
-        # All of the above behaviour could be deduced by probing the
-        # _split() method.
-        text = "Here's an -- em-dash and--here's another---and another!"
-        expect = ["Here's", " ", "an", " ", "--", " ", "em-", "dash", " ",
-                  "and", "--", "here's", " ", "another", "---",
-                  "and", " ", "another!"]
-        self.check_split(text, expect)
-
-        text = "and then--bam!--he was gone"
-        expect = ["and", " ", "then", "--", "bam!", "--",
-                  "he", " ", "was", " ", "gone"]
-        self.check_split(text, expect)
-
-
-    def test_unix_options (self) -> None:
-        # Test that Unix-style command-line options are wrapped correctly.
-        # Both Optik (OptionParser) and Docutils rely on this behaviour!
-
-        text = "You should use the -n option, or --dry-run in its long form."
-        self.check_wrap(text, 20,
-                        ["You should use the",
-                         "-n option, or --dry-",
-                         "run in its long",
-                         "form."])
-        self.check_wrap(text, 21,
-                        ["You should use the -n",
-                         "option, or --dry-run",
-                         "in its long form."])
-        expect = ["You should use the -n option, or",
-                  "--dry-run in its long form."]
-        self.check_wrap(text, 32, expect)
-        self.check_wrap(text, 34, expect)
-        self.check_wrap(text, 35, expect)
-        self.check_wrap(text, 38, expect)
-        expect = ["You should use the -n option, or --dry-",
-                  "run in its long form."]
-        self.check_wrap(text, 39, expect)
-        self.check_wrap(text, 41, expect)
-        expect = ["You should use the -n option, or --dry-run",
-                  "in its long form."]
-        self.check_wrap(text, 42, expect)
-
-        # Again, all of the above can be deduced from _split().
-        text = "the -n option, or --dry-run or --dryrun"
-        expect = ["the", " ", "-n", " ", "option,", " ", "or", " ",
-                  "--dry-", "run", " ", "or", " ", "--dryrun"]
-        self.check_split(text, expect)
-
-    def test_funky_hyphens (self) -> None:
-        # Screwy edge cases cooked up by David Goodger.  All reported
-        # in SF bug #596434.
-        self.check_split("what the--hey!", ["what", " ", "the", "--", "hey!"])
-        self.check_split("what the--", ["what", " ", "the--"])
-        self.check_split("what the--.", ["what", " ", "the--."])
-        self.check_split("--text--.", ["--text--."])
-
-        # When I first read bug #596434, this is what I thought David
-        # was talking about.  I was wrong; these have always worked
-        # fine.  The real problem is tested in test_funky_parens()
-        # below...
-        self.check_split("--option", ["--option"])
-        self.check_split("--option-opt", ["--option-", "opt"])
-        self.check_split("foo --option-opt bar",
-                         ["foo", " ", "--option-", "opt", " ", "bar"])
-
-    def test_punct_hyphens(self) -> None:
-        # Oh bother, SF #965425 found another problem with hyphens --
-        # hyphenated words in single quotes weren't handled correctly.
-        # In fact, the bug is that *any* punctuation around a hyphenated
-        # word was handled incorrectly, except for a leading "--", which
-        # was special-cased for Optik and Docutils.  So test a variety
-        # of styles of punctuation around a hyphenated word.
-        # (Actually this is based on an Optik bug report, #813077).
-        self.check_split("the 'wibble-wobble' widget",
-                         ['the', ' ', "'wibble-", "wobble'", ' ', 'widget'])
-        self.check_split('the "wibble-wobble" widget',
-                         ['the', ' ', '"wibble-', 'wobble"', ' ', 'widget'])
-        self.check_split("the (wibble-wobble) widget",
-                         ['the', ' ', "(wibble-", "wobble)", ' ', 'widget'])
-        self.check_split("the ['wibble-wobble'] widget",
-                         ['the', ' ', "['wibble-", "wobble']", ' ', 'widget'])
-
-    def test_funky_parens (self) -> None:
-        # Second part of SF bug #596434: long option strings inside
-        # parentheses.
-        self.check_split("foo (--option) bar",
-                         ["foo", " ", "(--option)", " ", "bar"])
-
-        # Related stuff -- make sure parens work in simpler contexts.
-        self.check_split("foo (bar) baz",
-                         ["foo", " ", "(bar)", " ", "baz"])
-        self.check_split("blah (ding dong), wubba",
-                         ["blah", " ", "(ding", " ", "dong),",
-                          " ", "wubba"])
-
-    def test_initial_whitespace(self) -> None:
-        # SF bug #622849 reported inconsistent handling of leading
-        # whitespace; let's test that a bit, shall we?
-        text = " This is a sentence with leading whitespace."
-        self.check_wrap(text, 50,
-                        [" This is a sentence with leading whitespace."])
-        self.check_wrap(text, 30,
-                        [" This is a sentence with", "leading whitespace."])
-
-    def test_no_drop_whitespace(self) -> None:
-        # SF patch #1581073
-        text = " This is a    sentence with     much whitespace."
-        self.check_wrap(text, 10,
-                        [" This is a", "    ", "sentence ",
-                         "with     ", "much white", "space."],
-                        drop_whitespace=False)
-
-    def test_split(self) -> None:
-        # Ensure that the standard _split() method works as advertised
-        # in the comments
-
-        text = "Hello there -- you goof-ball, use the -b option!"
-
-        result = self.wrapper._split(text)
-        self.check(result,
-             ["Hello", " ", "there", " ", "--", " ", "you", " ", "goof-",
-              "ball,", " ", "use", " ", "the", " ", "-b", " ",  "option!"])
-
-    def test_break_on_hyphens(self) -> None:
-        # Ensure that the break_on_hyphens attributes work
-        text = "yaba daba-doo"
-        self.check_wrap(text, 10, ["yaba daba-", "doo"],
-                        break_on_hyphens=True)
-        self.check_wrap(text, 10, ["yaba", "daba-doo"],
-                        break_on_hyphens=False)
-
-    def test_bad_width(self) -> None:
-        # Ensure that width <= 0 is caught.
-        text = "Whatever, it doesn't matter."
-        self.assertRaises(ValueError, wrap, text, 0)
-        self.assertRaises(ValueError, wrap, text, -1)
-
-    def test_no_split_at_umlaut(self) -> None:
-        text = "Die Empf\xe4nger-Auswahl"
-        self.check_wrap(text, 13, ["Die", "Empf\xe4nger-", "Auswahl"])
-
-    def test_umlaut_followed_by_dash(self) -> None:
-        text = "aa \xe4\xe4-\xe4\xe4"
-        self.check_wrap(text, 7, ["aa \xe4\xe4-", "\xe4\xe4"])
-
-
-class LongWordTestCase (BaseTestCase):
-    def setUp(self) -> None:
-        self.wrapper = TextWrapper()
-        self.text = '''\
-Did you say "supercalifragilisticexpialidocious?"
-How *do* you spell that odd word, anyways?
-'''
-
-    def test_break_long(self) -> None:
-        # Wrap text with long words and lots of punctuation
-
-        self.check_wrap(self.text, 30,
-                        ['Did you say "supercalifragilis',
-                         'ticexpialidocious?" How *do*',
-                         'you spell that odd word,',
-                         'anyways?'])
-        self.check_wrap(self.text, 50,
-                        ['Did you say "supercalifragilisticexpialidocious?"',
-                         'How *do* you spell that odd word, anyways?'])
-
-        # SF bug 797650.  Prevent an infinite loop by making sure that at
-        # least one character gets split off on every pass.
-        self.check_wrap('-'*10+'hello', 10,
-                        ['----------',
-                         '               h',
-                         '               e',
-                         '               l',
-                         '               l',
-                         '               o'],
-                        subsequent_indent = ' '*15)
-
-        # bug 1146.  Prevent a long word to be wrongly wrapped when the
-        # preceding word is exactly one character shorter than the width
-        self.check_wrap(self.text, 12,
-                        ['Did you say ',
-                         '"supercalifr',
-                         'agilisticexp',
-                         'ialidocious?',
-                         '" How *do*',
-                         'you spell',
-                         'that odd',
-                         'word,',
-                         'anyways?'])
-
-    def test_nobreak_long(self) -> None:
-        # Test with break_long_words disabled
-        self.wrapper.break_long_words = False
-        self.wrapper.width = 30
-        expect = ['Did you say',
-                  '"supercalifragilisticexpialidocious?"',
-                  'How *do* you spell that odd',
-                  'word, anyways?'
-                  ]
-        result = self.wrapper.wrap(self.text)
-        self.check(result, expect)
-
-        # Same thing with kwargs passed to standalone wrap() function.
-        result = wrap(self.text, width=30, break_long_words=0)
-        self.check(result, expect)
-
-
-class IndentTestCases(BaseTestCase):
-
-    # called before each test method
-    def setUp(self) -> None:
-        self.text = '''\
-This paragraph will be filled, first without any indentation,
-and then with some (including a hanging indent).'''
-
-
-    def test_fill(self) -> None:
-        # Test the fill() method
-
-        expect = '''\
-This paragraph will be filled, first
-without any indentation, and then with
-some (including a hanging indent).'''
-
-        result = fill(self.text, 40)
-        self.check(result, expect)
-
-
-    def test_initial_indent(self) -> None:
-        # Test initial_indent parameter
-
-        expect = ["     This paragraph will be filled,",
-                  "first without any indentation, and then",
-                  "with some (including a hanging indent)."]
-        result = wrap(self.text, 40, initial_indent="     ")
-        self.check(result, expect)
-
-        expects = "\n".join(expect)
-        results = fill(self.text, 40, initial_indent="     ")
-        self.check(results, expects)
-
-
-    def test_subsequent_indent(self) -> None:
-        # Test subsequent_indent parameter
-
-        expect = '''\
-  * This paragraph will be filled, first
-    without any indentation, and then
-    with some (including a hanging
-    indent).'''
-
-        result = fill(self.text, 40,
-                      initial_indent="  * ", subsequent_indent="    ")
-        self.check(result, expect)
-
-
-# Despite the similar names, DedentTestCase is *not* the inverse
-# of IndentTestCase!
-class DedentTestCase(unittest.TestCase):
-
-    def assertUnchanged(self, text: str) -> None:
-        """assert that dedent() has no effect on 'text'"""
-        self.assertEqual(text, dedent(text))
-
-    def test_dedent_nomargin(self) -> None:
-        # No lines indented.
-        text = "Hello there.\nHow are you?\nOh good, I'm glad."
-        self.assertUnchanged(text)
-
-        # Similar, with a blank line.
-        text = "Hello there.\n\nBoo!"
-        self.assertUnchanged(text)
-
-        # Some lines indented, but overall margin is still zero.
-        text = "Hello there.\n  This is indented."
-        self.assertUnchanged(text)
-
-        # Again, add a blank line.
-        text = "Hello there.\n\n  Boo!\n"
-        self.assertUnchanged(text)
-
-    def test_dedent_even(self) -> None:
-        # All lines indented by two spaces.
-        text = "  Hello there.\n  How are ya?\n  Oh good."
-        expect = "Hello there.\nHow are ya?\nOh good."
-        self.assertEqual(expect, dedent(text))
-
-        # Same, with blank lines.
-        text = "  Hello there.\n\n  How are ya?\n  Oh good.\n"
-        expect = "Hello there.\n\nHow are ya?\nOh good.\n"
-        self.assertEqual(expect, dedent(text))
-
-        # Now indent one of the blank lines.
-        text = "  Hello there.\n  \n  How are ya?\n  Oh good.\n"
-        expect = "Hello there.\n\nHow are ya?\nOh good.\n"
-        self.assertEqual(expect, dedent(text))
-
-    def test_dedent_uneven(self) -> None:
-        # Lines indented unevenly.
-        text = '''\
-        def foo():
-            while 1:
-                return foo
-        '''
-        expect = '''\
-def foo():
-    while 1:
-        return foo
-'''
-        self.assertEqual(expect, dedent(text))
-
-        # Uneven indentation with a blank line.
-        text = "  Foo\n    Bar\n\n   Baz\n"
-        expect = "Foo\n  Bar\n\n Baz\n"
-        self.assertEqual(expect, dedent(text))
-
-        # Uneven indentation with a whitespace-only line.
-        text = "  Foo\n    Bar\n \n   Baz\n"
-        expect = "Foo\n  Bar\n\n Baz\n"
-        self.assertEqual(expect, dedent(text))
-
-    # dedent() should not mangle internal tabs
-    def test_dedent_preserve_internal_tabs(self) -> None:
-        text = "  hello\tthere\n  how are\tyou?"
-        expect = "hello\tthere\nhow are\tyou?"
-        self.assertEqual(expect, dedent(text))
-
-        # make sure that it preserves tabs when it's not making any
-        # changes at all
-        self.assertEqual(expect, dedent(expect))
-
-    # dedent() should not mangle tabs in the margin (i.e.
-    # tabs and spaces both count as margin, but are *not*
-    # considered equivalent)
-    def test_dedent_preserve_margin_tabs(self) -> None:
-        text = "  hello there\n\thow are you?"
-        self.assertUnchanged(text)
-
-        # same effect even if we have 8 spaces
-        text = "        hello there\n\thow are you?"
-        self.assertUnchanged(text)
-
-        # dedent() only removes whitespace that can be uniformly removed!
-        text = "\thello there\n\thow are you?"
-        expect = "hello there\nhow are you?"
-        self.assertEqual(expect, dedent(text))
-
-        text = "  \thello there\n  \thow are you?"
-        self.assertEqual(expect, dedent(text))
-
-        text = "  \t  hello there\n  \t  how are you?"
-        self.assertEqual(expect, dedent(text))
-
-        text = "  \thello there\n  \t  how are you?"
-        expect = "hello there\n  how are you?"
-        self.assertEqual(expect, dedent(text))
-
-
-def test_main() -> None:
-    support.run_unittest(WrapTestCase,
-                              LongWordTestCase,
-                              IndentTestCases,
-                              DedentTestCase)
-
-if __name__ == '__main__':
-    test_main()
diff --git a/test-data/stdlib-samples/3.2/test/tf_inherit_check.py b/test-data/stdlib-samples/3.2/test/tf_inherit_check.py
deleted file mode 100644
index 92ebd95..0000000
--- a/test-data/stdlib-samples/3.2/test/tf_inherit_check.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Helper script for test_tempfile.py.  argv[2] is the number of a file
-# descriptor which should _not_ be open.  Check this by attempting to
-# write to it -- if we succeed, something is wrong.
-
-import sys
-import os
-
-verbose = (sys.argv[1] == 'v')
-try:
-    fd = int(sys.argv[2])
-
-    try:
-        os.write(fd, b"blat")
-    except os.error:
-        # Success -- could not write to fd.
-        sys.exit(0)
-    else:
-        if verbose:
-            sys.stderr.write("fd %d is open in child" % fd)
-        sys.exit(1)
-
-except Exception:
-    if verbose:
-        raise
-    sys.exit(1)
diff --git a/test-data/stdlib-samples/3.2/textwrap.py b/test-data/stdlib-samples/3.2/textwrap.py
deleted file mode 100644
index a6d0266..0000000
--- a/test-data/stdlib-samples/3.2/textwrap.py
+++ /dev/null
@@ -1,391 +0,0 @@
-"""Text wrapping and filling.
-"""
-
-# Copyright (C) 1999-2001 Gregory P. Ward.
-# Copyright (C) 2002, 2003 Python Software Foundation.
-# Written by Greg Ward <gward at python.net>
-
-import string, re
-
-from typing import Dict, List, Any
-
-__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent']
-
-# Hardcode the recognized whitespace characters to the US-ASCII
-# whitespace characters.  The main reason for doing this is that in
-# ISO-8859-1, 0xa0 is non-breaking whitespace, so in certain locales
-# that character winds up in string.whitespace.  Respecting
-# string.whitespace in those cases would 1) make textwrap treat 0xa0 the
-# same as any other whitespace char, which is clearly wrong (it's a
-# *non-breaking* space), 2) possibly cause problems with Unicode,
-# since 0xa0 is not in range(128).
-_whitespace = '\t\n\x0b\x0c\r '
-
-class TextWrapper:
-    """
-    Object for wrapping/filling text.  The public interface consists of
-    the wrap() and fill() methods; the other methods are just there for
-    subclasses to override in order to tweak the default behaviour.
-    If you want to completely replace the main wrapping algorithm,
-    you'll probably have to override _wrap_chunks().
-
-    Several instance attributes control various aspects of wrapping:
-      width (default: 70)
-        the maximum width of wrapped lines (unless break_long_words
-        is false)
-      initial_indent (default: "")
-        string that will be prepended to the first line of wrapped
-        output.  Counts towards the line's width.
-      subsequent_indent (default: "")
-        string that will be prepended to all lines save the first
-        of wrapped output; also counts towards each line's width.
-      expand_tabs (default: true)
-        Expand tabs in input text to spaces before further processing.
-        Each tab will become 1 .. 8 spaces, depending on its position in
-        its line.  If false, each tab is treated as a single character.
-      replace_whitespace (default: true)
-        Replace all whitespace characters in the input text by spaces
-        after tab expansion.  Note that if expand_tabs is false and
-        replace_whitespace is true, every tab will be converted to a
-        single space!
-      fix_sentence_endings (default: false)
-        Ensure that sentence-ending punctuation is always followed
-        by two spaces.  Off by default because the algorithm is
-        (unavoidably) imperfect.
-      break_long_words (default: true)
-        Break words longer than 'width'.  If false, those words will not
-        be broken, and some lines might be longer than 'width'.
-      break_on_hyphens (default: true)
-        Allow breaking hyphenated words. If true, wrapping will occur
-        preferably on whitespaces and right after hyphens part of
-        compound words.
-      drop_whitespace (default: true)
-        Drop leading and trailing whitespace from lines.
-    """
-
-    unicode_whitespace_trans = {}  # type: Dict[int, int]
-    uspace = ord(' ')
-    for x in _whitespace:
-        unicode_whitespace_trans[ord(x)] = uspace
-
-    # This funky little regex is just the trick for splitting
-    # text up into word-wrappable chunks.  E.g.
-    #   "Hello there -- you goof-ball, use the -b option!"
-    # splits into
-    #   Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option!
-    # (after stripping out empty strings).
-    wordsep_re = re.compile(
-        r'(\s+|'                                  # any whitespace
-        r'[^\s\w]*\w+[^0-9\W]-(?=\w+[^0-9\W])|'   # hyphenated words
-        r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))')   # em-dash
-
-    # This less funky little regex just split on recognized spaces. E.g.
-    #   "Hello there -- you goof-ball, use the -b option!"
-    # splits into
-    #   Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/
-    wordsep_simple_re = re.compile(r'(\s+)')
-
-    # XXX this is not locale- or charset-aware -- string.lowercase
-    # is US-ASCII only (and therefore English-only)
-    sentence_end_re = re.compile(r'[a-z]'             # lowercase letter
-                                 r'[\.\!\?]'          # sentence-ending punct.
-                                 r'[\"\']?'           # optional end-of-quote
-                                 r'\Z')               # end of chunk
-
-
-    def __init__(self,
-                 width: int = 70,
-                 initial_indent: str = "",
-                 subsequent_indent: str = "",
-                 expand_tabs: bool = True,
-                 replace_whitespace: bool = True,
-                 fix_sentence_endings: bool = False,
-                 break_long_words: bool = True,
-                 drop_whitespace: bool = True,
-                 break_on_hyphens: bool = True) -> None:
-        self.width = width
-        self.initial_indent = initial_indent
-        self.subsequent_indent = subsequent_indent
-        self.expand_tabs = expand_tabs
-        self.replace_whitespace = replace_whitespace
-        self.fix_sentence_endings = fix_sentence_endings
-        self.break_long_words = break_long_words
-        self.drop_whitespace = drop_whitespace
-        self.break_on_hyphens = break_on_hyphens
-
-
-    # -- Private methods -----------------------------------------------
-    # (possibly useful for subclasses to override)
-
-    def _munge_whitespace(self, text: str) -> str:
-        """_munge_whitespace(text : string) -> string
-
-        Munge whitespace in text: expand tabs and convert all other
-        whitespace characters to spaces.  Eg. " foo\tbar\n\nbaz"
-        becomes " foo    bar  baz".
-        """
-        if self.expand_tabs:
-            text = text.expandtabs()
-        if self.replace_whitespace:
-            text = text.translate(self.unicode_whitespace_trans)
-        return text
-
-
-    def _split(self, text: str) -> List[str]:
-        """_split(text : string) -> [string]
-
-        Split the text to wrap into indivisible chunks.  Chunks are
-        not quite the same as words; see _wrap_chunks() for full
-        details.  As an example, the text
-          Look, goof-ball -- use the -b option!
-        breaks into the following chunks:
-          'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ',
-          'use', ' ', 'the', ' ', '-b', ' ', 'option!'
-        if break_on_hyphens is True, or in:
-          'Look,', ' ', 'goof-ball', ' ', '--', ' ',
-          'use', ' ', 'the', ' ', '-b', ' ', option!'
-        otherwise.
-        """
-        if self.break_on_hyphens is True:
-            chunks = self.wordsep_re.split(text)
-        else:
-            chunks = self.wordsep_simple_re.split(text)
-        chunks = [c for c in chunks if c]
-        return chunks
-
-    def _fix_sentence_endings(self, chunks: List[str]) -> None:
-        """_fix_sentence_endings(chunks : [string])
-
-        Correct for sentence endings buried in 'chunks'.  Eg. when the
-        original text contains "... foo.\nBar ...", munge_whitespace()
-        and split() will convert that to [..., "foo.", " ", "Bar", ...]
-        which has one too few spaces; this method simply changes the one
-        space to two.
-        """
-        i = 0
-        patsearch = self.sentence_end_re.search
-        while i < len(chunks)-1:
-            if chunks[i+1] == " " and patsearch(chunks[i]):
-                chunks[i+1] = "  "
-                i += 2
-            else:
-                i += 1
-
-    def _handle_long_word(self, reversed_chunks: List[str],
-                          cur_line: List[str], cur_len: int,
-                          width: int) -> None:
-        """_handle_long_word(chunks : [string],
-                             cur_line : [string],
-                             cur_len : int, width : int)
-
-        Handle a chunk of text (most likely a word, not whitespace) that
-        is too long to fit in any line.
-        """
-        # Figure out when indent is larger than the specified width, and make
-        # sure at least one character is stripped off on every pass
-        if width < 1:
-            space_left = 1
-        else:
-            space_left = width - cur_len
-
-        # If we're allowed to break long words, then do so: put as much
-        # of the next chunk onto the current line as will fit.
-        if self.break_long_words:
-            cur_line.append(reversed_chunks[-1][:space_left])
-            reversed_chunks[-1] = reversed_chunks[-1][space_left:]
-
-        # Otherwise, we have to preserve the long word intact.  Only add
-        # it to the current line if there's nothing already there --
-        # that minimizes how much we violate the width constraint.
-        elif not cur_line:
-            cur_line.append(reversed_chunks.pop())
-
-        # If we're not allowed to break long words, and there's already
-        # text on the current line, do nothing.  Next time through the
-        # main loop of _wrap_chunks(), we'll wind up here again, but
-        # cur_len will be zero, so the next line will be entirely
-        # devoted to the long word that we can't handle right now.
-
-    def _wrap_chunks(self, chunks: List[str]) -> List[str]:
-        """_wrap_chunks(chunks : [string]) -> [string]
-
-        Wrap a sequence of text chunks and return a list of lines of
-        length 'self.width' or less.  (If 'break_long_words' is false,
-        some lines may be longer than this.)  Chunks correspond roughly
-        to words and the whitespace between them: each chunk is
-        indivisible (modulo 'break_long_words'), but a line break can
-        come between any two chunks.  Chunks should not have internal
-        whitespace; ie. a chunk is either all whitespace or a "word".
-        Whitespace chunks will be removed from the beginning and end of
-        lines, but apart from that whitespace is preserved.
-        """
-        lines = []  # type: List[str]
-        if self.width <= 0:
-            raise ValueError("invalid width %r (must be > 0)" % self.width)
-
-        # Arrange in reverse order so items can be efficiently popped
-        # from a stack of chucks.
-        chunks.reverse()
-
-        while chunks:
-
-            # Start the list of chunks that will make up the current line.
-            # cur_len is just the length of all the chunks in cur_line.
-            cur_line = []  # type: List[str]
-            cur_len = 0
-
-            # Figure out which static string will prefix this line.
-            if lines:
-                indent = self.subsequent_indent
-            else:
-                indent = self.initial_indent
-
-            # Maximum width for this line.
-            width = self.width - len(indent)
-
-            # First chunk on line is whitespace -- drop it, unless this
-            # is the very beginning of the text (ie. no lines started yet).
-            if self.drop_whitespace and chunks[-1].strip() == '' and lines:
-                del chunks[-1]
-
-            while chunks:
-                l = len(chunks[-1])
-
-                # Can at least squeeze this chunk onto the current line.
-                if cur_len + l <= width:
-                    cur_line.append(chunks.pop())
-                    cur_len += l
-
-                # Nope, this line is full.
-                else:
-                    break
-
-            # The current line is full, and the next chunk is too big to
-            # fit on *any* line (not just this one).
-            if chunks and len(chunks[-1]) > width:
-                self._handle_long_word(chunks, cur_line, cur_len, width)
-
-            # If the last chunk on this line is all whitespace, drop it.
-            if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':
-                del cur_line[-1]
-
-            # Convert current line back to a string and store it in list
-            # of all lines (return value).
-            if cur_line:
-                lines.append(indent + ''.join(cur_line))
-
-        return lines
-
-
-    # -- Public interface ----------------------------------------------
-
-    def wrap(self, text: str) -> List[str]:
-        """wrap(text : string) -> [string]
-
-        Reformat the single paragraph in 'text' so it fits in lines of
-        no more than 'self.width' columns, and return a list of wrapped
-        lines.  Tabs in 'text' are expanded with string.expandtabs(),
-        and all other whitespace characters (including newline) are
-        converted to space.
-        """
-        text = self._munge_whitespace(text)
-        chunks = self._split(text)
-        if self.fix_sentence_endings:
-            self._fix_sentence_endings(chunks)
-        return self._wrap_chunks(chunks)
-
-    def fill(self, text: str) -> str:
-        """fill(text : string) -> string
-
-        Reformat the single paragraph in 'text' to fit in lines of no
-        more than 'self.width' columns, and return a new string
-        containing the entire wrapped paragraph.
-        """
-        return "\n".join(self.wrap(text))
-
-
-# -- Convenience interface ---------------------------------------------
-
-def wrap(text: str, width: int = 70, **kwargs: Any) -> List[str]:
-    """Wrap a single paragraph of text, returning a list of wrapped lines.
-
-    Reformat the single paragraph in 'text' so it fits in lines of no
-    more than 'width' columns, and return a list of wrapped lines.  By
-    default, tabs in 'text' are expanded with string.expandtabs(), and
-    all other whitespace characters (including newline) are converted to
-    space.  See TextWrapper class for available keyword args to customize
-    wrapping behaviour.
-    """
-    w = TextWrapper(width=width, **kwargs)
-    return w.wrap(text)
-
-def fill(text: str, width: int = 70, **kwargs: Any) -> str:
-    """Fill a single paragraph of text, returning a new string.
-
-    Reformat the single paragraph in 'text' to fit in lines of no more
-    than 'width' columns, and return a new string containing the entire
-    wrapped paragraph.  As with wrap(), tabs are expanded and other
-    whitespace characters converted to space.  See TextWrapper class for
-    available keyword args to customize wrapping behaviour.
-    """
-    w = TextWrapper(width=width, **kwargs)
-    return w.fill(text)
-
-
-# -- Loosely related functionality -------------------------------------
-
-_whitespace_only_re = re.compile('^[ \t]+$', re.MULTILINE)
-_leading_whitespace_re = re.compile('(^[ \t]*)(?:[^ \t\n])', re.MULTILINE)
-
-def dedent(text: str) -> str:
-    """Remove any common leading whitespace from every line in `text`.
-
-    This can be used to make triple-quoted strings line up with the left
-    edge of the display, while still presenting them in the source code
-    in indented form.
-
-    Note that tabs and spaces are both treated as whitespace, but they
-    are not equal: the lines "  hello" and "\thello" are
-    considered to have no common leading whitespace.  (This behaviour is
-    new in Python 2.5; older versions of this module incorrectly
-    expanded tabs before searching for common leading whitespace.)
-    """
-    # Look for the longest leading string of spaces and tabs common to
-    # all lines.
-    margin = None # type: str
-    text = _whitespace_only_re.sub('', text)
-    indents = _leading_whitespace_re.findall(text)
-    for indent in indents:
-        if margin is None:
-            margin = indent
-
-        # Current line more deeply indented than previous winner:
-        # no change (previous winner is still on top).
-        elif indent.startswith(margin):
-            pass
-
-        # Current line consistent with and no deeper than previous winner:
-        # it's the new winner.
-        elif margin.startswith(indent):
-            margin = indent
-
-        # Current line and previous winner have no common whitespace:
-        # there is no margin.
-        else:
-            margin = ""
-            break
-
-    # sanity check (testing/debugging only)
-    if 0 and margin:
-        for line in text.split("\n"):
-            assert not line or line.startswith(margin), \
-                   "line = %r, margin = %r" % (line, margin)
-
-    if margin:
-        text = re.sub(r'(?m)^' + margin, '', text)
-    return text
-
-if __name__ == "__main__":
-    #print dedent("\tfoo\n\tbar")
-    #print dedent("  \thello there\n  \t  how are you?")
-    print(dedent("Hello there.\n  This is indented."))
diff --git a/test-data/unit/check-abstract.test b/test-data/unit/check-abstract.test
deleted file mode 100644
index 1caeabf..0000000
--- a/test-data/unit/check-abstract.test
+++ /dev/null
@@ -1,734 +0,0 @@
--- Type checker test cases for abstract classes.
-
-
--- Subtyping with abstract classes
--- -------------------------------
-
-
-[case testAbstractClassSubclasses]
-
-from abc import abstractmethod, ABCMeta
-
-i = None # type: I
-j = None # type: J
-a = None # type: A
-b = None # type: B
-c = None # type: C
-
-j = c  # E: Incompatible types in assignment (expression has type "C", variable has type "J")
-a = i  # E: Incompatible types in assignment (expression has type "I", variable has type "A")
-a = j  # E: Incompatible types in assignment (expression has type "J", variable has type "A")
-b = i  # E: Incompatible types in assignment (expression has type "I", variable has type "B")
-
-i = a
-i = b
-i = c
-j = a
-j = b
-a = b
-
-class I(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self): pass
-class J(metaclass=ABCMeta):
-    @abstractmethod
-    def g(self): pass
-class A(I, J): pass
-class B(A): pass
-class C(I): pass
-
-[case testAbstractClassSubtypingViaExtension]
-
-from abc import abstractmethod, ABCMeta
-
-i = None # type: I
-j = None # type: J
-a = None # type: A
-o = None # type: object
-
-j = i # E: Incompatible types in assignment (expression has type "I", variable has type "J")
-a = i # E: Incompatible types in assignment (expression has type "I", variable has type "A")
-a = j # E: Incompatible types in assignment (expression has type "J", variable has type "A")
-i = o # E: Incompatible types in assignment (expression has type "object", variable has type "I")
-j = o # E: Incompatible types in assignment (expression has type "object", variable has type "J")
-
-i = a
-j = a
-i = j
-o = i
-o = j
-
-class I(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self): pass
-class J(I): pass
-class A(J): pass
-
-[case testInheritingAbstractClassInSubclass]
-
-from abc import abstractmethod, ABCMeta
-
-i = None # type: I
-a = None # type: A
-b = None # type: B
-
-i = a # E: Incompatible types in assignment (expression has type "A", variable has type "I")
-b = a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a = b
-i = b
-
-class I(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self): pass
-class A: pass
-class B(A, I): pass
-
-
--- Abstract class objects
--- ----------------------
-
-
-[case testAbstractClassAsTypeObject]
-
-from abc import abstractmethod, ABCMeta
-
-o = None # type: object
-t = None # type: type
-
-o = I
-t = I
-
-class I(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self): pass
-
-[case testAbstractClassInCasts]
-from typing import cast
-from abc import abstractmethod, ABCMeta
-
-class I(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self): pass
-class A(I): pass
-class B: pass
-
-i, a, b = None, None, None # type: (I, A, B)
-o = None # type: object
-
-a = cast(I, o) # E: Incompatible types in assignment (expression has type "I", variable has type "A")
-b = cast(B, i) # Ok; a subclass of B might inherit I
-i = cast(I, b) # Ok; a subclass of B might inherit I
-
-i = cast(I, o)
-i = cast(I, a)
-
-[case testInstantiatingClassThatImplementsAbstractMethod]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self): pass
-class B(A):
-  def f(self): pass
-B()
-[out]
-
-[case testInstantiatingAbstractClass]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta): pass
-class B(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self): pass
-A() # OK
-B() # E: Cannot instantiate abstract class 'B' with abstract attribute 'f'
-[out]
-
-[case testInstantiatingClassWithInheritedAbstractMethod]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self): pass
-  @abstractmethod
-  def g(self): pass
-class B(A): pass
-B()# E: Cannot instantiate abstract class 'B' with abstract attributes 'f' and 'g'
-[out]
-
-[case testInstantiatingClassWithInheritedAbstractMethodAndSuppression]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta):
-    @abstractmethod
-    def a(self): pass
-    @abstractmethod
-    def b(self): pass
-    @abstractmethod
-    def c(self): pass
-    @abstractmethod
-    def d(self): pass
-    @abstractmethod
-    def e(self): pass
-    @abstractmethod
-    def f(self): pass
-    @abstractmethod
-    def g(self): pass
-    @abstractmethod
-    def h(self): pass
-    @abstractmethod
-    def i(self): pass
-    @abstractmethod
-    def j(self): pass
-a = A() # E: Cannot instantiate abstract class 'A' with abstract attributes 'a', 'b', ... and 'j' (7 methods suppressed)
-[out]
-
-
--- Implementing abstract methods
--- -----------------------------
-
-
-[case testImplementingAbstractMethod]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self, x: int) -> int: pass
-    @abstractmethod
-    def g(self, x: int) -> int: pass
-class B(A):
-    def f(self, x: str) -> int: \
-            # E: Argument 1 of "f" incompatible with supertype "A"
-        pass
-    def g(self, x: int) -> int: pass
-[out]
-
-[case testImplementingAbstractMethodWithMultipleBaseClasses]
-from abc import abstractmethod, ABCMeta
-import typing
-class I(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self, x: int) -> int: pass
-class J(metaclass=ABCMeta):
-    @abstractmethod
-    def g(self, x: str) -> str: pass
-class A(I, J):
-    def f(self, x: str) -> int: pass \
-        # E: Argument 1 of "f" incompatible with supertype "I"
-    def g(self, x: str) -> int: pass \
-        # E: Return type of "g" incompatible with supertype "J"
-    def h(self) -> int: pass # Not related to any base class
-[out]
-
-[case testImplementingAbstractMethodWithExtension]
-from abc import abstractmethod, ABCMeta
-import typing
-class J(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self, x: int) -> int: pass
-class I(J): pass
-class A(I):
-    def f(self, x: str) -> int: pass \
-        # E: Argument 1 of "f" incompatible with supertype "J"
-[out]
-
-[case testInvalidOverridingAbstractMethod]
-from abc import abstractmethod, ABCMeta
-import typing
-class J(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self, x: 'J') -> None: pass
-class I(J):
-    @abstractmethod
-    def f(self, x: 'I') -> None: pass # E: Argument 1 of "f" incompatible with supertype "J"
-[out]
-
-[case testAbstractClassCoAndContraVariance]
-from abc import abstractmethod, ABCMeta
-import typing
-class I(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self, a: A) -> 'I': pass
-    @abstractmethod
-    def g(self, a: A) -> 'I': pass
-    @abstractmethod
-    def h(self, a: 'I') -> A: pass
-class A(I):
-    def h(self, a: 'A') -> 'I': # Fail
-        pass
-    def f(self, a: 'I') -> 'I':
-        pass
-    def g(self, a: 'A') -> 'A':
-        pass
-[out]
-main:11: error: Argument 1 of "h" incompatible with supertype "I"
-main:11: error: Return type of "h" incompatible with supertype "I"
-
-
--- Accessing abstract members
--- --------------------------
-
-
-[case testAccessingAbstractMethod]
-
-from abc import abstractmethod, ABCMeta
-
-class I(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self, a: int) -> str: pass
-
-i, a, b = None, None, None # type: (I, int, str)
-
-a = i.f(a) # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-b = i.f(b) # E: Argument 1 to "f" of "I" has incompatible type "str"; expected "int"
-i.g()      # E: "I" has no attribute "g"
-
-b = i.f(a)
-
-[case testAccessingInheritedAbstractMethod]
-
-from abc import abstractmethod, ABCMeta
-
-class J(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self, a: int) -> str: pass
-class I(J): pass
-
-i, a, b = None, None, None # type: (I, int, str)
-
-a = i.f(1) # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-b = i.f(1)
-
-
--- Any (dynamic) types
--- -------------------
-
-
-[case testAbstractClassWithAllDynamicTypes]
-from abc import abstractmethod, ABCMeta
-import typing
-class I(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self, x): pass
-    @abstractmethod
-    def g(self, x): pass
-class A(I):
-    def f(self, x): pass
-    def g(self, x, y) -> None: pass \
-        # E: Signature of "g" incompatible with supertype "I"
-[out]
-
-[case testAbstractClassWithAllDynamicTypes2]
-from abc import abstractmethod, ABCMeta
-import typing
-class I(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self, x): pass
-    @abstractmethod
-    def g(self, x): pass
-class A(I):
-    def f(self, x): pass
-    def g(self, x, y): pass
-[out]
-
-[case testAbstractClassWithImplementationUsingDynamicTypes]
-from abc import abstractmethod, ABCMeta
-import typing
-class I(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self, x: int) -> None: pass
-    @abstractmethod
-    def g(self, x: int) -> None: pass
-class A(I):
-    def f(self, x): pass
-    def g(self, x, y): pass
-[out]
-
-
--- Special cases
--- -------------
-
-
-[case testMultipleAbstractBases]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self) -> None: pass
-class B(metaclass=ABCMeta):
-  @abstractmethod
-  def g(self) -> None: pass
-class C(A, B):
-  @abstractmethod
-  def h(self) -> None: pass
-
-[case testMemberAccessWithMultipleAbstractBaseClasses]
-
-from abc import abstractmethod, ABCMeta
-
-class A(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self) -> None: pass
-class B(metaclass=ABCMeta):
-    @abstractmethod
-    def g(self) -> None: pass
-class C(A, B): pass
-x = None # type: C
-x.f()
-x.g()
-x.f(x) # E: Too many arguments for "f" of "A"
-x.g(x) # E: Too many arguments for "g" of "B"
-
-[case testInstantiatingAbstractClassWithMultipleBaseClasses]
-
-from abc import abstractmethod, ABCMeta
-
-class A(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self) -> None: pass
-class B(metaclass=ABCMeta):
-  @abstractmethod
-  def g(self) -> None: pass
-class C(A, B):
-  def f(self) -> None: pass
-class D(A, B):
-  def g(self) -> None: pass
-class E(A, B):
-  def f(self) -> None: pass
-  def g(self) -> None: pass
-C() # E: Cannot instantiate abstract class 'C' with abstract attribute 'g'
-D() # E: Cannot instantiate abstract class 'D' with abstract attribute 'f'
-E()
-
-[case testInconsistentMro]
-from abc import abstractmethod, ABCMeta
-import typing
-
-class A(metaclass=ABCMeta): pass
-class B(object, A): pass \
-      # E: Cannot determine consistent method resolution order (MRO) for "B"
-
-[case testOverloadedAbstractMethod]
-from abc import abstractmethod, ABCMeta
-from typing import overload
-
-class A(metaclass=ABCMeta):
-  @abstractmethod
-  @overload
-  def f(self, x: int) -> int: pass
-  @abstractmethod
-  @overload
-  def f(self, x: str) -> str: pass
-
-class B(A):
-  @overload
-  def f(self, x: int) -> int: pass
-  @overload
-  def f(self, x: str) -> str: pass
-A() # E: Cannot instantiate abstract class 'A' with abstract attribute 'f'
-B()
-B().f(1)
-a = B() # type: A
-a.f(1)
-a.f('')
-a.f(B()) # E: No overload variant of "f" of "A" matches argument types [__main__.B]
-
-[case testOverloadedAbstractMethodWithAlternativeDecoratorOrder]
-from abc import abstractmethod, ABCMeta
-from typing import overload
-
-class A(metaclass=ABCMeta):
-  @overload
-  @abstractmethod
-  def f(self, x: int) -> int: pass
-  @overload
-  @abstractmethod
-  def f(self, x: str) -> str: pass
-
-class B(A):
-  @overload
-  def f(self, x: int) -> int: pass
-  @overload
-  def f(self, x: str) -> str: pass
-A() # E: Cannot instantiate abstract class 'A' with abstract attribute 'f'
-B()
-B().f(1)
-a = B() # type: A
-a.f(1)
-a.f('')
-a.f(B()) # E: No overload variant of "f" of "A" matches argument types [__main__.B]
-
-[case testOverloadedAbstractMethodVariantMissingDecorator1]
-from abc import abstractmethod, ABCMeta
-from typing import overload
-
-class A(metaclass=ABCMeta):
-  @abstractmethod \
-    # E: Overloaded method has both abstract and non-abstract variants
-  @overload
-  def f(self, x: int) -> int: pass
-  @overload
-  def f(self, x: str) -> str: pass
-[out]
-
-[case testOverloadedAbstractMethodVariantMissingDecorator1]
-from abc import abstractmethod, ABCMeta
-from typing import overload
-
-class A(metaclass=ABCMeta):
-  @overload \
-    # E: Overloaded method has both abstract and non-abstract variants
-  def f(self, x: int) -> int: pass
-  @abstractmethod
-  @overload
-  def f(self, x: str) -> str: pass
-[out]
-
-[case testMultipleInheritanceAndAbstractMethod]
-import typing
-from abc import abstractmethod, ABCMeta
-class A:
-  def f(self, x: str) -> None: pass
-class B(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self, x: str) -> None: pass
-class C(A, B): pass
-
-[case testMultipleInheritanceAndAbstractMethod2]
-import typing
-from abc import abstractmethod, ABCMeta
-class A:
-  def f(self, x: str) -> None: pass
-class B(metaclass=ABCMeta):
-  @abstractmethod
-  def f(self, x: int) -> None: pass
-class C(A, B): pass
-[out]
-main:8: error: Definition of "f" in base class "A" is incompatible with definition in base class "B"
-
-[case testCallAbstractMethodBeforeDefinition]
-import typing
-from abc import abstractmethod, ABCMeta
-class A(metaclass=ABCMeta):
-    def f(self) -> None:
-        self.g(1) # E: Argument 1 to "g" of "A" has incompatible type "int"; expected "str"
-    @abstractmethod
-    def g(self, x: str) -> None: pass
-[out]
-
-[case testAbstractOperatorMethods1]
-import typing
-from abc import abstractmethod, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractmethod
-    def __lt__(self, other: 'A') -> int: pass
-    @abstractmethod
-    def __gt__(self, other: 'A') -> int: pass
-
-[case testAbstractOperatorMethods2]
-import typing
-from abc import abstractmethod, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractmethod
-    def __radd__(self, other: 'C') -> str: pass # Error
-class B:
-    @abstractmethod
-    def __add__(self, other: 'A') -> int: pass
-class C:
-    def __add__(self, other: int) -> B: pass
-[out]
-
-
--- Abstract properties
--- -------------------
-
-
-[case testReadOnlyAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-def f(a: A) -> None:
-    a.x() # E: "int" not callable
-    a.x = 1  # E: Property "x" defined in "A" is read-only
-[out]
-
-[case testReadOnlyAbstractPropertyForwardRef]
-from abc import abstractproperty, ABCMeta
-def f(a: A) -> None:
-    a.x() # E: "int" not callable
-    a.x = 1  # E: Property "x" defined in "A" is read-only
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-[out]
-
-[case testReadWriteAbstractProperty]
-from abc import abstractproperty, ABCMeta
-def f(a: A) -> None:
-    a.x.y # E: "int" has no attribute "y"
-    a.x = 1
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-    @x.setter
-    def x(self, x: int) -> None: pass
-[out]
-
-[case testInstantiateClassWithReadOnlyAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-class B(A): pass
-b = B() # E: Cannot instantiate abstract class 'B' with abstract attribute 'x'
-
-[case testInstantiateClassWithReadWriteAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-    @x.setter
-    def x(self, x: int) -> None: pass
-class B(A): pass
-b = B() # E: Cannot instantiate abstract class 'B' with abstract attribute 'x'
-
-[case testImplementAbstractPropertyViaProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-class B(A):
-    @property
-    def x(self) -> int: pass
-b = B()
-b.x() # E: "int" not callable
-[builtins fixtures/property.pyi]
-
-[case testImplementReradWriteAbstractPropertyViaProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-    @x.setter
-    def x(self, v: int) -> None: pass
-class B(A):
-    @property
-    def x(self) -> int: pass
-    @x.setter
-    def x(self, v: int) -> None: pass
-b = B()
-b.x.y # E: "int" has no attribute "y"
-[builtins fixtures/property.pyi]
-
-[case testImplementAbstractPropertyViaPropertyInvalidType]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-class B(A):
-    @property
-    def x(self) -> str: pass # E
-b = B()
-b.x() # E
-[builtins fixtures/property.pyi]
-[out]
-main:7: error: Return type of "x" incompatible with supertype "A"
-main:9: error: "str" not callable
-
-[case testCantImplementAbstractPropertyViaInstanceVariable]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-class B(A):
-    def __init__(self) -> None:
-        self.x = 1 # E
-b = B() # E
-b.x.y # E
-[builtins fixtures/property.pyi]
-[out]
-main:7: error: Property "x" defined in "B" is read-only
-main:8: error: Cannot instantiate abstract class 'B' with abstract attribute 'x'
-main:9: error: "int" has no attribute "y"
-
-[case testSuperWithAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-class B(A):
-    @property
-    def x(self) -> int:
-        return super().x.y # E: "int" has no attribute "y"
-[builtins fixtures/property.pyi]
-[out]
-
-[case testSuperWithReadWriteAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-    @x.setter
-    def x(self, v: int) -> None: pass
-class B(A):
-    @property
-    def x(self) -> int:
-        return super().x.y # E
-    @x.setter
-    def x(self, v: int) -> None:
-        super().x = '' # E
-[builtins fixtures/property.pyi]
-[out]
-main:10: error: "int" has no attribute "y"
-main:13: error: Invalid assignment target
-
-[case testOnlyImplementGetterOfReadWriteAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-    @x.setter
-    def x(self, v: int) -> None: pass
-class B(A):
-    @property # E
-    def x(self) -> int: pass
-b = B()
-b.x.y # E
-[builtins fixtures/property.pyi]
-[out]
-main:8: error: Read-only property cannot override read-write property
-main:11: error: "int" has no attribute "y"
-
-[case testDynamicallyTypedReadOnlyAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self): pass
-def f(a: A) -> None:
-    a.x.y
-    a.x = 1  # E: Property "x" defined in "A" is read-only
-[out]
-
-[case testDynamicallyTypedReadOnlyAbstractPropertyForwardRef]
-from abc import abstractproperty, ABCMeta
-def f(a: A) -> None:
-    a.x.y
-    a.x = 1  # E: Property "x" defined in "A" is read-only
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self): pass
-[out]
-
-[case testDynamicallyTypedReadWriteAbstractProperty]
-from abc import abstractproperty, ABCMeta
-def f(a: A) -> None:
-    a.x.y
-    a.x = 1
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self): pass
-    @x.setter
-    def x(self, x): pass
-[out]
diff --git a/test-data/unit/check-async-await.test b/test-data/unit/check-async-await.test
deleted file mode 100644
index 0758165..0000000
--- a/test-data/unit/check-async-await.test
+++ /dev/null
@@ -1,376 +0,0 @@
--- Tests for async def and await (PEP 492)
--- ---------------------------------------
-
-[case testAsyncDefPass]
-# flags: --fast-parser
-async def f() -> int:
-    pass
-[builtins fixtures/async_await.pyi]
-
-[case testAsyncDefReturn]
-# flags: --fast-parser
-async def f() -> int:
-    return 0
-reveal_type(f())  # E: Revealed type is 'typing.Awaitable[builtins.int]'
-[builtins fixtures/async_await.pyi]
-
-[case testAwaitCoroutine]
-# flags: --fast-parser
-async def f() -> int:
-    x = await f()
-    reveal_type(x)  # E: Revealed type is 'builtins.int*'
-    return x
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAwaitDefaultContext]
-# flags: --fast-parser
-from typing import TypeVar
-T = TypeVar('T')
-async def f(x: T) -> T:
-    y = await f(x)
-    reveal_type(y)
-    return y
-[out]
-main:6: error: Revealed type is 'T`-1'
-
-[case testAwaitAnyContext]
-# flags: --fast-parser
-from typing import Any, TypeVar
-T = TypeVar('T')
-async def f(x: T) -> T:
-    y = await f(x)  # type: Any
-    reveal_type(y)
-    return y
-[out]
-main:6: error: Revealed type is 'Any'
-
-[case testAwaitExplicitContext]
-# flags: --fast-parser
-from typing import TypeVar
-T = TypeVar('T')
-async def f(x: T) -> T:
-    y = await f(x)  # type: int
-    reveal_type(y)
-[out]
-main:5: error: Argument 1 to "f" has incompatible type "T"; expected "int"
-main:6: error: Revealed type is 'builtins.int'
-
-[case testAwaitGeneratorError]
-# flags: --fast-parser
-from typing import Any, Generator
-def g() -> Generator[int, None, str]:
-    yield 0
-    return ''
-async def f() -> int:
-    x = await g()
-    return x
-[out]
-main:7: error: Incompatible types in await (actual type Generator[int, None, str], expected type "Awaitable")
-
-[case testAwaitIteratorError]
-# flags: --fast-parser
-from typing import Any, Iterator
-def g() -> Iterator[Any]:
-    yield
-async def f() -> int:
-    x = await g()
-    return x
-[out]
-main:6: error: Incompatible types in await (actual type Iterator[Any], expected type "Awaitable")
-
-[case testAwaitArgumentError]
-# flags: --fast-parser
-def g() -> int:
-    return 0
-async def f() -> int:
-    x = await g()
-    return x
-[builtins fixtures/async_await.pyi]
-[out]
-main:5: error: Incompatible types in await (actual type "int", expected type "Awaitable")
-
-[case testAwaitResultError]
-# flags: --fast-parser
-async def g() -> int:
-    return 0
-async def f() -> str:
-    x = await g()  # type: str
-[builtins fixtures/async_await.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testAwaitReturnError]
-# flags: --fast-parser
-async def g() -> int:
-    return 0
-async def f() -> str:
-    x = await g()
-    return x
-[builtins fixtures/async_await.pyi]
-[out]
-main:6: error: Incompatible return value type (got "int", expected "str")
-
-[case testAsyncFor]
-# flags: --fast-parser
-from typing import AsyncIterator
-class C(AsyncIterator[int]):
-    async def __anext__(self) -> int: return 0
-async def f() -> None:
-    async for x in C():
-        reveal_type(x)  # E: Revealed type is 'builtins.int*'
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAsyncForError]
-# flags: --fast-parser
-from typing import AsyncIterator
-async def f() -> None:
-    async for x in [1]:
-        pass
-[builtins fixtures/async_await.pyi]
-[out]
-main:4: error: AsyncIterable expected
-main:4: error: List[int] has no attribute "__aiter__"
-
-[case testAsyncWith]
-# flags: --fast-parser
-class C:
-    async def __aenter__(self) -> int: pass
-    async def __aexit__(self, x, y, z) -> None: pass
-async def f() -> None:
-    async with C() as x:
-        reveal_type(x)  # E: Revealed type is 'builtins.int*'
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAsyncWithError]
-# flags: --fast-parser
-class C:
-    def __enter__(self) -> int: pass
-    def __exit__(self, x, y, z) -> None: pass
-async def f() -> None:
-    async with C() as x:
-        pass
-[builtins fixtures/async_await.pyi]
-[out]
-main:6: error: "C" has no attribute "__aenter__"; maybe "__enter__"?
-main:6: error: "C" has no attribute "__aexit__"; maybe "__exit__"?
-
-[case testAsyncWithErrorBadAenter]
-# flags: --fast-parser
-class C:
-    def __aenter__(self) -> int: pass
-    async def __aexit__(self, x, y, z) -> None: pass
-async def f() -> None:
-    async with C() as x:  # E: Incompatible types in "async with" for __aenter__ (actual type "int", expected type "Awaitable")
-        pass
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAsyncWithErrorBadAenter2]
-# flags: --fast-parser
-class C:
-    def __aenter__(self) -> None: pass
-    async def __aexit__(self, x, y, z) -> None: pass
-async def f() -> None:
-    async with C() as x:  # E: "__aenter__" of "C" does not return a value
-        pass
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAsyncWithErrorBadAexit]
-# flags: --fast-parser
-class C:
-    async def __aenter__(self) -> int: pass
-    def __aexit__(self, x, y, z) -> int: pass
-async def f() -> None:
-    async with C() as x: # E: Incompatible types in "async with" for __aexit__ (actual type "int", expected type "Awaitable")
-        pass
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAsyncWithErrorBadAexit2]
-# flags: --fast-parser
-class C:
-    async def __aenter__(self) -> int: pass
-    def __aexit__(self, x, y, z) -> None: pass
-async def f() -> None:
-    async with C() as x: # E: "__aexit__" of "C" does not return a value
-        pass
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testNoYieldInAsyncDef]
-# flags: --fast-parser
-async def f():
-    yield None
-async def g():
-    yield
-async def h():
-    x = yield
-[builtins fixtures/async_await.pyi]
-[out]
-main:3: error: 'yield' in async function
-main:5: error: 'yield' in async function
-main:7: error: 'yield' in async function
-
-[case testNoYieldFromInAsyncDef]
-# flags: --fast-parser
-async def f():
-    yield from []
-async def g():
-    x = yield from []
-[builtins fixtures/async_await.pyi]
-[out]
-main:3: error: 'yield from' in async function
-main:5: error: 'yield from' in async function
-
-[case testNoAsyncDefInPY2_python2]
-# flags: --fast-parser
-async def f():  # E: invalid syntax
-    pass
-
-[case testYieldFromNoAwaitable]
-# flags: --fast-parser
-from typing import Any, Generator
-async def f() -> str:
-    return ''
-def g() -> Generator[Any, None, str]:
-    x = yield from f()
-    return x
-[builtins fixtures/async_await.pyi]
-[out]
-main:6: error: "yield from" can't be applied to Awaitable[str]
-
-[case testAwaitableSubclass]
-# flags: --fast-parser
-from typing import Any, AsyncIterator, Awaitable, Generator
-class A(Awaitable[int]):
-    def __await__(self) -> Generator[Any, None, int]:
-        yield
-        return 0
-class C:
-    def __aenter__(self) -> A:
-        return A()
-    def __aexit__(self, *a) -> A:
-        return A()
-class I(AsyncIterator[int]):
-    def __aiter__(self) -> 'I':
-        return self
-    def __anext__(self) -> A:
-        return A()
-async def main() -> None:
-    x = await A()
-    reveal_type(x)  # E: Revealed type is 'builtins.int'
-    async with C() as y:
-        reveal_type(y)  # E: Revealed type is 'builtins.int'
-    async for z in I():
-        reveal_type(z)  # E: Revealed type is 'builtins.int'
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testYieldTypeCheckInDecoratedCoroutine]
-# flags: --fast-parser
-from typing import Generator
-from types import coroutine
- at coroutine
-def f() -> Generator[int, str, int]:
-    x = yield 0
-    x = yield ''  # E: Incompatible types in yield (actual type "str", expected type "int")
-    reveal_type(x)  # E: Revealed type is 'builtins.str'
-    if x:
-        return 0
-    else:
-        return ''  # E: Incompatible return value type (got "str", expected "int")
-[builtins fixtures/async_await.pyi]
-[out]
-
-
--- The full matrix of coroutine compatibility
--- ------------------------------------------
-
-[case testFullCoroutineMatrix]
-# flags: --fast-parser
-from typing import Any, AsyncIterator, Awaitable, Generator, Iterator
-from types import coroutine
-
-# The various things you might try to use in `await` or `yield from`.
-
-def plain_generator() -> Generator[str, None, int]:
-    yield 'a'
-    return 1
-
-async def plain_coroutine() -> int:
-    return 1
-
- at coroutine
-def decorated_generator() -> Generator[str, None, int]:
-    yield 'a'
-    return 1
-
- at coroutine
-async def decorated_coroutine() -> int:
-    return 1
-
-class It(Iterator[str]):
-    def __iter__(self) -> 'It':
-        return self
-    def __next__(self) -> str:
-        return 'a'
-
-def other_iterator() -> It:
-    return It()
-
-class Aw(Awaitable[int]):
-    def __await__(self) -> Generator[str, Any, int]:
-        yield 'a'
-        return 1
-
-def other_coroutine() -> Aw:
-    return Aw()
-
-# The various contexts in which `await` or `yield from` might occur.
-
-def plain_host_generator() -> Generator[str, None, None]:
-    yield 'a'
-    x = 0
-    x = yield from plain_generator()
-    x = yield from plain_coroutine()  # E: "yield from" can't be applied to Awaitable[int]
-    x = yield from decorated_generator()
-    x = yield from decorated_coroutine()  # E: "yield from" can't be applied to AwaitableGenerator[Any, Any, int, Awaitable[int]]
-    x = yield from other_iterator()
-    x = yield from other_coroutine()  # E: "yield from" can't be applied to "Aw"
-
-async def plain_host_coroutine() -> None:
-    x = 0
-    x = await plain_generator()  # E: Incompatible types in await (actual type Generator[str, None, int], expected type "Awaitable")
-    x = await plain_coroutine()
-    x = await decorated_generator()
-    x = await decorated_coroutine()
-    x = await other_iterator()  # E: Incompatible types in await (actual type "It", expected type "Awaitable")
-    x = await other_coroutine()
-
- at coroutine
-def decorated_host_generator() -> Generator[str, None, None]:
-    yield 'a'
-    x = 0
-    x = yield from plain_generator()
-    x = yield from plain_coroutine()
-    x = yield from decorated_generator()
-    x = yield from decorated_coroutine()
-    x = yield from other_iterator()
-    x = yield from other_coroutine()  # E: "yield from" can't be applied to "Aw"
-
- at coroutine
-async def decorated_host_coroutine() -> None:
-    x = 0
-    x = await plain_generator()  # E: Incompatible types in await (actual type Generator[str, None, int], expected type "Awaitable")
-    x = await plain_coroutine()
-    x = await decorated_generator()
-    x = await decorated_coroutine()
-    x = await other_iterator()  # E: Incompatible types in await (actual type "It", expected type "Awaitable")
-    x = await other_coroutine()
-
-[builtins fixtures/async_await.pyi]
-[out]
diff --git a/test-data/unit/check-basic.test b/test-data/unit/check-basic.test
deleted file mode 100644
index 05fa1a9..0000000
--- a/test-data/unit/check-basic.test
+++ /dev/null
@@ -1,310 +0,0 @@
-[case testEmptyFile]
-[out]
-
-[case testAssignmentAndVarDef]
-
-a = None # type: A
-b = None # type: B
-a = a
-a = b # Fail
-class A: pass
-class B: pass
-[out]
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testConstructionAndAssignment]
-
-x = None # type: A
-x = A()
-x = B()
-class A:
-    def __init__(self): pass
-class B:
-    def __init__(self): pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testInheritInitFromObject]
-
-x = None # type: A
-x = A()
-x = B()
-class A(object): pass
-class B(object): pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testImplicitInheritInitFromObject]
-
-x = None # type: A
-o = None # type: object
-x = o # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-x = A()
-o = x
-class A: pass
-class B: pass
-[out]
-
-[case testTooManyConstructorArgs]
-import typing
-object(object())
-[out]
-main:2: error: Too many arguments for "object"
-
-[case testVarDefWithInit]
-import typing
-a = A() # type: A
-b = object() # type: A
-class A: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-[case testInheritanceBasedSubtyping]
-import typing
-x = B() # type: A
-y = A() # type: B # Fail
-class A: pass
-class B(A): pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testDeclaredVariableInParentheses]
-
-(x) = None # type: int
-x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-x = 1
-
-
--- Simple functions and calling
--- ----------------------------
-
-
-[case testFunction]
-import typing
-def f(x: 'A') -> None: pass
-f(A())
-f(B()) # Fail
-class A: pass
-class B: pass
-[out]
-main:4: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-
-[case testNotCallable]
-import typing
-A()()
-class A: pass
-[out]
-main:2: error: "A" not callable
-
-[case testSubtypeArgument]
-import typing
-def f(x: 'A', y: 'B') -> None: pass
-f(B(), A()) # Fail
-f(B(), B())
-
-class A: pass
-class B(A): pass
-[out]
-main:3: error: Argument 2 to "f" has incompatible type "A"; expected "B"
-
-[case testInvalidArgumentCount]
-import typing
-def f(x, y) -> None: pass
-f(object())
-f(object(), object(), object())
-[out]
-main:3: error: Too few arguments for "f"
-main:4: error: Too many arguments for "f"
-
-
--- Locals
--- ------
-
-
-[case testLocalVariables]
-
-def f() -> None:
-  x = None # type: A
-  y = None # type: B
-  x = x
-  x = y # Fail
-class A: pass
-class B: pass
-[out]
-main:6: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testLocalVariableScope]
-
-def f() -> None:
-  x = None # type: A
-  x = A()
-def g() -> None:
-  x = None # type: B
-  x = A() # Fail
-class A: pass
-class B: pass
-[out]
-main:7: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testFunctionArguments]
-import typing
-def f(x: 'A', y: 'B') -> None:
-  x = y # Fail
-  x = x
-  y = B()
-class A: pass
-class B: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testLocalVariableInitialization]
-import typing
-def f() -> None:
-  a = A() # type: A
-  b = B() # type: A # Fail
-class A: pass
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testVariableInitializationWithSubtype]
-import typing
-x = B() # type: A
-y = A() # type: B # Fail
-class A: pass
-class B(A): pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-
--- Misc
--- ----
-
-
-[case testInvalidReturn]
-import typing
-def f() -> 'A':
-  return B()
-class A: pass
-class B: pass
-[out]
-main:3: error: Incompatible return value type (got "B", expected "A")
-
-[case testTopLevelContextAndInvalidReturn]
-import typing
-def f() -> 'A':
-  return B()
-a = B() # type: A
-class A: pass
-class B: pass
-[out]
-main:3: error: Incompatible return value type (got "B", expected "A")
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testEmptyReturnInAnyTypedFunction]
-from typing import Any
-def f() -> Any:
-  return
-
-[case testEmptyYieldInAnyTypedFunction]
-from typing import Any
-def f() -> Any:
-  yield
-
-[case testModule__name__]
-import typing
-x = __name__ # type: str
-a = __name__ # type: A  # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-class A: pass
-[builtins fixtures/primitives.pyi]
-
-[case testModule__doc__]
-import typing
-x = __doc__ # type: str
-a = __doc__ # type: A  # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-class A: pass
-[builtins fixtures/primitives.pyi]
-
-[case testModule__file__]
-import typing
-x = __file__ # type: str
-a = __file__ # type: A  # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-class A: pass
-[builtins fixtures/primitives.pyi]
-
-[case test__package__]
-import typing
-x = __package__ # type: str
-a = __file__ # type: int  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-
--- Scoping and shadowing
--- ---------------------
-
-
-[case testLocalVariableShadowing]
-
-a = None # type: A
-a = B()       # Fail
-a = A()
-def f() -> None:
-  a = None # type: B
-  a = A()     # Fail
-  a = B()
-a = B()       # Fail
-a = A()
-
-class A: pass
-class B: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:7: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:9: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testGlobalDefinedInBlockWithType]
-
-class A: pass
-while A:
-    a = None # type: A
-    a = A()
-    a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-
--- # type: signatures
--- ------------------
-
-
-[case testFunctionSignatureAsComment]
-def f(x): # type: (int) -> str
-    return 1
-f('')
-[out]
-main:2: error: Incompatible return value type (got "int", expected "str")
-main:3: error: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testMethodSignatureAsComment]
-class A:
-    def f(self, x):
-        # type: (int) -> str
-        self.f('') # Fail
-        return 1
-A().f('') # Fail
-[out]
-main:4: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-main:5: error: Incompatible return value type (got "int", expected "str")
-main:6: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testTrailingCommaParsing-skip]
-x = 1
-x in 1,
-if x in 1, :
-    pass
-[out]
-
-[case testInitReturnTypeError]
-class C:
-    def __init__(self):
-        # type: () -> int
-        pass
-[out]
-main:2: error: The return type of "__init__" must be None
diff --git a/test-data/unit/check-bound.test b/test-data/unit/check-bound.test
deleted file mode 100644
index ee935ae..0000000
--- a/test-data/unit/check-bound.test
+++ /dev/null
@@ -1,203 +0,0 @@
--- Enforcement of upper bounds
--- ---------------------------
-
-
-[case testBoundOnGenericFunction]
-from typing import TypeVar
-
-class A: pass
-class B(A): pass
-class C(A): pass
-class D: pass
-
-T = TypeVar('T', bound=A)
-U = TypeVar('U')
-def f(x: T) -> T: pass
-def g(x: U) -> U:
-    return f(x) # Fail
-
-f(A())
-f(B())
-f(D()) # Fail
-
-b = B()
-b = f(b)
-b = f(C()) # Fail
-[out]
-main:12: error: Type argument 1 of "f" has incompatible value "U"
-main:16: error: Type argument 1 of "f" has incompatible value "D"
-main:20: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-
-[case testBoundOnGenericClass]
-from typing import TypeVar, Generic
-
-class A: pass
-class B(A): pass
-T = TypeVar('T', bound=A)
-
-class G(Generic[T]):
-    def __init__(self, x: T) -> None: pass
-
-v = None # type: G[A]
-w = None # type: G[B]
-x = None # type: G[str] # E: Type argument "builtins.str" of "G" must be a subtype of "__main__.A"
-y = G('a') # E: Type argument 1 of "G" has incompatible value "str"
-z = G(A())
-z = G(B())
-
-
-[case testBoundVoid]
-from typing import TypeVar, Generic
-T = TypeVar('T', bound=int)
-class C(Generic[T]):
-    t = None # type: T
-    def get(self) -> T:
-        return self.t
-c1 = None # type: C[None]
-c1.get()
-d = c1.get() # E: Function does not return a value
-
-
-[case testBoundAny]
-from typing import TypeVar, Generic
-T = TypeVar('T', bound=int)
-class C(Generic[T]):
-    def __init__(self, x: T) -> None: pass
-def f(x: T) -> T:
-    return x
-
-def g(): pass
-
-f(g())
-C(g())
-z = None # type: C
-
-
-[case testBoundHigherOrderWithVoid]
-from typing import TypeVar, Callable
-class A: pass
-T = TypeVar('T', bound=A)
-def f(g: Callable[[], T]) -> T:
-    return g()
-def h() -> None: pass
-f(h)
-a = f(h) # E: "h" does not return a value
-
-
-[case testBoundInheritance]
-from typing import TypeVar, Generic
-class A: pass
-T = TypeVar('T')
-TA = TypeVar('TA', bound=A)
-
-class C(Generic[TA]): pass
-class D0(C[TA], Generic[TA]): pass
-class D1(C[T], Generic[T]): pass # E: Type argument "T`1" of "C" must be a subtype of "__main__.A"
-class D2(C[A]): pass
-class D3(C[str]): pass # E: Type argument "builtins.str" of "C" must be a subtype of "__main__.A"
-
-
--- Using information from upper bounds
--- -----------------------------------
-
-
-[case testBoundGenericFunctions]
-from typing import TypeVar
-class A: pass
-class B(A): pass
-
-T = TypeVar('T')
-TA = TypeVar('TA', bound=A)
-TB = TypeVar('TB', bound=B)
-
-def f(x: T) -> T:
-    return x
-def g(x: TA) -> TA:
-    return f(x)
-def h(x: TB) -> TB:
-    return g(x)
-def g2(x: TA) -> TA:
-    return h(x) # Fail
-
-def j(x: TA) -> A:
-    return x
-def k(x: TA) -> B:
-    return x # Fail
-[out]
-main:16: error: Type argument 1 of "h" has incompatible value "TA"
-main:21: error: Incompatible return value type (got "TA", expected "B")
-
-
-[case testBoundMethodUsage]
-from typing import TypeVar
-class A0:
-    def foo(self) -> None: pass
-class A(A0):
-    def bar(self) -> None: pass
-    a = 1
-    @property
-    def b(self) -> int:
-        return self.a
-class B(A):
-    def baz(self) -> None: pass
-
-T = TypeVar('T', A)
-
-def f(x: T) -> T:
-    x.foo()
-    x.bar()
-    x.baz()  # E: "A" has no attribute "baz"
-    x.a
-    x.b
-    return x
-
-b = f(B())
-[builtins fixtures/property.pyi]
-[out]
-
-[case testBoundClassMethod]
-from typing import TypeVar
-class A0:
-    @classmethod
-    def foo(cls, x: int) -> int: pass
-class A(A0): pass
-
-T = TypeVar('T', bound=A)
-def f(x: T) -> int:
-    return x.foo(22)
-[builtins fixtures/classmethod.pyi]
-
-
-[case testBoundStaticMethod]
-from typing import TypeVar
-class A0:
-    @staticmethod
-    def foo(x: int) -> int: pass
-class A(A0): pass
-
-T = TypeVar('T', bound=A)
-def f(x: T) -> int:
-    return x.foo(22)
-[builtins fixtures/staticmethod.pyi]
-
-
-[case testBoundOnDecorator]
-from typing import TypeVar, Callable, Any, cast
-T = TypeVar('T', bound=Callable[..., Any])
-
-def twice(f: T) -> T:
-    def result(*args, **kwargs) -> Any:
-        f(*args, **kwargs)
-        return f(*args, **kwargs)
-    return cast(T, result)
-
- at twice
-def foo(x: int) -> int:
-    return x
-
-a = 1
-b = foo(a)
-b = 'a' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-twice(a) # E: Type argument 1 of "twice" has incompatible value "int"
-[builtins fixtures/args.pyi]
diff --git a/test-data/unit/check-callable.test b/test-data/unit/check-callable.test
deleted file mode 100644
index 429ad44..0000000
--- a/test-data/unit/check-callable.test
+++ /dev/null
@@ -1,345 +0,0 @@
-[case testCallableDef]
-def f() -> None: pass
-
-if callable(f):
-    f()
-else:
-    f += 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableLambda]
-f = lambda: None
-
-if callable(f):
-    f()
-else:
-    f += 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableNotCallable]
-x = 5
-
-if callable(x):
-    x()
-else:
-    x += 5
-
-[builtins fixtures/callable.pyi]
-
-[case testUnion]
-from typing import Callable, Union
-
-x = 5  # type: Union[int, Callable[[], str]]
-
-if callable(x):
-    y = x() + 'test'
-else:
-    z = x + 6
-
-[builtins fixtures/callable.pyi]
-
-[case testUnionMultipleReturnTypes]
-from typing import Callable, Union
-
-x = 5  # type: Union[int, Callable[[], str], Callable[[], int]]
-
-if callable(x):
-    y = x() + 2 # E: Unsupported operand types for + (likely involving Union)
-else:
-    z = x + 6
-
-[builtins fixtures/callable.pyi]
-
-[case testUnionMultipleNonCallableTypes]
-from typing import Callable, Union
-
-x = 5  # type: Union[int, str, Callable[[], str]]
-
-if callable(x):
-    y = x() + 'test'
-else:
-    z = x + 6  # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableThenIsinstance]
-from typing import Callable, Union
-
-x = 5  # type: Union[int, str, Callable[[], str], Callable[[], int]]
-
-if callable(x):
-    y = x()
-    if isinstance(y, int):
-        b1 = y + 2
-    else:
-        b2 = y + 'test'
-else:
-    if isinstance(x, int):
-        b3 = x + 3
-    else:
-        b4 = x + 'test2'
-
-[builtins fixtures/callable.pyi]
-
-[case testIsinstanceThenCallable]
-from typing import Callable, Union
-
-x = 5  # type: Union[int, str, Callable[[], str], Callable[[], int]]
-
-if isinstance(x, int):
-    b1 = x + 1
-else:
-    if callable(x):
-        y = x()
-        if isinstance(y, int):
-            b2 = y + 1
-        else:
-            b3 = y + 'test'
-    else:
-        b4 = x + 'test2'
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableWithDifferentArgTypes]
-from typing import Callable, Union
-
-x = 5  # type: Union[int, Callable[[], None], Callable[[int], None]]
-
-if callable(x):
-    x()  # E: Too few arguments
-
-[builtins fixtures/callable.pyi]
-
-[case testClassInitializer]
-from typing import Callable, Union
-
-class A:
-    x = 5
-
-a = A  # type: Union[A, Callable[[], A]]
-
-if callable(a):
-    a = a()
-
-a.x + 6
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableVariables]
-from typing import Union
-
-class A:
-    x = 5
-
-class B:
-    x = int
-
-x = A()  # type: Union[A, B]
-
-if callable(x.x):
-    y = x.x()
-else:
-    y = x.x + 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableAnd]
-from typing import Union, Callable
-
-x = 5  # type: Union[int, Callable[[], str]]
-
-if callable(x) and x() == 'test':
-    x()
-else:
-    x + 5  # E: Unsupported left operand type for + (some union)
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableOr]
-from typing import Union, Callable
-
-x = 5  # type: Union[int, Callable[[], str]]
-
-if callable(x) or x() == 'test':  # E: "int" not callable
-    x()  # E: "int" not callable
-else:
-    x + 5
-[builtins fixtures/callable.pyi]
-
-[case testCallableOrOtherType]
-from typing import Union, Callable
-
-x = 5  # type: Union[int, Callable[[], str]]
-
-if callable(x) or x == 2:
-    pass
-else:
-    pass
-[builtins fixtures/callable.pyi]
-
-[case testAnyCallable]
-from typing import Any
-
-x = 5  # type: Any
-
-if callable(x):
-    reveal_type(x)  # E: Revealed type is 'Any'
-else:
-    reveal_type(x)  # E: Revealed type is 'Any'
-[builtins fixtures/callable.pyi]
-
-[case testCallableCallableClasses]
-from typing import Union
-
-
-class A:
-    pass
-
-
-class B:
-    def __call__(self) -> None:
-        pass
-
-
-a = A()  # type: A
-b = B()  # type: B
-c = A()  # type: Union[A, B]
-
-if callable(a):
-    5 + 'test'
-
-if not callable(b):
-    5 + 'test'
-
-if callable(c):
-    reveal_type(c)  # E: Revealed type is '__main__.B'
-else:
-    reveal_type(c)  # E: Revealed type is '__main__.A'
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableNestedUnions]
-from typing import Callable, Union
-
-T = Union[Union[int, Callable[[], int]], Union[str, Callable[[], str]]]
-
-def f(t: T) -> None:
-    if callable(t):
-        reveal_type(t())  # E: Revealed type is 'Union[builtins.int, builtins.str]'
-    else:
-        reveal_type(t)  # E: Revealed type is 'Union[builtins.int, builtins.str]'
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableTypeVarEmpty]
-from typing import TypeVar
-
-T = TypeVar('T')
-
-def f(t: T) -> T:
-    if callable(t):
-        return 5
-    else:
-        return t
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableTypeVarUnion]
-from typing import Callable, TypeVar, Union
-
-T = TypeVar('T', int, Callable[[], int], Union[str, Callable[[], str]])
-
-def f(t: T) -> None:
-    if callable(t):
-        reveal_type(t())  # E: Revealed type is 'builtins.int'  # E: Revealed type is 'builtins.str'
-    else:
-        reveal_type(t)  # E: Revealed type is 'builtins.int*'  # E: Revealed type is 'builtins.str'
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableTypeVarBound]
-from typing import TypeVar
-
-
-class A:
-    def __call__(self) -> str:
-        return 'hi'
-
-
-T = TypeVar('T', bound=A)
-
-def f(t: T) -> str:
-    if callable(t):
-        return t()
-    else:
-        return 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableTypeType]
-from typing import Type
-
-
-class A:
-    pass
-
-
-T = Type[A]
-
-def f(t: T) -> A:
-    if callable(t):
-        return t()
-    else:
-        return 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableTypeUnion]
-from abc import ABCMeta, abstractmethod
-from typing import Type, Union
-
-
-class A(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self) -> None:
-        pass
-
-
-class B:
-    pass
-
-
-x = B  # type: Union[Type[A], Type[B]]
-if callable(x):
-    # Abstract classes raise an error when called, but are indeed `callable`
-    pass
-else:
-    'test' + 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableUnionOfTypes]
-from abc import ABCMeta, abstractmethod
-from typing import Type, Union
-
-
-class A(metaclass=ABCMeta):
-    @abstractmethod
-    def f(self) -> None:
-        pass
-
-
-class B:
-    pass
-
-
-x = B  # type: Type[Union[A, B]]
-if callable(x):
-    # Abstract classes raise an error when called, but are indeed `callable`
-    pass
-else:
-    'test' + 5
-
-[builtins fixtures/callable.pyi]
diff --git a/test-data/unit/check-class-namedtuple.test b/test-data/unit/check-class-namedtuple.test
deleted file mode 100644
index a18532d..0000000
--- a/test-data/unit/check-class-namedtuple.test
+++ /dev/null
@@ -1,378 +0,0 @@
-[case testNewNamedTupleOldPythonVersion]
-# flags: --fast-parser --python-version 3.5
-from typing import NamedTuple
-
-class E(NamedTuple):  # E: NamedTuple class syntax is only supported in Python 3.6
-    pass
-
-[case testNewNamedTupleNoUnderscoreFields]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    _y: int  # E: NamedTuple field name cannot start with an underscore: _y
-    _z: int  # E: NamedTuple field name cannot start with an underscore: _z
-
-[case testNewNamedTupleAccessingAttributes]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    y: str
-
-x: X
-x.x
-x.y
-x.z # E: "X" has no attribute "z"
-
-[case testNewNamedTupleAttributesAreReadOnly]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-
-x: X
-x.x = 5 # E: Property "x" defined in "X" is read-only
-x.y = 5 # E: "X" has no attribute "y"
-
-class A(X): pass
-a: A
-a.x = 5 # E: Property "x" defined in "A" is read-only
-
-[case testNewNamedTupleCreateWithPositionalArguments]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    y: str
-
-x = X(1, '2')
-x.x
-x.z      # E: "X" has no attribute "z"
-x = X(1) # E: Too few arguments for "X"
-x = X(1, '2', 3)  # E: Too many arguments for "X"
-
-[case testNewNamedTupleShouldBeSingleBase]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A: ...
-class X(NamedTuple, A):  # E: NamedTuple should be a single base
-    pass
-
-[case testCreateNewNamedTupleWithKeywordArguments]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    y: str
-
-x = X(x=1, y='x')
-x = X(1, y='x')
-x = X(x=1, z=1) # E: Unexpected keyword argument "z" for "X"
-x = X(y='x') # E: Missing positional argument "x" in call to "X"
-
-[case testNewNamedTupleCreateAndUseAsTuple]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    y: str
-
-x = X(1, 'x')
-a, b = x
-a, b, c = x  # E: Need more than 2 values to unpack (3 expected)
-
-[case testNewNamedTupleWithItemTypes]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class N(NamedTuple):
-    a: int
-    b: str
-
-n = N(1, 'x')
-s: str = n.a  # E: Incompatible types in assignment (expression has type "int", \
-                          variable has type "str")
-i: int = n.b  # E: Incompatible types in assignment (expression has type "str", \
-                          variable has type "int")
-x, y = n
-x = y  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testNewNamedTupleConstructorArgumentTypes]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class N(NamedTuple):
-    a: int
-    b: str
-
-n = N('x', 'x') # E: Argument 1 to "N" has incompatible type "str"; expected "int"
-n = N(1, b=2)   # E: Argument 2 to "N" has incompatible type "int"; expected "str"
-N(1, 'x')
-N(b='x', a=1)
-
-[case testNewNamedTupleAsBaseClass]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class N(NamedTuple):
-    a: int
-    b: str
-
-class X(N):
-    pass
-x = X(1, 2)  # E: Argument 2 to "X" has incompatible type "int"; expected "str"
-s = ''
-i = 0
-s = x.a  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-i, s = x
-s, s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testNewNamedTupleSelfTypeWithNamedTupleAsBase]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A(NamedTuple):
-    a: int
-    b: str
-
-class B(A):
-    def f(self, x: int) -> None:
-        self.f(self.a)
-        self.f(self.b)  # E: Argument 1 to "f" of "B" has incompatible type "str"; expected "int"
-        i = 0
-        s = ''
-        i, s = self
-        i, i = self  # E: Incompatible types in assignment (expression has type "str", \
-                          variable has type "int")
-[out]
-
-[case testNewNamedTupleTypeReferenceToClassDerivedFrom]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A(NamedTuple):
-    a: int
-    b: str
-
-class B(A):
-    def f(self, x: 'B') -> None:
-        i = 0
-        s = ''
-        self = x
-        i, s = x
-        i, s = x.a, x.b
-        i, s = x.a, x.a  # E: Incompatible types in assignment (expression has type "int", \
-                              variable has type "str")
-        i, i = self  # E: Incompatible types in assignment (expression has type "str", \
-                          variable has type "int")
-
-[out]
-
-[case testNewNamedTupleSubtyping]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple, Tuple
-
-class A(NamedTuple):
-    a: int
-    b: str
-
-class B(A): pass
-a = A(1, '')
-b = B(1, '')
-t: Tuple[int, str]
-b = a  # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = t  # E: Incompatible types in assignment (expression has type "Tuple[int, str]", variable has type "A")
-b = t  # E: Incompatible types in assignment (expression has type "Tuple[int, str]", variable has type "B")
-t = a
-t = (1, '')
-t = b
-a = b
-
-[case testNewNamedTupleSimpleTypeInference]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple, Tuple
-
-class A(NamedTuple):
-    a: int
-
-l = [A(1), A(2)]
-a = A(1)
-a = l[0]
-(i,) = l[0]
-i, i = l[0]  # E: Need more than 1 value to unpack (2 expected)
-l = [A(1)]
-a = (1,)  # E: Incompatible types in assignment (expression has type "Tuple[int]", \
-               variable has type "A")
-[builtins fixtures/list.pyi]
-
-[case testNewNamedTupleMissingClassAttribute]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class MyNamedTuple(NamedTuple):
-    a: int
-    b: str
-
-MyNamedTuple.x # E: "MyNamedTuple" has no attribute "x"
-
-[case testNewNamedTupleEmptyItems]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A(NamedTuple):
-    ...
-
-[case testNewNamedTupleForwardRef]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A(NamedTuple):
-    b: 'B'
-
-class B: ...
-
-a = A(B())
-a = A(1)  # E: Argument 1 to "A" has incompatible type "int"; expected "B"
-
-[case testNewNamedTupleProperty]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A(NamedTuple):
-    a: int
-
-class B(A):
-    @property
-    def b(self) -> int:
-        return self.a
-class C(B): pass
-B(1).b
-C(2).b
-
-[builtins fixtures/property.pyi]
-
-[case testNewNamedTupleAsDict]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple, Any
-
-class X(NamedTuple):
-    x: Any
-    y: Any
-
-x: X
-reveal_type(x._asdict())  # E: Revealed type is 'builtins.dict[builtins.str, Any]'
-
-[builtins fixtures/dict.pyi]
-
-[case testNewNamedTupleReplaceTyped]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    y: str
-
-x: X
-reveal_type(x._replace())  # E: Revealed type is 'Tuple[builtins.int, builtins.str, fallback=__main__.X]'
-x._replace(x=5)
-x._replace(y=5)  # E: Argument 1 to X._replace has incompatible type "int"; expected "str"
-
-[case testNewNamedTupleFields]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    y: str
-
-reveal_type(X._fields)  # E: Revealed type is 'Tuple[builtins.str, builtins.str]'
-
-[case testNewNamedTupleUnit]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    pass
-
-x: X = X()
-x._replace()
-x._fields[0]  # E: Tuple index out of range
-
-[case testNewNamedTupleJoinNamedTuple]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    y: str
-class Y(NamedTuple):
-    x: int
-    y: str
-
-reveal_type([X(3, 'b'), Y(1, 'a')])  # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-
-[builtins fixtures/list.pyi]
-
-[case testNewNamedTupleJoinTuple]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    y: str
-
-reveal_type([(3, 'b'), X(1, 'a')])  # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-reveal_type([X(1, 'a'), (3, 'b')])  # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-
-[builtins fixtures/list.pyi]
-
-[case testNewNamedTupleWithTooManyArguments]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    y = z = 2  # E: Invalid statement in NamedTuple definition; expected "field_name: field_type"
-    def f(self): pass  # E: Invalid statement in NamedTuple definition; expected "field_name: field_type"
-
-[case testNewNamedTupleWithInvalidItems2]
-# flags: --fast-parser --python-version 3.6
-import typing
-
-class X(typing.NamedTuple):
-    x: int
-    y: str = 'y'  # E: Right hand side values are not supported in NamedTuple
-    z = None  # type: int # E: Invalid statement in NamedTuple definition; expected "field_name: field_type"
-    x[0]: int  # E: Invalid statement in NamedTuple definition; expected "field_name: field_type"
-
-[builtins fixtures/list.pyi]
-
-[case testNewNamedTupleWithoutTypesSpecified]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
-    x: int
-    y = 2  # E: Invalid statement in NamedTuple definition; expected "field_name: field_type"
-
-[case testTypeUsingTypeCNamedTuple]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple, Type
-
-class N(NamedTuple):
-    x: int
-    y: str
-
-def f(a: Type[N]):
-    a()
-[builtins fixtures/list.pyi]
-[out]
-main:8: error: Unsupported type Type["N"]
diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test
deleted file mode 100644
index 2f6e029..0000000
--- a/test-data/unit/check-classes.test
+++ /dev/null
@@ -1,2430 +0,0 @@
--- Methods
--- -------
-
-
-[case testMethodCall]
-
-a = None # type: A
-b = None # type: B
-
-a.foo(B())        # Fail
-a.bar(B(), A())   # Fail
-
-a.foo(A())
-b.bar(B(), A())
-
-class A:
-    def foo(self, x: 'A') -> None: pass
-class B:
-    def bar(self, x: 'B', y: A) -> None: pass
-[out]
-main:5: error: Argument 1 to "foo" of "A" has incompatible type "B"; expected "A"
-main:6: error: "A" has no attribute "bar"
-
-[case testMethodCallWithSubtype]
-
-a = None # type: A
-a.foo(A())
-a.foo(B())
-a.bar(A()) # Fail
-a.bar(B())
-
-class A:
-    def foo(self, x: 'A') -> None: pass
-    def bar(self, x: 'B') -> None: pass
-class B(A): pass
-[out]
-main:5: error: Argument 1 to "bar" of "A" has incompatible type "A"; expected "B"
-
-[case testInheritingMethod]
-
-a = None # type: B
-a.foo(A()) # Fail
-a.foo(B())
-
-class A:
-    def foo(self, x: 'B') -> None: pass
-class B(A): pass
-[out]
-main:3: error: Argument 1 to "foo" of "A" has incompatible type "A"; expected "B"
-
-[case testMethodCallWithInvalidNumberOfArguments]
-
-a = None # type: A
-a.foo()               # Fail
-a.foo(object(), A())  # Fail
-
-class A:
-    def foo(self, x: 'A') -> None: pass
-[out]
-main:3: error: Too few arguments for "foo" of "A"
-main:4: error: Too many arguments for "foo" of "A"
-main:4: error: Argument 1 to "foo" of "A" has incompatible type "object"; expected "A"
-
-[case testMethodBody]
-import typing
-class A:
-    def f(self) -> None:
-        a = object() # type: A    # Fail
-[out]
-main:4: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-[case testMethodArguments]
-import typing
-class A:
-    def f(self, a: 'A', b: 'B') -> None:
-        a = B() # Fail
-        b = A() # Fail
-        a = A()
-        b = B()
-        a = a
-        a = b # Fail
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:9: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testReturnFromMethod]
-import typing
-class A:
-    def f(self) -> 'A':
-        return B() # Fail
-        return A()
-class B: pass
-[out]
-main:4: error: Incompatible return value type (got "B", expected "A")
-
-[case testSelfArgument]
-import typing
-class A:
-    def f(self) -> None:
-        o = self # type: B    # Fail
-        self.g()      # Fail
-        a = self # type: A
-        self.f()
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:5: error: "A" has no attribute "g"
-
-[case testAssignToMethodViaInstance]
-import typing
-class A:
-    def f(self): pass
-A().f = None # E: Cannot assign to a method
-
-
--- Attributes
--- ----------
-
-
-[case testReferToInvalidAttribute]
-
-class A:
-    def __init__(self):
-        self.x = object()
-a = None # type: A
-a.y
-a.y = object()
-a.x
-a.x = object()
-[out]
-main:6: error: "A" has no attribute "y"
-main:7: error: "A" has no attribute "y"
-
-[case testArgumentTypeInference]
-
-class A:
-    def __init__(self, aa: 'A', bb: 'B') -> None:
-        self.a = aa
-        self.b = bb
-class B: pass
-a = None # type: A
-b = None # type: B
-a.a = b # Fail
-a.b = a # Fail
-b.a     # Fail
-a.a = a
-a.b = b
-[out]
-main:9: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:10: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:11: error: "B" has no attribute "a"
-
-[case testExplicitAttributeInBody]
-
-a = None # type: A
-a.x = object() # Fail
-a.x = A()
-class A:
-  x = None # type: A
-[out]
-main:3: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-[case testAttributeDefinedInNonInitMethod]
-import typing
-class A:
-    def f(self) -> None:
-        self.x = 1
-        self.y = ''
-        self.x = 1
-a = A()
-a.x = 1
-a.y = ''
-a.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-a.z = 0  # E: "A" has no attribute "z"
-
-[case testInheritanceAndAttributeAssignment]
-import typing
-class A:
-    def f(self) -> None:
-        self.x = 0
-class B(A):
-    def f(self) -> None:
-        self.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[out]
-
-[case testAssignmentToAttributeInMultipleMethods]
-import typing
-class A:
-    def f(self) -> None:
-        self.x = 0
-    def g(self) -> None:
-        self.x = '' # Fail
-    def __init__(self) -> None:
-        self.x = '' # Fail
-[out]
-main:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:8: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-
--- Method overriding
--- -----------------
-
-
-[case testMethodOverridingWithIdenticalSignature]
-import typing
-class A:
-    def f(self, x: 'A') -> None: pass
-    def g(self, x: 'B' , y: object) -> 'A': pass
-    def h(self) -> None: pass
-class B(A):
-    def f(self, x: A) -> None: pass
-    def g(self, x: 'B' , y: object) -> A: pass
-    def h(self) -> None: pass
-[out]
-
-[case testMethodOverridingWithCovariantType]
-import typing
-class A:
-  def f(self, x: 'A', y: 'B') -> 'A': pass
-  def g(self, x: 'A', y: 'B') -> 'A': pass
-class B(A):
-  def f(self, x: A, y: 'B') -> 'B': pass
-  def g(self, x: A, y: A) -> 'A': pass
-[out]
-
-[case testMethodOverridingWithIncompatibleTypes]
-import typing
-class A:
-  def f(self, x: 'A', y: 'B') -> 'A': pass
-  def g(self, x: 'A', y: 'B') -> 'A': pass
-  def h(self, x: 'A', y: 'B') -> 'A': pass
-class B(A):
-  def f(self, x: 'B', y: 'B') -> A: pass  # Fail
-  def g(self, x: A, y: A) -> A: pass
-  def h(self, x: A, y: 'B') -> object: pass  # Fail
-[out]
-main:7: error: Argument 1 of "f" incompatible with supertype "A"
-main:9: error: Return type of "h" incompatible with supertype "A"
-
-[case testMethodOverridingWithIncompatibleArgumentCount]
-import typing
-class A:
-    def f(self, x: 'A') -> None: pass
-    def g(self, x: 'A', y: 'B') -> 'A': pass
-class B(A):
-    def f(self, x: A, y: A) -> None: pass # Fail
-    def g(self, x: A) -> A: pass # Fail
-[out]
-main:6: error: Signature of "f" incompatible with supertype "A"
-main:7: error: Signature of "g" incompatible with supertype "A"
-
-[case testMethodOverridingAcrossDeepInheritanceHierarchy1]
-import typing
-class A:
-    def f(self, x: 'B') -> None: pass
-class B(A): pass
-class C(B): # with gap in implementations
-    def f(self, x: 'C') -> None:  # Fail
-        pass
-[out]
-main:6: error: Argument 1 of "f" incompatible with supertype "A"
-
-[case testMethodOverridingAcrossDeepInheritanceHierarchy2]
-import typing
-class A:
-    def f(self) -> 'B': pass
-class B(A):
-    def f(self) -> 'C': pass
-class C(B): # with multiple implementations
-    def f(self) -> B:  # Fail
-        pass
-[out]
-main:7: error: Return type of "f" incompatible with supertype "B"
-
-[case testMethodOverridingWithVoidReturnValue]
-import typing
-class A:
-    def f(self) -> None: pass
-    def g(self) -> 'A': pass
-class B(A):
-    def f(self) -> A: pass  # Fail
-    def g(self) -> None: pass  # Fail
-[out]
-main:6: error: Return type of "f" incompatible with supertype "A"
-main:7: error: Return type of "g" incompatible with supertype "A"
-
-[case testOverride__new__WithDifferentSignature]
-class A:
-    def __new__(cls, x: int) -> str:
-        return ''
-
-class B(A):
-    def __new__(cls) -> int:
-        return 1
-
-[case testInnerFunctionNotOverriding]
-class A:
-    def f(self) -> int: pass
-
-class B(A):
-    def g(self) -> None:
-        def f(self) -> str: pass
-
-
--- Constructors
--- ------------
-
-
-[case testTrivialConstructor]
-import typing
-a = A() # type: A
-b = A() # type: B # Fail
-class A:
-    def __init__(self) -> None: pass
-class B: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testConstructor]
-import typing
-a = A(B()) # type: A
-aa = A(object()) # type: A  # Fail
-b = A(B()) # type: B       # Fail
-class A:
-    def __init__(self, x: 'B') -> None: pass
-class B: pass
-[out]
-main:3: error: Argument 1 to "A" has incompatible type "object"; expected "B"
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testConstructorWithTwoArguments]
-import typing
-a = A(C(), B()) # type: A  # Fail
-
-class A:
-    def __init__(self, x: 'B', y: 'C') -> None: pass
-class B: pass
-class C(B): pass
-[out]
-main:2: error: Argument 2 to "A" has incompatible type "B"; expected "C"
-
-[case testInheritedConstructor]
-import typing
-b = B(C()) # type: B
-a = B(D()) # type: A # Fail
-class A:
-    def __init__(self, x: 'C') -> None: pass
-class B(A): pass
-class C: pass
-class D: pass
-[out]
-main:3: error: Argument 1 to "B" has incompatible type "D"; expected "C"
-
-[case testOverridingWithIncompatibleConstructor]
-import typing
-A()    # Fail
-B(C()) # Fail
-A(C())
-B()
-class A:
-    def __init__(self, x: 'C') -> None: pass
-class B(A):
-    def __init__(self) -> None: pass
-class C: pass
-[out]
-main:2: error: Too few arguments for "A"
-main:3: error: Too many arguments for "B"
-
-[case testConstructorWithReturnValueType]
-import typing
-class A:
-    def __init__(self) -> 'A': pass
-[out]
-main:3: error: The return type of "__init__" must be None
-
-[case testConstructorWithImplicitReturnValueType]
-import typing
-class A:
-    def __init__(self, x: int): pass
-[out]
-main:3: error: The return type of "__init__" must be None
-
-[case testInitSubclassWithReturnValueType]
-import typing
-class A:
-    def __init_subclass__(cls) -> 'A': pass
-[out]
-main:3: error: The return type of "__init_subclass__" must be None
-
-[case testInitSubclassWithImplicitReturnValueType]
-import typing
-class A:
-    def __init_subclass__(cls, x: int=1): pass
-[out]
-main:3: error: The return type of "__init_subclass__" must be None
-
-[case testGlobalFunctionInitWithReturnType]
-import typing
-a = __init__() # type: A
-b = __init__() # type: B # Fail
-def __init__() -> 'A': pass
-class A: pass
-class B: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testAccessingInit]
-from typing import Any
-class A:
-    def __init__(self, a: 'A') -> None: pass
-a = None # type: A
-a.__init__(a)  # E: Cannot access "__init__" directly
-(Any(a)).__init__(a)
-
-[case testDeepInheritanceHierarchy]
-import typing
-d = C() # type: D  # Fail
-d = B()      # Fail
-d = A()      # Fail
-d = D2()     # Fail
-a = D() # type: A
-a = D2()
-b = D() # type: B
-b = D2()
-
-class A: pass
-class B(A): pass
-class C(B): pass
-class D(C): pass
-class D2(C): pass
-[out]
-main:2: error: Incompatible types in assignment (expression has type "C", variable has type "D")
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "D")
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "D")
-main:5: error: Incompatible types in assignment (expression has type "D2", variable has type "D")
-
-
--- Attribute access in class body
--- ------------------------------
-
-
-[case testDataAttributeRefInClassBody]
-import typing
-class B: pass
-class A:
-    x = B()
-    y = x
-    b = x # type: B
-    b = x
-    c = x # type: A # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    c = b   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[out]
-
-[case testMethodRefInClassBody]
-from typing import Callable
-class B: pass
-class A:
-    def f(self) -> None: pass
-    g = f
-    h = f # type: Callable[[A], None]
-    h = f
-    g = h
-    ff = f # type: Callable[[B], None]  # E: Incompatible types in assignment (expression has type Callable[[A], None], variable has type Callable[[B], None])
-    g = ff                # E: Incompatible types in assignment (expression has type Callable[[B], None], variable has type Callable[[A], None])
-[out]
-
-
--- Arbitrary statements in class body
--- ----------------------------------
-
-
-[case testStatementsInClassBody]
-import typing
-class B: pass
-class A:
-    for x in [A()]:
-        y = x
-        y = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    x = A()
-    y = A()
-    x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Class attributes
--- ----------------
-
-
-[case testAccessMethodViaClass]
-import typing
-class A:
-    def f(self) -> None: pass
-A.f(A())
-A.f(object())     # E: Argument 1 to "f" of "A" has incompatible type "object"; expected "A"
-A.f()             # E: Too few arguments for "f" of "A"
-A.f(None, None)   # E: Too many arguments for "f" of "A"
-
-[case testAccessAttributeViaClass]
-import typing
-class B: pass
-class A:
-    x = None # type: A
-a = A.x # type: A
-b = A.x # type: B # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testAccessingUndefinedAttributeViaClass]
-import typing
-class A: pass
-A.x # E: "A" has no attribute "x"
-
-[case testAccessingUndefinedAttributeViaClassWithOverloadedInit]
-from typing import overload
-class A:
-    @overload
-    def __init__(self): pass
-    @overload
-    def __init__(self, x): pass
-A.x # E: "A" has no attribute "x"
-
-[case testAccessMethodOfClassWithOverloadedInit]
-from typing import overload, Any
-class A:
-    @overload
-    def __init__(self) -> None: pass
-    @overload
-    def __init__(self, x: Any) -> None: pass
-    def f(self) -> None: pass
-A.f(A())
-A.f()    # E: Too few arguments for "f" of "A"
-
-[case testAssignmentToClassDataAttribute]
-import typing
-class B: pass
-class A:
-    x = None # type: B
-A.x = B()
-A.x = object()  # E: Incompatible types in assignment (expression has type "object", variable has type "B")
-
-[case testAssignmentToInferredClassDataAttribute]
-import typing
-class B: pass
-class A:
-     x = B()
-A.x = B()
-A.x = A()   # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testInitMethodUnbound]
-
-class B: pass
-class A:
-    def __init__(self, b: B) -> None: pass
-a = None # type: A
-b = None # type: B
-A.__init__(a, b)
-A.__init__(b, b) # E: Argument 1 to "__init__" of "A" has incompatible type "B"; expected "A"
-A.__init__(a, a) # E: Argument 2 to "__init__" of "A" has incompatible type "A"; expected "B"
-
-[case testAssignToMethodViaClass]
-import typing
-class A:
-    def f(self): pass
-A.f = None # E: Cannot assign to a method
-
-[case testAssignToNestedClassViaClass]
-import typing
-class A:
-    class B: pass
-A.B = None # E: Cannot assign to a type
-
-[case testAccessingClassAttributeWithTypeInferenceIssue]
-x = C.x # E: Cannot determine type of 'x'
-def f() -> int: return 1
-class C:
-    x = f()
-[builtins fixtures/list.pyi]
-
-[case testAccessingClassAttributeWithTypeInferenceIssue2]
-class C:
-    x = []
-x = C.x
-[builtins fixtures/list.pyi]
-[out]
-main:2: error: Need type annotation for variable
-
-
--- Nested classes
--- --------------
-
-
-[case testClassWithinFunction]
-
-def f() -> None:
-    class A:
-        def g(self) -> None: pass
-    a = None # type: A
-    a.g()
-    a.g(a) # E: Too many arguments for "g" of "A"
-[out]
-
-[case testConstructNestedClass]
-import typing
-class A:
-    class B: pass
-    b = B()
-    b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    b = B(b) # E: Too many arguments for "B"
-[out]
-
-[case testConstructNestedClassWithCustomInit]
-import typing
-class A:
-    def f(self) -> None:
-        class B:
-            def __init__(self, a: 'A') -> None: pass
-        b = B(A())
-        b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-        b = B() # E: Too few arguments for "B"
-[out]
-
-[case testDeclareVariableWithNestedClassType]
-
-def f() -> None:
-    class A: pass
-    a = None # type: A
-    a = A()
-    a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-[out]
-
-[case testExternalReferenceToClassWithinClass]
-
-class A:
-    class B: pass
-b = None # type: A.B
-b = A.B()
-b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = A.B(b) # E: Too many arguments for "B"
-
-
--- Declaring attribute type in method
--- ----------------------------------
-
-
-[case testDeclareAttributeTypeInInit]
-
-class A:
-    def __init__(self):
-        self.x = None # type: int
-a = None # type: A
-a.x = 1
-a.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testAccessAttributeDeclaredInInitBeforeDeclaration]
-
-a = None # type: A
-a.x = 1
-a.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-class A:
-    def __init__(self):
-        self.x = None # type: int
-
-
--- Special cases
--- -------------
-
-
-[case testMultipleClassDefinition]
-import typing
-A()
-class A: pass
-class A: pass
-[out]
-main:4: error: Name 'A' already defined
-
-[case testDocstringInClass]
-import typing
-class A:
-    """Foo"""
-class B:
-    'x'
-    y = B()
-[builtins fixtures/primitives.pyi]
-
-[case testErrorMessageInFunctionNestedWithinMethod]
-import typing
-class A:
-    def f(self) -> None:
-        def g() -> None:
-            a = None
-        b = None
-[out]
-main:5: error: Need type annotation for variable
-main:6: error: Need type annotation for variable
-
-
--- Static methods
--- --------------
-
-
-[case testSimpleStaticMethod]
-import typing
-class A:
-  @staticmethod
-  def f(x: int) -> None: pass
-A.f(1)
-A().f(1)
-A.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-A().f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-[builtins fixtures/staticmethod.pyi]
-
-[case testBuiltinStaticMethod]
-import typing
-int.from_bytes(b'', '')
-int.from_bytes('', '') # E: Argument 1 to "from_bytes" of "int" has incompatible type "str"; expected "bytes"
-[builtins fixtures/staticmethod.pyi]
-
-[case testAssignStaticMethodOnInstance]
-import typing
-class A:
-  @staticmethod
-  def f(x: int) -> None: pass
-A().f = A.f # E: Cannot assign to a method
-[builtins fixtures/staticmethod.pyi]
-
-
--- Class methods
--- -------------
-
-
-[case testSimpleClassMethod]
-import typing
-class A:
-  @classmethod
-  def f(cls, x: int) -> None: pass
-A.f(1)
-A().f(1)
-A.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-A().f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-[builtins fixtures/classmethod.pyi]
-
-[case testBuiltinClassMethod]
-import typing
-int.from_bytes(b'', '')
-int.from_bytes('', '') # E: Argument 1 to "from_bytes" of "int" has incompatible type "str"; expected "bytes"
-[builtins fixtures/classmethod.pyi]
-
-[case testAssignClassMethodOnClass]
-import typing
-class A:
-  @classmethod
-  def f(cls, x: int) -> None: pass
-A.f = A.f # E: Cannot assign to a method
-[builtins fixtures/classmethod.pyi]
-
-[case testAssignClassMethodOnInstance]
-import typing
-class A:
-  @classmethod
-  def f(cls, x: int) -> None: pass
-A().f = A.f # E: Cannot assign to a method
-[builtins fixtures/classmethod.pyi]
-
-[case testClassMethodCalledInClassMethod]
-import typing
-class C:
-  @classmethod
-  def foo(cls) -> None: pass
-  @classmethod
-  def bar(cls) -> None:
-    cls()
-    cls(1)      # E: Too many arguments for "C"
-    cls.bar()
-    cls.bar(1)  # E: Too many arguments for "bar" of "C"
-    cls.bozo()  # E: "C" has no attribute "bozo"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testClassMethodCalledOnClass]
-import typing
-class C:
-  @classmethod
-  def foo(cls) -> None: pass
-C.foo()
-C.foo(1)  # E: Too many arguments for "foo" of "C"
-C.bozo()  # E: "C" has no attribute "bozo"
-[builtins fixtures/classmethod.pyi]
-
-[case testClassMethodCalledOnInstance]
-import typing
-class C:
-  @classmethod
-  def foo(cls) -> None: pass
-C().foo()
-C().foo(1)  # E: Too many arguments for "foo" of "C"
-C.bozo()    # E: "C" has no attribute "bozo"
-[builtins fixtures/classmethod.pyi]
-
-[case testClassMethodMayCallAbstractMethod]
-from abc import abstractmethod
-import typing
-class C:
-  @classmethod
-  def foo(cls) -> None:
-      cls().bar()
-  @abstractmethod
-  def bar(self) -> None:
-      pass
-[builtins fixtures/classmethod.pyi]
-
-
--- Properties
--- ----------
-
-
-[case testAccessingReadOnlyProperty]
-import typing
-class A:
-    @property
-    def f(self) -> str: pass
-a = A()
-reveal_type(a.f)  # E: Revealed type is 'builtins.str'
-[builtins fixtures/property.pyi]
-
-[case testAssigningToReadOnlyProperty]
-import typing
-class A:
-    @property
-    def f(self) -> str: pass
-A().f = '' # E: Property "f" defined in "A" is read-only
-[builtins fixtures/property.pyi]
-
-[case testPropertyGetterBody]
-import typing
-class A:
-    @property
-    def f(self) -> str:
-        self.x = 1
-        self.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/property.pyi]
-[out]
-
-[case testDynamicallyTypedProperty]
-import typing
-class A:
-    @property
-    def f(self): pass
-a = A()
-a.f.xx
-a.f = '' # E: Property "f" defined in "A" is read-only
-[builtins fixtures/property.pyi]
-
-[case testPropertyWithSetter]
-import typing
-class A:
-    @property
-    def f(self) -> int:
-        return 1
-    @f.setter
-    def f(self, x: int) -> None:
-        pass
-a = A()
-a.f = a.f
-a.f.x # E: "int" has no attribute "x"
-a.f = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/property.pyi]
-
-[case testPropertyWithDeleterButNoSetter]
-import typing
-class A:
-    @property
-    def f(self) -> int:
-        return 1
-    @f.deleter
-    def f(self, x) -> None:
-        pass
-a = A()
-a.f = a.f # E: Property "f" defined in "A" is read-only
-a.f.x # E: "int" has no attribute "x"
-[builtins fixtures/property.pyi]
-
--- Descriptors
--- -----------
-
-
-[case testAccessingNonDataDescriptor]
-from typing import Any
-class D:
-    def __get__(self, inst: Any, own: Any) -> str: return 's'
-class A:
-    f = D()
-a = A()
-reveal_type(a.f)  # E: Revealed type is 'builtins.str'
-
-[case testSettingNonDataDescriptor]
-from typing import Any
-class D:
-    def __get__(self, inst: Any, own: Any) -> str: return 's'
-class A:
-    f = D()
-a = A()
-a.f = 'foo'
-a.f = D()  # E: Incompatible types in assignment (expression has type "D", variable has type "str")
-
-[case testSettingDataDescriptor]
-from typing import Any
-class D:
-    def __get__(self, inst: Any, own: Any) -> str: return 's'
-    def __set__(self, inst: Any, value: str) -> None: pass
-class A:
-    f = D()
-a = A()
-a.f = ''
-a.f = 1 # E: Argument 2 to "__set__" of "D" has incompatible type "int"; expected "str"
-
-[case testReadingDescriptorWithoutDunderGet]
-from typing import Union, Any
-class D:
-    def __set__(self, inst: Any, value: str) -> None: pass
-class A:
-    f = D()
-    def __init__(self): self.f = 's'
-a = A()
-reveal_type(a.f)  # E: Revealed type is '__main__.D'
-
-[case testAccessingDescriptorFromClass]
-# flags: --strict-optional
-from d import D, Base
-class A(Base):
-    f = D()
-reveal_type(A.f)  # E: Revealed type is 'd.D'
-reveal_type(A().f)  # E: Revealed type is 'builtins.str'
-[file d.pyi]
-from typing import TypeVar, Type, Generic, overload
-class Base: pass
-class D:
-    def __init__(self) -> None: pass
-    @overload
-    def __get__(self, inst: None, own: Type[Base]) -> D: pass
-    @overload
-    def __get__(self, inst: Base, own: Type[Base]) -> str: pass
-[builtins fixtures/bool.pyi]
-
-[case testAccessingDescriptorFromClassWrongBase]
-# flags: --strict-optional
-from d import D, Base
-class A:
-    f = D()
-reveal_type(A.f)
-reveal_type(A().f)
-[file d.pyi]
-from typing import TypeVar, Type, Generic, overload
-class Base: pass
-class D:
-    def __init__(self) -> None: pass
-    @overload
-    def __get__(self, inst: None, own: Type[Base]) -> D: pass
-    @overload
-    def __get__(self, inst: Base, own: Type[Base]) -> str: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Revealed type is 'Any'
-main:5: error: No overload variant of "__get__" of "D" matches argument types [builtins.None, Type[__main__.A]]
-main:6: error: Revealed type is 'Any'
-main:6: error: No overload variant of "__get__" of "D" matches argument types [__main__.A, Type[__main__.A]]
-
-
-[case testAccessingGenericNonDataDescriptor]
-from typing import TypeVar, Type, Generic, Any
-V = TypeVar('V')
-class D(Generic[V]):
-    def __init__(self, v: V) -> None: self.v = v
-    def __get__(self, inst: Any, own: Type) -> V: return self.v
-class A:
-    f = D(10)
-    g = D('10')
-a = A()
-reveal_type(a.f)  # E: Revealed type is 'builtins.int*'
-reveal_type(a.g)  # E: Revealed type is 'builtins.str*'
-
-[case testSettingGenericDataDescriptor]
-from typing import TypeVar, Type, Generic, Any
-V = TypeVar('V')
-class D(Generic[V]):
-    def __init__(self, v: V) -> None: self.v = v
-    def __get__(self, inst: Any, own: Type) -> V: return self.v
-    def __set__(self, inst: Any, v: V) -> None: pass
-class A:
-    f = D(10)
-    g = D('10')
-a = A()
-a.f = 1
-a.f = '' # E: Argument 2 to "__set__" of "D" has incompatible type "str"; expected "int"
-a.g = ''
-a.g = 1 # E: Argument 2 to "__set__" of "D" has incompatible type "int"; expected "str"
-
-[case testAccessingGenericDescriptorFromClass]
-# flags: --strict-optional
-from d import D
-class A:
-    f = D(10)  # type: D[A, int]
-    g = D('10')  # type: D[A, str]
-reveal_type(A.f)  # E: Revealed type is 'd.D[__main__.A*, builtins.int*]'
-reveal_type(A.g)  # E: Revealed type is 'd.D[__main__.A*, builtins.str*]'
-reveal_type(A().f)  # E: Revealed type is 'builtins.int*'
-reveal_type(A().g)  # E: Revealed type is 'builtins.str*'
-[file d.pyi]
-from typing import TypeVar, Type, Generic, overload
-T = TypeVar('T')
-V = TypeVar('V')
-class D(Generic[T, V]):
-    def __init__(self, v: V) -> None: pass
-    @overload
-    def __get__(self, inst: None, own: Type[T]) -> 'D[T, V]': pass
-    @overload
-    def __get__(self, inst: T, own: Type[T]) -> V: pass
-[builtins fixtures/bool.pyi]
-
-[case testAccessingGenericDescriptorFromInferredClass]
-# flags: --strict-optional
-from typing import Type
-from d import D
-class A:
-    f = D(10)  # type: D[A, int]
-    g = D('10')  # type: D[A, str]
-def f(some_class: Type[A]):
-    reveal_type(some_class.f)
-    reveal_type(some_class.g)
-[file d.pyi]
-from typing import TypeVar, Type, Generic, overload
-T = TypeVar('T')
-V = TypeVar('V')
-class D(Generic[T, V]):
-    def __init__(self, v: V) -> None: pass
-    @overload
-    def __get__(self, inst: None, own: Type[T]) -> 'D[T, V]': pass
-    @overload
-    def __get__(self, inst: T, own: Type[T]) -> V: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:8: error: Revealed type is 'd.D[__main__.A*, builtins.int*]'
-main:9: error: Revealed type is 'd.D[__main__.A*, builtins.str*]'
-
-[case testAccessingGenericDescriptorFromClassBadOverload]
-# flags: --strict-optional
-from d import D
-class A:
-    f = D(10)  # type: D[A, int]
-reveal_type(A.f)
-[file d.pyi]
-from typing import TypeVar, Type, Generic, overload
-T = TypeVar('T')
-V = TypeVar('V')
-class D(Generic[T, V]):
-    def __init__(self, v: V) -> None: pass
-    @overload
-    def __get__(self, inst: None, own: None) -> 'D[T, V]': pass
-    @overload
-    def __get__(self, inst: T, own: Type[T]) -> V: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Revealed type is 'Any'
-main:5: error: No overload variant of "__get__" of "D" matches argument types [builtins.None, Type[__main__.A]]
-
-[case testAccessingNonDataDescriptorSubclass]
-from typing import Any
-class C:
-    def __get__(self, inst: Any, own: Any) -> str: return 's'
-class D(C): pass
-class A:
-    f = D()
-a = A()
-reveal_type(a.f)  # E: Revealed type is 'builtins.str'
-
-[case testSettingDataDescriptorSubclass]
-from typing import Any
-class C:
-    def __get__(self, inst: Any, own: Any) -> str: return 's'
-    def __set__(self, inst: Any, v: str) -> None: pass
-class D(C): pass
-class A:
-    f = D()
-a = A()
-a.f = ''
-a.f = 1 # E: Argument 2 to "__set__" of "C" has incompatible type "int"; expected "str"
-
-[case testReadingDescriptorSubclassWithoutDunderGet]
-from typing import Union, Any
-class C:
-    def __set__(self, inst: Any, v: str) -> None: pass
-class D(C): pass
-class A:
-    f = D()
-    def __init__(self): self.f = 's'
-a = A()
-reveal_type(a.f)  # E: Revealed type is '__main__.D'
-
-[case testAccessingGenericNonDataDescriptorSubclass]
-from typing import TypeVar, Type, Generic, Any
-V = TypeVar('V')
-class C(Generic[V]):
-    def __init__(self, v: V) -> None: self.v = v
-    def __get__(self, inst: Any, own: Type) -> V: return self.v
-class D(C[V], Generic[V]): pass
-class A:
-    f = D(10)
-    g = D('10')
-a = A()
-reveal_type(a.f)  # E: Revealed type is 'builtins.int*'
-reveal_type(a.g)  # E: Revealed type is 'builtins.str*'
-
-[case testSettingGenericDataDescriptorSubclass]
-from typing import TypeVar, Type, Generic
-T = TypeVar('T')
-V = TypeVar('V')
-class C(Generic[T, V]):
-    def __init__(self, v: V) -> None: self.v = v
-    def __get__(self, inst: T, own: Type[T]) -> V: return self.v
-    def __set__(self, inst: T, v: V) -> None: pass
-class D(C[T, V], Generic[T, V]): pass
-class A:
-    f = D(10)  # type: D[A, int]
-    g = D('10')  # type: D[A, str]
-a = A()
-a.f = 1
-a.f = '' # E: Argument 2 to "__set__" of "C" has incompatible type "str"; expected "int"
-a.g = ''
-a.g = 1 # E: Argument 2 to "__set__" of "C" has incompatible type "int"; expected "str"
-
-[case testSetDescriptorOnClass]
-from typing import TypeVar, Type, Generic
-T = TypeVar('T')
-V = TypeVar('V')
-class D(Generic[T, V]):
-    def __init__(self, v: V) -> None: self.v = v
-    def __get__(self, inst: T, own: Type[T]) -> V: return self.v
-    def __set__(self, inst: T, v: V) -> None: pass
-class A:
-    f = D(10)  # type: D[A, int]
-A.f = D(20)
-A.f = D('some string')  # E: Argument 1 to "D" has incompatible type "str"; expected "int"
-
-[case testSetDescriptorOnInferredClass]
-from typing import TypeVar, Type, Generic, Any
-V = TypeVar('V')
-class D(Generic[V]):
-    def __init__(self, v: V) -> None: self.v = v
-    def __get__(self, inst: Any, own: Type) -> V: return self.v
-    def __set__(self, inst: Any, v: V) -> None: pass
-class A:
-    f = D(10)
-def f(some_class: Type[A]):
-    A.f = D(20)
-    A.f = D('some string')
-[out]
-main:11: error: Argument 1 to "D" has incompatible type "str"; expected "int"
-
-[case testDescriptorUncallableDunderSet]
-class D:
-    __set__ = 's'
-class A:
-    f = D()
-A().f = 'x'  # E: __main__.D.__set__ is not callable
-
-[case testDescriptorDunderSetTooFewArgs]
-class D:
-    def __set__(self, inst): pass
-class A:
-    f = D()
-A().f = 'x'  # E: Too many arguments for "__set__"
-
-[case testDescriptorDunderSetTooManyArgs]
-class D:
-    def __set__(self, inst, v, other): pass
-class A:
-    f = D()
-A().f = 'x'  # E: Too few arguments for "__set__"
-
-[case testDescriptorDunderSetWrongArgTypes]
-class D:
-    def __set__(self, inst: str, v:str) -> None: pass
-class A:
-    f = D()
-A().f = 'x'  # E: Argument 1 to "__set__" of "D" has incompatible type "A"; expected "str"
-
-[case testDescriptorUncallableDunderGet]
-class D:
-    __get__ = 's'
-class A:
-    f = D()
-A().f  # E: __main__.D.__get__ is not callable
-
-[case testDescriptorDunderGetTooFewArgs]
-class D:
-    def __get__(self, inst): pass
-class A:
-    f = D()
-A().f  # E: Too many arguments for "__get__"
-
-[case testDescriptorDunderGetTooManyArgs]
-class D:
-    def __get__(self, inst, own, other): pass
-class A:
-    f = D()
-A().f = 'x'  # E: Too few arguments for "__get__"
-
-[case testDescriptorDunderGetWrongArgTypeForInstance]
-from typing import Any
-class D:
-    def __get__(self, inst: str, own: Any) -> Any: pass
-class A:
-    f = D()
-A().f  # E: Argument 1 to "__get__" of "D" has incompatible type "A"; expected "str"
-
-[case testDescriptorDunderGetWrongArgTypeForOwner]
-from typing import Any
-class D:
-    def __get__(self, inst: Any, own: str) -> Any: pass
-class A:
-    f = D()
-A().f  # E: Argument 2 to "__get__" of "D" has incompatible type Type[A]; expected "str"
-
-[case testDescriptorGetSetDifferentTypes]
-from typing import Any
-class D:
-    def __get__(self, inst: Any, own: Any) -> str: return 's'
-    def __set__(self, inst: Any, v: int) -> None: pass
-class A:
-    f = D()
-a = A()
-a.f = 1
-reveal_type(a.f)  # E: Revealed type is 'builtins.str'
-
-
--- _promote decorators
--- -------------------
-
-
-[case testSimpleDucktypeDecorator]
-from typing import _promote
-class A: pass
- at _promote(A)
-class B: pass
-a = None  # type: A
-b = None  # type: B
-b = a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = b
-
-[case testDucktypeTransitivityDecorator]
-from typing import _promote
-class A: pass
- at _promote(A)
-class B: pass
- at _promote(B)
-class C: pass
-a = None  # type: A
-c = None  # type: C
-c = a # E: Incompatible types in assignment (expression has type "A", variable has type "C")
-a = c
-
-
--- Hard coded type promotions
--- --------------------------
-
-[case testHardCodedTypePromotions]
-import typing
-def f(x: float) -> None: pass
-def g(x: complex) -> None: pass
-f(1)
-g(1)
-g(1.1)
-[builtins fixtures/complex.pyi]
-
-
--- Operator methods
--- ----------------
-
-
-[case testOperatorMethodOverrideIntroducingOverloading]
-from typing import overload
-class A:
-    def __add__(self, x: int) -> int: pass
-class B(A):
-    @overload  # E: Signature of "__add__" incompatible with supertype "A"
-    def __add__(self, x: int) -> int: pass
-    @overload
-    def __add__(self, x: str) -> str: pass
-[out]
-
-[case testOperatorMethodOverrideWideningArgumentType]
-import typing
-class A:
-    def __add__(self, x: int) -> int: pass
-class B(A):
-    def __add__(self, x: object) -> int: pass
-[out]
-
-[case testOperatorMethodOverrideNarrowingReturnType]
-import typing
-class A:
-    def __add__(self, x: int) -> 'A': pass
-class B(A):
-    def __add__(self, x: int) -> 'B': pass
-
-[case testOperatorMethodOverrideWithDynamicallyTyped]
-import typing
-class A:
-    def __add__(self, x: int) -> 'A': pass
-class B(A):
-    def __add__(self, x): pass
-
-[case testOperatorMethodOverrideWithIdenticalOverloadedType]
-from typing import overload
-class A:
-    @overload
-    def __add__(self, x: int) -> 'A': pass
-    @overload
-    def __add__(self, x: str) -> 'A': pass
-class B(A):
-    @overload
-    def __add__(self, x: int) -> 'A': pass
-    @overload
-    def __add__(self, x: str) -> 'A': pass
-
-[case testOverloadedOperatorMethodOverrideWithDynamicallyTypedMethod]
-from typing import overload, Any
-class A:
-    @overload
-    def __add__(self, x: int) -> 'A': pass
-    @overload
-    def __add__(self, x: str) -> 'A': pass
-class B(A):
-    def __add__(self, x): pass
-class C(A):
-    def __add__(self, x: Any) -> A: pass
-
-[case testOverloadedOperatorMethodOverrideWithNewItem]
-from typing import overload, Any
-class A:
-    @overload
-    def __add__(self, x: int) -> 'A': pass
-    @overload
-    def __add__(self, x: str) -> 'A': pass
-class B(A):
-    @overload
-    def __add__(self, x: int) -> A: pass
-    @overload
-    def __add__(self, x: str) -> A: pass
-    @overload
-    def __add__(self, x: type) -> A: pass
-[out]
-main:8: error: Signature of "__add__" incompatible with supertype "A"
-
-[case testOverloadedOperatorMethodOverrideWithSwitchedItemOrder]
-from typing import overload, Any
-class A:
-    @overload
-    def __add__(self, x: 'B') -> 'B': pass
-    @overload
-    def __add__(self, x: 'A') -> 'A': pass
-class B(A):
-    @overload
-    def __add__(self, x: 'A') -> 'A': pass
-    @overload
-    def __add__(self, x: 'B') -> 'B': pass
-[out]
-main:8: error: Signature of "__add__" incompatible with supertype "A"
-
-[case testReverseOperatorMethodArgumentType]
-from typing import Any
-class A: pass
-class B:
-    def __radd__(self, x: A) -> int: pass # Error
-class C:
-    def __radd__(self, x: A) -> Any: pass
-class D:
-    def __radd__(self, x: A) -> object: pass
-[out]
-
-[case testReverseOperatorMethodArgumentType2]
-from typing import Any, Tuple, Callable
-class A:
-    def __radd__(self, x: Tuple[int, str]) -> int: pass
-class B:
-    def __radd__(self, x: Callable[[], int]) -> int: pass
-class C:
-    def __radd__(self, x: Any) -> int: pass
-[out]
-
-[case testReverseOperatorMethodForwardIsAny]
-from typing import Any
-def deco(f: Any) -> Any: return f
-class C:
-    @deco
-    def __add__(self, other: C) -> C: return C()
-    def __radd__(self, other: C) -> C: return C()
-[out]
-
-[case testReverseOperatorMethodForwardIsAny2]
-from typing import Any
-def deco(f: Any) -> Any: return f
-class C:
-    __add__ = None  # type: Any
-    def __radd__(self, other: C) -> C: return C()
-[out]
-
-[case testReverseOperatorMethodForwardIsAny3]
-from typing import Any
-def deco(f: Any) -> Any: return f
-class C:
-    __add__ = 42
-    def __radd__(self, other: C) -> C: return C()
-[out]
-main:5: error: Forward operator "__add__" is not callable
-
-[case testOverloadedReverseOperatorMethodArgumentType]
-from typing import overload, Any
-class A:
-    @overload
-    def __radd__(self, x: 'A') -> str: pass # Error
-    @overload
-    def __radd__(self, x: 'A') -> Any: pass
-[out]
-
-[case testReverseOperatorMethodArgumentTypeAndOverloadedMethod]
-from typing import overload
-class A:
-    @overload
-    def __add__(self, x: int) -> int: pass
-    @overload
-    def __add__(self, x: str) -> int: pass
-    def __radd__(self, x: 'A') -> str: pass
-
-[case testAbstractReverseOperatorMethod]
-import typing
-from abc import abstractmethod
-class A:
-    @abstractmethod
-    def __lt__(self, x: 'A') -> int: pass
-class B:
-    @abstractmethod
-    def __lt__(self, x: 'B') -> int: pass
-    @abstractmethod
-    def __gt__(self, x: 'B') -> int: pass
-[out]
-
-[case testOperatorMethodsAndOverloadingSpecialCase]
-from typing import overload
-class A:
-    @overload
-    def __add__(self, x: 'A') -> int: pass
-    @overload
-    def __add__(self, x: str) -> int: pass
-class B:
-    def __radd__(self, x: 'A') -> str: pass
-[out]
-
-[case testUnsafeOverlappingWithOperatorMethodsAndOverloading2]
-from typing import overload
-class A:
-    def __add__(self, x: 'A') -> int: pass
-class B:
-    @overload
-    def __radd__(self, x: 'X') -> str: pass # Error
-    @overload
-    def __radd__(self, x: A) -> str: pass   # Error
-class X:
-    def __add__(self, x): pass
-[out]
-main:6: error: Signatures of "__radd__" of "B" and "__add__" of "X" are unsafely overlapping
-
-[case testUnsafeOverlappingWithLineNo]
-from typing import TypeVar
-T = TypeVar('T', Real)
-class Real:
-    def __add__(self, other): ...
-class Fraction(Real):
-    def __radd__(self, other: T) -> T: ...
-[out]
-main:6: error: Signatures of "__radd__" of "Fraction" and "__add__" of "Real" are unsafely overlapping
-
-[case testOverlappingNormalAndInplaceOperatorMethod]
-import typing
-class A:
-    # Incompatible (potential trouble with __radd__)
-    def __add__(self, x: 'A') -> int: pass
-    def __iadd__(self, x: 'B') -> int: pass
-class B:
-    # Safe
-    def __add__(self, x: 'C') -> int: pass
-    def __iadd__(self, x: A) -> int: pass
-class C(A): pass
-[out]
-main:5: error: Signatures of "__iadd__" and "__add__" are incompatible
-
-[case testOverloadedNormalAndInplaceOperatorMethod]
-from typing import overload
-class A:
-    @overload
-    def __add__(self, x: int) -> int: pass
-    @overload
-    def __add__(self, x: str) -> int: pass
-    @overload # Error
-    def __iadd__(self, x: int) -> int: pass
-    @overload
-    def __iadd__(self, x: object) -> int: pass
-class B:
-    @overload
-    def __add__(self, x: int) -> int: pass
-    @overload
-    def __add__(self, x: str) -> str: pass
-    @overload
-    def __iadd__(self, x: int) -> int: pass
-    @overload
-    def __iadd__(self, x: str) -> str: pass
-[out]
-main:7: error: Signatures of "__iadd__" and "__add__" are incompatible
-
-[case testIntroducingInplaceOperatorInSubclass]
-import typing
-class A:
-    def __add__(self, x: 'A') -> 'B': pass
-class B(A):
-    # __iadd__ effectively partially overrides __add__
-    def __iadd__(self, x: 'A') -> 'A': pass # Error
-class C(A):
-    def __iadd__(self, x: int) -> 'B': pass # Error
-class D(A):
-    def __iadd__(self, x: 'A') -> 'B': pass
-[out]
-main:6: error: Return type of "__iadd__" incompatible with "__add__" of supertype "A"
-main:8: error: Argument 1 of "__iadd__" incompatible with "__add__" of supertype "A"
-main:8: error: Signatures of "__iadd__" and "__add__" are incompatible
-
-
-[case testGetAttr]
-
-a, b = None, None # type: A, B
-class A:
-    def __getattr__(self, x: str) -> A:
-        return A()
-class B: pass
-
-a = a.foo
-b = a.bar
-[out]
-main:9: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-
-[case testGetAttrSignature]
-class A:
-    def __getattr__(self, x: str) -> A: pass
-class B:
-    def __getattr__(self, x: A) -> B: pass
-class C:
-    def __getattr__(self, x: str, y: str) -> C: pass
-class D:
-    def __getattr__(self, x: str) -> None: pass
-[out]
-main:4: error: Invalid signature "def (__main__.B, __main__.A) -> __main__.B"
-main:6: error: Invalid signature "def (__main__.C, builtins.str, builtins.str) -> __main__.C"
-
-
--- CallableType objects
--- ----------------
-
-
-[case testCallableObject]
-import typing
-a = A()
-b = B()
-
-a()  # E: Too few arguments for "__call__" of "A"
-a(a, a)  # E: Too many arguments for "__call__" of "A"
-a = a(a)
-a = a(b)  # E: Argument 1 to "__call__" of "A" has incompatible type "B"; expected "A"
-b = a(a)  # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-class A:
-    def __call__(self, x: A) -> A:
-        pass
-class B: pass
-
-
--- __new__
--- --------
-
-
-[case testConstructInstanceWith__new__]
-class C:
-    def __new__(cls, foo: int = None) -> 'C':
-        obj = object.__new__(cls)
-        return obj
-
-x = C(foo=12)
-x.a # E: "C" has no attribute "a"
-C(foo='') # E: Argument 1 to "C" has incompatible type "str"; expected "int"
-[builtins fixtures/__new__.pyi]
-
-[case testConstructInstanceWithDynamicallyTyped__new__]
-class C:
-    def __new__(cls, foo):
-        obj = object.__new__(cls)
-        return obj
-
-x = C(foo=12)
-x = C(foo='x')
-x.a # E: "C" has no attribute "a"
-C(bar='') # E: Unexpected keyword argument "bar" for "C"
-[builtins fixtures/__new__.pyi]
-
-[case testClassWith__new__AndCompatibilityWithType]
-class C:
-    def __new__(cls, foo: int = None) -> 'C':
-        obj = object.__new__(cls)
-        return obj
-def f(x: type) -> None: pass
-def g(x: int) -> None: pass
-f(C)
-g(C) # E: Argument 1 to "g" has incompatible type "C"; expected "int"
-[builtins fixtures/__new__.pyi]
-
-[case testClassWith__new__AndCompatibilityWithType2]
-class C:
-    def __new__(cls, foo):
-        obj = object.__new__(cls)
-        return obj
-def f(x: type) -> None: pass
-def g(x: int) -> None: pass
-f(C)
-g(C) # E: Argument 1 to "g" has incompatible type "C"; expected "int"
-[builtins fixtures/__new__.pyi]
-
-[case testGenericClassWith__new__]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class C(Generic[T]):
-    def __new__(cls, foo: T) -> 'C[T]':
-        obj = object.__new__(cls)
-        return obj
-    def set(self, x: T) -> None: pass
-c = C('')
-c.set('')
-c.set(1) # E: Argument 1 to "set" of "C" has incompatible type "int"; expected "str"
-[builtins fixtures/__new__.pyi]
-
-[case testOverloaded__new__]
-from typing import overload
-class C:
-    @overload
-    def __new__(cls, foo: int) -> 'C':
-        obj = object.__new__(cls)
-        return obj
-    @overload
-    def __new__(cls, x: str, y: str) -> 'C':
-        obj = object.__new__(cls)
-        return obj
-c = C(1)
-c.a # E: "C" has no attribute "a"
-C('', '')
-C('') # E: No overload variant of "C" matches argument types [builtins.str]
-[builtins fixtures/__new__.pyi]
-
-
--- Special cases
--- -------------
-
-
-[case testSubclassInt]
-import typing
-class A(int): pass
-n = 0
-n = A()
-a = A()
-a = 0 # E: Incompatible types in assignment (expression has type "int", variable has type "A")
-
-[case testForwardReferenceToNestedClass]
-def f(o: 'B.C') -> None:
-    o.f('') # E: Argument 1 to "f" of "C" has incompatible type "str"; expected "int"
-
-class B:
-    class C:
-        def f(self, x: int) -> None: pass
-[out]
-
-[case testForwardReferenceToNestedClassDeep]
-def f(o: 'B.C.D') -> None:
-    o.f('') # E: Argument 1 to "f" of "D" has incompatible type "str"; expected "int"
-
-class B:
-    class C:
-        class D:
-            def f(self, x: int) -> None: pass
-[out]
-
-[case testForwardReferenceToNestedClassWithinClass]
-class B:
-    def f(self, o: 'C.D') -> None:
-        o.f('') # E: Argument 1 to "f" of "D" has incompatible type "str"; expected "int"
-
-    class C:
-        class D:
-            def f(self, x: int) -> None: pass
-[out]
-
-[case testClassVsInstanceDisambiguation]
-class A: pass
-def f(x: A) -> None: pass
-f(A) # E: Argument 1 to "f" has incompatible type "A" (type object); expected "A"
-[out]
-
--- TODO
---   attribute inherited from superclass; assign in __init__
---   refer to attribute before type has been inferred (the initialization in
---   __init__ has not been analyzed)
-
-[case testAnyBaseClassUnconstrainedConstructor]
-from typing import Any
-B = None  # type: Any
-class C(B): pass
-C(0)
-C(arg=0)
-[out]
-
-[case testErrorMapToSupertype]
-import typing
-class X(Nope): pass  # E: Name 'Nope' is not defined
-a, b = X()  # Used to crash here (#2244)
-
-
--- Class-valued attributes
--- -----------------------
-
-[case testClassValuedAttributesBasics]
-class A: ...
-class B:
-    a = A
-    bad = lambda: 42
-
-B().bad() # E: Invalid method type
-reveal_type(B.a) # E: Revealed type is 'def () -> __main__.A'
-reveal_type(B().a) # E: Revealed type is 'def () -> __main__.A'
-reveal_type(B().a()) # E: Revealed type is '__main__.A'
-
-class C:
-    a = A
-    def __init__(self) -> None:
-        self.aa = self.a()
-
-reveal_type(C().aa) # E: Revealed type is '__main__.A'
-[out]
-
-[case testClassValuedAttributesGeneric]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-
-class A(Generic[T]):
-    def __init__(self, x: T) -> None:
-        self.x = x
-class B(Generic[T]):
-    a = A[T]
-
-reveal_type(B[int]().a) # E: Revealed type is 'def (x: builtins.int*) -> __main__.A[builtins.int*]'
-B[int]().a('hi') # E: Argument 1 has incompatible type "str"; expected "int"
-
-class C(Generic[T]):
-    a = A
-    def __init__(self) -> None:
-        self.aa = self.a(42)
-
-reveal_type(C().aa) # E: Revealed type is '__main__.A[builtins.int]'
-[out]
-
-[case testClassValuedAttributesAlias]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-S = TypeVar('S')
-
-class A(Generic[T, S]): ...
-
-SameA = A[T, T]
-
-class B:
-    a_any = SameA
-    a_int = SameA[int]
-
-reveal_type(B().a_any) # E: Revealed type is 'def () -> __main__.A[Any, Any]'
-reveal_type(B().a_int()) # E: Revealed type is '__main__.A[builtins.int*, builtins.int*]'
-
-class C:
-    a_int = SameA[int]
-    def __init__(self) -> None:
-        self.aa = self.a_int()
-
-reveal_type(C().aa) # E: Revealed type is '__main__.A[builtins.int*, builtins.int*]'
-[out]
-
-
--- Type[C]
--- -------
-
-
-[case testTypeUsingTypeCBasic]
-from typing import Type
-class User: pass
-class ProUser(User): pass
-def new_user(user_class: Type[User]) -> User:
-    return user_class()
-reveal_type(new_user(User))  # E: Revealed type is '__main__.User'
-reveal_type(new_user(ProUser))  # E: Revealed type is '__main__.User'
-[out]
-
-[case testTypeUsingTypeCDefaultInit]
-from typing import Type
-class B:
-    pass
-def f(A: Type[B]) -> None:
-    A(0)  # E: Too many arguments for "B"
-    A()
-[out]
-
-[case testTypeUsingTypeCInitWithArg]
-from typing import Type
-class B:
-    def __init__(self, a: int) -> None: pass
-def f(A: Type[B]) -> None:
-    A(0)
-    A()  # E: Too few arguments for "B"
-[out]
-
-[case testTypeUsingTypeCTypeVar]
-from typing import Type, TypeVar
-class User: pass
-class ProUser(User): pass
-U = TypeVar('U', bound=User)
-def new_user(user_class: Type[U]) -> U:
-    user = user_class()
-    reveal_type(user)
-    return user
-pro_user = new_user(ProUser)
-reveal_type(pro_user)
-[out]
-main:7: error: Revealed type is 'U`-1'
-main:10: error: Revealed type is '__main__.ProUser*'
-
-[case testTypeUsingTypeCTypeVarDefaultInit]
-from typing import Type, TypeVar
-class B:
-    pass
-T = TypeVar('T', bound=B)
-def f(A: Type[T]) -> None:
-    A()
-    A(0)  # E: Too many arguments for "B"
-[out]
-
-[case testTypeUsingTypeCTypeVarWithInit]
-from typing import Type, TypeVar
-class B:
-    def __init__(self, a: int) -> None: pass
-T = TypeVar('T', bound=B)
-def f(A: Type[T]) -> None:
-    A()  # E: Too few arguments for "B"
-    A(0)
-[out]
-
-[case testTypeUsingTypeCTwoTypeVars]
-from typing import Type, TypeVar
-class User: pass
-class ProUser(User): pass
-class WizUser(ProUser): pass
-U = TypeVar('U', bound=User)
-def new_user(u_c: Type[U]) -> U: pass
-P = TypeVar('P', bound=ProUser)
-def new_pro(pro_c: Type[P]) -> P:
-    return new_user(pro_c)
-wiz = new_pro(WizUser)
-reveal_type(wiz)
-def error(u_c: Type[U]) -> P:
-    return new_pro(u_c)  # Error here, see below
-[out]
-main:11: error: Revealed type is '__main__.WizUser*'
-main:13: error: Incompatible return value type (got "U", expected "P")
-main:13: error: Type argument 1 of "new_pro" has incompatible value "U"
-
-[case testTypeUsingTypeCCovariance]
-from typing import Type, TypeVar
-class User: pass
-class ProUser(User): pass
-def new_user(user_class: Type[User]) -> User:
-    return user_class()
-def new_pro_user(user_class: Type[ProUser]):
-    new_user(user_class)
-[out]
-
-[case testTypeUsingTypeCErrorCovariance]
-from typing import Type, TypeVar
-class User: pass
-def new_user(user_class: Type[User]):
-    return user_class()
-def foo(arg: Type[int]):
-    new_user(arg)  # E: Argument 1 to "new_user" has incompatible type Type[int]; expected Type[User]
-[out]
-
-[case testTypeUsingTypeCUnionOverload]
-from typing import Type, Union, overload
-class X:
-    @overload
-    def __init__(self) -> None: pass
-    @overload
-    def __init__(self, a: int) -> None: pass
-class Y:
-    def __init__(self) -> None: pass
-def bar(o: Type[Union[X, Y]]): pass
-bar(X)
-bar(Y)
-[out]
-
-[case testTypeUsingTypeCTypeAny]
-from typing import Type, Any
-def foo(arg: Type[Any]):
-    x = arg()
-    x = arg(0)
-    x = arg('', ())
-    reveal_type(x)  # E: Revealed type is 'Any'
-    x.foo
-class X: pass
-foo(X)
-[out]
-
-[case testTypeUsingTypeCTypeNoArg]
-from typing import Type
-def foo(arg: Type):
-    x = arg()
-    reveal_type(x)  # E: Revealed type is 'Any'
-class X: pass
-foo(X)
-[out]
-
-[case testTypeUsingTypeCBuiltinType]
-from typing import Type
-def foo(arg: type): pass
-class X: pass
-def bar(arg: Type[X]):
-    foo(arg)
-foo(X)
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTypeUsingTypeCClassMethod]
-from typing import Type
-class User:
-    @classmethod
-    def foo(cls) -> int: pass
-    def bar(self) -> int: pass
-def process(cls: Type[User]):
-    reveal_type(cls.foo())  # E: Revealed type is 'builtins.int'
-    obj = cls()
-    reveal_type(cls.bar(obj))  # E: Revealed type is 'builtins.int'
-    cls.mro()  # Defined in class type
-    cls.error  # E: Type[User] has no attribute "error"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeUsingTypeCClassMethodUnion]
-# Ideally this would work, but not worth the effort; just don't crash
-from typing import Type, Union
-class User:
-    @classmethod
-    def foo(cls) -> int: pass
-    def bar(self) -> int: pass
-class ProUser(User): pass
-class BasicUser(User): pass
-def process(cls: Type[Union[BasicUser, ProUser]]):
-    cls.foo()  # E: Type[Union[BasicUser, ProUser]] has no attribute "foo"
-    obj = cls()
-    cls.bar(obj)  # E: Type[Union[BasicUser, ProUser]] has no attribute "bar"
-    cls.mro()  # Defined in class type
-    cls.error  # E: Type[Union[BasicUser, ProUser]] has no attribute "error"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeUsingTypeCClassMethodFromTypeVar]
-from typing import Type, TypeVar
-class User:
-    @classmethod
-    def foo(cls) -> int: pass
-    def bar(self) -> int: pass
-U = TypeVar('U', bound=User)
-def process(cls: Type[U]):
-    reveal_type(cls.foo())  # E: Revealed type is 'builtins.int'
-    obj = cls()
-    reveal_type(cls.bar(obj))  # E: Revealed type is 'builtins.int'
-    cls.mro()  # Defined in class type
-    cls.error  # E: Type[U] has no attribute "error"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeUsingTypeCClassMethodFromTypeVarUnionBound]
-# Ideally this would work, but not worth the effort; just don't crash
-from typing import Type, TypeVar, Union
-class User:
-    @classmethod
-    def foo(cls) -> int: pass
-    def bar(self) -> int: pass
-class ProUser(User): pass
-class BasicUser(User): pass
-U = TypeVar('U', bound=Union[ProUser, BasicUser])
-def process(cls: Type[U]):
-    cls.foo()  # E: Type[U] has no attribute "foo"
-    obj = cls()
-    cls.bar(obj)  # E: Type[U] has no attribute "bar"
-    cls.mro()  # Defined in class type
-    cls.error  # E: Type[U] has no attribute "error"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeUsingTypeCErrorUnsupportedType]
-from typing import Type, Tuple
-def foo(arg: Type[Tuple[int]]):  # E: Unsupported type Type["Tuple[int]"]
-    arg()
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTypeUsingTypeCOverloadedClass]
-from typing import Type, TypeVar, overload
-class User:
-    @overload
-    def __init__(self) -> None: pass
-    @overload
-    def __init__(self, arg: int) -> None: pass
-    @classmethod
-    def foo(cls) -> None: pass
-U = TypeVar('U', bound=User)
-def new(uc: Type[U]) -> U:
-    uc.foo()
-    u = uc()
-    u.foo()
-    u = uc(0)
-    u.foo()
-    u = uc('')
-    u.foo(0)
-    return uc()
-u = new(User)
-[builtins fixtures/classmethod.pyi]
-[out]
-main:16: error: No overload variant of "User" matches argument types [builtins.str]
-main:17: error: Too many arguments for "foo" of "User"
-
-[case testTypeUsingTypeCInUpperBound]
-from typing import TypeVar, Type
-class B: pass
-T = TypeVar('T', bound=Type[B])
-def f(a: T): pass
-[out]
-
-[case testTypeUsingTypeCTuple]
-from typing import Type, Tuple
-def f(a: Type[Tuple[int, int]]):
-    a()
-[out]
-main:2: error: Unsupported type Type["Tuple[int, int]"]
-
-[case testTypeUsingTypeCNamedTuple]
-from typing import Type, NamedTuple
-N = NamedTuple('N', [('x', int), ('y', int)])
-def f(a: Type[N]):
-    a()
-[builtins fixtures/list.pyi]
-[out]
-main:3: error: Unsupported type Type["N"]
-
-[case testTypeUsingTypeCJoin]
-from typing import Type
-class B: pass
-class C(B): pass
-class D(B): pass
-def foo(c: Type[C], d: Type[D]) -> None:
-    x = [c, d]
-    reveal_type(x)
-
-[builtins fixtures/list.pyi]
-[out]
-main:7: error: Revealed type is 'builtins.list[Type[__main__.B]]'
-
-[case testTypeMatchesOverloadedFunctions]
-from typing import Type, overload, Union
-
-class User: pass
-UserType = User  # type: Type[User]
-
- at overload
-def f(a: object) -> int: pass
- at overload
-def f(a: int) -> str: pass
-
-reveal_type(f(User))  # E: Revealed type is 'builtins.int'
-reveal_type(f(UserType))  # E: Revealed type is 'builtins.int'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeMatchesGeneralTypeInOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-UserType = User  # type: Type[User]
-
- at overload
-def f(a: type) -> int:
-    return 1
- at overload
-def f(a: int) -> str:
-    return "a"
-
-reveal_type(f(User))  # E: Revealed type is 'builtins.int'
-reveal_type(f(UserType))  # E: Revealed type is 'builtins.int'
-reveal_type(f(1))  # E: Revealed type is 'builtins.str'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeMatchesSpecificTypeInOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-UserType = User  # type: Type[User]
-
- at overload
-def f(a: User) -> User:
-    return User()
- at overload
-def f(a: Type[User]) -> int:
-    return 1
- at overload
-def f(a: int) -> str:
-    return "a"
-
-reveal_type(f(User))  # E: Revealed type is 'builtins.int'
-reveal_type(f(UserType))  # E: Revealed type is 'builtins.int'
-reveal_type(f(User()))  # E: Revealed type is '__main__.User'
-reveal_type(f(1))  # E: Revealed type is 'builtins.str'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testMixingTypeTypeInOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: User) -> Type[User]:
-    return User
- at overload
-def f(a: Type[User]) -> User:
-    return a()
- at overload
-def f(a: int) -> Type[User]:
-    return User
- at overload
-def f(a: str) -> User:
-    return User()
-
-reveal_type(f(User()))  # E: Revealed type is 'Type[__main__.User]'
-reveal_type(f(User))  # E: Revealed type is '__main__.User'
-reveal_type(f(3))  # E: Revealed type is 'Type[__main__.User]'
-reveal_type(f("hi"))  # E: Revealed type is '__main__.User'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testGeneralTypeDoesNotMatchSpecificTypeInOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: Type[User]) -> None: pass
- at overload
-def f(a: int) -> None: pass
-
-def mock() -> type: return User
-
-f(User)
-f(mock())  # E: No overload variant of "f" matches argument types [builtins.type]
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testNonTypeDoesNotMatchOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: Type[User]) -> None: pass
- at overload
-def f(a: type) -> None: pass
-
-f(3)  # E: No overload variant of "f" matches argument types [builtins.int]
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testInstancesDoNotMatchTypeInOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: Type[User]) -> None: pass
- at overload
-def f(a: int) -> None: pass
-
-f(User)
-f(User())  # E: No overload variant of "f" matches argument types [__main__.User]
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeCovarianceWithOverloadedFunctions]
-from typing import Type, overload
-
-class A: pass
-class B(A): pass
-class C(B): pass
-AType = A  # type: Type[A]
-BType = B  # type: Type[B]
-CType = C  # type: Type[C]
-
- at overload
-def f(a: Type[B]) -> None: pass
- at overload
-def f(a: int) -> None: pass
-
-f(A)  # E: No overload variant of "f" matches argument types [def () -> __main__.A]
-f(B)
-f(C)
-f(AType)  # E: No overload variant of "f" matches argument types [Type[__main__.A]]
-f(BType)
-f(CType)
-[builtins fixtures/classmethod.pyi]
-[out]
-
-
-[case testOverloadedCovariantTypesFail]
-from typing import Type, overload
-
-class A: pass
-class B(A): pass
-
- at overload
-def f(a: Type[A]) -> int: pass  # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(a: Type[B]) -> str: pass
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testDistinctOverloadedCovariantTypesSucceed]
-from typing import Type, overload
-
-class A: pass
-class AChild(A): pass
-class B: pass
-class BChild(B): pass
-
- at overload
-def f(a: Type[A]) -> int: pass
- at overload
-def f(a: Type[B]) -> str: pass
- at overload
-def f(a: A) -> A: pass
- at overload
-def f(a: B) -> B: pass
-
-reveal_type(f(A))  # E: Revealed type is 'builtins.int'
-reveal_type(f(AChild))  # E: Revealed type is 'builtins.int'
-reveal_type(f(B))  # E: Revealed type is 'builtins.str'
-reveal_type(f(BChild))  # E: Revealed type is 'builtins.str'
-
-reveal_type(f(A()))  # E: Revealed type is '__main__.A'
-reveal_type(f(AChild()))  # E: Revealed type is '__main__.A'
-reveal_type(f(B()))  # E: Revealed type is '__main__.B'
-reveal_type(f(BChild()))  # E: Revealed type is '__main__.B'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeTypeOverlapsWithObjectAndType]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: Type[User]) -> int: pass  # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(a: object) -> str: pass
-
- at overload
-def g(a: Type[User]) -> int: pass  # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def g(a: type) -> str: pass
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeOverlapsWithObject]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: type) -> int: pass  # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(a: object) -> str: pass
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeConstructorReturnsTypeType]
-class User:
-    @classmethod
-    def test_class_method(cls) -> int: pass
-    @staticmethod
-    def test_static_method() -> str: pass
-    def test_instance_method(self) -> None: pass
-
-u = User()
-
-reveal_type(type(u))  # E: Revealed type is 'Type[__main__.User]'
-reveal_type(type(u).test_class_method())  # E: Revealed type is 'builtins.int'
-reveal_type(type(u).test_static_method())  # E: Revealed type is 'builtins.str'
-type(u).test_instance_method()  # E: Too few arguments for "test_instance_method" of "User"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testObfuscatedTypeConstructorReturnsTypeType]
-from typing import TypeVar
-class User: pass
-
-f1 = type
-
-A = TypeVar('A')
-def f2(func: A) -> A:
-    return func
-
-u = User()
-
-reveal_type(f1(u))  # E: Revealed type is 'Type[__main__.User]'
-reveal_type(f2(type)(u))  # E: Revealed type is 'Type[__main__.User]'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeConstructorLookalikeFails]
-class User: pass
-
-def fake1(a: object) -> type:
-    return User
-def fake2(a: int) -> type:
-    return User
-
-reveal_type(type(User()))  # E: Revealed type is 'Type[__main__.User]'
-reveal_type(fake1(User()))  # E: Revealed type is 'builtins.type'
-reveal_type(fake2(3))  # E: Revealed type is 'builtins.type'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testOtherTypeConstructorsSucceed]
-def foo(self) -> int: return self.attr
-
-User = type('User', (object,), {'foo': foo, 'attr': 3})
-reveal_type(User)  # E: Revealed type is 'builtins.type'
-[builtins fixtures/args.pyi]
-[out]
-
-[case testTypeTypeComparisonWorks]
-class User: pass
-
-User == User
-User == type(User())
-type(User()) == User
-type(User()) == type(User())
-
-User != User
-User != type(User())
-type(User()) != User
-type(User()) != type(User())
-
-int == int
-int == type(3)
-type(3) == int
-type(3) == type(3)
-
-int != int
-int != type(3)
-type(3) != int
-type(3) != type(3)
-
-User is User
-User is type(User)
-type(User) is User
-type(User) is type(User)
-
-int is int
-int is type(3)
-type(3) is int
-type(3) is type(3)
-
-int.__eq__(int)
-int.__eq__(3, 4)
-[builtins fixtures/args.pyi]
-[out]
-main:33: error: Too few arguments for "__eq__" of "int"
-main:33: error: Unsupported operand types for == ("int" and "int")
-
-[case testMroSetAfterError]
-class C(str, str):
-    foo = 0
-    bar = foo
-[out]
-main:1: error: Duplicate base class "str"
-
-[case testCannotDetermineMro]
-class A: pass
-class B(A): pass
-class C(B): pass
-class D(A, B): pass # E: Cannot determine consistent method resolution order (MRO) for "D"
-class E(C, D): pass # E: Cannot determine consistent method resolution order (MRO) for "E"
-
-[case testInconsistentMroLocalRef]
-class A: pass
-class B(object, A): # E: Cannot determine consistent method resolution order (MRO) for "B"
-    def readlines(self): pass
-    __iter__ = readlines
-
-[case testDynamicMetaclass]
-# flags: --fast-parser
-class C(metaclass=int()):  # E: Dynamic metaclass not supported for 'C'
-    pass
diff --git a/test-data/unit/check-columns.test b/test-data/unit/check-columns.test
deleted file mode 100644
index ae8bab8..0000000
--- a/test-data/unit/check-columns.test
+++ /dev/null
@@ -1,68 +0,0 @@
-[case testColumnsSyntaxError]
-# flags: --show-column-numbers
-1 +
-[out]
-main:2:3: error: Parse error before end of line
-
-
-[case testColumnsNestedFunctions]
-# flags: --show-column-numbers
-import typing
-def f() -> 'A':
-    def g() -> 'B':
-        return A() # fail
-    return B() # fail
-class A: pass
-class B: pass
-[out]
-main:5:8: error: Incompatible return value type (got "A", expected "B")
-main:6:4: error: Incompatible return value type (got "B", expected "A")
-
-[case testColumnsNestedFunctionsWithFastParse]
-# flags: --show-column-numbers --fast-parser
-import typing
-def f() -> 'A':
-    def g() -> 'B':
-        return A() # fail
-    return B() # fail
-class A: pass
-class B: pass
-[out]
-main:5:8: error: Incompatible return value type (got "A", expected "B")
-main:6:4: error: Incompatible return value type (got "B", expected "A")
-
-
-[case testColumnsMethodDefaultArgumentsAndSignatureAsComment]
-# flags: --show-column-numbers
-import typing
-class A:
-    def f(self, x = 1, y = 'hello'): # type: (int, str) -> str
-        pass
-A().f()
-A().f(1)
-A().f('') # E:5: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-A().f(1, 1) # E:5: Argument 2 to "f" of "A" has incompatible type "int"; expected "str"
-A().f(1, 'hello', 'hi') # E:5: Too many arguments for "f" of "A"
-
-[case testColumnsMultipleStatementsPerLine]
-# flags: --show-column-numbers
-x = 1
-y = 'hello'
-x = 2; y = x; y += 1
-[out]
-main:4:7: error: Incompatible types in assignment (expression has type "int", variable has type "str")
-main:4:14: error: Unsupported operand types for + ("str" and "int")
-
-[case testColumnsSimpleIsinstance]
-# flags: --show-column-numbers
-import typing
-def f(x: object, n: int, s: str) -> None:
-    n = x # E:4: Incompatible types in assignment (expression has type "object", variable has type "int")
-    if isinstance(x, int):
-        n = x
-        s = x # E:8: Incompatible types in assignment (expression has type "int", variable has type "str")
-    n = x # E:4: Incompatible types in assignment (expression has type "object", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-
diff --git a/test-data/unit/check-dynamic-typing.test b/test-data/unit/check-dynamic-typing.test
deleted file mode 100644
index 997a996..0000000
--- a/test-data/unit/check-dynamic-typing.test
+++ /dev/null
@@ -1,676 +0,0 @@
--- Assignment
--- ----------
-
-
-[case testAssignmentWithDynamic]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-
-a = d # Everything ok
-d = a
-d = d
-d.x = a
-d.x = d
-
-class A: pass
-
-[case testMultipleAssignmentWithDynamic]
-from typing import Any
-d = None # type: Any
-a, b = None, None # type: (A, B)
-
-d, a = b, b    # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-d, d = d, d, d # E: Too many values to unpack (2 expected, 3 provided)
-
-a, b = d, d
-d, d = a, b
-a, b = d
-s, t = d
-
-class A: pass
-class B: pass
-
-
--- Expressions
--- -----------
-
-
-[case testCallingFunctionWithDynamicArgumentTypes]
-from typing import Any
-a, b = None, None # type: (A, B)
-
-b = f(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a = f(a)
-a = f(b)
-a = f(None)
-a = f(f)
-
-def f(x: Any) -> 'A':
-    pass
-
-class A: pass
-class B: pass
-
-[case testCallingWithDynamicReturnType]
-from typing import Any
-a, b = None, None # type: (A, B)
-
-a = f(b) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-
-a = f(a)
-b = f(a)
-
-def f(x: 'A') -> Any:
-    pass
-
-class A: pass
-class B: pass
-
-[case testBinaryOperationsWithDynamicLeftOperand]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-c = None # type: C
-b = None # type: bool
-n = 0
-
-d in a  # E: Unsupported right operand type for in ("A")
-d and a
-d or a
-c = d and b # Unintuitive type inference?
-c = d or b  # Unintuitive type inference?
-
-c = d + a
-c = d - a
-c = d * a
-c = d / a
-c = d // a
-c = d % a
-c = d ** a
-b = d == a
-b = d != a
-b = d < a
-b = d <= a
-b = d > a
-b = d >= a
-b = d in c
-b = d and b
-b = d or b
-
-class A: pass
-class C:
-    def __contains__(self, a: A) -> bool:
-        pass
-[file builtins.py]
-class object:
-  def __init__(self): pass
-class bool: pass
-class int: pass
-class type: pass
-class function: pass
-class str: pass
-
-[case testBinaryOperationsWithDynamicAsRightOperand]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-c = None # type: C
-b = None # type: bool
-n = 0
-
-a and d
-a or d
-c = a in d
-c = b and d # Unintuitive type inference?
-c = b or d  # Unintuitive type inference?
-b = a + d
-b = a / d
-
-c = a + d
-c = a - d
-c = a * d
-c = a / d
-c = a // d
-c = a % d
-c = a ** d
-b = a in d
-b = b and d
-b = b or d
-
-class A:
-    def __add__(self, a: 'A') -> 'C':
-        pass
-    def __sub__(self, a: 'A') -> 'C':
-        pass
-    def __mul__(self, a: 'A') -> 'C':
-        pass
-    def __truediv__(self, a: 'A') -> 'C':
-        pass
-    def __floordiv__(self, a: 'A') -> 'C':
-        pass
-    def __mod__(self, a: 'A') -> 'C':
-        pass
-    def __pow__(self, a: 'A') -> 'C':
-        pass
-    def _lt(self, a: 'A') -> bool:
-        pass
-    def _gt(self, a: 'A') -> bool:
-        pass
-
-class C: pass
-[file builtins.py]
-class object:
-  def __init__(self): pass
-class bool: pass
-class int: pass
-class type: pass
-class function: pass
-class str: pass
-
-[case testDynamicWithUnaryExpressions]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-b = None # type: bool
-a = not d # E: Incompatible types in assignment (expression has type "bool", variable has type "A")
-b = not d
-a = -d
-class A: pass
-[builtins fixtures/bool.pyi]
-[out]
-
-[case testDynamicWithMemberAccess]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-
-a = d.foo(a()) # E: "A" not callable
-
-a = d.x
-a = d.foo(a, a)
-d.x = a
-d.x.y.z  # E: "A" has no attribute "y"
-
-class A: pass
-[out]
-
-[case testIndexingWithDynamic]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-
-a = d[a()] # E: "A" not callable
-d[a()] = a # E: "A" not callable
-
-a = d[a]
-d[a] = a
-d[a], d[a] = a, a
-
-class A: pass
-
-[case testTupleExpressionsWithDynamci]
-from typing import Tuple, Any
-t2 = None # type: Tuple[A, A]
-d = None # type: Any
-
-t2 = (d, d, d)  # E: Incompatible types in assignment (expression has type "Tuple[Any, Any, Any]", variable has type "Tuple[A, A]")
-t2 = (d, d)
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-[case testCastsWithDynamicType]
-from typing import Any, cast
-class A: pass
-class B: pass
-d = None # type: Any
-a = None # type: A
-b = None # type: B
-b = cast(A, d) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = cast(A, d)
-b = Any(d)
-a = Any(f())
-def f() -> None: pass
-
-[case testCompatibilityOfDynamicWithOtherTypes]
-from typing import Any, Tuple
-d = None # type: Any
-t = None # type: Tuple[A, A]
-# TODO: callable types, overloaded functions
-
-d = None # All ok
-d = t
-d = g
-d = A
-t = d
-f = d
-
-def g(a: 'A') -> None:
-    pass
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-
--- Statements
--- ----------
-
-
-[case testDynamicCondition]
-from typing import Any
-d = None # type: Any
-while d:
-    pass
-if d:
-    pass
-elif d:
-    pass
-[builtins fixtures/bool.pyi]
-
-[case testRaiseWithDynamic]
-from typing import Any
-d = None # type: Any
-raise d
-[builtins fixtures/exception.pyi]
-
-[case testReturnWithDynamic]
-from typing import Any
-d = None # type: Any
-
-def f() -> None:
-    return d # Ok
-
-def g() -> 'A':
-    return d # Ok
-
-class A: pass
-
-
--- Implicit dynamic types for functions
--- ------------------------------------
-
-
-[case testImplicitGlobalFunctionSignature]
-from typing import Any, Callable
-x = None # type: Any
-a = None # type: A
-g = None # type: Callable[[], None]
-h = None # type: Callable[[A], None]
-
-f()     # E: Too few arguments for "f"
-f(x, x) # E: Too many arguments for "f"
-g = f   # E: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type Callable[[], None])
-f(a)
-f(x)
-a = f(a)
-h = f
-
-def f(x): pass
-
-class A: pass
-
-[case testImplicitGlobalFunctionSignatureWithDifferentArgCounts]
-from typing import Callable
-g0 = None # type: Callable[[], None]
-g1 = None # type: Callable[[A], None]
-g2 = None # type: Callable[[A, A], None]
-a = None # type: A
-
-g1 = f0 # E: Incompatible types in assignment (expression has type Callable[[], Any], variable has type Callable[[A], None])
-g2 = f0 # E: Incompatible types in assignment (expression has type Callable[[], Any], variable has type Callable[[A, A], None])
-g0 = f2 # E: Incompatible types in assignment (expression has type Callable[[Any, Any], Any], variable has type Callable[[], None])
-g1 = f2 # E: Incompatible types in assignment (expression has type Callable[[Any, Any], Any], variable has type Callable[[A], None])
-
-g0 = g0
-g2 = f2
-f0()
-f2(a, a)
-
-def f0(): pass
-
-def f2(x, y): pass
-
-class A: pass
-
-[case testImplicitGlobalFunctionSignatureWithDefaultArgs]
-from typing import Callable
-a, b = None, None # type: (A, B)
-
-g0 = None # type: Callable[[], None]
-g1 = None # type: Callable[[A], None]
-g2 = None # type: Callable[[A, A], None]
-g3 = None # type: Callable[[A, A, A], None]
-g4 = None # type: Callable[[A, A, A, A], None]
-
-f01(a, a)       # Fail
-f13()           # Fail
-f13(a, a, a, a) # Fail
-g2 = f01 # Fail
-g0 = f13 # Fail
-g4 = f13 # Fail
-
-f01()
-f01(a)
-f13(a)
-f13(a, a)
-f13(a, a, a)
-
-g0 = f01
-g1 = f01
-g1 = f13
-g2 = f13
-g3 = f13
-
-def f01(x = b): pass
-def f13(x, y = b, z = b): pass
-
-class A: pass
-class B: pass
-[out]
-main:10: error: Too many arguments for "f01"
-main:11: error: Too few arguments for "f13"
-main:12: error: Too many arguments for "f13"
-main:13: error: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type Callable[[A, A], None])
-main:14: error: Incompatible types in assignment (expression has type Callable[[Any, Any, Any], Any], variable has type Callable[[], None])
-main:15: error: Incompatible types in assignment (expression has type Callable[[Any, Any, Any], Any], variable has type Callable[[A, A, A, A], None])
-
-[case testSkipTypeCheckingWithImplicitSignature]
-
-a = None # type: A
-def f():
-    a()
-def g(x):
-    a()
-    a.x
-    a + a
-    if a():
-        a()
-class A: pass
-[builtins fixtures/bool.pyi]
-
-[case testSkipTypeCheckingWithImplicitSignatureAndDefaultArgs]
-
-a = None # type: A
-def f(x=a()):
-    a()
-def g(x, y=a, z=a()):
-    a()
-class A: pass
-
-[case testImplicitMethodSignature]
-from typing import Callable
-g0 = None # type: Callable[[], None]
-g1 = None # type: Callable[[A], None]
-g2 = None # type: Callable[[A, A], None]
-a = None # type: A
-
-g0 = a.f # E: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type Callable[[], None])
-g2 = a.f # E: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type Callable[[A, A], None])
-a = a.f  # E: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type "A")
-
-class A:
-    def g(self) -> None:
-        a = self.f(a)
-    def f(self, x): pass
-
-g1 = a.f
-a = a.f(a)
-
-[case testSkipTypeCheckingImplicitMethod]
-
-a = None # type: A
-class A:
-    def f(self):
-        a()
-    def g(self, x, y=a()):
-        a()
-
-[case testImplicitInheritedMethod]
-from typing import Callable
-g0 = None # type: Callable[[], None]
-g1 = None # type: Callable[[A], None]
-a = None # type: A
-
-g0 = a.f # E: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type Callable[[], None])
-
-g1 = a.f
-a = a.f(a)
-
-class B:
-    def f(self, x):
-        pass
-class A(B):
-    def g(self) -> None:
-        a = self.f(a)
-
-[case testEmptyReturnWithImplicitSignature]
-import typing
-def f():
-    return
-class A:
-    def g(self):
-        return
-
-[case testVarArgsWithImplicitSignature]
-from typing import Any
-o = None # type: Any
-def f(x, *a): pass
-f() # E: Too few arguments for "f"
-f(o)
-f(o, o)
-f(o, o, o)
-[builtins fixtures/list.pyi]
-
-
--- Implicit types for constructors
--- -------------------------------
-
-
-[case testInitMethodWithImplicitSignature]
-from typing import Callable
-f1 = None # type: Callable[[A], A]
-f2 = None # type: Callable[[A, A], A]
-a = None # type: A
-
-A(a)   # Fail
-f1 = A # Fail
-
-A(a, a)
-f2 = A
-
-class A:
-  def __init__(self, a, b): pass
-[out]
-main:6: error: Too few arguments for "A"
-main:7: error: Incompatible types in assignment (expression has type "A", variable has type Callable[[A], A])
-
-[case testUsingImplicitTypeObjectWithIs]
-
-t = None # type: type
-t = A
-t = B
-
-class A: pass
-class B:
-    def __init__(self): pass
-
-
--- Type compatibility
--- ------------------
-
-
-[case testTupleTypeCompatibility]
-from typing import Any, Tuple
-t1 = None # type: Tuple[Any, A]
-t2 = None # type: Tuple[A, Any]
-t3 = None # type: Tuple[Any, Any]
-t4 = None # type: Tuple[A, A]
-t5 = None # type: Tuple[Any, Any, Any]
-
-t3 = t5 # E: Incompatible types in assignment (expression has type "Tuple[Any, Any, Any]", variable has type "Tuple[Any, Any]")
-t5 = t4 # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[Any, Any, Any]")
-
-t1 = t1
-t1 = t2
-t1 = t3
-t1 = t4
-t2 = t1
-t2 = t3
-t2 = t4
-t3 = t1
-t3 = t2
-t3 = t4
-t4 = t1
-t4 = t2
-t4 = t3
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-[case testFunctionTypeCompatibilityAndReturnTypes]
-from typing import Any, Callable
-f1 = None # type: Callable[[], Any]
-f11 = None # type: Callable[[], Any]
-f2 = None # type: Callable[[], A]
-f3 = None # type: Callable[[], None]
-
-f2 = f3 # E: Incompatible types in assignment (expression has type Callable[[], None], variable has type Callable[[], A])
-
-f1 = f2
-f1 = f3
-f2 = f11
-f3 = f11
-
-class A: pass
-
-[case testFunctionTypeCompatibilityAndArgumentTypes]
-from typing import Any, Callable
-f1 = None # type: Callable[[A, Any], None]
-f2 = None # type: Callable[[Any, A], None]
-f3 = None # type: Callable[[A, A], None]
-
-f1 = f1
-f1 = f2
-f1 = f3
-
-f2 = f1
-f2 = f2
-f2 = f3
-
-f3 = f1
-f3 = f2
-f3 = f3
-
-class A: pass
-
-[case testFunctionTypeCompatibilityAndArgumentCounts]
-from typing import Any, Callable
-f1 = None # type: Callable[[Any], None]
-f2 = None # type: Callable[[Any, Any], None]
-
-f1 = f2 # E: Incompatible types in assignment (expression has type Callable[[Any, Any], None], variable has type Callable[[Any], None])
-
-
--- Overriding
--- ----------
-
-
-[case testOverridingMethodWithDynamicTypes]
-from typing import Any
-a, b = None, None # type: (A, B)
-
-b.f(b) # E: Argument 1 to "f" of "B" has incompatible type "B"; expected "A"
-a = a.f(b)
-
-class B:
-    def f(self, x: 'A') -> 'B':
-        pass
-    def g(self, x: 'B') -> None:
-        pass
-class A(B):
-    def f(self, x: Any) -> Any:
-        pass
-    def g(self, x: Any) -> None:
-        pass
-
-[case testOverridingMethodWithImplicitDynamicTypes]
-
-a, b = None, None # type: (A, B)
-
-b.f(b) # E: Argument 1 to "f" of "B" has incompatible type "B"; expected "A"
-a = a.f(b)
-
-class B:
-    def f(self, x: 'A') -> 'B':
-        pass
-    def g(self, x: 'B') -> None:
-        pass
-class A(B):
-    def f(self, x):
-        pass
-    def g(self, x):
-        pass
-
-[case testOverridingMethodAcrossHierarchy]
-import typing
-class C:
-    def f(self, a: 'A') -> None: pass
-class B(C):
-    def f(self, a): pass
-class A(B):
-    def f(self, a: 'D') -> None: # E: Argument 1 of "f" incompatible with supertype "C"
-        pass
-class D: pass
-[out]
-
-[case testInvalidOverrideArgumentCountWithImplicitSignature1]
-import typing
-class B:
-    def f(self, x: A) -> None: pass
-class A(B):
-    def f(self, x, y): # dynamic function not type checked
-        x()
-[out]
-
-[case testInvalidOverrideArgumentCountWithImplicitSignature2]
-import typing
-class B:
-    def f(self, x, y): pass
-class A(B):
-    def f(self, x: 'A') -> None: # E: Signature of "f" incompatible with supertype "B"
-        pass
-[out]
-
-[case testInvalidOverrideArgumentCountWithImplicitSignature3]
-import typing
-class B:
-    def f(self, x: A) -> None: pass
-class A(B):
-    def f(self, x, y) -> None: # E: Signature of "f" incompatible with supertype "B"
-        x()
-[out]
-
-
--- Don't complain about too few/many arguments in dynamic functions
--- ----------------------------------------------------------------
-
-[case testTooManyArgsInDynamic]
-def f() -> None: pass
-def g():
-    f(1) # Silent
-[out]
-
-[case testTooFewArgsInDynamic]
-def f(a: int) -> None: pass
-def g():
-    f() # Silent
-[out]
-
-[case testJustRightInDynamic]
-def f(a: int) -> None: pass
-def g():
-    f('') # Silent
-[out]
diff --git a/test-data/unit/check-expressions.test b/test-data/unit/check-expressions.test
deleted file mode 100644
index 8b103f6..0000000
--- a/test-data/unit/check-expressions.test
+++ /dev/null
@@ -1,1652 +0,0 @@
--- Test cases for simple expressions.
---
--- See also:
---  * check-functions.test contains test cases for calls.
---  * check-varargs.test contains test cases for *args.
---  * check-dynamic.test contains test cases related to 'Any' type.
---  * check-generics.test contains test cases for generic values.
-
-
--- None expression
--- ---------------
-
-
-[case testNoneAsRvalue]
-import typing
-a = None # type: A
-class A: pass
-[out]
-
-[case testNoneAsArgument]
-import typing
-def f(x: 'A', y: 'B') -> None: pass
-f(None, None)
-class A: pass
-class B(A): pass
-[out]
-
-
--- Simple expressions
--- ------------------
-
-
-[case testIntLiteral]
-a = 0
-b = None # type: A
-b = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "A")
-a = 1
-class A:
-    pass
-
-[case testStrLiteral]
-a = ''
-b = None # type: A
-b = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-a = 'x'
-a = r"x"
-a = """foo"""
-class A:
-    pass
-
-[case testFloatLiteral]
-a = 0.0
-b = None # type: A
-b = 1.1 # E: Incompatible types in assignment (expression has type "float", variable has type "A")
-a = 1.1
-class A:
-    pass
-[file builtins.py]
-class object:
-    def __init__(self): pass
-class type: pass
-class function: pass
-class float: pass
-class str: pass
-
-[case testComplexLiteral]
-a = 0.0j
-b = None # type: A
-b = 1.1j # E: Incompatible types in assignment (expression has type "complex", variable has type "A")
-a = 1.1j
-class A:
-    pass
-[file builtins.py]
-class object:
-    def __init__(self): pass
-class type: pass
-class function: pass
-class complex: pass
-class str: pass
-
-[case testBytesLiteral]
-b, a = None, None # type: (bytes, A)
-b = b'foo'
-b = br"foo"
-b = b'''foo'''
-a = b'foo' # E: Incompatible types in assignment (expression has type "bytes", variable has type "A")
-class A: pass
-[file builtins.py]
-class object:
-    def __init__(self): pass
-class type: pass
-class tuple: pass
-class function: pass
-class bytes: pass
-class str: pass
-
-[case testUnicodeLiteralInPython3]
-s = None  # type: str
-s = u'foo'
-b = None  # type: bytes
-b = u'foo' # E: Incompatible types in assignment (expression has type "str", variable has type "bytes")
-[builtins fixtures/primitives.pyi]
-
-
--- Binary operators
--- ----------------
-
-
-[case testAdd]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a + c  # Fail
-a = a + b  # Fail
-c = b + a  # Fail
-c = a + b
-
-class A:
-    def __add__(self, x: 'B') -> 'C': pass
-class B: pass
-class C: pass
-[out]
-main:3: error: Unsupported operand types for + ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for + ("B")
-[case testAdd]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a + c  # Fail
-a = a + b  # Fail
-c = b + a  # Fail
-c = a + b
-
-class A:
-    def __add__(self, x: 'B') -> 'C':
-        pass
-class B:
-    pass
-class C:
-    pass
-[out]
-main:3: error: Unsupported operand types for + ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for + ("B")
-
-[case testSub]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a - c  # Fail
-a = a - b  # Fail
-c = b - a  # Fail
-c = a - b
-
-class A:
-    def __sub__(self, x: 'B') -> 'C':
-        pass
-class B:
-    pass
-class C:
-    pass
-[out]
-main:3: error: Unsupported operand types for - ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for - ("B")
-
-[case testMul]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a * c  # Fail
-a = a * b  # Fail
-c = b * a  # Fail
-c = a * b
-
-class A:
-    def __mul__(self, x: 'B') -> 'C':
-        pass
-class B:
-    pass
-class C:
-    pass
-[out]
-main:3: error: Unsupported operand types for * ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for * ("B")
-
-[case testMatMul]
-a, b, c = None, None, None # type: (A, B, C)
-c = a @ c  # E: Unsupported operand types for @ ("A" and "C")
-a = a @ b  # E: Incompatible types in assignment (expression has type "C", variable has type "A")
-c = b @ a  # E: Unsupported left operand type for @ ("B")
-c = a @ b
-
-class A:
-    def __matmul__(self, x: 'B') -> 'C':
-        pass
-class B:
-    pass
-class C:
-    pass
-
-[case testDiv]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a / c  # Fail
-a = a / b  # Fail
-c = b / a  # Fail
-c = a / b
-
-class A:
-    def __truediv__(self, x: 'B') -> 'C':
-        pass
-class B:
-    pass
-class C:
-    pass
-[out]
-main:3: error: Unsupported operand types for / ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for / ("B")
-
-[case testIntDiv]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a // c  # Fail
-a = a // b  # Fail
-c = b // a  # Fail
-c = a // b
-
-class A:
-    def __floordiv__(self, x: 'B') -> 'C':
-        pass
-class B:
-    pass
-class C:
-    pass
-[out]
-main:3: error: Unsupported operand types for // ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for // ("B")
-
-[case testMod]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a % c  # Fail
-a = a % b  # Fail
-c = b % a  # Fail
-c = a % b
-
-class A:
-    def __mod__(self, x: 'B') -> 'C':
-        pass
-class B:
-    pass
-class C:
-    pass
-[out]
-main:3: error: Unsupported operand types for % ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for % ("B")
-
-[case testPow]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a ** c  # Fail
-a = a ** b  # Fail
-c = b ** a  # Fail
-c = a ** b
-
-class A:
-    def __pow__(self, x: 'B') -> 'C':
-        pass
-class B:
-    pass
-class C:
-    pass
-[out]
-main:3: error: Unsupported operand types for ** ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for ** ("B")
-
-[case testMiscBinaryOperators]
-
-a, b = None, None # type: (A, B)
-b = a & a  # Fail
-b = a | b  # Fail
-b = a ^ a  # Fail
-b = a << b # Fail
-b = a >> a # Fail
-
-b = a & b
-b = a | a
-b = a ^ b
-b = a << a
-b = a >> b
-class A:
-  def __and__(self, x: 'B') -> 'B': pass
-  def __or__(self, x: 'A') -> 'B': pass
-  def __xor__(self, x: 'B') -> 'B': pass
-  def __lshift__(self, x: 'A') -> 'B': pass
-  def __rshift__(self, x: 'B') -> 'B': pass
-class B: pass
-[out]
-main:3: error: Unsupported operand types for & ("A" and "A")
-main:4: error: Unsupported operand types for | ("A" and "B")
-main:5: error: Unsupported operand types for ^ ("A" and "A")
-main:6: error: Unsupported operand types for << ("A" and "B")
-main:7: error: Unsupported operand types for >> ("A" and "A")
-
-[case testBooleanAndOr]
-
-a, b = None, None # type: (A, bool)
-b = b and b
-b = b or b
-b = b and a # E: Incompatible types in assignment (expression has type "Union[bool, A]", variable has type "bool")
-b = a and b # E: Incompatible types in assignment (expression has type "Union[A, bool]", variable has type "bool")
-b = b or a  # E: Incompatible types in assignment (expression has type "Union[bool, A]", variable has type "bool")
-b = a or b  # E: Incompatible types in assignment (expression has type "Union[A, bool]", variable has type "bool")
-class A: pass
-
-[builtins fixtures/bool.pyi]
-
-[case testRestrictedTypeAnd]
-
-b = None # type: bool
-i = None # type: str
-j = not b and i
-if j:
-    reveal_type(j) # E: Revealed type is 'builtins.str'
-[builtins fixtures/bool.pyi]
-
-[case testRestrictedTypeOr]
-
-b = None # type: bool
-i = None # type: str
-j = b or i
-if not j:
-    reveal_type(j) # E: Revealed type is 'builtins.str'
-[builtins fixtures/bool.pyi]
-
-[case testAndOr]
-
-s = ""
-b = bool()
-reveal_type(s and b or b)  # E: Revealed type is 'builtins.bool'
-[builtins fixtures/bool.pyi]
-
-[case testNonBooleanOr]
-
-c, d, b = None, None, None # type: (C, D, bool)
-c = c or c
-c = c or d
-c = d or c
-b = c or c # E: Incompatible types in assignment (expression has type "C", variable has type "bool")
-d = c or d # E: Incompatible types in assignment (expression has type "C", variable has type "D")
-d = d or c # E: Incompatible types in assignment (expression has type "C", variable has type "D")
-class C: pass
-class D(C): pass
-[builtins fixtures/bool.pyi]
-
-[case testInOperator]
-from typing import Iterator, Iterable, Any
-a, b, c, d, e = None, None, None, None, None # type: (A, B, bool, D, Any)
-c = c in a  # Fail
-a = b in a  # Fail
-c = a in b  # Fail
-c = b in d  # Fail
-c = b in a
-c = a in d
-c = e in d
-c = a in e
-
-class A:
-    def __contains__(self, x: 'B') -> bool: pass
-class B: pass
-class D(Iterable[A]):
-    def __iter__(self) -> Iterator[A]: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Unsupported operand types for in ("bool" and "A")
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:5: error: Unsupported right operand type for in ("B")
-main:6: error: Unsupported operand types for in ("B" and "D")
-
-[case testNotInOperator]
-from typing import Iterator, Iterable, Any
-a, b, c, d, e = None, None, None, None, None # type: (A, B, bool, D, Any)
-c = c not in a  # Fail
-a = b not in a  # Fail
-c = a not in b  # Fail
-c = b not in d  # Fail
-c = b not in a
-c = a not in d
-c = e in d
-c = a in e
-
-class A:
-    def __contains__(self, x: 'B') -> bool: pass
-class B: pass
-class D(Iterable[A]):
-    def __iter__(self) -> Iterator[A]: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Unsupported operand types for in ("bool" and "A")
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:5: error: Unsupported right operand type for in ("B")
-main:6: error: Unsupported operand types for in ("B" and "D")
-
-[case testNonBooleanContainsReturnValue]
-
-a, b = None, None # type: (A, bool)
-b = a not in a
-b = a in a
-
-class A:
-  def __contains__(self, x: 'A') -> object: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:4: error: Incompatible types in assignment (expression has type "object", variable has type "bool")
-
-[case testEq]
-
-a, b = None, None # type: (A, bool)
-a = a == b # Fail
-a = a != b # Fail
-b = a == b
-b = a != b
-
-class A:
-  def __eq__(self, o: object) -> bool: pass
-  def __ne__(self, o: object) -> bool: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testLtAndGt]
-
-a, b, bo = None, None, None # type: (A, B, bool)
-a = a < b # Fail
-a = a > b # Fail
-bo = a < b
-bo = a > b
-
-class A:
-    def __lt__(self, o: 'B') -> bool: pass
-    def __gt__(self, o: 'B') -> bool: pass
-class B:
-    def __lt__(self, o: 'B') -> bool: pass
-    def __gt__(self, o: 'B') -> bool: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testCmp_python2]
-
-a, b, c, bo = None, None, None, None # type: (A, B, C, bool)
-bo = a == a  # E: Unsupported operand types for == ("A" and "A")
-bo = a != a  # E: Argument 1 to "__cmp__" of "A" has incompatible type "A"; expected "B"
-bo = a < b
-bo = a > b
-bo = b <= b
-bo = b <= c
-bo = b >= c  # E: Argument 1 to "__cmp__" of "B" has incompatible type "C"; expected "B"
-bo = a >= b
-bo = c >= b
-bo = c <= b  # E: Argument 1 to "__cmp__" of "C" has incompatible type "B"; expected "A"
-bo = a == c
-bo = b == c  # E: Unsupported operand types for == ("C" and "B")
-
-class A:
-    def __cmp__(self, o):
-      # type: ('B') -> bool
-      pass
-    def __eq__(self, o):
-      # type: ('int') -> bool
-      pass
-class B:
-    def __cmp__(self, o):
-        # type: ('B') -> bool
-        pass
-    def __le__(self, o):
-        # type: ('C') -> bool
-        pass
-class C:
-    def __cmp__(self, o):
-      # type: ('A') -> bool
-      pass
-    def __eq__(self, o):
-      # type: ('int') -> bool
-      pass
-
-[builtins_py2 fixtures/bool.pyi]
-
-[case cmpIgnoredPy3]
-
-a, b, bo = None, None, None # type: (A, B, bool)
-bo = a <= b # E: Unsupported left operand type for <= ("A")
-
-class A:
-    def __cmp__(self, o: 'B') -> bool: pass
-class B:
-    pass
-
-[builtins fixtures/bool.pyi]
-
-[case testLeAndGe]
-
-a, b, bo = None, None, None # type: (A, B, bool)
-a = a <= b # Fail
-a = a >= b # Fail
-bo = a <= b
-bo = a >= b
-
-class A:
-    def __le__(self, o: 'B') -> bool: pass
-    def __ge__(self, o: 'B') -> bool: pass
-class B:
-    def __le__(self, o: 'B') -> bool: pass
-    def __ge__(self, o: 'B') -> bool: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testChainedComp]
-
-a, b, bo = None, None, None # type: (A, B, bool)
-a < a < b < b # Fail
-a < b < b < b
-a < a > a < b # Fail
-
-class A:
-    def __lt__(self, o: 'B') -> bool: pass
-    def __gt__(self, o: 'B') -> bool: pass
-class B:
-    def __lt__(self, o: 'B') -> bool: pass
-    def __gt__(self, o: 'B') -> bool: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Unsupported operand types for > ("A" and "A")
-main:5: error: Unsupported operand types for > ("A" and "A")
-main:5: error: Unsupported operand types for < ("A" and "A")
-
-
-[case testChainedCompBoolRes]
-
-a, b, bo = None, None, None # type: (A, B, bool)
-bo = a < b < b
-a = a < b < b # Fail
-
-class A:
-    def __lt__(self, o: 'B') -> bool: pass
-    def __gt__(self, o: 'B') -> bool: pass
-class B:
-    def __lt__(self, o: 'B') -> bool: pass
-    def __gt__(self, o: 'B') -> bool: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-
-[case testChainedCompResTyp]
-
-x, y = None, None # type: (X, Y)
-a, b, p, bo = None, None, None, None # type: (A, B, P, bool)
-b = y == y == y
-bo = y == y == y # Fail
-a = x < y
-a = x < y == y # Fail
-p = x < y == y
-
-class P:
-    pass
-class A(P):
-    pass
-class B(P):
-    pass
-
-class X:
-    def __lt__(self, o: 'Y') -> A: pass
-    def __gt__(self, o: 'Y') -> A: pass
-class Y:
-    def __lt__(self, o: 'Y') -> A: pass
-    def __gt__(self, o: 'Y') -> A: pass
-    def __eq__(self, o: 'Y') -> B: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "bool")
-main:7: error: Incompatible types in assignment (expression has type "P", variable has type "A")
-
-
-[case testIs]
-
-a, b = None, None # type: (A, bool)
-a = a is b # Fail
-b = a is b
-b = b is a
-b = a is None
-class A: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testIsNot]
-
-a, b = None, None # type: (A, bool)
-a = a is not b # Fail
-b = a is not b
-b = b is not a
-b = a is not None
-class A: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testReverseBinaryOperator]
-
-class A:
-    def __add__(self, x: int) -> int: pass
-class B:
-    def __radd__(self, x: A) -> str: pass
-s = None  # type: str
-n = None  # type: int
-n = A() + 1
-s = A() + B()
-n = A() + B() # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testReverseBinaryOperator2]
-
-class A:
-    def __add__(self, x: 'A') -> object: pass
-class B:
-    def __radd__(self, x: A) -> str: pass
-s = None  # type: str
-n = None  # type: int
-s = A() + B()
-n = A() + B() # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testReverseBinaryOperator3]
-
-class N:
-    def __add__(self, x: 'N') -> object: pass
-class A:
-    def __add__(self, x: N) -> int: pass
-class B:
-    def __radd__(self, x: N) -> str: pass
-s = None  # type: str
-s = A() + B() # E: Unsupported operand types for + ("A" and "B")
-
-[case testBinaryOperatorWithAnyRightOperand]
-from typing import Any
-class A: pass
-A() + Any(1)
-
-[case testReverseComparisonOperator]
-
-class C:
-    def __gt__(self, x: 'A') -> object: pass
-class A:
-    def __lt__(self, x: C) -> int: pass
-class B:
-    def __gt__(self, x: A) -> str: pass
-s = None  # type: str
-n = None  # type: int
-n = A() < C()
-s = A() < B()
-n = A() < B() # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-s = object() < B() # E: Unsupported operand types for > ("B" and "object")
-
-[case testErrorContextAndBinaryOperators]
-import typing
-class A:
-    def __getitem__(self, i: str) -> int: pass
-def f() -> None:
-    A()[1] # Error
-class B:
-    A()[1] # Error
-A()[1] # Error
-[out]
-main:5: error: Invalid index type "int" for "A"; expected type "str"
-main:7: error: Invalid index type "int" for "A"; expected type "str"
-main:8: error: Invalid index type "int" for "A"; expected type "str"
-
-[case testErrorContextAndBinaryOperators2]
-import m
-[file m.py]
-import typing
-class A:
-    def __getitem__(self, i: str) -> int: pass
-def f() -> None:
-    A()[1] # Error
-class B:
-    A()[1] # Error
-A()[1] # Error
-[out]
-tmp/m.py:5: error: Invalid index type "int" for "A"; expected type "str"
-tmp/m.py:7: error: Invalid index type "int" for "A"; expected type "str"
-tmp/m.py:8: error: Invalid index type "int" for "A"; expected type "str"
-
-
--- Unary operators
--- ---------------
-
-
-[case testUnaryMinus]
-
-a, b = None, None # type: (A, B)
-a = -a   # Fail
-b = -b   # Fail
-b = -a
-
-class A:
-    def __neg__(self) -> 'B':
-        pass
-class B:
-    pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:4: error: Unsupported operand type for unary - ("B")
-
-[case testUnaryPlus]
-
-a, b = None, None # type: (A, B)
-a = +a   # Fail
-b = +b   # Fail
-b = +a
-
-class A:
-    def __pos__(self) -> 'B':
-        pass
-class B:
-    pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:4: error: Unsupported operand type for unary + ("B")
-
-[case testUnaryNot]
-
-a, b = None, None # type: (A, bool)
-a = not b  # Fail
-b = not a
-b = not b
-class A:
-    pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testUnaryBitwiseNeg]
-
-a, b = None, None # type: (A, B)
-a = ~a   # Fail
-b = ~b   # Fail
-b = ~a
-
-class A:
-    def __invert__(self) -> 'B':
-        pass
-class B:
-    pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:4: error: Unsupported operand type for ~ ("B")
-
-
--- Indexing
--- --------
-
-
-[case testIndexing]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a[c]  # Fail
-a = a[b]  # Fail
-c = b[a]  # Fail
-c = a[b]
-
-class A:
-    def __getitem__(self, x: 'B') -> 'C':
-        pass
-class B: pass
-class C: pass
-[out]
-main:3: error: Invalid index type "C" for "A"; expected type "B"
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Value of type "B" is not indexable
-
-[case testIndexingAsLvalue]
-
-a, b, c = None, None, None # type: (A, B, C)
-a[c] = c  # Fail
-a[b] = a  # Fail
-b[a] = c  # Fail
-a[b] = c
-
-class A:
-    def __setitem__(self, x: 'B', y: 'C') -> None:
-        pass
-class B:
-    pass
-class C:
-    pass
-[out]
-main:3: error: Invalid index type "C" for "A"; expected type "B"
-main:4: error: Incompatible types in assignment (expression has type "A", target has type "C")
-main:5: error: Unsupported target for indexed assignment
-
-[case testOverloadedIndexing]
-
-from typing import overload
-
-a, b, c = None, None, None  # type: (A, B, C)
-a[b]
-a[c]
-a[1]  # E: No overload variant of "__getitem__" of "A" matches argument types [builtins.int]
-
-i, s = None, None  # type: (int, str)
-i = a[b]
-s = a[b]  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-i = a[c]  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-s = a[c]
-
-class A:
-    @overload
-    def __getitem__(self, x: 'B') -> int:
-        pass
-    @overload
-    def __getitem__(self, x: 'C') -> str:
-        pass
-class B: pass
-class C: pass
-[out]
-
-
--- Cast expression
--- ---------------
-
-
-[case testCastExpressions]
-from typing import cast, Any
-class A: pass
-class B: pass
-class C(A): pass
-a, b, c = None, None, None # type: (A, B, C)
-
-a = cast(A, a())       # E: "A" not callable
-a = cast(Any, a())     # E: "A" not callable
-b = cast(A, a)         # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a = cast(A, b)
-a = cast(A, a)
-c = cast(C, a)
-a = cast(A, c)
-a = cast(Any, b)
-b = cast(Any, a)
-[out]
-
-[case testAnyCast]
-from typing import cast, Any
-a, b = None, None # type: (A, B)
-a = Any(a())     # Fail
-a = Any(b)
-b = Any(a)
-class A: pass
-class B: pass
-[out]
-main:3: error: "A" not callable
-
-
--- None return type
--- ----------------
-
-
-[case testNoneReturnTypeBasics]
-
-a, o = None, None # type: (A, object)
-a = f()         # Fail
-o = A().g(a)    # Fail
-A().g(f())      # Fail
-x = f() # type: A # Fail
-f()
-A().g(a)
-
-def f() -> None:
-    pass
-
-class A:
-    def g(self, x: object) -> None:
-        pass
-[out]
-main:3: error: "f" does not return a value
-main:4: error: "g" of "A" does not return a value
-main:5: error: "f" does not return a value
-main:6: error: "f" does not return a value
-
-[case testNoneReturnTypeWithStatements]
-import typing
-raise f() # Fail
-if f():   # Fail
-    pass
-elif f(): # Fail
-    pass
-while f(): # Fail
-    pass
-def g() -> object:
-    return f() # Fail
-
-def f() -> None: pass
-[builtins fixtures/exception.pyi]
-[out]
-main:2: error: "f" does not return a value
-main:3: error: "f" does not return a value
-main:5: error: "f" does not return a value
-main:7: error: "f" does not return a value
-main:10: error: "f" does not return a value
-
-[case testNoneReturnTypeWithExpressions]
-from typing import cast
-a = None # type: A
-[f()]       # E: "f" does not return a value
-f() + a     # E: "f" does not return a value
-a + f()     # E: "f" does not return a value
-f() == a    # E: "f" does not return a value
-a != f()    # E: Unsupported left operand type for != ("A")
-cast(A, f()) # E: "f" does not return a value
-f().foo     # E: "f" does not return a value
-
-def f() -> None: pass
-class A:
-    def __add__(self, x: 'A') -> 'A': pass
-[builtins fixtures/list.pyi]
-
-[case testNoneReturnTypeWithExpressions2]
-
-a, b = None, None # type: (A, bool)
-a < f()    # E: Unsupported left operand type for < ("A")
-f() <= a   # E: "f" does not return a value
-f() in a   # E: Unsupported right operand type for in ("A")
-a in f()   # E: "f" does not return a value
--f()       # E: "f" does not return a value
-not f()    # E: "f" does not return a value
-f() and b  # E: "f" does not return a value
-b or f()   # E: "f" does not return a value
-
-def f() -> None: pass
-class A:
-    def __add__(self, x: 'A') -> 'A':
-        pass
-[builtins fixtures/bool.pyi]
-
-
--- Slicing
--- -------
-
-
-[case testGetSlice]
-
-a, b = None, None # type: (A, B)
-a = a[1:2] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = a[1:]  # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = a[:2]  # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = a[:]   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-b = a[1:2]
-b = a[1:]
-b = a[:2]
-b = a[:]
-
-class A:
-  def __getitem__(self, s: slice) -> 'B': pass
-class B: pass
-[builtins fixtures/slice.pyi]
-
-[case testSlicingWithInvalidBase]
-
-a = None # type: A
-a[1:2] # E: Invalid index type "slice" for "A"; expected type "int"
-a[:]   # E: Invalid index type "slice" for "A"; expected type "int"
-class A:
-  def __getitem__(self, n: int) -> 'A': pass
-[builtins fixtures/slice.pyi]
-
-[case testSlicingWithNonindexable]
-
-o = None # type: object
-o[1:2] # E: Value of type "object" is not indexable
-o[:]   # E: Value of type "object" is not indexable
-[builtins fixtures/slice.pyi]
-
-[case testNonIntSliceBounds]
-from typing import Any
-a, o = None, None # type: (Any, object)
-a[o:1] # E: Slice index must be an integer or None
-a[1:o] # E: Slice index must be an integer or None
-a[o:]  # E: Slice index must be an integer or None
-a[:o]  # E: Slice index must be an integer or None
-[builtins fixtures/slice.pyi]
-
-[case testNoneSliceBounds]
-from typing import Any
-a = None # type: Any
-a[None:1]
-a[1:None]
-a[None:]
-a[:None]
-[builtins fixtures/slice.pyi]
-
-
--- String interpolation
--- --------------------
-
-
-[case testStringInterpolationType]
-from typing import Tuple
-i, f, s, t = None, None, None, None # type: (int, float, str, Tuple[int])
-'%d' % i
-'%f' % f
-'%s' % s
-'%d' % (f,)
-'%d' % (s,) # E: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-'%d' % t
-'%d' % s  # E: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-'%f' % s  # E: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationSAcceptsAnyType]
-from typing import Any
-i, o, s = None, None, None # type: (int, object, str)
-'%s %s %s' % (i, o, s)
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationCount]
-'%d %d' % 1  # E: Not enough arguments for format string
-'%d %d' % (1, 2)
-'%d %d' % (1, 2, 3)  # E: Not all arguments converted during string formatting
-t = 1, 's'
-'%d %s' % t
-'%s %d' % t  # E: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-'%d' % t  # E: Not all arguments converted during string formatting
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationWithAnyType]
-from typing import Any
-a = None # type: Any
-'%d %d' % a
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationInvalidPlaceholder]
-'%W' % 1  # E: Unsupported format character 'W'
-
-[case testStringInterpolationWidth]
-'%2f' % 3.14
-'%*f' % 3.14 # E: Not enough arguments for format string
-'%*f' % (4, 3.14)
-'%*f' % (1.1, 3.14) # E: * wants int
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationPrecision]
-'%.2f' % 3.14
-'%.*f' % 3.14 # E: Not enough arguments for format string
-'%.*f' % (4, 3.14)
-'%.*f' % (1.1, 3.14) # E: * wants int
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationWidthAndPrecision]
-'%4.2f' % 3.14
-'%4.*f' % 3.14 # E: Not enough arguments for format string
-'%*.2f' % 3.14 # E: Not enough arguments for format string
-'%*.*f' % 3.14 # E: Not enough arguments for format string
-'%*.*f' % (4, 2, 3.14)
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationFlagsAndLengthModifiers]
-'%04hd' % 1
-'%-.4ld' % 1
-'%+*Ld' % (1, 1)
-'% .*ld' % (1, 1)
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationDoublePercentage]
-'%% %d' % 1
-'%3% %d' % 1
-'%*%' % 1
-'%*% %d' % 1  # E: Not enough arguments for format string
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationC]
-'%c' % 1
-'%c' % 's'
-'%c' % ''  # E: %c requires int or char
-'%c' % 'ab'  # E: %c requires int or char
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationMappingTypes]
-'%(a)d %(b)s' % {'a': 1, 'b': 's'}
-'%(a)d %(b)s' % {'a': 's', 'b': 1}  # E: Incompatible types in string interpolation (expression has type "str", placeholder with key 'a' has type "Union[int, float]")
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationMappingKeys]
-'%()d' % {'': 2}
-'%(a)d' % {'a': 1, 'b': 2, 'c': 3}
-'%(q)d' % {'a': 1, 'b': 2, 'c': 3}  # E: Key 'q' not found in mapping
-'%(a)d %%' % {'a': 1}
-
-[builtins fixtures/dict.pyi]
-
-[case testStringInterpolationMappingDictTypes]
-from typing import Any, Dict
-a = None # type: Any
-ds, do, di = None, None, None # type: Dict[str, int], Dict[object, int], Dict[int, int]
-'%(a)' % 1  # E: Format requires a mapping (expression has type "int", expected type for mapping is Dict[Any, Any])
-'%()d' % a
-'%()d' % ds
-'%()d' % do
-[builtins fixtures/dict.pyi]
-
-[case testStringInterpolationMappingInvalidDictTypes-skip]
-from typing import Any, Dict
-di = None # type: Dict[int, int]
-'%()d' % di  # E: Format requires a mapping (expression has type Dict[int, int], expected type for mapping is Dict[str, Any])
-[builtins fixtures/dict.pyi]
-
-[case testStringInterpolationMappingInvalidSpecifiers]
-'%(a)d %d' % 1  # E: String interpolation mixes specifier with and without mapping keys
-'%(b)*d' % 1  # E: String interpolation contains both stars and mapping keys
-'%(b).*d' % 1  # E: String interpolation contains both stars and mapping keys
-
-[case testStringInterpolationMappingFlagsAndLengthModifiers]
-'%(a)1d' % {'a': 1}
-'%(a).1d' % {'a': 1}
-'%(a)#1.1ld' % {'a': 1}
-[builtins fixtures/dict.pyi]
-
-[case testStringInterpolationFloatPrecision]
-'%.f' % 1.2
-'%.3f' % 1.2
-'%.f' % 'x'
-'%.3f' % 'x'
-[builtins fixtures/primitives.pyi]
-[out]
-main:3: error: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-main:4: error: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-
-[case testStringInterpolationSpaceKey]
-'%( )s' % {' ': 'foo'}
-
-[case testByteByteInterpolation]
-def foo(a: bytes, b: bytes):
-    b'%s:%s' % (a, b)
-foo(b'a', b'b') == b'a:b'
-
-[case testBytePercentInterpolationSupported]
-b'%s' % (b'xyz',)
-b'%(name)s' % {'name': 'jane'}
-b'%c' % (123)
-
-[case testUnicodeInterpolation_python2]
-u'%s' % (u'abc',)
-
--- Lambdas
--- -------
-
-
-[case testTrivialLambda]
-from typing import Callable
-f = lambda: 1 # type: Callable[[], int]
-f = lambda: ''.x
-f = lambda: ''
-[out]
-main:3: error: "str" has no attribute "x"
-main:4: error: Incompatible types in assignment (expression has type Callable[[], str], variable has type Callable[[], int])
-main:4: error: Incompatible return value type (got "str", expected "int")
-
-[case testVoidLambda]
-import typing
-def void() -> None:
-    pass
-x = lambda: void() # type: typing.Callable[[], None]
-
-
--- List comprehensions
--- -------------------
-
-
-[case testSimpleListComprehension]
-from typing import List
-a = None # type: List[A]
-a = [x for x in a]
-b = [x for x in a] # type: List[B] # E: List comprehension has incompatible type List[A]
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-
-[case testSimpleListComprehensionNestedTuples]
-from typing import List, Tuple
-l = None # type: List[Tuple[A, Tuple[A, B]]]
-a = [a2 for a1, (a2, b1) in l] # type: List[A]
-b = [a2 for a1, (a2, b1) in l] # type: List[B] # E: List comprehension has incompatible type List[A]
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-
-[case testSimpleListComprehensionNestedTuples2]
-from typing import List, Tuple
-l = None # type: List[Tuple[int, Tuple[int, str]]]
-a = [f(d) for d, (i, s) in l]
-b = [f(s) for d, (i, s) in l] # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-def f(x: int): pass
-[builtins fixtures/for.pyi]
-
-[case testListComprehensionWithNonDirectMapping]
-from typing import List
-a = None # type: List[A]
-b = None # type: List[B]
-b = [f(x) for x in a]
-a = [f(x) for x in a] # E: List comprehension has incompatible type List[B]
-([f(x) for x in b])   # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-class A: pass
-class B: pass
-def f(a: A) -> B: pass
-[builtins fixtures/for.pyi]
-
-[case testErrorInListComprehensionCondition]
-from typing import List
-a = None # type: List[A]
-a = [x for x in a if x()] # E: "A" not callable
-class A: pass
-[builtins fixtures/for.pyi]
-
-[case testTypeInferenceOfListComprehension]
-from typing import List
-a = None # type: List[A]
-o = [x for x in a] # type: List[object]
-class A: pass
-[builtins fixtures/for.pyi]
-
-[case testSimpleListComprehensionInClassBody]
-from typing import List
-class A:
-    a = None # type: List[A]
-    a = [x for x in a]
-    b = [x for x in a] # type: List[B] # E: List comprehension has incompatible type List[A]
-class B: pass
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Set comprehension
--- -----------------
-
-
-[case testSimpleSetComprehension]
-from typing import Set
-a = None # type: Set[A]
-a = {x for x in a}
-b = {x for x in a} # type: Set[B] # E: Set comprehension has incompatible type Set[A]
-class A: pass
-class B: pass
-[builtins fixtures/set.pyi]
-
-
--- Dictionary comprehension
--- ------------------------
-
-
-[case testSimpleDictionaryComprehension]
-from typing import Dict, List, Tuple
-abd = None # type: Dict[A, B]
-abl = None # type: List[Tuple[A, B]]
-abd = {a: b for a, b in abl}
-x = {a: b for a, b in abl} # type: Dict[B, A]
-y = {a: b for a, b in abl} # type: A
-class A: pass
-class B: pass
-[builtins fixtures/dict.pyi]
-[out]
-main:5: error: Key expression in dictionary comprehension has incompatible type "A"; expected type "B"
-main:5: error: Value expression in dictionary comprehension has incompatible type "B"; expected type "A"
-main:6: error: Incompatible types in assignment (expression has type Dict[A, B], variable has type "A")
-
-
-[case testDictionaryComprehensionWithNonDirectMapping]
-from typing import Dict, List, Tuple
-abd = None # type: Dict[A, B]
-abl = None # type: List[Tuple[A, B]]
-abd = {a: f(b) for a, b in abl}
-class A: pass
-class B: pass
-class C: pass
-def f(b: A) -> C: pass
-[builtins fixtures/dict.pyi]
-[out]
-main:4: error: Value expression in dictionary comprehension has incompatible type "C"; expected type "B"
-main:4: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-
-
--- Generator expressions
--- ---------------------
-
-
-[case testSimpleGeneratorExpression]
-from typing import Iterator
-# The implementation is mostly identical to list comprehensions, so a single
-# test case is ok.
-a = None # type: Iterator[int]
-a = (x for x in a)
-b = None # type: Iterator[str]
-b = (x for x in a) # E: Generator has incompatible item type "int"
-[builtins fixtures/for.pyi]
-
-
--- Conditional expressions
--- -----------------------
-
-
-[case testSimpleConditionalExpression]
-import typing
-y = ''
-x = 1 if y else 2
-x = 3
-x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testConditionalExpressionWithEmptyCondition]
-import typing
-def f() -> None: pass
-x = 1 if f() else 2 # E: "f" does not return a value
-
-[case testConditionalExpressionWithSubtyping]
-import typing
-class A: pass
-class B(A): pass
-x = B() if bool() else A()
-x = A()
-x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-y = A() if bool() else B()
-y = A()
-y = '' # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-[builtins fixtures/bool.pyi]
-
-[case testConditionalExpressionAndTypeContext]
-import typing
-x = [1] if bool() else []
-x = [1]
-x = ['x'] # E: List item 0 has incompatible type "str"
-[builtins fixtures/list.pyi]
-
-
--- Special cases
--- -------------
-
-
-[case testOperationsWithNonInstanceTypes]
-from typing import cast
-class A:
-    def __add__(self, a: 'A') -> 'A': pass
-a = None # type: A
-None + a   # Fail
-f + a      # Fail
-a + f      # Fail
-cast(A, f)
-
-def f() -> None:
-    pass
-[out]
-main:5: error: Unsupported left operand type for + (None)
-main:6: error: Unsupported left operand type for + (Callable[[], None])
-main:7: error: Unsupported operand types for + ("A" and Callable[[], None])
-
-[case testOperatorMethodWithInvalidArgCount]
-
-a = None # type: A
-a + a  # Fail
-
-class A:
-    def __add__(self) -> 'A':
-        pass
-[out]
-main:3: error: Too many arguments for "__add__" of "A"
-
-[case testOperatorMethodAsVar]
-from typing import Any
-class A:
-    def __init__(self, _add: Any) -> None:
-        self.__add__ = _add
-a = None # type: A
-a + a
-[out]
-
-[case testOperatorMethodAsVar2]
-
-class A:
-    def f(self, x: int) -> str: pass
-    __add__ = f
-s = None  # type: str
-s = A() + 1
-A() + (A() + 1)
-[out]
-main:7: error: Argument 1 has incompatible type "str"; expected "int"
-
-[case testIndexedLvalueWithSubtypes]
-
-a, b, c = None, None, None # type: (A, B, C)
-a[c] = c
-a[b] = c
-a[c] = b
-
-class A:
-    def __setitem__(self, x: 'B', y: 'B') -> None:
-        pass
-class B:
-    pass
-class C(B):
-    pass
-[out]
-
-
--- Ellipsis
--- --------
-
-
-[case testEllipsis]
-
-a = None # type: A
-a = ...  # E: Incompatible types in assignment (expression has type "ellipsis", variable has type "A")
-b = ...
-c = ...
-b = c
-....__class__
-....a  # E: "ellipsis" has no attribute "a"
-
-class A: pass
-[file builtins.py]
-class object:
-    def __init__(self): pass
-class ellipsis:
-    def __init__(self): pass
-    __class__ = object()
-class type: pass
-class function: pass
-class str: pass
-[out]
-
-
--- Yield expression
--- ----------------
-
-
-[case testYieldExpression]
-def f(x: int) -> None:
-    x = yield f('')
-    x = 1
-[builtins fixtures/for.pyi]
-[out]
-main:1: error: The return type of a generator function should be "Generator" or one of its supertypes
-main:2: error: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testYieldExpressionWithNone]
-from typing import Iterator
-def f(x: int) -> Iterator[None]:
-    (yield)
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Yield from expression
--- ----------------
-
-
-[case testYieldFromIteratorHasNoValue]
-from typing import Iterator
-def f() -> Iterator[int]:
-    yield 5
-def g() -> Iterator[int]:
-    a = yield from f()
-[out]
-main:5: error: Function does not return a value
-
-[case testYieldFromGeneratorHasValue]
-from typing import Iterator, Generator
-def f() -> Generator[int, None, str]:
-    yield 5
-    return "ham"
-def g() -> Iterator[int]:
-    a = "string"
-    a = yield from f()
-[out]
-
-
--- dict(...)
--- ---------
-
-
--- Note that the stub used in unit tests does not have all overload
--- variants, but it should not matter.
-
-[case testDictWithKeywordArgsOnly]
-from typing import Dict, Any
-d1 = dict(a=1, b=2) # type: Dict[str, int]
-d2 = dict(a=1, b='') # type: Dict[str, int] # E: List item 1 has incompatible type "Tuple[str, str]"
-d3 = dict(a=1) # type: Dict[int, int] # E: List item 0 has incompatible type "Tuple[str, int]"
-d4 = dict(a=1, b=1)
-d4.xyz # E: Dict[str, int] has no attribute "xyz"
-d5 = dict(a=1, b='') # type: Dict[str, Any]
-[builtins fixtures/dict.pyi]
-
-[case testDictWithoutKeywordArgs]
-from typing import Dict
-d = dict() # E: Need type annotation for variable
-d2 = dict() # type: Dict[int, str]
-dict(undefined) # E: Name 'undefined' is not defined
-[builtins fixtures/dict.pyi]
-
-[case testDictFromList]
-from typing import Dict
-d = dict([(1, 'x'), (2, 'y')])
-d() # E: Dict[int, str] not callable
-d2 = dict([(1, 'x')]) # type: Dict[str, str] # E: List item 0 has incompatible type "Tuple[int, str]"
-[builtins fixtures/dict.pyi]
-
-[case testDictFromIterableAndKeywordArg]
-from typing import Dict
-it = [('x', 1)]
-
-d = dict(it, x=1)
-d() # E: Dict[str, int] not callable
-
-d2 = dict(it, x='') # E: Cannot infer type argument 2 of "dict"
-d2() # E: Dict[Any, Any] not callable
-
-d3 = dict(it, x='') # type: Dict[str, int] # E: Argument 2 to "dict" has incompatible type "str"; expected "int"
-[builtins fixtures/dict.pyi]
-
-[case testDictFromIterableAndKeywordArg2]
-it = [(1, 'x')]
-dict(it, x='y') # E: Keyword argument only valid with "str" key type in call to "dict"
-[builtins fixtures/dict.pyi]
-
-[case testDictFromIterableAndKeywordArg3]
-d = dict([], x=1)
-d() # E: Dict[str, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testDictFromIterableAndStarStarArgs]
-from typing import Dict
-it = [('x', 1)]
-
-kw = {'x': 1}
-d = dict(it, **kw)
-d() # E: Dict[str, int] not callable
-
-kw2 = {'x': ''}
-d2 = dict(it, **kw2) # E: Cannot infer type argument 2 of "dict"
-d2() # E: Dict[Any, Any] not callable
-
-d3 = dict(it, **kw2) # type: Dict[str, int] # E: Argument 2 to "dict" has incompatible type **Dict[str, str]; expected "int"
-[builtins fixtures/dict.pyi]
-
-[case testDictFromIterableAndStarStarArgs2]
-it = [(1, 'x')]
-kw = {'x': 'y'}
-d = dict(it, **kw) # E: Keyword argument only valid with "str" key type in call to "dict"
-d() # E: Dict[int, str] not callable
-[builtins fixtures/dict.pyi]
-
-[case testUserDefinedClassNamedDict]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-S = TypeVar('S')
-class dict(Generic[T, S]):
-    def __init__(self, x: T, **kwargs: T) -> None: pass
-dict(1, y=1)
-[builtins fixtures/dict.pyi]
-
-[case testSpecialSignatureForSubclassOfDict]
-from typing import TypeVar, Dict, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class D1(dict): pass # Implicit base class Dict[Any, Any]
-D1([(1, 2)], x=1)
-class D2(Dict[T, S], Generic[T, S]): pass
-da = D2([('x', 2)], x=1)
-da() # E: D2[str, int] not callable
-D2([(1, 2)], x=1) # E: Keyword argument only valid with "str" key type in call to "dict"
-db = D2(x=1)
-db() # E: D2[str, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testSpecialSignatureForSubclassOfDict2]
-from typing import TypeVar, Dict, Generic
-T = TypeVar('T')
-class D(Dict[str, T], Generic[T]): pass
-D([('x', 1)], x=1)
-[builtins fixtures/dict.pyi]
-
-[case testOverridingSpecialSignatureInSubclassOfDict]
-from typing import TypeVar, Dict, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class D(Dict[T, S], Generic[T, S]):
-    def __init__(self, x: S, y: T) -> None: pass
-d = D(1, y='')
-d() # E: D[str, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testRevealType]
-reveal_type(1) # E: Revealed type is 'builtins.int'
-
-[case testUndefinedRevealType]
-reveal_type(x)
-[out]
-main:1: error: Revealed type is 'Any'
-main:1: error: Name 'x' is not defined
-
-[case testUserDefinedRevealType]
-def reveal_type(x: int) -> None: pass
-reveal_type("foo") # E: Argument 1 to "reveal_type" has incompatible type "str"; expected "int"
-
-[case testRevealTypeVar]
-reveal_type = 1
-1 + "foo" # E: Unsupported operand types for + ("int" and "str")
-
-[case testRevealForward]
-def f() -> None:
-    reveal_type(x)
-x = 1 + 1
-[out]
-main:2: error: Revealed type is 'builtins.int'
-
-[case testEqNone]
-None == None
-[builtins fixtures/ops.pyi]
-
-[case testLtNone]
-None < None  # E: Unsupported left operand type for < (None)
-[builtins fixtures/ops.pyi]
-
-[case testDictWithStarExpr]
-# flags: --fast-parser
-b = {'z': 26, *a}  # E: invalid syntax
-[builtins fixtures/dict.pyi]
-
-[case testDictWithStarStarExpr]
-# flags: --fast-parser
-from typing import Dict
-a = {'a': 1}
-b = {'z': 26, **a}
-c = {**b}
-d = {**a, **b, 'c': 3}
-e = {1: 'a', **a}  # E: Argument 1 to "update" of "dict" has incompatible type Dict[str, int]; expected Mapping[int, str]
-f = {**b}  # type: Dict[int, int]  # E: List item 0 has incompatible type Dict[str, int]
-[builtins fixtures/dict.pyi]
diff --git a/test-data/unit/check-fastparse.test b/test-data/unit/check-fastparse.test
deleted file mode 100644
index 7f322d7..0000000
--- a/test-data/unit/check-fastparse.test
+++ /dev/null
@@ -1,191 +0,0 @@
-[case testFastParseSyntaxError]
-# flags: --fast-parser
-1 +  # E: invalid syntax
-
-[case testFastParseTypeCommentSyntaxError]
-# flags: --fast-parser
-x = None # type: a : b  # E: syntax error in type comment
-
-[case testFastParseInvalidTypeComment]
-# flags: --fast-parser
-x = None # type: a + b  # E: invalid type comment
-
--- Function type comments are attributed to the function def line.
--- This happens in both parsers.
-[case testFastParseFunctionAnnotationSyntaxError]
-# flags: --fast-parser
-def f():  # E: syntax error in type comment
-  # type: None -> None
-  pass
-
-[case testFastParseInvalidFunctionAnnotation]
-# flags: --fast-parser
-def f():  # E: invalid type comment
-  # type: (a + b) -> None
-  pass
-
-[case testFastParseProperty]
-# flags: --fast-parser
-class C:
-  @property
-  def x(self) -> str: pass
-  @x.setter
-  def x(self, value: str) -> None: pass
-[builtins fixtures/property.pyi]
-
-[case testFastParseConditionalProperty]
-# flags: --fast-parser
-class C:
-  if bool():
-    @property
-    def x(self) -> str: pass
-    @x.setter
-    def x(self, value: str) -> None: pass
-[builtins fixtures/property.pyi]
-
-[case testFastParsePerArgumentAnnotations]
-# flags: --fast-parser
-class A: pass
-class B: pass
-class C: pass
-class D: pass
-class E: pass
-class F: pass
-def f(a,        # type: A
-      b = None, # type: B
-      *args,    # type: C
-      d = None, # type: D
-      e,        # type: E
-      **kwargs  # type: F
-      ):
-    reveal_type(a)      # E: Revealed type is '__main__.A'
-    reveal_type(b)      # E: Revealed type is '__main__.B'
-    reveal_type(args)   # E: Revealed type is 'builtins.tuple[__main__.C]'
-    reveal_type(d)      # E: Revealed type is '__main__.D'
-    reveal_type(e)      # E: Revealed type is '__main__.E'
-    reveal_type(kwargs) # E: Revealed type is 'builtins.dict[builtins.str, __main__.F]'
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFastParsePerArgumentAnnotationsWithReturn]
-# flags: --fast-parser
-class A: pass
-class B: pass
-class C: pass
-class D: pass
-class E: pass
-class F: pass
-def f(a,        # type: A
-      b = None, # type: B
-      *args,    # type: C
-      d = None, # type: D
-      e,        # type: E
-      **kwargs  # type: F
-      ):
-      # type: (...) -> int
-    reveal_type(a)      # E: Revealed type is '__main__.A'
-    reveal_type(b)      # E: Revealed type is '__main__.B'
-    reveal_type(args)   # E: Revealed type is 'builtins.tuple[__main__.C]'
-    reveal_type(d)      # E: Revealed type is '__main__.D'
-    reveal_type(e)      # E: Revealed type is '__main__.E'
-    reveal_type(kwargs) # E: Revealed type is 'builtins.dict[builtins.str, __main__.F]'
-    return "not an int"  # E: Incompatible return value type (got "str", expected "int")
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFastParsePerArgumentAnnotationsWithAnnotatedBareStar]
-# flags: --fast-parser
-def f(*, # type: int  # E: bare * has associated type comment
-      x  # type: str
-      ):
-      # type: (...) -> int
-    pass
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFastParsePerArgumentAnnotationsWithReturnAndBareStar]
-# flags: --fast-parser
-def f(*,
-      x  # type: str
-      ):
-      # type: (...) -> int
-    reveal_type(x) # E: Revealed type is 'builtins.str'
-    return "not an int"  # E: Incompatible return value type (got "str", expected "int")
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFastParsePerArgumentAnnotations_python2]
-# flags: --fast-parser
-class A: pass
-class B: pass
-class C: pass
-class D: pass
-def f(a,        # type: A
-      b = None, # type: B
-      *args     # type: C
-      # kwargs not tested due to lack of 2.7 dict fixtures
-      ):
-    reveal_type(a)      # E: Revealed type is '__main__.A'
-    reveal_type(b)      # E: Revealed type is '__main__.B'
-    reveal_type(args)   # E: Revealed type is 'builtins.tuple[__main__.C]'
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFastParsePerArgumentAnnotationsWithReturn_python2]
-# flags: --fast-parser
-class A: pass
-class B: pass
-class C: pass
-class D: pass
-def f(a,        # type: A
-      b = None, # type: B
-      *args     # type: C
-      # kwargs not tested due to lack of 2.7 dict fixtures
-      ):
-      # type: (...) -> int
-    reveal_type(a)      # E: Revealed type is '__main__.A'
-    reveal_type(b)      # E: Revealed type is '__main__.B'
-    reveal_type(args)   # E: Revealed type is 'builtins.tuple[__main__.C]'
-    return "not an int"  # E: Incompatible return value type (got "str", expected "int")
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFasterParseTooManyArgumentsAnnotation]
-# flags: --fast-parser
-def f():  # E: Type signature has too many arguments
-    # type: (int) -> None
-    pass
-
-[case testFasterParseTooFewArgumentsAnnotation]
-# flags: --fast-parser
-def f(x):  # E: Type signature has too few arguments
-    # type: () -> None
-    pass
-
-[case testFasterParseTypeCommentError_python2]
-# flags: --fast-parser
-from typing import Tuple
-def f(a):
-    # type: (Tuple(int, int)) -> int
-    pass
-[out]
-main:3: error: invalid type comment
-
-[case testFastParseMatMul]
-# flags: --fast-parser
-from typing import Any
-x = None  # type: Any
-x @ 1
-x @= 1
-
-[case testIncorrectTypeCommentIndex]
-# flags: --fast-parser
-from typing import Dict
-x = None # type: Dict[x: y]
-[out]
-main:3: error: syntax error in type comment
-
-[case testPrintStatementTrailingCommaFastParser_python2]
-# flags: --fast-parser
-print 0,
-print 1, 2,
diff --git a/test-data/unit/check-flags.test b/test-data/unit/check-flags.test
deleted file mode 100644
index 409f4db..0000000
--- a/test-data/unit/check-flags.test
+++ /dev/null
@@ -1,242 +0,0 @@
-[case testUnannotatedFunction]
-# flags: --disallow-untyped-defs
-def f(x): pass
-[out]
-main:2: error: Function is missing a type annotation
-
-[case testUnannotatedArgument]
-# flags: --disallow-untyped-defs
-def f(x) -> int: pass
-[out]
-main:2: error: Function is missing a type annotation for one or more arguments
-
-[case testUnannotatedArgumentWithFastParser]
-# flags: --fast-parser --disallow-untyped-defs
-def f(x) -> int: pass
-[out]
-main:2: error: Function is missing a type annotation for one or more arguments
-
-[case testNoArgumentFunction]
-# flags: --disallow-untyped-defs
-def f() -> int: pass
-[out]
-
-[case testUnannotatedReturn]
-# flags: --disallow-untyped-defs
-def f(x: int): pass
-[out]
-main:2: error: Function is missing a return type annotation
-
-[case testUnannotatedReturnWithFastParser]
-# flags: --fast-parser --disallow-untyped-defs
-def f(x: int): pass
-[out]
-main:2: error: Function is missing a return type annotation
-
-[case testLambda]
-# flags: --disallow-untyped-defs
-lambda x: x
-[out]
-
-[case testUntypedDef]
-# flags: --disallow-untyped-defs
-def f():
-    1 + "str"
-[out]
-main:2: error: Function is missing a type annotation
-
-[case testSubclassingAny]
-# flags: --disallow-subclassing-any
-from typing import Any
-FakeClass = None  # type: Any
-class Foo(FakeClass): pass  # E: Class cannot subclass 'FakeClass' (has type 'Any')
-[out]
-
-[case testSubclassingAnyMultipleBaseClasses]
-# flags: --disallow-subclassing-any
-from typing import Any
-FakeClass = None  # type: Any
-class ActualClass: pass
-class Foo(ActualClass, FakeClass): pass  # E: Class cannot subclass 'FakeClass' (has type 'Any')
-[out]
-
-[case testSubclassingAnySilentImports]
-# flags: --disallow-subclassing-any --follow-imports=skip
-# cmd: mypy -m main
-
-[file main.py]
-from ignored_module import BaseClass
-class Foo(BaseClass): pass
-
-[file ignored_module.py]
-class BaseClass: pass
-
-[out]
-tmp/main.py:2: error: Class cannot subclass 'BaseClass' (has type 'Any')
-
-[case testSubclassingAnySilentImports2]
-# flags: --disallow-subclassing-any --follow-imports=skip
-# cmd: mypy -m main
-
-[file main.py]
-import ignored_module
-class Foo(ignored_module.BaseClass): pass
-
-[file ignored_module.py]
-class BaseClass: pass
-
-[out]
-tmp/main.py:2: error: Class cannot subclass 'BaseClass' (has type 'Any')
-
-[case testWarnNoReturnIgnoresTrivialFunctions]
-# flags: --warn-no-return
-def f() -> int:
-  pass
-def g() -> int:
-  ...
-def h() -> int:
-  """with docstring"""
-  pass
-def i() -> int:
-  """with docstring"""
-  ...
-def j() -> int:
-  u"""with unicode docstring"""
-  pass
-def k() -> int:
-  """docstring only"""
-
-[case testWarnNoReturnWorksWithAlwaysTrue]
-# flags: --warn-no-return
-PY3 = True
-def f() -> int:
-    if PY3:
-        return 0
-    else:
-        return 0
-[builtins fixtures/bool.pyi]
-
-[case testWarnNoReturnWorksWithAlwaysFalse]
-# flags: --warn-no-return
-PY2 = False
-def f() -> int:
-    if PY2:
-        return 0
-    else:
-        return 0
-[builtins fixtures/bool.pyi]
-
-[case testWarnNoReturnWorksWithMypyTrue]
-# flags: --warn-no-return
-MYPY = False
-def f() -> int:
-    if MYPY:
-        return 0
-    else:
-        return 0
-[builtins fixtures/bool.pyi]
-
-[case testShowErrorContextFunction]
-# flags: --show-error-context
-def f() -> None:
-  0 + ""
-[out]
-main: note: In function "f":
-main:3: error: Unsupported operand types for + ("int" and "str")
-
-[case testShowErrorContextClass]
-# flags: --show-error-context
-class A:
-  0 + ""
-[out]
-main: note: In class "A":
-main:3: error: Unsupported operand types for + ("int" and "str")
-
-[case testShowErrorContextMember]
-# flags: --show-error-context
-class A:
-  def f(self, x: int) -> None:
-    self.f("")
-[out]
-main: note: In member "f" of class "A":
-main:4: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testShowErrorContextModule]
-# flags: --show-error-context
-import m
-[file m.py]
-0 + ""
-[out]
-main:2: note: In module imported here:
-tmp/m.py:1: error: Unsupported operand types for + ("int" and "str")
-
-[case testShowErrorContextTopLevel]
-# flags: --show-error-context
-def f() -> None:
-  0 + ""
-0 + ""
-[out]
-main: note: In function "f":
-main:3: error: Unsupported operand types for + ("int" and "str")
-main: note: At top level:
-main:4: error: Unsupported operand types for + ("int" and "str")
-
-[case testShowErrorContextFromHere]
-# flags: --show-error-context
-import a
-[file a.py]
-import b
-[file b.py]
-0 + ""
-[out]
-tmp/a.py:1: note: In module imported here,
-main:2: note: ... from here:
-tmp/b.py:1: error: Unsupported operand types for + ("int" and "str")
-
-[case testFollowImportsNormal]
-# flags: --follow-imports=normal
-from mod import x
-x + ""
-[file mod.py]
-1 + ""
-x = 0
-[out]
-tmp/mod.py:1: error: Unsupported operand types for + ("int" and "str")
-main:3: error: Unsupported operand types for + ("int" and "str")
-
-[case testFollowImportsSilent]
-# flags: --follow-imports=silent
-from mod import x
-x + ""  # E: Unsupported operand types for + ("int" and "str")
-[file mod.py]
-1 + ""
-x = 0
-
-[case testFollowImportsSkip]
-# flags: --follow-imports=skip
-from mod import x
-x + ""
-[file mod.py]
-this deliberate syntax error will not be reported
-[out]
- 
-[case testFollowImportsError]
-# flags: --follow-imports=error
-from mod import x
-x + ""
-[file mod.py]
-deliberate syntax error
-[out]
-main:2: note: Import of 'mod' ignored
-main:2: note: (Using --follow-imports=error, module not passed on command line)
-
-[case testIgnoreMissingImportsFalse]
-from mod import x
-[out]
-main:1: error: Cannot find module named 'mod'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testIgnoreMissingImportsTrue]
-# flags: --ignore-missing-imports
-from mod import x
-[out]
diff --git a/test-data/unit/check-functions.test b/test-data/unit/check-functions.test
deleted file mode 100644
index 31a6168..0000000
--- a/test-data/unit/check-functions.test
+++ /dev/null
@@ -1,1666 +0,0 @@
--- Test cases for the type checker related to functions, function types and
--- calls.
-
--- See also check-varargs.test.
-
-
--- Callable type basics
--- --------------------
-
-
-[case testCallingVariableWithFunctionType]
-from typing import Callable
-f = None # type: Callable[[A], B]
-a, b = None, None # type: (A, B)
-a = f(a)    # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = f(b)    # E: Argument 1 has incompatible type "B"; expected "A"
-b = f()     # E: Too few arguments
-b = f(a, a) # E: Too many arguments
-b = f(a)
-
-class A: pass
-class B: pass
-
-[case testKeywordOnlyArgumentOrderInsensitivity]
-import typing
-
-class A(object):
-    def f(self, *, a: int, b: str) -> None: pass
-
-class B(A):
-    def f(self, *, b: str, a: int) -> None: pass
-
-class C(A):
-    def f(self, *, b: int, a: str) -> None: pass # E: Signature of "f" incompatible with supertype "A"
-
-[case testPositionalOverridingArgumentNameInsensitivity]
-import typing
-
-class A(object):
-    def f(self, a: int, b: str) -> None: pass
-
-class B(A):
-    def f(self, b: str, a: int) -> None: pass # E: Argument 1 of "f" incompatible with supertype "A" # E: Argument 2 of "f" incompatible with supertype "A"
-
-class C(A):
-    def f(self, foo: int, bar: str) -> None: pass
-
-
-[case testPositionalOverridingArgumentNamesCheckedWhenMismatchingPos]
-import typing
-
-class A(object):
-    def f(self, a: int, b: str) -> None: pass
-
-class B(A):
-    def f(self, b: int, a: str) -> None: pass # E: Signature of "f" incompatible with supertype "A"
-
-
-[case testSubtypingFunctionTypes]
-from typing import Callable
-
-class A: pass
-class B(A): pass
-
-f = None # type: Callable[[B], A]
-g = None # type: Callable[[A], A]  # subtype of f
-h = None # type: Callable[[B], B]  # subtype of f
-g = h  # E: Incompatible types in assignment (expression has type Callable[[B], B], variable has type Callable[[A], A])
-h = f  # E: Incompatible types in assignment (expression has type Callable[[B], A], variable has type Callable[[B], B])
-h = g  # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[B], B])
-g = f  # E: Incompatible types in assignment (expression has type Callable[[B], A], variable has type Callable[[A], A])
-f = g
-f = h
-f = f
-g = g
-h = h
-
-[case testSubtypingFunctionsDoubleCorrespondence]
-
-def l(x) -> None: ...
-def r(__, *, x) -> None: ...
-r = l # E: Incompatible types in assignment (expression has type Callable[[Any], None], variable has type Callable[[Any, NamedArg('x', Any)], None])
-
-[case testSubtypingFunctionsRequiredLeftArgNotPresent]
-
-def l(x, y) -> None: ...
-def r(x) -> None: ...
-r = l # E: Incompatible types in assignment (expression has type Callable[[Any, Any], None], variable has type Callable[[Any], None])
-
-[case testSubtypingFunctionsImplicitNames]
-
-def f(a, b): pass
-def g(c: Any, d: Any) -> Any: pass
-
-ff = f
-gg = g
-
-gg = f
-ff = g
-
-[case testSubtypingFunctionsDefaultsNames]
-from typing import Callable
-
-def f(a: int, b: str) -> None: pass
-f_nonames = None # type: Callable[[int, str], None]
-def g(a: int, b: str = "") -> None: pass
-def h(aa: int, b: str = "") -> None: pass
-
-ff_nonames = f_nonames
-ff = f
-gg = g
-hh = h
-
-ff = gg
-ff_nonames = ff
-ff_nonames = f_nonames # reset
-ff = ff_nonames # E: Incompatible types in assignment (expression has type Callable[[int, str], None], variable has type Callable[[Arg('a', int), Arg('b', str)], None])
-ff = f # reset
-gg = ff # E: Incompatible types in assignment (expression has type Callable[[Arg('a', int), Arg('b', str)], None], variable has type Callable[[Arg('a', int), DefaultArg('b', str)], None])
-gg = hh # E: Incompatible types in assignment (expression has type Callable[[Arg('aa', int), DefaultArg('b', str)], None], variable has type Callable[[Arg('a', int), DefaultArg('b', str)], None])
-
-[case testSubtypingFunctionsArgsKwargs]
-from typing import Any, Callable
-
-def everything(*args: Any, **kwargs: Any) -> None: pass
-everywhere = None # type: Callable[..., None]
-
-def specific_1(a: int, b: str) -> None: pass
-def specific_2(a: int, *, b: str) -> None: pass
-
-ss_1 = specific_1
-ss_2 = specific_2
-ee_def = everything
-ee_var = everywhere
-
-ss_1 = ee_def
-ss_1 = specific_1
-ss_2 = ee_def
-ss_2 = specific_2
-ee_def = everywhere
-ee_def = everything
-ee_var = everything
-ee_var = everywhere
-
-ee_var = specific_1 # The difference between Callable[..., blah] and one with a *args: Any, **kwargs: Any is that the ... goes loosely both ways.
-ee_def = specific_1 # E: Incompatible types in assignment (expression has type Callable[[int, str], None], variable has type Callable[[StarArg(Any), KwArg(Any)], None])
-
-[builtins fixtures/dict.pyi]
-
-[case testLackOfNames]
-def f(__a: int, __b: str) -> None: pass
-def g(a: int, b: str) -> None: pass
-
-ff = f
-gg = g
-
-ff = g
-gg = f # E: Incompatible types in assignment (expression has type Callable[[int, str], None], variable has type Callable[[Arg('a', int), Arg('b', str)], None])
-
-[case testLackOfNamesFastparse]
-# flags: --fast-parser
-
-def f(__a: int, __b: str) -> None: pass
-def g(a: int, b: str) -> None: pass
-
-ff = f
-gg = g
-
-ff = g
-gg = f # E: Incompatible types in assignment (expression has type Callable[[int, str], None], variable has type Callable[[Arg('a', int), Arg('b', str)], None])
-
-[case testFunctionTypeCompatibilityWithOtherTypes]
-from typing import Callable
-f = None # type: Callable[[], None]
-a, o = None, None # type: (A, object)
-a = f   # E: Incompatible types in assignment (expression has type Callable[[], None], variable has type "A")
-f = a   # E: Incompatible types in assignment (expression has type "A", variable has type Callable[[], None])
-f = o   # E: Incompatible types in assignment (expression has type "object", variable has type Callable[[], None])
-f = f() # E: Function does not return a value
-
-f = f
-f = None
-o = f
-
-class A: pass
-
-[case testFunctionSubtypingWithVoid]
-from typing import Callable
-f = None # type: Callable[[], None]
-g = None # type: Callable[[], object]
-f = g  # E: Incompatible types in assignment (expression has type Callable[[], object], variable has type Callable[[], None])
-g = f  # E: Incompatible types in assignment (expression has type Callable[[], None], variable has type Callable[[], object])
-
-f = f
-g = g
-
-[case testFunctionSubtypingWithMultipleArgs]
-from typing import Callable
-f = None # type: Callable[[A, A], None]
-g = None # type: Callable[[A, B], None]
-h = None # type: Callable[[B, B], None]
-f = g  # E: Incompatible types in assignment (expression has type Callable[[A, B], None], variable has type Callable[[A, A], None])
-f = h  # E: Incompatible types in assignment (expression has type Callable[[B, B], None], variable has type Callable[[A, A], None])
-g = h  # E: Incompatible types in assignment (expression has type Callable[[B, B], None], variable has type Callable[[A, B], None])
-g = f
-h = f
-h = g
-f = f
-g = g
-h = h
-
-class A: pass
-class B(A): pass
-
-[case testFunctionTypesWithDifferentArgumentCounts]
-from typing import Callable
-f = None # type: Callable[[], None]
-g = None # type: Callable[[A], None]
-h = None # type: Callable[[A, A], None]
-
-f = g   # E: Incompatible types in assignment (expression has type Callable[[A], None], variable has type Callable[[], None])
-f = h   # E: Incompatible types in assignment (expression has type Callable[[A, A], None], variable has type Callable[[], None])
-h = f   # E: Incompatible types in assignment (expression has type Callable[[], None], variable has type Callable[[A, A], None])
-h = g   # E: Incompatible types in assignment (expression has type Callable[[A], None], variable has type Callable[[A, A], None])
-
-f = f
-g = g
-h = h
-
-class A: pass
-[out]
-
-[case testCompatibilityOfSimpleTypeObjectWithStdType]
-
-t = None # type: type
-a = None # type: A
-
-a = A # E: Incompatible types in assignment (expression has type "A" (type object), variable has type "A")
-t = f # E: Incompatible types in assignment (expression has type Callable[[], None], variable has type "type")
-t = A
-
-class A:
-    def __init__(self, a: 'A') -> None: pass
-
-def f() -> None: pass
-
-[case testFunctionTypesWithOverloads]
-from typing import Callable, overload
-f = None # type: Callable[[AA], A]
-g = None # type: Callable[[B], B]
-h = None # type: Callable[[A], AA]
-
-h = i  # E: Incompatible types in assignment (expression has type overloaded function, variable has type Callable[[A], AA])
-f = j
-
-f = i
-g = i
-g = j
-
-class A: pass
-class AA(A): pass
-
-class B: pass
-
- at overload
-def i(x: AA) -> A:
-    pass
- at overload
-def i(x: B) -> B:
-    pass
-
- at overload
-def j(x: B) -> B:
-    pass
- at overload
-def j(x: A) -> AA:
-    pass
-
-[case testOverloadWithThreeItems]
-from typing import Callable, overload
-g1 = None # type: Callable[[A], A]
-g2 = None # type: Callable[[B], B]
-g3 = None # type: Callable[[C], C]
-g4 = None # type: Callable[[A], B]
-a, b, c = None, None, None # type: (A, B, C)
-
-b = f(a)  # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(b)  # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = f(c)  # E: Incompatible types in assignment (expression has type "C", variable has type "B")
-g4 = f    # E: Incompatible types in assignment (expression has type overloaded function, variable has type Callable[[A], B])
-
-g1 = f
-g2 = f
-g3 = f
-a = f(a)
-b = f(b)
-c = f(c)
-
-class A: pass
-class B: pass
-class C: pass
-
- at overload
-def f(x: A) -> A: pass
- at overload
-def f(x: B) -> B: pass
- at overload
-def f(x: C) -> C: pass
-
-[case testInferConstraintsUnequalLengths]
-from typing import Any, Callable, List
-def f(fields: List[Callable[[Any], Any]]): pass
-class C: pass
-f([C])  # E: List item 0 has incompatible type
-class D:
-    def __init__(self, a, b): pass
-f([D])  # E: List item 0 has incompatible type
-[builtins fixtures/list.pyi]
-
--- Default argument values
--- -----------------------
-
-
-[case testCallingFunctionsWithDefaultArgumentValues]
-
-a, b = None, None # type: (A, B)
-a = f()     # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = f(b)    # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-b = f(a, a) # E: Too many arguments for "f"
-
-b = f()
-b = f(a)
-b = f(AA())
-
-def f(x: 'A'  =  None) -> 'B': pass
-
-class A: pass
-class AA(A): pass
-class B: pass
-
-[case testDefaultArgumentExpressions]
-import typing
-def f(x: 'A' = A()) -> None:
-    b = x # type: B # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    a = x # type: A
-
-class B: pass
-class A: pass
-[out]
-
-[case testDefaultArgumentExpressions2]
-import typing
-def f(x: 'A' = B()) -> None: # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    b = x # type: B      # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    a = x # type: A
-
-class B: pass
-class A: pass
-[out]
-
-[case testDefaultArgumentsWithSubtypes]
-import typing
-def f(x: 'B' = A()) -> None: # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    pass
-def g(x: 'A' = B()) -> None:
-    pass
-
-class A: pass
-class B(A): pass
-[out]
-
-[case testMultipleDefaultArgumentExpressions]
-import typing
-def f(x: 'A' = B(), y: 'B' = B()) -> None: # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    pass
-def h(x: 'A' = A(), y: 'B' = B()) -> None:
-    pass
-
-class A: pass
-class B: pass
-[out]
-
-[case testMultipleDefaultArgumentExpressions2]
-import typing
-def g(x: 'A' = A(), y: 'B' = A()) -> None: # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    pass
-
-class A: pass
-class B: pass
-[out]
-
-[case testDefaultArgumentsAndSignatureAsComment]
-import typing
-def f(x = 1): # type: (int) -> str
-    pass
-f()
-f(1)
-f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testMethodDefaultArgumentsAndSignatureAsComment]
-import typing
-class A:
-    def f(self, x = 1): # type: (int) -> str
-        pass
-A().f()
-A().f(1)
-A().f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-
--- Access to method defined as a data attribute
--- --------------------------------------------
-
-
-[case testMethodAsDataAttribute]
-from typing import Any, Callable
-class B: pass
-x = None # type: Any
-class A:
-    f = x # type: Callable[[A], None]
-    g = x # type: Callable[[A, B], None]
-a = None # type: A
-a.f()
-a.g(B())
-a.f(a) # E: Too many arguments
-a.g()  # E: Too few arguments
-
-[case testMethodWithInvalidMethodAsDataAttribute]
-from typing import Any, Callable
-class B: pass
-x = None # type: Any
-class A:
-    f = x # type: Callable[[], None]
-    g = x # type: Callable[[B], None]
-a = None # type: A
-a.f() # E: Invalid method type
-a.g() # E: Invalid method type
-
-[case testMethodWithDynamicallyTypedMethodAsDataAttribute]
-from typing import Any, Callable
-class B: pass
-x = None # type: Any
-class A:
-    f = x # type: Callable[[Any], Any]
-a = None # type: A
-a.f()
-a.f(a) # E: Too many arguments
-
-[case testOverloadedMethodAsDataAttribute]
-from typing import overload
-class B: pass
-class A:
-    @overload
-    def f(self) -> None: pass
-    @overload
-    def f(self, b: B) -> None: pass
-    g = f
-a = None # type: A
-a.g()
-a.g(B())
-a.g(a) # E: No overload variant matches argument types [__main__.A]
-
-[case testMethodAsDataAttributeInferredFromDynamicallyTypedMethod]
-
-class A:
-    def f(self, x): pass
-    g = f
-a = None # type: A
-a.g(object())
-a.g(a, a) # E: Too many arguments
-a.g()     # E: Too few arguments
-
-[case testMethodAsDataAttributeInGenericClass]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class B: pass
-class A(Generic[t]):
-    def f(self, x: t) -> None: pass
-    g = f
-a = None # type: A[B]
-a.g(B())
-a.g(a)   # E: Argument 1 has incompatible type A[B]; expected "B"
-
-[case testInvalidMethodAsDataAttributeInGenericClass]
-from typing import Any, TypeVar, Generic, Callable
-t = TypeVar('t')
-class B: pass
-class C: pass
-x = None # type: Any
-class A(Generic[t]):
-    f = x # type: Callable[[A[B]], None]
-ab = None # type: A[B]
-ac = None # type: A[C]
-ab.f()
-ac.f()   # E: Invalid method type
-
-[case testPartiallyTypedSelfInMethodDataAttribute]
-from typing import Any, TypeVar, Generic, Callable
-t = TypeVar('t')
-class B: pass
-class C: pass
-x = None # type: Any
-class A(Generic[t]):
-    f = x # type: Callable[[A], None]
-ab = None # type: A[B]
-ac = None # type: A[C]
-ab.f()
-ac.f()
-
-[case testCallableDataAttribute]
-from typing import Callable
-class A:
-    g = None # type: Callable[[A], None]
-    def __init__(self, f: Callable[[], None]) -> None:
-        self.f = f
-a = A(None)
-a.f()
-a.g()
-a.f(a) # E: Too many arguments
-a.g(a) # E: Too many arguments
-
-
--- Nested functions
--- ----------------
-
-
-[case testSimpleNestedFunction]
-import typing
-def f(a: 'A') -> None:
-    def g(b: 'B') -> None:
-         b = a # fail
-         aa = a # type: A # ok
-         b = B()
-    g(a) # fail
-    g(B())
-class A: pass
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:7: error: Argument 1 to "g" has incompatible type "A"; expected "B"
-
-[case testReturnAndNestedFunction]
-import typing
-def f() -> 'A':
-    def g() -> 'B':
-        return A() # fail
-        return B()
-    return B() # fail
-    return A()
-class A: pass
-class B: pass
-[out]
-main:4: error: Incompatible return value type (got "A", expected "B")
-main:6: error: Incompatible return value type (got "B", expected "A")
-
-[case testDynamicallyTypedNestedFunction]
-import typing
-def f(x: object) -> None:
-    def g(y):
-        pass
-    g() # E: Too few arguments for "g"
-    g(x)
-[out]
-
-[case testNestedFunctionInMethod]
-import typing
-class A:
-    def f(self) -> None:
-        def g(x: int) -> None:
-            y = x # type: int
-            a = x # type: A # fail
-        g(2)
-        g(A()) # fail
-[out]
-main:6: error: Incompatible types in assignment (expression has type "int", variable has type "A")
-main:8: error: Argument 1 to "g" has incompatible type "A"; expected "int"
-
-[case testMutuallyRecursiveNestedFunctions]
-def f() -> None:
-    def g() -> None:
-        h(1)
-        h('') # E
-    def h(x: int) -> None:
-        g()
-        g(1) # E
-[out]
-main:4: error: Argument 1 to "h" has incompatible type "str"; expected "int"
-main:7: error: Too many arguments for "g"
-
-[case testMutuallyRecursiveDecoratedFunctions]
-from typing import Callable, Any
-def dec(f) -> Callable[..., Any]: pass
-def f() -> None:
-    @dec
-    def g() -> None:
-        h()
-        h.x # E
-    @dec
-    def h(x: int) -> None:
-        g(1)
-        g.x # E
-[out]
-main:7: error: Callable[..., Any] has no attribute "x"
-main:11: error: Callable[..., Any] has no attribute "x"
-
-[case testNestedGenericFunctions]
-from typing import TypeVar
-T = TypeVar('T')
-U = TypeVar('U')
-
-def outer(x: T) -> T:
-    def inner(y: U) -> T: ...
-    return inner(1)
-
-
--- Casts
--- -----
-
-
-[case testCastsToAndFromFunctionTypes]
-from typing import TypeVar, Callable, Any, cast
-t = TypeVar('t')
-def f(x: t,
-      f1: Callable[[], None],
-      f2: Callable[[Any], None], o: object) -> None:
-    x = cast(t, f1)
-    f1 = cast(Callable[[], None], x)
-    f1 = cast(Callable[[], None], f2)
-    f1 = cast(Callable[[], None], o)
-
-
--- Function decorators
--- -------------------
-
-
-[case testTrivialStaticallyTypedFunctionDecorator]
-from typing import TypeVar
-t = TypeVar('t')
-def dec(f: t) -> t:
-    return f
- at dec
-def f(x: int) -> None: pass
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testTrivialStaticallyTypedMethodDecorator]
-from typing import TypeVar
-t = TypeVar('t')
-def dec(f: t) -> t:
-    return f
-class A:
-    @dec
-    def f(self, x: int) -> None: pass
-A().f(1)
-A().f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-class B: pass
-
-[case testTrivialDecoratedNestedFunction]
-from typing import TypeVar
-t = TypeVar('t')
-def dec(f: t) -> t:
-    return f
-def g() -> None:
-    @dec
-    def f(x: int) -> None: pass
-    f(1)
-    f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[out]
-
-[case testCheckingDecoratedFunction]
-import typing
-def dec(f): pass
- at dec
-def f(x: 'A') -> None:
-    a = x # type: A
-    x = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-class A: pass
-[out]
-
-[case testDecoratorThatSwitchesType]
-from typing import Callable
-def dec(x) -> Callable[[], None]: pass
- at dec
-def f(y): pass
-f()
-f(None) # E: Too many arguments for "f"
-
-[case testDecoratorThatSwitchesTypeWithMethod]
-from typing import Any, Callable
-def dec(x) -> Callable[[Any], None]: pass
-class A:
-    @dec
-    def f(self, a, b, c): pass
-a = None # type: A
-a.f()
-a.f(None) # E: Too many arguments for "f" of "A"
-
-[case testNestedDecorators]
-from typing import Any, Callable
-def dec1(f: Callable[[Any], None]) -> Callable[[], None]: pass
-def dec2(f: Callable[[Any, Any], None]) -> Callable[[Any], None]: pass
- at dec1
- at dec2
-def f(x, y): pass
-f()
-f(None) # E: Too many arguments for "f"
-
-[case testInvalidDecorator1]
-from typing import Any, Callable
-def dec1(f: Callable[[Any], None]) -> Callable[[], None]: pass
-def dec2(f: Callable[[Any, Any], None]) -> Callable[[Any], None]: pass
- at dec1 # E: Argument 1 to "dec2" has incompatible type Callable[[Any], Any]; expected Callable[[Any, Any], None]
- at dec2
-def f(x): pass
-
-[case testInvalidDecorator2]
-from typing import Any, Callable
-def dec1(f: Callable[[Any, Any], None]) -> Callable[[], None]: pass
-def dec2(f: Callable[[Any, Any], None]) -> Callable[[Any], None]: pass
- at dec1 # E: Argument 1 to "dec1" has incompatible type Callable[[Any], None]; expected Callable[[Any, Any], None]
- at dec2
-def f(x, y): pass
-
-[case testNoTypeCheckDecoratorOnMethod1]
-from typing import no_type_check
-
- at no_type_check
-def foo(x: 'bar', y: {'x': 4}) -> 42:
-    1 + 'x'
-
-[case testNoTypeCheckDecoratorOnMethod2]
-import typing
-
- at typing.no_type_check
-def foo(x: 's', y: {'x': 4}) -> 42:
-    1 + 'x'
-
- at typing.no_type_check
-def bar() -> None:
-    1 + 'x'
-
-[case testCallingNoTypeCheckFunction]
-import typing
-
- at typing.no_type_check
-def foo(x: {1:2}) -> [1]:
-    1 + 'x'
-
-foo()
-foo(1, 'b')
-
-[case testCallingNoTypeCheckFunction2]
-import typing
-
-def f() -> None:
-    foo()
-
- at typing.no_type_check
-def foo(x: {1:2}) -> [1]:
-    1 + 'x'
-
-[case testNoTypeCheckDecoratorSemanticError]
-import typing
-
- at typing.no_type_check
-def foo(x: {1:2}) -> [1]:
-    x = y
-
-
--- Forward references to decorated functions
--- -----------------------------------------
-
-
-[case testForwardReferenceToDynamicallyTypedDecorator]
-def f(self) -> None:
-    g()
-    g(1)
-
-def dec(f):
-    return f
-
- at dec
-def g():
-    pass
-
-[case testForwardReferenceToDecoratorWithAnyReturn]
-from typing import Any
-
-def f(self) -> None:
-    g()
-    g(1)
-
-def dec(f) -> Any:
-    return f
-
- at dec
-def g():
-    pass
-
-[case testForwardReferenceToDecoratorWithIdentityMapping]
-from typing import TypeVar
-
-def f(self) -> None:
-    g()
-    g(1) # E: Too many arguments for "g"
-    h(1).x # E: "str" has no attribute "x"
-    h('') # E: Argument 1 to "h" has incompatible type "str"; expected "int"
-
-T = TypeVar('T')
-def dec(f: T) -> T:
-    return f
-
- at dec
-def g(): pass
- at dec
-def h(x: int) -> str: pass
-[out]
-
-[case testForwardReferenceToDynamicallyTypedDecoratedMethod]
-def f(self) -> None:
-    A().f(1).y
-    A().f()
-
-class A:
-    @dec
-    def f(self, x): pass
-
-def dec(f): return f
-[builtins fixtures/staticmethod.pyi]
-
-[case testForwardReferenceToStaticallyTypedDecoratedMethod]
-from typing import TypeVar
-
-def f(self) -> None:
-    A().f(1).y # E: "str" has no attribute "y"
-    A().f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-class A:
-    @dec
-    def f(self, a: int) -> str: return ''
-
-T = TypeVar('T')
-def dec(f: T) -> T: return f
-[builtins fixtures/staticmethod.pyi]
-[out]
-
-[case testForwardReferenceToDynamicallyTypedProperty]
-def f(self) -> None:
-    A().x.y
-
-class A:
-    @property
-    def x(self): pass
-[builtins fixtures/property.pyi]
-
-[case testForwardReferenceToStaticallyTypedProperty]
-def f(self) -> None:
-    A().x.y # E: "int" has no attribute "y"
-
-class A:
-    @property
-    def x(self) -> int: return 1
-[builtins fixtures/property.pyi]
-[out]
-
-[case testForwardReferenceToDynamicallyTypedStaticMethod]
-def f(self) -> None:
-    A.x(1).y
-    A.x() # E: Too few arguments for "x"
-
-class A:
-    @staticmethod
-    def x(x): pass
-[builtins fixtures/staticmethod.pyi]
-[out]
-
-[case testForwardReferenceToStaticallyTypedStaticMethod]
-def f(self) -> None:
-    A.x(1).y # E: "str" has no attribute "y"
-    A.x('') # E: Argument 1 to "x" of "A" has incompatible type "str"; expected "int"
-
-class A:
-    @staticmethod
-    def x(a: int) -> str: return ''
-[builtins fixtures/staticmethod.pyi]
-[out]
-
-[case testForwardReferenceToDynamicallyTypedClassMethod]
-def f(self) -> None:
-    A.x(1).y
-    A.x() # E: Too few arguments for "x"
-
-class A:
-    @classmethod
-    def x(cls, a): pass
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testForwardReferenceToStaticallyTypedClassMethod]
-def f(self) -> None:
-    A.x(1).y # E: "str" has no attribute "y"
-    A.x('') # E: Argument 1 to "x" of "A" has incompatible type "str"; expected "int"
-
-class A:
-    @classmethod
-    def x(cls, x: int) -> str: return ''
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testForwardReferenceToDecoratedFunctionUsingMemberExpr]
-import m
-
-def f(self) -> None:
-    g(1).x # E: "str" has no attribute "x"
-
- at m.dec
-def g(x: int) -> str: pass
-[file m.py]
-from typing import TypeVar
-T = TypeVar('T')
-def dec(f: T) -> T:
-    return f
-[out]
-
-[case testForwardReferenceToFunctionWithMultipleDecorators]
-def f(self) -> None:
-    g()
-    g(1)
-
-def dec(f):
-    return f
-
- at dec
- at dec2
-def g():
-    pass
-
-def dec2(f):
-    return f
-
-[case testForwardReferenceToDynamicallyTypedDecoratedStaticMethod]
-def f(self) -> None:
-    A().f(1).y
-    A().f()
-    A().g(1).y
-    A().g()
-
-class A:
-    @dec
-    @staticmethod
-    def f(self, x): pass
-    @staticmethod
-    @dec
-    def g(self, x): pass
-
-def dec(f): return f
-[builtins fixtures/staticmethod.pyi]
-
-[case testForwardRefereceToDecoratedFunctionWithCallExpressionDecorator]
-def f(self) -> None:
-    g()
-    g(1)
-
- at dec(1)
-def g(): pass
-
-def dec(f): pass
-
-
--- Decorator functions in import cycles
--- ------------------------------------
-
-
-[case testDecoratorWithIdentityTypeInImportCycle]
-import a
-
-[file a.py]
-import b
-from d import dec
- at dec
-def f(x: int) -> None: pass
-b.g(1) # E
-
-[file b.py]
-import a
-from d import dec
- at dec
-def g(x: str) -> None: pass
-a.f('')
-
-[file d.py]
-from typing import TypeVar
-T = TypeVar('T')
-def dec(f: T) -> T: return f
-
-[out]
-tmp/b.py:5: error: Argument 1 to "f" has incompatible type "str"; expected "int"
-tmp/a.py:5: error: Argument 1 to "g" has incompatible type "int"; expected "str"
-
-[case testDecoratorWithNoAnnotationInImportCycle]
-import a
-
-[file a.py]
-import b
-from d import dec
- at dec
-def f(x: int) -> None: pass
-b.g(1, z=4)
-
-[file b.py]
-import a
-from d import dec
- at dec
-def g(x: str) -> None: pass
-a.f('', y=2)
-
-[file d.py]
-def dec(f): return f
-
-[case testDecoratorWithFixedReturnTypeInImportCycle]
-import a
-
-[file a.py]
-import b
-from d import dec
- at dec
-def f(x: int) -> str: pass
-b.g(1)()
-
-[file b.py]
-import a
-from d import dec
- at dec
-def g(x: int) -> str: pass
-a.f(1)()
-
-[file d.py]
-from typing import Callable
-def dec(f: Callable[[int], str]) -> Callable[[int], str]: return f
-
-[out]
-tmp/b.py:5: error: "str" not callable
-tmp/a.py:5: error: "str" not callable
-
-[case testDecoratorWithCallAndFixedReturnTypeInImportCycle]
-import a
-
-[file a.py]
-import b
-from d import dec
- at dec()
-def f(x: int) -> str: pass
-b.g(1)()
-
-[file b.py]
-import a
-from d import dec
- at dec()
-def g(x: int) -> str: pass
-a.f(1)()
-
-[file d.py]
-from typing import Callable
-def dec() -> Callable[[Callable[[int], str]], Callable[[int], str]]: pass
-
-[out]
-tmp/b.py:5: error: "str" not callable
-tmp/a.py:5: error: "str" not callable
-
-[case testDecoratorWithCallAndFixedReturnTypeInImportCycleAndDecoratorArgs]
-import a
-
-[file a.py]
-import b
-from d import dec
- at dec(1)
-def f(x: int) -> str: pass
-b.g(1)()
-
-[file b.py]
-import a
-from d import dec
- at dec(1)
-def g(x: int) -> str: pass
-a.f(1)()
-
-[file d.py]
-from typing import Callable
-def dec(x: str) -> Callable[[Callable[[int], str]], Callable[[int], str]]: pass
-
-[out]
-tmp/b.py:3: error: Argument 1 to "dec" has incompatible type "int"; expected "str"
-tmp/b.py:5: error: "str" not callable
-tmp/a.py:3: error: Argument 1 to "dec" has incompatible type "int"; expected "str"
-tmp/a.py:5: error: "str" not callable
-
-[case testUndefinedDecoratorInImportCycle]
-# cmd: mypy -m foo.base
-[file foo/__init__.py]
-import foo.base
-class Derived(foo.base.Base):
-    def method(self) -> None: pass
-[file foo/base.py]
-import foo
-class Base:
-    @decorator
-    def method(self) -> None: pass
-[out]
-tmp/foo/base.py:3: error: Name 'decorator' is not defined
-
-
--- Conditional function definition
--- -------------------------------
-
-
-[case testTypeCheckBodyOfConditionalFunction]
-from typing import Any
-x = None # type: Any
-if x:
-    def f(x: int) -> None:
-        x = 1
-        x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[out]
-
-[case testCallConditionalFunction]
-from typing import Any
-x = None # type: Any
-if x:
-    def f(x: int) -> None:  pass
-    f(1)
-    f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testConditionalFunctionDefinitionWithIfElse]
-from typing import Any
-x = None # type: Any
-if x:
-    def f(x: int) -> None:
-        x = 'x'   # fail
-        x = 1
-else:
-    def f(x: int) -> None:
-        x + 'x'   # fail
-        x = 1
-f(1)
-f('x') # fail
-[out]
-main:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:9: error: Unsupported operand types for + ("int" and "str")
-main:12: error: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testNestedConditionalFunctionDefinitionWithIfElse]
-from typing import Any
-x = None # type: Any
-def top() -> None:
-    if x:
-        def f(x: int) -> None:
-            x = 'x'   # fail
-            x = 1
-    else:
-        def f(x: int) -> None:
-            x + 'x'   # fail
-            x = 1
-    f(1)
-    f('x') # fail
-[out]
-main:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:10: error: Unsupported operand types for + ("int" and "str")
-main:13: error: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testUnconditionalRedefinitionOfConditionalFunction]
-from typing import Any
-x = None # type: Any
-if x:
-    def f(): pass
-def f(): pass # E: Name 'f' already defined
-
-[case testIncompatibleConditionalFunctionDefinition]
-from typing import Any
-x = None # type: Any
-if x:
-    def f(x: int) -> None: pass
-else:
-    def f(x): pass # E: All conditional function variants must have identical signatures
-
-[case testIncompatibleConditionalFunctionDefinition2]
-from typing import Any
-x = None # type: Any
-if x:
-    def f(x: int) -> None: pass
-else:
-    def f(y: int) -> None: pass # E: All conditional function variants must have identical signatures
-
-[case testIncompatibleConditionalFunctionDefinition3]
-from typing import Any
-x = None # type: Any
-if x:
-    def f(x: int) -> None: pass
-else:
-    def f(x: int = 0) -> None: pass # E: All conditional function variants must have identical signatures
-
-[case testConditionalRedefinitionOfAnUnconditionalFunctionDefinition1]
-from typing import Any
-def f(x: str) -> None: pass
-x = None # type: Any
-if x:
-    def f(x: int) -> None: pass # E: All conditional function variants must have identical signatures
-
-[case testConditionalRedefinitionOfAnUnconditionalFunctionDefinition1]
-from typing import Any
-def f(x: int) -> None: pass # N: "f" defined here
-x = None # type: Any
-if x:
-    def f(y: int) -> None: pass # E: All conditional function variants must have identical signatures
-f(x=1) # The first definition takes precedence.
-f(y=1) # E: Unexpected keyword argument "y" for "f"
-
-[case testRedefineFunctionDefinedAsVariable]
-def g(): pass
-f = g
-if g():
-    def f(): pass
-f()
-f(1) # E: Too many arguments
-
-[case testRedefineFunctionDefinedAsVariableInitializedToNone]
-def g(): pass
-f = None
-if g():
-    def f(): pass
-f()
-f(1) # E: Too many arguments for "f"
-
-[case testRedefineNestedFunctionDefinedAsVariableInitializedToNone]
-def g() -> None:
-    f = None
-    if object():
-        def f(x: int) -> None: pass
-    f() # E: Too few arguments for "f"
-    f(1)
-    f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[out]
-
-[case testRedefineFunctionDefinedAsVariableWithInvalidSignature]
-def g(): pass
-f = g
-if g():
-    def f(x): pass  # E: Incompatible redefinition (redefinition with type Callable[[Any], Any], original type Callable[[], Any])
-
-[case testRedefineFunctionDefinedAsVariableWithVariance1]
-class B: pass
-class C(B): pass
-def g(x: C) -> B: pass
-f = g
-if g(C()):
-    def f(x: C) -> C: pass
-
-[case testRedefineFunctionDefinedAsVariableWithVariance2]
-class B: pass
-class C(B): pass
-def g(x: C) -> B: pass
-f = g
-if g(C()):
-    def f(x: B) -> B: pass
-
-[case testRedefineFunctionDefinedAsVariableInitializedToEmptyList]
-f = [] # E: Need type annotation for variable
-if object():
-    def f(): pass # E: Incompatible redefinition
-f()
-f(1)
-[builtins fixtures/list.pyi]
-
-
--- Conditional method definition
--- -----------------------------
-
-
-[case testTypeCheckBodyOfConditionalMethod]
-from typing import Any
-x = None # type: Any
-class A:
-    if x:
-        def f(self, x: int) -> None:
-            x = 1
-            x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[out]
-
-[case testCallConditionalMethodInClassBody]
-from typing import Any
-x = None # type: Any
-class A:
-    if x:
-        def f(self, x: int) -> None:  pass
-        f(x, 1)
-        f(x, 'x') # E: Argument 2 to "f" of "A" has incompatible type "str"; expected "int"
-    f(x, 1)
-    f(x, 'x') # E: Argument 2 to "f" of "A" has incompatible type "str"; expected "int"
-[out]
-
-[case testCallConditionalMethodViaInstance]
-from typing import Any
-x = None # type: Any
-class A:
-    if x:
-         def f(self, x: int) -> None: pass
-A().f(1)
-A().f('x') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testConditionalMethodDefinitionWithIfElse]
-from typing import Any
-x = None # type: Any
-class A:
-    if x:
-        def f(self, x: int) -> None:
-            x = 'x'   # fail
-            x = 1
-    else:
-        def f(self, x: int) -> None:
-            x + 'x'   # fail
-            x = 1
-A().f(1)
-A().f('x') # fail
-[out]
-main:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:10: error: Unsupported operand types for + ("int" and "str")
-main:13: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testUnconditionalRedefinitionOfConditionalMethod]
-from typing import Any
-x = None # type: Any
-class A:
-    if x:
-        def f(self): pass
-    def f(self): pass # E: Name 'f' already defined
-
-[case testIncompatibleConditionalMethodDefinition]
-from typing import Any
-x = None # type: Any
-class A:
-    if x:
-        def f(self, x: int) -> None: pass
-    else:
-        def f(self, x): pass # E: All conditional function variants must have identical signatures
-[out]
-
-[case testConditionalFunctionDefinitionInTry]
-import typing
-try:
-    def f(x: int) -> None: pass
-except:
-    def g(x: str) -> None: pass
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-g('x')
-g(1) # E: Argument 1 to "g" has incompatible type "int"; expected "str"
-
-
--- Callable[..., T]
--- ----------------
-
-
-[case testCallableWithArbitraryArgs]
-from typing import Callable
-def f(x: Callable[..., int]) -> None:
-    x()
-    x(1)
-    x(z=1)
-    x() + '' # E: Unsupported operand types for + ("int" and "str")
-[out]
-
-[case testCallableWithArbitraryArgs2]
-from typing import Callable
-def f(x: Callable[..., int]) -> None:
-    x(*[1], **{'x': 2})
-[builtins fixtures/dict.pyi]
-
-[case testCastWithCallableAndArbitraryArgs]
-from typing import Callable, cast
-f = cast(Callable[..., int], None)
-f(x=4) + '' # E: Unsupported operand types for + ("int" and "str")
-
-[case testCallableWithArbitraryArgsInErrorMessage]
-from typing import Callable
-def f(x: Callable[..., int]) -> None:
-    x = 1  # E: Incompatible types in assignment (expression has type "int", variable has type Callable[..., int])
-[out]
-
-[case testCallableWithArbitraryArgsInGenericFunction]
-from typing import Callable, TypeVar
-T = TypeVar('T')
-def f(x: Callable[..., T]) -> T: pass
-def g(*x: int) -> str: pass
-x = f(g)
-x + 1 # E: Unsupported left operand type for + ("str")
-[builtins fixtures/list.pyi]
-
-[case testCallableWithArbitraryArgsSubtyping]
-from typing import Callable
-def f(x: Callable[..., int]) -> None: pass
-def g1(): pass
-def g2(x, y) -> int: pass
-def g3(*, y: str) -> int: pass
-def g4(*, y: int) -> str: pass
-f(g1)
-f(g2)
-f(g3)
-f(g4) # E: Argument 1 to "f" has incompatible type Callable[[NamedArg('y', int)], str]; expected Callable[..., int]
-
-[case testCallableWithArbitraryArgsSubtypingWithGenericFunc]
-from typing import Callable, TypeVar
-T = TypeVar('T')
-def f(x: Callable[..., int]) -> None: pass
-def g1(x: T) -> int: pass
-def g2(*x: T) -> int: pass
-def g3(*x: T) -> T: pass
-f(g1)
-f(g2)
-f(g3)
-
--- (...) -> T
--- ----------------
-[case testEllipsisWithArbitraryArgsOnBareFunction]
-def f(x, y, z): # type: (...) -> None
-    pass
-f(1, "hello", [])
-f(x=1, y="hello", z=[])
-[builtins fixtures/dict.pyi]
-
-[case testEllipsisWithArbitraryArgsOnBareFunctionWithDefaults]
-def f(x, y=1, z="hey"): # type: (...) -> None
-    pass
-f(1, "hello", [])
-f(x=1, y="hello", z=[])
-[builtins fixtures/dict.pyi]
-
-[case testEllipsisWithArbitraryArgsOnBareFunctionWithKwargs]
-from typing import Dict
-def f(x, **kwargs): # type: (...) -> None
-    success_dict_type = kwargs # type: Dict[str, str]
-    failure_dict_type = kwargs # type: Dict[int, str] # E: Incompatible types in assignment (expression has type Dict[str, Any], variable has type Dict[int, str])
-f(1, thing_in_kwargs=["hey"])
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testEllipsisWithArbitraryArgsOnBareFunctionWithVarargs]
-from typing import Tuple, Any
-def f(x, *args): # type: (...) -> None
-    success_tuple_type = args # type: Tuple[Any, ...]
-    fail_tuple_type = args # type: None # E: Incompatible types in assignment (expression has type Tuple[Any, ...], variable has type None)
-f(1, "hello")
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testEllipsisWithArbitraryArgsOnInstanceMethod]
-class A:
-    def f(self, x, y, z): # type: (...) -> None
-        pass
-
-[case testEllipsisWithArbitraryArgsOnClassMethod]
-class A:
-    @classmethod
-    def f(cls, x, y, z): # type: (...) -> None
-        pass
-[builtins fixtures/classmethod.pyi]
-
-[case testEllipsisWithArbitraryArgsOnStaticMethod]
-class A:
-    @staticmethod
-    def f(x, y, z): # type: (...) -> None
-        pass
-[builtins fixtures/staticmethod.pyi]
-
-[case testEllipsisWithSomethingAfterItFails]
-def f(x, y, z): # type: (..., int) -> None
-    pass
-[out]
-main:1: error: Parse error before ): Ellipses cannot accompany other argument types in function type signature.
-
-[case testEllipsisWithSomethingBeforeItFails]
-def f(x, y, z): # type: (int, ...) -> None
-    pass
-[out]
-main:1: error: Parse error before ): Ellipses cannot accompany other argument types in function type signature.
-
-[case testRejectCovariantArgument]
-from typing import TypeVar, Generic
-
-t = TypeVar('t', covariant=True)
-class A(Generic[t]):
-    def foo(self, x: t) -> None:
-        return None
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Cannot use a covariant type variable as a parameter
-
-[case testRejectContravariantReturnType]
-from typing import TypeVar, Generic
-
-t = TypeVar('t', contravariant=True)
-class A(Generic[t]):
-    def foo(self) -> t:
-        return None
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Cannot use a contravariant type variable as return type
-
-[case testAcceptCovariantReturnType]
-from typing import TypeVar, Generic
-
-t = TypeVar('t', covariant=True)
-class A(Generic[t]):
-    def foo(self) -> t:
-        return None
-[builtins fixtures/bool.pyi]
-[case testAcceptContravariantArgument]
-from typing import TypeVar, Generic
-
-t = TypeVar('t', contravariant=True)
-class A(Generic[t]):
-    def foo(self, x: t) -> None:
-        return None
-[builtins fixtures/bool.pyi]
-
-
--- Redefining functions
--- --------------------
-
-
-[case testRedefineFunction]
-def f(x) -> Any: pass
-def g(x, y): pass
-def h(x): pass
-def j(y) -> Any: pass
-f = h
-f = j # E: Incompatible types in assignment (expression has type Callable[[Arg('y', Any)], Any], variable has type Callable[[Arg('x', Any)], Any])
-f = g # E: Incompatible types in assignment (expression has type Callable[[Any, Any], Any], variable has type Callable[[Any], Any])
-
-[case testRedefineFunction2]
-def f() -> None: pass
-def f() -> None: pass # E: Name 'f' already defined
-
-
--- Special cases
--- -------------
-
-
-[case testFunctionDefinitionWithForStatement]
-for _ in [1]:
-    def f(): pass
-else:
-    def g(): pass
-f()
-g()
-[builtins fixtures/list.pyi]
-
-[case testFunctionDefinitionWithWhileStatement]
-while bool():
-    def f(): pass
-else:
-    def g(): pass
-f()
-g()
-[builtins fixtures/bool.pyi]
-
-[case testBareCallable]
-from typing import Callable, Any
-
-def foo(f: Callable) -> bool:
-    return f()
-
-def f1() -> bool:
-    return False
-
-foo(f1)
-[builtins fixtures/bool.pyi]
-
-[case testFunctionNestedWithinWith]
-from typing import Any
-a = 1  # type: Any
-with a:
-    def f() -> None:
-        pass
-    f(1) # E: Too many arguments for "f"
-
-
-[case testNameForDecoratorMethod]
-from typing import Callable
-
-class A:
-    def f(self) -> None:
-        # In particular, test that the error message contains "g" of "A".
-        self.g() # E: Too few arguments for "g" of "A"
-        self.g(1)
-    @dec
-    def g(self, x: str) -> None: pass
-
-def dec(f: Callable[[A, str], None]) -> Callable[[A, int], None]: pass
-[out]
-
-[case testUnknownFunctionNotCallable]
-def f() -> None:
-    pass
-def g(x: int) -> None:
-    pass
-h = f if bool() else g
-reveal_type(h) # E: Revealed type is 'builtins.function'
-h(7) # E: Cannot call function of unknown type
-[builtins fixtures/bool.pyi]
-
--- Positional-only arguments
--- -------------------------
-
-[case testPositionalOnlyArg]
-def f(__a: int) -> None: pass
-
-f(1)
-f(__a=1) # E: Unexpected keyword argument "__a" for "f"
-
-[builtins fixtures/bool.pyi]
-[out]
-main:1: note: "f" defined here
-
-[case testPositionalOnlyArgFastparse]
-# flags: --fast-parser
-
-def f(__a: int) -> None: pass
-
-f(1)
-f(__a=1) # E: Unexpected keyword argument "__a" for "f"
-
-[builtins fixtures/bool.pyi]
-[out]
-main:3: note: "f" defined here
-
-[case testMagicMethodPositionalOnlyArg]
-class A(object):
-    def __eq__(self, other) -> bool: return True # We are all equal.
-
-a = A()
-a.__eq__(a)
-a.__eq__(other=a) # E: Unexpected keyword argument "other" for "__eq__" of "A"
-
-[builtins fixtures/bool.pyi]
-
-[case testMagicMethodPositionalOnlyArgFastparse]
-# flags: --fast-parser
-
-class A(object):
-    def __eq__(self, other) -> bool: return True # We are all equal.
-
-a = A()
-a.__eq__(a)
-a.__eq__(other=a) # E: Unexpected keyword argument "other" for "__eq__" of "A"
-
-[builtins fixtures/bool.pyi]
-
-[case testTupleArguments]
-# flags: --python-version 2.7
-
-def f(a, (b, c), d): pass
-
-[case testTupleArgumentsFastparse]
-# flags: --fast-parser --python-version 2.7
-
-def f(a, (b, c), d): pass
diff --git a/test-data/unit/check-generic-subtyping.test b/test-data/unit/check-generic-subtyping.test
deleted file mode 100644
index 46df3c9..0000000
--- a/test-data/unit/check-generic-subtyping.test
+++ /dev/null
@@ -1,749 +0,0 @@
--- Test cases for the type checker related to subtyping and inheritance with
--- generics.
-
-
--- Subtyping + inheritance
--- -----------------------
-
-
-[case testSubtypingAndInheritingNonGenericTypeFromGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ac = None # type: A[C]
-ad = None # type: A[D]
-b = None # type: B
-
-b = ad # E: Incompatible types in assignment (expression has type A[D], variable has type "B")
-ad = b # E: Incompatible types in assignment (expression has type "B", variable has type A[D])
-b = ac # E: Incompatible types in assignment (expression has type A[C], variable has type "B")
-
-b = b
-ac = b
-
-class C: pass
-class A(Generic[T]): pass
-class B(A[C]): pass
-class D: pass
-
-[case testSubtypingAndInheritingGenericTypeFromNonGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a = None # type: A
-bc = None # type: B[C]
-bd = None # type: B[D]
-
-bc = bd # E: Incompatible types in assignment (expression has type B[D], variable has type B[C])
-bd = bc # E: Incompatible types in assignment (expression has type B[C], variable has type B[D])
-bc = a  # E: Incompatible types in assignment (expression has type "A", variable has type B[C])
-bd = a  # E: Incompatible types in assignment (expression has type "A", variable has type B[D])
-
-a = bc
-a = bd
-
-class A: pass
-class B(A, Generic[T]): pass
-class C: pass
-class D: pass
-
-[case testSubtypingAndInheritingGenericTypeFromGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-ac = None # type: A[C]
-ad = None # type: A[D]
-bcc = None # type: B[C, C]
-bdc = None # type: B[D, C]
-
-ad = bcc # E: Incompatible types in assignment (expression has type B[C, C], variable has type A[D])
-ad = bdc # E: Incompatible types in assignment (expression has type B[D, C], variable has type A[D])
-bcc = ac # E: Incompatible types in assignment (expression has type A[C], variable has type B[C, C])
-bdc = ac # E: Incompatible types in assignment (expression has type A[C], variable has type B[D, C])
-
-bcc = bcc
-bdc = bdc
-ac = bcc
-ac = bdc
-
-class A(Generic[T]): pass
-class B(A[S], Generic[T, S]): pass
-class C: pass
-class D: pass
-
-[case testSubtypingAndInheritingGenericTypeFromGenericTypeAcrossHierarchy]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-X = TypeVar('X')
-Y = TypeVar('Y')
-ae = None # type: A[A[E]]
-af = None # type: A[A[F]]
-
-cef = None # type: C[E, F]
-cff = None # type: C[F, F]
-cfe = None # type: C[F, E]
-
-ae = cef # E: Incompatible types in assignment (expression has type C[E, F], variable has type A[A[E]])
-af = cfe # E: Incompatible types in assignment (expression has type C[F, E], variable has type A[A[F]])
-
-ae = cfe
-af = cef
-af = cff
-
-class A(Generic[T]): pass
-class B(A[S], Generic[T, S]): pass
-class C(B[A[X], A[Y]], Generic[X, Y]): pass
-class E: pass
-class F: pass
-
-[case testIncludingBaseClassTwice]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class I(Generic[t]): pass
-class A(I[C], I[object]): pass # E: Duplicate base class "I"
-class C: pass
-
-
--- Accessing inherited generic members
--- -----------------------------------
-
-
-[case testAccessingMethodInheritedFromGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-b = None # type: B[C, D]
-c, d = None, None # type: (C, D)
-
-b.f(c) # E: Argument 1 to "f" of "A" has incompatible type "C"; expected "D"
-b.f(d)
-
-class A(Generic[T]):
-    def f(self, a: T) -> None:
-        pass
-class B(A[S], Generic[T, S]): pass
-class C: pass
-class D: pass
-
-[case testAccessingMethodInheritedFromGenericTypeInNonGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-b, c, d = None, None, None # type: (B, C, D)
-
-b.f(c) # E: Argument 1 to "f" of "A" has incompatible type "C"; expected "D"
-b.f(d)
-
-class C: pass
-class D: pass
-class A(Generic[T]):
-    def f(self, a: T) -> None:
-        pass
-class B(A[D]): pass
-
-[case testAccessingMemberVarInheritedFromGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class A(Generic[T]):
-    def __init__(self, a: T) -> None:
-        self.a = a
-
-b = None # type: B[C, D]
-c, d = None, None # type: (C, D)
-
-b.a = c # E: Incompatible types in assignment (expression has type "C", variable has type "D")
-b.a = d
-
-class B(A[S], Generic[T, S]): pass
-class C: pass
-class D: pass
-
-
--- Overriding with generic types
--- -----------------------------
-
-
-[case testOverridingMethodInSimpleTypeInheritingGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class B(Generic[T]):
-    def f(self, a: T) -> None: pass
-    def g(self, a: T) -> None: pass
-class C: pass
-class D: pass
-class A(B[C]):
-    def f(self, a: D) -> None: pass \
-        # E: Argument 1 of "f" incompatible with supertype "B"
-    def g(self, a: C) -> None: pass
-[out]
-
-[case testOverridingMethodInGenericTypeInheritingSimpleType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class C: pass
-class B:
-    def f(self, a: C) -> None: pass
-    def g(self, a: C) -> None: pass
-class A(B, Generic[T]):
-    def f(self, a: T) -> None: pass \
-        # E: Argument 1 of "f" incompatible with supertype "B"
-    def g(self, a: 'C') -> None: pass
-[out]
-
-[case testOverridingMethodInGenericTypeInheritingGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class B(Generic[T]):
-    def f(self, a: T) -> None: pass
-    def g(self, a: T) -> None: pass
-class A(B[S], Generic[T, S]):
-    def f(self, a: T) -> None: pass \
-        # E: Argument 1 of "f" incompatible with supertype "B"
-    def g(self, a: S) -> None: pass
-[out]
-
-[case testOverridingMethodInMultilevelHierarchyOfGenericTypes]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-U = TypeVar('U')
-V = TypeVar('V')
-
-class D: pass
-class C(Generic[T, U, V]):
-    def f(self, a: V) -> None: pass
-    def g(self, a: V) -> None: pass
-class B(C[D, D, T], Generic[T]): pass
-class A(B[S], Generic[T, S]):
-    def f(self, a: T) -> None: pass \
-        # E: Argument 1 of "f" incompatible with supertype "C"
-    def g(self, a: S) -> None: pass
-[out]
-
-[case testOverrideGenericMethodInNonGenericClass]
-from typing import TypeVar
-
-T = TypeVar('T')
-S = TypeVar('S')
-
-class A:
-    def f(self, x: T, y: S) -> None: pass
-class B(A):
-    def f(self, x: S, y: T) -> None: pass
-class C(A):
-    # Okay, because T = object allows any type for the arguments.
-    def f(self, x: T, y: T) -> None: pass
-
-[case testOverrideGenericMethodInNonGenericClassLists]
-from typing import TypeVar, List
-
-T = TypeVar('T')
-S = TypeVar('S')
-
-class A:
-    def f(self, x: List[T], y: List[S]) -> None: pass
-class B(A):
-    def f(self, x: List[S], y: List[T]) -> None: pass
-class C(A):
-    def f(self, x: List[T], y: List[T]) -> None: pass # E: Signature of "f" incompatible with supertype "A"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testOverrideGenericMethodInNonGenericClassGeneralize]
-from typing import TypeVar
-
-T = TypeVar('T')
-T1 = TypeVar('T1', bound=str)
-S = TypeVar('S')
-
-class A:
-    def f(self, x: int, y: S) -> None: pass
-class B(A):
-    def f(self, x: T, y: S) -> None: pass
-class C(A):
-    def f(self, x: T, y: str) -> None: pass
-class D(A):
-    def f(self, x: T1, y: S) -> None: pass # TODO: This error could be more specific.
-[out]
-main:12: error: Argument 2 of "f" incompatible with supertype "A"
-main:14: error: Signature of "f" incompatible with supertype "A"
-
-
--- Inheritance from generic types with implicit dynamic supertype
--- --------------------------------------------------------------
-
-
-[case testInheritanceFromGenericWithImplicitDynamicAndSubtyping]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a = None # type: A
-bc = None # type: B[C]
-bd = None # type: B[D]
-
-a = bc # E: Incompatible types in assignment (expression has type B[C], variable has type "A")
-bc = a
-bd = a
-
-class B(Generic[T]): pass
-class A(B): pass
-class C: pass
-class D: pass
-[out]
-
-[case testInheritanceFromGenericWithImplicitDynamicAndExternalAccess]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-
-class B(Generic[T]):
-    def f(self, a: 'B[T]') -> None: pass
-    def __init__(self, x: 'B[T]') -> None:
-        self.x = x
-class A(B): pass
-class C: pass
-
-a = None # type: A
-c = None # type: C
-bc = None # type: B[C]
-
-a.x = c # E: Incompatible types in assignment (expression has type "C", variable has type B[Any])
-a.f(c)  # E: Argument 1 to "f" of "B" has incompatible type "C"; expected B[Any]
-a.x = bc
-a.f(bc)
-[out]
-
-[case testInheritanceFromGenericWithImplicitDynamic]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a = None # type: A
-c = None # type: C
-bc = None # type: B[C]
-
-class B(Generic[T]):
-  def f(self, a: 'B[T]') -> None: pass
-  def __init__(self, x: 'B[T]') -> None:
-    self.x = x
-
-class A(B):
-  def g(self) -> None:
-    self.x = c # E: Incompatible types in assignment (expression has type "C", variable has type B[Any])
-    self.f(c)  # E: Argument 1 to "f" of "B" has incompatible type "C"; expected B[Any]
-    self.x = bc
-    self.f(bc)
-
-class C: pass
-[out]
-
-[case testInheritanceFromGenericWithImplicitDynamicAndOverriding]
-from typing import TypeVar, Generic, Tuple
-T = TypeVar('T')
-class B(Generic[T]):
-    def f(self, a: T, b: 'Tuple[T, B[T]]') -> None:
-        pass
-class A(B):
-    def f(self, a, b): pass
-[builtins fixtures/tuple.pyi]
-[out]
-
-
--- Inheritance from generic types and super expressions
--- ----------------------------------------------------
-
-
-[case testSuperExpressionsWhenInheritingFromGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class B(Generic[T]):
-    def f(self, a: T) -> None: pass
-class A(B[S], Generic[T, S]):
-    def g(self, t: T, s: S) -> None:
-        super().f(t)   # E: Argument 1 to "f" of "B" has incompatible type "T"; expected "S"
-        super().f(s)
-[out]
-
-[case testSuperExpressionsWhenInheritingFromGenericTypeAndDeepHierarchy]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-U = TypeVar('U')
-V = TypeVar('V')
-class C(Generic[T, U, V]):
-    def f(self, a: V) -> None: pass
-class D: pass
-class B(C[D, D, T], Generic[T]): pass
-class A(B[S], Generic[T, S]):
-    def g(self, t: T, s: S) -> None:
-        super().f(t)   # E: Argument 1 to "f" of "C" has incompatible type "T"; expected "S"
-        super().f(s)
-[out]
-
-
--- Type of inherited constructor
--- -----------------------------
-
-
-[case testInheritedConstructor]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
-    def __init__(self, x: T) -> None: pass
-class B(A[T], Generic[T]): pass
-class C(A[int]): pass
-class D(A[A[T]], Generic[T]): pass
-B(1)
-C(1)
-C('a')  # E: Argument 1 to "C" has incompatible type "str"; expected "int"
-D(A(1))
-D(1)  # E: Argument 1 to "D" has incompatible type "int"; expected A[None]
-
-
-[case testInheritedConstructor2]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-U = TypeVar('U')
-Z = TypeVar('Z')
-class A(Generic[T, U]):
-    def __init__(self, x: T, y: U, z: Z) -> None: pass
-class B(A[int, T], Generic[T]): pass
-class C(B[A[T, str]], Generic[T, U]): pass
-# C[T, U] <: B[A[T, str]] <: A[int, A[T, str]]
-C(1, A(1, 'a', 0), 'z')
-C(1, A('1', 'a', 0), 'z')
-C('1', A(1, 'a', 0), 'z')  # E: Argument 1 to "C" has incompatible type "str"; expected "int"
-C(1, A(1, 1, 0), 'z')  # E: Argument 2 to "A" has incompatible type "int"; expected "str"
-
-
--- Subtyping with a generic abstract base class
--- --------------------------------------------
-
-
-[case testSubtypingWithGenericTypeSubclassingGenericAbstractClass]
-from typing import TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-S = TypeVar('S')
-acd = None # type: A[C, D]
-adc = None # type: A[D, C]
-ic = None # type: I[C]
-id = None # type: I[D]
-
-ic = acd # E: Incompatible types in assignment (expression has type A[C, D], variable has type I[C])
-id = adc # E: Incompatible types in assignment (expression has type A[D, C], variable has type I[D])
-adc = ic # E: Incompatible types in assignment (expression has type I[C], variable has type A[D, C])
-
-ic = adc
-id = acd
-
-class I(Generic[T]):
-    @abstractmethod
-    def f(self): pass
-class A(I[S], Generic[T, S]): pass
-class C: pass
-class D: pass
-
-[case testSubtypingWithTypeImplementingGenericABCViaInheritance]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-a, b = None, None # type: (A, B)
-ic, id, ie = None, None, None # type: (I[C], I[D], I[E])
-
-class I(Generic[S]): pass
-class B(I[C]): pass
-class A(B): pass
-
-ie = a # E: Incompatible types in assignment (expression has type "A", variable has type I[E])
-a = ic # E: Incompatible types in assignment (expression has type I[C], variable has type "A")
-a = id # E: Incompatible types in assignment (expression has type I[D], variable has type "A")
-a = b  # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-id = a # E: Incompatible types in assignment (expression has type "A", variable has type I[D])
-
-ic = a
-b = a
-
-class C: pass
-class D: pass
-class E: pass
-[out]
-
-[case testSubtypingWithTypeImplementingGenericABCViaInheritance2-skip]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class I(Generic[T]): pass
-class A(I[C]): pass
-class B(A, I[D]): pass # Fail
-
-class C: pass
-class D: pass
-[out]
-main:5: error: Class "B" has base "I" duplicated inconsistently
-
-[case testSubtypingAndABCExtension]
-from typing import TypeVar, Generic
-from abc import abstractmethod, ABCMeta
-t = TypeVar('t')
-a, i, j = None, None, None # type: (A[object], I[object], J[object])
-(ii, jj) = (i, j)
-ii = a
-jj = a
-jj = i
-a = i # E: Incompatible types in assignment (expression has type I[object], variable has type A[object])
-a = j # E: Incompatible types in assignment (expression has type J[object], variable has type A[object])
-
-class J(Generic[t]): pass
-class X(metaclass=ABCMeta): pass
-class I(X, J[t], Generic[t]): pass
-class A(I[t], Generic[t]): pass
-
-
--- Subclassing a generic ABC
--- -------------------------
-
-
-[case testSubclassingGenericABC1]
-from typing import TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-class I(Generic[T]):
-    @abstractmethod
-    def f(self, a: T) -> None: pass
-    @abstractmethod
-    def g(self, a: T) -> None: pass
-class A(I[C]):
-    def f(self, a: 'D') -> None: pass \
-        # E: Argument 1 of "f" incompatible with supertype "I"
-    def g(self, a: 'C') -> None: pass
-class C: pass
-class D: pass
-[out]
-
-
--- Extending a generic ABC with deep type hierarchy
--- ------------------------------------------------
-
-
-[case testSubclassingGenericABCWithDeepHierarchy]
-from typing import Any, TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-a = None # type: A
-ic, id = None, None # type: (I[C], I[D])
-
-id = a # Fail
-ic = a
-
-class I(Generic[T]):
-    @abstractmethod
-    def f(self, a: T, b: T) -> None: pass
-    @abstractmethod
-    def g(self, a: T, b: 'D') -> None: pass
-class B(I[C]):
-    def f(self, a: 'C', b: 'C') -> None: pass
-    def g(self, a: 'C', b: Any) -> None: pass
-class A(B):
-    def g(self, a: 'C', b: 'C') -> None: pass \
-        # E: Argument 2 of "g" incompatible with supertype "I"
-    def f(self, a: 'C', b: 'C') -> None: pass
-class C: pass
-class D: pass
-[out]
-main:7: error: Incompatible types in assignment (expression has type "A", variable has type I[D])
-
-[case testSubclassingGenericABCWithDeepHierarchy2]
-from typing import Any, TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-class I(Generic[T]):
-    @abstractmethod
-    def f(self, a: T, b: T) -> None: pass
-class B(I[C]):
-    def f(self, a: 'C', b: Any) -> None: pass
-class A(B):
-    def f(self, a: 'C', b: 'D') -> None: pass \
-        # E: Argument 2 of "f" incompatible with supertype "I"
-class C: pass
-class D: pass
-[out]
-
-
--- Implicit Any types and subclassing generic ABC
--- ----------------------------------------------
-
-
-[case testSubclassingGenericABCWithImplicitAny]
-from typing import Any, TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-a = None # type: Any
-ic = None # type: I[C]
-id = None # type: I[D]
-
-ic = a
-id = a
-
-class I(Generic[T]):
-    @abstractmethod
-    def f(self, a: T) -> None: pass
-class A(I):
-    def f(self, a): pass
-
-class C: pass
-class D: pass
-
-[case testSubclassingGenericABCWithImplicitAnyAndDeepHierarchy]
-from typing import Any, TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-a = None # type: Any
-ic = None # type: I[C]
-id = None # type: I[D]
-
-ic = a
-id = a
-
-class I(Generic[T]):
-    @abstractmethod
-    def f(self, a: T, b: T) -> None: pass
-class B(I):
-    def f(self, a, b): pass
-class A(B):
-    def f(self, a: 'C', b: 'D') -> None: pass
-class C: pass
-class D: pass
-
-[case testImplementingGenericABCWithImplicitAnyAndDeepHierarchy2]
-from typing import Any, TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-a = None # type: Any
-jc = None # type: J[C]
-jd = None # type: J[D]
-
-jc = a
-jd = a
-
-class J(Generic[T]):
-    @abstractmethod
-    def f(self, a: T, b: T) -> None: pass
-class I(J):
-    @abstractmethod
-    def f(self, a, b): pass
-class A(I):
-    def f(self, a: 'C', b: 'D') -> None: pass
-
-class C: pass
-class D: pass
-
-
--- Accessing generic ABC members
--- -----------------------------
-
-
-[case testAccessingGenericABCMembers]
-from typing import TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-class I(Generic[T]):
-    @abstractmethod
-    def f(self, a: T) -> None: pass
-class A: pass
-class B: pass
-
-a, b = None, None # type: (A, B)
-ia = None # type: I[A]
-
-ia.f(b)  # E: Argument 1 to "f" of "I" has incompatible type "B"; expected "A"
-ia.f(a)
-
-[case testAccessingInheritedGenericABCMembers]
-from typing import TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-class J(Generic[T]):
-    @abstractmethod
-    def f(self, a: T) -> None: pass
-class I(J[T], Generic[T]): pass
-class A: pass
-class B: pass
-a, b = None, None # type: (A, B)
-ia = None # type: I[A]
-
-ia.f(b)  # E: Argument 1 to "f" of "J" has incompatible type "B"; expected "A"
-ia.f(a)
-
-
--- Misc
--- ----
-
-
-[case testMultipleAssignmentAndGenericSubtyping]
-from typing import Iterable
-n, s = None, None # type: int, str
-class Nums(Iterable[int]):
-    def __iter__(self): pass
-    def __next__(self): pass
-n, n = Nums()
-s, s = Nums() # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Variance
--- --------
-
-
-[case testCovariant]
-from typing import TypeVar, Generic
-True = 1
-
-T = TypeVar('T', covariant=True)
-
-class G(Generic[T]): pass
-class A: pass
-class B(A): pass
-class C(B): pass
-
-a = None  # type: G[A]
-b = None  # type: G[B]
-c = None  # type: G[C]
-
-b = a  # E: Incompatible types in assignment (expression has type G[A], variable has type G[B])
-b = c
-[out]
-
-[case testContravariant]
-from typing import TypeVar, Generic
-True = 1
-
-T = TypeVar('T', contravariant=True)
-
-class G(Generic[T]): pass
-class A: pass
-class B(A): pass
-class C(B): pass
-
-a = None  # type: G[A]
-b = None  # type: G[B]
-c = None  # type: G[C]
-
-b = a
-b = c  # E: Incompatible types in assignment (expression has type G[C], variable has type G[B])
-[out]
-
-[case testInvariant]
-from typing import TypeVar, Generic
-True = 1
-
-T = TypeVar('T')  # invariant (default)
-
-class G(Generic[T]): pass
-class A: pass
-class B(A): pass
-class C(B): pass
-
-a = None  # type: G[A]
-b = None  # type: G[B]
-c = None  # type: G[C]
-
-b = a  # E: Incompatible types in assignment (expression has type G[A], variable has type G[B])
-b = c  # E: Incompatible types in assignment (expression has type G[C], variable has type G[B])
-[out]
diff --git a/test-data/unit/check-generics.test b/test-data/unit/check-generics.test
deleted file mode 100644
index 225d66f..0000000
--- a/test-data/unit/check-generics.test
+++ /dev/null
@@ -1,1419 +0,0 @@
--- Simple generic types
--- --------------------
-
-
-[case testGenericMethodReturnType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a, b, c = None, None, None # type: (A[B], B, C)
-c = a.f() # Fail
-b = a.f()
-
-class A(Generic[T]):
-    def f(self) -> T: pass
-
-class B: pass
-class C: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "C")
-
-[case testGenericMethodArgument]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a.f(c) # Fail
-a.f(b)
-
-a = None # type: A[B]
-b = None # type: B
-c = None # type: C
-
-class A(Generic[T]):
-    def f(self, a: T) -> None: pass
-
-class B: pass
-class C: pass
-[out]
-main:3: error: Argument 1 to "f" of "A" has incompatible type "C"; expected "B"
-
-[case testGenericMemberVariable]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
-    def __init__(self, v: T) -> None:
-        self.v = v
-
-a, b, c = None, None, None # type: (A[B], B, C)
-a.v = c # Fail
-a.v = b
-
-class B: pass
-class C: pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-[case testGenericMemberVariable]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a, b, c = None, None, None # type: (A[B], B, C)
-a.v = c # Fail
-a.v = b
-
-class A(Generic[T]):
-    v = None # type: T
-class B: pass
-class C: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-[case testSimpleGenericSubtyping]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-b, bb, c = None, None, None # type: (A[B], A[B], A[C])
-c = b # Fail
-b = c # Fail
-
-b = b
-b = bb
-
-class A(Generic[T]): pass
-class B: pass
-class C(B): pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type A[B], variable has type A[C])
-main:5: error: Incompatible types in assignment (expression has type A[C], variable has type A[B])
-
-[case testGenericTypeCompatibilityWithAny]
-from typing import Any, TypeVar, Generic
-T = TypeVar('T')
-b, c, d = None, None, None # type: (A[B], A[C], A[Any])
-
-b = d
-c = d
-d = b
-d = c
-
-class A(Generic[T]): pass
-class B: pass
-class C(B): pass
-[out]
-
-[case testTypeVariableAsTypeArgument]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a = None # type: A[B]
-b = None # type: A[B]
-c = None # type: A[C]
-
-a.v = c # Fail
-c = a.v # Fail
-a.v = b
-b = a.v
-
-class A(Generic[T]):
-    v = None # type: A[T]
-
-class B: pass
-class C: pass
-[out]
-main:7: error: Incompatible types in assignment (expression has type A[C], variable has type A[B])
-main:8: error: Incompatible types in assignment (expression has type A[B], variable has type A[C])
-
-[case testMultipleGenericTypeParametersWithMemberVars]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-a = None # type: A[B, C]
-s = None # type: B
-t = None # type: C
-
-t = a.s # Fail
-s = a.t # Fail
-
-s = a.s
-t = a.t
-
-class A(Generic[S, T]):
-    s = None # type: S
-    t = None # type: T
-class B: pass
-class C: pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "B", variable has type "C")
-main:9: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-[case testMultipleGenericTypeParametersWithMethods]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-a = None # type: A[B, C]
-s = None # type: B
-t = None # type: C
-
-a.f(s, s) # Fail
-a.f(t, t) # Fail
-a.f(s, t)
-
-class A(Generic[S, T]):
-    def f(self, s: S, t: T) -> None: pass
-class B: pass
-class C: pass
-[out]
-main:8: error: Argument 2 to "f" of "A" has incompatible type "B"; expected "C"
-main:9: error: Argument 1 to "f" of "A" has incompatible type "C"; expected "B"
-
-[case testMultipleGenericTypeParametersAndSubtyping]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-bc = None # type: A[B, C]
-bb = None # type: A[B, B]
-cb = None # type: A[C, B]
-
-bb = bc # Fail
-bb = cb # Fail
-bc = bb # Fail
-
-bb = bb
-bc = bc
-
-class A(Generic[S, T]):
-    s = None # type: S
-    t = None # type: T
-
-class B: pass
-class C(B):pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type A[B, C], variable has type A[B, B])
-main:9: error: Incompatible types in assignment (expression has type A[C, B], variable has type A[B, B])
-main:10: error: Incompatible types in assignment (expression has type A[B, B], variable has type A[B, C])
-
-
--- Simple generic type bodies
--- --------------------------
-
-
-[case testGenericTypeBody1]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
-    a = None # type: T
-
-    def f(self, b: T) -> T:
-        self.f(x)     # Fail
-        d = self # type: A[B] # Fail
-        self.a = self.f(self.a)
-        return self.a
-        c = self # type: A[T]
-x = None # type: B
-class B: pass
-[out]
-main:7: error: Argument 1 to "f" of "A" has incompatible type "B"; expected "T"
-main:8: error: Incompatible types in assignment (expression has type A[T], variable has type A[B])
-
-[case testGenericTypeBodyWithMultipleVariables]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-class A(Generic[S, T]):
-    def f(self) -> None:
-        s = None # type: S
-        t = None # type: T
-        s = t # Fail
-        t = s # Fail
-        a = self # type: A[S, B] # Fail
-        b = self # type: A[T, T] # Fail
-        c = self # type: A[S, T]
-        t = t
-
-class B: pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "T", variable has type "S")
-main:9: error: Incompatible types in assignment (expression has type "S", variable has type "T")
-main:10: error: Incompatible types in assignment (expression has type A[S, T], variable has type A[S, B])
-main:11: error: Incompatible types in assignment (expression has type A[S, T], variable has type A[T, T])
-
-[case testCompatibilityOfNoneWithTypeVar]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
-    def f(self) -> None:
-        a = None # type: T
-        a = None
-[out]
-
-[case testCompatibilityOfTypeVarWithObject]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
-    def f(self) -> T:
-        a = object() # type: T  # Fail
-        a = object()    # Fail
-        b = self.f() # type: object
-        b = self.f()
-[out]
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "T")
-main:6: error: Incompatible types in assignment (expression has type "object", variable has type "T")
-
-
--- Operations with generic types
--- -----------------------------
-
-
-[case testGenericOperations]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-a = None # type: A[B, C]
-b = None # type: B
-c = None # type: C
-
-b = a + b # Fail
-c = a + c # Fail
-c = a[c]  # Fail
-b = a[b]  # Fail
-
-c = a + b
-b = a[c]
-
-class A(Generic[S, T]):
-    def __add__(self, a: S) -> T: pass
-    def __getitem__(self, i: T) -> S: pass
-
-class B: pass
-class C: pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-main:9: error: Unsupported operand types for + ("A" and "C")
-main:10: error: Incompatible types in assignment (expression has type "B", variable has type "C")
-main:11: error: Invalid index type "B" for "A"; expected type "C"
-
-[case testOperatorAssignmentWithIndexLvalue1]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-b = None # type: B
-c = None # type: C
-ac = None # type: A[C]
-
-ac[b] += b # Fail
-ac[c] += c # Fail
-ac[b] += c
-ac[b] = ac[b] + c
-
-class A(Generic[T]):
-    def __getitem__(self, i: 'B') -> T: pass
-    def __setitem__(self, i: 'B', v: T) -> None: pass
-
-class B: pass
-class C:
-    def __add__(self, o: 'C') -> 'C': pass
-[out]
-main:7: error: Unsupported operand types for + ("C" and "B")
-main:7: error: Incompatible types in assignment (expression has type "B", target has type "C")
-main:8: error: Invalid index type "C" for "A"; expected type "B"
-
-[case testOperatorAssignmentWithIndexLvalue2]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-b = None # type: B
-c = None # type: C
-ac = None # type: A[C]
-
-ac[b] += c        # Fail
-ac[c] += c        # Fail
-ac[b] = ac[b] + c # Fail
-
-class A(Generic[T]):
-    def __getitem__(self, i: 'B') -> T: pass
-    def __setitem__(self, i: 'C', v: T) -> None: pass
-
-class B: pass
-class C:
-    def __add__(self, o: 'C') -> 'C': pass
-[out]
-main:7: error: Invalid index type "B" for "A"; expected type "C"
-main:8: error: Invalid index type "C" for "A"; expected type "B"
-main:9: error: Invalid index type "B" for "A"; expected type "C"
-
-
--- Nested generic types
--- --------------------
-
-
-[case testNestedGenericTypes]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-aab = None # type: A[A[B]]
-aac = None # type: A[A[C]]
-ab = None # type: A[B]
-ac = None # type: A[C]
-
-ac = aab.x # Fail
-ac.y = aab # Fail
-
-ab = aab.x
-ac = aac.x
-ab.y = aab
-ac.y = aac
-
-class A(Generic[T]):
-    x = None # type: T
-    y = None # type: A[A[T]]
-
-class B:
-    pass
-class C:
-    pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type A[B], variable has type A[C])
-main:9: error: Incompatible types in assignment (expression has type A[A[B]], variable has type A[A[C]])
-
-
--- Generic functions
--- -----------------
-
-
-[case testTypeCheckingGenericFunctionBody]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-class A: pass
-class p(Generic[T, S]):
-    def __init__(self, t: T, a: S) -> None: pass
-def f(s: S, t: T) -> p[T, A]:
-    a = t # type: S # E: Incompatible types in assignment (expression has type "T", variable has type "S")
-    s = t           # E: Incompatible types in assignment (expression has type "T", variable has type "S")
-    p_s_a = None  # type: p[S, A]
-    if s:
-        return p_s_a # E: Incompatible return value type (got p[S, A], expected p[T, A])
-    b = t # type: T
-    c = s # type: S
-    p_t_a = None  # type: p[T, A]
-    return p_t_a
-[out]
-
-[case testTypeCheckingGenericMethodBody]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class p(Generic[T, S]):
-    def __init__(self, t: T, a: S) -> None: pass
-class A(Generic[T]):
-    def f(self, s: S, t: T) -> p[S, T]:
-        s = t # E: Incompatible types in assignment (expression has type "T", variable has type "S")
-        p_s_s = None  # type: p[S, S]
-        if s:
-            return p_s_s # E: Incompatible return value type (got p[S, S], expected p[S, T])
-        p_t_t = None  # type: p[T, T]
-        if t:
-            return p_t_t # E: Incompatible return value type (got p[T, T], expected p[S, T])
-        t = t
-        s = s
-        p_s_t = None  # type: p[S, T]
-        return p_s_t
-[out]
-
-[case testProhibitTypeApplicationToGenericFunctions]
-from typing import TypeVar
-T = TypeVar('T')
-def f(x: T) -> T: pass
-
-y = f[int]  # E: Type application is only supported for generic classes
-[out]
-
-
--- Generic types in expressions
--- ----------------------------
-
-
-[case testTypeApplicationArgs]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class Node(Generic[T]):
-    def __init__(self, x: T) -> None:
-        ...
-Node[int]()  # E: Too few arguments for "Node"
-Node[int](1, 1, 1)  # E: Too many arguments for "Node"
-[out]
-
-[case testTypeApplicationTvars]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class A(Generic[T, S]): pass
-A[int]()  # E: Type application has too few types (2 expected)
-A[int, str, int]() # E: Type application has too many types (2 expected)
-[out]
-
-[case testInvalidTypeApplicationType]
-a = None # type: A
-class A: pass
-a[A]()  # E: Value of type "A" is not indexable
-A[A]()  # E: Type application targets a non-generic function or class
-[out]
-
-[case testTypeApplicationArgTypes]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class Node(Generic[T]):
-    def __init__(self, x: T) -> None:
-        ...
-
-Node[int](1)
-Node[int]('a')  # E: Argument 1 to "Node" has incompatible type "str"; expected "int"
-
-class Dummy(Generic[T]):
-    def meth(self, x: T) -> None:
-        ...
-    def methout(self) -> T:
-        ...
-
-Dummy[int]().meth(1)
-Dummy[int]().meth('a')  # E: Argument 1 to "meth" of "Dummy" has incompatible type "str"; expected "int"
-reveal_type(Dummy[int]())  # E: Revealed type is '__main__.Dummy[builtins.int*]'
-reveal_type(Dummy[int]().methout())  # E: Revealed type is 'builtins.int*'
-[out]
-
-[case testTypeApplicationArgTypesSubclasses]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class C(Generic[T, S]):
-    def __init__(self, x: T, y: S) -> None:
-        ...
-
-class D(C[int, T], Generic[T]): ...
-
-D[str](1, 'a')
-D[str](1, 1)  # E: Argument 2 to "D" has incompatible type "int"; expected "str"
-
-class E(D[str]): ...
-E(1, 'a')
-E(1, 1)  # E: Argument 2 to "E" has incompatible type "int"; expected "str"
-[out]
-
-[case testTypeApplicationAlias]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class Node(Generic[T]):
-    def __init__(self, x: T) -> None:
-        ...
-
-Alias = Node
-Alias[int](1)
-Alias[int]("a")  # E: Argument 1 to "Node" has incompatible type "str"; expected "int"
-[out]
-
-[case testTypeApplicationCrash]
-type[int] # this was crashing, see #2302 (comment)  # E: Type application targets a non-generic function or class
-[out]
-
-
--- Generic type aliases
--- --------------------
-
-[case testGenericTypeAliasesBasic]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
-    def __init__(self, x: T, y: S) -> None:
-        ...
-
-IntNode = Node[int, S]
-IntIntNode = Node[int, int]
-SameNode = Node[T, T]
-
-n = Node(1, 1) # type: IntIntNode
-n1 = Node(1, 'a') # type: IntIntNode # E: Argument 2 to "Node" has incompatible type "str"; expected "int"
-
-m = Node(1, 1) # type: IntNode
-m1 = Node('x', 1) # type: IntNode # E: Argument 1 to "Node" has incompatible type "str"; expected "int"
-m2 = Node(1, 1) # type: IntNode[str] # E: Argument 2 to "Node" has incompatible type "int"; expected "str"
-
-s = Node(1, 1) # type: SameNode[int]
-reveal_type(s) # E: Revealed type is '__main__.Node[builtins.int, builtins.int]'
-s1 = Node(1, 'x') # type: SameNode[int] # E: Argument 2 to "Node" has incompatible type "str"; expected "int"
-
-[out]
-
-[case testGenericTypeAliasesBasic2]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
-    def __init__(self, x: T, y: S) -> None:
-        ...
-
-IntNode = Node[int, S]
-IntIntNode = Node[int, int]
-SameNode = Node[T, T]
-
-def output_bad() -> IntNode[str]:
-    return Node(1, 1) # Eroor - bad return type, see out
-
-def input(x: IntNode[str]) -> None:
-    pass
-input(Node(1, 's'))
-input(Node(1, 1)) # E: Argument 2 to "Node" has incompatible type "int"; expected "str"
-
-def output() -> IntNode[str]:
-    return Node(1, 'x')
-reveal_type(output()) # E: Revealed type is '__main__.Node[builtins.int, builtins.str]'
-
-def func(x: IntNode[T]) -> IntNode[T]:
-    return x
-reveal_type(func) # E: Revealed type is 'def [T] (x: __main__.Node[builtins.int, T`-1]) -> __main__.Node[builtins.int, T`-1]'
-
-func(1) # E: Argument 1 to "func" has incompatible type "int"; expected Node[int, None]
-func(Node('x', 1)) # E: Argument 1 to "Node" has incompatible type "str"; expected "int"
-reveal_type(func(Node(1, 'x'))) # E: Revealed type is '__main__.Node[builtins.int, builtins.str*]'
-
-def func2(x: SameNode[T]) -> SameNode[T]:
-    return x
-reveal_type(func2) # E: Revealed type is 'def [T] (x: __main__.Node[T`-1, T`-1]) -> __main__.Node[T`-1, T`-1]'
-
-func2(Node(1, 'x')) # E: Cannot infer type argument 1 of "func2"
-y = func2(Node('x', 'x'))
-reveal_type(y) # E: Revealed type is '__main__.Node[builtins.str*, builtins.str*]'
-
-def wrap(x: T) -> IntNode[T]:
-    return Node(1, x)
-
-z = None # type: str
-reveal_type(wrap(z)) # E: Revealed type is '__main__.Node[builtins.int, builtins.str*]'
-
-[out]
-main:13: error: Argument 2 to "Node" has incompatible type "int"; expected "str"
-
-[case testGenericTypeAliasesWrongAliases]
-# flags: --show-column-numbers --fast-parser --python-version 3.6
-from typing import TypeVar, Generic, List, Callable, Tuple, Union
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
-    def __init__(self, x: T, y: S) -> None:
-        ...
-
-A = Node[T] # Error
-B = Node[T, T]
-C = Node[T, T, T] # Error
-D = Node[T, S]
-E = Node[Node[T, T], List[T]]
-
-F = Node[List[T, T], S] # Error
-G = Callable[..., List[T, T]] # Error
-H = Union[int, Tuple[T, Node[T]]] # Error
-h: H # Error
-h1: H[int, str] # Error
-
-x = None # type: D[int, str]
-reveal_type(x)
-y = None # type: E[int]
-reveal_type(y)
-
-X = T # Error
-
-[builtins fixtures/list.pyi]
-[out]
-main:9:4: error: "Node" expects 2 type arguments, but 1 given
-main:11:4: error: "Node" expects 2 type arguments, but 3 given
-main:15:9: error: "list" expects 1 type argument, but 2 given
-main:16:18: error: "list" expects 1 type argument, but 2 given
-main:17:24: error: "Node" expects 2 type arguments, but 1 given
-main:18:3: error: "Node" expects 2 type arguments, but 1 given
-main:19:4: error: Bad number of arguments for type alias, expected: 1, given: 2
-main:22:0: error: Revealed type is '__main__.Node[builtins.int, builtins.str]'
-main:24:0: error: Revealed type is '__main__.Node[__main__.Node[builtins.int, builtins.int], builtins.list[builtins.int]]'
-main:26:4: error: Type variable "__main__.T" is invalid as target for type alias
-
-[case testGenericTypeAliasesForAliases]
-from typing import TypeVar, Generic, List, Union
-T = TypeVar('T')
-S = TypeVar('S')
-
-class Node(Generic[T, S]):
-    def __init__(self, x: T, y: S) -> None:
-        pass
-
-ListedNode = Node[List[T], List[S]]
-Second = ListedNode[int, T]
-Third = Union[int, Second[str]]
-
-def f2(x: T) -> Second[T]:
-    return Node([1], [x])
-reveal_type(f2('a')) # E: Revealed type is '__main__.Node[builtins.list[builtins.int], builtins.list[builtins.str*]]'
-
-def f3() -> Third:
-    return Node([1], ['x'])
-reveal_type(f3()) # E: Revealed type is 'Union[builtins.int, __main__.Node[builtins.list[builtins.int], builtins.list[builtins.str]]]'
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesAny]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
-    def __init__(self, x: T, y: S) -> None:
-        self.x = x
-        self.y = y
-
-IntNode = Node[int, S]
-AnyNode = Node[S, T]
-
-def output() -> IntNode[str]:
-    return Node(1, 'x')
-x = output() # type: IntNode # This is OK (implicit Any)
-
-y = None # type: IntNode
-y.x = 1
-y.x = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-y.y = 1 # Both are OK (implicit Any)
-y.y = 'x'
-
-z = Node(1, 'x') # type: AnyNode
-reveal_type(z) # E: Revealed type is '__main__.Node[Any, Any]'
-
-[out]
-
-[case testGenericTypeAliasesAcessingMethods]
-from typing import TypeVar, Generic, List
-T = TypeVar('T')
-class Node(Generic[T]):
-    def __init__(self, x: T) -> None:
-        self.x = x
-    def meth(self) -> T:
-        return self.x
-
-ListedNode = Node[List[T]]
-l = None # type: ListedNode[int]
-l.x.append(1)
-l.meth().append(1)
-reveal_type(l.meth()) # E: Revealed type is 'builtins.list*[builtins.int]'
-l.meth().append('x') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-
-ListedNode[str]([]).x = 1 # E: Incompatible types in assignment (expression has type "int", variable has type List[str])
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesSubclassing]
-from typing import TypeVar, Generic, Tuple, List
-T = TypeVar('T')
-class Node(Generic[T]):
-    def __init__(self, x: T) -> None:
-        ...
-
-TupledNode = Node[Tuple[T, T]]
-
-class D(Generic[T], TupledNode[T]):
-    ...
-class L(Generic[T], List[TupledNode[T]]):
-    ...
-
-def f_bad(x: T) -> D[T]:
-    return D(1)  # Error, see out
-
-L[int]().append(Node((1, 1)))
-L[int]().append(5) # E: Argument 1 to "append" of "list" has incompatible type "int"; expected Node[Tuple[int, int]]
-
-x = D((1, 1)) # type: D[int]
-y = D(5) # type: D[int] # E: Argument 1 to "D" has incompatible type "int"; expected "Tuple[int, int]"
-
-def f(x: T) -> D[T]:
-    return D((x, x))
-reveal_type(f('a'))  # E: Revealed type is '__main__.D[builtins.str*]'
-
-[builtins fixtures/list.pyi]
-[out]
-main:15: error: Argument 1 to "D" has incompatible type "int"; expected "Tuple[T, T]"
-
-[case testGenericTypeAliasesSubclassingBad]
-from typing import TypeVar, Generic, Tuple, Union
-T = TypeVar('T')
-class Node(Generic[T]):
-    def __init__(self, x: T) -> None:
-        ...
-
-TupledNode = Node[Tuple[T, T]]
-UNode = Union[int, Node[T]]
-
-class C(TupledNode): ... # Same as TupledNode[Any]
-class D(TupledNode[T]): ... # E: Invalid type "__main__.T"
-class E(Generic[T], UNode[T]): ... # E: Invalid base class
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesUnion]
-from typing import TypeVar, Generic, Union, Any
-T = TypeVar('T')
-class Node(Generic[T]):
-    def __init__(self, x: T) -> None:
-        self.x = x
-
-UNode = Union[int, Node[T]]
-x = 1 # type: UNode[int]
-
-x + 1 # E: Unsupported left operand type for + (some union)
-if not isinstance(x, Node):
-    x + 1
-
-if not isinstance(x, int):
-   x.x = 1
-   x.x = 'a' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-def f(x: T) -> UNode[T]:
-    if 1:
-        return Node(x)
-    else:
-        return 1
-
-reveal_type(f(1)) # E: Revealed type is 'Union[builtins.int, __main__.Node[builtins.int*]]'
-
-TNode = Union[T, Node[int]]
-s = 1 # type: TNode[str] # E: Incompatible types in assignment (expression has type "int", variable has type "Union[str, Node[int]]")
-
-if not isinstance(s, str):
-    s.x = 1
-
-z = None # type: TNode # Same as TNode[Any]
-z.x
-z.foo() # Any simplifies Union to Any now. This test should be updated after #2197
-
-[builtins fixtures/isinstance.pyi]
-
-[case testGenericTypeAliasesTuple]
-from typing import TypeVar, Tuple
-T = TypeVar('T')
-
-SameTP = Tuple[T, T]
-IntTP = Tuple[int, T]
-
-def f1(x: T) -> SameTP[T]:
-    return x, x
-
-a, b, c = f1(1) # E: Need more than 2 values to unpack (3 expected)
-x, y = f1(1)
-reveal_type(x) # E: Revealed type is 'builtins.int'
-
-def f2(x: IntTP[T]) -> IntTP[T]:
-    return x
-
-f2((1, 2, 3)) # E: Argument 1 to "f2" has incompatible type "Tuple[int, int, int]"; expected "Tuple[int, None]"
-reveal_type(f2((1, 'x'))) # E: Revealed type is 'Tuple[builtins.int, builtins.str*]'
-
-[builtins fixtures/for.pyi]
-
-[case testGenericTypeAliasesCallable]
-from typing import TypeVar, Generic, Callable
-T = TypeVar('T')
-class Node(Generic[T]):
-    def __init__(self, x: T) -> None:
-        ...
-
-BadC = Callable[T] # E: Invalid function type
-
-C = Callable[..., T]
-C2 = Callable[[T, T], Node[T]]
-
-def make_cb(x: T) -> C[T]:
-    return lambda *args: x
-
-reveal_type(make_cb(1)) # E: Revealed type is 'def (*Any, **Any) -> builtins.int*'
-
-def use_cb(arg: T, cb: C2[T]) -> Node[T]:
-    return cb(arg, arg)
-
-use_cb(1, 1) # E: Argument 2 to "use_cb" has incompatible type "int"; expected Callable[[int, int], Node[int]]
-my_cb = None # type: C2[int]
-use_cb('x', my_cb) # E: Argument 2 to "use_cb" has incompatible type Callable[[int, int], Node[int]]; expected Callable[[str, str], Node[str]]
-reveal_type(use_cb(1, my_cb)) # E: Revealed type is '__main__.Node[builtins.int]'
-
-[out]
-
-[case testGenericTypeAliasesPEPBasedExample]
-from typing import TypeVar, List, Tuple
-T = TypeVar('T', int, bool)
-
-Vec = List[Tuple[T, T]]
-
-vec = []  # type: Vec[bool]
-vec.append('x') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "Tuple[bool, bool]"
-reveal_type(vec[0]) # E: Revealed type is 'Tuple[builtins.bool, builtins.bool]'
-
-def fun1(v: Vec[T]) -> T:
-    return v[0][0]
-def fun2(v: Vec[T], scale: T) -> Vec[T]:
-    return v
-
-reveal_type(fun1([(1, 1)])) # E: Revealed type is 'builtins.int*'
-fun1(1) # E: Argument 1 to "fun1" has incompatible type "int"; expected List[Tuple[int, int]]
-fun1([(1, 'x')]) # E: Cannot infer type argument 1 of "fun1"
-
-reveal_type(fun2([(1, 1)], 1)) # E: Revealed type is 'builtins.list[Tuple[builtins.int*, builtins.int*]]'
-fun2([('x', 'x')], 'x') # E: Type argument 1 of "fun2" has incompatible value "str"
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesImporting]
-from typing import TypeVar
-from a import Node, TupledNode
-T = TypeVar('T')
-
-n = None # type: TupledNode[int]
-n.x = 1
-n.y = (1, 1)
-n.y = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "Tuple[int, int]")
-
-def f(x: Node[T, T]) -> TupledNode[T]:
-    return Node(x.x, (x.x, x.x))
-
-f(1) # E: Argument 1 to "f" has incompatible type "int"; expected Node[None, None]
-f(Node(1, 'x')) # E: Cannot infer type argument 1 of "f"
-reveal_type(Node('x', 'x')) # E: Revealed type is 'a.Node[builtins.str*, builtins.str*]'
-
-[file a.py]
-from typing import TypeVar, Generic, Tuple
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
-    def __init__(self, x: T, y: S) -> None:
-        self.x = x
-        self.y = y
-
-TupledNode = Node[T, Tuple[T, T]]
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesRuntimeExpressionsInstance]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
-    def __init__(self, x: T, y: S) -> None:
-        ...
-
-IntNode = Node[int, T]
-IntNode[int](1, 1)
-IntNode[int](1, 'a')  # E: Argument 2 to "Node" has incompatible type "str"; expected "int"
-
-SameNode = Node[T, T]
-ff = SameNode[T](1, 1)  # E: Need type annotation for variable
-a = SameNode(1, 'x')
-reveal_type(a) # E: Revealed type is '__main__.Node[Any, Any]'
-b = SameNode[int](1, 1)
-reveal_type(b) # E: Revealed type is '__main__.Node[builtins.int*, builtins.int*]'
-SameNode[int](1, 'x') # E: Argument 2 to "Node" has incompatible type "str"; expected "int"
-
-[out]
-
-[case testGenericTypeAliasesRuntimeExpressionsOther]
-from typing import TypeVar, Union, Tuple, Callable, Any
-T = TypeVar('T')
-
-CA = Callable[[T], int]
-TA = Tuple[T, int]
-UA = Union[T, int]
-
-cs = CA[str] + 1 # E: Unsupported left operand type for + ("Type alias to Callable")
-reveal_type(cs) # E: Revealed type is 'Any'
-
-ts = TA[str]() # E: "Type alias to Tuple" not callable
-reveal_type(ts) # E: Revealed type is 'Any'
-
-us = UA[str].x # E: "Type alias to Union" has no attribute "x"
-reveal_type(us) # E: Revealed type is 'Any'
-
-[out]
-
-[case testGenericTypeAliasesTypeVarBinding]
-from typing import TypeVar, Generic, List
-T = TypeVar('T')
-S = TypeVar('S')
-
-class A(Generic[T, S]):
-    def __init__(self, x: T, y: S) -> None: ...
-
-class B(Generic[T, S]):
-    def __init__(self, x: List[T], y: List[S]) -> None: ...
-
-SameA = A[T, T]
-SameB = B[T, T]
-
-class C(Generic[T]):
-    a = None # type: SameA[T]
-    b = SameB[T]([], [])
-
-reveal_type(C[int]().a) # E: Revealed type is '__main__.A[builtins.int*, builtins.int*]'
-reveal_type(C[str]().b) # E: Revealed type is '__main__.B[builtins.str*, builtins.str*]'
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesTypeVarConstraints]
-# flags: --show-column-numbers
-from typing import TypeVar, Generic
-T = TypeVar('T', int, list)
-S = TypeVar('S', int, list)
-
-class A(Generic[T, S]):
-    def __init__(self, x: T, y: S) -> None: ...
-
-BadA = A[str, T]  # One error here
-SameA = A[T, T]
-
-x = None # type: SameA[int]
-y = None # type: SameA[str] # Two errors here, for both args of A
-
-[builtins fixtures/list.pyi]
-[out]
-main:9:7: error: Type argument 1 of "A" has incompatible value "str"
-main:13: error: Type argument 1 of "A" has incompatible value "str"
-main:13: error: Type argument 2 of "A" has incompatible value "str"
-
-[case testGenericTypeAliasesIgnoredPotentialAlias]
-class A: ...
-Bad = A[int] # type: ignore
-
-reveal_type(Bad) # E: Revealed type is 'Any'
-[out]
-
-
--- Multiple assignment with lists
--- ------------------------------
-
-
-[case testMultipleAssignmentWithLists]
-from typing import List
-class A: pass
-class B: pass
-class B2(B): pass
-a = None # type: A
-b = None # type: B
-b2 = None # type: B2
-
-list_a = [a]
-list_b = [b]
-list_b2 = [b2]
-
-a, b = list_a   # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b, a = list_a   # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b2, b2 = list_b # E: Incompatible types in assignment (expression has type "B", variable has type "B2")
-
-a, a = list_a
-b, b2, b = list_b2
-[builtins fixtures/for.pyi]
-
-[case testMultipleAssignmentWithListsInInitialization]
-from typing import List
-class A: pass
-list_object = [object()]
-list_a = [A()]
-a, b = list_object # type: (A, object) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-c, d = list_object # type: (object, A) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-e, f = list_a # type: (A, object)
-[builtins fixtures/for.pyi]
-
-[case testMultipleAssignmentWithListAndIndexing]
-from typing import List
-a = None # type: List[A]
-b = None # type: List[int]
-
-a[1], b[1] = a # E: Incompatible types in assignment (expression has type "A", target has type "int")
-a[1], a[2] = a
-
-class A: pass
-[file builtins.py]
-from typing import TypeVar, Generic, Iterable
-T = TypeVar('T')
-class object: pass
-class list(Iterable[T], Generic[T]):
-  def __setitem__(self, x: int, v: T) -> None: pass
-class int: pass
-class type: pass
-class tuple: pass
-class function: pass
-class str: pass
-
-[case testMultipleAssignmentWithIterable]
-from typing import Iterable, TypeVar
-a = None  # type: int
-b = None  # type: str
-T = TypeVar('T')
-
-def f(x: T) -> Iterable[T]: pass
-
-a, b = f(a)   # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-b, b = f(a)   # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-a, a = f(a)
-b, b = f(b)
-[builtins fixtures/for.pyi]
-
-
--- Error messages
--- --------------
-
-
-[case testErrorWithLongGenericTypeName]
-from typing import TypeVar, Generic
-B = TypeVar('B')
-C = TypeVar('C')
-D = TypeVar('D')
-E = TypeVar('E')
-F = TypeVar('F')
-G = TypeVar('G')
-H = TypeVar('H')
-I = TypeVar('I')
-J = TypeVar('J')
-K = TypeVar('K')
-L = TypeVar('L')
-M = TypeVar('M')
-N = TypeVar('N')
-O = TypeVar('O')
-P = TypeVar('P')
-Q = TypeVar('Q')
-R = TypeVar('R')
-S = TypeVar('S')
-T = TypeVar('T')
-U = TypeVar('U')
-V = TypeVar('V')
-W = TypeVar('W')
-X = TypeVar('X')
-Y = TypeVar('Y')
-Z = TypeVar('Z')
-class OO: pass
-a = None # type: A[object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object]
-
-f(a) # E: Argument 1 to "f" has incompatible type A[...]; expected "OO"
-
-def f(a: OO) -> None:
-    pass
-class A(Generic[B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]): pass
-
-[case testErrorWithShorterGenericTypeName]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-a = None # type: A[object, B]
-f(a) # E: Argument 1 to "f" has incompatible type A[object, B]; expected "B"
-
-def f(a: 'B') -> None: pass
-class A(Generic[S, T]): pass
-class B: pass
-
-[case testErrorWithShorterGenericTypeName2]
-from typing import Callable, TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-a = None # type: A[object, Callable[[], None]]
-f(a) # E: Argument 1 to "f" has incompatible type A[object, Callable[[], None]]; expected "B"
-
-def f(a: 'B') -> None: pass
-class A(Generic[S, T]): pass
-class B: pass
-
-
--- Overloads + generics
--- --------------------
-
-
-[case testGenericArgumentInOverload]
-from typing import overload, List
-class A: pass
-class B: pass
-a, b = None, None # type: (A, B)
-
- at overload
-def f(a: List[A]) -> A: pass
- at overload
-def f(a: B) -> B: pass
-
-b = f([a]) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f([b]) # E: List item 0 has incompatible type "B"
-a = f(b)   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-a = f([a])
-b = f(b)
-[builtins fixtures/list.pyi]
-
-[case testGenericFunctionAsOverloadItem]
-from typing import overload, TypeVar, List
-T = TypeVar('T')
-class A: pass
-class B: pass
-
- at overload
-def f(a: B) -> B: pass
- at overload
-def f(a: List[T]) -> T: pass
-
-a, b = None, None # type: (A, B)
-
-b = f([a]) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f([b]) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = f(b)   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-a = f([a])
-b = f([b])
-b = f(b)
-[builtins fixtures/list.pyi]
-
-
--- Type variable scoping
--- ---------------------
-
-
-[case testLocalTypeVariable]
-from typing import TypeVar
-def f() -> None:
-    T = TypeVar('T')
-    def g(x: T) -> T: pass
-    a = g(1)
-    a = 1
-    a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[out]
-
-[case testClassLevelTypeVariable]
-from typing import TypeVar
-class A:
-    T = TypeVar('T')
-    def g(self, x: T) -> T: pass
-a = A().g(1)
-a = 1
-a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testGenericClassInnerFunctionTypeVariable]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
-    def __init__(self, a: T) -> None:
-        self.a = a
-    def f(self, n: int) -> None:
-        def g(a: T):
-            self.a = a
-        g(self.a)
-        g(n) # E: Argument 1 to "g" has incompatible type "int"; expected "T"
-[out]
-
-
--- Callable subtyping with generic functions
--- -----------------------------------------
-
-
-[case testSubtypingWithGenericFunctions]
-from typing import TypeVar
-A = TypeVar('A')
-B = TypeVar('B')
-
-def f1(x: A) -> A: ...
-def f2(x: A) -> B: ...
-def f3(x: B) -> B: ...
-def f4(x: int) -> A: ...
-
-y1 = f1
-y1 = f1
-y1 = f2
-y1 = f3
-y1 = f4 # E: Incompatible types in assignment (expression has type Callable[[int], A], variable has type Callable[[A], A])
-
-y2 = f2
-y2 = f2
-y2 = f1 # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[A], B])
-y2 = f3 # E: Incompatible types in assignment (expression has type Callable[[B], B], variable has type Callable[[A], B])
-y2 = f4 # E: Incompatible types in assignment (expression has type Callable[[int], A], variable has type Callable[[A], B])
-
-y3 = f3
-y3 = f3
-y3 = f1
-y3 = f2
-y3 = f4 # E: Incompatible types in assignment (expression has type Callable[[int], A], variable has type Callable[[B], B])
-
-y4 = f4
-y4 = f4
-y4 = f1 # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[int], A])
-y4 = f2
-y4 = f3 # E: Incompatible types in assignment (expression has type Callable[[B], B], variable has type Callable[[int], A])
-
-[case testSubtypingWithGenericInnerFunctions]
-from typing import TypeVar
-A = TypeVar('A')
-B = TypeVar('B')
-T = TypeVar('T')
-def outer(t: T) -> None:
-    def f1(x: A) -> A: ...
-    def f2(x: A) -> B: ...
-    def f3(x: T) -> A: ...
-    def f4(x: A) -> T: ...
-    def f5(x: T) -> T: ...
-
-    y1 = f1
-    y1 = f2
-    y1 = f3 # E: Incompatible types in assignment (expression has type Callable[[T], A], variable has type Callable[[A], A])
-    y1 = f4 # E: Incompatible types in assignment (expression has type Callable[[A], T], variable has type Callable[[A], A])
-    y1 = f5 # E: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[A], A])
-
-    y2 = f2
-    y2 = f1 # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[A], B])
-
-    y3 = f3
-    y3 = f1 # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[T], A])
-    y3 = f2
-    y3 = f4 # E: Incompatible types in assignment (expression has type Callable[[A], T], variable has type Callable[[T], A])
-    y3 = f5 # E: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[T], A])
-
-    y4 = f4
-    y4 = f1 # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[A], T])
-    y4 = f2
-    y4 = f3 # E: Incompatible types in assignment (expression has type Callable[[T], A], variable has type Callable[[A], T])
-    y4 = f5 # E: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[A], T])
-
-    y5 = f5
-    y5 = f1
-    y5 = f2
-    y5 = f3
-    y5 = f4
-[out]
-
-[case testSubtypingWithGenericFunctionUsingTypevarWithValues]
-from typing import TypeVar, Callable
-T = TypeVar('T', int, str)
-def f(x: T) -> T: pass
-def g1(f: Callable[[str], str]) -> None: pass
-g1(f)
-def g2(f: Callable[[int], int]) -> None: pass
-g2(f)
-def g3(f: Callable[[object], object]) -> None: pass
-g3(f) # E: Argument 1 to "g3" has incompatible type Callable[[T], T]; \
-           expected Callable[[object], object]
-
-[case testSubtypingWithGenericFunctionUsingTypevarWithValues2-skip]
-from typing import TypeVar, Callable
-T = TypeVar('T', int, str)
-def f(x: T) -> T: pass
-g = f
-g = f
-
-
---Operations on type variable types
--- ---------------------------------
-
-
-[case testTypeVariableTypeEquality]
-from typing import TypeVar
-T = TypeVar('T')
-def f(a: T, b: T) -> T:
-    a.__ne__(b)
-    if a == b:
-        return a
-    else:
-        return b
-[builtins fixtures/ops.pyi]
-
-[case testTypeVariableTypeIs]
-from typing import TypeVar
-T = TypeVar('T')
-def f(a: T, b: T) -> T:
-    if a is b or a is 1:
-        return a
-    else:
-        return b
-[builtins fixtures/ops.pyi]
-
-[case testTypeVariableTypeLessThan]
-from typing import TypeVar
-T = TypeVar('T')
-def f(a: T, b: T) -> T:
-    if a < b:
-        return a
-    else:
-        return b
-[builtins fixtures/ops.pyi]
-[out]
-main:4: error: Unsupported left operand type for < ("T")
-
-
--- Subtyping generic callables
--- ---------------------------
-
-[case testSubtypingGenericTypeObject]
-from typing import Callable, Generic, TypeVar
-T = TypeVar('T')
-class C(Generic[T]):
-    def __init__(self) -> None: pass
-x = C # type: Callable[[], C[int]]
-y = C # type: Callable[[], int] # E: Incompatible types in assignment (expression has type C[T], variable has type Callable[[], int])
-
-
--- Special cases
--- -------------
-
-
-[case testIdentityHigherOrderFunction]
-from typing import Callable, TypeVar
-A = TypeVar('A')
-B = TypeVar('B')
-def square(n: int) -> int:
-    return n
-def id(f: Callable[[A], B]) -> Callable[[A], B]:
-    return f
-g = id(square)
-g(1)
-g('x')  # E: Argument 1 has incompatible type "str"; expected "int"
-
-
-[case testIdentityHigherOrderFunction2]
-from typing import Callable, TypeVar
-A = TypeVar('A')
-def voidify(n: int) -> None: pass
-def identity(f: Callable[[A], None]) -> Callable[[A], None]:
-    return f
-identity(voidify)(3)
-
-[case testIdentityHigherOrderFunction3]
-from typing import Callable, TypeVar
-A = TypeVar('A')
-B = TypeVar('B')
-def fn(n: B) -> None: pass
-def identity(f: A) -> A:
-    return f
-identity(fn)
-identity(fn)('x')
-
-[case testTypeVariableUnionAndCallableInTypeInference]
-from typing import Union, Callable, TypeVar
-T = TypeVar('T')
-def f(x: T, y: Union[T, Callable[[T], None]]) -> None: pass
-f('', '')
-
-[case testGenericFunctionsWithUnalignedIds]
-from typing import TypeVar
-A = TypeVar('A')
-B = TypeVar('B')
-def f1(x: int, y: A) -> A: ...
-def f2(x: int, y: A) -> B: ...
-def f3(x: A, y: B) -> B: ...
-g = f1
-g = f2
-g = f3
-
-[case testTypeVariableWithContainerAndTuple]
-from typing import TypeVar, Container
-T = TypeVar('T')
-def f(x: Container[T]) -> T: ...
-reveal_type(f((1, 2))) # E: Revealed type is 'builtins.int*'
-
-[case testClassMethodInGenericClassWithGenericConstructorArg]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
-    def __init__(self, a: T) -> None: pass
-    @classmethod
-    def f(cls) -> None: pass
-[builtins fixtures/classmethod.pyi]
-
-[case testClassMethodInClassWithGenericConstructor]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A:
-    def __init__(self, a: T) -> None: pass
-    @classmethod
-    def f(cls) -> None: pass
-[builtins fixtures/classmethod.pyi]
diff --git a/test-data/unit/check-ignore.test b/test-data/unit/check-ignore.test
deleted file mode 100644
index b6d127c..0000000
--- a/test-data/unit/check-ignore.test
+++ /dev/null
@@ -1,218 +0,0 @@
-[case testIgnoreTypeError]
-x = 1
-x() # type: ignore
-x() # E: "int" not callable
-
-[case testIgnoreUndefinedName]
-x = 1
-y # type: ignore
-z # E: Name 'z' is not defined
-
-[case testIgnoreImportError]
-import xyz_m # type: ignore
-xyz_m.foo
-1() # E: "int" not callable
-
-[case testIgnoreImportFromError]
-from xyz_m import a, b # type: ignore
-a.foo
-b()
-1() # E: "int" not callable
-
-[case testIgnoreImportFromErrorMultiline]
-from xyz_m import ( # type: ignore
-    a, b
-)
-a.foo
-b()
-1() # E: "int" not callable
-
-[case testIgnoreImportAllError]
-from xyz_m import * # type: ignore
-x   # E: Name 'x' is not defined
-1() # E: "int" not callable
-
-[case testIgnoreImportBadModule]
-import m # type: ignore
-from m import a # type: ignore
-[file m.py]
-+
-[out]
-tmp/m.py:1: error: invalid syntax
-
-[case testIgnoreAppliesOnlyToMissing]
-import a # type: ignore
-import b # type: ignore
-reveal_type(a.foo) # E: Revealed type is 'Any'
-reveal_type(b.foo) # E: Revealed type is 'builtins.int'
-a.bar()
-b.bar() # E: "module" has no attribute "bar"
-
-[file b.py]
-foo = 3
-
-[builtins fixtures/module_all.pyi]
-[out]
-
-[case testIgnoreImportStarFromBadModule]
-from m import * # type: ignore
-[file m.py]
-+
-[out]
-tmp/m.py:1: error: invalid syntax
-
-[case testIgnoreAssignmentTypeError]
-x = 1
-x = '' # type: ignore
-x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testIgnoreInvalidOverride]
-class A:
-    def f(self) -> int: pass
-class B(A):
-    def f(self) -> str: pass # type: ignore
-
-[case testIgnoreMissingModuleAttribute]
-import m
-m.x = object # type: ignore
-m.f() # type: ignore
-m.y # E: "module" has no attribute "y"
-[file m.py]
-[builtins fixtures/module.pyi]
-
-[case testIgnoreTypeInferenceError]
-x = [] # type: ignore
-y = x
-x.append(1)
-[builtins fixtures/list.pyi]
-
-[case testIgnoreTypeInferenceError2]
-def f() -> None: pass
-x = f() # type: ignore
-y = x
-x = 1
-[builtins fixtures/list.pyi]
-
-[case testIgnoreTypeInferenceErrorAndMultipleAssignment]
-x, y = [], [] # type: ignore
-z = x
-z = y
-[builtins fixtures/list.pyi]
-
-[case testIgnoreSomeStarImportErrors]
-from m1 import *
-from m2 import * # type: ignore
-# We should still import things that don't conflict.
-y() # E: "str" not callable
-z() # E: "int" not callable
-x() # E: "int" not callable
-[file m1.py]
-x = 1
-y = ''
-[file m2.py]
-x = ''
-z = 1
-
-[case testIgnoredModuleDefinesBaseClass1]
-from m import B # type: ignore
-
-class C(B):
-    def f(self) -> None:
-        self.f(1) # E: Too many arguments for "f" of "C"
-        self.g(1)
-[out]
-
-[case testIgnoredModuleDefinesBaseClass2]
-import m # type: ignore
-
-class C(m.B):
-    def f(self) -> None: ...
-
-c = C()
-c.f(1) # E: Too many arguments for "f" of "C"
-c.g(1)
-c.x = 1
-[out]
-
-[case testIgnoredModuleDefinesBaseClassAndClassAttribute]
-import m # type: ignore
-
-class C(m.B):
-    @staticmethod
-    def f() -> None: pass
-
-C.f(1) # E: Too many arguments for "f" of "C"
-C.g(1)
-C.x = 1
-[builtins fixtures/staticmethod.pyi]
-[out]
-
-[case testIgnoredModuleDefinesBaseClassWithInheritance1]
-from m import B # type: ignore
-
-class C: pass
-class D(C, B):
-    def f(self) -> None:
-        self.f(1) # E: Too many arguments for "f" of "D"
-        self.g(1)
-[out]
-
-[case testIgnoredModuleDefinesBaseClassWithInheritance2]
-from m import B # type: ignore
-
-class C(B): pass
-class D(C):
-    def f(self) -> None:
-        self.f(1) # E: Too many arguments for "f" of "D"
-        self.g(1)
-[out]
-
-[case testIgnoreWithFollowingIndentedComment]
-if 1:  # type: ignore
-    # blah
-    pass
-[out]
-
-[case testIgnoreTooManyTypeArguments]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-U = TypeVar('U')
-
-class Base(Generic[T, U]):
-  pass
-
-class PartialBase(Base[T, int], Generic[T]):
-  pass
-
-class Child(PartialBase[str, int]):  # type: ignore
-  pass
-
-
-def foo(x: Base[str, int]) -> None: pass
-foo(Child())
-
-def bar(x: Base[str, str]) -> None: pass
-bar(Child())
-[out]
-main:19: error: Argument 1 to "bar" has incompatible type "Child"; expected Base[str, str]
-
-[case testTypeIgnoreLineNumberWithinFile]
-import m
-pass # type: ignore
-m.f(kw=1)
-[file m.py]
-pass
-def f() -> None: pass
-[out]
-main:3: error: Unexpected keyword argument "kw" for "f"
-tmp/m.py:2: note: "f" defined here
-
-[case testIgnoreUnexpectedKeywordArgument]
-import m
-m.f(kw=1)  # type: ignore
-[file m.py]
-def f() -> None: pass
-[out]
-
-[case testCannotIgnoreBlockingError]
-yield  # type: ignore  # E: 'yield' outside function
diff --git a/test-data/unit/check-incremental.test b/test-data/unit/check-incremental.test
deleted file mode 100644
index 439d536..0000000
--- a/test-data/unit/check-incremental.test
+++ /dev/null
@@ -1,1780 +0,0 @@
--- Checks for incremental mode (see testcheck.py).
--- Each test is run twice, once with a cold cache, once with a warm cache.
--- Before the tests are run the second time, any *.py.next files are copied to *.py.
---
--- Errors expected in the first run should be in the `[out1]` section, and
--- errors expected in the second run should be in the `[out2]` section. If a
--- section is omitted, it is expected there are no errors on that run.
---
--- Any files that we expect to be rechecked should be annotated in the [rechecked]
--- annotation, and any files expect to be stale (aka have a modified interface)
--- should be annotated in the [stale] annotation. Note that a file that ends up
--- producing an error does not create a new cache file and so is not considered stale.
---
--- The test suite will automatically assume that __main__ is stale and rechecked in
--- all cases so we can avoid constantly having to annotate it. The list of
--- rechecked/stale files can be in any arbitrary order, or can be left empty
--- if no files should be rechecked/stale.
-
-[case testIncrementalEmpty]
-[rechecked]
-[stale]
-
-[case testIncrementalBasics]
-import m
-[file m.py]
-def foo():
-    pass
-[file m.py.next]
-def foo() -> None:
-    pass
-[rechecked m]
-[stale m]
-
-[case testIncrementalError]
-import m
-[file m.py]
-def foo() -> None:
-    pass
-[file m.py.next]
-def foo() -> None:
-    bar()
-[rechecked m]
-[stale]
-[out2]
-tmp/m.py:2: error: Name 'bar' is not defined
-
-[case testIncrementalSimpleImportSequence]
-import mod1
-mod1.func1()
-
-[file mod1.py]
-import mod2
-def func1() -> None: mod2.func2()
-
-[file mod2.py]
-import mod3
-def func2() -> None: mod3.func3()
-
-[file mod3.py]
-def func3() -> None: pass
-
-[rechecked]
-[stale]
-
-
-[case testIncrementalInternalChangeOnly]
-import mod1
-mod1.func1()
-
-[file mod1.py]
-import mod2
-def func1() -> None: mod2.func2()
-
-[file mod2.py]
-import mod3
-def func2() -> None: mod3.func3()
-
-[file mod3.py]
-def func3() -> None: pass
-
-[file mod3.py.next]
-def func3() -> None: 3 + 2
-
-[rechecked mod3]
-[stale]
-
-
-[case testIncrementalImportGone]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-def func1() -> A: pass
-
-[file mod2.py]
-class A: pass
-
-[file mod1.py.next]
-def func1() -> A: pass
-
-[rechecked mod1]
-[stale]
-[out2]
-tmp/mod1.py:1: error: Name 'A' is not defined
-
-[case testIncrementalSameNameChange]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-def func1() -> A: pass
-
-[file mod2.py]
-class A: pass
-
-[file mod2.py.next]
-class Parent: pass
-class A(Parent): pass
-
-[rechecked mod1, mod2]
-[stale mod2]
-
-[case testIncrementalPartialInterfaceChange]
-import mod1
-mod1.func1()
-
-[file mod1.py]
-import mod2
-def func1() -> None: mod2.func2()
-
-[file mod2.py]
-import mod3
-def func2() -> None: mod3.func3()
-
-[file mod3.py]
-def func3() -> None: pass
-
-[file mod3.py.next]
-def func3() -> int: return 2
-
-[rechecked mod2, mod3]
-[stale mod3]
-
-[case testIncrementalInternalFunctionDefinitionChange]
-import mod1
-
-[file mod1.py]
-import mod2
-def accepts_int(a: int) -> int: return a
-accepts_int(mod2.foo())
-
-[file mod2.py]
-def foo() -> int:
-    def inner() -> int:
-        return 42
-    return inner()
-
-[file mod2.py.next]
-def foo() -> int:
-    def inner2() -> str:
-        return "foo"
-    return inner2()
-
-[rechecked mod2]
-[stale]
-[out2]
-tmp/mod2.py:4: error: Incompatible return value type (got "str", expected "int")
-
-[case testIncrementalInternalScramble]
-import mod1
-
-[file mod1.py]
-import mod2
-mod2.foo()
-
-[file mod2.py]
-def baz() -> int:
-    return 3
-
-def bar() -> int:
-    return baz()
-
-def foo() -> int:
-    return bar()
-
-[file mod2.py.next]
-def foo() -> int:
-    return baz()
-
-def bar() -> int:
-    return bar()
-
-def baz() -> int:
-    return 42
-[rechecked mod2]
-[stale]
-
-[case testIncrementalMethodInterfaceChange]
-import mod1
-
-[file mod1.py]
-import mod2
-
-[file mod2.py]
-class Foo:
-    def bar(self, a: str) -> str:
-        return "a"
-
-[file mod2.py.next]
-class Foo:
-    def bar(self, a: float) -> str:
-        return "a"
-
-[rechecked mod1, mod2]
-[stale mod2]
-
-[case testIncrementalBaseClassChange]
-import mod1
-
-[file mod1.py]
-from mod2 import Child
-Child().good_method()
-
-[file mod2.py]
-class Good:
-    def good_method(self) -> int: return 1
-class Bad: pass
-class Child(Good): pass
-
-[file mod2.py.next]
-class Good:
-    def good_method(self) -> int: return 1
-class Bad: pass
-class Child(Bad): pass
-
-[rechecked mod1, mod2]
-[stale mod2]
-[out2]
-tmp/mod1.py:2: error: "Child" has no attribute "good_method"
-
-[case testIncrementalCascadingChange]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-def accepts_int(a: int) -> None: pass
-accepts_int(A)
-
-[file mod2.py]
-from mod3 import B
-A = B
-
-[file mod3.py]
-from mod4 import C
-B = C
-
-[file mod4.py]
-C = 3
-
-[file mod4.py.next]
-C = "A"
-
-[rechecked mod1, mod2, mod3, mod4]
-[stale mod2, mod3, mod4]
-[out2]
-tmp/mod1.py:3: error: Argument 1 to "accepts_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalBrokenCascade]
-import mod1
-
-[file mod1.py]
-import mod2
-def accept_int(a: int) -> int: return a
-accept_int(mod2.mod3.mod4.const)
-
-[file mod2.py]
-import mod3
-
-[file mod3.py]
-import mod4
-
-[file mod4.py]
-const = 3
-
-[file mod3.py.next]
-# Import to mod4 is gone!
-
-[rechecked mod1, mod2, mod3]
-[stale mod3]
-[builtins fixtures/module.pyi]
-[out2]
-tmp/mod1.py:3: error: "module" has no attribute "mod4"
-
-[case testIncrementalLongBrokenCascade]
-import mod1
-
-[file mod1.py]
-import mod2
-def accept_int(a: int) -> int: return a
-accept_int(mod2.mod3.mod4.mod5.mod6.mod7.const)
-
-[file mod2.py]
-import mod3
-
-[file mod3.py]
-import mod4
-
-[file mod4.py]
-import mod5
-
-[file mod5.py]
-import mod6
-
-[file mod6.py]
-import mod7
-
-[file mod7.py]
-const = 3
-
-[file mod6.py.next]
-# Import to mod7 is gone!
-
-[rechecked mod1, mod5, mod6]
-[stale mod6]
-[builtins fixtures/module.pyi]
-[out2]
-tmp/mod1.py:3: error: "module" has no attribute "mod7"
-
-[case testIncrementalNestedBrokenCascade]
-import mod1
-
-[file mod1.py]
-import mod2
-def accept_int(a: int) -> int: return a
-accept_int(mod2.mod3.mod4.const)
-
-[file mod2/__init__.py]
-import mod2.mod3 as mod3
-
-[file mod2/mod3/__init__.py]
-import mod2.mod3.mod4 as mod4
-
-[file mod2/mod3/__init__.py.next]
-# Import is gone!
-
-[file mod2/mod3/mod4.py]
-const = 3
-
-[rechecked mod1, mod2, mod2.mod3]
-[stale mod2.mod3]
-[builtins fixtures/module.pyi]
-[out2]
-tmp/mod1.py:3: error: "module" has no attribute "mod4"
-
-[case testIncrementalNestedBrokenCascadeWithType1]
-import mod1, mod2.mod3.mod5
-
-[file mod1.py]
-import mod2
-def accept_int(x: int) -> None: pass
-def produce() -> mod2.CustomType:
-    return mod2.CustomType()
-a = produce()
-accept_int(a.foo())
-
-[file mod2/__init__.py]
-from mod2.mod3 import CustomType
-
-[file mod2/mod3/__init__.py]
-from mod2.mod3.mod4 import CustomType
-
-[file mod2/mod3/__init__.py.next]
-# Import a different class that also happens to be called 'CustomType'
-from mod2.mod3.mod5 import CustomType
-def produce() -> CustomType:
-    return CustomType()
-
-[file mod2/mod3/mod4.py]
-class CustomType:
-    def foo(self) -> int: return 1
-
-[file mod2/mod3/mod5.py]
-class CustomType:
-    def foo(self) -> str: return "a"
-
-[rechecked mod1, mod2, mod2.mod3]
-[stale mod2, mod2.mod3]
-[builtins fixtures/module.pyi]
-[out1]
-[out2]
-tmp/mod1.py:6: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalNestedBrokenCascadeWithType2]
-import mod1, mod2.mod3.mod5
-
-[file mod1.py]
-from mod2 import produce
-def accept_int(x: int) -> None: pass
-a = produce()
-accept_int(a.foo())
-
-[file mod2/__init__.py]
-from mod2.mod3 import produce
-
-[file mod2/mod3/__init__.py]
-from mod2.mod3.mod4 import CustomType
-def produce() -> CustomType:
-    return CustomType()
-
-[file mod2/mod3/__init__.py.next]
-# Import a different class that also happens to be called 'CustomType'
-from mod2.mod3.mod5 import CustomType
-def produce() -> CustomType:
-    return CustomType()
-
-[file mod2/mod3/mod4.py]
-class CustomType:
-    def foo(self) -> int: return 1
-
-[file mod2/mod3/mod5.py]
-class CustomType:
-    def foo(self) -> str: return "a"
-
-[rechecked mod1, mod2, mod2.mod3]
-[stale mod2.mod3]
-[builtins fixtures/module.pyi]
-[out1]
-[out2]
-tmp/mod1.py:4: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalRemoteChange]
-import mod1
-
-[file mod1.py]
-import mod2
-def accepts_int(a: int) -> None: pass
-accepts_int(mod2.mod3.mod4.const)
-
-[file mod2.py]
-import mod3
-
-[file mod3.py]
-import mod4
-
-[file mod4.py]
-const = 3
-
-[file mod4.py.next]
-const = "foo"
-
-[rechecked mod1, mod3, mod4]
-[stale mod4]
-[out2]
-tmp/mod1.py:3: error: Argument 1 to "accepts_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalBadChange]
-import mod1
-
-[file mod1.py]
-from mod2 import func2
-
-def func1() -> int:
-    return func2()
-
-[file mod2.py]
-def func2() -> int:
-    return 1
-
-[file mod2.py.next]
-def func2() -> str:
-    return "foo"
-
-[rechecked mod1, mod2]
-[stale mod2]
-[out2]
-tmp/mod1.py:4: error: Incompatible return value type (got "str", expected "int")
-
-[case testIncrementalBadChangeWithSave]
-import mod0
-
-[file mod0.py]
-import mod1
-A = mod1.func2()
-
-[file mod1.py]
-from mod2 import func2
-
-def func1() -> int:
-    return func2()
-
-[file mod2.py]
-def func2() -> int:
-    return 1
-
-[file mod2.py.next]
-def func2() -> str:
-    return "foo"
-
-[rechecked mod0, mod1, mod2]
-[stale mod2]
-[out2]
-tmp/mod1.py:4: error: Incompatible return value type (got "str", expected "int")
-
-[case testIncrementalOkChangeWithSave]
-import mod0
-
-[file mod0.py]
-import mod1
-A = mod1.func2()
-
-[file mod1.py]
-from mod2 import func2
-
-def func1() -> int:
-    func2()
-    return 1
-
-[file mod2.py]
-def func2() -> int:
-    return 1
-
-[file mod2.py.next]
-def func2() -> str:
-    return "foo"
-
-[rechecked mod0, mod1, mod2]
-[stale mod0, mod2]
-[out2]
-
-[case testIncrementalWithComplexDictExpression]
-import mod1
-
-[file mod1.py]
-import mod1_private
-
-[file mod1_private.py]
-my_dict = {
-    'a': [1, 2, 3],
-    'b': [4, 5, 6]
-}
-
-[file mod1_private.py.next]
-my_dict = {
-    'a': [1, 2, 3],
-    'b': [4, 5, 'a']
-}
-
-[rechecked mod1, mod1_private]
-[stale mod1_private]
-[builtins fixtures/dict.pyi]
-
-[case testIncrementalWithComplexConstantExpressionNoAnnotation]
-import mod1
-
-[file mod1.py]
-import mod1_private
-
-[file mod1_private.py]
-def foobar() -> int: return 1
-def baz() -> int: return 2
-const = 1 + foobar()
-
-[file mod1_private.py.next]
-def foobar() -> int: return 1
-def baz() -> int: return 2
-const = 1 + baz()
-
-[rechecked mod1_private]
-[stale]
-
-[case testIncrementalWithComplexConstantExpressionWithAnnotation]
-import mod1
-
-[file mod1.py]
-import mod1_private
-
-[file mod1_private.py]
-def foobar() -> int: return 1
-def baz() -> int: return 2
-const = 1 + foobar()  # type: int
-
-[file mod1_private.py.next]
-def foobar() -> int: return 1
-def baz() -> int: return 2
-const = 1 + baz()  # type: int
-
-[rechecked mod1_private]
-[stale]
-
-[case testIncrementalSmall]
-import mod1
-
-[file mod1.py]
-import mod1_private
-def accepts_int(a: int) -> None: pass
-accepts_int(mod1_private.some_func(12))
-
-[file mod1_private.py]
-def some_func(a: int) -> int:
-    return 1
-
-[file mod1_private.py.next]
-def some_func(a: int) -> str:
-    return "a"
-
-[rechecked mod1, mod1_private]
-[stale mod1_private]
-[builtins fixtures/ops.pyi]
-[out2]
-tmp/mod1.py:3: error: Argument 1 to "accepts_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalWithDecorators]
-import mod1
-
-[file mod1.py]
-import mod1_private
-def accepts_int(a: int) -> None: pass
-accepts_int(mod1_private.some_func(12))
-
-[file mod1_private.py]
-from typing import Callable
-def multiply(f: Callable[[int], int]) -> Callable[[int], int]:
-    return lambda a: f(a) * 10
-
-def stringify(f: Callable[[int], int]) -> Callable[[int], str]:
-    return lambda a: str(f(a))
-
- at multiply
-def some_func(a: int) -> int:
-    return a + 2
-
-[file mod1_private.py.next]
-from typing import Callable
-def multiply(f: Callable[[int], int]) -> Callable[[int], int]:
-    return lambda a: f(a) * 10
-
-def stringify(f: Callable[[int], int]) -> Callable[[int], str]:
-    return lambda a: str(f(a))
-
- at stringify
-def some_func(a: int) -> int:
-    return a + 2
-[rechecked mod1, mod1_private]
-[stale mod1_private]
-[builtins fixtures/ops.pyi]
-[out2]
-tmp/mod1.py:3: error: Argument 1 to "accepts_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalChangingClassAttributes]
-import mod1
-
-[file mod1.py]
-import mod2
-mod2.Foo.A
-
-[file mod2.py]
-class Foo:
-    A = 3
-
-[file mod2.py.next]
-class Foo:
-    A = "hello"
-
-[rechecked mod1, mod2]
-[stale mod2]
-
-[case testIncrementalChangingFields]
-import mod1
-
-[file mod1.py]
-import mod2
-f = mod2.Foo()
-f.A
-
-[file mod2.py]
-class Foo:
-    def __init__(self) -> None:
-        self.A = 3
-
-[file mod2.py.next]
-class Foo:
-    def __init__(self) -> None:
-        self.A = "hello"
-
-[rechecked mod1, mod2]
-[stale mod2]
-[out2]
-
-[case testIncrementalChangingFieldsWithAssignment]
-import mod1
-
-[file mod1.py]
-import mod2
-f = mod2.Foo()
-B = f.A
-
-[file mod2.py]
-class Foo:
-    def __init__(self) -> None:
-        self.A = 3
-
-[file mod2.py.next]
-class Foo:
-    def __init__(self) -> None:
-        self.A = "hello"
-
-[rechecked mod1, mod2]
-[stale mod1, mod2]
-
-[case testIncrementalCheckingChangingFields]
-import mod1
-
-[file mod1.py]
-import mod2
-def accept_int(a: int) -> int: return a
-f = mod2.Foo()
-accept_int(f.A)
-
-[file mod2.py]
-class Foo:
-    def __init__(self) -> None:
-        self.A = 3
-
-[file mod2.py.next]
-class Foo:
-    def __init__(self) -> None:
-        self.A = "hello"
-
-[rechecked mod1, mod2]
-[stale mod2]
-[out2]
-tmp/mod1.py:4: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalNestedClassDefinition]
-import mod1
-
-[file mod1.py]
-import mod2
-b = mod2.Foo.Bar()
-b.attr
-
-[file mod2.py]
-class Foo:
-    class Bar:
-        attr = 3
-
-[file mod2.py.next]
-class Foo:
-    class Bar:
-        attr = "foo"
-
-[rechecked mod1, mod2]
-[stale mod2]
-
-[case testIncrementalSimpleBranchingModules]
-import mod1
-import mod2
-
-[file mod1.py]
-def func() -> None: pass
-
-[file mod2.py]
-def func() -> None: pass
-
-[file mod1.py.next]
-def func() -> int: return 1
-
-[rechecked mod1]
-[stale mod1]
-
-[case testIncrementalSubmoduleImport]
-from parent.childA import Foo
-
-def func1() -> Foo:
-    return Foo()
-
-[file parent/__init__.py]
-from parent.childA import Foo
-from parent.childB import Bar
-
-__all__ = ['Foo', 'Bar']
-
-[file parent/childA.py]
-import parent
-
-class Foo:
-    def test(self) -> int:
-        return parent.Bar().test()
-
-[file parent/childB.py]
-class Bar:
-    def test(self) -> int: return 3
-
-[builtins fixtures/module_all.pyi]
-[rechecked]
-[stale]
-
-[case testIncrementalSubmoduleWithAttr]
-import mod.child
-x = mod.child.Foo()
-x.bar()
-
-[file mod/__init__.py]
-
-[file mod/child.py]
-class Foo:
-    def bar(self) -> None: pass
-[builtins fixtures/module.pyi]
-[rechecked]
-[stale]
-
-[case testIncrementalNestedSubmoduleImportFromWithAttr]
-from mod1.mod2 import mod3
-def accept_int(a: int) -> None: pass
-
-accept_int(mod3.val3)
-
-[file mod1/__init__.py]
-val1 = 1
-
-[file mod1/mod2/__init__.py]
-val2 = 1
-
-[file mod1/mod2/mod3.py]
-val3 = 1
-
-[builtins fixtures/module.pyi]
-[rechecked]
-[stale]
-
-[case testIncrementalNestedSubmoduleWithAttr]
-import mod1.mod2.mod3
-def accept_int(a: int) -> None: pass
-
-accept_int(mod1.mod2.mod3.val3)
-accept_int(mod1.mod2.val2)
-accept_int(mod1.val1)
-
-[file mod1/__init__.py]
-val1 = 1
-
-[file mod1/mod2/__init__.py]
-val2 = 1
-
-[file mod1/mod2/mod3.py]
-val3 = 1
-
-[builtins fixtures/module.pyi]
-[rechecked]
-[stale]
-
-[case testIncrementalSubmoduleParentWithImportFrom]
-import parent
-
-[file parent/__init__.py]
-from parent import a
-
-[file parent/a.py]
-val = 3
-
-[builtins fixtures/args.pyi]
-[stale]
-
-[case testIncrementalSubmoduleParentBackreference]
-import parent
-
-[file parent/__init__.py]
-from parent import a
-
-[file parent/a.py]
-import parent.b
-
-[file parent/b.py]
-
-[builtins fixtures/args.pyi]
-[stale]
-
-[case testIncrementalSubmoduleParentBackreferenceComplex]
-import parent
-
-[file parent/__init__.py]
-import parent.a
-
-[file parent/a.py]
-import parent.b
-import parent.c
-
-[file parent/b.py]
-import parent.a
-
-[file parent/c.py]
-import parent.a
-
-[builtins fixtures/args.pyi]
-[stale]
-
-[case testIncrementalReferenceNewFileWithImportFrom]
-from parent import a
-
-[file parent/__init__.py]
-
-[file parent/a.py]
-
-[file parent/a.py.next]
-from parent import b
-
-[file parent/b.py.next]
-
-[stale parent, parent.a, parent.b]
-
-[case testIncrementalReferenceExistingFileWithImportFrom]
-from parent import a, b
-
-[file parent/__init__.py]
-
-[file parent/a.py]
-
-[file parent/b.py]
-
-[file parent/a.py.next]
-from parent import b
-
-[stale parent.a]
-
-[case testIncrementalWithTypeIgnoreOnDirectImport]
-import a, b
-
-[file a.py]
-import b  # type: ignore
-
-[file b.py]
-import c
-
-[file c.py]
-
-[stale]
-
-[case testIncrementalWithTypeIgnoreOnImportFrom]
-import a, b
-
-[file a.py]
-from b import something # type: ignore
-
-[file b.py]
-import c
-something = 3
-
-[file c.py]
-
-[stale]
-
-[case testIncrementalWithPartialTypeIgnore]
-import a  # type: ignore
-import a.b
-
-[file a/__init__.py]
-
-[file a/b.py]
-
-[stale]
-
-[case testIncrementalAnyIsDifferentFromIgnore]
-import b
-
-[file b.py]
-from typing import Any
-import a.b
-
-[file b.py.next]
-from typing import Any
-
-a = 3  # type: Any
-import a.b
-
-[file a/__init__.py]
-
-[file a/b.py]
-
-[rechecked b]
-[stale]
-[out2]
-tmp/b.py:4: error: Name 'a' already defined
-
-[case testIncrementalSilentImportsAndImportsInClass]
-# flags: --ignore-missing-imports
-class MyObject(object):
-    from bar import FooBar
-[stale]
-
-[case testIncrementalSameFileSize]
-import m
-
-[file m.py]
-def foo(a: int) -> None: pass
-def bar(a: str) -> None: pass
-
-foo(3)
-
-[file m.py.next]
-def foo(a: int) -> None: pass
-def bar(a: str) -> None: pass
-
-bar(3)
-
-[rechecked m]
-[stale]
-[out2]
-tmp/m.py:4: error: Argument 1 to "bar" has incompatible type "int"; expected "str"
-
-[case testIncrementalUnsilencingModule]
-# cmd: mypy -m main package.subpackage.mod2
-# cmd2: mypy -m main package.subpackage.mod1
-# flags: --follow-imports=skip
-
-[file main.py]
-from package.subpackage.mod1 import Class
-
-def handle(c: Class) -> None:
-    c.some_attribute
-
-[file package/__init__.py]
-# empty
-
-[file package/subpackage/__init__.py]
-# empty
-
-[file package/subpackage/mod1.py]
-import collections # Any previously unloaded package works here
-
-class Class: pass
-
-[file package/subpackage/mod2.py]
-# empty
-
-[builtins fixtures/args.pyi]
-[rechecked collections, main, package.subpackage.mod1]
-[stale collections, package.subpackage.mod1]
-[out2]
-tmp/main.py:4: error: "Class" has no attribute "some_attribute"
-
-[case testIncrementalWithIgnores]
-import foo # type: ignore
-
-[builtins fixtures/module.pyi]
-[stale]
-
-[case testIncrementalWithSilentImportsAndIgnore]
-# cmd: mypy -m main b
-# cmd2: mypy -m main c c.submodule
-# flags: --follow-imports=skip
-
-[file main.py]
-import a  # type: ignore
-import b
-import c
-
-a.A().foo()
-b.B().foo()
-c.C().foo()
-
-[file b.py]
-class B:
-    def foo(self) -> None: pass
-
-[file b.py.next]
-
-[file c/__init__.py]
-class C: pass
-
-[file c/submodule.py]
-val = 3  # type: int
-val = "foo"
-
-[builtins fixtures/module_all.pyi]
-[rechecked main, c, c.submodule]
-[stale]
-[out2]
-tmp/c/submodule.py:2: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/main.py:7: error: "C" has no attribute "foo"
-
-[case testIncrementalRemoteError]
-import m
-m.C().foo().bar()
-[file m.py]
-import n
-class C:
-  def foo(self) -> n.A: pass
-[file n.py]
-class A:
-  def bar(self): pass
-[file n.py.next]
-class A:
-  pass
-[rechecked m, n]
-[stale n]
-[out2]
-main:2: error: "A" has no attribute "bar"
-
-[case testIncrementalRemoteErrorFixed]
-import m
-m.C().foo().bar()
-[file m.py]
-import n
-class C:
-  def foo(self) -> n.A: pass
-[file n.py]
-class A:
-  pass
-[file n.py.next]
-class A:
-  def bar(self): pass
-[rechecked m, n]
-[stale n]
-[out1]
-main:2: error: "A" has no attribute "bar"
-
-[case testIncrementalChangedError]
-import m
-[file m.py]
-import n
-def accept_int(x: int) -> None: pass
-accept_int(n.foo)
-[file n.py]
-foo = "hello"
-reveal_type(foo)
-[file n.py.next]
-foo = 3.14
-reveal_type(foo)
-[rechecked m, n]
-[stale]
-[out1]
-tmp/n.py:2: error: Revealed type is 'builtins.str'
-tmp/m.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-[out2]
-tmp/n.py:2: error: Revealed type is 'builtins.float'
-tmp/m.py:3: error: Argument 1 to "accept_int" has incompatible type "float"; expected "int"
-
-[case testIncrementalReplacingImports]
-import good, bad, client
-
-[file good.py]
-def foo(a: int) -> None: pass
-
-[file bad.py]
-def foo(a: str) -> None: pass
-
-[file client.py]
-import good
-import bad
-from good import foo
-foo(3)
-
-[file client.py.next]
-import good
-import bad
-from bad import foo
-foo(3)
-
-[rechecked client]
-[stale]
-[out2]
-tmp/client.py:4: error: Argument 1 to "foo" has incompatible type "int"; expected "str"
-
-[case testIncrementalChangingAlias]
-import m1, m2, m3, m4, m5
-
-[file m1.py]
-from m2 import A
-def accepts_int(x: int) -> None: pass
-accepts_int(A())
-
-[file m2.py]
-from m3 import A
-
-[file m3.py]
-from m4 import B
-A = B
-
-[file m3.py.next]
-from m5 import C
-A = C
-
-[file m4.py]
-def B() -> int:
-    return 42
-
-[file m5.py]
-def C() -> str:
-    return "hello"
-
-[rechecked m1, m2, m3]
-[stale m3]
-[out2]
-tmp/m1.py:3: error: Argument 1 to "accepts_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalSilentImportsWithBlatantError]
-# cmd: mypy -m main
-# flags: --follow-imports=skip
-
-[file main.py]
-from evil import Hello
-
-[file main.py.next]
-from evil import Hello
-reveal_type(Hello())
-
-[file evil.py]
-def accept_int(x: int) -> None: pass
-accept_int("not an int")
-
-[rechecked main]
-[stale]
-[out2]
-tmp/main.py:2: error: Revealed type is 'Any'
-
-[case testIncrementalImportIsNewlySilenced]
-# cmd: mypy -m main foo
-# cmd2: mypy -m main
-# flags: --follow-imports=skip
-
-[file main.py]
-from foo import bar
-def accept_int(x: int) -> None: pass
-accept_int(bar)
-
-[file foo.py]
-bar = 3
-
-[file foo.py.next]
-# Empty!
-
-[rechecked main]
-[stale main]
-
-[case testIncrementalSilencedModuleNoLongerCausesError]
-# cmd: mypy -m main evil
-# cmd2: mypy -m main
-# flags: --follow-imports=skip
-
-[file main.py]
-from evil import bar
-def accept_int(x: int) -> None: pass
-accept_int(bar)
-reveal_type(bar)
-
-[file evil.py]
-bar = "str"
-
-[rechecked main]
-[stale]
-[out1]
-tmp/main.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-tmp/main.py:4: error: Revealed type is 'builtins.str'
-[out2]
-tmp/main.py:4: error: Revealed type is 'Any'
-
-[case testIncrementalFixedBugCausesPropagation]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-val = A().makeB().makeC().foo()
-reveal_type(val)
-
-[file mod2.py]
-from mod3 import B
-class A:
-    def makeB(self) -> B: return B()
-
-[file mod3.py]
-from mod4 import C
-class B:
-    def makeC(self) -> C:
-        val = 3  # type: int
-        val = "str"   # deliberately triggering error
-        return C()
-
-[file mod3.py.next]
-from mod4 import C
-class B:
-    def makeC(self) -> C: return C()
-
-[file mod4.py]
-class C:
-    def foo(self) -> int: return 1
-
-[rechecked mod3, mod2, mod1]
-[stale mod3, mod2]
-[out1]
-tmp/mod3.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/mod1.py:3: error: Revealed type is 'builtins.int'
-
-[out2]
-tmp/mod1.py:3: error: Revealed type is 'builtins.int'
-
-[case testIncrementalIncidentalChangeWithBugCausesPropagation]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-val = A().makeB().makeC().foo()
-reveal_type(val)
-
-[file mod2.py]
-from mod3 import B
-class A:
-    def makeB(self) -> B: return B()
-
-[file mod3.py]
-from mod4 import C
-class B:
-    def makeC(self) -> C:
-        val = 3  # type: int
-        val = "str"   # deliberately triggering error
-        return C()
-
-[file mod4.py]
-class C:
-    def foo(self) -> int: return 1
-
-[file mod4.py.next]
-class C:
-    def foo(self) -> str: return 'a'
-
-[rechecked mod4, mod3, mod2, mod1]
-[stale mod4]
-[out1]
-tmp/mod3.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/mod1.py:3: error: Revealed type is 'builtins.int'
-
-[out2]
-tmp/mod3.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/mod1.py:3: error: Revealed type is 'builtins.str'
-
-[case testIncrementalIncidentalChangeWithBugFixCausesPropagation]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-val = A().makeB().makeC().foo()
-reveal_type(val)
-
-[file mod2.py]
-from mod3 import B
-class A:
-    def makeB(self) -> B: return B()
-
-[file mod3.py]
-from mod4 import C
-class B:
-    def makeC(self) -> C:
-        val = 3  # type: int
-        val = "str"   # deliberately triggering error
-        return C()
-
-[file mod3.py.next]
-from mod4 import C
-class B:
-    def makeC(self) -> C: return C()
-
-[file mod4.py]
-class C:
-    def foo(self) -> int: return 1
-
-[file mod4.py.next]
-class C:
-    def foo(self) -> str: return 'a'
-
-[rechecked mod4, mod3, mod2, mod1]
-[stale mod4, mod3, mod2]
-[out1]
-tmp/mod3.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/mod1.py:3: error: Revealed type is 'builtins.int'
-
-[out2]
-tmp/mod1.py:3: error: Revealed type is 'builtins.str'
-
-[case testIncrementalSilentImportsWithInnerImports]
-# cmd: mypy -m main foo
-# flags: --ignore-missing-imports
-
-[file main.py]
-from foo import MyClass
-m = MyClass()
-
-[file main.py.next]
-from foo import MyClass
-m = MyClass()
-reveal_type(m.val)
-
-[file foo.py]
-class MyClass:
-    def __init__(self) -> None:
-        import unrelated
-        self.val = unrelated.test()
-
-[rechecked main]
-[stale]
-[out2]
-tmp/main.py:3: error: Revealed type is 'Any'
-
-[case testIncrementalSilentImportsWithInnerImportsAndNewFile]
-# cmd: mypy -m main foo
-# cmd2: mypy -m main foo unrelated
-# flags: --follow-imports=skip
-
-[file main.py]
-from foo import MyClass
-m = MyClass()
-
-[file main.py.next]
-from foo import MyClass
-m = MyClass()
-reveal_type(m.val)
-
-[file foo.py]
-class MyClass:
-    def __init__(self) -> None:
-        import unrelated
-        self.val = unrelated.test()
-
-[file unrelated.py]
-def test() -> str: return "foo"
-
-[rechecked main, foo, unrelated]
-[stale foo, unrelated]
-[out2]
-tmp/main.py:3: error: Revealed type is 'builtins.str'
-
-[case testIncrementalWorksWithNestedClasses]
-import foo
-
-[file foo.py]
-class MyClass:
-    class NestedClass:
-        pass
-
-    class_attr = NestedClass()
-
-[rechecked]
-[stale]
-
-[case testIncrementalWorksWithNamedTuple]
-import foo
-
-[file foo.py]
-from mid import MyTuple
-def accept_int(x: int) -> None: pass
-accept_int(MyTuple(1, "b", "c").a)
-
-[file mid.py]
-from bar import MyTuple
-
-[file bar.py]
-from typing import NamedTuple
-MyTuple = NamedTuple('MyTuple', [
-    ('a', int),
-    ('b', str),
-    ('c', str)
-])
-
-[file bar.py.next]
-from typing import NamedTuple
-MyTuple = NamedTuple('MyTuple', [
-    ('b', int),  # a and b are swapped
-    ('a', str),
-    ('c', str)
-])
-
-[rechecked bar, mid, foo]
-[stale bar]
-[out2]
-tmp/foo.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalWorksWithNestedNamedTuple]
-import foo
-
-[file foo.py]
-from mid import Outer
-def accept_int(x: int) -> None: pass
-accept_int(Outer.MyTuple(1, "b", "c").a)
-
-[file mid.py]
-from bar import Outer
-
-[file bar.py]
-from typing import NamedTuple
-class Outer:
-    MyTuple = NamedTuple('MyTuple', [
-        ('a', int),
-        ('b', str),
-        ('c', str)
-    ])
-
-[file bar.py.next]
-from typing import NamedTuple
-class Outer:
-    MyTuple = NamedTuple('MyTuple', [
-        ('b', int),  # a and b are swapped
-        ('a', str),
-        ('c', str)
-    ])
-
-[rechecked bar, mid, foo]
-[stale bar]
-[out2]
-tmp/foo.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalPartialSubmoduleUpdate]
-# cmd: mypy -m a
-# cmd2: mypy -m a a.c
-# flags: --follow-imports=skip
-
-[file a/__init__.py]
-from .b import B
-from .c import C
-
-[file a/b.py]
-class B: pass
-
-[file a/c.py]
-class C: pass
-
-[file a/c.py.next]
-class C: pass
-pass
-
-[rechecked a, a.c]
-[stale a, a.c]
-[out]
-
-[case testIncrementalNestedClassRef]
-import top
-
-[file top.py]
-from funcs import callee
-from classes import Outer
-def caller(a: Outer.Inner) -> None:
-    callee(a)
-
-[file funcs.py]
-from classes import Outer
-def callee(a: Outer.Inner) -> None:
-    pass
-
-[file classes.py]
-class Outer:
-    class Inner:
-        pass
-
-[file top.py.next]
-from funcs import callee
-from classes import Outer
-def caller(a: Outer.Inner) -> int:
-    callee(a)
-
-[case testIncrementalLoadsParentAfterChild]
-# cmd: mypy -m r.s
-
-[file r/__init__.py]
-from . import s
-
-[file r/m.py]
-class R: pass
-
-[file r/s.py]
-from . import m
-R = m.R
-a = None  # type: R
-
-[file r/s.py.next]
-from . import m
-R = m.R
-a = None  # type: R
-
-[case testIncrementalBaseClassAttributeConflict]
-class A: pass
-class B: pass
-
-class X:
-    attr = None  # type: A
-class Y:
-    attr = None  # type: B
-class Z(X, Y): pass
-[stale]
-[out]
-main:8: error: Definition of "attr" in base class "X" is incompatible with definition in base class "Y"
-[out2]
-main:8: error: Definition of "attr" in base class "X" is incompatible with definition in base class "Y"
-
-[case testIncrementalFollowImportsSilent]
-# flags: --follow-imports=silent
-import a
-[file a.py]
-x = 0
-[file a.py.next]
-x = 0
-x + ''
-
-[case testIncrementalFollowImportsSkip]
-# flags: --follow-imports=skip
-import a
-reveal_type(a.x)
-[file a.py]
-/
-[file a.py.next]
-//
-[out]
-main:3: error: Revealed type is 'Any'
-[out2]
-main:3: error: Revealed type is 'Any'
-
-[case testIncrementalFollowImportsError]
-# flags: --follow-imports=error
-import a
-[file a.py]
-/
-[file a.py.next]
-//
-[out1]
-main:2: note: Import of 'a' ignored
-main:2: note: (Using --follow-imports=error, module not passed on command line)
-[out2]
-main:2: note: Import of 'a' ignored
-main:2: note: (Using --follow-imports=error, module not passed on command line)
-
-[case testIncrementalFollowImportsVariable]
-# flags: --config-file tmp/mypy.ini
-import a
-reveal_type(a.x)
-[file a.py]
-x = 0
-[file mypy.ini]
-[[mypy]
-follow_imports = normal
-[file mypy.ini.next]
-[[mypy]
-follow_imports = skip
-[out1]
-main:3: error: Revealed type is 'builtins.int'
-[out2]
-main:3: error: Revealed type is 'Any'
-
-[case testIncrementalNamedTupleInMethod]
-from ntcrash import nope
-[file ntcrash.py]
-from typing import NamedTuple
-class C:
-    def f(self) -> None:
-        A = NamedTuple('A', [('x', int), ('y', int)])
-[out1]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-
-[case testIncrementalNamedTupleInMethod2]
-from ntcrash import nope
-[file ntcrash.py]
-from typing import NamedTuple
-class C:
-    class D:
-        def f(self) -> None:
-            A = NamedTuple('A', [('x', int), ('y', int)])
-[out1]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-
-[case testIncrementalNamedTupleInMethod3]
-from ntcrash import nope
-[file ntcrash.py]
-from typing import NamedTuple
-class C:
-    def a(self):
-        class D:
-            def f(self) -> None:
-                A = NamedTuple('A', [('x', int), ('y', int)])
-[out1]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-
-[case testIncrementalNamedTupleInMethod4]
-from ntcrash import C
-reveal_type(C().a)
-reveal_type(C().b)
-reveal_type(C().c)
-[file ntcrash.py]
-from typing import NamedTuple
-class C:
-    def __init__(self) -> None:
-        A = NamedTuple('A', [('x', int)])
-        self.a = A(0)
-        self.b = A(0)  # type: A
-        self.c = A
-[out1]
-main:2: error: Revealed type is 'Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-main:3: error: Revealed type is 'Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-main:4: error: Revealed type is 'def (x: builtins.int) -> Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-[out2]
-main:2: error: Revealed type is 'Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-main:3: error: Revealed type is 'Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-main:4: error: Revealed type is 'def (x: builtins.int) -> Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-
-[case testIncrementalTypedDictInMethod]
-from tdcrash import nope
-[file tdcrash.py]
-from mypy_extensions import TypedDict
-class C:
-    def f(self) -> None:
-        A = TypedDict('A', {'x': int, 'y': int})
-[builtins fixtures/dict.pyi]
-[out1]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-
-[case testIncrementalTypedDictInMethod2]
-from tdcrash import nope
-[file tdcrash.py]
-from mypy_extensions import TypedDict
-class C:
-    class D:
-        def f(self) -> None:
-            A = TypedDict('A', {'x': int, 'y': int})
-[builtins fixtures/dict.pyi]
-[out1]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-
-[case testIncrementalTypedDictInMethod3]
-from tdcrash import nope
-[file tdcrash.py]
-from mypy_extensions import TypedDict
-class C:
-    def a(self):
-        class D:
-            def f(self) -> None:
-                A = TypedDict('A', {'x': int, 'y': int})
-[builtins fixtures/dict.pyi]
-[out1]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-
-[case testIncrementalTypedDictInMethod4]
-from ntcrash import C
-reveal_type(C().a)
-reveal_type(C().b)
-reveal_type(C().c)
-[file ntcrash.py]
-from mypy_extensions import TypedDict
-class C:
-    def __init__(self) -> None:
-        A = TypedDict('A', {'x': int})
-        self.a = A(x=0)
-        self.b = A(x=0)  # type: A
-        self.c = A
-[builtins fixtures/dict.pyi]
-[out1]
-main:2: error: Revealed type is 'TypedDict(x=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-main:3: error: Revealed type is 'TypedDict(x=builtins.int, _fallback=ntcrash.C.A at 4)'
-main:4: error: Revealed type is 'def () -> ntcrash.C.A at 4'
-[out2]
-main:2: error: Revealed type is 'TypedDict(x=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-main:3: error: Revealed type is 'TypedDict(x=builtins.int, _fallback=ntcrash.C.A at 4)'
-main:4: error: Revealed type is 'def () -> ntcrash.C.A at 4'
-
-[case testIncrementalPerFileFlags]
-# flags: --config-file tmp/mypy.ini
-import a
-[file a.py]
-pass
-[file mypy.ini]
-[[mypy]
-warn_no_return = False
-[[mypy-a]
-warn_no_return = True
-[rechecked]
diff --git a/test-data/unit/check-inference-context.test b/test-data/unit/check-inference-context.test
deleted file mode 100644
index 7673093..0000000
--- a/test-data/unit/check-inference-context.test
+++ /dev/null
@@ -1,820 +0,0 @@
-
-
--- Basic test cases
--- ----------------
-
-
-[case testBasicContextInference]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ab = None # type: A[B]
-ao = None # type: A[object]
-b = None # type: B
-
-ao = f()
-ab = f()
-b = f() # E: Incompatible types in assignment (expression has type A[None], variable has type "B")
-
-def f() -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-
-[case testBasicContextInferenceForConstructor]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ab = None # type: A[B]
-ao = None # type: A[object]
-b = None # type: B
-
-ao = A()
-ab = A()
-b = A() # E: Incompatible types in assignment (expression has type A[None], variable has type "B")
-
-class A(Generic[T]): pass
-class B: pass
-
-[case testIncompatibleContextInference]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-b = None # type: B
-c = None # type: C
-ab = None # type: A[B]
-ao = None # type: A[object]
-ac = None # type: A[C]
-
-ac = f(b) # E: Argument 1 to "f" has incompatible type "B"; expected "C"
-ab = f(c) # E: Argument 1 to "f" has incompatible type "C"; expected "B"
-
-ao = f(b)
-ab = f(b)
-ao = f(c)
-ac = f(c)
-
-def f(a: T) -> 'A[T]':
-    pass
-
-class A(Generic[T]): pass
-
-class B: pass
-class C: pass
-
-
--- Local variables
--- ---------------
-
-
-[case testInferGenericLocalVariableTypeWithEmptyContext]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def g() -> None:
-    ao = None # type: A[object]
-    ab = None # type: A[B]
-    o = None # type: object
-    b = None # type: B
-
-    x = f(o)
-    ab = x # E: Incompatible types in assignment (expression has type A[object], variable has type A[B])
-    ao = x
-    y = f(b)
-    ao = y # E: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-    ab = y
-
-def f(a: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-[out]
-
-[case testInferLocalVariableTypeWithUnderspecifiedGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def g() -> None:
-    x = f() # E: Need type annotation for variable
-
-def f() -> 'A[T]': pass
-class A(Generic[T]): pass
-[out]
-
-[case testInferMultipleLocalVariableTypesWithTupleRvalue]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def g() -> None:
-    ao = None # type: A[object]
-    ab = None # type: A[B]
-    b = None # type: B
-    x, y = f(b), f(b)
-    ao = x # E: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-    ao = y # E: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-    ab = x
-    ab = y
-
-def f(a: T) -> 'A[T]': pass
-class A(Generic[T]): pass
-class B: pass
-[out]
-
-[case testInferMultipleLocalVariableTypesWithArrayRvalueAndNesting]
-from typing import TypeVar, List, Generic
-T = TypeVar('T')
-def h() -> None:
-    ao = None # type: A[object]
-    ab = None # type: A[B]
-    b = None # type: B
-    x, y = g(f(b))
-    ao = x # E: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-    ao = y # E: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-    ab = x
-    ab = y
-
-def f(a: T) -> 'A[T]': pass
-def g(a: T) -> List[T]: pass
-
-class A(Generic[T]): pass
-class B: pass
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Return types with multiple tvar instances
--- -----------------------------------------
-
-
-[case testInferenceWithTypeVariableTwiceInReturnType]
-from typing import TypeVar, Tuple, Generic
-T = TypeVar('T')
-b = None # type: B
-o = None # type: object
-ab = None # type: A[B]
-ao = None # type: A[object]
-
-ab, ao = f(b) # Fail
-ao, ab = f(b) # Fail
-
-ao, ao = f(b)
-ab, ab = f(b)
-ao, ao = f(o)
-
-def f(a: T) -> 'Tuple[A[T], A[T]]': pass
-
-class A(Generic[T]): pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-[out]
-main:8: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-main:9: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-
-[case testInferenceWithTypeVariableTwiceInReturnTypeAndMultipleVariables]
-from typing import TypeVar, Tuple, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-b = None # type: B
-o = None # type: object
-ab = None # type: A[B]
-ao = None # type: A[object]
-
-ao, ao, ab = f(b, b)     # Fail
-ao, ab, ao = g(b, b)     # Fail
-ao, ab, ab, ab = h(b, b) # Fail
-ab, ab, ao, ab = h(b, b) # Fail
-
-ao, ab, ab = f(b, b)
-ab, ab, ao = g(b, b)
-ab, ab, ab, ab = h(b, b)
-
-def f(a: S, b: T) -> 'Tuple[A[S], A[T], A[T]]': pass
-def g(a: S, b: T) -> 'Tuple[A[S], A[S], A[T]]': pass
-def h(a: S, b: T) -> 'Tuple[A[S], A[S], A[T], A[T]]': pass
-
-class A(Generic[T]): pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-[out]
-main:9: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-main:10: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-main:11: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-main:12: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-
-
--- Multiple tvar instances in arguments
--- ------------------------------------
-
-
-[case testMultipleTvatInstancesInArgs]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ac = None # type: A[C]
-ab = None # type: A[B]
-ao = None # type: A[object]
-b = None # type: B
-c = None # type: C
-o = None # type: object
-
-ab = f(b, o) # E: Argument 2 to "f" has incompatible type "object"; expected "B"
-ab = f(o, b) # E: Argument 1 to "f" has incompatible type "object"; expected "B"
-ac = f(b, c) # E: Argument 1 to "f" has incompatible type "B"; expected "C"
-ac = f(c, b) # E: Argument 2 to "f" has incompatible type "B"; expected "C"
-
-ao = f(b, c)
-ao = f(c, b)
-ab = f(c, b)
-
-def f(a: T, b: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-class C(B): pass
-
-
--- Nested generic function calls
--- -----------------------------
-
-
-[case testNestedGenericFunctionCall1]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-aab = None # type: A[A[B]]
-aao = None # type: A[A[object]]
-ao = None # type: A[object]
-b = None # type: B
-o = None # type: object
-
-aab = f(f(o)) # E: Argument 1 to "f" has incompatible type "object"; expected "B"
-
-aab = f(f(b))
-aao = f(f(b))
-ao = f(f(b))
-
-def f(a: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-
-[case testNestedGenericFunctionCall2]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ab = None # type: A[B]
-ao = None # type: A[object]
-b = None # type: B
-o = None # type: object
-
-ab = f(g(o)) # E: Argument 1 to "g" has incompatible type "object"; expected "B"
-
-ab = f(g(b))
-ao = f(g(b))
-
-def f(a: T) -> T: pass
-
-def g(a: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-
-[case testNestedGenericFunctionCall3]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ab = None # type: A[B]
-ao = None # type: A[object]
-b = None # type: B
-o = None # type: object
-
-ab = f(g(o), g(b)) # E: Argument 1 to "g" has incompatible type "object"; expected "B"
-ab = f(g(b), g(o)) # E: Argument 1 to "g" has incompatible type "object"; expected "B"
-
-ab = f(g(b), g(b))
-ao = f(g(b), g(o))
-ao = f(g(o), g(b))
-
-def f(a: T, b: T) -> T:
-    pass
-
-def g(a: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-
-
--- Method calls
--- ------------
-
-
-[case testMethodCallWithContextInference]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-o = None # type: object
-b = None # type: B
-c = None # type: C
-ao = None # type: A[object]
-ab = None # type: A[B]
-ac = None # type: A[C]
-
-ab.g(f(o))        # E: Argument 1 to "f" has incompatible type "object"; expected "B"
-ac = f(b).g(f(c)) # E: Incompatible types in assignment (expression has type A[B], variable has type A[C])
-ac = f(c).g(f(b)) # E: Argument 1 to "f" has incompatible type "B"; expected "C"
-
-ab = f(b).g(f(c))
-ab.g(f(c))
-
-def f(a: T) -> 'A[T]': pass
-
-class A(Generic[T]):
-    def g(self, a: 'A[T]') -> 'A[T]': pass
-
-class B: pass
-class C(B): pass
-
-
--- List expressions
--- ----------------
-
-
-[case testEmptyListExpression]
-from typing import List
-aa = None # type: List[A]
-ao = None # type: List[object]
-a = None # type: A
-
-a = [] # E: Incompatible types in assignment (expression has type List[None], variable has type "A")
-
-aa = []
-ao = []
-
-class A: pass
-[builtins fixtures/list.pyi]
-
-[case testSingleItemListExpressions]
-from typing import List
-aa = None # type: List[A]
-ab = None # type: List[B]
-ao = None # type: List[object]
-a = None # type: A
-b = None # type: B
-
-aa = [b] # E: List item 0 has incompatible type "B"
-ab = [a] # E: List item 0 has incompatible type "A"
-
-aa = [a]
-ab = [b]
-ao = [a]
-aa = [None]
-ao = [None]
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testMultiItemListExpressions]
-from typing import List
-aa = None # type: List[A]
-ab = None # type: List[B]
-ao = None # type: List[object]
-a = None # type: A
-b = None # type: B
-
-ab = [b, a] # E: List item 1 has incompatible type "A"
-ab = [a, b] # E: List item 0 has incompatible type "A"
-
-aa = [a, b, a]
-ao = [a, b]
-
-class A: pass
-class B(A): pass
-[builtins fixtures/list.pyi]
-
-[case testLocalVariableInferenceFromEmptyList]
-import typing
-def f() -> None:
-    a = []     # E: Need type annotation for variable
-    b = [None]  # E: Need type annotation for variable
-    c = [B()]
-    c = [object()] # E: List item 0 has incompatible type "object"
-    c = [B()]
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testNestedListExpressions]
-from typing import List
-aao = None # type: List[List[object]]
-aab = None # type: List[List[B]]
-ab = None # type: List[B]
-b = None # type: B
-o = None # type: object
-
-aao = [[o], ab] # E: List item 1 has incompatible type List[B]
-aab = [[], [o]] # E: List item 0 has incompatible type "object"
-
-aao = [[None], [b], [], [o]]
-aab = [[None], [b], []]
-aab = [ab, []]
-
-class B: pass
-[builtins fixtures/list.pyi]
-
-
--- Complex context
--- ---------------
-
-
-[case testParenthesesAndContext]
-from typing import List
-l = ([A()]) # type: List[object]
-class A: pass
-[builtins fixtures/list.pyi]
-
-[case testComplexTypeInferenceWithTuple]
-from typing import TypeVar, Tuple, Generic
-k = TypeVar('k')
-t = TypeVar('t')
-v = TypeVar('v')
-def f(x: Tuple[k]) -> 'A[k]': pass
-
-d = f((A(),)) # type: A[A[B]]
-
-class A(Generic[t]): pass
-class B: pass
-class C: pass
-class D(Generic[k, v]): pass
-[builtins fixtures/list.pyi]
-
-
--- Dictionary literals
--- -------------------
-
-
-[case testDictionaryLiteralInContext]
-from typing import Dict, TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-class B: pass
-class C: pass
-a_b = A() # type: A[B]
-a_c = A() # type: A[C]
-d = {A() : a_c,
-     a_b : A()} # type: Dict[A[B], A[C]]
-[builtins fixtures/dict.pyi]
-
-
--- Special cases (regression tests etc.)
--- -------------------------------------
-
-
-[case testInitializationWithInferredGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-c = f(A()) # type: C[A] # E: Argument 1 to "f" has incompatible type "A"; expected C[A]
-
-def f(x: T) -> T: pass
-class C(Generic[T]): pass
-class A: pass
-
-[case testInferredGenericTypeAsReturnValue]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def t() -> 'A[B]':
-    return f(D()) # E: Argument 1 to "f" has incompatible type "D"; expected "B"
-    return A()
-    return f(C())
-
-def f(a: T) -> 'A[T]': pass
-class A(Generic[T]): pass
-class B: pass
-class C(B): pass
-class D: pass
-[out]
-
-[case testIntersectionWithInferredGenericArgument]
-from typing import overload, TypeVar, Generic
-T = TypeVar('T')
-f(A())
-
- at overload
-def f(x: 'A[B]') -> None: pass
- at overload
-def f(x: 'B') -> None: pass
-class A(Generic[T]): pass
-class B: pass
-
-[case testInferenceWithAbstractClassContext]
-from typing import TypeVar, Generic
-from abc import abstractmethod, ABCMeta
-t = TypeVar('t')
-x = A() # type: I[int]
-a_object = A() # type: A[object]
-y = a_object # type: I[int] # E: Incompatible types in assignment (expression has type A[object], variable has type I[int])
-
-class I(Generic[t]):
-    @abstractmethod
-    def f(self): pass
-class A(I[t], Generic[t]):
-    def f(self): pass
-
-[case testInferenceWithAbstractClassContext2]
-from typing import TypeVar, Generic
-from abc import abstractmethod, ABCMeta
-t = TypeVar('t')
-a = f(A()) # type: A[int]
-a_int = A() # type: A[int]
-aa = f(a_int)
-class I(Generic[t]): pass
-class A(I[t], Generic[t]): pass
-def f(i: I[t]) -> A[t]: pass
-
-[case testInferenceWithAbstractClassContext3]
-from typing import TypeVar, Generic, Iterable
-t = TypeVar('t')
-class set(Generic[t]):
-    def __init__(self, iterable: Iterable[t]) -> None: pass
-b = bool()
-l = set([b])
-l = set([object()]) # E: List item 0 has incompatible type "object"
-[builtins fixtures/for.pyi]
-
-
--- Infer generic type in 'Any' context
--- -----------------------------------
-
-
-[case testInferGenericTypeInAnyContext]
-from typing import Any, TypeVar, Generic
-s = TypeVar('s')
-t = TypeVar('t')
-x = [] # type: Any
-y = C() # type: Any
-class C(Generic[s, t]): pass
-[builtins fixtures/list.pyi]
-
-
--- Lambdas
--- -------
-
-
-[case testInferLambdaArgumentTypeUsingContext]
-from typing import Callable
-f = None # type: Callable[[B], A]
-f = lambda x: x.o
-f = lambda x: x.x # E: "B" has no attribute "x"
-class A: pass
-class B:
-  o = None # type: A
-
-[case testInferLambdaReturnTypeUsingContext]
-from typing import List, Callable
-f = None # type: Callable[[], List[A]]
-f = lambda: []
-f = lambda: [B()]  # E: List item 0 has incompatible type "B"
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testInferLambdaAsGenericFunctionArgument]
-from typing import TypeVar, List, Any, Callable
-t = TypeVar('t')
-class A:
-  x = None # type: A
-def f(a: List[t], fn: Callable[[t], Any]) -> None: pass
-list_a = [] # type: List[A]
-f(list_a, lambda a: a.x)
-[builtins fixtures/list.pyi]
-
-[case testLambdaWithoutContext]
-reveal_type(lambda x: x)  # E: Revealed type is 'def (x: Any) -> Any'
-reveal_type(lambda x: 1)  # E: Revealed type is 'def (x: Any) -> builtins.int'
-
-[case testLambdaContextVararg]
-from typing import Callable
-def f(t: Callable[[str], str]) -> str: ''
-f(lambda *_: '')
-
-[case testInvalidContextForLambda]
-from typing import Callable
-f = lambda x: A() # type: Callable[[], A]
-f2 = lambda: A() # type: Callable[[A], A]
-class A: pass
-[out]
-main:2: error: Incompatible types in assignment (expression has type Callable[[Any], A], variable has type Callable[[], A])
-main:2: error: Cannot infer type of lambda
-main:3: error: Incompatible types in assignment (expression has type Callable[[], A], variable has type Callable[[A], A])
-main:3: error: Cannot infer type of lambda
-
-[case testEllipsisContextForLambda]
-from typing import Callable
-f1 = lambda x: 1 # type: Callable[..., int]
-f2 = lambda: 1 # type: Callable[..., int]
-f3 = lambda *args, **kwargs: 1 # type: Callable[..., int]
-f4 = lambda x: x # type: Callable[..., int]
-g = lambda x: 1 # type: Callable[..., str]
-[builtins fixtures/dict.pyi]
-[out]
-main:6: error: Incompatible types in assignment (expression has type Callable[[Any], int], variable has type Callable[..., str])
-main:6: error: Incompatible return value type (got "int", expected "str")
-
-[case testEllipsisContextForLambda2]
-from typing import TypeVar, Callable
-T = TypeVar('T')
-def foo(arg: Callable[..., T]) -> None: pass
-foo(lambda: 1)
-
-[case testLambdaNoneInContext]
-from typing import Callable
-def f(x: Callable[[], None]) -> None: pass
-def g(x: Callable[[], int]) -> None: pass
-f(lambda: None)
-g(lambda: None)
-
-[case testIsinstanceInInferredLambda]
-from typing import TypeVar, Callable
-T = TypeVar('T')
-S = TypeVar('S')
-class A: pass
-class B(A): pass
-class C(A): pass
-def f(func: Callable[[T], S], *z: T, r: S = None) -> S: pass
-f(lambda x: 0 if isinstance(x, B) else 1) # E: Cannot infer type argument 1 of "f"
-f(lambda x: 0 if isinstance(x, B) else 1, A())() # E: "int" not callable
-f(lambda x: x if isinstance(x, B) else B(), A(), r=B())() # E: "B" not callable
-f( # E: Argument 1 to "f" has incompatible type Callable[[A], A]; expected Callable[[A], B]
-    lambda x: B() if isinstance(x, B) else x, # E: Incompatible return value type (got "A", expected "B")
-    A(), r=B())
-[builtins fixtures/isinstance.pyi]
-
-
--- Overloads + generic functions
--- -----------------------------
-
-
-[case testMapWithOverloadedFunc]
-from typing import TypeVar, Callable, List, overload, Any
-t = TypeVar('t')
-s = TypeVar('s')
-def map(f: Callable[[t], s], seq: List[t]) -> List[s]: pass
-
- at overload
-def g(o: object) -> 'B': pass
- at overload
-def g(o: 'A', x: Any = None) -> 'B': pass
-
-class A: pass
-class B: pass
-
-m = map(g, [A()])
-b = m # type: List[B]
-a = m # type: List[A] # E: Incompatible types in assignment (expression has type List[B], variable has type List[A])
-[builtins fixtures/list.pyi]
-
-
--- Boolean operators
--- -----------------
-
-
-[case testOrOperationInferredFromContext]
-from typing import List
-a, b, c = None, None, None # type: (List[A], List[B], List[C])
-a = a or []
-a = [] or a
-b = b or [C()]
-a = a or b # E: Incompatible types in assignment (expression has type "Union[List[A], List[B]]", variable has type List[A])
-b = b or c # E: Incompatible types in assignment (expression has type "Union[List[B], List[C]]", variable has type List[B])
-
-class A: pass
-class B: pass
-class C(B): pass
-[builtins fixtures/list.pyi]
-
-
--- Special cases
--- -------------
-
-
-[case testSomeTypeVarsInferredFromContext]
-from typing import List, TypeVar
-t = TypeVar('t')
-s = TypeVar('s')
-# Some type variables can be inferred using context, but not all of them.
-a = None # type: List[A]
-a = f(A(), B())
-a = f(B(), B()) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-def f(a: s, b: t) -> List[s]: pass
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testSomeTypeVarsInferredFromContext2]
-from typing import List, TypeVar
-s = TypeVar('s')
-t = TypeVar('t')
-# Like testSomeTypeVarsInferredFromContext, but tvars in different order.
-a = None # type: List[A]
-a = f(A(), B())
-a = f(B(), B()) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-def f(a: s, b: t) -> List[s]: pass
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testLambdaInListAndHigherOrderFunction]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-map(
-  [lambda x: x], [])
-def map(f: List[Callable[[t], s]], a: List[t]) -> List[s]: pass
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testChainedAssignmentInferenceContexts]
-from typing import List
-i = None # type: List[int]
-s = None # type: List[str]
-i = i = []
-i = s = [] # E: Incompatible types in assignment (expression has type List[str], variable has type List[int])
-[builtins fixtures/list.pyi]
-
-[case testContextForAttributeDeclaredInInit]
-from typing import List
-class A:
-  def __init__(self):
-    self.x = [] # type: List[int]
-a = A()
-a.x = []
-a.x = [1]
-a.x = [''] # E: List item 0 has incompatible type "str"
-[builtins fixtures/list.pyi]
-
-[case testListMultiplyInContext]
-from typing import List
-a = None  # type: List[int]
-a = [None] * 3
-a = [''] * 3 # E: List item 0 has incompatible type "str"
-[builtins fixtures/list.pyi]
-
-[case testUnionTypeContext]
-from typing import Union, List, TypeVar
-T = TypeVar('T')
-def f(x: Union[List[T], str]) -> None: pass
-f([1])
-f('')
-f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "Union[List[None], str]"
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIgnoringInferenceContext]
-from typing import TypeVar, List
-T = TypeVar('T')
-def f(x: List[T]) -> T: pass
-def g(y: object) -> None: pass
-a = [1]
-g(f(a))
-[builtins fixtures/list.pyi]
-
-[case testStar2Context]
-from typing import Any, Dict, Tuple, Iterable
-def f1(iterable: Iterable[Tuple[str, Any]] = None) -> None:
-    f2(**dict(iterable))
-def f2(iterable: Iterable[Tuple[str, Any]], **kw: Any) -> None:
-    pass
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testInferenceInGenericFunction]
-from typing import TypeVar, List
-T = TypeVar('T')
-def f(a: T) -> None:
-    l = []  # type: List[T]
-    l.append(a)
-    l.append(1) # E: Argument 1 to "append" of "list" has incompatible type "int"; expected "T"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferenceInGenericClass]
-from typing import TypeVar, Generic, List
-S = TypeVar('S')
-T = TypeVar('T')
-class A(Generic[S]):
-    def f(self, a: T, b: S) -> None:
-        l = []  # type: List[T]
-        l.append(a)
-        l.append(b) # E: Argument 1 to "append" of "list" has incompatible type "S"; expected "T"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testLambdaInGenericFunction]
-from typing import TypeVar, Callable
-T = TypeVar('T')
-S = TypeVar('S')
-def f(a: T, b: S) -> None:
-    c = lambda x: x  # type: Callable[[T], S]
-[out]
-main:5: error: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[T], S])
-main:5: error: Incompatible return value type (got "T", expected "S")
-
-[case testLambdaInGenericClass]
-from typing import TypeVar, Callable, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class A(Generic[T]):
-    def f(self, b: S) -> None:
-        c = lambda x: x  # type: Callable[[T], S]
-[out]
-main:6: error: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[T], S])
-main:6: error: Incompatible return value type (got "T", expected "S")
diff --git a/test-data/unit/check-inference.test b/test-data/unit/check-inference.test
deleted file mode 100644
index 54f73f5..0000000
--- a/test-data/unit/check-inference.test
+++ /dev/null
@@ -1,1765 +0,0 @@
--- Inferring locals/globals with simple types
--- ------------------------------------------
-
-
-[case testInferSimpleGvarType]
-import typing
-x = A()
-y = B()
-x = B() # Fail
-x = A()
-x = y   # Fail
-x = x
-class A: pass
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:6: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testInferSimpleLvarType]
-import typing
-def f() -> None:
-  x = A()
-  y = B()
-  x = B() # Fail
-  x = A()
-  x = y   # Fail
-  x = x
-class A: pass
-class B: pass
-[out]
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:7: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testLvarInitializedToVoid]
-import typing
-def f() -> None:
-    a = g()    # E: "g" does not return a value
-    #b, c = g() # "g" does not return a value TODO
-
-def g() -> None: pass
-[out]
-
-[case testInferringLvarTypeFromArgument]
-import typing
-def f(a: 'A') -> None:
-    b = a
-    b = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    b = a
-    a = b
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringLvarTypeFromGvar]
-
-g = None # type: B
-
-def f() -> None:
-    a = g
-    a = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    a = B()
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringImplicitDynamicTypeForLvar]
-import typing
-def f() -> None:
-    a = g()
-    None(a) # E: None not callable
-    a.x()
-
-def g(): pass
-[out]
-
-[case testInferringExplicitDynamicTypeForLvar]
-from typing import Any
-g = None # type: Any
-
-def f(a: Any) -> None:
-    b = g
-    None(b) # E: None not callable
-    a.x()
-[out]
-
-
--- Inferring types of local variables with complex types
--- -----------------------------------------------------
-
-
-[case testInferringTupleTypeForLvar]
-
-def f() -> None:
-    a = A(), B()
-    aa = None # type: A
-    bb = None # type: B
-    bb = a[0] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    aa = a[1] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    aa = a[0]
-    bb = a[1]
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testInferringTupleTypeForLvarWithNones]
-import typing
-def f() -> None:
-    a = A(), None # E: Need type annotation for variable
-    b = None, A() # E: Need type annotation for variable
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testInferringGenericTypeForLvar]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]): pass
-a_i = None # type: A[int]
-a_s = None # type: A[str]
-
-def f() -> None:
-    a_int = A() # type: A[int]
-    a = a_int
-    a = a_s # E: Incompatible types in assignment (expression has type A[str], variable has type A[int])
-    a = a_i
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testInferringFunctionTypeForLvar]
-import typing
-def f() -> None:
-    a = g
-    a(B()) # E: Argument 1 has incompatible type "B"; expected "A"
-    a(A())
-
-def g(a: 'A') -> None: pass
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringFunctionTypeForLvarFromTypeObject]
-import typing
-def f() -> None:
-    a = A
-    a(A()) # E: Too many arguments
-    a()
-    t = a # type: type
-
-class A: pass
-[out]
-
-
--- Inferring variable types in multiple definition
--- -----------------------------------------------
-
-
-[case testInferringLvarTypesInMultiDef]
-import typing
-def f() -> None:
-    a, b = A(), B()
-    a = b   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-    a = A()
-    b = B()
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringLvarTypesInTupleAssignment]
-from typing import Tuple
-def f() -> None:
-    t = None # type: Tuple[A, B]
-    a, b = t
-    a = b   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-    a = A()
-    b = B()
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringLvarTypesInNestedTupleAssignment1]
-from typing import Tuple
-def f() -> None:
-    t = None # type: Tuple[A, B]
-    a1, (a, b) = A(), t
-    a = b   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-    a = A()
-    b = B()
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringLvarTypesInNestedTupleAssignment2]
-import typing
-def f() -> None:
-    a, (b, c) = A(), (B(), C())
-    a = b   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    c = A() # E: Incompatible types in assignment (expression has type "A", variable has type "C")
-
-    a = A()
-    b = B()
-    c = C()
-
-class A: pass
-class B: pass
-class C: pass
-[out]
-
-[case testInferringLvarTypesInNestedListAssignment]
-import typing
-def f() -> None:
-    a, (b, c) = A(), [B(), C()]
-    a = b   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    c = A() # E: Incompatible types in assignment (expression has type "A", variable has type "C")
-
-    a = A()
-    b = B()
-    c = C()
-
-class A: pass
-class B: pass
-class C: pass
-[out]
-
-[case testInferringLvarTypesInMultiDefWithNoneTypes]
-import typing
-def f() -> None:
-    a, b = A(), None # E: Need type annotation for variable
-    c, d = None, A() # E: Need type annotation for variable
-
-class A: pass
-[out]
-
-[case testInferringLvarTypesInNestedTupleAssignmentWithNoneTypes]
-import typing
-def f() -> None:
-    a1, (a2, b) = A(), (A(), None) # E: Need type annotation for variable
-
-class A: pass
-[out]
-
-[case testInferringLvarTypesInMultiDefWithInvalidTuple]
-from typing import Tuple
-t = None # type: Tuple[object, object, object]
-
-def f() -> None:
-    a, b = t         # Fail
-    c, d, e, f = t   # Fail
-    g, h, i = t
-[builtins fixtures/tuple.pyi]
-[out]
-main:5: error: Too many values to unpack (2 expected, 3 provided)
-main:6: error: Need more than 3 values to unpack (4 expected)
-
-[case testInvalidRvalueTypeInInferredMultipleLvarDefinition]
-import typing
-def f() -> None:
-    a, b = f   # E: 'def ()' object is not iterable
-    c, d = A() # E: '__main__.A' object is not iterable
-class A: pass
-[builtins fixtures/for.pyi]
-[out]
-
-[case testInvalidRvalueTypeInInferredNestedTupleAssignment]
-import typing
-def f() -> None:
-    a1, (a2, b) = A(), f   # E: 'def ()' object is not iterable
-    a3, (c, d) = A(), A() # E: '__main__.A' object is not iterable
-class A: pass
-[builtins fixtures/for.pyi]
-[out]
-
-[case testInferringMultipleLvarDefinitionWithListRvalue]
-from typing import List
-
-class C: pass
-class D: pass
-
-def f() -> None:
-    list_c = [C()]
-    list_d = [D()]
-    a, b = list_c
-    c, d, e = list_d
-    a = D() # E: Incompatible types in assignment (expression has type "D", variable has type "C")
-    b = D() # E: Incompatible types in assignment (expression has type "D", variable has type "C")
-    c = C() # E: Incompatible types in assignment (expression has type "C", variable has type "D")
-    b = c   # E: Incompatible types in assignment (expression has type "D", variable has type "C")
-
-    a = C()
-    b = C()
-    c = D()
-    d = D()
-    e = D()
-
-    a = b
-    c = d
-    d = e
-[builtins fixtures/for.pyi]
-[out]
-
-[case testInferringNestedTupleAssignmentWithListRvalue]
-from typing import List
-
-class C: pass
-class D: pass
-
-def f() -> None:
-    list_c = [C()]
-    list_d = [D()]
-    c1, (a, b) = C(), list_c
-    c2, (c, d, e) = C(), list_d
-    a = D() # E: Incompatible types in assignment (expression has type "D", variable has type "C")
-    b = D() # E: Incompatible types in assignment (expression has type "D", variable has type "C")
-    c = C() # E: Incompatible types in assignment (expression has type "C", variable has type "D")
-    b = c   # E: Incompatible types in assignment (expression has type "D", variable has type "C")
-
-    a = C()
-    b = C()
-    c = D()
-    d = D()
-    e = D()
-
-    a = b
-    c = d
-    d = e
-[builtins fixtures/for.pyi]
-[out]
-
-[case testInferringMultipleLvarDefinitionWithImplicitDynamicRvalue]
-import typing
-def f() -> None:
-    a, b = g()
-    a.x
-    b.x
-def g(): pass
-
-[case testInferringMultipleLvarDefinitionWithExplicitDynamicRvalue]
-from typing import Any
-def f(d: Any) -> None:
-    a, b = d
-    a.x
-    b.x
-
-[case testInferringTypesFromIterable]
-from typing import Iterable
-class Nums(Iterable[int]):
-    def __iter__(self): pass
-    def __next__(self): pass
-a, b = Nums()
-a = b = 1
-a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-b = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/for.pyi]
-
-
--- Type variable inference for generic functions
--- ---------------------------------------------
-
-
-[case testInferSimpleGenericFunction]
-from typing import Tuple, TypeVar
-T = TypeVar('T')
-a = None # type: A
-b = None # type: B
-c = None # type: Tuple[A, object]
-
-b = id(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = id(b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = id(c) # E: Incompatible types in assignment (expression has type "Tuple[A, object]", variable has type "A")
-
-a = id(a)
-b = id(b)
-c = id(c)
-
-def id(a: T) -> T: pass
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testInferringGenericFunctionTypeForLvar]
-from typing import TypeVar
-T = TypeVar('T')
-def f() -> None:
-    a = id
-    b = None # type: int
-    c = None # type: str
-    b = a(c) # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-    b = a(b)
-    c = a(c)
-def id(x: T) -> T:
-    return x
-[out]
-
-[case testUnderspecifiedInferenceResult]
-from typing import TypeVar
-T = TypeVar('T')
-class A: pass
-a = None # type: A
-
-def ff() -> None:
-    x = f() # E: Need type annotation for variable
-
-g(None) # Ok
-f()     # Ok because not used to infer local variable type
-g(a)
-
-def f() -> T: pass
-def g(a: T) -> None: pass
-[out]
-
-[case testUnsolvableInferenceResult]
-from typing import TypeVar
-T = TypeVar('T')
-f(A(), g()) # Fail
-f(A(), A())
-
-def f(a: T, b: T) -> None: pass
-def g() -> None: pass
-class A: pass
-[out]
-main:3: error: Cannot infer type argument 1 of "f"
-main:3: error: "g" does not return a value
-
-[case testInferenceWithMultipleConstraints]
-from typing import TypeVar
-T = TypeVar('T')
-a = None # type: A
-b = None # type: B
-
-b = f(a, b) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(b, a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(a, b)
-a = f(b, a)
-
-def f(a: T, b: T) -> T: pass
-
-class A: pass
-class B(A): pass
-
-[case testInferenceWithMultipleVariables]
-from typing import Tuple, TypeVar
-T = TypeVar('T')
-S = TypeVar('S')
-a, b = None, None # type: (A, B)
-taa = None # type: Tuple[A, A]
-tab = None # type: Tuple[A, B]
-tba = None # type: Tuple[B, A]
-
-taa = f(a, b) # Fail
-taa = f(b, a) # Fail
-tba = f(a, b) # Fail
-
-tab = f(a, b)
-tba = f(b, a)
-
-def f(a: T, b: S) -> Tuple[T, S]: pass
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-[out]
-main:9: error: Argument 2 to "f" has incompatible type "B"; expected "A"
-main:10: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-main:11: error: Argument 1 to "f" has incompatible type "A"; expected "B"
-main:11: error: Argument 2 to "f" has incompatible type "B"; expected "A"
-
-[case testConstraintSolvingWithSimpleGenerics]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ao = None # type: A[object]
-ab = None # type: A[B]
-ac = None # type: A[C]
-
-ab = f(ao) # E: Argument 1 to "f" has incompatible type A[object]; expected A[B]
-ao = f(ab) # E: Argument 1 to "f" has incompatible type A[B]; expected A[object]
-ab = f(ac) # E: Argument 1 to "f" has incompatible type A[C]; expected A[B]
-ab = g(ao) # E: Argument 1 to "g" has incompatible type A[object]; expected A[B]
-ao = g(ab) # E: Argument 1 to "g" has incompatible type A[B]; expected A[object]
-
-ab = f(ab)
-ac = f(ac)
-ao = f(ao)
-
-ab = g(ab)
-ao = g(ao)
-
-def f(a: 'A[T]') -> 'A[T]': pass
-
-def g(a: T) -> T: pass
-
-class A(Generic[T]): pass
-class B: pass
-class C: pass
-
-[case testConstraintSolvingFailureWithSimpleGenerics]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ao = None # type: A[object]
-ab = None # type: A[B]
-
-f(ao, ab) # E: Cannot infer type argument 1 of "f"
-f(ab, ao) # E: Cannot infer type argument 1 of "f"
-f(ao, ao)
-f(ab, ab)
-
-def f(a: 'A[T]', b: 'A[T]') -> None: pass
-
-class A(Generic[T]): pass
-class B: pass
-
-[case testTypeInferenceWithCalleeDefaultArgs]
-from typing import TypeVar
-T = TypeVar('T')
-a = None # type: A
-o = None # type: object
-
-a = f(o)    # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = g(a, o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-o = f()
-o = f(o)
-a = f(a)
-a = g(a)
-
-def f(a: T = None) -> T: pass
-def g(a: T, b: T = None) -> T: pass
-
-class A: pass
-
-
--- Generic function inference with multiple inheritance
--- ----------------------------------------------------
-
-
-[case testGenericFunctionInferenceWithMultipleInheritance]
-from typing import TypeVar
-
-class I: pass
-class J: pass
-
-class A(I, J): pass
-class B(I, J): pass
-class C(I): pass
-class D(J): pass
-
-T = TypeVar('T')
-def f(a: T, b: T) -> T: pass
-def g(x: I) -> None: pass
-
-a = f(A(), C())
-g(a)
-b = f(A(), B())
-g(b)
-c = f(A(), D())
-g(c) # E: Argument 1 to "g" has incompatible type "J"; expected "I"
-d = f(D(), A())
-g(d) # E: Argument 1 to "g" has incompatible type "J"; expected "I"
-e = f(D(), C())
-g(e) # E: Argument 1 to "g" has incompatible type "object"; expected "I"
-
-[case testGenericFunctionInferenceWithMultipleInheritance2]
-from typing import TypeVar
-
-class I: pass
-class J: pass
-
-class A(I): pass
-class B(A, J): pass
-class C(I, J): pass
-
-T = TypeVar('T')
-def f(a: T, b: T) -> T: pass
-def g(x: I) -> None: pass
-def h(x: J) -> None: pass
-
-a = f(B(), C())
-g(a)
-h(a) # E: Argument 1 to "h" has incompatible type "I"; expected "J"
-b = f(C(), B())
-g(b)
-h(b) # E: Argument 1 to "h" has incompatible type "I"; expected "J"
-c = f(A(), B())
-g(a)
-h(b) # E: Argument 1 to "h" has incompatible type "I"; expected "J"
-
-[case testGenericFunctionInferenceWithMultipleInheritance3]
-from typing import TypeVar
-
-class I: pass
-class J: pass
-class K(J): pass
-
-class A(K): pass
-class B(A, I): pass
-class C(I, J): pass
-
-T = TypeVar('T')
-def f(a: T, b: T) -> T: pass
-def g(x: K) -> None: pass
-
-a = f(B(), C())
-g(a) # E: Argument 1 to "g" has incompatible type "J"; expected "K"
-b = f(A(), C())
-g(b) # E: Argument 1 to "g" has incompatible type "J"; expected "K"
-c = f(A(), B())
-g(c)
-
-[case testPrecedenceOfFirstBaseAsInferenceResult]
-from typing import TypeVar
-from abc import abstractmethod, ABCMeta
-T = TypeVar('T')
-a, i, j = None, None, None # type: (A, I, J)
-
-a = f(B(), C())
-
-class I(metaclass=ABCMeta): pass
-class J(metaclass=ABCMeta): pass
-
-def f(a: T, b: T) -> T: pass
-
-class A: pass
-class B(A, I, J): pass
-class C(A, I, J): pass
-
-
--- Generic function inference with function arguments
--- --------------------------------------------------
-
-
-[case testNonOverloadedMapInference]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-class A: pass
-b = bool()
-def f(x: bool) -> A: pass
-def mymap(f: Callable[[t], s], a: List[t]) -> List[s]: pass
-
-l = mymap(f, [b])
-l = [A()]
-lb = [b]
-l = lb # E: Incompatible types in assignment (expression has type List[bool], variable has type List[A])
-[builtins fixtures/for.pyi]
-
-
--- Generic function inference with unions
--- --------------------------------------
-
-
-[case testUnionInference]
-from typing import TypeVar, Union, List
-T = TypeVar('T')
-U = TypeVar('U')
-def f(x: Union[T, int], y: T) -> T: pass
-f(1, 'a')() # E: "str" not callable
-f('a', 1)() # E: "object" not callable
-f('a', 'a')() # E: "str" not callable
-f(1, 1)() # E: "int" not callable
-
-def g(x: Union[T, List[T]]) -> List[T]: pass
-def h(x: List[str]) -> None: pass
-g('a')() # E: List[str] not callable
-
-# The next line is a case where there are multiple ways to satisfy a constraint
-# involving a Union. Either T = List[str] or T = str would turn out to be valid,
-# but mypy doesn't know how to branch on these two options (and potentially have
-# to backtrack later) and defaults to T = None. The result is an awkward error
-# message. Either a better error message, or simply accepting the call, would be
-# preferable here.
-g(['a']) # E: Argument 1 to "g" has incompatible type List[str]; expected List[None]
-
-h(g(['a']))
-
-def i(x: Union[List[T], List[U]], y: List[T], z: List[U]) -> None: pass
-a = [1]
-b = ['b']
-i(a, a, b)
-i(b, a, b)
-i(a, b, b) # E: Argument 1 to "i" has incompatible type List[int]; expected List[str]
-[builtins fixtures/list.pyi]
-
-
-[case testUnionInferenceWithTypeVarValues]
-from typing import TypeVar, Union
-AnyStr = TypeVar('AnyStr', bytes, str)
-def f(x: Union[AnyStr, int], *a: AnyStr) -> None: pass
-f('foo')
-f('foo', 'bar')
-f('foo', b'bar') # E: Type argument 1 of "f" has incompatible value "object"
-f(1)
-f(1, 'foo')
-f(1, 'foo', b'bar') # E: Type argument 1 of "f" has incompatible value "object"
-[builtins fixtures/primitives.pyi]
-
-
-[case testUnionTwoPassInference-skip]
-from typing import TypeVar, Union, List
-T = TypeVar('T')
-U = TypeVar('U')
-def j(x: Union[List[T], List[U]], y: List[T]) -> List[U]: pass
-
-a = [1]
-b = ['b']
-# We could infer: Since List[str] <: List[T], we must have T = str.
-# Then since List[int] <: Union[List[str], List[U]], and List[int] is
-# not a subtype of List[str], we must have U = int.
-# This is not currently implemented.
-j(a, b)
-[builtins fixtures/list.pyi]
-
-
-[case testUnionContext]
-from typing import TypeVar, Union, List
-T = TypeVar('T')
-def f() -> List[T]: pass
-d1 = f() # type: Union[List[int], str]
-d2 = f() # type: Union[int, str] # E: Incompatible types in assignment (expression has type List[None], variable has type "Union[int, str]")
-def g(x: T) -> List[T]: pass
-d3 = g(1) # type: Union[List[int], List[str]]
-[builtins fixtures/list.pyi]
-
-
-[case testGenericFunctionSubtypingWithUnions]
-from typing import TypeVar, Union, List
-T = TypeVar('T')
-S = TypeVar('S')
-def k1(x: int, y: List[T]) -> List[Union[T, int]]: pass
-def k2(x: S, y: List[T]) -> List[Union[T, int]]: pass
-a = k2
-a = k2
-a = k1 # E: Incompatible types in assignment (expression has type Callable[[int, List[T]], List[Union[T, int]]], variable has type Callable[[S, List[T]], List[Union[T, int]]])
-b = k1
-b = k1
-b = k2
-[builtins fixtures/list.pyi]
-
-
--- Literal expressions
--- -------------------
-
-
-[case testDictLiteral]
-from typing import Dict
-class A: pass
-class B: pass
-def d_ab() -> Dict[A, B]: return {}
-def d_aa() -> Dict[A, A]: return {}
-a, b = None, None # type: (A, B)
-d = {a:b}
-d = d_ab()
-d = d_aa() # E: Incompatible types in assignment (expression has type Dict[A, A], variable has type Dict[A, B])
-[builtins fixtures/dict.pyi]
-
-[case testSetLiteral]
-from typing import Any, Set
-a, x = None, None # type: (int, Any)
-def s_i() -> Set[int]: return set()
-def s_s() -> Set[str]: return set()
-s = {a}
-s = {x}
-s = s_i()
-s = s_s() # E: Incompatible types in assignment (expression has type Set[str], variable has type Set[int])
-[builtins fixtures/set.pyi]
-
-[case testSetWithStarExpr]
-# flags: --fast-parser
-s = {1, 2, *(3, 4)}
-t = {1, 2, *s}
-reveal_type(s)  # E: Revealed type is 'builtins.set[builtins.int*]'
-reveal_type(t)  # E: Revealed type is 'builtins.set[builtins.int*]'
-[builtins fixtures/set.pyi]
-
-
--- For statements
--- --------------
-
-
-[case testInferenceOfFor1]
-a, b = None, None # type: (A, B)
-
-for x in [A()]:
-    b = x # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    a = x
-
-for y in []: # E: Need type annotation for variable
-    a = y
-
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-
-[case testInferenceOfFor2]
-
-a, b, c = None, None, None # type: (A, B, C)
-for x, (y, z) in [(A(), (B(), C()))]:
-    b = x # Fail
-    c = y # Fail
-    a = z # Fail
-    a = x
-    b = y
-    c = z
-for xx, yy, zz in [(A(), B())]: # Fail
-    pass
-for xx, (yy, zz) in [(A(), B())]: # Fail
-    pass
-for xxx, yyy in [(None, None)]: # Fail
-    pass
-
-class A: pass
-class B: pass
-class C: pass
-[builtins fixtures/for.pyi]
-[out]
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "C")
-main:6: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:10: error: Need more than 2 values to unpack (3 expected)
-main:12: error: '__main__.B' object is not iterable
-main:14: error: Need type annotation for variable
-
-[case testInferenceOfFor3]
-
-a, b = None, None # type: (A, B)
-
-for x, y in [[A()]]:
-    b = x # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    b = y # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    a = x
-    a = y
-
-for e, f in [[]]: # E: Need type annotation for variable
-    pass
-
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-
-[case testForStatementInferenceWithVoid]
-import typing
-for x in f(): # E: "f" does not return a value
-    pass
-def f() -> None: pass
-[builtins fixtures/for.pyi]
-
-[case testReusingInferredForIndex]
-import typing
-for a in [A()]: pass
-a = A()
-a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-for a in []: pass
-a = A()
-a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-
-[case testReusingInferredForIndex2]
-import typing
-def f() -> None:
-    for a in [A()]: pass
-    a = A()
-    a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    for a in []: pass
-    a = A()
-    a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Regression tests
--- ----------------
-
-
-[case testMultipleAssignmentWithPartialDefinition]
-
-a = None # type: A
-x, a = a, a
-x = a
-a = x
-x = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-class A: pass
-
-[case testMultipleAssignmentWithPartialDefinition2]
-
-a = None # type: A
-a, x = [a, a]
-x = a
-a = x
-x = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-class A: pass
-[builtins fixtures/for.pyi]
-
-[case testMultipleAssignmentWithPartialDefinition3]
-from typing import Any
-a = None # type: A
-x, a = Any(a)
-x = a
-a = x
-x = object()
-a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-class A: pass
-
-[case testInferGlobalDefinedInBlock]
-import typing
-if A:
-    a = A()
-    a = A()
-    a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-class A: pass
-class B: pass
-
-
--- Inferring attribute types
--- -------------------------
-
-
-[case testInferAttributeType]
-import typing
-class A:
-    a = B()
-class B: pass
-
-A().a = B()
-A().a = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testInferAttributeTypeAndAssignInInit]
-import typing
-class A:
-    a = B()
-    def __init__(self) -> None:
-        self.a = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-        self.a = B()
-class B: pass
-[out]
-
-[case testInferAttributeInInit]
-import typing
-class B: pass
-class A:
-    def __init__(self) -> None:
-        self.a = A()
-        self.b = B()
-a = A()
-a.a = A()
-a.b = B()
-a.a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a.b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testInferAttributeInInitUsingChainedAssignment]
-import typing
-class B: pass
-class A:
-    def __init__(self) -> None:
-        self.a = self.b = A()
-a = A()
-a.a = A()
-a.b = A()
-a.a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a.b = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-
--- Lambdas
--- -------
-
-
-[case testInferLambdaType]
-from typing import List, Callable
-li = [1]
-l = lambda: li
-f1 = l # type: Callable[[], List[int]]
-f2 = l # type: Callable[[], List[str]] # E: Incompatible types in assignment (expression has type Callable[[], List[int]], variable has type Callable[[], List[str]])
-[builtins fixtures/list.pyi]
-
-[case testInferLambdaType2]
-from typing import List, Callable
-l = lambda: [B()]
-f1 = l # type: Callable[[], List[B]]
-f2 = l # type: Callable[[], List[A]] # E: Incompatible types in assignment (expression has type Callable[[], List[B]], variable has type Callable[[], List[A]])
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testUninferableLambda]
-from typing import TypeVar, Callable
-X = TypeVar('X')
-def f(x: Callable[[X], X]) -> X: pass
-y = f(lambda x: x) # E: Cannot infer type argument 1 of "f"
-
-[case testUninferableLambdaWithTypeError]
-from typing import TypeVar, Callable
-X = TypeVar('X')
-def f(x: Callable[[X], X], y: str) -> X: pass
-y = f(lambda x: x, 1) # Fail
-[out]
-main:4: error: Cannot infer type argument 1 of "f"
-main:4: error: Argument 2 to "f" has incompatible type "int"; expected "str"
-
-[case testInferLambdaNone]
-from typing import Callable
-def f(x: Callable[[], None]) -> None: pass
-def g(x: Callable[[], int]) -> None: pass
-a = lambda: None
-f(a)
-g(a) # E: Argument 1 to "g" has incompatible type Callable[[], None]; expected Callable[[], int]
-b = lambda: None  # type: Callable[[], None]
-f(b)
-g(b) # E: Argument 1 to "g" has incompatible type Callable[[], None]; expected Callable[[], int]
-
-
--- Boolean operators
--- -----------------
-
-
-[case testOrOperationWithGenericOperands]
-from typing import List
-a = None # type: List[A]
-o = None # type: List[object]
-a2 = a or []
-a = a2
-a2 = o # E: Incompatible types in assignment (expression has type List[object], variable has type List[A])
-class A: pass
-[builtins fixtures/list.pyi]
-
-
--- Accessing variable before its type has been inferred
--- ----------------------------------------------------
-
-
-[case testAccessGlobalVarBeforeItsTypeIsAvailable]
-import typing
-x.y  # E: Cannot determine type of 'x'
-x = object()
-x.y  # E: "object" has no attribute "y"
-
-[case testAccessDataAttributeBeforeItsTypeIsAvailable]
-
-a = None # type: A
-a.x.y  # E: Cannot determine type of 'x'
-class A:
-   def __init__(self) -> None:
-       self.x = object()
-a.x.y  # E: "object" has no attribute "y"
-
-
--- Ducktype declarations
--- ---------------------
-
-
-[case testListWithDucktypeCompatibility]
-from typing import List, _promote
-class A: pass
- at _promote(A)
-class B: pass
-a = None  # type: List[A]
-x1 = [A(), B()]
-x2 = [B(), A()]
-x3 = [B(), B()]
-a = x1
-a = x2
-a = x3 # E: Incompatible types in assignment (expression has type List[B], variable has type List[A])
-[builtins fixtures/list.pyi]
-
-[case testListWithDucktypeCompatibilityAndTransitivity]
-from typing import List, _promote
-class A: pass
- at _promote(A)
-class B: pass
- at _promote(B)
-class C: pass
-a = None  # type: List[A]
-x1 = [A(), C()]
-x2 = [C(), A()]
-x3 = [B(), C()]
-a = x1
-a = x2
-a = x3 # E: Incompatible types in assignment (expression has type List[B], variable has type List[A])
-[builtins fixtures/list.pyi]
-
-
--- Inferring type of variable when initialized to an empty collection
--- ------------------------------------------------------------------
-
-
-[case testInferListInitializedToEmpty]
-a = []
-a.append(1)
-a.append('')  # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyUsingUpdate]
-a = []
-a.extend([''])
-a.append(0)  # E: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndNotAnnotated]
-a = []  # E: Need type annotation for variable
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndReadBeforeAppend]
-a = []  # E: Need type annotation for variable
-if a: pass
-a.xyz
-a.append('')
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndIncompleteTypeInAppend]
-a = [] # E: Need type annotation for variable
-a.append([])
-a()
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndMultipleAssignment]
-a, b = [], []
-a.append(1)
-b.append('')
-a() # E: List[int] not callable
-b() # E: List[str] not callable
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyInFunction]
-def f() -> None:
-   a = []
-   a.append(1)
-   a.append('')  # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndNotAnnotatedInFunction]
-def f() -> None:
-    a = []  # E: Need type annotation for variable
-
-def g() -> None: pass
-
-a = []
-a.append(1)
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndReadBeforeAppendInFunction]
-def f() -> None:
-    a = []  # E: Need type annotation for variable
-    if a: pass
-    a.xyz
-    a.append('')
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyInClassBody]
-class A:
-   a = []
-   a.append(1)
-   a.append('')  # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndNotAnnotatedInClassBody]
-class A:
-    a = []  # E: Need type annotation for variable
-
-class B:
-    a = []
-    a.append(1)
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyInMethod]
-class A:
-    def f(self) -> None:
-        a = []
-        a.append(1)
-        a.append('')  # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndNotAnnotatedInMethod]
-class A:
-    def f(self) -> None:
-        a = []  # E: Need type annotation for variable
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyInMethodViaAttribute]
-class A:
-    def f(self) -> None:
-        # Attributes aren't supported right now.
-        self.a = [] # E: Need type annotation for variable
-        self.a.append(1) # E: Cannot determine type of 'a'
-        self.a.append('') # E: Cannot determine type of 'a'
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferSetInitializedToEmpty]
-a = set()
-a.add(1)
-a.add('')  # E: Argument 1 to "add" of "set" has incompatible type "str"; expected "int"
-[builtins fixtures/set.pyi]
-[out]
-
-[case testInferSetInitializedToEmptyUsingDiscard]
-a = set()
-a.discard('')
-a.add(0)  # E: Argument 1 to "add" of "set" has incompatible type "int"; expected "str"
-[builtins fixtures/set.pyi]
-[out]
-
-[case testInferSetInitializedToEmptyUsingUpdate]
-a = set()
-a.update({0})
-a.add('')  # E: Argument 1 to "add" of "set" has incompatible type "str"; expected "int"
-[builtins fixtures/set.pyi]
-[out]
-
-[case testInferDictInitializedToEmpty]
-a = {}
-a[1] = ''
-a() # E: Dict[int, str] not callable
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testInferDictInitializedToEmptyUsingUpdate]
-a = {}
-a.update({'': 42})
-a() # E: Dict[str, int] not callable
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testInferDictInitializedToEmptyUsingUpdateError]
-a = {}  # E: Need type annotation for variable
-a.update([1, 2])
-a()
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testInferDictInitializedToEmptyAndIncompleteTypeInUpdate]
-a = {} # E: Need type annotation for variable
-a[1] = {}
-b = {} # E: Need type annotation for variable
-b[{}] = 1
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testInferDictInitializedToEmptyAndUpdatedFromMethod]
-map = {}
-def add():
-    map[1] = 2
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testSpecialCaseEmptyListInitialization]
-def f(blocks: Any): # E: Name 'Any' is not defined
-    to_process = [] # E: Need type annotation for variable
-    to_process = list(blocks)
-[builtins fixtures/list.pyi]
-[out]
-
-[case testSpecialCaseEmptyListInitialization2]
-def f(blocks: object):
-    to_process = [] # E: Need type annotation for variable
-    to_process = list(blocks) # E: No overload variant of "list" matches argument types [builtins.object]
-[builtins fixtures/list.pyi]
-[out]
-
-
--- Inferring types of variables first initialized to None (partial types)
--- ----------------------------------------------------------------------
-
-
-[case testLocalVariablePartiallyInitializedToNone]
-def f() -> None:
-    if object():
-        x = None
-    else:
-        x = 1
-    x() # E: "int" not callable
-[out]
-
-[case testLocalVariablePartiallyTwiceInitializedToNone]
-def f() -> None:
-    if object():
-        x = None
-    elif object():
-        x = None
-    else:
-        x = 1
-    x() # E: "int" not callable
-[out]
-
-[case testLvarInitializedToNoneWithoutType]
-import typing
-def f() -> None:
-    a = None # E: Need type annotation for variable
-    a.x() # E: None has no attribute "x"
-[out]
-
-[case testGvarPartiallyInitializedToNone]
-x = None
-if object():
-    x = 1
-x() # E: "int" not callable
-
-[case testPartiallyInitializedToNoneAndThenToPartialList]
-x = None
-if object():
-    # Promote from partial None to partial list.
-    x = []
-    x.append(1)
-x.append('') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-
-[case testPartiallyInitializedToNoneAndThenReadPartialList]
-x = None
-if object():
-    # Promote from partial None to partial list.
-    x = []  # E: Need type annotation for variable
-    x
-[builtins fixtures/list.pyi]
-
-[case testPartiallyInitializedToNoneAndPartialListAndLeftPartial]
-def f() -> None:
-    x = None
-    if object():
-        # Promote from partial None to partial list.
-        x = []  # E: Need type annotation for variable
-[builtins fixtures/list.pyi]
-[out]
-
-[case testPartiallyInitializedToNoneAndThenToIncompleteType]
-from typing import TypeVar,  Dict
-T = TypeVar('T')
-def f(*x: T) -> Dict[int, T]: pass
-x = None  # E: Need type annotation for variable
-if object():
-    x = f()
-[builtins fixtures/dict.pyi]
-
-[case testPartiallyInitializedVariableDoesNotEscapeScope1]
-def f() -> None:
-    x = None  # E: Need type annotation for variable
-x = 1
-[out]
-
-[case testPartiallyInitializedVariableDoesNotEscapeScope2]
-x = None  # E: Need type annotation for variable
-def f() -> None:
-    x = None
-    x = 1
-x()  # E: None not callable
-
-[case testAttributePartiallyInitializedToNone]
-class A:
-    def f(self) -> None:
-        self.x = None
-        self.x = 1
-        self.x() # E: "int" not callable
-[out]
-
-[case testAttributePartiallyInitializedToNoneWithMissingAnnotation]
-class A:
-    def f(self) -> None:
-        self.x = None
-
-    def g(self) -> None:
-        self.x = 1
-        self.x()
-[out]
-main:3: error: Need type annotation for variable
-main:7: error: "int" not callable
-
-[case testGlobalInitializedToNoneSetFromFunction]
-a = None
-def f():
-    global a
-    a = 42
-[out]
-
-[case testGlobalInitializedToNoneSetFromMethod]
-a = None
-class C:
-    def m(self):
-        global a
-        a = 42
-[out]
-
--- More partial type errors
--- ------------------------
-
-[case testPartialTypeErrorSpecialCase1]
-# This used to crash.
-class A:
-    x = None
-    def f(self) -> None:
-        for a in self.x:
-            pass
-[builtins fixtures/for.pyi]
-[out]
-main:3: error: Need type annotation for variable
-main:5: error: None has no attribute "__iter__"
-
-[case testPartialTypeErrorSpecialCase2]
-# This used to crash.
-class A:
-    x = []
-    def f(self) -> None:
-        for a in self.x:
-            pass
-[builtins fixtures/for.pyi]
-[out]
-main:3: error: Need type annotation for variable
-
-[case testPartialTypeErrorSpecialCase3]
-class A:
-    x = None
-    def f(self) -> None:
-        for a in A.x:
-            pass
-[builtins fixtures/for.pyi]
-[out]
-main:2: error: Need type annotation for variable
-main:4: error: None has no attribute "__iter__"
-
-
--- Multipass
--- ---------
-
-
-[case testMultipassAndAccessVariableBeforeDefinition]
-def f() -> None:
-    y = x
-    y() # E: "int" not callable
-x = 1
-[out]
-
-[case testMultipassAndAccessInstanceVariableBeforeDefinition]
-class A:
-    def f(self) -> None:
-        y = self.x
-        y() # E: "int" not callable
-
-    def g(self) -> None:
-        self.x = 1
-[out]
-
-[case testMultipassAndTopLevelVariable]
-y = x # E: Cannot determine type of 'x'
-y()
-x = 1+0
-[out]
-
-[case testMultipassAndDecoratedMethod]
-from typing import Callable, TypeVar
-
-T = TypeVar('T')
-
-class A:
-    def f(self) -> None:
-        self.g() # E: Too few arguments for "g" of "A"
-        self.g(1)
-    @dec
-    def g(self, x: str) -> None: pass
-
-def dec(f: Callable[[A, str], T]) -> Callable[[A, int], T]: pass
-[out]
-
-[case testMultipassAndDefineAttributeBasedOnNotReadyAttribute]
-class A:
-    def f(self) -> None:
-        self.y = self.x
-
-    def g(self) -> None:
-        self.x = 1
-
-    def h(self) -> None:
-        self.y() # E: "int" not callable
-[out]
-
-[case testMultipassAndDefineAttributeBasedOnNotReadyAttribute2]
-class A:
-    def f(self) -> None:
-        self.y = self.x
-        self.z = self.y
-        self.z() # E
-        self.y() # E
-
-    def g(self) -> None:
-        self.x = 1
-
-    def h(self) -> None:
-        self.y() # E
-[out]
-main:5: error: "int" not callable
-main:6: error: "int" not callable
-main:12: error: "int" not callable
-
-[case testMultipassAndPartialTypes]
-def f() -> None:
-    x = []
-    y
-    x.append(1)
-    x.append('') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-    x.append(y) # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-y = ''
-[builtins fixtures/list.pyi]
-[out]
-
-[case testMultipassAndPartialTypes2]
-s = ''
-n = 0
-def f() -> None:
-    global s, n
-    x = []
-    x.append(y)
-    s = x[0]
-    n = x[0] # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-    x.append(1) # E: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"
-y = ''
-[builtins fixtures/list.pyi]
-[out]
-
-[case testMultipassAndPartialTypes3]
-from typing import Dict
-def g(d: Dict[str, int]) -> None: pass
-def f() -> None:
-    x = {}
-    x[1] = y
-    g(x) # E: Argument 1 to "g" has incompatible type Dict[int, str]; expected Dict[str, int]
-    x[1] = 1 # E: Incompatible types in assignment (expression has type "int", target has type "str")
-    x[1] = ''
-y = ''
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testMultipassAndPartialTypes4]
-from typing import Dict
-def g(d: Dict[str, int]) -> None: pass
-def f() -> None:
-    x = {}
-    y
-    x[1] = 1
-    g(x) # E: Argument 1 to "g" has incompatible type Dict[int, int]; expected Dict[str, int]
-y = ''
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testMultipassAndCircularDependency]
-class A:
-    def f(self) -> None:
-        self.x = self.y # E: Cannot determine type of 'y'
-
-    def g(self) -> None:
-        self.y = self.x
-[out]
-
-[case testMultipassAndPartialTypesSpecialCase1]
-def f() -> None:
-    y = o
-    x = []
-    x.append(y)
-    x() # E: List[int] not callable
-o = 1
-[builtins fixtures/list.pyi]
-[out]
-
-[case testMultipassAndPartialTypesSpecialCase2]
-def f() -> None:
-    y = o
-    x = {}
-    x[''] = y
-    x() # E: Dict[str, int] not callable
-o = 1
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testMultipassAndPartialTypesSpecialCase3]
-def f() -> None:
-    x = {} # E: Need type annotation for variable
-    y = o
-    z = {} # E: Need type annotation for variable
-o = 1
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testMultipassAndPartialTypesSpecialCase4]
-def f() -> None:
-    y = o
-    x = None
-    x = y
-    x() # E: "int" not callable
-o = 1
-[out]
-
-[case testMultipassAndPartialTypesSpecialCase5]
-def f() -> None:
-    x = None
-    y = o
-    x = y
-    x() # E: "int" not callable
-o = 1
-[out]
-
-[case testMultipassAndClassAttribute]
-class S:
-    def foo(self) -> int:
-        return R.X
-
-class R:
-    X = 2
-
-[case testMultipassAndMultipleFiles]
-import m
-def f() -> None:
-    x()
-x = 0
-[file m.py]
-def g() -> None:
-    y()
-y = 0
-[out]
-tmp/m.py:2: error: "int" not callable
-main:3: error: "int" not callable
-
-
--- Tests for special cases of unification
--- --------------------------------------
-
-[case testUnificationRedundantUnion]
-from typing import Union
-a = None  # type: Union[int, str]
-b = None  # type: Union[str, tuple]
-def f(): pass
-def g(x: Union[int, str]): pass
-c = a if f() else b
-g(c) # E: Argument 1 to "g" has incompatible type "Union[int, str, tuple]"; expected "Union[int, str]"
-
-[case testUnificationMultipleInheritance]
-class A: pass
-class B:
-    def foo(self): pass
-class C(A, B): pass
-def f(): pass
-a1 = B() if f() else C()
-a1.foo()
-a2 = C() if f() else B()
-a2.foo()
-
-[case testUnificationMultipleInheritanceAmbiguous]
-# Show that join_instances_via_supertype() breaks ties using the first base class.
-class A1: pass
-class B1:
-    def foo1(self): pass
-class C1(A1, B1): pass
-
-class A2: pass
-class B2:
-    def foo2(self): pass
-class C2(A2, B2): pass
-
-class D1(C1, C2): pass
-class D2(C2, C1): pass
-
-def f(): pass
-
-a1 = D1() if f() else D2()
-a1.foo1()
-a2 = D2() if f() else D1()
-a2.foo2()
-
-[case testUnificationEmptyListLeft]
-def f(): pass
-a = [] if f() else [0]
-a() # E: List[int] not callable
-[builtins fixtures/list.pyi]
-
-[case testUnificationEmptyListRight]
-def f(): pass
-a = [0] if f() else []
-a() # E: List[int] not callable
-[builtins fixtures/list.pyi]
-
-[case testUnificationEmptyListLeftInContext]
-from typing import List
-def f(): pass
-a = [] if f() else [0] # type: List[int]
-a() # E: List[int] not callable
-[builtins fixtures/list.pyi]
-
-[case testUnificationEmptyListRightInContext]
-# TODO Find an example that really needs the context
-from typing import List
-def f(): pass
-a = [0] if f() else [] # type: List[int]
-a() # E: List[int] not callable
-[builtins fixtures/list.pyi]
-
-[case testUnificationEmptySetLeft]
-def f(): pass
-a = set() if f() else {0}
-a() # E: Set[int] not callable
-[builtins fixtures/set.pyi]
-
-[case testUnificationEmptyDictLeft]
-def f(): pass
-a = {} if f() else {0: 0}
-a() # E: Dict[int, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testUnificationEmptyDictRight]
-def f(): pass
-a = {0: 0} if f() else {}
-a() # E: Dict[int, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testUnificationDictWithEmptyListLeft]
-def f(): pass
-a = {0: []} if f() else {0: [0]}
-a() # E: Dict[int, List[int]] not callable
-[builtins fixtures/dict.pyi]
-
-[case testUnificationDictWithEmptyListRight]
-def f(): pass
-a = {0: [0]} if f() else {0: []}
-a() # E: Dict[int, List[int]] not callable
-[builtins fixtures/dict.pyi]
-
-[case testMisguidedSetItem]
-from typing import Generic, Sequence, TypeVar
-T = TypeVar('T')
-class C(Sequence[T], Generic[T]): pass
-C[0] = 0
-[out]
-main:4: error: Type expected within [...]
-main:4: error: Unsupported target for indexed assignment
diff --git a/test-data/unit/check-isinstance.test b/test-data/unit/check-isinstance.test
deleted file mode 100644
index d6041cc..0000000
--- a/test-data/unit/check-isinstance.test
+++ /dev/null
@@ -1,1330 +0,0 @@
-[case testForcedAssignment]
-x = 1 # type: object
-y = 1
-y = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-x = 2
-y = x
-[case testJoinAny]
-from typing import List, Any
-
-x = None # type: List[Any]
-
-def foo() -> List[int]: pass
-def bar() -> List[str]: pass
-
-if bool():
-    x = foo()
-else:
-    x = bar()
-
-x * 2
-[builtins fixtures/list.pyi]
-
-[case testGeneratorExpressionTypes]
-
-class A: y = 1
-x = [A()]
-y = [x]
-
-z = [1,2]
-z = [a.y for b in y for a in b]
-
-[builtins fixtures/list.pyi]
-
-[case testClassAttributeInitialization-skip]
-class A:
-    x = None # type: int
-    def __init__(self) -> None:
-        self.y = None # type: int
-        z = self.x
-        w = self.y
-[case testAssignmentSubtypes-skip]
-from typing import Union
-
-def foo(x: Union[str, int]):
-    if isinstance(x, int):
-        x = 'a'
-    x + 'a'         # Works in the current code
-    z = x           # We probably want this to be of type str.
-    y = [x]         # But what type should this be?
-    y[0] + 'a'      #  (1) Should this work?
-    y + [1]         #  (2) Or this?
-    z = 1           # Also, is this valid?
-
-x = None # type: int
-y = [x]
-[builtins fixtures/isinstancelist.pyi]
-[out]
-
-[case testFunctionDefaultArgs]
-
-class A: pass
-class B(A): y = 1
-
-x =  A()
-
-def foo(x: A = B()):
-    x.y   # E: "A" has no attribute "y"
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceFancyConditionals]
-
-class A: pass
-class B(A): y = 1
-
-x =  A()
-
-if isinstance(x, B):
-    x.y
-
-while isinstance(x, B):
-    x.y
-
-while isinstance(x, B):
-    x.y
-    x = B()
-
-[builtins fixtures/isinstance.pyi]
-
-
-[case testSubtypingWithAny]
-
-class A: y = 1
-class B(A): z = 1
-
-def foo(): pass
-
-x = A()
-x = B()
-x.z
-x = foo()
-x.z          # E: "A" has no attribute "z"
-x.y
-
-[case testSingleMultiAssignment-skip]
-
-x = 'a'
-(x, ) = ('a',)
-
-[case testUnionMultiAssignment]
-from typing import Union
-
-x = None # type: Union[int, str]
-x = 1
-x = 'a'
-x + 1    # E: Unsupported operand types for + ("str" and "int")
-x = 1
-(x, y) = ('a', 1)
-x + 1    # E: Unsupported operand types for + ("str" and "int")
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testUnionIfZigzag]
-from typing import Union
-
-def f(x: Union[int, str]) -> None:
-    x = 1
-    if x:
-        x = 'a'
-        x = 1
-    x + 1
-[builtins fixtures/isinstancelist.pyi]
-
-
-[case testTwoLoopsUnion]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-def bar() -> None:
-    x = foo()
-    if isinstance(x, int):
-        return
-    while bool():
-        x + 'a'
-        while bool():
-            x = foo()
-            if bool():
-                return
-            x = 'a'
-    x + 'a'
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testComplicatedBlocks]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-def bar() -> None:
-    x = foo()
-    if isinstance(x, int):
-        return
-    while bool():
-        x + 'a'
-        while bool():
-            x = foo()
-            if bool():
-                return
-            x = 'a'
-    x + 'a'
-
-    x = foo()
-    if isinstance(x, int):
-        return
-    while bool():
-        x + 'a'
-        while bool():
-            x + 'a'         # E: Unsupported operand types for + (likely involving Union)
-            x = foo()
-            if bool():
-                continue
-            x = 'a'
-        x = 'a'
-    x + 'a'
-[builtins fixtures/isinstancelist.pyi]
-[out]
-
-[case testUnionTryExcept]
-
-class A: y = A()
-class B(A): z = 1
-
-x = A()
-x = B()
-x.z
-try:
-    x.z
-    x = A()
-    x = B()
-    x.z
-except:
-    pass
-x.z           # E: "A" has no attribute "z"
-
-
-[case testUnionTryExcept2]
-
-class A: y = A()
-class B(A): z = 1
-
-x = A()
-try:
-    x.z # E: "A" has no attribute "z"
-    x = A()
-    x = B()
-    x.z
-except:
-    x.z # E: "A" has no attribute "z"
-    x = B()
-    x.z
-else:
-    x = B()
-x.z
-
-[case testUnionTryExcept3]
-class A: y = A()
-class B(A): z = 1
-x = A()
-x = B()
-try:
-    raise BaseException()
-    x = A()
-except:
-    pass
-x.z
-x = B()
-try:
-    x = A()
-    raise BaseException()
-except:
-    pass
-x.z           # E: "A" has no attribute "z"
-x = B()
-try:
-    pass
-except:
-    x = A()
-    raise BaseException()
-x.z
-try:
-    x = A()
-except:
-    pass
-x.z           # E: "A" has no attribute "z"
-x = B()
-try:
-    pass
-except:
-    x = A()
-x.z           # E: "A" has no attribute "z"
-[builtins fixtures/exception.pyi]
-[case testUnionTryExcept4]
-
-class A: pass
-class B(A): z = 1
-
-x = A()
-while bool():
-    try:
-        x.z # E: "A" has no attribute "z"
-        x = A()
-    except:
-        x = B()
-    else:
-        x = B()
-    x.z
-[builtins fixtures/exception.pyi]
-[case testUnionTryFinally]
-class A: pass
-class B(A): b = 1
-
-x = A()
-x = B()
-try:
-    x = A()
-    x.b # E: "A" has no attribute "b"
-    x = B()
-finally:
-    x.b  # E: "A" has no attribute "b"
-x.b
-[case testUnionTryFinally2]
-class A: pass
-class B(A): b = 1
-
-x = A()
-x = B()
-try:
-    x = A()
-    x = B()
-except:
-    pass
-finally:
-    pass
-x.b      # E: "A" has no attribute "b"
-[case testUnionTryFinally3]
-class A: pass
-class B(A): b = 1
-
-x = A()
-x = B()
-try:
-    x = A()
-    x = B()
-except:
-    pass
-finally:
-    x = B()
-x.b
-[case testUnionTryFinally4]
-class A: pass
-class B(A): b = 1
-
-while 2:
-    x = A()
-    x = B()
-    try:
-        x = A()
-        x = B()
-    except:
-        pass
-    finally:
-        x.b     # E: "A" has no attribute "b"
-        if not isinstance(x, B):
-            break
-    x.b
-[builtins fixtures/isinstancelist.pyi]
-[case testUnionTryFinally5]
-class A: pass
-class B(A): b = 1
-
-while 2:
-    x = A()
-    try:
-        x = A()
-        x = B()
-    finally:
-        x.b    # E: "A" has no attribute "b"
-        break
-        x.b
-    x.b
-[case testUnionTryFinally6]
-class A: pass
-class B(A): b = 1
-
-def f() -> int:
-    x = B()  # type: A
-    try:
-        x = B()
-    except:
-        x = A()
-        # An exception could occur here
-        x = B()
-    finally:
-        return x.b # E: "A" has no attribute "b"
-[out]
-[case testUnionListIsinstance]
-
-from typing import Union, List
-
-class A: y = A()
-class B(A): z = C()
-
-class C: pass
-class D(C): d = 1
-
-
-def f(x: Union[List[int], List[str], int]) -> None:
-    if isinstance(x, list):
-        a = x[0]
-        if isinstance(a, int):
-            a + 1
-            a + 'x' # E: Unsupported operand types for + ("int" and "str")
-
-        # type of a?
-        x + 1 # E: Unsupported operand types for + (likely involving Union)
-    else:
-        x[0] # E: Value of type "int" is not indexable
-        x + 1
-    x[0] # E: Value of type "Union[List[int], List[str], int]" is not indexable
-    x + 1 # E: Unsupported operand types for + (likely involving Union)
-[builtins fixtures/isinstancelist.pyi]
-[out]
-
-[case testUnionListIsinstance2]
-
-from typing import Union, List
-class A: a = 1
-class B: pass
-class C: pass
-
-def g(x: Union[A, B]) -> A: pass
-def h(x: C) -> A: pass
-
-def f(x: Union[A, B, C]) -> None:
-    if isinstance(x, C):
-        x = h(x)
-    else:
-        x = g(x)
-    x.a
-[builtins fixtures/isinstancelist.pyi]
-
-[case testUnionStrictDefnBasic]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x = 1
-x = x + 1
-x = foo()
-x = x + 1                # E: Unsupported operand types for + (likely involving Union)
-if isinstance(x, str):
-   x = x + 1             # E: Unsupported operand types for + ("str" and "int")
-   x = 1
-   x = x + 1
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testSubtypeRedefinitionBasic]
-from typing import Union
-
-class A: pass
-class B(A): y = 1
-
-x = A()
-x.y        # E: "A" has no attribute "y"
-x = B()
-x.y        # OK: x is known to be a B
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceBasic]
-from typing import Union
-
-x = None # type: Union[int, str]
-
-if isinstance(x, str):
-    x = x + 1   # E: Unsupported operand types for + ("str" and "int")
-    x = x + 'a'
-else:
-    x = x + 'a' # E: Unsupported operand types for + ("int" and "str")
-    x = x + 1
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceIndexing]
-from typing import Union
-
-x = None # type: Union[int, str]
-j = [x]
-
-if isinstance(j[0], str):
-    j[0] = j[0] + 'a'
-    j[0] = j[0] + 1   # E: Unsupported operand types for + ("str" and "int")
-else:
-    j[0] = j[0] + 'a' # E: Unsupported operand types for + ("int" and "str")
-    j[0] = j[0] + 1
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceSubClassMember]
-from typing import Union
-
-class Animal:
-    pass
-
-class Dog(Animal):
-    paws = 4  # type: Union[int, str]
-
-    def bark(self): pass
-
-class House:
-    pet = None  # type: Animal
-
-h = House()
-h.pet = Dog()
-
-while bool():
-    if isinstance(h.pet, Dog):
-        if isinstance(h.pet.paws, str):
-            x = h.pet.paws + 'a'
-        y = h.pet.paws + 1   # E: Unsupported operand types for + (likely involving Union)
-        z = h.pet.paws + 'a' # E: Unsupported operand types for + (likely involving Union)
-        if isinstance(h.pet.paws, str):
-            x = h.pet.paws + 'a'
-            break
-        y = h.pet.paws + 1
-        z = h.pet.paws + 'a' # E: Unsupported operand types for + ("int" and "str")
-[builtins fixtures/isinstancelist.pyi]
-[case testIsInstanceSubClassReset]
-class A: pass
-class B(A): b=1
-
-class C:
-    a = A()
-
-x = C()
-x.a.b                   # E: "A" has no attribute "b"
-if isinstance(x.a, B):
-    x.a.b
-    x = C()
-    x.a.b               # E: "A" has no attribute "b"
-[builtins fixtures/isinstance.pyi]
-[case testIsinstanceTuple]
-from typing import Union
-
-class A:
-    pass
-
-class B:
-    def method2(self, arg: int):
-        return 123
-
-class C:
-    def method2(self, arg: int):
-        return 456
-
-    def method3(self, arg: str):
-        return 'abc'
-
-v = A() # type: Union[A, B, C]
-
-if isinstance(v, (B, C)):
-    v.method2(123)
-    v.method3('xyz') # E: Some element of union has no attribute "method3"
-[builtins fixtures/isinstance.pyi]
-
-[case testMemberAssignmentChanges-skip]
-from typing import Union
-
-class Dog:
-    paws = 1  # type: Union[int, str]
-
-pet = Dog()
-
-pet.paws + 'a'  # E: moo
-pet.paws = 'a'
-pet.paws + 'a'
-pet.paws = 1
-pet.paws + 1
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceSubClassMemberHard-skip]
-from typing import Union
-
-class Animal:
-    pass
-
-class Dog(Animal):
-    paws = 4  # type: Union[int, str]
-
-    def bark(self): pass
-
-class House:
-    pet = None  # type: Animal
-
-h = House()
-h.pet = Dog()
-
-if isinstance(h.pet, Dog):
-    if isinstance(h.pet.paws, str):
-        for i in [1]:
-            h.pet.paws + 'a'
-            if bool():
-                break
-            h.pet.paws = 1
-            h.pet.paws + 1
-
-    if isinstance(h.pet.paws, str):
-        h.pet.paws + 'a'
-    else:
-        h.pet.paws + 1
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceReturn]
-from typing import Union
-
-def foo() -> None:
-    x = 1 # type: Union[int, str]
-    if isinstance(x, int):
-        return
-    y = x + 'asdad'
-
-def bar() -> None:
-    x = 1 # type: Union[int, str]
-    if isinstance(x, int):
-        return
-    else:
-        pass
-    y = x + 'asdad'
-
-foo()
-[builtins fixtures/isinstancelist.pyi]
-[case testIsInstanceBadBreak]
-from typing import Union
-
-def foo() -> None:
-    x = None # type: Union[int, str]
-    if isinstance(x, int):
-        for z in [1,2]:
-            break
-    else:
-        pass
-    y = x + 'asdad'    # E: Unsupported operand types for + (likely involving Union)
-
-foo()
-[builtins fixtures/isinstancelist.pyi]
-[out]
-[case testIsInstanceThreeUnion]
-from typing import Union, List
-
-x = None # type: Union[int, str, List[int]]
-
-while bool():
-    if isinstance(x, int):
-        x + 1
-    elif isinstance(x, str):
-        x + 'a'
-    else:
-        x + [1]
-    x + 'a'           # E: Unsupported operand types for + (likely involving Union)
-x + [1]               # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-[case testIsInstanceThreeUnion2]
-from typing import Union, List
-
-x = None # type: Union[int, str, List[int]]
-
-while bool():
-    if isinstance(x, int):
-        x + 1
-        break
-    elif isinstance(x, str):
-        x + 'a'
-        break
-    x + [1]
-    x + 'a'           # E: Unsupported operand types for + ("list" and "str")
-x + [1]               # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceThreeUnion3]
-from typing import Union, List
-
-while bool():
-    x = None # type: Union[int, str, List[int]]
-    x = 1
-    if isinstance(x, int):
-        x + 1
-        break
-    elif isinstance(x, str):
-        x + 'a'
-        break
-    x + [1]           # These lines aren't reached because x was an int
-    x + 'a'
-x + [1]               # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testRemovingTypeRepeatedly]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-for i in [1, 2]:
-    x = foo()
-    x + 'a'                 # E: Unsupported operand types for + (likely involving Union)
-    if isinstance(x, int):
-        break
-    x + 'a'
-
-    x = foo()
-    x + 'a'                 # E: Unsupported operand types for + (likely involving Union)
-    if isinstance(x, int):
-        break
-    x + 'a'
-
-    x = foo()
-    x + 'a'                 # E: Unsupported operand types for + (likely involving Union)
-    if isinstance(x, int):
-        break
-    x + 'a'
-
-x + 'a'                    # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-
-
-
-[case testModifyRepeatedly]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x + 1     # E: Unsupported operand types for + (likely involving Union)
-x + 'a'   # E: Unsupported operand types for + (likely involving Union)
-
-x = 1
-x + 1
-x + 'a'   # E: Unsupported operand types for + ("int" and "str")
-
-x = 'a'
-x + 1     # E: Unsupported operand types for + ("str" and "int")
-x + 'a'
-
-x = foo()
-x + 1     # E: Unsupported operand types for + (likely involving Union)
-x + 'a'   # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testModifyLoop]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x + 1      # E: Unsupported operand types for + (likely involving Union)
-x = 'a'
-x + 1      # E: Unsupported operand types for + ("str" and "int")
-x = 1
-x + 1
-
-while bool():
-      x + 1    # E: Unsupported operand types for + (likely involving Union)
-      x = 'a'
-[builtins fixtures/isinstancelist.pyi]
-
-[case testModifyLoop2]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x + 1      # E: Unsupported operand types for + (likely involving Union)
-x = 'a'
-x + 1      # E: Unsupported operand types for + ("str" and "int")
-x = 1
-x + 1
-
-for i in [1]:
-      x = 'a'
-
-x + 1    # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-
-
-[case testModifyLoop3]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x = 1
-
-while bool():
-    x + 1
-    x = 'a'
-    break
-else:
-    x + 1
-x + 1      # E: Unsupported operand types for + (likely involving Union)
-x = 1
-for y in [1]:
-    x + 1
-    x = 'a'
-    break
-else:
-    x + 1
-x + 1      # E: Unsupported operand types for + (likely involving Union)
-[builtins fixtures/isinstancelist.pyi]
-
-[case testModifyLoopWhile4]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x = 1
-
-while bool():
-    x + 1
-    if bool():
-        x = 'a'
-        break
-else:
-    x + 1
-    x = 'a'
-x + 'a'
-x = 1
-while bool():
-    x + 1 # E: Unsupported operand types for + (likely involving Union)
-    if bool():
-        x = 'a'
-        continue
-else:
-    x + 1 # E: Unsupported operand types for + (likely involving Union)
-    x = 'a'
-x + 'a'
-[builtins fixtures/isinstancelist.pyi]
-[case testModifyLoopFor4]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x = 1
-
-for y in [1]:
-    x + 1
-    if bool():
-        x = 'a'
-        break
-else:
-    x + 1
-    x = 'a'
-x + 'a'
-x = 1
-for y in [1]:
-    x + 1 # E: Unsupported operand types for + (likely involving Union)
-    if bool():
-        x = 'a'
-        continue
-else:
-    x + 1 # E: Unsupported operand types for + (likely involving Union)
-    x = 'a'
-x + 'a'
-[builtins fixtures/isinstancelist.pyi]
-[case testModifyNestedLoop]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x = 1
-
-for y in [1]:
-    for z in [1]:
-        break
-    else:
-        x = 'a'
-        break
-else:
-    x + 1
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-x = 1
-while bool():
-    while bool():
-        break
-    else:
-        x = 'a'
-        break
-else:
-    x + 1
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-[builtins fixtures/isinstancelist.pyi]
-
-[case testModifyLoopLong]
-from typing import Union
-
-class A: a = 1
-
-def foo() -> Union[int, str, A]: pass
-
-def bar() -> None:
-    x = foo()
-    x + 1  # E: Unsupported left operand type for + (some union)
-    if isinstance(x, A):
-       x.a
-    else:
-       if isinstance(x, int):
-          x + 1
-          x + 'a'  # E: Unsupported operand types for + ("int" and "str")
-       else:
-          x + 'a'
-          x.a      # E: "str" has no attribute "a"
-       x = A()
-
-    if isinstance(x, str):
-       x + 'a'
-    else:
-       while bool():
-          if isinstance(x, int):
-             x + 1
-          else:
-             x.a
-          break
-       while bool():
-          if isinstance(x, int):
-             x + 1
-          else:
-             x.a
-          continue
-
-       #for i in [1]:
-       while bool():
-          if isinstance(x, int):
-             x + 1
-          else:
-             x.a     # E: Some element of union has no attribute "a"
-          x = 'a'
-
-[builtins fixtures/isinstancelist.pyi]
-[out]
-
-[case testWhileExitCondition1]
-from typing import Union
-x = 1  # type: Union[int, str]
-while isinstance(x, int):
-    if bool():
-        continue
-    x = 'a'
-else:
-    reveal_type(x)  # E: Revealed type is 'builtins.str'
-reveal_type(x)  # E: Revealed type is 'builtins.str'
-[builtins fixtures/isinstance.pyi]
-
-[case testWhileExitCondition2]
-from typing import Union
-x = 1  # type: Union[int, str]
-while isinstance(x, int):
-    if bool():
-        break
-    x = 'a'
-else:
-    reveal_type(x)  # E: Revealed type is 'builtins.str'
-reveal_type(x)  # E: Revealed type is 'Union[builtins.int, builtins.str]'
-[builtins fixtures/isinstance.pyi]
-
-[case testWhileLinkedList]
-from typing import Union
-LinkedList = Union['Cons', 'Nil']
-class Nil: pass
-class Cons:
-    tail = None  # type: LinkedList
-def last(x: LinkedList) -> Nil:
-    while isinstance(x, Cons):
-        x = x.tail
-    return x
-[builtins fixtures/isinstance.pyi]
-
-[case testReturnAndFlow]
-def foo() -> int:
-    return 1 and 2
-    return 'a'
-[case testCastIsinstance]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-y = 1 # type: int
-
-if isinstance(x, str):
-    x = y
-x + 1
-x + 'a'   # E: Unsupported operand types for + ("int" and "str")
-
-[builtins fixtures/isinstancelist.pyi]
-
-
-[case testUnreachableCode]
-x = 1 # type: int
-
-while bool():
-    x = 'a'           # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-    break
-    x = 'a'           # Note: no error because unreachable code
-[builtins fixtures/isinstancelist.pyi]
-
-[case testUnreachableCode2]
-x = 1
-while bool():
-    try:
-        pass
-    except:
-        continue
-    else:
-        continue
-    x + 'a'
-[builtins fixtures/isinstance.pyi]
-
-[case testUnreachableWhileTrue]
-def f(x: int) -> None:
-    while True:
-        if x:
-            return
-    1()
-[builtins fixtures/bool.pyi]
-
-[case testUnreachableAssertFalse]
-def f() -> None:
-    assert False
-    1()
-[builtins fixtures/bool.pyi]
-
-[case testUnreachableAssertFalse2]
-# flags: --fast-parser
-def f() -> None:
-    # The old parser doesn't understand the syntax below
-    assert False, "hi"
-    1()
-[builtins fixtures/bool.pyi]
-
-[case testUnreachableReturnOrAssertFalse]
-def f(x: int) -> int:
-    if x:
-        return x
-    else:
-        assert False
-    1()
-[builtins fixtures/bool.pyi]
-
-[case testUnreachableTryExcept]
-def f() -> None:
-    try:
-        f()
-        return
-    except BaseException:
-        return
-    1()
-[builtins fixtures/exception.pyi]
-
-[case testUnreachableTryExceptElse]
-def f() -> None:
-    try:
-        f()
-    except BaseException:
-        return
-    else:
-        return
-    1()
-[builtins fixtures/exception.pyi]
-
-[case testUnreachableTryReturnFinally1]
-def f() -> None:
-    try:
-        return
-    finally:
-        pass
-    1()
-
-[case testUnreachableTryReturnFinally2]
-def f() -> None:
-    try:
-        pass
-    finally:
-        return
-    1()
-
-[case testUnreachableTryReturnExceptRaise]
-def f() -> None:
-    try:
-        return
-    except:
-        raise
-    1()
-
-[case testUnreachableReturnLambda]
-from typing import Callable
-def g(t: Callable[[int], int]) -> int: pass
-def f() -> int:
-    return g(lambda x: x)
-    1()
-
-[case testIsinstanceAnd]
-class A:
-    pass
-
-class B(A):
-    flag = 1
-
-x = B() # type: A
-
-if isinstance(x, B) and 1:
-   x.flag
-[builtins fixtures/isinstancelist.pyi]
-[case testIsinstanceShortcircuit]
-class A:
-    pass
-
-class B(A):
-    flag = 1
-
-x = B() # type: A
-
-if isinstance(x, B) and x.flag:
-    pass
-if isinstance(x, B) or x.flag: # E: "A" has no attribute "flag"
-    pass
-if not isinstance(x, B) or x.flag:
-    pass
-if not isinstance(x, B) and x.flag: # E: "A" has no attribute "flag"
-    pass
-[builtins fixtures/isinstancelist.pyi]
-[case testIsinstanceExpression]
-class A:
-    pass
-
-class B(A):
-    flag = 1
-
-x = B() # type: A
-
-x.flag if isinstance(x, B) else 0
-0 if not isinstance(x, B) else x.flag
-0 if isinstance(x, B) else x.flag # E: "A" has no attribute "flag"
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsinstanceMultiAnd]
-class A:
-    pass
-
-class B(A):
-    flag = 1
-
-class C(A):
-    glaf = 1
-
-x = B() # type: A
-y = C() # type: A
-
-if isinstance(x, B) and isinstance(y, C):
-    x.flag += 1
-    y.glaf += 1
-    x() # E: "B" not callable
-    y() # E: "C" not callable
-else:
-    x() # E: "A" not callable
-    y() # E: "A" not callable
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsinstanceMultiAndSpecialCase]
-class A:
-    pass
-
-class B(A):
-    flag = 1
-
-class C(A):
-    glaf = 1
-
-x = B() # type: A
-y = C() # type: A
-
-if isinstance(x, B) and isinstance(y, int):
-    1() # type checking skipped
-if isinstance(y, int) and isinstance(x, B):
-    1() # type checking skipped
-[builtins fixtures/isinstancelist.pyi]
-
-[case testReturnWithCallExprAndIsinstance]
-
-from typing import Union
-def f(x: Union[int, str]) -> None:
-    if not isinstance(x, int):
-        return foo()
-    x()  # E: "int" not callable
-def foo(): pass
-[builtins fixtures/isinstancelist.pyi]
-[out]
-
-[case testIsinstanceOr1]
-from typing import Optional
-def f(a: bool, x: object) -> Optional[int]:
-    if a or not isinstance(x, int):
-        return None
-    reveal_type(x) # E: Revealed type is 'builtins.int'
-    return x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceOr2]
-from typing import Optional
-def g(a: bool, x: object) -> Optional[int]:
-    if not isinstance(x, int) or a:
-        return None
-    reveal_type(x) # E: Revealed type is 'builtins.int'
-    return x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceOr3]
-from typing import Optional
-def h(a: bool, x: object) -> Optional[int]:
-    if a or isinstance(x, int):
-        return None
-    return x # E: Incompatible return value type (got "object", expected "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceWithOverlappingUnionType]
-from typing import Union
-def f(x: Union[float, int]) -> None:
-    if isinstance(x, float):
-        pass
-    if not isinstance(x, int):
-        f(x)
-[builtins fixtures/isinstance.pyi]
-
-[case testIsinstanceWithOverlappingUnionType2]
-from typing import Union
-class A: pass
-class B(A): pass
-def f(x: Union[A, B]) -> None:
-    if isinstance(x, A):
-        pass
-    if not isinstance(x, B):
-        f(x)
-[builtins fixtures/isinstance.pyi]
-
-[case testIsinstanceOfSuperclass]
-class A: pass
-class B(A): pass
-x = B()
-if isinstance(x, A):
-    reveal_type(x)  # E: Revealed type is '__main__.B'
-if not isinstance(x, A):
-    reveal_type(x)  # unreachable
-    x = A()
-reveal_type(x)  # E: Revealed type is '__main__.B'
-[builtins fixtures/isinstance.pyi]
-
-[case testIsinstanceOfNonoverlapping]
-class A: pass
-class B: pass
-x = B()
-if isinstance(x, A):
-    reveal_type(x)  # unreachable
-else:
-    reveal_type(x)  # E: Revealed type is '__main__.B'
-[builtins fixtures/isinstance.pyi]
-
-[case testAssertIsinstance]
-def f(x: object):
-    assert isinstance(x, int)
-    y = 0 # type: int
-    y = x
-[builtins fixtures/isinstance.pyi]
-
-[case testUnionAssertIsinstance]
-from typing import Union
-def f(x: Union[str, int]):
-    assert isinstance(x, int)
-    y = 0 # type: int
-    y = x
-[builtins fixtures/isinstance.pyi]
-
-[case testAnyAssertIsinstance]
-from typing import Any
-def f(x: Any):
-    assert isinstance(x, int)  # this should narrow x to type int
-    x + "foo"  # E: Unsupported operand types for + ("int" and "str")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceOfGenericClassRetainsParameters]
-from typing import List, Union
-def f(x: Union[List[int], str]) -> None:
-    if isinstance(x, list):
-        x[0]()
-[builtins fixtures/isinstancelist.pyi]
-[out]
-main:4: error: "int" not callable
-
-[case testIsinstanceOrIsinstance]
-class A: pass
-class B(A):
-    flag = 1
-class C(A):
-    flag = 2
-x1 = A()
-if isinstance(x1, B) or isinstance(x1, C):
-    reveal_type(x1) # E: Revealed type is 'Union[__main__.B, __main__.C]'
-    f = x1.flag  # type: int
-else:
-    reveal_type(x1) # E: Revealed type is '__main__.A'
-    f = 0
-x2 = A()
-if isinstance(x2, A) or isinstance(x2, C):
-    reveal_type(x2) # E: Revealed type is '__main__.A'
-    f = x2.flag # E: "A" has no attribute "flag"
-else:
-    # unreachable
-    1()
-[builtins fixtures/isinstance.pyi]
-[out]
-[case testComprehensionIsInstance]
-from typing import List, Union
-a = [] # type: List[Union[int, str]]
-l = [x for x in a if isinstance(x, int)]
-g = (x for x in a if isinstance(x, int))
-d = {0: x for x in a if isinstance(x, int)}
-reveal_type(l) # E: Revealed type is 'builtins.list[builtins.int*]'
-reveal_type(g) # E: Revealed type is 'typing.Iterator[builtins.int*]'
-reveal_type(d) # E: Revealed type is 'builtins.dict[builtins.int*, builtins.int*]'
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsinstanceInWrongOrderInBooleanOp]
-class A:
-    m = 1
-def f(x: object) -> None:
-    if x.m and isinstance(x, A) or False:  # E: "object" has no attribute "m"
-        pass
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndOr]
-class A:
-    a = None  # type: A
-
-def f(x: object) -> None:
-    b = isinstance(x, A) and x.a or A()
-    reveal_type(b)  # E: Revealed type is '__main__.A'
-[builtins fixtures/isinstance.pyi]
-[out]
diff --git a/test-data/unit/check-kwargs.test b/test-data/unit/check-kwargs.test
deleted file mode 100644
index ac8f388..0000000
--- a/test-data/unit/check-kwargs.test
+++ /dev/null
@@ -1,339 +0,0 @@
--- Test cases for keyword arguments.
-
-
-[case testTypeErrorInKeywordArgument]
-import typing
-def f(o: object) -> None: pass
-f(o=None()) # E: None not callable
-
-[case testSimpleKeywordArgument]
-import typing
-def f(a: 'A') -> None: pass
-f(a=A())
-f(a=object()) # E: Argument 1 to "f" has incompatible type "object"; expected "A"
-class A: pass
-
-[case testTwoKeywordArgumentsNotInOrder]
-import typing
-def f(a: 'A', b: 'B') -> None: pass
-f(b=A(), a=A()) # E: Argument 1 to "f" has incompatible type "A"; expected "B"
-f(b=B(), a=B()) # E: Argument 2 to "f" has incompatible type "B"; expected "A"
-f(a=A(), b=B())
-f(b=B(), a=A())
-class A: pass
-class B: pass
-
-[case testOneOfSeveralOptionalKeywordArguments]
-import typing
-def f(a: 'A' = None, b: 'B' = None, c: 'C' = None) -> None: pass
-f(a=A())
-f(b=B())
-f(c=C())
-f(b=B(), c=C())
-f(a=B()) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(b=A()) # E: Argument 1 to "f" has incompatible type "A"; expected "B"
-f(c=B()) # E: Argument 1 to "f" has incompatible type "B"; expected "C"
-f(b=B(), c=A()) # E: Argument 2 to "f" has incompatible type "A"; expected "C"
-class A: pass
-class B: pass
-class C: pass
-
-[case testBothPositionalAndKeywordArguments]
-import typing
-def f(a: 'A', b: 'B') -> None: pass
-f(A(), b=A()) # E: Argument 2 to "f" has incompatible type "A"; expected "B"
-f(A(), b=B())
-class A: pass
-class B: pass
-
-[case testContextSensitiveTypeInferenceForKeywordArg]
-from typing import List
-def f(a: 'A', b: 'List[A]') -> None: pass
-f(b=[], a=A())
-class A: pass
-[builtins fixtures/list.pyi]
-
-[case testGivingSameKeywordArgumentTwice]
-import typing
-def f(a: 'A', b: 'B') -> None: pass
-f(a=A(), b=B(), a=A()) # E: keyword argument repeated
-class A: pass
-class B: pass
-
-[case testGivingArgumentAsPositionalAndKeywordArg]
-import typing
-def f(a: 'A', b: 'B' = None) -> None: pass
-f(A(), a=A()) # E: "f" gets multiple values for keyword argument "a"
-class A: pass
-class B: pass
-
-[case testGivingArgumentAsPositionalAndKeywordArg2]
-import typing
-def f(a: 'A' = None, b: 'B' = None) -> None: pass
-f(A(), a=A()) # E: "f" gets multiple values for keyword argument "a"
-class A: pass
-class B: pass
-
-[case testPositionalAndKeywordForSameArg]
-# This used to crash in check_argument_count(). See #1095.
-def f(a: int): pass
-def g(): f(0, a=1)
-[out]
-
-[case testInvalidKeywordArgument]
-import typing
-def f(a: 'A') -> None: pass # N: "f" defined here
-f(b=object()) # E: Unexpected keyword argument "b" for "f"
-class A: pass
-
-[case testKeywordArgumentsWithDynamicallyTypedCallable]
-from typing import Any
-f = None # type: Any
-f(x=f(), z=None()) # E: None not callable
-f(f, zz=None()) # E: None not callable
-f(x=None)
-
-[case testKeywordArgumentWithFunctionObject]
-from typing import Callable
-f = None # type: Callable[[A, B], None]
-f(a=A(), b=B())
-f(A(), b=B())
-class A: pass
-class B: pass
-[out]
-main:3: error: Unexpected keyword argument "a"
-main:3: error: Unexpected keyword argument "b"
-main:4: error: Unexpected keyword argument "b"
-
-[case testKeywordOnlyArguments]
-import typing
-def f(a: 'A', *, b: 'B' = None) -> None: pass
-def g(a: 'A', *, b: 'B') -> None: pass
-def h(a: 'A', *, b: 'B', aa: 'A') -> None: pass
-def i(a: 'A', *, b: 'B', aa: 'A' = None) -> None: pass
-f(A(), b=B())
-f(b=B(), a=A())
-f(A())
-f(A(), B()) # E: Too many positional arguments for "f"
-g(A(), b=B())
-g(b=B(), a=A())
-g(A()) # E: Missing named argument "b" for function "g"
-g(A(), B()) # E: Too many positional arguments for "g"
-h(A()) # E: Missing named argument "b" for function "h" # E: Missing named argument "aa" for function "h"
-h(A(), b=B()) # E: Missing named argument "aa" for function "h"
-h(A(), aa=A()) # E: Missing named argument "b" for function "h"
-h(A(), b=B(), aa=A())
-h(A(), aa=A(), b=B())
-i(A()) # E: Missing named argument "b" for function "i"
-i(A(), b=B())
-i(A(), aa=A()) # E: Missing named argument "b" for function "i"
-i(A(), b=B(), aa=A())
-i(A(), aa=A(), b=B())
-
-class A: pass
-class B: pass
-
-[case testKeywordOnlyArgumentsFastparse]
-# flags: --fast-parser
-import typing
-def f(a: 'A', *, b: 'B' = None) -> None: pass
-def g(a: 'A', *, b: 'B') -> None: pass
-def h(a: 'A', *, b: 'B', aa: 'A') -> None: pass
-def i(a: 'A', *, b: 'B', aa: 'A' = None) -> None: pass
-f(A(), b=B())
-f(b=B(), a=A())
-f(A())
-f(A(), B()) # E: Too many positional arguments for "f"
-g(A(), b=B())
-g(b=B(), a=A())
-g(A()) # E: Missing named argument "b" for function "g"
-g(A(), B()) # E: Too many positional arguments for "g"
-h(A()) # E: Missing named argument "b" for function "h" # E: Missing named argument "aa" for function "h"
-h(A(), b=B()) # E: Missing named argument "aa" for function "h"
-h(A(), aa=A()) # E: Missing named argument "b" for function "h"
-h(A(), b=B(), aa=A())
-h(A(), aa=A(), b=B())
-i(A()) # E: Missing named argument "b" for function "i"
-i(A(), b=B())
-i(A(), aa=A()) # E: Missing named argument "b" for function "i"
-i(A(), b=B(), aa=A())
-i(A(), aa=A(), b=B())
-
-class A: pass
-class B: pass
-
-[case testKwargsAfterBareArgs]
-from typing import Tuple, Any
-def f(a, *, b=None) -> None: pass
-a = None  # type: Any
-b = None  # type: Any
-f(a, **b)
-
-[builtins fixtures/dict.pyi]
-
-[case testKeywordArgAfterVarArgs]
-import typing
-def f(*a: 'A', b: 'B' = None) -> None: pass
-f()
-f(A())
-f(A(), A())
-f(b=B())
-f(A(), b=B())
-f(A(), A(), b=B())
-f(B())      # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(A(), B()) # E: Argument 2 to "f" has incompatible type "B"; expected "A"
-f(b=A())    # E: Argument 1 to "f" has incompatible type "A"; expected "B"
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testKeywordArgAfterVarArgsWithBothCallerAndCalleeVarArgs]
-from typing import List
-def f(*a: 'A', b: 'B' = None) -> None: pass
-a = None # type: List[A]
-f(*a)
-f(A(), *a)
-f(b=B())
-f(*a, b=B())
-f(A(), *a, b=B())
-f(A(), B())   # E: Argument 2 to "f" has incompatible type "B"; expected "A"
-f(A(), b=A()) # E: Argument 2 to "f" has incompatible type "A"; expected "B"
-f(*a, b=A())  # E: Argument 2 to "f" has incompatible type "A"; expected "B"
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testCallingDynamicallyTypedFunctionWithKeywordArgs]
-import typing
-def f(x, y=A()): pass
-f(x=A(), y=A())
-f(y=A(), x=A())
-f(y=A())      # E: Missing positional argument "x" in call to "f"
-f(A(), z=A()) # E: Unexpected keyword argument "z" for "f"
-class A: pass
-
-[case testKwargsArgumentInFunctionBody]
-from typing import Dict, Any
-def f( **kwargs: 'A') -> None:
-    d1 = kwargs # type: Dict[str, A]
-    d2 = kwargs # type: Dict[A, Any] # E: Incompatible types in assignment (expression has type Dict[str, A], variable has type Dict[A, Any])
-    d3 = kwargs # type: Dict[Any, str] # E: Incompatible types in assignment (expression has type Dict[str, A], variable has type Dict[Any, str])
-class A: pass
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testKwargsArgumentInFunctionBodyWithImplicitAny]
-from typing import Dict, Any
-def f(**kwargs) -> None:
-    d1 = kwargs # type: Dict[str, A]
-    d2 = kwargs # type: Dict[str, str]
-    d3 = kwargs # type: Dict[A, Any] # E: Incompatible types in assignment (expression has type Dict[str, Any], variable has type Dict[A, Any])
-class A: pass
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testCallingFunctionThatAcceptsVarKwargs]
-import typing
-def f( **kwargs: 'A') -> None: pass
-f()
-f(x=A())
-f(y=A(), z=A())
-f(x=B()) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(A())   # E: Too many arguments for "f"
-# Perhaps a better message would be "Too many *positional* arguments..."
-class A: pass
-class B: pass
-[builtins fixtures/dict.pyi]
-
-[case testCallingFunctionWithKeywordVarArgs]
-from typing import Dict
-def f( **kwargs: 'A') -> None: pass
-d = None # type: Dict[str, A]
-f(**d)
-f(x=A(), **d)
-d2 = None # type: Dict[str, B]
-f(**d2)        # E: Argument 1 to "f" has incompatible type **Dict[str, B]; expected "A"
-f(x=A(), **d2) # E: Argument 2 to "f" has incompatible type **Dict[str, B]; expected "A"
-class A: pass
-class B: pass
-[builtins fixtures/dict.pyi]
-
-[case testInvalidTypeForKeywordVarArg]
-from typing import Dict
-def f( **kwargs: 'A') -> None: pass
-d = None # type: Dict[A, A]
-f(**d)         # E: Keywords must be strings
-f(**A())       # E: Argument after ** must be a dictionary
-class A: pass
-[builtins fixtures/dict.pyi]
-
-[case testPassingKeywordVarArgsToNonVarArgsFunction]
-from typing import Any, Dict
-def f(a: 'A', b: 'B') -> None: pass
-d = None # type: Dict[str, Any]
-f(**d)
-d2 = None # type: Dict[str, A]
-f(**d2) # E: Argument 1 to "f" has incompatible type **Dict[str, A]; expected "B"
-class A: pass
-class B: pass
-[builtins fixtures/dict.pyi]
-
-[case testBothKindsOfVarArgs]
-from typing import Any, List, Dict
-def f(a: 'A', b: 'A') -> None: pass
-l = None # type: List[Any]
-d = None # type: Dict[Any, Any]
-f(*l, **d)
-class A: pass
-[builtins fixtures/dict.pyi]
-
-[case testKeywordArgumentAndCommentSignature]
-import typing
-def f(x): # type: (int) -> str # N: "f" defined here
-    pass
-f(x='') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-f(x=0)
-f(y=0) # E: Unexpected keyword argument "y" for "f"
-
-[case testKeywordArgumentAndCommentSignature2]
-import typing
-class A:
-    def f(self, x): # type: (int) -> str
-        pass
-A().f(x='') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-A().f(x=0)
-A().f(y=0) # E: Unexpected keyword argument "y" for "f" of "A"
-
-[case testKeywordVarArgsAndCommentSignature]
-import typing
-def f(**kwargs): # type: (**int) -> None
-    pass
-f(z=1)
-f(x=1, y=1)
-f(x='', y=1) # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-f(x=1, y='') # E: Argument 2 to "f" has incompatible type "str"; expected "int"
-[builtins fixtures/dict.pyi]
-
-[case testCallsWithStars]
-def f(a: int) -> None:
-    pass
-
-s = ('',)
-f(*s) # E: Argument 1 to "f" has incompatible type *"Tuple[str]"; expected "int"
-
-a = {'': 0}
-f(a) # E: Argument 1 to "f" has incompatible type Dict[str, int]; expected "int"
-f(**a) # okay
-
-b = {'': ''}
-f(b) # E: Argument 1 to "f" has incompatible type Dict[str, str]; expected "int"
-f(**b) # E: Argument 1 to "f" has incompatible type **Dict[str, str]; expected "int"
-
-c = {0: 0}
-f(**c) # E: Keywords must be strings
-[builtins fixtures/dict.pyi]
-
-[case testCallStar2WithStar]
-def f(**k): pass
-f(*(1, 2))  # E: Too many arguments for "f"
-[builtins fixtures/dict.pyi]
diff --git a/test-data/unit/check-lists.test b/test-data/unit/check-lists.test
deleted file mode 100644
index c9c67e8..0000000
--- a/test-data/unit/check-lists.test
+++ /dev/null
@@ -1,72 +0,0 @@
--- Nested list assignment
--- -----------------------------
-
-[case testNestedListAssignment]
-from typing import List
-a1, b1, c1 = None, None, None # type: (A, B, C)
-a2, b2, c2 = None, None, None # type: (A, B, C)
-
-a1, [b1, c1] = a2, [b2, c2]
-a1, [a1, [b1, c1]] = a2, [a2, [b2, c2]]
-a1, [a1, [a1, b1]] = a1, [a1, [a1, c1]]  # E: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-class A: pass
-class B: pass
-class C: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testNestedListAssignmentToTuple]
-from typing import List
-a, b, c = None, None, None # type: (A, B, C)
-
-a, b = [a, b]
-a, b = [a]  # E: Need more than 1 value to unpack (2 expected)
-a, b = [a, b, c]  # E: Too many values to unpack (2 expected, 3 provided)
-
-class A: pass
-class B: pass
-class C: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testListAssignmentFromTuple]
-from typing import List
-a, b, c = None, None, None # type: (A, B, C)
-t = a, b
-
-[a, b], c = t, c
-[a, c], c = t, c  # E: Incompatible types in assignment (expression has type "B", variable has type "C")
-[a, a, a], c = t, c  # E: Need more than 2 values to unpack (3 expected)
-[a], c = t, c  # E: Too many values to unpack (1 expected, 2 provided)
-
-class A: pass
-class B: pass
-class C: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testListAssignmentUnequalAmountToUnpack]
-from typing import List
-a, b, c = None, None, None # type: (A, B, C)
-
-def f() -> None: # needed because test parser tries to parse [a, b] as section header
-    [a, b] = [a, b]
-    [a, b] = [a]  # E: Need more than 1 value to unpack (2 expected)
-    [a, b] = [a, b, c]  # E: Too many values to unpack (2 expected, 3 provided)
-
-class A: pass
-class B: pass
-class C: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testListWithStarExpr]
-(x, *a) = [1, 2, 3]
-a = [1, *[2, 3]]
-reveal_type(a)  # E: Revealed type is 'builtins.list[builtins.int]'
-b = [0, *a]
-reveal_type(b)  # E: Revealed type is 'builtins.list[builtins.int*]'
-c = [*a, 0]
-reveal_type(c)  # E: Revealed type is 'builtins.list[builtins.int*]'
-[builtins fixtures/list.pyi]
diff --git a/test-data/unit/check-modules.test b/test-data/unit/check-modules.test
deleted file mode 100644
index 2444ce7..0000000
--- a/test-data/unit/check-modules.test
+++ /dev/null
@@ -1,1408 +0,0 @@
--- Type checker test cases dealing with modules and imports.
-
-[case testAccessImportedDefinitions]
-import m
-import typing
-m.f()           # E: Too few arguments for "f"
-m.f(object())   # E: Argument 1 to "f" has incompatible type "object"; expected "A"
-m.x = object()  # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-m.f(m.A())
-m.x = m.A()
-[file m.py]
-class A: pass
-def f(a: A) -> None: pass
-x = A()
-
-[case testAccessImportedDefinitions]
-import m
-import typing
-m.f(object()) # E: Argument 1 to "f" has incompatible type "object"; expected "A"
-m.f(m.A())
-[file m.py]
-class A: pass
-def f(a: A) -> None: pass
-
-[case testAccessImportedDefinitions2]
-from m import f, A
-import typing
-f(object()) # E: Argument 1 to "f" has incompatible type "object"; expected "A"
-f(A())
-[file m.py]
-class A: pass
-def f(a: A) -> None: pass
-
-[case testImportedExceptionType]
-import m
-import typing
-try:
-    pass
-except m.Err:
-    pass
-except m.Bad: # E: Exception type must be derived from BaseException
-    pass
-[file m.py]
-class Err(BaseException): pass
-class Bad: pass
-[builtins fixtures/exception.pyi]
-
-[case testImportedExceptionType2]
-from m import Err, Bad
-import typing
-try:
-    pass
-except Err:
-    pass
-except Bad: # E: Exception type must be derived from BaseException
-    pass
-[file m.py]
-class Err(BaseException): pass
-class Bad: pass
-[builtins fixtures/exception.pyi]
-
-[case testImportWithinBlock]
-import typing
-if 1:
-    import m
-    m.a = m.b   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    m.a = m.a
-    m.f()
-    m.f(m.a)    # E: Too many arguments for "f"
-    m.a = m.A()
-    m.a = m.B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[file m.py]
-class A: pass
-class B: pass
-a = A()
-b = B()
-def f() -> None: pass
-
-[case testImportWithinFunction]
-import typing
-def f() -> None:
-    from m import a, b, f, A, B
-    a = b   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    a = a
-    f()
-    f(a)    # E: Too many arguments for "f"
-    a = A()
-    a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[file m.py]
-class A: pass
-class B: pass
-a = A()
-b = B()
-def f() -> None: pass
-[out]
-
-[case testImportWithinMethod]
-import typing
-class C:
-    def f(self) -> None:
-        from m import *
-        a = b   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-        a = a
-        f()
-        f(a)    # E: Too many arguments for "f"
-        a = A()
-        a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[file m.py]
-class A: pass
-class B: pass
-a = A()
-b = B()
-def f() -> None: pass
-[out]
-
-[case testImportWithinClassBody]
-import typing
-class C:
-    import m
-    m.f()
-    m.f(C) # E: Too many arguments for "f"
-[file m.py]
-def f() -> None: pass
-[out]
-
-[case testImportWithinClassBody2]
-import typing
-class C:
-    from m import f
-    f()
-    f(C) # E: Too many arguments for "f"
-[file m.py]
-def f() -> None: pass
-[out]
-
-[case testImportWithStub]
-import _m
-_m.f("hola")
-[file _m.pyi]
-def f(c:str) -> None: pass
-[out]
-
-[case testImportWithStubIncompatibleType]
-import _m
-_m.f("hola")
-_m.f(12)  # E: Argument 1 to "f" has incompatible type "int"; expected "str"
-[file _m.py]
-def f(c):
-  print(c)
-[file _m.pyi]
-def f(c:str) -> None: pass
-
-[case testInvalidOperationsOnModules]
-import m
-import typing
-class A: pass
-m()      # E: "module" not callable
-a = m # type: A  # E: Incompatible types in assignment (expression has type "module", variable has type "A")
-m + None # E: Unsupported left operand type for + ("module")
-[file m.py]
-[builtins fixtures/module.pyi]
-
-[case testNameDefinedInDifferentModule]
-import m, n
-import typing
-m.x # E: "module" has no attribute "x"
-[file m.py]
-y = object()
-[file n.py]
-x = object()
-[builtins fixtures/module.pyi]
-
-[case testChainedAssignmentAndImports]
-import m
-
-i, s = None, None # type: (int, str)
-i = m.x
-i = m.y
-s = m.x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-s = m.y # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[file m.py]
-x = y = 1
-[builtins fixtures/primitives.pyi]
-
-[case testConditionalFunctionDefinitionAndImports]
-import m
-import typing
-m.f(1)
-m.f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[file m.py]
-x = object()
-if x:
-    def f(x: int) -> None: pass
-else:
-    def f(x: int) -> None: pass
-
-[case testTypeCheckWithUnknownModule]
-import nonexistent
-None + ''
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckWithUnknownModule2]
-import m, nonexistent
-None + ''
-m.x = 1
-m.x = ''
-[file m.py]
-x = 1
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-main:4: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testTypeCheckWithUnknownModule3]
-import nonexistent, m
-None + ''
-m.x = 1
-m.x = ''
-[file m.py]
-x = 1
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-main:4: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testTypeCheckWithUnknownModule4]
-import nonexistent, another
-None + ''
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:1: error: Cannot find module named 'another'
-main:2: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckWithUnknownModule5]
-import nonexistent as x
-None + ''
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckWithUnknownModuleUsingFromImport]
-from nonexistent import x
-None + ''
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckWithUnknownModuleUsingImportStar]
-from nonexistent import *
-None + ''
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-
-[case testAccessingUnknownModule]
-import xyz
-xyz.foo()
-xyz()
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testAccessingUnknownModule2]
-import xyz, bar
-xyz.foo()
-bar()
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:1: error: Cannot find module named 'bar'
-
-[case testAccessingUnknownModule3]
-import xyz as z
-xyz.foo()
-z()
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Name 'xyz' is not defined
-
-[case testAccessingNameImportedFromUnknownModule]
-from xyz import y, z
-y.foo()
-z()
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testAccessingNameImportedFromUnknownModule2]
-from xyz import *
-y
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Name 'y' is not defined
-
-[case testAccessingNameImportedFromUnknownModule3]
-from xyz import y as z
-y
-z
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Name 'y' is not defined
-
-[case testUnknownModuleRedefinition]
-import xab
-def xab(): pass
-[out]
-main:1: error: Cannot find module named 'xab'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testAccessingUnknownModuleFromOtherModule]
-import x
-x.nonexistent.foo
-x.z
-[file x.py]
-import nonexistent
-[builtins fixtures/module.pyi]
-[out]
-tmp/x.py:1: error: Cannot find module named 'nonexistent'
-tmp/x.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:3: error: "module" has no attribute "z"
-
-[case testUnknownModuleImportedWithinFunction]
-def f():
-    import foobar
-def foobar(): pass
-foobar('')
-[out]
-main:2: error: Cannot find module named 'foobar'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:4: error: Too many arguments for "foobar"
-
-[case testUnknownModuleImportedWithinFunction2]
-def f():
-    from foobar import x
-def x(): pass
-x('')
-[out]
-main:2: error: Cannot find module named 'foobar'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:4: error: Too many arguments for "x"
-
-[case testRelativeImports]
-import typing
-import m.a
-m.a.x = m.a.y # Error
-[file m/__init__.py]
-[file m/a.py]
-import typing
-from .b import A, B, x, y
-z = x
-z = y # Error
-[file m/b.py]
-import typing
-class A: pass
-class B: pass
-x = A()
-y = B()
-[out]
-tmp/m/a.py:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testRelativeImports2]
-import typing
-import m.a
-m.a.x = m.a.y # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[file m/__init__.py]
-[file m/a.py]
-import typing
-from .b import A, B, x, y
-[file m/b.py]
-import typing
-class A: pass
-class B: pass
-x = A()
-y = B()
-
-[case testExportedValuesInImportAll]
-import typing
-from m import *
-_ = a
-_ = b
-_ = c
-_ = d
-_ = e
-_ = f # E: Name 'f' is not defined
-_ = _g # E: Name '_g' is not defined
-[file m.py]
-__all__ = ['a']
-__all__ += ('b',)
-__all__.append('c')
-__all__.extend(('d', 'e'))
-
-a = b = c = d = e = f = _g = 1
-[builtins fixtures/module_all.pyi]
-
-[case testAllMustBeSequenceStr]
-import typing
-__all__ = [1, 2, 3]
-[builtins fixtures/module_all.pyi]
-[out]
-main:2: error: Type of __all__ must be Sequence[str], not List[int]
-
-[case testAllMustBeSequenceStr_python2]
-import typing
-__all__ = [1, 2, 3]
-[builtins_py2 fixtures/module_all_python2.pyi]
-[out]
-main:2: error: Type of __all__ must be Sequence[unicode], not List[int]
-
-[case testAllUnicodeSequenceOK_python2]
-import typing
-__all__ = [u'a', u'b', u'c']
-[builtins_py2 fixtures/module_all_python2.pyi]
-
-[out]
-
-[case testEllipsisInitializerInStubFileWithType]
-import m
-m.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[file m.pyi]
-x = ... # type: int
-
-[case testEllipsisInitializerInStubFileWithoutType]
-import m
-m.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "ellipsis")
-[file m.pyi]
-# Ellipsis is only special with a # type: comment (not sure though if this is great)
-x = ...
-
-[case testEllipsisInitializerInModule]
-x = ... # type: int # E: Incompatible types in assignment (expression has type "ellipsis", variable has type "int")
-
-[case testEllipsisDefaultArgValueInStub]
-import m
-m.f(1)
-m.f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[file m.pyi]
-def f(x: int = ...) -> None: pass
-
-[case testEllipsisDefaultArgValueInStub2]
-import m
-def f(x: int = ...) -> None: pass
-[file m.pyi]
-def g(x: int = '') -> None: pass
-[out]
-tmp/m.pyi:1: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:2: error: Incompatible types in assignment (expression has type "ellipsis", variable has type "int")
-
-[case testEllipsisDefaultArgValueInNonStub]
-def f(x: int = ...) -> None: pass # E: Incompatible types in assignment (expression has type "ellipsis", variable has type "int")
-[out]
-
-[case testStarImportOverlapping]
-from m1 import *
-from m2 import *
-j = ''
-[file m1.py]
-x = 1
-[file m2.py]
-x = 1
-
-[case testStarImportOverlappingMismatch]
-from m1 import *
-from m2 import * # E: Incompatible import of "x" (imported name has type "int", local name has type "str")
-j = ''
-[file m1.py]
-x = ''
-[file m2.py]
-x = 1
-
-[case testStarImportOverridingLocalImports-skip]
-from m1 import *
-from m2 import *
-x = '' # E: TODO (cannot assign str to int)
-[file m1.py]
-x = 1
-[file m2.py]
-x = 1
-
-[case testAssignToFuncDefViaImport]
-from m import *  # E: Incompatible import of "x" (imported name has type "int", local name has type "str")
-f = None # E: Need type annotation for variable
-x = ''
-[file m.py]
-def f(): pass
-x = 1+0
-[out]
-
-
--- Conditional definitions and function redefinitions via module object
--- --------------------------------------------------------------------
-
-
-[case testConditionalImportAndAssign]
-try:
-    from m import x
-except:
-    x = None
-try:
-    from m import x as y
-except:
-    y = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[file m.py]
-x = ''
-
-[case testAssignAndConditionalImport]
-x = ''
-try:
-    from m import x
-except:
-    pass
-y = 1
-try:
-    from m import x as y  # E: Incompatible import of "y" (imported name has type "str", local name has type "int")
-except:
-    pass
-[file m.py]
-x = ''
-
-[case testAssignAndConditionalStarImport]
-x = ''
-y = 1
-try:
-    from m import * # E: Incompatible import of "y" (imported name has type "str", local name has type "int")
-except:
-    pass
-[file m.py]
-x = ''
-y = ''
-
-[case testRedefineImportedFunctionViaImport]
-try:
-    from m import f, g
-except:
-    def f(x): pass
-    def g(x): pass # E: All conditional function variants must have identical signatures
-[file m.py]
-def f(x): pass
-def g(x, y): pass
-
-[case testImportedVariableViaImport]
-try:
-    from m import x
-except:
-    from n import x # E: Incompatible import of "x" (imported name has type "str", local name has type "int")
-[file m.py]
-x = 1
-[file n.py]
-x = ''
-
-[case testRedefineFunctionViaImport]
-def f(x): pass
-def g(x): pass
-try:
-    from m import f, g # E: Incompatible import of "g" (imported name has type Callable[[Any, Any], Any], local name has type Callable[[Any], Any])
-except:
-    pass
-[file m.py]
-def f(x): pass
-def g(x, y): pass
-
-[case testImportVariableAndAssignNone]
-try:
-    from m import x
-except:
-    x = None
-[file m.py]
-x = 1
-
-[case testImportFunctionAndAssignNone]
-try:
-    from m import f
-except:
-    f = None
-[file m.py]
-def f(): pass
-
-[case testImportFunctionAndAssignFunction]
-def g(x): pass
-try:
-    from m import f
-except:
-    f = g
-[file m.py]
-def f(x): pass
-
-[case testImportFunctionAndAssignIncompatible]
-try:
-    from m import f
-except:
-    f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Callable[[], Any])
-[file m.py]
-def f(): pass
-
-[case testAssignToFuncDefViaGlobalDecl2]
-import typing
-from m import f
-def g() -> None:
-    global f
-    f = None
-    f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Callable[[], Any])
-[file m.py]
-def f(): pass
-[out]
-
-[case testAssignToFuncDefViaNestedModules]
-import m.n
-m.n.f = None
-m.n.f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Callable[[], Any])
-[file m/__init__.py]
-[file m/n.py]
-def f(): pass
-[out]
-
-[case testAssignToFuncDefViaModule]
-import m
-m.f = None
-m.f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Callable[[], Any])
-[file m.py]
-def f(): pass
-[out]
-
-[case testConditionalImportAndAssignNoneToModule]
-if object():
-    import m
-else:
-    m = None
-m.f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "str"
-[file m.py]
-def f(x: str) -> None: pass
-[builtins fixtures/module.pyi]
-[out]
-
-[case testConditionalImportAndAssignInvalidToModule]
-if object():
-    import m
-else:
-    m = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "module")
-[file m.py]
-[builtins fixtures/module.pyi]
-[out]
-
-[case testImportAndAssignToModule]
-import m
-m = None
-m.f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "str"
-[file m.py]
-def f(x: str) -> None: pass
-[builtins fixtures/module.pyi]
-[out]
-
-
--- Test cases that simulate 'mypy -m modname'
---
--- The module name to import is encoded in a comment.
-
-[case testTypeCheckNamedModule]
-# cmd: mypy -m m.a
-[file m/__init__.py]
-None + 1
-[file m/a.py]
-[out]
-tmp/m/__init__.py:1: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckNamedModule2]
-# cmd: mypy -m m.a
-[file m/__init__.py]
-[file m/a.py]
-None + 1
-[out]
-tmp/m/a.py:1: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckNamedModule3]
-# cmd: mypy -m m
-[file m/__init__.py]
-None + 1
-[file m/a.py]
-[out]
-tmp/m/__init__.py:1: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckNamedModule4]
-# cmd: mypy -m m
-[file m/__init__.py]
-[file m/a.py]
-None + 1  # Not analyzed.
-[out]
-
-[case testTypeCheckNamedModule5]
-# cmd: mypy -m m
-None + ''  # Not analyzed.
-[file m.py]
-None + 1
-[out]
-tmp/m.py:1: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckNamedModuleWithImportCycle]
-# cmd: mypy -m m.a
-None + 1  # Does not generate error, as this file won't be analyzed.
-[file m/__init__.py]
-import m.a
-[file m/a.py]
-[out]
-
-
--- Checks dealing with submodules and different kinds of imports
--- -------------------------------------------------------------
-
-[case testSubmoduleRegularImportAddsAllParents]
-import a.b.c
-reveal_type(a.value)  # E: Revealed type is 'builtins.int'
-reveal_type(a.b.value)  # E: Revealed type is 'builtins.str'
-reveal_type(a.b.c.value)  # E: Revealed type is 'builtins.float'
-b.value  # E: Name 'b' is not defined
-c.value  # E: Name 'c' is not defined
-
-[file a/__init__.py]
-value = 3
-[file a/b/__init__.py]
-value = "a"
-[file a/b/c.py]
-value = 3.2
-[out]
-
-[case testSubmoduleImportAsDoesNotAddParents]
-import a.b.c as foo
-reveal_type(foo.value)  # E: Revealed type is 'builtins.float'
-a.value  # E: Name 'a' is not defined
-b.value  # E: Name 'b' is not defined
-c.value  # E: Name 'c' is not defined
-
-[file a/__init__.py]
-value = 3
-[file a/b/__init__.py]
-value = "a"
-[file a/b/c.py]
-value = 3.2
-[out]
-
-[case testSubmoduleImportFromDoesNotAddParents]
-from a import b
-reveal_type(b.value)  # E: Revealed type is 'builtins.str'
-b.c.value  # E: "module" has no attribute "c"
-a.value  # E: Name 'a' is not defined
-
-[file a/__init__.py]
-value = 3
-[file a/b/__init__.py]
-value = "a"
-[file a/b/c.py]
-value = 3.2
-[builtins fixtures/module.pyi]
-[out]
-
-[case testSubmoduleImportFromDoesNotAddParents2]
-from a.b import c
-reveal_type(c.value)  # E: Revealed type is 'builtins.float'
-a.value  # E: Name 'a' is not defined
-b.value  # E: Name 'b' is not defined
-
-[file a/__init__.py]
-value = 3
-[file a/b/__init__.py]
-value = "a"
-[file a/b/c.py]
-value = 3.2
-[out]
-
-[case testSubmoduleRegularImportNotDirectlyAddedToParent]
-import a.b.c
-def accept_float(x: float) -> None: pass
-accept_float(a.b.c.value)
-
-[file a/__init__.py]
-value = 3
-b.value
-a.b.value
-
-[file a/b/__init__.py]
-value = "a"
-c.value
-a.b.c.value
-
-[file a/b/c.py]
-value = 3.2
-[out]
-tmp/a/b/__init__.py:2: error: Name 'c' is not defined
-tmp/a/b/__init__.py:3: error: Name 'a' is not defined
-tmp/a/__init__.py:2: error: Name 'b' is not defined
-tmp/a/__init__.py:3: error: Name 'a' is not defined
-
-[case testSubmoduleMixingLocalAndQualifiedNames]
-from a.b import MyClass
-val1 = None  # type: a.b.MyClass  # E: Name 'a' is not defined
-val2 = None  # type: MyClass
-
-[file a/__init__.py]
-[file a/b.py]
-class MyClass: pass
-[out]
-
-[case testSubmoduleMixingImportFrom]
-import parent.child
-
-[file parent/__init__.py]
-
-[file parent/common.py]
-class SomeClass: pass
-
-[file parent/child.py]
-from parent.common import SomeClass
-from parent import common
-foo = parent.common.SomeClass()
-
-[builtins fixtures/module.pyi]
-[out]
-tmp/parent/child.py:3: error: Name 'parent' is not defined
-
-[case testSubmoduleMixingImportFromAndImport]
-import parent.child
-
-[file parent/__init__.py]
-
-[file parent/common.py]
-class SomeClass: pass
-
-[file parent/unrelated.py]
-class ShouldNotLoad: pass
-
-[file parent/child.py]
-from parent.common import SomeClass
-import parent
-
-# Note, since this might be unintuitive -- when `parent.common` is loaded in any way,
-# shape, or form, it's added to `parent`'s namespace, which is why the below line
-# succeeds.
-foo = parent.common.SomeClass()
-reveal_type(foo)
-bar = parent.unrelated.ShouldNotLoad()
-
-[builtins fixtures/module.pyi]
-[out]
-tmp/parent/child.py:8: error: Revealed type is 'parent.common.SomeClass'
-tmp/parent/child.py:9: error: "module" has no attribute "unrelated"
-
-[case testSubmoduleMixingImportFromAndImport2]
-import parent.child
-
-[file parent/__init__.py]
-
-[file parent/common.py]
-class SomeClass: pass
-
-[file parent/child.py]
-from parent import common
-import parent
-foo = parent.common.SomeClass()
-reveal_type(foo)
-
-[builtins fixtures/module.pyi]
-[out]
-tmp/parent/child.py:4: error: Revealed type is 'parent.common.SomeClass'
-
--- Tests repeated imports
-
-[case testIdenticalImportFromTwice]
-from a import x, y, z
-from b import x, y, z
-[file a.py]
-from common import x, y, z
-[file b.py]
-from common import x, y, z
-[file common.py]
-x = 3
-def y() -> int: return 3
-class z: pass
-[out]
-
-[case testIdenticalImportStarTwice]
-from a import *
-from b import *
-[file a.py]
-from common import x, y, z
-[file b.py]
-from common import x, y, z
-[file common.py]
-x = 3
-def y() -> int: return 3
-class z: pass
-[out]
-
-[case testDifferentImportSameNameTwice]
-from a import x, y, z
-from b import x, y, z
-[file a.py]
-x = 3
-def y() -> int: return 1
-class z: pass
-[file b.py]
-x = "foo"
-def y() -> str: return "foo"
-class z: pass
-[out]
-main:2: error: Incompatible import of "x" (imported name has type "str", local name has type "int")
-main:2: error: Incompatible import of "y" (imported name has type Callable[[], str], local name has type Callable[[], int])
-main:2: error: Incompatible import of "z" (imported name has type "z" (type object), local name has type "z" (type object))
-
--- Misc
-
-[case testInheritFromBadImport]
-# cmd: mypy -m bar
-[file foo.py]
-pass
-[file bar.py]
-from foo import B
-class C(B):
-    pass
-[out]
-tmp/bar.py:1: error: Module 'foo' has no attribute 'B'
-
-[case testImportSuppressedWhileAlmostSilent]
-# cmd: mypy -m main
-# flags: --follow-imports=error
-[file main.py]
-import mod
-[file mod.py]
-[builtins fixtures/module.pyi]
-[out]
-tmp/main.py:1: note: Import of 'mod' ignored
-tmp/main.py:1: note: (Using --follow-imports=error, module not passed on command line)
-
-[case testAncestorSuppressedWhileAlmostSilent]
-# cmd: mypy -m foo.bar
-# flags: --follow-imports=error
-[file foo/bar.py]
-[file foo/__init__.py]
-[builtins fixtures/module.pyi]
-[out]
-tmp/foo/bar.py: note: Ancestor package 'foo' ignored
-tmp/foo/bar.py: note: (Using --follow-imports=error, submodule passed on command line)
-
-[case testStubImportNonStubWhileSilent]
-# cmd: mypy -m main
-# flags: --follow-imports=skip
-[file main.py]
-from stub import x # Permitted
-from other import y # Disallowed
-x + '' # Error here
-y + '' # But not here
-[file stub.pyi]
-from non_stub import x
-[file non_stub.py]
-x = 42
-[file other.py]
-y = 42
-[builtins fixtures/module.pyi]
-[out]
-tmp/main.py:3: error: Unsupported left operand type for + ("int")
-
-[case testSilentSubmoduleImport]
-# cmd: mypy -m foo
-# flags: --follow-imports=skip
-[file foo/__init__.py]
-from foo import bar
-[file foo/bar.py]
-pass
-
-[case testSuperclassInImportCycle]
-import a
-import d
-a.A().f(d.D())
-[file a.py]
-if 0:
-    import d
-class B: pass
-class C(B): pass
-class A:
-    def f(self, x: B) -> None: pass
-[file d.py]
-import a
-class D(a.C): pass
-
-[case testSuperclassInImportCycleReversedImports]
-import d
-import a
-a.A().f(d.D())
-[file a.py]
-if 0:
-    import d
-class B: pass
-class C(B): pass
-class A:
-    def f(self, x: B) -> None: pass
-[file d.py]
-import a
-class D(a.C): pass
-
-[case testPreferPackageOverFile]
-import a
-[file a.py]
-/  # intentional syntax error -- this file shouldn't be parsed
-[file a/__init__.py]
-pass
-[out]
-
-[case testPreferPackageOverFile2]
-from a import x
-[file a.py]
-/  # intentional syntax error -- this file shouldn't be parsed
-[file a/__init__.py]
-x = 0
-[out]
-
-[case testImportInClass]
-class C:
-    import foo
-reveal_type(C.foo.bar)  # E: Revealed type is 'builtins.int'
-[file foo.py]
-bar = 0
-[builtins fixtures/module.pyi]
-[out]
-
-[case testIfFalseImport]
-if False:
-    import a
-def f(x: 'a.A') -> int:
-    return x.f()
-[file a.py]
-class A:
-    def f(self) -> int:
-        return 0
-[builtins fixtures/bool.pyi]
-
-
--- Test stability under import cycles
--- ----------------------------------
-
--- The first two tests are identical except one main has 'import x'
--- and the other 'import y'.  Previously (before build.order_ascc()
--- was added) one of these would fail because the imports were
--- processed in the (reverse) order in which the files were
--- encountered.
-
-[case testImportCycleStability1]
-import x
-[file x.py]
-def f() -> str: return ''
-class Base:
-    attr = f()
-def foo():
-    import y
-[file y.py]
-import x
-class Sub(x.Base):
-    attr = x.Base.attr
-[out]
-
-[case testImportCycleStability2]
-import y
-[file x.py]
-def f() -> str: return ''
-class Base:
-    attr = f()
-def foo():
-    import y
-[file y.py]
-import x
-class Sub(x.Base):
-    attr = x.Base.attr
-[out]
-
--- This case isn't fixed by order_ascc(), but is fixed by the
--- lightweight type inference added to semanal.py
--- (analyze_simple_literal_type()).
-
-[case testImportCycleStability3]
-import y
-[file x.py]
-class Base:
-    pass
-def foo() -> int:
-    import y
-    reveal_type(y.Sub.attr)
-    return y.Sub.attr
-[file y.py]
-import x
-class Sub(x.Base):
-    attr = 0
-[out]
-tmp/x.py:5: error: Revealed type is 'builtins.int'
-
--- This case has a symmetrical cycle, so it doesn't matter in what
--- order the files are processed.  It depends on the lightweight type
--- interference.
-
-[case testImportCycleStability4]
-import x
-[file x.py]
-import y
-class C:
-    attr = ''
-def foo() -> int:
-    return y.D.attr
-[file y.py]
-import x
-class D:
-    attr = 0
-def bar() -> str:
-    return x.C.attr
-
--- These cases test all supported literal types.
-
-[case testImportCycleStability5]
-import y
-[file x.py]
-class Base:
-    pass
-def foo() -> None:
-    import y
-    i = y.Sub.iattr  # type: int
-    f = y.Sub.fattr  # type: float
-    s = y.Sub.sattr  # type: str
-    b = y.Sub.battr  # type: bytes
-[file y.py]
-import x
-class Sub(x.Base):
-    iattr = 0
-    fattr = 0.0
-    sattr = ''
-    battr = b''
-[out]
-
-[case testImportCycleStability6_python2]
-import y
-[file x.py]
-class Base:
-    pass
-def foo():
-    # type: () -> None
-    import y
-    i = y.Sub.iattr  # type: int
-    f = y.Sub.fattr  # type: float
-    s = y.Sub.sattr  # type: str
-    u = y.Sub.uattr  # type: unicode
-[file y.py]
-import x
-class Sub(x.Base):
-    iattr = 0
-    fattr = 0.0
-    sattr = ''
-    uattr = u''
-[out]
-
--- This case tests module-level variables.
-
-[case testImportCycleStability7]
-import x
-[file x.py]
-def foo() -> int:
-    import y
-    reveal_type(y.value)
-    return y.value
-[file y.py]
-import x
-value = 12
-[out]
-tmp/x.py:3: error: Revealed type is 'builtins.int'
-
--- This is not really cycle-related but still about the lightweight
--- type checker.
-
-[case testImportCycleStability8]
-x = 1  # type: str
-reveal_type(x)
-[out]
-main:1: error: Incompatible types in assignment (expression has type "int", variable has type "str")
-main:2: error: Revealed type is 'builtins.str'
-
--- Tests for cross-module second_pass checking.
-
-[case testSymmetricImportCycle1]
-import a
-[file a.py]
-import b
-def f() -> int:
-    return b.x
-y = 0 + 0
-[file b.py]
-import a
-def g() -> int:
-    reveal_type(a.y)
-    return a.y
-x = 1 + 1
-[out]
-tmp/b.py:3: error: Revealed type is 'builtins.int'
-
-[case testSymmetricImportCycle2]
-import b
-[file a.py]
-import b
-def f() -> int:
-    reveal_type(b.x)
-    return b.x
-y = 0 + 0
-[file b.py]
-import a
-def g() -> int:
-    return a.y
-x = 1 + 1
-[out]
-tmp/a.py:3: error: Revealed type is 'builtins.int'
-
-[case testThreePassesRequired]
-import b
-[file a.py]
-import b
-class C:
-    def f1(self) -> None:
-        self.x2
-    def f2(self) -> None:
-        self.x2 = b.b
-[file b.py]
-import a
-b = 1 + 1
-[out]
-tmp/a.py:4: error: Cannot determine type of 'x2'
-
-[case testErrorInPassTwo1]
-import b
-[file a.py]
-import b
-def f() -> None:
-    a = b.x + 1
-    a + ''
-[file b.py]
-import a
-x = 1 + 1
-[out]
-tmp/a.py:4: error: Unsupported operand types for + ("int" and "str")
-
-[case testErrorInPassTwo2]
-import a
-[file a.py]
-import b
-def f() -> None:
-    a = b.x + 1
-    a + ''
-[file b.py]
-import a
-x = 1 + 1
-[out]
-tmp/a.py:4: error: Unsupported operand types for + ("int" and "str")
-
-[case testDeferredDecorator]
-import a
-[file a.py]
-import b
-def g() -> None:
-    f('')
- at b.deco
-def f(a: str) -> int: pass
-reveal_type(f)
-x = 1 + 1
-[file b.py]
-from typing import Callable, TypeVar
-import a
-T = TypeVar('T')
-def deco(f: Callable[[T], int]) -> Callable[[T], int]:
-    a.x
-    return f
-[out]
-tmp/a.py:6: error: Revealed type is 'def (builtins.str*) -> builtins.int'
-
-[case testDeferredClassContext]
-class A:
-    def f(self) -> str: return 'foo'
-class B(A):
-    def f(self) -> str: return self.x
-    def initialize(self): self.x = 'bar'
-[out]
-
-
--- Scripts and __main__
-
-[case testScriptsAreModules]
-# flags: --scripts-are-modules
-[file a]
-pass
-[file b]
-pass
-
-[case testScriptsAreNotModules]
-# cmd: mypy a b
-[file a]
-pass
-[file b]
-pass
-[out]
-
-[case testTypeCheckPrio]
-# cmd: mypy -m part1 part2 part3 part4
-
-[file part1.py]
-from part3 import Thing
-class FirstThing: pass
-
-[file part2.py]
-from part4 import part4_thing as Thing
-
-[file part3.py]
-from part2 import Thing
-reveal_type(Thing)
-
-[file part4.py]
-from typing import TYPE_CHECKING
-if TYPE_CHECKING:
-    from part1 import FirstThing
-def part4_thing(a: int) -> str: pass
-
-[builtins fixtures/bool.pyi]
-[out]
-tmp/part3.py:2: error: Revealed type is 'def (a: builtins.int) -> builtins.str'
-
-[case testImportStarAliasAnyList]
-import bar
-
-[file bar.py]
-from foo import *
-def bar(y: AnyAlias) -> None:  pass
-
-l = None # type: ListAlias[int]
-reveal_type(l)
-
-[file foo.py]
-from typing import Any, List
-AnyAlias = Any
-ListAlias = List
-[builtins fixtures/list.pyi]
-[out]
-tmp/bar.py:5: error: Revealed type is 'builtins.list[builtins.int]'
-
-[case testImportStarAliasSimpleGeneric]
-from ex2a import *
-
-def do_something(dic: Row) -> None:
-    pass
-
-def do_another() -> Row:
-    return {}
-
-do_something({'good': 'bad'}) # E: List item 0 has incompatible type "Tuple[str, str]"
-reveal_type(do_another()) # E: Revealed type is 'builtins.dict[builtins.str, builtins.int]'
-
-[file ex2a.py]
-from typing import Dict
-Row = Dict[str, int]
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testImportStarAliasGeneric]
-from y import *
-notes = None  # type: G[X]
-another = G[X]()
-second = XT[str]()
-last = XT[G]()
-
-reveal_type(notes) # E: Revealed type is 'y.G[y.G[builtins.int]]'
-reveal_type(another) # E: Revealed type is 'y.G[y.G*[builtins.int]]'
-reveal_type(second) # E: Revealed type is 'y.G[builtins.str*]'
-reveal_type(last) # E: Revealed type is 'y.G[y.G*]'
-
-[file y.py]
-from typing import Generic, TypeVar
-
-T = TypeVar('T')
-
-class G(Generic[T]):
-    pass
-
-X = G[int]
-XT = G[T]
-[out]
-
-[case testImportStarAliasCallable]
-from foo import *
-from typing import Any
-
-def bar(x: Any, y: AnyCallable) -> Any:
-    return 'foo'
-
-cb = None # type: AnyCallable
-reveal_type(cb) # E: Revealed type is 'def (*Any, **Any) -> Any'
-
-[file foo.py]
-from typing import Callable, Any
-AnyCallable = Callable[..., Any]
-[out]
diff --git a/test-data/unit/check-multiple-inheritance.test b/test-data/unit/check-multiple-inheritance.test
deleted file mode 100644
index 678ccad..0000000
--- a/test-data/unit/check-multiple-inheritance.test
+++ /dev/null
@@ -1,242 +0,0 @@
--- Test cases for multiple inheritance.
---
--- Related: check-abstract.test
-
-
--- No name collisions
--- ------------------
-
-
-[case testSimpleMultipleInheritanceAndMethods]
-import typing
-class A:
-    def f(self, x: int) -> None: pass
-class B:
-    def g(self, x: str) -> None: pass
-class C(A, B): pass
-c = C()
-c.f(1)
-c.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-c.g('')
-c.g(1)  # E: Argument 1 to "g" of "B" has incompatible type "int"; expected "str"
-
-[case testSimpleMultipleInheritanceAndMethods2]
-import typing
-class A:
-    def f(self, x: int) -> None: pass
-class B:
-    def g(self, x): pass
-class C(A, B): pass
-c = C()
-c.f(1)
-c.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-c.g('')
-c.g(1)
-
-[case testSimpleMultipleInheritanceAndInstanceVariables]
-import typing
-class A:
-    def f(self) -> None:
-        self.x = 1
-class B:
-    def g(self) -> None:
-        self.y = ''
-class C(A, B): pass
-c = C()
-c.x = 1
-c.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-c.y = ''
-c.y = 1  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testSimpleMultipleInheritanceAndInstanceVariableInClassBody]
-import typing
-class A:
-    x = 1
-class B:
-    y = ''
-class C(A, B): pass
-c = C()
-c.x = 1
-c.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-c.y = ''
-c.y = 1  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testSimpleMultipleInheritanceAndClassVariable]
-import typing
-class A:
-    x = 1
-class B:
-    y = ''
-class C(A, B): pass
-C.x = 1
-C.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-C.y = ''
-C.y = 1  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-
--- Name collisions
--- ---------------
-
-
-[case testMethodNameCollisionInMultipleInheritanceWithValidSigs]
-import typing
-class A:
-    def f(self, x: int) -> None: pass
-class B:
-    def f(self, x: int) -> None: pass
-class C(A, B): pass
-c = C()
-c.f(1)
-c.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testInstanceVarNameOverlapInMultipleInheritanceWithCompatibleTypes]
-import typing
-class A:
-    def f(self) -> None:
-        self.x = 1
-class B:
-    def g(self) -> None:
-        self.x = 1
-class C(A, B): pass
-c = C()
-c.x = 1
-c.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testClassVarNameOverlapInMultipleInheritanceWithCompatibleTypes]
-import typing
-class A:
-    x = 1
-class B:
-    x = 1
-class C(A, B): pass
-c = C()
-c.x = 1
-c.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-C.x = 1
-C.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testMethodNameCollisionInMultipleInheritanceWithIncompatibleSigs]
-import typing
-class A:
-    def f(self, x: int) -> None: pass
-class B:
-    def f(self, x: str) -> None: pass
-class C(A, B): pass
-[out]
-main:6: error: Definition of "f" in base class "A" is incompatible with definition in base class "B"
-
-[case testMethodNameCollisionInMultipleInheritanceWithIncompatibleSigs2]
-import typing
-class A:
-    def f(self, x: int) -> None: pass
-class B:
-    def f(self, x, y): pass
-class C(A, B): pass
-class D(B, A): pass
-[out]
-main:6: error: Definition of "f" in base class "A" is incompatible with definition in base class "B"
-main:7: error: Definition of "f" in base class "B" is incompatible with definition in base class "A"
-
-
-[case testMethodOverridingWithBothDynamicallyAndStaticallyTypedMethods]
-class A:
-    def f(self) -> int: pass
-class B:
-    def f(self): pass
-class C(B, A): pass
-class D(A, B): pass
-[out]
-
-[case testInstanceVarNameOverlapInMultipleInheritanceWithInvalidTypes]
-import typing
-class A:
-    def f(self) -> None:
-        self.x = 1
-class B:
-    def g(self) -> None:
-        self.x = ''
-class C(A, B): pass
-[out]
-main:8: error: Definition of "x" in base class "A" is incompatible with definition in base class "B"
-
-[case testClassVarNameOverlapInMultipleInheritanceWithInvalidTypes]
-import typing
-class A:
-    x = 1
-class B:
-    x = ''
-class C(A, B): pass
-[out]
-main:6: error: Definition of "x" in base class "A" is incompatible with definition in base class "B"
-
-[case testMethodOverlapsWithClassVariableInMultipleInheritance]
-from typing import Callable
-class A:
-    def f(self) -> None: pass
-class B:
-    f = ''
-class C(A, B): pass
-[out]
-main:6: error: Definition of "f" in base class "A" is incompatible with definition in base class "B"
-
-[case testMethodOverlapsWithInstanceVariableInMultipleInheritance]
-from typing import Callable
-class A:
-    def f(self) -> None: pass
-class B:
-    def g(self) -> None:
-        self.f = ''
-class C(A, B): pass
-[out]
-main:7: error: Definition of "f" in base class "A" is incompatible with definition in base class "B"
-
-[case testMultipleInheritanceAndInit]
-import typing
-class A:
-    def __init__(self, x: int) -> None: pass
-class B:
-    def __init__(self) -> None: pass
-class C(A, B): pass
-
-[case testMultipleInheritanceAndDifferentButCompatibleSignatures]
-class A:
-    def clear(self): pass
-
-class B:
-    def clear(self, x=None): pass
-
-class C(B, A): pass
-class D(A, B): pass
-[out]
-main:8: error: Definition of "clear" in base class "A" is incompatible with definition in base class "B"
-
-
--- Special cases
--- -------------
-
-
-[case testGenericInheritanceAndOverridingWithMultipleInheritance]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-class G(Generic[T]):
-    def f(self, s: int) -> 'G[T]': pass
-class A(G[int]):
-    def f(self, s: int) -> 'A': pass
-class B(A, int): pass
-
-[case testCannotDetermineTypeInMultipleInheritance]
-from typing import Callable, TypeVar
-T = TypeVar('T')
-class A(B, C):
-    def f(self): pass
-class B:
-    @dec
-    def f(self): pass
-class C:
-    @dec
-    def f(self): pass
-def dec(f: Callable[..., T]) -> Callable[..., T]:
-    return f
-[out]
-main:3: error: Cannot determine type of 'f' in base class 'B'
-main:3: error: Cannot determine type of 'f' in base class 'C'
diff --git a/test-data/unit/check-namedtuple.test b/test-data/unit/check-namedtuple.test
deleted file mode 100644
index 71a058b..0000000
--- a/test-data/unit/check-namedtuple.test
+++ /dev/null
@@ -1,429 +0,0 @@
-[case testNamedTupleUsedAsTuple]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None  # type: X
-a, b = x
-b = x[0]
-a = x[1]
-a, b, c = x # E: Need more than 2 values to unpack (3 expected)
-x[2] # E: Tuple index out of range
-
-[case testNamedTupleWithTupleFieldNamesUsedAsTuple]
-from collections import namedtuple
-
-X = namedtuple('X', ('x', 'y'))
-x = None  # type: X
-a, b = x
-b = x[0]
-a = x[1]
-a, b, c = x # E: Need more than 2 values to unpack (3 expected)
-x[2] # E: Tuple index out of range
-
-[case testNamedTupleNoUnderscoreFields]
-from collections import namedtuple
-
-X = namedtuple('X', 'x, _y, _z')  # E: namedtuple() field names cannot start with an underscore: _y, _z
-
-[case testNamedTupleAccessingAttributes]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None  # type: X
-x.x
-x.y
-x.z # E: "X" has no attribute "z"
-
-
-[case testNamedTupleAttributesAreReadOnly]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None  # type: X
-x.x = 5 # E: Property "x" defined in "X" is read-only
-x.y = 5 # E: Property "y" defined in "X" is read-only
-x.z = 5 # E: "X" has no attribute "z"
-
-class A(X): pass
-a = None  # type: A
-a.x = 5 # E: Property "x" defined in "A" is read-only
-a.y = 5 # E: Property "y" defined in "A" is read-only
--- a.z = 5 # not supported yet
-
-
-[case testNamedTupleCreateWithPositionalArguments]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = X(1, 'x')
-x.x
-x.z      # E: "X" has no attribute "z"
-x = X(1) # E: Too few arguments for "X"
-x = X(1, 2, 3)  # E: Too many arguments for "X"
-
-[case testCreateNamedTupleWithKeywordArguments]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = X(x=1, y='x')
-x = X(1, y='x')
-x = X(x=1, z=1) # E: Unexpected keyword argument "z" for "X"
-x = X(y=1) # E: Missing positional argument "x" in call to "X"
-
-
-[case testNamedTupleCreateAndUseAsTuple]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = X(1, 'x')
-a, b = x
-a, b, c = x  # E: Need more than 2 values to unpack (3 expected)
-
-
-[case testNamedTupleWithItemTypes]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int),
-                     ('b', str)])
-n = N(1, 'x')
-s = n.a # type: str  # E: Incompatible types in assignment (expression has type "int", \
-                          variable has type "str")
-i = n.b # type: int  # E: Incompatible types in assignment (expression has type "str", \
-                          variable has type "int")
-x, y = n
-x = y  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-
-[case testNamedTupleWithTupleFieldNamesWithItemTypes]
-from typing import NamedTuple
-N = NamedTuple('N', (('a', int),
-                     ('b', str)))
-n = N(1, 'x')
-s = n.a # type: str  # E: Incompatible types in assignment (expression has type "int", \
-                          variable has type "str")
-i = n.b # type: int  # E: Incompatible types in assignment (expression has type "str", \
-                          variable has type "int")
-x, y = n
-x = y  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-
-[case testNamedTupleConstructorArgumentTypes]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int),
-                     ('b', str)])
-n = N('x', 'x') # E: Argument 1 to "N" has incompatible type "str"; expected "int"
-n = N(1, b=2)   # E: Argument 2 to "N" has incompatible type "int"; expected "str"
-N(1, 'x')
-N(b='x', a=1)
-
-[case testNamedTupleAsBaseClass]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int),
-                     ('b', str)])
-class X(N):
-    pass
-x = X(1, 2)  # E: Argument 2 to "X" has incompatible type "int"; expected "str"
-s = ''
-i = 0
-s = x.a  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-i, s = x
-s, s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testNamedTupleAsBaseClass2]
-from typing import NamedTuple
-class X(NamedTuple('N', [('a', int),
-                         ('b', str)])):
-    pass
-x = X(1, 2)  # E: Argument 2 to "X" has incompatible type "int"; expected "str"
-s = ''
-i = 0
-s = x.a  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-i, s = x
-s, s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-
-[case testNamedTuplesTwoAsBaseClasses]
-from typing import NamedTuple
-A = NamedTuple('A', [('a', int)])
-B = NamedTuple('B', [('a', int)])
-class X(A, B):  # E: Class has two incompatible bases derived from tuple
-    pass
-
-
-[case testNamedTuplesTwoAsBaseClasses2]
-from typing import NamedTuple
-A = NamedTuple('A', [('a', int)])
-class X(A, NamedTuple('B', [('a', int)])): # E: Class has two incompatible bases derived from tuple
-    pass
-
-
-[case testNamedTupleSelfTypeWithNamedTupleAsBase]
-from typing import NamedTuple
-A = NamedTuple('A', [('a', int), ('b', str)])
-class B(A):
-    def f(self, x: int) -> None:
-        self.f(self.a)
-        self.f(self.b)  # E: Argument 1 to "f" of "B" has incompatible type "str"; expected "int"
-        i = 0
-        s = ''
-        i, s = self
-        i, i = self  # E: Incompatible types in assignment (expression has type "str", \
-                          variable has type "int")
-
-
-[out]
-
-[case testNamedTupleTypeReferenceToClassDerivedFrom]
-from typing import NamedTuple
-A = NamedTuple('A', [('a', int), ('b', str)])
-class B(A):
-    def f(self, x: 'B') -> None:
-        i = 0
-        s = ''
-        self = x
-        i, s = x
-        i, s = x.a, x.b
-        i, s = x.a, x.a  # E: Incompatible types in assignment (expression has type "int", \
-                              variable has type "str")
-        i, i = self  # E: Incompatible types in assignment (expression has type "str", \
-                          variable has type "int")
-
-[out]
-
-[case testNamedTupleSubtyping]
-from typing import NamedTuple, Tuple
-A = NamedTuple('A', [('a', int), ('b', str)])
-class B(A): pass
-a = A(1, '')
-b = B(1, '')
-t = None  # type: Tuple[int, str]
-b = a  # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = t  # E: Incompatible types in assignment (expression has type "Tuple[int, str]", variable has type "A")
-b = t  # E: Incompatible types in assignment (expression has type "Tuple[int, str]", variable has type "B")
-t = a
-t = (1, '')
-t = b
-a = b
-
-
-[case testNamedTupleSimpleTypeInference]
-from typing import NamedTuple, Tuple
-A = NamedTuple('A', [('a', int)])
-l = [A(1), A(2)]
-a = A(1)
-a = l[0]
-(i,) = l[0]
-i, i = l[0]  # E: Need more than 1 value to unpack (2 expected)
-l = [A(1)]
-a = (1,)  # E: Incompatible types in assignment (expression has type "Tuple[int]", \
-               variable has type "A")
-[builtins fixtures/list.pyi]
-
-[case testNamedTupleMissingClassAttribute]
-import collections
-MyNamedTuple = collections.namedtuple('MyNamedTuple', ['spam', 'eggs'])
-MyNamedTuple.x # E: "MyNamedTuple" has no attribute "x"
-
-
-[case testNamedTupleEmptyItems]
-from typing import NamedTuple
-A = NamedTuple('A', [])
-
-
-[case testNamedTupleProperty]
-from typing import NamedTuple
-A = NamedTuple('A', [('a', int)])
-class B(A):
-    @property
-    def b(self) -> int:
-        return self.a
-class C(B): pass
-B(1).b
-C(2).b
-
-[builtins fixtures/property.pyi]
-
-[case testNamedTupleAsDict]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None  # type: X
-reveal_type(x._asdict())  # E: Revealed type is 'builtins.dict[builtins.str, Any]'
-
-[builtins fixtures/dict.pyi]
-
-[case testNamedTupleReplace]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None  # type: X
-reveal_type(x._replace())  # E: Revealed type is 'Tuple[Any, Any, fallback=__main__.X]'
-x._replace(y=5)
-x._replace(x=3)
-x._replace(x=3, y=5)
-x._replace(z=5)  # E: Unexpected keyword argument "z" for X._replace
-x._replace(5)  # E: Too many positional arguments for X._replace
-
-[case testNamedTupleReplaceAsClass]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None  # type: X
-X._replace(x, x=1, y=2)
-X._replace(x=1, y=2)  # E: Missing positional argument "self" in call to X._replace
-
-
-[case testNamedTupleReplaceTyped]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-x = None  # type: X
-reveal_type(x._replace())  # E: Revealed type is 'Tuple[builtins.int, builtins.str, fallback=__main__.X]'
-x._replace(x=5)
-x._replace(y=5)  # E: Argument 1 to X._replace has incompatible type "int"; expected "str"
-
-[case testNamedTupleMake]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-reveal_type(X._make([5, 'a']))  # E: Revealed type is 'Tuple[builtins.int, builtins.str, fallback=__main__.X]'
-X._make('a b')  # E: Argument 1 to X._make has incompatible type "str"; expected Iterable[Any]
-
--- # FIX: not a proper class method
--- x = None  # type: X
--- reveal_type(x._make([5, 'a']))  # E: Revealed type is 'Tuple[builtins.int, builtins.str, fallback=__main__.X]'
--- x._make('a b')  # E: Argument 1 to X._make has incompatible type "str"; expected Iterable[Any]
-
-[builtins fixtures/list.pyi]
-
-[case testNamedTupleFields]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-reveal_type(X._fields)  # E: Revealed type is 'Tuple[builtins.str, builtins.str]'
-
-[case testNamedTupleSource]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-reveal_type(X._source)  # E: Revealed type is 'builtins.str'
-x = None  # type: X
-reveal_type(x._source)  # E: Revealed type is 'builtins.str'
-
-[case testNamedTupleUnit]
-from typing import NamedTuple
-
-X = NamedTuple('X', [])
-x = X()  # type: X
-x._replace()
-x._fields[0]  # E: Tuple index out of range
-
-[case testNamedTupleJoinNamedTuple]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-Y = NamedTuple('Y', [('x', int), ('y', str)])
-reveal_type([X(3, 'b'), Y(1, 'a')])  # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-
-[builtins fixtures/list.pyi]
-
-[case testNamedTupleJoinTuple]
-from typing import NamedTuple, Tuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-reveal_type([(3, 'b'), X(1, 'a')])  # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-reveal_type([X(1, 'a'), (3, 'b')])  # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-
-[builtins fixtures/list.pyi]
-
-[case testNamedTupleFieldTypes]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-reveal_type(X._field_types)  # E: Revealed type is 'builtins.dict[builtins.str, Any]'
-x = None  # type: X
-reveal_type(x._field_types)  # E: Revealed type is 'builtins.dict[builtins.str, Any]'
-
-[builtins fixtures/dict.pyi]
-
-[case testNamedTupleAndOtherSuperclass]
-from typing import NamedTuple
-
-class A: pass
-def f(x: A) -> None: pass
-
-class B(NamedTuple('B', []), A): pass
-f(B())
-x = None  # type: A
-x = B()
-
-# Sanity check: fail if baseclass does not match
-class C: pass
-def g(x: C) -> None: pass
-class D(NamedTuple('D', []), A): pass
-
-g(D())  # E: Argument 1 to "g" has incompatible type "D"; expected "C"
-y = None  # type: C
-y = D()  # E: Incompatible types in assignment (expression has type "D", variable has type "C")
-
-[case testNamedTupleSelfTypeMethod]
-from typing import TypeVar, NamedTuple
-
-T = TypeVar('T', bound='A')
-
-class A(NamedTuple('A', [('x', str)])):
-    def member(self: T) -> T:
-        return self
-
-class B(A):
-    pass
-
-a = None  # type: A
-a = A('').member()
-b = None  # type: B
-b = B('').member()
-a = B('')
-a = B('').member()
-
-[case testNamedTupleSelfTypeReplace]
-from typing import NamedTuple, TypeVar
-A = NamedTuple('A', [('x', str)])
-reveal_type(A('hello')._replace(x=''))  # E: Revealed type is 'Tuple[builtins.str, fallback=__main__.A]'
-a = None  # type: A
-a = A('hello')._replace(x='')
-
-class B(A):
-    pass
-
-reveal_type(B('hello')._replace(x=''))  # E: Revealed type is 'Tuple[builtins.str, fallback=__main__.B]'
-b = None  # type: B
-b = B('hello')._replace(x='')
-
-[case testNamedTupleSelfTypeMake]
-from typing import NamedTuple, TypeVar
-A = NamedTuple('A', [('x', str)])
-reveal_type(A._make(['']))  # E: Revealed type is 'Tuple[builtins.str, fallback=__main__.A]'
-a = A._make([''])  # type: A
-
-class B(A):
-    pass
-
-reveal_type(B._make(['']))  # E: Revealed type is 'Tuple[builtins.str, fallback=__main__.B]'
-b = B._make([''])  # type: B
-
-[builtins fixtures/list.pyi]
-
-[case testNamedTupleInClassNamespace]
-# https://github.com/python/mypy/pull/2553#issuecomment-266474341
-from typing import NamedTuple
-class C:
-    def f(self):
-        A = NamedTuple('A', [('x', int)])
-    def g(self):
-        A = NamedTuple('A', [('y', int)])
-C.A  # E: "C" has no attribute "A"
-
-[case testNamedTupleInFunction]
-from typing import NamedTuple
-def f() -> None:
-    A = NamedTuple('A', [('x', int)])
-A  # E: Name 'A' is not defined
diff --git a/test-data/unit/check-newsyntax.test b/test-data/unit/check-newsyntax.test
deleted file mode 100644
index b2a2662..0000000
--- a/test-data/unit/check-newsyntax.test
+++ /dev/null
@@ -1,87 +0,0 @@
-[case testNewSyntaxRequire36]
-# flags: --fast-parser --python-version 3.5
-x: int = 5  # E: Variable annotation syntax is only suppoted in Python 3.6, use type comment instead
-[out]
-
-[case testNewSyntaxSyntaxError]
-# flags: --fast-parser --python-version 3.6
-x: int: int  # E: invalid syntax
-[out]
-
-[case testNewSyntaxBasics]
-# flags: --fast-parser --python-version 3.6
-x: int
-x = 5
-y: int = 5
-
-a: str
-a = 5  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-b: str = 5  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-zzz: int
-zzz: str  # E: Name 'zzz' already defined
-[out]
-
-[case testNewSyntaxWithDict]
-# flags: --fast-parser --python-version 3.6
-from typing import Dict, Any
-
-d: Dict[int, str] = {}
-d[42] = 'ab'
-d[42] = 42  # E: Incompatible types in assignment (expression has type "int", target has type "str")
-d['ab'] = 'ab'  # E: Invalid index type "str" for "dict"; expected type "int"
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testNewSyntaxWithRevealType]
-# flags: --fast-parser --python-version 3.6
-from typing import Dict
-
-def tst_local(dct: Dict[int, T]) -> Dict[T, int]:
-    ret: Dict[T, int] = {}
-    return ret
-
-reveal_type(tst_local({1: 'a'}))  # E: Revealed type is 'builtins.dict[builtins.str*, builtins.int]'
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testNewSyntaxWithInstanceVars]
-# flags: --fast-parser --python-version 3.6
-class TstInstance:
-    a: str
-    def __init__(self) -> None:
-        self.x: int
-
-TstInstance().x = 5
-TstInstance().x = 'ab'  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-TstInstance().a = 5  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-TstInstance().a = 'ab'
-[out]
-
-[case testNewSyntaxWithClassVars]
-# flags: --fast-parser --strict-optional --python-version 3.6
-class CCC:
-    a: str = None  # E: Incompatible types in assignment (expression has type None, variable has type "str")
-[out]
-
-[case testNewSyntaxWithStrictOptional]
-# flags: --fast-parser --strict-optional --python-version 3.6
-strict: int
-strict = None  # E: Incompatible types in assignment (expression has type None, variable has type "int")
-strict2: int = None  # E: Incompatible types in assignment (expression has type None, variable has type "int")
-[out]
-
-[case testNewSyntaxWithStrictOptionalFunctions]
-# flags: --fast-parser --strict-optional --python-version 3.6
-def f() -> None:
-    x: int
-    x = None  # E: Incompatible types in assignment (expression has type None, variable has type "int")
-[out]
-
-[case testNewSyntaxWithStrictOptionalClasses]
-# flags: --fast-parser --strict-optional --python-version 3.6
-class C:
-    def meth(self) -> None:
-        x: int = None  # E: Incompatible types in assignment (expression has type None, variable has type "int")
-        self.x: int = None  # E: Incompatible types in assignment (expression has type None, variable has type "int")
-[out]
diff --git a/test-data/unit/check-newtype.test b/test-data/unit/check-newtype.test
deleted file mode 100644
index 880a00f..0000000
--- a/test-data/unit/check-newtype.test
+++ /dev/null
@@ -1,319 +0,0 @@
--- Checks NewType(...)
-
--- Checks for basic functionality
-
-[case testNewTypePEP484Example1]
-from typing import NewType
-
-UserId = NewType('UserId', int)
-
-def name_by_id(user_id: UserId) -> str:
-    return "foo"
-
-UserId('user')  # E: Argument 1 to "UserId" has incompatible type "str"; expected "int"
-name_by_id(42)  # E: Argument 1 to "name_by_id" has incompatible type "int"; expected "UserId"
-name_by_id(UserId(42))
-
-id = UserId(5)
-num = id + 1
-
-reveal_type(id)  # E: Revealed type is '__main__.UserId'
-reveal_type(num)  # E: Revealed type is 'builtins.int'
-[out]
-
-[case testNewTypePEP484Example2]
-from typing import NewType
-
-class PacketId:
-    def __init__(self, major: int, minor: int) -> None:
-        self._major = major
-        self._minor = minor
-
-TcpPacketId = NewType('TcpPacketId', PacketId)
-
-packet = PacketId(100, 100)
-tcp_packet = TcpPacketId(packet)
-tcp_packet = TcpPacketId(127, 0)
-
-[out]
-main:12: error: Too many arguments for "TcpPacketId"
-main:12: error: Argument 1 to "TcpPacketId" has incompatible type "int"; expected "PacketId"
-
-[case testNewTypeWithTuples]
-from typing import NewType, Tuple
-TwoTuple = NewType('TwoTuple', Tuple[int, str])
-a = TwoTuple((3, "a"))
-b = TwoTuple(("a", 3))  # E: Argument 1 to "TwoTuple" has incompatible type "Tuple[str, int]"; expected "Tuple[int, str]"
-
-reveal_type(a[0])  # E: Revealed type is 'builtins.int'
-reveal_type(a[1])  # E: Revealed type is 'builtins.str'
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testNewTypeWithLists]
-from typing import NewType, List
-UserId = NewType('UserId', int)
-IdList = NewType('IdList', List[UserId])
-
-bad1 = IdList([1])  # E: List item 0 has incompatible type "int"
-
-foo = IdList([])
-foo.append(3)  # E: Argument 1 to "append" of "list" has incompatible type "int"; expected "UserId"
-foo.append(UserId(3))
-foo.extend([UserId(1), UserId(2), UserId(3)])
-foo.extend(IdList([UserId(1), UserId(2), UserId(3)]))
-bar = IdList([UserId(2)])
-
-baz = foo + bar
-reveal_type(foo)  # E: Revealed type is '__main__.IdList'
-reveal_type(bar)  # E: Revealed type is '__main__.IdList'
-reveal_type(baz)  # E: Revealed type is 'builtins.list[__main__.UserId*]'
-
-[builtins fixtures/list.pyi]
-[out]
-
-[case testNewTypeWithGenerics]
-from typing import TypeVar, Generic, NewType, Any
-
-T = TypeVar('T')
-
-class Base(Generic[T]):
-    def __init__(self, item: T) -> None:
-        self.item = item
-
-    def getter(self) -> T:
-        return self.item
-
-Derived1 = NewType('Derived1', Base[str])
-Derived2 = NewType('Derived2', Base)       # Implicit 'Any'
-Derived3 = NewType('Derived3', Base[Any])  # Explicit 'Any'
-
-Derived1(Base(1))  # E: Argument 1 to "Base" has incompatible type "int"; expected "str"
-Derived1(Base('a'))
-Derived2(Base(1))
-Derived2(Base('a'))
-Derived3(Base(1))
-Derived3(Base('a'))
-
-reveal_type(Derived1(Base('a')).getter())  # E: Revealed type is 'builtins.str*'
-reveal_type(Derived3(Base('a')).getter())  # E: Revealed type is 'Any'
-[out]
-
-[case testNewTypeWithNamedTuple]
-from collections import namedtuple
-from typing import NewType, NamedTuple
-
-Vector1 = namedtuple('Vector1', ['x', 'y'])
-Point1 = NewType('Point1', Vector1)
-p1 = Point1(Vector1(1, 2))
-reveal_type(p1.x)  # E: Revealed type is 'Any'
-reveal_type(p1.y)  # E: Revealed type is 'Any'
-
-Vector2 = NamedTuple('Vector2', [('x', int), ('y', int)])
-Point2 = NewType('Point2', Vector2)
-p2 = Point2(Vector2(1, 2))
-reveal_type(p2.x)  # E: Revealed type is 'builtins.int'
-reveal_type(p2.y)  # E: Revealed type is 'builtins.int'
-
-class Vector3:
-    def __init__(self, x: int, y: int) -> None:
-        self.x = x
-        self.y = y
-Point3 = NewType('Point3', Vector3)
-p3 = Point3(Vector3(1, 3))
-reveal_type(p3.x)  # E: Revealed type is 'builtins.int'
-reveal_type(p3.y)  # E: Revealed type is 'builtins.int'
-[out]
-
-[case testNewTypeWithCasts]
-from typing import NewType, cast
-UserId = NewType('UserId', int)
-foo = UserId(3)
-foo = cast(UserId, 3)
-foo = cast(UserId, "foo")
-foo = cast(UserId, UserId(4))
-[out]
-
-[case testNewTypeWithTypeAliases]
-from typing import NewType
-Foo = int
-Bar = NewType('Bar', Foo)
-Bar2 = Bar
-
-def func1(x: Foo) -> Bar:
-    return Bar(x)
-
-def func2(x: int) -> Bar:
-    return Bar(x)
-
-def func3(x: Bar2) -> Bar:
-    return x
-
-x = Bar(42)
-y = Bar2(42)
-
-y = func3(x)
-[out]
-
-
--- Make sure NewType works as expected in a variety of different scopes/across files
-
-[case testNewTypeInLocalScope]
-from typing import NewType
-A = NewType('A', int)
-a = A(3)
-
-def func() -> None:
-    A = NewType('A', str)
-    B = NewType('B', str)
-
-    a = A(3)  # E: Argument 1 to "A" has incompatible type "int"; expected "str"
-    a = A('xyz')
-    b = B('xyz')
-
-class MyClass:
-    C = NewType('C', float)
-    
-    def foo(self) -> 'MyClass.C':
-        return MyClass.C(3.2)
-
-b = A(3)
-c = MyClass.C(3.5)
-[out]
-
-[case testNewTypeInMultipleFiles]
-import a
-import b
-list1 = [a.UserId(1), a.UserId(2)]
-list1.append(b.UserId(3))  # E: Argument 1 to "append" of "list" has incompatible type "b.UserId"; expected "a.UserId"
-
-[file a.py]
-from typing import NewType
-UserId = NewType('UserId', int)
-
-[file b.py]
-from typing import NewType
-UserId = NewType('UserId', int)
-
-[builtins fixtures/list.pyi]
-[out]
-
-[case testNewTypeWithIncremental]
-import m
-
-[file m.py]
-from typing import NewType
-
-UserId = NewType('UserId', int)
-
-def name_by_id(user_id: UserId) -> str:
-    return "foo"
-
-name_by_id(UserId(42))
-
-id = UserId(5)
-num = id + 1
-
-[file m.py.next]
-from typing import NewType
-
-UserId = NewType('UserId', int)
-
-def name_by_id(user_id: UserId) -> str:
-    return "foo"
-
-name_by_id(UserId(42))
-
-id = UserId(5)
-num = id + 1
-
-reveal_type(id)
-reveal_type(num)
-[rechecked m]
-[stale]
-[out1]
-[out2]
-tmp/m.py:13: error: Revealed type is 'm.UserId'
-tmp/m.py:14: error: Revealed type is 'builtins.int'
-
-
--- Check misuses of NewType fail
-
-[case testNewTypeBadInitializationFails]
-from typing import NewType
-
-a = NewType('b', int)  # E: String argument 1 'b' to NewType(...) does not match variable name 'a'
-b = NewType('b', 3)  # E: Argument 2 to NewType(...) must be a valid type
-c = NewType(2, int)  # E: Argument 1 to NewType(...) must be a string literal
-foo = "d"
-d = NewType(foo, int)  # E: Argument 1 to NewType(...) must be a string literal
-e = NewType(name='e', tp=int)  # E: NewType(...) expects exactly two positional arguments
-f = NewType('f', tp=int)  # E: NewType(...) expects exactly two positional arguments
-[out]
-
-[case testNewTypeWithAnyFails]
-from typing import NewType, Any
-A = NewType('A', Any)  # E: Argument 2 to NewType(...) must be subclassable (got Any)
-[out]
-
-[case testNewTypeWithUnionsFails]
-from typing import NewType, Union
-Foo = NewType('Foo', Union[int, float])  # E: Argument 2 to NewType(...) must be subclassable (got Union[builtins.int, builtins.float])
-[out]
-
-[case testNewTypeWithTypeTypeFails]
-from typing import NewType, Type
-Foo = NewType('Foo', Type[int])  # E: Argument 2 to NewType(...) must be subclassable (got Type[builtins.int])
-a = Foo(type(3))
-[builtins fixtures/args.pyi]
-[out]
-
-[case testNewTypeWithTypeVarsFails]
-from typing import NewType, TypeVar, List
-T = TypeVar('T')
-A = NewType('A', T)
-B = NewType('B', List[T])
-[builtins fixtures/list.pyi]
-[out]
-main:3: error: Argument 2 to NewType(...) must be subclassable (got T?)
-main:3: error: Invalid type "__main__.T"
-main:4: error: Invalid type "__main__.T"
-
-[case testNewTypeWithNewTypeFails]
-from typing import NewType
-A = NewType('A', int)
-B = NewType('B', A)  # E: Argument 2 to NewType(...) cannot be another NewType
-C = A
-D = C
-E = NewType('E', D)  # E: Argument 2 to NewType(...) cannot be another NewType
-[out]
-
-[case testNewTypeRedefiningVariablesFails]
-from typing import NewType
-
-a = 3
-a = NewType('a', int)
-
-b = NewType('b', int)
-b = NewType('b', float)  # this line throws two errors
-
-c = NewType('c', str)   # type: str
-[out]
-main:4: error: Cannot redefine 'a' as a NewType
-main:7: error: Invalid assignment target
-main:7: error: Cannot redefine 'b' as a NewType
-main:9: error: Cannot declare the type of a NewType declaration
-
-[case testNewTypeAddingExplicitTypesFails]
-from typing import NewType
-UserId = NewType('UserId', int)
-
-a = 3  # type: UserId  # E: Incompatible types in assignment (expression has type "int", variable has type "UserId")
-[out]
-
-[case testNewTypeTestSubclassingFails]
-from typing import NewType
-class A: pass
-B = NewType('B', A)
-class C(B): pass  # E: Cannot subclass NewType
-[out]
diff --git a/test-data/unit/check-optional.test b/test-data/unit/check-optional.test
deleted file mode 100644
index eca81bf..0000000
--- a/test-data/unit/check-optional.test
+++ /dev/null
@@ -1,527 +0,0 @@
--- Tests for strict Optional behavior
-
-[case testImplicitNoneType]
-x = None
-x()  # E: None not callable
-
-[case testExplicitNoneType]
-x = None  # type: None
-x()  # E: None not callable
-
-[case testNoneMemberOfOptional]
-from typing import Optional
-x = None  # type: Optional[int]
-
-[case testTypeMemberOfOptional]
-from typing import Optional
-x = 0  # type: Optional[int]
-
-[case testNoneNotMemberOfType]
-x = None  # type: int
-[out]
-main:1: error: Incompatible types in assignment (expression has type None, variable has type "int")
-
-[case testTypeNotMemberOfNone]
-x = 0  # type: None
-[out]
-main:1: error: Incompatible types in assignment (expression has type "int", variable has type None)
-
-[case testOptionalNotMemberOfType]
-from typing import Optional
-def f(a: int) -> None: pass
-x = None  # type:  Optional[int]
-f(x)  # E: Argument 1 to "f" has incompatible type "Optional[int]"; expected "int"
-
-[case testIsinstanceCases]
-from typing import Optional
-x = None  # type:  Optional[int]
-if isinstance(x, int):
-  reveal_type(x)  # E: Revealed type is 'builtins.int'
-else:
-  reveal_type(x)  # E: Revealed type is 'builtins.None'
-[builtins fixtures/isinstance.pyi]
-
-[case testIfCases]
-from typing import Optional
-x = None  # type:  Optional[int]
-if x:
-  reveal_type(x)  # E: Revealed type is 'builtins.int'
-else:
-  reveal_type(x)  # E: Revealed type is 'Union[builtins.int, builtins.None]'
-[builtins fixtures/bool.pyi]
-
-[case testIfNotCases]
-from typing import Optional
-x = None  # type:  Optional[int]
-if not x:
-  reveal_type(x)  # E: Revealed type is 'Union[builtins.int, builtins.None]'
-else:
-  reveal_type(x)  # E: Revealed type is 'builtins.int'
-[builtins fixtures/bool.pyi]
-
-[case testIsNotNoneCases]
-from typing import Optional
-x = None  # type:  Optional[int]
-if x is not None:
-  reveal_type(x)  # E: Revealed type is 'builtins.int'
-else:
-  reveal_type(x)  # E: Revealed type is 'builtins.None'
-[builtins fixtures/bool.pyi]
-
-[case testIsNoneCases]
-from typing import Optional
-x = None  # type:  Optional[int]
-if x is None:
-  reveal_type(x)  # E: Revealed type is 'builtins.None'
-else:
-  reveal_type(x)  # E: Revealed type is 'builtins.int'
-[builtins fixtures/bool.pyi]
-
-[case testOrCases]
-from typing import Optional
-x = None  # type: Optional[str]
-y1 = x or 'a'
-reveal_type(y1)  # E: Revealed type is 'builtins.str'
-y2 = x or 1
-reveal_type(y2)  # E: Revealed type is 'Union[builtins.str, builtins.int]'
-z1 = 'a' or x
-reveal_type(z1)  # E: Revealed type is 'Union[builtins.str, builtins.None]'
-z2 = int() or x
-reveal_type(z2)  # E: Revealed type is 'Union[builtins.int, builtins.str, builtins.None]'
-
-[case testAndCases]
-from typing import Optional
-x = None  # type: Optional[str]
-y1 = x and 'b'
-reveal_type(y1)  # E: Revealed type is 'Union[builtins.str, builtins.None]'
-y2 = x and 1  # x could be '', so...
-reveal_type(y2)  # E: Revealed type is 'Union[builtins.str, builtins.None, builtins.int]'
-z1 = 'b' and x
-reveal_type(z1)  # E: Revealed type is 'Union[builtins.str, builtins.None]'
-z2 = int() and x
-reveal_type(z2)  # E: Revealed type is 'Union[builtins.int, builtins.str, builtins.None]'
-
-[case testLambdaReturningNone]
-f = lambda: None
-x = f()  # E: Function does not return a value
-
-[case testNoneArgumentType]
-def f(x: None) -> None: pass
-f(None)
-
-[case testInferOptionalFromDefaultNone]
-def f(x: int = None) -> None:
-  x + 1  # E: Unsupported left operand type for + (some union)
-f(None)
-[out]
-
-[case testInferOptionalFromDefaultNoneWithFastParser]
-# flags: --fast-parser
-def f(x: int = None) -> None:
-  x + 1  # E: Unsupported left operand type for + (some union)
-f(None)
-[out]
-
-[case testInferOptionalFromDefaultNoneComment]
-def f(x=None):
-  # type: (int) -> None
-  x + 1  # E: Unsupported left operand type for + (some union)
-f(None)
-[out]
-
-[case testInferOptionalFromDefaultNoneCommentWithFastParser]
-# flags: --fast-parser
-def f(x=None):
-  # type: (int) -> None
-  x + 1  # E: Unsupported left operand type for + (some union)
-f(None)
-[out]
-
-[case testInferOptionalType]
-x = None
-if bool():
-  # scope limit assignment
-  x = 1
-  # in scope of the assignment, x is an int
-  reveal_type(x)  # E: Revealed type is 'builtins.int'
-# out of scope of the assignment, it's an Optional[int]
-reveal_type(x)  # E: Revealed type is 'Union[builtins.int, builtins.None]'
-[builtins fixtures/bool.pyi]
-
-[case testInferOptionalTypeLocallyBound]
-x = None
-x = 1
-reveal_type(x)  # E: Revealed type is 'builtins.int'
-
-
-[case testInferOptionalTypeFromOptional]
-from typing import Optional
-y = None  # type: Optional[int]
-x = None
-x = y
-reveal_type(x)  # E: Revealed type is 'Union[builtins.int, builtins.None]'
-
-[case testInferOptionalListType]
-x = [None]
-x.append(1)  # E: Argument 1 to "append" of "list" has incompatible type "int"; expected None
-[builtins fixtures/list.pyi]
-
-[case testInferNonOptionalListType]
-x = []
-x.append(1)
-x()  # E: List[int] not callable
-[builtins fixtures/list.pyi]
-
-[case testInferOptionalDictKeyValueTypes]
-x = {None: None}
-x["bar"] = 1
-[builtins fixtures/dict.pyi]
-[out]
-main:2: error: Invalid index type "str" for "dict"; expected type None
-main:2: error: Incompatible types in assignment (expression has type "int", target has type None)
-
-[case testInferNonOptionalDictType]
-x = {}
-x["bar"] = 1
-x()  # E: Dict[str, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testNoneClassVariable]
-from typing import Optional
-class C:
-    x = None  # type: int
-    def __init__(self) -> None:
-        self.x = 0
-
-[case testNoneClassVariableInInit]
-from typing import Optional
-class C:
-    x = None  # type: int
-    def __init__(self) -> None:
-        self.x = None  # E: Incompatible types in assignment (expression has type None, variable has type "int")
-[out]
-
-[case testMultipleAssignmentNoneClassVariableInInit]
-from typing import Optional
-class C:
-    x, y = None, None  # type: int, str
-    def __init__(self) -> None:
-        self.x = None  # E: Incompatible types in assignment (expression has type None, variable has type "int")
-        self.y = None  # E: Incompatible types in assignment (expression has type None, variable has type "str")
-[out]
-
-[case testOverloadWithNone]
-from typing import overload
- at overload
-def f(x: None) -> str: pass
- at overload
-def f(x: int) -> int: pass
-reveal_type(f(None))  # E: Revealed type is 'builtins.str'
-reveal_type(f(0))  # E: Revealed type is 'builtins.int'
-
-[case testOptionalTypeOrTypePlain]
-from typing import Optional
-def f(a: Optional[int]) -> int:
-    return a or 0
-[out]
-
-[case testOptionalTypeOrTypeTypeVar]
-from typing import Optional, TypeVar
-T = TypeVar('T')
-def f(a: Optional[T], b: T) -> T:
-    return a or b
-[out]
-
-[case testOptionalTypeOrTypeBothOptional]
-from typing import Optional
-def f(a: Optional[int], b: Optional[int]) -> None:
-    reveal_type(a or b)
-def g(a: int, b: Optional[int]) -> None:
-    reveal_type(a or b)
-[out]
-main:3: error: Revealed type is 'Union[builtins.int, builtins.None]'
-main:5: error: Revealed type is 'Union[builtins.int, builtins.None]'
-
-[case testOptionalTypeOrTypeComplexUnion]
-from typing import Union
-def f(a: Union[int, str, None]) -> None:
-    reveal_type(a or 'default')
-[out]
-main:3: error: Revealed type is 'Union[builtins.int, builtins.str]'
-
-[case testOptionalTypeOrTypeNoTriggerPlain]
-from typing import Optional
-def f(a: Optional[int], b: int) -> int:
-    return b or a
-[out]
-main:3: error: Incompatible return value type (got "Optional[int]", expected "int")
-
-[case testOptionalTypeOrTypeNoTriggerTypeVar]
-from typing import Optional, TypeVar
-T = TypeVar('T')
-def f(a: Optional[T], b: T) -> T:
-    return b or a
-[out]
-main:4: error: Incompatible return value type (got "Optional[T]", expected "T")
-
-[case testNoneOrStringIsString]
-def f() -> str:
-    a = None
-    b = ''
-    return a or b
-[out]
-
-[case testNoneOrTypeVarIsTypeVar]
-from typing import TypeVar
-T = TypeVar('T')
-def f(b: T) -> T:
-    a = None
-    return a or b
-[out]
-
-[case testYieldNothingInFunctionReturningGenerator]
-from typing import Generator
-def f() -> Generator[None, None, None]:
-    yield
-[out]
-
-[case testNoneAndStringIsNone]
-a = None
-b = "foo"
-reveal_type(a and b)  # E: Revealed type is 'builtins.None'
-
-[case testNoneMatchesObjectInOverload]
-import a
-a.f(None)
-
-[file a.pyi]
-from typing import overload
- at overload
-def f() -> None: ...
- at overload
-def f(o: object) -> None: ...
-
-[case testGenericSubclassReturningNone]
-from typing import Generic, TypeVar
-
-T = TypeVar('T')
-
-class Base(Generic[T]):
-  def f(self) -> T:
-    pass
-
-class SubNone(Base[None]):
-  def f(self) -> None:
-    pass
-
-class SubInt(Base[int]):
-  def f(self) -> int:
-    return 1
-
-[case testUseOfNoneReturningFunction]
-from typing import Optional
-def f() -> None:
-    pass
-
-def g(x: Optional[int]) -> int:
-  pass
-
-x = f()  # E: Function does not return a value
-f() + 1  # E: Function does not return a value
-g(f())  # E: Function does not return a value
-
-[case testEmptyReturn]
-def f() -> None:
-    return
-
-[case testReturnNone]
-def f() -> None:
-    return None
-
-[case testNoneCallable]
-from typing import Callable
-def f() -> None: pass
-x = f  # type: Callable[[], None]
-
-[case testOptionalCallable]
-from typing import Callable, Optional
-T = Optional[Callable[..., None]]
-
-[case testAnyTypeInPartialTypeList]
-# flags: --check-untyped-defs
-def f(): ...
-
-def lookup_field(name, obj):
-    try:
-        pass
-    except:
-        attr = f()
-    else:
-        attr = None
-
-[case testTernaryWithNone]
-reveal_type(None if bool() else 0)  # E: Revealed type is 'Union[builtins.int, builtins.None]'
-[builtins fixtures/bool.pyi]
-
-[case testListWithNone]
-reveal_type([0, None, 0])    # E: Revealed type is 'builtins.list[Union[builtins.int, builtins.None]]'
-[builtins fixtures/list.pyi]
-
-[case testOptionalWhitelistSuppressesOptionalErrors]
-# flags: --strict-optional-whitelist
-import a
-import b
-[file a.py]
-from typing import Optional
-x = None  # type: Optional[str]
-x + "foo"
-
-[file b.py]
-from typing import Optional
-x = None  # type: Optional[int]
-x + 1
-
-[case testOptionalWhitelistPermitsOtherErrors]
-# flags: --strict-optional-whitelist
-import a
-import b
-[file a.py]
-from typing import Optional
-x = None  # type: Optional[str]
-x + "foo"
-
-[file b.py]
-from typing import Optional
-x = None  # type: Optional[int]
-x + 1
-1 + "foo"
-[out]
-tmp/b.py:4: error: Unsupported operand types for + ("int" and "str")
-
-[case testOptionalWhitelistPermitsWhitelistedFiles]
-# flags: --strict-optional-whitelist **/a.py
-import a
-import b
-[file a.py]
-from typing import Optional
-x = None  # type: Optional[str]
-x + "foo"
-
-[file b.py]
-from typing import Optional
-x = None  # type: Optional[int]
-x + 1
-[out]
-tmp/a.py:3: error: Unsupported left operand type for + (some union)
-
-[case testNoneContextInference]
-from typing import Dict, List
-def f() -> List[None]:
-    return []
-def g() -> Dict[None, None]:
-    return {}
-[builtins fixtures/dict.pyi]
-
-[case testRaiseFromNone]
-raise BaseException from None
-[builtins fixtures/exception.pyi]
-
-[case testOptionalNonPartialTypeWithNone]
-from typing import Generator
-def f() -> Generator[str, None, None]: pass
-x = f()
-reveal_type(x)  # E: Revealed type is 'typing.Generator[builtins.str, builtins.None, builtins.None]'
-l = [f()]
-reveal_type(l)  # E: Revealed type is 'builtins.list[typing.Generator*[builtins.str, builtins.None, builtins.None]]'
-[builtins fixtures/list.pyi]
-
-[case testNoneListTernary]
-x = [None] if "" else [1]  # E: List item 0 has incompatible type "int"
-[builtins fixtures/list.pyi]
-
-[case testInferEqualsNotOptional]
-from typing import Optional
-x = ''  # type: Optional[str]
-if x == '<string>':
-    reveal_type(x)  # E: Revealed type is 'builtins.str'
-else:
-    reveal_type(x)  # E: Revealed type is 'Union[builtins.str, builtins.None]'
-[builtins fixtures/ops.pyi]
-
-[case testInferEqualsNotOptionalWithUnion]
-from typing import Union
-x = ''  # type: Union[str, int, None]
-if x == '<string>':
-    reveal_type(x)  # E: Revealed type is 'Union[builtins.str, builtins.int]'
-else:
-    reveal_type(x)  # E: Revealed type is 'Union[builtins.str, builtins.int, builtins.None]'
-[builtins fixtures/ops.pyi]
-
-[case testInferEqualsNotOptionalWithOverlap]
-from typing import Union
-x = ''  # type: Union[str, int, None]
-if x == object():
-    reveal_type(x)  # E: Revealed type is 'Union[builtins.str, builtins.int]'
-else:
-    reveal_type(x)  # E: Revealed type is 'Union[builtins.str, builtins.int, builtins.None]'
-[builtins fixtures/ops.pyi]
-
-[case testInferEqualsStillOptionalWithNoOverlap]
-from typing import Optional
-x = ''  # type: Optional[str]
-if x == 0:
-    reveal_type(x)  # E: Revealed type is 'Union[builtins.str, builtins.None]'
-else:
-    reveal_type(x)  # E: Revealed type is 'Union[builtins.str, builtins.None]'
-[builtins fixtures/ops.pyi]
-
-[case testInferEqualsStillOptionalWithBothOptional]
-from typing import Union
-x = ''  # type: Union[str, int, None]
-y = ''  # type: Union[str, None]
-if x == y:
-    reveal_type(x)  # E: Revealed type is 'Union[builtins.str, builtins.int, builtins.None]'
-else:
-    reveal_type(x)  # E: Revealed type is 'Union[builtins.str, builtins.int, builtins.None]'
-[builtins fixtures/ops.pyi]
-
-[case testWarnNoReturnWorksWithStrictOptional]
-# flags: --warn-no-return
-def f() -> None:
-  1 + 1  # no error
-
-def g() -> int:
-  1 + 1  #
-[out]
-main:5: note: Missing return statement
-
-[case testGenericTypeAliasesOptional]
-from typing import TypeVar, Generic, Optional
-T = TypeVar('T')
-class Node(Generic[T]):
-    def __init__(self, x: T) -> None:
-        self.x = x
-
-ONode = Optional[Node[T]]
-def f(x: T) -> ONode[T]:
-    if 1 > 0:
-        return Node(x)
-    else:
-        return None
-
-x = None # type: ONode[int]
-x = f(1)
-x = f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-x.x = 1 # E: Some element of union has no attribute "x"
-if x is not None:
-    x.x = 1 # OK here
-
-[builtins fixtures/ops.pyi]
-
-[case testOptionalLambdaInference]
-from typing import Optional, Callable
-f = None # type: Optional[Callable[[int], None]]
-f = lambda x: None
-f(0)
-[builtins fixtures/function.pyi]
diff --git a/test-data/unit/check-overloading.test b/test-data/unit/check-overloading.test
deleted file mode 100644
index e173fb2..0000000
--- a/test-data/unit/check-overloading.test
+++ /dev/null
@@ -1,759 +0,0 @@
--- Test cases for function overloading
-
-
-[case testTypeCheckOverloadedFunctionBody]
-from typing import overload
- at overload
-def f(x: 'A'):
-    x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    x = A()
- at overload
-def f(x: 'B'):
-    x = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-    x = B()
-class A: pass
-class B: pass
-[out]
-
-[case testTypeCheckOverloadedMethodBody]
-from typing import overload
-class A:
-    @overload
-    def f(self, x: 'A'):
-        x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-        x = A()
-    @overload
-    def f(self, x: 'B'):
-        x = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-        x = B()
-class B: pass
-[out]
-
-[case testCallToOverloadedFunction]
-from typing import overload
-f(C()) # E: No overload variant of "f" matches argument types [__main__.C]
-f(A())
-f(B())
-
- at overload
-def f(x: 'A') -> None: pass
- at overload
-def f(x: 'B') -> None: pass
-
-class A: pass
-class B: pass
-class C: pass
-
-[case testOverloadedFunctionReturnValue]
-from typing import overload
-a, b = None, None # type: (A, B)
-b = f(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = f(a)
-b = f(b)
-
- at overload
-def f(x: 'A') -> 'A': pass
- at overload
-def f(x: 'B') -> 'B': pass
-class A: pass
-class B: pass
-
-[case testCallToOverloadedMethod]
-from typing import overload
-A().f(C()) # E: No overload variant of "f" of "A" matches argument types [__main__.C]
-A().f(A())
-A().f(B())
-
-class A:
-  @overload
-  def f(self, x: 'A') -> None: pass
-  @overload
-  def f(self, x: 'B') -> None: pass
-
-class B: pass
-class C: pass
-
-[case testOverloadedMethodReturnValue]
-from typing import overload
-a, b = None, None # type: (A, B)
-b = a.f(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = a.f(b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = a.f(a)
-b = a.f(b)
-
-class A:
-  @overload
-  def f(self, x: 'A') -> 'A': pass
-  @overload
-  def f(self, x: 'B') -> 'B': pass
-class B: pass
-
-[case testOverloadsWithDifferentArgumentCounts]
-from typing import overload
-a, b = None, None # type: (A, B)
-a = f(a)
-b = f(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-f(b)     # E: No overload variant of "f" matches argument types [__main__.B]
-b = f(b, a)
-a = f(b, a) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-f(a, a)     # E: No overload variant of "f" matches argument types [__main__.A, __main__.A]
-f(b, b)     # E: No overload variant of "f" matches argument types [__main__.B, __main__.B]
-
- at overload
-def f(x: 'A') -> 'A': pass
- at overload
-def f(x: 'B', y: 'A') -> 'B': pass
-class A: pass
-class B: pass
-
-[case testGenericOverloadVariant]
-from typing import overload, TypeVar, Generic
-t = TypeVar('t')
-ab, ac, b, c = None, None, None, None # type: (A[B], A[C], B, C)
-b = f(ab)
-c = f(ac)
-b = f(ac) # E: Incompatible types in assignment (expression has type "C", variable has type "B")
-b = f(b)
-c = f(b)  # E: Incompatible types in assignment (expression has type "B", variable has type "C")
- at overload
-def f(x: 'A[t]') -> t: pass
- at overload
-def f(x: 'B') -> 'B': pass
-class A(Generic[t]): pass
-class B: pass
-class C: pass
-
-[case testOverloadedInit]
-from typing import overload
-a, b = None, None # type: (A, B)
-a = A(a)
-a = A(b)
-a = A(object()) # E: No overload variant of "A" matches argument types [builtins.object]
-
-class A:
-  @overload
-  def __init__(self, a: 'A') -> None: pass
-  @overload
-  def __init__(self, b: 'B') -> None: pass
-class B: pass
-
-[case testIntersectionTypeCompatibility]
-from typing import overload, Callable
-o = None # type: object
-a = None # type: A
-
-a = f # E: Incompatible types in assignment (expression has type overloaded function, variable has type "A")
-o = f
-
- at overload
-def f(a: 'A') -> None: pass
- at overload
-def f(a: Callable[[], None]) -> None: pass
-class A: pass
-
-[case testCompatibilityOfIntersectionTypeObjectWithStdType]
-from typing import overload
-t, a = None, None # type: (type, A)
-
-a = A # E: Incompatible types in assignment (expression has type "A" (type object), variable has type "A")
-t = A
-
-class A:
-    @overload
-    def __init__(self, a: 'A') -> None: pass
-    @overload
-    def __init__(self, a: 'B') -> None: pass
-class B: pass
-
-[case testOverloadedGetitem]
-from typing import overload
-a, b = None, None # type: int, str
-a = A()[a]
-b = A()[a] # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-b = A()[b]
-a = A()[b] # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-class A:
-    @overload
-    def __getitem__(self, a: int) -> int: pass
-    @overload
-    def __getitem__(self, b: str) -> str: pass
-
-[case testOverloadedGetitemWithGenerics]
-from typing import TypeVar, Generic, overload
-t = TypeVar('t')
-a, b, c = None, None, None # type: (A, B, C[A])
-a = c[a]
-b = c[a] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = c[b]
-b = c[b] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-class C(Generic[t]):
-    @overload
-    def __getitem__(self, a: 'A') -> t: pass
-    @overload
-    def __getitem__(self, b: 'B') -> t: pass
-class A: pass
-class B: pass
-
-[case testImplementingOverloadedMethod]
-from typing import overload
-from abc import abstractmethod, ABCMeta
-
-class I(metaclass=ABCMeta):
-    @overload
-    @abstractmethod
-    def f(self) -> None: pass
-    @overload
-    @abstractmethod
-    def f(self, a: 'A') -> None: pass
-class A(I):
-    @overload
-    def f(self) -> None: pass
-    @overload
-    def f(self, a: 'A') -> None: pass
-
-[case testOverloadWithFunctionType]
-from typing import overload, Callable
-class A: pass
- at overload
-def f(x: A) -> None: pass
- at overload
-def f(x: Callable[[], None]) -> None: pass
-
-f(A())
-[builtins fixtures/function.pyi]
-
-[case testVarArgsOverload]
-from typing import overload, Any
- at overload
-def f(x: 'A', *more: Any) -> 'A': pass
- at overload
-def f(x: 'B', *more: Any) -> 'A': pass
-f(A())
-f(A(), A, A)
-f(B())
-f(B(), B)
-f(B(), B, B)
-f(object()) # E: No overload variant of "f" matches argument types [builtins.object]
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testVarArgsOverload2]
-from typing import overload
- at overload
-def f(x: 'A', *more: 'B') -> 'A': pass
- at overload
-def f(x: 'B', *more: 'A') -> 'A': pass
-f(A(), B())
-f(A(), B(), B())
-f(A(), A(), B()) # E: No overload variant of "f" matches argument types [__main__.A, __main__.A, __main__.B]
-f(A(), B(), A()) # E: No overload variant of "f" matches argument types [__main__.A, __main__.B, __main__.A]
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testOverloadWithTypeObject]
-from typing import overload
- at overload
-def f(a: 'A', t: type) -> None: pass
- at overload
-def f(a: 'B', t: type) -> None: pass
-f(A(), B)
-f(B(), A)
-class A: pass
-class B: pass
-[builtins fixtures/function.pyi]
-
-[case testOverloadedInitAndTypeObjectInOverload]
-from typing import overload
- at overload
-def f(t: type) -> 'A': pass
- at overload
-def f(t: 'A') -> 'B': pass
-a, b = None, None # type: (A, B)
-a = f(A)
-b = f(a)
-b = f(A) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(a) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-class A:
-   @overload
-   def __init__(self) -> None: pass
-   @overload
-   def __init__(self, a: 'A') -> None: pass
-class B:
-    pass
-
-[case testOverlappingErasedSignatures]
-from typing import overload, List
- at overload
-def f(a: List[int]) -> int: pass
- at overload
-def f(a: List[str]) -> int: pass
-list_int = [] # type: List[int]
-list_str = [] # type: List[str]
-list_object = [] # type: List[object]
-n = f(list_int)
-m = f(list_str)
-n = 1
-m = 1
-n = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-m = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-f(list_object) # E: Argument 1 to "f" has incompatible type List[object]; expected List[int]
-[builtins fixtures/list.pyi]
-
-[case testOverlappingOverloadSignatures]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def f(x: B) -> int: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(x: A) -> str: pass
-
-[case testContravariantOverlappingOverloadSignatures]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def f(x: A) -> A: pass
- at overload
-def f(x: B) -> B: pass # This is more specific than the first item, and thus
-                       # will never be called.
-
-[case testPartiallyCovariantOverlappingOverloadSignatures]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def f(x: B) -> A: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(x: A) -> B: pass
-
-[case testPartiallyContravariantOverloadSignatures]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def g(x: A) -> int: pass # Fine, since A us supertype of B.
- at overload
-def g(x: B) -> str: pass
-
-[case testCovariantOverlappingOverloadSignatures]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def g(x: B) -> B: pass
- at overload
-def g(x: A) -> A: pass
-
-[case testCovariantOverlappingOverloadSignaturesWithSomeSameArgTypes]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def g(x: int, y: B) -> B: pass
- at overload
-def g(x: int, y: A) -> A: pass
-
-[case testCovariantOverlappingOverloadSignaturesWithAnyType]
-from typing import Any, overload
- at overload
-def g(x: int) -> int: pass
- at overload
-def g(x: Any) -> Any: pass
-
-[case testContravariantOverlappingOverloadSignaturesWithAnyType]
-from typing import Any, overload
- at overload
-def g(x: Any) -> Any: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def g(x: int) -> int: pass
-
-[case testOverloadedLtAndGtMethods]
-from typing import overload
-class A:
-    def __lt__(self, x: A) -> int: pass
-    def __gt__(self, x: A) -> int: pass
-class B:
-    @overload
-    def __lt__(self, x: B) -> int: pass
-    @overload
-    def __lt__(self, x: A) -> int: pass
-    @overload
-    def __gt__(self, x: B) -> int: pass
-    @overload
-    def __gt__(self, x: A) -> int: pass
-A() < A()
-A() < B()
-B() < A()
-B() < B()
-A() < object() # E: Unsupported operand types for < ("A" and "object")
-B() < object() # E: No overload variant of "__lt__" of "B" matches argument types [builtins.object]
-
-[case testOverloadedForwardMethodAndCallingReverseMethod]
-from typing import overload
-class A:
-    @overload
-    def __add__(self, x: 'A') -> int: pass
-    @overload
-    def __add__(self, x: int) -> int: pass
-class B:
-    def __radd__(self, x: A) -> int: pass
-A() + A()
-A() + 1
-A() + B()
-A() + '' # E: No overload variant of "__add__" of "A" matches argument types [builtins.str]
-
-[case testOverrideOverloadedMethodWithMoreGeneralArgumentTypes]
-from typing import overload
-
-class IntSub(int): pass
-
-class StrSub(str): pass
-class A:
-    @overload
-    def f(self, x: IntSub) -> int: return 0
-    @overload
-    def f(self, x: StrSub) -> str: return ''
-class B(A):
-    @overload
-    def f(self, x: int) -> int: return 0
-    @overload
-    def f(self, x: str) -> str: return ''
-[out]
-
-[case testOverrideOverloadedMethodWithMoreSpecificArgumentTypes]
-from typing import overload
-
-class IntSub(int): pass
-
-class StrSub(str): pass
-class A:
-    @overload
-    def f(self, x: int) -> int: return 0
-    @overload
-    def f(self, x: str) -> str: return ''
-class B(A):
-    @overload
-    def f(self, x: IntSub) -> int: return 0
-    @overload
-    def f(self, x: str) -> str: return ''
-class C(A):
-    @overload
-    def f(self, x: int) -> int: return 0
-    @overload
-    def f(self, x: StrSub) -> str: return ''
-class D(A):
-    @overload
-    def f(self, x: int) -> int: return 0
-    @overload
-    def f(self, x: str) -> str: return ''
-[out]
-main:12: error: Signature of "f" incompatible with supertype "A"
-main:17: error: Signature of "f" incompatible with supertype "A"
-
-[case testOverloadingAndDucktypeCompatibility]
-from typing import overload, _promote
-
-class A: pass
-
- at _promote(A)
-class B: pass
-
- at overload
-def f(n: B) -> B:
-    return n
- at overload
-def f(n: A) -> A:
-    return n
-
-f(B()) + 'x'  # E: Unsupported left operand type for + ("B")
-f(A()) + 'x'  # E: Unsupported left operand type for + ("A")
-
-[case testOverloadingAndIntFloatSubtyping]
-from typing import overload
- at overload
-def f(x: float) -> None: pass
- at overload
-def f(x: str) -> None: pass
-f(1.1)
-f('')
-f(1)
-f(()) # E: No overload variant of "f" matches argument types [Tuple[]]
-[builtins fixtures/primitives.pyi]
-[out]
-
-[case testOverloadingVariableInputs]
-from typing import overload
- at overload
-def f(x: int, y: int) -> None: pass
- at overload
-def f(x: int) -> None: pass
-f(1)
-f(1, 2)
-z = (1, 2)
-f(*z)
-[builtins fixtures/primitives.pyi]
-[out]
-
-[case testTypeInferenceSpecialCaseWithOverloading]
-from typing import overload
-
-class A:
-    def __add__(self, x: A) -> A: pass
-class B:
-    def __radd__(self, x: A) -> B: pass
-
- at overload
-def f(x: A) -> A: pass
- at overload
-def f(x: B) -> B: pass
-
-f(A() + B())() # E: "B" not callable
-
-[case testKeywordArgOverload]
-from typing import overload
- at overload
-def f(x: int, y: str) -> int: pass
- at overload
-def f(x: str, y: int) -> str: pass
-f(x=1, y='')() # E: "int" not callable
-f(y=1, x='')() # E: "str" not callable
-
-[case testIgnoreOverloadVariantBasedOnKeywordArg]
-from typing import overload
- at overload
-def f(x: int) -> int: pass
- at overload
-def f(y: int) -> str: pass
-f(x=1)() # E: "int" not callable
-f(y=1)() # E: "str" not callable
-
-[case testOverloadWithTupleVarArg]
-from typing import overload
- at overload
-def f(x: int, y: str) -> int: pass
- at overload
-def f(*x: str) -> str: pass
-f(*(1,))() # E: No overload variant of "f" matches argument types [Tuple[builtins.int]]
-f(*('',))() # E: "str" not callable
-f(*(1, ''))() # E: "int" not callable
-f(*(1, '', 1))() # E: No overload variant of "f" matches argument types [Tuple[builtins.int, builtins.str, builtins.int]]
-
-[case testPreferExactSignatureMatchInOverload]
-from typing import overload, List
- at overload
-def f(x: int, y: List[int] = None) -> int: pass
- at overload
-def f(x: int, y: List[str] = None) -> int: pass
-f(y=[1], x=0)() # E: "int" not callable
-f(y=[''], x=0)() # E: "int" not callable
-a = f(y=[['']], x=0) # E: List item 0 has incompatible type List[str]
-a() # E: "int" not callable
-[builtins fixtures/list.pyi]
-
-[case testOverloadWithDerivedFromAny]
-from typing import Any, overload
-Base = None  # type: Any
-
-class C:
-    @overload
-    def __init__(self, a: str) -> None: pass
-    @overload
-    def __init__(self, a: int) -> None: pass
-
-class Derived(Base):
-    def to_dict(self) -> C:
-        return C(self)  # fails without the fix for #1363
-C(Derived())  # fails without the hack
-C(Base())  # Always ok
-
-[case testOverloadWithBoundedTypeVar]
-from typing import overload, TypeVar
-T = TypeVar('T', bound=str)
- at overload
-def f(x: T) -> T: pass
- at overload
-def f(x: int) -> bool: pass
-class mystr(str): pass
-
-f('x')() # E: "str" not callable
-f(1)() # E: "bool" not callable
-f(1.1) # E: No overload variant of "f" matches argument types [builtins.float]
-f(mystr())() # E: "mystr" not callable
-[builtins fixtures/primitives.pyi]
-
-[case testOverloadedCallWithVariableTypes]
-from typing import overload, TypeVar, List
-T = TypeVar('T', bound=str)
- at overload
-def f(x: T) -> T: pass
- at overload
-def f(x: List[T]) -> None: pass
-class mystr(str): pass
-
-U = TypeVar('U', bound=mystr)
-V = TypeVar('V')
-def g(x: U, y: V) -> None:
-    f(x)() # E: "mystr" not callable
-    f(y) # E: No overload variant of "f" matches argument types [V`-2]
-    a = f([x]) # E: "f" does not return a value
-    f([y]) # E: Type argument 1 of "f" has incompatible value "V"
-    f([x, y]) # E: Type argument 1 of "f" has incompatible value "object"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testOverlapWithTypeVars]
-from typing import overload, TypeVar, Sequence
-T = TypeVar('T', bound=str)
- at overload
-def f(x: Sequence[T]) -> None: pass
- at overload
-def f(x: Sequence[int]) -> int: pass
-# These are considered overlapping despite the bound on T due to runtime type erasure.
-[out]
-main:4: error: Overloaded function signatures 1 and 2 overlap with incompatible return types
-
-[case testOverlapWithTypeVarsWithValues]
-from typing import overload, TypeVar
-AnyStr = TypeVar('AnyStr', bytes, str)
-
- at overload
-def f(x: int) -> int: pass
- at overload
-def f(x: AnyStr) -> str: pass
-
-f(1)() # E: "int" not callable
-f('1')() # E: "str" not callable
-f(b'1')() # E: "str" not callable
-f(1.0) # E: No overload variant of "f" matches argument types [builtins.float]
-
- at overload
-def g(x: AnyStr, *a: AnyStr) -> None: pass
- at overload
-def g(x: int, *a: AnyStr) -> None: pass
-
-g('foo')
-g('foo', 'bar')
-g('foo', b'bar') # E: Type argument 1 of "g" has incompatible value "object"
-g(1)
-g(1, 'foo')
-g(1, 'foo', b'bar') # E: Type argument 1 of "g" has incompatible value "object"
-[builtins fixtures/primitives.pyi]
-
-[case testBadOverlapWithTypeVarsWithValues]
-from typing import overload, TypeVar
-AnyStr = TypeVar('AnyStr', bytes, str)
-
- at overload
-def f(x: AnyStr) -> None: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(x: str) -> bool: pass
-[builtins fixtures/primitives.pyi]
-
-[case testOverlappingOverloadCounting]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def f(x: int) -> None: pass
- at overload
-def f(x: B) -> str: pass # E: Overloaded function signatures 2 and 3 overlap with incompatible return types
- at overload
-def f(x: A) -> int: pass
-
-[case testOverloadWithTupleMatchingTypeVar]
-from typing import TypeVar, Generic, Tuple, overload
-
-T = TypeVar('T')
-
-class A(Generic[T]):
-    @overload
-    def f(self, arg: T) -> None:
-        pass
-    @overload
-    def f(self, arg: T, default: int) -> None:
-        pass
-
-b = A()  # type: A[Tuple[int, int]]
-b.f((0, 0))
-b.f((0, '')) # E: Argument 1 to "f" of "A" has incompatible type "Tuple[int, str]"; expected "Tuple[int, int]"
-
-[case testSingleOverload]
-from typing import overload
- at overload
-def f(a: int) -> None: pass
-def f(a: str) -> None: pass
-[out]
-main:2: error: Single overload definition, multiple required
-main:4: error: Name 'f' already defined
-
-[case testSingleOverload2]
-from typing import overload
-def f(a: int) -> None: pass
- at overload
-def f(a: str) -> None: pass
-[out]
-main:3: error: Name 'f' already defined
-main:3: error: Single overload definition, multiple required
-
-[case testNonconsecutiveOverloads]
-from typing import overload
- at overload
-def f(a: int) -> None: pass
-1
- at overload
-def f(a: str) -> None: pass
-[out]
-main:2: error: Single overload definition, multiple required
-main:5: error: Name 'f' already defined
-main:5: error: Single overload definition, multiple required
-
-[case testNonconsecutiveOverloadsMissingFirstOverload]
-from typing import overload
-def f(a: int) -> None: pass
-1
- at overload
-def f(a: str) -> None: pass
-[out]
-main:4: error: Name 'f' already defined
-main:4: error: Single overload definition, multiple required
-
-[case testNonconsecutiveOverloadsMissingLaterOverload]
-from typing import overload
- at overload
-def f(a: int) -> None: pass
-1
-def f(a: str) -> None: pass
-[out]
-main:2: error: Single overload definition, multiple required
-main:5: error: Name 'f' already defined
-
-[case testOverloadTuple]
-from typing import overload, Tuple
- at overload
-def f(x: int, y: Tuple[str, ...]) -> None: pass
- at overload
-def f(x: int, y: str) -> None: pass
-f(1, ('2', '3'))
-f(1, (2, '3')) # E: Argument 2 to "f" has incompatible type "Tuple[int, str]"; expected Tuple[str, ...]
-f(1, ('2',))
-f(1, '2')
-f(1, (2, 3)) # E: Argument 2 to "f" has incompatible type "Tuple[int, int]"; expected Tuple[str, ...]
-x = ('2', '3')  # type: Tuple[str, ...]
-f(1, x)
-y = (2, 3)  # type: Tuple[int, ...]
-f(1, y) # E: Argument 2 to "f" has incompatible type Tuple[int, ...]; expected Tuple[str, ...]
-[builtins fixtures/tuple.pyi]
-
-[case testCallableSpecificOverload]
-from typing import overload, Callable
- at overload
-def f(a: Callable[[], int]) -> None: pass
- at overload
-def f(a: str) -> None: pass
-f(0)  # E: No overload variant of "f" matches argument types [builtins.int]
diff --git a/test-data/unit/check-python2.test b/test-data/unit/check-python2.test
deleted file mode 100644
index 99a55f0..0000000
--- a/test-data/unit/check-python2.test
+++ /dev/null
@@ -1,221 +0,0 @@
--- Type checker test cases for Python 2.x mode.
-
-
-[case testUnicode]
-u = u'foo'
-u = unicode()
-s = ''
-s = u'foo' # E: Incompatible types in assignment (expression has type "unicode", variable has type "str")
-s = b'foo'
-[builtins_py2 fixtures/python2.pyi]
-
-[case testTypeVariableUnicode]
-from typing import TypeVar
-T = TypeVar(u'T')
-
-[case testNamedTuple*sh Unicode]
-from typing import NamedTuple
-from collections import namedtuple
-N = NamedTuple(u'N', [(u'x', int)])
-n = namedtuple(u'n', u'x y')
-
-[builtins fixtures/dict.pyi]
-
-[case testPrintStatement]
-print ''() # E: "str" not callable
-print 1, 1() # E: "int" not callable
-
-[case testPrintStatementWithTarget]
-class A:
-    def write(self, s: str) -> None: pass
-
-print >>A(), ''
-print >>None, ''
-print >>1, '' # E: "int" has no attribute "write"
-print >>(None + ''), None # E: Unsupported left operand type for + (None)
-
-[case testDivision]
-class A:
-    def __div__(self, x: int) -> str: pass
-s = A() / 1
-s = ''
-s = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testStrUnicodeCompatibility]
-import typing
-def f(x: unicode) -> None: pass
-f('')
-f(u'')
-f(b'')
-[builtins_py2 fixtures/python2.pyi]
-
-[case testStaticMethodWithCommentSignature]
-class A:
-    @staticmethod
-    def f(x): # type: (int) -> str
-        return ''
-A.f(1)
-A.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-[builtins_py2 fixtures/staticmethod.pyi]
-
-[case testRaiseTuple]
-import typing
-raise BaseException, "a"
-raise BaseException, "a", None
-raise BaseException, "a", None, None # E: Exception must be derived from BaseException
-[builtins_py2 fixtures/exception.pyi]
-
-[case testTryExceptWithTuple]
-try:
-    None
-except BaseException, e:
-    e() # E: "BaseException" not callable
-[builtins_py2 fixtures/exception.pyi]
-
-[case testAlternateNameSuggestions]
-class Foo(object):
-    def say_hello(self):
-        pass
-    def say_hell(self):
-        pass
-    def say_hullo(self):
-        pass
-    def say_goodbye(self):
-        pass
-    def go_away(self):
-        pass
-    def go_around(self):
-        pass
-    def append(self):
-        pass
-    def extend(self):
-        pass
-    def _add(self):
-        pass
-
-f = Foo()
-f.say_hallo() # E: "Foo" has no attribute "say_hallo"; maybe "say_hullo", "say_hello", or "say_hell"?
-f.go_array() # E: "Foo" has no attribute "go_array"; maybe "go_away"?
-f.add() # E: "Foo" has no attribute "add"; maybe "append", "extend", or "_add"?
-
-[case testTupleArgListDynamicallyTyped]
-def f(x, (y, z)):
-    x = y + z
-f(1, 1)
-f(1, (1, 2))
-
-[case testTupleArgListAnnotated]
-from typing import Tuple
-def f(x, (y, z)): # type: (object, Tuple[int, str]) -> None
-    x() # E
-    y() # E
-    z() # E
-f(object(), (1, ''))
-f(1, 1) # E
-[builtins_py2 fixtures/tuple.pyi]
-[out]
-main:3: error: "object" not callable
-main:4: error: "int" not callable
-main:5: error: "str" not callable
-main:7: error: Argument 2 to "f" has incompatible type "int"; expected "Tuple[int, str]"
-
-[case testNestedTupleArgListAnnotated]
-from typing import Tuple
-def f(x, (y, (a, b))): # type: (object, Tuple[int, Tuple[str, int]]) -> None
-    x() # E
-    y() # E
-    a() # E
-    b() # E
-f(object(), (1, ('', 2)))
-f(1, 1) # E
-[builtins fixtures/tuple.pyi]
-[out]
-main:3: error: "object" not callable
-main:4: error: "int" not callable
-main:5: error: "str" not callable
-main:6: error: "int" not callable
-main:8: error: Argument 2 to "f" has incompatible type "int"; expected "Tuple[int, Tuple[str, int]]"
-
-[case testBackquoteExpr]
-`1`.x # E: "str" has no attribute "x"
-
-[case testPython2OnlyStdLibModuleWithoutStub]
-import asyncio
-import Bastion
-[out]
-main:1: error: Cannot find module named 'asyncio'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: No library stub file for standard library module 'Bastion'
-main:2: note: (Stub files are from https://github.com/python/typeshed)
-
-[case testImportFromPython2Builtin]
-from __builtin__ import int as i
-x = 1 # type: i
-y = '' # type: i  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testImportPython2Builtin]
-import __builtin__
-x = 1 # type: __builtin__.int
-y = '' # type: __builtin__.int  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testImportAsPython2Builtin]
-import __builtin__ as bi
-x = 1 # type: bi.int
-y = '' # type: bi.int  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testImportFromPython2BuiltinOverridingDefault]
-from __builtin__ import int
-x = 1 # type: int
-y = '' # type: int  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
--- Copied from check-functions.test
-[case testEllipsisWithArbitraryArgsOnBareFunctionInPython2]
-def f(x, y, z): # type: (...) -> None
-    pass
-
--- Copied from check-functions.test
-[case testEllipsisWithSomethingAfterItFailsInPython2]
-def f(x, y, z): # type: (..., int) -> None
-    pass
-[out]
-main:1: error: Parse error before ): Ellipses cannot accompany other argument types in function type signature.
-
-[case testLambdaTupleArgInPython2]
-f = lambda (x, y): x + y
-f((0, 0))
-[out]
-
-[case testLambdaSingletonTupleArgInPython2]
-f = lambda (x,): x + 1
-f((0,))
-[out]
-
-[case testLambdaNoTupleArgInPython2]
-f = lambda (x): x + 1
-f(0)
-[out]
-
-[case testDefTupleEdgeCasesPython2]
-def f((x,)): return x
-def g((x)): return x
-f(0) + g(0)
-[out]
-
-[case testLambdaAsSortKeyForTuplePython2]
-from typing import Any, Tuple, Callable
-def bar(key: Callable[[Tuple[int, int]], int]) -> int:
-    pass
-def foo() -> int:
-    return bar(key=lambda (a, b): a)
-[out]
-
-[case testImportBuiltins]
-# flags: --fast-parser
-import __builtin__
-__builtin__.str
-
-[case testUnicodeAlias]
-from typing import List
-Alias = List[u'Foo']
-class Foo: pass
-[builtins_py2 fixtures/python2.pyi]
diff --git a/test-data/unit/check-selftype.test b/test-data/unit/check-selftype.test
deleted file mode 100644
index 98bcfa1..0000000
--- a/test-data/unit/check-selftype.test
+++ /dev/null
@@ -1,358 +0,0 @@
-[case testSelfTypeInstance]
-from typing import TypeVar
-
-T = TypeVar('T', bound='A', covariant=True)
-
-class A:
-    def copy(self: T) -> T: pass
-
-class B(A):
-    pass
-
-reveal_type(A().copy)  # E: Revealed type is 'def () -> __main__.A*'
-reveal_type(B().copy)  # E: Revealed type is 'def () -> __main__.B*'
-reveal_type(A().copy())  # E: Revealed type is '__main__.A*'
-reveal_type(B().copy())  # E: Revealed type is '__main__.B*'
-
-[builtins fixtures/bool.pyi]
-
-[case testSelfTypeStaticAccess]
-from typing import TypeVar
-
-T = TypeVar('T', bound='A', covariant=True)
-class A:
-    def copy(self: T) -> T: pass
-
-class B(A):
-    pass
-
-# Erased instances appear on reveal_type; unrelated to self type
-def f(a: A) -> None: pass
-f(A.copy(A()))
-f(A.copy(B()))
-f(B.copy(B()))
-
-# TODO: make it an error
-# f(B.copy(A()))
-
-def g(a: B) -> None: pass
-g(A.copy(A()))  # E: Argument 1 to "g" has incompatible type "A"; expected "B"
-g(A.copy(B()))
-g(B.copy(B()))
-
-[builtins fixtures/bool.pyi]
-
-[case testSelfTypeReturn]
-from typing import TypeVar, Type
-
-R = TypeVar('R')
-def _type(self: R) -> Type[R]: pass
-
-T = TypeVar('T', bound='A', covariant=True)
-class A:
-    def copy(self: T) -> T:
-        if B():
-            return A()  # E: Incompatible return value type (got "A", expected "T")
-        elif A():
-            return B()  # E: Incompatible return value type (got "B", expected "T")
-        reveal_type(_type(self))  # E: Revealed type is 'Type[T`-1]'
-        return reveal_type(_type(self)())  # E: Revealed type is 'T`-1'
-
-class B(A):
-    pass
-
-Q = TypeVar('Q', bound='C', covariant=True)
-class C:
-    def __init__(self, a: int) -> None: pass
-
-    def copy(self: Q) -> Q:
-        if self:
-            return reveal_type(_type(self)(1))  # E: Revealed type is 'Q`-1'
-        else:
-            return _type(self)()  # E: Too few arguments for "C"
-
-
-[builtins fixtures/bool.pyi]
-
-[case testSelfTypeClass]
-from typing import TypeVar, Type
-
-T = TypeVar('T', bound='A')
-
-class A:
-    @classmethod
-    def new(cls: Type[T]) -> T:
-        return reveal_type(cls())  # E: Revealed type is 'T`-1'
-
-class B(A):
-    pass
-
-Q = TypeVar('Q', bound='C', covariant=True)
-class C:
-    def __init__(self, a: int) -> None: pass
-
-    @classmethod
-    def new(cls: Type[Q]) -> Q:
-        if cls:
-            return cls(1)
-        else:
-            return cls()  # E: Too few arguments for "C"
-
-
-reveal_type(A.new)  # E: Revealed type is 'def () -> __main__.A*'
-reveal_type(B.new)  # E: Revealed type is 'def () -> __main__.B*'
-reveal_type(A.new())  # E: Revealed type is '__main__.A*'
-reveal_type(B.new())  # E: Revealed type is '__main__.B*'
-
-[builtins fixtures/classmethod.pyi]
-
-[case testSelfTypeOverride]
-from typing import TypeVar, cast
-
-T = TypeVar('T', bound='A', covariant=True)
-
-class A:
-    def copy(self: T) -> T: pass
-
-class B(A):
-    pass
-
-Q = TypeVar('Q', bound='C', covariant=True)
-class C(A):
-    def copy(self: Q) -> Q: pass
-
-reveal_type(C().copy)  # E: Revealed type is 'def () -> __main__.C*'
-reveal_type(C().copy())  # E: Revealed type is '__main__.C*'
-reveal_type(cast(A, C()).copy)  # E: Revealed type is 'def () -> __main__.A*'
-reveal_type(cast(A, C()).copy())  # E: Revealed type is '__main__.A*'
-
-[builtins fixtures/bool.pyi]
-
-[case testSelfTypeSuper]
-from typing import TypeVar, cast
-
-T = TypeVar('T', bound='A', covariant=True)
-
-class A:
-    def copy(self: T) -> T: pass
-
-Q = TypeVar('Q', bound='B', covariant=True)
-class B(A):
-    def copy(self: Q) -> Q:
-        reveal_type(self)  # E: Revealed type is 'Q`-1'
-        reveal_type(super().copy)  # E: Revealed type is 'def () -> Q`-1'
-        return super().copy()
-
-[builtins fixtures/bool.pyi]
-
-[case testSelfTypeRecursiveBinding]
-from typing import TypeVar, Callable, Type
-
-T = TypeVar('T', bound='A', covariant=True)
-class A:
-    # TODO: This is potentially unsafe, as we use T in an argument type
-    def copy(self: T, factory: Callable[[T], T]) -> T:
-        return factory(self)
-
-    @classmethod
-    def new(cls: Type[T], factory: Callable[[T], T]) -> T:
-        reveal_type(cls)   # E: Revealed type is 'Type[T`-1]'
-        reveal_type(cls())   # E: Revealed type is 'T`-1'
-        cls(2)  # E: Too many arguments for "A"
-        return cls()
-
-class B(A):
-    pass
-
-reveal_type(A().copy)  # E: Revealed type is 'def (factory: def (__main__.A*) -> __main__.A*) -> __main__.A*'
-reveal_type(B().copy)  # E: Revealed type is 'def (factory: def (__main__.B*) -> __main__.B*) -> __main__.B*'
-reveal_type(A.new)  # E: Revealed type is 'def (factory: def (__main__.A*) -> __main__.A*) -> __main__.A*'
-reveal_type(B.new)  # E: Revealed type is 'def (factory: def (__main__.B*) -> __main__.B*) -> __main__.B*'
-
-[builtins fixtures/classmethod.pyi]
-
-[case testSelfTypeBound]
-from typing import TypeVar, Callable, cast
-
-TA = TypeVar('TA', bound='A', covariant=True)
-
-class A:
-    def copy(self: TA) -> TA:
-        pass
-
-class C(A):
-    def copy(self: C) -> C:
-        pass
-
-class D(A):
-   def copy(self: A) -> A:  # E: Return type of "copy" incompatible with supertype "A"
-       pass
-
-TB = TypeVar('TB', bound='B', covariant=True)
-class B(A):
-    x = 1
-    def copy(self: TB) -> TB:
-        reveal_type(self.x)  # E: Revealed type is 'builtins.int'
-        return cast(TB, None)
-
-[builtins fixtures/bool.pyi]
-
--- # TODO: fail for this
--- [case testSelfTypeBare]
--- from typing import TypeVar, Type
---
--- T = TypeVar('T', bound='E')
---
--- class E:
---     def copy(self: T, other: T) -> T: pass
-
-[case testSelfTypeClone]
-from typing import TypeVar, Type
-
-T = TypeVar('T', bound='C')
-
-class C:
-    def copy(self: T) -> T:
-        return self
-
-    @classmethod
-    def new(cls: Type[T]) -> T:
-        return cls()
-
-def clone(arg: T) -> T:
-    reveal_type(arg.copy)  # E: Revealed type is 'def () -> T`-1'
-    return arg.copy()
-
-
-def make(cls: Type[T]) -> T:
-    reveal_type(cls.new)  # E: Revealed type is 'def () -> T`-1'
-    return cls.new()
-
-[builtins fixtures/classmethod.pyi]
-
-[case testSelfTypeGeneric]
-from typing import TypeVar
-
-T = TypeVar('T', int, str)
-
-class A:
-    pass
-
-class B(A):
-    def __init__(self, arg: T) -> None:
-        super(B, self).__init__()
-
-[case testSelfTypeNonsensical]
-from typing import TypeVar, Type
-
-T = TypeVar('T', bound=str)
-class A:
-    def foo(self: T) -> T:   # E: The erased type of self 'builtins.str' is not a supertype of its class '__main__.A'
-        return self
-
-    @classmethod
-    def cfoo(cls: Type[T]) -> T:  # E: The erased type of self 'Type[builtins.str]' is not a supertype of its class 'Type[__main__.A]'
-        return cls()
-
-Q = TypeVar('Q', bound='B')
-class B:
-    def foo(self: Q) -> Q:
-        return self
-
-    @classmethod
-    def cfoo(cls: Type[Q]) -> Q:
-        return cls()
-
-class C:
-    def foo(self: C) -> C: return self
-
-    @classmethod
-    def cfoo(cls: Type[C]) -> C:
-        return cls()
-
-class D:
-    def foo(self: str) -> str:  # E: The erased type of self 'builtins.str' is not a supertype of its class '__main__.D'
-        return self
-
-    @staticmethod
-    def bar(self: str) -> str:
-        return self
-
-    @classmethod
-    def cfoo(cls: Type[str]) -> str:  # E: The erased type of self 'Type[builtins.str]' is not a supertype of its class 'Type[__main__.D]'
-        return cls()
-
-[builtins fixtures/classmethod.pyi]
-
-[case testSelfTypeLambdaDefault]
-from typing import Callable
-class C:
-    @classmethod
-    def foo(cls,
-            arg: Callable[[int], str] = lambda a: ''
-            ) -> None:
-        pass
-
-    def bar(self,
-            arg: Callable[[int], str] = lambda a: ''
-            ) -> None:
-        pass
-[builtins fixtures/classmethod.pyi]
-
-[case testSelfTypeNew]
-from typing import TypeVar, Type
-
-T = TypeVar('T', bound=A)
-class A:
-    def __new__(cls: Type[T]) -> T:
-        return cls()
-
-    def __init_subclass__(cls: Type[T]) -> None:
-        pass
-
-class B:
-    def __new__(cls: Type[T]) -> T:  # E: The erased type of self 'Type[__main__.A]' is not a supertype of its class 'Type[__main__.B]'
-        return cls()
-
-    def __init_subclass__(cls: Type[T]) -> None:  # E: The erased type of self 'Type[__main__.A]' is not a supertype of its class 'Type[__main__.B]'
-        pass
-
-class C:
-    def __new__(cls: Type[C]) -> C:
-        return cls()
-
-    def __init_subclass__(cls: Type[C]) -> None:
-        pass
-
-class D:
-    def __new__(cls: D) -> D:  # E: The erased type of self '__main__.D' is not a supertype of its class 'Type[__main__.D]'
-        return cls
-
-    def __init_subclass__(cls: D) -> None:  # E: The erased type of self '__main__.D' is not a supertype of its class 'Type[__main__.D]'
-        pass
-
-class E:
-    def __new__(cls) -> E:
-        reveal_type(cls)  # E: Revealed type is 'def () -> __main__.E'
-        return cls()
-
-    def __init_subclass__(cls) -> None:
-        reveal_type(cls)  # E: Revealed type is 'def () -> __main__.E'
-
-[case testSelfTypeProperty]
-from typing import TypeVar
-
-T = TypeVar('T', bound='A')
-
-class A:
-    @property
-    def member(self: T) -> T:
-        pass
-
-class B(A):
-    pass
-
-reveal_type(A().member)  # E: Revealed type is '__main__.A*'
-reveal_type(B().member)  # E: Revealed type is '__main__.B*'
-
-[builtins fixtures/property.pyi]
diff --git a/test-data/unit/check-semanal-error.test b/test-data/unit/check-semanal-error.test
deleted file mode 100644
index 0a07829..0000000
--- a/test-data/unit/check-semanal-error.test
+++ /dev/null
@@ -1,81 +0,0 @@
--- Type checking after an error during semantic analysis
--- -----------------------------------------------------
---
--- This tests both the semantic analyzer (that it does not generate
--- corrupt state on error) and the type checker (that it can deal with
--- whatever state the semantic analyzer sets up).
-
--- TODO:
---  - invalid type in annotation
---  - invalid function comment type annotation
---  - invalid multiple assignment type annotation
---  - using a type variable as a value
---  - using special names defined in typing as values
-
-[case testMissingModuleImport1]
-import m # E
-m.foo()
-m.x = m.y
-1() # E
-[out]
-main:1: error: Cannot find module named 'm'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:4: error: "int" not callable
-
-[case testMissingModuleImport2]
-from m import x # E
-x.foo()
-x.a = x.b
-1() # E
-[out]
-main:1: error: Cannot find module named 'm'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:4: error: "int" not callable
-
-[case testMissingModuleImport3]
-from m import * # E
-x # E
-1() # E
-[out]
-main:1: error: Cannot find module named 'm'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Name 'x' is not defined
-main:3: error: "int" not callable
-
-[case testInvalidBaseClass1]
-class A(X): # E: Name 'X' is not defined
-    x = 1
-A().foo(1)
-A().x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testInvalidBaseClass2]
-X = 1
-class A(X): # E
-    x = 1
-A().foo(1)
-A().x = '' # E
-[out]
-main:2: error: Invalid type "__main__.X"
-main:2: error: Invalid base class
-main:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-
-[case testInvalidNumberOfTypeArgs]
-from typing import TypeVar
-T = TypeVar('T')
-class C:  # Forgot to add type params here
-    def __init__(self, t: T) -> None: pass
-c = C(t=3)  # type: C[int]  # E: "C" expects no type arguments, but 1 given
-
-[case testBreakOutsideLoop]
-break # E: 'break' outside loop
-
-[case testContinueOutsideLoop]
-continue # E: 'continue' outside loop
-
-[case testYieldOutsideFunction]
-yield # E: 'yield' outside function
-
-[case testYieldFromOutsideFunction]
-x = 1
-yield from x # E: 'yield from' outside function
diff --git a/test-data/unit/check-statements.test b/test-data/unit/check-statements.test
deleted file mode 100644
index b945fd1..0000000
--- a/test-data/unit/check-statements.test
+++ /dev/null
@@ -1,1322 +0,0 @@
--- Return statement
--- ----------------
-
-
-[case testReturnValue]
-import typing
-def f() -> 'A':
-    return A()
-def g() -> 'B':
-    return A()
-class A:
-    pass
-class B:
-    pass
-[out]
-main:5: error: Incompatible return value type (got "A", expected "B")
-
-[case testReturnSubtype]
-import typing
-def f() -> 'B':
-    return A()
-def g() -> 'A':
-    return B()
-class A:
-    pass
-class B(A):
-    pass
-[out]
-main:3: error: Incompatible return value type (got "A", expected "B")
-
-[case testReturnWithoutAValue]
-import typing
-def f() -> 'A':
-    return
-def g() -> None:
-    return
-class A:
-    pass
-[out]
-main:3: error: Return value expected
-
-[case testReturnNoneInFunctionReturningNone]
-import typing
-def f() -> None:
-    return None
-def g() -> None:
-    return f()  # E: No return value expected
-[out]
-
-[case testReturnInGenerator]
-from typing import Generator
-def f() -> Generator[int, None, str]:
-    yield 1
-    return "foo"
-[out]
-
-[case testEmptyReturnInGenerator]
-from typing import Generator
-def f() -> Generator[int, None, str]:
-    yield 1
-    return  # E: Return value expected
-[out]
-
-[case testEmptyReturnInNoneTypedGenerator]
-from typing import Generator
-def f() -> Generator[int, None, None]:
-    yield 1
-    return
-[out]
-
-[case testNonEmptyReturnInNoneTypedGenerator]
-from typing import Generator
-def f() -> Generator[int, None, None]:
-    yield 1
-    return 42  # E: No return value expected
-[out]
-
-[case testReturnInIterator]
-from typing import Iterator
-def f() -> Iterator[int]:
-    yield 1
-    return "foo"
-[out]
-
-
--- If statement
--- ------------
-
-
-[case testIfStatement]
-
-a = None # type: A
-a2 = None # type: A
-a3 = None # type: A
-b = None # type: bool
-if a:
-    a = b # E: Incompatible types in assignment (expression has type "bool", variable has type "A")
-elif a2:
-    a = b # E: Incompatible types in assignment (expression has type "bool", variable has type "A")
-elif a3:
-    a = b # E: Incompatible types in assignment (expression has type "bool", variable has type "A")
-else:
-    a = b # E: Incompatible types in assignment (expression has type "bool", variable has type "A")
-if b:
-    pass
-elif b:
-    pass
-if b:
-    pass
-
-class A: pass
-[builtins fixtures/bool.pyi]
-
-
--- Loops
--- -----
-
-
-[case testWhileStatement]
-
-a = None # type: A
-b = None # type: bool
-while a:
-    a = b    # Fail
-else:
-    a = b    # Fail
-while b:
-    b = b
-
-class A: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:7: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testForStatement]
-
-a = None # type: A
-b = None # type: object
-for a in [A()]:
-    a = b    # Fail
-else:
-    a = b    # Fail
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-main:7: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-[case testBreakStatement]
-import typing
-while None:
-    break
-[builtins fixtures/bool.pyi]
-[out]
-
-[case testContinueStatement]
-import typing
-while None:
-    continue
-[builtins fixtures/bool.pyi]
-[out]
-
-
--- Operator assignment
--- -------------------
-
-
-[case testPlusAssign]
-
-a, b, c = None, None, None # type: (A, B, C)
-a += b   # Fail
-b += a   # Fail
-c += a   # Fail
-a += c
-
-class A:
-    def __add__(self, x: 'C') -> 'A': pass
-
-class B:
-    def __add__(self, x: A) -> 'C': pass
-
-class C: pass
-[out]
-main:3: error: Unsupported operand types for + ("A" and "B")
-main:4: error: Result type of + incompatible in assignment
-main:5: error: Unsupported left operand type for + ("C")
-
-[case testMinusAssign]
-
-a, b, c = None, None, None # type: (A, B, C)
-a -= b   # Fail
-b -= a   # Fail
-c -= a   # Fail
-a -= c
-
-class A:
-    def __sub__(self, x: 'C') -> 'A': pass
-
-class B:
-    def __sub__(self, x: A) -> 'C': pass
-
-class C: pass
-[out]
-main:3: error: Unsupported operand types for - ("A" and "B")
-main:4: error: Result type of - incompatible in assignment
-main:5: error: Unsupported left operand type for - ("C")
-
-[case testMulAssign]
-
-a, c = None, None # type: (A, C)
-a *= a   # Fail
-c *= a   # Fail
-a *= c
-
-class A:
-    def __mul__(self, x: 'C') -> 'A': pass
-
-class C: pass
-[out]
-main:3: error: Unsupported operand types for * ("A" and "A")
-main:4: error: Unsupported left operand type for * ("C")
-
-[case testMatMulAssign]
-a, c = None, None # type: (A, C)
-a @= a   # E: Unsupported operand types for @ ("A" and "A")
-c @= a   # E: Unsupported left operand type for @ ("C")
-a @= c
-
-class A:
-    def __matmul__(self, x: 'C') -> 'A': pass
-
-class C: pass
-
-[case testDivAssign]
-
-a, c = None, None # type: (A, C)
-a /= a   # Fail
-c /= a   # Fail
-a /= c
-
-class A:
-    def __truediv__(self, x: 'C') -> 'A': pass
-
-class C: pass
-[out]
-main:3: error: Unsupported operand types for / ("A" and "A")
-main:4: error: Unsupported left operand type for / ("C")
-
-[case testPowAssign]
-
-a, c = None, None # type: (A, C)
-a **= a   # Fail
-c **= a   # Fail
-a **= c
-
-class A:
-    def __pow__(self, x: 'C') -> 'A': pass
-
-class C: pass
-[out]
-main:3: error: Unsupported operand types for ** ("A" and "A")
-main:4: error: Unsupported left operand type for ** ("C")
-
-[case testSubtypesInOperatorAssignment]
-
-a, b = None, None # type: (A, B)
-b += b
-b += a
-a += b
-
-class A:
-    def __add__(self, x: 'A') -> 'B': pass
-
-class B(A): pass
-[out]
-
-[case testAdditionalOperatorsInOpAssign]
-
-a, c = None, None # type: (A, C)
-a &= a  # Fail
-a >>= a # Fail
-a //= a # Fail
-a &= c
-a >>= c
-a //= c
-class A:
-    def __and__(self, x: 'C') -> 'A': pass
-    def __rshift__(self, x: 'C') -> 'A': pass
-    def __floordiv__(self, x: 'C') -> 'A': pass
-class C: pass
-[out]
-main:3: error: Unsupported operand types for & ("A" and "A")
-main:4: error: Unsupported operand types for >> ("A" and "A")
-main:5: error: Unsupported operand types for // ("A" and "A")
-
-[case testInplaceOperatorMethods]
-import typing
-class A:
-    def __iadd__(self, x: int) -> 'A': pass
-    def __imul__(self, x: str) -> 'A': pass
-    def __imatmul__(self, x: str) -> 'A': pass
-a = A()
-a += 1
-a *= ''
-a @= ''
-a += '' # E: Argument 1 to "__iadd__" of "A" has incompatible type "str"; expected "int"
-a *= 1  # E: Argument 1 to "__imul__" of "A" has incompatible type "int"; expected "str"
-a @= 1  # E: Argument 1 to "__imatmul__" of "A" has incompatible type "int"; expected "str"
-
-[case testInplaceSetitem]
-class A(object):
-    def __init__(self):
-        self.a = 0
-
-    def __iadd__(self, a):
-        # type: (int) -> A
-        self.a += 1
-        return self
-
-a = A()
-b = [a]
-b[0] += 1
-[builtins fixtures/list.pyi]
-[out]
-
-
--- Assert statement
--- ----------------
-
-
-[case testAssert]
-import typing
-assert None + None # Fail
-assert None
-[out]
-main:2: error: Unsupported left operand type for + (None)
-
-
--- Exception handling
--- ------------------
-
-
-[case testRaiseStatement]
-
-e = None # type: BaseException
-f = None # type: MyError
-a = None # type: A
-raise a # Fail
-raise e
-raise f
-class A: pass
-class MyError(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-main:5: error: Exception must be derived from BaseException
-
-[case testRaiseClassobject]
-import typing
-class A: pass
-class MyError(BaseException): pass
-def f(): pass
-raise BaseException
-raise MyError
-raise A # E: Exception must be derived from BaseException
-raise object # E: Exception must be derived from BaseException
-raise f # E: Exception must be derived from BaseException
-[builtins fixtures/exception.pyi]
-
-[case testRaiseFromStatement]
-
-e = None # type: BaseException
-f = None # type: MyError
-a = None # type: A
-raise e from a # E: Exception must be derived from BaseException
-raise e from e
-raise e from f
-class A: pass
-class MyError(BaseException): pass
-[builtins fixtures/exception.pyi]
-
-[case testRaiseFromClassobject]
-import typing
-class A: pass
-class MyError(BaseException): pass
-def f(): pass
-raise BaseException from BaseException
-raise BaseException from MyError
-raise BaseException from A # E: Exception must be derived from BaseException
-raise BaseException from object # E: Exception must be derived from BaseException
-raise BaseException from f # E: Exception must be derived from BaseException
-[builtins fixtures/exception.pyi]
-
-[case testTryFinallyStatement]
-import typing
-try:
-    b = object() # type: A # Fail
-finally:
-    c = object() # type: A # Fail
-class A: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-[case testSimpleTryExcept]
-
-try:
-  pass
-except BaseException as e:
-  a, o = None, None # type: (BaseException, object)
-  e = a
-  e = o # Fail
-class A: pass
-class B: pass
-[builtins fixtures/exception.pyi]
-[out]
-main:7: error: Incompatible types in assignment (expression has type "object", variable has type "BaseException")
-
-[case testTypeErrorInBlock]
-
-while object:
-  x = None # type: A
-  x = object()
-  x = B()
-class A: pass
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testTypeErrorInvolvingBaseException]
-
-x, a = None, None # type: (BaseException, A)
-a = BaseException()  # Fail
-a = object()         # Fail
-x = object()         # Fail
-x = A()              # Fail
-x = BaseException()
-class A: pass
-[builtins fixtures/exception.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "BaseException", variable has type "A")
-main:4: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "BaseException")
-main:6: error: Incompatible types in assignment (expression has type "A", variable has type "BaseException")
-
-[case testSimpleTryExcept2]
-import typing
-try:
-  pass
-except BaseException as e:
-  e = object() # Fail
-  e = BaseException()
-[builtins fixtures/exception.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "BaseException")
-
-[case testBaseClassAsExceptionTypeInExcept]
-import typing
-try:
-  pass
-except Err as e:
-  e = BaseException() # Fail
-  e = Err()
-class Err(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "BaseException", variable has type "Err")
-
-[case testMultipleExceptHandlers]
-import typing
-try:
-    pass
-except BaseException as e:
-    pass
-except Err as f:
-    f = BaseException() # Fail
-    f = Err()
-class Err(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-main:7: error: Incompatible types in assignment (expression has type "BaseException", variable has type "Err")
-
-[case testTryExceptStatement]
-import typing
-try:
-    a = B() # type: A       # Fail
-except BaseException as e:
-    e = A()             # Fail
-    e = Err()
-except Err as f:
-    f = BaseException() # Fail
-    f = Err()
-class A: pass
-class B: pass
-class Err(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "A", variable has type "BaseException")
-main:8: error: Incompatible types in assignment (expression has type "BaseException", variable has type "Err")
-
-[case testTryExceptWithinFunction]
-import typing
-def f() -> None:
-  try: pass
-  except BaseException as e:
-    e = object() # Fail
-    e = BaseException()
-  except Err as f:
-    f = BaseException() # Fail
-    f = Err()
-class Err(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "BaseException")
-main:8: error: Incompatible types in assignment (expression has type "BaseException", variable has type "Err")
-
-[case testTryExceptFlow]
-def f() -> None:
-  x = 1
-  try:
-    pass
-  except:
-    raise
-  x + 'a' # E: Unsupported left operand type for + ("int")
-[builtins fixtures/exception.pyi]
-[out]
-
-[case testTryWithElse]
-import typing
-try: pass
-except BaseException: pass
-else:
-  object(None) # E: Too many arguments for "object"
-[builtins fixtures/exception.pyi]
-
-[case testRedefinedFunctionInTryWithElse]
-def f() -> None: pass
-try:
-    pass
-except BaseException:
-    f2 = f
-else:
-    def f2() -> str: pass
-try:
-    pass
-except BaseException:
-    f3 = f
-else:
-    def f3() -> None: pass
-[builtins fixtures/exception.pyi]
-[out]
-main:7: error: Incompatible redefinition (redefinition with type Callable[[], str], original type Callable[[], None])
-
-[case testExceptWithoutType]
-import typing
-try:
-    -None # E: Unsupported operand type for unary - (None)
-except:
-    ~None # E: Unsupported operand type for ~ (None)
-[builtins fixtures/exception.pyi]
-
-[case testRaiseWithoutArgument]
-import typing
-try:
-    None
-except:
-    raise
-[builtins fixtures/exception.pyi]
-
-[case testExceptWithMultipleTypes]
-import typing
-class E1(BaseException): pass
-class E2(E1): pass
-try:
-    pass
-except (E1, E2): pass
-except (E1, object): pass # E: Exception type must be derived from BaseException
-except (object, E2): pass # E: Exception type must be derived from BaseException
-except (E1, (E2,)): pass  # E: Exception type must be derived from BaseException
-
-except (E1, E2): pass
-except ((E1, E2)): pass
-except (((E1, E2))): pass
-[builtins fixtures/exception.pyi]
-
-[case testExceptWithMultipleTypes2]
-import typing
-class E1(BaseException): pass
-class E2(E1): pass
-try:
-    pass
-except (E1, E2) as e1:
-    x = e1 # type: E1
-    y = e1 # type: E2 # E: Incompatible types in assignment (expression has type "E1", variable has type "E2")
-except (E2, E1) as e2:
-    a = e2 # type: E1
-    b = e2 # type: E2 # E: Incompatible types in assignment (expression has type "E1", variable has type "E2")
-except (E1, E2, int) as e3: # E: Exception type must be derived from BaseException
-    pass
-[builtins fixtures/exception.pyi]
-
-[case testExceptWithMultipleTypes3]
-import typing
-class E1(BaseException): pass
-class E1_1(E1): pass
-class E1_2(E1): pass
-try: pass
-except (E1, E1_1, E1_2) as e1:
-    x = e1 # type: E1
-    y = e1 # type: E1_1 # E: Incompatible types in assignment (expression has type "E1", variable has type "E1_1")
-    z = e1 # type: E1_2 # E: Incompatible types in assignment (expression has type "E1", variable has type "E1_2")
-except (E1_1, E1_2) as e2:
-    a = e2 # type: E1
-    b = e2 # type: E1_1 # E: Incompatible types in assignment (expression has type "Union[E1_1, E1_2]", variable has type "E1_1")
-    c = e2 # type: E1_2 # E: Incompatible types in assignment (expression has type "Union[E1_1, E1_2]", variable has type "E1_2")
-[builtins fixtures/exception.pyi]
-
-[case testExceptWithAnyTypes]
-from typing import Any
-
-E1 = None  # type: Any
-class E2(BaseException): pass
-class NotBaseDerived: pass
-
-try:
-    pass
-except BaseException as e1:
-    reveal_type(e1)  # E: Revealed type is 'builtins.BaseException'
-except (E1, BaseException) as e2:
-    reveal_type(e2)  # E: Revealed type is 'Any'
-except (E1, E2) as e3:
-    reveal_type(e3)  # E: Revealed type is 'Any'
-except (E1, E2, BaseException) as e4:
-    reveal_type(e4)  # E: Revealed type is 'Any'
-
-try: pass
-except E1 as e1:
-    reveal_type(e1)  # E: Revealed type is 'Any'
-except E2 as e2:
-    reveal_type(e2)  # E: Revealed type is '__main__.E2'
-except NotBaseDerived as e3:  # E: Exception type must be derived from BaseException
-    pass
-except (NotBaseDerived, E1) as e4:  # E: Exception type must be derived from BaseException
-    pass
-except (NotBaseDerived, E2) as e5:  # E: Exception type must be derived from BaseException
-    pass
-except (NotBaseDerived, E1, E2) as e6:  # E: Exception type must be derived from BaseException
-    pass
-except (E1, E2, NotBaseDerived) as e6:  # E: Exception type must be derived from BaseException
-    pass
-[builtins fixtures/exception.pyi]
-
-[case testReuseTryExceptionVariable]
-import typing
-class E1(BaseException): pass
-class E2(BaseException): pass
-try: pass
-except E1 as e: pass
-try: pass
-except E1 as e: pass
-try: pass
-except E2 as e: pass
-e + 1 # E: Trying to read deleted variable 'e'
-e = E1() # E: Assignment to variable 'e' outside except: block
-[builtins fixtures/exception.pyi]
-
-[case testReuseDefinedTryExceptionVariable]
-import typing
-class E1(BaseException): pass
-class E2(BaseException): pass
-e = 1
-e = 1
-try: pass
-except E1 as e: pass
-e = 1 # E: Assignment to variable 'e' outside except: block
-e = E1() # E: Assignment to variable 'e' outside except: block
-[builtins fixtures/exception.pyi]
-
-[case testExceptionVariableReuseInDeferredNode1]
-def f(*a: BaseException) -> int:
-    x
-    try: pass
-    except BaseException as err: pass
-    try: pass
-    except BaseException as err: f(err)
-x = f()
-[builtins fixtures/exception.pyi]
-
-[case testExceptionVariableReuseInDeferredNode2]
-def f(*a: BaseException) -> int:
-    try: pass
-    except BaseException as err: pass
-    x
-    try: pass
-    except BaseException as err: f(err)
-x = f()
-[builtins fixtures/exception.pyi]
-
-[case testExceptionVariableReuseInDeferredNode3]
-def f(*a: BaseException) -> int:
-    try: pass
-    except BaseException as err: pass
-    try: pass
-    except BaseException as err: f(err)
-    x
-x = f()
-[builtins fixtures/exception.pyi]
-
-[case testExceptionVariableReuseInDeferredNode4]
-class EA(BaseException):
-    a = None  # type: int
-class EB(BaseException):
-    b = None  # type: str
-def f(*arg: BaseException) -> int:
-    x
-    try: pass
-    except EA as err:
-        f(err)
-        a = err.a
-        reveal_type(a)
-    try: pass
-    except EB as err:
-        f(err)
-        b = err.b
-        reveal_type(b)
-x = f()
-[builtins fixtures/exception.pyi]
-[out]
-main:11: error: Revealed type is 'builtins.int'
-main:16: error: Revealed type is 'builtins.str'
-
-[case testExceptionVariableReuseInDeferredNode5]
-class EA(BaseException):
-    a = None  # type: int
-class EB(BaseException):
-    b = None  # type: str
-def f(*arg: BaseException) -> int:
-    try: pass
-    except EA as err:
-        f(err)
-        a = err.a
-        reveal_type(a)
-    x
-    try: pass
-    except EB as err:
-        f(err)
-        b = err.b
-        reveal_type(b)
-x = f()
-[builtins fixtures/exception.pyi]
-[out]
-main:10: error: Revealed type is 'builtins.int'
-main:16: error: Revealed type is 'builtins.str'
-
-[case testExceptionVariableReuseInDeferredNode6]
-class EA(BaseException):
-    a = None  # type: int
-class EB(BaseException):
-    b = None  # type: str
-def f(*arg: BaseException) -> int:
-    try: pass
-    except EA as err:
-        f(err)
-        a = err.a
-        reveal_type(a)
-    try: pass
-    except EB as err:
-        f(err)
-        b = err.b
-        reveal_type(b)
-    x
-x = f()
-[builtins fixtures/exception.pyi]
-[out]
-main:10: error: Revealed type is 'builtins.int'
-main:15: error: Revealed type is 'builtins.str'
-
-[case testArbitraryExpressionAsExceptionType]
-import typing
-a = BaseException
-try: pass
-except a as b:
-    b = BaseException()
-    b = object() # E: Incompatible types in assignment (expression has type "object", variable has type "BaseException")
-[builtins fixtures/exception.pyi]
-
-[case testInvalidExceptionCallable]
-import typing
-def exc() -> BaseException: pass
-try: pass
-except exc as e: pass             # E: Exception type must be derived from BaseException
-except BaseException() as b: pass # E: Exception type must be derived from BaseException
-[builtins fixtures/exception.pyi]
-
-[case testTupleValueAsExceptionType]
-import typing
-def exc() -> BaseException: pass
-class E1(BaseException): pass
-class E1_1(E1): pass
-class E1_2(E1): pass
-
-exs1 = (E1, E1_1, E1_2)
-try: pass
-except exs1 as e1:
-    x = e1 # type: E1
-    y = e1 # type: E1_1 # E: Incompatible types in assignment (expression has type "E1", variable has type "E1_1")
-    z = e1 # type: E1_2 # E: Incompatible types in assignment (expression has type "E1", variable has type "E1_2")
-
-exs2 = (E1_1, E1_2)
-try: pass
-except exs2 as e2:
-    a = e2 # type: E1
-    b = e2 # type: E1_1 # E: Incompatible types in assignment (expression has type "Union[E1_1, E1_2]", variable has type "E1_1")
-    c = e2 # type: E1_2 # E: Incompatible types in assignment (expression has type "Union[E1_1, E1_2]", variable has type "E1_2")
-
-exs3 = (E1, (E1_1, (E1_2,)))
-try: pass
-except exs3 as e3: pass  # E: Exception type must be derived from BaseException
-[builtins fixtures/exception.pyi]
-
-[case testInvalidTupleValueAsExceptionType]
-import typing
-def exc() -> BaseException: pass
-class E1(BaseException): pass
-class E2(E1): pass
-
-exs1 = (E1, E2, int)
-try: pass
-except exs1 as e: pass # E: Exception type must be derived from BaseException
-[builtins fixtures/exception.pyi]
-
-[case testOverloadedExceptionType]
-from typing import overload
-class E(BaseException):
-    @overload
-    def __init__(self) -> None: pass
-    @overload
-    def __init__(self, x) -> None: pass
-try:
-    pass
-except E as e:
-    e = E()
-    e = BaseException() # E: Incompatible types in assignment (expression has type "BaseException", variable has type "E")
-[builtins fixtures/exception.pyi]
-
-[case testExceptionWithAnyBaseClass]
-from typing import Any
-E = None  # type: Any
-class EE(E): pass
-raise EE()
-raise EE
-[builtins fixtures/exception.pyi]
-
-[case testExceptionIsType]
-from typing import Type
-class B(BaseException): pass
-def f(e: Type[B]):
-    try: pass
-    except e: pass
-def g(e: Type[BaseException]):
-    try: pass
-    except e as err:
-        reveal_type(err)
-def h(e: Type[int]):
-    try: pass
-    except e: pass
-[builtins fixtures/exception.pyi]
-[out]
-main:9: error: Revealed type is 'builtins.BaseException'
-main:12: error: Exception type must be derived from BaseException
-
-
--- Del statement
--- -------------
-
-
-[case testDelStmtWithIndex]
-a, b = None, None # type: (A, B)
-del b[a]
-del b[b] # E: Argument 1 to "__delitem__" of "B" has incompatible type "B"; expected "A"
-del a[a] # E: "A" has no attribute "__delitem__"
-del a[b] # E: "A" has no attribute "__delitem__"
-class B:
-  def __delitem__(self, index: 'A'): pass
-class A: pass
-
-[case testDelStmtWithAttribute]
-class A:
-    def f(self): pass
-    x = 0
-a = A()
-del a.f
-del a.x
-del a.z # E: "A" has no attribute "z"
-
-[case testDelStatementWithTuple]
-class A:
-    x = 0
-a = A()
-del a.x, a.y # E: "A" has no attribute "y"
-
-
-[case testDelStatementWithAssignmentSimple]
-a = 1
-a + 1
-del a
-a + 1 # E: Trying to read deleted variable 'a'
-[builtins fixtures/ops.pyi]
-
-[case testDelStatementWithAssignmentTuple]
-a = 1
-b = 1
-del (a, b)
-b + 1 # E: Trying to read deleted variable 'b'
-[builtins fixtures/ops.pyi]
-
-[case testDelStatementWithAssignmentClass]
-class C:
-    a = 1
-
-c = C()
-c.a = 1
-c.a + 1
-del c.a
-c.a + 1
-[builtins fixtures/ops.pyi]
-
--- Yield statement
--- ---------------
-
-
-[case testSimpleYield]
-from typing import Iterator
-def f() -> Iterator[int]:
-    yield 1
-    yield '' # E: Incompatible types in yield (actual type "str", expected type "int")
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldInFunctionReturningGenerator]
-from typing import Generator
-def f() -> Generator[int, None, None]:
-    yield 1
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldInFunctionReturningIterable]
-from typing import Iterable
-def f() -> Iterable[int]:
-    yield 1
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldInFunctionReturningObject]
-def f() -> object:
-    yield 1
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldInFunctionReturningAny]
-from typing import Any
-def f() -> Any:
-    yield object()
-[out]
-
-[case testYieldInFunctionReturningFunction]
-from typing import Callable
-def f() -> Callable[[], None]: # E: The return type of a generator function should be "Generator" or one of its supertypes
-    yield object()
-[out]
-
-[case testYieldInDynamicallyTypedFunction]
-import typing
-def f():
-    yield f
-
-[case testWithInvalidInstanceReturnType]
-import typing
-def f() -> int: # E: The return type of a generator function should be "Generator" or one of its supertypes
-    yield 1
-[builtins fixtures/for.pyi]
-[out]
-
-[case testTypeInferenceContextAndYield]
-from typing import List, Iterator
-def f() -> 'Iterator[List[int]]':
-    yield []
-    yield [object()] # E: List item 0 has incompatible type "object"
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldAndReturnWithoutValue]
-from typing import Iterator
-def f() -> Iterator[int]:
-    yield 1
-    return
-[builtins fixtures/for.pyi]
-
-[case testYieldWithNoValue]
-from typing import Iterator
-def f() -> Iterator[None]:
-    yield
-[builtins fixtures/for.pyi]
-
-[case testYieldWithNoValueWhenValueRequired]
-from typing import Iterator
-def f() -> Iterator[int]:
-    yield  # E: Yield value expected
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldWithExplicitNone]
-from typing import Iterator
-def f() -> Iterator[None]:
-    yield None  # E: Incompatible types in yield (actual type None, expected type None)
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Yield from statement
--- --------------------
-
--- Iterables
--- ----------
-
-[case testSimpleYieldFromWithIterator]
-from typing import Iterator
-def g() -> Iterator[str]:
-    yield '42'
-def h() -> Iterator[int]:
-    yield 42
-def f() -> Iterator[str]:
-    yield from g()
-    yield from h()  # E: Incompatible types in "yield from" (actual type "int", expected type "str")
-[out]
-
-[case testYieldFromAppliedToAny]
-from typing import Any
-def g() -> Any:
-    yield object()
-def f() -> Any:
-    yield from g()
-[out]
-
-[case testYieldFromInFunctionReturningFunction]
-from typing import Iterator, Callable
-def g() -> Iterator[int]:
-    yield 42
-def f() -> Callable[[], None]:  # E: The return type of a generator function should be "Generator" or one of its supertypes
-    yield from g()
-[out]
-
-[case testYieldFromNotIterableReturnType]
-from typing import Iterator
-def g() -> Iterator[int]:
-    yield 42
-def f() -> int:  # E: The return type of a generator function should be "Generator" or one of its supertypes
-    yield from g()
-[out]
-
-[case testYieldFromNotAppliedIterator]
-from typing import Iterator
-def g() -> int:
-    return 42
-def f() -> Iterator[int]:
-    yield from g()  # E: "yield from" can't be applied to "int"
-[out]
-
-[case testYieldFromCheckIncompatibleTypesTwoIterables]
-from typing import List, Iterator
-def g() -> Iterator[List[int]]:
-    yield [2, 3, 4]
-def f() -> Iterator[List[int]]:
-    yield from g()
-    yield from [1, 2, 3]  # E: Incompatible types in "yield from" (actual type "int", expected type List[int])
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldFromNotAppliedToNothing]
-def h():
-    yield from  # E: invalid syntax
-[out]
-
-[case testYieldFromAndYieldTogether]
-from typing import Iterator
-def f() -> Iterator[str]:
-    yield "g1 ham"
-    yield from g()
-    yield "g1 eggs"
-def g() -> Iterator[str]:
-    yield "g2 spam"
-    yield "g2 more spam"
-[out]
-
-[case testYieldFromAny]
-from typing import Iterator
-def f(a):
-    b = yield from a
-    return b
-[out]
-
--- With statement
--- --------------
-
-
-[case testSimpleWith]
-import typing
-class A:
-    def __enter__(self) -> None: pass
-    def __exit__(self, x, y, z) -> None: pass
-with A():
-    object(A) # E: Too many arguments for "object"
-
-[case testWithStmtAndInvalidExit]
-import typing
-class A:
-    def __enter__(self) -> None: pass
-    def __exit__(self, x, y) -> None: pass
-with A(): # E: Too many arguments for "__exit__" of "A"
-    pass
-
-[case testWithStmtAndMissingExit]
-import typing
-class A:
-    def __enter__(self) -> None: pass
-with A(): # E: "A" has no attribute "__exit__"
-    pass
-
-[case testWithStmtAndInvalidEnter]
-import typing
-class A:
-    def __enter__(self, x) -> None: pass
-    def __exit__(self, x, y, z) -> None: pass
-with A(): # E: Too few arguments for "__enter__" of "A"
-    pass
-
-[case testWithStmtAndMissingEnter]
-import typing
-class A:
-    def __exit__(self, x, y, z) -> None: pass
-with A(): # E: "A" has no attribute "__enter__"
-    pass
-
-[case testWithStmtAndMultipleExprs]
-import typing
-class A:
-    def __enter__(self) -> None: pass
-    def __exit__(self, x, y, z) -> None: pass
-class B:
-    def __enter__(self) -> None: pass
-with A(), B(): # E: "B" has no attribute "__exit__"
-    pass
-with B(), A(): # E: "B" has no attribute "__exit__"
-    pass
-
-[case testWithStmtAndResult]
-import typing
-class B: pass
-class A:
-    def __enter__(self) -> B: pass
-    def __exit__(self, x, y, z): pass
-with A() as b:
-    b = B()
-    b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testWithStmtAndMultipleResults]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class B: pass
-class C: pass
-class A(Generic[t]):
-    def __enter__(self) -> t: pass
-    def __exit__(self, x, y, z): pass
-a_b = A() # type: A[B]
-a_c = A() # type: A[C]
-with a_b as b, a_c as c:
-    b = B()
-    c = C()
-    b = c # E: Incompatible types in assignment (expression has type "C", variable has type "B")
-    c = b # E: Incompatible types in assignment (expression has type "B", variable has type "C")
-
-[case testWithStmtAndComplexTarget]
-from typing import Tuple
-class A:
-    def __enter__(self) -> Tuple[int, str]: pass
-    def __exit__(self, x, y, z): pass
-with A() as (a, b):
-    a = 1
-    b = ''
-    a = b # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/tuple.pyi]
-
-
--- Chained assignment
--- ------------------
-
-
-[case testChainedAssignment]
-import typing
-class A: pass
-class B: pass
-x = y = A()
-x = A()
-y = A()
-x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-y = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testChainedAssignment2]
-import typing
-def f() -> None:
-    x = 1
-    y = 'x'
-    x = y = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-    x = y = 1   # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[builtins fixtures/primitives.pyi]
-[out]
-
-[case testChainedAssignmentWithType]
-
-x = y = None # type: int
-x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-y = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-x = 1
-y = 1
-
-
--- Star assignment
--- ---------------
-
-
-[case testAssignListToStarExpr]
-from typing import List
-bs, cs = None, None # type: List[A], List[B]
-*bs, b = bs
-*bs, c = cs  # E: Incompatible types in assignment (expression has type List[B], variable has type List[A])
-*ns, c = cs
-nc = cs
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-
--- Type aliases
--- ------------
-
-
-[case testSimpleTypeAlias]
-import typing
-foo = int
-def f(x: foo) -> None: pass
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testTypeAliasDefinedInAModule]
-import typing
-import m
-def f(x: m.foo) -> None: pass
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[file m.py]
-import typing
-foo = int
-
-[case testTypeAliasDefinedInAModule2]
-import typing
-from m import foo
-def f(x: foo) -> None: pass
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[file m.py]
-import typing
-foo = int
-
-
--- nonlocal and global
--- -------------------
-
-
-[case testTypeOfGlobalUsed]
-import typing
-g = A()
-def f() -> None:
-    global g
-    g = B()
-
-class A(): pass
-class B(): pass
-[out]
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testTypeOfNonlocalUsed]
-import typing
-def f() -> None:
-    a = A()
-    def g() -> None:
-        nonlocal a
-        a = B()
-
-class A(): pass
-class B(): pass
-[out]
-main:6: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testTypeOfOuterMostNonlocalUsed]
-import typing
-def f() -> None:
-    a = A()
-    def g() -> None:
-        a = B()
-        def h() -> None:
-            nonlocal a
-            a = A()
-            a = B()
-
-class A(): pass
-class B(): pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "A", variable has type "B")
diff --git a/test-data/unit/check-super.test b/test-data/unit/check-super.test
deleted file mode 100644
index 2993113..0000000
--- a/test-data/unit/check-super.test
+++ /dev/null
@@ -1,109 +0,0 @@
--- Test cases for type checker related to super().
-
-
--- Supertype member reference
--- --------------------------
-
-
-[case testAccessingSupertypeMethod]
-
-class B:
-  def f(self) -> 'B': pass
-class A(B):
-  def f(self) -> 'A':
-    a, b = None, None # type: (A, B)
-    a = super().f() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-    a = super().g() # E: "g" undefined in superclass
-    b = super().f()
-[out]
-
-[case testAccessingSuperTypeMethodWithArgs]
-from typing import Any
-class B:
-  def f(self, y: 'A') -> None: pass
-class A(B):
-  def f(self, y: Any) -> None:
-    a, b = None, None # type: (A, B)
-    super().f(b) # E: Argument 1 to "f" of "B" has incompatible type "B"; expected "A"
-    super().f(a)
-    self.f(b)
-    self.f(a)
-[out]
-
-[case testAccessingSuperInit]
-import typing
-class B:
-    def __init__(self, x: A) -> None: pass
-class A(B):
-  def __init__(self) -> None:
-    super().__init__(B(None)) # E: Argument 1 to "__init__" of "B" has incompatible type "B"; expected "A"
-    super().__init__()       # E: Too few arguments for "__init__" of "B"
-    super().__init__(A())
-[out]
-
-[case testAccessingSuperMemberWithDeepHierarchy]
-import typing
-class C:
-  def f(self) -> None: pass
-class B(C): pass
-class A(B):
-  def f(self) -> None:
-    super().g() # E: "g" undefined in superclass
-    super().f()
-[out]
-
-[case testAssignToBaseClassMethod]
-import typing
-class A:
-    def f(self) -> None: pass
-class B(A):
-    def g(self) -> None:
-        super().f = None
-[out]
-main:6: error: Invalid assignment target
-
-[case testSuperWithMultipleInheritance]
-import typing
-class A:
-  def f(self) -> None: pass
-class B:
-  def g(self, x: int) -> None: pass
-class C(A, B):
-    def f(self) -> None:
-        super().f()
-        super().g(1)
-        super().f(1) # E: Too many arguments for "f" of "A"
-        super().g() # E: Too few arguments for "g" of "B"
-        super().not_there() # E: "not_there" undefined in superclass
-[out]
-
-[case testSuperWithNew]
-class A:
-    def __new__(cls, x: int) -> 'A':
-        return object.__new__(cls)
-
-class B(A):
-    def __new__(cls, x: int, y: str = '') -> 'A':
-        super().__new__(cls, 1)
-        super().__new__(cls, 1, '')  # E: Too many arguments for "__new__" of "A"
-B('')  # E: Argument 1 to "B" has incompatible type "str"; expected "int"
-B(1)
-B(1, 'x')
-[builtins fixtures/__new__.pyi]
-
-[case testSuperWithUnknownBase]
-from typing import Any
-B = None  # type: Any
-class C(B):
-    def __init__(self, arg=0):
-        super(C, self).__init__(arg, arg=arg)
-[out]
-
-[case testSuperSilentInDynamicFunction]
-class A:
-    pass
-
-class B(A):
-    def foo(self):
-        super(B, self).foo() # Not an error
-[out]
diff --git a/test-data/unit/check-tuples.test b/test-data/unit/check-tuples.test
deleted file mode 100644
index 50d6a2d..0000000
--- a/test-data/unit/check-tuples.test
+++ /dev/null
@@ -1,927 +0,0 @@
--- Normal assignment and subtyping
--- -------------------------------
-
-
-[case testTupleAssignmentWithTupleTypes]
-from typing import Tuple
-t1 = None # type: Tuple[A]
-t2 = None # type: Tuple[B]
-t3 = None # type: Tuple[A, A]
-t4 = None # type: Tuple[A, B]
-t5 = None # type: Tuple[B, A]
-
-t1 = t2 # E: Incompatible types in assignment (expression has type "Tuple[B]", variable has type "Tuple[A]")
-t1 = t3 # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[A]")
-t3 = t1 # E: Incompatible types in assignment (expression has type "Tuple[A]", variable has type "Tuple[A, A]")
-t3 = t4 # E: Incompatible types in assignment (expression has type "Tuple[A, B]", variable has type "Tuple[A, A]")
-t3 = t5 # E: Incompatible types in assignment (expression has type "Tuple[B, A]", variable has type "Tuple[A, A]")
-
-# Ok
-t1 = t1
-t2 = t2
-t3 = t3
-t4 = t4
-t5 = t5
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testTupleSubtyping]
-from typing import Tuple
-t1 = None # type: Tuple[A, A]
-t2 = None # type: Tuple[A, B]
-t3 = None # type: Tuple[B, A]
-
-t2 = t1  # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[A, B]")
-t2 = t3  # E: Incompatible types in assignment (expression has type "Tuple[B, A]", variable has type "Tuple[A, B]")
-t3 = t1  # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[B, A]")
-t3 = t2  # E: Incompatible types in assignment (expression has type "Tuple[A, B]", variable has type "Tuple[B, A]")
-
-t1 = t2
-t1 = t3
-
-class A: pass
-class B(A): pass
-[builtins fixtures/tuple.pyi]
-
-[case testTupleCompatibilityWithOtherTypes]
-from typing import Tuple
-a, o = None, None # type: (A, object)
-t = None # type: Tuple[A, A]
-
-a = t # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "A")
-t = o # E: Incompatible types in assignment (expression has type "object", variable has type "Tuple[A, A]")
-t = a # E: Incompatible types in assignment (expression has type "A", variable has type "Tuple[A, A]")
-# TODO: callable types + tuples
-
-# Ok
-o = t
-t = None
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-[case testNestedTupleTypes]
-from typing import Tuple
-t1 = None # type: Tuple[A, Tuple[A, A]]
-t2 = None # type: Tuple[B, Tuple[B, B]]
-
-t2 = t1 # E: Incompatible types in assignment (expression has type "Tuple[A, Tuple[A, A]]", variable has type "Tuple[B, Tuple[B, B]]")
-t1 = t2
-
-class A: pass
-class B(A): pass
-[builtins fixtures/tuple.pyi]
-
-[case testNestedTupleTypes2]
-from typing import Tuple
-t1 = None # type: Tuple[A, Tuple[A, A]]
-t2 = None # type: Tuple[B, Tuple[B, B]]
-
-t2 = t1 # E: Incompatible types in assignment (expression has type "Tuple[A, Tuple[A, A]]", variable has type "Tuple[B, Tuple[B, B]]")
-t1 = t2
-
-class A: pass
-class B(A): pass
-[builtins fixtures/tuple.pyi]
-
-[case testSubtypingWithNamedTupleType]
-from typing import Tuple
-t1 = None # type: Tuple[A, A]
-t2 = None # type: tuple
-
-t1 = t2 # E: Incompatible types in assignment (expression has type Tuple[Any, ...], variable has type "Tuple[A, A]")
-t2 = t1
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-[case testTupleInitializationWithNone]
-from typing import Tuple
-t = None # type: Tuple[A, A]
-t = None
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-
--- Tuple expressions
--- -----------------
-
-
-[case testTupleExpressions]
-from typing import Tuple
-t1 = None # type: tuple
-t2 = None # type: Tuple[A]
-t3 = None # type: Tuple[A, B]
-
-a, b, c = None, None, None # type: (A, B, C)
-
-t2 = ()        # E: Incompatible types in assignment (expression has type "Tuple[]", variable has type "Tuple[A]")
-t2 = (a, a)    # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[A]")
-t3 = (a, a)    # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[A, B]")
-t3 = (b, b)    # E: Incompatible types in assignment (expression has type "Tuple[B, B]", variable has type "Tuple[A, B]")
-t3 = (a, b, a) # E: Incompatible types in assignment (expression has type "Tuple[A, B, A]", variable has type "Tuple[A, B]")
-
-t1 = ()
-t1 = (a,)
-t2 = (a,)
-t3 = (a, b)
-t3 = (a, c)
-t3 = (None, None)
-
-class A: pass
-class B: pass
-class C(B): pass
-[builtins fixtures/tuple.pyi]
-
-[case testVoidValueInTuple]
-import typing
-(None, f()) # E: "f" does not return a value
-(f(), None) # E: "f" does not return a value
-
-def f() -> None: pass
-[builtins fixtures/tuple.pyi]
-
-
--- Indexing
--- --------
-
-
-[case testIndexingTuples]
-from typing import Tuple
-t1 = None # type: Tuple[A, B]
-t2 = None # type: Tuple[A]
-t3 = None # type: Tuple[A, B, C, D, E]
-a, b = None, None # type: (A, B)
-x = None # type: Tuple[A, B, C]
-y = None # type: Tuple[A, C, E]
-n = 0
-
-a = t1[1] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = t1[0] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-t1[2]     # E: Tuple index out of range
-t1[3]     # E: Tuple index out of range
-t2[1]     # E: Tuple index out of range
-t1[n]     # E: Tuple index must be an integer literal
-t3[n:]    # E: Tuple slice must be an integer literal
-b = t1[(0)] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a = t1[0]
-b = t1[1]
-b = t1[-1]
-a = t1[(0)]
-x = t3[0:3] # type (A, B, C)
-y = t3[0:5:2] # type (A, C, E)
-x = t3[:-2] # type (A, B, C)
-
-class A: pass
-class B: pass
-class C: pass
-class D: pass
-class E: pass
-[builtins fixtures/tuple.pyi]
-
-[case testIndexingTuplesWithNegativeIntegers]
-from typing import Tuple
-t1 = None  # type: Tuple[A, B]
-t2 = None  # type: Tuple[A]
-a, b = None, None  # type: A, B
-
-a = t1[-1] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = t1[-2] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-t1[-3]     # E: Tuple index out of range
-t1[-4]     # E: Tuple index out of range
-b = t2[(-1)] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a = t1[-2]
-b = t1[-1]
-a = t2[(-1)]
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testAssigningToTupleItems]
-from typing import Tuple
-t = None # type: Tuple[A, B]
-n = 0
-
-t[0] = A() # E: Unsupported target for indexed assignment
-t[2] = A() # E: Unsupported target for indexed assignment
-t[n] = A() # E: Unsupported target for indexed assignment
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-
--- Multiple assignment
--- -------------------
-
-
-[case testMultipleAssignmentWithTuples]
-from typing import Tuple
-t1 = None # type: Tuple[A, B]
-t2 = None # type: Tuple[A, B, A]
-a, b = None, None # type: (A, B)
-
-a, a = t1 # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b, b = t1 # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a, b, b = t2 # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a, b = t1
-a, b, a = t2
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleAssignmentWithInvalidNumberOfValues]
-from typing import Tuple
-t1 = None # type: Tuple[A, A, A]
-a = None # type: A
-
-a, a = t1       # E: Too many values to unpack (2 expected, 3 provided)
-a, a, a, a = t1 # E: Need more than 3 values to unpack (4 expected)
-
-a, a, a = t1
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleAssignmentWithTupleExpressionRvalue]
-
-a, b = None, None # type: (A, B)
-
-a, b = a, a # Fail
-a, b = b, a # Fail
-
-a, b = a, b
-a, a = a, a
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-[out]
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testSubtypingInMultipleAssignment]
-
-a, b = None, None # type: (A, B)
-
-b, b = a, b # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b, b = b, a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a, b = b, b
-b, a = b, b
-
-class A: pass
-class B(A): pass
-[builtins fixtures/tuple.pyi]
-
-[case testInitializationWithMultipleValues]
-
-a, b = None, None # type: (A, B)
-
-a1, b1 = a, a # type: (A, B)  # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a2, b2 = b, b # type: (A, B)  # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a3, b3 = a # type: (A, B)     # E: '__main__.A' object is not iterable
-a4, b4 = None # type: (A, B)  # E: 'builtins.None' object is not iterable
-a5, b5 = a, b, a # type: (A, B)  # E: Too many values to unpack (2 expected, 3 provided)
-
-ax, bx = a, b # type: (A, B)
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleAssignmentWithNonTupleRvalue]
-
-a, b = None, None # type: (A, B)
-def f(): pass
-
-a, b = None # E: 'builtins.None' object is not iterable
-a, b = a   # E: '__main__.A' object is not iterable
-a, b = f   # E: 'def () -> Any' object is not iterable
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleAssignmentWithIndexedLvalues]
-
-a, b = None, None # type: (A, B)
-aa, bb = None, None # type: (AA, BB)
-
-a[a], b[b] = a, bb   # E: Incompatible types in assignment (expression has type "A", target has type "AA")
-a[a], b[b] = aa, b   # E: Incompatible types in assignment (expression has type "B", target has type "BB")
-a[aa], b[b] = aa, bb # E: Invalid index type "AA" for "A"; expected type "A"
-a[a], b[bb] = aa, bb # E: Invalid index type "BB" for "B"; expected type "B"
-a[a], b[b] = aa, bb
-
-class A:
-    def __setitem__(self, x: 'A', y: 'AA') -> None: pass
-class B:
-    def __setitem__(self, x: 'B', y: 'BB') -> None: pass
-
-class AA: pass
-class BB: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleDeclarationWithParentheses]
-
-(a, b) = (None, None) # type: int, str
-a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-b = 1  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-a = 1
-b = ''
-
-[case testMultipleAssignmentWithExtraParentheses]
-
-a, b = None, None # type: (A, B)
-
-(a, b) = (a, a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-(a, b) = (b, b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-((a), (b)) = ((a), (a))  # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-((a), (b)) = ((b), (b))  # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[a, b] = a, a  # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-[a, b] = b, b  # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-(a, b) = (a, b)
-((a), (b)) = ((a), (b))
-[a, b] = a, b
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleAssignmentUsingSingleTupleType]
-from typing import Tuple
-a, b = None, None  # type: Tuple[int, str]
-a = 1
-b = ''
-a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-b = 1  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testMultipleAssignmentWithMixedVariables]
-a = b, c = 1, 1
-x, y = p, q = 1, 1
-u, v, w = r, s = 1, 1 # E: Need more than 2 values to unpack (3 expected)
-d, e = f, g, h = 1, 1 # E: Need more than 2 values to unpack (3 expected)
-
-
--- Assignment to starred expressions
--- ---------------------------------
-
-
-[case testAssignmentToStarMissingAnnotation]
-from typing import List
-t = 1, 2
-a, b, *c = 1, 2  # E: Need type annotation for variable
-aa, bb, *cc = t  # E: Need type annotation for variable
-[builtins fixtures/list.pyi]
-
-[case testAssignmentToStarAnnotation]
-from typing import List
-li, lo = None, None # type: List[int], List[object]
-a, b, *c = 1, 2  # type: int, int, *List[int]
-c = lo  # E: Incompatible types in assignment (expression has type List[object], variable has type List[int])
-c = li
-[builtins fixtures/list.pyi]
-
-[case testAssignmentToStarCount1]
-from typing import List
-ca = None # type: List[int]
-c = [1]
-a, b, *c = 1,  # E: Need more than 1 value to unpack (2 expected)
-a, b, *c = 1, 2
-a, b, *c = 1, 2, 3
-a, b, *c = 1, 2, 3, 4
-[builtins fixtures/list.pyi]
-
-[case testAssignmentToStarCount2]
-from typing import List
-ca = None # type: List[int]
-t1 = 1,
-t2 = 1, 2
-t3 = 1, 2, 3
-t4 = 1, 2, 3, 4
-c = [1]
-a, b, *c = t1  # E: Need more than 1 value to unpack (2 expected)
-a, b, *c = t2
-a, b, *c = t3
-a, b, *c = t4
-[builtins fixtures/list.pyi]
-
-[case testAssignmentToStarFromAny]
-from typing import Any
-a, c = Any(1), C()
-p, *q = a
-c = a
-c = q
-
-class C: pass
-
-[case testAssignmentToComplexStar]
-from typing import List
-li = None # type: List[int]
-a, *(li) = 1,
-a, *(b, c) = 1, 2  # E: Need more than 1 value to unpack (2 expected)
-a, *(b, c) = 1, 2, 3
-a, *(b, c) = 1, 2, 3, 4  # E: Too many values to unpack (2 expected, 3 provided)
-[builtins fixtures/list.pyi]
-
-[case testAssignmentToStarFromTupleType]
-from typing import List, Tuple
-li = None # type: List[int]
-la = None # type: List[A]
-ta = None # type: Tuple[A, A, A]
-a, *la = ta
-a, *li = ta  # E
-a, *na = ta
-na = la
-na = a  # E
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-main:6: error: List item 0 has incompatible type "A"
-main:6: error: List item 1 has incompatible type "A"
-main:9: error: Incompatible types in assignment (expression has type "A", variable has type List[A])
-
-[case testAssignmentToStarFromTupleInference]
-from typing import List
-li = None # type: List[int]
-la = None # type: List[A]
-a, *l = A(), A()
-l = li  # E: Incompatible types in assignment (expression has type List[int], variable has type List[A])
-l = la
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testAssignmentToStarFromListInference]
-from typing import List
-li = None # type: List[int]
-la = None # type: List[A]
-a, *l = [A(), A()]
-l = li  # E: Incompatible types in assignment (expression has type List[int], variable has type List[A])
-l = la
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testAssignmentToStarFromTupleTypeInference]
-from typing import List, Tuple
-li = None # type: List[int]
-la = None # type: List[A]
-ta = None # type: Tuple[A, A, A]
-a, *l = ta
-l = li  # E: Incompatible types in assignment (expression has type List[int], variable has type List[A])
-l = la
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testAssignmentToStarFromListTypeInference]
-from typing import List
-li = None # type: List[int]
-la = None # type: List[A]
-a, *l = la
-l = li  # E: Incompatible types in assignment (expression has type List[int], variable has type List[A])
-l = la
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-
-
--- Nested tuple assignment
--- ----------------------------
-
-
-[case testNestedTupleAssignment1]
-
-a1, b1, c1 = None, None, None # type: (A, B, C)
-a2, b2, c2 = None, None, None # type: (A, B, C)
-
-a1, (b1, c1) = a2, (b2, c2)
-a1, (a1, (b1, c1)) = a2, (a2, (b2, c2))
-a1, (a1, (a1, b1)) = a1, (a1, (a1, c1))  # Fail
-
-class A: pass
-class B: pass
-class C: pass
-[out]
-main:7: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-[case testNestedTupleAssignment2]
-
-a1, b1, c1 = None, None, None # type: (A, B, C)
-a2, b2, c2 = None, None, None # type: (A, B, C)
-t = a1, b1
-
-a2, b2 = t
-(a2, b2), c2 = t, c1
-(a2, c2), c2 = t, c1  # Fail
-t, c2 = (a2, b2), c2
-t, c2 = (a2, a2), c2  # Fail
-t = a1, a1, a1  # Fail
-t = a1  # Fail
-a2, a2, a2 = t  # Fail
-a2, = t  # Fail
-a2 = t  # Fail
-
-class A: pass
-class B: pass
-class C: pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "B", variable has type "C")
-main:10: error: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[A, B]")
-main:11: error: Incompatible types in assignment (expression has type "Tuple[A, A, A]", variable has type "Tuple[A, B]")
-main:12: error: Incompatible types in assignment (expression has type "A", variable has type "Tuple[A, B]")
-main:13: error: Need more than 2 values to unpack (3 expected)
-main:14: error: Too many values to unpack (1 expected, 2 provided)
-main:15: error: Incompatible types in assignment (expression has type "Tuple[A, B]", variable has type "A")
-
-
--- Error messages
--- --------------
-
-
-[case testTupleErrorMessages]
-
-a = None # type: A
-
-(a, a) + a  # E: Unsupported left operand type for + ("Tuple[A, A]")
-a + (a, a)  # E: Unsupported operand types for + ("A" and "Tuple[A, A]")
-f((a, a))   # E: Argument 1 to "f" has incompatible type "Tuple[A, A]"; expected "A"
-(a, a).foo  # E: "Tuple[A, A]" has no attribute "foo"
-
-def f(x: 'A') -> None: pass
-
-class A:
-    def __add__(self, x: 'A') -> 'A': pass
-[builtins fixtures/tuple.pyi]
-
-[case testLargeTuplesInErrorMessages]
-
-a = None # type: LongTypeName
-a + (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a) # Fail
-
-class LongTypeName:
-    def __add__(self, x: 'LongTypeName') -> 'LongTypeName': pass
-[builtins fixtures/tuple.pyi]
-[out]
-main:3: error: Unsupported operand types for + ("LongTypeName" and tuple(length 50))
-
-
--- Tuple methods
--- -------------
-
-
-[case testTupleMethods]
-from typing import Tuple
-t = None # type: Tuple[int, str]
-i = 0
-s = ''
-b = bool()
-
-s = t.__len__()  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-i = t.__str__()  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-i = s in t       # E: Incompatible types in assignment (expression has type "bool", variable has type "int")
-t.foo            # E: "Tuple[int, str]" has no attribute "foo"
-
-i = t.__len__()
-s = t.__str__()
-b = s in t
-
-[file builtins.py]
-from typing import TypeVar, Generic
-_T = TypeVar('_T')
-class object:
-    def __init__(self) -> None: pass
-class tuple(Generic[_T]):
-    def __len__(self) -> int: pass
-    def __str__(self) -> str: pass
-    def __contains__(self, o: object) -> bool: pass
-class int: pass
-class str: pass
-class bool: pass
-class type: pass
-class function: pass
-
-
--- For loop over tuple
--- -------------------
-
-
-[case testForLoopOverTuple]
-import typing
-t = 1, 2
-for x in t:
-    x = 1
-    x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/for.pyi]
-
-[case testForLoopOverEmptyTuple]
-import typing
-t = ()
-for x in t: pass # E: Need type annotation for variable
-[builtins fixtures/for.pyi]
-
-[case testForLoopOverNoneValuedTuple]
-import typing
-t = ()
-for x in None, None: pass # E: Need type annotation for variable
-[builtins fixtures/for.pyi]
-
-[case testForLoopOverTupleAndSubtyping]
-import typing
-class A: pass
-class B(A): pass
-for x in B(), A():
-    x = A()
-    x = B()
-    x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-[builtins fixtures/for.pyi]
-
-[case testTupleIterable]
-y = 'a'
-x = sum((1,2))
-y = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[builtins fixtures/tuple.pyi]
-
-
--- Tuple as a base type
--- --------------------
-
-
-[case testTupleBaseClass]
-import m
-[file m.pyi]
-from typing import Tuple
-class A(Tuple[int, str]):
-    def f(self, x: int) -> None:
-        a, b = 1, ''
-        a, b = self
-        b, a = self  # Error
-        self.f('')   # Error
-[builtins fixtures/tuple.pyi]
-[out]
-tmp/m.pyi:6: error: Incompatible types in assignment (expression has type "int", variable has type "str")
-tmp/m.pyi:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/m.pyi:7: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testValidTupleBaseClass2]
-from typing import Tuple
-class A(Tuple[int, str]): pass
-
-x, y = A()
-reveal_type(x) # E: Revealed type is 'builtins.int'
-reveal_type(y) # E: Revealed type is 'builtins.str'
-
-x1 = A()[0] # type: int
-x2 = A()[1] # type: int # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-A()[2] # E: Tuple index out of range
-
-class B(Tuple[int, ...]): pass
-
-z1 = B()[0] # type: int
-z2 = B()[1] # type: str # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-B()[100]
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testValidTupleBaseClass]
-from typing import Tuple
-class A(tuple): pass
-[out]
-
-[case testTupleBaseClass2-skip]
-import m
-[file m.pyi]
-# This doesn't work correctly -- no errors are reported (#867)
-from typing import Tuple
-a = None # type: A
-class A(Tuple[int, str]): pass
-x, y = a
-x() # Expected: "int" not callable
-y() # Expected: "str" not callable
-[out]
-(should fail)
-
-[case testGenericClassWithTupleBaseClass]
-from typing import TypeVar, Generic, Tuple
-T = TypeVar('T')
-class Test(Generic[T], Tuple[T]): pass
-x = Test() # type: Test[int]
-[builtins fixtures/tuple.pyi]
-[out]
-main:4: error: Generic tuple types not supported
-
-
--- Variable-length tuples (Tuple[t, ...] with literal '...')
--- ---------------------------------------------------------
-
-
-[case testIndexingVariableLengthTuple]
-from typing import Tuple
-x = () # type: Tuple[str, ...]
-n = 5
-x[n]() # E: "str" not callable
-x[3]() # E: "str" not callable
-[builtins fixtures/tuple.pyi]
-
-[case testSubtypingVariableLengthTuple]
-from typing import Tuple
-class A: pass
-class B(A): pass
-def fa(t: Tuple[A, ...]) -> None: pass
-def fb(t: Tuple[B, ...]) -> None: pass
-ta = () # type: Tuple[A, ...]
-tb = () # type: Tuple[B, ...]
-fa(ta)
-fa(tb)
-fb(tb)
-fb(ta) # E: Argument 1 to "fb" has incompatible type Tuple[A, ...]; expected Tuple[B, ...]
-[builtins fixtures/tuple.pyi]
-
-[case testSubtypingFixedAndVariableLengthTuples]
-from typing import Tuple
-class A: pass
-class B(A): pass
-def fa(t: Tuple[A, ...]) -> None: pass
-def fb(t: Tuple[B, ...]) -> None: pass
-aa = (A(), A())
-ab = (A(), B())
-bb = (B(), B())
-fa(aa)
-fa(ab)
-fa(bb)
-fb(bb)
-fb(ab) # E: Argument 1 to "fb" has incompatible type "Tuple[A, B]"; expected Tuple[B, ...]
-fb(aa) # E: Argument 1 to "fb" has incompatible type "Tuple[A, A]"; expected Tuple[B, ...]
-[builtins fixtures/tuple.pyi]
-
-[case testSubtypingTupleIsContainer]
-from typing import Container
-a = None  # type: Container[str]
-a = ()
-
-[case testSubtypingTupleIsSized]
-from typing import Sized
-a = None  # type: Sized
-a = ()
-
-[case testTupleWithStarExpr1]
-# flags: --fast-parser
-a = (1, 2)
-b = (*a, '')
-reveal_type(b)  # E: Revealed type is 'Tuple[builtins.int, builtins.int, builtins.str]'
-
-[case testTupleWithStarExpr2]
-a = [1]
-b = (0, *a)
-reveal_type(b)  # E: Revealed type is 'builtins.tuple[builtins.int*]'
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithStarExpr3]
-a = ['']
-b = (0, *a)
-reveal_type(b)  # E: Revealed type is 'builtins.tuple[builtins.object*]'
-c = (*a, '')
-reveal_type(c)  # E: Revealed type is 'builtins.tuple[builtins.str*]'
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithStarExpr4]
-a = (1, 1, 'x', 'x')
-b = (1, 'x')
-a = (0, *b, '')
-[builtins fixtures/tuple.pyi]
-
-[case testTupleMeetTupleAny]
-from typing import Union, Tuple
-class A: pass
-class B: pass
-
-def f(x: Union[B, Tuple[A, A]]) -> None:
-    if isinstance(x, tuple):
-        reveal_type(x) # E: Revealed type is 'Tuple[__main__.A, __main__.A]'
-    else:
-        reveal_type(x) # E: Revealed type is '__main__.B'
-
-def g(x: Union[str, Tuple[str, str]]) -> None:
-    if isinstance(x, tuple):
-        reveal_type(x) # E: Revealed type is 'Tuple[builtins.str, builtins.str]'
-    else:
-        reveal_type(x) # E: Revealed type is 'builtins.str'
-
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTupleMeetTUpleAnyComplex]
-from typing import Tuple, Union
-
-Pair = Tuple[int, int]
-Variant = Union[int, Pair]
-def tuplify(v: Variant) -> None:
-    reveal_type(v) # E: Revealed type is 'Union[builtins.int, Tuple[builtins.int, builtins.int]]'
-    if not isinstance(v, tuple):
-        reveal_type(v) # E: Revealed type is 'builtins.int'
-        v = (v, v)
-        reveal_type(v) # E: Revealed type is 'Tuple[builtins.int, builtins.int]'
-    reveal_type(v) # E: Revealed type is 'Tuple[builtins.int, builtins.int]'
-    reveal_type(v[0]) # E: Revealed type is 'builtins.int'
-
-Pair2 = Tuple[int, str]
-Variant2 = Union[int, Pair2]
-def tuplify2(v: Variant2) -> None:
-    if isinstance(v, tuple):
-        reveal_type(v) # E: Revealed type is 'Tuple[builtins.int, builtins.str]'
-    else:
-        reveal_type(v) # E: Revealed type is 'builtins.int'
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTupleMeetTupleAnyAfter]
-from typing import Tuple, Union
-
-def good(blah: Union[Tuple[int, int], int]) -> None:
-    reveal_type(blah) # E: Revealed type is 'Union[Tuple[builtins.int, builtins.int], builtins.int]'
-    if isinstance(blah, tuple):
-        reveal_type(blah) # E: Revealed type is 'Tuple[builtins.int, builtins.int]'
-    reveal_type(blah) # E: Revealed type is 'Union[Tuple[builtins.int, builtins.int], builtins.int]'
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTupleMeetTupleVariable]
-from typing import Tuple, TypeVar, Generic, Union
-T = TypeVar('T')
-
-class A: pass
-class B1(A): pass
-class B2(A): pass
-class C: pass
-
-x = None # type: Tuple[A, ...]
-y = None # type: Tuple[Union[B1, C], Union[B2, C]]
-
-def g(x: T) -> Tuple[T, T]:
-    return (x, x)
-
-z = 1
-x, y = g(z) # E: Argument 1 to "g" has incompatible type "int"; expected "Tuple[B1, B2]"
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTupleWithUndersizedContext]
-a = ([1], 'x')
-a = ([], 'x', 1)  # E: Incompatible types in assignment (expression has type "Tuple[List[int], str, int]", variable has type "Tuple[List[int], str]")
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithOversizedContext]
-a = (1, [1], 'x')
-a = (1, [])  # E: Incompatible types in assignment (expression has type "Tuple[int, List[int]]", variable has type "Tuple[int, List[int], str]")
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithoutContext]
-a = (1, [])  # E: Need type annotation for variable
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithUnionContext]
-from typing import List, Union, Tuple
-def f() -> Union[int, Tuple[List[str]]]:
-    return ([],)
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithVariableSizedTupleContext]
-from typing import List, Tuple
-def f() -> Tuple[List[str], ...]:
-    return ([],)
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithoutArgs]
-from typing import Tuple
-def f(a: Tuple) -> None: pass
-f(())
-f((1,))
-f(('', ''))
-f(0)  # E: Argument 1 to "f" has incompatible type "int"; expected Tuple[Any, ...]
-[builtins fixtures/tuple.pyi]
-
-[case testTupleSingleton]
-# flags: --fast-parser
-from typing import Tuple
-def f(a: Tuple[()]) -> None: pass
-f(())
-f((1,))  # E: Argument 1 to "f" has incompatible type "Tuple[int]"; expected "Tuple[]"
-f(('', ''))  # E: Argument 1 to "f" has incompatible type "Tuple[str, str]"; expected "Tuple[]"
-f(0)  # E: Argument 1 to "f" has incompatible type "int"; expected "Tuple[]"
-[builtins fixtures/tuple.pyi]
diff --git a/test-data/unit/check-type-aliases.test b/test-data/unit/check-type-aliases.test
deleted file mode 100644
index 20022cc..0000000
--- a/test-data/unit/check-type-aliases.test
+++ /dev/null
@@ -1,74 +0,0 @@
-[case testSimpleTypeAlias]
-import typing
-i = int
-def f(x: i) -> None: pass
-f(1)
-f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testUnionTypeAlias]
-from typing import Union
-U = Union[int, str]
-def f(x: U) -> None: pass
-f(1)
-f('')
-f(()) # E: Argument 1 to "f" has incompatible type "Tuple[]"; expected "Union[int, str]"
-
-[case testTupleTypeAlias]
-from typing import Tuple
-T = Tuple[int, str]
-def f(x: T) -> None: pass
-f((1, 'x'))
-f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "Tuple[int, str]"
-
-[case testCallableTypeAlias]
-from typing import Callable
-A = Callable[[int], None]
-f = None  # type: A
-f(1)
-f('') # E: Argument 1 has incompatible type "str"; expected "int"
-
-[case testListTypeAlias]
-from typing import List
-A = List[int]
-def f(x: A) -> None: pass
-f([1])
-f(['x']) # E: List item 0 has incompatible type "str"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testAnyTypeAlias]
-from typing import Any
-A = Any
-def f(x: A) -> None:
-    x.foo()
-f(1)
-f('x')
-
-[case testImportUnionAlias]
-import typing
-from _m import U
-def f(x: U) -> None: pass
-f(1)
-f('x')
-f(()) # E: Argument 1 to "f" has incompatible type "Tuple[]"; expected "Union[int, str]"
-[file _m.py]
-from typing import Union
-U = Union[int, str]
-[builtins fixtures/tuple.pyi]
-
-[case testTypeAliasInBuiltins]
-def f(x: bytes): pass
-bytes
-f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "str"
-[builtins fixtures/alias.pyi]
-
-[case testEmptyTupleTypeAlias]
-from typing import Tuple, Callable
-EmptyTuple = Tuple[()]
-x = None # type: EmptyTuple
-reveal_type(x)  # E: Revealed type is 'Tuple[]'
-
-EmptyTupleCallable = Callable[[Tuple[()]], None]
-f = None # type: EmptyTupleCallable
-reveal_type(f)  # E: Revealed type is 'def (Tuple[])'
-[builtins fixtures/list.pyi]
diff --git a/test-data/unit/check-type-checks.test b/test-data/unit/check-type-checks.test
deleted file mode 100644
index c4905a7..0000000
--- a/test-data/unit/check-type-checks.test
+++ /dev/null
@@ -1,113 +0,0 @@
--- Conditional type checks.
-
-
-[case testSimpleIsinstance]
-
-x = None  # type: object
-n = None  # type: int
-s = None  # type: str
-n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-if isinstance(x, int):
-    n = x
-    s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-
-[case testSimpleIsinstance2]
-import typing
-def f(x: object, n: int, s: str) -> None:
-    n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-    if isinstance(x, int):
-        n = x
-        s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-    n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testSimpleIsinstance3]
-
-class A:
-    x = None  # type: object
-    n = None  # type: int
-    s = None  # type: str
-    n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-    if isinstance(x, int):
-        n = x
-        s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-    else:
-        n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testMultipleIsinstanceTests]
-import typing
-class A: pass
-class B(A): pass
-def f(x: object, a: A, b: B, c: int) -> None:
-    if isinstance(x, A):
-        if isinstance(x, B):
-            b = x
-            x = a
-        a = x
-        c = x # E: Incompatible types in assignment (expression has type "A", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testMultipleIsinstanceTests2]
-import typing
-class A: pass
-class B(A): pass
-def f(x: object, y: object, n: int, s: str) -> None:
-    if isinstance(x, int):
-        if isinstance(y, str):
-            n = x
-            s = y
-            s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-            n = y # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-        s = y # E: Incompatible types in assignment (expression has type "object", variable has type "str")
-        n = y # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-        n = x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndElif]
-import typing
-def f(x: object, n: int, s: str) -> None:
-    n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-    if isinstance(x, int):
-        n = x
-        s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-    elif isinstance(x, str):
-        s = x
-        n = x # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-    else:
-        n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-        s = x # E: Incompatible types in assignment (expression has type "object", variable has type "str")
-    n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndAnyType]
-from typing import Any
-def f(x: Any, n: int, s: str) -> None:
-    s = x
-    if isinstance(x, int):
-        n = x
-        s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-    s = x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class C(Generic[T]):
-    def f(self, x: T) -> None: pass
-def f(x: object) -> None:
-    if isinstance(x, C):
-        x.f(1)
-        x.f('')
-        x.g() # E: C[Any] has no attribute "g"
-    x.g() # E: "object" has no attribute "g"
-[builtins fixtures/isinstance.pyi]
-[out]
diff --git a/test-data/unit/check-type-promotion.test b/test-data/unit/check-type-promotion.test
deleted file mode 100644
index 0a39996..0000000
--- a/test-data/unit/check-type-promotion.test
+++ /dev/null
@@ -1,39 +0,0 @@
--- Test cases for type promotion (e.g. int -> float).
-
-
-[case testPromoteIntToFloat]
-def f(x: float) -> None: pass
-f(1)
-[builtins fixtures/primitives.pyi]
-
-[case testCantPromoteFloatToInt]
-def f(x: int) -> None: pass
-f(1.1) # E: Argument 1 to "f" has incompatible type "float"; expected "int"
-[builtins fixtures/primitives.pyi]
-
-[case testPromoteFloatToComplex]
-def f(x: complex) -> None: pass
-f(1)
-[builtins fixtures/primitives.pyi]
-
-[case testPromoteIntToComplex]
-def f(x: complex) -> None: pass
-f(1)
-[builtins fixtures/primitives.pyi]
-
-[case testPromoteBytearrayToByte]
-def f(x: bytes) -> None: pass
-f(bytearray())
-[builtins fixtures/primitives.pyi]
-
-[case testNarrowingDownFromPromoteTargetType]
-y = 0.0
-y = 1
-y() # E: "int" not callable
-[builtins fixtures/primitives.pyi]
-
-[case testNarrowingDownFromPromoteTargetType2]
-y = 0.0
-y = 1
-y.x # E: "int" has no attribute "x"
-[builtins fixtures/primitives.pyi]
diff --git a/test-data/unit/check-typeddict.test b/test-data/unit/check-typeddict.test
deleted file mode 100644
index 424c8b2..0000000
--- a/test-data/unit/check-typeddict.test
+++ /dev/null
@@ -1,462 +0,0 @@
--- Create Instance
-
-[case testCanCreateTypedDictInstanceWithKeywordArguments]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(x=42, y=1337)
-reveal_type(p)  # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-[builtins fixtures/dict.pyi]
-
-[case testCanCreateTypedDictInstanceWithDictCall]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(dict(x=42, y=1337))
-reveal_type(p)  # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-[builtins fixtures/dict.pyi]
-
-[case testCanCreateTypedDictInstanceWithDictLiteral]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point({'x': 42, 'y': 1337})
-reveal_type(p)  # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-[builtins fixtures/dict.pyi]
-
-[case testCanCreateTypedDictInstanceWithNoArguments]
-from mypy_extensions import TypedDict
-EmptyDict = TypedDict('EmptyDict', {})
-p = EmptyDict()
-reveal_type(p)  # E: Revealed type is 'TypedDict(_fallback=typing.Mapping[builtins.str, builtins.None])'
-[builtins fixtures/dict.pyi]
-
-
--- Create Instance (Errors)
-
-[case testCannotCreateTypedDictInstanceWithUnknownArgumentPattern]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(42, 1337)  # E: Expected keyword arguments, {...}, or dict(...) in TypedDict constructor
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictInstanceNonLiteralItemName]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-x = 'x'
-p = Point({x: 42, 'y': 1337})  # E: Expected TypedDict item name to be string literal
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictInstanceWithExtraItems]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(x=42, y=1337, z=666)  # E: Expected items ['x', 'y'] but found ['x', 'y', 'z'].
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictInstanceWithMissingItems]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(x=42)  # E: Expected items ['x', 'y'] but found ['x'].
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictInstanceWithIncompatibleItemType]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(x='meaning_of_life', y=1337)  # E: Incompatible types (expression has type "str", TypedDict item "x" has type "int")
-[builtins fixtures/dict.pyi]
-
-
--- Subtyping
-
-[case testCanConvertTypedDictToItself]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-def identity(p: Point) -> Point:
-    return p
-[builtins fixtures/dict.pyi]
-
-[case testCanConvertTypedDictToEquivalentTypedDict]
-from mypy_extensions import TypedDict
-PointA = TypedDict('PointA', {'x': int, 'y': int})
-PointB = TypedDict('PointB', {'x': int, 'y': int})
-def identity(p: PointA) -> PointB:
-    return p
-[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToSimilarTypedDictWithNarrowerItemTypes]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-ObjectPoint = TypedDict('ObjectPoint', {'x': object, 'y': object})
-def convert(op: ObjectPoint) -> Point:
-    return op  # E: Incompatible return value type (got "ObjectPoint", expected "Point")
-[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToSimilarTypedDictWithWiderItemTypes]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-ObjectPoint = TypedDict('ObjectPoint', {'x': object, 'y': object})
-def convert(p: Point) -> ObjectPoint:
-    return p  # E: Incompatible return value type (got "Point", expected "ObjectPoint")
-[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToSimilarTypedDictWithIncompatibleItemTypes]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-Chameleon = TypedDict('Chameleon', {'x': str, 'y': str})
-def convert(p: Point) -> Chameleon:
-    return p  # E: Incompatible return value type (got "Point", expected "Chameleon")
-[builtins fixtures/dict.pyi]
-
-[case testCanConvertTypedDictToNarrowerTypedDict]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-Point1D = TypedDict('Point1D', {'x': int})
-def narrow(p: Point) -> Point1D:
-    return p
-[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToWiderTypedDict]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-Point3D = TypedDict('Point3D', {'x': int, 'y': int, 'z': int})
-def widen(p: Point) -> Point3D:
-    return p  # E: Incompatible return value type (got "Point", expected "Point3D")
-[builtins fixtures/dict.pyi]
-
-[case testCanConvertTypedDictToCompatibleMapping]
-from mypy_extensions import TypedDict
-from typing import Mapping
-Point = TypedDict('Point', {'x': int, 'y': int})
-def as_mapping(p: Point) -> Mapping[str, int]:
-    return p
-[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToCompatibleMapping]
-from mypy_extensions import TypedDict
-from typing import Mapping
-Point = TypedDict('Point', {'x': int, 'y': int})
-def as_mapping(p: Point) -> Mapping[str, str]:
-    return p  # E: Incompatible return value type (got "Point", expected Mapping[str, str])
-[builtins fixtures/dict.pyi]
-
--- TODO: Fix mypy stubs so that the following passes in the test suite
---[case testCanConvertTypedDictToAnySuperclassOfMapping]
---from mypy_extensions import TypedDict
---from typing import Sized, Iterable, Container
---Point = TypedDict('Point', {'x': int, 'y': int})
---def as_sized(p: Point) -> Sized:
---    return p
---def as_iterable(p: Point) -> Iterable[str]:
---    return p
---def as_container(p: Point) -> Container[str]:
---    return p
---def as_object(p: Point) -> object:
---    return p
---[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToDictOrMutableMapping]
-from mypy_extensions import TypedDict
-from typing import Dict, MutableMapping
-Point = TypedDict('Point', {'x': int, 'y': int})
-def as_dict(p: Point) -> Dict[str, int]:
-    return p  # E: Incompatible return value type (got "Point", expected Dict[str, int])
-def as_mutable_mapping(p: Point) -> MutableMapping[str, int]:
-    return p  # E: Incompatible return value type (got "Point", expected MutableMapping[str, int])
-[builtins fixtures/dict.pyi]
-
-[case testCanConvertTypedDictToAny]
-from mypy_extensions import TypedDict
-from typing import Any
-Point = TypedDict('Point', {'x': int, 'y': int})
-def unprotect(p: Point) -> Any:
-    return p
-[builtins fixtures/dict.pyi]
-
-
--- Join
-
-[case testJoinOfTypedDictHasOnlyCommonKeysAndNewFallback]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-Point3D = TypedDict('Point3D', {'x': int, 'y': int, 'z': int})
-p1 = TaggedPoint(type='2d', x=0, y=0)
-p2 = Point3D(x=1, y=1, z=1)
-joined_points = [p1, p2]
-reveal_type(p1)             # E: Revealed type is 'TypedDict(type=builtins.str, x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.object])'
-reveal_type(p2)             # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, z=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-reveal_type(joined_points)  # E: Revealed type is 'builtins.list[TypedDict(x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])]'
-[builtins fixtures/dict.pyi]
-
-[case testJoinOfTypedDictRemovesNonequivalentKeys]
-from mypy_extensions import TypedDict
-CellWithInt = TypedDict('CellWithInt', {'value': object, 'meta': int})
-CellWithObject = TypedDict('CellWithObject', {'value': object, 'meta': object})
-c1 = CellWithInt(value=1, meta=42)
-c2 = CellWithObject(value=2, meta='turtle doves')
-joined_cells = [c1, c2]
-reveal_type(c1)             # E: Revealed type is 'TypedDict(value=builtins.int, meta=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-reveal_type(c2)             # E: Revealed type is 'TypedDict(value=builtins.int, meta=builtins.str, _fallback=typing.Mapping[builtins.str, builtins.object])'
-reveal_type(joined_cells)   # E: Revealed type is 'builtins.list[TypedDict(value=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])]'
-[builtins fixtures/dict.pyi]
-
-[case testJoinOfDisjointTypedDictsIsEmptyTypedDict]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-Cell = TypedDict('Cell', {'value': object})
-d1 = Point(x=0, y=0)
-d2 = Cell(value='pear tree')
-joined_dicts = [d1, d2]
-reveal_type(d1)             # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-reveal_type(d2)             # E: Revealed type is 'TypedDict(value=builtins.str, _fallback=typing.Mapping[builtins.str, builtins.str])'
-reveal_type(joined_dicts)   # E: Revealed type is 'builtins.list[TypedDict(_fallback=typing.Mapping[builtins.str, builtins.None])]'
-[builtins fixtures/dict.pyi]
-
-[case testJoinOfTypedDictWithCompatibleMappingIsMapping]
-from mypy_extensions import TypedDict
-from typing import Mapping
-Cell = TypedDict('Cell', {'value': int})
-left = Cell(value=42)
-right = {'score': 999}  # type: Mapping[str, int]
-joined1 = [left, right]
-joined2 = [right, left]
-reveal_type(joined1)  # E: Revealed type is 'builtins.list[typing.Mapping*[builtins.str, builtins.int]]'
-reveal_type(joined2)  # E: Revealed type is 'builtins.list[typing.Mapping*[builtins.str, builtins.int]]'
-[builtins fixtures/dict.pyi]
-
--- TODO: Fix mypy stubs so that the following passes in the test suite
---[case testJoinOfTypedDictWithCompatibleMappingSupertypeIsSupertype]
---from mypy_extensions import TypedDict
---from typing import Sized
---Cell = TypedDict('Cell', {'value': int})
---left = Cell(value=42)
---right = {'score': 999}  # type: Sized
---joined1 = [left, right]
---joined2 = [right, left]
---reveal_type(joined1)  # E: Revealed type is 'builtins.list[typing.Sized*]'
---reveal_type(joined2)  # E: Revealed type is 'builtins.list[typing.Sized*]'
---[builtins fixtures/dict.pyi]
-
-[case testJoinOfTypedDictWithIncompatibleMappingIsObject]
-from mypy_extensions import TypedDict
-from typing import Mapping
-Cell = TypedDict('Cell', {'value': int})
-left = Cell(value=42)
-right = {'score': 'zero'}  # type: Mapping[str, str]
-joined1 = [left, right]
-joined2 = [right, left]
-reveal_type(joined1)  # E: Revealed type is 'builtins.list[builtins.object*]'
-reveal_type(joined2)  # E: Revealed type is 'builtins.list[builtins.object*]'
-[builtins fixtures/dict.pyi]
-
-[case testJoinOfTypedDictWithIncompatibleTypeIsObject]
-from mypy_extensions import TypedDict
-from typing import Mapping
-Cell = TypedDict('Cell', {'value': int})
-left = Cell(value=42)
-right = 42
-joined1 = [left, right]
-joined2 = [right, left]
-reveal_type(joined1)  # E: Revealed type is 'builtins.list[builtins.object*]'
-reveal_type(joined2)  # E: Revealed type is 'builtins.list[builtins.object*]'
-[builtins fixtures/dict.pyi]
-
-
--- Meet
-
-[case testMeetOfTypedDictsWithCompatibleCommonKeysHasAllKeysAndNewFallback]
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable
-XY = TypedDict('XY', {'x': int, 'y': int})
-YZ = TypedDict('YZ', {'y': int, 'z': int})
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: XY, y: YZ) -> None: pass
-reveal_type(f(g))  # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, z=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-[builtins fixtures/dict.pyi]
-
-[case testMeetOfTypedDictsWithIncompatibleCommonKeysIsUninhabited]
-# flags: --strict-optional
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable
-XYa = TypedDict('XYa', {'x': int, 'y': int})
-YbZ = TypedDict('YbZ', {'y': object, 'z': int})
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: XYa, y: YbZ) -> None: pass
-reveal_type(f(g))  # E: Revealed type is '<uninhabited>'
-[builtins fixtures/dict.pyi]
-
-[case testMeetOfTypedDictsWithNoCommonKeysHasAllKeysAndNewFallback]
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable
-X = TypedDict('X', {'x': int})
-Z = TypedDict('Z', {'z': int})
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: X, y: Z) -> None: pass
-reveal_type(f(g))  # E: Revealed type is 'TypedDict(x=builtins.int, z=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-[builtins fixtures/dict.pyi]
-
-# TODO: It would be more accurate for the meet to be TypedDict instead.
-[case testMeetOfTypedDictWithCompatibleMappingIsUninhabitedForNow]
-# flags: --strict-optional
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable, Mapping
-X = TypedDict('X', {'x': int})
-M = Mapping[str, int]
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: X, y: M) -> None: pass
-reveal_type(f(g))  # E: Revealed type is '<uninhabited>'
-[builtins fixtures/dict.pyi]
-
-[case testMeetOfTypedDictWithIncompatibleMappingIsUninhabited]
-# flags: --strict-optional
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable, Mapping
-X = TypedDict('X', {'x': int})
-M = Mapping[str, str]
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: X, y: M) -> None: pass
-reveal_type(f(g))  # E: Revealed type is '<uninhabited>'
-[builtins fixtures/dict.pyi]
-
-# TODO: It would be more accurate for the meet to be TypedDict instead.
-[case testMeetOfTypedDictWithCompatibleMappingSuperclassIsUninhabitedForNow]
-# flags: --strict-optional
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable, Iterable
-X = TypedDict('X', {'x': int})
-I = Iterable[str]
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: X, y: I) -> None: pass
-reveal_type(f(g))  # E: Revealed type is '<uninhabited>'
-[builtins fixtures/dict.pyi]
-
-
--- Constraint Solver
-
--- TODO: Figure out some way to trigger the ConstraintBuilderVisitor.visit_typeddict_type() path.
-
-
--- Methods
-
--- TODO: iter() doesn't accept TypedDictType as an argument type. Figure out why.
---[case testCanCallMappingMethodsOnTypedDict]
---from mypy_extensions import TypedDict
---Cell = TypedDict('Cell', {'value': int})
---c = Cell(value=42)
---c['value']
---iter(c)
---len(c)
---'value' in c
---c.keys()
---c.items()
---c.values()
---c.get('value')
---c == c
---c != c
---[builtins fixtures/dict.pyi]
-
-
--- Special Method: __getitem__
-
-[case testCanGetItemOfTypedDictWithValidStringLiteralKey]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-reveal_type(p['type'])  # E: Revealed type is 'builtins.str'
-reveal_type(p['x'])     # E: Revealed type is 'builtins.int'
-reveal_type(p['y'])     # E: Revealed type is 'builtins.int'
-[builtins fixtures/dict.pyi]
-
-[case testCanGetItemOfTypedDictWithValidBytesOrUnicodeLiteralKey]
-# flags: --python-version 2.7
-from mypy_extensions import TypedDict
-Cell = TypedDict('Cell', {'value': int})
-c = Cell(value=42)
-reveal_type(c['value'])   # E: Revealed type is 'builtins.int'
-reveal_type(c[u'value'])  # E: Revealed type is 'builtins.int'
-[builtins_py2 fixtures/dict.pyi]
-
-[case testCannotGetItemOfTypedDictWithInvalidStringLiteralKey]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-p['z']  # E: 'z' is not a valid item name; expected one of ['type', 'x', 'y']
-[builtins fixtures/dict.pyi]
-
-[case testCannotGetItemOfTypedDictWithNonLiteralKey]
-from mypy_extensions import TypedDict
-from typing import Union
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-def get_coordinate(p: TaggedPoint, key: str) -> Union[str, int]:
-    return p[key]  # E: Cannot prove expression is a valid item name; expected one of ['type', 'x', 'y']
-[builtins fixtures/dict.pyi]
-
-
--- Special Method: __setitem__
-
-[case testCanSetItemOfTypedDictWithValidStringLiteralKeyAndCompatibleValueType]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-p['type'] = 'two_d'
-p['x'] = 1
-[builtins fixtures/dict.pyi]
-
-[case testCannotSetItemOfTypedDictWithIncompatibleValueType]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-p['x'] = 'y'  # E: Argument 2 has incompatible type "str"; expected "int"
-[builtins fixtures/dict.pyi]
-
-[case testCannotSetItemOfTypedDictWithInvalidStringLiteralKey]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-p['z'] = 1  # E: 'z' is not a valid item name; expected one of ['type', 'x', 'y']
-[builtins fixtures/dict.pyi]
-
-[case testCannotSetItemOfTypedDictWithNonLiteralKey]
-from mypy_extensions import TypedDict
-from typing import Union
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-def set_coordinate(p: TaggedPoint, key: str, value: int) -> None:
-    p[key] = value  # E: Cannot prove expression is a valid item name; expected one of ['type', 'x', 'y']
-[builtins fixtures/dict.pyi]
-
-
--- Special Method: get
-
--- TODO: Implement support for these cases:
---[case testGetOfTypedDictWithValidStringLiteralKeyReturnsPreciseType]
---[case testGetOfTypedDictWithInvalidStringLiteralKeyIsError]
---[case testGetOfTypedDictWithNonLiteralKeyReturnsImpreciseType]
-
-
--- isinstance
-
--- TODO: Implement support for this case.
---[case testCannotIsInstanceTypedDictType]
-
--- scoping
-[case testTypedDictInClassNamespace]
-# https://github.com/python/mypy/pull/2553#issuecomment-266474341
-from mypy_extensions import TypedDict
-class C:
-    def f(self):
-        A = TypedDict('A', {'x': int})
-    def g(self):
-        A = TypedDict('A', {'y': int})
-C.A  # E: "C" has no attribute "A"
-[builtins fixtures/dict.pyi]
-
-[case testTypedDictInFunction]
-from mypy_extensions import TypedDict
-def f() -> None:
-    A = TypedDict('A', {'x': int})
-A  # E: Name 'A' is not defined
-[builtins fixtures/dict.pyi]
diff --git a/test-data/unit/check-typevar-values.test b/test-data/unit/check-typevar-values.test
deleted file mode 100644
index 26e56a5..0000000
--- a/test-data/unit/check-typevar-values.test
+++ /dev/null
@@ -1,505 +0,0 @@
--- Test cases for type variables with values restriction.
-
-
-[case testCallGenericFunctionWithTypeVarValueRestriction]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> None: pass
-f(1)
-f('x')
-f(object()) # E: Type argument 1 of "f" has incompatible value "object"
-
-[case testCallGenericFunctionWithTypeVarValueRestrictionUsingContext]
-from typing import TypeVar, List
-T = TypeVar('T', int, str)
-def f(x: T) -> List[T]: pass
-i = [1]
-s = ['x']
-o = [object()]
-i = f(1)
-s = f('')
-o = f(1) # E: Type argument 1 of "f" has incompatible value "object"
-[builtins fixtures/list.pyi]
-
-[case testCallGenericFunctionWithTypeVarValueRestrictionAndAnyArgs]
-from typing import TypeVar, Any
-T = TypeVar('T', int, str)
-def f(x: T) -> None: pass
-f(Any(object()))
-[out]
-
-[case testCallGenericFunctionWithTypeVarValueRestrictionInDynamicFunc]
-from typing import TypeVar, Any
-T = TypeVar('T', int, str)
-def f(x: T) -> None: pass
-def g():
-    f(object())
-[out]
-
-[case testCallGenericFunctionWithTypeVarValueRestrictionUsingSubtype]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> None: pass
-class S(str): pass
-f(S())
-[out]
-
-[case testCheckGenericFunctionBodyWithTypeVarValues]
-from typing import TypeVar
-class A:
-    def f(self, x: int) -> A: return self
-class B:
-    def f(self, x: int) -> B: return self
-AB = TypeVar('AB', A, B)
-def f(x: AB) -> AB:
-    x = x.f(1)
-    return x.f(1)
-
-[case testCheckGenericFunctionBodyWithTypeVarValues2]
-from typing import TypeVar
-class A:
-    def f(self) -> A: return A()
-    def g(self) -> B: return B()
-class B:
-    def f(self) -> A: return A()
-    def g(self) -> B: return B()
-AB = TypeVar('AB', A, B)
-def f(x: AB) -> AB:
-    return x.f() # Error
-def g(x: AB) -> AB:
-    return x.g() # Error
-[out]
-main:10: error: Incompatible return value type (got "A", expected "B")
-main:12: error: Incompatible return value type (got "B", expected "A")
-
-[case testTypeInferenceAndTypeVarValues]
-from typing import TypeVar
-class A:
-    def f(self) -> A: return self
-    def g(self) -> B: return B()
-class B:
-    def f(self) -> B: return self
-    def g(self) -> B: return B()
-AB = TypeVar('AB', A, B)
-def f(x: AB) -> AB:
-    y = x
-    if y:
-        return y.f()
-    else:
-        return y.g() # E: Incompatible return value type (got "B", expected "A")
-[out]
-
-[case testTypeDeclaredBasedOnTypeVarWithValues]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
-    a = None  # type: T
-    b = None # type: T
-    a = x
-    b = x
-    a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-    b = 1  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[out]
-
-[case testIsinstanceAndTypeVarValues]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
-    if isinstance(x, int):
-        return 2
-def g(x: T) -> T:
-    if isinstance(x, str):
-        return ''
-def h(x: T) -> T:
-    if isinstance(x, int):
-        return '' # E: Incompatible return value type (got "str", expected "int")
-    return x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndTypeVarValues2]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
-    if isinstance(x, int):
-        return 2
-    else:
-        return ''
-def g(x: T) -> T:
-    if isinstance(x, int):
-        return '' # E: Incompatible return value type (got "str", expected "int")
-    else:
-        return 2  # E: Incompatible return value type (got "int", expected "str")
-    return x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndTypeVarValues3]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
-    if isinstance(x, int):
-        y = 1
-    else:
-        y = ''
-    return y
-[builtins fixtures/isinstance.pyi]
-
-[case testIsinstanceAndTypeVarValues4]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
-    if isinstance(x, int):
-        y = 1
-    else:
-        y = object()
-    return y # E: Incompatible return value type (got "object", expected "str")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndTypeVarValues5]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
-    if isinstance(x, int):
-        y = object()
-    else:
-        y = ''
-    return y # E: Incompatible return value type (got "object", expected "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceWithUserDefinedTypeAndTypeVarValues]
-from typing import TypeVar
-class A: pass
-class B: pass
-T = TypeVar('T', A, B)
-def f(x: T) -> None:
-    y = x
-    if isinstance(x, A):
-        # This is only checked when x is A, since A and B are not considered overlapping.
-        x = y
-        x = A()
-    else:
-        x = B()
-        x = y
-        x.foo() # E: "B" has no attribute "foo"
-S = TypeVar('S', int, str)
-def g(x: S) -> None:
-    y = x
-    if isinstance(x, int):
-        x = y
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceWithUserDefinedTypeAndTypeVarValues2]
-from typing import TypeVar
-class S(str): pass
-T = TypeVar('T', S, int)
-def f(x: T) -> None:
-    y = x
-    if isinstance(x, S):
-        # This is checked only when type of x is str.
-        x = y
-        x = S()
-        x = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "S")
-    else:
-        x = y
-        x = 1
-        x = S() # E: Incompatible types in assignment (expression has type "S", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testTypeVarValuesAndNestedCalls]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(m: T) -> int: pass
-def h(x: int) -> int: pass
-def g(a: T) -> None:
-    h(f(a))
-[out]
-
-[case testGenericTypeWithTypevarValues]
-from typing import TypeVar, Generic, Any
-X = TypeVar('X', int, str)
-class A(Generic[X]): pass
-a = None  # type: A[int]
-b = None  # type: A[str]
-d = None  # type: A[object] # E: Type argument 1 of "A" has incompatible value "object"
-c = None  # type: A[Any]
-
-[case testConstructGenericTypeWithTypevarValuesAndTypeInference]
-from typing import TypeVar, Generic, Any
-X = TypeVar('X', int, str)
-class A(Generic[X]):
-    def __init__(self, x: X) -> None: pass
-A(1)
-A('x')
-A(Any(object()))
-A(object()) # E: Type argument 1 of "A" has incompatible value "object"
-
-[case testGenericTypeWithTypevarValuesAndTypevarArgument]
-from typing import TypeVar, Generic
-class C: pass
-X = TypeVar('X', int, str)
-Y = TypeVar('Y', int, C)
-Z = TypeVar('Z')
-class D(Generic[X]):
-    def __init__(self, x: X) -> None: pass
-def f(x: X) -> None:
-    a = None  # type: D[X]
-def g(x: Y) -> None:
-    a = None  # type: D[Y]
-def h(x: Z) -> None:
-    a = None  # type: D[Z]
-[out]
-main:11: error: Invalid type argument value for "D"
-main:13: error: Type variable "Z" not valid as type argument value for "D"
-
-[case testGenericTypeWithTypevarValuesAndSubtypePromotion]
-from typing import TypeVar, Generic
-X = TypeVar('X', int, str)
-class S(str): pass
-class C(Generic[X]):
-    def __init__(self, x: X) -> None: pass
-x = None  # type: C[str]
-y = C(S())
-x = y
-y = x
-c_int = C(1) # type: C[int]
-y = c_int # E: Incompatible types in assignment (expression has type C[int], variable has type C[str])
-
-[case testGenericTypeBodyWithTypevarValues]
-from typing import TypeVar, Generic
-class A:
-    def f(self, x: int) -> None: pass
-    def g(self, x: int) -> None: pass
-    def h(self, x: str) -> None: pass
-class B:
-    def f(self, x: int) -> None: pass
-    def g(self, x: str) -> None: pass
-    def h(self, x: int) -> None: pass
-X = TypeVar('X', A, B)
-class C(Generic[X]):
-    def f(self, x: X) -> None:
-        x.f(1)
-        x.g(1) # E: Argument 1 to "g" of "B" has incompatible type "int"; expected "str"
-        x.h(1) # E: Argument 1 to "h" of "A" has incompatible type "int"; expected "str"
-[out]
-
-[case testAttributeInGenericTypeWithTypevarValues1]
-from typing import TypeVar, Generic
-X = TypeVar('X', int, str)
-class C(Generic[X]):
-    x = None  # type: X
-    def f(self, x: X) -> None:
-        self.x = x
-        self.x = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[out]
-
-[case testAttributeInGenericTypeWithTypevarValues2]
-from typing import TypeVar, Generic
-X = TypeVar('X', int, str)
-class C(Generic[X]):
-    x = None  # type: X
-cn = C() # type: C[int]
-cn.x = 1
-cn.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-cs = C() # type: C[str]
-cs.x = ''
-cs.x = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testInferredAttributeInGenericClassBodyWithTypevarValues]
-from typing import TypeVar, Generic
-X = TypeVar('X', int, str)
-class C(Generic[X]):
-    x = 1
-C.x = 1
-C.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testMultipleClassTypevarsWithValues1]
-from typing import TypeVar, Generic
-class A:
-    def f(self, x: int) -> None: pass
-class B:
-    def f(self, x: str) -> None: pass
-X = TypeVar('X', A, B)
-Y = TypeVar('Y', int, str)
-class C(Generic[X, Y]):
-    def f(self, x: X, y: Y) -> None:
-        x.f(y)
-[out]
-main:10: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-main:10: error: Argument 1 to "f" of "B" has incompatible type "int"; expected "str"
-
-[case testMultipleClassTypevarsWithValues2]
-from typing import TypeVar, Generic
-class A: pass
-class B: pass
-X = TypeVar('X', A, B)
-Y = TypeVar('Y', int, str)
-class C(Generic[X, Y]): pass
-a = None  # type: C[A, int]
-b = None  # type: C[B, str]
-c = None  # type: C[int, int] # E: Type argument 1 of "C" has incompatible value "int"
-d = None  # type: C[A, A]     # E: Type argument 2 of "C" has incompatible value "A"
-
-[case testCallGenericFunctionUsingMultipleTypevarsWithValues]
-from typing import TypeVar
-class A: pass
-class B: pass
-X = TypeVar('X', A, B)
-Y = TypeVar('Y', int, str)
-def f(x: X, y: Y) -> None: pass
-f(A(), '')
-f(B(), 1)
-f(A(), A()) # E: Type argument 2 of "f" has incompatible value "A"
-f(1, 1) # E: Type argument 1 of "f" has incompatible value "int"
-
-[case testGenericFunctionWithNormalAndRestrictedTypevar]
-from typing import TypeVar, Generic
-X = TypeVar('X')
-Y = TypeVar('Y', int, str)
-class C(Generic[Y]):
-    def __init__(self, y: Y) -> None: pass
-def f(x: X, y: Y, z: int) -> None:
-    C(y)
-    C(x)  # Error
-    z = x # Error
-    z = y # Error
-    y.foo # Error
-[out]
-main:8: error: Type argument 1 of "C" has incompatible value "X"
-main:9: error: Incompatible types in assignment (expression has type "X", variable has type "int")
-main:10: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:11: error: "int" has no attribute "foo"
-main:11: error: "str" has no attribute "foo"
-
-[case testTypeVarWithValueInferredFromObjectReturnTypeContext]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def c1(x: object) -> None: pass
-def c2(x: int) -> None: pass
-def c3(x: str) -> None: pass
-def g(x: T) -> T: pass
-c1(g(''))
-c2(g(1))
-c3(g(''))
-c2(g(''))  # E: Argument 1 to "c2" has incompatible type "str"; expected "int"
-c3(g(1))   # E: Argument 1 to "c3" has incompatible type "int"; expected "str"
-
-[case testTypeVarWithValueInferredFromObjectReturnTypeContext2]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-class ss(str): pass
-def c(x: ss) -> None: pass
-def g(x: T) -> T: pass
-c(g(''))
-c(g(1))
-[out]
-main:6: error: Argument 1 to "c" has incompatible type "str"; expected "ss"
-main:7: error: Argument 1 to "c" has incompatible type "int"; expected "ss"
-
-
--- Special cases
--- -------------
-
-
-[case testTypevarValuesSpecialCase1]
-from typing import TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T', int, str)
-class A(Generic[T]):
-    @abstractmethod
-    def f(self) -> 'A[T]': pass
-class B(A[str]):
-    @abstractmethod
-    def f(self) -> 'B': pass
-class C(A[str]):
-    @abstractmethod
-    def f(self) -> int: # E: Return type of "f" incompatible with supertype "A"
-        pass
-[out]
-
-[case testDefaultArgumentValueInGenericClassWithTypevarValues]
-from typing import TypeVar, Generic
-T = TypeVar('T', int, str)
-class C(Generic[T]):
-    def f(self, x: int = None) -> None: pass
-
-[case testTypevarValuesWithOverloadedFunctionSpecialCase]
-from typing import TypeVar, overload, Callable
-
-T = TypeVar('T', int, str)
-def f(x: T) -> None:
-     y = m(g, x)
-     x = y
-     y = object()
-
-A = TypeVar('A')
-R = TypeVar('R')
-def m(f: Callable[[A], R], it: A) -> A: pass
-
- at overload
-def g(x: int) -> int: return x
- at overload
-def g(x: str) -> str: return x
-[out]
-main:7: error: Incompatible types in assignment (expression has type "object", variable has type "int")
-main:7: error: Incompatible types in assignment (expression has type "object", variable has type "str")
-
-[case testGenericFunctionSubtypingWithTypevarValues]
-from typing import TypeVar
-class A: pass
-T = TypeVar('T', int, str)
-U = TypeVar('U', str, A, int)
-def f(x: T) -> T: pass
-def g(x: U) -> U: pass
-a = f
-a = f
-a = g
-b = g
-b = g
-b = f # E: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[U], U])
-
-[case testInnerFunctionWithTypevarValues]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-U = TypeVar('U', int, str)
-def outer(x: T) -> T:
-    def inner(y: T) -> T:
-        return x
-    def inner2(y: U) -> U:
-        return y
-    inner(x)
-    inner(3) # E: Argument 1 to "inner" has incompatible type "int"; expected "str"
-    inner2(x)
-    inner2(3)
-    outer(3)
-    return x
-[out]
-
-[case testInnerFunctionMutualRecursionWithTypevarValues]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def outer(x: T) -> T:
-    def inner1(y: T) -> T:
-        return inner2(y)
-    def inner2(y: T) -> T:
-        return inner1('a') # E: Argument 1 to "inner1" has incompatible type "str"; expected "int"
-    return inner1(x)
-[out]
-
-[case testClassMemberTypeVarInFunctionBody]
-from typing import TypeVar
-class C:
-    T = TypeVar('T', int)
-    def f(self, x: T) -> T:
-        A = C.T
-        return x
-
-[case testParameterLessGenericAsRestriction]
-from typing import Sequence, Iterable, TypeVar
-S = TypeVar('S', Sequence, Iterable)
-def my_len(s: S) -> None: pass
-def crash() -> None: my_len((0,))
diff --git a/test-data/unit/check-underscores.test b/test-data/unit/check-underscores.test
deleted file mode 100644
index a1d88cb..0000000
--- a/test-data/unit/check-underscores.test
+++ /dev/null
@@ -1,16 +0,0 @@
-[case testUnderscoresRequire36]
-# flags: --fast-parser --python-version 3.5
-x = 1000_000  # E: Underscores in numeric literals are only supported in Python 3.6
-[out]
-
-[case testUnderscoresSyntaxError]
-# flags: --fast-parser --python-version 3.6
-x = 1000_000_  # E: invalid token
-[out]
-
-[case testUnderscoresBasics]
-# flags: --fast-parser --python-version 3.6
-x: int
-x = 1000_000
-x = 0x_FF_FF_FF_FF
-y: str = 1000_000.000_001  # E: Incompatible types in assignment (expression has type "float", variable has type "str")
diff --git a/test-data/unit/check-unions.test b/test-data/unit/check-unions.test
deleted file mode 100644
index 8c979d7..0000000
--- a/test-data/unit/check-unions.test
+++ /dev/null
@@ -1,140 +0,0 @@
--- Type checking of union types
-
-[case testUnion1]
-from typing import Union
-def f(x: Union[int, str]) -> None:
-    if isinstance(x, int):
-        y = 1
-        y = x
-    elif isinstance(x, str):
-        z = 'a'
-        z = x
-[builtins fixtures/isinstance.pyi]
-
-[case testUnion2]
-from typing import Union
-def f(x: Union[int, str]) -> None:
-    if isinstance(x, int):
-        y = 1
-        y = x
-    else:
-        z = 'a'
-        z = x
-[builtins fixtures/isinstance.pyi]
-
-[case testUnion3]
-from typing import Union
-def f(x: Union[int, str]) -> None:
-    if isinstance(x, int):
-        y = 1
-        y = x
-    else:
-        z = 2
-        z = x # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testUnionAnyIsInstance]
-from typing import Any, Union
-
-def func(v:Union[int, Any]) -> None:
-    if isinstance(v, int):
-        reveal_type(v) # E: Revealed type is 'builtins.int'
-    else:
-        reveal_type(v) # E: Revealed type is 'Any'
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testUnionAttributeAccess]
-from typing import Union
-
-class A: y = 1
-class B: y = 2
-class C: pass
-
-w = None # type: Union[A, B]
-x = None # type: Union[A, C]
-y = None # type: int
-z = None # type: str
-
-y = w.y
-z = w.y       # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-w.y = 'a'     # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-y = x.y       # E: Some element of union has no attribute "y"
-z = x.y       # E: Some element of union has no attribute "y"
-
-[builtins fixtures/isinstance.pyi]
-
-[case testUnionMethodCalls]
-from typing import Union
-
-class A:
-    def foo(self) -> int: pass
-class B:
-    def foo(self) -> int: pass
-class C:
-    def foo(self) -> str: pass
-
-x = None # type: Union[A, B]
-y = None # type: Union[A, C]
-i = None # type: int
-
-x.foo()
-y.foo()
-i = x.foo()
-i = y.foo()   # E: Incompatible types in assignment (expression has type "Union[int, str]", variable has type "int")
-
-[builtins fixtures/isinstance.pyi]
-
-[case testUnionIndexing]
-from typing import Union, List
-x = None # type: Union[List[int], str]
-x[2]
-x[2] + 1 # E: Unsupported operand types for + (likely involving Union)
-[builtins fixtures/isinstancelist.pyi]
-
-[case testUnionAsOverloadArg]
-from typing import Union, overload
- at overload
-def f(x: Union[int, str]) -> int: pass
- at overload
-def f(x: type) -> str: pass
-x = 0
-x = f(1)
-x = f('')
-s = ''
-s = f(int)
-s = f(1)    # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-x = f(int)  # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testUnionWithNoneItem]
-from typing import Union
-def f() -> Union[int, None]: pass
-x = 1
-x = f()
-
-[case testOptional]
-from typing import Optional
-def f(x: Optional[int]) -> None: pass
-f(1)
-f(None)
-f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testUnionSimplificationGenericFunction]
-from typing import TypeVar, Union, List
-T = TypeVar('T')
-def f(x: List[T]) -> Union[T, int]: pass
-def g(y: str) -> None: pass
-a = f([1])
-g(a) # E: Argument 1 to "g" has incompatible type "int"; expected "str"
-[builtins fixtures/list.pyi]
-
-[case testUnionSimplificationGenericClass]
-from typing import TypeVar, Union, Generic
-T = TypeVar('T')
-U = TypeVar('U')
-class C(Generic[T, U]):
-    def f(self, x: str) -> Union[T, U]: pass
-a = C() # type: C[int, int]
-b = a.f('a')
-a.f(b) # E: Argument 1 to "f" of "C" has incompatible type "int"; expected "str"
diff --git a/test-data/unit/check-unreachable-code.test b/test-data/unit/check-unreachable-code.test
deleted file mode 100644
index a18a42b..0000000
--- a/test-data/unit/check-unreachable-code.test
+++ /dev/null
@@ -1,459 +0,0 @@
--- Type checker test cases for conditional checks that result in some
--- blocks classified as unreachable (they are not type checked or semantically
--- analyzed).
---
--- For example, we skip blocks that will not be executed on the active
--- Python version.
-
-[case testConditionalTypeAliasPY3]
-import typing
-def f(): pass
-PY3 = f()
-if PY3:
-    t = int
-    x = object() + 'x' # E: Unsupported left operand type for + ("object")
-else:
-    t = str
-    y = 'x' / 1
-x
-z = 1 # type: t
-
-[case testConditionalTypeAliasPY3_python2]
-import typing
-def f(): pass
-PY3 = f()
-if PY3:
-    t = int
-    x = object() + 'x'
-else:
-    t = str
-    y = 'x' / 1 # E: "str" has no attribute "__div__"
-y
-z = '' # type: t
-
-[case testConditionalAssignmentPY2]
-import typing
-def f(): pass
-PY2 = f()
-if PY2:
-    x = object() + 'x'
-else:
-    y = 'x' / 1 # E: Unsupported left operand type for / ("str")
-y
-
-[case testConditionalAssignmentPY2_python2]
-import typing
-def f(): pass
-PY2 = f()
-if PY2:
-    x = object() + 'x' # E: Unsupported left operand type for + ("object")
-else:
-    y = 'x' / 1
-x
-
-[case testConditionalImport]
-import typing
-def f(): pass
-PY2 = f()
-if PY2:
-    import fuzzybar
-    from barbar import *
-    from pawwaw import a, bc
-else:
-    import m
-[file m.py]
-import typing
-x = 1
-x = 'a'
-[out]
-tmp/m.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testNegatedMypyConditional]
-import typing
-MYPY = 0
-if not MYPY:
-    import xyz753
-else:
-    import pow123 # E
-[builtins fixtures/bool.pyi]
-[out]
-main:6: error: Cannot find module named 'pow123'
-main:6: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testMypyConditional]
-import typing
-MYPY = 0
-if MYPY:
-    None + 1 # E: Unsupported left operand type for + (None)
-else:
-    None + ''
-[builtins fixtures/bool.pyi]
-
-[case testTypeCheckingConditional]
-import typing
-if typing.TYPE_CHECKING:
-    import pow123 # E
-else:
-    import xyz753
-[out]
-main:3: error: Cannot find module named 'pow123'
-main:3: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testTypeCheckingConditionalFromImport]
-from typing import TYPE_CHECKING
-if TYPE_CHECKING:
-    import pow123 # E
-else:
-    import xyz753
-[out]
-main:3: error: Cannot find module named 'pow123'
-main:3: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testNegatedTypeCheckingConditional]
-import typing
-if not typing.TYPE_CHECKING:
-    import pow123 # E
-else:
-    import xyz753
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Cannot find module named 'xyz753'
-main:5: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testUndefinedTypeCheckingConditional]
-if not TYPE_CHECKING: # E
-    import pow123
-else:
-    import xyz753
-[builtins fixtures/bool.pyi]
-[out]
-main:1: error: Name 'TYPE_CHECKING' is not defined
-main:4: error: Cannot find module named 'xyz753'
-main:4: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testConditionalClassDefPY3]
-def f(): pass
-PY3 = f()
-if PY3:
-    pass
-else:
-    class X(object):
-        pass
-
-[case testUnreachabilityAndElifPY3]
-def f(): pass
-PY3 = f()
-if PY3:
-    pass
-elif bool():
-    import nonexistent
-    1 + ''
-else:
-    import bad_name
-    1 + ''
-[builtins fixtures/bool.pyi]
-[out]
-
-[case testSysVersionInfo_python2]
-import sys
-if sys.version_info[0] >= 3:
-    def foo():
-        # type: () -> int
-        return 0
-else:
-    def foo():
-        # type: () -> str
-        return ''
-reveal_type(foo())  # E: Revealed type is 'builtins.str'
-[builtins_py2 fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfo]
-import sys
-if sys.version_info[0] >= 3:
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-reveal_type(foo())  # E: Revealed type is 'builtins.int'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoNegated_python2]
-import sys
-if not (sys.version_info[0] < 3):
-    def foo():
-        # type: () -> int
-        return 0
-else:
-    def foo():
-        # type: () -> str
-        return ''
-reveal_type(foo())  # E: Revealed type is 'builtins.str'
-[builtins_py2 fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoNegated]
-import sys
-if not (sys.version_info[0] < 3):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-reveal_type(foo())  # E: Revealed type is 'builtins.int'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced1]
-import sys
-if sys.version_info[:1] >= (3,):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced2]
-import sys
-if sys.version_info[:2] >= (3, 0):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced3]
-import sys
-if sys.version_info[:] >= (3, 0):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced4]
-import sys
-if sys.version_info[0:2] >= (3, 0):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced5]
-import sys
-if sys.version_info[0:] >= (3,):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced6]
-import sys
-if sys.version_info[1:] >= (5,):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced7]
-import sys
-if sys.version_info >= (3, 5):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced8]
-# Our pyversion only has (major, minor),
-# so testing for (major, minor, bugfix) is unsupported.
-import sys
-if sys.version_info >= (3, 5, 0):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''  # E: All conditional function variants must have identical signatures
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced9]
-# Our pyversion only has (major, minor),
-# so testing for (minor, bugfix) is unsupported (also it's silly :-).
-import sys
-if sys.version_info[1:] >= (5, 0):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''  # E: All conditional function variants must have identical signatures
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysPlatform1]
-import sys
-if sys.platform == 'fictional':
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-foo() + ''
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysPlatform2]
-import sys
-if sys.platform != 'fictional':
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysPlatformNegated]
-import sys
-if not (sys.platform == 'fictional'):
-    def foo() -> int: return 0
-else:
-    def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoClass]
-import sys
-if sys.version_info < (3, 5):
-    class C:
-        pass
-else:
-    class C:
-        def foo(self) -> int: return 0
-C().foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoImport]
-import sys
-if sys.version_info >= (3, 5):
-    import collections
-else:
-    collections = None
-Pt = collections.namedtuple('Pt', 'x y z')
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoVariable]
-import sys
-if sys.version_info >= (3, 5):
-    x = ''
-else:
-    x = 0
-x + ''
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoInClass]
-import sys
-class C:
-    if sys.version_info >= (3, 5):
-        def foo(self) -> int: return 0
-    else:
-        def foo(self) -> str: return ''
-reveal_type(C().foo())  # E: Revealed type is 'builtins.int'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoInFunction]
-import sys
-def foo() -> None:
-    if sys.version_info >= (3, 5):
-        x = ''
-    else:
-        x = 0
-    reveal_type(x)  # E: Revealed type is 'builtins.str'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysPlatformInMethod]
-import sys
-class C:
-    def foo(self) -> None:
-        if sys.platform != 'fictional':
-            x = ''
-        else:
-            x = 0
-        reveal_type(x)  # E: Revealed type is 'builtins.str'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysPlatformInFunctionImport]
-import sys
-def foo() -> None:
-    if sys.platform != 'fictional':
-        import a
-    else:
-        import b as a
-    a.x
-[file a.py]
-x = 1
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testCustomSysVersionInfo]
-# flags: --python-version 3.2
-import sys
-if sys.version_info == (3, 2):
-    x = "foo"
-else:
-    x = 3
-reveal_type(x)  # E: Revealed type is 'builtins.str'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testCustomSysVersionInfo2]
-# flags: --python-version 3.1
-import sys
-if sys.version_info == (3, 2):
-    x = "foo"
-else:
-    x = 3
-reveal_type(x)  # E: Revealed type is 'builtins.int'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testCustomSysPlatform]
-# flags: --platform linux
-import sys
-if sys.platform == 'linux':
-    x = "foo"
-else:
-    x = 3
-reveal_type(x)  # E: Revealed type is 'builtins.str'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testCustomSysPlatform2]
-# flags: --platform win32
-import sys
-if sys.platform == 'linux':
-    x = "foo"
-else:
-    x = 3
-reveal_type(x)  # E: Revealed type is 'builtins.int'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testCustomSysPlatformStartsWith]
-# flags: --platform win32
-import sys
-if sys.platform.startswith('win'):
-    x = "foo"
-else:
-    x = 3
-reveal_type(x)  # E: Revealed type is 'builtins.str'
-[builtins fixtures/ops.pyi]
-[out]
diff --git a/test-data/unit/check-unsupported.test b/test-data/unit/check-unsupported.test
deleted file mode 100644
index 7f36e69..0000000
--- a/test-data/unit/check-unsupported.test
+++ /dev/null
@@ -1,15 +0,0 @@
--- Tests for unsupported features
-
-
-[case testDecorateOverloadedFunction]
-# The error messages are not the most informative ever.
-def d(x): pass
- at d
-def f(): pass
-def f(x): pass # E
-def g(): pass
- at d # E
-def g(x): pass
-[out]
-main:5: error: Name 'f' already defined
-main:7: error: Name 'g' already defined
diff --git a/test-data/unit/check-varargs.test b/test-data/unit/check-varargs.test
deleted file mode 100644
index 89120bf..0000000
--- a/test-data/unit/check-varargs.test
+++ /dev/null
@@ -1,590 +0,0 @@
--- Test cases for the type checker related to varargs.
-
-
--- Varargs within body
--- -------------------
-
-
-[case testVarArgsWithinFunction]
-from typing import Tuple
-def f( *b: 'B') -> None:
-    ab = None # type: Tuple[B, ...]
-    ac = None # type: Tuple[C, ...]
-    b = ac # E: Incompatible types in assignment (expression has type Tuple[C, ...], variable has type Tuple[B, ...])
-    ac = b # E: Incompatible types in assignment (expression has type Tuple[B, ...], variable has type Tuple[C, ...])
-    b = ab
-    ab = b
-
-class B: pass
-class C: pass
-[builtins fixtures/tuple.pyi]
-[out]
-
-
-[case testVarArgsAreTuple]
-from typing import Tuple, Sequence
-def want_tuple(types: Tuple[type, ...]): pass
-def want_sequence(types: Sequence[type]): pass
-def test(*t: type) -> None:
-    want_tuple(t)
-    want_sequence(t)
-[builtins fixtures/tuple.pyi]
-[out]
-
-
--- Calling varargs function
--- ------------------------
-
-
-[case testCallingVarArgsFunction]
-
-a = None # type: A
-b = None # type: B
-c = None # type: C
-
-f(c)       # E: Argument 1 to "f" has incompatible type "C"; expected "A"
-f(a, b, c) # E: Argument 3 to "f" has incompatible type "C"; expected "A"
-f(g())     # E: "g" does not return a value
-f(a, g())  # E: "g" does not return a value
-f()
-f(a)
-f(b)
-f(a, b, a, b)
-
-def f( *a: 'A') -> None: pass
-
-def g() -> None: pass
-
-class A: pass
-class B(A): pass
-class C: pass
-[builtins fixtures/list.pyi]
-
-[case testCallingVarArgsFunctionWithAlsoNormalArgs]
-
-a = None # type: A
-b = None # type: B
-c = None # type: C
-
-f(a)       # E: Argument 1 to "f" has incompatible type "A"; expected "C"
-f(c, c)    # E: Argument 2 to "f" has incompatible type "C"; expected "A"
-f(c, a, b, c)  # E: Argument 4 to "f" has incompatible type "C"; expected "A"
-f(c)
-f(c, a)
-f(c, b, b, a, b)
-
-def f(a: 'C', *b: 'A') -> None: pass
-
-class A: pass
-class B(A): pass
-class C: pass
-[builtins fixtures/list.pyi]
-
-[case testCallingVarArgsFunctionWithDefaultArgs]
-
-a = None # type: A
-b = None # type: B
-c = None # type: C
-
-f(a)           # E: Argument 1 to "f" has incompatible type "A"; expected "C"
-f(c, c)        # E: Argument 2 to "f" has incompatible type "C"; expected "A"
-f(c, a, b, c)  # E: Argument 4 to "f" has incompatible type "C"; expected "A"
-f()
-f(c)
-f(c, a)
-f(c, b, b, a, b)
-
-def f(a: 'C' = None, *b: 'A') -> None:
-    pass
-
-class A: pass
-class B(A): pass
-class C: pass
-[builtins fixtures/list.pyi]
-
-[case testCallVarargsFunctionWithIterable]
-from typing import Iterable
-it1 = None  # type: Iterable[int]
-it2 = None  # type: Iterable[str]
-def f(*x: int) -> None: pass
-f(*it1)
-f(*it2) # E: Argument 1 to "f" has incompatible type *Iterable[str]; expected "int"
-[builtins fixtures/for.pyi]
-
-[case testCallVarargsFunctionWithIterableAndPositional]
-# flags: --fast-parser
-from typing import Iterable
-it1 = None  # type: Iterable[int]
-def f(*x: int) -> None: pass
-f(*it1, 1, 2)
-f(*it1, 1, *it1, 2)
-f(*it1, '') # E: Argument 2 to "f" has incompatible type "str"; expected "int"
-[builtins fixtures/for.pyi]
-
-[case testCallVarargsFunctionWithTupleAndPositional]
-# flags: --fast-parser
-def f(*x: int) -> None: pass
-it1 = (1, 2)
-f(*it1, 1, 2)
-f(*it1, 1, *it1, 2)
-f(*it1, '') # E: Argument 2 to "f" has incompatible type "str"; expected "int"
-[builtins fixtures/for.pyi]
-
-
--- Calling varargs function + type inference
--- -----------------------------------------
-
-
-[case testTypeInferenceWithCalleeVarArgs]
-from typing import TypeVar
-T = TypeVar('T')
-a = None # type: A
-b = None # type: B
-c = None # type: C
-o = None # type: object
-
-a = f(o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-b = f(b, a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(a, b) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-o = f()
-a = f(a)
-a = f(b)
-a = f(a, b, a)
-o = f(a, b, o)
-c = f(c)
-
-def f( *a: T) -> T:
-    pass
-
-class A: pass
-class B(A): pass
-class C: pass
-[builtins fixtures/list.pyi]
-
-[case testTypeInferenceWithCalleeVarArgsAndDefaultArgs]
-from typing import TypeVar
-T = TypeVar('T')
-a = None # type: A
-o = None # type: object
-
-a = f(o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = f(a, o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = f(a, a, o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = f(a, a, a, o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-a = f(a)
-a = f(a, a)
-a = f(a, a, a)
-
-def f(a: T, b: T = None, *c: T) -> T:
-    pass
-
-class A: pass
-[builtins fixtures/list.pyi]
-
-
--- Calling normal function with varargs
--- ------------------------------------
-
-
-[case testCallingWithListVarArgs]
-from typing import List, Any
-aa = None # type: List[A]
-ab = None # type: List[B]
-a = None # type: A
-b = None # type: B
-
-f(*aa)    # Fail
-f(a, *ab) # Ok
-f(a, b)
-(Any(f))(*aa)     # IDEA: Move to check-dynamic?
-(Any(f))(a, *ab)  # IDEA: Move to check-dynamic?
-
-def f(a: 'A', b: 'B') -> None:
-    pass
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-main:7: error: Argument 1 to "f" has incompatible type *List[A]; expected "B"
-
-[case testCallingWithTupleVarArgs]
-
-a = None # type: A
-b = None # type: B
-c = None # type: C
-cc = None # type: CC
-
-f(*(a, b, b)) # E: Argument 1 to "f" has incompatible type *"Tuple[A, B, B]"; expected "C"
-f(*(b, b, c)) # E: Argument 1 to "f" has incompatible type *"Tuple[B, B, C]"; expected "A"
-f(a, *(b, b)) # E: Argument 2 to "f" has incompatible type *"Tuple[B, B]"; expected "C"
-f(b, *(b, c)) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(*(a, b))    # E: Too few arguments for "f"
-f(*(a, b, c, c)) # E: Too many arguments for "f"
-f(a, *(b, c, c)) # E: Too many arguments for "f"
-f(*(a, b, c))
-f(a, *(b, c))
-f(a, b, *(c,))
-f(a, *(b, cc))
-
-def f(a: 'A', b: 'B', c: 'C') -> None: pass
-
-class A: pass
-class B: pass
-class C: pass
-class CC(C): pass
-[builtins fixtures/tuple.pyi]
-
-[case testInvalidVarArg]
-
-a = None # type: A
-
-f(*None)
-f(*a)    # E: List or tuple expected as variable arguments
-f(*(a,))
-
-def f(a: 'A') -> None:
-    pass
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-
--- Calling varargs function with varargs
--- -------------------------------------
-
-
-[case testCallingVarArgsFunctionWithListVarArgs]
-from typing import List
-aa, ab, a, b = None, None, None, None # type: (List[A], List[B], A, B)
-f(*aa)           # Fail
-f(a, *aa)        # Fail
-f(b, *ab)        # Fail
-f(a, a, *ab)     # Fail
-f(a, b, *aa)     # Fail
-f(b, b, *ab)     # Fail
-g(*ab)           # Fail
-f(a, *ab)
-f(a, b, *ab)
-f(a, b, b, *ab)
-g(*aa)
-
-def f(a: 'A', *b: 'B') -> None: pass
-def g(a: 'A', *b: 'A') -> None: pass
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-main:3: error: Argument 1 to "f" has incompatible type *List[A]; expected "B"
-main:4: error: Argument 2 to "f" has incompatible type *List[A]; expected "B"
-main:5: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-main:6: error: Argument 2 to "f" has incompatible type "A"; expected "B"
-main:7: error: Argument 3 to "f" has incompatible type *List[A]; expected "B"
-main:8: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-main:9: error: Argument 1 to "g" has incompatible type *List[B]; expected "A"
-
-[case testCallingVarArgsFunctionWithTupleVarArgs]
-
-a, b, c, cc = None, None, None, None # type: (A, B, C, CC)
-
-f(*(b, b, b))   # E: Argument 1 to "f" has incompatible type *"Tuple[B, B, B]"; expected "A"
-f(*(a, a, b))   # E: Argument 1 to "f" has incompatible type *"Tuple[A, A, B]"; expected "B"
-f(*(a, b, a))   # E: Argument 1 to "f" has incompatible type *"Tuple[A, B, A]"; expected "B"
-f(a, *(a, b))   # E: Argument 2 to "f" has incompatible type *"Tuple[A, B]"; expected "B"
-f(b, *(b, b))   # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(b, b, *(b,))  # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(a, a, *(b,))  # E: Argument 2 to "f" has incompatible type "A"; expected "B"
-f(a, b, *(a,))  # E: Argument 3 to "f" has incompatible type *"Tuple[A]"; expected "B"
-f(*())          # E: Too few arguments for "f"
-f(*(a, b, b))
-f(a, *(b, b))
-f(a, b, *(b,))
-
-def f(a: 'A', *b: 'B') -> None:
-    pass
-
-class A: pass
-class B: pass
-class C: pass
-class CC(C): pass
-[builtins fixtures/list.pyi]
-
-
--- Varargs special cases
--- ---------------------
-
-
-[case testDynamicVarArg]
-from typing import Any
-d, a = None, None # type: (Any, A)
-f(a, a, *d) # Fail
-f(a, *d)    # Fail
-f(*d)       # Ok
-
-g(*d)
-g(a, *d)
-g(a, a, *d)
-
-def f(a: 'A') -> None: pass
-def g(a: 'A', *b: 'A') -> None: pass
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-main:3: error: Too many arguments for "f"
-main:4: error: Too many arguments for "f"
-
-[case testListVarArgsAndSubtyping]
-from typing import List
-aa = None # type: List[A]
-ab = None # type: List[B]
-
-g(*aa) # E: Argument 1 to "g" has incompatible type *List[A]; expected "B"
-f(*aa)
-f(*ab)
-g(*ab)
-
-def f( *a: 'A') -> None:
-    pass
-
-def g( *a: 'B') -> None:
-    pass
-
-class A: pass
-class B(A): pass
-[builtins fixtures/list.pyi]
-
-[case testCallerVarArgsAndDefaultArgs]
-
-a, b = None, None # type: (A, B)
-f(*())        # Fail
-f(a, *[a])    # Fail
-f(a, b, *[a]) # Fail
-f(*(a, a, b)) # Fail
-f(*(a,))
-f(*(a, b))
-f(*(a, b, b, b))
-f(a, *[])
-f(a, *[b])
-f(a, *[b, b])
-
-def f(a: 'A', b: 'B' = None, *c: 'B') -> None:
-    pass
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-main:3: error: Too few arguments for "f"
-main:4: error: Argument 2 to "f" has incompatible type *List[A]; expected "B"
-main:5: error: Argument 3 to "f" has incompatible type *List[A]; expected "B"
-main:6: error: Argument 1 to "f" has incompatible type *"Tuple[A, A, B]"; expected "B"
-
-[case testVarArgsAfterKeywordArgInCall1]
-def f(x: int, y: str) -> None: pass
-f(x=1, *[2])
-[builtins fixtures/list.pyi]
-[out]
-main:2: error: "f" gets multiple values for keyword argument "x"
-main:2: error: Argument 2 to "f" has incompatible type *List[int]; expected "str"
-
-[case testVarArgsAfterKeywordArgInCall2]
-def f(x: int, y: str) -> None: pass
-f(y='x', *[1])
-[builtins fixtures/list.pyi]
-[out]
-main:2: error: "f" gets multiple values for keyword argument "y"
-main:2: error: Argument 2 to "f" has incompatible type *List[int]; expected "str"
-
-[case testVarArgsAfterKeywordArgInCall3]
-def f(x: int, y: str) -> None: pass
-f(y='x', *(1,))
-[builtins fixtures/list.pyi]
-
-[case testVarArgsAfterKeywordArgInCall4]
-def f(x: int, *, y: str) -> None: pass
-f(y='x', *[1])
-[builtins fixtures/list.pyi]
-
-[case testVarArgsAfterKeywordArgInCall5]
-def f(x: int, *, y: str) -> None: pass
-f(y='x', *(1,))
-[builtins fixtures/list.pyi]
-
-
--- Overloads + varargs
--- -------------------
-
-
-[case testIntersectionTypesAndVarArgs]
-from typing import overload
-a, b = None, None # type: (A, B)
-
-b = f()        # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(a)       # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(a, b)    # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(b)       # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = f(b, b)    # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = f(a, *[b]) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(*())     # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(*(a,))   # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(*(a, b)) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(*(b,))   # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = f(*(b, b)) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = f(*[b])    # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-a = f()
-a = f(a)
-a = f(a, b)
-b = f(b)
-b = f(b, b)
-a = f(a, *[b])
-a = f(*())
-a = f(*(a,))
-a = f(*(a, b))
-b = f(*(b,))
-b = f(*(b, b))
-b = f(*[b])
-
-class A: pass
-class B: pass
-
- at overload
-def f(a: A = None, *b: B) -> A: pass
-
- at overload
-def f(a: B, *b: B) -> B: pass
-[builtins fixtures/list.pyi]
-
-
--- Caller varargs + type inference
--- -------------------------------
-
-
-[case testCallerVarArgsListWithTypeInference]
-from typing import List, TypeVar, Tuple
-S = TypeVar('S')
-T = TypeVar('T')
-a, b, aa = None, None, None # type: (A, B, List[A])
-
-a, b = f(*aa)    # Fail
-b, b = f(*aa)    # Fail
-a, a = f(b, *aa) # Fail
-b, b = f(b, *aa) # Fail
-b, b = f(b, b, *aa) # Fail
-a, b = f(a, *a)  # Fail
-a, b = f(*a)     # Fail
-
-a, a = f(*aa)
-b, a = f(b, *aa)
-b, a = f(b, a, *aa)
-
-def f(a: S, *b: T) -> Tuple[S, T]:
-    pass
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-main:6: error: Argument 1 to "f" has incompatible type *List[A]; expected "B"
-main:7: error: Argument 1 to "f" has incompatible type *List[A]; expected "B"
-main:8: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-main:9: error: Argument 2 to "f" has incompatible type *List[A]; expected "B"
-main:10: error: Argument 3 to "f" has incompatible type *List[A]; expected "B"
-main:11: error: List or tuple expected as variable arguments
-main:12: error: List or tuple expected as variable arguments
-
-[case testCallerVarArgsTupleWithTypeInference]
-from typing import TypeVar, Tuple
-S = TypeVar('S')
-T = TypeVar('T')
-a, b = None, None # type: (A, B)
-
-a, a = f(*(a, b))   # E: Argument 1 to "f" has incompatible type *"Tuple[A, B]"; expected "A"
-b, b = f(a, *(b,))  # E: Argument 1 to "f" has incompatible type "A"; expected "B"
-a, a = f(*(a, b))   # E: Argument 1 to "f" has incompatible type *"Tuple[A, B]"; expected "A"
-b, b = f(a, *(b,))  # E: Argument 1 to "f" has incompatible type "A"; expected "B"
-a, b = f(*(a, b, b)) # E: Too many arguments for "f"
-
-a, b = f(*(a, b))
-a, b = f(a, *(b,))
-
-def f(a: S, b: T) -> Tuple[S, T]: pass
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testCallerVarargsAndComplexTypeInference]
-from typing import List, TypeVar, Generic, Tuple
-T = TypeVar('T')
-S = TypeVar('S')
-a, b = None, None # type: (A, B)
-ao = None # type: List[object]
-aa = None # type: List[A]
-ab = None # type: List[B]
-
-a, aa = G().f(*[a])  # Fail
-aa, a = G().f(*[a])  # Fail
-ab, aa = G().f(*[a]) # Fail
-
-ao, ao = G().f(*[a]) # E: Incompatible types in assignment (expression has type List[None], variable has type List[object])
-aa, aa = G().f(*[a]) # E: Incompatible types in assignment (expression has type List[None], variable has type List[A])
-
-class G(Generic[T]):
-    def f(self, *a: S) -> Tuple[List[S], List[T]]:
-        pass
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-main:9: error: Incompatible types in assignment (expression has type List[A], variable has type "A")
-main:9: error: Incompatible types in assignment (expression has type List[None], variable has type List[A])
-main:10: error: Incompatible types in assignment (expression has type List[None], variable has type "A")
-main:11: error: Incompatible types in assignment (expression has type List[None], variable has type List[A])
-main:11: error: Argument 1 to "f" of "G" has incompatible type *List[A]; expected "B"
-
-
--- Comment signatures
--- ------------------
-
-
-[case testVarArgsAndCommentSignature]
-import typing
-def f(*x): # type: (*int) -> None
-    pass
-f(1)
-f(1, 2)
-f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-f(1, '') # E: Argument 2 to "f" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-
-
--- Subtyping
--- ---------
-
-
-[case testVarArgsFunctionSubtyping]
-from typing import Callable
-x = None # type: Callable[[int], None]
-def f(*x: int) -> None: pass
-def g(*x: str) -> None: pass
-x = f
-x = g # E: Incompatible types in assignment (expression has type Callable[[StarArg(str)], None], variable has type Callable[[int], None])
-[builtins fixtures/list.pyi]
-[out]
-
-
--- Decorated method where self is implied by *args
--- -----------------------------------------------
-
-[case testVarArgsCallableSelf]
-from typing import Callable
-def cm(func) -> Callable[..., None]: pass
-class C:
-    @cm
-    def foo(self) -> None: pass
-C().foo()
-C().foo(1)  # The decorator's return type says this should be okay
diff --git a/test-data/unit/check-warnings.test b/test-data/unit/check-warnings.test
deleted file mode 100644
index ab5f66b..0000000
--- a/test-data/unit/check-warnings.test
+++ /dev/null
@@ -1,132 +0,0 @@
--- Test cases for warning generation.
-
--- Redundant casts
--- ---------------
-
-[case testRedundantCast]
-# flags: --warn-redundant-casts
-from typing import cast
-a = 1
-b = cast(str, a)
-c = cast(int, a)
-[out]
-main:5: note: Redundant cast to "int"
-
-[case testRedundantCastWithIsinstance]
-# flags: --warn-redundant-casts
-from typing import cast, Union
-x = 1  # type: Union[int, str]
-if isinstance(x, str):
-    cast(str, x)
-[builtins fixtures/isinstance.pyi]
-[out]
-main:5: note: Redundant cast to "str"
-
-[case testCastToSuperclassNotRedundant]
-# flags: --warn-redundant-casts
-from typing import cast, TypeVar, List
-T = TypeVar('T')
-def add(xs: List[T], ys: List[T]) -> List[T]: pass
-class A: pass
-class B(A): pass
-a = A()
-b = B()
-# Without the cast, the following line would fail to type check.
-c = add([cast(A, b)], [a])
-[builtins fixtures/list.pyi]
-
-
--- Unused 'type: ignore' comments
--- ------------------------------
-
-[case testUnusedTypeIgnore]
-# flags: --warn-unused-ignores
-a = 1
-a = 'a' # type: ignore
-a = 2 # type: ignore # N: unused 'type: ignore' comment
-a = 'b' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testUnusedTypeIgnoreImport]
-# flags: --warn-unused-ignores
-import banana # type: ignore
-import m # type: ignore
-from m import * # type: ignore
-[file m.py]
-pass
-[out]
-main:3: note: unused 'type: ignore' comment
-main:4: note: unused 'type: ignore' comment
-
-
--- No return
--- ---------
-
-[case testNoReturn]
-# flags: --warn-no-return
-def f() -> int:
-    pass
-
-def g() -> int:
-    if bool():
-        return 1
-[builtins fixtures/list.pyi]
-[out]
-main:5: note: Missing return statement
-
-[case testNoReturnWhile]
-# flags: --warn-no-return
-def h() -> int:
-    while True:
-        if bool():
-            return 1
-
-def i() -> int:
-    while 1:
-        if bool():
-            return 1
-        if bool():
-            break
-
-def j() -> int:
-    while 1:
-        if bool():
-            return 1
-        if bool():
-            continue
-[builtins fixtures/list.pyi]
-[out]
-main:7: note: Missing return statement
-
-[case testNoReturnExcept]
-# flags: --warn-no-return
-def f() -> int:
-    try:
-        return 1
-    except:
-        pass
-def g() -> int:
-    try:
-        pass
-    except:
-        return 1
-    else:
-        return 1
-def h() -> int:
-    try:
-        pass
-    except:
-        pass
-    else:
-        pass
-    finally:
-        return 1
-[builtins fixtures/exception.pyi]
-[out]
-main:2: note: Missing return statement
-
-[case testNoReturnEmptyBodyWithDocstring]
-def f() -> int:
-    """Return the number of peppers."""
-    # This might be an @abstractmethod, for example
-    pass
-[out]
diff --git a/test-data/unit/cmdline.test b/test-data/unit/cmdline.test
deleted file mode 100644
index 9a17285..0000000
--- a/test-data/unit/cmdline.test
+++ /dev/null
@@ -1,479 +0,0 @@
--- Tests for command line parsing
--- ------------------------------
---
--- The initial line specifies the command line, in the format
---
---   # cmd: mypy <options>
-
-
--- Directories/packages on the command line
--- ----------------------------------------
-
-[case testCmdlinePackage]
-# cmd: mypy pkg
-[file pkg/__init__.py]
-[file pkg/a.py]
-undef
-[file pkg/subpkg/__init__.py]
-[file pkg/subpkg/a.py]
-undef
-import pkg.subpkg.a
-[out]
-pkg/a.py:1: error: Name 'undef' is not defined
-pkg/subpkg/a.py:1: error: Name 'undef' is not defined
-
-[case testCmdlinePackageSlash]
-# cmd: mypy pkg/
-[file pkg/__init__.py]
-[file pkg/a.py]
-undef
-[file pkg/subpkg/__init__.py]
-[file pkg/subpkg/a.py]
-undef
-import pkg.subpkg.a
-[out]
-pkg/a.py:1: error: Name 'undef' is not defined
-pkg/subpkg/a.py:1: error: Name 'undef' is not defined
-
-[case testCmdlineNonPackage]
-# cmd: mypy dir
-[file dir/a.py]
-undef
-[file dir/subdir/a.py]
-undef
-[out]
-dir/a.py:1: error: Name 'undef' is not defined
-
-[case testCmdlineNonPackageSlash]
-# cmd: mypy dir/
-[file dir/a.py]
-undef
-[file dir/subdir/a.py]
-undef
-[out]
-dir/a.py:1: error: Name 'undef' is not defined
-
-[case testCmdlinePackageContainingSubdir]
-# cmd: mypy pkg
-[file pkg/__init__.py]
-[file pkg/a.py]
-undef
-[file pkg/subdir/a.py]
-undef
-[out]
-pkg/a.py:1: error: Name 'undef' is not defined
-
-[case testCmdlineNonPackageContainingPackage]
-# cmd: mypy dir
-[file dir/a.py]
-undef
-import subpkg.a
-[file dir/subpkg/__init__.py]
-[file dir/subpkg/a.py]
-undef
-[out]
-dir/subpkg/a.py:1: error: Name 'undef' is not defined
-dir/a.py:1: error: Name 'undef' is not defined
-
-[case testBadFileEncoding]
-# cmd: mypy a.py
-[file a.py]
-# coding: uft-8
-[out]
-mypy: can't decode file 'a.py': unknown encoding: uft-8
-
-[case testCannotIgnoreDuplicateModule]
-# cmd: mypy one/mod/__init__.py two/mod/__init__.py
-[file one/mod/__init__.py]
-# type: ignore
-[file two/mod/__init__.py]
-# type: ignore
-[out]
-two/mod/__init__.py: error: Duplicate module named 'mod'
-
-[case testFlagsFile]
-# cmd: mypy @flagsfile
-[file flagsfile]
--2
-main.py
-[file main.py]
-def f():
-    try:
-        1/0
-    except ZeroDivisionError, err:
-        print err
-
-[case testConfigFile]
-# cmd: mypy main.py
-[file mypy.ini]
-[[mypy]
-python_version = 2.7
-[file main.py]
-def f():
-    try:
-        1/0
-    except ZeroDivisionError, err:
-        print err
-
-[case testAltConfigFile]
-# cmd: mypy --config-file config.ini main.py
-[file config.ini]
-[[mypy]
-python_version = 2.7
-[file main.py]
-def f():
-    try:
-        1/0
-    except ZeroDivisionError, err:
-        print err
-
-[case testPerFileConfigSection]
-# cmd: mypy x.py y.py z.py
-[file mypy.ini]
-[[mypy]
-hide_error_context = True
-disallow_untyped_defs = True
-[[mypy-y*]
-disallow_untyped_defs = False
-[[mypy-z*]
-disallow_untyped_calls = True
-[file x.py]
-def f(a):
-    pass
-def g(a: int) -> int:
-    return f(a)
-[file y.py]
-def f(a):
-    pass
-def g(a: int) -> int:
-    return f(a)
-[file z.py]
-def f(a):
-    pass
-def g(a: int) -> int:
-    return f(a)
-[out]
-z.py:1: error: Function is missing a type annotation
-z.py:4: error: Call to untyped function "f" in typed context
-x.py:1: error: Function is missing a type annotation
-
-[case testPerFileConfigSectionMultipleMatches]
-# cmd: mypy xx.py xy.py yx.py yy.py
-[file mypy.ini]
-[[mypy]
-hide_error_context = True
-[[mypy-*x*]
-disallow_untyped_defs = True
-[[mypy-*y*]
-disallow_untyped_calls = True
-[file xx.py]
-def f(a): pass
-def g(a: int) -> int: return f(a)
-[file xy.py]
-def f(a): pass
-def g(a: int) -> int: return f(a)
-[file yx.py]
-def f(a): pass
-def g(a: int) -> int: return f(a)
-[file yy.py]
-def f(a): pass
-def g(a: int) -> int: return f(a)
-[out]
-yy.py:2: error: Call to untyped function "f" in typed context
-yx.py:1: error: Function is missing a type annotation
-yx.py:2: error: Call to untyped function "f" in typed context
-xy.py:1: error: Function is missing a type annotation
-xy.py:2: error: Call to untyped function "f" in typed context
-xx.py:1: error: Function is missing a type annotation
-
-[case testMultipleGlobConfigSection]
-# cmd: mypy x.py y.py z.py
-[file mypy.ini]
-[[mypy]
-hide_error_context = True
-[[mypy-x*,z*]
-disallow_untyped_defs = True
-[file x.py]
-def f(a): pass
-[file y.py]
-def f(a): pass
-[file z.py]
-def f(a): pass
-[out]
-z.py:1: error: Function is missing a type annotation
-x.py:1: error: Function is missing a type annotation
-
-[case testConfigErrorNoSection]
-# cmd: mypy -c pass
-[file mypy.ini]
-[out]
-mypy.ini: No [mypy] section in config file
-
-[case testConfigErrorUnknownFlag]
-# cmd: mypy -c pass
-[file mypy.ini]
-[[mypy]
-bad = 0
-[out]
-mypy.ini: [mypy]: Unrecognized option: bad = 0
-
-[case testConfigErrorUnknownReport]
-# cmd: mypy -c pass
-[file mypy.ini]
-[[mypy]
-bad_report = .
-[out]
-mypy.ini: [mypy]: Unrecognized report type: bad_report
-
-[case testConfigErrorBadBoolean]
-# cmd: mypy -c pass
-[file mypy.ini]
-[[mypy]
-ignore_missing_imports = nah
-[out]
-mypy.ini: [mypy]: ignore_missing_imports: Not a boolean: nah
-
-[case testConfigErrorNotPerFile]
-# cmd: mypy -c pass
-[file mypy.ini]
-[[mypy]
-[[mypy-*]
-strict_optional = True
-[out]
-mypy.ini: [mypy-*]: Per-module sections should only specify per-module flags (strict_optional)
-
-[case testCoberturaParser]
-# cmd: mypy --cobertura-xml-report build pkg
-[file pkg/__init__.py]
-[file pkg/a.py]
-from typing import Dict
-
-def foo() -> Dict:
-  z = {'hello': 'world'}
-  return z
-[file pkg/subpkg/__init__.py]
-[file pkg/subpkg/a.py]
-def bar() -> str:
-  return 'world'
-def untyped_function():
-  return 42
-[outfile build/cobertura.xml]
-<coverage timestamp="$TIMESTAMP" version="$VERSION" line-rate="0.8000" branch-rate="0">
-  <sources>
-    <source>$PWD</source>
-  </sources>
-  <packages>
-    <package complexity="1.0" name="pkg" branch-rate="0" line-rate="1.0000">
-      <classes>
-        <class complexity="1.0" filename="pkg/__init__.py" name="__init__.py" branch-rate="0" line-rate="1.0">
-          <methods/>
-          <lines/>
-        </class>
-        <class complexity="1.0" filename="pkg/a.py" name="a.py" branch-rate="0" line-rate="1.0000">
-          <methods/>
-          <lines>
-            <line branch="true" hits="1" number="3" precision="imprecise" condition-coverage="50% (1/2)"/>
-            <line branch="false" hits="1" number="4" precision="precise"/>
-            <line branch="false" hits="1" number="5" precision="precise"/>
-          </lines>
-        </class>
-      </classes>
-    </package>
-    <package complexity="1.0" name="pkg.subpkg" branch-rate="0" line-rate="0.5000">
-      <classes>
-        <class complexity="1.0" filename="pkg/subpkg/__init__.py" name="__init__.py" branch-rate="0" line-rate="1.0">
-          <methods/>
-          <lines/>
-        </class>
-        <class complexity="1.0" filename="pkg/subpkg/a.py" name="a.py" branch-rate="0" line-rate="0.5000">
-          <methods/>
-          <lines>
-            <line branch="false" hits="1" number="1" precision="precise"/>
-            <line branch="false" hits="0" number="3" precision="any"/>
-          </lines>
-        </class>
-      </classes>
-    </package>
-  </packages>
-</coverage>
-
-[case testConfigMypyPath]
-# cmd: mypy file.py
-[file mypy.ini]
-[[mypy]
-mypy_path =
-    foo:bar
-    , baz
-[file foo/foo.pyi]
-def foo(x: int) -> str: ...
-[file bar/bar.pyi]
-def bar(x: str) -> list: ...
-[file baz/baz.pyi]
-def baz(x: list) -> dict: ...
-[file file.py]
-import no_stubs
-from foo import foo
-from bar import bar
-from baz import baz
-baz(bar(foo(42)))
-baz(bar(foo('oof')))
-[out]
-file.py:1: error: Cannot find module named 'no_stubs'
-file.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-file.py:6: error: Argument 1 to "foo" has incompatible type "str"; expected "int"
-
-[case testIgnoreErrorsConfig]
-# cmd: mypy x.py y.py
-[file mypy.ini]
-[[mypy]
-[[mypy-x]
-ignore_errors = True
-[file x.py]
-"" + 0
-[file y.py]
-"" + 0
-[out]
-y.py:1: error: Unsupported operand types for + ("str" and "int")
-
-[case testConfigFollowImportsNormal]
-# cmd: mypy main.py
-[file main.py]
-from a import x
-x + 0
-x + ''  # E
-import a
-a.x + 0
-a.x + ''  # E
-a.y  # E
-a + 0  # E
-[file mypy.ini]
-[[mypy]
-follow_imports = normal
-[file a.py]
-x = 0
-x += ''  # Error reported here
-[out]
-a.py:2: error: Unsupported operand types for + ("int" and "str")
-main.py:3: error: Unsupported operand types for + ("int" and "str")
-main.py:6: error: Unsupported operand types for + ("int" and "str")
-main.py:7: error: "module" has no attribute "y"
-main.py:8: error: Unsupported operand types for + ("module" and "int")
-
-[case testConfigFollowImportsSilent]
-# cmd: mypy main.py
-[file main.py]
-from a import x
-x + ''
-import a
-a.x + ''
-a.y
-a + 0
-[file mypy.ini]
-[[mypy]
-follow_imports = silent
-[file a.py]
-x = 0
-x += ''  # No error reported
-[out]
-main.py:2: error: Unsupported operand types for + ("int" and "str")
-main.py:4: error: Unsupported operand types for + ("int" and "str")
-main.py:5: error: "module" has no attribute "y"
-main.py:6: error: Unsupported operand types for + ("module" and "int")
-
-[case testConfigFollowImportsSkip]
-# cmd: mypy main.py
-[file main.py]
-from a import x
-reveal_type(x)  # Expect Any
-import a
-reveal_type(a.x)  # Expect Any
-[file mypy.ini]
-[[mypy]
-follow_imports = skip
-[file a.py]
-/  # No error reported
-[out]
-main.py:2: error: Revealed type is 'Any'
-main.py:4: error: Revealed type is 'Any'
-
-[case testConfigFollowImportsError]
-# cmd: mypy main.py
-[file main.py]
-from a import x
-reveal_type(x)  # Expect Any
-import a  # Error reported here
-reveal_type(a.x)  # Expect Any
-[file mypy.ini]
-[[mypy]
-follow_imports = error
-[file a.py]
-/  # No error reported
-[out]
-main.py:1: note: Import of 'a' ignored
-main.py:1: note: (Using --follow-imports=error, module not passed on command line)
-main.py:2: error: Revealed type is 'Any'
-main.py:4: error: Revealed type is 'Any'
-
-[case testConfigFollowImportsSelective]
-# cmd: mypy main.py
-[file mypy.ini]
-[[mypy]
-[[mypy-normal]
-follow_imports = normal
-[[mypy-silent]
-follow_imports = silent
-[[mypy-skip]
-follow_imports = skip
-[[mypy-error]
-follow_imports = error
-[file main.py]
-import normal
-import silent
-import skip
-import error
-reveal_type(normal.x)
-reveal_type(silent.x)
-reveal_type(skip)
-reveal_type(error)
-[file normal.py]
-x = 0
-x += ''
-[file silent.py]
-x = 0
-x += ''
-[file skip.py]
-bla bla
-[file error.py]
-bla bla
-[out]
-main.py:4: note: Import of 'error' ignored
-main.py:4: note: (Using --follow-imports=error, module not passed on command line)
-normal.py:2: error: Unsupported operand types for + ("int" and "str")
-main.py:5: error: Revealed type is 'builtins.int'
-main.py:6: error: Revealed type is 'builtins.int'
-main.py:7: error: Revealed type is 'Any'
-main.py:8: error: Revealed type is 'Any'
-
-[case testConfigSilentMissingImportsOff]
-# cmd: mypy main.py
-[file main.py]
-import missing  # Expect error here
-reveal_type(missing.x)  # Expect Any
-[file mypy.ini]
-[[mypy]
-ignore_missing_imports = False
-[out]
-main.py:1: error: Cannot find module named 'missing'
-main.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main.py:2: error: Revealed type is 'Any'
-
-[case testConfigSilentMissingImportsOn]
-# cmd: mypy main.py
-[file main.py]
-import missing  # No error here
-reveal_type(missing.x)  # Expect Any
-[file mypy.ini]
-[[mypy]
-ignore_missing_imports = True
-[out]
-main.py:2: error: Revealed type is 'Any'
diff --git a/test-data/unit/fixtures/__new__.pyi b/test-data/unit/fixtures/__new__.pyi
deleted file mode 100644
index 4e2cc57..0000000
--- a/test-data/unit/fixtures/__new__.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-# builtins stub with object.__new__
-
-class object:
-    def __init__(self) -> None: pass
-
-    def __new__(cls): pass
-
-class type:
-    def __init__(self, x) -> None: pass
-
-class int: pass
-class bool: pass
-class str: pass
-class function: pass
diff --git a/test-data/unit/fixtures/alias.pyi b/test-data/unit/fixtures/alias.pyi
deleted file mode 100644
index 5909cb6..0000000
--- a/test-data/unit/fixtures/alias.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# Builtins test fixture with a type alias 'bytes'
-
-class object:
-    def __init__(self) -> None: pass
-class type:
-    def __init__(self, x) -> None: pass
-
-class int: pass
-class str: pass
-class function: pass
-
-bytes = str
diff --git a/test-data/unit/fixtures/args.pyi b/test-data/unit/fixtures/args.pyi
deleted file mode 100644
index e4a6ffe..0000000
--- a/test-data/unit/fixtures/args.pyi
+++ /dev/null
@@ -1,29 +0,0 @@
-# Builtins stub used to support *args, **kwargs.
-
-from typing import TypeVar, Generic, Iterable, Tuple, Dict, Any, overload
-
-Tco = TypeVar('Tco', covariant=True)
-T = TypeVar('T')
-S = TypeVar('S')
-
-class object:
-    def __init__(self) -> None: pass
-    def __eq__(self, o: object) -> bool: pass
-    def __ne__(self, o: object) -> bool: pass
-
-class type:
-    @overload
-    def __init__(self, o: object) -> None: pass
-    @overload
-    def __init__(self, name: str, bases: Tuple[type, ...], dict: Dict[str, Any]) -> None: pass
-    def __call__(self, *args: Any, **kwargs: Any) -> Any: pass
-
-class tuple(Iterable[Tco], Generic[Tco]): pass
-class dict(Generic[T, S]): pass
-
-class int:
-    def __eq__(self, o: object) -> bool: pass
-class str: pass
-class bool: pass
-class function: pass
-class module: pass
diff --git a/test-data/unit/fixtures/async_await.pyi b/test-data/unit/fixtures/async_await.pyi
deleted file mode 100644
index 7a166a0..0000000
--- a/test-data/unit/fixtures/async_await.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-import typing
-class object:
-    def __init__(self): pass
-class type: pass
-class function: pass
-class int: pass
-class str: pass
-class list: pass
-class tuple: pass
diff --git a/test-data/unit/fixtures/bool.pyi b/test-data/unit/fixtures/bool.pyi
deleted file mode 100644
index 8ec3fdd..0000000
--- a/test-data/unit/fixtures/bool.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-# builtins stub used in boolean-related test cases.
-
-from typing import builtinclass
-
- at builtinclass
-class object:
-    def __init__(self) -> None: pass
-
-class type: pass
-class tuple: pass
-class function: pass
-class bool: pass
-class int: pass
-class str: pass
diff --git a/test-data/unit/fixtures/callable.pyi b/test-data/unit/fixtures/callable.pyi
deleted file mode 100644
index ae58648..0000000
--- a/test-data/unit/fixtures/callable.pyi
+++ /dev/null
@@ -1,26 +0,0 @@
-from typing import Generic, Tuple, TypeVar, Union
-
-T = TypeVar('T')
-
-class object:
-    def __init__(self) -> None: pass
-
-class type:
-    def __init__(self, x) -> None: pass
-
-class tuple(Generic[T]): pass
-
-class function: pass
-
-def isinstance(x: object, t: Union[type, Tuple[type, ...]]) -> bool: pass
-
-def callable(x: object) -> bool: pass
-
-class int:
-    def __add__(self, other: 'int') -> 'int': pass
-    def __eq__(self, other: 'int') -> 'bool': pass
-class float: pass
-class bool(int): pass
-class str:
-    def __add__(self, other: 'str') -> 'str': pass
-    def __eq__(self, other: 'str') -> bool: pass
diff --git a/test-data/unit/fixtures/classmethod.pyi b/test-data/unit/fixtures/classmethod.pyi
deleted file mode 100644
index 282839d..0000000
--- a/test-data/unit/fixtures/classmethod.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-import typing
-
-class object:
-    def __init__(self) -> None: pass
-
-class type:
-    def __init__(self, x) -> None: pass
-    def mro(self) -> typing.Any: pass
-
-class function: pass
-
-# Dummy definitions.
-classmethod = object()
-staticmethod = object()
-
-class int:
-    @classmethod
-    def from_bytes(cls, bytes: bytes, byteorder: str) -> int: pass
-
-class str: pass
-class bytes: pass
-class bool: pass
diff --git a/test-data/unit/fixtures/complex.pyi b/test-data/unit/fixtures/complex.pyi
deleted file mode 100644
index d4135be..0000000
--- a/test-data/unit/fixtures/complex.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# Builtins stub used for some float/complex test cases.
-
-class object:
-    def __init__(self): pass
-
-class type: pass
-class function: pass
-class int: pass
-class float: pass
-class complex: pass
-class str: pass
diff --git a/test-data/unit/fixtures/dict.pyi b/test-data/unit/fixtures/dict.pyi
deleted file mode 100644
index 5a78864..0000000
--- a/test-data/unit/fixtures/dict.pyi
+++ /dev/null
@@ -1,34 +0,0 @@
-# Builtins stub used in dictionary-related test cases.
-
-from typing import TypeVar, Generic, Iterable, Iterator, Mapping, Tuple, overload
-
-T = TypeVar('T')
-KT = TypeVar('KT')
-VT = TypeVar('VT')
-
-class object:
-    def __init__(self) -> None: pass
-
-class type: pass
-
-class dict(Iterable[KT], Mapping[KT, VT], Generic[KT, VT]):
-    @overload
-    def __init__(self, **kwargs: VT) -> None: pass
-    @overload
-    def __init__(self, arg: Iterable[Tuple[KT, VT]], **kwargs: VT) -> None: pass
-    def __setitem__(self, k: KT, v: VT) -> None: pass
-    def __iter__(self) -> Iterator[KT]: pass
-    def update(self, a: Mapping[KT, VT]) -> None: pass
-
-class int: # for convenience
-    def __add__(self, x: int) -> int: pass
-
-class str: pass # for keyword argument key type
-
-class list(Iterable[T], Generic[T]): # needed by some test cases
-    def __iter__(self) -> Iterator[T]: pass
-    def __mul__(self, x: int) -> list[T]: pass
-
-class tuple: pass
-class function: pass
-class float: pass
diff --git a/test-data/unit/fixtures/exception.pyi b/test-data/unit/fixtures/exception.pyi
deleted file mode 100644
index 05015ec..0000000
--- a/test-data/unit/fixtures/exception.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-
-class object:
-    def __init__(self): pass
-
-class type: pass
-class tuple: pass
-class function: pass
-class int: pass
-class str: pass
-class bool: pass
-
-class BaseException: pass
diff --git a/test-data/unit/fixtures/for.pyi b/test-data/unit/fixtures/for.pyi
deleted file mode 100644
index 4762806..0000000
--- a/test-data/unit/fixtures/for.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# builtins stub used in for statement test cases
-
-from typing import TypeVar, Generic, Iterable, Iterator, Generator
-from abc import abstractmethod, ABCMeta
-
-t = TypeVar('t')
-
-class object:
-    def __init__(self) -> None: pass
-
-class type: pass
-class tuple: pass
-class function: pass
-class bool: pass
-class int: pass # for convenience
-class str: pass # for convenience
-
-class list(Iterable[t], Generic[t]):
-    def __iter__(self) -> Iterator[t]: pass
diff --git a/test-data/unit/fixtures/function.pyi b/test-data/unit/fixtures/function.pyi
deleted file mode 100644
index 768ca90..0000000
--- a/test-data/unit/fixtures/function.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-from typing import builtinclass
-
- at builtinclass
-class object:
-    def __init__(self): pass
-
-class type: pass
-class function: pass
-class int: pass
-class str: pass
diff --git a/test-data/unit/fixtures/isinstance.pyi b/test-data/unit/fixtures/isinstance.pyi
deleted file mode 100644
index c155a97..0000000
--- a/test-data/unit/fixtures/isinstance.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-from typing import builtinclass, Tuple, TypeVar, Generic, Union
-
-T = TypeVar('T')
-
-class object:
-    def __init__(self) -> None: pass
-
-class type:
-    def __init__(self, x) -> None: pass
-
-class tuple(Generic[T]): pass
-
-class function: pass
-
-def isinstance(x: object, t: Union[type, Tuple[type, ...]]) -> bool: pass
-
-class int:
-    def __add__(self, other: 'int') -> 'int': pass
-class float: pass
-class bool(int): pass
-class str:
-    def __add__(self, other: 'str') -> 'str': pass
diff --git a/test-data/unit/fixtures/isinstancelist.pyi b/test-data/unit/fixtures/isinstancelist.pyi
deleted file mode 100644
index 4b35698..0000000
--- a/test-data/unit/fixtures/isinstancelist.pyi
+++ /dev/null
@@ -1,44 +0,0 @@
-from typing import builtinclass, Iterable, Iterator, Generic, TypeVar, List, Mapping, overload, Tuple
-
- at builtinclass
-class object:
-    def __init__(self) -> None: pass
-
- at builtinclass
-class type:
-    def __init__(self, x) -> None: pass
-
-class tuple: pass
-class function: pass
-
-def isinstance(x: object, t: type) -> bool: pass
-
- at builtinclass
-class int:
-    def __add__(self, x: int) -> int: pass
- at builtinclass
-class bool(int): pass
- at builtinclass
-class str:
-    def __add__(self, x: str) -> str: pass
-    def __getitem__(self, x: int) -> str: pass
-
-T = TypeVar('T')
-KT = TypeVar('KT')
-VT = TypeVar('VT')
-
-class list(Iterable[T], Generic[T]):
-    def __iter__(self) -> Iterator[T]: pass
-    def __mul__(self, x: int) -> list[T]: pass
-    def __setitem__(self, x: int, v: T) -> None: pass
-    def __getitem__(self, x: int) -> T: pass
-    def __add__(self, x: List[T]) -> T: pass
-
-class dict(Iterable[KT], Mapping[KT, VT], Generic[KT, VT]):
-    @overload
-    def __init__(self, **kwargs: VT) -> None: pass
-    @overload
-    def __init__(self, arg: Iterable[Tuple[KT, VT]], **kwargs: VT) -> None: pass
-    def __setitem__(self, k: KT, v: VT) -> None: pass
-    def __iter__(self) -> Iterator[KT]: pass
-    def update(self, a: Mapping[KT, VT]) -> None: pass
diff --git a/test-data/unit/fixtures/list.pyi b/test-data/unit/fixtures/list.pyi
deleted file mode 100644
index 9413cf7..0000000
--- a/test-data/unit/fixtures/list.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-# Builtins stub used in list-related test cases.
-
-from typing import TypeVar, Generic, builtinclass, Iterable, Iterator, overload
-
-T = TypeVar('T')
-
- at builtinclass
-class object:
-    def __init__(self): pass
-
-class type: pass
-class ellipsis: pass
-
-class list(Iterable[T], Generic[T]):
-    @overload
-    def __init__(self) -> None: pass
-    @overload
-    def __init__(self, x: Iterable[T]) -> None: pass
-    def __iter__(self) -> Iterator[T]: pass
-    def __add__(self, x: list[T]) -> list[T]: pass
-    def __mul__(self, x: int) -> list[T]: pass
-    def __getitem__(self, x: int) -> T: pass
-    def append(self, x: T) -> None: pass
-    def extend(self, x: Iterable[T]) -> None: pass
-
-class tuple: pass
-class function: pass
-class int: pass
-class str: pass
-class bool: pass
diff --git a/test-data/unit/fixtures/module.pyi b/test-data/unit/fixtures/module.pyi
deleted file mode 100644
index fb2a4c2..0000000
--- a/test-data/unit/fixtures/module.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-from typing import Any, Dict, Generic, TypeVar
-
-T = TypeVar('T')
-S = TypeVar('S')
-
-class object:
-    def __init__(self) -> None: pass
-class module:
-    __name__ = ...  # type: str
-    __file__ = ...  # type: str
-    __dict__ = ...  # type: Dict[str, Any]
-class type: pass
-class function: pass
-class int: pass
-class str: pass
-class bool: pass
-class tuple: pass
-class dict(Generic[T, S]): pass
diff --git a/test-data/unit/fixtures/module_all.pyi b/test-data/unit/fixtures/module_all.pyi
deleted file mode 100644
index cc1b552..0000000
--- a/test-data/unit/fixtures/module_all.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-from typing import Generic, Sequence, TypeVar
-_T = TypeVar('_T')
-
-class object:
-    def __init__(self) -> None: pass
-class module: pass
-class type: pass
-class function: pass
-class int: pass
-class str: pass
-class list(Generic[_T], Sequence[_T]):
-    def append(self, x: _T): pass
-    def extend(self, x: Sequence[_T]): pass
-    def __add__(self, rhs: Sequence[_T]) -> list[_T]: pass
-class tuple: pass
diff --git a/test-data/unit/fixtures/module_all_python2.pyi b/test-data/unit/fixtures/module_all_python2.pyi
deleted file mode 100644
index ed17d4d..0000000
--- a/test-data/unit/fixtures/module_all_python2.pyi
+++ /dev/null
@@ -1,16 +0,0 @@
-from typing import Generic, Sequence, TypeVar
-_T = TypeVar('_T')
-
-class object:
-    def __init__(self) -> None: pass
-class module: pass
-class type: pass
-class function: pass
-class int: pass
-class str: pass
-class unicode: pass
-class list(Generic[_T], Sequence[_T]):
-    def append(self, x: _T): pass
-    def extend(self, x: Sequence[_T]): pass
-    def __add__(self, rhs: Sequence[_T]) -> list[_T]: pass
-class tuple: pass
diff --git a/test-data/unit/fixtures/ops.pyi b/test-data/unit/fixtures/ops.pyi
deleted file mode 100644
index a647ff1..0000000
--- a/test-data/unit/fixtures/ops.pyi
+++ /dev/null
@@ -1,56 +0,0 @@
-from typing import builtinclass, overload, Any, Generic, Sequence, Tuple, TypeVar
-
-Tco = TypeVar('Tco', covariant=True)
-
-# This is an extension of transform builtins with additional operations.
-
- at builtinclass
-class object:
-    def __init__(self) -> None: pass
-    def __eq__(self, o: 'object') -> 'bool': pass
-    def __ne__(self, o: 'object') -> 'bool': pass
-
-class type: pass
-
-class slice: pass
-
-class tuple(Sequence[Tco], Generic[Tco]):
-    def __getitem__(self, x: int) -> Tco: pass
-    def __eq__(self, x: object) -> bool: pass
-    def __ne__(self, x: object) -> bool: pass
-    def __lt__(self, x: 'tuple') -> bool: pass
-    def __le__(self, x: 'tuple') -> bool: pass
-    def __gt__(self, x: 'tuple') -> bool: pass
-    def __ge__(self, x: 'tuple') -> bool: pass
-
-class function: pass
-
-class bool: pass
-
-class str:
-    def __init__(self, x: 'int') -> None: pass
-    def __add__(self, x: 'str') -> 'str': pass
-    def startswith(self, x: 'str') -> bool: pass
-
-class int:
-    def __add__(self, x: 'int') -> 'int': pass
-    def __sub__(self, x: 'int') -> 'int': pass
-    def __mul__(self, x: 'int') -> 'int': pass
-    def __mod__(self, x: 'int') -> 'int': pass
-    def __floordiv__(self, x: 'int') -> 'int': pass
-    def __pos__(self) -> 'int': pass
-    def __neg__(self) -> 'int': pass
-    def __eq__(self, x: object) -> bool: pass
-    def __ne__(self, x: object) -> bool: pass
-    def __lt__(self, x: 'int') -> bool: pass
-    def __le__(self, x: 'int') -> bool: pass
-    def __gt__(self, x: 'int') -> bool: pass
-    def __ge__(self, x: 'int') -> bool: pass
-
-class float: pass
-
-class BaseException: pass
-
-def __print(a1=None, a2=None, a3=None, a4=None): pass
-
-class module: pass
diff --git a/test-data/unit/fixtures/primitives.pyi b/test-data/unit/fixtures/primitives.pyi
deleted file mode 100644
index b6ec4d4..0000000
--- a/test-data/unit/fixtures/primitives.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-# builtins stub with non-generic primitive types
-
-class object:
-    def __init__(self) -> None: pass
-
-class type:
-    def __init__(self, x) -> None: pass
-
-class int: pass
-class float: pass
-class complex: pass
-class bool: pass
-class str: pass
-class bytes: pass
-class bytearray: pass
-class tuple: pass
-class function: pass
diff --git a/test-data/unit/fixtures/property.pyi b/test-data/unit/fixtures/property.pyi
deleted file mode 100644
index b2e747b..0000000
--- a/test-data/unit/fixtures/property.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-import typing
-
-class object:
-    def __init__(self) -> None: pass
-
-class type:
-    def __init__(self, x) -> None: pass
-
-class function: pass
-
-property = object() # Dummy definition.
-
-class int: pass
-class str: pass
-class bytes: pass
-class tuple: pass
-class bool: pass
diff --git a/test-data/unit/fixtures/python2.pyi b/test-data/unit/fixtures/python2.pyi
deleted file mode 100644
index 61e48be..0000000
--- a/test-data/unit/fixtures/python2.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-from typing import Generic, Iterable, TypeVar
-
-class object:
-    def __init__(self) -> None: pass
-
-class type:
-    def __init__(self, x) -> None: pass
-
-class function: pass
-
-class int: pass
-class str: pass
-class unicode: pass
-
-T = TypeVar('T')
-class list(Iterable[T], Generic[T]): pass
-
-# Definition of None is implicit
diff --git a/test-data/unit/fixtures/set.pyi b/test-data/unit/fixtures/set.pyi
deleted file mode 100644
index cb8bbcf..0000000
--- a/test-data/unit/fixtures/set.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# Builtins stub used in set-related test cases.
-
-from typing import TypeVar, Generic, Iterator, Iterable, Set
-
-T = TypeVar('T')
-
-class object:
-    def __init__(self) -> None: pass
-
-class type: pass
-class tuple: pass
-class function: pass
-
-class int: pass
-class str: pass
-
-class set(Iterable[T], Generic[T]):
-    def __iter__(self) -> Iterator[T]: pass
-    def add(self, x: T) -> None: pass
-    def discard(self, x: T) -> None: pass
-    def update(self, x: Set[T]) -> None: pass
diff --git a/test-data/unit/fixtures/slice.pyi b/test-data/unit/fixtures/slice.pyi
deleted file mode 100644
index c01ffbb..0000000
--- a/test-data/unit/fixtures/slice.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# Builtins stub used in slicing test cases.
-
-class object:
-    def __init__(self): pass
-
-class type: pass
-class tuple: pass
-class function: pass
-
-class int: pass
-class str: pass
-
-class slice: pass
diff --git a/test-data/unit/fixtures/staticmethod.pyi b/test-data/unit/fixtures/staticmethod.pyi
deleted file mode 100644
index 139acee..0000000
--- a/test-data/unit/fixtures/staticmethod.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-import typing
-
-class object:
-    def __init__(self) -> None: pass
-
-class type:
-    def __init__(self, x) -> None: pass
-
-class function: pass
-
-staticmethod = object() # Dummy definition.
-
-class int:
-    @staticmethod
-    def from_bytes(bytes: bytes, byteorder: str) -> int: pass
-
-class str: pass
-class bytes: pass
diff --git a/test-data/unit/fixtures/transform.pyi b/test-data/unit/fixtures/transform.pyi
deleted file mode 100644
index afdc2bf..0000000
--- a/test-data/unit/fixtures/transform.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-# Builtins stubs used implicitly in program transformation test cases.
-
-class object:
-    def __init__(self) -> None: pass
-
-class type: pass
-
-# str is handy for debugging; allows outputting messages.
-class str: pass
-
-# Primitive types int/float have special coercion behaviour (they may have
-# a different representation from ordinary values).
-
-class int: pass
-
-class float: pass
-
-
-# The functions below are special functions used in test cases; their
-# implementations are actually in the __dynchk module, but they are defined
-# here so that the semantic analyzer and the type checker are happy without
-# having to analyze the entire __dynchk module all the time.
-#
-# The transformation implementation has special case handling for these
-# functions; it's a bit ugly but it works for now.
-
-def __print(a1=None, a2=None, a3=None, a4=None):
-    # Do not use *args since this would require list and break many test
-    # cases.
-    pass
diff --git a/test-data/unit/fixtures/tuple-simple.pyi b/test-data/unit/fixtures/tuple-simple.pyi
deleted file mode 100644
index b195dfa..0000000
--- a/test-data/unit/fixtures/tuple-simple.pyi
+++ /dev/null
@@ -1,20 +0,0 @@
-# Builtins stub used in some tuple-related test cases.
-#
-# This is a simpler version of tuple.py which is useful
-# and makes some test cases easier to write/debug.
-
-from typing import Iterable, TypeVar, Generic
-
-T = TypeVar('T')
-
-class object:
-    def __init__(self): pass
-
-class type: pass
-class tuple(Generic[T]):
-    def __getitem__(self, x: int) -> T: pass
-class function: pass
-
-# We need int for indexing tuples.
-class int: pass
-class str: pass # For convenience
diff --git a/test-data/unit/fixtures/tuple.pyi b/test-data/unit/fixtures/tuple.pyi
deleted file mode 100644
index 6fe63b6..0000000
--- a/test-data/unit/fixtures/tuple.pyi
+++ /dev/null
@@ -1,28 +0,0 @@
-# Builtins stub used in tuple-related test cases.
-
-from typing import Iterable, Iterator, TypeVar, Generic, Sequence
-
-Tco = TypeVar('Tco', covariant=True)
-
-class object:
-    def __init__(self): pass
-
-class type:
-    def __init__(self, *a) -> None: pass
-    def __call__(self, *a) -> object: pass
-class tuple(Sequence[Tco], Generic[Tco]):
-    def __iter__(self) -> Iterator[Tco]: pass
-    def __getitem__(self, x: int) -> Tco: pass
-class function: pass
-
-# We need int for indexing tuples.
-class int: pass
-class bool: pass
-class str: pass # For convenience
-
-T = TypeVar('T')
-
-class list(Sequence[T], Generic[T]): pass
-def isinstance(x: object, t: type) -> bool: pass
-
-def sum(iterable: Iterable[T], start: T = None) -> T: pass
diff --git a/test-data/unit/fixtures/union.pyi b/test-data/unit/fixtures/union.pyi
deleted file mode 100644
index 78a41f9..0000000
--- a/test-data/unit/fixtures/union.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-# Builtins stub used in tuple-related test cases.
-
-from isinstance import isinstance
-from typing import Iterable, TypeVar
-
-class object:
-    def __init__(self): pass
-
-class type: pass
-class function: pass
-
-# Current tuple types get special treatment in the type checker, thus there
-# is no need for type arguments here.
-class tuple: pass
-
-# We need int for indexing tuples.
-class int: pass
-class str: pass # For convenience
diff --git a/test-data/unit/lib-stub/__builtin__.pyi b/test-data/unit/lib-stub/__builtin__.pyi
deleted file mode 100644
index eec6228..0000000
--- a/test-data/unit/lib-stub/__builtin__.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-class Any: pass
-
-class object:
-    def __init__(self):
-        # type: () -> None
-        pass
-
-class type:
-    def __init__(self, x):
-        # type: (Any) -> None
-        pass
-
-# These are provided here for convenience.
-class int: pass
-class float: pass
-
-class str: pass
-class unicode: pass
-
-class tuple: pass
-class function: pass
-
-class ellipsis: pass
-
-def print(*args, end=''): pass
-
-# Definition of None is implicit
diff --git a/test-data/unit/lib-stub/abc.pyi b/test-data/unit/lib-stub/abc.pyi
deleted file mode 100644
index 4afe734..0000000
--- a/test-data/unit/lib-stub/abc.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-class ABCMeta: pass
-abstractmethod = object()
-abstractproperty = object()
diff --git a/test-data/unit/lib-stub/builtins.pyi b/test-data/unit/lib-stub/builtins.pyi
deleted file mode 100644
index 9a636bf..0000000
--- a/test-data/unit/lib-stub/builtins.pyi
+++ /dev/null
@@ -1,23 +0,0 @@
-class Any: pass
-
-class object:
-    def __init__(self) -> None: pass
-
-class type:
-    def __init__(self, x: Any) -> None: pass
-
-# These are provided here for convenience.
-class int:
-    def __add__(self, other: 'int') -> 'int': pass
-class float: pass
-
-class str:
-    def __add__(self, other: 'str') -> 'str': pass
-class bytes: pass
-
-class tuple: pass
-class function: pass
-
-class ellipsis: pass
-
-# Definition of None is implicit
diff --git a/test-data/unit/lib-stub/collections.pyi b/test-data/unit/lib-stub/collections.pyi
deleted file mode 100644
index 00b7cea..0000000
--- a/test-data/unit/lib-stub/collections.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-import typing
-
-namedtuple = object()
diff --git a/test-data/unit/lib-stub/mypy_extensions.pyi b/test-data/unit/lib-stub/mypy_extensions.pyi
deleted file mode 100644
index 2bfc072..0000000
--- a/test-data/unit/lib-stub/mypy_extensions.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-from typing import Dict, Type, TypeVar
-
-T = TypeVar('T')
-
-
-def TypedDict(typename: str, fields: Dict[str, Type[T]]) -> Type[dict]: pass
diff --git a/test-data/unit/lib-stub/sys.pyi b/test-data/unit/lib-stub/sys.pyi
deleted file mode 100644
index 3959cb0..0000000
--- a/test-data/unit/lib-stub/sys.pyi
+++ /dev/null
@@ -1,2 +0,0 @@
-version_info = (0, 0, 0, '', 0)
-platform = ''
diff --git a/test-data/unit/lib-stub/types.pyi b/test-data/unit/lib-stub/types.pyi
deleted file mode 100644
index aa0a19f..0000000
--- a/test-data/unit/lib-stub/types.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-from typing import TypeVar
-T = TypeVar('T')
-def coroutine(func: T) -> T:
-    return func
diff --git a/test-data/unit/lib-stub/typing.pyi b/test-data/unit/lib-stub/typing.pyi
deleted file mode 100644
index 77a7b34..0000000
--- a/test-data/unit/lib-stub/typing.pyi
+++ /dev/null
@@ -1,90 +0,0 @@
-# Stub for typing module. Many of the definitions have special handling in
-# the type checker, so they can just be initialized to anything.
-
-from abc import abstractmethod
-
-cast = 0
-overload = 0
-Any = 0
-Union = 0
-Optional = 0
-TypeVar = 0
-Generic = 0
-Tuple = 0
-Callable = 0
-builtinclass = 0
-_promote = 0
-NamedTuple = 0
-Type = 0
-no_type_check = 0
-
-# Type aliases.
-List = 0
-Dict = 0
-Set = 0
-
-T = TypeVar('T')
-U = TypeVar('U')
-V = TypeVar('V')
-S = TypeVar('S')
-
-class Container(Generic[T]):
-    @abstractmethod
-    # Use int because bool isn't in the default test builtins
-    def __contains__(self, arg: T) -> int: pass
-
-class Sized:
-    @abstractmethod
-    def __len__(self) -> int: pass
-
-class Iterable(Generic[T]):
-    @abstractmethod
-    def __iter__(self) -> 'Iterator[T]': pass
-
-class Iterator(Iterable[T], Generic[T]):
-    @abstractmethod
-    def __next__(self) -> T: pass
-
-class Generator(Iterator[T], Generic[T, U, V]):
-    @abstractmethod
-    def send(self, value: U) -> T: pass
-
-    @abstractmethod
-    def throw(self, typ: Any, val: Any=None, tb=None) -> None: pass
-
-    @abstractmethod
-    def close(self) -> None: pass
-
-    @abstractmethod
-    def __iter__(self) -> 'Generator[T, U, V]': pass
-
-class Awaitable(Generic[T]):
-    @abstractmethod
-    def __await__(self) -> Generator[Any, Any, T]: pass
-
-class AwaitableGenerator(Generator[T, U, V], Awaitable[V], Generic[T, U, V, S]):
-    pass
-
-class AsyncIterable(Generic[T]):
-    @abstractmethod
-    def __aiter__(self) -> 'AsyncIterator[T]': pass
-
-class AsyncIterator(AsyncIterable[T], Generic[T]):
-    def __aiter__(self) -> 'AsyncIterator[T]': return self
-    @abstractmethod
-    def __anext__(self) -> Awaitable[T]: pass
-
-class Sequence(Iterable[T], Generic[T]):
-    @abstractmethod
-    def __getitem__(self, n: Any) -> T: pass
-
-class Mapping(Generic[T, U]): pass
-
-class MutableMapping(Generic[T, U]): pass
-
-def NewType(name: str, tp: Type[T]) -> Callable[[T], T]:
-    def new_type(x):
-        return x
-    return new_type
-
-TYPE_CHECKING = 1
diff --git a/test-data/unit/parse-errors.test b/test-data/unit/parse-errors.test
deleted file mode 100644
index f2251a9..0000000
--- a/test-data/unit/parse-errors.test
+++ /dev/null
@@ -1,496 +0,0 @@
--- Test cases for parser errors. Each test case consists of two sections.
--- The first section contains [case NAME] followed by the input code, while
--- the second section contains [out] followed by the output from the parser.
---
--- The input file name in errors is "file".
---
--- Comments starting with "--" in this file will be ignored, except for lines
--- starting with "----" that are not ignored. The first two dashes of these
--- lines are interpreted as escapes and removed.
-
-[case testInvalidFunction]
-def f()
-  pass
-[out]
-file:1: error: Parse error before end of line
-file:2: error: Inconsistent indentation
-
-[case testMissingIndent]
-if x:
-1
-[out]
-file:2: error: Expected an indented block
-
-[case testUnexpectedIndent]
-1
- 2
-[out]
-file:2: error: Inconsistent indentation
-
-[case testInconsistentIndent]
-if x:
-  1
-   1
-[out]
-file:3: error: Inconsistent indentation
-
-[case testInconsistentIndent]
-if x:
-   1
-  1
-[out]
-file:3: error: Inconsistent indentation
-
-[case testInvalidBinaryOp]
-1>
-a*
-a+1*
-[out]
-file:1: error: Parse error before end of line
-file:2: error: Parse error before end of line
-file:3: error: Parse error before end of line
-
-[case testDoubleStar]
-**a
-[out]
-file:1: error: Parse error before **
-
-[case testInvalidSuperClass]
-class A(C[):
-  pass
-[out]
-file:1: error: Parse error before )
-file:2: error: Parse error before end of file
-
-[case testMissingSuperClass]
-class A(:
-  pass
-[out]
-file:1: error: Parse error before :
-file:2: error: Parse error before end of file
-
-[case testUnexpectedEof]
-if 1:
-[out]
-file:1: error: Expected an indented block
-
-[case testInvalidKeywordArguments1]
-f(x=y, z)
-[out]
-file:1: error: Parse error before "z"
-
-[case testInvalidKeywordArguments2]
-f(**x, y=z)
-[out]
-file:1: error: Parse error before "y"
-
-[case testInvalidKeywordArguments3]
-f(**x, y)
-[out]
-file:1: error: Parse error before "y"
-
-[case testInvalidVarArgs]
-f(*x, y)
-[out]
-file:1: error: Parse error before "y"
-
-[case testInvalidBareAsteriskAndVarArgs2]
-def f(*x: A, *) -> None: pass
-[out]
-file:1: error: Parse error before )
-file:1: error: Parse error before end of line
-
-[case testInvalidBareAsteriskAndVarArgs3]
-def f(*, *x: A) -> None: pass
-[out]
-file:1: error: Parse error before *
-file:1: error: Parse error before end of line
-
-[case testInvalidBareAsteriskAndVarArgs4]
-def f(*, **x: A) -> None: pass
-[out]
-file:1: error: Parse error before **
-file:1: error: Parse error before end of line
-
-[case testInvalidBareAsterisk1]
-def f(*) -> None: pass
-[out]
-file:1: error: Parse error before )
-file:1: error: Parse error before end of line
-
-[case testInvalidBareAsterisk2]
-def f(x, *) -> None: pass
-[out]
-file:1: error: Parse error before )
-file:1: error: Parse error before end of line
-
-[case testInvalidFuncDefArgs1]
-def f(x = y, x): pass
-[out]
-file:1: error: Invalid argument list
-
-[case testInvalidFuncDefArgs3]
-def f(**x, y):
-   pass
-[out]
-file:1: error: Invalid argument list
-
-[case testInvalidFuncDefArgs4]
-def f(**x, y=x):
-    pass
-[out]
-file:1: error: Invalid argument list
-
-[case testInvalidStringLiteralType]
-def f(x:
-     'A['
-     ) -> None: pass
-[out]
-file:2: error: Parse error before end of line
-file:3: error: Parse error before end of line
-
-[case testInvalidStringLiteralType2]
-def f(x:
-      'A B'
-      ) -> None: pass
-[out]
-file:2: error: Parse error before "B"
-file:3: error: Parse error before end of line
-
-[case testInvalidTypeComment]
-0
-x = 0 # type: A A
-[out]
-file:2: error: Parse error before "A"
-
-[case testInvalidTypeComment2]
-0
-x = 0 # type: A[
-[out]
-file:2: error: Parse error before end of line
-
-[case testInvalidTypeComment3]
-0
-x = 0 # type:
-[out]
-file:2: error: Empty type annotation
-
-[case testInvalidTypeComment4]
-0
-x = 0 # type: *
-[out]
-file:2: error: Parse error before end of line
-
-[case testInvalidMultilineLiteralType]
-def f() -> "A\nB": pass
-[out]
-file:1: error: Parse error before end of line
-
-[case testInvalidMetaclass]
-class A(metaclass=1): pass
-[out]
-file:1: error: Parse error before numeric literal
-file:1: error: Parse error before end of file
-
-[case testInvalidSignatureInComment1]
-def f(): # type: x
-  pass
-[out]
-file:1: error: Parse error before "x"
-
-[case testInvalidSignatureInComment2]
-def f(): # type:
-  pass
-[out]
-file:1: error: Empty type annotation
-
-[case testInvalidSignatureInComment3]
-def f(): # type: (
-  pass
-[out]
-file:1: error: Parse error before end of line
-
-[case testInvalidSignatureInComment4]
-def f(): # type: (.
-  pass
-[out]
-file:1: error: Parse error before .
-
-[case testInvalidSignatureInComment5]
-def f(): # type: (x
-  pass
-[out]
-file:1: error: Parse error before end of line
-
-[case testInvalidSignatureInComment6]
-def f(): # type: (x)
-  pass
-[out]
-file:1: error: Parse error before end of line
-
-[case testInvalidSignatureInComment7]
-def f(): # type: (x) -
-  pass
-[out]
-file:1: error: Parse error before -
-
-[case testInvalidSignatureInComment8]
-def f(): # type: (x) ->
-  pass
-[out]
-file:1: error: Parse error before end of line
-
-[case testInvalidSignatureInComment9]
-def f(): # type: (x) -> .
-  pass
-[out]
-file:1: error: Parse error before .
-
-[case testInvalidSignatureInComment10]
-def f(): # type: (x) -> x x
-  pass
-[out]
-file:1: error: Parse error before "x"
-
-[case testDuplicateSignatures1]
-def f() -> None: # type: () -> None
-  pass
-def f(): # type: () -> None
-    pass
-[out]
-file:1: error: Function has duplicate type signatures
-
-[case testDuplicateSignatures2]
-def f(x, y: Z): # type: (x, y) -> z
-  pass
-[out]
-file:1: error: Function has duplicate type signatures
-
-[case testTooManyTypes]
-def f(x, y): # type: (X, Y, Z) -> z
-  pass
-[out]
-file:1: error: Type signature has too many arguments
-
-[case testTooFewTypes]
-def f(x, y): # type: (X) -> z
-  pass
-[out]
-file:1: error: Type signature has too few arguments
-
-[case testCommentFunctionAnnotationVarArgMispatch]
-def f(x): # type: (*X) -> Y
-    pass
-def g(*x): # type: (X) -> Y
-    pass
-[out]
-file:1: error: Inconsistent use of '*' in function signature
-file:3: error: Inconsistent use of '*' in function signature
-
-[case testCommentFunctionAnnotationVarArgMispatch2]
-def f(*x, **y): # type: (**X, *Y) -> Z
-    pass
-def g(*x, **y): # type: (*X, *Y) -> Z
-    pass
-[out]
-file:1: error: Inconsistent use of '*' in function signature
-file:1: error: Inconsistent use of '**' in function signature
-file:3: error: Inconsistent use of '*' in function signature
-file:3: error: Inconsistent use of '**' in function signature
-
-[case testPrintStatementInPython3]
-print 1
-[out]
-file:1: error: Parse error before numeric literal
-
-[case testInvalidConditionInConditionalExpression]
-1 if 2, 3 else 4
-[out]
-file:1: error: Parse error before ,
-
-[case testInvalidConditionInConditionalExpression2]
-1 if x for y in z else 4
-[out]
-file:1: error: Parse error before "for"
-
-[case testInvalidConditionInConditionalExpression2]
-1 if x else for y in z
-[out]
-file:1: error: Parse error before "for"
-
-[case testYieldFromNotRightParameter]
-def f():
-    yield from
-[out]
-file:2: error: Parse error before end of line
-
-[case testYieldFromAfterReturn]
-def f():
-    return yield from h()
-[out]
-file:2: error: Parse error before "yield"
-
-[case testImportDotModule]
-import .x
-[out]
-file:1: error: Parse error before .
-
-[case testImportDot]
-import .
-[out]
-file:1: error: Parse error before .
-
-[case testInvalidFunctionName]
-def while(): pass
-[out]
-file:1: error: Parse error before "while"
-file:1: error: Parse error before end of line
-
-[case testInvalidEllipsis1]
-...0
-..._
-...a
-[out]
-file:1: error: Parse error before numeric literal
-file:2: error: Parse error before "_"
-file:3: error: Parse error before "a"
-
-[case testBlockStatementInSingleLineIf]
-if 1: if 2: pass
-[out]
-file:1: error: Parse error before "if"
-
-[case testBlockStatementInSingleLineIf2]
-if 1: while 2: pass
-[out]
-file:1: error: Parse error before "while"
-
-[case testBlockStatementInSingleLineIf3]
-if 1: for x in y: pass
-[out]
-file:1: error: Parse error before "for"
-
-[case testUnexpectedEllipsis]
-a = a...
-[out]
-file:1: error: Parse error before ...
-
-[case testFromFutureImportStar]
-from __future__ import *
-x = 1
-[out]
-file:1: error: Parse error before *
-
-[case testParseErrorBeforeUnicodeLiteral]
-x u'y'
-[out]
-file:1: error: Parse error before string literal
-
-[case testParseErrorInExtendedSlicing]
-x[:,
-[out]
-file:1: error: Parse error before end of line
-
-[case testParseErrorInExtendedSlicing2]
-x[:,::
-[out]
-file:1: error: Parse error before end of line
-
-[case testParseErrorInExtendedSlicing3]
-x[:,:
-[out]
-file:1: error: Parse error before end of line
-
-[case testPython2OctalIntLiteralInPython3]
-0377
-[out]
-file:1: error: Invalid numeric literal
-
-[case testInvalidEncoding]
-# foo
-# coding: uft-8
-[out]
-file:2: error: Unknown encoding 'uft-8'
-
-[case testInvalidEncoding2]
-# coding=Uft.8
-[out]
-file:1: error: Unknown encoding 'Uft.8'
-
-[case testInvalidEncoding3]
-#!/usr/bin python
-# vim: set fileencoding=uft8 :
-[out]
-file:2: error: Unknown encoding 'uft8'
-
-[case testDoubleEncoding]
-# coding: uft8
-# coding: utf8
-# The first coding cookie should be used and fail.
-[out]
-file:1: error: Unknown encoding 'uft8'
-
-[case testDoubleEncoding2]
-# Again the first cookie should be used and fail.
-# coding: uft8
-# coding: utf8
-[out]
-file:2: error: Unknown encoding 'uft8'
-
-[case testDoubleEncoding3]
-# If the third line were interpreted as a coding cookie, we'd get a
-# different error message.
-# coding: ascii
-á = 1
-[out]
-file:4: error: Unrecognized character
-
-[case testDoubleEncoding4]
-
-
-# coding: ascii
-á = 1
-[out]
-file:4: error: Unrecognized character
-
-[case testLongLiteralInPython3]
-2L
-0x2L
-[out]
-file:1: error: Invalid numeric literal
-file:2: error: Invalid numeric literal
-
-[case testPython2LegacyInequalityInPython3]
-1 <> 2
-[out]
-file:1: error: Parse error before >
-
-[case testLambdaInListComprehensionInPython3]
-([ 0 for x in 1, 2 if 3 ])
-[out]
-file:1: error: Parse error before ,
-
-[case testTupleArgListInPython3]
-def f(x, (y, z)): pass
-[out]
-file:1: error: Tuples in argument lists only supported in Python 2 mode
-
-[case testBackquoteInPython3]
-`1 + 2`
-[out]
-file:1: error: Unrecognized character `
-
-[case testSmartQuotes]
-foo = ‘bar’
-[out]
-file:1: error: Unrecognized character
-
-[case testExceptCommaInPython3]
-try:
-    pass
-except KeyError, IndexError:
-    pass
-[out]
-file:3: error: Parse error before ,
-file:3: error: Parse error before :
-file:4: error: Inconsistent indentation
diff --git a/test-data/unit/parse-python2.test b/test-data/unit/parse-python2.test
deleted file mode 100644
index 7d4931e..0000000
--- a/test-data/unit/parse-python2.test
+++ /dev/null
@@ -1,399 +0,0 @@
--- Test cases for parser -- Python 2 syntax.
---
--- See parse.test for a description of this file format.
-
-[case testEmptyFile]
-[out]
-MypyFile:1()
-
-[case testStringLiterals]
-'bar'
-u'foo'
-ur'foo'
-u'''bar'''
-b'foo'
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StrExpr(bar))
-  ExpressionStmt:2(
-    UnicodeExpr(foo))
-  ExpressionStmt:3(
-    UnicodeExpr(foo))
-  ExpressionStmt:4(
-    UnicodeExpr(bar))
-  ExpressionStmt:5(
-    StrExpr(foo)))
-
-[case testSimplePrint]
-print 1
-print 2, 3
-print (4, 5)
-[out]
-MypyFile:1(
-  PrintStmt:1(
-    IntExpr(1)
-    Newline)
-  PrintStmt:2(
-    IntExpr(2)
-    IntExpr(3)
-    Newline)
-  PrintStmt:3(
-    TupleExpr:3(
-      IntExpr(4)
-      IntExpr(5))
-    Newline))
-
-[case testPrintWithNoArgs]
-print
-[out]
-MypyFile:1(
-  PrintStmt:1(
-    Newline))
-
-[case testPrintWithTarget]
-print >>foo
-[out]
-MypyFile:1(
-  PrintStmt:1(
-    Target(
-      NameExpr(foo))
-    Newline))
-
-[case testPrintWithTargetAndArgs]
-print >>foo, x
-[out]
-MypyFile:1(
-  PrintStmt:1(
-    NameExpr(x)
-    Target(
-      NameExpr(foo))
-    Newline))
-
-[case testPrintWithTargetAndArgsAndTrailingComma]
-print >>foo, x, y,
-[out]
-MypyFile:1(
-  PrintStmt:1(
-    NameExpr(x)
-    NameExpr(y)
-    Target(
-      NameExpr(foo))))
-
-[case testSimpleWithTrailingComma]
-print 1,
-print 2, 3,
-print (4, 5),
-[out]
-MypyFile:1(
-  PrintStmt:1(
-    IntExpr(1))
-  PrintStmt:2(
-    IntExpr(2)
-    IntExpr(3))
-  PrintStmt:3(
-    TupleExpr:3(
-      IntExpr(4)
-      IntExpr(5))))
-
-[case testOctalIntLiteral]
-00
-01
-0377
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    IntExpr(0))
-  ExpressionStmt:2(
-    IntExpr(1))
-  ExpressionStmt:3(
-    IntExpr(255)))
-
-[case testLongLiteral]
-0L
-123L
-012L
-0x123l
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    IntExpr(0))
-  ExpressionStmt:2(
-    IntExpr(123))
-  ExpressionStmt:3(
-    IntExpr(10))
-  ExpressionStmt:4(
-    IntExpr(291)))
-
-[case testTryExceptWithComma]
-try:
-    x
-except Exception, e:
-    y
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      ExpressionStmt:2(
-        NameExpr(x)))
-    NameExpr(Exception)
-    NameExpr(e)
-    Block:3(
-      ExpressionStmt:4(
-        NameExpr(y)))))
-
-[case testTryExceptWithNestedComma]
-try:
-    x
-except (KeyError, IndexError):
-    y
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      ExpressionStmt:2(
-        NameExpr(x)))
-    TupleExpr:3(
-      NameExpr(KeyError)
-      NameExpr(IndexError))
-    Block:3(
-      ExpressionStmt:4(
-        NameExpr(y)))))
-
-[case testExecStatement]
-exec a
-[out]
-MypyFile:1(
-  ExecStmt:1(
-    NameExpr(a)))
-
-[case testExecStatementWithIn]
-exec a in globals()
-[out]
-MypyFile:1(
-  ExecStmt:1(
-    NameExpr(a)
-    CallExpr:1(
-      NameExpr(globals)
-      Args())))
-
-[case testExecStatementWithInAnd2Expressions]
-exec a in x, y
-[out]
-MypyFile:1(
-  ExecStmt:1(
-    NameExpr(a)
-    NameExpr(x)
-    NameExpr(y)))
-
-[case testEllipsisInExpression_python2]
-x = ... # E: Parse error before ...
-[out]
-
-[case testStrLiteralConcatenationWithMixedLiteralTypes]
-u'foo' 'bar'
-'bar' u'foo'
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    UnicodeExpr(foobar))
-  ExpressionStmt:2(
-    UnicodeExpr(barfoo)))
-
-[case testLegacyInequality]
-1 <> 2
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    ComparisonExpr:1(
-      !=
-      IntExpr(1)
-      IntExpr(2))))
-
-[case testLambdaInListComprehensionInPython2]
-([ 0 for x in 1, 2 if 3 ])
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    ListComprehension:1(
-      GeneratorExpr:1(
-        IntExpr(0)
-        NameExpr(x)
-        TupleExpr:1(
-          IntExpr(1)
-          IntExpr(2))
-        IntExpr(3)))))
-
-[case testTupleArgListInPython2]
-def f(x, (y, z)): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x)
-      Var(__tuple_arg_2))
-    Block:1(
-      AssignmentStmt:1(
-        TupleExpr:1(
-          NameExpr(y)
-          NameExpr(z))
-        NameExpr(__tuple_arg_2))
-      PassStmt:1())))
-
-[case testTupleArgListWithTwoTupleArgsInPython2]
-def f((x, y), (z, zz)): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(__tuple_arg_1)
-      Var(__tuple_arg_2))
-    Block:1(
-      AssignmentStmt:1(
-        TupleExpr:1(
-          NameExpr(x)
-          NameExpr(y))
-        NameExpr(__tuple_arg_1))
-      AssignmentStmt:1(
-        TupleExpr:1(
-          NameExpr(z)
-          NameExpr(zz))
-        NameExpr(__tuple_arg_2))
-      PassStmt:1())))
-
-[case testTupleArgListWithInitializerInPython2]
-def f((y, z) = (1, 2)): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(__tuple_arg_1))
-    Init(
-      AssignmentStmt:1(
-        NameExpr(__tuple_arg_1)
-        TupleExpr:1(
-          IntExpr(1)
-          IntExpr(2))))
-    Block:1(
-      AssignmentStmt:1(
-        TupleExpr:1(
-          NameExpr(y)
-          NameExpr(z))
-        NameExpr(__tuple_arg_1))
-      PassStmt:1())))
-
-[case testLambdaTupleArgListInPython2]
-lambda (x, y): z
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    FuncExpr:1(
-      Args(
-        Var(__tuple_arg_1))
-      Block:1(
-        AssignmentStmt:1(
-          TupleExpr:1(
-            NameExpr(x)
-            NameExpr(y))
-          NameExpr(__tuple_arg_1))
-        ReturnStmt:1(
-          NameExpr(z))))))
-
-[case testLambdaSingletonTupleArgListInPython2]
-lambda (x,): z
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    FuncExpr:1(
-      Args(
-        Var(__tuple_arg_1))
-      Block:1(
-        AssignmentStmt:1(
-          TupleExpr:1(
-            NameExpr(x))
-          NameExpr(__tuple_arg_1))
-        ReturnStmt:1(
-          NameExpr(z))))))
-
-[case testLambdaNoTupleArgListInPython2]
-lambda (x): z
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    FuncExpr:1(
-      Args(
-        Var(x))
-      Block:1(
-        ReturnStmt:1(
-          NameExpr(z))))))
-
-[case testInvalidExprInTupleArgListInPython2_1]
-def f(x, ()): pass
-[out]
-main: error: Empty tuple not valid as an argument
-
-[case testInvalidExprInTupleArgListInPython2_2]
-def f(x, (y, x[1])): pass
-[out]
-main:1: error: Invalid item in tuple argument
-
-[case testListLiteralAsTupleArgInPython2]
-def f(x, [x]): pass
-[out]
-main:1: error: Parse error before [
-main:1: error: Parse error before end of line
-
-[case testTupleArgAfterStarArgInPython2]
-def f(*a, (b, c)): pass
-[out]
-main:1: error: Invalid argument list
-
-[case testTupleArgAfterStarStarArgInPython2]
-def f(*a, (b, c)): pass
-[out]
-main:1: error: Invalid argument list
-
-[case testParenthesizedArgumentInPython2]
-def f(x, (y)): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x)
-      Var(y))
-    Block:1(
-      PassStmt:1())))
-
-[case testDuplicateNameInTupleArgList_python2]
-def f(a, (a, b)):
-    pass
-def g((x, (x, y))):
-    pass
-[out]
-main:1: error: Duplicate argument name "a"
-main:3: error: Duplicate argument name "x"
-
-[case testBackquotesInPython2]
-`1 + 2`
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    BackquoteExpr:1(
-      OpExpr:1(
-        +
-        IntExpr(1)
-        IntExpr(2)))))
-
-[case testBackquoteSpecialCasesInPython2]
-`1, 2`
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    BackquoteExpr:1(
-      TupleExpr:1(
-        IntExpr(1)
-        IntExpr(2)))))
diff --git a/test-data/unit/parse.test b/test-data/unit/parse.test
deleted file mode 100644
index 0dec0f3..0000000
--- a/test-data/unit/parse.test
+++ /dev/null
@@ -1,3401 +0,0 @@
--- Test cases for parser. Each test case consists of two sections.
--- The first section contains [case NAME] followed by the input code, while
--- the second section contains [out] followed by the output from the parser.
---
--- Lines starting with "--" in this file will be ignored, except for lines
--- starting with "----" that are not ignored. The first two dashes of these
--- lines are interpreted as escapes and removed.
-
-[case testEmptyFile]
-[out]
-MypyFile:1()
-
-[case testExpressionStatement]
-1
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    IntExpr(1)))
-
-[case testAssignment]
-x = 1
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    IntExpr(1)))
-
-[case testExpressionBasics]
-x = f(1, None)
-123 * (2 + x)
-"hello".lower()
--1.23
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    CallExpr:1(
-      NameExpr(f)
-      Args(
-        IntExpr(1)
-        NameExpr(None))))
-  ExpressionStmt:2(
-    OpExpr:2(
-      *
-      IntExpr(123)
-      OpExpr:2(
-        +
-        IntExpr(2)
-        NameExpr(x))))
-  ExpressionStmt:3(
-    CallExpr:3(
-      MemberExpr:3(
-        StrExpr(hello)
-        lower)
-      Args()))
-  ExpressionStmt:4(
-    UnaryExpr:4(
-      -
-      FloatExpr(1.23))))
-
-[case testSingleQuotedStr]
-''
-'foo'
-'foo\
-bar'
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StrExpr())
-  ExpressionStmt:2(
-    StrExpr(foo))
-  ExpressionStmt:3(
-    StrExpr(foobar)))
-
-[case testDoubleQuotedStr]
-""
-"foo"
-"foo\
-bar"
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StrExpr())
-  ExpressionStmt:2(
-    StrExpr(foo))
-  ExpressionStmt:3(
-    StrExpr(foobar)))
-
-[case testTripleQuotedStr]
-''''''
-'''foo'''
-'''foo\
-bar'''
-'''\nfoo
-bar'''
-'''fo''bar'''
-""""""
-"""foo"""
-"""foo\
-bar"""
-"""\nfoo
-bar"""
-"""fo""bar"""
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StrExpr())
-  ExpressionStmt:2(
-    StrExpr(foo))
-  ExpressionStmt:3(
-    StrExpr(foobar))
-  ExpressionStmt:4(
-    StrExpr(\nfoo\u000abar))
-  ExpressionStmt:6(
-    StrExpr(fo''bar))
-  ExpressionStmt:7(
-    StrExpr())
-  ExpressionStmt:8(
-    StrExpr(foo))
-  ExpressionStmt:9(
-    StrExpr(foobar))
-  ExpressionStmt:10(
-    StrExpr(\nfoo\u000abar))
-  ExpressionStmt:12(
-    StrExpr(fo""bar)))
-
-[case testRawStr]
-r'x\n\''
-r"x\n\""
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StrExpr(x\n'))
-  ExpressionStmt:2(
-    StrExpr(x\n")))
---" fix syntax highlight
-
-[case testBytes]
-b'foo'
-b"foo\
-bar"
-br'x\n\''
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    BytesExpr(foo))
-  ExpressionStmt:2(
-    BytesExpr(foobar))
-  ExpressionStmt:3(
-    BytesExpr(x\n')))
-
-[case testEscapesInStrings]
-'\r\n\t\x2f\u123f'
-b'\r\n\t\x2f\u123f'
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StrExpr(\u000d\u000a\u0009/\u123f))
-  ExpressionStmt:2(
-    BytesExpr(\u000d\u000a\u0009/\\u123f)))
--- Note \\u in the b'...' case (\u sequence not translated)
-
-[case testEscapedQuote]
-'\''
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StrExpr(')))
---'
-
-[case testOctalEscapes]
-'\0\1\177\1234'
-b'\1\476'
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StrExpr(\u0000\u0001\u007fS4))
-  ExpressionStmt:2(
-    BytesExpr(\u0001\u013e)))
-
-[case testUnicodeLiteralInPython3]
-u'foo'
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StrExpr(foo)))
-
-[case testArrays]
-a = []
-a = [1, 2]
-a[[1]] = a[2]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a)
-    ListExpr:1())
-  AssignmentStmt:2(
-    NameExpr(a)
-    ListExpr:2(
-      IntExpr(1)
-      IntExpr(2)))
-  AssignmentStmt:3(
-    IndexExpr:3(
-      NameExpr(a)
-      ListExpr:3(
-        IntExpr(1)))
-    IndexExpr:3(
-      NameExpr(a)
-      IntExpr(2))))
-
-[case testTuples]
-()
-(1,)
-(1, foo)
-a, b = 1, (2, 3)
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    TupleExpr:1())
-  ExpressionStmt:2(
-    TupleExpr:2(
-      IntExpr(1)))
-  ExpressionStmt:3(
-    TupleExpr:3(
-      IntExpr(1)
-      NameExpr(foo)))
-  AssignmentStmt:4(
-    TupleExpr:4(
-      NameExpr(a)
-      NameExpr(b))
-    TupleExpr:4(
-      IntExpr(1)
-      TupleExpr:4(
-        IntExpr(2)
-        IntExpr(3)))))
-
-[case testSimpleFunction]
-def main():
-  1
-[out]
-MypyFile:1(
-  FuncDef:1(
-    main
-    Block:1(
-      ExpressionStmt:2(
-        IntExpr(1)))))
-
-[case testPass]
-def f():
-    pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      PassStmt:2())))
-
-[case testIf]
-if 1:
-    2
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      IntExpr(1))
-    Then(
-      ExpressionStmt:2(
-        IntExpr(2)))))
-
-[case testIfElse]
-if 1:
-    2
-else:
-    3
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      IntExpr(1))
-    Then(
-      ExpressionStmt:2(
-        IntExpr(2)))
-    Else(
-      ExpressionStmt:4(
-        IntExpr(3)))))
-
-[case testIfElif]
-if 1:
-    2
-elif 3:
-    4
-elif 5:
-    6
-else:
-    7
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      IntExpr(1))
-    Then(
-      ExpressionStmt:2(
-        IntExpr(2)))
-    If(
-      IntExpr(3))
-    Then(
-      ExpressionStmt:4(
-        IntExpr(4)))
-    If(
-      IntExpr(5))
-    Then(
-      ExpressionStmt:6(
-        IntExpr(6)))
-    Else(
-      ExpressionStmt:8(
-        IntExpr(7)))))
-
-[case testWhile]
-while 1:
-    pass
-[out]
-MypyFile:1(
-  WhileStmt:1(
-    IntExpr(1)
-    Block:1(
-      PassStmt:2())))
-
-[case testReturn]
-def f():
-    return 1
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ReturnStmt:2(
-        IntExpr(1)))))
-
-
-[case testReturnWithoutValue]
-def f():
-    return
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ReturnStmt:2())))
-
-[case testBreak]
-while 1:
-    break
-[out]
-MypyFile:1(
-  WhileStmt:1(
-    IntExpr(1)
-    Block:1(
-      BreakStmt:2())))
-
-[case testLargeBlock]
-if 1:
-    x = 1
-    while 2:
-        pass
-    y = 2
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      IntExpr(1))
-    Then(
-      AssignmentStmt:2(
-        NameExpr(x)
-        IntExpr(1))
-      WhileStmt:3(
-        IntExpr(2)
-        Block:3(
-          PassStmt:4()))
-      AssignmentStmt:5(
-        NameExpr(y)
-        IntExpr(2)))))
-
-[case testSimpleClass]
-class A:
-    def f(self):
-        pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      f
-      Args(
-        Var(self))
-      Block:2(
-        PassStmt:3()))))
-
-[case testGlobalVarWithType]
-x = 0 # type: int
-y = False # type: bool
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    IntExpr(0)
-    int?)
-  AssignmentStmt:2(
-    NameExpr(y)
-    NameExpr(False)
-    bool?))
-
-[case testLocalVarWithType]
-def f():
-  x = 0 # type: int
-  y = False # type: bool
-  a = None # type: Any
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      AssignmentStmt:2(
-        NameExpr(x)
-        IntExpr(0)
-        int?)
-      AssignmentStmt:3(
-        NameExpr(y)
-        NameExpr(False)
-        bool?)
-      AssignmentStmt:4(
-        NameExpr(a)
-        NameExpr(None)
-        Any?))))
-
-[case testLocalVarWithTypeOnNextLine]
-x = 0
-  # type: int
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    IntExpr(0)
-    int?))
-
-[case testFunctionDefWithType]
-def f(y: str) -> int:
-  return
-class A:
-  def f(self, a: int, b: Any) -> x:
-    pass
-  def g(self) -> Any:
-    pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(y))
-    def (y: str?) -> int?
-    Block:1(
-      ReturnStmt:2()))
-  ClassDef:3(
-    A
-    FuncDef:4(
-      f
-      Args(
-        Var(self)
-        Var(a)
-        Var(b))
-      def (self: Any, a: int?, b: Any?) -> x?
-      Block:4(
-        PassStmt:5()))
-    FuncDef:6(
-      g
-      Args(
-        Var(self))
-      def (self: Any) -> Any?
-      Block:6(
-        PassStmt:7()))))
-
-[case testFuncWithNoneReturn]
-def f() -> None:
-  pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def () -> None?
-    Block:1(
-      PassStmt:2())))
-
-[case testVarDefWithGenericType]
-x = None # type: List[str]
-y = None # type: Dict[int, Any]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    NameExpr(None)
-    List?[str?])
-  AssignmentStmt:2(
-    NameExpr(y)
-    NameExpr(None)
-    Dict?[int?, Any?]))
-
-[case testSignatureWithGenericTypes]
-def f(y: t[Any, x]) -> a[b[c], d]:
-    pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(y))
-    def (y: t?[Any?, x?]) -> a?[b?[c?], d?]
-    Block:1(
-      PassStmt:2())))
-
-[case testParsingExpressionsWithLessAndGreaterThan]
-# The operators < > can sometimes be confused with generic types.
-x = a < b > c
-f(x < b, y > c)
-a < b > 1
-x < b, y > 2
-(a < b > c)
-[out]
-MypyFile:1(
-  AssignmentStmt:2(
-    NameExpr(x)
-    ComparisonExpr:2(
-      <
-      >
-      NameExpr(a)
-      NameExpr(b)
-      NameExpr(c)))
-  ExpressionStmt:3(
-    CallExpr:3(
-      NameExpr(f)
-      Args(
-        ComparisonExpr:3(
-          <
-          NameExpr(x)
-          NameExpr(b))
-        ComparisonExpr:3(
-          >
-          NameExpr(y)
-          NameExpr(c)))))
-  ExpressionStmt:4(
-    ComparisonExpr:4(
-      <
-      >
-      NameExpr(a)
-      NameExpr(b)
-      IntExpr(1)))
-  ExpressionStmt:5(
-    TupleExpr:5(
-      ComparisonExpr:5(
-        <
-        NameExpr(x)
-        NameExpr(b))
-      ComparisonExpr:5(
-        >
-        NameExpr(y)
-        IntExpr(2))))
-  ExpressionStmt:6(
-    ComparisonExpr:6(
-      <
-      >
-      NameExpr(a)
-      NameExpr(b)
-      NameExpr(c))))
-
-[case testLineContinuation]
-if (1 +
-    2):
-  pass
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      OpExpr:1(
-        +
-        IntExpr(1)
-        IntExpr(2)))
-    Then(
-      PassStmt:3())))
-
-[case testMultipleVarDef]
-x, y = z # type: int, a[c]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    TupleExpr:1(
-      NameExpr(x)
-      NameExpr(y))
-    NameExpr(z)
-    Tuple[int?, a?[c?]]))
-
-[case testMultipleVarDef2]
-(xx, z, i) = 1 # type: (a[c], Any, int)
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    TupleExpr:1(
-      NameExpr(xx)
-      NameExpr(z)
-      NameExpr(i))
-    IntExpr(1)
-    Tuple[a?[c?], Any?, int?]))
-
-[case testMultipleVarDef3]
-(xx, (z, i)) = 1 # type: (a[c], (Any, int))
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    TupleExpr:1(
-      NameExpr(xx)
-      TupleExpr:1(
-        NameExpr(z)
-        NameExpr(i)))
-    IntExpr(1)
-    Tuple[a?[c?], Tuple[Any?, int?]]))
-
-[case testAnnotateAssignmentViaSelf]
-class A:
-    def __init__(self):
-        self.x = 1 # type: int
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      __init__
-      Args(
-        Var(self))
-      Block:2(
-        AssignmentStmt:3(
-          MemberExpr:3(
-            NameExpr(self)
-            x)
-          IntExpr(1)
-          int?)))))
-
-[case testCommentAfterTypeComment]
-x = 0 # type: int # bar!
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    IntExpr(0)
-    int?))
-
-[case testMultilineAssignmentAndAnnotations]
-(x,
- y) = (1,
-      2) # type: foo, bar
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    TupleExpr:1(
-      NameExpr(x)
-      NameExpr(y))
-    TupleExpr:2(
-      IntExpr(1)
-      IntExpr(2))
-    Tuple[foo?, bar?]))
-
-[case testWhitespaceAndCommentAnnotation]
-x = 1#type:int
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    IntExpr(1)
-    int?))
-
-[case testWhitespaceAndCommentAnnotation2]
-x = 1#   type:   int
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    IntExpr(1)
-    int?))
-
-[case testWhitespaceAndCommentAnnotation3]
-x = 1# type : int       # not recognized!
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    IntExpr(1)))
-
-[case testInvalidAnnotation]
-x=1 ##type: int
-y=1 #.type: int
-z=1 # Type: int
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    IntExpr(1))
-  AssignmentStmt:2(
-    NameExpr(y)
-    IntExpr(1))
-  AssignmentStmt:3(
-    NameExpr(z)
-    IntExpr(1)))
-
-[case testEmptyClass]
-class C:
-  pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    C
-    PassStmt:2()))
-
-[case testOperatorPrecedence]
-a | b ^ c
-a & b << c
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    OpExpr:1(
-      |
-      NameExpr(a)
-      OpExpr:1(
-        ^
-        NameExpr(b)
-        NameExpr(c))))
-  ExpressionStmt:2(
-    OpExpr:2(
-      &
-      NameExpr(a)
-      OpExpr:2(
-        <<
-        NameExpr(b)
-        NameExpr(c)))))
-
-[case testOperatorAssociativity]
-1 - 2 + 3
-1 << 2 << 3
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    OpExpr:1(
-      +
-      OpExpr:1(
-        -
-        IntExpr(1)
-        IntExpr(2))
-      IntExpr(3)))
-  ExpressionStmt:2(
-    OpExpr:2(
-      <<
-      OpExpr:2(
-        <<
-        IntExpr(1)
-        IntExpr(2))
-      IntExpr(3))))
-
-[case testUnaryOperators]
--2 * +3 * ~3 * 2
-~3**2
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    OpExpr:1(
-      *
-      OpExpr:1(
-        *
-        OpExpr:1(
-          *
-          UnaryExpr:1(
-            -
-            IntExpr(2))
-          UnaryExpr:1(
-            +
-            IntExpr(3)))
-        UnaryExpr:1(
-          ~
-          IntExpr(3)))
-      IntExpr(2)))
-  ExpressionStmt:2(
-    UnaryExpr:2(
-      ~
-      OpExpr:2(
-        **
-        IntExpr(3)
-        IntExpr(2)))))
-
-[case testSingleLineBodies]
-if 1: pass
-while 1: pass
-def f(): pass
-def g() -> int: return 1
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      IntExpr(1))
-    Then(
-      PassStmt:1()))
-  WhileStmt:2(
-    IntExpr(1)
-    Block:2(
-      PassStmt:2()))
-  FuncDef:3(
-    f
-    Block:3(
-      PassStmt:3()))
-  FuncDef:4(
-    g
-    def () -> int?
-    Block:4(
-      ReturnStmt:4(
-        IntExpr(1)))))
-
-[case testForStatement]
-for x in y:
-  pass
-for x, (y, w) in z:
-  1
-for [x, (y, w)] in z:
-  1
-[out]
-MypyFile:1(
-  ForStmt:1(
-    NameExpr(x)
-    NameExpr(y)
-    Block:1(
-      PassStmt:2()))
-  ForStmt:3(
-    TupleExpr:3(
-      NameExpr(x)
-      TupleExpr:3(
-        NameExpr(y)
-        NameExpr(w)))
-    NameExpr(z)
-    Block:3(
-      ExpressionStmt:4(
-        IntExpr(1))))
-  ForStmt:5(
-    ListExpr:5(
-      NameExpr(x)
-      TupleExpr:5(
-        NameExpr(y)
-        NameExpr(w)))
-    NameExpr(z)
-    Block:5(
-      ExpressionStmt:6(
-        IntExpr(1)))))
-
-[case testGlobalDecl]
-global x
-def f():
-  global x, y
-[out]
-MypyFile:1(
-  GlobalDecl:1(
-    x)
-  FuncDef:2(
-    f
-    Block:2(
-      GlobalDecl:3(
-        x
-        y))))
-
-[case testNonlocalDecl]
-def f():
-  def g():
-    nonlocal x, y
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      FuncDef:2(
-        g
-        Block:2(
-          NonlocalDecl:3(
-            x
-            y))))))
-
-[case testRaiseStatement]
-raise foo
-[out]
-MypyFile:1(
-  RaiseStmt:1(
-    NameExpr(foo)))
-
-[case testRaiseWithoutArg]
-try:
-  pass
-except:
-  raise
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      PassStmt:2())
-    Block:3(
-      RaiseStmt:4())))
-
-[case testRaiseFrom]
-raise e from x
-[out]
-MypyFile:1(
-  RaiseStmt:1(
-    NameExpr(e)
-    NameExpr(x)))
-
-[case testBaseclasses]
-class A(B):
-  pass
-class A(B[T], C[Any, d[x]]):
-  pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    BaseTypeExpr(
-      NameExpr(B))
-    PassStmt:2())
-  ClassDef:3(
-    A
-    BaseTypeExpr(
-      IndexExpr:3(
-        NameExpr(B)
-        NameExpr(T))
-      IndexExpr:3(
-        NameExpr(C)
-        TupleExpr:3(
-          NameExpr(Any)
-          IndexExpr:3(
-            NameExpr(d)
-            NameExpr(x)))))
-    PassStmt:4()))
-
-[case testIsNot]
-x is not y
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    ComparisonExpr:1(
-      is not
-      NameExpr(x)
-      NameExpr(y))))
-
-[case testNotAsRightOperand]
-x in not y
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    ComparisonExpr:1(
-      in
-      NameExpr(x)
-      UnaryExpr:1(
-        not
-        NameExpr(y)))))
-
-[case testNotIn]
-x not in y
-not x not in y
-x not in y | z
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    ComparisonExpr:1(
-      not in
-      NameExpr(x)
-      NameExpr(y)))
-  ExpressionStmt:2(
-    UnaryExpr:2(
-      not
-      ComparisonExpr:2(
-        not in
-        NameExpr(x)
-        NameExpr(y))))
-  ExpressionStmt:3(
-    ComparisonExpr:3(
-      not in
-      NameExpr(x)
-      OpExpr:3(
-        |
-        NameExpr(y)
-        NameExpr(z)))))
-
-[case testNotAsBinaryOp]
-x not y # E: Parse error before "y"
-x not is y # E: Parse error before is
-[out]
-
-[case testBinaryNegAsBinaryOp]
-1 ~ 2 # E: Parse error before ~
-[out]
-
-[case testDictionaryExpression]
-{}
-{1:x}
-{1:x, 2 or 1:2 and 3}
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    DictExpr:1())
-  ExpressionStmt:2(
-    DictExpr:2(
-      IntExpr(1)
-      NameExpr(x)))
-  ExpressionStmt:3(
-    DictExpr:3(
-      IntExpr(1)
-      NameExpr(x)
-      OpExpr:3(
-        or
-        IntExpr(2)
-        IntExpr(1))
-      OpExpr:3(
-        and
-        IntExpr(2)
-        IntExpr(3)))))
-
-[case testImport]
-import x
-import y.z.foo, __foo__.bar
-[out]
-MypyFile:1(
-  Import:1(x)
-  Import:2(y.z.foo, __foo__.bar))
-
-[case testVariableTypeWithQualifiedName]
-x = None # type: x.y
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    NameExpr(None)
-    x.y?))
-
-[case testTypeInSignatureWithQualifiedName]
-def f() -> x.y[a.b.c]: pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def () -> x.y?[a.b.c?]
-    Block:1(
-      PassStmt:1())))
-
-[case testImportFrom]
-from m import x
-from m.n import x, y, z
-[out]
-MypyFile:1(
-  ImportFrom:1(m, [x])
-  ImportFrom:2(m.n, [x, y, z]))
-
-[case testImportFromAs]
-from m import x as y
-from x import y, z as a, c as c
-[out]
-MypyFile:1(
-  ImportFrom:1(m, [x : y])
-  ImportFrom:2(x, [y, z : a, c : c]))
-
-[case testImportStar]
-from x import *
-[out]
-MypyFile:1(
-  ImportAll:1(x))
-
-[case testImportsInDifferentPlaces]
-1
-import x
-def f():
-  from x import y
-  from z import *
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    IntExpr(1))
-  Import:2(x)
-  FuncDef:3(
-    f
-    Block:3(
-      ImportFrom:4(x, [y])
-      ImportAll:5(z))))
-
-[case testImportWithExtraComma]
-from x import (y, z,)
-[out]
-MypyFile:1(
-  ImportFrom:1(x, [y, z]))
-
-[case testDefaultArgs]
-def f(x=1):
-  pass
-def g(x, y=1+2, z=(1, 2)):
-  pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    Init(
-      AssignmentStmt:1(
-        NameExpr(x)
-        IntExpr(1)))
-    Block:1(
-      PassStmt:2()))
-  FuncDef:3(
-    g
-    Args(
-      Var(x)
-      Var(y)
-      Var(z))
-    Init(
-      AssignmentStmt:3(
-        NameExpr(y)
-        OpExpr:3(
-          +
-          IntExpr(1)
-          IntExpr(2)))
-      AssignmentStmt:3(
-        NameExpr(z)
-        TupleExpr:3(
-          IntExpr(1)
-          IntExpr(2))))
-    Block:3(
-      PassStmt:4())))
-
-[case testTryFinally]
-try:
-  1
-finally:
-  2
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      ExpressionStmt:2(
-        IntExpr(1)))
-    Finally(
-      ExpressionStmt:4(
-        IntExpr(2)))))
-
-[case testTry]
-try:
-  1
-except x:
-  2
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      ExpressionStmt:2(
-        IntExpr(1)))
-    NameExpr(x)
-    Block:3(
-      ExpressionStmt:4(
-        IntExpr(2)))))
-
-[case testComplexTry]
-try:
-  1
-except x as y:
-  2
-except x.y:
-  3
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      ExpressionStmt:2(
-        IntExpr(1)))
-    NameExpr(x)
-    NameExpr(y)
-    Block:3(
-      ExpressionStmt:4(
-        IntExpr(2)))
-    MemberExpr:5(
-      NameExpr(x)
-      y)
-    Block:5(
-      ExpressionStmt:6(
-        IntExpr(3)))))
-
-[case testGeneratorExpression]
-x for y in z
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    GeneratorExpr:1(
-      NameExpr(x)
-      NameExpr(y)
-      NameExpr(z))))
-
-[case testGeneratorExpressionNested]
-x for y, (p, q) in z
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    GeneratorExpr:1(
-      NameExpr(x)
-      TupleExpr:1(
-        NameExpr(y)
-        TupleExpr:1(
-          NameExpr(p)
-          NameExpr(q)))
-      NameExpr(z))))
-
-[case testListComprehension]
-x=[x for y in z]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    ListComprehension:1(
-      GeneratorExpr:1(
-        NameExpr(x)
-        NameExpr(y)
-        NameExpr(z)))))
-
-[case testComplexListComprehension]
-x=[(x, y) for y, z in (1, 2)]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    ListComprehension:1(
-      GeneratorExpr:1(
-        TupleExpr:1(
-          NameExpr(x)
-          NameExpr(y))
-        TupleExpr:1(
-          NameExpr(y)
-          NameExpr(z))
-        TupleExpr:1(
-          IntExpr(1)
-          IntExpr(2))))))
-
-[case testListComprehension2]
-([x + 1 for x in a])
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    ListComprehension:1(
-      GeneratorExpr:1(
-        OpExpr:1(
-          +
-          NameExpr(x)
-          IntExpr(1))
-        NameExpr(x)
-        NameExpr(a)))))
-
-[case testSlices]
-x[1:2]
-x[:1]
-x[1:]
-x[:]
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    IndexExpr:1(
-      NameExpr(x)
-      SliceExpr:1(
-        IntExpr(1)
-        IntExpr(2))))
-  ExpressionStmt:2(
-    IndexExpr:2(
-      NameExpr(x)
-      SliceExpr:2(
-        <empty>
-        IntExpr(1))))
-  ExpressionStmt:3(
-    IndexExpr:3(
-      NameExpr(x)
-      SliceExpr:3(
-        IntExpr(1)
-        <empty>)))
-  ExpressionStmt:4(
-    IndexExpr:4(
-      NameExpr(x)
-      SliceExpr:4(
-        <empty>
-        <empty>))))
-
-[case testSliceWithStride]
-x[1:2:3]
-x[1::2]
-x[:1:2]
-x[::2]
-x[1:2:]
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    IndexExpr:1(
-      NameExpr(x)
-      SliceExpr:1(
-        IntExpr(1)
-        IntExpr(2)
-        IntExpr(3))))
-  ExpressionStmt:2(
-    IndexExpr:2(
-      NameExpr(x)
-      SliceExpr:2(
-        IntExpr(1)
-        <empty>
-        IntExpr(2))))
-  ExpressionStmt:3(
-    IndexExpr:3(
-      NameExpr(x)
-      SliceExpr:3(
-        <empty>
-        IntExpr(1)
-        IntExpr(2))))
-  ExpressionStmt:4(
-    IndexExpr:4(
-      NameExpr(x)
-      SliceExpr:4(
-        <empty>
-        <empty>
-        IntExpr(2))))
-  ExpressionStmt:5(
-    IndexExpr:5(
-      NameExpr(x)
-      SliceExpr:5(
-        IntExpr(1)
-        IntExpr(2)))))
-
-[case testYield]
-def f():
-    yield x + 1
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ExpressionStmt:2(
-        YieldExpr:2(
-          OpExpr:2(
-            +
-            NameExpr(x)
-            IntExpr(1)))))))
-
-[case testYieldFrom]
-def f():
-    yield from h()
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ExpressionStmt:2(
-        YieldFromExpr:2(
-          CallExpr:2(
-            NameExpr(h)
-            Args()))))))
-
-[case testYieldFromAssignment]
-def f():
-    a = yield from h()
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      AssignmentStmt:2(
-        NameExpr(a)
-        YieldFromExpr:2(
-          CallExpr:2(
-            NameExpr(h)
-            Args()))))))
-
-[case testDel]
-del x
-del x[0], y[1]
-[out]
-MypyFile:1(
-  DelStmt:1(
-    NameExpr(x))
-  DelStmt:2(
-    TupleExpr:2(
-      IndexExpr:2(
-        NameExpr(x)
-        IntExpr(0))
-      IndexExpr:2(
-        NameExpr(y)
-        IntExpr(1)))))
-
-[case testExtraCommas]
-1, 2,
-+[1, 2,]
-f(1,)
-{1:2,}
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    TupleExpr:1(
-      IntExpr(1)
-      IntExpr(2)))
-  ExpressionStmt:2(
-    UnaryExpr:2(
-      +
-      ListExpr:2(
-        IntExpr(1)
-        IntExpr(2))))
-  ExpressionStmt:3(
-    CallExpr:3(
-      NameExpr(f)
-      Args(
-        IntExpr(1))))
-  ExpressionStmt:4(
-    DictExpr:4(
-      IntExpr(1)
-      IntExpr(2))))
-
-[case testExtraCommaInFunc]
-def f(x,):
-  pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    Block:1(
-      PassStmt:2())))
-
-[case testLambda]
-lambda: 1
-lambda x: y + 1
-lambda x, y: 1
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    FuncExpr:1(
-      Block:1(
-        ReturnStmt:1(
-          IntExpr(1)))))
-  ExpressionStmt:2(
-    FuncExpr:2(
-      Args(
-        Var(x))
-      Block:2(
-        ReturnStmt:2(
-          OpExpr:2(
-            +
-            NameExpr(y)
-            IntExpr(1))))))
-  ExpressionStmt:3(
-    FuncExpr:3(
-      Args(
-        Var(x)
-        Var(y))
-      Block:3(
-        ReturnStmt:3(
-          IntExpr(1))))))
-
-[case testComplexLambda]
-lambda x=2: x
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    FuncExpr:1(
-      Args(
-        Var(x))
-      Init(
-        AssignmentStmt:1(
-          NameExpr(x)
-          IntExpr(2)))
-      Block:1(
-        ReturnStmt:1(
-          NameExpr(x))))))
-
-[case testLambdaPrecedence]
-lambda x: 1, 2
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    TupleExpr:1(
-      FuncExpr:1(
-        Args(
-          Var(x))
-        Block:1(
-          ReturnStmt:1(
-            IntExpr(1))))
-      IntExpr(2))))
-
-[case testForIndicesInParens]
-for (i, j) in x:
-  pass
-[out]
-MypyFile:1(
-  ForStmt:1(
-    TupleExpr:1(
-      NameExpr(i)
-      NameExpr(j))
-    NameExpr(x)
-    Block:1(
-      PassStmt:2())))
-
-[case testForAndTrailingCommaAfterIndexVar]
-for i, in x:
-    pass
-[out]
-MypyFile:1(
-  ForStmt:1(
-    TupleExpr:1(
-      NameExpr(i))
-    NameExpr(x)
-    Block:1(
-      PassStmt:2())))
-
-[case testListComprehensionAndTrailingCommaAfterIndexVar]
-x = [a for b, in c]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    ListComprehension:1(
-      GeneratorExpr:1(
-        NameExpr(a)
-        TupleExpr:1(
-          NameExpr(b))
-        NameExpr(c)))))
-
-[case testForAndTrailingCommaAfterIndexVars]
-for i, j, in x:
-    pass
-[out]
-MypyFile:1(
-  ForStmt:1(
-    TupleExpr:1(
-      NameExpr(i)
-      NameExpr(j))
-    NameExpr(x)
-    Block:1(
-      PassStmt:2())))
-
-[case testGeneratorWithCondition]
-x for y in z if 0
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    GeneratorExpr:1(
-      NameExpr(x)
-      NameExpr(y)
-      NameExpr(z)
-      IntExpr(0))))
-
-[case testListComprehensionWithCondition]
-raise [x for y in z if 0]
-[out]
-MypyFile:1(
-  RaiseStmt:1(
-    ListComprehension:1(
-      GeneratorExpr:1(
-        NameExpr(x)
-        NameExpr(y)
-        NameExpr(z)
-        IntExpr(0)))))
-
-[case testListComprehensionWithConditions]
-raise [x for y in z if 0 if 1]
-[out]
-MypyFile:1(
-  RaiseStmt:1(
-    ListComprehension:1(
-      GeneratorExpr:1(
-        NameExpr(x)
-        NameExpr(y)
-        NameExpr(z)
-        IntExpr(0)
-        IntExpr(1)))))
-
-[case testListComprehensionWithCrazyConditions]
-raise [x for y in z if (1 if 2 else 3) if 1]
-[out]
-MypyFile:1(
-  RaiseStmt:1(
-    ListComprehension:1(
-      GeneratorExpr:1(
-        NameExpr(x)
-        NameExpr(y)
-        NameExpr(z)
-        ConditionalExpr:1(
-          Condition(
-            IntExpr(2))
-          IntExpr(1)
-          IntExpr(3))
-        IntExpr(1)))))
-
-[case testDictionaryComprehension]
-a = {x: y for x, y in xys}
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a)
-    DictionaryComprehension:1(
-      NameExpr(x)
-      NameExpr(y)
-      TupleExpr:1(
-        NameExpr(x)
-        NameExpr(y))
-      NameExpr(xys))))
-
-[case testDictionaryComprehensionComplex]
-a = {x: y for x, y in xys for p, q in pqs if c}
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a)
-    DictionaryComprehension:1(
-      NameExpr(x)
-      NameExpr(y)
-      TupleExpr:1(
-        NameExpr(x)
-        NameExpr(y))
-      TupleExpr:1(
-        NameExpr(p)
-        NameExpr(q))
-      NameExpr(xys)
-      NameExpr(pqs)
-      NameExpr(c))))
-
-[case testSetComprehension]
-a = {i for i in l}
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a)
-    SetComprehension:1(
-      GeneratorExpr:1(
-        NameExpr(i)
-        NameExpr(i)
-        NameExpr(l)))))
-
-[case testSetComprehensionComplex]
-a = {x + p for x in xys for p in pqs if c}
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a)
-    SetComprehension:1(
-      GeneratorExpr:1(
-        OpExpr:1(
-          +
-          NameExpr(x)
-          NameExpr(p))
-        NameExpr(x)
-        NameExpr(p)
-        NameExpr(xys)
-        NameExpr(pqs)
-        NameExpr(c)))))
-
-[case testWithStatement]
-with open('foo') as f:
-  pass
-[out]
-MypyFile:1(
-  WithStmt:1(
-    Expr(
-      CallExpr:1(
-        NameExpr(open)
-        Args(
-          StrExpr(foo))))
-    Target(
-      NameExpr(f))
-    Block:1(
-      PassStmt:2())))
-
-[case testWithStatementWithoutTarget]
-with foo:
-  pass
-[out]
-MypyFile:1(
-  WithStmt:1(
-    Expr(
-      NameExpr(foo))
-    Block:1(
-      PassStmt:2())))
-
-[case testHexOctBinLiterals]
-0xa, 0Xaf, 0o7, 0O12, 0b1, 0B101
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    TupleExpr:1(
-      IntExpr(10)
-      IntExpr(175)
-      IntExpr(7)
-      IntExpr(10)
-      IntExpr(1)
-      IntExpr(5))))
-
-[case testImportFromWithParens]
-from x import (y)
-from x import (y,
-               z)
-[out]
-MypyFile:1(
-  ImportFrom:1(x, [y])
-  ImportFrom:2(x, [y, z]))
-
-[case testContinueStmt]
-while 1:
-  continue
-[out]
-MypyFile:1(
-  WhileStmt:1(
-    IntExpr(1)
-    Block:1(
-      ContinueStmt:2())))
-
-[case testStrLiteralConcatenate]
-'f' 'bar'
-('x'
- 'y'
- 'z')
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StrExpr(fbar))
-  ExpressionStmt:2(
-    StrExpr(xyz)))
-
-[case testCatchAllExcept]
-try:
-  1
-except:
-  pass
-try:
-  1
-except x:
-  pass
-except:
-  2
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      ExpressionStmt:2(
-        IntExpr(1)))
-    Block:3(
-      PassStmt:4()))
-  TryStmt:5(
-    Block:5(
-      ExpressionStmt:6(
-        IntExpr(1)))
-    NameExpr(x)
-    Block:7(
-      PassStmt:8())
-    Block:9(
-      ExpressionStmt:10(
-        IntExpr(2)))))
-
-[case testTryElse]
-try:
-  pass
-except x:
-  1
-else:
-  2
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      PassStmt:2())
-    NameExpr(x)
-    Block:3(
-      ExpressionStmt:4(
-        IntExpr(1)))
-    Else(
-      ExpressionStmt:6(
-        IntExpr(2)))))
-
-[case testExceptWithMultipleTypes]
-try:
-  pass
-except (x, y):
-  pass
-except (a, b, c) as e:
-  pass
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      PassStmt:2())
-    TupleExpr:3(
-      NameExpr(x)
-      NameExpr(y))
-    Block:3(
-      PassStmt:4())
-    TupleExpr:5(
-      NameExpr(a)
-      NameExpr(b)
-      NameExpr(c))
-    NameExpr(e)
-    Block:5(
-      PassStmt:6())))
-
-[case testNestedFunctions]
-def f():
-  def g():
-    pass
-def h() -> int:
-  def g() -> int:
-    pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      FuncDef:2(
-        g
-        Block:2(
-          PassStmt:3()))))
-  FuncDef:4(
-    h
-    def () -> int?
-    Block:4(
-      FuncDef:5(
-        g
-        def () -> int?
-        Block:5(
-          PassStmt:6())))))
-
-[case testStatementsAndDocStringsInClassBody]
-class A:
-  "doc string"
-  x = y
-  def f(self):
-    pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    ExpressionStmt:2(
-      StrExpr(doc string))
-    AssignmentStmt:3(
-      NameExpr(x)
-      NameExpr(y))
-    FuncDef:4(
-      f
-      Args(
-        Var(self))
-      Block:4(
-        PassStmt:5()))))
-
-[case testSingleLineClass]
-class a: pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    a
-    PassStmt:1()))
-
-[case testDecorator]
- at property
-def f():
-  pass
-[out]
-MypyFile:1(
-  Decorator:1(
-    Var(f)
-    NameExpr(property)
-    FuncDef:2(
-      f
-      Block:2(
-        PassStmt:3()))))
-
-[case testComplexDecorator]
- at foo(bar, 1)
- at zar
-def f() -> int:
-  pass
-[out]
-MypyFile:1(
-  Decorator:1(
-    Var(f)
-    CallExpr:1(
-      NameExpr(foo)
-      Args(
-        NameExpr(bar)
-        IntExpr(1)))
-    NameExpr(zar)
-    FuncDef:3(
-      f
-      def () -> int?
-      Block:3(
-        PassStmt:4()))))
-
-[case testKeywordArgInCall]
-f(x=1)
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    CallExpr:1(
-      NameExpr(f)
-      Args()
-      KwArgs(
-        x
-        IntExpr(1)))))
-
-[case testComplexKeywordArgs]
-f(x, y=1 or 2, z=y)
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    CallExpr:1(
-      NameExpr(f)
-      Args(
-        NameExpr(x))
-      KwArgs(
-        y
-        OpExpr:1(
-          or
-          IntExpr(1)
-          IntExpr(2)))
-      KwArgs(
-        z
-        NameExpr(y)))))
-
-[case testChainedAssignment]
-x = z = 1
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x)
-      NameExpr(z))
-    IntExpr(1)))
-
-[case testVarArgs]
-def f(x, *a): pass
-f(1, *2)
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    VarArg(
-      Var(a))
-    Block:1(
-      PassStmt:1()))
-  ExpressionStmt:2(
-    CallExpr:2(
-      NameExpr(f)
-      Args(
-        IntExpr(1)
-        IntExpr(2))
-      VarArg)))
-
-[case testVarArgWithType]
-def f(x: str, *a: int): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    def (x: str?, *a: int?) -> Any
-    VarArg(
-      Var(a))
-    Block:1(
-      PassStmt:1())))
-
-[case testDictVarArgs]
-def f(x, **a): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    DictVarArg(
-      Var(a))
-    Block:1(
-      PassStmt:1())))
-
-[case testBothVarArgs]
-def f(x, *a, **b): pass
-def g(*a, **b): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    VarArg(
-      Var(a))
-    DictVarArg(
-      Var(b))
-    Block:1(
-      PassStmt:1()))
-  FuncDef:2(
-    g
-    VarArg(
-      Var(a))
-    DictVarArg(
-      Var(b))
-    Block:2(
-      PassStmt:2())))
-
-[case testDictVarArgsWithType]
-def f(x: X, **a: A) -> None: pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    def (x: X?, **a: A?) -> None?
-    DictVarArg(
-      Var(a))
-    Block:1(
-      PassStmt:1())))
-
-[case testCallDictVarArgs]
-f(**x)
-f(x, **y)
-f(*x, **y)
-f(x, *y, **z)
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    CallExpr:1(
-      NameExpr(f)
-      Args()
-      DictVarArg(
-        NameExpr(x))))
-  ExpressionStmt:2(
-    CallExpr:2(
-      NameExpr(f)
-      Args(
-        NameExpr(x))
-      DictVarArg(
-        NameExpr(y))))
-  ExpressionStmt:3(
-    CallExpr:3(
-      NameExpr(f)
-      Args(
-        NameExpr(x))
-      VarArg
-      DictVarArg(
-        NameExpr(y))))
-  ExpressionStmt:4(
-    CallExpr:4(
-      NameExpr(f)
-      Args(
-        NameExpr(x)
-        NameExpr(y))
-      VarArg
-      DictVarArg(
-        NameExpr(z)))))
-
-[case testAssert]
-assert x == y
-[out]
-MypyFile:1(
-  AssertStmt:1(
-    ComparisonExpr:1(
-      ==
-      NameExpr(x)
-      NameExpr(y))))
-
-[case testYieldWithoutExpressions]
-def f():
-  yield
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ExpressionStmt:2(
-        YieldExpr:2()))))
-
-[case testConditionalExpression]
-x if y else z
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    ConditionalExpr:1(
-      Condition(
-        NameExpr(y))
-      NameExpr(x)
-      NameExpr(z))))
-
-[case testConditionalExpressionInListComprehension]
-a = [x if y else z for a in b]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a)
-    ListComprehension:1(
-      GeneratorExpr:1(
-        ConditionalExpr:1(
-          Condition(
-            NameExpr(y))
-          NameExpr(x)
-          NameExpr(z))
-        NameExpr(a)
-        NameExpr(b)))))
-
-[case testConditionalExpressionInTuple]
-1 if 2 else 3, 4
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    TupleExpr:1(
-      ConditionalExpr:1(
-        Condition(
-          IntExpr(2))
-        IntExpr(1)
-        IntExpr(3))
-      IntExpr(4))))
-
-[case testSetLiteral]
-{x or y}
-{1, 2}
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    SetExpr:1(
-      OpExpr:1(
-        or
-        NameExpr(x)
-        NameExpr(y))))
-  ExpressionStmt:2(
-    SetExpr:2(
-      IntExpr(1)
-      IntExpr(2))))
-
-[case testSetLiteralWithExtraComma]
-{x,}
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    SetExpr:1(
-      NameExpr(x))))
-
-[case testImportAs]
-import x as y
-import x, z as y, a.b as c, d as d
-[out]
-MypyFile:1(
-  Import:1(x : y)
-  Import:2(x, z : y, a.b : c, d : d))
-
-[case testForAndElse]
-for x in y:
-  pass
-else:
-  x
-[out]
-MypyFile:1(
-  ForStmt:1(
-    NameExpr(x)
-    NameExpr(y)
-    Block:1(
-      PassStmt:2())
-    Else(
-      ExpressionStmt:4(
-        NameExpr(x)))))
-
-[case testWhileAndElse]
-while x:
-  pass
-else:
-  y
-[out]
-MypyFile:1(
-  WhileStmt:1(
-    NameExpr(x)
-    Block:1(
-      PassStmt:2())
-    Else(
-      ExpressionStmt:4(
-        NameExpr(y)))))
-
-[case testWithAndMultipleOperands]
-with x as y, a as b:
-  pass
-with x(), y():
-  pass
-[out]
-MypyFile:1(
-  WithStmt:1(
-    Expr(
-      NameExpr(x))
-    Target(
-      NameExpr(y))
-    Expr(
-      NameExpr(a))
-    Target(
-      NameExpr(b))
-    Block:1(
-      PassStmt:2()))
-  WithStmt:3(
-    Expr(
-      CallExpr:3(
-        NameExpr(x)
-        Args()))
-    Expr(
-      CallExpr:3(
-        NameExpr(y)
-        Args()))
-    Block:3(
-      PassStmt:4())))
-
-[case testOperatorAssignment]
-x += 1
-x -= 1
-x *= 1
-x /= 1
-x //= 1
-x %= 1
-x **= 1
-x |= 1
-x &= 1
-x ^= 1
-x >>= 1
-x <<= 1
-[out]
-MypyFile:1(
-  OperatorAssignmentStmt:1(
-    +
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:2(
-    -
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:3(
-    *
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:4(
-    /
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:5(
-    //
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:6(
-    %
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:7(
-    **
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:8(
-    |
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:9(
-    &
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:10(
-    ^
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:11(
-    >>
-    NameExpr(x)
-    IntExpr(1))
-  OperatorAssignmentStmt:12(
-    <<
-    NameExpr(x)
-    IntExpr(1)))
-
-[case testNestedClasses]
-class A:
-  class B:
-    pass
-  class C:
-    pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    ClassDef:2(
-      B
-      PassStmt:3())
-    ClassDef:4(
-      C
-      PassStmt:5())))
-
-[case testTryWithExceptAndFinally]
-try:
-  pass
-except x:
-  x
-finally:
-  y
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      PassStmt:2())
-    NameExpr(x)
-    Block:3(
-      ExpressionStmt:4(
-        NameExpr(x)))
-    Finally(
-      ExpressionStmt:6(
-        NameExpr(y)))))
-
-[case testBareAsteriskInFuncDef]
-def f(x, *, y=1): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    MaxPos(1)
-    Args(
-      Var(x)
-      Var(y))
-    Init(
-      AssignmentStmt:1(
-        NameExpr(y)
-        IntExpr(1)))
-    Block:1(
-      PassStmt:1())))
-
-[case testBareAsteriskInFuncDefWithSignature]
-def f(x: A, *, y: B = 1) -> None: pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    MaxPos(1)
-    Args(
-      Var(x)
-      Var(y))
-    def (x: A?, *, y: B? =) -> None?
-    Init(
-      AssignmentStmt:1(
-        NameExpr(y)
-        IntExpr(1)))
-    Block:1(
-      PassStmt:1())))
-
-[case testBareAsteriskNamedDefault]
-def f(*, y: B = 1) -> None: pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    MaxPos(0)
-    Args(
-      Var(y))
-    def (*, y: B? =) -> None?
-    Init(
-      AssignmentStmt:1(
-        NameExpr(y)
-        IntExpr(1)))
-    Block:1(
-      PassStmt:1())))
-
-[case testBareAsteriskNamedNoDefault]
-def f(*, y: B) -> None: pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    MaxPos(0)
-    Args(
-      Var(y))
-    def (*, y: B?) -> None?
-    Block:1(
-      PassStmt:1())))
-
-[case testSuperExpr]
-super().x
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    SuperExpr:1(
-      x)))
-
-[case testKeywordAndDictArgs]
-f(x = y, **kwargs)
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    CallExpr:1(
-      NameExpr(f)
-      Args()
-      KwArgs(
-        x
-        NameExpr(y))
-      DictVarArg(
-        NameExpr(kwargs)))))
-
-[case testSimpleFunctionType]
-f = None # type: Callable[[], None]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(f)
-    NameExpr(None)
-    Callable?[<TypeList >, None?]))
-
-[case testFunctionTypeWithArgument]
-f = None # type: Callable[[str], int]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(f)
-    NameExpr(None)
-    Callable?[<TypeList str?>, int?]))
-
-[case testFunctionTypeWithTwoArguments]
-f = None # type: Callable[[a[b], x.y], List[int]]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(f)
-    NameExpr(None)
-    Callable?[<TypeList a?[b?], x.y?>, List?[int?]]))
-
-[case testFunctionTypeWithExtraComma]
-def f(x: Callable[[str,], int]): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    def (x: Callable?[<TypeList str?>, int?]) -> Any
-    Block:1(
-      PassStmt:1())))
-
-[case testSimpleStringLiteralType]
-def f() -> 'A': pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def () -> A?
-    Block:1(
-      PassStmt:1())))
-
-[case testGenericStringLiteralType]
-def f() -> 'A[B, C]': pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def () -> A?[B?, C?]
-    Block:1(
-      PassStmt:1())))
-
-[case testPartialStringLiteralType]
-def f() -> A['B', C]: pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def () -> A?[B?, C?]
-    Block:1(
-      PassStmt:1())))
-
-[case testWhitespaceInStringLiteralType]
-def f() -> '  A  [  X  ]  ': pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def () -> A?[X?]
-    Block:1(
-      PassStmt:1())))
-
-[case testEscapeInStringLiteralType]
-def f() -> '\x41': pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def () -> A?
-    Block:1(
-      PassStmt:1())))
-
-[case testMetaclass]
-class Foo(metaclass=Bar): pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    Foo
-    Metaclass(Bar)
-    PassStmt:1()))
-
-[case testQualifiedMetaclass]
-class Foo(metaclass=foo.Bar): pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    Foo
-    Metaclass(foo.Bar)
-    PassStmt:1()))
-
-[case testBaseAndMetaclass]
-class Foo(foo.bar[x], metaclass=Bar): pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    Foo
-    Metaclass(Bar)
-    BaseTypeExpr(
-      IndexExpr:1(
-        MemberExpr:1(
-          NameExpr(foo)
-          bar)
-        NameExpr(x)))
-    PassStmt:1()))
-
-[case testClassKeywordArgs]
-class Foo(_root=None): pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    Foo
-    PassStmt:1()))
-
-[case testClassKeywordArgsBeforeMeta]
-class Foo(_root=None, metaclass=Bar): pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    Foo
-    Metaclass(Bar)
-    PassStmt:1()))
-
-[case testClassKeywordArgsAfterMeta]
-class Foo(metaclass=Bar, _root=None): pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    Foo
-    Metaclass(Bar)
-    PassStmt:1()))
-
-[case testNamesThatAreNoLongerKeywords]
-any = interface
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(any)
-    NameExpr(interface)))
-
-[case testFunctionOverload]
- at foo
-def f() -> x: pass
- at foo
-def f() -> y: pass
-[out]
-MypyFile:1(
-  OverloadedFuncDef:1(
-    Decorator:1(
-      Var(f)
-      NameExpr(foo)
-      FuncDef:2(
-        f
-        def () -> x?
-        Block:2(
-          PassStmt:2())))
-    Decorator:3(
-      Var(f)
-      NameExpr(foo)
-      FuncDef:4(
-        f
-        def () -> y?
-        Block:4(
-          PassStmt:4())))))
-
-[case testFunctionOverloadAndOtherStatements]
-x
- at foo
-def f() -> x: pass
- at foo
-def f() -> y: pass
-x
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    NameExpr(x))
-  OverloadedFuncDef:2(
-    Decorator:2(
-      Var(f)
-      NameExpr(foo)
-      FuncDef:3(
-        f
-        def () -> x?
-        Block:3(
-          PassStmt:3())))
-    Decorator:4(
-      Var(f)
-      NameExpr(foo)
-      FuncDef:5(
-        f
-        def () -> y?
-        Block:5(
-          PassStmt:5()))))
-  ExpressionStmt:6(
-    NameExpr(x)))
-
-[case testFunctionOverloadWithThreeVariants]
- at foo
-def f() -> x: pass
- at foo
-def f() -> y: pass
- at foo
-def f(y): pass
-[out]
-MypyFile:1(
-  OverloadedFuncDef:1(
-    Decorator:1(
-      Var(f)
-      NameExpr(foo)
-      FuncDef:2(
-        f
-        def () -> x?
-        Block:2(
-          PassStmt:2())))
-    Decorator:3(
-      Var(f)
-      NameExpr(foo)
-      FuncDef:4(
-        f
-        def () -> y?
-        Block:4(
-          PassStmt:4())))
-    Decorator:5(
-      Var(f)
-      NameExpr(foo)
-      FuncDef:6(
-        f
-        Args(
-          Var(y))
-        Block:6(
-          PassStmt:6())))))
-
-[case testDecoratorsThatAreNotOverloads]
- at foo
-def f() -> x: pass
- at foo
-def g() -> y: pass
-[out]
-MypyFile:1(
-  Decorator:1(
-    Var(f)
-    NameExpr(foo)
-    FuncDef:2(
-      f
-      def () -> x?
-      Block:2(
-        PassStmt:2())))
-  Decorator:3(
-    Var(g)
-    NameExpr(foo)
-    FuncDef:4(
-      g
-      def () -> y?
-      Block:4(
-        PassStmt:4()))))
-
-[case testFunctionOverloadWithinFunction]
-def f():
-    @foo
-    def g(): pass
-    @foo
-    def g() -> x: pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      OverloadedFuncDef:2(
-        Decorator:2(
-          Var(g)
-          NameExpr(foo)
-          FuncDef:3(
-            g
-            Block:3(
-              PassStmt:3())))
-        Decorator:4(
-          Var(g)
-          NameExpr(foo)
-          FuncDef:5(
-            g
-            def () -> x?
-            Block:5(
-              PassStmt:5())))))))
-
-[case testCommentFunctionAnnotation]
-def f(): # type: () -> A
-  pass
-def g(x): # type: (A) -> B
-  pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def () -> A?
-    Block:1(
-      PassStmt:2()))
-  FuncDef:3(
-    g
-    Args(
-      Var(x))
-    def (x: A?) -> B?
-    Block:3(
-      PassStmt:4())))
-
-[case testCommentMethodAnnotation]
-class A:
-  def f(self): # type: () -> A
-    pass
-  def g(xself, x): # type: (A) -> B
-    pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      f
-      Args(
-        Var(self))
-      def (self: Any) -> A?
-      Block:2(
-        PassStmt:3()))
-    FuncDef:4(
-      g
-      Args(
-        Var(xself)
-        Var(x))
-      def (xself: Any, x: A?) -> B?
-      Block:4(
-        PassStmt:5()))))
-
-[case testCommentMethodAnnotationAndNestedFunction]
-class A:
-  def f(self): # type: () -> A
-    def g(x): # type: (A) -> B
-      pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      f
-      Args(
-        Var(self))
-      def (self: Any) -> A?
-      Block:2(
-        FuncDef:3(
-          g
-          Args(
-            Var(x))
-          def (x: A?) -> B?
-          Block:3(
-            PassStmt:4()))))))
-
-[case testCommentFunctionAnnotationOnSeparateLine]
-def f(x):
-  # type: (X) -> Y
-  pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    def (x: X?) -> Y?
-    Block:1(
-      PassStmt:3())))
-
-[case testCommentFunctionAnnotationOnSeparateLine2]
-def f(x):
-
-     # type: (X) -> Y       # bar
-
-  pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    def (x: X?) -> Y?
-    Block:1(
-      PassStmt:5())))
-
-[case testCommentFunctionAnnotationAndVarArg]
-def f(x, *y): # type: (X, *Y) -> Z
-  pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    def (x: X?, *y: Y?) -> Z?
-    VarArg(
-      Var(y))
-    Block:1(
-      PassStmt:2())))
-
-[case testCommentFunctionAnnotationAndAllVarArgs]
-def f(x, *y, **z): # type: (X, *Y, **Z) -> A
-  pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    def (x: X?, *y: Y?, **z: Z?) -> A?
-    VarArg(
-      Var(y))
-    DictVarArg(
-      Var(z))
-    Block:1(
-      PassStmt:2())))
-
-[case testClassDecorator]
- at foo
-class X: pass
- at foo(bar)
- at x.y
-class Z: pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    X
-    Decorators(
-      NameExpr(foo))
-    PassStmt:2())
-  ClassDef:3(
-    Z
-    Decorators(
-      CallExpr:3(
-        NameExpr(foo)
-        Args(
-          NameExpr(bar)))
-      MemberExpr:4(
-        NameExpr(x)
-        y))
-    PassStmt:5()))
-
-[case testTrailingSemicolon]
-def x():
-    pass;
-
-def y():
-    pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    x
-    Block:1(
-      PassStmt:2()))
-  FuncDef:4(
-    y
-    Block:4(
-      PassStmt:5())))
-
-[case testEmptySuperClass]
-class A():
-    pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    PassStmt:2()))
-
-[case testStarExpression]
-*a
-*a, b
-a, *b
-a, (*x, y)
-a, (x, *y)
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StarExpr:1(
-      NameExpr(a)))
-  ExpressionStmt:2(
-    TupleExpr:2(
-      StarExpr:2(
-        NameExpr(a))
-      NameExpr(b)))
-  ExpressionStmt:3(
-    TupleExpr:3(
-      NameExpr(a)
-      StarExpr:3(
-        NameExpr(b))))
-  ExpressionStmt:4(
-    TupleExpr:4(
-      NameExpr(a)
-      TupleExpr:4(
-        StarExpr:4(
-          NameExpr(x))
-        NameExpr(y))))
-  ExpressionStmt:5(
-    TupleExpr:5(
-      NameExpr(a)
-      TupleExpr:5(
-        NameExpr(x)
-        StarExpr:5(
-          NameExpr(y))))))
-
-[case testStarExpressionParenthesis]
-*(a)
-*(a,b)
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    StarExpr:1(
-      NameExpr(a)))
-  ExpressionStmt:2(
-    StarExpr:2(
-      TupleExpr:2(
-        NameExpr(a)
-        NameExpr(b)))))
-
-[case testStarExpressionInFor]
-for *a in b:
-    pass
-
-for a, *b in c:
-    pass
-
-for *a, b in c:
-    pass
-[out]
-MypyFile:1(
-  ForStmt:1(
-    StarExpr:1(
-      NameExpr(a))
-    NameExpr(b)
-    Block:1(
-      PassStmt:2()))
-  ForStmt:4(
-    TupleExpr:4(
-      NameExpr(a)
-      StarExpr:4(
-        NameExpr(b)))
-    NameExpr(c)
-    Block:4(
-      PassStmt:5()))
-  ForStmt:7(
-    TupleExpr:7(
-      StarExpr:7(
-        NameExpr(a))
-      NameExpr(b))
-    NameExpr(c)
-    Block:7(
-      PassStmt:8())))
-
-[case testStarExprInGeneratorExpr]
-x for y, *p in z
-x for *p, y in z
-x for y, *p, q in z
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    GeneratorExpr:1(
-      NameExpr(x)
-      TupleExpr:1(
-        NameExpr(y)
-        StarExpr:1(
-          NameExpr(p)))
-      NameExpr(z)))
-  ExpressionStmt:2(
-    GeneratorExpr:2(
-      NameExpr(x)
-      TupleExpr:2(
-        StarExpr:2(
-          NameExpr(p))
-        NameExpr(y))
-      NameExpr(z)))
-  ExpressionStmt:3(
-    GeneratorExpr:3(
-      NameExpr(x)
-      TupleExpr:3(
-        NameExpr(y)
-        StarExpr:3(
-          NameExpr(p))
-        NameExpr(q))
-      NameExpr(z))))
-
-[case testParseNamedtupleBaseclass]
-class A(namedtuple('x', ['y'])): pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    BaseTypeExpr(
-      CallExpr:1(
-        NameExpr(namedtuple)
-        Args(
-          StrExpr(x)
-          ListExpr:1(
-            StrExpr(y)))))
-    PassStmt:1()))
-
-[case testEllipsis]
-...
-a[1,...,2]
-....__class__
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    Ellipsis)
-  ExpressionStmt:2(
-    IndexExpr:2(
-      NameExpr(a)
-      TupleExpr:2(
-        IntExpr(1)
-        Ellipsis
-        IntExpr(2))))
-  ExpressionStmt:3(
-    MemberExpr:3(
-      Ellipsis
-      __class__)))
-
-[case testFunctionWithManyKindsOfArgs]
-def f(x, *args, *, y=None, **kw): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    MaxPos(1)
-    Args(
-      Var(x)
-      Var(y))
-    Init(
-      AssignmentStmt:1(
-        NameExpr(y)
-        NameExpr(None)))
-    VarArg(
-      Var(args))
-    DictVarArg(
-      Var(kw))
-    Block:1(
-      PassStmt:1())))
-
-[case testIfWithSemicolons]
-if 1: a; b
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      IntExpr(1))
-    Then(
-      ExpressionStmt:1(
-        NameExpr(a))
-      ExpressionStmt:1(
-        NameExpr(b)))))
-
-[case testIfWithSemicolonsNested]
-while 2:
-    if 1: a; b
-[out]
-MypyFile:1(
-  WhileStmt:1(
-    IntExpr(2)
-    Block:1(
-      IfStmt:2(
-        If(
-          IntExpr(1))
-        Then(
-          ExpressionStmt:2(
-            NameExpr(a))
-          ExpressionStmt:2(
-            NameExpr(b)))))))
-
-[case testIfElseWithSemicolons]
-if 1: global x; y = 1
-else: x = 1; return 3
-4
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      IntExpr(1))
-    Then(
-      GlobalDecl:1(
-        x)
-      AssignmentStmt:1(
-        NameExpr(y)
-        IntExpr(1)))
-    Else(
-      AssignmentStmt:2(
-        NameExpr(x)
-        IntExpr(1))
-      ReturnStmt:2(
-        IntExpr(3))))
-  ExpressionStmt:3(
-    IntExpr(4)))
-
-[case testIfElseWithSemicolonsNested]
-while 2:
-    if 1: global x; y = 1
-    else: x = 1; return 3
-4
-[out]
-MypyFile:1(
-  WhileStmt:1(
-    IntExpr(2)
-    Block:1(
-      IfStmt:2(
-        If(
-          IntExpr(1))
-        Then(
-          GlobalDecl:2(
-            x)
-          AssignmentStmt:2(
-            NameExpr(y)
-            IntExpr(1)))
-        Else(
-          AssignmentStmt:3(
-            NameExpr(x)
-            IntExpr(1))
-          ReturnStmt:3(
-            IntExpr(3))))))
-  ExpressionStmt:4(
-    IntExpr(4)))
-
-[case testKeywordArgumentAfterStarArgumentInCall]
-f(x=1, *y)
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    CallExpr:1(
-      NameExpr(f)
-      Args(
-        NameExpr(y))
-      KwArgs(
-        x
-        IntExpr(1))
-      VarArg)))
-
-[case testConditionalExpressionInSetComprehension]
-{ 1 if x else 2 for x in y }
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    SetComprehension:1(
-      GeneratorExpr:1(
-        ConditionalExpr:1(
-          Condition(
-            NameExpr(x))
-          IntExpr(1)
-          IntExpr(2))
-        NameExpr(x)
-        NameExpr(y)))))
-
-[case testConditionalExpressionInListComprehension]
-a = [ 1 if x else 2 for x in y ]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a)
-    ListComprehension:1(
-      GeneratorExpr:1(
-        ConditionalExpr:1(
-          Condition(
-            NameExpr(x))
-          IntExpr(1)
-          IntExpr(2))
-        NameExpr(x)
-        NameExpr(y)))))
-
-[case testComplexWithLvalue]
-with x as y.z: pass
-[out]
-MypyFile:1(
-  WithStmt:1(
-    Expr(
-      NameExpr(x))
-    Target(
-      MemberExpr:1(
-        NameExpr(y)
-        z))
-    Block:1(
-      PassStmt:1())))
-
-[case testRelativeImportWithEllipsis]
-from ... import x
-[out]
-MypyFile:1(
-  ImportFrom:1(..., [x]))
-
-[case testRelativeImportWithEllipsis2]
-from .... import x
-[out]
-MypyFile:1(
-  ImportFrom:1(...., [x]))
-
-[case testParseExtendedSlicing]
-a[:, :]
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    IndexExpr:1(
-      NameExpr(a)
-      TupleExpr:1(
-        SliceExpr:1(
-          <empty>
-          <empty>)
-        SliceExpr:1(
-          <empty>
-          <empty>)))))
-
-[case testParseExtendedSlicing2]
-a[1:2:, :,]
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    IndexExpr:1(
-      NameExpr(a)
-      TupleExpr:1(
-        SliceExpr:1(
-          IntExpr(1)
-          IntExpr(2))
-        SliceExpr:1(
-          <empty>
-          <empty>)))))
-
-[case testParseExtendedSlicing3]
-a[1:2:3, ..., 1]
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    IndexExpr:1(
-      NameExpr(a)
-      TupleExpr:1(
-        SliceExpr:1(
-          IntExpr(1)
-          IntExpr(2)
-          IntExpr(3))
-        Ellipsis
-        IntExpr(1)))))
-
-[case testParseIfExprInDictExpr]
-test =  { 'spam': 'eggs' if True else 'bacon' }
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(test)
-    DictExpr:1(
-      StrExpr(spam)
-      ConditionalExpr:1(
-        Condition(
-          NameExpr(True))
-        StrExpr(eggs)
-        StrExpr(bacon)))))
-
-[case testIgnoreLine]
-import x # type: ignore
-[out]
-MypyFile:1(
-  Import:1(x)
-  IgnoredLines(1))
-
-[case testIgnore2Lines]
-x
-y # type: ignore
-z # type: ignore
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    NameExpr(x))
-  ExpressionStmt:2(
-    NameExpr(y))
-  ExpressionStmt:3(
-    NameExpr(z))
-  IgnoredLines(2, 3))
-
-[case testCommentedOutIgnoreAnnotation]
-y ## type: ignore
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    NameExpr(y)))
-
-[case testInvalidIgnoreAnnotations]
-y # type: ignored
-y # type: IGNORE
-y # type : ignore
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    NameExpr(y))
-  ExpressionStmt:2(
-    NameExpr(y))
-  ExpressionStmt:3(
-    NameExpr(y)))
-
-[case testSpaceInIgnoreAnnotations]
-y #  type:  ignore    # foo
-y #type:ignore
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    NameExpr(y))
-  ExpressionStmt:2(
-    NameExpr(y))
-  IgnoredLines(1, 2))
-
-[case testIgnoreAnnotationAndMultilineStatement]
-x = {
-  1: 2  # type: ignore
-}
-y = {   # type: ignore
-  1: 2
-}       # type: ignore
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x)
-    DictExpr:1(
-      IntExpr(1)
-      IntExpr(2)))
-  AssignmentStmt:4(
-    NameExpr(y)
-    DictExpr:4(
-      IntExpr(1)
-      IntExpr(2)))
-  IgnoredLines(2, 4, 6))
-
-[case testIgnoreAnnotationAndMultilineStatement2]
-from m import ( # type: ignore
-  x, y
-)
-[out]
-MypyFile:1(
-  ImportFrom:1(m, [x, y])
-  IgnoredLines(1))
-
-[case testYieldExpression]
-def f():
-    x = yield f()
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      AssignmentStmt:2(
-        NameExpr(x)
-        YieldExpr:2(
-          CallExpr:2(
-            NameExpr(f)
-            Args()))))))
-
-[case testForWithSingleItemTuple]
-for x in 1,: pass
-[out]
-MypyFile:1(
-  ForStmt:1(
-    NameExpr(x)
-    TupleExpr:1(
-      IntExpr(1))
-    Block:1(
-      PassStmt:1())))
-
-[case testIsoLatinUnixEncoding]
-# coding: iso-latin-1-unix
-[out]
-MypyFile:1()
-
-[case testLatinUnixEncoding]
-# coding: latin-1-unix
-[out]
-MypyFile:1()
-
-[case testLatinUnixEncoding]
-# coding: iso-latin-1
-[out]
-MypyFile:1()
-
-[case testYieldExpressionInParens]
-def f():
-    (yield)
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ExpressionStmt:2(
-        YieldExpr:2()))))
diff --git a/test-data/unit/python2eval.test b/test-data/unit/python2eval.test
deleted file mode 100644
index 12fa5a6..0000000
--- a/test-data/unit/python2eval.test
+++ /dev/null
@@ -1,471 +0,0 @@
--- Test cases for type checking mypy programs using full stubs and running
--- using CPython (Python 2 mode).
---
--- These are mostly regression tests -- no attempt is made to make these
--- complete.
-
-
-[case testAbs2_python2]
-n = None  # type: int
-f = None  # type: float
-n = abs(1)
-abs(1) + 'x'  # Error
-f = abs(1.1)
-abs(1.1) + 'x'  # Error
-[out]
-_program.py:4: error: Unsupported operand types for + ("int" and "str")
-_program.py:6: error: Unsupported operand types for + ("float" and "str")
-
-[case testUnicode_python2]
-x = unicode('xyz', 'latin1')
-print x
-x = u'foo'
-print repr(x)
-[out]
-xyz
-u'foo'
-
-[case testXrangeAndRange_python2]
-for i in xrange(2):
-    print i
-for i in range(3):
-    print i
-[out]
-0
-1
-0
-1
-2
-
-[case testIterator_python2]
-import typing, sys
-x = iter('bar')
-print x.next(), x.next()
-[out]
-b a
-
-[case testEncodeAndDecode_python2]
-print 'a'.encode('latin1')
-print 'b'.decode('latin1')
-print u'c'.encode('latin1')
-print u'd'.decode('latin1')
-[out]
-a
-b
-c
-d
-
-[case testHasKey_python2]
-d = {1: 'x'}
-print d.has_key(1)
-print d.has_key(2)
-[out]
-True
-False
-
-[case testIntegerDivision_python2]
-x = 1 / 2
-x()
-[out]
-_program.py:2: error: "int" not callable
-
-[case testFloatDivision_python2]
-x = 1.0 / 2.0
-x = 1.0 / 2
-x = 1 / 2.0
-x = 1.5
-[out]
-
-[case testAnyStr_python2]
-from typing import AnyStr
-def f(x): # type: (AnyStr) -> AnyStr
-    if isinstance(x, str):
-        return 'foo'
-    else:
-        return u'zar'
-print f('')
-print f(u'')
-[out]
-foo
-zar
-
-[case testGenericPatterns_python2]
-from typing import Pattern
-import re
-p = None  # type: Pattern[unicode]
-p = re.compile(u'foo*')
-b = None  # type: Pattern[str]
-b = re.compile('foo*')
-print(p.match(u'fooo').group(0))
-[out]
-fooo
-
-[case testGenericMatch_python2]
-from typing import Match
-import re
-def f(m): # type: (Match[str]) -> None
-    print(m.group(0))
-f(re.match('x*', 'xxy'))
-[out]
-xx
-
-[case testVariableLengthTuple_python2]
-from typing import Tuple, cast
-x = cast(Tuple[int, ...], ())
-print(x)
-[out]
-()
-
-[case testFromFuturePrintFunction_python2]
-from __future__ import print_function
-print('a', 'b')
-[out]
-a b
-
-[case testFromFutureImportUnicodeLiterals_python2]
-from __future__ import unicode_literals
-print '>', ['a', b'b', u'c']
-[out]
-> [u'a', 'b', u'c']
-
-[case testUnicodeLiteralsKwargs_python2]
-from __future__ import unicode_literals
-def f(**kwargs):  # type: (...) -> None
-  pass
-params = {'a': 'b'}
-f(**params)
-[out]
-
-[case testUnicodeStringKwargs_python2]
-def f(**kwargs):  # type: (...) -> None
-  pass
-params = {u'a': 'b'}
-f(**params)
-[out]
-
-[case testStrKwargs_python2]
-def f(**kwargs):  # type: (...) -> None
-  pass
-params = {'a': 'b'}
-f(**params)
-[out]
-
-[case testFromFutureImportUnicodeLiterals2_python2]
-from __future__ import unicode_literals
-def f(x: str) -> None: pass
-f(b'')
-f(u'')
-f('')
-[out]
-_program.py:4: error: Argument 1 to "f" has incompatible type "unicode"; expected "str"
-_program.py:5: error: Argument 1 to "f" has incompatible type "unicode"; expected "str"
-
-[case testStrUnicodeCompatibility_python2]
-import typing
-def f(s): # type: (unicode) -> None
-    pass
-f(u'')
-f('')
-[out]
-
-[case testStrUnicodeCompatibilityInBuiltins_python2]
-import typing
-'x'.count('x')
-'x'.count(u'x')
-[out]
-
-[case testTupleAsSubtypeOfSequence_python2]
-from typing import TypeVar, Sequence
-T = TypeVar('T')
-def f(a): # type: (Sequence[T]) -> None
-    print a
-f(tuple())
-[out]
-()
-
-[case testReadOnlyProperty_python2]
-import typing
-class A:
-    @property
-    def foo(self): # type: () -> int
-        return 1
-print(A().foo + 2)
-[out]
-3
-
-[case testIOTypes_python2]
-from typing import IO, TextIO, BinaryIO, Any
-class X(IO[str]): pass
-class Y(TextIO): pass
-class Z(BinaryIO): pass
-[out]
-
-[case testOpenReturnType_python2]
-import typing
-f = open('/tmp/xyz', 'w')
-f.write(u'foo')
-f.write('bar')
-f.close()
-[out]
-_program.py:3: error: Argument 1 to "write" of "IO" has incompatible type "unicode"; expected "str"
-
-[case testPrintFunctionWithFileArg_python2]
-from __future__ import print_function
-import typing
-if 1 == 2: # Don't want to run the code below, since it would create a file.
-    f = open('/tmp/xyz', 'w')
-    print('foo', file=f)
-    f.close()
-print('ok')
-[out]
-ok
-
-[case testStringIO_python2]
-import typing
-import io
-c = io.StringIO()
-c.write(u'\x89')
-print(repr(c.getvalue()))
-[out]
-u'\x89'
-
-[case testBytesIO_python2]
-import typing
-import io
-c = io.BytesIO()
-c.write('\x89')
-print(repr(c.getvalue()))
-[out]
-'\x89'
-
-[case testTextIOWrapper_python2]
-import typing
-import io
-b = io.BytesIO(u'\xab'.encode('utf8'))
-w = io.TextIOWrapper(b, encoding='utf8')
-print(repr(w.read()))
-[out]
-u'\xab'
-
-[case testIoOpen_python2]
-import typing
-import io
-if 1 == 2: # Only type check, do not execute
-    f = io.open('/tmp/xyz', 'w', encoding='utf8')
-    f.write(u'\xab')
-    f.close()
-print 'ok'
-[out]
-ok
-
-[case testUnionType_python2]
-from typing import Union
-y = None  # type: Union[int, str]
-def f(x): # type: (Union[int, str]) -> str
-    if isinstance(x, int):
-        x = str(x)
-    return x
-print f(12)
-print f('ab')
-[out]
-12
-ab
-
-[case testStrAdd_python2]
-import typing
-s = ''
-u = u''
-n = 0
-n = s + '' # E
-s = s + u'' # E
-[out]
-_program.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-_program.py:6: error: Incompatible types in assignment (expression has type "unicode", variable has type "str")
-
-[case testStrJoin_python2]
-import typing
-s = ''
-u = u''
-n = 0
-n = ''.join([''])   # Error
-s = ''.join([u''])  # Error
-[out]
-_program.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-_program.py:6: error: Incompatible types in assignment (expression has type "unicode", variable has type "str")
-
-[case testNamedTuple_python2]
-import typing
-from collections import namedtuple
-X = namedtuple('X', ['a', 'b'])
-x = X(a=1, b='s')
-print x.a, x.b
-[out]
-1 s
-
-[case testNamedTupleError_python2]
-import typing
-from collections import namedtuple
-X = namedtuple('X', ['a', 'b'])
-x = X(a=1, b='s')
-x.c
-[out]
-_program.py:5: error: "X" has no attribute "c"
-
-[case testAssignToComplexReal_python2]
-import typing
-x = 4j
-y = x.real
-y = x         # Error
-x.imag = 2.0  # Error
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "complex", variable has type "float")
-_program.py:5: error: Property "imag" defined in "complex" is read-only
-
-[case testComplexArithmetic_python2]
-import typing
-print 5 + 8j
-print 3j * 2.0
-print 4j / 2.0
-[out]
-(5+8j)
-6j
-2j
-
-[case testNamedTupleWithTypes_python2]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int), ('b', str)])
-n = N(1, 'x')
-print n
-a, b = n
-print a, b
-print n[0]
-[out]
-N(a=1, b='x')
-1 x
-1
-
-[case testUnionTypeAlias_python2]
-from typing import Union
-U = Union[int, str]
-u = 1 # type: U
-u = 1.1
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "float", variable has type "Union[int, str]")
-
-[case testSuperNew_python2]
-from typing import Dict, Any
-class MyType(type):
-    def __new__(cls, name, bases, namespace):
-        # type: (str, tuple, Dict[str, Any]) -> type
-        return super(MyType, cls).__new__(cls, name + 'x', bases, namespace)
-class A(object):
-    __metaclass__ = MyType
-print(type(A()).__name__)
-[out]
-Ax
-
-[case testSequenceIndexAndCount_python2]
-from typing import Sequence
-def f(x): # type: (Sequence[int]) -> None
-    print(x.index(1))
-    print(x.count(1))
-f([0, 0, 1, 1, 1])
-[out]
-2
-3
-
-[case testOptional_python2]
-from typing import Optional
-def f(): # type: () -> Optional[int]
-    pass
-x = f()
-y = 1
-y = x
-
-[case testUnicodeAndOverloading_python2]
-from m import f
-f(1)
-f('')
-f(u'')
-f(b'')
-[file m.pyi]
-from typing import overload
- at overload
-def f(x: unicode) -> int: pass
- at overload
-def f(x: bytearray) -> int: pass
-[out]
-_program.py:2: error: No overload variant of "f" matches argument types [builtins.int]
-
-[case testByteArrayStrCompatibility_python2]
-def f(x): # type: (str) -> None
-    pass
-f(bytearray('foo'))
-
-[case testAbstractProperty_python2]
-from abc import abstractproperty, ABCMeta
-class A:
-    __metaclass__ = ABCMeta
-    @abstractproperty
-    def x(self): # type: () -> int
-        pass
-class B(A):
-    @property
-    def x(self): # type: () -> int
-        return 3
-b = B()
-print b.x + 1
-[out]
-4
-
-[case testReModuleBytesPython2]
-# Regression tests for various overloads in the re module -- bytes version
-import re
-if False:
-    bre = b'a+'
-    bpat = re.compile(bre)
-    bpat = re.compile(bpat)
-    re.search(bre, b'').groups()
-    re.search(bre, u'')
-    re.search(bpat, b'').groups()
-    re.search(bpat, u'')
-    # match(), split(), findall(), finditer() are much the same, so skip those.
-    # sub(), subn() have more overloads and we are checking these:
-    re.sub(bre, b'', b'') + b''
-    re.sub(bpat, b'', b'') + b''
-    re.sub(bre, lambda m: b'', b'') + b''
-    re.sub(bpat, lambda m: b'', b'') + b''
-    re.subn(bre, b'', b'')[0] + b''
-    re.subn(bpat, b'', b'')[0] + b''
-    re.subn(bre, lambda m: b'', b'')[0] + b''
-    re.subn(bpat, lambda m: b'', b'')[0] + b''
-[out]
-
-[case testReModuleStringPython2]
-# Regression tests for various overloads in the re module -- string version
-import re
-ure = u'a+'
-upat = re.compile(ure)
-upat = re.compile(upat)
-re.search(ure, u'a').groups()
-re.search(ure, b'') # This ought to be an error, but isn't because of bytes->unicode equivalence
-re.search(upat, u'a').groups()
-re.search(upat, b'') # This ought to be an error, but isn't because of bytes->unicode equivalence
-# match(), split(), findall(), finditer() are much the same, so skip those.
-# sus(), susn() have more overloads and we are checking these:
-re.sub(ure, u'', u'') + u''
-re.sub(upat, u'', u'') + u''
-re.sub(ure, lambda m: u'', u'') + u''
-re.sub(upat, lambda m: u'', u'') + u''
-re.subn(ure, u'', u'')[0] + u''
-re.subn(upat, u'', u'')[0] + u''
-re.subn(ure, lambda m: u'', u'')[0] + u''
-re.subn(upat, lambda m: u'', u'')[0] + u''
-[out]
-
-[case testYieldRegressionTypingAwaitable_python2]
-# Make sure we don't reference typing.Awaitable in Python 2 mode.
-def g() -> int:
-    yield
-[out]
-_program.py:2: error: The return type of a generator function should be "Generator" or one of its supertypes
diff --git a/test-data/unit/pythoneval-asyncio.test b/test-data/unit/pythoneval-asyncio.test
deleted file mode 100644
index 6d16903..0000000
--- a/test-data/unit/pythoneval-asyncio.test
+++ /dev/null
@@ -1,486 +0,0 @@
--- Test cases for type checking mypy programs using full stubs and running
--- using CPython.
---
--- These are mostly regression tests -- no attempt is made to make these
--- complete.
---
--- This test file check Asyncio and yield from interaction
-
-[case testImportAsyncio]
-import asyncio
-print('Imported')
-[out]
-Imported
-
-[case testSimpleCoroutineSleep]
-from typing import Any, Generator
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def greet_every_two_seconds() -> 'Generator[Any, None, None]':
-    n = 0
-    while n < 5:
-        print('Prev', n)
-        yield from asyncio.sleep(0.1)
-        print('After', n)
-        n += 1
-
-loop = asyncio.get_event_loop()
-try:
-    loop.run_until_complete(greet_every_two_seconds())
-finally:
-    loop.close()
-[out]
-Prev 0
-After 0
-Prev 1
-After 1
-Prev 2
-After 2
-Prev 3
-After 3
-Prev 4
-After 4
-
-[case testCoroutineCallingOtherCoroutine]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def compute(x: int, y: int) -> 'Generator[Any, None, int]':
-    print("Compute %s + %s ..." % (x, y))
-    yield from asyncio.sleep(0.1)
-    return x + y   # Here the int is wrapped in Future[int]
-
- at asyncio.coroutine
-def print_sum(x: int, y: int) -> 'Generator[Any, None, None]':
-    result = yield from compute(x, y)  # The type of result will be int (is extracted from Future[int]
-    print("%s + %s = %s" % (x, y, result))
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(print_sum(1, 2))
-loop.close()
-[out]
-Compute 1 + 2 ...
-1 + 2 = 3
-
-[case testCoroutineChangingFuture]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def slow_operation(future: 'Future[str]') -> 'Generator[Any, None, None]':
-    yield from asyncio.sleep(0.1)
-    future.set_result('Future is done!')
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future()  # type: Future[str]
-asyncio.Task(slow_operation(future))
-loop.run_until_complete(future)
-print(future.result())
-loop.close()
-[out]
-Future is done!
-
-[case testFunctionAssignedAsCallback]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future, AbstractEventLoop
-
- at asyncio.coroutine
-def slow_operation(future: 'Future[str]') -> 'Generator[Any, None, None]':
-    yield from asyncio.sleep(1)
-    future.set_result('Callback works!')
-
-def got_result(future: 'Future[str]') -> None:
-    print(future.result())
-    loop.stop()
-
-loop = asyncio.get_event_loop() # type: AbstractEventLoop
-future = asyncio.Future()  # type: Future[str]
-asyncio.Task(slow_operation(future))  # Here create a task with the function. (The Task need a Future[T] as first argument)
-future.add_done_callback(got_result)  # and assign the callback to the future
-try:
-    loop.run_forever()
-finally:
-    loop.close()
-[out]
-Callback works!
-
-[case testMultipleTasks]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Task, Future
- at asyncio.coroutine
-def factorial(name, number) -> 'Generator[Any, None, None]':
-    f = 1
-    for i in range(2, number+1):
-        print("Task %s: Compute factorial(%s)..." % (name, i))
-        yield from asyncio.sleep(0.1)
-        f *= i
-    print("Task %s: factorial(%s) = %s" % (name, number, f))
-
-loop = asyncio.get_event_loop()
-tasks = [
-    asyncio.Task(factorial("A", 2)),
-    asyncio.Task(factorial("B", 3)),
-    asyncio.Task(factorial("C", 4))]
-loop.run_until_complete(asyncio.wait(tasks))
-loop.close()
-[out]
-Task A: Compute factorial(2)...
-Task B: Compute factorial(2)...
-Task C: Compute factorial(2)...
-Task A: factorial(2) = 2
-Task B: Compute factorial(3)...
-Task C: Compute factorial(3)...
-Task B: factorial(3) = 6
-Task C: Compute factorial(4)...
-Task C: factorial(4) = 24
-
-
-[case testConcatenatedCoroutines]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def h4() -> 'Generator[Any, None, int]':
-    x = yield from future
-    return x
-
- at asyncio.coroutine
-def h3() -> 'Generator[Any, None, int]':
-    x = yield from h4()
-    print("h3: %s" % x)
-    return x
-
- at asyncio.coroutine
-def h2() -> 'Generator[Any, None, int]':
-    x = yield from h3()
-    print("h2: %s" % x)
-    return x
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
-    x = yield from h2()
-    print("h: %s" % x)
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future()  # type: Future[int]
-future.set_result(42)
-loop.run_until_complete(h())
-print("Outside %s" % future.result())
-loop.close()
-[out]
-h3: 42
-h2: 42
-h: 42
-Outside 42
-
-[case testConcatenatedCoroutinesReturningFutures]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def h4() -> 'Generator[Any, None, Future[int]]':
-    yield from asyncio.sleep(0.1)
-    f = asyncio.Future() #type: Future[int]
-    return f
-
- at asyncio.coroutine
-def h3() -> 'Generator[Any, None, Future[Future[int]]]':
-    x = yield from h4()
-    x.set_result(42)
-    f = asyncio.Future() #type: Future[Future[int]]
-    f.set_result(x)
-    return f
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
-    print("Before")
-    x = yield from h3()
-    y = yield from x
-    z = yield from y
-    print(z)
-    def normalize(future):
-        # The str conversion seems inconsistent; not sure exactly why. Normalize
-        # the result.
-        return str(future).replace('<Future finished ', 'Future<')
-    print(normalize(y))
-    print(normalize(x))
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(h())
-loop.close()
-[out]
-Before
-42
-Future<result=42>
-Future<result=Future<result=42>>
-
-
-[case testCoroutineWithOwnClass]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
-class A:
-    def __init__(self, x: int) -> None:
-        self.x = x
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
-    x = yield from future
-    print("h: %s" % x.x)
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future()  # type: Future[A]
-future.set_result(A(42))
-loop.run_until_complete(h())
-print("Outside %s" % future.result().x)
-loop.close()
-[out]
-h: 42
-Outside 42
-
-
--- Errors
-
-[case testErrorAssigningCoroutineThatDontReturn]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def greet() -> 'Generator[Any, None, None]':
-    yield from asyncio.sleep(0.2)
-    print('Hello World')
-
- at asyncio.coroutine
-def test() -> 'Generator[Any, None, None]':
-    yield from greet()
-    x = yield from greet()  # Error
-
-loop = asyncio.get_event_loop()
-try:
-    loop.run_until_complete(test())
-finally:
-    loop.close()
-[out]
-_program.py:13: error: Function does not return a value
-
-[case testErrorReturnIsNotTheSameType]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def compute(x: int, y: int) -> 'Generator[Any, None, int]':
-    print("Compute %s + %s ..." % (x, y))
-    yield from asyncio.sleep(0.1)
-    return str(x + y)   # Error
-
- at asyncio.coroutine
-def print_sum(x: int, y: int) -> 'Generator[Any, None, None]':
-    result = yield from compute(x, y)
-    print("%s + %s = %s" % (x, y, result))
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(print_sum(1, 2))
-loop.close()
-
-[out]
-_program.py:9: error: Incompatible return value type (got "str", expected "int")
-
-[case testErrorSetFutureDifferentInternalType]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def slow_operation(future: 'Future[str]') -> 'Generator[Any, None, None]':
-    yield from asyncio.sleep(1)
-    future.set_result(42)  # Error
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future()  # type: Future[str]
-asyncio.Task(slow_operation(future))
-loop.run_until_complete(future)
-print(future.result())
-loop.close()
-[out]
-_program.py:8: error: Argument 1 to "set_result" of "Future" has incompatible type "int"; expected "str"
-
-
-[case testErrorUsingDifferentFutureType]
-from typing import Any, Generator
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def slow_operation(future: 'Future[int]') -> 'Generator[Any, None, None]':
-    yield from asyncio.sleep(1)
-    future.set_result(42)
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future()  # type: Future[str]
-asyncio.Task(slow_operation(future))  # Error
-loop.run_until_complete(future)
-print(future.result())
-loop.close()
-[out]
-_program.py:12: error: Argument 1 to "slow_operation" has incompatible type Future[str]; expected Future[int]
-
-[case testErrorUsingDifferentFutureTypeAndSetFutureDifferentInternalType]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
-asyncio.coroutine
-def slow_operation(future: 'Future[int]') -> 'Generator[Any, None, None]':
-    yield from asyncio.sleep(1)
-    future.set_result('42')  #Try to set an str as result to a Future[int]
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future()  # type: Future[str]
-asyncio.Task(slow_operation(future))  # Error
-loop.run_until_complete(future)
-print(future.result())
-loop.close()
-[out]
-_program.py:8: error: Argument 1 to "set_result" of "Future" has incompatible type "str"; expected "int"
-_program.py:12: error: Argument 1 to "slow_operation" has incompatible type Future[str]; expected Future[int]
-
-[case testErrorSettingCallbackWithDifferentFutureType]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future, AbstractEventLoop
-
- at asyncio.coroutine
-def slow_operation(future: 'Future[str]') -> 'Generator[Any, None, None]':
-    yield from asyncio.sleep(1)
-    future.set_result('Future is done!')
-
-def got_result(future: 'Future[int]') -> None:
-    print(future.result())
-    loop.stop()
-
-loop = asyncio.get_event_loop() # type: AbstractEventLoop
-future = asyncio.Future()  # type: Future[str]
-asyncio.Task(slow_operation(future))
-future.add_done_callback(got_result)  # Error
-
-try:
-    loop.run_forever()
-finally:
-    loop.close()
-[out]
-_program.py:18: error: Argument 1 to "add_done_callback" of "Future" has incompatible type Callable[[Future[int]], None]; expected Callable[[Future[str]], Any]
-
-[case testErrorOneMoreFutureInReturnType]
-import typing
-from typing import Any, Generator
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def h4() -> 'Generator[Any, None, Future[int]]':
-    yield from asyncio.sleep(1)
-    f = asyncio.Future() #type: Future[int]
-    return f
-
- at asyncio.coroutine
-def h3() -> 'Generator[Any, None, Future[Future[Future[int]]]]':
-    x = yield from h4()
-    x.set_result(42)
-    f = asyncio.Future() #type: Future[Future[int]]
-    f.set_result(x)
-    return f
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
-    print("Before")
-    x = yield from h3()
-    y = yield from x
-    z = yield from y
-    print(z)
-    print(y)
-    print(x)
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(h())
-loop.close()
-[out]
-_program.py:18: error: Incompatible return value type (got Future[Future[int]], expected Future[Future[Future[int]]])
-
-[case testErrorOneLessFutureInReturnType]
-import typing
-from typing import Any, Generator
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def h4() -> 'Generator[Any, None, Future[int]]':
-    yield from asyncio.sleep(1)
-    f = asyncio.Future() #type: Future[int]
-    return f
-
- at asyncio.coroutine
-def h3() -> 'Generator[Any, None, Future[int]]':
-    x = yield from h4()
-    x.set_result(42)
-    f = asyncio.Future() #type: Future[Future[int]]
-    f.set_result(x)
-    return f
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
-    print("Before")
-    x = yield from h3()
-    y = yield from x
-    print(y)
-    print(x)
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(h())
-loop.close()
-[out]
-_program.py:18: error: Incompatible return value type (got Future[Future[int]], expected Future[int])
-
-[case testErrorAssignmentDifferentType]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
-class A:
-    def __init__(self, x: int) -> None:
-        self.x = x
-
-class B:
-    def __init__(self, x: int) -> None:
-        self.x = x
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
-    x = yield from future # type: B # Error
-    print("h: %s" % x.x)
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future()  # type: Future[A]
-future.set_result(A(42))
-loop.run_until_complete(h())
-loop.close()
-[out]
-_program.py:16: error: Incompatible types in assignment (expression has type "A", variable has type "B")
diff --git a/test-data/unit/pythoneval-enum.test b/test-data/unit/pythoneval-enum.test
deleted file mode 100644
index 3ae2df5..0000000
--- a/test-data/unit/pythoneval-enum.test
+++ /dev/null
@@ -1,134 +0,0 @@
--- Test cases for type checking mypy programs using full stubs and running
--- using CPython.
---
--- These are mostly regression tests -- no attempt is made to make these
--- complete.
---
--- This test file checks Enum
-
-[case testEnumBasics]
-from enum import Enum
-class Medal(Enum):
-    gold = 1
-    silver = 2
-    bronze = 3
-m = Medal.gold
-m = 1
-[out]
-_program.py:7: error: Incompatible types in assignment (expression has type "int", variable has type "Medal")
-
-[case testEnumNameAndValue]
-from enum import Enum
-class Truth(Enum):
-    true = True
-    false = False
-x = ''
-x = Truth.true.name
-print(Truth.true.name)
-print(Truth.false.value)
-[out]
-true
-False
-
-[case testEnumUnique]
-import enum
- at enum.unique
-class E(enum.Enum):
-    x = 1
-    y = 1  # NOTE: This duplicate value is not detected by mypy at the moment
-x = 1
-x = E.x
-[out]
-_program.py:7: error: Incompatible types in assignment (expression has type "E", variable has type "int")
-
-[case testIntEnum_assignToIntVariable]
-from enum import IntEnum
-class N(IntEnum):
-    x = 1
-    y = 1
-n = 1
-n = N.x  # Subclass of int, so it's okay
-s = ''
-s = N.y
-[out]
-_program.py:8: error: Incompatible types in assignment (expression has type "N", variable has type "str")
-
-[case testIntEnum_functionTakingIntEnum]
-from enum import IntEnum
-class SomeIntEnum(IntEnum):
-    x = 1
-def takes_some_int_enum(n: SomeIntEnum):
-    pass
-takes_some_int_enum(SomeIntEnum.x)
-takes_some_int_enum(1)  # Error
-takes_some_int_enum(SomeIntEnum(1))  # How to deal with the above
-[out]
-_program.py:7: error: Argument 1 to "takes_some_int_enum" has incompatible type "int"; expected "SomeIntEnum"
-
-[case testIntEnum_functionTakingInt]
-from enum import IntEnum
-class SomeIntEnum(IntEnum):
-    x = 1
-def takes_int(i: int):
-    pass
-takes_int(SomeIntEnum.x)
-takes_int(2)
-
-[case testIntEnum_functionReturningIntEnum]
-from enum import IntEnum
-class SomeIntEnum(IntEnum):
-    x = 1
-def returns_some_int_enum() -> SomeIntEnum:
-    return SomeIntEnum.x
-an_int = 1
-an_int = returns_some_int_enum()
-
-an_enum = SomeIntEnum.x
-an_enum = returns_some_int_enum()
-[out]
-
-[case testEnumMethods]
-from enum import Enum
-
-class Color(Enum):
-    red = 1
-    green = 2
-
-    def m(self, x: int): pass
-    @staticmethod
-    def m2(x: int): pass
-
-Color.red.m('')
-Color.m2('')
-[out]
-_program.py:11: error: Argument 1 to "m" of "Color" has incompatible type "str"; expected "int"
-_program.py:12: error: Argument 1 to "m2" of "Color" has incompatible type "str"; expected "int"
-
-[case testIntEnum_ExtendedIntEnum_functionTakingExtendedIntEnum]
-from enum import IntEnum
-class ExtendedIntEnum(IntEnum):
-    pass
-class SomeExtIntEnum(ExtendedIntEnum):
-    x = 1
-
-def takes_int(i: int):
-    pass
-takes_int(SomeExtIntEnum.x)
-
-def takes_some_ext_int_enum(s: SomeExtIntEnum):
-    pass
-takes_some_ext_int_enum(SomeExtIntEnum.x)
-
-
-[case testNamedTupleEnum]
-from typing import NamedTuple
-from enum import Enum
-
-N = NamedTuple('N', [('bar', int)])
-
-class E(N, Enum):
-    X = N(1)
-
-def f(x: E) -> None: pass
-
-f(E.X)
diff --git a/test-data/unit/pythoneval.test b/test-data/unit/pythoneval.test
deleted file mode 100644
index 7945fe5..0000000
--- a/test-data/unit/pythoneval.test
+++ /dev/null
@@ -1,1214 +0,0 @@
--- Test cases for type checking mypy programs using full stubs and running
--- using CPython.
---
--- These are mostly regression tests -- no attempt is made to make these
--- complete.
-
-
-[case testHello]
-import typing
-print('hello, world')
-[out]
-hello, world
-
--- Skipped because different typing package versions have different repr()s. 
-[case testAbstractBaseClasses-skip]
-import re
-from typing import Sized, Sequence, Iterator, Iterable, Mapping, AbstractSet
-
-def check(o, t):
-    rep = re.sub('0x[0-9a-fA-F]+', '0x...', repr(o))
-    rep = rep.replace('sequenceiterator', 'str_iterator')
-    trep = str(t).replace('_abcoll.Sized', 'collections.abc.Sized')
-    print(rep, trep, isinstance(o, t))
-
-def f():
-    check('x', Sized)
-    check([1], Sequence)
-    check({1:3}, Sequence)
-    check(iter('x'), Iterator)
-    check('x', Iterable)
-    check({}, Mapping)
-    check(set([1]), AbstractSet)
-
-f()
-[out]
-'x' <class 'collections.abc.Sized'> True
-[1] typing.Sequence True
-{1: 3} typing.Sequence False
-<str_iterator object at 0x...> typing.Iterator True
-'x' typing.Iterable True
-{} typing.Mapping True
-{1} typing.AbstractSet True
-
-[case testSized]
-from typing import Sized
-class A(Sized):
-    def __len__(self): return 5
-print(len(A()))
-[out]
-5
-
-[case testReversed]
-from typing import Reversible
-class A(Reversible):
-    def __iter__(self): return iter('oof')
-    def __reversed__(self): return iter('foo')
-print(list(reversed(range(5))))
-print(list(reversed([1,2,3])))
-print(list(reversed('abc')))
-print(list(reversed(A())))
-[out]
--- Duplicate [ at line beginning.
-[[4, 3, 2, 1, 0]
-[[3, 2, 1]
-[['c', 'b', 'a']
-[['f', 'o', 'o']
-
-[case testIntAndFloatConversion]
-from typing import SupportsInt, SupportsFloat
-class A(SupportsInt):
-    def __int__(self): return 5
-class B(SupportsFloat):
-    def __float__(self): return 1.2
-print(int(1))
-print(int(6.2))
-print(int('3'))
-print(int(b'4'))
-print(int(A()))
-print(float(-9))
-print(float(B()))
-[out]
-1
-6
-3
-4
-5
--9.0
-1.2
-
-[case testAbs]
-from typing import SupportsAbs
-class A(SupportsAbs[float]):
-    def __abs__(self) -> float: return 5.5
-
-print(abs(-1))
-print(abs(-1.2))
-print(abs(A()))
-[out]
-1
-1.2
-5.5
-
-[case testAbs2]
-
-n = None  # type: int
-f = None  # type: float
-n = abs(1)
-abs(1) + 'x'  # Error
-f = abs(1.1)
-abs(1.1) + 'x'  # Error
-[out]
-_program.py:5: error: Unsupported operand types for + ("int" and "str")
-_program.py:7: error: Unsupported operand types for + ("float" and "str")
-
-[case testRound]
-from typing import SupportsRound
-class A(SupportsRound):
-    def __round__(self, ndigits=0): return 'x%d' % ndigits
-print(round(1.6))
-print(round(A()))
-print(round(A(), 2))
-[out]
-2
-x0
-x2
-
-[case testCallMethodViaTypeObject]
-import typing
-print(list.__add__([1, 2], [3, 4]))
-[out]
-[[1, 2, 3, 4]
-
-[case testClassDataAttribute]
-import typing
-class A:
-    x = 0
-print(A.x)
-A.x += 1
-print(A.x)
-[out]
-0
-1
-
-[case testInheritedClassAttribute]
-import typing
-class A:
-    x = 1
-    def f(self) -> None: print('f')
-class B(A):
-    pass
-B.f(None)
-print(B.x)
-[out]
-f
-1
-
-[case testFunctionDecorator]
-from typing import TypeVar, cast
-ftype = TypeVar('ftype')
-def logged(f: ftype) -> ftype:
-    def g(*args, **kwargs):
-        print('enter', f.__name__)
-        r = f(*args, **kwargs)
-        print('exit', f.__name__)
-        return r
-    return cast(ftype, g)
-
- at logged
-def foo(s: str) -> str:
-    print('foo', s)
-    return s + '!'
-
-print(foo('y'))
-print(foo('x'))
-[out]
-enter foo
-foo y
-exit foo
-y!
-enter foo
-foo x
-exit foo
-x!
-
-[case testModuleAttributes]
-import math
-import typing
-print(math.__name__)
-print(type(math.__dict__))
-print(type(math.__doc__ or ''))
-print(math.__class__)
-[out]
-math
-<class 'dict'>
-<class 'str'>
-<class 'module'>
-
-[case testSpecialAttributes]
-import typing
-class A: pass
-print(object().__doc__)
-print(A().__class__)
-[out]
-The most base type
-<class '__main__.A'>
-
-[case testFunctionAttributes]
-import typing
-ord.__class__
-print(type(ord.__doc__ + ''))
-print(ord.__name__)
-print(ord.__module__)
-[out]
-<class 'str'>
-ord
-builtins
-
-[case testTypeAttributes]
-import typing
-print(str.__class__)
-print(type(str.__doc__))
-print(str.__name__)
-print(str.__module__)
-print(str.__dict__ is not None)
-[out]
-<class 'type'>
-<class 'str'>
-str
-builtins
-True
-
-[case testBoolCompatibilityWithInt]
-import typing
-x = 0
-x = True
-print(bool('x'))
-print(bool(''))
-[out]
-True
-False
-
-[case testCallBuiltinTypeObjectsWithoutArguments]
-import typing
-print(int())
-print(repr(str()))
-print(repr(bytes()))
-print(float())
-print(bool())
-[out]
-0
-''
-b''
-0.0
-False
-
-[case testIntegerDivision]
-import typing
-x = 1 / 2
-x = 1.5
-[out]
-
-[case testStaticmethod]
-import typing
-class A:
-    @staticmethod
-    def f(x: str) -> int: return int(x)
-print(A.f('12'))
-print(A().f('34'))
-[out]
-12
-34
-
-[case testClassmethod]
-import typing
-class A:
-    @classmethod
-    def f(cls, x: str) -> int: return int(x)
-print(A.f('12'))
-print(A().f('34'))
-[out]
-12
-34
-
-[case testIntMethods]
-import typing
-print(int.from_bytes(b'ab', 'big'))
-n = 0
-print(n.from_bytes(b'ac', 'big'))
-print(n.from_bytes([2, 3], 'big'))
-print(n.to_bytes(2, 'big'))
-[out]
-24930
-24931
-515
-b'\x00\x00'
-
-[case testFloatMethods]
-import typing
-print(1.5.as_integer_ratio())
-print(1.5.hex())
-print(2.0.is_integer())
-print(float.fromhex('0x1.8'))
-[out]
-(3, 2)
-0x1.8000000000000p+0
-True
-1.5
-
-[case testArray]
-import typing
-import array
-array.array('b', [1, 2])
-[out]
-
-[case testDictFromkeys]
-import typing
-d = dict.fromkeys('foo')
-d['x'] = 2
-d2 = dict.fromkeys([1, 2], b'')
-d2[2] = b'foo'
-[out]
-
-[case testReadOnlyProperty]
-class A:
-    x = 2
-    @property
-    def f(self) -> int:
-        return self.x + 1
-print(A().f)
-[out]
-3
-
-[case testIsinstanceWithTuple]
-from typing import cast, Any
-x = cast(Any, (1, 'x'))
-if isinstance(x, tuple):
-    print(x[0], x[1])
-[out]
-1 x
-
-[case testTypevarValues]
-from typing import TypeVar
-T = TypeVar('T', str, bytes)
-def f(x: T) -> T:
-    if isinstance(x, str):
-        return 'foo'
-    else:
-        return b'bar'
-print(f(''))
-print(f(b''))
-[out]
-foo
-b'bar'
-
-[case testAnyStr]
-from typing import AnyStr
-def f(x: AnyStr) -> AnyStr:
-    if isinstance(x, str):
-        return 'foo'
-    else:
-        return b'zar'
-print(f(''))
-print(f(b''))
-[out]
-foo
-b'zar'
-
-[case testNameNotImportedFromTyping]
-import typing
-cast(int, 2)
-[out]
-_program.py:2: error: Name 'cast' is not defined
-
-[case testBinaryIOType]
-from typing import BinaryIO
-def f(f: BinaryIO) -> None:
-    f.write(b'foo')
-    f.write(bytearray(b'foo'))
-[out]
-
-[case testIOTypes]
-from typing import IO
-import sys
-def txt(f: IO[str]) -> None:
-    f.write('foo')
-    f.write(b'foo')
-def bin(f: IO[bytes]) -> None:
-    f.write(b'foo')
-    f.write(bytearray(b'foo'))
-txt(sys.stdout)
-bin(sys.stdout)
-[out]
-_program.py:5: error: Argument 1 to "write" of "IO" has incompatible type "bytes"; expected "str"
-_program.py:10: error: Argument 1 to "bin" has incompatible type "TextIO"; expected IO[bytes]
-
-[case testBuiltinOpen]
-f = open('x')
-f.write('x')
-f.write(b'x')
-f.foobar()
-[out]
-_program.py:4: error: IO[Any] has no attribute "foobar"
-
-[case testGenericPatterns]
-from typing import Pattern
-import re
-p = None  # type: Pattern[str]
-p = re.compile('foo*')
-b = None  # type: Pattern[bytes]
-b = re.compile(b'foo*')
-print(p.match('fooo').group(0))
-[out]
-fooo
-
-[case testGenericMatch]
-from typing import Match
-import re
-def f(m: Match[bytes]) -> None:
-    print(m.group(0))
-f(re.match(b'x*', b'xxy'))
-[out]
-b'xx'
-
-[case testMultipleTypevarsWithValues]
-from typing import TypeVar
-
-T = TypeVar('T', int, str)
-S = TypeVar('S', int, str)
-
-def f(t: T, s: S) -> None:
-    t + s
-[out]
-_program.py:7: error: Unsupported operand types for + ("int" and "str")
-_program.py:7: error: Unsupported operand types for + ("str" and "int")
-
-[case testSystemExitCode]
-import typing
-print(SystemExit(5).code)
-[out]
-5
-
-[case testIntFloatDucktyping]
-
-x = None  # type: float
-x = 2.2
-x = 2
-def f(x: float) -> None: pass
-f(1.1)
-f(1)
-[out]
-
-[case testsFloatOperations]
-import typing
-print(1.5 + 1.5)
-print(1.5 + 1)
-[out]
-3.0
-2.5
-
-[case testMathFunctionWithIntArgument]
-import typing
-import math
-math.sin(2)
-math.sin(2.2)
-
-[case testAbsReturnType]
-
-f = None  # type: float
-n = None  # type: int
-n = abs(2)
-f = abs(2.2)
-abs(2.2) + 'x'
-[out]
-_program.py:6: error: Unsupported operand types for + ("float" and "str")
-
-[case testROperatorMethods]
-
-b = None  # type: bytes
-s = None  # type: str
-s = b'foo' * 5 # Error
-b = 5 * b'foo'
-b = b'foo' * 5
-s = 5 * 'foo'
-s = 'foo' * 5
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "bytes", variable has type "str")
-
-[case testROperatorMethods2]
-import typing
-print(2 / 0.5)
-print(' ', 2 * [3, 4])
-[out]
-4.0
-  [3, 4, 3, 4]
-
-[case testNotImplemented]
-import typing
-class A:
-    def __add__(self, x: int) -> int:
-        if isinstance(x, int):
-            return x + 1
-        return NotImplemented
-class B:
-    def __radd__(self, x: A) -> str:
-        return 'x'
-print(A() + 1)
-print(A() + B())
-[out]
-2
-x
-
-[case testMappingMethods]
-# Regression test
-from typing import Mapping
-x = {'x': 'y'} # type: Mapping[str, str]
-print('x' in x)
-print('y' in x)
-[out]
-True
-False
-
-[case testOverlappingOperatorMethods]
-
-class X: pass
-class A:
-    def __add__(self, x) -> int:
-        if isinstance(x, X):
-            return 1
-        return NotImplemented
-class B:
-    def __radd__(self, x: A) -> str: return 'x'
-class C(X, B): pass
-b = None  # type: B
-b = C()
-print(A() + b)
-[out]
-_program.py:9: error: Signatures of "__radd__" of "B" and "__add__" of "A" are unsafely overlapping
-
-[case testBytesAndBytearrayComparisons]
-import typing
-print(b'ab' < bytearray(b'b'))
-print(bytearray(b'ab') < b'a')
-[out]
-True
-False
-
-[case testBytesAndBytearrayComparisons2]
-import typing
-'' < b''
-b'' < ''
-'' < bytearray()
-bytearray() < ''
-[out]
-_program.py:2: error: Unsupported operand types for > ("bytes" and "str")
-_program.py:3: error: Unsupported operand types for > ("str" and "bytes")
-_program.py:4: error: Unsupported operand types for > ("bytearray" and "str")
-_program.py:5: error: Unsupported operand types for > ("str" and "bytearray")
-
-[case testInplaceOperatorMethod]
-import typing
-a = [1]
-print('', a.__iadd__([2]))
-print('', a)
-[out]
- [1, 2]
- [1, 2]
-
-[case testListInplaceAdd]
-import typing
-a = [1]
-a += iter([2, 3])
-print(tuple(a))
-[out]
-(1, 2, 3)
-
-[case testListConcatenateWithIterable]
-import typing
-[1] + iter([2, 3])
-[out]
-_program.py:2: error: Unsupported operand types for + ("list" and Iterator[int])
-
-[case testInferHeterogeneousListOfIterables]
-from typing import Sequence
-s = ['x', 'y'] # type: Sequence[str]
-a = [['x', 'x'], 'fo', s, iter('foo'), {'aa'}]
-for i, x in enumerate(a):
-    print(i, next(iter(x)))
-[out]
-0 x
-1 f
-2 x
-3 f
-4 aa
-
-[case testTextIOProperties]
-import typing
-import sys
-print(type(sys.stdin.encoding))
-print(type(sys.stdin.errors))
-sys.stdin.line_buffering
-sys.stdin.buffer
-sys.stdin.newlines
-[out]
-<class 'str'>
-<class 'str'>
-
-[case testIOProperties]
-import typing
-import sys
-print(sys.stdin.name)
-print(sys.stdin.buffer.mode)
-[out]
-<stdin>
-rb
-
-[case testSetUnion]
-import typing
-s = {'x', 'y'}
-print('>', sorted(s.union('foo')))
-[out]
-> ['f', 'o', 'x', 'y']
-
-[case testFromFuturePrintFunction]
-from __future__ import print_function
-print('a', 'b')
-[out]
-a b
-
-[case testLenOfTuple]
-import typing
-print(len((1, 'x')))
-[out]
-2
-
-[case testListMethods]
-import typing
-import sys
-l = [0, 1, 2, 3, 4]
-if sys.version >= '3.3':
-    l.clear()
-else:
-    l = []
-l.append(0)
-print('>', l)
-if sys.version >= '3.3':
-    m = l.copy()
-else:
-    m = l[:]
-m.extend([1, 2, 3, 4])
-print('>', m)
-print(l.index(0))
-print(l.index(0, 0))
-print(l.index(0, 0, 1))
-try:
-    print(l.index(1))
-    print('expected ValueError')
-except ValueError:
-    pass
-l.insert(0, 1)
-print('>', l)
-print(l.pop(0))
-print(l.pop())
-m.remove(0)
-try:
-    m.remove(0)
-    print('expected ValueError')
-except ValueError:
-    pass
-m.reverse()
-m.sort()
-m.sort(key=lambda x: -x)
-m.sort(reverse=False)
-m.sort(key=lambda x: -x, reverse=True)
-print('>', m)
-[out]
-> [0]
-> [0, 1, 2, 3, 4]
-0
-0
-0
-> [1, 0]
-1
-0
-> [1, 2, 3, 4]
-
-[case testListOperators]
-import typing
-l = [0, 1]
-print('+', l + [2])
-print('*', l * 2)
-print('*', 2 * l)
-print('in', 1 in l)
-print('==', l == [1, 2])
-print('!=', l != [1, 2])
-print('>', l > [1, 2, 3])
-print('>=', l >= [1, 2, 3])
-print('<', l < [1, 2, 3])
-print('<=', l <= [1, 2, 3])
-print('>[0]', l[0])
-l += [2]
-print('+=', l)
-l *= 2
-print('*=', l)
-print('iter', list(iter(l)))
-print('len', len(l))
-print('repr', repr(l))
-l[:3] = []
-print('setslice', l)
-print('reversed', list(reversed(l)))
-[out]
-+ [0, 1, 2]
-* [0, 1, 0, 1]
-* [0, 1, 0, 1]
-in True
-== False
-!= True
-> False
->= False
-< True
-<= True
->[0] 0
-+= [0, 1, 2]
-*= [0, 1, 2, 0, 1, 2]
-iter [0, 1, 2, 0, 1, 2]
-len 6
-repr [0, 1, 2, 0, 1, 2]
-setslice [0, 1, 2]
-reversed [2, 1, 0]
-
-[case testTupleAsSubtypeOfSequence]
-from typing import TypeVar, Sequence
-T = TypeVar('T')
-def f(a: Sequence[T]) -> None: print(a)
-f(tuple())
-[out]
-()
-
-[case testMapWithLambdaSpecialCase-skip]
-# TODO: Fix this; this was broken at some point but not sure why.
-from typing import List, Iterator
-a = [[1], [3]]
-b = map(lambda y: y[0], a)
-print('>', list(b))
-[out]
-> [1, 3]
-
-[case testInternalBuiltinDefinition]
-import typing
-def f(x: _T) -> None: pass
-[out]
-_program.py:2: error: Name '_T' is not defined
-
-[case testVarArgsFunctionSubtyping]
-import typing
-def f(*args: str) -> str: return args[0]
-map(f, ['x'])
-map(f, [1])
-[out]
-_program.py:4: error: Argument 1 to "map" has incompatible type Callable[[StarArg(str)], str]; expected Callable[[int], str]
-
-[case testMapStr]
-import typing
-x = range(3)
-a = list(map(str, x))
-a + 1
-[out]
-_program.py:4: error: Unsupported operand types for + (List[str] and "int")
-
-[case testNamedTuple]
-import typing
-from collections import namedtuple
-X = namedtuple('X', ['a', 'b'])
-x = X(a=1, b='s')
-print(x.a, x.b)
-[out]
-1 s
-
-[case testNamedTupleShortSyntax]
-import typing
-from collections import namedtuple
-X = namedtuple('X', ' a  b ')
-x = X(a=1, b='s')
-print(x.a, x.b)
-[out]
-1 s
-
-[case testNamedTupleError]
-import typing
-from collections import namedtuple
-X = namedtuple('X', ['a', 'b'])
-x = X(a=1, b='s')
-x.c
-[out]
-_program.py:5: error: "X" has no attribute "c"
-
-[case testNamedTupleTupleOperations]
-from typing import Iterable
-from collections import namedtuple
-X = namedtuple('X', ['a', 'b'])
-def f(x: Iterable[int]) -> None: pass
-x = X(a=1, b='s')
-f(x)
-print(len(x))
-print(x.index(1))
-print(x.count(1))
-print(x + x)
-[out]
-2
-0
-1
-(1, 's', 1, 's')
-
-[case testNamedTupleWithTypes]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int), ('b', str)])
-n = N(1, 'x')
-print(n)
-a, b = n
-print(a, b)
-print(n[0])
-[out]
-N(a=1, b='x')
-1 x
-1
-
-[case testRelativeImport]
-import typing
-from m import x
-print(x)
-[file m/__init__.py]
-from .n import x
-[file m/n.py]
-x = 1
-[out]
-1
-
-[case testRelativeImport2]
-import typing
-from m.n import x
-print(x)
-[file m/__init__.py]
-[file m/n.py]
-from .nn import x
-[file m/nn.py]
-x = 2
-[out]
-2
-
-[case testPyiTakesPrecedenceOverPy]
-import m
-m.f(1)
-[file m.py]
-def f(x):
-    print(x)
-[file m.pyi]
-import typing
-def f(x: str) -> None: pass
-[out]
-_program.py:2: error: Argument 1 to "f" has incompatible type "int"; expected "str"
-
-[case testAssignToComplexReal]
-import typing
-x = 4j
-y = x.real
-y = x         # Error
-x.real = 2.0  # Error
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "complex", variable has type "float")
-_program.py:5: error: Property "real" defined in "complex" is read-only
-
-[case testComplexArithmetic]
-import typing
-print(5 + 8j)
-print(3j * 2.0)
-print(4J / 2.0)
-[out]
-(5+8j)
-6j
-2j
-
-[case testComplexArithmetic2]
-import typing
-x = 5 + 8j
-x = ''
-y = 3j * 2.0
-y = ''
-[out]
-_program.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "complex")
-_program.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "complex")
-
-[case testUnionTypeAlias]
-from typing import Union
-U = Union[int, str]
-u = 1 # type: U
-u = 1.1
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "float", variable has type "Union[int, str]")
-
-[case testTupleTypeAlias]
-from typing import Tuple
-A = Tuple[int, str]
-u = 1, 'x' # type: A
-u = 1
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "int", variable has type "Tuple[int, str]")
-
-[case testCallableTypeAlias]
-from typing import Callable
-A = Callable[[int], None]
-def f(x: A) -> None:
-    x(1)
-    x('')
-[out]
-_program.py:5: error: Argument 1 has incompatible type "str"; expected "int"
-
-[case testSuperNew]
-from typing import Dict, Any
-class MyType(type):
-    def __new__(cls, name: str, bases: tuple, namespace: Dict[str, Any]) -> type:
-        return super().__new__(cls, name + 'x', bases, namespace)
-class A(metaclass=MyType): pass
-print(type(A()).__name__)
-[out]
-Ax
-
-[case testSequenceIndexAndCount]
-from typing import Sequence
-def f(x: Sequence[int]) -> None:
-    print(x.index(1))
-    print(x.count(1))
-f([0, 0, 1, 1, 1])
-[out]
-2
-3
-
-[case testEscapeInTripleQuotedStrLiteral]
-print('''\'''')
-print(r"""\"""$""")
-[out]
-'
-\"""$
-
-[case testSubclassBothGenericAndNonGenericABC]
-from typing import Generic, TypeVar
-from abc import ABCMeta
-T = TypeVar('T')
-class A(metaclass=ABCMeta): pass
-class B(Generic[T]): pass
-class C(A, B): pass
-class D(B, A): pass
-class E(A, B[T], Generic[T]): pass
-class F(B[T], A, Generic[T]): pass
-def f(e: E[int], f: F[int]) -> None: pass
-[out]
-
-[case testOptional]
-from typing import Optional
-def f() -> Optional[int]: pass
-x = f()
-y = 1
-y = x
-
-[case testAppendToStarArg]
-import typing
-def f(*x: int) -> None:
-    x.append(1)
-f(1)
-[out]
-_program.py:3: error: Tuple[int, ...] has no attribute "append"
-
-[case testExit]
-print('a')
-exit(2)
-print('b')
-[out]
-a
-
-[case testTypeVariableTypeComparability]
-from typing import TypeVar
-T = TypeVar('T')
-def eq(x: T, y: T, z: T) -> T:
-    if x == y:
-        return y
-    else:
-        return z
-print(eq(1, 2, 3))
-print(eq('x', 'x', 'z'))
-[out]
-3
-x
-
-[case testIntDecimalCompatibility]
-import typing
-from decimal import Decimal
-print(Decimal(1) + 2)
-print(Decimal(1) - 2)
-print(1 + Decimal('2.34'))
-print(1 - Decimal('2.34'))
-print(2 * Decimal('2.34'))
-[out]
-3
--1
-3.34
--1.34
-4.68
-
-[case testInstantiateBuiltinTypes]
-from typing import Dict, Set, List
-d = dict()  # type: Dict[int, str]
-s = set()   # type: Set[int]
-l = list()  # type: List[int]
-str()
-bytes()
-bytearray()
-int()
-float()
-complex()
-slice(1)
-bool()
-
-[case testVariableLengthTuple]
-from typing import Tuple
-def p(t: Tuple[int, ...]) -> None:
-    for n in t:
-        print(n)
-p((1, 3, 2))
-[out]
-1
-3
-2
-
-[case testVariableLengthTupleError]
-from typing import Tuple
-def p(t: Tuple[str, ...]) -> None:
-    n = 5
-    print(t[n])
-    for s in t:
-        s()
-''.startswith(('x', 'y'))
-''.startswith(('x', b'y'))
-[out]
-_program.py:6: error: "str" not callable
-_program.py:8: error: Argument 1 to "startswith" of "str" has incompatible type "Tuple[str, bytes]"; expected "Union[str, Tuple[str, ...]]"
-
-[case testMultiplyTupleByInteger]
-n = 4
-t = ('',) * n
-t + 1
-[out]
-_program.py:3: error: Unsupported operand types for + (Tuple[str, ...] and "int")
-
-[case testMultiplyTupleByIntegerReverse]
-n = 4
-t = n * ('',)
-t + 1
-[out]
-_program.py:3: error: Unsupported operand types for + (Tuple[str, ...] and "int")
-
-[case testDictWithKeywordArgs]
-from typing import Dict, Any, List
-d1 = dict(a=1, b=2) # type: Dict[str, int]
-d2 = dict(a=1, b='') # type: Dict[str, int] # E
-d3 = dict(a=1, b=1)
-d3.xyz # E
-d4 = dict(a=1, b='') # type: Dict[str, Any]
-result = dict(x=[], y=[]) # type: Dict[str, List[str]]
-[out]
-_program.py:3: error: List item 1 has incompatible type "Tuple[str, str]"
-_program.py:5: error: Dict[str, int] has no attribute "xyz"
-
-[case testDefaultDict]
-import typing as t
-from collections import defaultdict
-
-T = t.TypeVar('T')
-
-d1 = defaultdict(list) # type: t.DefaultDict[int, str]
-d2 = defaultdict() # type: t.DefaultDict[int, str]
-d2[0] = '0'
-d2['0'] = 0
-
-def tst(dct: t.DefaultDict[int, T]) -> T:
-    return dct[0]
-
-collections = ['coins', 'stamps', 'comics'] # type: t.List[str]
-d3 = defaultdict(str) # type: t.DefaultDict[int, str]
-collections[2]
-
-tst(defaultdict(list, {0: []}))
-tst(defaultdict(list, {'0': []}))
-
-class MyDDict(t.DefaultDict[int,T], t.Generic[T]):
-    pass
-MyDDict(dict)['0']
-MyDDict(dict)[0]
-[out]
-_program.py:6: error: Argument 1 to "defaultdict" has incompatible type List[_T]; expected Callable[[], str]
-_program.py:9: error: Invalid index type "str" for "dict"; expected type "int"
-_program.py:9: error: Incompatible types in assignment (expression has type "int", target has type "str")
-_program.py:19: error: List item 0 has incompatible type "Tuple[str, List[None]]"
-_program.py:23: error: Invalid index type "str" for "dict"; expected type "int"
-
-[case testDictUpdateInference]
-from typing import Dict, Optional
-d = {}  # type: Dict[str, Optional[int]]
-d.update({str(i): None for i in range(4)})
-
-[case testSuperAndSetattr]
-class A:
-    def __init__(self) -> None:
-        super().__setattr__('a', 1)
-        super().__setattr__(1, 'a')
-[out]
-_program.py:4: error: Argument 1 to "__setattr__" of "object" has incompatible type "int"; expected "str"
-
-[case testMetaclassAndSuper]
-class A(type):
-    def __new__(cls, name, bases, namespace) -> 'type':
-        return super().__new__(cls, '', (object,), {'x': 7})
-
-class B(metaclass=A):
-    pass
-
-print(getattr(B(), 'x'))
-[out]
-7
-
-[case testSortedNoError]
-from typing import Iterable, Callable, TypeVar, List, Dict
-T = TypeVar('T')
-def sorted(x: Iterable[T], *, key: Callable[[T], object] = None) -> None: ...
-a = None # type: List[Dict[str, str]]
-sorted(a, key=lambda y: y[''])
-
-[case testAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
-    @abstractproperty
-    def x(self) -> int: pass
-class B(A):
-    @property
-    def x(self) -> int:
-        return 3
-b = B()
-print(b.x + 1)
-[out]
-4
-
-[case testInferenceWithLambda]
-from typing import TypeVar, Iterable, Iterator
-import itertools
-
-_T = TypeVar('_T')
-
-def f(iterable): # type: (Iterable[_T]) -> Iterator[List[_T]]
-    grouped = itertools.groupby(enumerate(iterable), lambda pair: pair[0] // 2)
-    return ([elem for _, elem in group] for _, group in grouped)
-
-[case testReModuleBytes]
-# Regression tests for various overloads in the re module -- bytes version
-import re
-bre = b'a+'
-bpat = re.compile(bre)
-bpat = re.compile(bpat)
-re.search(bre, b'').groups()
-re.search(bre, u'') # Error
-re.search(bpat, b'').groups()
-re.search(bpat, u'') # Error
-# match(), split(), findall(), finditer() are much the same, so skip those.
-# sub(), subn() have more overloads and we are checking these:
-re.sub(bre, b'', b'') + b''
-re.sub(bpat, b'', b'') + b''
-re.sub(bre, lambda m: b'', b'') + b''
-re.sub(bpat, lambda m: b'', b'') + b''
-re.subn(bre, b'', b'')[0] + b''
-re.subn(bpat, b'', b'')[0] + b''
-re.subn(bre, lambda m: b'', b'')[0] + b''
-re.subn(bpat, lambda m: b'', b'')[0] + b''
-[out]
-_program.py:7: error: Type argument 1 of "search" has incompatible value "object"
-_program.py:9: error: Cannot infer type argument 1 of "search"
-
-[case testReModuleString]
-# Regression tests for various overloads in the re module -- string version
-import re
-sre = 'a+'
-spat = re.compile(sre)
-spat = re.compile(spat)
-re.search(sre, '').groups()
-re.search(sre, b'') # Error
-re.search(spat, '').groups()
-re.search(spat, b'') # Error
-# match(), split(), findall(), finditer() are much the same, so skip those.
-# sus(), susn() have more overloads and we are checking these:
-re.sub(sre, '', '') + ''
-re.sub(spat, '', '') + ''
-re.sub(sre, lambda m: '', '') + ''
-re.sub(spat, lambda m: '', '') + ''
-re.subn(sre, '', '')[0] + ''
-re.subn(spat, '', '')[0] + ''
-re.subn(sre, lambda m: '', '')[0] + ''
-re.subn(spat, lambda m: '', '')[0] + ''
-[out]
-_program.py:7: error: Type argument 1 of "search" has incompatible value "object"
-_program.py:9: error: Cannot infer type argument 1 of "search"
-
-[case testListSetitemTuple]
-from typing import List, Tuple
-a = []  # type: List[Tuple[str, int]]
-a[0] = 'x', 1
-a[1] = 2, 'y'
-a[:] = [('z', 3)]
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "Tuple[int, str]", target has type "Tuple[str, int]")
diff --git a/test-data/unit/semanal-abstractclasses.test b/test-data/unit/semanal-abstractclasses.test
deleted file mode 100644
index b5147bd..0000000
--- a/test-data/unit/semanal-abstractclasses.test
+++ /dev/null
@@ -1,119 +0,0 @@
-[case testAbstractMethods]
-from abc import abstractmethod, ABCMeta
-import typing
-
-class A(metaclass=ABCMeta):
-  @abstractmethod
-  def g(self) -> 'A': pass
-  @abstractmethod
-  def f(self) -> 'A': return self
-[out]
-MypyFile:1(
-  ImportFrom:1(abc, [abstractmethod, ABCMeta])
-  Import:2(typing)
-  ClassDef:4(
-    A
-    Metaclass(ABCMeta)
-    Decorator:5(
-      Var(g)
-      FuncDef:6(
-        g
-        Args(
-          Var(self))
-        def (self: __main__.A) -> __main__.A
-        Abstract
-        Block:6(
-          PassStmt:6())))
-    Decorator:7(
-      Var(f)
-      FuncDef:8(
-        f
-        Args(
-          Var(self))
-        def (self: __main__.A) -> __main__.A
-        Abstract
-        Block:8(
-          ReturnStmt:8(
-            NameExpr(self [l])))))))
-
-[case testClassInheritingTwoAbstractClasses]
-from abc import abstractmethod, ABCMeta
-import typing
-
-class A(metaclass=ABCMeta): pass
-class B(metaclass=ABCMeta): pass
-class C(A, B): pass
-[out]
-MypyFile:1(
-  ImportFrom:1(abc, [abstractmethod, ABCMeta])
-  Import:2(typing)
-  ClassDef:4(
-    A
-    Metaclass(ABCMeta)
-    PassStmt:4())
-  ClassDef:5(
-    B
-    Metaclass(ABCMeta)
-    PassStmt:5())
-  ClassDef:6(
-    C
-    BaseType(
-      __main__.A
-      __main__.B)
-    PassStmt:6()))
-
-[case testAbstractGenericClass]
-from abc import abstractmethod
-from typing import Generic, TypeVar
-T = TypeVar('T')
-class A(Generic[T]):
-  @abstractmethod
-  def f(self) -> 'A[T]': pass
-[out]
-MypyFile:1(
-  ImportFrom:1(abc, [abstractmethod])
-  ImportFrom:2(typing, [Generic, TypeVar])
-  AssignmentStmt:3(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:3())
-  ClassDef:4(
-    A
-    TypeVars(
-      T)
-    Decorator:5(
-      Var(f)
-      FuncDef:6(
-        f
-        Args(
-          Var(self))
-        def (self: __main__.A[T`1]) -> __main__.A[T`1]
-        Abstract
-        Block:6(
-          PassStmt:6())))))
-
-[case testFullyQualifiedAbstractMethodDecl]
-import abc
-from abc import ABCMeta
-import typing
-
-class A(metaclass=ABCMeta):
-  @abc.abstractmethod
-  def g(self) -> 'A': pass
-[out]
-MypyFile:1(
-  Import:1(abc)
-  ImportFrom:2(abc, [ABCMeta])
-  Import:3(typing)
-  ClassDef:5(
-    A
-    Metaclass(ABCMeta)
-    Decorator:6(
-      Var(g)
-      FuncDef:7(
-        g
-        Args(
-          Var(self))
-        def (self: __main__.A) -> __main__.A
-        Abstract
-        Block:7(
-          PassStmt:7())))))
diff --git a/test-data/unit/semanal-basic.test b/test-data/unit/semanal-basic.test
deleted file mode 100644
index 3c11da8..0000000
--- a/test-data/unit/semanal-basic.test
+++ /dev/null
@@ -1,459 +0,0 @@
-[case testEmptyFile]
-[out]
-MypyFile:1()
-
-[case testGlobalVariable]
-x = 1
-x
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  ExpressionStmt:2(
-    NameExpr(x [__main__.x])))
-
-[case testMultipleGlobals]
-x = y = 2
-z = 3
-(x, y, z)
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(2))
-  AssignmentStmt:2(
-    NameExpr(z* [__main__.z])
-    IntExpr(3))
-  ExpressionStmt:3(
-    TupleExpr:3(
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y])
-      NameExpr(z [__main__.z]))))
-
-[case testEmptyFunction]
-def f(): pass
-f()
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      PassStmt:1()))
-  ExpressionStmt:2(
-    CallExpr:2(
-      NameExpr(f [__main__.f])
-      Args())))
-
-[case testAccessingGlobalNameBeforeDefinition]
-x
-f()
-x = 1
-def f(): pass
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    NameExpr(x [__main__.x]))
-  ExpressionStmt:2(
-    CallExpr:2(
-      NameExpr(f [__main__.f])
-      Args()))
-  AssignmentStmt:3(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  FuncDef:4(
-    f
-    Block:4(
-      PassStmt:4())))
-
-[case testFunctionArgs]
-def f(x, y):
-  (x, y)
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x)
-      Var(y))
-    Block:1(
-      ExpressionStmt:2(
-        TupleExpr:2(
-          NameExpr(x [l])
-          NameExpr(y [l]))))))
-
-[case testLocalVar]
-def f():
-  x = 1
-  x
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      AssignmentStmt:2(
-        NameExpr(x* [l])
-        IntExpr(1))
-      ExpressionStmt:3(
-        NameExpr(x [l])))))
-
-[case testAccessGlobalInFn]
-def f():
-  x
-  g()
-x = 1
-def g(): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ExpressionStmt:2(
-        NameExpr(x [__main__.x]))
-      ExpressionStmt:3(
-        CallExpr:3(
-          NameExpr(g [__main__.g])
-          Args()))))
-  AssignmentStmt:4(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  FuncDef:5(
-    g
-    Block:5(
-      PassStmt:5())))
-
-[case testAssignmentAfterInit]
-x = 1
-x = 2
-def f(y):
-  y = 1
-  z = 1
-  z = 2
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    IntExpr(2))
-  FuncDef:3(
-    f
-    Args(
-      Var(y))
-    Block:3(
-      AssignmentStmt:4(
-        NameExpr(y [l])
-        IntExpr(1))
-      AssignmentStmt:5(
-        NameExpr(z* [l])
-        IntExpr(1))
-      AssignmentStmt:6(
-        NameExpr(z [l])
-        IntExpr(2)))))
-
-[case testLocalAndGlobalAliasing]
-x = 1
-def f():
-  x = 2
-  x
-x
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  FuncDef:2(
-    f
-    Block:2(
-      AssignmentStmt:3(
-        NameExpr(x* [l])
-        IntExpr(2))
-      ExpressionStmt:4(
-        NameExpr(x [l]))))
-  ExpressionStmt:5(
-    NameExpr(x [__main__.x])))
-
-[case testArgumentInitializers]
-def f(x = f, y = object):
-  x, y
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x)
-      Var(y))
-    Init(
-      AssignmentStmt:1(
-        NameExpr(x [l])
-        NameExpr(f [__main__.f]))
-      AssignmentStmt:1(
-        NameExpr(y [l])
-        NameExpr(object [builtins.object])))
-    Block:1(
-      ExpressionStmt:2(
-        TupleExpr:2(
-          NameExpr(x [l])
-          NameExpr(y [l]))))))
-
-[case testVarArgs]
-def f(x, *y):
-  x, y
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    VarArg(
-      Var(y))
-    Block:1(
-      ExpressionStmt:2(
-        TupleExpr:2(
-          NameExpr(x [l])
-          NameExpr(y [l]))))))
-
-[case testGlobalDecl]
-x = None
-def f():
-    global x
-    x = None
-    x
-class A: pass
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    NameExpr(None [builtins.None]))
-  FuncDef:2(
-    f
-    Block:2(
-      GlobalDecl:3(
-        x)
-      AssignmentStmt:4(
-        NameExpr(x [__main__.x])
-        NameExpr(None [builtins.None]))
-      ExpressionStmt:5(
-        NameExpr(x [__main__.x]))))
-  ClassDef:6(
-    A
-    PassStmt:6()))
-
-[case testMultipleNamesInGlobalDecl]
-x, y = None, None
-def f():
-    global x, y
-    x = y
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    TupleExpr:1(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    TupleExpr:1(
-      NameExpr(None [builtins.None])
-      NameExpr(None [builtins.None])))
-  FuncDef:2(
-    f
-    Block:2(
-      GlobalDecl:3(
-        x
-        y)
-      AssignmentStmt:4(
-        NameExpr(x [__main__.x])
-        NameExpr(y [__main__.y])))))
-
-[case testGlobalDeclScope]
-x = None
-def f():
-    global x
-def g():
-    x = None
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    NameExpr(None [builtins.None]))
-  FuncDef:2(
-    f
-    Block:2(
-      GlobalDecl:3(
-        x)))
-  FuncDef:4(
-    g
-    Block:4(
-      AssignmentStmt:5(
-        NameExpr(x* [l])
-        NameExpr(None [builtins.None])))))
-
-[case testGlobalDeclScope]
-x = None
-def f():
-    global x
-def g():
-    x = None
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    NameExpr(None [builtins.None]))
-  FuncDef:2(
-    f
-    Block:2(
-      GlobalDecl:3(
-        x)))
-  FuncDef:4(
-    g
-    Block:4(
-      AssignmentStmt:5(
-        NameExpr(x* [l])
-        NameExpr(None [builtins.None])))))
-
-[case testGlobaWithinMethod]
-x = None
-class A:
-  def f(self):
-    global x
-    x = self
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    NameExpr(None [builtins.None]))
-  ClassDef:2(
-    A
-    FuncDef:3(
-      f
-      Args(
-        Var(self))
-      Block:3(
-        GlobalDecl:4(
-          x)
-        AssignmentStmt:5(
-          NameExpr(x [__main__.x])
-          NameExpr(self [l]))))))
-
-[case testGlobalDefinedInBlock]
-if object:
-    x = object()
-    x = x
-x
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      NameExpr(object [builtins.object]))
-    Then(
-      AssignmentStmt:2(
-        NameExpr(x* [__main__.x])
-        CallExpr:2(
-          NameExpr(object [builtins.object])
-          Args()))
-      AssignmentStmt:3(
-        NameExpr(x [__main__.x])
-        NameExpr(x [__main__.x]))))
-  ExpressionStmt:4(
-    NameExpr(x [__main__.x])))
-
-[case testNonlocalDecl]
-def g():
-    x = None
-    def f():
-        nonlocal x
-        x = None
-        x
-[out]
-MypyFile:1(
-  FuncDef:1(
-    g
-    Block:1(
-      AssignmentStmt:2(
-        NameExpr(x* [l])
-        NameExpr(None [builtins.None]))
-      FuncDef:3(
-        f
-        Block:3(
-          NonlocalDecl:4(
-            x)
-          AssignmentStmt:5(
-            NameExpr(x [l])
-            NameExpr(None [builtins.None]))
-          ExpressionStmt:6(
-            NameExpr(x [l])))))))
-
-[case testMultipleNamesInNonlocalDecl]
-def g():
-    x, y = None, None
-    def f(z):
-        nonlocal x, y
-        x = y
-[out]
-MypyFile:1(
-  FuncDef:1(
-    g
-    Block:1(
-      AssignmentStmt:2(
-        TupleExpr:2(
-          NameExpr(x* [l])
-          NameExpr(y* [l]))
-        TupleExpr:2(
-          NameExpr(None [builtins.None])
-          NameExpr(None [builtins.None])))
-      FuncDef:3(
-        f
-        Args(
-          Var(z))
-        Block:3(
-          NonlocalDecl:4(
-            x
-            y)
-          AssignmentStmt:5(
-            NameExpr(x [l])
-            NameExpr(y [l])))))))
-
-[case testNestedFunctions]
-def f(x):
-    def g(y):
-        z = y + x
-    return g
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    Block:1(
-      FuncDef:2(
-        g
-        Args(
-          Var(y))
-        Block:2(
-          AssignmentStmt:3(
-            NameExpr(z* [l])
-            OpExpr:3(
-              +
-              NameExpr(y [l])
-              NameExpr(x [l])))))
-      ReturnStmt:4(
-        NameExpr(g [l])))))
-
-[case testNestedFunctionWithOverlappingName]
-def f(x):
-    def g():
-        x = 1
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    Block:1(
-      FuncDef:2(
-        g
-        Block:2(
-          AssignmentStmt:3(
-            NameExpr(x* [l])
-            IntExpr(1)))))))
diff --git a/test-data/unit/semanal-classes.test b/test-data/unit/semanal-classes.test
deleted file mode 100644
index 431261f..0000000
--- a/test-data/unit/semanal-classes.test
+++ /dev/null
@@ -1,623 +0,0 @@
--- Test cases related to classes for the semantic analyzer.
-
-[case testSimpleClass]
-class A: pass
-x = A
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    PassStmt:1())
-  AssignmentStmt:2(
-    NameExpr(x* [__main__.x])
-    NameExpr(A [__main__.A])))
-
-[case testMethods]
-class A:
-  def __init__(self, x):
-    y = x
-  def f(self):
-    y = self
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      __init__
-      Args(
-        Var(self)
-        Var(x))
-      Block:2(
-        AssignmentStmt:3(
-          NameExpr(y* [l])
-          NameExpr(x [l]))))
-    FuncDef:4(
-      f
-      Args(
-        Var(self))
-      Block:4(
-        AssignmentStmt:5(
-          NameExpr(y* [l])
-          NameExpr(self [l]))))))
-
-[case testMemberDefinitionInInit]
-class A:
-  def __init__(self):
-    self.x = 1
-    self.y = 2
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      __init__
-      Args(
-        Var(self))
-      Block:2(
-        AssignmentStmt:3(
-          MemberExpr:3(
-            NameExpr(self [l])
-            x*)
-          IntExpr(1))
-        AssignmentStmt:4(
-          MemberExpr:4(
-            NameExpr(self [l])
-            y*)
-          IntExpr(2))))))
-
-[case testMemberAssignmentViaSelfOutsideInit]
-class A:
-  def f(self):
-    self.x = 1
-def __init__(self):
-  self.y = 1
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      f
-      Args(
-        Var(self))
-      Block:2(
-        AssignmentStmt:3(
-          MemberExpr:3(
-            NameExpr(self [l])
-            x*)
-          IntExpr(1)))))
-  FuncDef:4(
-    __init__
-    Args(
-      Var(self))
-    Block:4(
-      AssignmentStmt:5(
-        MemberExpr:5(
-          NameExpr(self [l])
-          y)
-        IntExpr(1)))))
-
-[case testMemberAssignmentNotViaSelf]
-class A:
-  def __init__(x, self):
-    self.y = 1 # not really self
-class B:
-  def __init__(x):
-    self = x
-    self.z = 1
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      __init__
-      Args(
-        Var(x)
-        Var(self))
-      Block:2(
-        AssignmentStmt:3(
-          MemberExpr:3(
-            NameExpr(self [l])
-            y)
-          IntExpr(1)))))
-  ClassDef:4(
-    B
-    FuncDef:5(
-      __init__
-      Args(
-        Var(x))
-      Block:5(
-        AssignmentStmt:6(
-          NameExpr(self* [l])
-          NameExpr(x [l]))
-        AssignmentStmt:7(
-          MemberExpr:7(
-            NameExpr(self [l])
-            z)
-          IntExpr(1))))))
-
-[case testNonStandardNameForSelfAndInit]
-class A:
-  def __init__(x):
-    x.y = 1
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      __init__
-      Args(
-        Var(x))
-      Block:2(
-        AssignmentStmt:3(
-          MemberExpr:3(
-            NameExpr(x [l])
-            y*)
-          IntExpr(1))))))
-
-[case testAssignmentAfterAttributeInit]
-class A:
-  def __init__(self):
-    self.x = 1
-    self.x = 2
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      __init__
-      Args(
-        Var(self))
-      Block:2(
-        AssignmentStmt:3(
-          MemberExpr:3(
-            NameExpr(self [l])
-            x*)
-          IntExpr(1))
-        AssignmentStmt:4(
-          MemberExpr:4(
-            NameExpr(self [l])
-            x)
-          IntExpr(2))))))
-
-[case testOverloadedMethod]
-from typing import overload
-class A:
-  @overload
-  def f(self) -> None: self
-  @overload
-  def f(self, x: 'A') -> None: self
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [overload])
-  ClassDef:2(
-    A
-    OverloadedFuncDef:3(
-      Overload(def (self: __main__.A), \
-               def (self: __main__.A, x: __main__.A))
-      Decorator:3(
-        Var(f)
-        NameExpr(overload [typing.overload])
-        FuncDef:4(
-          f
-          Args(
-            Var(self))
-          def (self: __main__.A)
-          Block:4(
-            ExpressionStmt:4(
-              NameExpr(self [l])))))
-      Decorator:5(
-        Var(f)
-        NameExpr(overload [typing.overload])
-        FuncDef:6(
-          f
-          Args(
-            Var(self)
-            Var(x))
-          def (self: __main__.A, x: __main__.A)
-          Block:6(
-            ExpressionStmt:6(
-              NameExpr(self [l]))))))))
-
-[case testAttributeWithoutType]
-class A:
-    a = object
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    AssignmentStmt:2(
-      NameExpr(a* [m])
-      NameExpr(object [builtins.object]))))
-
-[case testDataAttributeRefInClassBody]
-class A:
-    x = 1
-    y = x
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    AssignmentStmt:2(
-      NameExpr(x* [m])
-      IntExpr(1))
-    AssignmentStmt:3(
-      NameExpr(y* [m])
-      NameExpr(x [m]))))
-
-[case testMethodRefInClassBody]
-class A:
-    def f(self): pass
-    g = f
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      f
-      Args(
-        Var(self))
-      Block:2(
-        PassStmt:2()))
-    AssignmentStmt:3(
-      NameExpr(g* [m])
-      NameExpr(f [m]))))
-
-[case testIfStatementInClassBody]
-class A:
-    if A:
-        x = 1
-    else:
-        x = 2
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    IfStmt:2(
-      If(
-        NameExpr(A [__main__.A]))
-      Then(
-        AssignmentStmt:3(
-          NameExpr(x* [m])
-          IntExpr(1)))
-      Else(
-        AssignmentStmt:5(
-          NameExpr(x [m])
-          IntExpr(2))))))
-
-[case testForStatementInClassBody]
-class A:
-    for x in [1, 2]:
-        y = x
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    ForStmt:2(
-      NameExpr(x* [m])
-      ListExpr:2(
-        IntExpr(1)
-        IntExpr(2))
-      Block:2(
-        AssignmentStmt:3(
-          NameExpr(y* [m])
-          NameExpr(x [m]))))))
-
-[case testReferenceToClassWithinFunction]
-def f():
-    class A: pass
-    A
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ClassDef:2(
-        A
-        PassStmt:2())
-      ExpressionStmt:3(
-        NameExpr(A [l])))))
-
-[case testReferenceToClassWithinClass]
-class A:
-    class B: pass
-    B
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    ClassDef:2(
-      B
-      PassStmt:2())
-    ExpressionStmt:3(
-      NameExpr(B [__main__.A.B]))))
-
-[case testClassWithBaseClassWithinClass]
-class A:
-    class B: pass
-    class C(B): pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    ClassDef:2(
-      B
-      PassStmt:2())
-    ClassDef:3(
-      C
-      BaseType(
-        __main__.A.B)
-      PassStmt:3())))
-
-[case testDeclarationReferenceToNestedClass]
-def f() -> None:
-    class A: pass
-    x = None # type: A
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def ()
-    Block:1(
-      ClassDef:2(
-        A
-        PassStmt:2())
-      AssignmentStmt:3(
-        NameExpr(x [l])
-        NameExpr(None [builtins.None])
-        A))))
-
-[case testAccessToLocalInOuterScopeWithinNestedClass]
-def f(x):
-    class A:
-        y = x
-        def g(self):
-            z = x
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    Block:1(
-      ClassDef:2(
-        A
-        AssignmentStmt:3(
-          NameExpr(y* [m])
-          NameExpr(x [l]))
-        FuncDef:4(
-          g
-          Args(
-            Var(self))
-          Block:4(
-            AssignmentStmt:5(
-              NameExpr(z* [l])
-              NameExpr(x [l]))))))))
-
-[case testQualifiedMetaclass]
-import abc
-class A(metaclass=abc.ABCMeta): pass
-[out]
-MypyFile:1(
-  Import:1(abc)
-  ClassDef:2(
-    A
-    Metaclass(abc.ABCMeta)
-    PassStmt:2()))
-
-[case testStaticMethod]
-class A:
-  @staticmethod
-  def f(z: int) -> str: pass
-[builtins fixtures/staticmethod.pyi]
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    Decorator:2(
-      Var(f)
-      FuncDef:3(
-        f
-        Args(
-          Var(z))
-        def (z: builtins.int) -> builtins.str
-        Static
-        Block:3(
-          PassStmt:3())))))
-
-[case testStaticMethodWithNoArgs]
-class A:
-  @staticmethod
-  def f() -> str: pass
-[builtins fixtures/staticmethod.pyi]
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    Decorator:2(
-      Var(f)
-      FuncDef:3(
-        f
-        def () -> builtins.str
-        Static
-        Block:3(
-          PassStmt:3())))))
-
-[case testClassMethod]
-class A:
-  @classmethod
-  def f(cls, z: int) -> str: pass
-[builtins fixtures/classmethod.pyi]
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    Decorator:2(
-      Var(f)
-      FuncDef:3(
-        f
-        Args(
-          Var(cls)
-          Var(z))
-        def (cls: def () -> __main__.A, z: builtins.int) -> builtins.str
-        Class
-        Block:3(
-          PassStmt:3())))))
-
-[case testClassMethodWithNoArgs]
-class A:
-  @classmethod
-  def f(cls) -> str: pass
-[builtins fixtures/classmethod.pyi]
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    Decorator:2(
-      Var(f)
-      FuncDef:3(
-        f
-        Args(
-          Var(cls))
-        def (cls: def () -> __main__.A) -> builtins.str
-        Class
-        Block:3(
-          PassStmt:3())))))
-
-[case testProperty]
-import typing
-class A:
-  @property
-  def f(self) -> str: pass
-[builtins fixtures/property.pyi]
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ClassDef:2(
-    A
-    Decorator:3(
-      Var(f)
-      FuncDef:4(
-        f
-        Args(
-          Var(self))
-        def (self: __main__.A) -> builtins.str
-        Property
-        Block:4(
-          PassStmt:4())))))
-
-[case testClassDecorator]
-import typing
- at object
-class A: pass
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ClassDef:2(
-    A
-    Decorators(
-      NameExpr(object [builtins.object]))
-    PassStmt:3()))
-
-[case testClassAttributeAsMethodDefaultArgumentValue]
-import typing
-class A:
-    X = 1
-    def f(self, x : int = X) -> None: pass
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ClassDef:2(
-    A
-    AssignmentStmt:3(
-      NameExpr(X* [m])
-      IntExpr(1))
-    FuncDef:4(
-      f
-      Args(
-        Var(self)
-        Var(x))
-      def (self: __main__.A, x: builtins.int =)
-      Init(
-        AssignmentStmt:4(
-          NameExpr(x [l])
-          NameExpr(X [m])))
-      Block:4(
-        PassStmt:4()))))
-
-[case testInvalidBaseClass]
-from typing import Any, Callable
-class A(None): pass
-class B(Any): pass
-class C(Callable[[], int]): pass
-[out]
-main:2: error: Invalid base class
-main:4: error: Invalid base class
-
-[case testTupleAsBaseClass]
-import m
-[file m.pyi]
-from typing import Tuple
-class A(Tuple[int, str]): pass
-[builtins fixtures/tuple.pyi]
-[out]
-MypyFile:1(
-  Import:1(m))
-MypyFile:1(
-  tmp/m.pyi
-  ImportFrom:1(typing, [Tuple])
-  ClassDef:2(
-    A
-    TupleType(
-      Tuple[builtins.int, builtins.str])
-    BaseType(
-      builtins.tuple[Any])
-    PassStmt:2()))
-
-[case testBaseClassFromIgnoredModule]
-import m # type: ignore
-class B(m.A):
-   pass
-[out]
-MypyFile:1(
-  Import:1(m)
-  ClassDef:2(
-    B
-    FallbackToAny
-    BaseType(
-      builtins.object)
-    PassStmt:3())
-  IgnoredLines(1))
-
-[case testBaseClassFromIgnoredModuleUsingImportFrom]
-from m import A # type: ignore
-class B(A, int):
-   pass
-[out]
-MypyFile:1(
-  ImportFrom:1(m, [A])
-  ClassDef:2(
-    B
-    FallbackToAny
-    BaseType(
-      builtins.int)
-    PassStmt:3())
-  IgnoredLines(1))
-
-[case testBaseClassWithExplicitAnyType]
-from typing import Any
-A = 1 # type: Any
-class B(A):
-   pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Any])
-  AssignmentStmt:2(
-    NameExpr(A [__main__.A])
-    IntExpr(1)
-    Any)
-  ClassDef:3(
-    B
-    FallbackToAny
-    BaseType(
-      builtins.object)
-    PassStmt:4()))
diff --git a/test-data/unit/semanal-errors.test b/test-data/unit/semanal-errors.test
deleted file mode 100644
index 06fd3d0..0000000
--- a/test-data/unit/semanal-errors.test
+++ /dev/null
@@ -1,1323 +0,0 @@
-[case testPropagatingParseErrors]
-in 1
-def f():
-  1 1
-[out]
-main:1: error: Parse error before in
-main:3: error: Parse error before numeric literal
-
-[case testUndefinedVariableInGlobalStatement]
-import typing
-x
-y
-[out]
-main:2: error: Name 'x' is not defined
-main:3: error: Name 'y' is not defined
-
-[case testUndefinedVariableWithinFunctionContext]
-import typing
-def f() -> None:
-  x
-y
-[out]
-main:3: error: Name 'x' is not defined
-main:4: error: Name 'y' is not defined
-
-[case testMethodScope]
-import typing
-class A:
-  def f(self): pass
-f
-[out]
-main:4: error: Name 'f' is not defined
-
-[case testMethodScope2]
-import typing
-class A:
-  def f(self): pass
-class B:
-  def g(self) -> None:
-    f # error
-    g # error
-[out]
-main:6: error: Name 'f' is not defined
-main:7: error: Name 'g' is not defined
-
-[case testInvalidType]
-import typing
-x = None # type: X
-[out]
-main:2: error: Name 'X' is not defined
-
-[case testInvalidGenericArg]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-x = 0 # type: A[y]
-[out]
-main:4: error: Name 'y' is not defined
-
-[case testInvalidNumberOfGenericArgsInTypeDecl]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A: pass
-class B(Generic[t]): pass
-x = 0 # type: B[A, A]
-y = 0 # type: A[A]
-[out]
-main:5: error: "B" expects 1 type argument, but 2 given
-main:6: error: "A" expects no type arguments, but 1 given
-
-[case testInvalidNumberOfGenericArgsInUndefinedArg]
-
-class A: pass
-x = None  # type: A[int] # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInNestedBlock]
-
-class A: pass
-class B:
-    def f(self) -> None:
-        while 1:
-            x = None  # type: A[int] \
-                # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInSignature]
-import typing
-class A: pass
-def f() -> A[int]: pass # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInOverloadedSignature]
-from typing import overload
-class A: pass
- at overload
-def f(): pass
- at overload
-def f(x: A[int]) -> None: pass # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInBaseType]
-import typing
-class A: pass
-class B(A[int]): pass # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInCast]
-from typing import cast
-class A: pass
-x = cast(A[int], 1) # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInTypeApplication]
-import typing
-class A: pass
-class B: pass
-x = A[B[int]]() # E: "B" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInNestedGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]): pass
-class B: pass
-def f() -> A[B[int]]: pass # E: "B" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInTupleType]
-from typing import Tuple
-class A: pass
-x = None # type: Tuple[A[int]] # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInFunctionType]
-from typing import Callable
-class A: pass
-x = None # type: Callable[[A[int]], int]  # E: "A" expects no type arguments, but 1 given
-y = None # type: Callable[[], A[int]]  # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testVarOrFuncAsType]
-import typing
-def f(): pass
-x = 1
-y = 0 # type: f
-z = 0 # type: x
-[out]
-main:4: error: Invalid type "__main__.f"
-main:5: error: Invalid type "__main__.x"
-
-[case testTwoStarsInType]
-import typing
-x, x2 = 1 # type: *object, *object
-y, y2 = 1 # type: object, (*object, *object)
-z, z2 = 1 # type: *object, (object, *object)
-[out]
-main:2: error: At most one star type allowed in a tuple
-main:3: error: At most one star type allowed in a tuple
-main:4: error: Star type only allowed for starred expressions
-
-[case testGlobalVarRedefinition]
-import typing
-class A: pass
-x = 0 # type: A
-x = 0 # type: A
-[out]
-main:4: error: Name 'x' already defined
-
-[case testLocalVarRedefinition]
-import typing
-class A: pass
-def f() -> None:
-  x = 0 # type: A
-  x = 0 # type: A
-[out]
-main:5: error: Name 'x' already defined
-
-[case testClassVarRedefinition]
-import typing
-class A:
-  x = 0 # type: object
-  x = 0 # type: object
-[out]
-main:4: error: Name 'x' already defined
-
-[case testMultipleClassDefinitions]
-import typing
-class A: pass
-class A: pass
-[out]
-main:3: error: Name 'A' already defined
-
-[case testMultipleMixedDefinitions]
-import typing
-x = 1
-def x(): pass
-class x: pass
-[out]
-main:3: error: Name 'x' already defined
-main:4: error: Name 'x' already defined
-
-[case testNameNotImported]
-import typing
-from m import y
-x
-[file m.py]
-x = y = 1
-[out]
-main:3: error: Name 'x' is not defined
-
-[case testMissingNameInImportFrom]
-import typing
-from m import y
-[file m.py]
-x = 1
-[out]
-main:2: error: Module 'm' has no attribute 'y'
-
-[case testMissingModule]
-import typing
-import m
-[out]
-main:2: error: Cannot find module named 'm'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testMissingModule2]
-import typing
-from m import x
-[out]
-main:2: error: Cannot find module named 'm'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testMissingModule3]
-import typing
-from m import *
-[out]
-main:2: error: Cannot find module named 'm'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testMissingModuleRelativeImport]
-import typing
-import m
-[file m/__init__.py]
-from .x import y
-[out]
-tmp/m/__init__.py:1: error: Cannot find module named 'm.x'
-tmp/m/__init__.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testMissingModuleRelativeImport2]
-import typing
-import m.a
-[file m/__init__.py]
-[file m/a.py]
-from .x import y
-[out]
-tmp/m/a.py:1: error: Cannot find module named 'm.x'
-tmp/m/a.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testModuleNotImported]
-import typing
-import _m
-_n.x
-[file _m.py]
-import _n
-[file _n.py]
-x = 1
-[out]
-main:3: error: Name '_n' is not defined
-
-[case testImportAsteriskPlusUnderscore]
-import typing
-from _m import *
-_x
-__x__
-[file _m.py]
-_x = __x__ = 1
-[out]
-main:3: error: Name '_x' is not defined
-main:4: error: Name '__x__' is not defined
-
-[case testRelativeImportAtTopLevelModule]
-from . import m
-[out]
-main:1: error: No parent module -- cannot perform relative import
-
-[case testRelativeImportAtTopLevelModule2]
-from .. import m
-[out]
-main:1: error: No parent module -- cannot perform relative import
-
-[case testUndefinedTypeWithQualifiedName]
-import typing
-import m
-def f() -> m.c: pass
-def g() -> n.c: pass
-[file m.py]
-[out]
-main:3: error: Name 'm.c' is not defined
-main:4: error: Name 'n' is not defined
-
-[case testMissingPackage]
-import typing
-import m.n
-[out]
-main:2: error: Cannot find module named 'm'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Cannot find module named 'm.n'
-
-[case testMissingPackage]
-import typing
-from m.n import x
-from a.b import *
-[out]
-main:2: error: Cannot find module named 'm.n'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:3: error: Cannot find module named 'a.b'
-
-[case testErrorInImportedModule]
-import m
-[file m.py]
-import typing
-x = y
-[out]
-tmp/m.py:2: error: Name 'y' is not defined
-
-[case testErrorInImportedModule2]
-import m.n
-[file m/__init__.py]
-[file m/n.py]
-import k
-[file k.py]
-import typing
-x = y
-[out]
-tmp/k.py:2: error: Name 'y' is not defined
-
-[case testPackageWithoutInitFile]
-import typing
-import m.n
-m.n.x
-[file m/n.py]
-x = 1
-[out]
-main:2: error: Cannot find module named 'm'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Cannot find module named 'm.n'
-
-[case testBreakOutsideLoop]
-break
-def f():
-  break
-[out]
-main:1: error: 'break' outside loop
-main:3: error: 'break' outside loop
-
-[case testContinueOutsideLoop]
-continue
-def f():
-  continue
-[out]
-main:1: error: 'continue' outside loop
-main:3: error: 'continue' outside loop
-
-[case testReturnOutsideFunction]
-def f(): pass
-return
-return 1
-[out]
-main:2: error: 'return' outside function
-main:3: error: 'return' outside function
-
-[case testYieldOutsideFunction]
-yield 1
-yield
-[out]
-main:1: error: 'yield' outside function
-main:2: error: 'yield' outside function
-
-[case testInvalidLvalues]
-1 = 1
-(1) = 1
-(1, 1) = 1
-[1, 1] = 1
-() = 1
-[out]
-main:1: error: Invalid assignment target
-main:2: error: Invalid assignment target
-main:3: error: Invalid assignment target
-main:4: error: Invalid assignment target
-main:5: error: Can't assign to ()
---' (hack to fix syntax highlighting)
-
-[case testInvalidLvalues2]
-x = y = z = 1
-x, (y, 1) = 1
-x, [y, 1] = 1
-x, [y, [z, 1]] = 1
-x, (y, (z, 1)) = 1
-x, (y) = 1 # ok
-x, (y, (z, z)) = 1 # ok
-[out]
-main:2: error: Invalid assignment target
-main:3: error: Invalid assignment target
-main:4: error: Invalid assignment target
-main:5: error: Invalid assignment target
-
-[case testInvalidLvalues3]
-x = 1
-x + x = 1
--x = 1
-1.1 = 1
-'x' = 1
-x() = 1
-[out]
-main:2: error: Invalid assignment target
-main:3: error: Invalid assignment target
-main:4: error: Invalid assignment target
-main:5: error: Invalid assignment target
-main:6: error: Invalid assignment target
-
-[case testInvalidStarType]
-a = 1  # type: *int
-[out]
-main:1: error: Star type only allowed for starred expressions
-
-[case testInvalidStarType]
-*a, b = 1  # type: int, int
-[out]
-main:1: error: Star type expected for starred expression
-
-[case testTwoStarExpressions]
-a, *b, *c = 1
-*a, (*b, c) = 1
-a, (*b, *c) = 1
-[*a, *b] = 1
-[out]
-main:1: error: Two starred expressions in assignment
-main:3: error: Two starred expressions in assignment
-main:4: error: Two starred expressions in assignment
-
-[case testTwoStarExpressionsInForStmt]
-z = 1
-for a, *b, *c in z:
-    pass
-for *a, (*b, c) in z:
-    pass
-for a, (*b, *c) in z:
-    pass
-for [*a, *b] in z:
-    pass
-[out]
-main:2: error: Two starred expressions in assignment
-main:6: error: Two starred expressions in assignment
-main:8: error: Two starred expressions in assignment
-
-[case testTwoStarExpressionsInGeneratorExpr]
-(a for a, *b, *c in [])
-(a for *a, (*b, c) in [])
-(a for a, (*b, *c) in [])
-[out]
-main:1: error: Name 'a' is not defined
-main:1: error: Two starred expressions in assignment
-main:3: error: Two starred expressions in assignment
-
-[case testStarExpressionRhs]
-b = 1
-c = 1
-d = 1
-a = *b
-[out]
-main:4: error: Can use starred expression only as assignment target
-
-[case testStarExpressionInExp]
-a = 1
-*a + 1
-[out]
-main:2: error: Can use starred expression only as assignment target
-
-[case testInvalidDel]
-import typing
-x = 1
-del x(1)  # E: Invalid delete target
-del x + 1 # E: Invalid delete target
-del z     # E: Name 'z' is not defined
-[out]
-
-[case testFunctionTvarScope]
-from typing import TypeVar
-t = TypeVar('t')
-def f(x: t) -> t: pass
-x = 0 # type: t
-[out]
-main:4: error: Invalid type "__main__.t"
-
-[case testClassTvarScope]
-from typing import Generic, TypeVar
-t = TypeVar('t')
-class c(Generic[t]): pass
-x = 0 # type: t
-[out]
-main:4: error: Invalid type "__main__.t"
-
-[case testExpressionRefersToTypeVariable]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class c(Generic[t]):
-    def f(self) -> None: x = t
-def f(y: t): x = t
-[out]
-main:4: error: 't' is a type variable and only valid in type context
-main:5: error: 't' is a type variable and only valid in type context
-
-[case testMissingSelf]
-import typing
-class A:
-  def f(): pass
-[out]
-main:3: error: Method must have at least one argument
-
-[case testInvalidBaseClass]
-import typing
-class A(B): pass
-[out]
-main:2: error: Name 'B' is not defined
-
-[case testSuperOutsideClass]
-class A: pass
-super().x
-def f() -> None: super().y
-[out]
-main:2: error: "super" used outside class
-main:3: error: "super" used outside class
-
-[case testMissingSelfInMethod]
-import typing
-class A:
-  def f() -> None: pass
-  def g(): pass
-[out]
-main:3: error: Method must have at least one argument
-main:4: error: Method must have at least one argument
-
-[case testMultipleMethodDefinition]
-import typing
-class A:
-  def f(self) -> None: pass
-  def g(self) -> None: pass
-  def f(self, x: object) -> None: pass
-[out]
-main:5: error: Name 'f' already defined
-
-[case testInvalidGlobalDecl]
-import typing
-def f() -> None:
-    global x
-    x = None
-[out]
-main:4: error: Name 'x' is not defined
-
-[case testInvalidNonlocalDecl]
-import typing
-def f():
-    def g() -> None:
-       nonlocal x
-       x = None
-[out]
-main:4: error: No binding for nonlocal 'x' found
-main:5: error: Name 'x' is not defined
-
-[case testNonlocalDeclNotMatchingGlobal]
-import typing
-x = None
-def f() -> None:
-    nonlocal x
-    x = None
-[out]
-main:4: error: No binding for nonlocal 'x' found
-main:5: error: Name 'x' is not defined
-
-[case testNonlocalDeclConflictingWithParameter]
-import typing
-def g():
-    x = None
-    def f(x) -> None:
-        nonlocal x
-        x = None
-[out]
-main:5: error: Name 'x' is already defined in local scope before nonlocal declaration
-
-[case testNonlocalDeclOutsideFunction]
-x = 2
-nonlocal x
-[out]
-main:2: error: nonlocal declaration not allowed at module level
-
-[case testGlobalAndNonlocalDecl]
-import typing
-x = 1
-def f():
-    x = 1
-    def g() -> None:
-       global x
-       nonlocal x
-       x = None
-[out]
-main:7: error: Name 'x' is nonlocal and global
-
-[case testNonlocalAndGlobalDecl]
-import typing
-x = 1
-def f():
-    x = 1
-    def g() -> None:
-       nonlocal x
-       global x
-       x = None
-[out]
-main:7: error: Name 'x' is nonlocal and global
-
-[case testNestedFunctionAndScoping]
-import typing
-def f(x) -> None:
-    def g(y):
-        z = x
-    z
-    y
-    x
-[out]
-main:5: error: Name 'z' is not defined
-main:6: error: Name 'y' is not defined
-
-[case testMultipleNestedFunctionDef]
-import typing
-def f(x) -> None:
-    def g(): pass
-    x = 1
-    def g(): pass
-[out]
-main:5: error: Name 'g' already defined
-
-[case testRedefinedOverloadedFunction]
-from typing import overload, Any
-def f() -> None:
-    @overload
-    def p(o: object) -> None: pass # no error
-    @overload
-    def p(o: Any) -> None: pass    # no error
-    x = 1
-    def p(): pass # fail
-[out]
-main:8: error: Name 'p' already defined
-
-[case testNestedFunctionInMethod]
-import typing
-class A:
-   def f(self) -> None:
-       def g() -> None:
-           x
-       y
-[out]
-main:5: error: Name 'x' is not defined
-main:6: error: Name 'y' is not defined
-
-[case testImportScope]
-import typing
-def f() -> None:
-    import x
-x.y # E: Name 'x' is not defined
-[file x.py]
-y = 1
-[out]
-
-[case testImportScope2]
-import typing
-def f() -> None:
-    from x import y
-    y
-y # E: Name 'y' is not defined
-[file x.py]
-y = 1
-[out]
-
-[case testImportScope3]
-import typing
-def f() -> None:
-    from x import *
-    y
-y # E: Name 'y' is not defined
-[file x.py]
-y = 1
-[out]
-
-[case testImportScope4]
-import typing
-class A:
-    from x import *
-    y
-y # E: Name 'y' is not defined
-[file x.py]
-y = 1
-[out]
-
-[case testScopeOfNestedClass]
-import typing
-def f():
-    class A: pass
-    A
-A # E: Name 'A' is not defined
-[out]
-
-[case testScopeOfNestedClass2]
-import typing
-class A:
-    class B: pass
-B # E: Name 'B' is not defined
-[out]
-
-[case testScopeOfNestedClass3]
-import typing
-class A:
-    def f(self):
-        class B: pass
-    B # E: Name 'B' is not defined
-B # E: Name 'B' is not defined
-[out]
-
-[case testInvalidNestedClassReferenceInDecl]
-import typing
-class A: pass
-foo = 0 # type: A.x      # E: Name 'A.x' is not defined
-[out]
-
-[case testTvarScopingWithNestedClass]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-s = TypeVar('s')
-class A(Generic[t]):
-    class B(Generic[s]):
-        x = 0 # type: A[s]
-        y = 0 # type: A[t]        # E: Invalid type "__main__.t"
-    z = 0 # type: A[s]            # E: Invalid type "__main__.s"
-    a = 0 # type: A[t]
-[out]
-
-[case testTestExtendPrimitives]
-class C(bool): pass # E: 'bool' is not a valid base class
-class A(int): pass # ok
-class B(float): pass # ok
-class D(str): pass # ok
-[builtins fixtures/primitives.pyi]
-[out]
-
-[case testCyclicInheritance]
-class A(A): pass # E: Cycle in inheritance hierarchy
-[out]
-
-[case testAssignToTypeDef]
-import typing
-class A: pass
-A = None # E: Invalid assignment target
-[out]
-
-[case testInvalidCastTargetSyntax]
-from typing import cast, TypeVar, Generic
-t = TypeVar('t')
-class C(Generic[t]): pass
-cast(str + str, None)    # E: Cast target is not a type
-cast(C[str][str], None)  # E: Cast target is not a type
-cast(C[str + str], None) # E: Cast target is not a type
-cast([int, str], None)   # E: Invalid type
-[out]
-
-[case testInvalidCastTargetType]
-from typing import cast
-x = 0
-cast(x, None)        # E: Invalid type "__main__.x"
-cast(t, None)        # E: Name 't' is not defined
-cast(__builtins__.x, None) # E: Name '__builtins__.x' is not defined
-[out]
-
-[case testInvalidCastTargetType2]
-from typing import cast
-x = 0
-cast(str[str], None) # E: "str" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfArgsToCast]
-from typing import cast
-cast(str) # E: 'cast' expects 2 arguments
-cast(str, None, None) # E: 'cast' expects 2 arguments
-[out]
-
-[case testInvalidKindsOfArgsToCast]
-from typing import cast
-cast(str, *None) # E: 'cast' must be called with 2 positional arguments
-cast(str, target=None) # E: 'cast' must be called with 2 positional arguments
-[out]
-
-[case testInvalidArgsToAny]
-from typing import Any
-Any(str, None) # E: 'Any' expects 1 argument
-Any(arg=str)   # E: 'Any' must be called with 1 positional argument
-[out]
-
-[case testTypeListAsType]
-def f(x:[int, str]) -> None: # E: Invalid type
-    pass
-[out]
-
-[case testInvalidFunctionType]
-from typing import Callable
-x = None # type: Callable[int, str]
-y = None # type: Callable[int]
-z = None # type: Callable[int, int, int]
-[out]
-main:2: error: The first argument to Callable must be a list of types or "..."
-main:3: error: Invalid function type
-main:4: error: Invalid function type
-
-[case testAbstractGlobalFunction]
-import typing
-from abc import abstractmethod
- at abstractmethod
-def foo(): pass
-[out]
-main:3: error: 'abstractmethod' used with a non-method
-
-[case testAbstractNestedFunction]
-import typing
-from abc import abstractmethod
-def g() -> None:
-  @abstractmethod
-  def foo(): pass
-[out]
-main:4: error: 'abstractmethod' used with a non-method
-
-[case testInvalidTypeDeclaration]
-import typing
-def f(): pass
-f() = 1 # type: int
-[out]
-main:3: error: Invalid assignment target
-
-[case testIndexedAssignmentWithTypeDeclaration]
-import typing
-None[1] = 1 # type: int
-[out]
-main:2: error: Unexpected type declaration
-
-[case testNonSelfMemberAssignmentWithTypeDeclaration]
-import typing
-None.x = 1 # type: int
-[out]
-main:2: error: Type cannot be declared in assignment to non-self attribute
-
-[case testNonSelfMemberAssignmentWithTypeDeclarationInMethod]
-import typing
-class A:
-  def f(self, x) -> None:
-    x.y = 1 # type: int
-[out]
-main:4: error: Type cannot be declared in assignment to non-self attribute
-
-[case testInvalidTypeInTypeApplication]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-A[TypeVar] # E: Invalid type "typing.TypeVar"
-[out]
-
-[case testInvalidTypeInTypeApplication2]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-A[1] # E: Type expected within [...]
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypes]
-x, y = 1, 2 # type: int, str, int # E: Incompatible number of tuple items
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypesNested]
-x, (y, z) = 1, (2, 3) # type: int, (str, int, int) # E: Incompatible number of tuple items
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypesNested2]
-x, (y, z) = 1, (2, 3) # type: int, (str, ) # E: Incompatible number of tuple items
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypesNested3]
-x, (y, z) = 1, (2, 3) # type: int, str # E: Tuple type expected for multiple variables
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypesNested4]
-x, (y, z) = 1, (2, 3) # type: int, str, int # E: Incompatible number of tuple items
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypesNested5]
-x, (y, ) = 1, (2, ) # type: int, str # E: Tuple type expected for multiple variables
-[out]
-
-[case testVariableDeclWithInvalidType]
-x, y = 1, 2 # type: int # E: Tuple type expected for multiple variables
-[out]
-
-[case testInvalidLvalueWithExplicitType]
-a = 1
-a[1] = None # type: int # E: Unexpected type declaration
-a.x = None # type: int \
-    # E: Type cannot be declared in assignment to non-self attribute
-a() = None # type: int  # E: Invalid assignment target
-[out]
-
-[case testInvalidLvalueWithExplicitType3]
-a = 1
-a.y, a.x = None, None # type: int, int \
-    # E: Type cannot be declared in assignment to non-self attribute
-a[1], a[2] = None, None # type: int, int \
-    # E: Unexpected type declaration
-[out]
-
-[case testMissingGenericImport]
-from typing import TypeVar
-T = TypeVar('T')
-class A(Generic[T]): pass
-[out]
-main:3: error: Name 'Generic' is not defined
-
-[case testInvalidTypeWithinGeneric]
-from typing import Generic
-class A(Generic[int]): pass # E: Free type variable expected in Generic[...]
-[out]
-
-[case testInvalidTypeWithinNestedGenericClass]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-class A(Generic[T]):
-    class B(Generic[T]): pass \
-          # E: Free type variable expected in Generic[...]
-[out]
-
-[case testIncludingGenericTwiceInBaseClassList]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-S = TypeVar('S')
-class A(Generic[T], Generic[S]): pass \
-      # E: Duplicate Generic in bases
-[out]
-
-[case testInvalidMetaclass]
-class A(metaclass=x): pass # E: Name 'x' is not defined
-[out]
-
-[case testInvalidQualifiedMetaclass]
-import abc
-class A(metaclass=abc.Foo): pass # E: Name 'abc.Foo' is not defined
-[out]
-
-[case testNonClassMetaclass]
-def f(): pass
-class A(metaclass=f): pass # E: Invalid metaclass 'f'
-[out]
-
-[case testInvalidTypevarArguments]
-from typing import TypeVar
-a = TypeVar()       # E: Too few arguments for TypeVar()
-b = TypeVar(x='b')  # E: TypeVar() expects a string literal as first argument
-c = TypeVar(1)      # E: TypeVar() expects a string literal as first argument
-d = TypeVar('D')    # E: String argument 1 'D' to TypeVar(...) does not match variable name 'd'
-e = TypeVar('e', int, str, x=1) # E: Unexpected argument to TypeVar(): x
-f = TypeVar('f', (int, str)) # E: Type expected
-g = TypeVar('g', x=(int, str)) # E: Unexpected argument to TypeVar(): x
-h = TypeVar('h', bound=1) # E: TypeVar 'bound' must be a type
-[out]
-
-[case testMoreInvalidTypevarArguments]
-from typing import TypeVar
-T = TypeVar('T', int, str, bound=bool) # E: TypeVar cannot have both values and an upper bound
-S = TypeVar('S', covariant=True, contravariant=True) \
-    # E: TypeVar cannot be both covariant and contravariant
-[builtins fixtures/bool.pyi]
-
-[case testInvalidTypevarValues]
-from typing import TypeVar
-b = TypeVar('b', *[int]) # E: Unexpected argument to TypeVar()
-c = TypeVar('c', int, 2) # E: Type expected
-[out]
-
-[case testObsoleteTypevarValuesSyntax]
-from typing import TypeVar
-a = TypeVar('a', values=(int, str))
-[out]
-main:2: error: TypeVar 'values' argument not supported
-main:2: error: Use TypeVar('T', t, ...) instead of TypeVar('T', values=(t, ...))
-
-[case testLocalTypevarScope]
-from typing import TypeVar
-def f() -> None:
-    T = TypeVar('T')
-def g(x: T) -> None: pass # E: Name 'T' is not defined
-[out]
-
-[case testClassTypevarScope]
-from typing import TypeVar
-class A:
-    T = TypeVar('T')
-def g(x: T) -> None: pass # E: Name 'T' is not defined
-[out]
-
-[case testRedefineVariableAsTypevar]
-from typing import TypeVar
-x = 0
-x = TypeVar('x') # E: Cannot redefine 'x' as a type variable
-[out]
-
-[case testTypevarWithType]
-from typing import TypeVar
-x = TypeVar('x') # type: int # E: Cannot declare the type of a type variable
-[out]
-
-[case testRedefineTypevar]
-from typing import TypeVar
-t = TypeVar('t')
-t = 1 # E: Invalid assignment target
-[out]
-
-[case testRedefineTypevar2]
-from typing import TypeVar
-t = TypeVar('t')
-def t(): pass # E: Name 't' already defined
-[out]
-
-[case testRedefineTypevar3]
-from typing import TypeVar
-t = TypeVar('t')
-class t: pass # E: Name 't' already defined
-[out]
-
-[case testRedefineTypevar4]
-from typing import TypeVar
-t = TypeVar('t')
-from typing import Generic as t # E: Name 't' already defined
-[out]
-
-[case testInvalidStrLiteralType]
-def f(x: 'foo'): pass # E: Name 'foo' is not defined
-[out]
-
-[case testInvalidStrLiteralType2]
-def f(x: 'int['): pass # E: Parse error before end of line
-[out]
-
-[case testInconsistentOverload]
-from typing import overload
-def dec(x): pass
- at overload
-def f(): pass
- at dec  # E: 'overload' decorator expected
-def f(): pass
-[out]
-
-[case testInconsistentOverload2]
-from typing import overload
-def dec(x): pass
- at dec  # E: 'overload' decorator expected
-def f(): pass
- at overload
-def f(): pass
-[out]
-
-[case testMissingOverloadDecorator]
-from typing import overload
-def dec(x): pass
- at dec  # E: 'overload' decorator expected
-def f(): pass
- at dec  # E: 'overload' decorator expected
-def f(): pass
-[out]
-
-[case testIncompatibleSignatureInComment]
-import typing
-def f(): # type: (int) -> int
-  pass
-def g(x): # type: () -> int
-  pass
-[out]
-main:2: error: Type signature has too many arguments
-main:4: error: Type signature has too few arguments
-
-[case testStaticmethodAndNonMethod]
-import typing
- at staticmethod
-def f(): pass
-class A:
-  def g(self) -> None:
-    @staticmethod
-    def h(): pass
-[builtins fixtures/staticmethod.pyi]
-[out]
-main:2: error: 'staticmethod' used with a non-method
-main:6: error: 'staticmethod' used with a non-method
-
-[case testClassmethodAndNonMethod]
-import typing
- at classmethod
-def f(): pass
-class A:
-  def g(self) -> None:
-    @classmethod
-    def h(): pass
-[builtins fixtures/classmethod.pyi]
-[out]
-main:2: error: 'classmethod' used with a non-method
-main:6: error: 'classmethod' used with a non-method
-
-[case testNonMethodProperty]
-import typing
- at property  # E: 'property' used with a non-method
-def f() -> int: pass
-[builtins fixtures/property.pyi]
-[out]
-
-[case testInvalidArgCountForProperty]
-import typing
-class A:
-    @property
-    def f(self, x) -> int: pass  # E: Too many arguments
-    @property
-    def g() -> int: pass   # E: Method must have at least one argument
-[builtins fixtures/property.pyi]
-[out]
-
-[case testOverloadedProperty]
-from typing import overload
-class A:
-    @overload  # E: Decorated property not supported
-    @property
-    def f(self) -> int: pass
-    @property  # E: Decorated property not supported
-    @overload
-    def f(self) -> int: pass
-[builtins fixtures/property.pyi]
-[out]
-
-[case testOverloadedProperty2]
-from typing import overload
-class A:
-    @overload
-    def f(self) -> int: pass
-    @property  # E: Decorated property not supported
-    @overload
-    def f(self) -> int: pass
-[builtins fixtures/property.pyi]
-[out]
-
-[case testDecoratedProperty]
-import typing
-def dec(f): pass
-class A:
-    @dec  # E: Decorated property not supported
-    @property
-    def f(self) -> int: pass
-    @property  # E: Decorated property not supported
-    @dec
-    def g(self) -> int: pass
-[builtins fixtures/property.pyi]
-[out]
-
-[case testImportTwoModulesWithSameNameInFunction]
-import typing
-def f() -> None:
-    import x
-    import y as x # E: Name 'x' already defined
-    x.y
-[file x.py]
-y = 1
-[file y.py]
-[out]
-
-[case testImportTwoModulesWithSameNameInGlobalContext]
-import typing
-import x
-import y as x # E: Name 'x' already defined
-x.y
-[file x.py]
-y = 1
-[file y.py]
-[out]
-
-[case testListTypeAliasWithoutImport]
-import typing
-def f() -> List[int]: pass
-[builtins fixtures/list.pyi]
-[out]
-main:2: error: Name 'List' is not defined
-
-[case testImportObsoleteTypingFunction]
-from typing import Function # E: Module 'typing' has no attribute 'Function' (it's now called 'typing.Callable')
-from _m import Function # E: Module '_m' has no attribute 'Function'
-[file _m.py]
-[out]
-
-[case testTypeRefresToObsoleteTypingFunction]
-import typing
-import _m
-def f(x: typing.Function[[], None]) -> None: pass
-def g(x: _m.Function[[], None]) -> None: pass
-[file _m.py]
-[out]
-main:3: error: Name 'typing.Function' is not defined (it's now called 'typing.Callable')
---'
-main:4: error: Name '_m.Function' is not defined
-
-[case testUnqualifiedNameRefersToObsoleteTypingFunction]
-x = None # type: Function[[], None]
-[out]
-main:1: error: Name 'Function' is not defined
-main:1: note: (Did you mean 'typing.Callable'?)
-
-[case testInvalidWithTarget]
-def f(): pass
-with f() as 1: pass  # E: Invalid assignment target
-[out]
-
-[case testUseObsoleteNameForTypeVar]
-from typing import typevar
-t = typevar('t')
-[out]
-main:1: error: Module 'typing' has no attribute 'typevar' (it's now called 'typing.TypeVar')
---' (this fixes syntax highlighting)
-
-[case testUseObsoleteNameForTypeVar2]
-t = typevar('t')
-[out]
-main:1: error: Name 'typevar' is not defined
-main:1: note: (Did you mean 'typing.TypeVar'?)
-
-[case testUseObsoleteNameForTypeVar3]
-import typing
-t = typing.typevar('t')
-[out]
-main:2: error: Module 'typing' has no attribute 'typevar' (it's now called 'typing.TypeVar')
---' (work around syntax highlighting :-/)
-
-[case testInvalidTypeAnnotation]
-import typing
-def f() -> None:
-    1[2] = 1  # type: int
-[out]
-main:3: error: Unexpected type declaration
-
-[case testInvalidTypeAnnotation2]
-import typing
-def f() -> None:
-    f() = 1  # type: int
-[out]
-main:3: error: Invalid assignment target
-
-[case testInvalidReferenceToAttributeOfOuterClass]
-class A:
-    class X: pass
-    class B:
-        y = X  # E: Name 'X' is not defined
-[out]
-
-[case testStubPackage]
-from m import x
-from m import y # E: Module 'm' has no attribute 'y'
-[file m/__init__.pyi]
-x = 1
-[out]
-
-[case testStubPackageSubModule]
-from m import x
-from m import y # E: Module 'm' has no attribute 'y'
-from m.m2 import y
-from m.m2 import z # E: Module 'm.m2' has no attribute 'z'
-[file m/__init__.pyi]
-x = 1
-[file m/m2.pyi]
-y = 1
-[out]
-
-[case testMissingStubForThirdPartyModule]
-import nosexcover
-[out]
-main:1: error: No library stub file for module 'nosexcover'
-main:1: note: (Stub files are from https://github.com/python/typeshed)
-
-[case testMissingStubForStdLibModule]
-import tabnanny
-[out]
-main:1: error: No library stub file for standard library module 'tabnanny'
-main:1: note: (Stub files are from https://github.com/python/typeshed)
-
-[case testMissingStubForTwoModules]
-import tabnanny
-import xdrlib
-[out]
-main:1: error: No library stub file for standard library module 'tabnanny'
-main:1: note: (Stub files are from https://github.com/python/typeshed)
-main:2: error: No library stub file for standard library module 'xdrlib'
-
-[case testListComprehensionSpecialScoping]
-class A:
-    x = 1
-    y = 1
-    z = 1
-    [x for i in z if y]
-[out]
-main:5: error: Name 'x' is not defined
-main:5: error: Name 'y' is not defined
-
-[case testTypeRedeclarationNoSpuriousWarnings]
-from typing import Tuple
-a = 1  # type: int
-a = 's'  # type: str
-a = ('spam', 'spam', 'eggs', 'spam')  # type: Tuple[str]
-
-[out]
-main:3: error: Name 'a' already defined
-main:4: error: Name 'a' already defined
diff --git a/test-data/unit/semanal-expressions.test b/test-data/unit/semanal-expressions.test
deleted file mode 100644
index 7c5728b..0000000
--- a/test-data/unit/semanal-expressions.test
+++ /dev/null
@@ -1,395 +0,0 @@
-[case testLiterals]
-(1, 'x', 1.1, 1.1j)
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    TupleExpr:1(
-      IntExpr(1)
-      StrExpr(x)
-      FloatExpr(1.1)
-      ComplexExpr(1.1j))))
-
-[case testMemberExpr]
-x = 1
-x.y
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  ExpressionStmt:2(
-    MemberExpr:2(
-      NameExpr(x [__main__.x])
-      y)))
-
-[case testIndexExpr]
-x = y = 1
-x[y]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  ExpressionStmt:2(
-    IndexExpr:2(
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y]))))
-
-[case testBinaryOperations]
-x = y = 1
-x + y
-x | y
-x is not y
-x == y
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  ExpressionStmt:2(
-    OpExpr:2(
-      +
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y])))
-  ExpressionStmt:3(
-    OpExpr:3(
-      |
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y])))
-  ExpressionStmt:4(
-    ComparisonExpr:4(
-      is not
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y])))
-  ExpressionStmt:5(
-    ComparisonExpr:5(
-      ==
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y]))))
-
-[case testUnaryOperations]
-x = 1
--x
-~x
-+x
-not x
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  ExpressionStmt:2(
-    UnaryExpr:2(
-      -
-      NameExpr(x [__main__.x])))
-  ExpressionStmt:3(
-    UnaryExpr:3(
-      ~
-      NameExpr(x [__main__.x])))
-  ExpressionStmt:4(
-    UnaryExpr:4(
-      +
-      NameExpr(x [__main__.x])))
-  ExpressionStmt:5(
-    UnaryExpr:5(
-      not
-      NameExpr(x [__main__.x]))))
-
-[case testSlices]
-x = y = z = 1
-x[y:z:x]
-x[:]
-x[:y]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y])
-      NameExpr(z* [__main__.z]))
-    IntExpr(1))
-  ExpressionStmt:2(
-    IndexExpr:2(
-      NameExpr(x [__main__.x])
-      SliceExpr:2(
-        NameExpr(y [__main__.y])
-        NameExpr(z [__main__.z])
-        NameExpr(x [__main__.x]))))
-  ExpressionStmt:3(
-    IndexExpr:3(
-      NameExpr(x [__main__.x])
-      SliceExpr:3(
-        <empty>
-        <empty>)))
-  ExpressionStmt:4(
-    IndexExpr:4(
-      NameExpr(x [__main__.x])
-      SliceExpr:4(
-        <empty>
-        NameExpr(y [__main__.y])))))
-
-[case testTupleLiteral]
-x = y = 1
-x, y
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  ExpressionStmt:2(
-    TupleExpr:2(
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y]))))
-
-[case testListLiteral]
-x = y = 1
-([], [x, y])
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  ExpressionStmt:2(
-    TupleExpr:2(
-      ListExpr:2()
-      ListExpr:2(
-        NameExpr(x [__main__.x])
-        NameExpr(y [__main__.y])))))
-
-[case testDictLiterals]
-x = y = 1
-{ x : y, y : x }
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  ExpressionStmt:2(
-    DictExpr:2(
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y])
-      NameExpr(y [__main__.y])
-      NameExpr(x [__main__.x]))))
-
-[case testListComprehension]
-a = 0
-([x + 1 for x in a])
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a* [__main__.a])
-    IntExpr(0))
-  ExpressionStmt:2(
-    ListComprehension:2(
-      GeneratorExpr:2(
-        OpExpr:2(
-          +
-          NameExpr(x [l])
-          IntExpr(1))
-        NameExpr(x* [l])
-        NameExpr(a [__main__.a])))))
-
-[case testListComprehensionInFunction]
-def f(a) -> None:
-    [x for x in a]
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(a))
-    def (a: Any)
-    Block:1(
-      ExpressionStmt:2(
-        ListComprehension:2(
-          GeneratorExpr:2(
-            NameExpr(x [l])
-            NameExpr(x* [l])
-            NameExpr(a [l])))))))
-
-[case testListComprehensionWithCondition]
-a = 0
-a = [x for x in a if x]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a* [__main__.a])
-    IntExpr(0))
-  AssignmentStmt:2(
-    NameExpr(a [__main__.a])
-    ListComprehension:2(
-      GeneratorExpr:2(
-        NameExpr(x [l])
-        NameExpr(x* [l])
-        NameExpr(a [__main__.a])
-        NameExpr(x [l])))))
-
-[case testSetComprehension]
-a = 0
-({x + 1 for x in a})
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a* [__main__.a])
-    IntExpr(0))
-  ExpressionStmt:2(
-    SetComprehension:2(
-      GeneratorExpr:2(
-        OpExpr:2(
-          +
-          NameExpr(x [l])
-          IntExpr(1))
-        NameExpr(x* [l])
-        NameExpr(a [__main__.a])))))
-
-[case testSetComprehensionWithCondition]
-a = 0
-a = {x for x in a if x}
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a* [__main__.a])
-    IntExpr(0))
-  AssignmentStmt:2(
-    NameExpr(a [__main__.a])
-    SetComprehension:2(
-      GeneratorExpr:2(
-        NameExpr(x [l])
-        NameExpr(x* [l])
-        NameExpr(a [__main__.a])
-        NameExpr(x [l])))))
-
-[case testDictionaryComprehension]
-a = 0
-({x: x + 1 for x in a})
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a* [__main__.a])
-    IntExpr(0))
-  ExpressionStmt:2(
-    DictionaryComprehension:2(
-      NameExpr(x [l])
-      OpExpr:2(
-        +
-        NameExpr(x [l])
-        IntExpr(1))
-      NameExpr(x* [l])
-      NameExpr(a [__main__.a]))))
-
-[case testDictionaryComprehensionWithCondition]
-a = 0
-a = {x: x + 1 for x in a if x}
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a* [__main__.a])
-    IntExpr(0))
-  AssignmentStmt:2(
-    NameExpr(a [__main__.a])
-    DictionaryComprehension:2(
-      NameExpr(x [l])
-      OpExpr:2(
-        +
-        NameExpr(x [l])
-        IntExpr(1))
-      NameExpr(x* [l])
-      NameExpr(a [__main__.a])
-      NameExpr(x [l]))))
-
-[case testGeneratorExpression]
-a = 0
-x for x in a
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a* [__main__.a])
-    IntExpr(0))
-  ExpressionStmt:2(
-    GeneratorExpr:2(
-      NameExpr(x [l])
-      NameExpr(x* [l])
-      NameExpr(a [__main__.a]))))
-
-[case testGeneratorExpressionNestedIndex]
-a = 0
-x for x, (y, z) in a
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(a* [__main__.a])
-    IntExpr(0))
-  ExpressionStmt:2(
-    GeneratorExpr:2(
-      NameExpr(x [l])
-      TupleExpr:2(
-        NameExpr(x* [l])
-        TupleExpr:2(
-          NameExpr(y* [l])
-          NameExpr(z* [l])))
-      NameExpr(a [__main__.a]))))
-
-[case testLambda]
-x = 0
-lambda: x
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(0))
-  ExpressionStmt:2(
-    FuncExpr:2(
-      Block:2(
-        ReturnStmt:2(
-          NameExpr(x [__main__.x]))))))
-
-[case testLambdaWithArguments]
-lambda x, y: x + y
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    FuncExpr:1(
-      Args(
-        Var(x)
-        Var(y))
-      Block:1(
-        ReturnStmt:1(
-          OpExpr:1(
-            +
-            NameExpr(x [l])
-            NameExpr(y [l])))))))
-
-[case testConditionalExpression]
-int if None else str
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    ConditionalExpr:1(
-      Condition(
-        NameExpr(None [builtins.None]))
-      NameExpr(int [builtins.int])
-      NameExpr(str [builtins.str]))))
-
-[case testDictWithKeywordArgs]
-dict(a=1, b=str())
-[builtins fixtures/dict.pyi]
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    DictExpr:1(
-      StrExpr(a)
-      IntExpr(1)
-      StrExpr(b)
-      CallExpr:1(
-        NameExpr(str [builtins.str])
-        Args()))))
diff --git a/test-data/unit/semanal-modules.test b/test-data/unit/semanal-modules.test
deleted file mode 100644
index 7a00e66..0000000
--- a/test-data/unit/semanal-modules.test
+++ /dev/null
@@ -1,877 +0,0 @@
--- NOTE: If a module has a name starting or ending with _, it is skipped in
---       output.
-
-[case testImport]
-import x
-x.y
-[file x.py]
-y = 1
-[out]
-MypyFile:1(
-  Import:1(x)
-  ExpressionStmt:2(
-    MemberExpr:2(
-      NameExpr(x)
-      y [x.y])))
-MypyFile:1(
-  tmp/x.py
-  AssignmentStmt:1(
-    NameExpr(y* [x.y])
-    IntExpr(1)))
-
-[case testImportedNameInType]
-import m
-x = None # type: m.c
-[file m.py]
-class c: pass
-[out]
-MypyFile:1(
-  Import:1(m)
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    m.c))
-MypyFile:1(
-  tmp/m.py
-  ClassDef:1(
-    c
-    PassStmt:1()))
-
-[case testImportFrom]
-from m import y
-x = y
-[file m.py]
-y = 1
-[out]
-MypyFile:1(
-  ImportFrom:1(m, [y])
-  AssignmentStmt:2(
-    NameExpr(x* [__main__.x])
-    NameExpr(y [m.y])))
-MypyFile:1(
-  tmp/m.py
-  AssignmentStmt:1(
-    NameExpr(y* [m.y])
-    IntExpr(1)))
-
-[case testImportFromType]
-from m import c
-x = None # type: c
-[file m.py]
-class c: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(m, [c])
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    m.c))
-MypyFile:1(
-  tmp/m.py
-  ClassDef:1(
-    c
-    PassStmt:1()))
-
-[case testImportMultiple]
-import _m, _n
-_m.x, _n.y
-[file _m.py]
-x = 1
-[file _n.py]
-y = 2
-[out]
-MypyFile:1(
-  Import:1(_m, _n)
-  ExpressionStmt:2(
-    TupleExpr:2(
-      MemberExpr:2(
-        NameExpr(_m)
-        x [_m.x])
-      MemberExpr:2(
-        NameExpr(_n)
-        y [_n.y]))))
-
-[case testImportAs]
-import _m as n
-n.x
-[file _m.py]
-x = 1
-[out]
-MypyFile:1(
-  Import:1(_m : n)
-  ExpressionStmt:2(
-    MemberExpr:2(
-      NameExpr(n [_m])
-      x [_m.x])))
-
-[case testImportFromMultiple]
-from _m import x, y
-x, y
-[file _m.py]
-x = y = 1
-[out]
-MypyFile:1(
-  ImportFrom:1(_m, [x, y])
-  ExpressionStmt:2(
-    TupleExpr:2(
-      NameExpr(x [_m.x])
-      NameExpr(y [_m.y]))))
-
-[case testImportFromAs]
-from _m import y as z
-z
-[file _m.py]
-y = 1
-[out]
-MypyFile:1(
-  ImportFrom:1(_m, [y : z])
-  ExpressionStmt:2(
-    NameExpr(z [_m.y])))
-
-[case testAccessImportedName]
-from m import x
-y = x
-[file m.py]
-from _n import x
-[file _n.py]
-x = 1
-[out]
-MypyFile:1(
-  ImportFrom:1(m, [x])
-  AssignmentStmt:2(
-    NameExpr(y* [__main__.y])
-    NameExpr(x [_n.x])))
-MypyFile:1(
-  tmp/m.py
-  ImportFrom:1(_n, [x]))
-
-[case testAccessImportedName2]
-import _m
-y = _m.x
-[file _m.py]
-from _n import x
-[file _n.py]
-x = 1
-[out]
-MypyFile:1(
-  Import:1(_m)
-  AssignmentStmt:2(
-    NameExpr(y* [__main__.y])
-    MemberExpr:2(
-      NameExpr(_m)
-      x [_n.x])))
-
-[case testAccessingImportedNameInType]
-from _m import c
-x = None # type: c
-[file _m.py]
-from _n import c
-[file _n.py]
-class c: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(_m, [c])
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    _n.c))
-
-[case testAccessingImportedNameInType2]
-import _m
-x = None # type: _m.c
-[file _m.py]
-from _n import c
-[file _n.py]
-class c: pass
-[out]
-MypyFile:1(
-  Import:1(_m)
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    _n.c))
-
-[case testAccessingImportedModule]
-from _m import _n
-_n.x
-[file _m.py]
-import _n
-[file _n.py]
-x = 1
-[out]
-MypyFile:1(
-  ImportFrom:1(_m, [_n])
-  ExpressionStmt:2(
-    MemberExpr:2(
-      NameExpr(_n)
-      x [_n.x])))
-
-[case testAccessingImportedModule]
-import _m
-_m._n.x
-[file _m.py]
-import _n
-[file _n.py]
-x = 1
-[out]
-MypyFile:1(
-  Import:1(_m)
-  ExpressionStmt:2(
-    MemberExpr:2(
-      MemberExpr:2(
-        NameExpr(_m)
-        _n)
-      x [_n.x])))
-
-[case testAccessTypeViaDoubleIndirection]
-from _m import c
-a = None # type: c
-[file _m.py]
-from _n import c
-[file _n.py]
-class c: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(_m, [c])
-  AssignmentStmt:2(
-    NameExpr(a [__main__.a])
-    NameExpr(None [builtins.None])
-    _n.c))
-
-[case testAccessTypeViaDoubleIndirection2]
-import _m
-a = None # type: _m.c
-[file _m.py]
-from _n import c
-[file _n.py]
-class c: pass
-[out]
-MypyFile:1(
-  Import:1(_m)
-  AssignmentStmt:2(
-    NameExpr(a [__main__.a])
-    NameExpr(None [builtins.None])
-    _n.c))
-
-[case testImportAsterisk]
-from _m import *
-x, y
-[file _m.py]
-x = y = 1
-[out]
-MypyFile:1(
-  ImportAll:1(_m)
-  ExpressionStmt:2(
-    TupleExpr:2(
-      NameExpr(x [_m.x])
-      NameExpr(y [_m.y]))))
-
-[case testImportAsteriskAndImportedNames]
-from _m import *
-n_.x, y
-[file _m.py]
-import n_
-from n_ import y
-[file n_.py]
-x = y = 1
-[out]
-MypyFile:1(
-  ImportAll:1(_m)
-  ExpressionStmt:2(
-    TupleExpr:2(
-      MemberExpr:2(
-        NameExpr(n_)
-        x [n_.x])
-      NameExpr(y [n_.y]))))
-
-[case testImportAsteriskAndImportedNamesInTypes]
-from _m import *
-x = None # type: n_.c
-y = None # type: d
-[file _m.py]
-import n_
-from n_ import d
-[file n_.py]
-class c: pass
-class d: pass
-[out]
-MypyFile:1(
-  ImportAll:1(_m)
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    n_.c)
-  AssignmentStmt:3(
-    NameExpr(y [__main__.y])
-    NameExpr(None [builtins.None])
-    n_.d))
-
-[case testModuleInSubdir]
-import _m
-_m.x
-[file _m/__init__.py]
-x = 1
-[out]
-MypyFile:1(
-  Import:1(_m)
-  ExpressionStmt:2(
-    MemberExpr:2(
-      NameExpr(_m)
-      x [_m.x])))
-
-[case testNestedModules]
-import m.n
-m.n.x, m.y
-[file m/__init__.py]
-y = 1
-[file m/n.py]
-x = 1
-[out]
-MypyFile:1(
-  Import:1(m.n)
-  ExpressionStmt:2(
-    TupleExpr:2(
-      MemberExpr:2(
-        MemberExpr:2(
-          NameExpr(m)
-          n [m.n])
-        x [m.n.x])
-      MemberExpr:2(
-        NameExpr(m)
-        y [m.y]))))
-MypyFile:1(
-  tmp/m/n.py
-  AssignmentStmt:1(
-    NameExpr(x* [m.n.x])
-    IntExpr(1)))
-
-[case testImportFromSubmodule]
-from m._n import x
-x
-[file m/__init__.py]
-[file m/_n.py]
-x = 1
-[out]
-MypyFile:1(
-  ImportFrom:1(m._n, [x])
-  ExpressionStmt:2(
-    NameExpr(x [m._n.x])))
-
-[case testImportAllFromSubmodule]
-from m._n import *
-x, y
-[file m/__init__.py]
-[file m/_n.py]
-x = y = 1
-[out]
-MypyFile:1(
-  ImportAll:1(m._n)
-  ExpressionStmt:2(
-    TupleExpr:2(
-      NameExpr(x [m._n.x])
-      NameExpr(y [m._n.y]))))
-
-[case testSubmodulesAndTypes]
-import m._n
-x = None # type: m._n.c
-[file m/__init__.py]
-[file m/_n.py]
-class c: pass
-[out]
-MypyFile:1(
-  Import:1(m._n)
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    m._n.c))
-
-[case testSubmodulesAndTypes]
-from m._n import c
-x = None # type: c
-[file m/__init__.py]
-[file m/_n.py]
-class c: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(m._n, [c])
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    m._n.c))
-
-[case testFromPackageImportModule]
-from m import _n
-_n.x
-[file m/__init__.py]
-[file m/_n.py]
-x = 1
-[out]
-MypyFile:1(
-  ImportFrom:1(m, [_n])
-  ExpressionStmt:2(
-    MemberExpr:2(
-      NameExpr(_n [m._n])
-      x [m._n.x])))
-
-[case testDeeplyNestedModule]
-import m.n.k
-m.n.k.x
-m.n.b
-m.a
-[file m/__init__.py]
-a = 1
-[file m/n/__init__.py]
-b = 1
-[file m/n/k.py]
-x = 1
-[out]
-MypyFile:1(
-  Import:1(m.n.k)
-  ExpressionStmt:2(
-    MemberExpr:2(
-      MemberExpr:2(
-        MemberExpr:2(
-          NameExpr(m)
-          n [m.n])
-        k [m.n.k])
-      x [m.n.k.x]))
-  ExpressionStmt:3(
-    MemberExpr:3(
-      MemberExpr:3(
-        NameExpr(m)
-        n [m.n])
-      b [m.n.b]))
-  ExpressionStmt:4(
-    MemberExpr:4(
-      NameExpr(m)
-      a [m.a])))
-MypyFile:1(
-  tmp/m/n/k.py
-  AssignmentStmt:1(
-    NameExpr(x* [m.n.k.x])
-    IntExpr(1)))
-
-[case testImportInSubmodule]
-import m._n
-y = m._n.x
-[file m/__init__.py]
-[file m/_n.py]
-from m._k import x
-[file m/_k.py]
-x = 1
-[out]
-MypyFile:1(
-  Import:1(m._n)
-  AssignmentStmt:2(
-    NameExpr(y* [__main__.y])
-    MemberExpr:2(
-      MemberExpr:2(
-        NameExpr(m)
-        _n [m._n])
-      x [m._k.x])))
-
-[case testBuiltinsUsingModule]
-o = None # type: __builtins__.object
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(o [__main__.o])
-    NameExpr(None [builtins.None])
-    builtins.object))
-
-[case testImplicitAccessToBuiltins]
-object
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    NameExpr(object [builtins.object])))
-
-[case testAssignmentToModuleAttribute]
-import _m
-_m.x = (
-  _m.x)
-[file _m.py]
-x = None
-[out]
-MypyFile:1(
-  Import:1(_m)
-  AssignmentStmt:2(
-    MemberExpr:2(
-      NameExpr(_m)
-      x [_m.x])
-    MemberExpr:3(
-      NameExpr(_m)
-      x [_m.x])))
-
-[case testAssignmentThatRefersToModule]
-import _m
-_m.x[None] = None
-[file _m.py]
-x = None
-[out]
-MypyFile:1(
-  Import:1(_m)
-  AssignmentStmt:2(
-    IndexExpr:2(
-      MemberExpr:2(
-        NameExpr(_m)
-        x [_m.x])
-      NameExpr(None [builtins.None]))
-    NameExpr(None [builtins.None])))
-
-[case testImportInBlock]
-if 1:
-    import _x
-    _x.y
-[file _x.py]
-y = 1
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      IntExpr(1))
-    Then(
-      Import:2(_x)
-      ExpressionStmt:3(
-        MemberExpr:3(
-          NameExpr(_x)
-          y [_x.y])))))
-
-[case testImportInFunction]
-def f() -> None:
-    import _x
-    _x.y
-[file _x.py]
-y = 1
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def ()
-    Block:1(
-      Import:2(_x)
-      ExpressionStmt:3(
-        MemberExpr:3(
-          NameExpr(_x)
-          y [_x.y])))))
-
-[case testImportInClassBody]
-class A:
-    from _x import y
-    z = y
-[file _x.py]
-y = 1
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    ImportFrom:2(_x, [y])
-    AssignmentStmt:3(
-      NameExpr(z* [m])
-      NameExpr(y [_x.y]))))
-
-[case testImportInClassBody2]
-class A:
-    import _x
-    z = _x.y
-[file _x.py]
-y = 1
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    Import:2(_x)
-    AssignmentStmt:3(
-      NameExpr(z* [m])
-      MemberExpr:3(
-        NameExpr(_x)
-        y [_x.y]))))
-
-[case testImportModuleTwice]
-def f() -> None:
-    import x
-    import x
-    x.y
-[file x.py]
-y = 1
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def ()
-    Block:1(
-      Import:2(x)
-      Import:3(x)
-      ExpressionStmt:4(
-        MemberExpr:4(
-          NameExpr(x)
-          y [x.y])))))
-MypyFile:1(
-  tmp/x.py
-  AssignmentStmt:1(
-    NameExpr(y* [x.y])
-    IntExpr(1)))
-
-[case testRelativeImport0]
-import m.x
-m.x.z.y
-[file m/__init__.py]
-[file m/x.py]
-from . import z
-[file m/z.py]
-y = 1
-[out]
-MypyFile:1(
-  Import:1(m.x)
-  ExpressionStmt:2(
-    MemberExpr:2(
-      MemberExpr:2(
-        MemberExpr:2(
-          NameExpr(m)
-          x [m.x])
-        z [m.z])
-      y [m.z.y])))
-MypyFile:1(
-  tmp/m/x.py
-  ImportFrom:1(., [z]))
-MypyFile:1(
-  tmp/m/z.py
-  AssignmentStmt:1(
-    NameExpr(y* [m.z.y])
-    IntExpr(1)))
-
-[case testRelativeImport1]
-import m.t.b as b
-b.x.y
-b.z.y
-[file m/__init__.py]
-[file m/x.py]
-y = 1
-[file m/z.py]
-y = 3
-[file m/t/__init__.py]
-[file m/t/b.py]
-from .. import x, z
-[out]
-MypyFile:1(
-  Import:1(m.t.b : b)
-  ExpressionStmt:2(
-    MemberExpr:2(
-      MemberExpr:2(
-        NameExpr(b [m.t.b])
-        x [m.x])
-      y [m.x.y]))
-  ExpressionStmt:3(
-    MemberExpr:3(
-      MemberExpr:3(
-        NameExpr(b [m.t.b])
-        z [m.z])
-      y [m.z.y])))
-MypyFile:1(
-  tmp/m/t/b.py
-  ImportFrom:1(.., [x, z]))
-MypyFile:1(
-  tmp/m/x.py
-  AssignmentStmt:1(
-    NameExpr(y* [m.x.y])
-    IntExpr(1)))
-MypyFile:1(
-  tmp/m/z.py
-  AssignmentStmt:1(
-    NameExpr(y* [m.z.y])
-    IntExpr(3)))
-
-[case testRelativeImport2]
-import m.t.b as b
-b.xy
-b.zy
-[file m/__init__.py]
-[file m/x.py]
-y = 1
-[file m/z.py]
-y = 3
-[file m/t/__init__.py]
-[file m/t/b.py]
-from ..x import y as xy
-from ..z import y as zy
-[out]
-MypyFile:1(
-  Import:1(m.t.b : b)
-  ExpressionStmt:2(
-    MemberExpr:2(
-      NameExpr(b [m.t.b])
-      xy [m.x.y]))
-  ExpressionStmt:3(
-    MemberExpr:3(
-      NameExpr(b [m.t.b])
-      zy [m.z.y])))
-MypyFile:1(
-  tmp/m/t/b.py
-  ImportFrom:1(..x, [y : xy])
-  ImportFrom:2(..z, [y : zy]))
-MypyFile:1(
-  tmp/m/x.py
-  AssignmentStmt:1(
-    NameExpr(y* [m.x.y])
-    IntExpr(1)))
-MypyFile:1(
-  tmp/m/z.py
-  AssignmentStmt:1(
-    NameExpr(y* [m.z.y])
-    IntExpr(3)))
-
-[case testRelativeImport3]
-import m.t
-m.zy
-m.xy
-m.t.y
-[file m/__init__.py]
-from .x import *
-from .z import *
-[file m/x.py]
-from .z import zy as xy
-[file m/z.py]
-zy = 3
-[file m/t/__init__.py]
-from .b import *
-[file m/t/b.py]
-from .. import xy as y
-[out]
-MypyFile:1(
-  Import:1(m.t)
-  ExpressionStmt:2(
-    MemberExpr:2(
-      NameExpr(m)
-      zy [m.z.zy]))
-  ExpressionStmt:3(
-    MemberExpr:3(
-      NameExpr(m)
-      xy [m.z.zy]))
-  ExpressionStmt:4(
-    MemberExpr:4(
-      MemberExpr:4(
-        NameExpr(m)
-        t [m.t])
-      y [m.z.zy])))
-MypyFile:1(
-  tmp/m/t/b.py
-  ImportFrom:1(.., [xy : y]))
-MypyFile:1(
-  tmp/m/x.py
-  ImportFrom:1(.z, [zy : xy]))
-MypyFile:1(
-  tmp/m/z.py
-  AssignmentStmt:1(
-    NameExpr(zy* [m.z.zy])
-    IntExpr(3)))
-
-[case testRelativeImportFromSameModule]
-import m.x
-[file m/__init__.py]
-[file m/x.py]
-from .x import nonexistent
-[out]
-tmp/m/x.py:1: error: Module 'm.x' has no attribute 'nonexistent'
-
-[case testImportFromSameModule]
-import m.x
-[file m/__init__.py]
-[file m/x.py]
-from m.x import nonexistent
-[out]
-tmp/m/x.py:1: error: Module 'm.x' has no attribute 'nonexistent'
-
-[case testFromImportAsInStub]
-from m import *
-x
-y  # E: Name 'y' is not defined
-[file m.pyi]
-from m2 import x as x
-from m2 import y
-[file m2.py]
-x = 1
-y = 2
-[out]
-
-[case testFromImportAsInNonStub]
-from m_ import *
-x
-y
-[file m_.py]
-from m2_ import x as x
-from m2_ import y
-[file m2_.py]
-x = 1
-y = 2
-[out]
-MypyFile:1(
-  ImportAll:1(m_)
-  ExpressionStmt:2(
-    NameExpr(x [m2_.x]))
-  ExpressionStmt:3(
-    NameExpr(y [m2_.y])))
-
-[case testImportAsInStub]
-from m import *
-m2
-m3  # E: Name 'm3' is not defined
-[file m.pyi]
-import m2 as m2
-import m3
-[file m2.py]
-[file m3.py]
-[out]
-
-[case testImportAsInNonStub]
-from m_ import *
-m2_
-m3_
-[file m_.py]
-import m2_ as m2_
-import m3_
-[file m2_.py]
-[file m3_.py]
-[out]
-MypyFile:1(
-  ImportAll:1(m_)
-  ExpressionStmt:2(
-    NameExpr(m2_))
-  ExpressionStmt:3(
-    NameExpr(m3_)))
-
-[case testErrorsInMultipleModules]
-import m
-x
-[file m.py]
-y
-[out]
-tmp/m.py:1: error: Name 'y' is not defined
-main:2: error: Name 'x' is not defined
-
-[case testImportTwice]
-import typing
-from x import a, a # ok (we could give a warning, but this is valid)
-def f() -> None:
-    from x import a
-    from x import a # ok
-import x
-import x # ok, since we may import multiple submodules of a package
-[file x.py]
-a = 1
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ImportFrom:2(x, [a, a])
-  FuncDef:3(
-    f
-    def ()
-    Block:3(
-      ImportFrom:4(x, [a])
-      ImportFrom:5(x, [a])))
-  Import:6(x)
-  Import:7(x))
-MypyFile:1(
-  tmp/x.py
-  AssignmentStmt:1(
-    NameExpr(a* [x.a])
-    IntExpr(1)))
diff --git a/test-data/unit/semanal-namedtuple.test b/test-data/unit/semanal-namedtuple.test
deleted file mode 100644
index a820a07..0000000
--- a/test-data/unit/semanal-namedtuple.test
+++ /dev/null
@@ -1,177 +0,0 @@
--- Semantic analysis of named tuples
-
-[case testSimpleNamedtuple]
-from collections import namedtuple
-N = namedtuple('N', ['a'])
-def f() -> N: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(collections, [namedtuple])
-  AssignmentStmt:2(
-    NameExpr(N* [__main__.N])
-    NamedTupleExpr:2(N, Tuple[Any]))
-  FuncDef:3(
-    f
-    def () -> Tuple[Any, fallback=__main__.N]
-    Block:3(
-      PassStmt:3())))
-
-[case testTwoItemNamedtuple]
-from collections import namedtuple
-N = namedtuple('N', ['a', 'xyz'])
-def f() -> N: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(collections, [namedtuple])
-  AssignmentStmt:2(
-    NameExpr(N* [__main__.N])
-    NamedTupleExpr:2(N, Tuple[Any, Any]))
-  FuncDef:3(
-    f
-    def () -> Tuple[Any, Any, fallback=__main__.N]
-    Block:3(
-      PassStmt:3())))
-
-[case testTwoItemNamedtupleWithTupleFieldNames]
-from collections import namedtuple
-N = namedtuple('N', ('a', 'xyz'))
-def f() -> N: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(collections, [namedtuple])
-  AssignmentStmt:2(
-    NameExpr(N* [__main__.N])
-    NamedTupleExpr:2(N, Tuple[Any, Any]))
-  FuncDef:3(
-    f
-    def () -> Tuple[Any, Any, fallback=__main__.N]
-    Block:3(
-      PassStmt:3())))
-
-[case testTwoItemNamedtupleWithShorthandSyntax]
-from collections import namedtuple
-N = namedtuple('N', ' a  xyz ')
-def f() -> N: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(collections, [namedtuple])
-  AssignmentStmt:2(
-    NameExpr(N* [__main__.N])
-    NamedTupleExpr:2(N, Tuple[Any, Any]))
-  FuncDef:3(
-    f
-    def () -> Tuple[Any, Any, fallback=__main__.N]
-    Block:3(
-      PassStmt:3())))
-
-[case testNamedTupleWithItemTypes]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int),
-                     ('b', str)])
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [NamedTuple])
-  AssignmentStmt:2(
-    NameExpr(N* [__main__.N])
-    NamedTupleExpr:2(N, Tuple[builtins.int, builtins.str])))
-
-[case testNamedTupleWithTupleFieldNamesWithItemTypes]
-from typing import NamedTuple
-N = NamedTuple('N', (('a', int),
-                     ('b', str)))
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [NamedTuple])
-  AssignmentStmt:2(
-    NameExpr(N* [__main__.N])
-    NamedTupleExpr:2(N, Tuple[builtins.int, builtins.str])))
-
-[case testNamedTupleBaseClass]
-from collections import namedtuple
-N = namedtuple('N', ['x'])
-class A(N): pass
-[out]
-MypyFile:1(
-  ImportFrom:1(collections, [namedtuple])
-  AssignmentStmt:2(
-    NameExpr(N* [__main__.N])
-    NamedTupleExpr:2(N, Tuple[Any]))
-  ClassDef:3(
-    A
-    TupleType(
-      Tuple[Any, fallback=__main__.N])
-    BaseType(
-      __main__.N)
-    PassStmt:3()))
-
-[case testNamedTupleBaseClass2]
-from collections import namedtuple
-class A(namedtuple('N', ['x'])): pass
-[out]
-MypyFile:1(
-  ImportFrom:1(collections, [namedtuple])
-  ClassDef:2(
-    A
-    TupleType(
-      Tuple[Any, fallback=__main__.N at 2])
-    BaseType(
-      __main__.N at 2)
-    PassStmt:2()))
-
-[case testNamedTupleBaseClassWithItemTypes]
-from typing import NamedTuple
-class A(NamedTuple('N', [('x', int)])): pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [NamedTuple])
-  ClassDef:2(
-    A
-    TupleType(
-      Tuple[builtins.int, fallback=__main__.N at 2])
-    BaseType(
-      __main__.N at 2)
-    PassStmt:2()))
-
--- Errors
-
-[case testNamedTupleWithTooFewArguments]
-from collections import namedtuple
-N = namedtuple('N') # E: Too few arguments for namedtuple()
-
-[case testNamedTupleWithTooManyArguments]
-from collections import namedtuple
-N = namedtuple('N', ['x'], 'y') # E: Too many arguments for namedtuple()
-
-[case testNamedTupleWithInvalidName]
-from collections import namedtuple
-N = namedtuple(1, ['x']) # E: namedtuple() expects a string literal as the first argument
-
-[case testNamedTupleWithInvalidItems]
-from collections import namedtuple
-N = namedtuple('N', 1) # E: List or tuple literal expected as the second argument to namedtuple()
-
-[case testNamedTupleWithInvalidItems2]
-from collections import namedtuple
-N = namedtuple('N', ['x', 1]) # E: String literal expected as namedtuple() item
-
-[case testNamedTupleWithUnderscoreItemName]
-from collections import namedtuple
-N = namedtuple('N', ['_fallback']) # E: namedtuple() field names cannot start with an underscore: _fallback
-
--- NOTE: The following code works at runtime but is not yet supported by mypy.
---       Keyword arguments may potentially be supported in the future.
-[case testNamedTupleWithNonpositionalArgs]
-from collections import namedtuple
-N = namedtuple(typename='N', field_names=['x']) # E: Unexpected arguments to namedtuple()
-
-[case testInvalidNamedTupleBaseClass]
-from typing import NamedTuple
-class A(NamedTuple('N', [1])): pass # E: Tuple expected as NamedTuple() field
-class B(A): pass
-
-[case testInvalidNamedTupleBaseClass2]
-class A(NamedTuple('N', [1])): pass
-class B(A): pass
-[out]
-main:1: error: Name 'NamedTuple' is not defined
-main:1: error: Invalid base class
diff --git a/test-data/unit/semanal-python2.test b/test-data/unit/semanal-python2.test
deleted file mode 100644
index 97264a5..0000000
--- a/test-data/unit/semanal-python2.test
+++ /dev/null
@@ -1,76 +0,0 @@
--- Python 2 semantic analysis test cases.
-
-[case testPrintStatement_python2]
-print int, None
-[out]
-MypyFile:1(
-  PrintStmt:1(
-    NameExpr(int [builtins.int])
-    NameExpr(None [builtins.None])
-    Newline))
-
-[case testPrintStatementWithTarget]
-print >>int, None
-[out]
-MypyFile:1(
-  PrintStmt:1(
-    NameExpr(None [builtins.None])
-    Target(
-      NameExpr(int [builtins.int]))
-    Newline))
-
-[case testExecStatement]
-exec None
-exec None in int
-exec None in int, str
-[out]
-MypyFile:1(
-  ExecStmt:1(
-    NameExpr(None [builtins.None]))
-  ExecStmt:2(
-    NameExpr(None [builtins.None])
-    NameExpr(int [builtins.int]))
-  ExecStmt:3(
-    NameExpr(None [builtins.None])
-    NameExpr(int [builtins.int])
-    NameExpr(str [builtins.str])))
-
-[case testVariableLengthTuple_python2]
-from typing import Tuple, cast
-cast(Tuple[int, ...], ())
-[builtins_py2 fixtures/tuple.pyi]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Tuple, cast])
-  ExpressionStmt:2(
-    CastExpr:2(
-      TupleExpr:2()
-      builtins.tuple[builtins.int])))
-
-[case testTupleArgList_python2]
-def f(x, (y, z)):
-    x = y
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x)
-      Var(__tuple_arg_2))
-    Block:1(
-      AssignmentStmt:1(
-        TupleExpr:1(
-          NameExpr(y* [l])
-          NameExpr(z* [l]))
-        NameExpr(__tuple_arg_2 [l]))
-      AssignmentStmt:2(
-        NameExpr(x [l])
-        NameExpr(y [l])))))
-
-[case testBackquoteExpr_python2]
-`object`
-[out]
-MypyFile:1(
-  ExpressionStmt:1(
-    BackquoteExpr:1(
-      NameExpr(object [builtins.object]))))
diff --git a/test-data/unit/semanal-statements.test b/test-data/unit/semanal-statements.test
deleted file mode 100644
index 8825c8e..0000000
--- a/test-data/unit/semanal-statements.test
+++ /dev/null
@@ -1,925 +0,0 @@
-[case testReturn]
-def f(x): return x
-def g(): return
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    Block:1(
-      ReturnStmt:1(
-        NameExpr(x [l]))))
-  FuncDef:2(
-    g
-    Block:2(
-      ReturnStmt:2())))
-
-[case testRaise]
-raise object()
-[out]
-MypyFile:1(
-  RaiseStmt:1(
-    CallExpr:1(
-      NameExpr(object [builtins.object])
-      Args())))
-
-[case testYield]
-def f(): yield f
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Generator
-    Block:1(
-      ExpressionStmt:1(
-        YieldExpr:1(
-          NameExpr(f [__main__.f]))))))
-
-[case testAssert]
-assert object
-[out]
-MypyFile:1(
-  AssertStmt:1(
-    NameExpr(object [builtins.object])))
-
-[case testOperatorAssignment]
-x = y = 1
-x += y
-y |= x
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  OperatorAssignmentStmt:2(
-    +
-    NameExpr(x [__main__.x])
-    NameExpr(y [__main__.y]))
-  OperatorAssignmentStmt:3(
-    |
-    NameExpr(y [__main__.y])
-    NameExpr(x [__main__.x])))
-
-[case testWhile]
-x = y = 1
-while x:
-  y
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  WhileStmt:2(
-    NameExpr(x [__main__.x])
-    Block:2(
-      ExpressionStmt:3(
-        NameExpr(y [__main__.y])))))
-
-[case testFor]
-for x in object:
-  x
-[out]
-MypyFile:1(
-  ForStmt:1(
-    NameExpr(x* [__main__.x])
-    NameExpr(object [builtins.object])
-    Block:1(
-      ExpressionStmt:2(
-        NameExpr(x [__main__.x])))))
-
-[case testForInFunction]
-def f():
-  for x in f:
-    x
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ForStmt:2(
-        NameExpr(x* [l])
-        NameExpr(f [__main__.f])
-        Block:2(
-          ExpressionStmt:3(
-            NameExpr(x [l])))))))
-
-[case testMultipleForIndexVars]
-for x, y in []:
-  x, y
-[out]
-MypyFile:1(
-  ForStmt:1(
-    TupleExpr:1(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    ListExpr:1()
-    Block:1(
-      ExpressionStmt:2(
-        TupleExpr:2(
-          NameExpr(x [__main__.x])
-          NameExpr(y [__main__.y]))))))
-
-[case testForIndexVarScope]
-for x in []:
-  pass
-x
-[out]
-MypyFile:1(
-  ForStmt:1(
-    NameExpr(x* [__main__.x])
-    ListExpr:1()
-    Block:1(
-      PassStmt:2()))
-  ExpressionStmt:3(
-    NameExpr(x [__main__.x])))
-
-[case testForIndexVarScope2]
-def f():
-  for x in []:
-    pass
-  x
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ForStmt:2(
-        NameExpr(x* [l])
-        ListExpr:2()
-        Block:2(
-          PassStmt:3()))
-      ExpressionStmt:4(
-        NameExpr(x [l])))))
-
-[case testReusingForLoopIndexVariable]
-for x in None:
-    pass
-for x in None:
-    pass
-[out]
-MypyFile:1(
-  ForStmt:1(
-    NameExpr(x* [__main__.x])
-    NameExpr(None [builtins.None])
-    Block:1(
-      PassStmt:2()))
-  ForStmt:3(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    Block:3(
-      PassStmt:4())))
-
-[case testReusingForLoopIndexVariable2]
-def f():
-    for x in None:
-        pass
-    for x in None:
-        pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      ForStmt:2(
-        NameExpr(x* [l])
-        NameExpr(None [builtins.None])
-        Block:2(
-          PassStmt:3()))
-      ForStmt:4(
-        NameExpr(x [l])
-        NameExpr(None [builtins.None])
-        Block:4(
-          PassStmt:5())))))
-
-[case testLoopWithElse]
-for x in []:
-  pass
-else:
-  x
-while 1:
-  pass
-else:
-  x
-[out]
-MypyFile:1(
-  ForStmt:1(
-    NameExpr(x* [__main__.x])
-    ListExpr:1()
-    Block:1(
-      PassStmt:2())
-    Else(
-      ExpressionStmt:4(
-        NameExpr(x [__main__.x]))))
-  WhileStmt:5(
-    IntExpr(1)
-    Block:5(
-      PassStmt:6())
-    Else(
-      ExpressionStmt:8(
-        NameExpr(x [__main__.x])))))
-
-[case testBreak]
-while 1:
-  break
-for x in []:
-  break
-[out]
-MypyFile:1(
-  WhileStmt:1(
-    IntExpr(1)
-    Block:1(
-      BreakStmt:2()))
-  ForStmt:3(
-    NameExpr(x* [__main__.x])
-    ListExpr:3()
-    Block:3(
-      BreakStmt:4())))
-
-[case testContinue]
-while 1:
-  continue
-for x in []:
-  continue
-[out]
-MypyFile:1(
-  WhileStmt:1(
-    IntExpr(1)
-    Block:1(
-      ContinueStmt:2()))
-  ForStmt:3(
-    NameExpr(x* [__main__.x])
-    ListExpr:3()
-    Block:3(
-      ContinueStmt:4())))
-
-[case testIf]
-x = 1
-if x:
-  x
-elif x:
-  x
-elif x:
-  x
-else:
-  x
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  IfStmt:2(
-    If(
-      NameExpr(x [__main__.x]))
-    Then(
-      ExpressionStmt:3(
-        NameExpr(x [__main__.x])))
-    If(
-      NameExpr(x [__main__.x]))
-    Then(
-      ExpressionStmt:5(
-        NameExpr(x [__main__.x])))
-    If(
-      NameExpr(x [__main__.x]))
-    Then(
-      ExpressionStmt:7(
-        NameExpr(x [__main__.x])))
-    Else(
-      ExpressionStmt:9(
-        NameExpr(x [__main__.x])))))
-
-[case testSimpleIf]
-if object:
-  object
-[out]
-MypyFile:1(
-  IfStmt:1(
-    If(
-      NameExpr(object [builtins.object]))
-    Then(
-      ExpressionStmt:2(
-        NameExpr(object [builtins.object])))))
-
-[case testLvalues]
-x = y = 1
-x = 1
-x.m = 1
-x[y] = 1
-x, y = 1
-[x, y] = 1
-(x, y) = 1
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    IntExpr(1))
-  AssignmentStmt:3(
-    MemberExpr:3(
-      NameExpr(x [__main__.x])
-      m)
-    IntExpr(1))
-  AssignmentStmt:4(
-    IndexExpr:4(
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y]))
-    IntExpr(1))
-  AssignmentStmt:5(
-    TupleExpr:5(
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y]))
-    IntExpr(1))
-  AssignmentStmt:6(
-    ListExpr:6(
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y]))
-    IntExpr(1))
-  AssignmentStmt:7(
-    TupleExpr:7(
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y]))
-    IntExpr(1)))
-
-[case testStarLvalues]
-*x, y = 1
-*x, (y, *z) = 1
-*(x, q), r = 1
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    TupleExpr:1(
-      StarExpr:1(
-        NameExpr(x* [__main__.x]))
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  AssignmentStmt:2(
-    TupleExpr:2(
-      StarExpr:2(
-        NameExpr(x [__main__.x]))
-      TupleExpr:2(
-        NameExpr(y [__main__.y])
-        StarExpr:2(
-          NameExpr(z* [__main__.z]))))
-    IntExpr(1))
-  AssignmentStmt:3(
-    TupleExpr:3(
-      StarExpr:3(
-        TupleExpr:3(
-          NameExpr(x [__main__.x])
-          NameExpr(q* [__main__.q])))
-      NameExpr(r* [__main__.r]))
-    IntExpr(1)))
-
-[case testMultipleDefinition]
-x, y = 1
-x, y = 2
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    TupleExpr:1(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  AssignmentStmt:2(
-    TupleExpr:2(
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y]))
-    IntExpr(2)))
-
-[case testComplexDefinitions]
-(x) = 1
-([y]) = 2
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  AssignmentStmt:2(
-    ListExpr:2(
-      NameExpr(y* [__main__.y]))
-    IntExpr(2)))
-
-[case testLocalComplexDefinition]
-def f():
-  (x) = 1
-  x
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      AssignmentStmt:2(
-        NameExpr(x* [l])
-        IntExpr(1))
-      ExpressionStmt:3(
-        NameExpr(x [l])))))
-
-[case testMultipleDefOnlySomeNew]
-x = 1
-y, x = 1
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  AssignmentStmt:2(
-    TupleExpr:2(
-      NameExpr(y* [__main__.y])
-      NameExpr(x [__main__.x]))
-    IntExpr(1)))
-
-[case testMultipleDefOnlySomeNewNestedTuples]
-x = 1
-y, (x, z) = 1
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  AssignmentStmt:2(
-    TupleExpr:2(
-      NameExpr(y* [__main__.y])
-      TupleExpr:2(
-        NameExpr(x [__main__.x])
-        NameExpr(z* [__main__.z])))
-    IntExpr(1)))
-
-[case testMultipleDefOnlySomeNewNestedLists]
-x = 1
-y, [x, z] = 1
-[p, [x, r]] = 1
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  AssignmentStmt:2(
-    TupleExpr:2(
-      NameExpr(y* [__main__.y])
-      ListExpr:2(
-        NameExpr(x [__main__.x])
-        NameExpr(z* [__main__.z])))
-    IntExpr(1))
-  AssignmentStmt:3(
-    ListExpr:3(
-      NameExpr(p* [__main__.p])
-      ListExpr:3(
-        NameExpr(x [__main__.x])
-        NameExpr(r* [__main__.r])))
-    IntExpr(1)))
-
-[case testIndexedDel]
-x = y = 1
-del x[y]
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    Lvalues(
-      NameExpr(x* [__main__.x])
-      NameExpr(y* [__main__.y]))
-    IntExpr(1))
-  DelStmt:2(
-    IndexExpr:2(
-      NameExpr(x [__main__.x])
-      NameExpr(y [__main__.y]))))
-
-[case testDelGlobalName]
-x = 1
-del x
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(x* [__main__.x])
-    IntExpr(1))
-  DelStmt:2(
-    NameExpr(x [__main__.x])))
-
-[case testDelLocalName]
-def f(x):
-    del x
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x))
-    Block:1(
-      DelStmt:2(
-        NameExpr(x [l])))))
-
-[case testDelMultipleThings]
-def f(x, y):
-    del x, y[0]
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(x)
-      Var(y))
-    Block:1(
-      DelStmt:2(
-        TupleExpr:2(
-          NameExpr(x [l])
-          IndexExpr:2(
-            NameExpr(y [l])
-            IntExpr(0)))))))
-
-[case testDelMultipleThingsInvalid]
-def f(x, y) -> None:
-    del x, y + 1
-[out]
-main:2: error: Invalid delete target
-
-[case testTry]
-class c: pass
-try:
-  c
-except object:
-  c
-except c as e:
-  e
-except:
-  c
-finally:
-  c
-[out]
-MypyFile:1(
-  ClassDef:1(
-    c
-    PassStmt:1())
-  TryStmt:2(
-    Block:2(
-      ExpressionStmt:3(
-        NameExpr(c [__main__.c])))
-    NameExpr(object [builtins.object])
-    Block:4(
-      ExpressionStmt:5(
-        NameExpr(c [__main__.c])))
-    NameExpr(c [__main__.c])
-    NameExpr(e* [__main__.e])
-    Block:6(
-      ExpressionStmt:7(
-        NameExpr(e [__main__.e])))
-    Block:8(
-      ExpressionStmt:9(
-        NameExpr(c [__main__.c])))
-    Finally(
-      ExpressionStmt:11(
-        NameExpr(c [__main__.c])))))
-
-[case testTryElse]
-try:
-  pass
-except:
-  pass
-else:
-  object
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      PassStmt:2())
-    Block:3(
-      PassStmt:4())
-    Else(
-      ExpressionStmt:6(
-        NameExpr(object [builtins.object])))))
-
-[case testTryWithOnlyFinally]
-try:
-  pass
-finally:
-  pass
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      PassStmt:2())
-    Finally(
-      PassStmt:4())))
-
-[case testExceptWithMultipleTypes]
-class c: pass
-try:
-  pass
-except (c, object) as e:
-  e
-[out]
-MypyFile:1(
-  ClassDef:1(
-    c
-    PassStmt:1())
-  TryStmt:2(
-    Block:2(
-      PassStmt:3())
-    TupleExpr:4(
-      NameExpr(c [__main__.c])
-      NameExpr(object [builtins.object]))
-    NameExpr(e* [__main__.e])
-    Block:4(
-      ExpressionStmt:5(
-        NameExpr(e [__main__.e])))))
-
-[case testRaiseWithoutExpr]
-raise
-[out]
-MypyFile:1(
-  RaiseStmt:1())
-
-[case testWith]
-with object:
-  object
-[out]
-MypyFile:1(
-  WithStmt:1(
-    Expr(
-      NameExpr(object [builtins.object]))
-    Block:1(
-      ExpressionStmt:2(
-        NameExpr(object [builtins.object])))))
-
-[case testWithAndVariable]
-with object as x:
-  x
-[out]
-MypyFile:1(
-  WithStmt:1(
-    Expr(
-      NameExpr(object [builtins.object]))
-    Target(
-      NameExpr(x* [__main__.x]))
-    Block:1(
-      ExpressionStmt:2(
-        NameExpr(x [__main__.x])))))
-
-[case testWithInFunction]
-def f():
-  with f as x:
-    x
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Block:1(
-      WithStmt:2(
-        Expr(
-          NameExpr(f [__main__.f]))
-        Target(
-          NameExpr(x* [l]))
-        Block:2(
-          ExpressionStmt:3(
-            NameExpr(x [l])))))))
-
-[case testComplexWith]
-with object, object:
-  pass
-with object as a, object as b:
-  pass
-[out]
-MypyFile:1(
-  WithStmt:1(
-    Expr(
-      NameExpr(object [builtins.object]))
-    Expr(
-      NameExpr(object [builtins.object]))
-    Block:1(
-      PassStmt:2()))
-  WithStmt:3(
-    Expr(
-      NameExpr(object [builtins.object]))
-    Target(
-      NameExpr(a* [__main__.a]))
-    Expr(
-      NameExpr(object [builtins.object]))
-    Target(
-      NameExpr(b* [__main__.b]))
-    Block:3(
-      PassStmt:4())))
-
-[case testVariableInBlock]
-while object:
-  x = None
-  x = x
-[out]
-MypyFile:1(
-  WhileStmt:1(
-    NameExpr(object [builtins.object])
-    Block:1(
-      AssignmentStmt:2(
-        NameExpr(x* [__main__.x])
-        NameExpr(None [builtins.None]))
-      AssignmentStmt:3(
-        NameExpr(x [__main__.x])
-        NameExpr(x [__main__.x])))))
-
-[case testVariableInExceptHandler]
-try:
-  pass
-except object as o:
-  x = None
-  o = x
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      PassStmt:2())
-    NameExpr(object [builtins.object])
-    NameExpr(o* [__main__.o])
-    Block:3(
-      AssignmentStmt:4(
-        NameExpr(x* [__main__.x])
-        NameExpr(None [builtins.None]))
-      AssignmentStmt:5(
-        NameExpr(o [__main__.o])
-        NameExpr(x [__main__.x])))))
-
-[case testCallInExceptHandler]
-try:
-  pass
-except object as o:
-  o = object()
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      PassStmt:2())
-    NameExpr(object [builtins.object])
-    NameExpr(o* [__main__.o])
-    Block:3(
-      AssignmentStmt:4(
-        NameExpr(o [__main__.o])
-        CallExpr:4(
-          NameExpr(object [builtins.object])
-          Args())))))
-
-[case testTryExceptWithMultipleHandlers]
-try:
-    pass
-except BaseException as e:
-    pass
-except Err as f:
-    f = BaseException() # Fail
-    f = Err()
-class Err(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-MypyFile:1(
-  TryStmt:1(
-    Block:1(
-      PassStmt:2())
-    NameExpr(BaseException [builtins.BaseException])
-    NameExpr(e* [__main__.e])
-    Block:3(
-      PassStmt:4())
-    NameExpr(Err [__main__.Err])
-    NameExpr(f* [__main__.f])
-    Block:5(
-      AssignmentStmt:6(
-        NameExpr(f [__main__.f])
-        CallExpr:6(
-          NameExpr(BaseException [builtins.BaseException])
-          Args()))
-      AssignmentStmt:7(
-        NameExpr(f [__main__.f])
-        CallExpr:7(
-          NameExpr(Err [__main__.Err])
-          Args()))))
-  ClassDef:8(
-    Err
-    BaseType(
-      builtins.BaseException)
-    PassStmt:8()))
-
-[case testMultipleAssignmentWithPartialNewDef]
-o = None
-x, o = o, o
-[out]
-MypyFile:1(
-  AssignmentStmt:1(
-    NameExpr(o* [__main__.o])
-    NameExpr(None [builtins.None]))
-  AssignmentStmt:2(
-    TupleExpr:2(
-      NameExpr(x* [__main__.x])
-      NameExpr(o [__main__.o]))
-    TupleExpr:2(
-      NameExpr(o [__main__.o])
-      NameExpr(o [__main__.o]))))
-
-[case testFunctionDecorator]
-def decorate(f): pass
- at decorate
-def g():
-    g()
-[out]
-MypyFile:1(
-  FuncDef:1(
-    decorate
-    Args(
-      Var(f))
-    Block:1(
-      PassStmt:1()))
-  Decorator:2(
-    Var(g)
-    NameExpr(decorate [__main__.decorate])
-    FuncDef:3(
-      g
-      Block:3(
-        ExpressionStmt:4(
-          CallExpr:4(
-            NameExpr(g [__main__.g])
-            Args()))))))
-
-[case testTryWithinFunction]
-def f() -> None:
-    try:
-        pass
-    except object as o:
-        pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def ()
-    Block:1(
-      TryStmt:2(
-        Block:2(
-          PassStmt:3())
-        NameExpr(object [builtins.object])
-        NameExpr(o* [l])
-        Block:4(
-          PassStmt:5())))))
-
-[case testReuseExceptionVariable]
-def f() -> None:
-    try:
-        pass
-    except object as o:
-        pass
-    except object as o:
-        pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    def ()
-    Block:1(
-      TryStmt:2(
-        Block:2(
-          PassStmt:3())
-        NameExpr(object [builtins.object])
-        NameExpr(o* [l])
-        Block:4(
-          PassStmt:5())
-        NameExpr(object [builtins.object])
-        NameExpr(o [l])
-        Block:6(
-          PassStmt:7())))))
-
-[case testWithMultiple]
-def f(a):
-    pass
-def main():
-    with f(0) as a, f(a) as b:
-        x = a, b
-[out]
-MypyFile:1(
-  FuncDef:1(
-    f
-    Args(
-      Var(a))
-    Block:1(
-      PassStmt:2()))
-  FuncDef:3(
-    main
-    Block:3(
-      WithStmt:4(
-        Expr(
-          CallExpr:4(
-            NameExpr(f [__main__.f])
-            Args(
-              IntExpr(0))))
-        Target(
-          NameExpr(a* [l]))
-        Expr(
-          CallExpr:4(
-            NameExpr(f [__main__.f])
-            Args(
-              NameExpr(a [l]))))
-        Target(
-          NameExpr(b* [l]))
-        Block:4(
-          AssignmentStmt:5(
-            NameExpr(x* [l])
-            TupleExpr:5(
-              NameExpr(a [l])
-              NameExpr(b [l]))))))))
diff --git a/test-data/unit/semanal-symtable.test b/test-data/unit/semanal-symtable.test
deleted file mode 100644
index 4821635..0000000
--- a/test-data/unit/semanal-symtable.test
+++ /dev/null
@@ -1,52 +0,0 @@
-[case testEmptyFile]
-[out]
--- Note that builtins are ignored to simplify output.
-__main__:
-  SymbolTable()
-
-[case testVarDef]
-x = 1
-[out]
-__main__:
-  SymbolTable(
-    x : Gdef/Var (__main__))
-
-[case testFuncDef]
-def f(): pass
-[out]
-__main__:
-  SymbolTable(
-    f : Gdef/FuncDef (__main__))
-
-[case testEmptyClassDef]
-class c: pass
-[out]
-__main__:
-  SymbolTable(
-    c : Gdef/TypeInfo (__main__))
-
-[case testImport]
-import m
-[file m.py]
-x = 1
-[out]
-__main__:
-  SymbolTable(
-    m : ModuleRef/MypyFile (__main__))
-m:
-  SymbolTable(
-    x : Gdef/Var (m))
-
-[case testImportFromModule]
-from m import x
-[file m.py]
-class x: pass
-y = 1
-[out]
-__main__:
-  SymbolTable(
-    x : Gdef/TypeInfo (__main__))
-m:
-  SymbolTable(
-    x : Gdef/TypeInfo (m)
-    y : Gdef/Var (m))
diff --git a/test-data/unit/semanal-typealiases.test b/test-data/unit/semanal-typealiases.test
deleted file mode 100644
index 5178a71..0000000
--- a/test-data/unit/semanal-typealiases.test
+++ /dev/null
@@ -1,440 +0,0 @@
-[case testListTypeAlias]
-from typing import List
-def f() -> List[int]: pass
-[builtins fixtures/list.pyi]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [List])
-  FuncDef:2(
-    f
-    def () -> builtins.list[builtins.int]
-    Block:2(
-      PassStmt:2())))
-
-[case testDictTypeAlias]
-from typing import Dict
-def f() -> Dict[int, str]: pass
-[builtins fixtures/dict.pyi]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Dict])
-  FuncDef:2(
-    f
-    def () -> builtins.dict[builtins.int, builtins.str]
-    Block:2(
-      PassStmt:2())))
-
-[case testQualifiedTypeAlias]
-import typing
-def f() -> typing.List[int]: pass
-[builtins fixtures/list.pyi]
-[out]
-MypyFile:1(
-  Import:1(typing)
-  FuncDef:2(
-    f
-    def () -> builtins.list[builtins.int]
-    Block:2(
-      PassStmt:2())))
-
-[case testTypeApplicationWithTypeAlias]
-from typing import List
-List[List[int]]
-[builtins fixtures/list.pyi]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [List])
-  ExpressionStmt:2(
-    TypeApplication:2(
-      NameExpr(List [builtins.list])
-      Types(
-        builtins.list[builtins.int]))))
-
-[case testTypeApplicationWithQualifiedTypeAlias]
-import typing
-typing.List[typing.List[int]]
-[builtins fixtures/list.pyi]
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ExpressionStmt:2(
-    TypeApplication:2(
-      MemberExpr:2(
-        NameExpr(typing)
-        List [builtins.list])
-      Types(
-        builtins.list[builtins.int]))))
-
-[case testSimpleTypeAlias]
-import typing
-class A: pass
-A2 = A
-def f(x: A2) -> A: pass
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ClassDef:2(
-    A
-    PassStmt:2())
-  AssignmentStmt:3(
-    NameExpr(A2* [__main__.A2])
-    NameExpr(A [__main__.A]))
-  FuncDef:4(
-    f
-    Args(
-      Var(x))
-    def (x: __main__.A) -> __main__.A
-    Block:4(
-      PassStmt:4())))
-
-[case testQualifiedSimpleTypeAlias]
-import typing
-import _m
-A2 = _m.A
-x = 1 # type: A2
-[file _m.py]
-import typing
-class A: pass
-[out]
-MypyFile:1(
-  Import:1(typing)
-  Import:2(_m)
-  AssignmentStmt:3(
-    NameExpr(A2* [__main__.A2])
-    MemberExpr:3(
-      NameExpr(_m)
-      A [_m.A]))
-  AssignmentStmt:4(
-    NameExpr(x [__main__.x])
-    IntExpr(1)
-    _m.A))
-
-[case testUnionTypeAlias]
-from typing import Union
-U = Union[int, str]
-def f(x: U) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Union])
-  AssignmentStmt:2(
-    NameExpr(U* [__main__.U])
-    TypeAliasExpr(Union[builtins.int, builtins.str]))
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def (x: Union[builtins.int, builtins.str])
-    Block:3(
-      PassStmt:3())))
-
-[case testUnionTypeAlias2]
-from typing import Union
-class A: pass
-U = Union[int, A]
-def f(x: U) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Union])
-  ClassDef:2(
-    A
-    PassStmt:2())
-  AssignmentStmt:3(
-    NameExpr(U* [__main__.U])
-    TypeAliasExpr(Union[builtins.int, __main__.A]))
-  FuncDef:4(
-    f
-    Args(
-      Var(x))
-    def (x: Union[builtins.int, __main__.A])
-    Block:4(
-      PassStmt:4())))
-
-[case testUnionTypeAliasWithQualifiedUnion]
-import typing
-U = typing.Union[int, str]
-def f(x: U) -> None: pass
-[out]
-MypyFile:1(
-  Import:1(typing)
-  AssignmentStmt:2(
-    NameExpr(U* [__main__.U])
-    TypeAliasExpr(Union[builtins.int, builtins.str]))
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def (x: Union[builtins.int, builtins.str])
-    Block:3(
-      PassStmt:3())))
-
-[case testTupleTypeAlias]
-from typing import Tuple
-T = Tuple[int, str]
-def f(x: T) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Tuple])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeAliasExpr(Tuple[builtins.int, builtins.str]))
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def (x: Tuple[builtins.int, builtins.str])
-    Block:3(
-      PassStmt:3())))
-
-[case testCallableTypeAlias]
-from typing import Callable
-C = Callable[[int], None]
-def f(x: C) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Callable])
-  AssignmentStmt:2(
-    NameExpr(C* [__main__.C])
-    TypeAliasExpr(def (builtins.int)))
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def (x: def (builtins.int))
-    Block:3(
-      PassStmt:3())))
-
-[case testGenericTypeAlias]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-class G(Generic[T]): pass
-A = G[int]
-def f(x: A) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Generic, TypeVar])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2())
-  ClassDef:3(
-    G
-    TypeVars(
-      T)
-    PassStmt:3())
-  AssignmentStmt:4(
-    NameExpr(A* [__main__.A])
-    TypeAliasExpr(__main__.G[builtins.int]))
-  FuncDef:5(
-    f
-    Args(
-      Var(x))
-    def (x: __main__.G[builtins.int])
-    Block:5(
-      PassStmt:5())))
-
-[case testGenericTypeAlias2]
-from typing import List
-A = List[int]
-def f(x: A) -> None: pass
-[builtins fixtures/list.pyi]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [List])
-  AssignmentStmt:2(
-    NameExpr(A* [__main__.A])
-    TypeAliasExpr(builtins.list[builtins.int]))
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def (x: builtins.list[builtins.int])
-    Block:3(
-      PassStmt:3())))
-
-[case testImportUnionTypeAlias]
-import typing
-from _m import U
-def f(x: U) -> None: pass
-[file _m.py]
-from typing import Union
-class A: pass
-U = Union[int, A]
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ImportFrom:2(_m, [U])
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def (x: Union[builtins.int, _m.A])
-    Block:3(
-      PassStmt:3())))
-
-[case testImportUnionTypeAlias2]
-import typing
-import _m
-def f(x: _m.U) -> None: pass
-[file _m.py]
-from typing import Union
-class A: pass
-U = Union[int, A]
-[out]
-MypyFile:1(
-  Import:1(typing)
-  Import:2(_m)
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def (x: Union[builtins.int, _m.A])
-    Block:3(
-      PassStmt:3())))
-
-[case testImportSimpleTypeAlias]
-import typing
-from _m import A
-def f(x: A) -> None: pass
-[file _m.py]
-import typing
-A = int
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ImportFrom:2(_m, [A])
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def (x: builtins.int)
-    Block:3(
-      PassStmt:3())))
-
-[case testImportSimpleTypeAlias2]
-import typing
-import _m
-def f(x: _m.A) -> None: pass
-[file _m.py]
-import typing
-A = int
-[out]
-MypyFile:1(
-  Import:1(typing)
-  Import:2(_m)
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def (x: builtins.int)
-    Block:3(
-      PassStmt:3())))
-
-[case testAnyTypeAlias]
-from typing import Any
-A = Any
-a = 1 # type: A
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Any])
-  AssignmentStmt:2(
-    NameExpr(A* [__main__.A])
-    NameExpr(Any [typing.Any]))
-  AssignmentStmt:3(
-    NameExpr(a [__main__.a])
-    IntExpr(1)
-    Any))
-
-[case testAnyTypeAlias2]
-import typing
-A = typing.Any
-a = 1 # type: A
-[out]
-MypyFile:1(
-  Import:1(typing)
-  AssignmentStmt:2(
-    NameExpr(A* [__main__.A])
-    MemberExpr:2(
-      NameExpr(typing)
-      Any [typing.Any]))
-  AssignmentStmt:3(
-    NameExpr(a [__main__.a])
-    IntExpr(1)
-    Any))
-
-[case testTypeAliasAlias]
-from typing import Union
-U = Union[int, str]
-U2 = U
-x = 1 # type: U2
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Union])
-  AssignmentStmt:2(
-    NameExpr(U* [__main__.U])
-    TypeAliasExpr(Union[builtins.int, builtins.str]))
-  AssignmentStmt:3(
-    NameExpr(U2* [__main__.U2])
-    NameExpr(U [__main__.U]))
-  AssignmentStmt:4(
-    NameExpr(x [__main__.x])
-    IntExpr(1)
-    Union[builtins.int, builtins.str]))
-
-[case testTypeAliasOfImportedAlias]
-from typing import Union
-from _m import U
-U2 = U
-x = 1 # type: U2
-[file _m.py]
-from typing import Union
-U = Union[int, str]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Union])
-  ImportFrom:2(_m, [U])
-  AssignmentStmt:3(
-    NameExpr(U2* [__main__.U2])
-    NameExpr(U [_m.U]))
-  AssignmentStmt:4(
-    NameExpr(x [__main__.x])
-    IntExpr(1)
-    Union[builtins.int, builtins.str]))
-
-[case testListTypeDoesNotGenerateAlias]
-import typing
-A = [int, str]
-a = 1 # type: A  # E: Invalid type "__main__.A"
-
-[case testCantUseStringLiteralAsTypeAlias]
-from typing import Union
-A = 'Union[int, str]'
-a = 1 # type: A  # E: Invalid type "__main__.A"
-
-[case testStringLiteralTypeAsAliasComponent]
-from typing import Union
-A = Union['int', str]
-a = 1 # type: A
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Union])
-  AssignmentStmt:2(
-    NameExpr(A* [__main__.A])
-    TypeAliasExpr(Union[builtins.int, builtins.str]))
-  AssignmentStmt:3(
-    NameExpr(a [__main__.a])
-    IntExpr(1)
-    Union[builtins.int, builtins.str]))
-
-[case testComplexTypeAlias]
-from typing import Union, Tuple, Any
-A = Union['int', Tuple[int, Any]]
-a = 1 # type: A
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Union, Tuple, Any])
-  AssignmentStmt:2(
-    NameExpr(A* [__main__.A])
-    TypeAliasExpr(Union[builtins.int, Tuple[builtins.int, Any]]))
-  AssignmentStmt:3(
-    NameExpr(a [__main__.a])
-    IntExpr(1)
-    Union[builtins.int, Tuple[builtins.int, Any]]))
diff --git a/test-data/unit/semanal-typeddict.test b/test-data/unit/semanal-typeddict.test
deleted file mode 100644
index a0229d8..0000000
--- a/test-data/unit/semanal-typeddict.test
+++ /dev/null
@@ -1,81 +0,0 @@
--- Create Type
-
--- TODO: Implement support for this syntax.
---[case testCanCreateTypedDictTypeWithKeywordArguments]
---from mypy_extensions import TypedDict
---Point = TypedDict('Point', x=int, y=int)
---[builtins fixtures/dict.pyi]
---[out]
---MypyFile:1(
---  ImportFrom:1(mypy_extensions, [TypedDict])
---  AssignmentStmt:2(
---    NameExpr(Point* [__main__.Point])
---    TypedDictExpr:2(Point)))
-
--- TODO: Implement support for this syntax.
---[case testCanCreateTypedDictTypeWithDictCall]
---from mypy_extensions import TypedDict
---Point = TypedDict('Point', dict(x=int, y=int))
---[builtins fixtures/dict.pyi]
---[out]
---MypyFile:1(
---  ImportFrom:1(mypy_extensions, [TypedDict])
---  AssignmentStmt:2(
---    NameExpr(Point* [__main__.Point])
---    TypedDictExpr:2(Point)))
-
-[case testCanCreateTypedDictTypeWithDictLiteral]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-[builtins fixtures/dict.pyi]
-[out]
-MypyFile:1(
-  ImportFrom:1(mypy_extensions, [TypedDict])
-  AssignmentStmt:2(
-    NameExpr(Point* [__main__.Point])
-    TypedDictExpr:2(Point)))
-
-
--- Create Type (Errors)
-
-[case testCannotCreateTypedDictTypeWithTooFewArguments]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point')  # E: Too few arguments for TypedDict()
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithTooManyArguments]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int}, dict)  # E: Too many arguments for TypedDict()
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithInvalidName]
-from mypy_extensions import TypedDict
-Point = TypedDict(dict, {'x': int, 'y': int})  # E: TypedDict() expects a string literal as the first argument
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithInvalidItems]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x'})  # E: TypedDict() expects a dictionary literal as the second argument
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithUnderscoreItemName]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int, '_fallback': object})  # E: TypedDict() item names cannot start with an underscore: _fallback
-[builtins fixtures/dict.pyi]
-
--- NOTE: The following code works at runtime but is not yet supported by mypy.
---       Keyword arguments may potentially be supported in the future.
-[case testCannotCreateTypedDictTypeWithNonpositionalArgs]
-from mypy_extensions import TypedDict
-Point = TypedDict(typename='Point', fields={'x': int, 'y': int})  # E: Unexpected arguments to TypedDict()
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithInvalidItemName]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {int: int, int: int})  # E: Invalid TypedDict() field name
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithInvalidItemType]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': 1, 'y': 1})  # E: Invalid field type
-[builtins fixtures/dict.pyi]
diff --git a/test-data/unit/semanal-typeinfo.test b/test-data/unit/semanal-typeinfo.test
deleted file mode 100644
index 6bb62e1..0000000
--- a/test-data/unit/semanal-typeinfo.test
+++ /dev/null
@@ -1,80 +0,0 @@
-[case testEmptyFile]
-[out]
-TypeInfoMap()
-
-[case testEmptyClass]
-class c: pass
-[out]
-TypeInfoMap(
-  __main__.c : TypeInfo(
-    Name(__main__.c)
-    Bases(builtins.object)
-    Names()))
-
-[case testClassWithMethod]
-class c:
-  def f(self): pass
-[out]
-TypeInfoMap(
-  __main__.c : TypeInfo(
-    Name(__main__.c)
-    Bases(builtins.object)
-    Names(
-      f)))
-
-[case testClassWithAttributes]
-class c:
-  def __init__(self, x):
-    self.y = x
-    self.z = 1
-[out]
-TypeInfoMap(
-  __main__.c : TypeInfo(
-    Name(__main__.c)
-    Bases(builtins.object)
-    Names(
-      __init__
-      y
-      z)))
-
-[case testBaseClass]
-class base: pass
-class c(base): pass
-[out]
-TypeInfoMap(
-  __main__.base : TypeInfo(
-    Name(__main__.base)
-    Bases(builtins.object)
-    Names())
-  __main__.c : TypeInfo(
-    Name(__main__.c)
-    Bases(__main__.base)
-    Names()))
-
-[case testClassAndAbstractClass]
-from abc import abstractmethod, ABCMeta
-import typing
-
-class i(metaclass=ABCMeta): pass
-class c(i): pass
-[out]
-TypeInfoMap(
-  __main__.c : TypeInfo(
-    Name(__main__.c)
-    Bases(__main__.i)
-    Names())
-  __main__.i : TypeInfo(
-    Name(__main__.i)
-    Bases(builtins.object)
-    Names()))
-
-[case testAttributeWithoutType]
-class A:
-    a = A
-[out]
-TypeInfoMap(
-  __main__.A : TypeInfo(
-    Name(__main__.A)
-    Bases(builtins.object)
-    Names(
-      a)))
diff --git a/test-data/unit/semanal-types.test b/test-data/unit/semanal-types.test
deleted file mode 100644
index 927ab85..0000000
--- a/test-data/unit/semanal-types.test
+++ /dev/null
@@ -1,1476 +0,0 @@
-[case testVarWithType]
-import typing
-class A: pass
-x = A() # type: A
-y = x
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ClassDef:2(
-    A
-    PassStmt:2())
-  AssignmentStmt:3(
-    NameExpr(x [__main__.x])
-    CallExpr:3(
-      NameExpr(A [__main__.A])
-      Args())
-    __main__.A)
-  AssignmentStmt:4(
-    NameExpr(y* [__main__.y])
-    NameExpr(x [__main__.x])))
-
-[case testLocalVarWithType]
-class A: pass
-def f():
-  x = None # type: A
-  y = x
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    PassStmt:1())
-  FuncDef:2(
-    f
-    Block:2(
-      AssignmentStmt:3(
-        NameExpr(x [l])
-        NameExpr(None [builtins.None])
-        __main__.A)
-      AssignmentStmt:4(
-        NameExpr(y* [l])
-        NameExpr(x [l])))))
-
-[case testAnyType]
-from typing import Any
-x = None # type: Any
-y = x
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Any])
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    Any)
-  AssignmentStmt:3(
-    NameExpr(y* [__main__.y])
-    NameExpr(x [__main__.x])))
-
-[case testMemberVarWithType]
-import typing
-class A:
-  def __init__(self):
-    self.x = None # type: int
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ClassDef:2(
-    A
-    FuncDef:3(
-      __init__
-      Args(
-        Var(self))
-      Block:3(
-        AssignmentStmt:4(
-          MemberExpr:4(
-            NameExpr(self [l])
-            x)
-          NameExpr(None [builtins.None])
-          builtins.int)))))
-
-[case testClassVarWithType]
-import typing
-class A:
-  x = None # type: int
-  x = 1
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ClassDef:2(
-    A
-    AssignmentStmt:3(
-      NameExpr(x [m])
-      NameExpr(None [builtins.None])
-      builtins.int)
-    AssignmentStmt:4(
-      NameExpr(x [m])
-      IntExpr(1))))
-
-[case testFunctionSig]
-from typing import Any
-class A: pass
-def f(x: A) -> A: pass
-def g(x: Any, y: A) -> None:
-  z = x, y
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Any])
-  ClassDef:2(
-    A
-    PassStmt:2())
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def (x: __main__.A) -> __main__.A
-    Block:3(
-      PassStmt:3()))
-  FuncDef:4(
-    g
-    Args(
-      Var(x)
-      Var(y))
-    def (x: Any, y: __main__.A)
-    Block:4(
-      AssignmentStmt:5(
-        NameExpr(z* [l])
-        TupleExpr:5(
-          NameExpr(x [l])
-          NameExpr(y [l]))))))
-
-[case testBaseclass]
-class A: pass
-class B(A): pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    PassStmt:1())
-  ClassDef:2(
-    B
-    BaseType(
-      __main__.A)
-    PassStmt:2()))
-
-[case testMultipleVarDef]
-
-class A: pass
-class B: pass
-a, b = None, None # type: (A, B)
-x = a, b
-[out]
-MypyFile:1(
-  ClassDef:2(
-    A
-    PassStmt:2())
-  ClassDef:3(
-    B
-    PassStmt:3())
-  AssignmentStmt:4(
-    TupleExpr:4(
-      NameExpr(a [__main__.a])
-      NameExpr(b [__main__.b]))
-    TupleExpr:4(
-      NameExpr(None [builtins.None])
-      NameExpr(None [builtins.None]))
-    Tuple[__main__.A, __main__.B])
-  AssignmentStmt:5(
-    NameExpr(x* [__main__.x])
-    TupleExpr:5(
-      NameExpr(a [__main__.a])
-      NameExpr(b [__main__.b]))))
-
-[case testGenericType]
-from typing import TypeVar, Generic, Any
-
-t = TypeVar('t')
-
-class A(Generic[t]): pass
-class B: pass
-x = None # type: A[B]
-y = None # type: A[Any]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic, Any])
-  AssignmentStmt:3(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:3())
-  ClassDef:5(
-    A
-    TypeVars(
-      t)
-    PassStmt:5())
-  ClassDef:6(
-    B
-    PassStmt:6())
-  AssignmentStmt:7(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    __main__.A[__main__.B])
-  AssignmentStmt:8(
-    NameExpr(y [__main__.y])
-    NameExpr(None [builtins.None])
-    __main__.A[Any]))
-
-[case testGenericType2]
-from typing import TypeVar, Generic, Any
-t = TypeVar('t')
-s = TypeVar('s')
-class A(Generic[t, s]): pass
-class B: pass
-x = None # type: A[B, Any]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic, Any])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  AssignmentStmt:3(
-    NameExpr(s* [__main__.s])
-    TypeVarExpr:3())
-  ClassDef:4(
-    A
-    TypeVars(
-      t
-      s)
-    PassStmt:4())
-  ClassDef:5(
-    B
-    PassStmt:5())
-  AssignmentStmt:6(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    __main__.A[__main__.B, Any]))
-
-[case testAssignmentAfterDef]
-
-
-class A: pass
-a = None # type: A
-a = 1
-def f():
-  b = None # type: A
-  b = 1
-[out]
-MypyFile:1(
-  ClassDef:3(
-    A
-    PassStmt:3())
-  AssignmentStmt:4(
-    NameExpr(a [__main__.a])
-    NameExpr(None [builtins.None])
-    __main__.A)
-  AssignmentStmt:5(
-    NameExpr(a [__main__.a])
-    IntExpr(1))
-  FuncDef:6(
-    f
-    Block:6(
-      AssignmentStmt:7(
-        NameExpr(b [l])
-        NameExpr(None [builtins.None])
-        __main__.A)
-      AssignmentStmt:8(
-        NameExpr(b [l])
-        IntExpr(1)))))
-
-[case testCast]
-from typing import TypeVar, Generic, Any, cast
-t = TypeVar('t')
-class c: pass
-class d(Generic[t]): pass
-cast(Any, 1)
-cast(c, 1)
-cast(d[c], c)
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic, Any, cast])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  ClassDef:3(
-    c
-    PassStmt:3())
-  ClassDef:4(
-    d
-    TypeVars(
-      t)
-    PassStmt:4())
-  ExpressionStmt:5(
-    CastExpr:5(
-      IntExpr(1)
-      Any))
-  ExpressionStmt:6(
-    CastExpr:6(
-      IntExpr(1)
-      __main__.c))
-  ExpressionStmt:7(
-    CastExpr:7(
-      NameExpr(c [__main__.c])
-      __main__.d[__main__.c])))
-
-[case testCastToQualifiedTypeAndCast]
-import typing
-import _m
-typing.cast(_m.C, object)
-[file _m.py]
-class C: pass
-[out]
-MypyFile:1(
-  Import:1(typing)
-  Import:2(_m)
-  ExpressionStmt:3(
-    CastExpr:3(
-      NameExpr(object [builtins.object])
-      _m.C)))
-
-[case testLongQualifiedCast]
-import typing
-import _m._n
-typing.cast(_m._n.C, object)
-[file _m/__init__.py]
-[file _m/_n.py]
-class C: pass
-[out]
-MypyFile:1(
-  Import:1(typing)
-  Import:2(_m._n)
-  ExpressionStmt:3(
-    CastExpr:3(
-      NameExpr(object [builtins.object])
-      _m._n.C)))
-
-[case testCastTargetWithTwoTypeArgs]
-from typing import TypeVar, Generic, cast
-t = TypeVar('t')
-s = TypeVar('s')
-class C(Generic[t, s]): pass
-cast(C[str, int], C)
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic, cast])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  AssignmentStmt:3(
-    NameExpr(s* [__main__.s])
-    TypeVarExpr:3())
-  ClassDef:4(
-    C
-    TypeVars(
-      t
-      s)
-    PassStmt:4())
-  ExpressionStmt:5(
-    CastExpr:5(
-      NameExpr(C [__main__.C])
-      __main__.C[builtins.str, builtins.int])))
-
-[case testCastToAny]
-from typing import Any
-Any(None)
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Any])
-  ExpressionStmt:2(
-    CastExpr:2(
-      NameExpr(None [builtins.None])
-      Any)))
-
-[case testCastToTupleType]
-from typing import Tuple, cast
-cast(Tuple[int, str], None)
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Tuple, cast])
-  ExpressionStmt:2(
-    CastExpr:2(
-      NameExpr(None [builtins.None])
-      Tuple[builtins.int, builtins.str])))
-
-[case testCastToFunctionType]
-from typing import Callable, cast
-cast(Callable[[int], str], None)
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Callable, cast])
-  ExpressionStmt:2(
-    CastExpr:2(
-      NameExpr(None [builtins.None])
-      def (builtins.int) -> builtins.str)))
-
-[case testCastToStringLiteralType]
-from typing import cast
-cast('int', 1)
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [cast])
-  ExpressionStmt:2(
-    CastExpr:2(
-      IntExpr(1)
-      builtins.int)))
-
-[case testFunctionTypeVariable]
-from typing import TypeVar
-t = TypeVar('t')
-def f(x: t) -> None:
-  y = None # type: t
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def [t] (x: t`-1)
-    Block:3(
-      AssignmentStmt:4(
-        NameExpr(y [l])
-        NameExpr(None [builtins.None])
-        t`-1))))
-
-[case testTwoFunctionTypeVariables]
-from typing import TypeVar
-t = TypeVar('t')
-u = TypeVar('u')
-def f(x: t, y: u, z: t) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  AssignmentStmt:3(
-    NameExpr(u* [__main__.u])
-    TypeVarExpr:3())
-  FuncDef:4(
-    f
-    Args(
-      Var(x)
-      Var(y)
-      Var(z))
-    def [t, u] (x: t`-1, y: u`-2, z: t`-1)
-    Block:4(
-      PassStmt:4())))
-
-[case testNestedGenericFunctionTypeVariable]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-def f(x: A[t], y) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  ClassDef:3(
-    A
-    TypeVars(
-      t)
-    PassStmt:3())
-  FuncDef:4(
-    f
-    Args(
-      Var(x)
-      Var(y))
-    def [t] (x: __main__.A[t`-1], y: Any)
-    Block:4(
-      PassStmt:4())))
-
-[case testNestedGenericFunctionTypeVariable2]
-from typing import TypeVar, Tuple, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-def f(x: Tuple[int, t]) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Tuple, Generic])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  ClassDef:3(
-    A
-    TypeVars(
-      t)
-    PassStmt:3())
-  FuncDef:4(
-    f
-    Args(
-      Var(x))
-    def [t] (x: Tuple[builtins.int, t`-1])
-    Block:4(
-      PassStmt:4())))
-
-[case testNestedGenericFunctionTypeVariable3]
-from typing import TypeVar, Callable, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-def f(x: Callable[[int, t], int]) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Callable, Generic])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  ClassDef:3(
-    A
-    TypeVars(
-      t)
-    PassStmt:3())
-  FuncDef:4(
-    f
-    Args(
-      Var(x))
-    def [t] (x: def (builtins.int, t`-1) -> builtins.int)
-    Block:4(
-      PassStmt:4())))
-
-[case testNestedGenericFunctionTypeVariable4]
-from typing import TypeVar, Callable, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-def f(x: Callable[[], t]) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Callable, Generic])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  ClassDef:3(
-    A
-    TypeVars(
-      t)
-    PassStmt:3())
-  FuncDef:4(
-    f
-    Args(
-      Var(x))
-    def [t] (x: def () -> t`-1)
-    Block:4(
-      PassStmt:4())))
-
-[case testGenericFunctionTypeVariableInReturnType]
-from typing import TypeVar
-t = TypeVar('t')
-def f() -> t: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  FuncDef:3(
-    f
-    def [t] () -> t`-1
-    Block:3(
-      PassStmt:3())))
-
-[case testSelfType]
-class A:
-  def f(self, o: object) -> None: pass
-[out]
-MypyFile:1(
-  ClassDef:1(
-    A
-    FuncDef:2(
-      f
-      Args(
-        Var(self)
-        Var(o))
-      def (self: __main__.A, o: builtins.object)
-      Block:2(
-        PassStmt:2()))))
-
-[case testNestedGenericFunction]
-from typing import TypeVar
-t = TypeVar('t')
-def f() -> None:
-    def g() -> t: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  FuncDef:3(
-    f
-    def ()
-    Block:3(
-      FuncDef:4(
-        g
-        def [t] () -> t`-1
-        Block:4(
-          PassStmt:4())))))
-
-[case testClassTvar]
-from typing import TypeVar, Generic
-
-t = TypeVar('t')
-
-class c(Generic[t]):
-  def f(self) -> t: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic])
-  AssignmentStmt:3(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:3())
-  ClassDef:5(
-    c
-    TypeVars(
-      t)
-    FuncDef:6(
-      f
-      Args(
-        Var(self))
-      def (self: __main__.c[t`1]) -> t`1
-      Block:6(
-        PassStmt:6()))))
-
-[case testClassTvar2]
-from typing import TypeVar, Generic
-
-t = TypeVar('t')
-s = TypeVar('s')
-
-class c(Generic[t, s]):
-  def f(self, x: s) -> t: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic])
-  AssignmentStmt:3(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:3())
-  AssignmentStmt:4(
-    NameExpr(s* [__main__.s])
-    TypeVarExpr:4())
-  ClassDef:6(
-    c
-    TypeVars(
-      t
-      s)
-    FuncDef:7(
-      f
-      Args(
-        Var(self)
-        Var(x))
-      def (self: __main__.c[t`1, s`2], x: s`2) -> t`1
-      Block:7(
-        PassStmt:7()))))
-
-[case testGenericBaseClass]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class d(Generic[t]): pass
-class c(d[t], Generic[t]): pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  ClassDef:3(
-    d
-    TypeVars(
-      t)
-    PassStmt:3())
-  ClassDef:4(
-    c
-    TypeVars(
-      t)
-    BaseType(
-      __main__.d[t`1])
-    PassStmt:4()))
-
-[case testTupleType]
-from typing import Tuple
-t = None # type: tuple
-t1 = None # type: Tuple[object]
-t2 = None # type: Tuple[int, object]
-[builtins fixtures/tuple.pyi]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Tuple])
-  AssignmentStmt:2(
-    NameExpr(t [__main__.t])
-    NameExpr(None [builtins.None])
-    builtins.tuple[Any])
-  AssignmentStmt:3(
-    NameExpr(t1 [__main__.t1])
-    NameExpr(None [builtins.None])
-    Tuple[builtins.object])
-  AssignmentStmt:4(
-    NameExpr(t2 [__main__.t2])
-    NameExpr(None [builtins.None])
-    Tuple[builtins.int, builtins.object]))
-
-[case testVariableLengthTuple]
-from typing import Tuple
-t = None # type: Tuple[int, ...]
-[builtins fixtures/tuple.pyi]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Tuple])
-  AssignmentStmt:2(
-    NameExpr(t [__main__.t])
-    NameExpr(None [builtins.None])
-    builtins.tuple[builtins.int]))
-
-[case testInvalidTupleType]
-from typing import Tuple
-t = None # type: Tuple[int, str, ...] # E: Unexpected '...'
-[out]
-
-[case testFunctionTypes]
-from typing import Callable
-f = None # type: Callable[[object, int], str]
-g = None # type: Callable[[], None]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Callable])
-  AssignmentStmt:2(
-    NameExpr(f [__main__.f])
-    NameExpr(None [builtins.None])
-    def (builtins.object, builtins.int) -> builtins.str)
-  AssignmentStmt:3(
-    NameExpr(g [__main__.g])
-    NameExpr(None [builtins.None])
-    def ()))
-
-[case testOverloadedFunction]
-from typing import overload
- at overload
-def f(o: object) -> int: o
- at overload
-def f(a: str) -> object: a
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [overload])
-  OverloadedFuncDef:2(
-    Overload(def (o: builtins.object) -> builtins.int, \
-             def (a: builtins.str) -> builtins.object)
-    Decorator:2(
-      Var(f)
-      NameExpr(overload [typing.overload])
-      FuncDef:3(
-        f
-        Args(
-          Var(o))
-        def (o: builtins.object) -> builtins.int
-        Block:3(
-          ExpressionStmt:3(
-            NameExpr(o [l])))))
-    Decorator:4(
-      Var(f)
-      NameExpr(overload [typing.overload])
-      FuncDef:5(
-        f
-        Args(
-          Var(a))
-        def (a: builtins.str) -> builtins.object
-        Block:5(
-          ExpressionStmt:5(
-            NameExpr(a [l])))))))
-
-[case testReferenceToOverloadedFunction]
-from typing import overload
- at overload
-def f() -> None: pass
- at overload
-def f(x: int) -> None: pass
-x = f
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [overload])
-  OverloadedFuncDef:2(
-    Overload(def (), def (x: builtins.int))
-    Decorator:2(
-      Var(f)
-      NameExpr(overload [typing.overload])
-      FuncDef:3(
-        f
-        def ()
-        Block:3(
-          PassStmt:3())))
-    Decorator:4(
-      Var(f)
-      NameExpr(overload [typing.overload])
-      FuncDef:5(
-        f
-        Args(
-          Var(x))
-        def (x: builtins.int)
-        Block:5(
-          PassStmt:5()))))
-  AssignmentStmt:6(
-    NameExpr(x* [__main__.x])
-    NameExpr(f [__main__.f])))
-
-[case testNestedOverloadedFunction]
-from typing import overload
-def f():
-    @overload
-    def g(): pass
-    @overload
-    def g(x): pass
-    y = g
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [overload])
-  FuncDef:2(
-    f
-    Block:2(
-      OverloadedFuncDef:3(
-        Overload(def () -> Any, def (x: Any) -> Any)
-        Decorator:3(
-          Var(g)
-          NameExpr(overload [typing.overload])
-          FuncDef:4(
-            g
-            Block:4(
-              PassStmt:4())))
-        Decorator:5(
-          Var(g)
-          NameExpr(overload [typing.overload])
-          FuncDef:6(
-            g
-            Args(
-              Var(x))
-            Block:6(
-              PassStmt:6()))))
-      AssignmentStmt:7(
-        NameExpr(y* [l])
-        NameExpr(g [l])))))
-
-[case testImplicitGenericTypeArgs]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-s = TypeVar('s')
-class A(Generic[t, s]): pass
-x = None # type: A
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  AssignmentStmt:3(
-    NameExpr(s* [__main__.s])
-    TypeVarExpr:3())
-  ClassDef:4(
-    A
-    TypeVars(
-      t
-      s)
-    PassStmt:4())
-  AssignmentStmt:5(
-    NameExpr(x [__main__.x])
-    NameExpr(None [builtins.None])
-    __main__.A[Any, Any]))
-
-[case testImplicitTypeArgsAndGenericBaseClass]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-s = TypeVar('s')
-class B(Generic[s]): pass
-class A(B, Generic[t]): pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  AssignmentStmt:3(
-    NameExpr(s* [__main__.s])
-    TypeVarExpr:3())
-  ClassDef:4(
-    B
-    TypeVars(
-      s)
-    PassStmt:4())
-  ClassDef:5(
-    A
-    TypeVars(
-      t)
-    BaseType(
-      __main__.B[Any])
-    PassStmt:5()))
-
-[case testTypeApplication]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-x = A[int]()
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  ClassDef:3(
-    A
-    TypeVars(
-      t)
-    PassStmt:3())
-  AssignmentStmt:4(
-    NameExpr(x* [__main__.x])
-    CallExpr:4(
-      TypeApplication:4(
-        NameExpr(A [__main__.A])
-        Types(
-          builtins.int))
-      Args())))
-
-[case testTypeApplicationWithTwoTypeArgs]
-from typing import TypeVar, Generic, Any
-t = TypeVar('t')
-s = TypeVar('s')
-class A(Generic[t, s]): pass
-x = A[int, Any]()
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic, Any])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  AssignmentStmt:3(
-    NameExpr(s* [__main__.s])
-    TypeVarExpr:3())
-  ClassDef:4(
-    A
-    TypeVars(
-      t
-      s)
-    PassStmt:4())
-  AssignmentStmt:5(
-    NameExpr(x* [__main__.x])
-    CallExpr:5(
-      TypeApplication:5(
-        NameExpr(A [__main__.A])
-        Types(
-          builtins.int
-          Any))
-      Args())))
-
-[case testFunctionTypeApplication]
-from typing import TypeVar
-t = TypeVar('t')
-def f(x: t) -> None: pass
-f[int](1)
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def [t] (x: t`-1)
-    Block:3(
-      PassStmt:3()))
-  ExpressionStmt:4(
-    CallExpr:4(
-      TypeApplication:4(
-        NameExpr(f [__main__.f])
-        Types(
-          builtins.int))
-      Args(
-        IntExpr(1)))))
-
-[case testTypeApplicationWithStringLiteralType]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-A['int']()
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic])
-  AssignmentStmt:2(
-    NameExpr(t* [__main__.t])
-    TypeVarExpr:2())
-  ClassDef:3(
-    A
-    TypeVars(
-      t)
-    PassStmt:3())
-  ExpressionStmt:4(
-    CallExpr:4(
-      TypeApplication:4(
-        NameExpr(A [__main__.A])
-        Types(
-          builtins.int))
-      Args())))
-
-[case testVarArgsAndKeywordArgs]
-def g(*x: int, y: str = ''): pass
-[out]
-MypyFile:1(
-  FuncDef:1(
-    g
-    MaxPos(0)
-    Args(
-      Var(y))
-    def (*x: builtins.int, *, y: builtins.str =) -> Any
-    Init(
-      AssignmentStmt:1(
-        NameExpr(y [l])
-        StrExpr()))
-    VarArg(
-      Var(x))
-    Block:1(
-      PassStmt:1())))
-
-[case testQualifiedGeneric]
-from typing import TypeVar
-import typing
-T = TypeVar('T')
-class A(typing.Generic[T]): pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  Import:2(typing)
-  AssignmentStmt:3(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:3())
-  ClassDef:4(
-    A
-    TypeVars(
-      T)
-    PassStmt:4()))
-
-[case testQualifiedTypevar]
-import typing
-T = typing.TypeVar('T')
-def f(x: T) -> T: pass
-[out]
-MypyFile:1(
-  Import:1(typing)
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2())
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def [T] (x: T`-1) -> T`-1
-    Block:3(
-      PassStmt:3())))
-
-[case testAliasedTypevar]
-from typing import TypeVar as tv
-T = tv('T')
-def f(x: T) -> T: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar : tv])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2())
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def [T] (x: T`-1) -> T`-1
-    Block:3(
-      PassStmt:3())))
-
-[case testLocalTypevar]
-from typing import TypeVar
-def f():
-    T = TypeVar('T')
-    def g(x: T) -> T: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  FuncDef:2(
-    f
-    Block:2(
-      AssignmentStmt:3(
-        NameExpr(T* [l])
-        TypeVarExpr:3())
-      FuncDef:4(
-        g
-        Args(
-          Var(x))
-        def [T] (x: T`-1) -> T`-1
-        Block:4(
-          PassStmt:4())))))
-
-[case testClassLevelTypevar]
-from typing import TypeVar
-class A:
-    T = TypeVar('T')
-    def g(self, x: T) -> T: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  ClassDef:2(
-    A
-    AssignmentStmt:3(
-      NameExpr(T* [m])
-      TypeVarExpr:3())
-    FuncDef:4(
-      g
-      Args(
-        Var(self)
-        Var(x))
-      def [T] (self: __main__.A, x: T`-1) -> T`-1
-      Block:4(
-        PassStmt:4()))))
-
-[case testImportTypevar]
-from typing import Generic
-from _m import T
-class A(Generic[T]):
-    y = None # type: T
-[file _m.py]
-from typing import TypeVar
-T = TypeVar('T')
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Generic])
-  ImportFrom:2(_m, [T])
-  ClassDef:3(
-    A
-    TypeVars(
-      T)
-    AssignmentStmt:4(
-      NameExpr(y [m])
-      NameExpr(None [builtins.None])
-      T`1)))
-
-[case testQualifiedReferenceToTypevarInClass]
-from typing import Generic
-import _m
-class A(Generic[_m.T]):
-    a = None # type: _m.T
-    def f(self, x: _m.T):
-        b = None # type: _m.T
-[file _m.py]
-from typing import TypeVar
-T = TypeVar('T')
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Generic])
-  Import:2(_m)
-  ClassDef:3(
-    A
-    TypeVars(
-      _m.T)
-    AssignmentStmt:4(
-      NameExpr(a [m])
-      NameExpr(None [builtins.None])
-      _m.T`1)
-    FuncDef:5(
-      f
-      Args(
-        Var(self)
-        Var(x))
-      def (self: __main__.A[_m.T`1], x: _m.T`1) -> Any
-      Block:5(
-        AssignmentStmt:6(
-          NameExpr(b [l])
-          NameExpr(None [builtins.None])
-          _m.T`1)))))
-
-[case testQualifiedReferenceToTypevarInFunctionSignature]
-import _m
-def f(x: _m.T) -> None:
-    a = None # type: _m.T
-[file _m.py]
-from typing import TypeVar
-T = TypeVar('T')
-[out]
-MypyFile:1(
-  Import:1(_m)
-  FuncDef:2(
-    f
-    Args(
-      Var(x))
-    def [_m.T] (x: _m.T`-1)
-    Block:2(
-      AssignmentStmt:3(
-        NameExpr(a [l])
-        NameExpr(None [builtins.None])
-        _m.T`-1))))
-
-[case testFunctionCommentAnnotation]
-from typing import Any
-def f(x): # type: (int) -> Any
-  x = 1
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Any])
-  FuncDef:2(
-    f
-    Args(
-      Var(x))
-    def (x: builtins.int) -> Any
-    Block:2(
-      AssignmentStmt:3(
-        NameExpr(x [l])
-        IntExpr(1)))))
-
-[case testMethodCommentAnnotation]
-import typing
-class A:
-  def f(self, x): # type: (int) -> str
-    x = 1
-[out]
-MypyFile:1(
-  Import:1(typing)
-  ClassDef:2(
-    A
-    FuncDef:3(
-      f
-      Args(
-        Var(self)
-        Var(x))
-      def (self: __main__.A, x: builtins.int) -> builtins.str
-      Block:3(
-        AssignmentStmt:4(
-          NameExpr(x [l])
-          IntExpr(1))))))
-
-[case testTypevarWithValues]
-from typing import TypeVar, Any
-T = TypeVar('T', int, str)
-S = TypeVar('S', Any, int, str)
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Any])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2(
-      Values(
-        builtins.int
-        builtins.str)))
-  AssignmentStmt:3(
-    NameExpr(S* [__main__.S])
-    TypeVarExpr:3(
-      Values(
-        Any
-        builtins.int
-        builtins.str))))
-
-[case testTypevarWithValuesAndVariance]
-from typing import TypeVar
-T = TypeVar('T', int, str, covariant=True)
-[builtins fixtures/bool.pyi]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2(
-      Variance(COVARIANT)
-      Values(
-        builtins.int
-        builtins.str))))
-
-[case testTypevarWithBound]
-from typing import TypeVar
-T = TypeVar('T', bound=int)
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2(
-      UpperBound(builtins.int))))
-
-[case testGenericFunctionWithValueSet]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2(
-      Values(
-        builtins.int
-        builtins.str)))
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def [T in (builtins.int, builtins.str)] (x: T`-1) -> T`-1
-    Block:3(
-      PassStmt:3())))
-
-[case testGenericClassWithValueSet]
-from typing import TypeVar, Generic
-T = TypeVar('T', int, str)
-class C(Generic[T]): pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2(
-      Values(
-        builtins.int
-        builtins.str)))
-  ClassDef:3(
-    C
-    TypeVars(
-      T in (builtins.int, builtins.str))
-    PassStmt:3()))
-
-[case testGenericFunctionWithBound]
-from typing import TypeVar
-T = TypeVar('T', bound=int)
-def f(x: T) -> T: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2(
-      UpperBound(builtins.int)))
-  FuncDef:3(
-    f
-    Args(
-      Var(x))
-    def [T <: builtins.int] (x: T`-1) -> T`-1
-    Block:3(
-      PassStmt:3())))
-
-[case testGenericClassWithBound]
-from typing import TypeVar, Generic
-T = TypeVar('T', bound=int)
-class C(Generic[T]): pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar, Generic])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2(
-      UpperBound(builtins.int)))
-  ClassDef:3(
-    C
-    TypeVars(
-      T <: builtins.int)
-    PassStmt:3()))
-
-[case testSimpleDucktypeDecorator]
-from typing import _promote
- at _promote(str)
-class S: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [_promote])
-  ClassDef:2(
-    S
-    Promote(builtins.str)
-    Decorators(
-      PromoteExpr:2(builtins.str))
-    PassStmt:3()))
-
-[case testUnionType]
-from typing import Union
-def f(x: Union[int, str]) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Union])
-  FuncDef:2(
-    f
-    Args(
-      Var(x))
-    def (x: Union[builtins.int, builtins.str])
-    Block:2(
-      PassStmt:2())))
-
-[case testUnionTypeWithNoneItem]
-from typing import Union
-def f(x: Union[int, None]) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Union])
-  FuncDef:2(
-    f
-    Args(
-      Var(x))
-    def (x: builtins.int)
-    Block:2(
-      PassStmt:2())))
-
-[case testUnionTypeWithNoneItemAndTwoItems]
-from typing import Union
-def f(x: Union[int, None, str]) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Union])
-  FuncDef:2(
-    f
-    Args(
-      Var(x))
-    def (x: Union[builtins.int, builtins.str])
-    Block:2(
-      PassStmt:2())))
-
-[case testUnionTypeWithSingleItem]
-from typing import Union
-def f(x: Union[int]) -> None: pass
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Union])
-  FuncDef:2(
-    f
-    Args(
-      Var(x))
-    def (x: builtins.int)
-    Block:2(
-      PassStmt:2())))
-
-[case testOptionalTypes]
-from typing import Optional
-x = 1  # type: Optional[int]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Optional])
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    IntExpr(1)
-    builtins.int))
-
-[case testInvalidOptionalType]
-from typing import Optional
-x = 1  # type: Optional[int, str]  # E: Optional[...] must have exactly one type argument
-y = 1  # type: Optional  # E: Optional[...] must have exactly one type argument
-[out]
-
-[case testCoAndContravariantTypeVar]
-from typing import TypeVar
-T = TypeVar('T', covariant=True)
-S = TypeVar('S', contravariant=True)
-[builtins fixtures/bool.pyi]
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [TypeVar])
-  AssignmentStmt:2(
-    NameExpr(T* [__main__.T])
-    TypeVarExpr:2(
-      Variance(COVARIANT)))
-  AssignmentStmt:3(
-    NameExpr(S* [__main__.S])
-    TypeVarExpr:3(
-      Variance(CONTRAVARIANT))))
-
-[case testTupleExpressionAsType]
-def f(x: (int, int)) -> None: pass
-[out]
-main:1: error: Invalid tuple literal type
-
-[case tesQualifiedTypeNameBasedOnAny]
-from typing import Any
-x = 0 # type: Any
-z = 0 # type: x.y
-[out]
-MypyFile:1(
-  ImportFrom:1(typing, [Any])
-  AssignmentStmt:2(
-    NameExpr(x [__main__.x])
-    IntExpr(0)
-    Any)
-  AssignmentStmt:3(
-    NameExpr(z [__main__.z])
-    IntExpr(0)
-    Any))
diff --git a/test-data/unit/stubgen.test b/test-data/unit/stubgen.test
deleted file mode 100644
index baa5be5..0000000
--- a/test-data/unit/stubgen.test
+++ /dev/null
@@ -1,565 +0,0 @@
-[case testEmptyFile]
-[out]
-
-[case testSingleFunction]
-def f():
-    x = 1
-[out]
-def f(): ...
-
-[case testTwoFunctions]
-def f(a, b):
-    x = 1
-def g(arg):
-    pass
-[out]
-def f(a, b): ...
-def g(arg): ...
-
-[case testDefaultArgInt]
-def f(a, b=2): ...
-def g(b=-1, c=0): ...
-[out]
-def f(a, b: int = ...): ...
-def g(b: int = ..., c: int = ...): ...
-
-[case testDefaultArgNone]
-def f(x=None): ...
-[out]
-from typing import Any, Optional
-
-def f(x: Optional[Any] = ...): ...
-
-[case testDefaultArgBool]
-def f(x=True, y=False): ...
-[out]
-def f(x: bool = ..., y: bool = ...): ...
-
-[case testDefaultArgStr]
-def f(x='foo'): ...
-[out]
-def f(x: str = ...): ...
-
-[case testDefaultArgBytes]
-def f(x=b'foo'): ...
-[out]
-def f(x: bytes = ...): ...
-
-[case testDefaultArgFloat]
-def f(x=1.2): ...
-[out]
-def f(x: float = ...): ...
-
-[case testDefaultArgOther]
-def f(x=ord): ...
-[out]
-from typing import Any
-
-def f(x: Any = ...): ...
-
-[case testVarArgs]
-def f(x, *y): ...
-[out]
-def f(x, *y): ...
-
-[case testKwVarArgs]
-def f(x, **y): ...
-[out]
-def f(x, **y): ...
-
-[case testClass]
-class A:
-    def f(self, x):
-        x = 1
-def g(): ...
-[out]
-class A:
-    def f(self, x): ...
-
-def g(): ...
-
-[case testVariable]
-x = 1
-[out]
-x = ...  # type: int
-
-[case testMultipleVariable]
-x = y = 1
-[out]
-x = ...  # type: int
-y = ...  # type: int
-
-[case testClassVariable]
-class C:
-    x = 1
-[out]
-class C:
-    x = ...  # type: int
-
-[case testSelfAssignment]
-class C:
-    def __init__(self):
-        self.x = 1
-        x.y = 2
-[out]
-class C:
-    x = ...  # type: int
-    def __init__(self) -> None: ...
-
-[case testSelfAndClassBodyAssignment]
-x = 1
-class C:
-    x = 1
-    def __init__(self):
-        self.x = 1
-        self.x = 1
-[out]
-x = ...  # type: int
-
-class C:
-    x = ...  # type: int
-    def __init__(self) -> None: ...
-
-[case testEmptyClass]
-class A: ...
-[out]
-class A: ...
-
-[case testPrivateFunction]
-def _f(): ...
-def g(): ...
-[out]
-def g(): ...
-
-[case testPrivateMethod]
-class A:
-    def _f(self): ...
-[out]
-class A: ...
-
-[case testPrivateVar]
-_x = 1
-class A:
-    _y = 1
-[out]
-class A: ...
-
-[case testSpecialInternalVar]
-__all__ = []
-__author__ = ''
-__version__ = ''
-[out]
-
-[case testBaseClass]
-class A: ...
-class B(A): ...
-[out]
-class A: ...
-class B(A): ...
-
-[case testDecoratedFunction]
- at decorator
-def foo(x): ...
-[out]
-def foo(x): ...
-
-[case testMultipleAssignment]
-x, y = 1, 2
-[out]
-from typing import Any
-
-x = ...  # type: Any
-y = ...  # type: Any
-
-[case testMultipleAssignment2]
-[x, y] = 1, 2
-[out]
-from typing import Any
-
-x = ...  # type: Any
-y = ...  # type: Any
-
-[case testKeywordOnlyArg]
-def f(x, *, y=1): ...
-def g(x, *, y=1, z=2): ...
-[out]
-def f(x, *, y: int = ...): ...
-def g(x, *, y: int = ..., z: int = ...): ...
-
-[case testProperty]
-class A:
-    @property
-    def f(self):
-        return 1
-    @f.setter
-    def f(self, x): ...
-[out]
-class A:
-    @property
-    def f(self): ...
-    @f.setter
-    def f(self, x): ...
-
-[case testStaticMethod]
-class A:
-    @staticmethod
-    def f(x): ...
-[out]
-class A:
-    @staticmethod
-    def f(x): ...
-
-[case testClassMethod]
-class A:
-    @classmethod
-    def f(cls): ...
-[out]
-class A:
-    @classmethod
-    def f(cls): ...
-
-[case testIfMainCheck]
-def a(): ...
-if __name__ == '__main__':
-    x = 1
-    def f(): ...
-def b(): ...
-[out]
-def a(): ...
-def b(): ...
-
-[case testImportStar]
-from x import *
-from a.b import *
-def f(): ...
-[out]
-from x import *
-from a.b import *
-
-def f(): ...
-
-[case testNoSpacesBetweenEmptyClasses]
-class X:
-    def g(self): ...
-class A: ...
-class B: ...
-class C:
-    def f(self): ...
-[out]
-class X:
-    def g(self): ...
-
-class A: ...
-class B: ...
-
-class C:
-    def f(self): ...
-
-[case testExceptionBaseClasses]
-class A(Exception): ...
-class B(ValueError): ...
-[out]
-class A(Exception): ...
-class B(ValueError): ...
-
-[case testOmitSomeSpecialMethods]
-class A:
-    def __str__(self): ...
-    def __repr__(self): ...
-    def __eq__(self): ...
-    def __getstate__(self): ...
-    def __setstate__(self, state): ...
-[out]
-class A:
-    def __eq__(self): ...
-
-[case testOmitDefsNotInAll_import]
-__all__ = [] + ['f']
-def f(): ...
-def g(): ...
-[out]
-def f(): ...
-
-[case testVarDefsNotInAll_import]
-__all__ = [] + ['f', 'g']
-def f(): ...
-x = 1
-y = 1
-def g(): ...
-[out]
-def f(): ...
-def g(): ...
-
-[case testIncludeClassNotInAll_import]
-__all__ = [] + ['f']
-def f(): ...
-class A: ...
-[out]
-def f(): ...
-
-class A: ...
-
-[case testAllAndClass_import]
-__all__ = ['A']
-class A:
-    x = 1
-    def f(self): ...
-[out]
-class A:
-    x = ...  # type: int
-    def f(self): ...
-
-[case testMultiplePrivateDefs]
-class A: ...
-_x = 1
-_y = 1
-_z = 1
-class C: ...
-[out]
-class A: ...
-class C: ...
-
-[case testIncludeFromImportIfInAll_import]
-from re import match, search, sub
-__all__ = ['match', 'sub', 'x']
-x = 1
-[out]
-from re import match as match, sub as sub
-
-x = ...  # type: int
-
-[case testExportModule_import]
-import re
-__all__ = ['re', 'x']
-x = 1
-y = 2
-[out]
-import re as re
-
-x = ...  # type: int
-
-[case testExportModuleAs_import]
-import re as rex
-__all__ = ['rex', 'x']
-x = 1
-y = 2
-[out]
-import re as rex
-
-x = ...  # type: int
-
-[case testExportModuleInPackage_import]
-import urllib.parse as p
-__all__ = ['p']
-[out]
-import urllib.parse as p
-
-[case testExportModuleInPackageUnsupported_import]
-import urllib.parse
-__all__ = ['urllib']
-[out]
-# Names in __all__ with no definition:
-#   urllib
-
-[case testRelativeImportAll]
-from .x import *
-[out]
-from .x import *
-
-[case testCommentForUndefinedName_import]
-__all__ = ['f', 'x', 'C', 'g']
-def f(): ...
-x = 1
-class C:
-    def g(self): ...
-[out]
-def f(): ...
-
-x = ...  # type: int
-
-class C:
-    def g(self): ...
-
-# Names in __all__ with no definition:
-#   g
-
-[case testIgnoreSlots]
-class A:
-    __slots__ = ()
-[out]
-class A: ...
-
-[case testSkipPrivateProperty]
-class A:
-    @property
-    def _foo(self): ...
-[out]
-class A: ...
-
-[case testSkipPrivateStaticAndClassMethod]
-class A:
-    @staticmethod
-    def _foo(): ...
-    @classmethod
-    def _bar(cls): ...
-[out]
-class A: ...
-
-[case testNamedtuple]
-import collections, x
-X = collections.namedtuple('X', ['a', 'b'])
-[out]
-from collections import namedtuple
-
-X = namedtuple('X', ['a', 'b'])
-
-[case testNamedtupleAltSyntax]
-from collections import namedtuple, x
-X = namedtuple('X', 'a b')
-[out]
-from collections import namedtuple
-
-X = namedtuple('X', 'a b')
-
-[case testNamedtupleWithUnderscore]
-from collections import namedtuple as _namedtuple
-def f(): ...
-X = _namedtuple('X', 'a b')
-def g(): ...
-[out]
-from collections import namedtuple as _namedtuple
-from collections import namedtuple
-
-def f(): ...
-
-X = namedtuple('X', 'a b')
-
-def g(): ...
-
-[case testNamedtupleBaseClass]
-import collections, x
-_X = collections.namedtuple('_X', ['a', 'b'])
-class Y(_X): ...
-[out]
-from collections import namedtuple
-
-_X = namedtuple('_X', ['a', 'b'])
-
-class Y(_X): ...
-
-[case testArbitraryBaseClass]
-import x
-class D(x.C): ...
-[out]
-import x
-
-class D(x.C): ...
-
-[case testArbitraryBaseClass]
-import x.y
-class D(x.y.C): ...
-[out]
-import x.y
-
-class D(x.y.C): ...
-
-[case testUnqualifiedArbitraryBaseClassWithNoDef]
-class A(int): ...
-[out]
-class A(int): ...
-
-[case testUnqualifiedArbitraryBaseClass]
-from x import X
-class A(X): ...
-[out]
-from x import X
-
-class A(X): ...
-
-[case testUnqualifiedArbitraryBaseClassWithImportAs]
-from x import X as _X
-class A(_X): ...
-[out]
-from x import X as _X
-
-class A(_X): ...
-
-[case testObjectBaseClass]
-class A(object): ...
-[out]
-class A: ...
-
-[case testEmptyLines]
-def x(): ...
-def f():
-    class A:
-        def f(self):
-            self.x = 1
-def g(): ...
-[out]
-def x(): ...
-def f(): ...
-def g(): ...
-
-[case testNestedClass]
-class A:
-    class B:
-        x = 1
-        def f(self): ...
-    def g(self): ...
-[out]
-class A:
-    class B:
-        x = ...  # type: int
-        def f(self): ...
-    def g(self): ...
-
-[case testExportViaRelativeImport]
-from .api import get
-[out]
-from .api import get as get
-
-[case testExportViaRelativePackageImport]
-from .packages.urllib3.contrib import parse
-[out]
-from .packages.urllib3.contrib import parse as parse
-
-[case testNoExportViaRelativeImport]
-from . import get
-[out]
-
-[case testRelativeImportAndBase]
-from .x import X
-class A(X):
-     pass
-[out]
-from .x import X as X
-
-class A(X): ...
-
-[case testDuplicateDef]
-def syslog(a): pass
-def syslog(a): pass
-[out]
-def syslog(a): ...
-
-[case testAsyncAwait_fast_parser]
-async def f(a):
-   x = await y
-[out]
-def f(a): ...
-
-[case testInferOptionalOnlyFunc]
-class A:
-    x = None
-    def __init__(self, a=None) -> None:
-        self.x = []
-[out]
-from typing import Any, Optional
-
-class A:
-    x = ...  # type: Any
-    def __init__(self, a: Optional[Any] = ...) -> None: ...
-
--- More features/fixes:
---   do not export deleted names
diff --git a/test-data/unit/typexport-basic.test b/test-data/unit/typexport-basic.test
deleted file mode 100644
index e7915cc..0000000
--- a/test-data/unit/typexport-basic.test
+++ /dev/null
@@ -1,1159 +0,0 @@
--- Test cases for exporting node types from the type checker.
---
--- Each test case consists of at least two sections.
--- The first section contains [case NAME-skip] followed by the input code,
--- while the second section contains [out] followed by the output from the type
--- checker.
---
--- The first line of input code should be a regexp in comment that describes
--- the information to dump (prefix with ##). The regexp is matched against
--- the following items:
---
---   * each name of an expression node
---   * each type string of a node (e.g. OpExpr)
---
--- Lines starting with "--" in this file will be ignored.
-
-
--- Expressions
--- -----------
-
-
-[case testConstructorCall]
-import typing
-A()
-B()
-class A: pass
-class B: pass
-[out]
-CallExpr(2) : A
-NameExpr(2) : def () -> A
-CallExpr(3) : B
-NameExpr(3) : def () -> B
-
-[case testLiterals]
-import typing
-5
-2.3
-'foo'
-[builtins fixtures/primitives.pyi]
-[out]
-IntExpr(2) : builtins.int
-FloatExpr(3) : builtins.float
-StrExpr(4) : builtins.str
-
-[case testNameExpression]
-
-a = None # type: A
-a # node
-def f(aa: 'A') -> None:
-  b = None # type: B
-  aa # node
-  b  # node
-class A:
-  def g(self) -> None:
-    self # node
-class B: pass
-[out]
-NameExpr(3) : A
-NameExpr(6) : A
-NameExpr(7) : B
-NameExpr(10) : A
-
-[case testEllipsis]
-import typing
-...
-[out]
-EllipsisExpr(2) : builtins.ellipsis
-
-[case testMemberAccess]
-## MemberExpr|CallExpr
-
-a = None # type: A
-a.m
-a.f
-a.f()
-class A:
-  m = None # type: A
-  def f(self) -> 'B': pass
-class B: pass
-[out]
-MemberExpr(4) : A
-MemberExpr(5) : def () -> B
-CallExpr(6) : B
-MemberExpr(6) : def () -> B
-
-[case testCastExpression]
-## CastExpr|[a-z]
-from typing import Any, cast
-d = None # type: Any
-b = None # type: B
-class A: pass
-class B(A): pass
-cast(A, d)
-cast(A, b)
-cast(B, b)
-[out]
-CastExpr(7) : A
-NameExpr(7) : Any
-CastExpr(8) : A
-NameExpr(8) : B
-CastExpr(9) : B
-NameExpr(9) : B
-
-[case testArithmeticOps]
-## OpExpr
-import typing
-a = 1 + 2
-1.2 * 3
-2.2 - 3
-1 / 2
-[file builtins.py]
-class object:
-    def __init__(self) -> None: pass
-class function: pass
-class int:
-    def __add__(self, x: int) -> int: pass
-    def __truediv__(self, x: int) -> float: pass
-class float:
-    def __mul__(self, x: int) -> float: pass
-    def __sub__(self, x: int) -> float: pass
-class type: pass
-class str: pass
-[out]
-OpExpr(3) : builtins.int
-OpExpr(4) : builtins.float
-OpExpr(5) : builtins.float
-OpExpr(6) : builtins.float
-
-[case testComparisonOps]
-## ComparisonExpr
-import typing
-1 == object()
-1 == 2
-2 < 3
-1 < 2 < 3
-8 > 3
-4 < 6 > 2
-[file builtins.py]
-class object:
-    def __init__(self) -> None: pass
-class int:
-    def __eq__(self, x: object) -> bool: pass
-    def __lt__(self, x: int) -> bool: pass
-    def __gt__(self, x: int) -> int: pass
-class bool: pass
-class type: pass
-class function: pass
-class str: pass
-[out]
-ComparisonExpr(3) : builtins.bool
-ComparisonExpr(4) : builtins.bool
-ComparisonExpr(5) : builtins.bool
-ComparisonExpr(6) : builtins.bool
-ComparisonExpr(7) : builtins.int
-ComparisonExpr(8) : builtins.object
-
-[case testBooleanOps]
-## OpExpr|UnaryExpr
-import typing
-a = 1
-a and a
-a or a
-not a
-[builtins fixtures/bool.pyi]
-[out]
-OpExpr(4) : builtins.int
-OpExpr(5) : builtins.int
-UnaryExpr(6) : builtins.bool
-
-[case testBooleanOpsOnBools]
-## OpExpr|UnaryExpr
-import typing
-a = bool()
-a and a
-a or a
-not a
-[builtins fixtures/bool.pyi]
-[out]
-OpExpr(4) : builtins.bool
-OpExpr(5) : builtins.bool
-UnaryExpr(6) : builtins.bool
-
-[case testFunctionCall]
-## CallExpr
-from typing import Tuple
-f(
-  A(),
-  B())
-class A: pass
-class B: pass
-def f(a: A, b: B) -> Tuple[A, B]: pass
-[builtins fixtures/tuple-simple.pyi]
-[out]
-CallExpr(3) : Tuple[A, B]
-CallExpr(4) : A
-CallExpr(5) : B
-
-
--- Statements
--- ----------
-
-
-[case testSimpleAssignment]
-from typing import Any
-a = None # type: A
-b = a # type: Any
-b = a
-a = b
-
-class A: pass
-[out]
-NameExpr(3) : A
-NameExpr(4) : A
-NameExpr(4) : Any
-NameExpr(5) : A
-NameExpr(5) : Any
-
-[case testMemberAssignment]
-from typing import Any
-class A:
-  a = None # type: A
-  b = None # type: Any
-  def f(self) -> None:
-    self.b = self.a
-    self.a.a = self.b
-[out]
-MemberExpr(6) : A
-MemberExpr(6) : Any
-NameExpr(6) : A
-NameExpr(6) : A
-MemberExpr(7) : A
-MemberExpr(7) : A
-MemberExpr(7) : A
-NameExpr(7) : A
-NameExpr(7) : A
-
-[case testIf]
-
-a = None # type: bool
-if a:
-  1
-elif not a:
-  1
-[builtins fixtures/bool.pyi]
-[out]
-NameExpr(3) : builtins.bool
-IntExpr(4) : builtins.int
-NameExpr(5) : builtins.bool
-UnaryExpr(5) : builtins.bool
-IntExpr(6) : builtins.int
-
-[case testWhile]
-
-a = None # type: bool
-while a:
-  a
-[builtins fixtures/bool.pyi]
-[out]
-NameExpr(3) : builtins.bool
-NameExpr(4) : builtins.bool
-
-
--- Simple type inference
--- ---------------------
-
-
-[case testInferSingleType]
-import typing
-x = ()
-[builtins fixtures/primitives.pyi]
-[out]
-NameExpr(2) : Tuple[]
-TupleExpr(2) : Tuple[]
-
-[case testInferTwoTypes]
-## NameExpr
-import typing
-(s,
-i) = 'x', 1
-[builtins fixtures/primitives.pyi]
-[out]
-NameExpr(3) : builtins.str
-NameExpr(4) : builtins.int
-
-[case testInferSingleLocalVarType]
-import typing
-def f() -> None:
-    x = ()
-[builtins fixtures/primitives.pyi]
-[out]
-NameExpr(3) : Tuple[]
-TupleExpr(3) : Tuple[]
-
-
--- Basic generics
--- --------------
-
-
-[case testImplicitBoundTypeVarsForMethod]
-## MemberExpr
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
-  def f(self) -> T: pass
-class B: pass
-def g() -> None:
-  a = None # type: A[B]
-  f = a.f
-[out]
-MemberExpr(9) : def () -> B
-
-[case testImplicitBoundTypeVarsForSelfMethodReference]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
-  def f(self) -> T:
-    self.f()
-[out]
-CallExpr(5) : T`1
-MemberExpr(5) : def () -> T`1
-NameExpr(5) : A[T`1]
-
-[case testGenericFunctionCallWithTypeApp-skip]
-## CallExpr|TypeApplication|NameExpr
-from typing import Any, TypeVar, Tuple
-T = TypeVar('T')
-class A: pass
-f[A](A())
-f[Any](A())
-def f(a: T) -> Tuple[T, T]: pass
-[builtins fixtures/tuple.pyi]
-[out]
-CallExpr(5) : A
-CallExpr(5) : Tuple[A, A]
-NameExpr(5) : def () -> A
-NameExpr(5) : def (a: A) -> Tuple[A, A]
-TypeApplication(5) : def (a: A) -> Tuple[A, A]
-CallExpr(6) : A
-CallExpr(6) : Tuple[Any, Any]
-NameExpr(6) : def () -> A
-NameExpr(6) : def (a: Any) -> Tuple[Any, Any]
-TypeApplication(6) : def (a: Any) -> Tuple[Any, Any]
-
--- NOTE: Type applications are not supported for generic methods, so the
---       following test cases are commented out.
-
---[case testGenericMethodCallWithTypeApp]
---## CallExpr|MemberExpr|TypeApplication
---from typing import Any, TypeVar, Tuple
---T = TypeVar('T')
---class A:
---  def f(self, a: T) -> Tuple[T, T]: pass
---a.f[A](a)
---a.f[Any](a)
---a = None # type: A
---[builtins fixtures/tuple.py]
---[out]
---CallExpr(2) : Tuple[A, A]
---MemberExpr(2) : def (A a) -> Tuple[A, A]
---TypeApplication(2) : def (A a) -> Tuple[A, A]
---CallExpr(3) : Tuple[Any, Any]
---MemberExpr(3) : def (any a) -> Tuple[Any, Any]
---TypeApplication(3) : def (any a) -> Tuple[Any, Any]
-
---[case testGenericMethodCallInGenericTypeWithTypeApp]
---## CallExpr|MemberExpr|TypeApplication
---from typing import Any, TypeVar, Generic, Tuple
---T = TypeVar('T')
---S = TypeVar('S')
---class B: pass
---class C: pass
---a.f[B](b)
---a.f[Any](b)
---class A(Generic[T]):
---  def f(self, a: S) -> Tuple[T, S]: pass
---a = None # type: A[C]
---b = None # type: B
---[builtins fixtures/tuple.py]
---[out]
---CallExpr(6) : Tuple[C, B]
---MemberExpr(6) : def (B a) -> Tuple[C, B]
---TypeApplication(6) : def (B a) -> Tuple[C, B]
---CallExpr(7) : Tuple[C, Any]
---MemberExpr(7) : def (any a) -> Tuple[C, Any]
---TypeApplication(7) : def (any a) -> Tuple[C, Any]
-
-[case testGenericTypeVariableInference]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
-  def __init__(self, a: T) -> None: pass
-class B: pass
-A(A(B()))
-[out]
-CallExpr(6) : A[A[B]]
-CallExpr(6) : A[B]
-CallExpr(6) : B
-NameExpr(6) : def (a: A[B]) -> A[A[B]]
-NameExpr(6) : def (a: B) -> A[B]
-NameExpr(6) : def () -> B
-
-
--- Generic inheritance
--- -------------------
-
-
-[case testInheritedMethodReferenceWithGenericInheritance]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class C: pass
-class A(Generic[T]):
-  def f(self, a: T) -> None: pass
-class B(A[C]):
-  def g(self, c: C) -> None:
-    self.f(c)
-[out]
-CallExpr(8) : void
-MemberExpr(8) : def (a: C)
-NameExpr(8) : C
-NameExpr(8) : B
-
-[case testInheritedMethodReferenceWithGenericSubclass]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-class C: pass
-class A(Generic[S, T]):
-  def f(self, a: C) -> None: pass
-class B(A[C, T], Generic[T]):
-  def g(self, c: C) -> None:
-    self.f(c)
-[out]
-CallExpr(9) : void
-MemberExpr(9) : def (a: C)
-NameExpr(9) : C
-NameExpr(9) : B[T`1]
-
-[case testExternalReferenceWithGenericInheritance]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class C: pass
-class A(Generic[T]):
-  def f(self, a: T) -> None: pass
-class B(A[C]): pass
-b = None # type: B
-c = None # type: C
-b.f(c)
-[out]
-CallExpr(9) : void
-MemberExpr(9) : def (a: C)
-NameExpr(9) : B
-NameExpr(9) : C
-
-
--- Implicit Any types
--- ------------------
-
-
-[case testDynamicallyTypedFunction]
-
-def f(x):
-  y = x + o
-  z = o
-  z
-o = None # type: object
-[out]
-NameExpr(3) : builtins.object
-NameExpr(3) : Any
-NameExpr(3) : Any
-OpExpr(3) : Any
-NameExpr(4) : builtins.object
-NameExpr(4) : Any
-NameExpr(5) : Any
-
-[case testDynamicallyTypedMethod]
-
-class A:
-  def f(self, x):
-    y = (
-         o)  # Place y and o on separate lines
-    x
-    y
-o = None # type: object
-[out]
-NameExpr(4) : Any
-NameExpr(5) : builtins.object
-NameExpr(6) : Any
-NameExpr(7) : Any
-
-[case testDynamicallyTypedConstructor]
-
-class A:
-  def __init__(self, x):
-    y = o
-    x
-    y
-o = None # type: object
-[out]
-NameExpr(4) : builtins.object
-NameExpr(4) : Any
-NameExpr(5) : Any
-NameExpr(6) : Any
-
-[case testCallInDynamicallyTypedFunction]
-
-def f():
-  g(o)
-def g(a: object) -> object: pass
-o = None # type: object
-[out]
-CallExpr(3) : Any
-NameExpr(3) : def (a: builtins.object) -> builtins.object
-NameExpr(3) : builtins.object
-
-[case testExpressionInDynamicallyTypedFn]
-import typing
-def f():
-  x = None
-  x.f()
-[out]
-CallExpr(4) : Any
-MemberExpr(4) : Any
-NameExpr(4) : Any
-
-[case testGenericCall]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def f() -> None:
-  a1 = A(b) # type: A[B]
-  a2 = A(b) # type: A[object]
-class A(Generic[T]):
-  def __init__(self, a: T) -> None: pass
-class B: pass
-b = None # type: B
-[out]
-CallExpr(4) : A[B]
-NameExpr(4) : def (a: B) -> A[B]
-NameExpr(4) : B
-CallExpr(5) : A[builtins.object]
-NameExpr(5) : def (a: builtins.object) -> A[builtins.object]
-NameExpr(5) : B
-
-[case testGenericCallInDynamicallyTypedFunction]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def f():
-  A()
-class A(Generic[T]): pass
-[out]
-CallExpr(4) : Any
-NameExpr(4) : def [T] () -> A[T`1]
-
-[case testGenericCallInDynamicallyTypedFunction2]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def f():
-  A(f)
-class A(Generic[T]):
-    def __init__(self, x: T) -> None: pass
-[out]
-CallExpr(4) : Any
-NameExpr(4) : def [T] (x: T`1) -> A[T`1]
-NameExpr(4) : def () -> Any
-
-[case testGenericCallInDynamicallyTypedFunction3]
-from typing import TypeVar
-t = TypeVar('t')
-def f():
-  g(None)
-def g(x: t) -> t: pass
-[out]
-CallExpr(4) : Any
-NameExpr(4) : def [t] (x: t`-1) -> t`-1
-
-
--- Generic types and type inference
--- --------------------------------
-
-
-[case testInferenceInArgumentContext]
-## CallExpr
-from typing import TypeVar, Generic
-T = TypeVar('T')
-f(g())
-f(h(b))
-f(h(c))
-
-b = None # type: B
-c = None # type: C
-
-def f(a: 'A[B]') -> None: pass
-
-def g() -> 'A[T]': pass
-def h(a: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-class C(B): pass
-[out]
-CallExpr(4) : void
-CallExpr(4) : A[B]
-CallExpr(5) : void
-CallExpr(5) : A[B]
-CallExpr(6) : void
-CallExpr(6) : A[B]
-
-[case testInferGenericTypeForLocalVariable]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def f() -> None:
-  a = A(b)
-  a
-  a2, a3 = A(b), A(c)
-  a2
-  a3
-b = None # type: B
-c = None # type: C
-class A(Generic[T]):
-  def __init__(self, x: T) -> None: pass
-class B: pass
-class C: pass
-[out]
-CallExpr(4) : A[B]
-NameExpr(4) : def (x: B) -> A[B]
-NameExpr(4) : A[B]
-NameExpr(4) : B
-NameExpr(5) : A[B]
-CallExpr(6) : A[B]
-CallExpr(6) : A[C]
-NameExpr(6) : def (x: B) -> A[B]
-NameExpr(6) : def (x: C) -> A[C]
-NameExpr(6) : A[B]
-NameExpr(6) : A[C]
-NameExpr(6) : B
-NameExpr(6) : C
-NameExpr(7) : A[B]
-NameExpr(8) : A[C]
-
-[case testNestedGenericCalls]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-def h() -> None:
-  g(f(c))
-
-c = None # type: C
-
-class A(Generic[T]): pass
-class B(Generic[T]): pass
-class C: pass
-def f(a: T) -> A[T]: pass
-def g(a: S) -> B[S]: pass
-[out]
-CallExpr(5) : A[C]
-CallExpr(5) : B[A[C]]
-NameExpr(5) : C
-NameExpr(5) : def (a: C) -> A[C]
-NameExpr(5) : def (a: A[C]) -> B[A[C]]
-
-[case testInferListLiterals]
-from typing import List
-a = [] # type: List[A]
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-ListExpr(2) : builtins.list[A]
-
-[case testInferGenericTypeInTypeAnyContext]
-from typing import Any
-a = [] # type: Any
-[builtins fixtures/list.pyi]
-[out]
-ListExpr(2) : builtins.list[Any]
-
-[case testHigherOrderFunction]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-map(
-    f,
-    [A()])
-def map(f: Callable[[t], s], a: List[t]) -> List[s]: pass
-class A: pass
-class B: pass
-def f(a: A) -> B: pass
-[builtins fixtures/list.pyi]
-[out]
-CallExpr(4) : builtins.list[B]
-NameExpr(4) : def (f: def (A) -> B, a: builtins.list[A]) -> builtins.list[B]
-NameExpr(5) : def (a: A) -> B
-CallExpr(6) : A
-ListExpr(6) : builtins.list[A]
-NameExpr(6) : def () -> A
-
-
--- Lambdas
--- -------
-
-
-[case testLambdaWithTypeInferredFromContext]
-from typing import Callable
-f = lambda x: x.a # type: Callable[[B], A]
-class A: pass
-class B:
-  a = None # type: A
-[out]
-FuncExpr(2) : def (B) -> A
-MemberExpr(2) : A
-NameExpr(2) : B
-
-[case testLambdaWithInferredType]
-## FuncExpr|NameExpr
-import typing
-f = lambda: 1
-[out]
-FuncExpr(3) : def () -> builtins.int
-NameExpr(3) : def () -> builtins.int
-
-[case testLambdaWithInferredType2]
-## FuncExpr|NameExpr
-import typing
-f = lambda: [1]
-[builtins fixtures/list.pyi]
-[out]
-FuncExpr(3) : def () -> builtins.list[builtins.int]
-NameExpr(3) : def () -> builtins.list[builtins.int]
-
-[case testLambdaWithInferredType2]
-from typing import List, Callable
-f = lambda x: [] # type: Callable[[B], List[A]]
-class A: pass
-class B:
-  a = None # type: A
-[builtins fixtures/list.pyi]
-[out]
-FuncExpr(2) : def (B) -> builtins.list[A]
-ListExpr(2) : builtins.list[A]
-
-[case testLambdaAndHigherOrderFunction]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-l = None # type: List[A]
-map(
-  lambda x: f(x), l)
-def map(f: Callable[[t], s], a: List[t]) -> List[s]: pass
-class A: pass
-class B: pass
-def f(a: A) -> B: pass
-[builtins fixtures/list.pyi]
-[out]
-CallExpr(5) : builtins.list[B]
-NameExpr(5) : def (f: def (A) -> B, a: builtins.list[A]) -> builtins.list[B]
-CallExpr(6) : B
-FuncExpr(6) : def (A) -> B
-NameExpr(6) : def (a: A) -> B
-NameExpr(6) : builtins.list[A]
-NameExpr(6) : A
-
-[case testLambdaAndHigherOrderFunction2]
-## FuncExpr|NameExpr|ListExpr
-from typing import TypeVar, List, Callable
-t = TypeVar('t')
-s = TypeVar('s')
-l = None # type: List[A]
-map(
-  lambda x: [f(x)], l)
-def map(f: Callable[[t], List[s]], a: List[t]) -> List[s]: pass
-class A: pass
-class B: pass
-def f(a: A) -> B: pass
-[builtins fixtures/list.pyi]
-[out]
-NameExpr(6) : def (f: def (A) -> builtins.list[B], a: builtins.list[A]) -> builtins.list[B]
-FuncExpr(7) : def (A) -> builtins.list[B]
-ListExpr(7) : builtins.list[B]
-NameExpr(7) : def (a: A) -> B
-NameExpr(7) : builtins.list[A]
-NameExpr(7) : A
-
-[case testLambdaInListAndHigherOrderFunction]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-l = None # type: List[A]
-map(
-  [lambda x: x],
-  l)
-def map(f: List[Callable[[t], s]], a: List[t]) -> List[s]: pass
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
--- TODO We probably should not silently infer 'Any' types in statically typed
---      context. Perhaps just fail instead?
-CallExpr(5) : builtins.list[Any]
-NameExpr(5) : def (f: builtins.list[def (A) -> Any], a: builtins.list[A]) -> builtins.list[Any]
-FuncExpr(6) : def (A) -> A
-ListExpr(6) : builtins.list[def (A) -> Any]
-NameExpr(6) : A
-NameExpr(7) : builtins.list[A]
-
-[case testLambdaAndHigherOrderFunction3]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-l = None # type: List[A]
-map(
-  lambda x: x.b,
-  l)
-def map(f: Callable[[t], s], a: List[t]) -> List[s]: pass
-class A:
-  b = None # type: B
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-CallExpr(5) : builtins.list[B]
-NameExpr(5) : def (f: def (A) -> B, a: builtins.list[A]) -> builtins.list[B]
-FuncExpr(6) : def (A) -> B
-MemberExpr(6) : B
-NameExpr(6) : A
-NameExpr(7) : builtins.list[A]
-
-[case testLambdaAndHigherOrderFunctionAndKeywordArgs]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-l = None # type: List[A]
-map(
-  a=l,
-  f=lambda x: x.b)
-def map(f: Callable[[t], s], a: List[t]) -> List[s]: pass
-class A:
-  b = None # type: B
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-CallExpr(5) : builtins.list[B]
-NameExpr(5) : def (f: def (A) -> B, a: builtins.list[A]) -> builtins.list[B]
-NameExpr(6) : builtins.list[A]
-FuncExpr(7) : def (A) -> B
-MemberExpr(7) : B
-NameExpr(7) : A
-
-
--- Boolean operations
--- ------------------
-
-
-[case testBooleanOr]
-from typing import List
-a = None # type: List[A]
-a or []
-a = a or []
-a = [] or a
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-ListExpr(3) : builtins.list[A]
-NameExpr(3) : builtins.list[A]
-OpExpr(3) : builtins.list[A]
-ListExpr(4) : builtins.list[A]
-NameExpr(4) : builtins.list[A]
-NameExpr(4) : builtins.list[A]
-OpExpr(4) : builtins.list[A]
-ListExpr(5) : builtins.list[A]
-NameExpr(5) : builtins.list[A]
-NameExpr(5) : builtins.list[A]
-OpExpr(5) : builtins.list[A]
-
-
--- Class attributes
--- ----------------
-
-
-[case testUnboundMethod]
-## MemberExpr
-import typing
-class A:
-    def f(self) -> None: pass
-A.f
-[out]
-MemberExpr(5) : def (self: A)
-
-[case testUnboundMethodWithImplicitSig]
-## MemberExpr
-import typing
-class A:
-    def f(self): pass
-A.f
-[out]
-MemberExpr(5) : def (self: Any) -> Any
-
-[case testOverloadedUnboundMethod]
-## MemberExpr
-from typing import overload
-class A:
-    @overload
-    def f(self) -> None: pass
-    @overload
-    def f(self, x: object) -> None: pass
-A.f
-[out]
-MemberExpr(8) : Overload(def (self: A), def (self: A, x: builtins.object))
-
-[case testOverloadedUnboundMethodWithImplicitSig]
-## MemberExpr
-from typing import overload
-class A:
-    @overload
-    def f(self): pass
-    @overload
-    def f(self, x): pass
-A.f
-[out]
-MemberExpr(8) : Overload(def (self: Any) -> Any, def (self: Any, x: Any) -> Any)
-
-[case testUnboundMethodWithInheritance]
-## MemberExpr
-import typing
-class A:
-    def __init__(self) -> None: pass
-    def f(self) -> None: pass
-class B(A):
-    pass
-B.f
-[out]
-MemberExpr(8) : def (self: A)
-
-[case testUnboundGenericMethod]
-## MemberExpr
-from typing import TypeVar
-t = TypeVar('t')
-class B: pass
-class A:
-    def f(self, x: t) -> None: pass
-A.f(A(), B())
-[out]
-MemberExpr(7) : def (self: A, x: B)
-
-[case testUnboundMethodOfGenericClass]
-## MemberExpr
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class B: pass
-class A(Generic[t]):
-    def f(self, x: t) -> None: pass
-A.f
-a_b = A() # type: A[B]
-A.f(a_b, B())
-[out]
-MemberExpr(7) : def [t] (self: A[t`1], x: t`1)
-MemberExpr(9) : def (self: A[B], x: B)
-
-[case testUnboundOverloadedMethodOfGenericClass]
-## CallExpr
-from typing import TypeVar, Generic, overload
-t = TypeVar('t')
-class B: pass
-class A(Generic[t]):
-    @overload
-    def f(self, x: t) -> t: pass
-    @overload
-    def f(self) -> object: pass
-ab, b = None, None # type: (A[B], B)
-A.f(ab, b)
-[out]
-CallExpr(11) : B
-
-[case testUnboundMethodOfGenericClassWithImplicitSig]
-## MemberExpr
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class B: pass
-class A(Generic[t]):
-    def f(self, x): pass
-A.f(None, None)
-[out]
-MemberExpr(7) : def (self: Any, x: Any) -> Any
-
-[case testGenericMethodOfGenericClass]
-## MemberExpr
-from typing import TypeVar, Generic
-t = TypeVar('t')
-s = TypeVar('s')
-class B: pass
-class A(Generic[t]):
-    def f(self, y: s) -> None: pass
-ab = None # type: A[B]
-o = None # type: object
-A.f(ab, o)
-[out]
-MemberExpr(10) : def (self: A[B], y: builtins.object)
-
-
--- Type variables with value restriction
--- -------------------------------------
-
-
-[case testTypeVariableWithValueRestriction]
-## NameExpr
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> None: pass
-f(1)
-f('x')
-[out]
-NameExpr(5) : def (x: builtins.int)
-NameExpr(6) : def (x: builtins.str)
-
-[case testTypeVariableWithValueRestrictionAndSubtype]
-## NameExpr|CallExpr
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T: pass
-class S(str): pass
-s = None # type: S
-f(s)
-[out]
-CallExpr(7) : builtins.str
-NameExpr(7) : def (x: builtins.str) -> builtins.str
-NameExpr(7) : S
-
-
--- Binary operations
--- -----------------
-
-
-[case testBinaryOperatorWithAnyLeftOperand]
-## OpExpr
-from typing import Any
-class B:
-    def __add__(self, x: int) -> str: pass
-class A:
-    def __radd__(self, x: B) -> int: pass
-Any(1) + A()
-B() + A()
-[out]
-OpExpr(7) : Any
-OpExpr(8) : builtins.int
-
-[case testBinaryOperatorWithAnyRightOperand]
-## OpExpr
-from typing import Any
-class A:
-    def __add__(self, x: str) -> int: pass
-A() + Any(1)
-[out]
-OpExpr(5) : Any
-
-
--- Callable overloading
--- --------------------
-
-
-[case testOverloadedFunctionType]
-## CallExpr
-from typing import overload
- at overload
-def f(x: int) -> str: pass
- at overload
-def f(x: str) -> int: pass
-f(1)
-f('')
-[out]
-CallExpr(7) : builtins.str
-CallExpr(8) : builtins.int
-
-[case testOverlappingOverloadedFunctionType]
-## CallExpr
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def f(x: B) -> B: pass
- at overload
-def f(x: A) -> A: pass
-a = None # type: A
-b = None # type: B
-f(a)
-f(b)
-[out]
-CallExpr(11) : A
-CallExpr(12) : B
-
-
-
-[case testOverloadedErasedType]
-from typing import Callable
-from typing import List
-from typing import overload
-from typing import TypeVar
-
-T = TypeVar("T")
-V = TypeVar("V")
-
-def fun(s: int) -> int: pass
-
-def m(fun: Callable[[T], V], iter: List[T]) -> None: pass
-
-nums = [1] # type: List[int]
-m(fun,
-  nums)
-[builtins fixtures/list.pyi]
-[out]
-IntExpr(13) : builtins.int
-ListExpr(13) : builtins.list[builtins.int]
-CallExpr(14) : void
-NameExpr(14) : def (s: builtins.int) -> builtins.int
-NameExpr(14) : def (fun: def (builtins.int) -> builtins.int, iter: builtins.list[builtins.int])
-NameExpr(15) : builtins.list[builtins.int]
-
-
--- Special cases
--- -------------
-
-
-[case testImplicitDataAttributeInit]
-## NameExpr
-import typing
-class A:
-    def __init__(self) -> None:
-        self.x = (
-                  A())
-[out]
-NameExpr(5) : A
-NameExpr(6) : def () -> A
-
-[case testListMultiplicationInContext]
-## ListExpr|OpExpr|IntExpr
-from typing import List
-a = [None] * 3 # type: List[str]
-[builtins fixtures/list.pyi]
-[out]
-IntExpr(3) : builtins.int
-ListExpr(3) : builtins.list[builtins.str]
-OpExpr(3) : builtins.list[builtins.str]
-
-
--- TODO
---
--- test expressions
---   list literal
---   tuple literal
---   unary minus
---   indexing
---   super expression
---   more complex lambda (multiple arguments etc.)
---   list comprehension
---   generator expression
--- overloads
--- other things
---   type inference
---   default argument value
---   for loop variable
---   exception variable
---   varargs
--- generics
---   explicit types
--- type of 'None' (currently stripped, but sometimes we may want to dump it)
diff --git a/test-requirements.txt b/test-requirements.txt
deleted file mode 100644
index 5ce8f80..0000000
--- a/test-requirements.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-flake8
-flake8-bugbear; python_version >= '3.5'
-flake8-pyi; python_version >= '3.5'
-lxml; sys_platform != 'win32'
-typed-ast>=0.6.3; sys_platform != 'win32' or python_version >= '3.5'
-pytest>=2.8
-pytest-xdist>=1.13
-pytest-cov>=2.4.0
-typing>=3.5.2; python_version < '3.5'
diff --git a/tmp-test-dirs/.gitignore b/tmp-test-dirs/.gitignore
deleted file mode 100644
index e6579d8..0000000
--- a/tmp-test-dirs/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-# This directory is used to store temporary directories for the testsuite.
-# If anything manages to exist here, it means python crashed instead of
-# calling tempfile.TemporaryDirectory's cleanup while unwinding.
-# Therefore, don't actually provide any ignore patterns.
diff --git a/typeshed/stdlib/2/BaseHTTPServer.pyi b/typeshed/stdlib/2/BaseHTTPServer.pyi
new file mode 100644
index 0000000..8bb34b8
--- /dev/null
+++ b/typeshed/stdlib/2/BaseHTTPServer.pyi
@@ -0,0 +1,47 @@
+# Stubs for BaseHTTPServer (Python 2.7)
+
+from typing import Any, BinaryIO, Mapping, Optional, Tuple, Union
+import SocketServer
+import mimetools
+
+class HTTPServer(SocketServer.TCPServer):
+    server_name = ...  # type: str
+    server_port = ...  # type: int
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type) -> None: ...
+
+class BaseHTTPRequestHandler:
+    client_address = ...  # type: Tuple[str, int]
+    server = ...  # type: SocketServer.BaseServer
+    close_connection = ...  # type: bool
+    command = ...  # type: str
+    path = ...  # type: str
+    request_version = ...  # type: str
+    headers = ...  # type: mimetools.Message
+    rfile = ...  # type: BinaryIO
+    wfile = ...  # type: BinaryIO
+    server_version = ...  # type: str
+    sys_version = ...  # type: str
+    error_message_format = ...  # type: str
+    error_content_type = ...  # type: str
+    protocol_version = ...  # type: str
+    MessageClass = ...  # type: type
+    responses = ...  # type: Mapping[int, Tuple[str, str]]
+    def __init__(self, request: bytes, client_address: Tuple[str, int],
+                 server: SocketServer.BaseServer) -> None: ...
+    def handle(self) -> None: ...
+    def handle_one_request(self) -> None: ...
+    def send_error(self, code: int, message: Optional[str] = ...) -> None: ...
+    def send_response(self, code: int,
+                      message: Optional[str] = ...) -> None: ...
+    def send_header(self, keyword: str, value: str) -> None: ...
+    def end_headers(self) -> None: ...
+    def flush_headers(self) -> None: ...
+    def log_request(self, code: Union[int, str] = ...,
+                    size: Union[int, str] = ...) -> None: ...
+    def log_error(self, format: str, *args: Any) -> None: ...
+    def log_message(self, format: str, *args: Any) -> None: ...
+    def version_string(self) -> str: ...
+    def date_time_string(self, timestamp: Optional[int] = ...) -> str: ...
+    def log_date_time_string(self) -> str: ...
+    def address_string(self) -> str: ...
diff --git a/typeshed/stdlib/2/ConfigParser.pyi b/typeshed/stdlib/2/ConfigParser.pyi
new file mode 100644
index 0000000..67b0340
--- /dev/null
+++ b/typeshed/stdlib/2/ConfigParser.pyi
@@ -0,0 +1,96 @@
+from typing import Any, IO, Sequence, Tuple, Union
+
+__all__ = ...  # type: list[str]
+DEFAULTSECT = ...  # type: str
+MAX_INTERPOLATION_DEPTH = ...  # type: int
+
+class Error(Exception):
+    message = ...  # type: Any
+    def __init__(self, msg: str = ...) -> None: ...
+    def _get_message(self) -> None: ...
+    def _set_message(self, value: str) -> None: ...
+    def __repr__(self) -> str: ...
+    def __str__(self) -> str: ...
+
+class NoSectionError(Error):
+    section = ...  # type: str
+    def __init__(self, section: str) -> None: ...
+
+class DuplicateSectionError(Error):
+    section = ...  # type: str
+    def __init__(self, section: str) -> None: ...
+
+class NoOptionError(Error):
+    section = ...  # type: str
+    option = ...  # type: str
+    def __init__(self, option: str, section: str) -> None: ...
+
+class InterpolationError(Error):
+    section = ...  # type: str
+    option = ...  # type: str
+    msg = ...  # type: str
+    def __init__(self, option: str, section: str, msg: str) -> None: ...
+
+class InterpolationMissingOptionError(InterpolationError):
+    reference = ...  # type: str
+    def __init__(self, option: str, section: str, rawval: str, reference: str) -> None: ...
+
+class InterpolationSyntaxError(InterpolationError): ...
+
+class InterpolationDepthError(InterpolationError):
+    def __init__(self, option: str, section: str, rawval: str) -> None: ...
+
+class ParsingError(Error):
+    filename = ...  # type: str
+    errors = ...  # type: list[Tuple[Any, Any]]
+    def __init__(self, filename: str) -> None: ...
+    def append(self, lineno: Any, line: Any) -> None: ...
+
+class MissingSectionHeaderError(ParsingError):
+    lineno = ...  # type: Any
+    line = ...  # type: Any
+    def __init__(self, filename: str, lineno: Any, line: Any) -> None: ...
+
+
+class RawConfigParser:
+    _dict = ...  # type: Any
+    _sections = ...  # type: dict
+    _defaults = ...  # type: dict
+    _optcre = ...  # type: Any
+    SECTCRE = ...  # type: Any
+    OPTCRE = ...  # type: Any
+    OPTCRE_NV = ...  # type: Any
+    def __init__(self, defaults: dict[Any, Any] = ..., dict_type: Any = ..., allow_no_value: bool = ...) -> None: ...
+    def defaults(self) -> dict[Any, Any]: ...
+    def sections(self) -> list[str]: ...
+    def add_section(self, section: str) -> None: ...
+    def has_section(self, section: str) -> bool: ...
+    def options(self, section: str) -> list[str]: ...
+    def read(self, filenames: Union[str, Sequence[str]]) -> list[str]: ...
+    def readfp(self, fp: IO[str], filename: str = ...) -> None: ...
+    def get(self, section: str, option: str) -> str: ...
+    def items(self, section: str) -> list[Tuple[Any, Any]]: ...
+    def _get(self, section: str, conv: type, option: str) -> Any: ...
+    def getint(self, section: str, option: str) -> int: ...
+    def getfloat(self, section: str, option: str) -> float: ...
+    _boolean_states = ...  # type: dict[str, bool]
+    def getboolean(self, section: str, option: str) -> bool: ...
+    def optionxform(self, optionstr: str) -> str: ...
+    def has_option(self, section: str, option: str) -> bool: ...
+    def set(self, section: str, option: str, value: Any = ...) -> None: ...
+    def write(self, fp: file) -> None: ...
+    def remove_option(self, section: str, option: Any) -> bool: ...
+    def remove_section(self, section: str) -> bool: ...
+    def _read(self, fp: file, fpname: str) -> None: ...
+
+class ConfigParser(RawConfigParser):
+    _KEYCRE = ...  # type: Any
+    def get(self, section: str, option: str, raw: bool = ..., vars: dict = ...) -> Any: ...
+    def items(self, section: str, raw: bool = ..., vars: dict = ...) -> list[Tuple[str, Any]]: ...
+    def _interpolate(self, section: str, option: str, rawval: Any, vars: Any) -> str: ...
+    def _interpolation_replace(self, match: Any) -> str: ...
+
+class SafeConfigParser(ConfigParser):
+    _interpvar_re = ...  # type: Any
+    def _interpolate(self, section: str, option: str, rawval: Any, vars: Any) -> str: ...
+    def _interpolate_some(self, option: str, accum: list, rest: str, section: str, map: dict, depth: int) -> None: ...
diff --git a/typeshed/stdlib/2/Cookie.pyi b/typeshed/stdlib/2/Cookie.pyi
new file mode 100644
index 0000000..2df4eb0
--- /dev/null
+++ b/typeshed/stdlib/2/Cookie.pyi
@@ -0,0 +1,44 @@
+# Stubs for Cookie (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class CookieError(Exception): ...
+
+class Morsel(dict):
+    key = ...  # type: Any
+    def __init__(self): ...
+    def __setitem__(self, K, V): ...
+    def isReservedKey(self, K): ...
+    value = ...  # type: Any
+    coded_value = ...  # type: Any
+    def set(self, key, val, coded_val, LegalChars=..., idmap=..., translate=...): ...
+    def output(self, attrs=None, header=...): ...
+    def js_output(self, attrs=None): ...
+    def OutputString(self, attrs=None): ...
+
+class BaseCookie(dict):
+    def value_decode(self, val): ...
+    def value_encode(self, val): ...
+    def __init__(self, input=None): ...
+    def __setitem__(self, key, value): ...
+    def output(self, attrs=None, header=..., sep=...): ...
+    def js_output(self, attrs=None): ...
+    def load(self, rawdata): ...
+
+class SimpleCookie(BaseCookie):
+    def value_decode(self, val): ...
+    def value_encode(self, val): ...
+
+class SerialCookie(BaseCookie):
+    def __init__(self, input=None): ...
+    def value_decode(self, val): ...
+    def value_encode(self, val): ...
+
+class SmartCookie(BaseCookie):
+    def __init__(self, input=None): ...
+    def value_decode(self, val): ...
+    def value_encode(self, val): ...
+
+Cookie = ...  # type: Any
diff --git a/typeshed/stdlib/2/HTMLParser.pyi b/typeshed/stdlib/2/HTMLParser.pyi
new file mode 100644
index 0000000..989e14c
--- /dev/null
+++ b/typeshed/stdlib/2/HTMLParser.pyi
@@ -0,0 +1,31 @@
+from typing import List, Tuple, AnyStr
+from markupbase import ParserBase
+
+class HTMLParser(ParserBase):
+    def __init__(self) -> None: ...
+    def feed(self, feed: AnyStr) -> None: ...
+    def close(self) -> None: ...
+    def reset(self) -> None: ...
+
+    def get_starttag_text(self) -> AnyStr: ...
+    def set_cdata_mode(self, AnyStr) -> None: ...
+    def clear_cdata_mode(self) -> None: ...
+
+    def handle_startendtag(self, tag: AnyStr, attrs: List[Tuple[AnyStr, AnyStr]]): ...
+    def handle_starttag(self, tag: AnyStr, attrs: List[Tuple[AnyStr, AnyStr]]): ...
+    def handle_endtag(self, tag: AnyStr): ...
+    def handle_charref(self, name: AnyStr): ...
+    def handle_entityref(self, name: AnyStr): ...
+    def handle_data(self, data: AnyStr): ...
+    def handle_comment(self, data: AnyStr): ...
+    def handle_decl(self, decl: AnyStr): ...
+    def handle_pi(self, data: AnyStr): ...
+
+    def unknown_decl(self, data: AnyStr): ...
+
+    def unescape(self, s: AnyStr) -> AnyStr: ...
+
+class HTMLParseError(Exception):
+    msg = ...  # type: str
+    lineno = ...  # type: int
+    offset = ...  # type: int
diff --git a/typeshed/stdlib/2/Queue.pyi b/typeshed/stdlib/2/Queue.pyi
new file mode 100644
index 0000000..831b96c
--- /dev/null
+++ b/typeshed/stdlib/2/Queue.pyi
@@ -0,0 +1,29 @@
+# Stubs for Queue (Python 2)
+
+from typing import Any, TypeVar, Generic, Optional
+
+_T = TypeVar('_T')
+
+class Empty(Exception): ...
+class Full(Exception): ...
+
+class Queue(Generic[_T]):
+    maxsize = ...  # type: Any
+    mutex = ...  # type: Any
+    not_empty = ...  # type: Any
+    not_full = ...  # type: Any
+    all_tasks_done = ...  # type: Any
+    unfinished_tasks = ...  # type: Any
+    def __init__(self, maxsize: int = ...) -> None: ...
+    def task_done(self) -> None: ...
+    def join(self) -> None: ...
+    def qsize(self) -> int: ...
+    def empty(self) -> bool: ...
+    def full(self) -> bool: ...
+    def put(self, item: _T, block: bool = ..., timeout: Optional[float] = ...) -> None: ...
+    def put_nowait(self, item: _T) -> None: ...
+    def get(self, block: bool = ..., timeout: Optional[float] = ...) -> _T: ...
+    def get_nowait(self) -> _T: ...
+
+class PriorityQueue(Queue): ...
+class LifoQueue(Queue): ...
diff --git a/typeshed/stdlib/2/SocketServer.pyi b/typeshed/stdlib/2/SocketServer.pyi
new file mode 100644
index 0000000..14a739b
--- /dev/null
+++ b/typeshed/stdlib/2/SocketServer.pyi
@@ -0,0 +1,93 @@
+# Stubs for socketserver
+
+from typing import Any, BinaryIO, Optional, Tuple
+from socket import SocketType
+import sys
+import types
+
+class BaseServer:
+    address_family = ...  # type: int
+    RequestHandlerClass = ...  # type: type
+    server_address = ...  # type: Tuple[str, int]
+    socket = ...  # type: SocketType
+    allow_reuse_address = ...  # type: bool
+    request_queue_size = ...  # type: int
+    socket_type = ...  # type: int
+    timeout = ...  # type: Optional[float]
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type) -> None: ...
+    def fileno(self) -> int: ...
+    def handle_request(self) -> None: ...
+    def serve_forever(self, poll_interval: float = ...) -> None: ...
+    def shutdown(self) -> None: ...
+    def server_close(self) -> None: ...
+    def finish_request(self) -> None: ...
+    def get_request(self) -> None: ...
+    def handle_error(self, request: bytes,
+                     client_address: Tuple[str, int]) -> None: ...
+    def handle_timeout(self) -> None: ...
+    def process_request(self, request: bytes,
+                        client_address: Tuple[str, int]) -> None: ...
+    def server_activate(self) -> None: ...
+    def server_bind(self) -> None: ...
+    def verify_request(self, request: bytes,
+                       client_address: Tuple[str, int]) -> bool: ...
+    if sys.version_info >= (3, 6):
+        def __enter__(self) -> 'BaseServer': ...
+        def __exit__(self, exc_type: Optional[type],
+                     exc_val: Optional[Exception],
+                     exc_tb: Optional[types.TracebackType]) -> bool: ...
+    if sys.version_info >= (3, 3):
+        def service_actions(self) -> None: ...
+
+class TCPServer(BaseServer):
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type,
+                 bind_and_activate: bool = ...) -> None: ...
+
+class UDPServer(BaseServer):
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type,
+                 bind_and_activate: bool = ...) -> None: ...
+
+class UnixStreamServer(BaseServer):
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type,
+                 bind_and_activate: bool = ...) -> None: ...
+
+class UnixDatagramServer(BaseServer):
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type,
+                 bind_and_activate: bool = ...) -> None: ...
+
+class ForkingMixIn: ...
+class ThreadingMixIn: ...
+
+class ForkingTCPServer(ForkingMixIn, TCPServer): ...
+class ForkingUDPServer(ForkingMixIn, UDPServer): ...
+class ThreadingTCPServer(ThreadingMixIn, TCPServer): ...
+class ThreadingUDPServer(ThreadingMixIn, UDPServer): ...
+
+
+class BaseRequestHandler:
+    # Those are technically of types, respectively:
+    # * Union[SocketType, Tuple[bytes, SocketType]]
+    # * Union[Tuple[str, int], str]
+    # But there are some concerns that having unions here would cause
+    # too much inconvenience to people using it (see
+    # https://github.com/python/typeshed/pull/384#issuecomment-234649696)
+    request = ...  # type: Any
+    client_address = ...  # type: Any
+
+    server = ...  # type: BaseServer
+    def setup(self) -> None: ...
+    def handle(self) -> None: ...
+    def finish(self) -> None: ...
+
+class StreamRequestHandler(BaseRequestHandler):
+    rfile = ...  # type: BinaryIO
+    wfile = ...  # type: BinaryIO
+
+class DatagramRequestHandler(BaseRequestHandler):
+    rfile = ...  # type: BinaryIO
+    wfile = ...  # type: BinaryIO
diff --git a/typeshed/stdlib/2/StringIO.pyi b/typeshed/stdlib/2/StringIO.pyi
new file mode 100644
index 0000000..bf77516
--- /dev/null
+++ b/typeshed/stdlib/2/StringIO.pyi
@@ -0,0 +1,30 @@
+# Stubs for StringIO (Python 2)
+
+from typing import Any, IO, AnyStr, Iterator, Iterable, Generic, List
+
+class StringIO(IO[AnyStr], Generic[AnyStr]):
+    closed = ...  # type: bool
+    softspace = ...  # type: int
+    len = ...  # type: int
+    name = ...  # type: str
+    def __init__(self, buf: AnyStr = ...) -> None: ...
+    def __iter__(self) -> Iterator[AnyStr]: ...
+    def next(self) -> AnyStr: ...
+    def close(self) -> None: ...
+    def isatty(self) -> bool: ...
+    def seek(self, pos: int, mode: int = ...) -> None: ...
+    def tell(self) -> int: ...
+    def read(self, n: int = ...) -> AnyStr: ...
+    def readline(self, length: int = ...) -> AnyStr: ...
+    def readlines(self, sizehint: int = ...) -> List[AnyStr]: ...
+    def truncate(self, size: int = ...) -> int: ...
+    def write(self, s: AnyStr) -> None: ...
+    def writelines(self, iterable: Iterable[AnyStr]) -> None: ...
+    def flush(self) -> None: ...
+    def getvalue(self) -> AnyStr: ...
+    def __enter__(self) -> Any: ...
+    def __exit__(self, type: Any, value: Any, traceback: Any) -> Any: ...
+    def fileno(self) -> int: ...
+    def readable(self) -> bool: ...
+    def seekable(self) -> bool: ...
+    def writable(self) -> bool: ...
diff --git a/typeshed/stdlib/2/UserDict.pyi b/typeshed/stdlib/2/UserDict.pyi
new file mode 100644
index 0000000..a30c2e9
--- /dev/null
+++ b/typeshed/stdlib/2/UserDict.pyi
@@ -0,0 +1,38 @@
+from typing import (Any, Container, Dict, Generic, Iterable, Iterator, List,
+                    Mapping, Sized, Tuple, TypeVar, overload)
+
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+class UserDict(Dict[_KT, _VT], Generic[_KT, _VT]):
+    data = ...  # type: Mapping[_KT, _VT]
+
+    def __init__(self, initialdata: Mapping[_KT, _VT] = ...) -> None: ...
+
+    # TODO: __iter__ is not available for UserDict
+
+class IterableUserDict(UserDict[_KT, _VT], Generic[_KT, _VT]):
+    ...
+
+class DictMixin(Sized, Iterable[_KT], Container[_KT], Generic[_KT, _VT]):
+    def has_key(self, key: _KT) -> bool: ...
+
+    # From  typing.Mapping[_KT, _VT]
+    # (can't inherit because of keys())
+    def get(self, k: _KT, default: _VT = ...) -> _VT: ...
+    def values(self) -> List[_VT]: ...
+    def items(self) -> List[Tuple[_KT, _VT]]: ...
+    def iterkeys(self) -> Iterator[_KT]: ...
+    def itervalues(self) -> Iterator[_VT]: ...
+    def iteritems(self) -> Iterator[Tuple[_KT, _VT]]: ...
+    def __contains__(self, o: Any) -> bool: ...
+
+    # From typing.MutableMapping[_KT, _VT]
+    def clear(self) -> None: ...
+    def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
+    def popitem(self) -> Tuple[_KT, _VT]: ...
+    def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
+    @overload
+    def update(self, m: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+    @overload
+    def update(self, m: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
diff --git a/typeshed/stdlib/2/UserList.pyi b/typeshed/stdlib/2/UserList.pyi
new file mode 100644
index 0000000..4f31b93
--- /dev/null
+++ b/typeshed/stdlib/2/UserList.pyi
@@ -0,0 +1,3 @@
+import collections
+
+class UserList(collections.MutableSequence): ...
diff --git a/typeshed/stdlib/2/UserString.pyi b/typeshed/stdlib/2/UserString.pyi
new file mode 100644
index 0000000..3a26a7c
--- /dev/null
+++ b/typeshed/stdlib/2/UserString.pyi
@@ -0,0 +1,4 @@
+import collections
+
+class UserString(collections.Sequence): ...
+class MutableString(UserString, collections.MutableSequence): ...
diff --git a/typeshed/stdlib/2/__builtin__.pyi b/typeshed/stdlib/2/__builtin__.pyi
new file mode 100644
index 0000000..e8d4ae0
--- /dev/null
+++ b/typeshed/stdlib/2/__builtin__.pyi
@@ -0,0 +1,947 @@
+# Stubs for builtins (Python 2.7)
+
+# True and False are deliberately omitted because they are keywords in
+# Python 3, and stub files conform to Python 3 syntax.
+
+from typing import (
+    TypeVar, Iterator, Iterable, overload,
+    Sequence, Mapping, Tuple, List, Any, Dict, Callable, Generic, Set,
+    AbstractSet, FrozenSet, Sized, Reversible, SupportsInt, SupportsFloat, SupportsAbs,
+    SupportsRound, IO, BinaryIO, Union, AnyStr, MutableSequence, MutableMapping,
+    MutableSet, ItemsView, KeysView, ValuesView, Optional, Container,
+)
+from abc import abstractmethod, ABCMeta
+from mypy_extensions import NoReturn
+
+_T = TypeVar('_T')
+_T_co = TypeVar('_T_co', covariant=True)
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+_S = TypeVar('_S')
+_T1 = TypeVar('_T1')
+_T2 = TypeVar('_T2')
+_T3 = TypeVar('_T3')
+_T4 = TypeVar('_T4')
+_TT = TypeVar('_TT', bound='type')
+
+class staticmethod: pass   # Special, only valid as a decorator.
+class classmethod: pass  # Special, only valid as a decorator.
+
+class object:
+    __doc__ = ...  # type: Optional[str]
+    __class__ = ...  # type: type
+    __slots__ = ...  # type: Optional[Union[str, unicode, Iterable[Union[str, unicode]]]]
+
+    def __init__(self) -> None: ...
+    def __new__(cls) -> Any: ...
+    def __setattr__(self, name: str, value: Any) -> None: ...
+    def __eq__(self, o: object) -> bool: ...
+    def __ne__(self, o: object) -> bool: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __hash__(self) -> int: ...
+    def __format__(self, format_spec: str) -> str: ...
+    def __getattribute__(self, name: str) -> Any: ...
+    def __delattr__(self, name: str) -> None: ...
+
+class type:
+    __bases__ = ...  # type: Tuple[type, ...]
+    __name__ = ...  # type: str
+    __module__ = ...  # type: str
+    __dict__ = ...  # type: Dict[unicode, Any]
+
+    @overload
+    def __init__(self, o: object) -> None: ...
+    @overload
+    def __init__(self, name: str, bases: Tuple[type, ...], dict: Dict[str, Any]) -> None: ...
+    # TODO: __new__ may have to be special and not a static method.
+    @overload
+    def __new__(cls, o: object) -> type: ...
+    @overload
+    def __new__(cls, name: str, bases: Tuple[type, ...], namespace: Dict[str, Any]) -> type: ...
+    def __call__(self, *args: Any, **kwds: Any) -> Any: ...
+
+    # Only new-style classes
+    __mro__ = ...  # type: Tuple[type, ...]
+    # Note: the documentation doesnt specify what the return type is, the standard
+    # implementation seems to be returning a list.
+    def mro(self) -> List[type]: ...
+    def __subclasses__(self: _TT) -> List[_TT]: ...
+
+class int(SupportsInt, SupportsFloat, SupportsAbs[int]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, x: SupportsInt) -> None: ...
+    @overload
+    def __init__(self, x: Union[str, unicode, bytearray], base: int = 10) -> None: ...
+    def bit_length(self) -> int: ...
+
+    def __add__(self, x: int) -> int: ...
+    def __sub__(self, x: int) -> int: ...
+    def __mul__(self, x: int) -> int: ...
+    def __floordiv__(self, x: int) -> int: ...
+    def __div__(self, x: int) -> int: ...
+    def __truediv__(self, x: int) -> float: ...
+    def __mod__(self, x: int) -> int: ...
+    def __radd__(self, x: int) -> int: ...
+    def __rsub__(self, x: int) -> int: ...
+    def __rmul__(self, x: int) -> int: ...
+    def __rfloordiv__(self, x: int) -> int: ...
+    def __rdiv__(self, x: int) -> int: ...
+    def __rtruediv__(self, x: int) -> float: ...
+    def __rmod__(self, x: int) -> int: ...
+    def __pow__(self, x: int) -> Any: ...  # Return type can be int or float, depending on x.
+    def __rpow__(self, x: int) -> Any: ...
+    def __and__(self, n: int) -> int: ...
+    def __or__(self, n: int) -> int: ...
+    def __xor__(self, n: int) -> int: ...
+    def __lshift__(self, n: int) -> int: ...
+    def __rshift__(self, n: int) -> int: ...
+    def __rand__(self, n: int) -> int: ...
+    def __ror__(self, n: int) -> int: ...
+    def __rxor__(self, n: int) -> int: ...
+    def __rlshift__(self, n: int) -> int: ...
+    def __rrshift__(self, n: int) -> int: ...
+    def __neg__(self) -> int: ...
+    def __pos__(self) -> int: ...
+    def __invert__(self) -> int: ...
+
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: int) -> bool: ...
+    def __le__(self, x: int) -> bool: ...
+    def __gt__(self, x: int) -> bool: ...
+    def __ge__(self, x: int) -> bool: ...
+
+    def __str__(self) -> str: ...
+    def __float__(self) -> float: ...
+    def __int__(self) -> int: ...
+    def __abs__(self) -> int: ...
+    def __hash__(self) -> int: ...
+
+class float(SupportsFloat, SupportsInt, SupportsAbs[float]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, x: SupportsFloat) -> None: ...
+    @overload
+    def __init__(self, x: unicode) -> None: ...
+    @overload
+    def __init__(self, x: bytearray) -> None: ...
+    def as_integer_ratio(self) -> Tuple[int, int]: ...
+    def hex(self) -> str: ...
+    def is_integer(self) -> bool: ...
+    @classmethod
+    def fromhex(cls, s: str) -> float: ...
+
+    def __add__(self, x: float) -> float: ...
+    def __sub__(self, x: float) -> float: ...
+    def __mul__(self, x: float) -> float: ...
+    def __floordiv__(self, x: float) -> float: ...
+    def __div__(self, x: float) -> float: ...
+    def __truediv__(self, x: float) -> float: ...
+    def __mod__(self, x: float) -> float: ...
+    def __pow__(self, x: float) -> float: ...
+    def __radd__(self, x: float) -> float: ...
+    def __rsub__(self, x: float) -> float: ...
+    def __rmul__(self, x: float) -> float: ...
+    def __rfloordiv__(self, x: float) -> float: ...
+    def __rdiv__(self, x: float) -> float: ...
+    def __rtruediv__(self, x: float) -> float: ...
+    def __rmod__(self, x: float) -> float: ...
+    def __rpow__(self, x: float) -> float: ...
+
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: float) -> bool: ...
+    def __le__(self, x: float) -> bool: ...
+    def __gt__(self, x: float) -> bool: ...
+    def __ge__(self, x: float) -> bool: ...
+    def __neg__(self) -> float: ...
+    def __pos__(self) -> float: ...
+
+    def __str__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __abs__(self) -> float: ...
+    def __hash__(self) -> int: ...
+
+class complex(SupportsAbs[float]):
+    @overload
+    def __init__(self, re: float = 0.0, im: float = 0.0) -> None: ...
+    @overload
+    def __init__(self, s: str) -> None: ...
+
+    @property
+    def real(self) -> float: ...
+    @property
+    def imag(self) -> float: ...
+
+    def conjugate(self) -> complex: ...
+
+    def __add__(self, x: complex) -> complex: ...
+    def __sub__(self, x: complex) -> complex: ...
+    def __mul__(self, x: complex) -> complex: ...
+    def __pow__(self, x: complex) -> complex: ...
+    def __div__(self, x: complex) -> complex: ...
+    def __truediv__(self, x: complex) -> complex: ...
+    def __radd__(self, x: complex) -> complex: ...
+    def __rsub__(self, x: complex) -> complex: ...
+    def __rmul__(self, x: complex) -> complex: ...
+    def __rpow__(self, x: complex) -> complex: ...
+    def __rdiv__(self, x: complex) -> complex: ...
+    def __rtruediv__(self, x: complex) -> complex: ...
+
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __neg__(self) -> complex: ...
+    def __pos__(self) -> complex: ...
+
+    def __str__(self) -> str: ...
+    def __abs__(self) -> float: ...
+    def __hash__(self) -> int: ...
+
+class basestring(metaclass=ABCMeta): ...
+
+class unicode(basestring, Sequence[unicode]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, o: object) -> None: ...
+    @overload
+    def __init__(self, o: str, encoding: unicode = ..., errors: unicode = ...) -> None: ...
+    def capitalize(self) -> unicode: ...
+    def center(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+    def count(self, x: unicode) -> int: ...
+    def decode(self, encoding: unicode = ..., errors: unicode = ...) -> unicode: ...
+    def encode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+    def endswith(self, suffix: Union[unicode, Tuple[unicode, ...]], start: int = 0,
+                 end: int = ...) -> bool: ...
+    def expandtabs(self, tabsize: int = 8) -> unicode: ...
+    def find(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def format(self, *args: Any, **kwargs: Any) -> unicode: ...
+    def format_map(self, map: Mapping[unicode, Any]) -> unicode: ...
+    def index(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def isalnum(self) -> bool: ...
+    def isalpha(self) -> bool: ...
+    def isdecimal(self) -> bool: ...
+    def isdigit(self) -> bool: ...
+    def isidentifier(self) -> bool: ...
+    def islower(self) -> bool: ...
+    def isnumeric(self) -> bool: ...
+    def isprintable(self) -> bool: ...
+    def isspace(self) -> bool: ...
+    def istitle(self) -> bool: ...
+    def isupper(self) -> bool: ...
+    def join(self, iterable: Iterable[unicode]) -> unicode: ...
+    def ljust(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+    def lower(self) -> unicode: ...
+    def lstrip(self, chars: unicode = ...) -> unicode: ...
+    def partition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+    def replace(self, old: unicode, new: unicode, count: int = ...) -> unicode: ...
+    def rfind(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def rindex(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def rjust(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+    def rpartition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+    def rsplit(self, sep: Optional[unicode] = ..., maxsplit: int = ...) -> List[unicode]: ...
+    def rstrip(self, chars: unicode = ...) -> unicode: ...
+    def split(self, sep: Optional[unicode] = ..., maxsplit: int = ...) -> List[unicode]: ...
+    def splitlines(self, keepends: bool = ...) -> List[unicode]: ...
+    def startswith(self, prefix: Union[unicode, Tuple[unicode, ...]], start: int = 0,
+                   end: int = ...) -> bool: ...
+    def strip(self, chars: unicode = ...) -> unicode: ...
+    def swapcase(self) -> unicode: ...
+    def title(self) -> unicode: ...
+    def translate(self, table: Union[Dict[int, Any], unicode]) -> unicode: ...
+    def upper(self) -> unicode: ...
+    def zfill(self, width: int) -> unicode: ...
+
+    @overload
+    def __getitem__(self, i: int) -> unicode: ...
+    @overload
+    def __getitem__(self, s: slice) -> unicode: ...
+    def __getslice__(self, start: int, stop: int) -> unicode: ...
+    def __add__(self, s: unicode) -> unicode: ...
+    def __mul__(self, n: int) -> unicode: ...
+    def __mod__(self, x: Any) -> unicode: ...
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: unicode) -> bool: ...
+    def __le__(self, x: unicode) -> bool: ...
+    def __gt__(self, x: unicode) -> bool: ...
+    def __ge__(self, x: unicode) -> bool: ...
+
+    def __len__(self) -> int: ...
+    def __contains__(self, s: object) -> bool: ...
+    def __iter__(self) -> Iterator[unicode]: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __hash__(self) -> int: ...
+
+class str(basestring, Sequence[str]):
+    def __init__(self, object: object) -> None: ...
+    def capitalize(self) -> str: ...
+    def center(self, width: int, fillchar: str = ...) -> str: ...
+    def count(self, x: unicode) -> int: ...
+    def decode(self, encoding: unicode = ..., errors: unicode = ...) -> unicode: ...
+    def encode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+    def endswith(self, suffix: Union[unicode, Tuple[unicode, ...]]) -> bool: ...
+    def expandtabs(self, tabsize: int = 8) -> str: ...
+    def find(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def format(self, *args: Any, **kwargs: Any) -> str: ...
+    def index(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def isalnum(self) -> bool: ...
+    def isalpha(self) -> bool: ...
+    def isdigit(self) -> bool: ...
+    def islower(self) -> bool: ...
+    def isspace(self) -> bool: ...
+    def istitle(self) -> bool: ...
+    def isupper(self) -> bool: ...
+    def join(self, iterable: Iterable[AnyStr]) -> AnyStr: ...
+    def ljust(self, width: int, fillchar: str = ...) -> str: ...
+    def lower(self) -> str: ...
+    @overload
+    def lstrip(self, chars: str = ...) -> str: ...
+    @overload
+    def lstrip(self, chars: unicode) -> unicode: ...
+    @overload
+    def partition(self, sep: bytearray) -> Tuple[str, bytearray, str]: ...
+    @overload
+    def partition(self, sep: str) -> Tuple[str, str, str]: ...
+    @overload
+    def partition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+    def replace(self, old: AnyStr, new: AnyStr, count: int = ...) -> AnyStr: ...
+    def rfind(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def rindex(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def rjust(self, width: int, fillchar: str = ...) -> str: ...
+    @overload
+    def rpartition(self, sep: bytearray) -> Tuple[str, bytearray, str]: ...
+    @overload
+    def rpartition(self, sep: str) -> Tuple[str, str, str]: ...
+    @overload
+    def rpartition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+    @overload
+    def rsplit(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[str]: ...
+    @overload
+    def rsplit(self, sep: unicode, maxsplit: int = ...) -> List[unicode]: ...
+    @overload
+    def rstrip(self, chars: str = ...) -> str: ...
+    @overload
+    def rstrip(self, chars: unicode) -> unicode: ...
+    @overload
+    def split(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[str]: ...
+    @overload
+    def split(self, sep: unicode, maxsplit: int = ...) -> List[unicode]: ...
+    def splitlines(self, keepends: bool = ...) -> List[str]: ...
+    def startswith(self, prefix: Union[unicode, Tuple[unicode, ...]]) -> bool: ...
+    @overload
+    def strip(self, chars: str = ...) -> str: ...
+    @overload
+    def strip(self, chars: unicode) -> unicode: ...
+    def swapcase(self) -> str: ...
+    def title(self) -> str: ...
+    def translate(self, table: Optional[AnyStr], deletechars: AnyStr = ...) -> AnyStr: ...
+    def upper(self) -> str: ...
+    def zfill(self, width: int) -> str: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __hash__(self) -> int: ...
+    @overload
+    def __getitem__(self, i: int) -> str: ...
+    @overload
+    def __getitem__(self, s: slice) -> str: ...
+    def __getslice__(self, start: int, stop: int) -> str: ...
+    def __add__(self, s: AnyStr) -> AnyStr: ...
+    def __mul__(self, n: int) -> str: ...
+    def __rmul__(self, n: int) -> str: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: unicode) -> bool: ...
+    def __le__(self, x: unicode) -> bool: ...
+    def __gt__(self, x: unicode) -> bool: ...
+    def __ge__(self, x: unicode) -> bool: ...
+    def __mod__(self, x: Any) -> str: ...
+
+class bytearray(MutableSequence[int]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, x: Union[Iterable[int], str]) -> None: ...
+    @overload
+    def __init__(self, x: unicode, encoding: unicode,
+                 errors: unicode = ...) -> None: ...
+    @overload
+    def __init__(self, length: int) -> None: ...
+    def capitalize(self) -> bytearray: ...
+    def center(self, width: int, fillchar: str = ...) -> bytearray: ...
+    def count(self, x: str) -> int: ...
+    def decode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+    def endswith(self, suffix: Union[str, Tuple[str, ...]]) -> bool: ...
+    def expandtabs(self, tabsize: int = 8) -> bytearray: ...
+    def find(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+    def index(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+    def insert(self, index: int, object: int) -> None: ...
+    def isalnum(self) -> bool: ...
+    def isalpha(self) -> bool: ...
+    def isdigit(self) -> bool: ...
+    def islower(self) -> bool: ...
+    def isspace(self) -> bool: ...
+    def istitle(self) -> bool: ...
+    def isupper(self) -> bool: ...
+    def join(self, iterable: Iterable[str]) -> bytearray: ...
+    def ljust(self, width: int, fillchar: str = ...) -> bytearray: ...
+    def lower(self) -> bytearray: ...
+    def lstrip(self, chars: str = ...) -> bytearray: ...
+    def partition(self, sep: str) -> Tuple[bytearray, bytearray, bytearray]: ...
+    def replace(self, old: str, new: str, count: int = ...) -> bytearray: ...
+    def rfind(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+    def rindex(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+    def rjust(self, width: int, fillchar: str = ...) -> bytearray: ...
+    def rpartition(self, sep: str) -> Tuple[bytearray, bytearray, bytearray]: ...
+    def rsplit(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[bytearray]: ...
+    def rstrip(self, chars: str = ...) -> bytearray: ...
+    def split(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[bytearray]: ...
+    def splitlines(self, keepends: bool = ...) -> List[bytearray]: ...
+    def startswith(self, prefix: Union[str, Tuple[str, ...]]) -> bool: ...
+    def strip(self, chars: str = ...) -> bytearray: ...
+    def swapcase(self) -> bytearray: ...
+    def title(self) -> bytearray: ...
+    def translate(self, table: str) -> bytearray: ...
+    def upper(self) -> bytearray: ...
+    def zfill(self, width: int) -> bytearray: ...
+    @staticmethod
+    def fromhex(x: str) -> bytearray: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[int]: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __hash__(self) -> int: ...
+    @overload
+    def __getitem__(self, i: int) -> int: ...
+    @overload
+    def __getitem__(self, s: slice) -> bytearray: ...
+    def __getslice__(self, start: int, stop: int) -> bytearray: ...
+    @overload
+    def __setitem__(self, i: int, x: int) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, x: Union[Iterable[int], str]) -> None: ...
+    def __setslice__(self, start: int, stop: int, x: Union[Sequence[int], str]) -> None: ...
+    def __delitem__(self, i: Union[int, slice]) -> None: ...
+    def __delslice__(self, start: int, stop: int) -> None: ...
+    def __add__(self, s: str) -> bytearray: ...
+    def __mul__(self, n: int) -> bytearray: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: str) -> bool: ...
+    def __le__(self, x: str) -> bool: ...
+    def __gt__(self, x: str) -> bool: ...
+    def __ge__(self, x: str) -> bool: ...
+
+class bool(int, SupportsInt, SupportsFloat):
+    def __init__(self, o: object = ...) -> None: ...
+
+class slice:
+    start = 0
+    step = 0
+    stop = 0
+    def __init__(self, start: int, stop: int = 0, step: int = 0) -> None: ...
+
+class tuple(Sequence[_T_co], Generic[_T_co]):
+    def __init__(self, iterable: Iterable[_T_co] = ...) -> None: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, x: object) -> bool: ...
+    @overload
+    def __getitem__(self, x: int) -> _T_co: ...
+    @overload
+    def __getitem__(self, x: slice) -> Tuple[_T_co, ...]: ...
+    def __iter__(self) -> Iterator[_T_co]: ...
+    def __lt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __le__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __gt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __ge__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __add__(self, x: Tuple[_T_co, ...]) -> Tuple[_T_co, ...]: ...
+    def __mul__(self, n: int) -> Tuple[_T_co, ...]: ...
+    def __rmul__(self, n: int) -> Tuple[_T_co, ...]: ...
+    def count(self, x: Any) -> int: ...
+    def index(self, x: Any) -> int: ...
+
+class function:
+    # TODO name of the class (corresponds to Python 'function' class)
+    __name__ = ...  # type: str
+    __module__ = ...  # type: str
+
+class list(MutableSequence[_T], Generic[_T]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[_T]) -> None: ...
+    def append(self, object: _T) -> None: ...
+    def extend(self, iterable: Iterable[_T]) -> None: ...
+    def pop(self, index: int = -1) -> _T: ...
+    def index(self, object: _T, start: int = 0, stop: int = ...) -> int: ...
+    def count(self, object: _T) -> int: ...
+    def insert(self, index: int, object: _T) -> None: ...
+    def remove(self, object: _T) -> None: ...
+    def reverse(self) -> None: ...
+    def sort(self, cmp: Callable[[_T, _T], Any] = ..., key: Callable[[_T], Any] = ..., reverse: bool = ...) -> None: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __hash__(self) -> int: ...
+    @overload
+    def __getitem__(self, i: int) -> _T: ...
+    @overload
+    def __getitem__(self, s: slice) -> List[_T]: ...
+    def __getslice__(self, start: int, stop: int) -> List[_T]: ...
+    @overload
+    def __setitem__(self, i: int, o: _T) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
+    def __setslice__(self, start: int, stop: int, o: Sequence[_T]) -> None: ...
+    def __delitem__(self, i: Union[int, slice]) -> None: ...
+    def __delslice__(self, start: int, stop: int) -> None: ...
+    def __add__(self, x: List[_T]) -> List[_T]: ...
+    def __iadd__(self, x: Iterable[_T]) -> List[_T]: ...
+    def __mul__(self, n: int) -> List[_T]: ...
+    def __rmul__(self, n: int) -> List[_T]: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __reversed__(self) -> Iterator[_T]: ...
+    def __gt__(self, x: List[_T]) -> bool: ...
+    def __ge__(self, x: List[_T]) -> bool: ...
+    def __lt__(self, x: List[_T]) -> bool: ...
+    def __le__(self, x: List[_T]) -> bool: ...
+
+class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
+    # NOTE: Keyword arguments are special. If they are used, _KT must include
+    #       str, but we have no way of enforcing it here.
+    @overload
+    def __init__(self, **kwargs: _VT) -> None: ...
+    @overload
+    def __init__(self, map: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+
+    def has_key(self, k: _KT) -> bool: ...
+    def clear(self) -> None: ...
+    def copy(self) -> Dict[_KT, _VT]: ...
+    def get(self, k: _KT, default: _VT = None) -> _VT: ...
+    def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
+    def popitem(self) -> Tuple[_KT, _VT]: ...
+    def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
+    @overload
+    def update(self, m: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+    @overload
+    def update(self, m: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+    def keys(self) -> List[_KT]: ...
+    def values(self) -> List[_VT]: ...
+    def items(self) -> List[Tuple[_KT, _VT]]: ...
+    def iterkeys(self) -> Iterator[_KT]: ...
+    def itervalues(self) -> Iterator[_VT]: ...
+    def iteritems(self) -> Iterator[Tuple[_KT, _VT]]: ...
+    def viewkeys(self) -> KeysView[_KT]: ...
+    def viewvalues(self) -> ValuesView[_VT]: ...
+    def viewitems(self) -> ItemsView[_KT, _VT]: ...
+    @staticmethod
+    @overload
+    def fromkeys(seq: Sequence[_T]) -> Dict[_T, Any]: ...  # TODO: Actually a class method (mypy/issues#328)
+    @staticmethod
+    @overload
+    def fromkeys(seq: Sequence[_T], value: _S) -> Dict[_T, _S]: ...
+    def __len__(self) -> int: ...
+    def __getitem__(self, k: _KT) -> _VT: ...
+    def __setitem__(self, k: _KT, v: _VT) -> None: ...
+    def __delitem__(self, v: _KT) -> None: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_KT]: ...
+    def __str__(self) -> str: ...
+
+class set(MutableSet[_T], Generic[_T]):
+    def __init__(self, iterable: Iterable[_T] = ...) -> None: ...
+    def add(self, element: _T) -> None: ...
+    def clear(self) -> None: ...
+    def copy(self) -> set[_T]: ...
+    def difference(self, *s: Iterable[Any]) -> set[_T]: ...
+    def difference_update(self, *s: Iterable[Any]) -> None: ...
+    def discard(self, element: _T) -> None: ...
+    def intersection(self, *s: Iterable[Any]) -> set[_T]: ...
+    def intersection_update(self, *s: Iterable[Any]) -> None: ...
+    def isdisjoint(self, s: Iterable[Any]) -> bool: ...
+    def issubset(self, s: Iterable[Any]) -> bool: ...
+    def issuperset(self, s: Iterable[Any]) -> bool: ...
+    def pop(self) -> _T: ...
+    def remove(self, element: _T) -> None: ...
+    def symmetric_difference(self, s: Iterable[_T]) -> set[_T]: ...
+    def symmetric_difference_update(self, s: Iterable[_T]) -> None: ...
+    def union(self, *s: Iterable[_T]) -> set[_T]: ...
+    def update(self, *s: Iterable[_T]) -> None: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __and__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __iand__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __or__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __ior__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __sub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __isub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __xor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __ixor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __le__(self, s: AbstractSet[Any]) -> bool: ...
+    def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+    def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+    def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+    # TODO more set operations
+
+class frozenset(FrozenSet[_T], Generic[_T]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[_T]) -> None: ...
+    def copy(self) -> frozenset[_T]: ...
+    def difference(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+    def intersection(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+    def isdisjoint(self, s: Iterable[_T]) -> bool: ...
+    def issubset(self, s: Iterable[Any]) -> bool: ...
+    def issuperset(self, s: Iterable[Any]) -> bool: ...
+    def symmetric_difference(self, s: Iterable[_T]) -> frozenset[_T]: ...
+    def union(self, *s: Iterable[_T]) -> frozenset[_T]: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __and__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+    def __or__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+    def __sub__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+    def __xor__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+    def __le__(self, s: AbstractSet[Any]) -> bool: ...
+    def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+    def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+    def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+
+class enumerate(Iterator[Tuple[int, _T]], Generic[_T]):
+    def __init__(self, iterable: Iterable[_T], start: int = 0) -> None: ...
+    def __iter__(self) -> Iterator[Tuple[int, _T]]: ...
+    def next(self) -> Tuple[int, _T]: ...
+    # TODO __getattribute__
+
+class xrange(Sized, Iterable[int], Reversible[int]):
+    @overload
+    def __init__(self, stop: int) -> None: ...
+    @overload
+    def __init__(self, start: int, stop: int, step: int = 1) -> None: ...
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[int]: ...
+    def __getitem__(self, i: int) -> int: ...
+    def __reversed__(self) -> Iterator[int]: ...
+
+class module:
+    __name__ = ...  # type: str
+    __file__ = ...  # type: str
+    __dict__ = ...  # type: Dict[unicode, Any]
+
+class property:
+    def __init__(self, fget: Callable[[Any], Any] = None,
+                 fset: Callable[[Any, Any], None] = None,
+                 fdel: Callable[[Any], None] = None, doc: str = None) -> None: ...
+    def getter(self, fget: Callable[[Any], Any]) -> property: ...
+    def setter(self, fset: Callable[[Any, Any], None]) -> property: ...
+    def deleter(self, fdel: Callable[[Any], None]) -> property: ...
+    def __get__(self, obj: Any, type: type=None) -> Any: ...
+    def __set__(self, obj: Any, value: Any) -> None: ...
+    def __delete__(self, obj: Any) -> None: ...
+
+long = int
+bytes = str
+
+NotImplemented = ...  # type: Any
+
+def abs(n: SupportsAbs[_T]) -> _T: ...
+def all(i: Iterable) -> bool: ...
+def any(i: Iterable) -> bool: ...
+def bin(number: int) -> str: ...
+def callable(o: object) -> bool: ...
+def chr(code: int) -> str: ...
+def compile(source: Any, filename: unicode, mode: str, flags: int = 0,
+            dont_inherit: int = 0) -> Any: ...
+def delattr(o: Any, name: unicode) -> None: ...
+def dir(o: object = ...) -> List[str]: ...
+ at overload
+def divmod(a: int, b: int) -> Tuple[int, int]: ...
+ at overload
+def divmod(a: float, b: float) -> Tuple[float, float]: ...
+def exit(code: int = ...) -> NoReturn: ...
+ at overload
+def filter(function: Callable[[_T], Any],
+           iterable: Iterable[_T]) -> List[_T]: ...
+ at overload
+def filter(function: None,
+           iterable: Iterable[Optional[_T]]) -> List[_T]: ...
+def format(o: object, format_spec: str = '') -> str: ...  # TODO unicode
+def getattr(o: Any, name: unicode, default: Any = None) -> Any: ...
+def hasattr(o: Any, name: unicode) -> bool: ...
+def hash(o: object) -> int: ...
+def hex(i: int) -> str: ...  # TODO __index__
+def id(o: object) -> int: ...
+def input(prompt: unicode = ...) -> Any: ...
+def intern(string: str) -> str: ...
+ at overload
+def iter(iterable: Iterable[_T]) -> Iterator[_T]: ...
+ at overload
+def iter(function: Callable[[], _T], sentinel: _T) -> Iterator[_T]: ...
+def isinstance(o: object, t: Union[type, Tuple[type, ...]]) -> bool: ...
+def issubclass(cls: type, classinfo: Union[type, Tuple[type, ...]]) -> bool: ...
+def len(o: Sized) -> int: ...
+ at overload
+def map(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> List[_S]: ...
+ at overload
+def map(func: Callable[[_T1, _T2], _S],
+        iter1: Iterable[_T1],
+        iter2: Iterable[_T2]) -> List[_S]: ...  # TODO more than two iterables
+ at overload
+def max(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def max(iterable: Iterable[_T], key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def min(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def min(iterable: Iterable[_T], key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def next(i: Iterator[_T]) -> _T: ...
+ at overload
+def next(i: Iterator[_T], default: _T) -> _T: ...
+def oct(i: int) -> str: ...  # TODO __index__
+ at overload
+def open(file: str, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+ at overload
+def open(file: unicode, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+ at overload
+def open(file: int, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+def ord(c: unicode) -> int: ...
+# This is only available after from __future__ import print_function.
+def print(*values: Any, sep: unicode = u' ', end: unicode = u'\n',
+           file: IO[Any] = ...) -> None: ...
+ at overload
+def pow(x: int, y: int) -> Any: ...  # The return type can be int or float, depending on y.
+ at overload
+def pow(x: int, y: int, z: int) -> Any: ...
+ at overload
+def pow(x: float, y: float) -> float: ...
+ at overload
+def pow(x: float, y: float, z: float) -> float: ...
+def quit(code: int = ...) -> None: ...
+def range(x: int, y: int = 0, step: int = 1) -> List[int]: ...
+def raw_input(prompt: unicode = ...) -> str: ...
+
+ at overload
+def reduce(function: Callable[[_T, _S], _T], iterable: Iterable[_S], initializer: _T) -> _T: ...
+ at overload
+def reduce(function: Callable[[_T, _T], _T], iterable: Iterable[_T]) -> _T: ...
+
+def reload(module: Any) -> Any: ...
+ at overload
+def reversed(object: Reversible[_T]) -> Iterator[_T]: ...
+ at overload
+def reversed(object: Sequence[_T]) -> Iterator[_T]: ...
+def repr(o: object) -> str: ...
+ at overload
+def round(number: float) -> float: ...
+ at overload
+def round(number: float, ndigits: int) -> float: ...  # Always return a float if given ndigits.
+ at overload
+def round(number: SupportsRound[_T]) -> _T: ...
+ at overload
+def round(number: SupportsRound[_T], ndigits: int) -> _T: ...
+def setattr(object: Any, name: unicode, value: Any) -> None: ...
+def sorted(iterable: Iterable[_T], *,
+           cmp: Callable[[_T, _T], int] = ...,
+           key: Callable[[_T], Any] = ...,
+           reverse: bool = ...) -> List[_T]: ...
+def sum(iterable: Iterable[_T], start: _T = ...) -> _T: ...
+def unichr(i: int) -> unicode: ...
+def vars(object: Any = ...) -> Dict[str, Any]: ...
+ at overload
+def zip(iter1: Iterable[_T1]) -> List[Tuple[_T1]]: ...
+ at overload
+def zip(iter1: Iterable[_T1],
+        iter2: Iterable[_T2]) -> List[Tuple[_T1, _T2]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2],
+        iter3: Iterable[_T3]) -> List[Tuple[_T1, _T2, _T3]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3],
+        iter4: Iterable[_T4]) -> List[Tuple[_T1, _T2,
+                                           _T3, _T4]]: ...  # TODO more than four iterables
+def __import__(name: unicode,
+               globals: Dict[str, Any] = ...,
+               locals: Dict[str, Any] = ...,
+               fromlist: List[str] = ..., level: int = ...) -> Any: ...
+
+def globals() -> Dict[str, Any]: ...
+def locals() -> Dict[str, Any]: ...
+
+# Actually the type of Ellipsis is <type 'ellipsis'>, but since it's
+# not exposed anywhere under that name, we make it private here.
+class ellipsis: ...
+Ellipsis = ...  # type: ellipsis
+
+# TODO: buffer support is incomplete; e.g. some_string.startswith(some_buffer) doesn't type check.
+AnyBuffer = TypeVar('AnyBuffer', str, unicode, bytearray, buffer)
+
+class buffer(Sized):
+    def __init__(self, object: AnyBuffer, offset: int = ..., size: int = ...) -> None: ...
+    def __add__(self, other: AnyBuffer) -> str: ...
+    def __cmp__(self, other: AnyBuffer) -> bool: ...
+    def __getitem__(self, key: Union[int, slice]) -> str: ...
+    def __getslice__(self, i: int, j: int) -> str: ...
+    def __len__(self) -> int: ...
+    def __mul__(self, x: int) -> str: ...
+
+class memoryview(Sized, Container[bytes]):
+    format = ...  # type: str
+    itemsize = ...  # type: int
+    shape = ...  # type: Optional[Tuple[int, ...]]
+    strides = ...  # type: Optional[Tuple[int, ...]]
+    suboffsets = ...  # type: Optional[Tuple[int, ...]]
+    readonly = ...  # type: bool
+    ndim = ...  # type: int
+
+    def __init__(self, obj: Union[str, bytearray, buffer, memoryview]) -> None: ...
+
+    @overload
+    def __getitem__(self, i: int) -> bytes: ...
+    @overload
+    def __getitem__(self, s: slice) -> memoryview: ...
+
+    def __contains__(self, x: object) -> bool: ...
+    def __iter__(self) -> Iterator[bytes]: ...
+    def __len__(self) -> int: ...
+
+    @overload
+    def __setitem__(self, i: int, o: bytes) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, o: Sequence[bytes]) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, o: memoryview) -> None: ...
+
+    def tobytes(self) -> bytes: ...
+    def tolist(self) -> List[int]: ...
+
+class BaseException:
+    args = ...  # type: Tuple[Any, ...]
+    message = ...  # type: str
+    def __init__(self, *args: Any) -> None: ...
+class GeneratorExit(BaseException): ...
+class KeyboardInterrupt(BaseException): ...
+class SystemExit(BaseException):
+    code = 0
+class Exception(BaseException): ...
+class StopIteration(Exception): ...
+class StandardError(Exception): ...
+class ArithmeticError(StandardError): ...
+class BufferError(StandardError): ...
+class EnvironmentError(StandardError):
+    errno = 0
+    strerror = ...  # type: str
+    # TODO can this be unicode?
+    filename = ...  # type: str
+class LookupError(StandardError): ...
+class RuntimeError(StandardError): ...
+class ValueError(StandardError): ...
+class AssertionError(StandardError): ...
+class AttributeError(StandardError): ...
+class EOFError(StandardError): ...
+class FloatingPointError(ArithmeticError): ...
+class IOError(EnvironmentError): ...
+class ImportError(StandardError): ...
+class IndexError(LookupError): ...
+class KeyError(LookupError): ...
+class MemoryError(StandardError): ...
+class NameError(StandardError): ...
+class NotImplementedError(RuntimeError): ...
+class OSError(EnvironmentError): ...
+class WindowsError(OSError):
+    winerror = ...  # type: int
+class OverflowError(ArithmeticError): ...
+class ReferenceError(StandardError): ...
+class SyntaxError(StandardError):
+    msg = ...  # type: str
+    lineno = ...  # type: int
+    offset = ...  # type: int
+    text = ...  # type: str
+class IndentationError(SyntaxError): ...
+class TabError(IndentationError): ...
+class SystemError(StandardError): ...
+class TypeError(StandardError): ...
+class UnboundLocalError(NameError): ...
+class UnicodeError(ValueError): ...
+class UnicodeDecodeError(UnicodeError): ...
+class UnicodeEncodeError(UnicodeError): ...
+class UnicodeTranslateError(UnicodeError): ...
+class ZeroDivisionError(ArithmeticError): ...
+
+class Warning(Exception): ...
+class UserWarning(Warning): ...
+class DeprecationWarning(Warning): ...
+class SyntaxWarning(Warning): ...
+class RuntimeWarning(Warning): ...
+class FutureWarning(Warning): ...
+class PendingDeprecationWarning(Warning): ...
+class ImportWarning(Warning): ...
+class UnicodeWarning(Warning): ...
+class BytesWarning(Warning): ...
+class ResourceWarning(Warning): ...
+
+def eval(s: str, globals: Dict[str, Any] = ..., locals: Dict[str, Any] = ...) -> Any: ...
+def exec(object: str,
+         globals: Dict[str, Any] = None,
+         locals: Dict[str, Any] = None) -> Any: ...  # TODO code object as source
+
+def cmp(x: Any, y: Any) -> int: ...
+
+def execfile(filename: str, globals: Dict[str, Any] = None, locals: Dict[str, Any] = None) -> None: ...
+
+class file(BinaryIO):
+    @overload
+    def __init__(self, file: str, mode: str = 'r', buffering: int = ...) -> None: ...
+    @overload
+    def __init__(self, file: unicode, mode: str = 'r', buffering: int = ...) -> None: ...
+    @overload
+    def __init__(self, file: int, mode: str = 'r', buffering: int = ...) -> None: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def read(self, n: int = ...) -> str: ...
+    def __enter__(self) -> BinaryIO: ...
+    def __exit__(self, t: type = None, exc: BaseException = None, tb: Any = None) -> bool: ...
+    def flush(self) -> None: ...
+    def fileno(self) -> int: ...
+    def isatty(self) -> bool: ...
+    def close(self) -> None: ...
+
+    def readable(self) -> bool: ...
+    def writable(self) -> bool: ...
+    def seekable(self) -> bool: ...
+    def seek(self, offset: int, whence: int = ...) -> None: ...
+    def tell(self) -> int: ...
+    def readline(self, limit: int = ...) -> str: ...
+    def readlines(self, hint: int = ...) -> List[str]: ...
+    def write(self, data: str) -> None: ...
+    def writelines(self, data: Iterable[str]) -> None: ...
+    def truncate(self, pos: int = ...) -> int: ...
+
+# Very old builtins
+def apply(func: Callable[..., _T], args: Sequence[Any] = None, kwds: Mapping[str, Any] = None) -> _T: ...
+_N = TypeVar('_N', bool, int, float, complex)
+def coerce(x: _N, y: _N) -> Tuple[_N, _N]: ...
diff --git a/typeshed/stdlib/2/__future__.pyi b/typeshed/stdlib/2/__future__.pyi
new file mode 100644
index 0000000..2414069
--- /dev/null
+++ b/typeshed/stdlib/2/__future__.pyi
@@ -0,0 +1,13 @@
+from sys import _version_info
+
+class _Feature:
+    def getOptionalRelease(self) -> _version_info: ...
+    def getMandatoryRelease(self) -> _version_info: ...
+
+absolute_import = ...  # type: _Feature
+division = ...  # type: _Feature
+generators = ...  # type: _Feature
+nested_scopes = ...  # type: _Feature
+print_function = ...  # type: _Feature
+unicode_literals = ...  # type: _Feature
+with_statement = ...  # type: _Feature
diff --git a/typeshed/stdlib/2/_ast.pyi b/typeshed/stdlib/2/_ast.pyi
new file mode 100644
index 0000000..02236a8
--- /dev/null
+++ b/typeshed/stdlib/2/_ast.pyi
@@ -0,0 +1,328 @@
+import typing
+from typing import Optional, Union
+
+__version__ = ...  # type: str
+
+PyCF_ONLY_AST = ...  # type: int
+
+identifier = str
+
+class AST:
+    _attributes = ...  # type: typing.Tuple[str, ...]
+    _fields = ...  # type: typing.Tuple[str, ...]
+    def __init__(self, *args, **kwargs) -> None: ...
+
+class mod(AST):
+    ...
+
+class Module(mod):
+    body = ...  # type: typing.List[stmt]
+
+class Interactive(mod):
+    body = ...  # type: typing.List[stmt]
+
+class Expression(mod):
+    body = ...  # type: expr
+
+class Suite(mod):
+    body = ...  # type: typing.List[stmt]
+
+
+class stmt(AST):
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+class FunctionDef(stmt):
+    name = ...  # type: identifier
+    args = ...  # type: arguments
+    body = ...  # type: typing.List[stmt]
+    decorator_list = ...  # type: typing.List[expr]
+
+class ClassDef(stmt):
+    name = ...  # type: identifier
+    bases = ...  # type: typing.List[expr]
+    body = ...  # type: typing.List[stmt]
+    decorator_list = ...  # type: typing.List[expr]
+
+class Return(stmt):
+    value = ...  # type: Optional[expr]
+
+class Delete(stmt):
+    targets = ...  # type: typing.List[expr]
+
+class Assign(stmt):
+    targets = ...  # type: typing.List[expr]
+    value = ...  # type: expr
+
+class AugAssign(stmt):
+    target = ...  # type: expr
+    op = ...  # type: operator
+    value = ...  # type: expr
+
+class Print(stmt):
+    dest = ...  # type: Optional[expr]
+    values = ...  # type: typing.List[expr]
+    nl = ...  # type: bool
+
+class For(stmt):
+    target = ...  # type: expr
+    iter = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class While(stmt):
+    test = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class If(stmt):
+    test = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class With(stmt):
+    context_expr = ...  # type: expr
+    optional_vars = ...  # type: Optional[expr]
+    body = ...  # type: typing.List[stmt]
+
+class Raise(stmt):
+    type = ...  # type: Optional[expr]
+    inst = ...  # type: Optional[expr]
+    tback = ...  # type: Optional[expr]
+
+class TryExcept(stmt):
+    body = ...  # type: typing.List[stmt]
+    handlers = ...  # type: typing.List[ExceptHandler]
+    orelse = ...  # type: typing.List[stmt]
+
+class TryFinally(stmt):
+    body = ...  # type: typing.List[stmt]
+    finalbody = ...  # type: typing.List[stmt]
+
+class Assert(stmt):
+    test = ...  # type: expr
+    msg = ...  # type: Optional[expr]
+
+class Import(stmt):
+    names = ...  # type: typing.List[alias]
+
+class ImportFrom(stmt):
+    module = ...  # type: Optional[identifier]
+    names = ...  # type: typing.List[alias]
+    level = ...  # type: Optional[int]
+
+class Exec(stmt):
+    body = ...  # type: expr
+    globals = ...  # type: Optional[expr]
+    locals = ...  # type: Optional[expr]
+
+class Global(stmt):
+    names = ...  # type: typing.List[identifier]
+
+class Expr(stmt):
+    value = ...  # type: expr
+
+class Pass(stmt): ...
+class Break(stmt): ...
+class Continue(stmt): ...
+
+
+class slice(AST):
+    ...
+
+_slice = slice  # this lets us type the variable named 'slice' below
+
+class Slice(slice):
+    lower = ...  # type: Optional[expr]
+    upper = ...  # type: Optional[expr]
+    step = ...  # type: Optional[expr]
+
+class ExtSlice(slice):
+    dims = ...  # type: typing.List[slice]
+
+class Index(slice):
+    value = ...  # type: expr
+
+class Ellipsis(slice): ...
+
+
+class expr(AST):
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+class BoolOp(expr):
+    op = ...  # type: boolop
+    values = ...  # type: typing.List[expr]
+
+class BinOp(expr):
+    left = ...  # type: expr
+    op = ...  # type: operator
+    right = ...  # type: expr
+
+class UnaryOp(expr):
+    op = ...  # type: unaryop
+    operand = ...  # type: expr
+
+class Lambda(expr):
+    args = ...  # type: arguments
+    body = ...  # type: expr
+
+class IfExp(expr):
+    test = ...  # type: expr
+    body = ...  # type: expr
+    orelse = ...  # type: expr
+
+class Dict(expr):
+    keys = ...  # type: typing.List[expr]
+    values = ...  # type: typing.List[expr]
+
+class Set(expr):
+    elts = ...  # type: typing.List[expr]
+
+class ListComp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class SetComp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class DictComp(expr):
+    key = ...  # type: expr
+    value = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class GeneratorExp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class Yield(expr):
+    value = ...  # type: Optional[expr]
+
+class Compare(expr):
+    left = ...  # type: expr
+    ops = ...  # type: typing.List[cmpop]
+    comparators = ...  # type: typing.List[expr]
+
+class Call(expr):
+    func = ...  # type: expr
+    args = ...  # type: typing.List[expr]
+    keywords = ...  # type: typing.List[keyword]
+    starargs = ...  # type: Optional[expr]
+    kwargs = ...  # type: Optional[expr]
+
+class Repr(expr):
+    value = ...  # type: expr
+
+class Num(expr):
+    n = ...  # type: Union[int, float]
+
+class Str(expr):
+    s = ...  # type: str
+
+class Attribute(expr):
+    value = ...  # type: expr
+    attr = ...  # type: identifier
+    ctx = ...  # type: expr_context
+
+class Subscript(expr):
+    value = ...  # type: expr
+    slice = ...  # type: _slice
+    ctx = ...  # type: expr_context
+
+class Name(expr):
+    id = ...  # type: identifier
+    ctx = ...  # type: expr_context
+
+class List(expr):
+    elts = ...  # type: typing.List[expr]
+    ctx = ...  # type: expr_context
+
+class Tuple(expr):
+    elts = ...  # type: typing.List[expr]
+    ctx = ...  # type: expr_context
+
+
+class expr_context(AST):
+    ...
+
+class AugLoad(expr_context): ...
+class AugStore(expr_context): ...
+class Del(expr_context): ...
+class Load(expr_context): ...
+class Param(expr_context): ...
+class Store(expr_context): ...
+
+
+class boolop(AST):
+    ...
+
+class And(boolop): ...
+class Or(boolop): ...
+
+class operator(AST):
+    ...
+
+class Add(operator): ...
+class BitAnd(operator): ...
+class BitOr(operator): ...
+class BitXor(operator): ...
+class Div(operator): ...
+class FloorDiv(operator): ...
+class LShift(operator): ...
+class Mod(operator): ...
+class Mult(operator): ...
+class Pow(operator): ...
+class RShift(operator): ...
+class Sub(operator): ...
+
+class unaryop(AST):
+    ...
+
+class Invert(unaryop): ...
+class Not(unaryop): ...
+class UAdd(unaryop): ...
+class USub(unaryop): ...
+
+class cmpop(AST):
+    ...
+
+class Eq(cmpop): ...
+class Gt(cmpop): ...
+class GtE(cmpop): ...
+class In(cmpop): ...
+class Is(cmpop): ...
+class IsNot(cmpop): ...
+class Lt(cmpop): ...
+class LtE(cmpop): ...
+class NotEq(cmpop): ...
+class NotIn(cmpop): ...
+
+
+class comprehension(AST):
+    target = ...  # type: expr
+    iter = ...  # type: expr
+    ifs = ...  # type: typing.List[expr]
+
+
+class ExceptHandler(AST):
+    type = ...  # type: Optional[expr]
+    name = ...  # type: Optional[expr]
+    body = ...  # type: typing.List[stmt]
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+
+class arguments(AST):
+    args = ...  # type: typing.List[expr]
+    vararg = ...  # type: Optional[identifier]
+    kwarg = ...  # type: Optional[identifier]
+    defaults = ...  # type: typing.List[expr]
+
+class keyword(AST):
+    arg = ...  # type: identifier
+    value = ...  # type: expr
+
+class alias(AST):
+    name = ...  # type: identifier
+    asname = ...  # type: Optional[identifier]
diff --git a/typeshed/stdlib/2/_codecs.pyi b/typeshed/stdlib/2/_codecs.pyi
new file mode 100644
index 0000000..2a00a4d
--- /dev/null
+++ b/typeshed/stdlib/2/_codecs.pyi
@@ -0,0 +1,55 @@
+"""Stub file for the '_codecs' module."""
+
+from typing import Any, AnyStr, Callable, Tuple, Optional
+
+import codecs
+
+# For convenience:
+_Handler = Callable[[Exception], Tuple[unicode, int]]
+
+# Not exposed. In Python 2, this is defined in unicode.c:
+class _EncodingMap(object):
+    def size(self) -> int: ...
+
+def register(search_function: Callable[[str], Any]) -> None: ...
+def register_error(errors: str, handler: _Handler) -> None: ...
+def lookup(a: str) -> codecs.CodecInfo: ...
+def lookup_error(a: str) -> _Handler: ...
+def decode(obj: Any, encoding: str = ..., errors: str = ...) -> Any: ...
+def encode(obj: Any, encoding: str = ..., errors: str = ...) -> Any: ...
+def charmap_build(a: unicode) -> _EncodingMap: ...
+
+def ascii_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def ascii_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def charbuffer_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def charmap_decode(data: AnyStr, errors: str = ..., mapping: Optional[_EncodingMap] = ...) -> Tuple[unicode, int]: ...
+def charmap_encode(data: AnyStr, errors: str, mapping: Optional[_EncodingMap] = ...) -> Tuple[str, int]: ...
+def escape_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def escape_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def latin_1_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def latin_1_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def raw_unicode_escape_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def raw_unicode_escape_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def readbuffer_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def unicode_escape_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def unicode_escape_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def unicode_internal_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def unicode_internal_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def utf_16_be_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_16_be_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_16_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_ex_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_16_le_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_16_le_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_be_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_32_be_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_32_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_ex_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_32_le_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_32_le_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_7_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_7_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_8_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_8_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
diff --git a/typeshed/stdlib/2/_collections.pyi b/typeshed/stdlib/2/_collections.pyi
new file mode 100644
index 0000000..156cda0
--- /dev/null
+++ b/typeshed/stdlib/2/_collections.pyi
@@ -0,0 +1,41 @@
+"""Stub file for the '_collections' module."""
+
+from typing import Any, Generic, Iterator, TypeVar, Optional, Union
+
+class defaultdict(dict):
+    default_factory = ...  # type: None
+    def __init__(self, default: Any = ..., init: Any = ...) -> None: ...
+    def __missing__(self, key) -> Any:
+        raise KeyError()
+    def __copy__(self) -> "defaultdict": ...
+    def copy(self) -> "defaultdict": ...
+
+_T = TypeVar('_T')
+_T2 = TypeVar('_T2')
+
+class deque(Generic[_T]):
+    maxlen = ...  # type: Optional[int]
+    def __init__(self, iterable: Iterator[_T] = ..., maxlen: int = ...) -> None: ...
+    def append(self, x: _T) -> None: ...
+    def appendleft(self, x: _T) -> None: ...
+    def clear(self) -> None: ...
+    def count(self, x: Any) -> int: ...
+    def extend(self, iterable: Iterator[_T]) -> None: ...
+    def extendleft(self, iterable: Iterator[_T]) -> None: ...
+    def pop(self) -> _T:
+        raise IndexError()
+    def popleft(self) -> _T:
+        raise IndexError()
+    def remove(self, value: _T) -> None:
+        raise IndexError()
+    def reverse(self) -> None: ...
+    def rotate(self, n: int = ...) -> None: ...
+    def __contains__(self, o: Any) -> bool: ...
+    def __copy__(self) -> "deque[_T]": ...
+    def __getitem__(self, i: int) -> _T:
+        raise IndexError()
+    def __iadd__(self, other: "deque[_T2]") -> "deque[Union[_T, _T2]]": ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __len__(self) -> int: ...
+    def __reversed__(self) -> Iterator[_T]: ...
+    def __setitem__(self, i: int, x: _T) -> None: ...
diff --git a/typeshed/stdlib/2/_functools.pyi b/typeshed/stdlib/2/_functools.pyi
new file mode 100644
index 0000000..555d3e1
--- /dev/null
+++ b/typeshed/stdlib/2/_functools.pyi
@@ -0,0 +1,20 @@
+"""Stub file for the '_functools' module."""
+
+from typing import Any, Callable, Dict, Iterable, Optional, TypeVar, Tuple, overload
+
+_T = TypeVar("_T")
+_S = TypeVar("_S")
+
+ at overload
+def reduce(function: Callable[[_T, _T], _T],
+           sequence: Iterable[_T]) -> _T: ...
+ at overload
+def reduce(function: Callable[[_T, _S], _T],
+           sequence: Iterable[_S], initial: _T) -> _T: ...
+
+class partial(object):
+    func = ...  # type: Callable[..., Any]
+    args = ...  # type: Tuple[Any, ...]
+    keywords = ...  # type: Dict[str, Any]
+    def __init__(self, func: Callable[..., Any], *args: Any, **kwargs: Any) -> None: ...
+    def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
diff --git a/typeshed/stdlib/2/_hotshot.pyi b/typeshed/stdlib/2/_hotshot.pyi
new file mode 100644
index 0000000..8a9c8d7
--- /dev/null
+++ b/typeshed/stdlib/2/_hotshot.pyi
@@ -0,0 +1,34 @@
+"""Stub file for the '_hotshot' module."""
+# This is an autogenerated file. It serves as a starting point
+# for a more precise manual annotation of this module.
+# Feel free to edit the source below, but remove this header when you do.
+
+from typing import Any, List, Tuple, Dict, Generic
+
+def coverage(a: str) -> Any: ...
+
+def logreader(a: str) -> LogReaderType:
+    raise IOError()
+    raise RuntimeError()
+
+def profiler(a: str, *args, **kwargs) -> Any:
+    raise IOError()
+
+def resolution() -> tuple: ...
+
+
+class LogReaderType(object):
+    def close(self) -> None: ...
+    def fileno(self) -> int:
+        raise ValueError()
+
+class ProfilerType(object):
+    def addinfo(self, a: str, b: str) -> None: ...
+    def close(self) -> None: ...
+    def fileno(self) -> int:
+        raise ValueError()
+    def runcall(self, *args, **kwargs) -> Any: ...
+    def runcode(self, a, b, *args, **kwargs) -> Any:
+        raise TypeError()
+    def start(self) -> None: ...
+    def stop(self) -> None: ...
diff --git a/typeshed/stdlib/2/_io.pyi b/typeshed/stdlib/2/_io.pyi
new file mode 100644
index 0000000..e85da33
--- /dev/null
+++ b/typeshed/stdlib/2/_io.pyi
@@ -0,0 +1,107 @@
+from typing import Any, Optional, Iterable, Tuple, List, Union
+
+DEFAULT_BUFFER_SIZE = ...  # type: int
+
+
+class BlockingIOError(IOError):
+    characters_written = ...  # type: int
+
+class UnsupportedOperation(ValueError, IOError): ...
+
+
+class _IOBase(object):
+    closed = ...  # type: bool
+    def __enter__(self) -> "_IOBase": ...
+    def __exit__(self, type, value, traceback) -> bool: ...
+    def __iter__(self) -> "_IOBase": ...
+    def _checkClosed(self) -> None: ...
+    def _checkReadable(self) -> None: ...
+    def _checkSeekable(self) -> None: ...
+    def _checkWritable(self) -> None: ...
+    def close(self) -> None: ...
+    def fileno(self) -> int: ...
+    def flush(self) -> None: ...
+    def isatty(self) -> bool: ...
+    def next(self) -> str: ...
+    def readable(self) -> bool: ...
+    def readline(self, limit: int = ...) -> str: ...
+    def readlines(self, hint: int = ...) -> List[str]: ...
+    def seek(self, offset: int, whence: int = ...) -> None: ...
+    def seekable(self) -> bool: ...
+    def tell(self) -> int: ...
+    def truncate(self, size: int = ...) -> int: ...
+    def writable(self) -> bool: ...
+    def writelines(self, lines: Iterable[str]) -> None: ...
+
+class _BufferedIOBase(_IOBase):
+    def read1(self, n: int) -> str: ...
+    def read(self, n: int = ...) -> str: ...
+    def readinto(self, buffer: bytearray) -> int: ...
+    def write(self, s: str) -> int: ...
+    def detach(self) -> "_BufferedIOBase": ...
+
+class BufferedRWPair(_BufferedIOBase):
+    def peek(self, n: int = ...) -> str: ...
+
+class BufferedRandom(_BufferedIOBase):
+    name = ...  # type: str
+    raw = ...  # type: _IOBase
+    mode = ...  # type: str
+    def peek(self, n: int = ...) -> str: ...
+
+class BufferedReader(_BufferedIOBase):
+    name = ...  # type: str
+    raw = ...  # type: _IOBase
+    mode = ...  # type: str
+    def peek(self, n: int = ...) -> str: ...
+
+class BufferedWriter(_BufferedIOBase):
+    name = ...  # type: str
+    raw = ...  # type: _IOBase
+    mode = ...  # type: str
+
+class BytesIO(_BufferedIOBase):
+    def __setstate__(self, tuple) -> None: ...
+    def __getstate__(self) -> tuple: ...
+    def getvalue(self) -> str: ...
+
+class _RawIOBase(_IOBase):
+    def readall(self) -> str: ...
+    def read(self, n: int = ...) -> str: ...
+
+class FileIO(_RawIOBase):
+    mode = ...  # type: str
+    closefd = ...  # type: bool
+    def readinto(self, buffer: bytearray)-> int: ...
+    def write(self, pbuf: str) -> int: ...
+
+class IncrementalNewlineDecoder(object):
+    newlines = ...  # type: Union[str, unicode]
+    def decode(self, input, final) -> Any: ...
+    def getstate(self) -> Tuple[Any, int]: ...
+    def setstate(self, state: Tuple[Any, int]) -> None: ...
+    def reset(self) -> None: ...
+
+class _TextIOBase(_IOBase):
+    errors = ...  # type: Optional[str]
+    newlines = ...  # type: Union[str, unicode]
+    encoding = ...  # type: Optional[str]
+    def read(self, n: int = ...) -> str: ...
+    def write(self) -> None:
+        raise UnsupportedOperation
+    def detach(self) -> None:
+        raise UnsupportedOperation
+
+class StringIO(_TextIOBase):
+    line_buffering = ...  # type: bool
+    def getvalue(self) -> str: ...
+    def __setstate__(self, state: tuple) -> None: ...
+    def __getstate__(self) -> tuple: ...
+
+class TextIOWrapper(_TextIOBase):
+    name = ...  # type: str
+    line_buffering = ...  # type: bool
+    buffer = ...  # type: str
+    _CHUNK_SIZE = ...  # type: int
+
+def open(file: Union[int, str], mode: str = ...) -> _IOBase: ...
diff --git a/typeshed/stdlib/2/_json.pyi b/typeshed/stdlib/2/_json.pyi
new file mode 100644
index 0000000..dbf621d
--- /dev/null
+++ b/typeshed/stdlib/2/_json.pyi
@@ -0,0 +1,19 @@
+"""Stub file for the '_json' module."""
+# This is an autogenerated file. It serves as a starting point
+# for a more precise manual annotation of this module.
+# Feel free to edit the source below, but remove this header when you do.
+
+from typing import Any, List, Tuple, Dict, Generic
+
+def encode_basestring_ascii(*args, **kwargs) -> str:
+    raise TypeError()
+
+def scanstring(a, b, *args, **kwargs) -> tuple:
+    raise TypeError()
+
+
+class Encoder(object):
+    pass
+
+class Scanner(object):
+    pass
diff --git a/typeshed/stdlib/2/_md5.pyi b/typeshed/stdlib/2/_md5.pyi
new file mode 100644
index 0000000..862b68f
--- /dev/null
+++ b/typeshed/stdlib/2/_md5.pyi
@@ -0,0 +1,13 @@
+blocksize = ...  # type: int
+digest_size = ...  # type: int
+
+class MD5Type(object):
+    name = ...  # type: str
+    block_size = ...  # type: int
+    digest_size = ...  # type: int
+    def copy(self) -> "MD5Type": ...
+    def digest(self) -> str: ...
+    def hexdigest(self) -> str: ...
+    def update(self, arg: str) -> None: ...
+
+def new(arg: str = ...) -> MD5Type: ...
diff --git a/typeshed/stdlib/2/_random.pyi b/typeshed/stdlib/2/_random.pyi
new file mode 100644
index 0000000..060dcd2
--- /dev/null
+++ b/typeshed/stdlib/2/_random.pyi
@@ -0,0 +1,13 @@
+from typing import Tuple
+
+# Actually Tuple[(int,) * 625]
+_State = Tuple[int, ...]
+
+class Random(object):
+    def __init__(self, seed: object = ...) -> None: ...
+    def seed(self, x: object = ...) -> None: ...
+    def getstate(self) -> _State: ...
+    def setstate(self, state: _State) -> None: ...
+    def random(self) -> float: ...
+    def getrandbits(self, k: int) -> int: ...
+    def jumpahead(self, i: int) -> None: ...
diff --git a/typeshed/stdlib/2/_sha.pyi b/typeshed/stdlib/2/_sha.pyi
new file mode 100644
index 0000000..eb750e0
--- /dev/null
+++ b/typeshed/stdlib/2/_sha.pyi
@@ -0,0 +1,15 @@
+blocksize = ...  # type: int
+block_size = ...  # type: int
+digest_size = ...  # type: int
+
+class sha(object):  # not actually exposed
+    name = ...  # type: str
+    block_size = ...  # type: int
+    digest_size = ...  # type: int
+    digestsize = ...  # type: int
+    def copy(self) -> "sha": ...
+    def digest(self) -> str: ...
+    def hexdigest(self) -> str: ...
+    def update(self, arg: str) -> None: ...
+
+def new(arg: str = ...) -> sha: ...
diff --git a/typeshed/stdlib/2/_sha256.pyi b/typeshed/stdlib/2/_sha256.pyi
new file mode 100644
index 0000000..4cf40c1
--- /dev/null
+++ b/typeshed/stdlib/2/_sha256.pyi
@@ -0,0 +1,23 @@
+from typing import Optional
+
+class sha224(object):
+    name = ...  # type: str
+    block_size = ...  # type: int
+    digest_size = ...  # type: int
+    digestsize = ...  # type: int
+    def __init__(self, init: Optional[str]) -> None: ...
+    def copy(self) -> "sha224": ...
+    def digest(self) -> str: ...
+    def hexdigest(self) -> str: ...
+    def update(self, arg: str) -> None: ...
+
+class sha256(object):
+    name = ...  # type: str
+    block_size = ...  # type: int
+    digest_size = ...  # type: int
+    digestsize = ...  # type: int
+    def __init__(self, init: Optional[str]) -> None: ...
+    def copy(self) -> "sha256": ...
+    def digest(self) -> str: ...
+    def hexdigest(self) -> str: ...
+    def update(self, arg: str) -> None: ...
diff --git a/typeshed/stdlib/2/_sha512.pyi b/typeshed/stdlib/2/_sha512.pyi
new file mode 100644
index 0000000..f9e4928
--- /dev/null
+++ b/typeshed/stdlib/2/_sha512.pyi
@@ -0,0 +1,23 @@
+from typing import Optional
+
+class sha384(object):
+    name = ...  # type: str
+    block_size = ...  # type: int
+    digest_size = ...  # type: int
+    digestsize = ...  # type: int
+    def __init__(self, init: Optional[str]) -> None: ...
+    def copy(self) -> "sha384": ...
+    def digest(self) -> str: ...
+    def hexdigest(self) -> str: ...
+    def update(self, arg: str) -> None: ...
+
+class sha512(object):
+    name = ...  # type: str
+    block_size = ...  # type: int
+    digest_size = ...  # type: int
+    digestsize = ...  # type: int
+    def __init__(self, init: Optional[str]) -> None: ...
+    def copy(self) -> "sha512": ...
+    def digest(self) -> str: ...
+    def hexdigest(self) -> str: ...
+    def update(self, arg: str) -> None: ...
diff --git a/typeshed/stdlib/2/_socket.pyi b/typeshed/stdlib/2/_socket.pyi
new file mode 100644
index 0000000..cfd615e
--- /dev/null
+++ b/typeshed/stdlib/2/_socket.pyi
@@ -0,0 +1,287 @@
+from typing import Tuple, Union, IO, Any, Optional, overload
+
+AF_APPLETALK = ...  # type: int
+AF_ASH = ...  # type: int
+AF_ATMPVC = ...  # type: int
+AF_ATMSVC = ...  # type: int
+AF_AX25 = ...  # type: int
+AF_BLUETOOTH = ...  # type: int
+AF_BRIDGE = ...  # type: int
+AF_DECnet = ...  # type: int
+AF_ECONET = ...  # type: int
+AF_INET = ...  # type: int
+AF_INET6 = ...  # type: int
+AF_IPX = ...  # type: int
+AF_IRDA = ...  # type: int
+AF_KEY = ...  # type: int
+AF_LLC = ...  # type: int
+AF_NETBEUI = ...  # type: int
+AF_NETLINK = ...  # type: int
+AF_NETROM = ...  # type: int
+AF_PACKET = ...  # type: int
+AF_PPPOX = ...  # type: int
+AF_ROSE = ...  # type: int
+AF_ROUTE = ...  # type: int
+AF_SECURITY = ...  # type: int
+AF_SNA = ...  # type: int
+AF_TIPC = ...  # type: int
+AF_UNIX = ...  # type: int
+AF_UNSPEC = ...  # type: int
+AF_WANPIPE = ...  # type: int
+AF_X25 = ...  # type: int
+AI_ADDRCONFIG = ...  # type: int
+AI_ALL = ...  # type: int
+AI_CANONNAME = ...  # type: int
+AI_NUMERICHOST = ...  # type: int
+AI_NUMERICSERV = ...  # type: int
+AI_PASSIVE = ...  # type: int
+AI_V4MAPPED = ...  # type: int
+BDADDR_ANY = ...  # type: str
+BDADDR_LOCAL = ...  # type: str
+BTPROTO_HCI = ...  # type: int
+BTPROTO_L2CAP = ...  # type: int
+BTPROTO_RFCOMM = ...  # type: int
+BTPROTO_SCO = ...  # type: int
+EAI_ADDRFAMILY = ...  # type: int
+EAI_AGAIN = ...  # type: int
+EAI_BADFLAGS = ...  # type: int
+EAI_FAIL = ...  # type: int
+EAI_FAMILY = ...  # type: int
+EAI_MEMORY = ...  # type: int
+EAI_NODATA = ...  # type: int
+EAI_NONAME = ...  # type: int
+EAI_OVERFLOW = ...  # type: int
+EAI_SERVICE = ...  # type: int
+EAI_SOCKTYPE = ...  # type: int
+EAI_SYSTEM = ...  # type: int
+EBADF = ...  # type: int
+EINTR = ...  # type: int
+HCI_DATA_DIR = ...  # type: int
+HCI_FILTER = ...  # type: int
+HCI_TIME_STAMP = ...  # type: int
+INADDR_ALLHOSTS_GROUP = ...  # type: int
+INADDR_ANY = ...  # type: int
+INADDR_BROADCAST = ...  # type: int
+INADDR_LOOPBACK = ...  # type: int
+INADDR_MAX_LOCAL_GROUP = ...  # type: int
+INADDR_NONE = ...  # type: int
+INADDR_UNSPEC_GROUP = ...  # type: int
+IPPORT_RESERVED = ...  # type: int
+IPPORT_USERRESERVED = ...  # type: int
+IPPROTO_AH = ...  # type: int
+IPPROTO_DSTOPTS = ...  # type: int
+IPPROTO_EGP = ...  # type: int
+IPPROTO_ESP = ...  # type: int
+IPPROTO_FRAGMENT = ...  # type: int
+IPPROTO_GRE = ...  # type: int
+IPPROTO_HOPOPTS = ...  # type: int
+IPPROTO_ICMP = ...  # type: int
+IPPROTO_ICMPV6 = ...  # type: int
+IPPROTO_IDP = ...  # type: int
+IPPROTO_IGMP = ...  # type: int
+IPPROTO_IP = ...  # type: int
+IPPROTO_IPIP = ...  # type: int
+IPPROTO_IPV6 = ...  # type: int
+IPPROTO_NONE = ...  # type: int
+IPPROTO_PIM = ...  # type: int
+IPPROTO_PUP = ...  # type: int
+IPPROTO_RAW = ...  # type: int
+IPPROTO_ROUTING = ...  # type: int
+IPPROTO_RSVP = ...  # type: int
+IPPROTO_TCP = ...  # type: int
+IPPROTO_TP = ...  # type: int
+IPPROTO_UDP = ...  # type: int
+IPV6_CHECKSUM = ...  # type: int
+IPV6_DSTOPTS = ...  # type: int
+IPV6_HOPLIMIT = ...  # type: int
+IPV6_HOPOPTS = ...  # type: int
+IPV6_JOIN_GROUP = ...  # type: int
+IPV6_LEAVE_GROUP = ...  # type: int
+IPV6_MULTICAST_HOPS = ...  # type: int
+IPV6_MULTICAST_IF = ...  # type: int
+IPV6_MULTICAST_LOOP = ...  # type: int
+IPV6_NEXTHOP = ...  # type: int
+IPV6_PKTINFO = ...  # type: int
+IPV6_RECVDSTOPTS = ...  # type: int
+IPV6_RECVHOPLIMIT = ...  # type: int
+IPV6_RECVHOPOPTS = ...  # type: int
+IPV6_RECVPKTINFO = ...  # type: int
+IPV6_RECVRTHDR = ...  # type: int
+IPV6_RECVTCLASS = ...  # type: int
+IPV6_RTHDR = ...  # type: int
+IPV6_RTHDRDSTOPTS = ...  # type: int
+IPV6_RTHDR_TYPE_0 = ...  # type: int
+IPV6_TCLASS = ...  # type: int
+IPV6_UNICAST_HOPS = ...  # type: int
+IPV6_V6ONLY = ...  # type: int
+IP_ADD_MEMBERSHIP = ...  # type: int
+IP_DEFAULT_MULTICAST_LOOP = ...  # type: int
+IP_DEFAULT_MULTICAST_TTL = ...  # type: int
+IP_DROP_MEMBERSHIP = ...  # type: int
+IP_HDRINCL = ...  # type: int
+IP_MAX_MEMBERSHIPS = ...  # type: int
+IP_MULTICAST_IF = ...  # type: int
+IP_MULTICAST_LOOP = ...  # type: int
+IP_MULTICAST_TTL = ...  # type: int
+IP_OPTIONS = ...  # type: int
+IP_RECVOPTS = ...  # type: int
+IP_RECVRETOPTS = ...  # type: int
+IP_RETOPTS = ...  # type: int
+IP_TOS = ...  # type: int
+IP_TTL = ...  # type: int
+MSG_CTRUNC = ...  # type: int
+MSG_DONTROUTE = ...  # type: int
+MSG_DONTWAIT = ...  # type: int
+MSG_EOR = ...  # type: int
+MSG_OOB = ...  # type: int
+MSG_PEEK = ...  # type: int
+MSG_TRUNC = ...  # type: int
+MSG_WAITALL = ...  # type: int
+MethodType = ...  # type: type
+NETLINK_DNRTMSG = ...  # type: int
+NETLINK_FIREWALL = ...  # type: int
+NETLINK_IP6_FW = ...  # type: int
+NETLINK_NFLOG = ...  # type: int
+NETLINK_ROUTE = ...  # type: int
+NETLINK_USERSOCK = ...  # type: int
+NETLINK_XFRM = ...  # type: int
+NI_DGRAM = ...  # type: int
+NI_MAXHOST = ...  # type: int
+NI_MAXSERV = ...  # type: int
+NI_NAMEREQD = ...  # type: int
+NI_NOFQDN = ...  # type: int
+NI_NUMERICHOST = ...  # type: int
+NI_NUMERICSERV = ...  # type: int
+PACKET_BROADCAST = ...  # type: int
+PACKET_FASTROUTE = ...  # type: int
+PACKET_HOST = ...  # type: int
+PACKET_LOOPBACK = ...  # type: int
+PACKET_MULTICAST = ...  # type: int
+PACKET_OTHERHOST = ...  # type: int
+PACKET_OUTGOING = ...  # type: int
+PF_PACKET = ...  # type: int
+SHUT_RD = ...  # type: int
+SHUT_RDWR = ...  # type: int
+SHUT_WR = ...  # type: int
+SOCK_DGRAM = ...  # type: int
+SOCK_RAW = ...  # type: int
+SOCK_RDM = ...  # type: int
+SOCK_SEQPACKET = ...  # type: int
+SOCK_STREAM = ...  # type: int
+SOL_HCI = ...  # type: int
+SOL_IP = ...  # type: int
+SOL_SOCKET = ...  # type: int
+SOL_TCP = ...  # type: int
+SOL_TIPC = ...  # type: int
+SOL_UDP = ...  # type: int
+SOMAXCONN = ...  # type: int
+SO_ACCEPTCONN = ...  # type: int
+SO_BROADCAST = ...  # type: int
+SO_DEBUG = ...  # type: int
+SO_DONTROUTE = ...  # type: int
+SO_ERROR = ...  # type: int
+SO_KEEPALIVE = ...  # type: int
+SO_LINGER = ...  # type: int
+SO_OOBINLINE = ...  # type: int
+SO_RCVBUF = ...  # type: int
+SO_RCVLOWAT = ...  # type: int
+SO_RCVTIMEO = ...  # type: int
+SO_REUSEADDR = ...  # type: int
+SO_REUSEPORT = ...  # type: int
+SO_SNDBUF = ...  # type: int
+SO_SNDLOWAT = ...  # type: int
+SO_SNDTIMEO = ...  # type: int
+SO_TYPE = ...  # type: int
+SSL_ERROR_EOF = ...  # type: int
+SSL_ERROR_INVALID_ERROR_CODE = ...  # type: int
+SSL_ERROR_SSL = ...  # type: int
+SSL_ERROR_SYSCALL = ...  # type: int
+SSL_ERROR_WANT_CONNECT = ...  # type: int
+SSL_ERROR_WANT_READ = ...  # type: int
+SSL_ERROR_WANT_WRITE = ...  # type: int
+SSL_ERROR_WANT_X509_LOOKUP = ...  # type: int
+SSL_ERROR_ZERO_RETURN = ...  # type: int
+TCP_CORK = ...  # type: int
+TCP_DEFER_ACCEPT = ...  # type: int
+TCP_INFO = ...  # type: int
+TCP_KEEPCNT = ...  # type: int
+TCP_KEEPIDLE = ...  # type: int
+TCP_KEEPINTVL = ...  # type: int
+TCP_LINGER2 = ...  # type: int
+TCP_MAXSEG = ...  # type: int
+TCP_NODELAY = ...  # type: int
+TCP_QUICKACK = ...  # type: int
+TCP_SYNCNT = ...  # type: int
+TCP_WINDOW_CLAMP = ...  # type: int
+TIPC_ADDR_ID = ...  # type: int
+TIPC_ADDR_NAME = ...  # type: int
+TIPC_ADDR_NAMESEQ = ...  # type: int
+TIPC_CFG_SRV = ...  # type: int
+TIPC_CLUSTER_SCOPE = ...  # type: int
+TIPC_CONN_TIMEOUT = ...  # type: int
+TIPC_CRITICAL_IMPORTANCE = ...  # type: int
+TIPC_DEST_DROPPABLE = ...  # type: int
+TIPC_HIGH_IMPORTANCE = ...  # type: int
+TIPC_IMPORTANCE = ...  # type: int
+TIPC_LOW_IMPORTANCE = ...  # type: int
+TIPC_MEDIUM_IMPORTANCE = ...  # type: int
+TIPC_NODE_SCOPE = ...  # type: int
+TIPC_PUBLISHED = ...  # type: int
+TIPC_SRC_DROPPABLE = ...  # type: int
+TIPC_SUBSCR_TIMEOUT = ...  # type: int
+TIPC_SUB_CANCEL = ...  # type: int
+TIPC_SUB_PORTS = ...  # type: int
+TIPC_SUB_SERVICE = ...  # type: int
+TIPC_TOP_SRV = ...  # type: int
+TIPC_WAIT_FOREVER = ...  # type: int
+TIPC_WITHDRAWN = ...  # type: int
+TIPC_ZONE_SCOPE = ...  # type: int
+
+# PyCapsule
+CAPI = ...  # type: Any
+
+has_ipv6 = ...  # type: bool
+
+class error(IOError): ...
+class gaierror(error): ...
+class timeout(error): ...
+
+class SocketType(object):
+    family = ...  # type: int
+    type = ...  # type: int
+    proto = ...  # type: int
+    timeout = ...  # type: float
+
+    def __init__(self, family: int = ..., type: int = ..., proto: int = ...) -> None: ...
+    def accept(self) -> Tuple['SocketType', tuple]: ...
+    def bind(self, address: tuple) -> None: ...
+    def close(self) -> None: ...
+    def connect(self, address: tuple) -> None:
+        raise gaierror
+        raise timeout
+    def connect_ex(self, address: tuple) -> int: ...
+    def dup(self) -> "SocketType": ...
+    def fileno(self) -> int: ...
+    def getpeername(self) -> tuple: ...
+    def getsockname(self) -> tuple: ...
+    def getsockopt(self, level: int, option: int, buffersize: int = ...) -> str: ...
+    def gettimeout(self) -> float: ...
+    def listen(self, backlog: int) -> None:
+        raise error
+    def makefile(self, mode: str = ..., buffersize: int = ...) -> IO[Any]: ...
+    def recv(self, buffersize: int, flags: int = ...) -> str: ...
+    def recv_into(self, buffer: bytearray, nbytes: int = ..., flags: int = ...) -> int: ...
+    def recvfrom(self, buffersize: int, flags: int = ...) -> tuple:
+        raise error
+    def recvfrom_into(self, buffer: bytearray, nbytes: int = ...,
+                      flags: int = ...) -> int: ...
+    def send(self, data: str, flags: int =...) -> int: ...
+    def sendall(self, data: str, flags: int = ...) -> None: ...
+    @overload
+    def sendto(self, data: str, address: tuple) -> int: ...
+    @overload
+    def sendto(self, data: str, flags: int, address: tuple) -> int: ...
+    def setblocking(self, flag: bool) -> None: ...
+    def setsockopt(self, level: int, option: int, value: Union[int, str]) -> None: ...
+    def settimeout(self, value: Optional[float]) -> None: ...
+    def shutdown(self, flag: int) -> None: ...
diff --git a/typeshed/stdlib/2/_sre.pyi b/typeshed/stdlib/2/_sre.pyi
new file mode 100644
index 0000000..08d1ecc
--- /dev/null
+++ b/typeshed/stdlib/2/_sre.pyi
@@ -0,0 +1,53 @@
+"""Stub file for the '_sre' module."""
+
+from typing import Any, Union, Iterable, Optional, Mapping, Sequence, Dict, List, Tuple, overload
+
+CODESIZE = ...  # type: int
+MAGIC = ...  # type: int
+MAXREPEAT = ...  # type: long
+copyright = ...  # type: str
+
+class SRE_Match(object):
+    def start(self, group: int = ...) -> int:
+        raise IndexError()
+    def end(self, group: int = ...) -> int:
+        raise IndexError()
+    def expand(self, s: str) -> Any: ...
+    @overload
+    def group(self) -> str: ...
+    @overload
+    def group(self, group: int = ...) -> Optional[str]: ...
+    def groupdict(self) -> Dict[int, Optional[str]]: ...
+    def groups(self) -> Tuple[Optional[str]]: ...
+    def span(self) -> Tuple[int, int]:
+        raise IndexError()
+
+class SRE_Scanner(object):
+    pattern = ...  # type: str
+    def match(self) -> SRE_Match: ...
+    def search(self) -> SRE_Match: ...
+
+class SRE_Pattern(object):
+    pattern = ...  # type: str
+    flags = ...  # type: int
+    groups = ...  # type: int
+    groupindex = ...  # type: Mapping[int, int]
+    indexgroup = ...  # type: Sequence[int]
+    def findall(self, source: str, pos: int = ..., endpos: int = ...) -> List[Union[tuple, str]]: ...
+    def finditer(self, source: str, pos: int = ..., endpos: int = ...) -> Iterable[Union[tuple, str]]: ...
+    def match(self, pattern, pos: int = ..., endpos: int = ...) -> SRE_Match: ...
+    def scanner(self, s: str, start: int = ..., end: int = ...) -> SRE_Scanner: ...
+    def search(self, pattern, pos: int = ..., endpos: int = ...) -> SRE_Match: ...
+    def split(self, source: str, maxsplit: int = ...) -> List[Optional[str]]: ...
+    def sub(self, repl: str, string: str, count: int = ...) -> tuple: ...
+    def subn(self, repl: str, string: str, count: int = ...) -> tuple: ...
+
+def compile(pattern: str, flags: int, code: List[int],
+            groups: int = ...,
+            groupindex: Mapping[int, int] = ...,
+            indexgroup: Sequence[int] = ...) -> SRE_Pattern:
+    raise OverflowError()
+
+def getcodesize() -> int: ...
+
+def getlower(a: int, b: int) -> int: ...
diff --git a/typeshed/stdlib/2/_struct.pyi b/typeshed/stdlib/2/_struct.pyi
new file mode 100644
index 0000000..8917187
--- /dev/null
+++ b/typeshed/stdlib/2/_struct.pyi
@@ -0,0 +1,22 @@
+"""Stub file for the '_struct' module."""
+
+from typing import Any, AnyStr, Tuple
+
+class error(Exception): ...
+
+class Struct(object):
+    size = ...  # type: int
+    format = ...  # type: str
+
+    def __init__(self, fmt: str) -> None: ...
+    def pack_into(self, buffer: bytearray, offset: int, obj: Any) -> None: ...
+    def pack(self, *args) -> str: ...
+    def unpack(self, s: str) -> Tuple[Any]: ...
+    def unpack_from(self, buffer: bytearray, offset: int = ...) -> Tuple[Any]: ...
+
+def _clearcache() -> None: ...
+def calcsize(fmt: str) -> int: ...
+def pack(fmt: AnyStr, obj: Any) -> str: ...
+def pack_into(fmt: AnyStr, buffer: bytearray, offset: int, obj: Any) -> None: ...
+def unpack(fmt: AnyStr, data: str) -> Tuple[Any]: ...
+def unpack_from(fmt: AnyStr, buffer: bytearray, offset: int = ...) -> Tuple[Any]: ...
diff --git a/typeshed/stdlib/2/_symtable.pyi b/typeshed/stdlib/2/_symtable.pyi
new file mode 100644
index 0000000..fd8b691
--- /dev/null
+++ b/typeshed/stdlib/2/_symtable.pyi
@@ -0,0 +1,39 @@
+from typing import List, Dict
+
+CELL = ...  # type: int
+DEF_BOUND = ...  # type: int
+DEF_FREE = ...  # type: int
+DEF_FREE_CLASS = ...  # type: int
+DEF_GLOBAL = ...  # type: int
+DEF_IMPORT = ...  # type: int
+DEF_LOCAL = ...  # type: int
+DEF_PARAM = ...  # type: int
+FREE = ...  # type: int
+GLOBAL_EXPLICIT = ...  # type: int
+GLOBAL_IMPLICIT = ...  # type: int
+LOCAL = ...  # type: int
+OPT_BARE_EXEC = ...  # type: int
+OPT_EXEC = ...  # type: int
+OPT_IMPORT_STAR = ...  # type: int
+SCOPE_MASK = ...  # type: int
+SCOPE_OFF = ...  # type: int
+TYPE_CLASS = ...  # type: int
+TYPE_FUNCTION = ...  # type: int
+TYPE_MODULE = ...  # type: int
+USE = ...  # type: int
+
+class _symtable_entry(object):
+    ...
+
+class symtable(object):
+    children = ...  # type: List[_symtable_entry]
+    id = ...  # type: int
+    lineno = ...  # type: int
+    name = ...  # type: str
+    nested = ...  # type: int
+    optimized = ...  # type: int
+    symbols = ...  # type: Dict[str, int]
+    type = ...  # type: int
+    varnames = ...  # type: List[str]
+
+    def __init__(self, src: str, filename: str, startstr: str) -> None: ...
diff --git a/typeshed/stdlib/2/_warnings.pyi b/typeshed/stdlib/2/_warnings.pyi
new file mode 100644
index 0000000..4f54529
--- /dev/null
+++ b/typeshed/stdlib/2/_warnings.pyi
@@ -0,0 +1,11 @@
+from typing import Any, List
+
+default_action = ...  # type: str
+filters = ...  # type: List[tuple]
+once_registry = ...  # type: dict
+
+def warn(message: Warning, category: type = ..., stacklevel: int = ...) -> None: ...
+def warn_explicit(message: Warning, category: type,
+                  filename: str, lineno: int,
+                  module: Any = ..., registry: dict = ...,
+                  module_globals: dict = ...) -> None: ...
diff --git a/typeshed/stdlib/2/_weakref.pyi b/typeshed/stdlib/2/_weakref.pyi
new file mode 100644
index 0000000..a7bb9ea
--- /dev/null
+++ b/typeshed/stdlib/2/_weakref.pyi
@@ -0,0 +1,21 @@
+from typing import Any, Callable, Generic, Optional, TypeVar
+
+_T = TypeVar('_T')
+
+class CallableProxyType(object):  # "weakcallableproxy"
+    pass
+
+class ProxyType(object):  # "weakproxy"
+    pass
+
+class ReferenceType(Generic[_T]):
+    # TODO rest of members
+    def __init__(self, o: _T, callback: Callable[[ReferenceType[_T]],
+                                                 Any] = ...) -> None: ...
+    def __call__(self) -> Optional[_T]: ...
+
+ref = ReferenceType
+
+def getweakrefcount(object: Any) -> int: ...
+def getweakrefs(object: Any) -> int: ...
+def proxy(object: Any, callback: Callable[[Any], Any] = ...) -> None: ...
diff --git a/typeshed/stdlib/2/_weakrefset.pyi b/typeshed/stdlib/2/_weakrefset.pyi
new file mode 100644
index 0000000..27aade6
--- /dev/null
+++ b/typeshed/stdlib/2/_weakrefset.pyi
@@ -0,0 +1,14 @@
+from typing import Iterator, Any, Iterable, MutableSet, TypeVar, Generic
+
+_T = TypeVar('_T')
+
+class WeakSet(MutableSet[_T], Generic[_T]):
+    def __init__(self, data: Iterable[_T] = ...) -> None: ...
+
+    def add(self, x: _T) -> None: ...
+    def discard(self, x: _T) -> None: ...
+    def __contains__(self, x: Any) -> bool: ...
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[_T]: ...
+
+    # TODO: difference, difference_update, ...
diff --git a/typeshed/stdlib/2/abc.pyi b/typeshed/stdlib/2/abc.pyi
new file mode 100644
index 0000000..3ae3b52
--- /dev/null
+++ b/typeshed/stdlib/2/abc.pyi
@@ -0,0 +1,37 @@
+from typing import Any, Dict, Set, Union, Tuple
+import _weakrefset
+
+# mypy has special processing for ABCMeta and abstractmethod.
+
+WeakSet = ...  # type: _weakrefset.WeakSet
+_InstanceType = ...  # type: type
+types = ...  # type: module
+
+def abstractmethod(funcobj: Any) -> Any: ...
+
+class ABCMeta(type):
+    # TODO: FrozenSet
+    __abstractmethods__ = ...  # type: Set[Any]
+    _abc_cache = ...  # type: _weakrefset.WeakSet
+    _abc_invalidation_counter = ...  # type: int
+    _abc_negative_cache = ...  # type: _weakrefset.WeakSet
+    _abc_negative_cache_version = ...  # type: int
+    _abc_registry = ...  # type: _weakrefset.WeakSet
+    def __init__(self, name: str, bases: Tuple[type, ...], namespace: Dict[Any, Any]) -> None: ...
+    def __instancecheck__(cls: "ABCMeta", instance: Any) -> Any: ...
+    def __subclasscheck__(cls: "ABCMeta", subclass: Any) -> Any: ...
+    def _dump_registry(cls: "ABCMeta", *args: Any, **kwargs: Any) -> None: ...
+    # TODO: subclass: Union["ABCMeta", type, Tuple[type, ...]]
+    def register(cls: "ABCMeta", subclass: Any) -> None: ...
+
+class _C:
+    pass
+
+# TODO: The real abc.abstractproperty inherits from "property".
+class abstractproperty(object):
+    def __new__(cls, func: Any) -> Any: ...
+    __isabstractmethod__ = ...  # type: bool
+    doc = ...  # type: Any
+    fdel = ...  # type: Any
+    fget = ...  # type: Any
+    fset = ...  # type: Any
diff --git a/typeshed/stdlib/2/array.pyi b/typeshed/stdlib/2/array.pyi
new file mode 100644
index 0000000..3ff4081
--- /dev/null
+++ b/typeshed/stdlib/2/array.pyi
@@ -0,0 +1,56 @@
+"""Stub file for the 'array' module."""
+
+from typing import (Any, Generic, IO, Iterable, Sequence, TypeVar,
+                    Union, overload, Iterator, Tuple, BinaryIO, List)
+
+T = TypeVar('T')
+
+class array(Generic[T]):
+    def __init__(self, typecode: str, init: Iterable[T] = ...) -> None: ...
+    def __add__(self, y: "array[T]") -> "array[T]": ...
+    def __contains__(self, y: Any) -> bool: ...
+    def __copy__(self) -> "array[T]": ...
+    def __deepcopy__(self) -> "array": ...
+    def __delitem__(self, y: Union[slice, int]) -> None: ...
+    def __delslice__(self, i: int, j: int) -> None: ...
+    @overload
+    def __getitem__(self, i: int) -> Any: ...
+    @overload
+    def __getitem__(self, s: slice) -> "array": ...
+    def __iadd__(self, y: "array[T]") -> "array[T]": ...
+    def __imul__(self, y: int) -> "array[T]": ...
+    def __iter__(self) -> Iterator[T]: ...
+    def __len__(self) -> int: ...
+    def __mul__(self, n: int) -> "array[T]": ...
+    def __rmul__(self, n: int) -> "array[T]": ...
+    @overload
+    def __setitem__(self, i: int, y: T) -> None: ...
+    @overload
+    def __setitem__(self, i: slice, y: "array[T]") -> None: ...
+
+    def append(self, x: T) -> None: ...
+    def buffer_info(self) -> Tuple[int, int]: ...
+    def byteswap(self) -> None:
+        raise RuntimeError()
+    def count(self) -> int: ...
+    def extend(self, x: Sequence[T]) -> None: ...
+    def fromlist(self, list: List[T]) -> None:
+        raise EOFError()
+        raise IOError()
+    def fromfile(self, f: BinaryIO, n: int) -> None: ...
+    def fromstring(self, s: str) -> None: ...
+    def fromunicode(self, u: unicode) -> None: ...
+    def index(self, x: T) -> int: ...
+    def insert(self, i: int, x: T) -> None: ...
+    def pop(self, i: int = ...) -> T: ...
+    def read(self, f: IO[str], n: int) -> None:
+        raise DeprecationWarning()
+    def remove(self, x: T) -> None: ...
+    def reverse(self) -> None: ...
+    def tofile(self, f: BinaryIO) -> None:
+        raise IOError()
+    def tolist(self) -> List[T]: ...
+    def tostring(self) -> str: ...
+    def tounicode(self) -> unicode: ...
+    def write(self, f: IO[str]) -> None:
+        raise DeprecationWarning()
diff --git a/typeshed/stdlib/2/ast.pyi b/typeshed/stdlib/2/ast.pyi
new file mode 100644
index 0000000..95bda54
--- /dev/null
+++ b/typeshed/stdlib/2/ast.pyi
@@ -0,0 +1,40 @@
+# Python 2.7 ast
+
+import typing
+from typing import Any, Iterator, Union
+
+from _ast import (
+    Add, alias, And, arguments, Assert, Assign, AST, Attribute, AugAssign,
+    AugLoad, AugStore, BinOp, BitAnd, BitOr, BitXor, BoolOp, boolop, Break,
+    Call, ClassDef, cmpop, Compare, comprehension, Continue, Del, Delete, Dict,
+    DictComp, Div, Ellipsis, Eq, ExceptHandler, Exec, Expr, expr, Expression,
+    expr_context, ExtSlice, FloorDiv, For, FunctionDef, GeneratorExp, Global,
+    Gt, GtE, If, IfExp, Import, ImportFrom, In, Index, Interactive, Invert, Is,
+    IsNot, keyword, Lambda, List, ListComp, Load, LShift, Lt, LtE, Mod, mod,
+    Module, Mult, Name, Not, NotEq, NotIn, Num, operator, Or, Param, Pass, Pow,
+    Print, Raise, Repr, Return, RShift, Set, SetComp, Slice, slice, stmt,
+    Store, Str, Sub, Subscript, Suite, TryExcept, TryFinally, Tuple, UAdd,
+    UnaryOp, unaryop, USub, While, With, Yield
+)
+
+__version__ = ...  # type: str
+PyCF_ONLY_AST = ...  # type: int
+
+
+def parse(source: Union[str, bytes], filename: Union[str, bytes] = ..., mode: str = ...) -> AST: ...
+def copy_location(new_node: AST, old_node: AST) -> AST: ...
+def dump(node: AST, annotate_fields: bool = ..., include_attributes: bool = ...) -> str: ...
+def fix_missing_locations(node: AST) -> AST: ...
+def get_docstring(node: AST, clean: bool = ...) -> str: ...
+def increment_lineno(node: AST, n: int = ...) -> AST: ...
+def iter_child_nodes(node: AST) -> Iterator[AST]: ...
+def iter_fields(node: AST) -> Iterator[typing.Tuple[str, Any]]: ...
+def literal_eval(node_or_string: Union[str, AST]) -> Any: ...
+def walk(node: AST) -> Iterator[AST]: ...
+
+class NodeVisitor():
+    def visit(self, node: AST) -> Any: ...
+    def generic_visit(self, node: AST) -> None: ...
+
+class NodeTransformer(NodeVisitor):
+    def generic_visit(self, node: AST) -> None: ...
diff --git a/typeshed/stdlib/2/atexit.pyi b/typeshed/stdlib/2/atexit.pyi
new file mode 100644
index 0000000..13d2602
--- /dev/null
+++ b/typeshed/stdlib/2/atexit.pyi
@@ -0,0 +1,5 @@
+from typing import TypeVar, Any
+
+_FT = TypeVar('_FT')
+
+def register(func: _FT, *args: Any, **kargs: Any) -> _FT: ...
diff --git a/typeshed/stdlib/2/base64.pyi b/typeshed/stdlib/2/base64.pyi
new file mode 100644
index 0000000..d593fa8
--- /dev/null
+++ b/typeshed/stdlib/2/base64.pyi
@@ -0,0 +1,25 @@
+# Stubs for base64
+
+# Based on http://docs.python.org/3.2/library/base64.html
+
+from typing import IO
+
+def b64encode(s: str, altchars: str = ...) -> str: ...
+def b64decode(s: str, altchars: str = ...,
+              validate: bool = ...) -> str: ...
+def standard_b64encode(s: str) -> str: ...
+def standard_b64decode(s: str) -> str: ...
+def urlsafe_b64encode(s: str) -> str: ...
+def urlsafe_b64decode(s: str) -> str: ...
+def b32encode(s: str) -> str: ...
+def b32decode(s: str, casefold: bool = ...,
+              map01: str = ...) -> str: ...
+def b16encode(s: str) -> str: ...
+def b16decode(s: str, casefold: bool = ...) -> str: ...
+
+def decode(input: IO[str], output: IO[str]) -> None: ...
+def decodebytes(s: str) -> str: ...
+def decodestring(s: str) -> str: ...
+def encode(input: IO[str], output: IO[str]) -> None: ...
+def encodebytes(s: str) -> str: ...
+def encodestring(s: str) -> str: ...
diff --git a/typeshed/stdlib/2/binascii.pyi b/typeshed/stdlib/2/binascii.pyi
new file mode 100644
index 0000000..f8b85b6
--- /dev/null
+++ b/typeshed/stdlib/2/binascii.pyi
@@ -0,0 +1,21 @@
+"""Stubs for the binascii module."""
+
+def a2b_base64(string: str) -> str: ...
+def a2b_hex(hexstr: str) -> str: ...
+def a2b_hqx(string: str) -> str: ...
+def a2b_qp(string: str, header: bool = ...) -> str: ...
+def a2b_uu(string: str) -> str: ...
+def b2a_base64(data: str) -> str: ...
+def b2a_hex(data: str) -> str: ...
+def b2a_hqx(data: str) -> str: ...
+def b2a_qp(data: str, quotetabs: bool = ..., istext: bool = ..., header: bool = ...) -> str: ...
+def b2a_uu(data: str) -> str: ...
+def crc32(data: str, crc: int = None) -> int: ...
+def crc_hqx(data: str, oldcrc: int) -> int: ...
+def hexlify(data: str) -> str: ...
+def rlecode_hqx(data: str) -> str: ...
+def rledecode_hqx(data: str) -> str: ...
+def unhexlify(hexstr: str) -> str: ...
+
+class Error(Exception): ...
+class Incomplete(Exception): ...
diff --git a/typeshed/stdlib/2/builtins.pyi b/typeshed/stdlib/2/builtins.pyi
new file mode 100644
index 0000000..e8d4ae0
--- /dev/null
+++ b/typeshed/stdlib/2/builtins.pyi
@@ -0,0 +1,947 @@
+# Stubs for builtins (Python 2.7)
+
+# True and False are deliberately omitted because they are keywords in
+# Python 3, and stub files conform to Python 3 syntax.
+
+from typing import (
+    TypeVar, Iterator, Iterable, overload,
+    Sequence, Mapping, Tuple, List, Any, Dict, Callable, Generic, Set,
+    AbstractSet, FrozenSet, Sized, Reversible, SupportsInt, SupportsFloat, SupportsAbs,
+    SupportsRound, IO, BinaryIO, Union, AnyStr, MutableSequence, MutableMapping,
+    MutableSet, ItemsView, KeysView, ValuesView, Optional, Container,
+)
+from abc import abstractmethod, ABCMeta
+from mypy_extensions import NoReturn
+
+_T = TypeVar('_T')
+_T_co = TypeVar('_T_co', covariant=True)
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+_S = TypeVar('_S')
+_T1 = TypeVar('_T1')
+_T2 = TypeVar('_T2')
+_T3 = TypeVar('_T3')
+_T4 = TypeVar('_T4')
+_TT = TypeVar('_TT', bound='type')
+
+class staticmethod: pass   # Special, only valid as a decorator.
+class classmethod: pass  # Special, only valid as a decorator.
+
+class object:
+    __doc__ = ...  # type: Optional[str]
+    __class__ = ...  # type: type
+    __slots__ = ...  # type: Optional[Union[str, unicode, Iterable[Union[str, unicode]]]]
+
+    def __init__(self) -> None: ...
+    def __new__(cls) -> Any: ...
+    def __setattr__(self, name: str, value: Any) -> None: ...
+    def __eq__(self, o: object) -> bool: ...
+    def __ne__(self, o: object) -> bool: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __hash__(self) -> int: ...
+    def __format__(self, format_spec: str) -> str: ...
+    def __getattribute__(self, name: str) -> Any: ...
+    def __delattr__(self, name: str) -> None: ...
+
+class type:
+    __bases__ = ...  # type: Tuple[type, ...]
+    __name__ = ...  # type: str
+    __module__ = ...  # type: str
+    __dict__ = ...  # type: Dict[unicode, Any]
+
+    @overload
+    def __init__(self, o: object) -> None: ...
+    @overload
+    def __init__(self, name: str, bases: Tuple[type, ...], dict: Dict[str, Any]) -> None: ...
+    # TODO: __new__ may have to be special and not a static method.
+    @overload
+    def __new__(cls, o: object) -> type: ...
+    @overload
+    def __new__(cls, name: str, bases: Tuple[type, ...], namespace: Dict[str, Any]) -> type: ...
+    def __call__(self, *args: Any, **kwds: Any) -> Any: ...
+
+    # Only new-style classes
+    __mro__ = ...  # type: Tuple[type, ...]
+    # Note: the documentation doesnt specify what the return type is, the standard
+    # implementation seems to be returning a list.
+    def mro(self) -> List[type]: ...
+    def __subclasses__(self: _TT) -> List[_TT]: ...
+
+class int(SupportsInt, SupportsFloat, SupportsAbs[int]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, x: SupportsInt) -> None: ...
+    @overload
+    def __init__(self, x: Union[str, unicode, bytearray], base: int = 10) -> None: ...
+    def bit_length(self) -> int: ...
+
+    def __add__(self, x: int) -> int: ...
+    def __sub__(self, x: int) -> int: ...
+    def __mul__(self, x: int) -> int: ...
+    def __floordiv__(self, x: int) -> int: ...
+    def __div__(self, x: int) -> int: ...
+    def __truediv__(self, x: int) -> float: ...
+    def __mod__(self, x: int) -> int: ...
+    def __radd__(self, x: int) -> int: ...
+    def __rsub__(self, x: int) -> int: ...
+    def __rmul__(self, x: int) -> int: ...
+    def __rfloordiv__(self, x: int) -> int: ...
+    def __rdiv__(self, x: int) -> int: ...
+    def __rtruediv__(self, x: int) -> float: ...
+    def __rmod__(self, x: int) -> int: ...
+    def __pow__(self, x: int) -> Any: ...  # Return type can be int or float, depending on x.
+    def __rpow__(self, x: int) -> Any: ...
+    def __and__(self, n: int) -> int: ...
+    def __or__(self, n: int) -> int: ...
+    def __xor__(self, n: int) -> int: ...
+    def __lshift__(self, n: int) -> int: ...
+    def __rshift__(self, n: int) -> int: ...
+    def __rand__(self, n: int) -> int: ...
+    def __ror__(self, n: int) -> int: ...
+    def __rxor__(self, n: int) -> int: ...
+    def __rlshift__(self, n: int) -> int: ...
+    def __rrshift__(self, n: int) -> int: ...
+    def __neg__(self) -> int: ...
+    def __pos__(self) -> int: ...
+    def __invert__(self) -> int: ...
+
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: int) -> bool: ...
+    def __le__(self, x: int) -> bool: ...
+    def __gt__(self, x: int) -> bool: ...
+    def __ge__(self, x: int) -> bool: ...
+
+    def __str__(self) -> str: ...
+    def __float__(self) -> float: ...
+    def __int__(self) -> int: ...
+    def __abs__(self) -> int: ...
+    def __hash__(self) -> int: ...
+
+class float(SupportsFloat, SupportsInt, SupportsAbs[float]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, x: SupportsFloat) -> None: ...
+    @overload
+    def __init__(self, x: unicode) -> None: ...
+    @overload
+    def __init__(self, x: bytearray) -> None: ...
+    def as_integer_ratio(self) -> Tuple[int, int]: ...
+    def hex(self) -> str: ...
+    def is_integer(self) -> bool: ...
+    @classmethod
+    def fromhex(cls, s: str) -> float: ...
+
+    def __add__(self, x: float) -> float: ...
+    def __sub__(self, x: float) -> float: ...
+    def __mul__(self, x: float) -> float: ...
+    def __floordiv__(self, x: float) -> float: ...
+    def __div__(self, x: float) -> float: ...
+    def __truediv__(self, x: float) -> float: ...
+    def __mod__(self, x: float) -> float: ...
+    def __pow__(self, x: float) -> float: ...
+    def __radd__(self, x: float) -> float: ...
+    def __rsub__(self, x: float) -> float: ...
+    def __rmul__(self, x: float) -> float: ...
+    def __rfloordiv__(self, x: float) -> float: ...
+    def __rdiv__(self, x: float) -> float: ...
+    def __rtruediv__(self, x: float) -> float: ...
+    def __rmod__(self, x: float) -> float: ...
+    def __rpow__(self, x: float) -> float: ...
+
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: float) -> bool: ...
+    def __le__(self, x: float) -> bool: ...
+    def __gt__(self, x: float) -> bool: ...
+    def __ge__(self, x: float) -> bool: ...
+    def __neg__(self) -> float: ...
+    def __pos__(self) -> float: ...
+
+    def __str__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __abs__(self) -> float: ...
+    def __hash__(self) -> int: ...
+
+class complex(SupportsAbs[float]):
+    @overload
+    def __init__(self, re: float = 0.0, im: float = 0.0) -> None: ...
+    @overload
+    def __init__(self, s: str) -> None: ...
+
+    @property
+    def real(self) -> float: ...
+    @property
+    def imag(self) -> float: ...
+
+    def conjugate(self) -> complex: ...
+
+    def __add__(self, x: complex) -> complex: ...
+    def __sub__(self, x: complex) -> complex: ...
+    def __mul__(self, x: complex) -> complex: ...
+    def __pow__(self, x: complex) -> complex: ...
+    def __div__(self, x: complex) -> complex: ...
+    def __truediv__(self, x: complex) -> complex: ...
+    def __radd__(self, x: complex) -> complex: ...
+    def __rsub__(self, x: complex) -> complex: ...
+    def __rmul__(self, x: complex) -> complex: ...
+    def __rpow__(self, x: complex) -> complex: ...
+    def __rdiv__(self, x: complex) -> complex: ...
+    def __rtruediv__(self, x: complex) -> complex: ...
+
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __neg__(self) -> complex: ...
+    def __pos__(self) -> complex: ...
+
+    def __str__(self) -> str: ...
+    def __abs__(self) -> float: ...
+    def __hash__(self) -> int: ...
+
+class basestring(metaclass=ABCMeta): ...
+
+class unicode(basestring, Sequence[unicode]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, o: object) -> None: ...
+    @overload
+    def __init__(self, o: str, encoding: unicode = ..., errors: unicode = ...) -> None: ...
+    def capitalize(self) -> unicode: ...
+    def center(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+    def count(self, x: unicode) -> int: ...
+    def decode(self, encoding: unicode = ..., errors: unicode = ...) -> unicode: ...
+    def encode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+    def endswith(self, suffix: Union[unicode, Tuple[unicode, ...]], start: int = 0,
+                 end: int = ...) -> bool: ...
+    def expandtabs(self, tabsize: int = 8) -> unicode: ...
+    def find(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def format(self, *args: Any, **kwargs: Any) -> unicode: ...
+    def format_map(self, map: Mapping[unicode, Any]) -> unicode: ...
+    def index(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def isalnum(self) -> bool: ...
+    def isalpha(self) -> bool: ...
+    def isdecimal(self) -> bool: ...
+    def isdigit(self) -> bool: ...
+    def isidentifier(self) -> bool: ...
+    def islower(self) -> bool: ...
+    def isnumeric(self) -> bool: ...
+    def isprintable(self) -> bool: ...
+    def isspace(self) -> bool: ...
+    def istitle(self) -> bool: ...
+    def isupper(self) -> bool: ...
+    def join(self, iterable: Iterable[unicode]) -> unicode: ...
+    def ljust(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+    def lower(self) -> unicode: ...
+    def lstrip(self, chars: unicode = ...) -> unicode: ...
+    def partition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+    def replace(self, old: unicode, new: unicode, count: int = ...) -> unicode: ...
+    def rfind(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def rindex(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def rjust(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+    def rpartition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+    def rsplit(self, sep: Optional[unicode] = ..., maxsplit: int = ...) -> List[unicode]: ...
+    def rstrip(self, chars: unicode = ...) -> unicode: ...
+    def split(self, sep: Optional[unicode] = ..., maxsplit: int = ...) -> List[unicode]: ...
+    def splitlines(self, keepends: bool = ...) -> List[unicode]: ...
+    def startswith(self, prefix: Union[unicode, Tuple[unicode, ...]], start: int = 0,
+                   end: int = ...) -> bool: ...
+    def strip(self, chars: unicode = ...) -> unicode: ...
+    def swapcase(self) -> unicode: ...
+    def title(self) -> unicode: ...
+    def translate(self, table: Union[Dict[int, Any], unicode]) -> unicode: ...
+    def upper(self) -> unicode: ...
+    def zfill(self, width: int) -> unicode: ...
+
+    @overload
+    def __getitem__(self, i: int) -> unicode: ...
+    @overload
+    def __getitem__(self, s: slice) -> unicode: ...
+    def __getslice__(self, start: int, stop: int) -> unicode: ...
+    def __add__(self, s: unicode) -> unicode: ...
+    def __mul__(self, n: int) -> unicode: ...
+    def __mod__(self, x: Any) -> unicode: ...
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: unicode) -> bool: ...
+    def __le__(self, x: unicode) -> bool: ...
+    def __gt__(self, x: unicode) -> bool: ...
+    def __ge__(self, x: unicode) -> bool: ...
+
+    def __len__(self) -> int: ...
+    def __contains__(self, s: object) -> bool: ...
+    def __iter__(self) -> Iterator[unicode]: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __hash__(self) -> int: ...
+
+class str(basestring, Sequence[str]):
+    def __init__(self, object: object) -> None: ...
+    def capitalize(self) -> str: ...
+    def center(self, width: int, fillchar: str = ...) -> str: ...
+    def count(self, x: unicode) -> int: ...
+    def decode(self, encoding: unicode = ..., errors: unicode = ...) -> unicode: ...
+    def encode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+    def endswith(self, suffix: Union[unicode, Tuple[unicode, ...]]) -> bool: ...
+    def expandtabs(self, tabsize: int = 8) -> str: ...
+    def find(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def format(self, *args: Any, **kwargs: Any) -> str: ...
+    def index(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def isalnum(self) -> bool: ...
+    def isalpha(self) -> bool: ...
+    def isdigit(self) -> bool: ...
+    def islower(self) -> bool: ...
+    def isspace(self) -> bool: ...
+    def istitle(self) -> bool: ...
+    def isupper(self) -> bool: ...
+    def join(self, iterable: Iterable[AnyStr]) -> AnyStr: ...
+    def ljust(self, width: int, fillchar: str = ...) -> str: ...
+    def lower(self) -> str: ...
+    @overload
+    def lstrip(self, chars: str = ...) -> str: ...
+    @overload
+    def lstrip(self, chars: unicode) -> unicode: ...
+    @overload
+    def partition(self, sep: bytearray) -> Tuple[str, bytearray, str]: ...
+    @overload
+    def partition(self, sep: str) -> Tuple[str, str, str]: ...
+    @overload
+    def partition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+    def replace(self, old: AnyStr, new: AnyStr, count: int = ...) -> AnyStr: ...
+    def rfind(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def rindex(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+    def rjust(self, width: int, fillchar: str = ...) -> str: ...
+    @overload
+    def rpartition(self, sep: bytearray) -> Tuple[str, bytearray, str]: ...
+    @overload
+    def rpartition(self, sep: str) -> Tuple[str, str, str]: ...
+    @overload
+    def rpartition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+    @overload
+    def rsplit(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[str]: ...
+    @overload
+    def rsplit(self, sep: unicode, maxsplit: int = ...) -> List[unicode]: ...
+    @overload
+    def rstrip(self, chars: str = ...) -> str: ...
+    @overload
+    def rstrip(self, chars: unicode) -> unicode: ...
+    @overload
+    def split(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[str]: ...
+    @overload
+    def split(self, sep: unicode, maxsplit: int = ...) -> List[unicode]: ...
+    def splitlines(self, keepends: bool = ...) -> List[str]: ...
+    def startswith(self, prefix: Union[unicode, Tuple[unicode, ...]]) -> bool: ...
+    @overload
+    def strip(self, chars: str = ...) -> str: ...
+    @overload
+    def strip(self, chars: unicode) -> unicode: ...
+    def swapcase(self) -> str: ...
+    def title(self) -> str: ...
+    def translate(self, table: Optional[AnyStr], deletechars: AnyStr = ...) -> AnyStr: ...
+    def upper(self) -> str: ...
+    def zfill(self, width: int) -> str: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __hash__(self) -> int: ...
+    @overload
+    def __getitem__(self, i: int) -> str: ...
+    @overload
+    def __getitem__(self, s: slice) -> str: ...
+    def __getslice__(self, start: int, stop: int) -> str: ...
+    def __add__(self, s: AnyStr) -> AnyStr: ...
+    def __mul__(self, n: int) -> str: ...
+    def __rmul__(self, n: int) -> str: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: unicode) -> bool: ...
+    def __le__(self, x: unicode) -> bool: ...
+    def __gt__(self, x: unicode) -> bool: ...
+    def __ge__(self, x: unicode) -> bool: ...
+    def __mod__(self, x: Any) -> str: ...
+
+class bytearray(MutableSequence[int]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, x: Union[Iterable[int], str]) -> None: ...
+    @overload
+    def __init__(self, x: unicode, encoding: unicode,
+                 errors: unicode = ...) -> None: ...
+    @overload
+    def __init__(self, length: int) -> None: ...
+    def capitalize(self) -> bytearray: ...
+    def center(self, width: int, fillchar: str = ...) -> bytearray: ...
+    def count(self, x: str) -> int: ...
+    def decode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+    def endswith(self, suffix: Union[str, Tuple[str, ...]]) -> bool: ...
+    def expandtabs(self, tabsize: int = 8) -> bytearray: ...
+    def find(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+    def index(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+    def insert(self, index: int, object: int) -> None: ...
+    def isalnum(self) -> bool: ...
+    def isalpha(self) -> bool: ...
+    def isdigit(self) -> bool: ...
+    def islower(self) -> bool: ...
+    def isspace(self) -> bool: ...
+    def istitle(self) -> bool: ...
+    def isupper(self) -> bool: ...
+    def join(self, iterable: Iterable[str]) -> bytearray: ...
+    def ljust(self, width: int, fillchar: str = ...) -> bytearray: ...
+    def lower(self) -> bytearray: ...
+    def lstrip(self, chars: str = ...) -> bytearray: ...
+    def partition(self, sep: str) -> Tuple[bytearray, bytearray, bytearray]: ...
+    def replace(self, old: str, new: str, count: int = ...) -> bytearray: ...
+    def rfind(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+    def rindex(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+    def rjust(self, width: int, fillchar: str = ...) -> bytearray: ...
+    def rpartition(self, sep: str) -> Tuple[bytearray, bytearray, bytearray]: ...
+    def rsplit(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[bytearray]: ...
+    def rstrip(self, chars: str = ...) -> bytearray: ...
+    def split(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[bytearray]: ...
+    def splitlines(self, keepends: bool = ...) -> List[bytearray]: ...
+    def startswith(self, prefix: Union[str, Tuple[str, ...]]) -> bool: ...
+    def strip(self, chars: str = ...) -> bytearray: ...
+    def swapcase(self) -> bytearray: ...
+    def title(self) -> bytearray: ...
+    def translate(self, table: str) -> bytearray: ...
+    def upper(self) -> bytearray: ...
+    def zfill(self, width: int) -> bytearray: ...
+    @staticmethod
+    def fromhex(x: str) -> bytearray: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[int]: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __hash__(self) -> int: ...
+    @overload
+    def __getitem__(self, i: int) -> int: ...
+    @overload
+    def __getitem__(self, s: slice) -> bytearray: ...
+    def __getslice__(self, start: int, stop: int) -> bytearray: ...
+    @overload
+    def __setitem__(self, i: int, x: int) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, x: Union[Iterable[int], str]) -> None: ...
+    def __setslice__(self, start: int, stop: int, x: Union[Sequence[int], str]) -> None: ...
+    def __delitem__(self, i: Union[int, slice]) -> None: ...
+    def __delslice__(self, start: int, stop: int) -> None: ...
+    def __add__(self, s: str) -> bytearray: ...
+    def __mul__(self, n: int) -> bytearray: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: str) -> bool: ...
+    def __le__(self, x: str) -> bool: ...
+    def __gt__(self, x: str) -> bool: ...
+    def __ge__(self, x: str) -> bool: ...
+
+class bool(int, SupportsInt, SupportsFloat):
+    def __init__(self, o: object = ...) -> None: ...
+
+class slice:
+    start = 0
+    step = 0
+    stop = 0
+    def __init__(self, start: int, stop: int = 0, step: int = 0) -> None: ...
+
+class tuple(Sequence[_T_co], Generic[_T_co]):
+    def __init__(self, iterable: Iterable[_T_co] = ...) -> None: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, x: object) -> bool: ...
+    @overload
+    def __getitem__(self, x: int) -> _T_co: ...
+    @overload
+    def __getitem__(self, x: slice) -> Tuple[_T_co, ...]: ...
+    def __iter__(self) -> Iterator[_T_co]: ...
+    def __lt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __le__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __gt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __ge__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __add__(self, x: Tuple[_T_co, ...]) -> Tuple[_T_co, ...]: ...
+    def __mul__(self, n: int) -> Tuple[_T_co, ...]: ...
+    def __rmul__(self, n: int) -> Tuple[_T_co, ...]: ...
+    def count(self, x: Any) -> int: ...
+    def index(self, x: Any) -> int: ...
+
+class function:
+    # TODO name of the class (corresponds to Python 'function' class)
+    __name__ = ...  # type: str
+    __module__ = ...  # type: str
+
+class list(MutableSequence[_T], Generic[_T]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[_T]) -> None: ...
+    def append(self, object: _T) -> None: ...
+    def extend(self, iterable: Iterable[_T]) -> None: ...
+    def pop(self, index: int = -1) -> _T: ...
+    def index(self, object: _T, start: int = 0, stop: int = ...) -> int: ...
+    def count(self, object: _T) -> int: ...
+    def insert(self, index: int, object: _T) -> None: ...
+    def remove(self, object: _T) -> None: ...
+    def reverse(self) -> None: ...
+    def sort(self, cmp: Callable[[_T, _T], Any] = ..., key: Callable[[_T], Any] = ..., reverse: bool = ...) -> None: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __hash__(self) -> int: ...
+    @overload
+    def __getitem__(self, i: int) -> _T: ...
+    @overload
+    def __getitem__(self, s: slice) -> List[_T]: ...
+    def __getslice__(self, start: int, stop: int) -> List[_T]: ...
+    @overload
+    def __setitem__(self, i: int, o: _T) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
+    def __setslice__(self, start: int, stop: int, o: Sequence[_T]) -> None: ...
+    def __delitem__(self, i: Union[int, slice]) -> None: ...
+    def __delslice__(self, start: int, stop: int) -> None: ...
+    def __add__(self, x: List[_T]) -> List[_T]: ...
+    def __iadd__(self, x: Iterable[_T]) -> List[_T]: ...
+    def __mul__(self, n: int) -> List[_T]: ...
+    def __rmul__(self, n: int) -> List[_T]: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __reversed__(self) -> Iterator[_T]: ...
+    def __gt__(self, x: List[_T]) -> bool: ...
+    def __ge__(self, x: List[_T]) -> bool: ...
+    def __lt__(self, x: List[_T]) -> bool: ...
+    def __le__(self, x: List[_T]) -> bool: ...
+
+class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
+    # NOTE: Keyword arguments are special. If they are used, _KT must include
+    #       str, but we have no way of enforcing it here.
+    @overload
+    def __init__(self, **kwargs: _VT) -> None: ...
+    @overload
+    def __init__(self, map: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+
+    def has_key(self, k: _KT) -> bool: ...
+    def clear(self) -> None: ...
+    def copy(self) -> Dict[_KT, _VT]: ...
+    def get(self, k: _KT, default: _VT = None) -> _VT: ...
+    def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
+    def popitem(self) -> Tuple[_KT, _VT]: ...
+    def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
+    @overload
+    def update(self, m: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+    @overload
+    def update(self, m: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+    def keys(self) -> List[_KT]: ...
+    def values(self) -> List[_VT]: ...
+    def items(self) -> List[Tuple[_KT, _VT]]: ...
+    def iterkeys(self) -> Iterator[_KT]: ...
+    def itervalues(self) -> Iterator[_VT]: ...
+    def iteritems(self) -> Iterator[Tuple[_KT, _VT]]: ...
+    def viewkeys(self) -> KeysView[_KT]: ...
+    def viewvalues(self) -> ValuesView[_VT]: ...
+    def viewitems(self) -> ItemsView[_KT, _VT]: ...
+    @staticmethod
+    @overload
+    def fromkeys(seq: Sequence[_T]) -> Dict[_T, Any]: ...  # TODO: Actually a class method (mypy/issues#328)
+    @staticmethod
+    @overload
+    def fromkeys(seq: Sequence[_T], value: _S) -> Dict[_T, _S]: ...
+    def __len__(self) -> int: ...
+    def __getitem__(self, k: _KT) -> _VT: ...
+    def __setitem__(self, k: _KT, v: _VT) -> None: ...
+    def __delitem__(self, v: _KT) -> None: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_KT]: ...
+    def __str__(self) -> str: ...
+
+class set(MutableSet[_T], Generic[_T]):
+    def __init__(self, iterable: Iterable[_T] = ...) -> None: ...
+    def add(self, element: _T) -> None: ...
+    def clear(self) -> None: ...
+    def copy(self) -> set[_T]: ...
+    def difference(self, *s: Iterable[Any]) -> set[_T]: ...
+    def difference_update(self, *s: Iterable[Any]) -> None: ...
+    def discard(self, element: _T) -> None: ...
+    def intersection(self, *s: Iterable[Any]) -> set[_T]: ...
+    def intersection_update(self, *s: Iterable[Any]) -> None: ...
+    def isdisjoint(self, s: Iterable[Any]) -> bool: ...
+    def issubset(self, s: Iterable[Any]) -> bool: ...
+    def issuperset(self, s: Iterable[Any]) -> bool: ...
+    def pop(self) -> _T: ...
+    def remove(self, element: _T) -> None: ...
+    def symmetric_difference(self, s: Iterable[_T]) -> set[_T]: ...
+    def symmetric_difference_update(self, s: Iterable[_T]) -> None: ...
+    def union(self, *s: Iterable[_T]) -> set[_T]: ...
+    def update(self, *s: Iterable[_T]) -> None: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __and__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __iand__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __or__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __ior__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __sub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __isub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __xor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __ixor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __le__(self, s: AbstractSet[Any]) -> bool: ...
+    def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+    def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+    def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+    # TODO more set operations
+
+class frozenset(FrozenSet[_T], Generic[_T]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[_T]) -> None: ...
+    def copy(self) -> frozenset[_T]: ...
+    def difference(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+    def intersection(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+    def isdisjoint(self, s: Iterable[_T]) -> bool: ...
+    def issubset(self, s: Iterable[Any]) -> bool: ...
+    def issuperset(self, s: Iterable[Any]) -> bool: ...
+    def symmetric_difference(self, s: Iterable[_T]) -> frozenset[_T]: ...
+    def union(self, *s: Iterable[_T]) -> frozenset[_T]: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __and__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+    def __or__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+    def __sub__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+    def __xor__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+    def __le__(self, s: AbstractSet[Any]) -> bool: ...
+    def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+    def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+    def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+
+class enumerate(Iterator[Tuple[int, _T]], Generic[_T]):
+    def __init__(self, iterable: Iterable[_T], start: int = 0) -> None: ...
+    def __iter__(self) -> Iterator[Tuple[int, _T]]: ...
+    def next(self) -> Tuple[int, _T]: ...
+    # TODO __getattribute__
+
+class xrange(Sized, Iterable[int], Reversible[int]):
+    @overload
+    def __init__(self, stop: int) -> None: ...
+    @overload
+    def __init__(self, start: int, stop: int, step: int = 1) -> None: ...
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[int]: ...
+    def __getitem__(self, i: int) -> int: ...
+    def __reversed__(self) -> Iterator[int]: ...
+
+class module:
+    __name__ = ...  # type: str
+    __file__ = ...  # type: str
+    __dict__ = ...  # type: Dict[unicode, Any]
+
+class property:
+    def __init__(self, fget: Callable[[Any], Any] = None,
+                 fset: Callable[[Any, Any], None] = None,
+                 fdel: Callable[[Any], None] = None, doc: str = None) -> None: ...
+    def getter(self, fget: Callable[[Any], Any]) -> property: ...
+    def setter(self, fset: Callable[[Any, Any], None]) -> property: ...
+    def deleter(self, fdel: Callable[[Any], None]) -> property: ...
+    def __get__(self, obj: Any, type: type=None) -> Any: ...
+    def __set__(self, obj: Any, value: Any) -> None: ...
+    def __delete__(self, obj: Any) -> None: ...
+
+long = int
+bytes = str
+
+NotImplemented = ...  # type: Any
+
+def abs(n: SupportsAbs[_T]) -> _T: ...
+def all(i: Iterable) -> bool: ...
+def any(i: Iterable) -> bool: ...
+def bin(number: int) -> str: ...
+def callable(o: object) -> bool: ...
+def chr(code: int) -> str: ...
+def compile(source: Any, filename: unicode, mode: str, flags: int = 0,
+            dont_inherit: int = 0) -> Any: ...
+def delattr(o: Any, name: unicode) -> None: ...
+def dir(o: object = ...) -> List[str]: ...
+ at overload
+def divmod(a: int, b: int) -> Tuple[int, int]: ...
+ at overload
+def divmod(a: float, b: float) -> Tuple[float, float]: ...
+def exit(code: int = ...) -> NoReturn: ...
+ at overload
+def filter(function: Callable[[_T], Any],
+           iterable: Iterable[_T]) -> List[_T]: ...
+ at overload
+def filter(function: None,
+           iterable: Iterable[Optional[_T]]) -> List[_T]: ...
+def format(o: object, format_spec: str = '') -> str: ...  # TODO unicode
+def getattr(o: Any, name: unicode, default: Any = None) -> Any: ...
+def hasattr(o: Any, name: unicode) -> bool: ...
+def hash(o: object) -> int: ...
+def hex(i: int) -> str: ...  # TODO __index__
+def id(o: object) -> int: ...
+def input(prompt: unicode = ...) -> Any: ...
+def intern(string: str) -> str: ...
+ at overload
+def iter(iterable: Iterable[_T]) -> Iterator[_T]: ...
+ at overload
+def iter(function: Callable[[], _T], sentinel: _T) -> Iterator[_T]: ...
+def isinstance(o: object, t: Union[type, Tuple[type, ...]]) -> bool: ...
+def issubclass(cls: type, classinfo: Union[type, Tuple[type, ...]]) -> bool: ...
+def len(o: Sized) -> int: ...
+ at overload
+def map(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> List[_S]: ...
+ at overload
+def map(func: Callable[[_T1, _T2], _S],
+        iter1: Iterable[_T1],
+        iter2: Iterable[_T2]) -> List[_S]: ...  # TODO more than two iterables
+ at overload
+def max(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def max(iterable: Iterable[_T], key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def min(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def min(iterable: Iterable[_T], key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def next(i: Iterator[_T]) -> _T: ...
+ at overload
+def next(i: Iterator[_T], default: _T) -> _T: ...
+def oct(i: int) -> str: ...  # TODO __index__
+ at overload
+def open(file: str, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+ at overload
+def open(file: unicode, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+ at overload
+def open(file: int, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+def ord(c: unicode) -> int: ...
+# This is only available after from __future__ import print_function.
+def print(*values: Any, sep: unicode = u' ', end: unicode = u'\n',
+           file: IO[Any] = ...) -> None: ...
+ at overload
+def pow(x: int, y: int) -> Any: ...  # The return type can be int or float, depending on y.
+ at overload
+def pow(x: int, y: int, z: int) -> Any: ...
+ at overload
+def pow(x: float, y: float) -> float: ...
+ at overload
+def pow(x: float, y: float, z: float) -> float: ...
+def quit(code: int = ...) -> None: ...
+def range(x: int, y: int = 0, step: int = 1) -> List[int]: ...
+def raw_input(prompt: unicode = ...) -> str: ...
+
+ at overload
+def reduce(function: Callable[[_T, _S], _T], iterable: Iterable[_S], initializer: _T) -> _T: ...
+ at overload
+def reduce(function: Callable[[_T, _T], _T], iterable: Iterable[_T]) -> _T: ...
+
+def reload(module: Any) -> Any: ...
+ at overload
+def reversed(object: Reversible[_T]) -> Iterator[_T]: ...
+ at overload
+def reversed(object: Sequence[_T]) -> Iterator[_T]: ...
+def repr(o: object) -> str: ...
+ at overload
+def round(number: float) -> float: ...
+ at overload
+def round(number: float, ndigits: int) -> float: ...  # Always return a float if given ndigits.
+ at overload
+def round(number: SupportsRound[_T]) -> _T: ...
+ at overload
+def round(number: SupportsRound[_T], ndigits: int) -> _T: ...
+def setattr(object: Any, name: unicode, value: Any) -> None: ...
+def sorted(iterable: Iterable[_T], *,
+           cmp: Callable[[_T, _T], int] = ...,
+           key: Callable[[_T], Any] = ...,
+           reverse: bool = ...) -> List[_T]: ...
+def sum(iterable: Iterable[_T], start: _T = ...) -> _T: ...
+def unichr(i: int) -> unicode: ...
+def vars(object: Any = ...) -> Dict[str, Any]: ...
+ at overload
+def zip(iter1: Iterable[_T1]) -> List[Tuple[_T1]]: ...
+ at overload
+def zip(iter1: Iterable[_T1],
+        iter2: Iterable[_T2]) -> List[Tuple[_T1, _T2]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2],
+        iter3: Iterable[_T3]) -> List[Tuple[_T1, _T2, _T3]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3],
+        iter4: Iterable[_T4]) -> List[Tuple[_T1, _T2,
+                                           _T3, _T4]]: ...  # TODO more than four iterables
+def __import__(name: unicode,
+               globals: Dict[str, Any] = ...,
+               locals: Dict[str, Any] = ...,
+               fromlist: List[str] = ..., level: int = ...) -> Any: ...
+
+def globals() -> Dict[str, Any]: ...
+def locals() -> Dict[str, Any]: ...
+
+# Actually the type of Ellipsis is <type 'ellipsis'>, but since it's
+# not exposed anywhere under that name, we make it private here.
+class ellipsis: ...
+Ellipsis = ...  # type: ellipsis
+
+# TODO: buffer support is incomplete; e.g. some_string.startswith(some_buffer) doesn't type check.
+AnyBuffer = TypeVar('AnyBuffer', str, unicode, bytearray, buffer)
+
+class buffer(Sized):
+    def __init__(self, object: AnyBuffer, offset: int = ..., size: int = ...) -> None: ...
+    def __add__(self, other: AnyBuffer) -> str: ...
+    def __cmp__(self, other: AnyBuffer) -> bool: ...
+    def __getitem__(self, key: Union[int, slice]) -> str: ...
+    def __getslice__(self, i: int, j: int) -> str: ...
+    def __len__(self) -> int: ...
+    def __mul__(self, x: int) -> str: ...
+
+class memoryview(Sized, Container[bytes]):
+    format = ...  # type: str
+    itemsize = ...  # type: int
+    shape = ...  # type: Optional[Tuple[int, ...]]
+    strides = ...  # type: Optional[Tuple[int, ...]]
+    suboffsets = ...  # type: Optional[Tuple[int, ...]]
+    readonly = ...  # type: bool
+    ndim = ...  # type: int
+
+    def __init__(self, obj: Union[str, bytearray, buffer, memoryview]) -> None: ...
+
+    @overload
+    def __getitem__(self, i: int) -> bytes: ...
+    @overload
+    def __getitem__(self, s: slice) -> memoryview: ...
+
+    def __contains__(self, x: object) -> bool: ...
+    def __iter__(self) -> Iterator[bytes]: ...
+    def __len__(self) -> int: ...
+
+    @overload
+    def __setitem__(self, i: int, o: bytes) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, o: Sequence[bytes]) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, o: memoryview) -> None: ...
+
+    def tobytes(self) -> bytes: ...
+    def tolist(self) -> List[int]: ...
+
+class BaseException:
+    args = ...  # type: Tuple[Any, ...]
+    message = ...  # type: str
+    def __init__(self, *args: Any) -> None: ...
+class GeneratorExit(BaseException): ...
+class KeyboardInterrupt(BaseException): ...
+class SystemExit(BaseException):
+    code = 0
+class Exception(BaseException): ...
+class StopIteration(Exception): ...
+class StandardError(Exception): ...
+class ArithmeticError(StandardError): ...
+class BufferError(StandardError): ...
+class EnvironmentError(StandardError):
+    errno = 0
+    strerror = ...  # type: str
+    # TODO can this be unicode?
+    filename = ...  # type: str
+class LookupError(StandardError): ...
+class RuntimeError(StandardError): ...
+class ValueError(StandardError): ...
+class AssertionError(StandardError): ...
+class AttributeError(StandardError): ...
+class EOFError(StandardError): ...
+class FloatingPointError(ArithmeticError): ...
+class IOError(EnvironmentError): ...
+class ImportError(StandardError): ...
+class IndexError(LookupError): ...
+class KeyError(LookupError): ...
+class MemoryError(StandardError): ...
+class NameError(StandardError): ...
+class NotImplementedError(RuntimeError): ...
+class OSError(EnvironmentError): ...
+class WindowsError(OSError):
+    winerror = ...  # type: int
+class OverflowError(ArithmeticError): ...
+class ReferenceError(StandardError): ...
+class SyntaxError(StandardError):
+    msg = ...  # type: str
+    lineno = ...  # type: int
+    offset = ...  # type: int
+    text = ...  # type: str
+class IndentationError(SyntaxError): ...
+class TabError(IndentationError): ...
+class SystemError(StandardError): ...
+class TypeError(StandardError): ...
+class UnboundLocalError(NameError): ...
+class UnicodeError(ValueError): ...
+class UnicodeDecodeError(UnicodeError): ...
+class UnicodeEncodeError(UnicodeError): ...
+class UnicodeTranslateError(UnicodeError): ...
+class ZeroDivisionError(ArithmeticError): ...
+
+class Warning(Exception): ...
+class UserWarning(Warning): ...
+class DeprecationWarning(Warning): ...
+class SyntaxWarning(Warning): ...
+class RuntimeWarning(Warning): ...
+class FutureWarning(Warning): ...
+class PendingDeprecationWarning(Warning): ...
+class ImportWarning(Warning): ...
+class UnicodeWarning(Warning): ...
+class BytesWarning(Warning): ...
+class ResourceWarning(Warning): ...
+
+def eval(s: str, globals: Dict[str, Any] = ..., locals: Dict[str, Any] = ...) -> Any: ...
+def exec(object: str,
+         globals: Dict[str, Any] = None,
+         locals: Dict[str, Any] = None) -> Any: ...  # TODO code object as source
+
+def cmp(x: Any, y: Any) -> int: ...
+
+def execfile(filename: str, globals: Dict[str, Any] = None, locals: Dict[str, Any] = None) -> None: ...
+
+class file(BinaryIO):
+    @overload
+    def __init__(self, file: str, mode: str = 'r', buffering: int = ...) -> None: ...
+    @overload
+    def __init__(self, file: unicode, mode: str = 'r', buffering: int = ...) -> None: ...
+    @overload
+    def __init__(self, file: int, mode: str = 'r', buffering: int = ...) -> None: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def read(self, n: int = ...) -> str: ...
+    def __enter__(self) -> BinaryIO: ...
+    def __exit__(self, t: type = None, exc: BaseException = None, tb: Any = None) -> bool: ...
+    def flush(self) -> None: ...
+    def fileno(self) -> int: ...
+    def isatty(self) -> bool: ...
+    def close(self) -> None: ...
+
+    def readable(self) -> bool: ...
+    def writable(self) -> bool: ...
+    def seekable(self) -> bool: ...
+    def seek(self, offset: int, whence: int = ...) -> None: ...
+    def tell(self) -> int: ...
+    def readline(self, limit: int = ...) -> str: ...
+    def readlines(self, hint: int = ...) -> List[str]: ...
+    def write(self, data: str) -> None: ...
+    def writelines(self, data: Iterable[str]) -> None: ...
+    def truncate(self, pos: int = ...) -> int: ...
+
+# Very old builtins
+def apply(func: Callable[..., _T], args: Sequence[Any] = None, kwds: Mapping[str, Any] = None) -> _T: ...
+_N = TypeVar('_N', bool, int, float, complex)
+def coerce(x: _N, y: _N) -> Tuple[_N, _N]: ...
diff --git a/typeshed/stdlib/2/cPickle.pyi b/typeshed/stdlib/2/cPickle.pyi
new file mode 100644
index 0000000..fb129d1
--- /dev/null
+++ b/typeshed/stdlib/2/cPickle.pyi
@@ -0,0 +1,32 @@
+from typing import Any, IO, List
+
+HIGHEST_PROTOCOL = ...  # type: int
+compatible_formats = ...  # type: List[str]
+format_version = ...  # type: str
+
+class Pickler:
+    def __init__(self, file: IO[str], protocol: int = ...) -> None: ...
+
+    def dump(self, obj: Any) -> None: ...
+
+    def clear_memo(self) -> None: ...
+
+
+class Unpickler:
+    def __init__(self, file: IO[str]) -> None: ...
+
+    def load(self) -> Any: ...
+
+    def noload(self) -> Any: ...
+
+
+def dump(obj: Any, file: IO[str], protocol: int = ...) -> None: ...
+def dumps(obj: Any, protocol: int = ...) -> str: ...
+def load(file: IO[str]) -> Any: ...
+def loads(str: str) -> Any: ...
+
+class PickleError(Exception): ...
+class UnpicklingError(PickleError): ...
+class BadPickleGet(UnpicklingError): ...
+class PicklingError(PickleError): ...
+class UnpickleableError(PicklingError): ...
diff --git a/typeshed/stdlib/2/cStringIO.pyi b/typeshed/stdlib/2/cStringIO.pyi
new file mode 100644
index 0000000..5b4ad25
--- /dev/null
+++ b/typeshed/stdlib/2/cStringIO.pyi
@@ -0,0 +1,50 @@
+# Stubs for cStringIO (Python 2.7)
+# See https://docs.python.org/2/library/stringio.html
+
+from typing import overload, IO, List, Iterable, Iterator, Optional, Union
+from types import TracebackType
+
+# TODO the typing.IO[] generics should be split into input and output.
+
+class InputType(IO[str], Iterator[str]):
+    def getvalue(self) -> str: ...
+    def close(self) -> None: ...
+    @property
+    def closed(self) -> bool: ...
+    def flush(self) -> None: ...
+    def isatty(self) -> bool: ...
+    def read(self, size: int = ...) -> str: ...
+    def readline(self, size: int = ...) -> str: ...
+    def readlines(self, hint: int = ...) -> List[str]: ...
+    def seek(self, offset: int, whence: int = ...) -> None: ...
+    def tell(self) -> int: ...
+    def truncate(self, size: int = ...) -> Optional[int]: ...
+    def __iter__(self) -> 'InputType': ...
+    def next(self) -> str: ...
+    def reset(self) -> None: ...
+
+class OutputType(IO[str], Iterator[str]):
+    @property
+    def softspace(self) -> int: ...
+    def getvalue(self) -> str: ...
+    def close(self) -> None: ...
+    @property
+    def closed(self) -> bool: ...
+    def flush(self) -> None: ...
+    def isatty(self) -> bool: ...
+    def read(self, size: int = ...) -> str: ...
+    def readline(self, size: int = ...) -> str: ...
+    def readlines(self, hint: int = ...) -> List[str]: ...
+    def seek(self, offset: int, whence: int = ...) -> None: ...
+    def tell(self) -> int: ...
+    def truncate(self, size: int = ...) -> Optional[int]: ...
+    def __iter__(self) -> 'OutputType': ...
+    def next(self) -> str: ...
+    def reset(self) -> None: ...
+    def write(self, b: Union[str, unicode]) -> None: ...
+    def writelines(self, lines: Iterable[Union[str, unicode]]) -> None: ...
+
+ at overload
+def StringIO() -> OutputType: ...
+ at overload
+def StringIO(s: str) -> InputType: ...
diff --git a/typeshed/stdlib/2/calendar.pyi b/typeshed/stdlib/2/calendar.pyi
new file mode 100644
index 0000000..6f1fd45
--- /dev/null
+++ b/typeshed/stdlib/2/calendar.pyi
@@ -0,0 +1,92 @@
+from typing import Any, Iterable, List, Optional, Tuple, Sequence
+import datetime
+
+LocaleType = Tuple[Optional[str], Optional[str]]
+
+class IllegalMonthError(ValueError):
+    def __init__(self, month: int) -> None: ...
+    def __str__(self) -> str: ...
+
+class IllegalWeekdayError(ValueError):
+    def __init__(self, weekday: int) -> None: ...
+    def __str__(self) -> str: ...
+
+def isleap(year: int) -> bool: ...
+def leapdays(y1: int, y2: int) -> int: ...
+def weekday(year: int, month: int, day: int) -> int: ...
+def monthrange(year: int, month: int) -> Tuple[int, int]: ...
+
+class Calendar(object):
+    def __init__(self, firstweekday: int = 0) -> None: ...
+    def getfirstweekday(self) -> int: ...
+    def setfirstweekday(self, firstweekday: int) -> None: ...
+    def iterweekdays(self) -> Iterable[int]: ...
+    def itermonthdates(self, year: int, month: int) -> Iterable[datetime.date]: ...
+    def itermonthdays2(self, year: int, month: int) -> Iterable[Tuple[int, int]]: ...
+    def itermonthdays(self, year: int, month: int) -> Iterable[int]: ...
+    def monthdatescalendar(self, year: int, month: int) -> List[List[datetime.date]]: ...
+    def monthdays2calendar(self, year: int, month: int) -> List[List[Tuple[int, int]]]: ...
+    def monthdayscalendar(self, year: int, month: int) -> List[List[int]]: ...
+    def yeardatescalendar(self, year: int, width: int = 3) -> List[List[int]]: ...
+    def yeardays2calendar(self, year: int, width: int = 3) -> List[List[Tuple[int, int]]]: ...
+    def yeardayscalendar(self, year: int, width: int = 3) -> List[List[int]]: ...
+
+class TextCalendar(Calendar):
+    def prweek(self, theweek: int, width: int) -> None: ...
+    def formatday(self, day: int, weekday: int, width: int) -> str: ...
+    def formatweek(self, theweek: int, width: int) -> str: ...
+    def formatweekday(self, day: int, width: int) -> str: ...
+    def formatweekheader(self, width: int) -> str: ...
+    def formatmonthname(self, theyear: int, themonth: int, width: int, withyear: bool = ...) -> str: ...
+    def prmonth(self, theyear: int, themonth: int, w: Any=0, l: Any = 0) -> None: ...
+    def formatmonth(self, theyear: int, themonth: int, w: int = 0, l: int = 0) -> str: ...
+    def formatyear(self, theyear: int, w: int = 2, l: int = 1, c: int = 6, m: int = 3) -> str: ...
+    def pryear(self, theyear: int, w: Any = 0, l: Any = 0, c: Any = 6, m: Any = 3) -> None: ...
+
+class HTMLCalendar(Calendar):
+    def formatday(self, day: int, weekday: int) -> str: ...
+    def formatweek(self, theweek: int) -> str: ...
+    def formatweekday(self, day: int) -> str: ...
+    def formatweekheader(self) -> str: ...
+    def formatmonthname(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+    def formatmonth(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+    def formatyear(self, theyear: int, width: int = 3) -> str: ...
+    def formatyearpage(self, theyear: int, width: int = 3, css: Optional[str] = ..., encoding: Optional[str] = ...) -> str: ...
+
+class TimeEncoding:
+    def __init__(self, locale: LocaleType) -> None: ...
+    def __enter__(self) -> LocaleType: ...
+    def __exit__(self, *args) -> None: ...
+
+class LocaleTextCalendar(TextCalendar):
+    def __init__(self, firstweekday: int = 0, locale: Optional[LocaleType] = ...) -> None: ...
+    def formatweekday(self, day: int, width: int) -> str: ...
+    def formatmonthname(self, theyear: int, themonth: int, width: int, withyear: bool = ...) -> str: ...
+
+class LocaleHTMLCalendar(HTMLCalendar):
+    def __init__(self, firstweekday: int = 0, locale: Optional[LocaleType] = ...) -> None: ...
+    def formatweekday(self, day: int) -> str: ...
+    def formatmonthname(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+
+c = ...  # type: TextCalendar
+def setfirstweekday(firstweekday: int) -> None: ...
+def format(cols: int, colwidth: int = ..., spacing: int = ...) -> str: ...
+def formatstring(cols: int, colwidth: int = ..., spacing: int = ...) -> str: ...
+def timegm(tuple: Tuple[int, ...]) -> int: ...
+
+# Data attributes
+day_name = ...  # type: Sequence[str]
+day_abbr = ...  # type: Sequence[str]
+month_name = ...  # type: Sequence[str]
+month_abbr = ...  # type: Sequence[str]
+
+# Below constants are not in docs or __all__, but enough people have used them
+# they are now effectively public.
+
+MONDAY = ...  # type: int
+TUESDAY = ...  # type: int
+WEDNESDAY = ...  # type: int
+THURSDAY = ...  # type: int
+FRIDAY = ...  # type: int
+SATURDAY = ...  # type: int
+SUNDAY = ...  # type: int
diff --git a/typeshed/stdlib/2/codecs.pyi b/typeshed/stdlib/2/codecs.pyi
new file mode 100644
index 0000000..0b2b49a
--- /dev/null
+++ b/typeshed/stdlib/2/codecs.pyi
@@ -0,0 +1,203 @@
+# Better codecs stubs hand-written by o11c.
+# https://docs.python.org/2/library/codecs.html
+from typing import (
+    BinaryIO,
+    Callable,
+    Iterable,
+    Iterator,
+    List,
+    Optional,
+    Tuple,
+    Union,
+)
+
+from abc import abstractmethod
+
+
+# TODO: this only satisfies the most common interface, where
+# str is the raw form and unicode is the cooked form.
+# In the long run, both should become template parameters maybe?
+# There *are* str->str and unicode->unicode encodings in the standard library.
+# And unlike python 3, they are in fairly widespread use.
+
+_decoded = unicode
+_encoded = str
+
+# TODO: It is not possible to specify these signatures correctly, because
+# they have an optional positional or keyword argument for errors=.
+_encode_type = Callable[[_decoded], _encoded]  # signature of Codec().encode
+_decode_type = Callable[[_encoded], _decoded]  # signature of Codec().decode
+_stream_reader_type = Callable[[BinaryIO], 'StreamReader']  # signature of StreamReader __init__
+_stream_writer_type = Callable[[BinaryIO], 'StreamWriter']  # signature of StreamWriter __init__
+_incremental_encoder_type = Callable[[], 'IncrementalEncoder']  # signature of IncrementalEncoder __init__
+_incremental_decode_type = Callable[[], 'IncrementalDecoder']  # signature of IncrementalDecoder __init__
+
+
+def encode(obj: _decoded, encoding: str = ..., errors: str = ...) -> _encoded:
+    ...
+def decode(obj: _encoded, encoding: str = ..., errors: str = ...) -> _decoded:
+    ...
+
+def lookup(encoding: str) -> 'CodecInfo':
+    ...
+class CodecInfo(Tuple[_encode_type, _decode_type, _stream_reader_type, _stream_writer_type]):
+    def __init__(self, encode: _encode_type, decode: _decode_type, streamreader: _stream_reader_type = ..., streamwriter: _stream_writer_type = ..., incrementalencoder: _incremental_encoder_type = ..., incrementaldecoder: _incremental_decode_type = ..., name: str = ...) -> None: ...
+    encode = ...  # type: _encode_type
+    decode = ...  # type: _decode_type
+    streamreader = ...  # type: _stream_reader_type
+    streamwriter = ...  # type: _stream_writer_type
+    incrementalencoder = ...  # type: _incremental_encoder_type
+    incrementaldecoder = ...  # type: _incremental_decode_type
+    name = ...  # type: str
+
+def getencoder(encoding: str) -> _encode_type:
+    ...
+def getdecoder(encoding: str) -> _encode_type:
+    ...
+def getincrementalencoder(encoding: str) -> _incremental_encoder_type:
+    ...
+def getincrementaldecoder(encoding: str) -> _incremental_encoder_type:
+    ...
+def getreader(encoding: str) -> _stream_reader_type:
+    ...
+def getwriter(encoding: str) -> _stream_writer_type:
+    ...
+
+def register(search_function: Callable[[str], CodecInfo]) -> None:
+    ...
+
+def open(filename: str, mode: str = ..., encoding: str = ..., errors: str = ..., buffering: int = ...) -> StreamReaderWriter:
+    ...
+
+def EncodedFile(file: BinaryIO, data_encoding: str, file_encoding: str = ..., errors: Optional[str] = ...) -> 'StreamRecoder':
+    ...
+
+def iterencode(iterator: Iterable[_decoded], encoding: str, errors: str = ...) -> Iterator[_encoded]:
+    ...
+def iterdecode(iterator: Iterable[_encoded], encoding: str, errors: str = ...) -> Iterator[_decoded]:
+    ...
+
+BOM = b''
+BOM_BE = b''
+BOM_LE = b''
+BOM_UTF8 = b''
+BOM_UTF16 = b''
+BOM_UTF16_BE = b''
+BOM_UTF16_LE = b''
+BOM_UTF32 = b''
+BOM_UTF32_BE = b''
+BOM_UTF32_LE = b''
+
+# It is expected that different actions be taken depending on which of the
+# three subclasses of `UnicodeError` is actually ...ed. However, the Union
+# is still needed for at least one of the cases.
+def register_error(name: str, error_handler: Callable[[UnicodeError], Tuple[Union[str, bytes], int]]) -> None:
+    ...
+def lookup_error(name: str) -> Callable[[UnicodeError], Tuple[Union[str, bytes], int]]:
+    ...
+
+def strict_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+    ...
+def replace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+    ...
+def ignore_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+    ...
+def xmlcharrefreplace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+    ...
+def backslashreplace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+    ...
+
+class Codec:
+    # These are sort of @abstractmethod but sort of not.
+    # The StreamReader and StreamWriter subclasses only implement one.
+    def encode(self, input: _decoded, errors: str = ...) -> Tuple[_encoded, int]:
+        ...
+    def decode(self, input: _encoded, errors: str = ...) -> Tuple[_decoded, int]:
+        ...
+
+class IncrementalEncoder:
+    errors = ...  # type: str
+    def __init__(self, errors: str = ...) -> None:
+        ...
+    @abstractmethod
+    def encode(self, object: _decoded, final: bool = ...) -> _encoded:
+        ...
+    def reset(self) -> None:
+        ...
+    # documentation says int but str is needed for the subclass.
+    def getstate(self) -> Union[int, _decoded]:
+        ...
+    def setstate(self, state: Union[int, _decoded]) -> None:
+        ...
+
+class IncrementalDecoder:
+    errors = ...  # type: str
+    def __init__(self, errors: str = ...) -> None:
+        ...
+    @abstractmethod
+    def decode(self, object: _encoded, final: bool = ...) -> _decoded:
+        ...
+    def reset(self) -> None:
+        ...
+    def getstate(self) -> Tuple[_encoded, int]:
+        ...
+    def setstate(self, state: Tuple[_encoded, int]) -> None:
+        ...
+
+# These are not documented but used in encodings/*.py implementations.
+class BufferedIncrementalEncoder(IncrementalEncoder):
+    buffer = ...  # type: str
+    def __init__(self, errors: str = ...) -> None:
+        ...
+    @abstractmethod
+    def _buffer_encode(self, input: _decoded, errors: str, final: bool) -> _encoded:
+        ...
+    def encode(self, input: _decoded, final: bool = ...) -> _encoded:
+        ...
+class BufferedIncrementalDecoder(IncrementalDecoder):
+    buffer = ...  # type: str
+    def __init__(self, errors: str = ...) -> None:
+        ...
+    @abstractmethod
+    def _buffer_decode(self, input: _encoded, errors: str, final: bool) -> Tuple[_decoded, int]:
+        ...
+    def decode(self, object: _encoded, final: bool = ...) -> _decoded:
+        ...
+
+# TODO: it is not possible to specify the requirement that all other
+# attributes and methods are passed-through from the stream.
+class StreamWriter(Codec):
+    errors = ...  # type: str
+    def __init__(self, stream: BinaryIO, errors: str = ...) -> None:
+        ...
+    def write(self, obj: _decoded) -> None:
+        ...
+    def writelines(self, list: List[str]) -> None:
+        ...
+    def reset(self) -> None:
+        ...
+
+class StreamReader(Codec):
+    errors = ...  # type: str
+    def __init__(self, stream: BinaryIO, errors: str = ...) -> None:
+        ...
+    def read(self, size: int = ..., chars: int = ..., firstline: bool = ...) -> _decoded:
+        ...
+    def readline(self, size: int = ..., keepends: bool = ...) -> _decoded:
+        ...
+    def readlines(self, sizehint: int = ..., keepends: bool = ...) -> List[_decoded]:
+        ...
+    def reset(self) -> None:
+        ...
+
+class StreamReaderWriter:
+    def __init__(self, stream: BinaryIO, Reader: _stream_reader_type, Writer: _stream_writer_type, errors: str = ...) -> None:
+        ...
+    def __enter__(self) -> BinaryIO:
+        ...
+    def __exit__(self, typ, exc, tb) -> bool:
+        ...
+
+class StreamRecoder(BinaryIO):
+    def __init__(self, stream: BinaryIO, encode: _encode_type, decode: _decode_type, Reader: _stream_reader_type, Writer: _stream_writer_type, errors: str = ...) -> None:
+        ...
diff --git a/typeshed/stdlib/2/collections.pyi b/typeshed/stdlib/2/collections.pyi
new file mode 100644
index 0000000..74fc2a8
--- /dev/null
+++ b/typeshed/stdlib/2/collections.pyi
@@ -0,0 +1,108 @@
+# Stubs for collections
+
+# Based on http://docs.python.org/2.7/library/collections.html
+
+# TODO more abstract base classes (interfaces in mypy)
+
+# NOTE: These are incomplete!
+
+from typing import (
+    Any, Container, Dict, Generic, TypeVar, Iterable, Tuple, Callable, Mapping, overload,
+    Iterator, Type, Sized, Optional, List, Set, Sequence, Union, Reversible,
+    MutableMapping, MutableSet, MutableSequence,
+)
+import typing
+
+_T = TypeVar('_T')
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+# namedtuple is special-cased in the type checker; the initializer is ignored.
+def namedtuple(typename: str, field_names: Union[str, Iterable[Any]], *,
+               verbose: bool = ..., rename: bool = ...) -> Type[tuple]: ...
+
+class deque(Sized, Iterable[_T], Reversible[_T], Generic[_T]):
+    def __init__(self, iterable: Iterable[_T] = ...,
+                 maxlen: int = ...) -> None: ...
+    @property
+    def maxlen(self) -> Optional[int]: ...
+    def append(self, x: _T) -> None: ...
+    def appendleft(self, x: _T) -> None: ...
+    def clear(self) -> None: ...
+    def count(self, x: _T) -> int: ...
+    def extend(self, iterable: Iterable[_T]) -> None: ...
+    def extendleft(self, iterable: Iterable[_T]) -> None: ...
+    def pop(self) -> _T: ...
+    def popleft(self) -> _T: ...
+    def remove(self, value: _T) -> None: ...
+    def reverse(self) -> None: ...
+    def rotate(self, n: int) -> None: ...
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __hash__(self) -> int: ...
+    def __getitem__(self, i: int) -> _T: ...
+    def __setitem__(self, i: int, x: _T) -> None: ...
+    def __contains__(self, o: _T) -> bool: ...
+    def __reversed__(self) -> Iterator[_T]: ...
+
+class Counter(Dict[_T, int], Generic[_T]):
+    # TODO: __init__ keyword arguments
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, Mapping: Mapping[_T, int]) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[_T]) -> None: ...
+    def elements(self) -> Iterator[_T]: ...
+    def most_common(self, n: int = ...) -> List[_T]: ...
+    @overload
+    def subtract(self, mapping: Mapping[_T, int]) -> None: ...
+    @overload
+    def subtract(self, iterable: Iterable[_T]) -> None: ...
+    # The Iterable[Tuple[...]] argument type is not actually desirable
+    # (the tuples will be added as keys, breaking type safety) but
+    # it's included so that the signature is compatible with
+    # Dict.update. Not sure if we should use '# type: ignore' instead
+    # and omit the type from the union.
+    @overload
+    def update(self, m: Mapping[_T, int], **kwargs: _VT) -> None: ...
+    @overload
+    def update(self, m: Union[Iterable[_T], Iterable[Tuple[_T, int]]], **kwargs: _VT) -> None: ...
+
+class OrderedDict(Dict[_KT, _VT], Generic[_KT, _VT]):
+    def popitem(self, last: bool = ...) -> Tuple[_KT, _VT]: ...
+    def move_to_end(self, key: _KT, last: bool = ...) -> None: ...
+
+class defaultdict(Dict[_KT, _VT], Generic[_KT, _VT]):
+    default_factory = ...  # type: Callable[[], _VT]
+    # TODO: __init__ keyword args
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, map: Mapping[_KT, _VT]) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[Tuple[_KT, _VT]]) -> None: ...
+    @overload
+    def __init__(self, default_factory: Callable[[], _VT]) -> None: ...
+    @overload
+    def __init__(self, default_factory: Callable[[], _VT],
+                 map: Mapping[_KT, _VT]) -> None: ...
+    @overload
+    def __init__(self, default_factory: Callable[[], _VT],
+                 iterable: Iterable[Tuple[_KT, _VT]]) -> None: ...
+    def __missing__(self, key: _KT) -> _VT: ...
+
+class ChainMap(Dict[_KT, _VT], Generic[_KT, _VT]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, *maps: Mapping[_KT, _VT]) -> None: ...
+
+    @property
+    def maps(self) -> List[Mapping[_KT, _VT]]: ...
+
+    def new_child(self, m: Mapping[_KT, _VT] = ...) -> ChainMap[_KT, _VT]: ...
+
+    @property
+    def parents(self) -> ChainMap[_KT, _VT]: ...
diff --git a/typeshed/stdlib/2/commands.pyi b/typeshed/stdlib/2/commands.pyi
new file mode 100644
index 0000000..864dbf4
--- /dev/null
+++ b/typeshed/stdlib/2/commands.pyi
@@ -0,0 +1,5 @@
+from typing import Tuple
+
+def getstatus(file: str) -> str: ...
+def getoutput(cmd: str) -> str: ...
+def getstatusoutput(cmd: str) -> Tuple[int, str]: ...
diff --git a/typeshed/stdlib/2/compileall.pyi b/typeshed/stdlib/2/compileall.pyi
new file mode 100644
index 0000000..103d622
--- /dev/null
+++ b/typeshed/stdlib/2/compileall.pyi
@@ -0,0 +1,7 @@
+# Stubs for compileall (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def compile_dir(dir, maxlevels=..., ddir=..., force=..., rx=..., quiet=...): ...
+def compile_file(fullname, ddir=..., force=..., rx=..., quiet=...): ...
+def compile_path(skip_curdir=..., maxlevels=..., force=..., quiet=...): ...
diff --git a/typeshed/stdlib/2/cookielib.pyi b/typeshed/stdlib/2/cookielib.pyi
new file mode 100644
index 0000000..f7389df
--- /dev/null
+++ b/typeshed/stdlib/2/cookielib.pyi
@@ -0,0 +1,110 @@
+# Stubs for cookielib (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class Cookie:
+    version = ...  # type: Any
+    name = ...  # type: Any
+    value = ...  # type: Any
+    port = ...  # type: Any
+    port_specified = ...  # type: Any
+    domain = ...  # type: Any
+    domain_specified = ...  # type: Any
+    domain_initial_dot = ...  # type: Any
+    path = ...  # type: Any
+    path_specified = ...  # type: Any
+    secure = ...  # type: Any
+    expires = ...  # type: Any
+    discard = ...  # type: Any
+    comment = ...  # type: Any
+    comment_url = ...  # type: Any
+    rfc2109 = ...  # type: Any
+    def __init__(self, version, name, value, port, port_specified, domain, domain_specified, domain_initial_dot, path, path_specified, secure, expires, discard, comment, comment_url, rest, rfc2109=False): ...
+    def has_nonstandard_attr(self, name): ...
+    def get_nonstandard_attr(self, name, default=None): ...
+    def set_nonstandard_attr(self, name, value): ...
+    def is_expired(self, now=None): ...
+
+class CookiePolicy:
+    def set_ok(self, cookie, request): ...
+    def return_ok(self, cookie, request): ...
+    def domain_return_ok(self, domain, request): ...
+    def path_return_ok(self, path, request): ...
+
+class DefaultCookiePolicy(CookiePolicy):
+    DomainStrictNoDots = ...  # type: Any
+    DomainStrictNonDomain = ...  # type: Any
+    DomainRFC2965Match = ...  # type: Any
+    DomainLiberal = ...  # type: Any
+    DomainStrict = ...  # type: Any
+    netscape = ...  # type: Any
+    rfc2965 = ...  # type: Any
+    rfc2109_as_netscape = ...  # type: Any
+    hide_cookie2 = ...  # type: Any
+    strict_domain = ...  # type: Any
+    strict_rfc2965_unverifiable = ...  # type: Any
+    strict_ns_unverifiable = ...  # type: Any
+    strict_ns_domain = ...  # type: Any
+    strict_ns_set_initial_dollar = ...  # type: Any
+    strict_ns_set_path = ...  # type: Any
+    def __init__(self, blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=..., strict_ns_set_initial_dollar=False, strict_ns_set_path=False): ...
+    def blocked_domains(self): ...
+    def set_blocked_domains(self, blocked_domains): ...
+    def is_blocked(self, domain): ...
+    def allowed_domains(self): ...
+    def set_allowed_domains(self, allowed_domains): ...
+    def is_not_allowed(self, domain): ...
+    def set_ok(self, cookie, request): ...
+    def set_ok_version(self, cookie, request): ...
+    def set_ok_verifiability(self, cookie, request): ...
+    def set_ok_name(self, cookie, request): ...
+    def set_ok_path(self, cookie, request): ...
+    def set_ok_domain(self, cookie, request): ...
+    def set_ok_port(self, cookie, request): ...
+    def return_ok(self, cookie, request): ...
+    def return_ok_version(self, cookie, request): ...
+    def return_ok_verifiability(self, cookie, request): ...
+    def return_ok_secure(self, cookie, request): ...
+    def return_ok_expires(self, cookie, request): ...
+    def return_ok_port(self, cookie, request): ...
+    def return_ok_domain(self, cookie, request): ...
+    def domain_return_ok(self, domain, request): ...
+    def path_return_ok(self, path, request): ...
+
+class Absent: ...
+
+class CookieJar:
+    non_word_re = ...  # type: Any
+    quote_re = ...  # type: Any
+    strict_domain_re = ...  # type: Any
+    domain_re = ...  # type: Any
+    dots_re = ...  # type: Any
+    magic_re = ...  # type: Any
+    def __init__(self, policy=None): ...
+    def set_policy(self, policy): ...
+    def add_cookie_header(self, request): ...
+    def make_cookies(self, response, request): ...
+    def set_cookie_if_ok(self, cookie, request): ...
+    def set_cookie(self, cookie): ...
+    def extract_cookies(self, response, request): ...
+    def clear(self, domain=None, path=None, name=None): ...
+    def clear_session_cookies(self): ...
+    def clear_expired_cookies(self): ...
+    def __iter__(self): ...
+    def __len__(self): ...
+
+class LoadError(IOError): ...
+
+class FileCookieJar(CookieJar):
+    filename = ...  # type: Any
+    delayload = ...  # type: Any
+    def __init__(self, filename=None, delayload=False, policy=None): ...
+    def save(self, filename=None, ignore_discard=False, ignore_expires=False): ...
+    def load(self, filename=None, ignore_discard=False, ignore_expires=False): ...
+    def revert(self, filename=None, ignore_discard=False, ignore_expires=False): ...
+
+MozillaCookieJar = FileCookieJar
+LWPCookieJar = FileCookieJar
+def lwp_cookie_str(cookie: Cookie) -> str: ...
diff --git a/typeshed/stdlib/2/copy.pyi b/typeshed/stdlib/2/copy.pyi
new file mode 100644
index 0000000..0661cb7
--- /dev/null
+++ b/typeshed/stdlib/2/copy.pyi
@@ -0,0 +1,10 @@
+# Stubs for copy
+
+# NOTE: These are incomplete!
+
+from typing import TypeVar, Dict, Any
+
+_T = TypeVar('_T')
+
+def deepcopy(x: _T, memo: Dict[Any, Any] = ...) -> _T: ...
+def copy(x: _T) -> _T: ...
diff --git a/typeshed/stdlib/2/csv.pyi b/typeshed/stdlib/2/csv.pyi
new file mode 100644
index 0000000..c91d330
--- /dev/null
+++ b/typeshed/stdlib/2/csv.pyi
@@ -0,0 +1,88 @@
+# Stubs for csv (Python 2.7)
+#
+# NOTE: Based on a dynamically typed stub automatically generated by stubgen.
+
+from typing import Any, Dict, Iterable, List, Sequence, Union
+
+# Public interface of _csv.reader's return type
+class _Reader(Iterable[List[str]]):
+    dialect = ...  # type: Dialect
+    line_num = ...  # type: int
+
+    def next(self) -> List[str]: ...
+
+_Row = Sequence[Union[str, int]]
+
+# Public interface of _csv.writer's return type
+class _Writer:
+    dialect = ...  # type: Dialect
+
+    def writerow(self, row: _Row) -> None: ...
+    def writerows(self, rows: Iterable[_Row]) -> None: ...
+
+QUOTE_ALL = ...  # type: int
+QUOTE_MINIMAL = ...  # type: int
+QUOTE_NONE = ...  # type: int
+QUOTE_NONNUMERIC = ...  # type: int
+
+class Error(Exception): ...
+
+_Dialect = Union[str, Dialect]
+
+def writer(csvfile: Any, dialect: _Dialect = ..., **fmtparams) -> _Writer: ...
+def reader(csvfile: Iterable[str], dialect: _Dialect = ..., **fmtparams) -> _Reader: ...
+def register_dialect(name, dialect=..., **fmtparams): ...
+def unregister_dialect(name): ...
+def get_dialect(name: str) -> Dialect: ...
+def list_dialects(): ...
+def field_size_limit(new_limit: int = ...) -> int: ...
+
+class Dialect:
+    delimiter = ...  # type: str
+    quotechar = ...  # type: str
+    escapechar = ...  # type: str
+    doublequote = ...  # type: bool
+    skipinitialspace = ...  # type: bool
+    lineterminator = ...  # type: str
+    quoting = ...  # type: int
+    def __init__(self) -> None: ...
+
+class excel(Dialect):
+    pass
+
+class excel_tab(excel):
+    pass
+
+class unix_dialect(Dialect):
+    pass
+
+class DictReader(Iterable):
+    restkey = ...  # type: Any
+    restval = ...  # type: Any
+    reader = ...  # type: Any
+    dialect = ...  # type: _Dialect
+    line_num = ...  # type: int
+    fieldnames = ...  # type: Sequence[Any]
+    def __init__(self, f: Iterable[str], fieldnames: Sequence[Any] = ..., restkey=...,
+                 restval=..., dialect: _Dialect = ..., *args, **kwds) -> None: ...
+    def __iter__(self): ...
+    def __next__(self): ...
+
+_DictRow = Dict[Any, Union[str, int]]
+
+class DictWriter:
+    fieldnames = ...  # type: Any
+    restval = ...  # type: Any
+    extrasaction = ...  # type: Any
+    writer = ...  # type: Any
+    def __init__(self, f: Any, fieldnames: Sequence[Any], restval=..., extrasaction: str = ...,
+                 dialect: _Dialect = ..., *args, **kwds) -> None: ...
+    def writeheader(self) -> None: ...
+    def writerow(self, rowdict: _DictRow) -> None: ...
+    def writerows(self, rowdicts: Iterable[_DictRow]) -> None: ...
+
+class Sniffer:
+    preferred = ...  # type: Any
+    def __init__(self) -> None: ...
+    def sniff(self, sample: str, delimiters: str = ...) -> Dialect: ...
+    def has_header(self, sample: str) -> bool: ...
diff --git a/typeshed/stdlib/2/datetime.pyi b/typeshed/stdlib/2/datetime.pyi
new file mode 100644
index 0000000..e7f4b44
--- /dev/null
+++ b/typeshed/stdlib/2/datetime.pyi
@@ -0,0 +1,212 @@
+# Stubs for datetime
+
+# NOTE: These are incomplete!
+
+from time import struct_time
+from typing import Optional, SupportsAbs, Tuple, Union, overload
+
+MINYEAR = 0
+MAXYEAR = 0
+
+class tzinfo(object):
+    def tzname(self, dt: Optional[datetime]) -> str: ...
+    def utcoffset(self, dt: Optional[datetime]) -> Optional[timedelta]: ...
+    def dst(self, dt: Optional[datetime]) -> Optional[timedelta]: ...
+    def fromutc(self, dt: datetime) -> datetime: ...
+
+_tzinfo = tzinfo
+
+class date(object):
+    min = ...  # type: date
+    max = ...  # type: date
+    resolution = ...  # type: timedelta
+
+    def __init__(self, year: int, month: int = ..., day: int = ...) -> None: ...
+
+    @classmethod
+    def fromtimestamp(cls, t: float) -> date: ...
+    @classmethod
+    def today(cls) -> date: ...
+    @classmethod
+    def fromordinal(cls, n: int) -> date: ...
+
+    @property
+    def year(self) -> int: ...
+    @property
+    def month(self) -> int: ...
+    @property
+    def day(self) -> int: ...
+
+    def ctime(self) -> str: ...
+    def strftime(self, fmt: str) -> str: ...
+    def __format__(self, fmt: Union[str, unicode]) -> str: ...
+    def isoformat(self) -> str: ...
+    def timetuple(self) -> struct_time: ...
+    def toordinal(self) -> int: ...
+    def replace(self, year: int = ..., month: int = ..., day: int = ...) -> date: ...
+    def __le__(self, other: date) -> bool: ...
+    def __lt__(self, other: date) -> bool: ...
+    def __ge__(self, other: date) -> bool: ...
+    def __gt__(self, other: date) -> bool: ...
+    def __add__(self, other: timedelta) -> date: ...
+    @overload
+    def __sub__(self, other: timedelta) -> date: ...
+    @overload
+    def __sub__(self, other: date) -> timedelta: ...
+    def __hash__(self) -> int: ...
+    def weekday(self) -> int: ...
+    def isoweekday(self) -> int: ...
+    def isocalendar(self) -> Tuple[int, int, int]: ...
+
+class time:
+    min = ...  # type: time
+    max = ...  # type: time
+    resolution = ...  # type: timedelta
+
+    def __init__(self, hour: int = ..., minute: int = ..., second: int = ..., microsecond: int = ...,
+                 tzinfo: tzinfo = ...) -> None: ...
+
+    @property
+    def hour(self) -> int: ...
+    @property
+    def minute(self) -> int: ...
+    @property
+    def second(self) -> int: ...
+    @property
+    def microsecond(self) -> int: ...
+    @property
+    def tzinfo(self) -> _tzinfo: ...
+
+    def __le__(self, other: time) -> bool: ...
+    def __lt__(self, other: time) -> bool: ...
+    def __ge__(self, other: time) -> bool: ...
+    def __gt__(self, other: time) -> bool: ...
+    def __hash__(self) -> int: ...
+    def isoformat(self) -> str: ...
+    def strftime(self, fmt: str) -> str: ...
+    def __format__(self, fmt: str) -> str: ...
+    def utcoffset(self) -> Optional[timedelta]: ...
+    def tzname(self) -> Optional[str]: ...
+    def dst(self) -> Optional[int]: ...
+    def replace(self, hour: int = ..., minute: int = ..., second: int = ...,
+                microsecond: int = ..., tzinfo: Union[_tzinfo, bool] = ...) -> time: ...
+
+_date = date
+_time = time
+
+class timedelta(SupportsAbs[timedelta]):
+    min = ...  # type: timedelta
+    max = ...  # type: timedelta
+    resolution = ...  # type: timedelta
+
+    def __init__(self, days: float = ..., seconds: float = ..., microseconds: float = ...,
+                 milliseconds: float = ..., minutes: float = ..., hours: float = ...,
+                 weeks: float = ...) -> None: ...
+
+    @property
+    def days(self) -> int: ...
+    @property
+    def seconds(self) -> int: ...
+    @property
+    def microseconds(self) -> int: ...
+
+    def total_seconds(self) -> float: ...
+    def __add__(self, other: timedelta) -> timedelta: ...
+    def __radd__(self, other: timedelta) -> timedelta: ...
+    def __sub__(self, other: timedelta) -> timedelta: ...
+    def __rsub(self, other: timedelta) -> timedelta: ...
+    def __neg__(self) -> timedelta: ...
+    def __pos__(self) -> timedelta: ...
+    def __abs__(self) -> timedelta: ...
+    def __mul__(self, other: float) -> timedelta: ...
+    def __rmul__(self, other: float) -> timedelta: ...
+    @overload
+    def __floordiv__(self, other: timedelta) -> int: ...
+    @overload
+    def __floordiv__(self, other: int) -> timedelta: ...
+    @overload
+    def __truediv__(self, other: timedelta) -> float: ...
+    @overload
+    def __truediv__(self, other: float) -> timedelta: ...
+    def __mod__(self, other: timedelta) -> timedelta: ...
+    def __divmod__(self, other: timedelta) -> Tuple[int, timedelta]: ...
+    def __le__(self, other: timedelta) -> bool: ...
+    def __lt__(self, other: timedelta) -> bool: ...
+    def __ge__(self, other: timedelta) -> bool: ...
+    def __gt__(self, other: timedelta) -> bool: ...
+    def __hash__(self) -> int: ...
+
+class datetime(object):
+    # TODO: is actually subclass of date, but __le__, __lt__, __ge__, __gt__ don't work with date.
+    min = ...  # type: datetime
+    max = ...  # type: datetime
+    resolution = ...  # type: timedelta
+
+    def __init__(self, year: int, month: int = ..., day: int = ..., hour: int = ...,
+                 minute: int = ..., second: int = ..., microseconds: int = ...,
+                 tzinfo: tzinfo = ...) -> None: ...
+
+    @property
+    def year(self) -> int: ...
+    @property
+    def month(self) -> int: ...
+    @property
+    def day(self) -> int: ...
+    @property
+    def hour(self) -> int: ...
+    @property
+    def minute(self) -> int: ...
+    @property
+    def second(self) -> int: ...
+    @property
+    def microsecond(self) -> int: ...
+    @property
+    def tzinfo(self) -> _tzinfo: ...
+
+    @classmethod
+    def fromtimestamp(cls, t: float, tz: _tzinfo = ...) -> datetime: ...
+    @classmethod
+    def utcfromtimestamp(cls, t: float) -> datetime: ...
+    @classmethod
+    def today(cls) -> datetime: ...
+    @classmethod
+    def fromordinal(cls, n: int) -> datetime: ...
+    @classmethod
+    def now(cls, tz: _tzinfo = ...) -> datetime: ...
+    @classmethod
+    def utcnow(cls) -> datetime: ...
+    @classmethod
+    def combine(cls, date: date, time: time) -> datetime: ...
+    def strftime(self, fmt: str) -> str: ...
+    def __format__(self, fmt: str) -> str: ...
+    def toordinal(self) -> int: ...
+    def timetuple(self) -> struct_time: ...
+    def timestamp(self) -> float: ...
+    def utctimetuple(self) -> struct_time: ...
+    def date(self) -> _date: ...
+    def time(self) -> _time: ...
+    def timetz(self) -> _time: ...
+    def replace(self, year: int = ..., month: int = ..., day: int = ..., hour: int = ...,
+                minute: int = ..., second: int = ..., microsecond: int = ..., tzinfo:
+                Union[_tzinfo, bool] = ...) -> datetime: ...
+    def astimezone(self, tz: _tzinfo = ...) -> datetime: ...
+    def ctime(self) -> str: ...
+    def isoformat(self, sep: str = ...) -> str: ...
+    @classmethod
+    def strptime(cls, date_string: str, format: str) -> datetime: ...
+    def utcoffset(self) -> Optional[timedelta]: ...
+    def tzname(self) -> Optional[str]: ...
+    def dst(self) -> Optional[int]: ...
+    def __le__(self, other: datetime) -> bool: ...
+    def __lt__(self, other: datetime) -> bool: ...
+    def __ge__(self, other: datetime) -> bool: ...
+    def __gt__(self, other: datetime) -> bool: ...
+    def __add__(self, other: timedelta) -> datetime: ...
+    @overload
+    def __sub__(self, other: datetime) -> timedelta: ...
+    @overload
+    def __sub__(self, other: timedelta) -> datetime: ...
+    def __hash__(self) -> int: ...
+    def weekday(self) -> int: ...
+    def isoweekday(self) -> int: ...
+    def isocalendar(self) -> Tuple[int, int, int]: ...
diff --git a/typeshed/stdlib/2/decimal.pyi b/typeshed/stdlib/2/decimal.pyi
new file mode 100644
index 0000000..ce4d586
--- /dev/null
+++ b/typeshed/stdlib/2/decimal.pyi
@@ -0,0 +1,245 @@
+# Stubs for decimal (Python 2)
+
+from typing import (
+    Any, Dict, NamedTuple, Optional, Sequence, Tuple, Union,
+    SupportsAbs, SupportsFloat, SupportsInt,
+)
+
+_Decimal = Union[Decimal, int]
+_ComparableNum = Union[Decimal, int, float]
+
+DecimalTuple = NamedTuple('DecimalTuple',
+                          [('sign', int),
+                           ('digits', Sequence[int]),  # TODO: Use Tuple[int, ...]
+                           ('exponent', int)])
+
+ROUND_DOWN = ...  # type: str
+ROUND_HALF_UP = ...  # type: str
+ROUND_HALF_EVEN = ...  # type: str
+ROUND_CEILING = ...  # type: str
+ROUND_FLOOR = ...  # type: str
+ROUND_UP = ...  # type: str
+ROUND_HALF_DOWN = ...  # type: str
+ROUND_05UP = ...  # type: str
+
+class DecimalException(ArithmeticError):
+    def handle(self, context, *args): ...
+
+class Clamped(DecimalException): ...
+
+class InvalidOperation(DecimalException): ...
+
+class ConversionSyntax(InvalidOperation): ...
+
+class DivisionByZero(DecimalException, ZeroDivisionError): ...
+
+class DivisionImpossible(InvalidOperation): ...
+
+class DivisionUndefined(InvalidOperation, ZeroDivisionError): ...
+
+class Inexact(DecimalException): ...
+
+class InvalidContext(InvalidOperation): ...
+
+class Rounded(DecimalException): ...
+
+class Subnormal(DecimalException): ...
+
+class Overflow(Inexact, Rounded): ...
+
+class Underflow(Inexact, Rounded, Subnormal): ...
+
+def setcontext(context: Context): ...
+def getcontext() -> Context: ...
+def localcontext(ctx: Optional[Context] = None) -> _ContextManager: ...
+
+class Decimal(SupportsAbs[Decimal], SupportsFloat, SupportsInt):
+    def __init__(cls, value: Union[_Decimal, float, str,
+                                   Tuple[int, Sequence[int], int]] = ...,
+                 context: Context = ...) -> None: ...
+    @classmethod
+    def from_float(cls, f: float) -> Decimal: ...
+    def __nonzero__(self) -> bool: ...
+    def __eq__(self, other: object) -> bool: ...
+    def __ne__(self, other: object) -> bool: ...
+    def __lt__(self, other: _ComparableNum) -> bool: ...
+    def __le__(self, other: _ComparableNum) -> bool: ...
+    def __gt__(self, other: _ComparableNum) -> bool: ...
+    def __ge__(self, other: _ComparableNum) -> bool: ...
+    def compare(self, other: _Decimal) -> Decimal: ...
+    def __hash__(self) -> int: ...
+    def as_tuple(self) -> DecimalTuple: ...
+    def to_eng_string(self, context: Context = ...) -> str: ...
+    def __neg__(self) -> Decimal: ...
+    def __pos__(self) -> Decimal: ...
+    def __abs__(self, round: bool = True) -> Decimal: ...
+    def __add__(self, other: _Decimal) -> Decimal: ...
+    def __radd__(self, other: int) -> Decimal: ...
+    def __sub__(self, other: _Decimal) -> Decimal: ...
+    def __rsub__(self, other: int) -> Decimal: ...
+    def __mul__(self, other: _Decimal) -> Decimal: ...
+    def __rmul__(self, other: int) -> Decimal: ...
+    def __truediv__(self, other: _Decimal) -> Decimal: ...
+    def __rtruediv__(self, other: int) -> Decimal: ...
+    def __div__(self, other: _Decimal) -> Decimal: ...
+    def __rdiv__(self, other: int) -> Decimal: ...
+    def __divmod__(self, other: _Decimal) -> Tuple[Decimal, Decimal]: ...
+    def __rdivmod__(self, other: int) -> Tuple[Decimal, Decimal]: ...
+    def __mod__(self, other: _Decimal) -> Decimal: ...
+    def __rmod__(self, other: int) -> Decimal: ...
+    def remainder_near(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def __floordiv__(self, other: _Decimal) -> Decimal: ...
+    def __rfloordiv__(self, other: int) -> Decimal: ...
+    def __float__(self) -> float: ...
+    def __int__(self) -> int: ...
+    def __trunc__(self) -> int: ...
+    @property
+    def imag(self) -> Decimal: ...
+    @property
+    def real(self) -> Decimal: ...
+    def conjugate(self) -> Decimal: ...
+    def __complex__(self) -> complex: ...
+    def __long__(self) -> long: ...
+    def fma(self, other: _Decimal, third: _Decimal, context: Context = ...) -> Decimal: ...
+    def __pow__(self, other: _Decimal) -> Decimal: ...
+    def __rpow__(self, other: int) -> Decimal: ...
+    def normalize(self, context: Context = ...) -> Decimal: ...
+    def quantize(self, exp: _Decimal, rounding: str = ...,
+                 context: Context = ...) -> Decimal: ...
+    def same_quantum(self, other: Decimal) -> bool: ...
+    def to_integral(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+    def to_integral_exact(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+    def to_integral_value(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+    def sqrt(self, context: Context = ...) -> Decimal: ...
+    def max(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def min(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def adjusted(self) -> int: ...
+    def canonical(self, context: Context = ...) -> Decimal: ...
+    def compare_signal(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def compare_total(self, other: _Decimal) -> Decimal: ...
+    def compare_total_mag(self, other: _Decimal) -> Decimal: ...
+    def copy_abs(self) -> Decimal: ...
+    def copy_negate(self) -> Decimal: ...
+    def copy_sign(self, other: _Decimal) -> Decimal: ...
+    def exp(self, context: Context = ...) -> Decimal: ...
+    def is_canonical(self) -> bool: ...
+    def is_finite(self) -> bool: ...
+    def is_infinite(self) -> bool: ...
+    def is_nan(self) -> bool: ...
+    def is_normal(self, context: Context = ...) -> bool: ...
+    def is_qnan(self) -> bool: ...
+    def is_signed(self) -> bool: ...
+    def is_snan(self) -> bool: ...
+    def is_subnormal(self, context: Context = ...) -> bool: ...
+    def is_zero(self) -> bool: ...
+    def ln(self, context: Context = ...) -> Decimal: ...
+    def log10(self, context: Context = ...) -> Decimal: ...
+    def logb(self, context: Context = ...) -> Decimal: ...
+    def logical_and(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def logical_invert(self, context: Context = ...) -> Decimal: ...
+    def logical_or(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def logical_xor(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def max_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def min_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def next_minus(self, context: Context = ...) -> Decimal: ...
+    def next_plus(self, context: Context = ...) -> Decimal: ...
+    def next_toward(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def number_class(self, context: Context = ...) -> str: ...
+    def radix(self) -> Decimal: ...
+    def rotate(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def scaleb(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def shift(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def __reduce__(self): ...
+    def __copy__(self): ...
+    def __deepcopy__(self, memo): ...
+    def __format__(self, specifier, context=None, _localeconv=None) -> str: ...
+
+class _ContextManager:
+    new_context = ...  # type: Context
+    saved_context = ...  # type: Context
+    def __init__(self, new_context: Context) -> None: ...
+    def __enter__(self): ...
+    def __exit__(self, t, v, tb): ...
+
+class Context:
+    prec = ...  # type: int
+    rounding = ...  # type: str
+    Emin = ...  # type: int
+    Emax = ...  # type: int
+    capitals = ...  # type: int
+    traps = ...  # type: Dict[type, bool]
+    flags = ...  # type: Any
+    def __init__(self, prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=None, _clamp=0, _ignored_flags=None): ...
+    def clear_flags(self): ...
+    def copy(self): ...
+    __copy__ = ...  # type: Any
+    __hash__ = ...  # type: Any
+    def Etiny(self): ...
+    def Etop(self): ...
+    def create_decimal(self, num=...): ...
+    def create_decimal_from_float(self, f): ...
+    def abs(self, a): ...
+    def add(self, a, b): ...
+    def canonical(self, a): ...
+    def compare(self, a, b): ...
+    def compare_signal(self, a, b): ...
+    def compare_total(self, a, b): ...
+    def compare_total_mag(self, a, b): ...
+    def copy_abs(self, a): ...
+    def copy_decimal(self, a): ...
+    def copy_negate(self, a): ...
+    def copy_sign(self, a, b): ...
+    def divide(self, a, b): ...
+    def divide_int(self, a, b): ...
+    def divmod(self, a, b): ...
+    def exp(self, a): ...
+    def fma(self, a, b, c): ...
+    def is_canonical(self, a): ...
+    def is_finite(self, a): ...
+    def is_infinite(self, a): ...
+    def is_nan(self, a): ...
+    def is_normal(self, a): ...
+    def is_qnan(self, a): ...
+    def is_signed(self, a): ...
+    def is_snan(self, a): ...
+    def is_subnormal(self, a): ...
+    def is_zero(self, a): ...
+    def ln(self, a): ...
+    def log10(self, a): ...
+    def logb(self, a): ...
+    def logical_and(self, a, b): ...
+    def logical_invert(self, a): ...
+    def logical_or(self, a, b): ...
+    def logical_xor(self, a, b): ...
+    def max(self, a, b): ...
+    def max_mag(self, a, b): ...
+    def min(self, a, b): ...
+    def min_mag(self, a, b): ...
+    def minus(self, a): ...
+    def multiply(self, a, b): ...
+    def next_minus(self, a): ...
+    def next_plus(self, a): ...
+    def next_toward(self, a, b): ...
+    def normalize(self, a): ...
+    def number_class(self, a): ...
+    def plus(self, a): ...
+    def power(self, a, b, modulo=None): ...
+    def quantize(self, a, b): ...
+    def radix(self): ...
+    def remainder(self, a, b): ...
+    def remainder_near(self, a, b): ...
+    def rotate(self, a, b): ...
+    def same_quantum(self, a, b): ...
+    def scaleb(self, a, b): ...
+    def shift(self, a, b): ...
+    def sqrt(self, a): ...
+    def subtract(self, a, b): ...
+    def to_eng_string(self, a): ...
+    def to_sci_string(self, a): ...
+    def to_integral_exact(self, a): ...
+    def to_integral_value(self, a): ...
+    def to_integral(self, a): ...
+
+DefaultContext = ...  # type: Context
+BasicContext = ...  # type: Context
+ExtendedContext = ...  # type: Context
diff --git a/typeshed/stdlib/2/difflib.pyi b/typeshed/stdlib/2/difflib.pyi
new file mode 100644
index 0000000..e0809f8
--- /dev/null
+++ b/typeshed/stdlib/2/difflib.pyi
@@ -0,0 +1,64 @@
+# Stubs for difflib
+
+# Based on https://docs.python.org/2.7/library/difflib.html
+
+# TODO: Support unicode?
+
+from typing import (
+    TypeVar, Callable, Iterable, Iterator, List, NamedTuple, Sequence, Tuple,
+    Generic, Optional
+)
+
+_T = TypeVar('_T')
+
+class SequenceMatcher(Generic[_T]):
+    def __init__(self, isjunk: Optional[Callable[[_T], bool]] = ...,
+                 a: Sequence[_T] = ..., b: Sequence[_T] = ...,
+                 autojunk: bool = ...) -> None: ...
+    def set_seqs(self, a: Sequence[_T], b: Sequence[_T]) -> None: ...
+    def set_seq1(self, a: Sequence[_T]) -> None: ...
+    def set_seq2(self, b: Sequence[_T]) -> None: ...
+    def find_longest_match(self, alo: int, ahi: int, blo: int,
+                           bhi: int) -> Tuple[int, int, int]: ...
+    def get_matching_blocks(self) -> List[Tuple[int, int, int]]: ...
+    def get_opcodes(self) -> List[Tuple[str, int, int, int, int]]: ...
+    def get_grouped_opcodes(self, n: int = ...
+                            ) -> Iterable[Tuple[str, int, int, int, int]]: ...
+    def ratio(self) -> float: ...
+    def quick_ratio(self) -> float: ...
+    def real_quick_ratio(self) -> float: ...
+
+def get_close_matches(word: Sequence[_T], possibilities: List[Sequence[_T]],
+                      n: int = ..., cutoff: float = ...) -> List[Sequence[_T]]: ...
+
+class Differ:
+    def __init__(self, linejunk: Callable[[str], bool] = ...,
+                 charjunk: Callable[[str], bool] = ...) -> None: ...
+    def compare(self, a: Sequence[str], b: Sequence[str]) -> Iterator[str]: ...
+
+def IS_LINE_JUNK(str) -> bool: ...
+def IS_CHARACTER_JUNK(str) -> bool: ...
+def unified_diff(a: Sequence[str], b: Sequence[str], fromfile: str = ...,
+                 tofile: str = ..., fromfiledate: str = ..., tofiledate: str = ...,
+                 n: int = ..., lineterm: str = ...) -> Iterator[str]: ...
+def context_diff(a: Sequence[str], b: Sequence[str], fromfile: str=...,
+                 tofile: str = ..., fromfiledate: str = ..., tofiledate: str = ...,
+                 n: int = ..., lineterm: str = ...) -> Iterator[str]: ...
+def ndiff(a: Sequence[str], b: Sequence[str],
+          linejunk: Callable[[str], bool] = ...,
+          charjunk: Callable[[str], bool] = ...
+          ) -> Iterator[str]: ...
+
+class HtmlDiff(object):
+    def __init__(self, tabsize: int = ..., wrapcolumn: int = ...,
+                 linejunk: Callable[[str], bool] = ...,
+                 charjunk: Callable[[str], bool] = ...
+                 ) -> None: ...
+    def make_file(self, fromlines: Sequence[str], tolines: Sequence[str],
+                  fromdesc: str = ..., todesc: str = ..., context: bool = ...,
+                  numlines: int = ...) -> str: ...
+    def make_table(self, fromlines: Sequence[str], tolines: Sequence[str],
+                   fromdesc: str = ..., todesc: str = ..., context: bool = ...,
+                   numlines: int = ...) -> str: ...
+
+def restore(delta: Iterable[str], which: int) -> Iterator[int]: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2/distutils/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2/distutils/__init__.pyi
diff --git a/typeshed/stdlib/2/distutils/emxccompiler.pyi b/typeshed/stdlib/2/distutils/emxccompiler.pyi
new file mode 100644
index 0000000..97e4a29
--- /dev/null
+++ b/typeshed/stdlib/2/distutils/emxccompiler.pyi
@@ -0,0 +1,5 @@
+# Stubs for emxccompiler
+
+from distutils.unixccompiler import UnixCCompiler
+
+class EMXCCompiler(UnixCCompiler): ...
diff --git a/typeshed/stdlib/2/doctest.pyi b/typeshed/stdlib/2/doctest.pyi
new file mode 100644
index 0000000..ab88328
--- /dev/null
+++ b/typeshed/stdlib/2/doctest.pyi
@@ -0,0 +1,9 @@
+# Stubs for doctest
+
+# NOTE: These are incomplete!
+
+from typing import Any, Tuple
+
+# TODO arguments missing
+def testmod(m: Any = ..., name: str = ..., globs: Any = ...,
+            verbose: bool = ...) -> Tuple[int, int]: ...
diff --git a/typeshed/stdlib/2/email/MIMEText.pyi b/typeshed/stdlib/2/email/MIMEText.pyi
new file mode 100644
index 0000000..a15eb1d
--- /dev/null
+++ b/typeshed/stdlib/2/email/MIMEText.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.MIMEText (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from email.mime.nonmultipart import MIMENonMultipart
+
+class MIMEText(MIMENonMultipart):
+    def __init__(self, _text, _subtype=..., _charset=...) -> None: ...
diff --git a/typeshed/stdlib/2/email/__init__.pyi b/typeshed/stdlib/2/email/__init__.pyi
new file mode 100644
index 0000000..384d956
--- /dev/null
+++ b/typeshed/stdlib/2/email/__init__.pyi
@@ -0,0 +1,6 @@
+from typing import IO, Any, AnyStr
+
+def message_from_string(s: AnyStr, *args, **kwargs): ...
+def message_from_bytes(s: str, *args, **kwargs): ...
+def message_from_file(fp: IO[AnyStr], *args, **kwargs): ...
+def message_from_binary_file(fp: IO[str], *args, **kwargs): ...
diff --git a/typeshed/stdlib/2/email/_parseaddr.pyi b/typeshed/stdlib/2/email/_parseaddr.pyi
new file mode 100644
index 0000000..97e859e
--- /dev/null
+++ b/typeshed/stdlib/2/email/_parseaddr.pyi
@@ -0,0 +1,44 @@
+# Stubs for email._parseaddr (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def parsedate_tz(data): ...
+def parsedate(data): ...
+def mktime_tz(data): ...
+def quote(str): ...
+
+class AddrlistClass:
+    specials = ...  # type: Any
+    pos = ...  # type: Any
+    LWS = ...  # type: Any
+    CR = ...  # type: Any
+    FWS = ...  # type: Any
+    atomends = ...  # type: Any
+    phraseends = ...  # type: Any
+    field = ...  # type: Any
+    commentlist = ...  # type: Any
+    def __init__(self, field): ...
+    def gotonext(self): ...
+    def getaddrlist(self): ...
+    def getaddress(self): ...
+    def getrouteaddr(self): ...
+    def getaddrspec(self): ...
+    def getdomain(self): ...
+    def getdelimited(self, beginchar, endchars, allowcomments=True): ...
+    def getquote(self): ...
+    def getcomment(self): ...
+    def getdomainliteral(self): ...
+    def getatom(self, atomends=None): ...
+    def getphraselist(self): ...
+
+class AddressList(AddrlistClass):
+    addresslist = ...  # type: Any
+    def __init__(self, field): ...
+    def __len__(self): ...
+    def __add__(self, other): ...
+    def __iadd__(self, other): ...
+    def __sub__(self, other): ...
+    def __isub__(self, other): ...
+    def __getitem__(self, index): ...
diff --git a/mypy/test/collect.py b/typeshed/stdlib/2/email/mime/__init__.pyi
similarity index 100%
rename from mypy/test/collect.py
rename to typeshed/stdlib/2/email/mime/__init__.pyi
diff --git a/typeshed/stdlib/2/email/mime/base.pyi b/typeshed/stdlib/2/email/mime/base.pyi
new file mode 100644
index 0000000..0a3eb4c
--- /dev/null
+++ b/typeshed/stdlib/2/email/mime/base.pyi
@@ -0,0 +1,10 @@
+# Stubs for email.mime.base (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# import message
+
+# TODO
+# class MIMEBase(message.Message):
+class MIMEBase:
+    def __init__(self, _maintype, _subtype, **_params) -> None: ...
diff --git a/typeshed/stdlib/2/email/mime/multipart.pyi b/typeshed/stdlib/2/email/mime/multipart.pyi
new file mode 100644
index 0000000..2bc5a9e
--- /dev/null
+++ b/typeshed/stdlib/2/email/mime/multipart.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.mime.multipart (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from email.mime.base import MIMEBase
+
+class MIMEMultipart(MIMEBase):
+    def __init__(self, _subtype=..., boundary=..., _subparts=..., **_params) -> None: ...
diff --git a/typeshed/stdlib/2/email/mime/nonmultipart.pyi b/typeshed/stdlib/2/email/mime/nonmultipart.pyi
new file mode 100644
index 0000000..b0894ab
--- /dev/null
+++ b/typeshed/stdlib/2/email/mime/nonmultipart.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.mime.nonmultipart (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from email.mime.base import MIMEBase
+
+class MIMENonMultipart(MIMEBase):
+    def attach(self, payload): ...
diff --git a/typeshed/stdlib/2/email/mime/text.pyi b/typeshed/stdlib/2/email/mime/text.pyi
new file mode 100644
index 0000000..b6ec4c8
--- /dev/null
+++ b/typeshed/stdlib/2/email/mime/text.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.mime.text (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from email.mime.nonmultipart import MIMENonMultipart
+
+class MIMEText(MIMENonMultipart):
+    def __init__(self, _text, _subtype=..., _charset=...) -> None: ...
diff --git a/typeshed/stdlib/2/email/utils.pyi b/typeshed/stdlib/2/email/utils.pyi
new file mode 100644
index 0000000..48d2aa3
--- /dev/null
+++ b/typeshed/stdlib/2/email/utils.pyi
@@ -0,0 +1,22 @@
+# Stubs for email.utils (Python 2)
+#
+# Derived from stub automatically generated by stubgen.
+
+from email._parseaddr import AddressList as _AddressList
+from email._parseaddr import mktime_tz as mktime_tz
+from email._parseaddr import parsedate as _parsedate
+from email._parseaddr import parsedate_tz as _parsedate_tz
+from quopri import decodestring as _qdecode
+
+def formataddr(pair): ...
+def getaddresses(fieldvalues): ...
+def formatdate(timeval=None, localtime=False, usegmt=False): ...
+def make_msgid(idstring=None): ...
+def parsedate(data): ...
+def parsedate_tz(data): ...
+def parseaddr(addr): ...
+def unquote(str): ...
+def decode_rfc2231(s): ...
+def encode_rfc2231(s, charset=None, language=None): ...
+def decode_params(params): ...
+def collapse_rfc2231_value(value, errors=..., fallback_charset=...): ...
diff --git a/typeshed/stdlib/2/encodings/__init__.pyi b/typeshed/stdlib/2/encodings/__init__.pyi
new file mode 100644
index 0000000..2ae6c0a
--- /dev/null
+++ b/typeshed/stdlib/2/encodings/__init__.pyi
@@ -0,0 +1,6 @@
+import codecs
+
+import typing
+
+def search_function(encoding: str) -> codecs.CodecInfo:
+    ...
diff --git a/typeshed/stdlib/2/encodings/utf_8.pyi b/typeshed/stdlib/2/encodings/utf_8.pyi
new file mode 100644
index 0000000..3be496a
--- /dev/null
+++ b/typeshed/stdlib/2/encodings/utf_8.pyi
@@ -0,0 +1,14 @@
+import codecs
+
+class IncrementalEncoder(codecs.IncrementalEncoder):
+    pass
+class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
+    pass
+class StreamWriter(codecs.StreamWriter):
+    pass
+class StreamReader(codecs.StreamReader):
+    pass
+
+def getregentry() -> codecs.CodecInfo: pass
+def encode(input: str, errors: str = ...) -> bytes: pass
+def decode(input: bytes, errors: str = ...) -> str: pass
diff --git a/typeshed/stdlib/2/exceptions.pyi b/typeshed/stdlib/2/exceptions.pyi
new file mode 100644
index 0000000..9b00e34
--- /dev/null
+++ b/typeshed/stdlib/2/exceptions.pyi
@@ -0,0 +1,80 @@
+from typing import Any, Tuple, Optional
+
+class StandardError(Exception): ...
+class ArithmeticError(StandardError): ...
+class AssertionError(StandardError): ...
+class AttributeError(StandardError): ...
+class BaseException(object):
+    args = ...  # type: Tuple[Any, ...]
+    message = ...  # type: str
+    def __getslice__(self, start, end) -> Any: ...
+    def __getitem__(self, start, end) -> Any: ...
+    def __unicode__(self) -> unicode: ...
+class BufferError(StandardError): ...
+class BytesWarning(Warning): ...
+class DeprecationWarning(Warning): ...
+class EOFError(StandardError): ...
+class EnvironmentError(StandardError):
+    errno = ...  # type: int
+    strerror = ...  # type: str
+    filename = ...  # type: str
+class Exception(BaseException): ...
+class FloatingPointError(ArithmeticError): ...
+class FutureWarning(Warning): ...
+class GeneratorExit(BaseException): ...
+class IOError(EnvironmentError): ...
+class ImportError(StandardError): ...
+class ImportWarning(Warning): ...
+class IndentationError(SyntaxError): ...
+class IndexError(LookupError): ...
+class KeyError(LookupError): ...
+class KeyboardInterrupt(BaseException): ...
+class LookupError(StandardError): ...
+class MemoryError(StandardError): ...
+class NameError(StandardError): ...
+class NotImplementedError(RuntimeError): ...
+class OSError(EnvironmentError): ...
+class OverflowError(ArithmeticError): ...
+class PendingDeprecationWarning(Warning): ...
+class ReferenceError(StandardError): ...
+class RuntimeError(StandardError): ...
+class RuntimeWarning(Warning): ...
+class StopIteration(Exception): ...
+class SyntaxError(StandardError):
+    text = ...  # type: str
+    print_file_and_line = ...  # type: Optional[str]
+    filename = ...  # type: str
+    lineno = ...  # type: int
+    offset = ...  # type: int
+    msg = ...  # type: str
+class SyntaxWarning(Warning): ...
+class SystemError(StandardError): ...
+class SystemExit(BaseException):
+    code = ...  # type: int
+class TabError(IndentationError): ...
+class TypeError(StandardError): ...
+class UnboundLocalError(NameError): ...
+class UnicodeError(ValueError): ...
+class UnicodeDecodeError(UnicodeError):
+    start = ...  # type: int
+    reason = ...  # type: str
+    object = ...  # type: str
+    end = ...  # type: int
+    encoding = ...  # type: str
+class UnicodeEncodeError(UnicodeError):
+    start = ...  # type: int
+    reason = ...  # type: str
+    object = ...  # type: unicode
+    end = ...  # type: int
+    encoding = ...  # type: str
+class UnicodeTranslateError(UnicodeError):
+    start = ...  # type: int
+    reason = ...  # type: str
+    object = ...  # type: Any
+    end = ...  # type: int
+    encoding = ...  # type: str
+class UnicodeWarning(Warning): ...
+class UserWarning(Warning): ...
+class ValueError(StandardError): ...
+class Warning(Exception): ...
+class ZeroDivisionError(ArithmeticError): ...
diff --git a/typeshed/stdlib/2/fcntl.pyi b/typeshed/stdlib/2/fcntl.pyi
new file mode 100644
index 0000000..5e7da7f
--- /dev/null
+++ b/typeshed/stdlib/2/fcntl.pyi
@@ -0,0 +1,87 @@
+from typing import Any, Union
+import io
+
+FASYNC = ...  # type: int
+FD_CLOEXEC = ...  # type: int
+
+DN_ACCESS = ...  # type: int
+DN_ATTRIB = ...  # type: int
+DN_CREATE = ...  # type: int
+DN_DELETE = ...  # type: int
+DN_MODIFY = ...  # type: int
+DN_MULTISHOT = ...  # type: int
+DN_RENAME = ...  # type: int
+F_DUPFD = ...  # type: int
+F_EXLCK = ...  # type: int
+F_GETFD = ...  # type: int
+F_GETFL = ...  # type: int
+F_GETLEASE = ...  # type: int
+F_GETLK = ...  # type: int
+F_GETLK64 = ...  # type: int
+F_GETOWN = ...  # type: int
+F_GETSIG = ...  # type: int
+F_NOTIFY = ...  # type: int
+F_RDLCK = ...  # type: int
+F_SETFD = ...  # type: int
+F_SETFL = ...  # type: int
+F_SETLEASE = ...  # type: int
+F_SETLK = ...  # type: int
+F_SETLK64 = ...  # type: int
+F_SETLKW = ...  # type: int
+F_SETLKW64 = ...  # type: int
+F_SETOWN = ...  # type: int
+F_SETSIG = ...  # type: int
+F_SHLCK = ...  # type: int
+F_UNLCK = ...  # type: int
+F_WRLCK = ...  # type: int
+I_ATMARK = ...  # type: int
+I_CANPUT = ...  # type: int
+I_CKBAND = ...  # type: int
+I_FDINSERT = ...  # type: int
+I_FIND = ...  # type: int
+I_FLUSH = ...  # type: int
+I_FLUSHBAND = ...  # type: int
+I_GETBAND = ...  # type: int
+I_GETCLTIME = ...  # type: int
+I_GETSIG = ...  # type: int
+I_GRDOPT = ...  # type: int
+I_GWROPT = ...  # type: int
+I_LINK = ...  # type: int
+I_LIST = ...  # type: int
+I_LOOK = ...  # type: int
+I_NREAD = ...  # type: int
+I_PEEK = ...  # type: int
+I_PLINK = ...  # type: int
+I_POP = ...  # type: int
+I_PUNLINK = ...  # type: int
+I_PUSH = ...  # type: int
+I_RECVFD = ...  # type: int
+I_SENDFD = ...  # type: int
+I_SETCLTIME = ...  # type: int
+I_SETSIG = ...  # type: int
+I_SRDOPT = ...  # type: int
+I_STR = ...  # type: int
+I_SWROPT = ...  # type: int
+I_UNLINK = ...  # type: int
+LOCK_EX = ...  # type: int
+LOCK_MAND = ...  # type: int
+LOCK_NB = ...  # type: int
+LOCK_READ = ...  # type: int
+LOCK_RW = ...  # type: int
+LOCK_SH = ...  # type: int
+LOCK_UN = ...  # type: int
+LOCK_WRITE = ...  # type: int
+
+_ANYFILE = Union[int, io.IOBase]
+
+# TODO All these return either int or bytes depending on the value of
+# cmd (not on the type of arg).
+def fcntl(fd: _ANYFILE, op: int, arg: Union[int, bytes] = ...) -> Any: ...
+
+# TODO: arg: int or read-only buffer interface or read-write buffer interface
+def ioctl(fd: _ANYFILE, op: int, arg: Union[int, bytes] = ...,
+          mutate_flag: bool = ...) -> Any: ...
+
+def flock(fd: _ANYFILE, op: int) -> None: ...
+def lockf(fd: _ANYFILE, op: int, length: int = ..., start: int = ...,
+          whence: int = ...) -> Any: ...
diff --git a/typeshed/stdlib/2/fileinput.pyi b/typeshed/stdlib/2/fileinput.pyi
new file mode 100644
index 0000000..f3e1f37
--- /dev/null
+++ b/typeshed/stdlib/2/fileinput.pyi
@@ -0,0 +1,46 @@
+from typing import Iterable, Callable, IO, Optional, Union, Iterator
+
+class FileInput(Iterable[str]):
+    def __init__(
+        self,
+        files: Optional[Union[str, Iterable[str]]] = None,
+        inplace: bool = ...,
+        backup: str = ...,
+        bufsize: int = ...,
+        mode: str = ...,
+        openhook: Callable[[str, str], IO[str]] = ...
+    ) -> None: ...
+
+    def __del__(self) -> None: ...
+    def close(self) -> None: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def __getitem__(self, i: Union[int, slice]) -> str: ...
+    def next(self) -> str: ...
+    def nextfile(self) -> None: ...
+    def readline(self) -> str: ...
+    def filename(self) -> Optional[str]: ...
+    def lineno(self) -> int: ...
+    def filelineno(self) -> int: ...
+    def fileno(self) -> int: ...
+    def isfirstline(self) -> bool: ...
+    def isstdin(self) -> bool: ...
+
+def input(
+    files: Optional[Union[str, Iterable[str]]] = None,
+    inplace: bool = ...,
+    backup: str = ...,
+    bufsize: int = ...,
+    mode: str = ...,
+    openhook: Callable[[str, str], IO[str]] = ...) -> FileInput: ...
+
+
+def filename() -> Optional[str]: ...
+def lineno() -> int: ...
+def filelineno() -> int: ...
+def isfirstline() -> bool: ...
+def isstdin() -> bool: ...
+def nextfile() -> None: ...
+def close() -> None: ...
+
+def hook_compressed(filename: str, mode: str) -> IO[str]: ...
+def hook_encoded(encoding: str) -> Callable[[str, str], IO[str]]: ...
diff --git a/typeshed/stdlib/2/fnmatch.pyi b/typeshed/stdlib/2/fnmatch.pyi
new file mode 100644
index 0000000..23b5978
--- /dev/null
+++ b/typeshed/stdlib/2/fnmatch.pyi
@@ -0,0 +1,6 @@
+from typing import Iterable
+
+def fnmatch(filename: str, pattern: str) -> bool: ...
+def fnmatchcase(filename: str, pattern: str) -> bool: ...
+def filter(names: Iterable[str], pattern: str) -> Iterable[str]: ...
+def translate(pattern: str) -> str: ...
diff --git a/typeshed/stdlib/2/functools.pyi b/typeshed/stdlib/2/functools.pyi
new file mode 100644
index 0000000..f3bcc90
--- /dev/null
+++ b/typeshed/stdlib/2/functools.pyi
@@ -0,0 +1,34 @@
+# Stubs for functools (Python 2.7)
+
+# NOTE: These are incomplete!
+
+from abc import ABCMeta, abstractmethod
+from typing import Any, Callable, Generic, Dict, Iterable, Optional, Sequence, Tuple, TypeVar, overload
+from collections import namedtuple
+
+_AnyCallable = Callable[..., Any]
+
+_T = TypeVar("_T")
+_S = TypeVar("_S")
+ at overload
+def reduce(function: Callable[[_T, _T], _T],
+           sequence: Iterable[_T]) -> _T: ...
+ at overload
+def reduce(function: Callable[[_T, _S], _T],
+           sequence: Iterable[_S], initial: _T) -> _T: ...
+
+WRAPPER_ASSIGNMENTS = ...  # type: Sequence[str]
+WRAPPER_UPDATES = ...  # type: Sequence[str]
+
+def update_wrapper(wrapper: _AnyCallable, wrapped: _AnyCallable, assigned: Sequence[str] = ...,
+                   updated: Sequence[str] = ...) -> None: ...
+def wraps(wrapped: _AnyCallable, assigned: Sequence[str] = ..., updated: Sequence[str] = ...) -> Callable[[_AnyCallable], _AnyCallable]: ...
+def total_ordering(cls: type) -> type: ...
+def cmp_to_key(mycmp: Callable[[_T, _T], int]) -> Callable[[_T], Any]: ...
+
+class partial(Generic[_T]):
+    func = ...  # Callable[..., _T]
+    args = ...  # type: Tuple[Any, ...]
+    keywords = ...  # type: Dict[str, Any]
+    def __init__(self, func: Callable[..., _T], *args: Any, **kwargs: Any) -> None: ...
+    def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
diff --git a/typeshed/stdlib/2/future_builtins.pyi b/typeshed/stdlib/2/future_builtins.pyi
new file mode 100644
index 0000000..a9b25b2
--- /dev/null
+++ b/typeshed/stdlib/2/future_builtins.pyi
@@ -0,0 +1,14 @@
+from typing import Any
+
+from itertools import ifilter as filter
+from itertools import imap as map
+from itertools import izip as zip
+
+
+def ascii(obj: Any) -> str: ...
+
+
+def hex(x: int) -> str: ...
+
+
+def oct(x: int) -> str: ...
diff --git a/typeshed/stdlib/2/gc.pyi b/typeshed/stdlib/2/gc.pyi
new file mode 100644
index 0000000..d93e996
--- /dev/null
+++ b/typeshed/stdlib/2/gc.pyi
@@ -0,0 +1,29 @@
+# Stubs for gc
+
+from typing import Any, List, Tuple
+
+
+def enable() -> None: ...
+def disable() -> None: ...
+def isenabled() -> bool: ...
+def collect(generation: int = ...) -> int: ...
+def set_debug(flags: int) -> None: ...
+def get_debug() -> int: ...
+def get_objects() -> List[Any]: ...
+def set_threshold(threshold0: int, threshold1: int = ...,
+                  threshold2: int = ...) -> None: ...
+def get_count() -> Tuple[int, int, int]: ...
+def get_threshold() -> Tuple[int, int, int]: ...
+def get_referrers(*objs: Any) -> List[Any]: ...
+def get_referents(*objs: Any) -> List[Any]: ...
+def is_tracked(obj: Any) -> bool: ...
+
+garbage = ...  # type: List[Any]
+
+DEBUG_STATS = ...  # type: int
+DEBUG_COLLECTABLE = ...  # type: int
+DEBUG_UNCOLLECTABLE = ...  # type: int
+DEBUG_INSTANCES = ...  # type: int
+DEBUG_OBJECTS = ...  # type: int
+DEBUG_SAVEALL = ...  # type: int
+DEBUG_LEAK = ...  # type: int
diff --git a/typeshed/stdlib/2/genericpath.pyi b/typeshed/stdlib/2/genericpath.pyi
new file mode 100644
index 0000000..85f1c0f
--- /dev/null
+++ b/typeshed/stdlib/2/genericpath.pyi
@@ -0,0 +1,14 @@
+# Stubs for genericpath (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class _unicode: ...
+
+def exists(path): ...
+def isfile(path): ...
+def isdir(s): ...
+def getsize(filename): ...
+def getmtime(filename): ...
+def getatime(filename): ...
+def getctime(filename): ...
+def commonprefix(m): ...
diff --git a/typeshed/stdlib/2/getopt.pyi b/typeshed/stdlib/2/getopt.pyi
new file mode 100644
index 0000000..bc6577f
--- /dev/null
+++ b/typeshed/stdlib/2/getopt.pyi
@@ -0,0 +1,17 @@
+from typing import List, Tuple
+
+class GetoptError(Exception):
+    opt = ...  # type: str
+    msg = ...  # type: str
+    def __init__(self, msg: str, opt: str=...) -> None: ...
+    def __str__(self) -> str: ...
+
+error = GetoptError
+
+def getopt(args: List[str], shortopts: str,
+           longopts: List[str]=...) -> Tuple[List[Tuple[str, str]],
+                                             List[str]]: ...
+
+def gnu_getopt(args: List[str], shortopts: str,
+           longopts: List[str]=...) -> Tuple[List[Tuple[str, str]],
+                                             List[str]]: ...
diff --git a/typeshed/stdlib/2/getpass.pyi b/typeshed/stdlib/2/getpass.pyi
new file mode 100644
index 0000000..011fc8e
--- /dev/null
+++ b/typeshed/stdlib/2/getpass.pyi
@@ -0,0 +1,8 @@
+# Stubs for getpass (Python 2)
+
+from typing import Any, IO
+
+class GetPassWarning(UserWarning): ...
+
+def getpass(prompt: str = ..., stream: IO[Any] = ...) -> str: ...
+def getuser() -> str: ...
diff --git a/typeshed/stdlib/2/gettext.pyi b/typeshed/stdlib/2/gettext.pyi
new file mode 100644
index 0000000..51dd523
--- /dev/null
+++ b/typeshed/stdlib/2/gettext.pyi
@@ -0,0 +1,43 @@
+# TODO(MichalPokorny): better types
+
+from typing import Any, IO, List, Optional, Union
+
+def bindtextdomain(domain: str, localedir: str = ...) -> str: ...
+def bind_textdomain_codeset(domain: str, codeset: str = ...) -> str: ...
+def textdomain(domain: str = ...) -> str: ...
+def gettext(message: str) -> str: ...
+def lgettext(message: str) -> str: ...
+def dgettext(domain: str, message: str) -> str: ...
+def ldgettext(domain: str, message: str) -> str: ...
+def ngettext(singular: str, plural: str, n: int) -> str: ...
+def lngettext(singular: str, plural: str, n: int) -> str: ...
+def dngettext(domain: str, singular: str, plural: str, n: int) -> str: ...
+def ldngettext(domain: str, singular: str, plural: str, n: int) -> str: ...
+
+class NullTranslations(object):
+    def __init__(self, fp: IO[str] = ...) -> None: ...
+    def _parse(self, fp: IO[str]) -> None: ...
+    def add_fallback(self, fallback: NullTranslations) -> None: ...
+    def gettext(self, message: str) -> str: ...
+    def lgettext(self, message: str) -> str: ...
+    def ugettext(self, message: Union[str, unicode]) -> unicode: ...
+    def ngettext(self, singular: str, plural: str, n: int) -> str: ...
+    def lngettext(self, singular: str, plural: str, n: int) -> str: ...
+    def ungettext(self, singular: Union[str, unicode], plural: Union[str, unicode], n: int) -> unicode: ...
+    def info(self) -> Any: ...
+    def charset(self) -> Any: ...
+    def output_charset(self) -> Any: ...
+    def set_output_charset(self, charset: Any) -> None: ...
+    def install(self, unicode: bool = ..., names: Any = ...) -> None: ...
+
+class GNUTranslations(NullTranslations):
+    LE_MAGIC = ...  # type: int
+    BE_MAGIC = ...  # type: int
+
+def find(domain: str, localedir: str = ..., languages: List[str] = ...,
+         all: Any = ...) -> Optional[Union[str, List[str]]]: ...
+
+def translation(domain: str, localedir: str = ..., languages: List[str] = ...,
+                class_: Any = ..., fallback: Any = ..., codeset: Any = ...) -> NullTranslations: ...
+def install(domain: str, localedir: str = ..., unicode: Any = ..., codeset: Any = ...,
+            names: Any = ...) -> None: ...
diff --git a/typeshed/stdlib/2/glob.pyi b/typeshed/stdlib/2/glob.pyi
new file mode 100644
index 0000000..9b70e5c
--- /dev/null
+++ b/typeshed/stdlib/2/glob.pyi
@@ -0,0 +1,4 @@
+from typing import List, Iterator, AnyStr
+
+def glob(pathname: AnyStr) -> List[AnyStr]: ...
+def iglob(pathname: AnyStr) -> Iterator[AnyStr]: ...
diff --git a/typeshed/stdlib/2/grp.pyi b/typeshed/stdlib/2/grp.pyi
new file mode 100644
index 0000000..6a1f758
--- /dev/null
+++ b/typeshed/stdlib/2/grp.pyi
@@ -0,0 +1,11 @@
+from typing import Optional, List
+
+class struct_group(object):
+    gr_name = ...  # type: Optional[str]
+    gr_passwd = ...  # type: Optional[str]
+    gr_gid = ...  # type: int
+    gr_mem = ...  # type: List[str]
+
+def getgrall() -> List[struct_group]: ...
+def getgrgid(id: int) -> struct_group: ...
+def getgrnam(name: str) -> struct_group: ...
diff --git a/typeshed/stdlib/2/gzip.pyi b/typeshed/stdlib/2/gzip.pyi
new file mode 100644
index 0000000..30d9e83
--- /dev/null
+++ b/typeshed/stdlib/2/gzip.pyi
@@ -0,0 +1,41 @@
+# Stubs for gzip (Python 2)
+#
+# NOTE: Based on a dynamically typed stub automatically generated by stubgen.
+
+from typing import Any, IO
+import io
+
+class GzipFile(io.BufferedIOBase):
+    myfileobj = ...  # type: Any
+    max_read_chunk = ...  # type: Any
+    mode = ...  # type: Any
+    extrabuf = ...  # type: Any
+    extrasize = ...  # type: Any
+    extrastart = ...  # type: Any
+    name = ...  # type: Any
+    min_readsize = ...  # type: Any
+    compress = ...  # type: Any
+    fileobj = ...  # type: Any
+    offset = ...  # type: Any
+    mtime = ...  # type: Any
+    def __init__(self, filename: str = ..., mode: str = ..., compresslevel: int = ...,
+                 fileobj: IO[str] = ..., mtime: float = ...) -> None: ...
+    @property
+    def filename(self): ...
+    size = ...  # type: Any
+    crc = ...  # type: Any
+    def write(self, data): ...
+    def read(self, size=...): ...
+    @property
+    def closed(self): ...
+    def close(self): ...
+    def flush(self, zlib_mode=...): ...
+    def fileno(self): ...
+    def rewind(self): ...
+    def readable(self): ...
+    def writable(self): ...
+    def seekable(self): ...
+    def seek(self, offset, whence=...): ...
+    def readline(self, size=...): ...
+
+def open(filename: str, mode: str = ..., compresslevel: int = ...) -> GzipFile: ...
diff --git a/typeshed/stdlib/2/hashlib.pyi b/typeshed/stdlib/2/hashlib.pyi
new file mode 100644
index 0000000..95f2b82
--- /dev/null
+++ b/typeshed/stdlib/2/hashlib.pyi
@@ -0,0 +1,27 @@
+# Stubs for hashlib (Python 2)
+
+from typing import Tuple
+
+class _hash(object):
+    # This is not actually in the module namespace.
+    digest_size = 0
+    block_size = 0
+    def update(self, arg: str) -> None: ...
+    def digest(self) -> str: ...
+    def hexdigest(self) -> str: ...
+    def copy(self) -> _hash: ...
+
+def new(name: str, data: str = ...) -> _hash: ...
+
+def md5(s: str = ...) -> _hash: ...
+def sha1(s: str = ...) -> _hash: ...
+def sha224(s: str = ...) -> _hash: ...
+def sha256(s: str = ...) -> _hash: ...
+def sha384(s: str = ...) -> _hash: ...
+def sha512(s: str = ...) -> _hash: ...
+
+algorithms = ...  # type: Tuple[str, ...]
+algorithms_guaranteed = ...  # type: Tuple[str, ...]
+algorithms_available = ...  # type: Tuple[str, ...]
+
+def pbkdf2_hmac(name: str, password: str, salt: str, rounds: int, dklen: int = ...) -> str: ...
diff --git a/typeshed/stdlib/2/heapq.pyi b/typeshed/stdlib/2/heapq.pyi
new file mode 100644
index 0000000..4a7a65f
--- /dev/null
+++ b/typeshed/stdlib/2/heapq.pyi
@@ -0,0 +1,15 @@
+from typing import TypeVar, List, Iterable, Any, Callable
+
+_T = TypeVar('_T')
+
+def cmp_lt(x, y) -> bool: ...
+def heappush(heap: List[_T], item: _T) -> None: ...
+def heappop(heap: List[_T]) -> _T:
+    raise IndexError()  # if heap is empty
+def heappushpop(heap: List[_T], item: _T) -> _T: ...
+def heapify(x: List[_T]) -> None: ...
+def heapreplace(heap: List[_T], item: _T) -> _T:
+    raise IndexError()  # if heap is empty
+def merge(*iterables: Iterable[_T]) -> Iterable[_T]: ...
+def nlargest(n: int, iterable: Iterable[_T]) -> List[_T]: ...
+def nsmallest(n: int, iterable: Iterable[_T]) -> List[_T]: ...
diff --git a/typeshed/stdlib/2/htmlentitydefs.pyi b/typeshed/stdlib/2/htmlentitydefs.pyi
new file mode 100644
index 0000000..c90f3a9
--- /dev/null
+++ b/typeshed/stdlib/2/htmlentitydefs.pyi
@@ -0,0 +1,9 @@
+# Stubs for htmlentitydefs (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Mapping
+
+name2codepoint = ...  # type: Mapping[str, int]
+codepoint2name = ...  # type: Mapping[int, str]
+entitydefs = ...  # type: Mapping[str, str]
diff --git a/typeshed/stdlib/2/httplib.pyi b/typeshed/stdlib/2/httplib.pyi
new file mode 100644
index 0000000..d8d5e51
--- /dev/null
+++ b/typeshed/stdlib/2/httplib.pyi
@@ -0,0 +1,189 @@
+# Stubs for httplib (Python 2)
+#
+# Generated by stubgen and manually massaged a bit.
+# Needs lots more work!
+
+from typing import Any, Dict
+import mimetools
+
+class HTTPMessage(mimetools.Message):
+    def addheader(self, key: str, value: str) -> None: ...
+    def addcontinue(self, key: str, more: str) -> None: ...
+    dict = ...  # type: Dict[str, str]
+    unixfrom = ...  # type: str
+    headers = ...  # type: Any
+    status = ...  # type: str
+    seekable = ...  # type: bool
+    def readheaders(self) -> None: ...
+
+class HTTPResponse:
+    fp = ...  # type: Any
+    debuglevel = ...  # type: Any
+    strict = ...  # type: Any
+    msg = ...  # type: Any
+    version = ...  # type: Any
+    status = ...  # type: Any
+    reason = ...  # type: Any
+    chunked = ...  # type: Any
+    chunk_left = ...  # type: Any
+    length = ...  # type: Any
+    will_close = ...  # type: Any
+    def __init__(self, sock, debuglevel=0, strict=0, method=None, buffering: bool=...) -> None: ...
+    def begin(self): ...
+    def close(self): ...
+    def isclosed(self): ...
+    def read(self, amt=None): ...
+    def fileno(self): ...
+    def getheader(self, name, default=None): ...
+    def getheaders(self): ...
+
+class HTTPConnection:
+    response_class = ...  # type: Any
+    default_port = ...  # type: Any
+    auto_open = ...  # type: Any
+    debuglevel = ...  # type: Any
+    strict = ...  # type: Any
+    timeout = ...  # type: Any
+    source_address = ...  # type: Any
+    sock = ...  # type: Any
+    def __init__(self, host, port=None, strict=None, timeout=..., source_address=None) -> None: ...
+    def set_tunnel(self, host, port=None, headers=None): ...
+    def set_debuglevel(self, level): ...
+    def connect(self): ...
+    def close(self): ...
+    def send(self, data): ...
+    def putrequest(self, method, url, skip_host=0, skip_accept_encoding=0): ...
+    def putheader(self, header, *values): ...
+    def endheaders(self, message_body=None): ...
+    def request(self, method, url, body=None, headers=...): ...
+    def getresponse(self, buffering: bool=...): ...
+
+class HTTP:
+    debuglevel = ...  # type: Any
+    def __init__(self, host: str=..., port=None, strict=None) -> None: ...
+    def connect(self, host=None, port=None): ...
+    def getfile(self): ...
+    file = ...  # type: Any
+    headers = ...  # type: Any
+    def getreply(self, buffering: bool=...): ...
+    def close(self): ...
+
+class HTTPSConnection(HTTPConnection):
+    default_port = ...  # type: Any
+    key_file = ...  # type: Any
+    cert_file = ...  # type: Any
+    def __init__(self, host, port=None, key_file=None, cert_file=None, strict=None, timeout=..., source_address=None, context=None) -> None: ...
+    sock = ...  # type: Any
+    def connect(self): ...
+
+class HTTPS(HTTP):
+    key_file = ...  # type: Any
+    cert_file = ...  # type: Any
+    def __init__(self, host: str=..., port=None, key_file=None, cert_file=None, strict=None, context=None) -> None: ...
+
+class HTTPException(Exception): ...
+class NotConnected(HTTPException): ...
+class InvalidURL(HTTPException): ...
+
+class UnknownProtocol(HTTPException):
+    args = ...  # type: Any
+    version = ...  # type: Any
+    def __init__(self, version) -> None: ...
+
+class UnknownTransferEncoding(HTTPException): ...
+class UnimplementedFileMode(HTTPException): ...
+
+class IncompleteRead(HTTPException):
+    args = ...  # type: Any
+    partial = ...  # type: Any
+    expected = ...  # type: Any
+    def __init__(self, partial, expected=None) -> None: ...
+
+class ImproperConnectionState(HTTPException): ...
+class CannotSendRequest(ImproperConnectionState): ...
+class CannotSendHeader(ImproperConnectionState): ...
+class ResponseNotReady(ImproperConnectionState): ...
+
+class BadStatusLine(HTTPException):
+    args = ...  # type: Any
+    line = ...  # type: Any
+    def __init__(self, line) -> None: ...
+
+class LineTooLong(HTTPException):
+    def __init__(self, line_type) -> None: ...
+
+error = ...  # type: Any
+
+class LineAndFileWrapper:
+    def __init__(self, line, file) -> None: ...
+    def __getattr__(self, attr): ...
+    def read(self, amt=None): ...
+    def readline(self): ...
+    def readlines(self, size=None): ...
+
+# Constants
+
+responses = ...  # type: Dict[int, str]
+
+HTTP_PORT = ...  # type: int
+HTTPS_PORT = ...  # type: int
+
+# status codes
+# informational
+CONTINUE = ...  # type: int
+SWITCHING_PROTOCOLS = ...  # type: int
+PROCESSING = ...  # type: int
+
+# successful
+OK = ...  # type: int
+CREATED = ...  # type: int
+ACCEPTED = ...  # type: int
+NON_AUTHORITATIVE_INFORMATION = ...  # type: int
+NO_CONTENT = ...  # type: int
+RESET_CONTENT = ...  # type: int
+PARTIAL_CONTENT = ...  # type: int
+MULTI_STATUS = ...  # type: int
+IM_USED = ...  # type: int
+
+# redirection
+MULTIPLE_CHOICES = ...  # type: int
+MOVED_PERMANENTLY = ...  # type: int
+FOUND = ...  # type: int
+SEE_OTHER = ...  # type: int
+NOT_MODIFIED = ...  # type: int
+USE_PROXY = ...  # type: int
+TEMPORARY_REDIRECT = ...  # type: int
+
+# client error
+BAD_REQUEST = ...  # type: int
+UNAUTHORIZED = ...  # type: int
+PAYMENT_REQUIRED = ...  # type: int
+FORBIDDEN = ...  # type: int
+NOT_FOUND = ...  # type: int
+METHOD_NOT_ALLOWED = ...  # type: int
+NOT_ACCEPTABLE = ...  # type: int
+PROXY_AUTHENTICATION_REQUIRED = ...  # type: int
+REQUEST_TIMEOUT = ...  # type: int
+CONFLICT = ...  # type: int
+GONE = ...  # type: int
+LENGTH_REQUIRED = ...  # type: int
+PRECONDITION_FAILED = ...  # type: int
+REQUEST_ENTITY_TOO_LARGE = ...  # type: int
+REQUEST_URI_TOO_LONG = ...  # type: int
+UNSUPPORTED_MEDIA_TYPE = ...  # type: int
+REQUESTED_RANGE_NOT_SATISFIABLE = ...  # type: int
+EXPECTATION_FAILED = ...  # type: int
+UNPROCESSABLE_ENTITY = ...  # type: int
+LOCKED = ...  # type: int
+FAILED_DEPENDENCY = ...  # type: int
+UPGRADE_REQUIRED = ...  # type: int
+
+# server error
+INTERNAL_SERVER_ERROR = ...  # type: int
+NOT_IMPLEMENTED = ...  # type: int
+BAD_GATEWAY = ...  # type: int
+SERVICE_UNAVAILABLE = ...  # type: int
+GATEWAY_TIMEOUT = ...  # type: int
+HTTP_VERSION_NOT_SUPPORTED = ...  # type: int
+INSUFFICIENT_STORAGE = ...  # type: int
+NOT_EXTENDED = ...  # type: int
diff --git a/typeshed/stdlib/2/imp.pyi b/typeshed/stdlib/2/imp.pyi
new file mode 100644
index 0000000..ffb1ad3
--- /dev/null
+++ b/typeshed/stdlib/2/imp.pyi
@@ -0,0 +1,35 @@
+"""Stubs for the 'imp' module."""
+
+from typing import List, Optional, Tuple, Iterable, IO, Any
+import types
+
+C_BUILTIN = ...  # type: int
+C_EXTENSION = ...  # type: int
+IMP_HOOK = ...  # type: int
+PKG_DIRECTORY = ...  # type: int
+PY_CODERESOURCE = ...  # type: int
+PY_COMPILED = ...  # type: int
+PY_FROZEN = ...  # type: int
+PY_RESOURCE = ...  # type: int
+PY_SOURCE = ...  # type: int
+SEARCH_ERROR = ...  # type: int
+
+def acquire_lock() -> None: ...
+def find_module(name: str, path: Iterable[str] = ...) -> Optional[Tuple[str, str, Tuple[str, str, int]]]: ...
+def get_magic() -> str: ...
+def get_suffixes() -> List[Tuple[str, str, int]]: ...
+def init_builtin(name: str) -> types.ModuleType: ...
+def init_frozen(name: str) -> types.ModuleType: ...
+def is_builtin(name: str) -> int: ...
+def is_frozen(name: str) -> bool: ...
+def load_compiled(name: str, pathname: str, file: IO[Any] = ...) -> types.ModuleType: ...
+def load_dynamic(name: str, pathname: str, file: IO[Any] = ...) -> types.ModuleType: ...
+def load_module(name: str, file: str, pathname: str, description: Tuple[str, str, int]) -> types.ModuleType: ...
+def load_source(name: str, pathname: str, file: IO[Any] = ...) -> types.ModuleType: ...
+def lock_held() -> bool: ...
+def new_module(name: str) -> types.ModuleType: ...
+def release_lock() -> None: ...
+
+class NullImporter:
+    def __init__(self, path_string: str) -> None: ...
+    def find_module(self, fullname: str, path: str = ...) -> None: ...
diff --git a/typeshed/stdlib/2/importlib.pyi b/typeshed/stdlib/2/importlib.pyi
new file mode 100644
index 0000000..afa073d
--- /dev/null
+++ b/typeshed/stdlib/2/importlib.pyi
@@ -0,0 +1,3 @@
+import types
+
+def import_module(name: str, package: str = ...) -> types.ModuleType: ...
diff --git a/typeshed/stdlib/2/inspect.pyi b/typeshed/stdlib/2/inspect.pyi
new file mode 100644
index 0000000..e86da66
--- /dev/null
+++ b/typeshed/stdlib/2/inspect.pyi
@@ -0,0 +1,88 @@
+# TODO incomplete
+from types import TracebackType, FrameType, ModuleType
+from typing import Any, Callable, List, Optional, Tuple, Union, NamedTuple
+
+# Types and members
+ModuleInfo = NamedTuple('ModuleInfo', [('name', str),
+                                       ('suffix', str),
+                                       ('mode', str),
+                                       ('module_type', int),
+                                       ])
+def getmembers(
+    object: object,
+    predicate: Callable[[Any], bool] = ...
+) -> List[Tuple[str, Any]]: ...
+def getmoduleinfo(path: str) -> Optional[ModuleInfo]: ...
+def getmodulename(path: str) -> Optional[str]: ...
+
+def ismodule(object: object) -> bool: ...
+def isclass(object: object) -> bool: ...
+def ismethod(object: object) -> bool: ...
+def isfunction(object: object) -> bool: ...
+def isisgeneratorfunction(object: object) -> bool: ...
+def isgenerator(object: object) -> bool: ...
+def istraceback(object: object) -> bool: ...
+def isframe(object: object) -> bool: ...
+def iscode(object: object) -> bool: ...
+def isbuiltin(object: object) -> bool: ...
+def isroutine(object: object) -> bool: ...
+def isabstract(object: object) -> bool: ...
+def ismethoddescriptor(object: object) -> bool: ...
+def isdatadescriptor(object: object) -> bool: ...
+def isgetsetdescriptor(object: object) -> bool: ...
+def ismemberdescriptor(object: object) -> bool: ...
+
+# Retrieving source code
+def getdoc(object: object) -> str: ...
+def getcomments(object: object) -> str: ...
+def getfile(object: object) -> str: ...
+def getmodule(object: object) -> ModuleType: ...
+def getsourcefile(object: object) -> str: ...
+# TODO restrict to "module, class, method, function, traceback, frame,
+# or code object"
+def getsourcelines(object: object) -> Tuple[List[str], int]: ...
+# TODO restrict to "a module, class, method, function, traceback, frame,
+# or code object"
+def getsource(object: object) -> str: ...
+def cleandoc(doc: str) -> str: ...
+
+# Classes and functions
+# TODO make the return type more specific
+def getclasstree(classes: List[type], unique: bool = ...) -> Any: ...
+
+ArgSpec = NamedTuple('ArgSpec', [('args', List[str]),
+                                 ('varargs', str),
+                                 ('keywords', str),
+                                 ('defaults', tuple),
+                                 ])
+
+def getargspec(func: object) -> ArgSpec: ...
+# TODO make the return type more specific
+def getargvalues(frame: FrameType) -> Any: ...
+# TODO formatargspec
+# TODO formatargvalues
+def getmro(cls: type) -> Tuple[type, ...]: ...
+# TODO getcallargs
+
+# The interpreter stack
+
+Traceback = NamedTuple(
+    'Traceback',
+    [
+        ('filename', str),
+        ('lineno', int),
+        ('function', str),
+        ('code_context', List[str]),
+        ('index', int),
+    ]
+)
+
+_FrameRecord = Tuple[FrameType, str, int, str, List[str], int]
+
+def getouterframes(frame: FrameType, context: int = ...) -> List[FrameType]: ...
+def getframeinfo(frame: Union[FrameType, TracebackType], context: int = ...) -> Traceback: ...
+def getinnerframes(traceback: TracebackType, context: int = ...) -> List[FrameType]: ...
+
+def currentframe() -> FrameType: ...
+def stack(context: int = ...) -> List[_FrameRecord]: ...
+def trace(context: int = ...) -> List[_FrameRecord]: ...
diff --git a/typeshed/stdlib/2/io.pyi b/typeshed/stdlib/2/io.pyi
new file mode 100644
index 0000000..5fa20c7
--- /dev/null
+++ b/typeshed/stdlib/2/io.pyi
@@ -0,0 +1,105 @@
+# Stubs for io
+
+# Based on https://docs.python.org/2/library/io.html
+
+# Only a subset of functionality is included.
+
+from typing import List, BinaryIO, TextIO, IO, overload, Iterator, Iterable, Any, Union
+
+DEFAULT_BUFFER_SIZE = 0
+
+def open(file: Union[str, unicode, int],
+         mode: unicode = ..., buffering: int = ..., encoding: unicode = ...,
+         errors: unicode = ..., newline: unicode = ...,
+         closefd: bool = ...) -> IO[Any]: ...
+
+class IOBase:
+    # TODO
+    ...
+
+class BytesIO(BinaryIO):
+    def __init__(self, initial_bytes: str = ...) -> None: ...
+    # TODO getbuffer
+    # TODO see comments in BinaryIO for missing functionality
+    def close(self) -> None: ...
+    def closed(self) -> bool: ...
+    def fileno(self) -> int: ...
+    def flush(self) -> None: ...
+    def isatty(self) -> bool: ...
+    def read(self, n: int = ...) -> str: ...
+    def readable(self) -> bool: ...
+    def readline(self, limit: int = ...) -> str: ...
+    def readlines(self, hint: int = ...) -> List[str]: ...
+    def seek(self, offset: int, whence: int = ...) -> None: ...
+    def seekable(self) -> bool: ...
+    def tell(self) -> int: ...
+    def truncate(self, size: int = ...) -> int: ...
+    def writable(self) -> bool: ...
+    def write(self, s: str) -> None: ...
+    def writelines(self, lines: Iterable[str]) -> None: ...
+    def getvalue(self) -> str: ...
+    def read1(self) -> str: ...
+
+    def __iter__(self) -> Iterator[str]: ...
+    def next(self) -> str: ...
+    def __enter__(self) -> 'BytesIO': ...
+    def __exit__(self, type, value, traceback) -> bool: ...
+
+class StringIO(TextIO):
+    def __init__(self, initial_value: unicode = ...,
+                 newline: unicode = ...) -> None: ...
+    # TODO see comments in BinaryIO for missing functionality
+    name = ...  # type: str
+    def close(self) -> None: ...
+    def closed(self) -> bool: ...
+    def fileno(self) -> int: ...
+    def flush(self) -> None: ...
+    def isatty(self) -> bool: ...
+    def read(self, n: int = ...) -> unicode: ...
+    def readable(self) -> bool: ...
+    def readline(self, limit: int = ...) -> unicode: ...
+    def readlines(self, hint: int = ...) -> List[unicode]: ...
+    def seek(self, offset: int, whence: int = ...) -> None: ...
+    def seekable(self) -> bool: ...
+    def tell(self) -> int: ...
+    def truncate(self, size: int = ...) -> int: ...
+    def writable(self) -> bool: ...
+    def write(self, s: unicode) -> None: ...
+    def writelines(self, lines: Iterable[unicode]) -> None: ...
+    def getvalue(self) -> unicode: ...
+
+    def __iter__(self) -> Iterator[unicode]: ...
+    def next(self) -> unicode: ...
+    def __enter__(self) -> 'StringIO': ...
+    def __exit__(self, type, value, traceback) -> bool: ...
+
+class TextIOWrapper(TextIO):
+    # write_through is undocumented but used by subprocess
+    def __init__(self, buffer: IO[str], encoding: unicode = ...,
+                 errors: unicode = ..., newline: unicode = ...,
+                 line_buffering: bool = ...,
+                 write_through: bool = ...) -> None: ...
+    # TODO see comments in BinaryIO for missing functionality
+    def close(self) -> None: ...
+    def closed(self) -> bool: ...
+    def fileno(self) -> int: ...
+    def flush(self) -> None: ...
+    def isatty(self) -> bool: ...
+    def read(self, n: int = ...) -> unicode: ...
+    def readable(self) -> bool: ...
+    def readline(self, limit: int = ...) -> unicode: ...
+    def readlines(self, hint: int = ...) -> List[unicode]: ...
+    def seek(self, offset: int, whence: int = ...) -> None: ...
+    def seekable(self) -> bool: ...
+    def tell(self) -> int: ...
+    def truncate(self, size: int = ...) -> int: ...
+    def writable(self) -> bool: ...
+    def write(self, s: unicode) -> None: ...
+    def writelines(self, lines: Iterable[unicode]) -> None: ...
+
+    def __iter__(self) -> Iterator[unicode]: ...
+    def next(self) -> unicode: ...
+    def __enter__(self) -> StringIO: ...
+    def __exit__(self, type, value, traceback) -> bool: ...
+
+class BufferedIOBase(IOBase): ...
diff --git a/typeshed/stdlib/2/itertools.pyi b/typeshed/stdlib/2/itertools.pyi
new file mode 100644
index 0000000..286d200
--- /dev/null
+++ b/typeshed/stdlib/2/itertools.pyi
@@ -0,0 +1,87 @@
+# Stubs for itertools
+
+# Based on https://docs.python.org/2/library/itertools.html
+
+from typing import (Iterator, TypeVar, Iterable, overload, Any, Callable, Tuple,
+                    Union, Sequence, Generic, Optional)
+
+_T = TypeVar('_T')
+_S = TypeVar('_S')
+
+def count(start: int = ...,
+          step: int = ...) -> Iterator[int]: ...  # more general types?
+def cycle(iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+def repeat(object: _T, times: int = ...) -> Iterator[_T]: ...
+
+def accumulate(iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+class chain(Iterator[_T], Generic[_T]):
+    def __init__(self, *iterables: Iterable[_T]) -> None: ...
+    def next(self) -> _T: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    @staticmethod
+    def from_iterable(iterable: Iterable[Iterable[_S]]) -> Iterator[_S]: ...
+
+def compress(data: Iterable[_T], selectors: Iterable[Any]) -> Iterator[_T]: ...
+def dropwhile(predicate: Callable[[_T], Any],
+              iterable: Iterable[_T]) -> Iterator[_T]: ...
+def ifilter(predicate: Callable[[_T], Any],
+            iterable: Iterable[_T]) -> Iterator[_T]: ...
+def ifilterfalse(predicate: Callable[[_T], Any],
+                 iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+ at overload
+def groupby(iterable: Iterable[_T]) -> Iterator[Tuple[_T, Iterator[_T]]]: ...
+ at overload
+def groupby(iterable: Iterable[_T],
+            key: Callable[[_T], _S]) -> Iterator[Tuple[_S, Iterator[_T]]]: ...
+
+ at overload
+def islice(iterable: Iterable[_T], stop: int) -> Iterator[_T]: ...
+ at overload
+def islice(iterable: Iterable[_T], start: int, stop: Optional[int],
+           step: int = ...) -> Iterator[_T]: ...
+
+_T1 = TypeVar('_T1')
+_T2 = TypeVar('_T2')
+_T3 = TypeVar('_T3')
+_T4 = TypeVar('_T4')
+
+ at overload
+def imap(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> Iterable[_S]: ...
+ at overload
+def imap(func: Callable[[_T1, _T2], _S],
+        iter1: Iterable[_T1],
+        iter2: Iterable[_T2]) -> Iterable[_S]: ...  # TODO more than two iterables
+
+def starmap(func: Any, iterable: Iterable[Any]) -> Iterator[Any]: ...
+def takewhile(predicate: Callable[[_T], Any],
+              iterable: Iterable[_T]) -> Iterator[_T]: ...
+def tee(iterable: Iterable[Any], n: int = ...) -> Iterator[Any]: ...
+
+ at overload
+def izip(iter1: Iterable[_T1]) -> Iterable[Tuple[_T1]]: ...
+ at overload
+def izip(iter1: Iterable[_T1],
+         iter2: Iterable[_T2]) -> Iterable[Tuple[_T1, _T2]]: ...
+ at overload
+def izip(iter1: Iterable[_T1], iter2: Iterable[_T2],
+         iter3: Iterable[_T3]) -> Iterable[Tuple[_T1, _T2, _T3]]: ...
+ at overload
+def izip(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3],
+         iter4: Iterable[_T4]) -> Iterable[Tuple[_T1, _T2,
+                                           _T3, _T4]]: ...  # TODO more than four iterables
+def izip_longest(*p: Iterable[Any],
+                 fillvalue: Any = ...) -> Iterator[Any]: ...
+
+# TODO: Return type should be Iterator[Tuple[..]], but unknown tuple shape.
+#       Iterator[Sequence[_T]] loses this type information.
+def product(*p: Iterable[_T], repeat: int = ...) -> Iterator[Sequence[_T]]: ...
+
+def permutations(iterable: Iterable[_T],
+                 r: int = ...) -> Iterator[Sequence[_T]]: ...
+def combinations(iterable: Iterable[_T],
+                 r: int) -> Iterable[Sequence[_T]]: ...
+def combinations_with_replacement(iterable: Iterable[_T],
+                                  r: int) -> Iterable[Sequence[_T]]: ...
diff --git a/typeshed/stdlib/2/json.pyi b/typeshed/stdlib/2/json.pyi
new file mode 100644
index 0000000..44a2067
--- /dev/null
+++ b/typeshed/stdlib/2/json.pyi
@@ -0,0 +1,97 @@
+from typing import Any, IO, Optional, Tuple, Callable, Dict, List, Union, Text
+
+class JSONDecodeError(ValueError):
+    def dumps(self, obj: Any) -> str: ...
+    def dump(self, obj: Any, fp: IO[str], *args: Any, **kwds: Any) -> None: ...
+    def loads(self, s: str) -> Any: ...
+    def load(self, fp: IO[str]) -> Any: ...
+
+def dumps(obj: Any,
+    skipkeys: bool = ...,
+    ensure_ascii: bool = ...,
+    check_circular: bool = ...,
+    allow_nan: bool = ...,
+    cls: Any = ...,
+    indent: Optional[int] = ...,
+    separators: Optional[Tuple[str, str]] = ...,
+    encoding: str = ...,
+    default: Optional[Callable[[Any], Any]] = ...,
+    sort_keys: bool = ...,
+    **kwds: Any) -> str: ...
+
+def dump(obj: Any,
+    fp: IO[str],
+    skipkeys: bool = ...,
+    ensure_ascii: bool = ...,
+    check_circular: bool = ...,
+    allow_nan: bool = ...,
+    cls: Any = ...,
+    indent: Optional[int] = ...,
+    separators: Optional[Tuple[str, str]] = ...,
+    encoding: str = ...,
+    default: Optional[Callable[[Any], Any]] = ...,
+    sort_keys: bool = ...,
+    **kwds: Any) -> None: ...
+
+def loads(s: Union[Text, bytes],
+    encoding: Any = ...,
+    cls: Any = ...,
+    object_hook: Optional[Callable[[Dict], Any]] = ...,
+    parse_float: Optional[Callable[[str], Any]] = ...,
+    parse_int: Optional[Callable[[str], Any]] = ...,
+    parse_constant: Optional[Callable[[str], Any]] = ...,
+    object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ...,
+    **kwds: Any) -> Any: ...
+
+def load(fp: IO[str],
+    encoding: Optional[str] = ...,
+    cls: Any = ...,
+    object_hook: Optional[Callable[[Dict], Any]] = ...,
+    parse_float: Optional[Callable[[str], Any]] = ...,
+    parse_int: Optional[Callable[[str], Any]] = ...,
+    parse_constant: Optional[Callable[[str], Any]] = ...,
+    object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ...,
+    **kwds: Any) -> Any: ...
+
+class JSONDecoder(object):
+    def __init__(self,
+        encoding: Union[Text, bytes] = ...,
+        object_hook: Callable[..., Any] = ...,
+        parse_float: Callable[[str], float] = ...,
+        parse_int: Callable[[str], int] = ...,
+        parse_constant: Callable[[str], Any] = ...,
+        strict: bool = ...,
+        object_pairs_hook: Callable[..., Any] = ...) -> None: ...
+
+    def decode(self, s: Union[Text, bytes], _w: Any = ...) -> Any: ...
+
+    def raw_decode(self,
+        s: Union[Text, bytes],
+        idx: int = ...) -> Tuple[Any, Any]: ...
+
+class JSONEncoder(object):
+    item_separator = ...  # type: str
+    key_separator = ...  # type: str
+    skipkeys = ...  # type: bool
+    ensure_ascii = ...  # type: bool
+    check_circular = ...  # type: bool
+    allow_nan = ...  # type: bool
+    sort_keys = ...  # type: bool
+    indent = ...  # type: int
+
+    def __init__(self,
+        skipkeys: bool = ...,
+        ensure_ascii: bool = ...,
+        check_circular: bool = ...,
+        allow_nan: bool = ...,
+        sort_keys: bool = ...,
+        indent: int = ...,
+        separators: Tuple[Union[Text, bytes], Union[Text, bytes]] = ...,
+        encoding: Union[Text, bytes] = ...,
+        default: Callable[..., Any] = ...) -> None: ...
+
+    def default(self, o: Any) -> Any: ...
+
+    def encode(self, o: Any) -> str: ...
+
+    def iterencode(self, o: Any, _one_shot: bool = ...) -> str: ...
diff --git a/typeshed/stdlib/2/linecache.pyi b/typeshed/stdlib/2/linecache.pyi
new file mode 100644
index 0000000..9859788
--- /dev/null
+++ b/typeshed/stdlib/2/linecache.pyi
@@ -0,0 +1,7 @@
+# Stubs for linecache (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def getline(filename, lineno, module_globals=None): ...
+def clearcache(): ...
+def checkcache(filename=None): ...
diff --git a/typeshed/stdlib/2/markupbase.pyi b/typeshed/stdlib/2/markupbase.pyi
new file mode 100644
index 0000000..129b49b
--- /dev/null
+++ b/typeshed/stdlib/2/markupbase.pyi
@@ -0,0 +1,9 @@
+from typing import Tuple
+
+class ParserBase(object):
+    def __init__(self) -> None: ...
+    def error(self, message: str) -> None: ...
+    def reset(self) -> None: ...
+    def getpos(self) -> Tuple[int, int]: ...
+
+    def unkown_decl(self, data: str) -> None: ...
diff --git a/typeshed/stdlib/2/md5.pyi b/typeshed/stdlib/2/md5.pyi
new file mode 100644
index 0000000..3488466
--- /dev/null
+++ b/typeshed/stdlib/2/md5.pyi
@@ -0,0 +1,11 @@
+# Stubs for Python 2.7 md5 stdlib module
+
+class md5(object):
+    def update(self, arg: str) -> None: ...
+    def digest(self) -> str: ...
+    def hexdigest(self) -> str: ...
+    def copy(self) -> md5: ...
+
+def new(string: str = ...) -> md5: ...
+blocksize = 0
+digest_size = 0
diff --git a/typeshed/stdlib/2/mimetools.pyi b/typeshed/stdlib/2/mimetools.pyi
new file mode 100644
index 0000000..abae2b5
--- /dev/null
+++ b/typeshed/stdlib/2/mimetools.pyi
@@ -0,0 +1,31 @@
+# Stubs for mimetools (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import rfc822
+
+class Message(rfc822.Message):
+    encodingheader = ...  # type: Any
+    typeheader = ...  # type: Any
+    def __init__(self, fp, seekable=1): ...
+    plisttext = ...  # type: Any
+    type = ...  # type: Any
+    maintype = ...  # type: Any
+    subtype = ...  # type: Any
+    def parsetype(self): ...
+    plist = ...  # type: Any
+    def parseplist(self): ...
+    def getplist(self): ...
+    def getparam(self, name): ...
+    def getparamnames(self): ...
+    def getencoding(self): ...
+    def gettype(self): ...
+    def getmaintype(self): ...
+    def getsubtype(self): ...
+
+def choose_boundary(): ...
+def decode(input, output, encoding): ...
+def encode(input, output, encoding): ...
+def copyliteral(input, output): ...
+def copybinary(input, output): ...
diff --git a/typeshed/stdlib/2/multiprocessing/__init__.pyi b/typeshed/stdlib/2/multiprocessing/__init__.pyi
new file mode 100644
index 0000000..c830c8b
--- /dev/null
+++ b/typeshed/stdlib/2/multiprocessing/__init__.pyi
@@ -0,0 +1,32 @@
+# Stubs for multiprocessing (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from multiprocessing.process import Process as Process, current_process as current_process, active_children as active_children
+from multiprocessing.util import SUBDEBUG as SUBDEBUG, SUBWARNING as SUBWARNING
+
+class ProcessError(Exception): ...
+class BufferTooShort(ProcessError): ...
+class TimeoutError(ProcessError): ...
+class AuthenticationError(ProcessError): ...
+
+def Manager(): ...
+def Pipe(duplex=True): ...
+def cpu_count() -> int: ...
+def freeze_support(): ...
+def get_logger(): ...
+def log_to_stderr(level=None): ...
+def allow_connection_pickling(): ...
+def Lock(): ...
+def RLock(): ...
+def Condition(lock=None): ...
+def Semaphore(value=1): ...
+def BoundedSemaphore(value=1): ...
+def Event(): ...
+def Queue(maxsize=0): ...
+def JoinableQueue(maxsize=0): ...
+def Pool(processes=None, initializer=None, initargs=..., maxtasksperchild=None): ...
+def RawValue(typecode_or_type, *args): ...
+def RawArray(typecode_or_type, size_or_initializer): ...
+def Value(typecode_or_type, *args, **kwds): ...
+def Array(typecode_or_type, size_or_initializer, **kwds): ...
diff --git a/typeshed/stdlib/2/multiprocessing/process.pyi b/typeshed/stdlib/2/multiprocessing/process.pyi
new file mode 100644
index 0000000..8d4af5d
--- /dev/null
+++ b/typeshed/stdlib/2/multiprocessing/process.pyi
@@ -0,0 +1,39 @@
+# Stubs for multiprocessing.process (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def current_process(): ...
+def active_children(): ...
+
+class Process:
+    def __init__(self, group=None, target=None, name=None, args=..., kwargs=...): ...
+    def run(self): ...
+    def start(self): ...
+    def terminate(self): ...
+    def join(self, timeout=None): ...
+    def is_alive(self): ...
+    @property
+    def name(self): ...
+    @name.setter
+    def name(self, name): ...
+    @property
+    def daemon(self): ...
+    @daemon.setter
+    def daemon(self, daemonic): ...
+    @property
+    def authkey(self): ...
+    @authkey.setter
+    def authkey(self, authkey): ...
+    @property
+    def exitcode(self): ...
+    @property
+    def ident(self): ...
+    pid = ...  # type: Any
+
+class AuthenticationString(bytes):
+    def __reduce__(self): ...
+
+class _MainProcess(Process):
+    def __init__(self): ...
diff --git a/typeshed/stdlib/2/multiprocessing/util.pyi b/typeshed/stdlib/2/multiprocessing/util.pyi
new file mode 100644
index 0000000..e660fab
--- /dev/null
+++ b/typeshed/stdlib/2/multiprocessing/util.pyi
@@ -0,0 +1,33 @@
+# Stubs for multiprocessing.util (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import threading
+
+SUBDEBUG = ...  # type: Any
+SUBWARNING = ...  # type: Any
+
+def sub_debug(msg, *args): ...
+def debug(msg, *args): ...
+def info(msg, *args): ...
+def sub_warning(msg, *args): ...
+def get_logger(): ...
+def log_to_stderr(level=None): ...
+def get_temp_dir(): ...
+def register_after_fork(obj, func): ...
+
+class Finalize:
+    def __init__(self, obj, callback, args=..., kwargs=None, exitpriority=None): ...
+    def __call__(self, wr=None): ...
+    def cancel(self): ...
+    def still_active(self): ...
+
+def is_exiting(): ...
+
+class ForkAwareThreadLock:
+    def __init__(self): ...
+
+class ForkAwareLocal(threading.local):
+    def __init__(self): ...
+    def __reduce__(self): ...
diff --git a/typeshed/stdlib/2/optparse.pyi b/typeshed/stdlib/2/optparse.pyi
new file mode 100644
index 0000000..0606a62
--- /dev/null
+++ b/typeshed/stdlib/2/optparse.pyi
@@ -0,0 +1,249 @@
+# Generated by pytype, with only minor tweaks. Might be incomplete.
+
+from typing import Any, Optional, List, Callable, Tuple, Dict, Iterable, Union
+
+# See https://groups.google.com/forum/#!topic/python-ideas/gA1gdj3RZ5g
+Text = Union[str, unicode]
+
+NO_DEFAULT = ...  # type: Tuple[str, ...]
+SUPPRESS_HELP = ...  # type: str
+SUPPRESS_USAGE = ...  # type: str
+
+def check_builtin(option: Option, opt, value: Text) -> Any: ...
+def check_choice(option: Option, opt, value) -> Any: ...
+def isbasestring(x) -> bool: ...
+
+class OptParseError(Exception):
+    msg = ...  # type: Any
+    def __init__(self, msg) -> None: ...
+
+class BadOptionError(OptParseError):
+    opt_str = ...  # type: Any
+    def __init__(self, opt_str) -> None: ...
+
+class AmbiguousOptionError(BadOptionError):
+    possibilities = ...  # type: Any
+    def __init__(self, opt_str, possibilities) -> None: ...
+
+class OptionError(OptParseError):
+    msg = ...  # type: Any
+    option_id = ...  # type: str
+    def __init__(self, msg, option: Option) -> None: ...
+
+class OptionConflictError(OptionError): ...
+
+class HelpFormatter:
+    NO_DEFAULT_VALUE = ...  # type: str
+    _long_opt_fmt = ...  # type: Union[str, unicode]
+    _short_opt_fmt = ...  # type: Union[str, unicode]
+    current_indent = ...  # type: int
+    default_tag = ...  # type: str
+    help_position = ...  # type: Any
+    help_width = ...  # type: Any
+    indent_increment = ...  # type: Any
+    level = ...  # type: int
+    max_help_position = ...  # type: int
+    option_strings = ...  # type: Dict[Option, str]
+    parser = ...  # type: Any
+    short_first = ...  # type: Any
+    width = ...  # type: Any
+    def __init__(self, indent_increment, max_help_position, width, short_first) -> None: ...
+    def _format_text(self, text: Text) -> Text: ...
+    def dedent(self) -> None: ...
+    def expand_default(self, option: Option) -> Text: ...
+    def format_description(self, description) -> Any: ...
+    def format_epilog(self, epilog) -> Any: ...
+    def format_heading(self, heading) -> Any: ...
+    def format_option(self, option: Any) -> str: ...
+    def format_option_strings(self, option: Any) -> Any: ...
+    def format_usage(self, usage) -> Any: ...
+    def indent(self) -> None: ...
+    def set_long_opt_delimiter(self, delim) -> None: ...
+    def set_parser(self, parser) -> None: ...
+    def set_short_opt_delimiter(self, delim) -> None: ...
+    def store_option_strings(self, parser) -> None: ...
+
+class IndentedHelpFormatter(HelpFormatter):
+    _long_opt_fmt = ...  # type: str
+    _short_opt_fmt = ...  # type: str
+    current_indent = ...  # type: int
+    default_tag = ...  # type: str
+    help_position = ...  # type: int
+    help_width = ...  # type: Optional[int]
+    indent_increment = ...  # type: Any
+    level = ...  # type: int
+    max_help_position = ...  # type: int
+    option_strings = ...  # type: Dict[Any, Any]
+    parser = ...  # type: Optional[OptionParser]
+    short_first = ...  # type: Any
+    width = ...  # type: Any
+    def __init__(self, *args, **kwargs) -> None: ...
+    def format_heading(self, heading) -> str: ...
+    def format_usage(self, usage) -> str: ...
+
+class Option:
+    ACTIONS = ...  # type: Tuple[str, ...]
+    ALWAYS_TYPED_ACTIONS = ...  # type: Tuple[str, ...]
+    ATTRS = ...  # type: List[str]
+    CHECK_METHODS = ...  # type: Union[None, List[Callable]]
+    CONST_ACTIONS = ...  # type: Tuple[str, ...]
+    STORE_ACTIONS = ...  # type: Tuple[str, ...]
+    TYPED_ACTIONS = ...  # type: Tuple[str, ...]
+    TYPES = ...  # type: Tuple[str, ...]
+    TYPE_CHECKER = ...  # type: Dict[str, Callable]
+    _long_opts = ...  # type: List[Text]
+    _short_opts = ...  # type: List[Text]
+    action = ...  # type: str
+    dest = ...  # type: Any
+    nargs = ...  # type: int
+    type = ...  # type: Any
+    def __init__(self, *args, **kwargs) -> None: ...
+    def __repr__(self) -> str: ...
+    def __str__(self) -> str: ...
+    def _check_action(self) -> None: ...
+    def _check_callback(self) -> None: ...
+    def _check_choice(self) -> None: ...
+    def _check_const(self) -> None: ...
+    def _check_dest(self) -> None: ...
+    def _check_nargs(self) -> None: ...
+    def _check_opt_strings(self, opts) -> Any: ...
+    def _check_type(self) -> None: ...
+    def _set_attrs(self, attrs: Dict[str, Any]) -> None: ...
+    def _set_opt_strings(self, opts) -> None: ...
+    def check_value(self, opt, value) -> Any: ...
+    def convert_value(self, opt, value) -> Any: ...
+    def get_opt_string(self) -> Text: ...
+    def process(self, opt, value, values: Any, parser: OptionParser) -> int: ...
+    def take_action(self, action, dest, opt, value, values, parser: OptionParser) -> int: ...
+    def takes_value(self) -> bool: ...
+
+make_option = Option
+
+class OptionContainer:
+    _long_opt = ...  # type: Dict[Text, Any]
+    _short_opt = ...  # type: Dict[Text, Any]
+    conflict_handler = ...  # type: Any
+    defaults = ...  # type: Dict[Text, Any]
+    description = ...  # type: Any
+    option_class = ...  # type: Any
+    def __init__(self, option_class, conflict_handler, description) -> None: ...
+    def _check_conflict(self, option: Any) -> None: ...
+    def _create_option_mappings(self) -> None: ...
+    def _share_option_mappings(self, parser) -> None: ...
+    def add_option(self, *args, **kwargs) -> Any: ...
+    def add_options(self, option_list) -> None: ...
+    def destroy(self) -> None: ...
+    def format_description(self, formatter: Optional[HelpFormatter]) -> Any: ...
+    def format_help(self, formatter: HelpFormatter) -> str: ...
+    def format_option_help(self, formatter: Optional[HelpFormatter]) -> str: ...
+    def get_description(self) -> Any: ...
+    def get_option(self, opt_str) -> Optional[Option]: ...
+    def has_option(self, opt_str) -> bool: ...
+    def remove_option(self, opt_str) -> None: ...
+    def set_conflict_handler(self, handler) -> None: ...
+    def set_description(self, description) -> None: ...
+
+class OptionGroup(OptionContainer):
+    _long_opt = ...  # type: Dict[Any, Any]
+    _short_opt = ...  # type: Dict[Any, Any]
+    conflict_handler = ...  # type: Any
+    defaults = ...  # type: Dict[Text, Any]
+    description = ...  # type: Any
+    option_class = ...  # type: Any
+    option_list = ...  # type: List
+    parser = ...  # type: Any
+    title = ...  # type: Any
+    def __init__(self, parser, title, *args, **kwargs) -> None: ...
+    def _create_option_list(self) -> None: ...
+    def format_help(self, formatter: HelpFormatter) -> Any: ...
+    def set_title(self, title) -> None: ...
+
+class OptionParser(OptionContainer):
+    _long_opt = ...  # type: Dict[Text, Any]
+    _short_opt = ...  # type: Dict[Any, Any]
+    allow_interspersed_args = ...  # type: bool
+    conflict_handler = ...  # type: Any
+    defaults = ...  # type: Dict[Any, Any]
+    description = ...  # type: Text
+    epilog = ...  # type: Any
+    formatter = ...  # type: HelpFormatter
+    largs = ...  # type: Union[None, List[Text]]
+    option_class = ...  # type: Callable
+    option_groups = ...  # type: List[OptionParser]
+    option_list = ...  # type: List[Any]
+    process_default_values = ...  # type: Any
+    prog = ...  # type: Any
+    rargs = ...  # type: Optional[List[Any]]
+    standard_option_list = ...  # type: List
+    usage = ...  # type: Optional[Text]
+    values = ...  # type: Any
+    version = ...  # type: Text
+    def __init__(self, *args, **kwargs) -> None: ...
+    def _add_help_option(self) -> None: ...
+    def _add_version_option(self) -> None: ...
+    def _create_option_list(self) -> None: ...
+    def _get_all_options(self) -> List[Any]: ...
+    def _get_args(self, args: Iterable) -> List[Any]: ...
+    def _get_encoding(self, file) -> Any: ...
+    def _init_parsing_state(self) -> None: ...
+    def _match_long_opt(self, opt) -> Any: ...
+    def _populate_option_list(self, option_list, *args, **kwargs) -> None: ...
+    def _process_args(self, largs: List[Text], rargs: List, values: Values) -> None: ...
+    def _process_long_opt(self, rargs: List, values) -> None: ...
+    def _process_short_opts(self, rargs: List, values) -> None: ...
+    def add_option_group(self, *args, **kwargs) -> OptionParser: ...
+    def check_values(self, values, args) -> Tuple[Any, ...]: ...
+    def disable_interspersed_args(self) -> None: ...
+    def enable_interspersed_args(self) -> None: ...
+    def error(self, msg) -> None: ...
+    def exit(self, *args, **kwargs) -> None: ...
+    def expand_prog_name(self, s: Optional[Text]) -> Any: ...
+    def format_epilog(self, formatter: Union[HelpFormatter, OptionParser, None]) -> Any: ...
+    def format_help(self, *args, **kwargs) -> str: ...
+    def format_option_help(self, *args, **kwargs) -> str: ...
+    def get_default_values(self) -> Values: ...
+    def get_option_group(self, opt_str) -> Any: ...
+    def get_prog_name(self) -> Any: ...
+    def get_usage(self) -> Text: ...
+    def get_version(self) -> Any: ...
+    def parse_args(self, *args, **kwargs) -> Tuple[Any, ...]: ...
+    def print_help(self, *args, **kwargs) -> None: ...
+    def print_usage(self, *args, **kwargs) -> None: ...
+    def print_version(self, *args, **kwargs) -> None: ...
+    def set_default(self, dest, value) -> None: ...
+    def set_defaults(self, *args, **kwargs) -> None: ...
+    def set_process_default_values(self, process) -> None: ...
+    def set_usage(self, usage: Text) -> None: ...
+
+class OptionValueError(OptParseError):
+    msg = ...  # type: Any
+
+class TitledHelpFormatter(HelpFormatter):
+    _long_opt_fmt = ...  # type: str
+    _short_opt_fmt = ...  # type: str
+    current_indent = ...  # type: int
+    default_tag = ...  # type: str
+    help_position = ...  # type: int
+    help_width = ...  # type: None
+    indent_increment = ...  # type: Any
+    level = ...  # type: int
+    max_help_position = ...  # type: int
+    option_strings = ...  # type: Dict
+    parser = ...  # type: None
+    short_first = ...  # type: Any
+    width = ...  # type: Any
+    def __init__(self, *args, **kwargs) -> None: ...
+    def format_heading(self, heading) -> str: ...
+    def format_usage(self, usage) -> str: ...
+
+class Values:
+    def __cmp__(self, other) -> int: ...
+    def __init__(self, *args, **kwargs) -> None: ...
+    def __repr__(self) -> str: ...
+    def __str__(self) -> str: ...
+    def _update(self, dict: Dict[str, Any], mode) -> None: ...
+    def _update_careful(self, dict: Dict[str, Any]) -> None: ...
+    def _update_loose(self, dict) -> None: ...
+    def ensure_value(self, attr, value) -> Any: ...
+    def read_file(self, filename, *args, **kwargs) -> None: ...
+    def read_module(self, modname, *args, **kwargs) -> None: ...
diff --git a/typeshed/stdlib/2/os/__init__.pyi b/typeshed/stdlib/2/os/__init__.pyi
new file mode 100644
index 0000000..3bd50d8
--- /dev/null
+++ b/typeshed/stdlib/2/os/__init__.pyi
@@ -0,0 +1,303 @@
+# created from https://docs.python.org/2/library/os.html
+
+from typing import (
+    List, Tuple, Union, Sequence, Mapping, IO, Any, Optional, AnyStr, Iterator,
+    Dict, MutableMapping, NamedTuple, overload
+)
+from . import path
+from mypy_extensions import NoReturn
+
+error = OSError
+name = ...  # type: str
+
+class _Environ(MutableMapping[str, str]):
+    def copy(self) -> Dict[str, str]: ...
+
+environ = ...  # type: _Environ
+
+def chdir(path: unicode) -> None: ...
+def fchdir(fd: int) -> None: ...
+def getcwd() -> str: ...
+def ctermid() -> str: ...
+def getegid() -> int: ...
+def geteuid() -> int: ...
+def getgid() -> int: ...
+def getgroups() -> List[int]: ...
+def initgroups(username: str, gid: int) -> None: ...
+def getlogin() -> str: ...
+def getpgid(pid: int) -> int: ...
+def getpgrp() -> int: ...
+def getpid() -> int: ...
+def getppid() -> int: ...
+def getresuid() -> Tuple[int, int, int]: ...
+def getresgid() -> Tuple[int, int, int]: ...
+def getuid() -> int: ...
+def getenv(varname: unicode, value: unicode = ...) -> str: ...
+def putenv(varname: unicode, value: unicode) -> None: ...
+def setegid(egid: int) -> None: ...
+def seteuid(euid: int) -> None: ...
+def setgid(gid: int) -> None: ...
+def setgroups(groups: Sequence[int]) -> None: ...
+
+# TODO(MichalPokorny)
+def setpgrp(*args) -> None: ...
+
+def setpgid(pid: int, pgrp: int) -> None: ...
+def setregid(rgid: int, egid: int) -> None: ...
+def setresgid(rgid: int, egid: int, sgid: int) -> None: ...
+def setresuid(ruid: int, euid: int, suid: int) -> None: ...
+def setreuid(ruid: int, euid: int) -> None: ...
+def getsid(pid: int) -> int: ...
+def setsid() -> None: ...
+def setuid(pid: int) -> None: ...
+
+def strerror(code: int) -> str: ...
+
+def umask(mask: int) -> int: ...
+def uname() -> Tuple[str, str, str, str, str]: ...
+def unsetenv(varname: str) -> None: ...
+
+# TODO(MichalPokorny)
+def fdopen(fd: int, *args, **kwargs) -> IO[Any]: ...
+def popen(command: str, *args, **kwargs) -> Optional[IO[Any]]: ...
+def tmpfile() -> IO[Any]: ...
+
+def tmpnam() -> str: ...
+def tempnam(dir: str = ..., prefix: str = ...) -> str: ...
+
+def popen2(cmd: str, *args, **kwargs) -> Tuple[IO[Any], IO[Any]]: ...
+def popen3(cmd: str, *args, **kwargs) -> Tuple[IO[Any], IO[Any], IO[Any]]: ...
+def popen4(cmd: str, *args, **kwargs) -> Tuple[IO[Any], IO[Any]]: ...
+
+def close(fd: int) -> None: ...
+def closerange(fd_low: int, fd_high: int) -> None: ...
+def dup(fd: int) -> int: ...
+def dup2(fd: int, fd2: int) -> None: ...
+def fchmod(fd: int, mode: int) -> None: ...
+def fchown(fd: int, uid: int, gid: int) -> None: ...
+def fdatasync(fd: int) -> None: ...
+def fpathconf(fd: int, name: str) -> None: ...
+
+# TODO(prvak)
+def fstat(fd: int) -> Any: ...
+def fsync(fd: int) -> None: ...
+def ftruncate(fd: int, length: int) -> None: ...
+def isatty(fd: int) -> bool: ...
+
+def lseek(fd: int, pos: int, how: int) -> None: ...
+SEEK_SET = 0
+SEEK_CUR = 0
+SEEK_END = 0
+
+# TODO(prvak): maybe file should be unicode? (same with all other paths...)
+def open(file: unicode, flags: int, mode: int = ...) -> int: ...
+def openpty() -> Tuple[int, int]: ...
+def pipe() -> Tuple[int, int]: ...
+def read(fd: int, n: int) -> str: ...
+def tcgetpgrp(fd: int) -> int: ...
+def tcsetpgrp(fd: int, pg: int) -> None: ...
+def ttyname(fd: int) -> str: ...
+def write(fd: int, str: str) -> int: ...
+
+# TODO: O_*
+
+def access(path: unicode, mode: int) -> bool: ...
+F_OK = 0
+R_OK = 0
+W_OK = 0
+X_OK = 0
+
+def getcwdu() -> unicode: ...
+def chflags(path: unicode, flags: int) -> None: ...
+def chroot(path: unicode) -> None: ...
+def chmod(path: unicode, mode: int) -> None: ...
+def chown(path: unicode, uid: int, gid: int) -> None: ...
+def lchflags(path: unicode, flags: int) -> None: ...
+def lchmod(path: unicode, uid: int, gid: int) -> None: ...
+def lchown(path: unicode, uid: int, gid: int) -> None: ...
+def link(source: unicode, link_name: unicode) -> None: ...
+def listdir(path: AnyStr) -> List[AnyStr]: ...
+
+# TODO(MichalPokorny)
+def lstat(path: unicode) -> Any: ...
+
+def mkfifo(path: unicode, mode: int = ...) -> None: ...
+def mknod(filename: unicode, mode: int = ..., device: int = ...) -> None: ...
+def major(device: int) -> int: ...
+def minor(device: int) -> int: ...
+def makedev(major: int, minor: int) -> int: ...
+def mkdir(path: unicode, mode: int = ...) -> None: ...
+def makedirs(path: unicode, mode: int = ...) -> None: ...
+def pathconf(path: unicode, name: str) -> str: ...
+
+pathconf_names = ...  # type: Mapping[str, int]
+
+def readlink(path: AnyStr) -> AnyStr: ...
+def remove(path: unicode) -> None: ...
+def removedirs(path: unicode) -> None: ...
+def rename(src: unicode, dst: unicode) -> None: ...
+def renames(old: unicode, new: unicode) -> None: ...
+def rmdir(path: unicode) -> None: ...
+
+# TODO(MichalPokorny)
+def stat(path: unicode) -> Any: ...
+
+_StatVFS = NamedTuple('_StatVFS', [('f_bsize', int), ('f_frsize', int), ('f_blocks', int),
+                                   ('f_bfree', int), ('f_bavail', int), ('f_files', int),
+                                   ('f_ffree', int), ('f_favail', int), ('f_flag', int),
+                                   ('f_namemax', int)])
+
+def fstatvfs(fd: int) -> _StatVFS: ...
+def statvfs(path: unicode) -> _StatVFS: ...
+
+def walk(top: AnyStr, topdown: bool = ..., onerror: Any = ...,
+         followlinks: bool = ...) -> Iterator[Tuple[AnyStr, List[AnyStr],
+                                                    List[AnyStr]]]: ...
+
+def symlink(source: unicode, link_name: unicode) -> None: ...
+def unlink(path: unicode) -> None: ...
+def utime(path: unicode, times: Optional[Tuple[int, int]]) -> None: ...
+
+def abort() -> None: ...
+
+EX_OK = 0        # Unix only
+EX_USAGE = 0     # Unix only
+EX_DATAERR = 0   # Unix only
+EX_NOINPUT = 0   # Unix only
+EX_NOUSER = 0    # Unix only
+EX_NOHOST = 0    # Unix only
+EX_UNAVAILABLE = 0  # Unix only
+EX_SOFTWARE = 0  # Unix only
+EX_OSERR = 0     # Unix only
+EX_OSFILE = 0    # Unix only
+EX_CANTCREAT = 0  # Unix only
+EX_IOERR = 0     # Unix only
+EX_TEMPFAIL = 0  # Unix only
+EX_PROTOCOL = 0  # Unix only
+EX_NOPERM = 0    # Unix only
+EX_CONFIG = 0    # Unix only
+
+def execl(file: AnyStr, *args) -> None: ...
+def execle(file: AnyStr, *args) -> None: ...
+def execlp(file: AnyStr, *args) -> None: ...
+def execlpe(file: AnyStr, *args) -> None: ...
+def execvp(file: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]]) -> None: ...
+def execvpe(file: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]], env: Mapping[AnyStr, AnyStr]) -> None: ...
+def execv(path: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]]) -> None: ...
+def execve(path: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]], env: Mapping[AnyStr, AnyStr]) -> None: ...
+
+def _exit(n: int) -> NoReturn: ...
+
+def fork() -> int: ...
+def forkpty() -> Tuple[int, int]: ...
+
+def kill(pid: int, sig: int) -> None: ...
+def killpg(pgid: int, sig: int) -> None: ...
+def nice(increment: int) -> int: ...
+
+# TODO: plock, popen*, P_*
+
+def spawnl(mode: int, path: AnyStr, arg0: AnyStr, *args: AnyStr) -> int: ...
+def spawnle(mode: int, path: AnyStr, arg0: AnyStr,
+            *args: Any) -> int: ...  # Imprecise sig
+def spawnlp(mode: int, file: AnyStr, arg0: AnyStr,
+            *args: AnyStr) -> int: ...  # Unix only TODO
+def spawnlpe(mode: int, file: AnyStr, arg0: AnyStr, *args: Any) -> int:
+    ...  # Imprecise signature; Unix only TODO
+def spawnv(mode: int, path: AnyStr, args: List[AnyStr]) -> int: ...
+def spawnve(mode: int, path: AnyStr, args: List[AnyStr],
+            env: Mapping[str, str]) -> int: ...
+def spawnvp(mode: int, file: AnyStr, args: List[AnyStr]) -> int: ...  # Unix only
+def spawnvpe(mode: int, file: AnyStr, args: List[AnyStr],
+             env: Mapping[str, str]) -> int:
+    ...  # Unix only
+def startfile(path: unicode, operation: str = ...) -> None: ...  # Windows only
+def system(command: unicode) -> int: ...
+def times() -> Tuple[float, float, float, float, float]: ...
+def wait() -> Tuple[int, int]: ...  # Unix only
+def wait3(options: int) -> Tuple[int, int, Any]: ...  # Unix only
+def wait4(pid: int, options: int) -> Tuple[int, int, Any]: ...  # Unix only
+def waitpid(pid: int, options: int) -> Tuple[int, int]: ...
+
+def confstr(name: Union[str, int]) -> Optional[str]: ...
+confstr_names = ...  # type: Mapping[str, int]
+
+def getloadavg() -> Tuple[float, float, float]: ...
+
+def sysconf(name: Union[str, int]) -> int: ...
+sysconf_names = ...  # type: Mapping[str, int]
+
+curdir = ...  # type: str
+pardir = ...  # type: str
+sep = ...  # type: str
+altsep = ...  # type: str
+extsep = ...  # type: str
+pathsep = ...  # type: str
+defpath = ...  # type: str
+linesep = ...  # type: str
+devnull = ...  # type: str
+
+def urandom(n: int) -> str: ...
+
+# More constants, copied from stdlib/3/os/__init__.pyi
+
+O_RDONLY = 0
+O_WRONLY = 0
+O_RDWR = 0
+O_APPEND = 0
+O_CREAT = 0
+O_EXCL = 0
+O_TRUNC = 0
+O_DSYNC = 0    # Unix only
+O_RSYNC = 0    # Unix only
+O_SYNC = 0     # Unix only
+O_NDELAY = 0   # Unix only
+O_NONBLOCK = 0  # Unix only
+O_NOCTTY = 0   # Unix only
+O_SHLOCK = 0   # Unix only
+O_EXLOCK = 0   # Unix only
+O_BINARY = 0     # Windows only
+O_NOINHERIT = 0  # Windows only
+O_SHORT_LIVED = 0  # Windows only
+O_TEMPORARY = 0  # Windows only
+O_RANDOM = 0     # Windows only
+O_SEQUENTIAL = 0  # Windows only
+O_TEXT = 0       # Windows only
+O_ASYNC = 0      # Gnu extension if in C library
+O_DIRECT = 0     # Gnu extension if in C library
+O_DIRECTORY = 0  # Gnu extension if in C library
+O_NOFOLLOW = 0   # Gnu extension if in C library
+O_NOATIME = 0    # Gnu extension if in C library
+O_LARGEFILE = 0  # Gnu extension if in C library
+
+P_NOWAIT = 0
+P_NOWAITO = 0
+P_WAIT = 0
+# P_DETACH = 0  # Windows only
+# P_OVERLAY = 0  # Windows only
+
+# wait()/waitpid() options
+WNOHANG = 0  # Unix only
+WCONTINUED = 0  # some Unix systems
+WUNTRACED = 0  # Unix only
+
+P_ALL = 0
+WEXITED = 0
+WNOWAIT = 0
+
+TMP_MAX = 0
+
+# Below are Unix-only
+def WCOREDUMP(status: int) -> bool: ...
+def WEXITSTATUS(status: int) -> int: ...
+def WIFCONTINUED(status: int) -> bool: ...
+def WIFEXITED(status: int) -> bool: ...
+def WIFSIGNALED(status: int) -> bool: ...
+def WIFSTOPPED(status: int) -> bool: ...
+def WSTOPSIG(status: int) -> int: ...
+def WTERMSIG(status: int) -> int: ...
+
+ at overload
+def stat_float_times(newvalue: bool = ...) -> None: ...
+ at overload
+def stat_float_times() -> bool: ...
diff --git a/typeshed/stdlib/2/os/path.pyi b/typeshed/stdlib/2/os/path.pyi
new file mode 100644
index 0000000..bfd88a4
--- /dev/null
+++ b/typeshed/stdlib/2/os/path.pyi
@@ -0,0 +1,65 @@
+# Stubs for os.path
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http://docs.python.org/3.2/library/os.path.html
+# adapted for 2.7 by Michal Pokorny
+
+from typing import overload, List, Any, Tuple, BinaryIO, TextIO, TypeVar, Callable, AnyStr
+
+# ----- os.path variables -----
+supports_unicode_filenames = False
+# aliases (also in os)
+curdir = ...  # type: str
+pardir = ...  # type: str
+sep = ...  # type: str
+altsep = ...  # type: str
+extsep = ...  # type: str
+pathsep = ...  # type: str
+defpath = ...  # type: str
+devnull = ...  # type: str
+
+# ----- os.path function stubs -----
+def abspath(path: AnyStr) -> AnyStr: ...
+def basename(path: AnyStr) -> AnyStr: ...
+
+def commonprefix(list: List[AnyStr]) -> AnyStr: ...
+def dirname(path: AnyStr) -> AnyStr: ...
+def exists(path: unicode) -> bool: ...
+def lexists(path: unicode) -> bool: ...
+def expanduser(path: AnyStr) -> AnyStr: ...
+def expandvars(path: AnyStr) -> AnyStr: ...
+
+# These return float if os.stat_float_times() == True,
+# but int is a subclass of float.
+def getatime(path: unicode) -> float: ...
+def getmtime(path: unicode) -> float: ...
+def getctime(path: unicode) -> float: ...
+
+def getsize(path: unicode) -> int: ...
+def isabs(path: unicode) -> bool: ...
+def isfile(path: unicode) -> bool: ...
+def isdir(path: unicode) -> bool: ...
+def islink(path: unicode) -> bool: ...
+def ismount(path: unicode) -> bool: ...
+
+def join(path: AnyStr, *paths: AnyStr) -> AnyStr: ...
+
+def normcase(path: AnyStr) -> AnyStr: ...
+def normpath(path: AnyStr) -> AnyStr: ...
+def realpath(path: AnyStr) -> AnyStr: ...
+def relpath(path: AnyStr, start: AnyStr = ...) -> AnyStr: ...
+
+def samefile(path1: unicode, path2: unicode) -> bool: ...
+def sameopenfile(fp1: int, fp2: int) -> bool: ...
+# TODO
+# def samestat(stat1: stat_result,
+#             stat2: stat_result) -> bool: ...  # Unix only
+
+def split(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+def splitdrive(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+def splitext(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+
+def splitunc(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...  # Windows only, deprecated
+
+_T = TypeVar('_T')
+def walk(path: AnyStr, visit: Callable[[_T, AnyStr, List[AnyStr]], Any], arg: _T) -> None: ...
diff --git a/typeshed/stdlib/2/pdb.pyi b/typeshed/stdlib/2/pdb.pyi
new file mode 100644
index 0000000..1c375fe
--- /dev/null
+++ b/typeshed/stdlib/2/pdb.pyi
@@ -0,0 +1,30 @@
+# Stub for pdb (incomplete, only some global functions)
+
+from typing import Any, Dict
+
+def run(statement: str,
+        globals: Dict[str, Any] = None,
+        locals: Dict[str, Any] = None) -> None:
+    ...
+
+def runeval(expression: str,
+            globals: Dict[str, Any] = None,
+            locals: Dict[str, Any] = None) -> Any:
+    ...
+
+def runctx(statement: str,
+        globals: Dict[str, Any],
+        locals: Dict[str, Any]) -> None:
+    ...
+
+def runcall(*args: Any, **kwds: Any) -> Any:
+    ...
+
+def set_trace() -> None:
+    ...
+
+def post_mortem(t: Any = None) -> None:
+    ...
+
+def pm() -> None:
+    ...
diff --git a/typeshed/stdlib/2/pickle.pyi b/typeshed/stdlib/2/pickle.pyi
new file mode 100644
index 0000000..1b5b1d6
--- /dev/null
+++ b/typeshed/stdlib/2/pickle.pyi
@@ -0,0 +1,38 @@
+# Stubs for pickle (Python 2)
+
+from typing import Any, BinaryIO
+
+
+HIGHEST_PROTOCOL = ...  # type: int
+
+
+def dump(obj: Any, file: BinaryIO, protocol: int = None) -> None: ...
+def dumps(obj: Any, protocol: int = ...) -> bytes: ...
+def load(file: BinaryIO) -> Any: ...
+def loads(string: bytes) -> Any: ...
+
+
+class PickleError(Exception):
+    pass
+
+
+class PicklingError(PickleError):
+    pass
+
+
+class UnpicklingError(PickleError):
+    pass
+
+
+class Pickler:
+    def __init__(self, file: BinaryIO, protocol: int = None) -> None: ...
+
+    def dump(self, obj: Any) -> None: ...
+
+    def clear_memo(self) -> None: ...
+
+
+class Unpickler:
+    def __init__(self, file: BinaryIO) -> None: ...
+
+    def load(self) -> Any: ...
diff --git a/typeshed/stdlib/2/pipes.pyi b/typeshed/stdlib/2/pipes.pyi
new file mode 100644
index 0000000..d5f5291
--- /dev/null
+++ b/typeshed/stdlib/2/pipes.pyi
@@ -0,0 +1,13 @@
+from typing import Any, IO
+
+class Template:
+    def __init__(self) -> None: ...
+    def reset(self) -> None: ...
+    def clone(self) -> Template: ...
+    def debug(self, flag: bool) -> None: ...
+    def append(self, cmd: str, kind: str) -> None: ...
+    def prepend(self, cmd: str, kind: str) -> None: ...
+    def open(self, file: str, mode: str) -> IO[Any]: ...
+    def copy(self, infile: str, outfile: str) -> None: ...
+
+def quote(s: str) -> str: ...
diff --git a/typeshed/stdlib/2/platform.pyi b/typeshed/stdlib/2/platform.pyi
new file mode 100644
index 0000000..75125f8
--- /dev/null
+++ b/typeshed/stdlib/2/platform.pyi
@@ -0,0 +1,45 @@
+# Stubs for platform (Python 2)
+#
+# Based on stub generated by stubgen.
+
+from typing import Any
+
+__copyright__ = ...  # type: Any
+DEV_NULL = ...  # type: Any
+
+def libc_ver(executable=..., lib=..., version=..., chunksize=2048): ...
+def linux_distribution(distname=..., version=..., id=..., supported_dists=..., full_distribution_name=1): ...
+def dist(distname=..., version=..., id=..., supported_dists=...): ...
+
+class _popen:
+    tmpfile = ...  # type: Any
+    pipe = ...  # type: Any
+    bufsize = ...  # type: Any
+    mode = ...  # type: Any
+    def __init__(self, cmd, mode=..., bufsize=None): ...
+    def read(self): ...
+    def readlines(self): ...
+    def close(self, remove=..., error=...): ...
+    __del__ = ...  # type: Any
+
+def popen(cmd, mode=..., bufsize=None): ...
+def win32_ver(release=..., version=..., csd=..., ptype=...): ...
+def mac_ver(release=..., versioninfo=..., machine=...): ...
+def java_ver(release=..., vendor=..., vminfo=..., osinfo=...): ...
+def system_alias(system, release, version): ...
+def architecture(executable=..., bits=..., linkage=...): ...
+def uname(): ...
+def system(): ...
+def node(): ...
+def release(): ...
+def version(): ...
+def machine(): ...
+def processor(): ...
+def python_implementation(): ...
+def python_version(): ...
+def python_version_tuple(): ...
+def python_branch(): ...
+def python_revision(): ...
+def python_build(): ...
+def python_compiler(): ...
+def platform(aliased=0, terse=0): ...
diff --git a/typeshed/stdlib/2/posix.pyi b/typeshed/stdlib/2/posix.pyi
new file mode 100644
index 0000000..f8feb03
--- /dev/null
+++ b/typeshed/stdlib/2/posix.pyi
@@ -0,0 +1,205 @@
+from typing import List, Mapping, Tuple, Union, Sequence, IO, Optional, TypeVar
+
+error = OSError
+
+confstr_names = ...  # type: Dict[str, int]
+environ = ...  # type: Dict[str, str]
+pathconf_names = ...  # type: Dict[str, int]
+sysconf_names = ...  # type: Dict[str, int]
+
+EX_CANTCREAT = ...  # type: int
+EX_CONFIG = ...  # type: int
+EX_DATAERR = ...  # type: int
+EX_IOERR = ...  # type: int
+EX_NOHOST = ...  # type: int
+EX_NOINPUT = ...  # type: int
+EX_NOPERM = ...  # type: int
+EX_NOUSER = ...  # type: int
+EX_OK = ...  # type: int
+EX_OSERR = ...  # type: int
+EX_OSFILE = ...  # type: int
+EX_PROTOCOL = ...  # type: int
+EX_SOFTWARE = ...  # type: int
+EX_TEMPFAIL = ...  # type: int
+EX_UNAVAILABLE = ...  # type: int
+EX_USAGE = ...  # type: int
+F_OK = ...  # type: int
+NGROUPS_MAX = ...  # type: int
+O_APPEND = ...  # type: int
+O_ASYNC = ...  # type: int
+O_CREAT = ...  # type: int
+O_DIRECT = ...  # type: int
+O_DIRECTORY = ...  # type: int
+O_DSYNC = ...  # type: int
+O_EXCL = ...  # type: int
+O_LARGEFILE = ...  # type: int
+O_NDELAY = ...  # type: int
+O_NOATIME = ...  # type: int
+O_NOCTTY = ...  # type: int
+O_NOFOLLOW = ...  # type: int
+O_NONBLOCK = ...  # type: int
+O_RDONLY = ...  # type: int
+O_RDWR = ...  # type: int
+O_RSYNC = ...  # type: int
+O_SYNC = ...  # type: int
+O_TRUNC = ...  # type: int
+O_WRONLY = ...  # type: int
+R_OK = ...  # type: int
+TMP_MAX = ...  # type: int
+WCONTINUED = ...  # type: int
+WNOHANG = ...  # type: int
+WUNTRACED = ...  # type: int
+W_OK = ...  # type: int
+X_OK = ...  # type: int
+
+def WCOREDUMP(status: int) -> bool: ...
+def WEXITSTATUS(status: int) -> bool: ...
+def WIFCONTINUED(status: int) -> bool: ...
+def WIFEXITED(status: int) -> bool: ...
+def WIFSIGNALED(status: int) -> bool: ...
+def WIFSTOPPED(status: int) -> bool: ...
+def WSTOPSIG(status: int) -> bool: ...
+def WTERMSIG(status: int) -> bool: ...
+
+class stat_result(object):
+    n_fields = ...  # type: int
+    n_sequence_fields = ...  # type: int
+    n_unnamed_fields = ...  # type: int
+    st_mode = ...  # type: int
+    st_ino = ...  # type: int
+    st_dev = ...  # type: int
+    st_nlink = ...  # type: int
+    st_uid = ...  # type: int
+    st_gid = ...  # type: int
+    st_size = ...  # type: int
+    st_atime = ...  # type: int
+    st_mtime = ...  # type: int
+    st_ctime = ...  # type: int
+
+class statvfs_result(object):
+    n_fields = ...  # type: int
+    n_sequence_fields = ...  # type: int
+    n_unnamed_fields = ...  # type: int
+    f_bsize = ...  # type: int
+    f_frsize = ...  # type: int
+    f_blocks = ...  # type: int
+    f_bfree = ...  # type: int
+    f_bavail = ...  # type: int
+    f_files = ...  # type: int
+    f_ffree = ...  # type: int
+    f_favail = ...  # type: int
+    f_flag = ...  # type: int
+    f_namemax = ...  # type: int
+
+def _exit(status: int) -> None: ...
+def abort() -> None: ...
+def access(path: unicode, mode: int) -> bool: ...
+def chdir(path: unicode) -> None: ...
+def chmod(path: unicode, mode: int) -> None: ...
+def chown(path: unicode, uid: int, gid: int) -> None: ...
+def chroot(path: unicode) -> None: ...
+def close(fd: int) -> None: ...
+def closerange(fd_low: int, fd_high: int) -> None: ...
+def confstr(name: Union[str, int]) -> str: ...
+def ctermid() -> str: ...
+def dup(fd: int) -> int: ...
+def dup2(fd: int, fd2: int) -> None: ...
+def execv(path: str, args: Sequence[str], env: Mapping[str, str]) -> None: ...
+def execve(path: str, args: Sequence[str], env: Mapping[str, str]) -> None: ...
+def fchdir(fd: int) -> None: ...
+def fchmod(fd: int, mode: int) -> None: ...
+def fchown(fd: int, uid: int, gid: int) -> None: ...
+def fdatasync(fd: int) -> None: ...
+def fdopen(fd: int, mode: str = ..., bufsize: int = ...) -> IO[str]: ...
+def fork() -> int:
+    raise OSError()
+def forkpty() -> Tuple[int, int]:
+    raise OSError()
+def fpathconf(fd: int, name: str) -> None: ...
+def fstat(fd: int) -> stat_result: ...
+def fstatvfs(fd: int) -> statvfs_result: ...
+def fsync(fd: int) -> None: ...
+def ftruncate(fd: int, length: int) -> None: ...
+def getcwd() -> str: ...
+def getcwdu() -> unicode: ...
+def getegid() -> int: ...
+def geteuid() -> int: ...
+def getgid() -> int: ...
+def getgroups() -> List[int]: ...
+def getloadavg() -> Tuple[float, float, float]:
+    raise OSError()
+def getlogin() -> str: ...
+def getpgid(pid: int) -> int: ...
+def getpgrp() -> int: ...
+def getpid() -> int: ...
+def getppid() -> int: ...
+def getresgid() -> Tuple[int, int, int]: ...
+def getresuid() -> Tuple[int, int, int]: ...
+def getsid(pid: int) -> int: ...
+def getuid() -> int: ...
+def initgroups(username: str, gid: int) -> None: ...
+def isatty(fd: int) -> bool: ...
+def kill(pid: int, sig: int) -> None: ...
+def killpg(pgid: int, sig: int) -> None: ...
+def lchown(path: unicode, uid: int, gid: int) -> None: ...
+def link(source: unicode, link_name: str) -> None: ...
+_T = TypeVar("_T")
+def listdir(path: _T) -> List[_T]: ...
+def lseek(fd: int, pos: int, how: int) -> None: ...
+def lstat(path: unicode) -> stat_result: ...
+def major(device: int) -> int: ...
+def makedev(major: int, minor: int) -> int: ...
+def minor(device: int) -> int: ...
+def mkdir(path: unicode, mode: int = ...) -> None: ...
+def mkfifo(path: unicode, mode: int = ...) -> None: ...
+def mknod(filename: unicode, mode: int = ..., device: int = ...) -> None: ...
+def nice(increment: int) -> int: ...
+def open(file: unicode, flags: int, mode: int = ...) -> int: ...
+def openpty() -> Tuple[int, int]: ...
+def pathconf(path: unicode, name: str) -> str: ...
+def pipe() -> Tuple[int, int]: ...
+def popen(command: str, mode: str = ..., bufsize: int = ...) -> IO[str]: ...
+def putenv(varname: str, value: str) -> None: ...
+def read(fd: int, n: int) -> str: ...
+def readlink(path: _T) -> _T: ...
+def remove(path: unicode) -> None: ...
+def rename(src: unicode, dst: unicode) -> None: ...
+def rmdir(path: unicode) -> None: ...
+def setegid(egid: int) -> None: ...
+def seteuid(euid: int) -> None: ...
+def setgid(gid: int) -> None: ...
+def setgroups(groups: Sequence[int]) -> None: ...
+def setpgid(pid: int, pgrp: int) -> None: ...
+def setpgrp() -> None: ...
+def setregid(rgid: int, egid: int) -> None: ...
+def setresgid(rgid: int, egid: int, sgid: int) -> None: ...
+def setresuid(ruid: int, euid: int, suid: int) -> None: ...
+def setreuid(ruid: int, euid: int) -> None: ...
+def setsid() -> None: ...
+def setuid(pid: int) -> None: ...
+def stat(path: unicode) -> stat_result: ...
+def statvfs(path: unicode) -> statvfs_result: ...
+def stat_float_times(fd: int) -> None: ...
+def strerror(code: int) -> str: ...
+def symlink(source: unicode, link_name: unicode) -> None: ...
+def sysconf(name: Union[str, int]) -> int: ...
+def system(command: unicode) -> int: ...
+def tcgetpgrp(fd: int) -> int: ...
+def tcsetpgrp(fd: int, pg: int) -> None: ...
+def times() -> Tuple[float, float, float, float, float]: ...
+def tmpfile() -> IO[str]: ...
+def ttyname(fd: int) -> str: ...
+def umask(mask: int) -> int: ...
+def uname() -> Tuple[str, str, str, str, str]: ...
+def unlink(path: unicode) -> None: ...
+def unsetenv(varname: str) -> None: ...
+def urandom(n: int) -> str: ...
+def utime(path: unicode, times: Optional[Tuple[int, int]]) -> None:
+    raise OSError
+def wait() -> int: ...
+_r = Tuple[float, float, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
+def wait3(options: int) -> Tuple[int, int, _r]: ...
+def wait4(pid: int, options: int) -> Tuple[int, int, _r]: ...
+def waitpid(pid: int, options: int) -> int:
+    raise OSError()
+def write(fd: int, str: str) -> int: ...
diff --git a/typeshed/stdlib/2/posixpath.pyi b/typeshed/stdlib/2/posixpath.pyi
new file mode 100644
index 0000000..5e5439f
--- /dev/null
+++ b/typeshed/stdlib/2/posixpath.pyi
@@ -0,0 +1,50 @@
+# Stubs for posixpath (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, List
+from genericpath import *  # noqa: F403
+
+curdir = ...  # type: Any
+pardir = ...  # type: Any
+extsep = ...  # type: Any
+sep = ...  # type: Any
+pathsep = ...  # type: Any
+defpath = ...  # type: Any
+altsep = ...  # type: Any
+devnull = ...  # type: Any
+
+def normcase(s): ...
+def isabs(s): ...
+def join(a, *p): ...
+def split(p): ...
+def splitext(p): ...
+def splitdrive(p): ...
+def basename(p): ...
+def dirname(p): ...
+def islink(path): ...
+def lexists(path): ...
+def samefile(f1, f2): ...
+def sameopenfile(fp1, fp2): ...
+def samestat(s1, s2): ...
+def ismount(path): ...
+def walk(top, func, arg): ...
+def expanduser(path): ...
+def expandvars(path): ...
+def normpath(path): ...
+def abspath(path): ...
+def realpath(filename): ...
+
+supports_unicode_filenames = ...  # type: Any
+
+def relpath(path, start=...): ...
+
+# posixpath imports these from genericpath.py:
+def commonprefix(list: List[AnyStr]) -> AnyStr: ...
+def exists(path: unicode) -> bool: ...
+def getatime(path: unicode) -> float: ...
+def getmtime(path: unicode) -> float: ...
+def getctime(path: unicode) -> float: ...
+def getsize(path: unicode) -> int: ...
+def isfile(path: unicode) -> bool: ...
+def isdir(path: unicode) -> bool: ...
diff --git a/typeshed/stdlib/2/pprint.pyi b/typeshed/stdlib/2/pprint.pyi
new file mode 100644
index 0000000..5275d03
--- /dev/null
+++ b/typeshed/stdlib/2/pprint.pyi
@@ -0,0 +1,24 @@
+# Stubs for pprint (Python 2)
+#
+# NOTE: Based on a dynamically typed automatically generated by stubgen.
+
+from typing import IO, Any
+
+def pprint(object: Any, stream: IO[str] = ..., indent: int = ..., width: int = ...,
+           depth: int = ...) -> None: ...
+def pformat(object: Any, indent: int =..., width: int =..., depth: int =...) -> str: ...
+def saferepr(object): ...
+def isreadable(object): ...
+def isrecursive(object): ...
+
+class PrettyPrinter:
+    def __init__(self,
+                 indent: int = ...,
+                 width: int = ...,
+                 depth: int = ...,
+                 stream: IO[Any] = ...) -> None: ...
+    def pprint(self, object: Any) -> str: ...
+    def pformat(self, object): ...
+    def isrecursive(self, object): ...
+    def isreadable(self, object): ...
+    def format(self, object, context, maxlevels, level): ...
diff --git a/typeshed/stdlib/2/pwd.pyi b/typeshed/stdlib/2/pwd.pyi
new file mode 100644
index 0000000..ff6c6a4
--- /dev/null
+++ b/typeshed/stdlib/2/pwd.pyi
@@ -0,0 +1,17 @@
+from typing import List
+
+class struct_passwd(tuple):
+    n_fields = ...  # type: int
+    n_sequence_fields = ...  # type: int
+    n_unnamed_fields = ...  # type: int
+    pw_dir = ...  # type: str
+    pw_name = ...  # type: str
+    pw_passwd = ...  # type: str
+    pw_shell = ...  # type: str
+    pw_gecos = ...  # type: str
+    pw_gid = ...  # type: int
+    pw_uid = ...  # type: int
+
+def getpwall() -> List[struct_passwd]: ...
+def getpwnam(name: str) -> struct_passwd: ...
+def getpwuid(uid: int) -> struct_passwd: ...
diff --git a/typeshed/stdlib/2/quopri.pyi b/typeshed/stdlib/2/quopri.pyi
new file mode 100644
index 0000000..93ac393
--- /dev/null
+++ b/typeshed/stdlib/2/quopri.pyi
@@ -0,0 +1,8 @@
+# Stubs for quopri (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def encode(input, output, quotetabs, header=0): ...
+def encodestring(s, quotetabs=0, header=0): ...
+def decode(input, output, header=0): ...
+def decodestring(s, header=0): ...
diff --git a/typeshed/stdlib/2/random.pyi b/typeshed/stdlib/2/random.pyi
new file mode 100644
index 0000000..9aa2ddb
--- /dev/null
+++ b/typeshed/stdlib/2/random.pyi
@@ -0,0 +1,76 @@
+# Stubs for random
+# Ron Murawski <ron at horizonchess.com>
+# Updated by Jukka Lehtosalo
+
+# based on https://docs.python.org/2/library/random.html
+
+# ----- random classes -----
+
+import _random
+from typing import (
+    Any, TypeVar, Sequence, List, Callable, AbstractSet, Union,
+    overload
+)
+
+_T = TypeVar('_T')
+
+class Random(_random.Random):
+    def __init__(self, x: object = ...) -> None: ...
+    def seed(self, x: object = ...) -> None: ...
+    def getstate(self) -> _random._State: ...
+    def setstate(self, state: _random._State) -> None: ...
+    def jumpahead(self, n: int) -> None: ...
+    def getrandbits(self, k: int) -> int: ...
+    @overload
+    def randrange(self, stop: int) -> int: ...
+    @overload
+    def randrange(self, start: int, stop: int, step: int = ...) -> int: ...
+    def randint(self, a: int, b: int) -> int: ...
+    def choice(self, seq: Sequence[_T]) -> _T: ...
+    def shuffle(self, x: List[Any], random: Callable[[], None] = ...) -> None: ...
+    def sample(self, population: Union[Sequence[_T], AbstractSet[_T]], k: int) -> List[_T]: ...
+    def random(self) -> float: ...
+    def uniform(self, a: float, b: float) -> float: ...
+    def triangular(self, low: float = ..., high: float = ...,
+                     mode: float = ...) -> float: ...
+    def betavariate(self, alpha: float, beta: float) -> float: ...
+    def expovariate(self, lambd: float) -> float: ...
+    def gammavariate(self, alpha: float, beta: float) -> float: ...
+    def gauss(self, mu: float, sigma: float) -> float: ...
+    def lognormvariate(self, mu: float, sigma: float) -> float: ...
+    def normalvariate(self, mu: float, sigma: float) -> float: ...
+    def vonmisesvariate(self, mu: float, kappa: float) -> float: ...
+    def paretovariate(self, alpha: float) -> float: ...
+    def weibullvariate(self, alpha: float, beta: float) -> float: ...
+
+# SystemRandom is not implemented for all OS's; good on Windows & Linux
+class SystemRandom(Random):
+    ...
+
+# ----- random function stubs -----
+def seed(x: object = ...) -> None: ...
+def getstate() -> object: ...
+def setstate(state: object) -> None: ...
+def jumpahead(n: int) -> None: ...
+def getrandbits(k: int) -> int: ...
+ at overload
+def randrange(stop: int) -> int: ...
+ at overload
+def randrange(start: int, stop: int, step: int = ...) -> int: ...
+def randint(a: int, b: int) -> int: ...
+def choice(seq: Sequence[_T]) -> _T: ...
+def shuffle(x: List[Any], random: Callable[[], float] = ...) -> None: ...
+def sample(population: Union[Sequence[_T], AbstractSet[_T]], k: int) -> List[_T]: ...
+def random() -> float: ...
+def uniform(a: float, b: float) -> float: ...
+def triangular(low: float = ..., high: float = ...,
+               mode: float = ...) -> float: ...
+def betavariate(alpha: float, beta: float) -> float: ...
+def expovariate(lambd: float) -> float: ...
+def gammavariate(alpha: float, beta: float) -> float: ...
+def gauss(mu: float, sigma: float) -> float: ...
+def lognormvariate(mu: float, sigma: float) -> float: ...
+def normalvariate(mu: float, sigma: float) -> float: ...
+def vonmisesvariate(mu: float, kappa: float) -> float: ...
+def paretovariate(alpha: float) -> float: ...
+def weibullvariate(alpha: float, beta: float) -> float: ...
diff --git a/typeshed/stdlib/2/re.pyi b/typeshed/stdlib/2/re.pyi
new file mode 100644
index 0000000..8df3a44
--- /dev/null
+++ b/typeshed/stdlib/2/re.pyi
@@ -0,0 +1,99 @@
+# Stubs for re
+# Ron Murawski <ron at horizonchess.com>
+# 'bytes' support added by Jukka Lehtosalo
+
+# based on: http: //docs.python.org/2.7/library/re.html
+
+from typing import (
+    List, Iterator, overload, Callable, Tuple, Sequence, Dict,
+    Generic, AnyStr, Match, Pattern, Any, Union
+)
+
+# ----- re variables and constants -----
+DEBUG = 0
+I = 0
+IGNORECASE = 0
+L = 0
+LOCALE = 0
+M = 0
+MULTILINE = 0
+S = 0
+DOTALL = 0
+X = 0
+VERBOSE = 0
+U = 0
+UNICODE = 0
+T = 0
+TEMPLATE = 0
+
+class error(Exception): ...
+
+ at overload
+def compile(pattern: AnyStr, flags: int = ...) -> Pattern[AnyStr]: ...
+ at overload
+def compile(pattern: Pattern[AnyStr], flags: int = ...) -> Pattern[AnyStr]: ...
+
+ at overload
+def search(pattern: Union[str, unicode], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+ at overload
+def search(pattern: Union[Pattern[str], Pattern[unicode]], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+
+ at overload
+def match(pattern: Union[str, unicode], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+ at overload
+def match(pattern: Union[Pattern[str], Pattern[unicode]], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+
+ at overload
+def split(pattern: Union[str, unicode], string: AnyStr,
+          maxsplit: int = ..., flags: int = ...) -> List[AnyStr]: ...
+ at overload
+def split(pattern: Union[Pattern[str], Pattern[unicode]], string: AnyStr,
+          maxsplit: int = ..., flags: int = ...) -> List[AnyStr]: ...
+
+ at overload
+def findall(pattern: Union[str, unicode], string: AnyStr, flags: int = ...) -> List[Any]: ...
+ at overload
+def findall(pattern: Union[Pattern[str], Pattern[unicode]], string: AnyStr, flags: int = ...) -> List[Any]: ...
+
+# Return an iterator yielding match objects over all non-overlapping matches
+# for the RE pattern in string. The string is scanned left-to-right, and
+# matches are returned in the order found. Empty matches are included in the
+# result unless they touch the beginning of another match.
+ at overload
+def finditer(pattern: Union[str, unicode], string: AnyStr,
+             flags: int = ...) -> Iterator[Match[AnyStr]]: ...
+ at overload
+def finditer(pattern: Union[Pattern[str], Pattern[unicode]], string: AnyStr,
+             flags: int = ...) -> Iterator[Match[AnyStr]]: ...
+
+ at overload
+def sub(pattern: Union[str, unicode], repl: AnyStr, string: AnyStr, count: int = ...,
+        flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: Union[str, unicode], repl: Callable[[Match[AnyStr]], AnyStr],
+        string: AnyStr, count: int = ..., flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: Union[Pattern[str], Pattern[unicode]], repl: AnyStr, string: AnyStr, count: int = ...,
+        flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: Union[Pattern[str], Pattern[unicode]], repl: Callable[[Match[AnyStr]], AnyStr],
+        string: AnyStr, count: int = ..., flags: int = ...) -> AnyStr: ...
+
+ at overload
+def subn(pattern: Union[str, unicode], repl: AnyStr, string: AnyStr, count: int = ...,
+         flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: Union[str, unicode], repl: Callable[[Match[AnyStr]], AnyStr],
+         string: AnyStr, count: int = ...,
+         flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: Union[Pattern[str], Pattern[unicode]], repl: AnyStr, string: AnyStr, count: int = ...,
+         flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: Union[Pattern[str], Pattern[unicode]], repl: Callable[[Match[AnyStr]], AnyStr],
+         string: AnyStr, count: int = ...,
+         flags: int = ...) -> Tuple[AnyStr, int]: ...
+
+def escape(string: AnyStr) -> AnyStr: ...
+
+def purge() -> None: ...
diff --git a/typeshed/stdlib/2/resource.pyi b/typeshed/stdlib/2/resource.pyi
new file mode 100644
index 0000000..92654a9
--- /dev/null
+++ b/typeshed/stdlib/2/resource.pyi
@@ -0,0 +1,33 @@
+from typing import Tuple, NamedTuple
+
+class error(Exception): ...
+
+RLIM_INFINITY = ...  # type: int
+def getrlimit(resource: int) -> Tuple[int, int]: ...
+def setrlimit(resource: int, limits: Tuple[int, int]) -> None: ...
+
+RLIMIT_CORE = ...  # type: int
+RLIMIT_CPU = ...  # type: int
+RLIMIT_FSIZE = ...  # type: int
+RLIMIT_DATA = ...  # type: int
+RLIMIT_STACK = ...  # type: int
+RLIMIT_RSS = ...  # type: int
+RLIMIT_NPROC = ...  # type: int
+RLIMIT_NOFILE = ...  # type: int
+RLIMIT_OFILE = ...  # type: int
+RLIMIT_MEMLOCK = ...  # type: int
+RLIMIT_VMEM = ...  # type: int
+RLIMIT_AS = ...  # type: int
+
+_RUsage = NamedTuple('_RUsage', [('ru_utime', float), ('ru_stime', float), ('ru_maxrss', int),
+                                 ('ru_ixrss', int), ('ru_idrss', int), ('ru_isrss', int),
+                                 ('ru_minflt', int), ('ru_majflt', int), ('ru_nswap', int),
+                                 ('ru_inblock', int), ('ru_oublock', int), ('ru_msgsnd', int),
+                                 ('ru_msgrcv', int), ('ru_nsignals', int), ('ru_nvcsw', int),
+                                 ('ru_nivcsw', int)])
+def getrusage(who: int) -> _RUsage: ...
+def getpagesize() -> int: ...
+
+RUSAGE_SELF = ...  # type: int
+RUSAGE_CHILDREN = ...  # type: int
+RUSAGE_BOTH = ...  # type: int
diff --git a/typeshed/stdlib/2/rfc822.pyi b/typeshed/stdlib/2/rfc822.pyi
new file mode 100644
index 0000000..28ba759
--- /dev/null
+++ b/typeshed/stdlib/2/rfc822.pyi
@@ -0,0 +1,79 @@
+# Stubs for rfc822 (Python 2)
+#
+# Based on stub generated by stubgen.
+
+from typing import Any
+
+class Message:
+    fp = ...  # type: Any
+    seekable = ...  # type: Any
+    startofheaders = ...  # type: Any
+    startofbody = ...  # type: Any
+    def __init__(self, fp, seekable=1): ...
+    def rewindbody(self): ...
+    dict = ...  # type: Any
+    unixfrom = ...  # type: Any
+    headers = ...  # type: Any
+    status = ...  # type: Any
+    def readheaders(self): ...
+    def isheader(self, line): ...
+    def islast(self, line): ...
+    def iscomment(self, line): ...
+    def getallmatchingheaders(self, name): ...
+    def getfirstmatchingheader(self, name): ...
+    def getrawheader(self, name): ...
+    def getheader(self, name, default=None): ...
+    get = ...  # type: Any
+    def getheaders(self, name): ...
+    def getaddr(self, name): ...
+    def getaddrlist(self, name): ...
+    def getdate(self, name): ...
+    def getdate_tz(self, name): ...
+    def __len__(self): ...
+    def __getitem__(self, name): ...
+    def __setitem__(self, name, value): ...
+    def __delitem__(self, name): ...
+    def setdefault(self, name, default=...): ...
+    def has_key(self, name): ...
+    def __contains__(self, name): ...
+    def __iter__(self): ...
+    def keys(self): ...
+    def values(self): ...
+    def items(self): ...
+
+class AddrlistClass:
+    specials = ...  # type: Any
+    pos = ...  # type: Any
+    LWS = ...  # type: Any
+    CR = ...  # type: Any
+    atomends = ...  # type: Any
+    phraseends = ...  # type: Any
+    field = ...  # type: Any
+    commentlist = ...  # type: Any
+    def __init__(self, field): ...
+    def gotonext(self): ...
+    def getaddrlist(self): ...
+    def getaddress(self): ...
+    def getrouteaddr(self): ...
+    def getaddrspec(self): ...
+    def getdomain(self): ...
+    def getdelimited(self, beginchar, endchars, allowcomments=1): ...
+    def getquote(self): ...
+    def getcomment(self): ...
+    def getdomainliteral(self): ...
+    def getatom(self, atomends=None): ...
+    def getphraselist(self): ...
+
+class AddressList(AddrlistClass):
+    addresslist = ...  # type: Any
+    def __init__(self, field): ...
+    def __len__(self): ...
+    def __add__(self, other): ...
+    def __iadd__(self, other): ...
+    def __sub__(self, other): ...
+    def __isub__(self, other): ...
+    def __getitem__(self, index): ...
+
+def parsedate_tz(data): ...
+def parsedate(data): ...
+def mktime_tz(data): ...
diff --git a/typeshed/stdlib/2/robotparser.pyi b/typeshed/stdlib/2/robotparser.pyi
new file mode 100644
index 0000000..403039a
--- /dev/null
+++ b/typeshed/stdlib/2/robotparser.pyi
@@ -0,0 +1,7 @@
+class RobotFileParser:
+    def set_url(self, url: str): ...
+    def read(self): ...
+    def parse(self, lines: str): ...
+    def can_fetch(self, user_agent: str, url: str): ...
+    def mtime(self): ...
+    def modified(self): ...
diff --git a/typeshed/stdlib/2/runpy.pyi b/typeshed/stdlib/2/runpy.pyi
new file mode 100644
index 0000000..0d24e7e
--- /dev/null
+++ b/typeshed/stdlib/2/runpy.pyi
@@ -0,0 +1,21 @@
+# Stubs for runpy (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _TempModule:
+    mod_name = ...  # type: Any
+    module = ...  # type: Any
+    def __init__(self, mod_name): ...
+    def __enter__(self): ...
+    def __exit__(self, *args): ...
+
+class _ModifiedArgv0:
+    value = ...  # type: Any
+    def __init__(self, value): ...
+    def __enter__(self): ...
+    def __exit__(self, *args): ...
+
+def run_module(mod_name, init_globals=None, run_name=None, alter_sys=False): ...
+def run_path(path_name, init_globals=None, run_name=None): ...
diff --git a/typeshed/stdlib/2/select.pyi b/typeshed/stdlib/2/select.pyi
new file mode 100644
index 0000000..a88311e
--- /dev/null
+++ b/typeshed/stdlib/2/select.pyi
@@ -0,0 +1,100 @@
+"""Stubs for the 'select' module."""
+
+from typing import Any, Optional, Tuple, Iterable, List
+
+EPOLLERR = ...  # type: int
+EPOLLET = ...  # type: int
+EPOLLHUP = ...  # type: int
+EPOLLIN = ...  # type: int
+EPOLLMSG = ...  # type: int
+EPOLLONESHOT = ...  # type: int
+EPOLLOUT = ...  # type: int
+EPOLLPRI = ...  # type: int
+EPOLLRDBAND = ...  # type: int
+EPOLLRDNORM = ...  # type: int
+EPOLLWRBAND = ...  # type: int
+EPOLLWRNORM = ...  # type: int
+EPOLL_RDHUP = ...  # type: int
+KQ_EV_ADD = ...  # type: int
+KQ_EV_CLEAR = ...  # type: int
+KQ_EV_DELETE = ...  # type: int
+KQ_EV_DISABLE = ...  # type: int
+KQ_EV_ENABLE = ...  # type: int
+KQ_EV_EOF = ...  # type: int
+KQ_EV_ERROR = ...  # type: int
+KQ_EV_FLAG1 = ...  # type: int
+KQ_EV_ONESHOT = ...  # type: int
+KQ_EV_SYSFLAGS = ...  # type: int
+KQ_FILTER_AIO = ...  # type: int
+KQ_FILTER_NETDEV = ...  # type: int
+KQ_FILTER_PROC = ...  # type: int
+KQ_FILTER_READ = ...  # type: int
+KQ_FILTER_SIGNAL = ...  # type: int
+KQ_FILTER_TIMER = ...  # type: int
+KQ_FILTER_VNODE = ...  # type: int
+KQ_FILTER_WRITE = ...  # type: int
+KQ_NOTE_ATTRIB = ...  # type: int
+KQ_NOTE_CHILD = ...  # type: int
+KQ_NOTE_DELETE = ...  # type: int
+KQ_NOTE_EXEC = ...  # type: int
+KQ_NOTE_EXIT = ...  # type: int
+KQ_NOTE_EXTEND = ...  # type: int
+KQ_NOTE_FORK = ...  # type: int
+KQ_NOTE_LINK = ...  # type: int
+KQ_NOTE_LINKDOWN = ...  # type: int
+KQ_NOTE_LINKINV = ...  # type: int
+KQ_NOTE_LINKUP = ...  # type: int
+KQ_NOTE_LOWAT = ...  # type: int
+KQ_NOTE_PCTRLMASK = ...  # type: int
+KQ_NOTE_PDATAMASK = ...  # type: int
+KQ_NOTE_RENAME = ...  # type: int
+KQ_NOTE_REVOKE = ...  # type: int
+KQ_NOTE_TRACK = ...  # type: int
+KQ_NOTE_TRACKERR = ...  # type: int
+KQ_NOTE_WRITE = ...  # type: int
+PIPE_BUF = ...  # type: int
+POLLERR = ...  # type: int
+POLLHUP = ...  # type: int
+POLLIN = ...  # type: int
+POLLMSG = ...  # type: int
+POLLNVAL = ...  # type: int
+POLLOUT = ...  # type: int
+POLLPRI = ...  # type: int
+POLLRDBAND = ...  # type: int
+POLLRDNORM = ...  # type: int
+POLLWRBAND = ...  # type: int
+POLLWRNORM = ...  # type: int
+
+def poll() -> epoll: ...
+def select(rlist, wlist, xlist, timeout: float = None) -> Tuple[List, List, List]: ...
+
+class error(Exception): ...
+
+class kevent(object):
+    data = ...  # type: Any
+    fflags = ...  # type: int
+    filter = ...  # type: int
+    flags = ...  # type: int
+    ident = ...  # type: Any
+    udata = ...  # type: Any
+    def __init__(self, *args, **kwargs) -> None: ...
+
+class kqueue(object):
+    closed = ...  # type: bool
+    def __init__(self) -> None: ...
+    def close(self) -> None: ...
+    def control(self, changelist: Optional[Iterable[kevent]], max_events: int, timeout: int = ...) -> List[kevent]: ...
+    def fileno(self) -> int: ...
+    @classmethod
+    def fromfd(cls, fd: int) -> kqueue: ...
+
+class epoll(object):
+    def __init__(self, sizehint: int = ...) -> None: ...
+    def close(self) -> None: ...
+    def fileno(self) -> int: ...
+    def register(self, fd: int, eventmask: int = ...) -> None: ...
+    def modify(self, fd: int, eventmask: int) -> None: ...
+    def unregister(self, fd: int) -> None: ...
+    def poll(self, timeout: float = ..., maxevents: int = ...) -> Any: ...
+    @classmethod
+    def fromfd(cls, fd: int) -> epoll: ...
diff --git a/typeshed/stdlib/2/sha.pyi b/typeshed/stdlib/2/sha.pyi
new file mode 100644
index 0000000..f1606fa
--- /dev/null
+++ b/typeshed/stdlib/2/sha.pyi
@@ -0,0 +1,11 @@
+# Stubs for Python 2.7 sha stdlib module
+
+class sha(object):
+    def update(self, arg: str) -> None: ...
+    def digest(self) -> str: ...
+    def hexdigest(self) -> str: ...
+    def copy(self) -> sha: ...
+
+def new(string: str = ...) -> sha: ...
+blocksize = 0
+digest_size = 0
diff --git a/typeshed/stdlib/2/shelve.pyi b/typeshed/stdlib/2/shelve.pyi
new file mode 100644
index 0000000..f5a92b9
--- /dev/null
+++ b/typeshed/stdlib/2/shelve.pyi
@@ -0,0 +1,33 @@
+from typing import Any, Dict, Iterator, List, Optional, Tuple
+import collections
+
+
+class Shelf(collections.MutableMapping):
+    def __init__(self, dict: Dict[Any, Any], protocol: Optional[int] = None, writeback: bool = ..., keyencoding: str = 'utf-8') -> None: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def keys(self) -> List[Any]: ...
+    def __len__(self) -> int: ...
+    def has_key(self, key: Any) -> bool: ...
+    def __contains__(self, key: Any) -> bool: ...
+    def get(self, key: Any, default: Any = None) -> Any: ...
+    def __getitem__(self, key: Any) -> Any: ...
+    def __setitem__(self, key: Any, value: Any) -> None: ...
+    def __delitem__(self, key: Any) -> None: ...
+    def __enter__(self) -> Shelf: ...
+    def __exit__(self, type: Any, value: Any, traceback: Any) -> None: ...
+    def close(self) -> None: ...
+    def __del__(self) -> None: ...
+    def sync(self) -> None: ...
+
+class BsdDbShelf(Shelf):
+    def __init__(self, dict: Dict[Any, Any], protocol: Optional[int] = None, writeback: bool = ..., keyencoding: str = 'utf-8') -> None: ...
+    def set_location(self, key: Any) -> Tuple[str, Any]: ...
+    def next(self) -> Tuple[str, Any]: ...
+    def previous(self) -> Tuple[str, Any]: ...
+    def first(self) -> Tuple[str, Any]: ...
+    def last(self) -> Tuple[str, Any]: ...
+
+class DbfilenameShelf(Shelf):
+    def __init__(self, filename: str, flag: str = 'c', protocol: Optional[int] = None, writeback: bool = ...) -> None: ...
+
+def open(filename: str, flag: str = 'c', protocol: Optional[int] = None, writeback: bool = ...) -> DbfilenameShelf: ...
diff --git a/typeshed/stdlib/2/shlex.pyi b/typeshed/stdlib/2/shlex.pyi
new file mode 100644
index 0000000..4b80fb6
--- /dev/null
+++ b/typeshed/stdlib/2/shlex.pyi
@@ -0,0 +1,27 @@
+from typing import Optional, List, Any, IO
+
+def split(s: Optional[str], comments: bool = ..., posix: bool = ...) -> List[str]: ...
+
+class shlex:
+    def __init__(self, instream: IO[Any] = ..., infile: IO[Any] = ..., posix: bool = ...) -> None: ...
+    def get_token(self) -> Optional[str]: ...
+    def push_token(self, _str: str) -> None: ...
+    def read_token(self) -> str: ...
+    def sourcehook(self, filename: str) -> None: ...
+    def push_source(self, stream: IO[Any], filename: str = ...) -> None: ...
+    def pop_source(self) -> IO[Any]: ...
+    def error_leader(self, file: str = ..., line: int = ...) -> str: ...
+
+    commenters = ...  # type: str
+    wordchars = ...  # type: str
+    whitespace = ...  # type: str
+    escape = ...  # type: str
+    quotes = ...  # type: str
+    escapedquotes = ...  # type: str
+    whitespace_split = ...  # type: bool
+    infile = ...  # type: IO[Any]
+    source = ...  # type: Optional[str]
+    debug = ...  # type: int
+    lineno = ...  # type: int
+    token = ...  # type: Any
+    eof = ...  # type: Optional[str]
diff --git a/typeshed/stdlib/2/shutil.pyi b/typeshed/stdlib/2/shutil.pyi
new file mode 100644
index 0000000..c39f257
--- /dev/null
+++ b/typeshed/stdlib/2/shutil.pyi
@@ -0,0 +1,30 @@
+# Stubs for shutil (Python 2)
+#
+# NOTE: Based on a dynamically typed stub automatically generated by stubgen.
+
+from typing import List, Iterable, Callable, IO, AnyStr, Any, Optional, Tuple, Sequence
+
+class Error(EnvironmentError): ...
+class SpecialFileError(EnvironmentError): ...
+class ExecError(EnvironmentError): ...
+
+def copyfileobj(fsrc: IO[AnyStr], fdst: IO[AnyStr], length: int = ...) -> None: ...
+def copyfile(src: unicode, dst: unicode) -> None: ...
+def copymode(src: unicode, dst: unicode) -> None: ...
+def copystat(src: unicode, dst: unicode) -> None: ...
+def copy(src: unicode, dst: unicode) -> None: ...
+def copy2(src: unicode, dst: unicode) -> None: ...
+def ignore_patterns(*patterns: AnyStr) -> Callable[[AnyStr, List[AnyStr]], Iterable[AnyStr]]: ...
+def copytree(src: AnyStr, dst: AnyStr, symlinks: bool = ...,
+             ignore: Optional[Callable[[AnyStr, List[AnyStr]], Iterable[AnyStr]]] = ...) -> None: ...
+def rmtree(path: AnyStr, ignore_errors: bool = ...,
+           onerror: Callable[[Any, AnyStr, Any], None] = ...) -> None: ...
+def move(src: unicode, dst: unicode) -> None: ...
+def get_archive_formats() -> List[Tuple[str, str]]: ...
+def register_archive_format(name: str, function: Callable[..., Any],
+                            extra_args: Sequence[Tuple[str, Any]] = ...,
+                            description: str = ...) -> None: ...
+def unregister_archive_format(name: str) -> None: ...
+def make_archive(base_name: AnyStr, format: str, root_dir: unicode = ...,
+                 base_dir: unicode = ..., verbose: int = ..., dry_run: int = ...,
+                 owner: str = ..., group: str = ..., logger: Any = ...) -> AnyStr: ...
diff --git a/typeshed/stdlib/2/signal.pyi b/typeshed/stdlib/2/signal.pyi
new file mode 100644
index 0000000..1c9481b
--- /dev/null
+++ b/typeshed/stdlib/2/signal.pyi
@@ -0,0 +1,62 @@
+from typing import Callable, Any, Tuple, Union
+from types import FrameType
+
+SIG_DFL = ...  # type: int
+SIG_IGN = ...  # type: int
+ITIMER_REAL = ...  # type: int
+ITIMER_VIRTUAL = ...  # type: int
+ITIMER_PROF = ...  # type: int
+
+SIGABRT = ...  # type: int
+SIGALRM = ...  # type: int
+SIGBUS = ...  # type: int
+SIGCHLD = ...  # type: int
+SIGCLD = ...  # type: int
+SIGCONT = ...  # type: int
+SIGFPE = ...  # type: int
+SIGHUP = ...  # type: int
+SIGILL = ...  # type: int
+SIGINT = ...  # type: int
+SIGIO = ...  # type: int
+SIGIOT = ...  # type: int
+SIGKILL = ...  # type: int
+SIGPIPE = ...  # type: int
+SIGPOLL = ...  # type: int
+SIGPROF = ...  # type: int
+SIGPWR = ...  # type: int
+SIGQUIT = ...  # type: int
+SIGRTMAX = ...  # type: int
+SIGRTMIN = ...  # type: int
+SIGSEGV = ...  # type: int
+SIGSTOP = ...  # type: int
+SIGSYS = ...  # type: int
+SIGTERM = ...  # type: int
+SIGTRAP = ...  # type: int
+SIGTSTP = ...  # type: int
+SIGTTIN = ...  # type: int
+SIGTTOU = ...  # type: int
+SIGURG = ...  # type: int
+SIGUSR1 = ...  # type: int
+SIGUSR2 = ...  # type: int
+SIGVTALRM = ...  # type: int
+SIGWINCH = ...  # type: int
+SIGXCPU = ...  # type: int
+SIGXFSZ = ...  # type: int
+NSIG = ...  # type: int
+
+class ItimerError(IOError): ...
+
+_HANDLER = Union[Callable[[int, FrameType], None], int, None]
+
+def alarm(time: int) -> int: ...
+def getsignal(signalnum: int) -> _HANDLER: ...
+def pause() -> None: ...
+def setitimer(which: int, seconds: float, interval: float = ...) -> Tuple[float, float]: ...
+def getitimer(which: int) -> Tuple[float, float]: ...
+def set_wakeup_fd(fd: int) -> int: ...
+def siginterrupt(signalnum: int, flag: bool) -> None:
+    raise RuntimeError()
+def signal(signalnum: int, handler: _HANDLER) -> _HANDLER:
+    raise RuntimeError()
+def default_int_handler(signum: int, frame: FrameType) -> None:
+    raise KeyboardInterrupt()
diff --git a/typeshed/stdlib/2/smtplib.pyi b/typeshed/stdlib/2/smtplib.pyi
new file mode 100644
index 0000000..cb5f893
--- /dev/null
+++ b/typeshed/stdlib/2/smtplib.pyi
@@ -0,0 +1,90 @@
+# Stubs for smtplib (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class SMTPException(Exception): ...
+class SMTPServerDisconnected(SMTPException): ...
+
+class SMTPResponseException(SMTPException):
+    smtp_code = ...  # type: Any
+    smtp_error = ...  # type: Any
+    args = ...  # type: Any
+    def __init__(self, code, msg) -> None: ...
+
+class SMTPSenderRefused(SMTPResponseException):
+    smtp_code = ...  # type: Any
+    smtp_error = ...  # type: Any
+    sender = ...  # type: Any
+    args = ...  # type: Any
+    def __init__(self, code, msg, sender) -> None: ...
+
+class SMTPRecipientsRefused(SMTPException):
+    recipients = ...  # type: Any
+    args = ...  # type: Any
+    def __init__(self, recipients) -> None: ...
+
+class SMTPDataError(SMTPResponseException): ...
+class SMTPConnectError(SMTPResponseException): ...
+class SMTPHeloError(SMTPResponseException): ...
+class SMTPAuthenticationError(SMTPResponseException): ...
+
+def quoteaddr(addr): ...
+def quotedata(data): ...
+
+class SSLFakeFile:
+    sslobj = ...  # type: Any
+    def __init__(self, sslobj) -> None: ...
+    def readline(self, size=...): ...
+    def close(self): ...
+
+class SMTP:
+    debuglevel = ...  # type: Any
+    file = ...  # type: Any
+    helo_resp = ...  # type: Any
+    ehlo_msg = ...  # type: Any
+    ehlo_resp = ...  # type: Any
+    does_esmtp = ...  # type: Any
+    default_port = ...  # type: Any
+    timeout = ...  # type: Any
+    esmtp_features = ...  # type: Any
+    local_hostname = ...  # type: Any
+    def __init__(self, host: str = ..., port: int = ..., local_hostname=..., timeout=...) -> None: ...
+    def set_debuglevel(self, debuglevel): ...
+    sock = ...  # type: Any
+    def connect(self, host=..., port=...): ...
+    def send(self, str): ...
+    def putcmd(self, cmd, args=...): ...
+    def getreply(self): ...
+    def docmd(self, cmd, args=...): ...
+    def helo(self, name=...): ...
+    def ehlo(self, name=...): ...
+    def has_extn(self, opt): ...
+    def help(self, args=...): ...
+    def rset(self): ...
+    def noop(self): ...
+    def mail(self, sender, options=...): ...
+    def rcpt(self, recip, options=...): ...
+    def data(self, msg): ...
+    def verify(self, address): ...
+    vrfy = ...  # type: Any
+    def expn(self, address): ...
+    def ehlo_or_helo_if_needed(self): ...
+    def login(self, user, password): ...
+    def starttls(self, keyfile=..., certfile=...): ...
+    def sendmail(self, from_addr, to_addrs, msg, mail_options=..., rcpt_options=...): ...
+    def close(self): ...
+    def quit(self): ...
+
+class SMTP_SSL(SMTP):
+    default_port = ...  # type: Any
+    keyfile = ...  # type: Any
+    certfile = ...  # type: Any
+    def __init__(self, host=..., port=..., local_hostname=..., keyfile=..., certfile=..., timeout=...) -> None: ...
+
+class LMTP(SMTP):
+    ehlo_msg = ...  # type: Any
+    def __init__(self, host=..., port=..., local_hostname=...) -> None: ...
+    sock = ...  # type: Any
+    def connect(self, host=..., port=...): ...
diff --git a/typeshed/stdlib/2/socket.pyi b/typeshed/stdlib/2/socket.pyi
new file mode 100644
index 0000000..cbc3573
--- /dev/null
+++ b/typeshed/stdlib/2/socket.pyi
@@ -0,0 +1,362 @@
+# Stubs for socket
+# Ron Murawski <ron at horizonchess.com>
+
+# based on: http://docs.python.org/3.2/library/socket.html
+# see: http://hg.python.org/cpython/file/3d0686d90f55/Lib/socket.py
+# see: http://nullege.com/codes/search/socket
+# adapted for Python 2.7 by Michal Pokorny
+
+from typing import Any, Tuple, List, Optional, Union, overload
+
+# ----- variables and constants -----
+
+AF_UNIX = 0
+AF_INET = 0
+AF_INET6 = 0
+SOCK_STREAM = 0
+SOCK_DGRAM = 0
+SOCK_RAW = 0
+SOCK_RDM = 0
+SOCK_SEQPACKET = 0
+SOCK_CLOEXEC = 0
+SOCK_NONBLOCK = 0
+SOMAXCONN = 0
+has_ipv6 = False
+_GLOBAL_DEFAULT_TIMEOUT = ...  # type: Any
+SocketType = ...  # type: Any
+SocketIO = ...  # type: Any
+
+
+# the following constants are included with Python 3.2.3 (Ubuntu)
+# some of the constants may be Linux-only
+# all Windows/Mac-specific constants are absent
+AF_APPLETALK = 0
+AF_ASH = 0
+AF_ATMPVC = 0
+AF_ATMSVC = 0
+AF_AX25 = 0
+AF_BLUETOOTH = 0
+AF_BRIDGE = 0
+AF_DECnet = 0
+AF_ECONET = 0
+AF_IPX = 0
+AF_IRDA = 0
+AF_KEY = 0
+AF_LLC = 0
+AF_NETBEUI = 0
+AF_NETLINK = 0
+AF_NETROM = 0
+AF_PACKET = 0
+AF_PPPOX = 0
+AF_ROSE = 0
+AF_ROUTE = 0
+AF_SECURITY = 0
+AF_SNA = 0
+AF_TIPC = 0
+AF_UNSPEC = 0
+AF_WANPIPE = 0
+AF_X25 = 0
+AI_ADDRCONFIG = 0
+AI_ALL = 0
+AI_CANONNAME = 0
+AI_NUMERICHOST = 0
+AI_NUMERICSERV = 0
+AI_PASSIVE = 0
+AI_V4MAPPED = 0
+BDADDR_ANY = 0
+BDADDR_LOCAL = 0
+BTPROTO_HCI = 0
+BTPROTO_L2CAP = 0
+BTPROTO_RFCOMM = 0
+BTPROTO_SCO = 0
+CAPI = 0
+EAGAIN = 0
+EAI_ADDRFAMILY = 0
+EAI_AGAIN = 0
+EAI_BADFLAGS = 0
+EAI_FAIL = 0
+EAI_FAMILY = 0
+EAI_MEMORY = 0
+EAI_NODATA = 0
+EAI_NONAME = 0
+EAI_OVERFLOW = 0
+EAI_SERVICE = 0
+EAI_SOCKTYPE = 0
+EAI_SYSTEM = 0
+EBADF = 0
+EINTR = 0
+EWOULDBLOCK = 0
+HCI_DATA_DIR = 0
+HCI_FILTER = 0
+HCI_TIME_STAMP = 0
+INADDR_ALLHOSTS_GROUP = 0
+INADDR_ANY = 0
+INADDR_BROADCAST = 0
+INADDR_LOOPBACK = 0
+INADDR_MAX_LOCAL_GROUP = 0
+INADDR_NONE = 0
+INADDR_UNSPEC_GROUP = 0
+IPPORT_RESERVED = 0
+IPPORT_USERRESERVED = 0
+IPPROTO_AH = 0
+IPPROTO_DSTOPTS = 0
+IPPROTO_EGP = 0
+IPPROTO_ESP = 0
+IPPROTO_FRAGMENT = 0
+IPPROTO_GRE = 0
+IPPROTO_HOPOPTS = 0
+IPPROTO_ICMP = 0
+IPPROTO_ICMPV6 = 0
+IPPROTO_IDP = 0
+IPPROTO_IGMP = 0
+IPPROTO_IP = 0
+IPPROTO_IPIP = 0
+IPPROTO_IPV6 = 0
+IPPROTO_NONE = 0
+IPPROTO_PIM = 0
+IPPROTO_PUP = 0
+IPPROTO_RAW = 0
+IPPROTO_ROUTING = 0
+IPPROTO_RSVP = 0
+IPPROTO_TCP = 0
+IPPROTO_TP = 0
+IPPROTO_UDP = 0
+IPV6_CHECKSUM = 0
+IPV6_DSTOPTS = 0
+IPV6_HOPLIMIT = 0
+IPV6_HOPOPTS = 0
+IPV6_JOIN_GROUP = 0
+IPV6_LEAVE_GROUP = 0
+IPV6_MULTICAST_HOPS = 0
+IPV6_MULTICAST_IF = 0
+IPV6_MULTICAST_LOOP = 0
+IPV6_NEXTHOP = 0
+IPV6_PKTINFO = 0
+IPV6_RECVDSTOPTS = 0
+IPV6_RECVHOPLIMIT = 0
+IPV6_RECVHOPOPTS = 0
+IPV6_RECVPKTINFO = 0
+IPV6_RECVRTHDR = 0
+IPV6_RECVTCLASS = 0
+IPV6_RTHDR = 0
+IPV6_RTHDRDSTOPTS = 0
+IPV6_RTHDR_TYPE_0 = 0
+IPV6_TCLASS = 0
+IPV6_UNICAST_HOPS = 0
+IPV6_V6ONLY = 0
+IP_ADD_MEMBERSHIP = 0
+IP_DEFAULT_MULTICAST_LOOP = 0
+IP_DEFAULT_MULTICAST_TTL = 0
+IP_DROP_MEMBERSHIP = 0
+IP_HDRINCL = 0
+IP_MAX_MEMBERSHIPS = 0
+IP_MULTICAST_IF = 0
+IP_MULTICAST_LOOP = 0
+IP_MULTICAST_TTL = 0
+IP_OPTIONS = 0
+IP_RECVOPTS = 0
+IP_RECVRETOPTS = 0
+IP_RETOPTS = 0
+IP_TOS = 0
+IP_TTL = 0
+MSG_CTRUNC = 0
+MSG_DONTROUTE = 0
+MSG_DONTWAIT = 0
+MSG_EOR = 0
+MSG_OOB = 0
+MSG_PEEK = 0
+MSG_TRUNC = 0
+MSG_WAITALL = 0
+NETLINK_DNRTMSG = 0
+NETLINK_FIREWALL = 0
+NETLINK_IP6_FW = 0
+NETLINK_NFLOG = 0
+NETLINK_ROUTE = 0
+NETLINK_USERSOCK = 0
+NETLINK_XFRM = 0
+NI_DGRAM = 0
+NI_MAXHOST = 0
+NI_MAXSERV = 0
+NI_NAMEREQD = 0
+NI_NOFQDN = 0
+NI_NUMERICHOST = 0
+NI_NUMERICSERV = 0
+PACKET_BROADCAST = 0
+PACKET_FASTROUTE = 0
+PACKET_HOST = 0
+PACKET_LOOPBACK = 0
+PACKET_MULTICAST = 0
+PACKET_OTHERHOST = 0
+PACKET_OUTGOING = 0
+PF_PACKET = 0
+SHUT_RD = 0
+SHUT_RDWR = 0
+SHUT_WR = 0
+SOL_HCI = 0
+SOL_IP = 0
+SOL_SOCKET = 0
+SOL_TCP = 0
+SOL_TIPC = 0
+SOL_UDP = 0
+SO_ACCEPTCONN = 0
+SO_BROADCAST = 0
+SO_DEBUG = 0
+SO_DONTROUTE = 0
+SO_ERROR = 0
+SO_KEEPALIVE = 0
+SO_LINGER = 0
+SO_OOBINLINE = 0
+SO_RCVBUF = 0
+SO_RCVLOWAT = 0
+SO_RCVTIMEO = 0
+SO_REUSEADDR = 0
+SO_SNDBUF = 0
+SO_SNDLOWAT = 0
+SO_SNDTIMEO = 0
+SO_TYPE = 0
+TCP_CORK = 0
+TCP_DEFER_ACCEPT = 0
+TCP_INFO = 0
+TCP_KEEPCNT = 0
+TCP_KEEPIDLE = 0
+TCP_KEEPINTVL = 0
+TCP_LINGER2 = 0
+TCP_MAXSEG = 0
+TCP_NODELAY = 0
+TCP_QUICKACK = 0
+TCP_SYNCNT = 0
+TCP_WINDOW_CLAMP = 0
+TIPC_ADDR_ID = 0
+TIPC_ADDR_NAME = 0
+TIPC_ADDR_NAMESEQ = 0
+TIPC_CFG_SRV = 0
+TIPC_CLUSTER_SCOPE = 0
+TIPC_CONN_TIMEOUT = 0
+TIPC_CRITICAL_IMPORTANCE = 0
+TIPC_DEST_DROPPABLE = 0
+TIPC_HIGH_IMPORTANCE = 0
+TIPC_IMPORTANCE = 0
+TIPC_LOW_IMPORTANCE = 0
+TIPC_MEDIUM_IMPORTANCE = 0
+TIPC_NODE_SCOPE = 0
+TIPC_PUBLISHED = 0
+TIPC_SRC_DROPPABLE = 0
+TIPC_SUBSCR_TIMEOUT = 0
+TIPC_SUB_CANCEL = 0
+TIPC_SUB_PORTS = 0
+TIPC_SUB_SERVICE = 0
+TIPC_TOP_SRV = 0
+TIPC_WAIT_FOREVER = 0
+TIPC_WITHDRAWN = 0
+TIPC_ZONE_SCOPE = 0
+
+
+# ----- exceptions -----
+class error(IOError):
+    ...
+
+class herror(error):
+    def __init__(self, herror: int, string: str) -> None: ...
+
+class gaierror(error):
+    def __init__(self, error: int, string: str) -> None: ...
+
+class timeout(error):
+    ...
+
+
+# Addresses can be either tuples of varying lengths (AF_INET, AF_INET6,
+# AF_NETLINK, AF_TIPC) or strings (AF_UNIX).
+
+# TODO AF_PACKET and AF_BLUETOOTH address objects
+
+
+# ----- classes -----
+class socket:
+    family = 0
+    type = 0
+    proto = 0
+
+    def __init__(self, family: int = ..., type: int = ...,
+                 proto: int = ...) -> None: ...
+
+    # --- methods ---
+    # second tuple item is an address
+    def accept(self) -> Tuple['socket', Any]: ...
+    def bind(self, address: Union[tuple, str]) -> None: ...
+    def close(self) -> None: ...
+    def connect(self, address: Union[tuple, str]) -> None: ...
+    def connect_ex(self, address: Union[tuple, str]) -> int: ...
+    def detach(self) -> int: ...
+    def fileno(self) -> int: ...
+
+    # return value is an address
+    def getpeername(self) -> Any: ...
+    def getsockname(self) -> Any: ...
+
+    @overload
+    def getsockopt(self, level: int, optname: int) -> int: ...
+    @overload
+    def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
+
+    def gettimeout(self) -> float: ...
+    def ioctl(self, control: object,
+              option: Tuple[int, int, int]) -> None: ...
+    def listen(self, backlog: int) -> None: ...
+    # TODO the return value may be BinaryIO or TextIO, depending on mode
+    def makefile(self, mode: str = ..., buffering: int = ...,
+                 encoding: str = ..., errors: str = ...,
+                 newline: str = ...) -> Any:
+        ...
+    def recv(self, bufsize: int, flags: int = ...) -> str: ...
+
+    # return type is an address
+    def recvfrom(self, bufsize: int, flags: int = ...) -> Any: ...
+    def recvfrom_into(self, buffer: str, nbytes: int,
+                      flags: int = ...) -> Any: ...
+    def recv_into(self, buffer: str, nbytes: int,
+                  flags: int = ...) -> Any: ...
+    def send(self, data: str, flags: int = ...) -> int: ...
+    def sendall(self, data: str, flags: int = ...) -> None:
+        ...  # return type: None on success
+    def sendto(self, data: str, address: Union[tuple, str], flags: int = ...) -> int: ...
+    def setblocking(self, flag: bool) -> None: ...
+    def settimeout(self, value: Union[float, None]) -> None: ...
+    def setsockopt(self, level: int, optname: int, value: Union[int, bytes]) -> None: ...
+    def shutdown(self, how: int) -> None: ...
+
+
+# ----- functions -----
+def create_connection(address: Tuple[str, int],
+                      timeout: float = ...,
+                      source_address: Tuple[str, int] = ...) -> socket: ...
+
+# the 5th tuple item is an address
+def getaddrinfo(
+        host: Optional[str], port: Union[str, int, None], family: int = ...,
+        socktype: int = ..., proto: int = ..., flags: int = ...) -> List[Tuple[int, int, int, str, Union[Tuple[str, int], Tuple[str, int, int, int]]]]:
+    ...
+
+def getfqdn(name: str = ...) -> str: ...
+def gethostbyname(hostname: str) -> str: ...
+def gethostbyname_ex(hostname: str) -> Tuple[str, List[str], List[str]]: ...
+def gethostname() -> str: ...
+def gethostbyaddr(ip_address: str) -> Tuple[str, List[str], List[str]]: ...
+def getnameinfo(sockaddr: tuple, flags: int) -> Tuple[str, int]: ...
+def getprotobyname(protocolname: str) -> int: ...
+def getservbyname(servicename: str, protocolname: str = ...) -> int: ...
+def getservbyport(port: int, protocolname: str = ...) -> str: ...
+def socketpair(family: int = ...,
+               type: int = ...,
+               proto: int = ...) -> Tuple[socket, socket]: ...
+def fromfd(fd: int, family: int, type: int, proto: int = ...) -> socket: ...
+def ntohl(x: int) -> int: ...  # param & ret val are 32-bit ints
+def ntohs(x: int) -> int: ...  # param & ret val are 16-bit ints
+def htonl(x: int) -> int: ...  # param & ret val are 32-bit ints
+def htons(x: int) -> int: ...  # param & ret val are 16-bit ints
+def inet_aton(ip_string: str) -> str: ...  # ret val 4 bytes in length
+def inet_ntoa(packed_ip: str) -> str: ...
+def inet_pton(address_family: int, ip_string: str) -> str: ...
+def inet_ntop(address_family: int, packed_ip: str) -> str: ...
+def getdefaulttimeout() -> Union[float, None]: ...
+def setdefaulttimeout(timeout: float) -> None: ...
diff --git a/typeshed/stdlib/2/spwd.pyi b/typeshed/stdlib/2/spwd.pyi
new file mode 100644
index 0000000..ee09838
--- /dev/null
+++ b/typeshed/stdlib/2/spwd.pyi
@@ -0,0 +1,15 @@
+from typing import List
+
+class struct_spwd(object):
+    sp_nam = ...  # type: str
+    sp_pwd = ...  # type: str
+    sp_lstchg = ...  # type: int
+    sp_min = ...  # type: int
+    sp_max = ...  # type: int
+    sp_warn = ...  # type: int
+    sp_inact = ...  # type: int
+    sp_expire = ...  # type: int
+    sp_flag = ...  # type: int
+
+def getspall() -> List[struct_spwd]: pass
+def getspnam() -> struct_spwd: pass
diff --git a/typeshed/stdlib/2/sqlite3/__init__.pyi b/typeshed/stdlib/2/sqlite3/__init__.pyi
new file mode 100644
index 0000000..fc22e5d
--- /dev/null
+++ b/typeshed/stdlib/2/sqlite3/__init__.pyi
@@ -0,0 +1,5 @@
+# Stubs for sqlite3 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from sqlite3.dbapi2 import *  # noqa: F403
diff --git a/typeshed/stdlib/2/sqlite3/dbapi2.pyi b/typeshed/stdlib/2/sqlite3/dbapi2.pyi
new file mode 100644
index 0000000..7a6dcf1
--- /dev/null
+++ b/typeshed/stdlib/2/sqlite3/dbapi2.pyi
@@ -0,0 +1,256 @@
+# Filip Hron <filip.hron at gmail.com>
+# based heavily on Andrey Vlasovskikh's python-skeletons https://github.com/JetBrains/python-skeletons/blob/master/sqlite3.py
+
+from typing import Any, Union, List, Iterator
+from numbers import Integral
+from datetime import time, datetime
+from collections import Iterable
+
+paramstyle = ...  # type: str
+threadsafety = ...  # type: int
+apilevel = ...  # type: str
+Date = ...  # type: datetime
+Time = ...  # type: time
+Timestamp = ...  # type: datetime
+
+def DateFromTicks(ticks): ...
+def TimeFromTicks(ticks): ...
+def TimestampFromTicks(ticks): ...
+
+version_info = ...  # type: Any
+sqlite_version_info = ...  # type: Any
+Binary = ...  # type: Any
+
+def register_adapters_and_converters(): ...
+
+# The remaining definitions are imported from _sqlite3.
+
+PARSE_COLNAMES = ...  # type: int
+PARSE_DECLTYPES = ...  # type: int
+SQLITE_ALTER_TABLE = ...  # type: int
+SQLITE_ANALYZE = ...  # type: int
+SQLITE_ATTACH = ...  # type: int
+SQLITE_CREATE_INDEX = ...  # type: int
+SQLITE_CREATE_TABLE = ...  # type: int
+SQLITE_CREATE_TEMP_INDEX = ...  # type: int
+SQLITE_CREATE_TEMP_TABLE = ...  # type: int
+SQLITE_CREATE_TEMP_TRIGGER = ...  # type: int
+SQLITE_CREATE_TEMP_VIEW = ...  # type: int
+SQLITE_CREATE_TRIGGER = ...  # type: int
+SQLITE_CREATE_VIEW = ...  # type: int
+SQLITE_DELETE = ...  # type: int
+SQLITE_DENY = ...  # type: int
+SQLITE_DETACH = ...  # type: int
+SQLITE_DROP_INDEX = ...  # type: int
+SQLITE_DROP_TABLE = ...  # type: int
+SQLITE_DROP_TEMP_INDEX = ...  # type: int
+SQLITE_DROP_TEMP_TABLE = ...  # type: int
+SQLITE_DROP_TEMP_TRIGGER = ...  # type: int
+SQLITE_DROP_TEMP_VIEW = ...  # type: int
+SQLITE_DROP_TRIGGER = ...  # type: int
+SQLITE_DROP_VIEW = ...  # type: int
+SQLITE_IGNORE = ...  # type: int
+SQLITE_INSERT = ...  # type: int
+SQLITE_OK = ...  # type: int
+SQLITE_PRAGMA = ...  # type: int
+SQLITE_READ = ...  # type: int
+SQLITE_REINDEX = ...  # type: int
+SQLITE_SELECT = ...  # type: int
+SQLITE_TRANSACTION = ...  # type: int
+SQLITE_UPDATE = ...  # type: int
+adapters = ...  # type: Any
+converters = ...  # type: Any
+sqlite_version = ...  # type: str
+version = ...  # type: str
+
+# TODO: adapt needs to get probed
+def adapt(obj, protocol, alternate): ...
+def complete_statement(sql: str) -> bool: ...
+def connect(database: Union[bytes, unicode],
+            timeout: float = ...,
+            detect_types: int = ...,
+            isolation_level: Union[str, None] = ...,
+            check_same_thread: bool = ...,
+            factory: Union[Connection, None] = ...,
+            cached_statements: int = ...) -> Connection: ...
+def enable_callback_tracebacks(flag: bool) -> None: ...
+def enable_shared_cache(do_enable: int) -> None: ...
+def register_adapter(type: type, callable: Any) -> None: ...
+# TODO: sqlite3.register_converter.__doc__ specifies callable as unknown
+def register_converter(typename: str, callable: bytes) -> None: ...
+
+class Cache:
+    def __init__(self, *args, **kwargs) -> None: ...
+    def display(self, *args, **kwargs) -> None: ...
+    def get(self, *args, **kwargs) -> None: ...
+
+class Connection:
+    DataError = ...  # type: Any
+    DatabaseError = ...  # type: Any
+    Error = ...  # type: Any
+    IntegrityError = ...  # type: Any
+    InterfaceError = ...  # type: Any
+    InternalError = ...  # type: Any
+    NotSupportedError = ...  # type: Any
+    OperationalError = ...  # type: Any
+    ProgrammingError = ...  # type: Any
+    Warning = ...  # type: Any
+    in_transaction = ...  # type: Any
+    isolation_level = ...  # type: Any
+    row_factory = ...  # type: Any
+    text_factory = ...  # type: Any
+    total_changes = ...  # type: Any
+    def __init__(self, *args, **kwargs): ...
+    def close(self) -> None: ...
+    def commit(self) -> None: ...
+    def create_aggregate(self, name: str, num_params: int, aggregate_class: type) -> None: ...
+    def create_collation(self, name: str, callable: Any) -> None: ...
+    def create_function(self, name: str, num_params: int, func: Any) -> None: ...
+    def cursor(self, cursorClass=...) -> Cursor: ...
+    def execute(self, sql: str, parameters: Iterable = ...) -> Cursor: ...
+    # TODO: please check in executemany() if seq_of_parameters type is possible like this
+    def executemany(self, sql: str, seq_of_parameters: Iterable[Iterable]) -> Cursor: ...
+    def executescript(self, sql_script: Union[bytes, unicode]) -> Cursor: ...
+    def interrupt(self, *args, **kwargs) -> None: ...
+    def iterdump(self, *args, **kwargs) -> None: ...
+    def rollback(self, *args, **kwargs) -> None: ...
+    # TODO: set_authorizer(authorzer_callback)
+    # see https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.set_authorizer
+    # returns [SQLITE_OK, SQLITE_DENY, SQLITE_IGNORE] so perhaps int
+    def set_authorizer(self, *args, **kwargs) -> None: ...
+    # set_progress_handler(handler, n) -> see https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.set_progress_handler
+    def set_progress_handler(self, *args, **kwargs) -> None: ...
+    def set_trace_callback(self, *args, **kwargs): ...
+    def __call__(self, *args, **kwargs): ...
+    def __enter__(self, *args, **kwargs): ...
+    def __exit__(self, *args, **kwargs): ...
+
+class Cursor(Iterator[Any]):
+    arraysize = ...  # type: Any
+    connection = ...  # type: Any
+    description = ...  # type: Any
+    lastrowid = ...  # type: Any
+    row_factory = ...  # type: Any
+    rowcount = ...  # type: Any
+    # TODO: Cursor class accepts exactly 1 argument
+    # required type is sqlite3.Connection (which is imported as _Connection)
+    # however, the name of the __init__ variable is unknown
+    def __init__(self, *args, **kwargs): ...
+    def close(self, *args, **kwargs): ...
+    def execute(self, sql: str, parameters: Iterable = ...) -> Cursor: ...
+    def executemany(self, sql: str, seq_of_parameters: Iterable[Iterable]): ...
+    def executescript(self, sql_script: Union[bytes, unicode]) -> Cursor: ...
+    def fetchall(self) -> List[Any]: ...
+    def fetchmany(self, size: Integral = ...) -> List[Any]: ...
+    def fetchone(self) -> Any: ...
+    def setinputsizes(self, *args, **kwargs): ...
+    def setoutputsize(self, *args, **kwargs): ...
+    def __iter__(self) -> Cursor: ...
+    def __next__(self) -> Any: ...
+
+
+class DataError(DatabaseError): ...
+
+class DatabaseError(Error): ...
+
+class Error(Exception): ...
+
+class IntegrityError(DatabaseError): ...
+
+class InterfaceError(Error): ...
+
+class InternalError(DatabaseError): ...
+
+class NotSupportedError(DatabaseError): ...
+
+class OperationalError(DatabaseError): ...
+
+class OptimizedUnicode:
+    maketrans = ...  # type: Any
+    def __init__(self, *args, **kwargs): ...
+    def capitalize(self, *args, **kwargs): ...
+    def casefold(self, *args, **kwargs): ...
+    def center(self, *args, **kwargs): ...
+    def count(self, *args, **kwargs): ...
+    def encode(self, *args, **kwargs): ...
+    def endswith(self, *args, **kwargs): ...
+    def expandtabs(self, *args, **kwargs): ...
+    def find(self, *args, **kwargs): ...
+    def format(self, *args, **kwargs): ...
+    def format_map(self, *args, **kwargs): ...
+    def index(self, *args, **kwargs): ...
+    def isalnum(self, *args, **kwargs): ...
+    def isalpha(self, *args, **kwargs): ...
+    def isdecimal(self, *args, **kwargs): ...
+    def isdigit(self, *args, **kwargs): ...
+    def isidentifier(self, *args, **kwargs): ...
+    def islower(self, *args, **kwargs): ...
+    def isnumeric(self, *args, **kwargs): ...
+    def isprintable(self, *args, **kwargs): ...
+    def isspace(self, *args, **kwargs): ...
+    def istitle(self, *args, **kwargs): ...
+    def isupper(self, *args, **kwargs): ...
+    def join(self, *args, **kwargs): ...
+    def ljust(self, *args, **kwargs): ...
+    def lower(self, *args, **kwargs): ...
+    def lstrip(self, *args, **kwargs): ...
+    def partition(self, *args, **kwargs): ...
+    def replace(self, *args, **kwargs): ...
+    def rfind(self, *args, **kwargs): ...
+    def rindex(self, *args, **kwargs): ...
+    def rjust(self, *args, **kwargs): ...
+    def rpartition(self, *args, **kwargs): ...
+    def rsplit(self, *args, **kwargs): ...
+    def rstrip(self, *args, **kwargs): ...
+    def split(self, *args, **kwargs): ...
+    def splitlines(self, *args, **kwargs): ...
+    def startswith(self, *args, **kwargs): ...
+    def strip(self, *args, **kwargs): ...
+    def swapcase(self, *args, **kwargs): ...
+    def title(self, *args, **kwargs): ...
+    def translate(self, *args, **kwargs): ...
+    def upper(self, *args, **kwargs): ...
+    def zfill(self, *args, **kwargs): ...
+    def __add__(self, other): ...
+    def __contains__(self, *args, **kwargs): ...
+    def __eq__(self, other): ...
+    def __format__(self, *args, **kwargs): ...
+    def __ge__(self, other): ...
+    def __getitem__(self, index): ...
+    def __getnewargs__(self, *args, **kwargs): ...
+    def __gt__(self, other): ...
+    def __hash__(self): ...
+    def __iter__(self): ...
+    def __le__(self, other): ...
+    def __len__(self, *args, **kwargs): ...
+    def __lt__(self, other): ...
+    def __mod__(self, other): ...
+    def __mul__(self, other): ...
+    def __ne__(self, other): ...
+    def __rmod__(self, other): ...
+    def __rmul__(self, other): ...
+    def __sizeof__(self): ...
+
+class PrepareProtocol:
+    def __init__(self, *args, **kwargs): ...
+
+class ProgrammingError(DatabaseError): ...
+
+class Row:
+    def __init__(self, *args, **kwargs): ...
+    def keys(self, *args, **kwargs): ...
+    def __eq__(self, other): ...
+    def __ge__(self, other): ...
+    def __getitem__(self, index): ...
+    def __gt__(self, other): ...
+    def __hash__(self): ...
+    def __iter__(self): ...
+    def __le__(self, other): ...
+    def __len__(self, *args, **kwargs): ...
+    def __lt__(self, other): ...
+    def __ne__(self, other): ...
+
+class Statement:
+    def __init__(self, *args, **kwargs): ...
+
+class Warning(Exception): ...
diff --git a/typeshed/stdlib/2/ssl.pyi b/typeshed/stdlib/2/ssl.pyi
new file mode 100644
index 0000000..3c07549
--- /dev/null
+++ b/typeshed/stdlib/2/ssl.pyi
@@ -0,0 +1,204 @@
+# Stubs for ssl
+
+from typing import (
+    Any, Dict, Callable, List, NamedTuple, Optional, Set, Tuple, Union,
+)
+import socket
+import sys
+
+_PCTRTT = Tuple[Tuple[str, str], ...]
+_PCTRTTT = Tuple[_PCTRTT, ...]
+_PeerCertRetDictType = Dict[str, Union[str, _PCTRTTT, _PCTRTT]]
+_PeerCertRetType = Union[_PeerCertRetDictType, bytes, None]
+_EnumRetType = List[Tuple[bytes, str, Union[Set[str], bool]]]
+_PasswordType = Union[Callable[[], Union[str, bytes]], str, bytes]
+_SrvnmeCbType = Callable[['SSLSocket', Optional[str], 'SSLSocket'], Optional[int]]
+
+class SSLError(OSError):
+    library = ...  # type: str
+    reason = ...  # type: str
+class SSLZeroReturnError(SSLError): ...
+class SSLWantReadError(SSLError): ...
+class SSLWantWriteError(SSLError): ...
+class SSLSyscallError(SSLError): ...
+class SSLEOFError(SSLError): ...
+class CertificateError(Exception): ...
+
+
+def wrap_socket(sock: socket.socket, keyfile: Optional[str] = ...,
+                certfile: Optional[str] = ..., server_side: bool = ...,
+                cert_reqs: int = ..., ssl_version: int = ...,
+                ca_certs: Optional[str] = ...,
+                do_handshake_on_connect: bool = ...,
+                suppress_ragged_eofs: bool = ...,
+                ciphers: Optional[str] = ...) -> 'SSLSocket': ...
+
+
+def create_default_context(purpose: Any = ..., *,
+                           cafile: Optional[str] = ...,
+                           capath: Optional[str] = ...,
+                           cadata: Optional[str] = ...) -> 'SSLContext': ...
+
+
+def RAND_status() -> bool: ...
+def RAND_egd(path: str) -> None: ...
+def RAND_add(bytes: bytes, entropy: float) -> None: ...
+
+
+def match_hostname(cert: _PeerCertRetType, hostname: str) -> None: ...
+def cert_time_to_seconds(cert_time: str) -> int: ...
+def get_server_certificate(addr: Tuple[str, int], ssl_version: int = ...,
+                           ca_certs: Optional[str] = ...) -> str: ...
+def DER_cert_to_PEM_cert(der_cert_bytes: bytes) -> str: ...
+def PEM_cert_to_DER_cert(pem_cert_string: str) -> bytes: ...
+DefaultVerifyPaths = NamedTuple('DefaultVerifyPaths',
+                                [('cafile', str), ('capath', str),
+                                 ('openssl_cafile_env', str),
+                                 ('openssl_cafile', str),
+                                 ('openssl_capath_env', str),
+                                 ('openssl_capath', str)])
+def get_default_verify_paths() -> DefaultVerifyPaths: ...
+
+if sys.platform == 'win32':
+    def enum_certificates(store_name: str) -> _EnumRetType: ...
+    def enum_crls(store_name: str) -> _EnumRetType: ...
+
+
+CERT_NONE = ...  # type: int
+CERT_OPTIONAL = ...  # type: int
+CERT_REQUIRED = ...  # type: int
+
+VERIFY_DEFAULT = ...  # type: int
+VERIFY_CRL_CHECK_LEAF = ...  # type: int
+VERIFY_CRL_CHECK_CHAIN = ...  # type: int
+VERIFY_X509_STRICT = ...  # type: int
+VERIFY_X509_TRUSTED_FIRST = ...  # type: int
+
+PROTOCOL_SSLv23 = ...  # type: int
+PROTOCOL_SSLv2 = ...  # type: int
+PROTOCOL_SSLv3 = ...  # type: int
+PROTOCOL_TLSv1 = ...  # type: int
+PROTOCOL_TLSv1_1 = ...  # type: int
+PROTOCOL_TLSv1_2 = ...  # type: int
+
+OP_ALL = ...  # type: int
+OP_NO_SSLv2 = ...  # type: int
+OP_NO_SSLv3 = ...  # type: int
+OP_NO_TLSv1 = ...  # type: int
+OP_NO_TLSv1_1 = ...  # type: int
+OP_NO_TLSv1_2 = ...  # type: int
+OP_CIPHER_SERVER_PREFERENCE = ...  # type: int
+OP_SINGLE_DH_USE = ...  # type: int
+OP_SINGLE_ECDH_USE = ...  # type: int
+OP_NO_COMPRESSION = ...  # type: int
+
+HAS_ALPN = ...  # type: int
+HAS_ECDH = ...  # type: bool
+HAS_SNI = ...  # type: bool
+HAS_NPN = ...  # type: bool
+CHANNEL_BINDING_TYPES = ...  # type: List[str]
+
+OPENSSL_VERSION = ...  # type: str
+OPENSSL_VERSION_INFO = ...  # type: Tuple[int, int, int, int, int]
+OPENSSL_VERSION_NUMBER = ...  # type: int
+
+ALERT_DESCRIPTION_HANDSHAKE_FAILURE = ...  # type: int
+ALERT_DESCRIPTION_INTERNAL_ERROR = ...  # type: int
+ALERT_DESCRIPTION_ACCESS_DENIED = ...  # type: int
+ALERT_DESCRIPTION_BAD_CERTIFICATE = ...  # type: int
+ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE = ...  # type: int
+ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE = ...  # type: int
+ALERT_DESCRIPTION_BAD_RECORD_MAC = ...  # type: int
+ALERT_DESCRIPTION_CERTIFICATE_EXPIRED = ...  # type: int
+ALERT_DESCRIPTION_CERTIFICATE_REVOKED = ...  # type: int
+ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN = ...  # type: int
+ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE = ...  # type: int
+ALERT_DESCRIPTION_CLOSE_NOTIFY = ...  # type: int
+ALERT_DESCRIPTION_DECODE_ERROR = ...  # type: int
+ALERT_DESCRIPTION_DECOMPRESSION_FAILURE = ...  # type: int
+ALERT_DESCRIPTION_DECRYPT_ERROR = ...  # type: int
+ALERT_DESCRIPTION_ILLEGAL_PARAMETER = ...  # type: int
+ALERT_DESCRIPTION_INSUFFICIENT_SECURITY = ...  # type: int
+ALERT_DESCRIPTION_NO_RENEGOTIATION = ...  # type: int
+ALERT_DESCRIPTION_PROTOCOL_VERSION = ...  # type: int
+ALERT_DESCRIPTION_RECORD_OVERFLOW = ...  # type: int
+ALERT_DESCRIPTION_UNEXPECTED_MESSAGE = ...  # type: int
+ALERT_DESCRIPTION_UNKNOWN_CA = ...  # type: int
+ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY = ...  # type: int
+ALERT_DESCRIPTION_UNRECOGNIZED_NAME = ...  # type: int
+ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE = ...  # type: int
+ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION = ...  # type: int
+ALERT_DESCRIPTION_USER_CANCELLED = ...  # type: int
+
+_PurposeType = NamedTuple('_PurposeType',
+                         [('nid', int), ('shortname', str),
+                          ('longname', str), ('oid', str)])
+class Purpose:
+    SERVER_AUTH = ...  # type: _PurposeType
+    CLIENT_AUTH = ...  # type: _PurposeType
+
+
+class SSLSocket(socket.socket):
+    def do_handshake(self) -> None: ...
+    def getpeercert(self, binary_form: bool = ...) -> _PeerCertRetType: ...
+    def cipher(self) -> Tuple[str, int, int]: ...
+    def compression(self) -> Optional[str]: ...
+    def get_channel_binding(self, cb_type: str = ...) -> Optional[bytes]: ...
+    def selected_alpn_protocol(self) -> Optional[str]: ...
+    def selected_npn_protocol(self) -> Optional[str]: ...
+    def unwrap(self) -> socket.socket: ...
+    def version(self) -> Optional[str]: ...
+
+
+class SSLContext:
+    check_hostname = ...  # type: bool
+    options = ...  # type: int
+    @property
+    def protocol(self) -> int: ...
+    verify_flags = ...  # type: int
+    verify_mode = ...  # type: int
+    def __init__(self, protocol: int) -> None: ...
+    def cert_store_stats(self) -> Dict[str, int]: ...
+    def load_cert_chain(self, certfile: str, keyfile: Optional[str] = ...,
+                        password: _PasswordType = ...) -> None: ...
+    def load_default_certs(self, purpose: _PurposeType = ...) -> None: ...
+    def load_verify_locations(self, cafile: Optional[str] = ...,
+                              capath: Optional[str] = ...,
+                              cadata: Union[str, bytes, None] = ...) -> None: ...
+    def get_ca_certs(self,
+                     binary_form: bool = ...) -> Union[List[_PeerCertRetDictType], List[bytes]]: ...
+    def set_default_verify_paths(self) -> None: ...
+    def set_ciphers(self, ciphers: str) -> None: ...
+    def set_alpn_protocols(self, protocols: List[str]) -> None: ...
+    def set_npn_protocols(self, protocols: List[str]) -> None: ...
+    def set_servername_callback(self,
+                                server_name_callback: Optional[_SrvnmeCbType]) -> None: ...
+    def load_dh_params(self, dhfile: str) -> None: ...
+    def set_ecdh_curve(self, curve_name: str) -> None: ...
+    def wrap_socket(self, sock: socket.socket, server_side: bool = ...,
+                    do_handshake_on_connect: bool = ...,
+                    suppress_ragged_eofs: bool = ...,
+                    server_hostname: Optional[str] = ...) -> 'SSLContext': ...
+    def session_stats(self) -> Dict[str, int]: ...
+
+
+# TODO below documented in cpython but not in docs.python.org
+# taken from python 3.4
+SSL_ERROR_EOF = ...  # type: int
+SSL_ERROR_INVALID_ERROR_CODE = ...  # type: int
+SSL_ERROR_SSL = ...  # type: int
+SSL_ERROR_SYSCALL = ...  # type: int
+SSL_ERROR_WANT_CONNECT = ...  # type: int
+SSL_ERROR_WANT_READ = ...  # type: int
+SSL_ERROR_WANT_WRITE = ...  # type: int
+SSL_ERROR_WANT_X509_LOOKUP = ...  # type: int
+SSL_ERROR_ZERO_RETURN = ...  # type: int
+
+def get_protocol_name(protocol_code: int) -> str: ...
+
+AF_INET = ...  # type: int
+PEM_FOOTER = ...  # type: str
+PEM_HEADER = ...  # type: str
+SOCK_STREAM = ...  # type: int
+SOL_SOCKET = ...  # type: int
+SO_TYPE = ...  # type: int
diff --git a/typeshed/stdlib/2/stat.pyi b/typeshed/stdlib/2/stat.pyi
new file mode 100644
index 0000000..dd3418d
--- /dev/null
+++ b/typeshed/stdlib/2/stat.pyi
@@ -0,0 +1,59 @@
+def S_ISDIR(mode: int) -> bool: ...
+def S_ISCHR(mode: int) -> bool: ...
+def S_ISBLK(mode: int) -> bool: ...
+def S_ISREG(mode: int) -> bool: ...
+def S_ISFIFO(mode: int) -> bool: ...
+def S_ISLNK(mode: int) -> bool: ...
+def S_ISSOCK(mode: int) -> bool: ...
+
+def S_IMODE(mode: int) -> int: ...
+def S_IFMT(mode: int) -> int: ...
+
+ST_MODE = 0
+ST_INO = 0
+ST_DEV = 0
+ST_NLINK = 0
+ST_UID = 0
+ST_GID = 0
+ST_SIZE = 0
+ST_ATIME = 0
+ST_MTIME = 0
+ST_CTIME = 0
+S_IFSOCK = 0
+S_IFLNK = 0
+S_IFREG = 0
+S_IFBLK = 0
+S_IFDIR = 0
+S_IFCHR = 0
+S_IFIFO = 0
+S_ISUID = 0
+S_ISGID = 0
+S_ISVTX = 0
+S_IRWXU = 0
+S_IRUSR = 0
+S_IWUSR = 0
+S_IXUSR = 0
+S_IRWXG = 0
+S_IRGRP = 0
+S_IWGRP = 0
+S_IXGRP = 0
+S_IRWXO = 0
+S_IROTH = 0
+S_IWOTH = 0
+S_IXOTH = 0
+S_ENFMT = 0
+S_IREAD = 0
+S_IWRITE = 0
+S_IEXEC = 0
+UF_NODUMP = 0
+UF_IMMUTABLE = 0
+UF_APPEND = 0
+UF_OPAQUE = 0
+UF_NOUNLINK = 0
+UF_COMPRESSED = 0
+UF_HIDDEN = 0
+SF_ARCHIVED = 0
+SF_IMMUTABLE = 0
+SF_APPEND = 0
+SF_NOUNLINK = 0
+SF_SNAPSHOT = 0
diff --git a/typeshed/stdlib/2/string.pyi b/typeshed/stdlib/2/string.pyi
new file mode 100644
index 0000000..4bbfb48
--- /dev/null
+++ b/typeshed/stdlib/2/string.pyi
@@ -0,0 +1,74 @@
+# Stubs for string
+
+# Based on http://docs.python.org/3.2/library/string.html
+
+from typing import Mapping, Sequence, Any, Optional, Union, List, Tuple, Iterable, AnyStr
+
+ascii_letters = ...  # type: str
+ascii_lowercase = ...  # type: str
+ascii_uppercase = ...  # type: str
+digits = ...  # type: str
+hexdigits = ...  # type: str
+letters = ...  # type: str
+lowercase = ...  # type: str
+octdigits = ...  # type: str
+punctuation = ...  # type: str
+printable = ...  # type: str
+uppercase = ...  # type: str
+whitespace = ...  # type: str
+
+def capwords(s: AnyStr, sep: AnyStr = ...) -> AnyStr: ...
+# TODO: originally named 'from'
+def maketrans(_from: str, to: str) -> str: ...
+def atof(s: unicode) -> float: ...
+def atoi(s: unicode, base: int = ...) -> int: ...
+def atol(s: unicode, base: int = ...) -> int: ...
+def capitalize(word: AnyStr) -> AnyStr: ...
+def find(s: unicode, sub: unicode, start: int = ..., end: int = ...) -> int: ...
+def rfind(s: unicode, sub: unicode, start: int = ..., end: int = ...) -> int: ...
+def index(s: unicode, sub: unicode, start: int = ..., end: int = ...) -> int: ...
+def rindex(s: unicode, sub: unicode, start: int = ..., end: int = ...) -> int: ...
+def count(s: unicode, sub: unicode, start: int = ..., end: int = ...) -> int: ...
+def lower(s: AnyStr) -> AnyStr: ...
+def split(s: AnyStr, sep: AnyStr = ..., maxsplit: int = ...) -> List[AnyStr]: ...
+def rsplit(s: AnyStr, sep: AnyStr = ..., maxsplit: int = ...) -> List[AnyStr]: ...
+def splitfields(s: AnyStr, sep: AnyStr = ..., maxsplit: int = ...) -> List[AnyStr]: ...
+def join(words: Iterable[AnyStr], sep: AnyStr = ...) -> AnyStr: ...
+def joinfields(word: Iterable[AnyStr], sep: AnyStr = ...) -> AnyStr: ...
+def lstrip(s: AnyStr, chars: AnyStr = ...) -> AnyStr: ...
+def rstrip(s: AnyStr, chars: AnyStr = ...) -> AnyStr: ...
+def strip(s: AnyStr, chars: AnyStr = ...) -> AnyStr: ...
+def swapcase(s: AnyStr) -> AnyStr: ...
+def translate(s: str, table: str, deletechars: str = ...) -> str: ...
+def upper(s: AnyStr) -> AnyStr: ...
+def ljust(s: AnyStr, width: int, fillhar: AnyStr = ...) -> AnyStr: ...
+def rjust(s: AnyStr, width: int, fillhar: AnyStr = ...) -> AnyStr: ...
+def center(s: AnyStr, width: int, fillhar: AnyStr = ...) -> AnyStr: ...
+def zfill(s: AnyStr, width: int) -> AnyStr: ...
+def replace(s: AnyStr, old: AnyStr, new: AnyStr, maxreplace: int = ...) -> AnyStr: ...
+
+class Template(object):
+    # TODO: Unicode support?
+    template = ...  # type: str
+
+    def __init__(self, template: str) -> None: ...
+    def substitute(self, mapping: Mapping[str, str] = ..., **kwds: str) -> str: ...
+    def safe_substitute(self, mapping: Mapping[str, str] = ...,
+                        **kwds: str) -> str: ...
+
+# TODO(MichalPokorny): This is probably badly and/or loosely typed.
+class Formatter(object):
+    def format(self, format_string: str, *args, **kwargs) -> str: ...
+    def vformat(self, format_string: str, args: Sequence[Any],
+                kwargs: Mapping[str, Any]) -> str: ...
+    def parse(self, format_string: str) -> Iterable[Tuple[str, str, str, str]]: ...
+    def get_field(self, field_name: str, args: Sequence[Any],
+                  kwargs: Mapping[str, Any]) -> Any: ...
+    def get_value(self, key: Union[int, str], args: Sequence[Any],
+                  kwargs: Mapping[str, Any]) -> Any:
+        raise IndexError()
+        raise KeyError()
+    def check_unused_args(self, used_args: Sequence[Union[int, str]], args: Sequence[Any],
+                          kwargs: Mapping[str, Any]) -> None: ...
+    def format_field(self, value: Any, format_spec: str) -> Any: ...
+    def convert_field(self, value: Any, conversion: str) -> Any: ...
diff --git a/typeshed/stdlib/2/strop.pyi b/typeshed/stdlib/2/strop.pyi
new file mode 100644
index 0000000..736c716
--- /dev/null
+++ b/typeshed/stdlib/2/strop.pyi
@@ -0,0 +1,72 @@
+"""Stub file for the 'strop' module."""
+
+from typing import List, Sequence
+
+lowercase = ...  # type: str
+uppercase = ...  # type: str
+whitespace = ...  # type: str
+
+def atof(a: str) -> float:
+    raise DeprecationWarning()
+
+def atoi(a: str, base: int = ...) -> int:
+    raise DeprecationWarning()
+
+def atol(a: str, base: int = ...) -> long:
+    raise DeprecationWarning()
+
+def capitalize(s: str) -> str:
+    raise DeprecationWarning()
+
+def count(s: str, sub: str, start: int = ..., end: int = ...) -> int:
+    raise DeprecationWarning()
+
+def expandtabs(string: str, tabsize: int = ...) -> str:
+    raise DeprecationWarning()
+    raise OverflowError()
+
+def find(s: str, sub: str, start: int = ..., end: int = ...) -> int:
+    raise DeprecationWarning()
+
+def join(list: Sequence[str], sep: str = ...) -> str:
+    raise DeprecationWarning()
+    raise OverflowError()
+
+def joinfields(list: Sequence[str], sep: str = ...) -> str:
+    raise DeprecationWarning()
+    raise OverflowError()
+
+def lower(s: str) -> str:
+    raise DeprecationWarning()
+
+def lstrip(s: str) -> str:
+    raise DeprecationWarning()
+
+def maketrans(frm: str, to: str) -> str: ...
+
+def replace(s: str, old: str, new: str, maxsplit: int = ...) -> str:
+    raise DeprecationWarning()
+
+def rfind(s: str, sub: str, start: int = ..., end: int = ...) -> int:
+    raise DeprecationWarning()
+
+def rstrip(s: str) -> str:
+    raise DeprecationWarning()
+
+def split(s: str, sep: str, maxsplit: int = ...) -> List[str]:
+    raise DeprecationWarning()
+
+def splitfields(s: str, sep: str, maxsplit: int = ...) -> List[str]:
+    raise DeprecationWarning()
+
+def strip(s: str) -> str:
+    raise DeprecationWarning()
+
+def swapcase(s: str) -> str:
+    raise DeprecationWarning()
+
+def translate(s: str, table: str, deletechars: str = ...) -> str:
+    raise DeprecationWarning()
+
+def upper(s: str) -> str:
+    raise DeprecationWarning()
diff --git a/typeshed/stdlib/2/struct.pyi b/typeshed/stdlib/2/struct.pyi
new file mode 100644
index 0000000..213b618
--- /dev/null
+++ b/typeshed/stdlib/2/struct.pyi
@@ -0,0 +1,28 @@
+# Stubs for struct for Python 2.7
+# Based on https://docs.python.org/2/library/struct.html
+
+from typing import Any, Tuple
+
+class error(Exception): ...
+
+def pack(fmt: str, *v: Any) -> str: ...
+# TODO buffer type
+def pack_into(fmt: str, buffer: Any, offset: int, *v: Any) -> None: ...
+
+# TODO buffer type
+def unpack(fmt: str, buffer: Any) -> Tuple[Any, ...]: ...
+def unpack_from(fmt: str, buffer: Any, offset: int = ...) -> Tuple[Any, ...]: ...
+
+def calcsize(fmt: str) -> int: ...
+
+class Struct:
+    format = ...  # type: str
+    size = ...  # type: int
+
+    def __init__(self, format: str) -> None: ...
+
+    def pack(self, *v: Any) -> str: ...
+    # TODO buffer type
+    def pack_into(self, buffer: Any, offset: int, *v: Any) -> None: ...
+    def unpack(self, buffer: Any) -> Tuple[Any, ...]: ...
+    def unpack_from(self, buffer: Any, offset: int = ...) -> Tuple[Any, ...]: ...
diff --git a/typeshed/stdlib/2/subprocess.pyi b/typeshed/stdlib/2/subprocess.pyi
new file mode 100644
index 0000000..288e82b
--- /dev/null
+++ b/typeshed/stdlib/2/subprocess.pyi
@@ -0,0 +1,109 @@
+# Stubs for subprocess
+
+# Based on http://docs.python.org/2/library/subprocess.html and Python 3 stub
+
+from typing import Sequence, Any, AnyStr, Mapping, Callable, Tuple, IO, Union, Optional
+
+_FILE = Union[int, IO[Any]]
+
+# Same args as Popen.__init__
+def call(args: Union[str, Sequence[str]],
+         bufsize: int = ...,
+         executable: str = ...,
+         stdin: _FILE = ...,
+         stdout: _FILE = ...,
+         stderr: _FILE = ...,
+         preexec_fn: Callable[[], Any] = ...,
+         close_fds: bool = ...,
+         shell: bool = ...,
+         cwd: str = ...,
+         env: Mapping[str, str] = ...,
+         universal_newlines: bool = ...,
+         startupinfo: Any = ...,
+         creationflags: int = ...) -> int: ...
+
+def check_call(args: Union[str, Sequence[str]],
+               bufsize: int = ...,
+               executable: str = ...,
+               stdin: _FILE = ...,
+               stdout: _FILE = ...,
+               stderr: _FILE = ...,
+               preexec_fn: Callable[[], Any] = ...,
+               close_fds: bool = ...,
+               shell: bool = ...,
+               cwd: str = ...,
+               env: Mapping[str, str] = ...,
+               universal_newlines: bool = ...,
+               startupinfo: Any = ...,
+               creationflags: int = ...) -> int: ...
+
+# Same args as Popen.__init__ except for stdout
+def check_output(args: Union[str, Sequence[str]],
+                 bufsize: int = ...,
+                 executable: str = ...,
+                 stdin: _FILE = ...,
+                 stderr: _FILE = ...,
+                 preexec_fn: Callable[[], Any] = ...,
+                 close_fds: bool = ...,
+                 shell: bool = ...,
+                 cwd: str = ...,
+                 env: Mapping[str, str] = ...,
+                 universal_newlines: bool = ...,
+                 startupinfo: Any = ...,
+                 creationflags: int = ...) -> str: ...
+
+PIPE = ...  # type: int
+STDOUT = ...  # type: int
+
+class CalledProcessError(Exception):
+    returncode = 0
+    cmd = ...  # type: str
+    output = ...  # type: str  # May be None
+
+    def __init__(self, returncode: int, cmd: str, output: Optional[str] = ...) -> None: ...
+
+class Popen:
+    stdin = ...  # type: Optional[IO[Any]]
+    stdout = ...  # type: Optional[IO[Any]]
+    stderr = ...  # type: Optional[IO[Any]]
+    pid = 0
+    returncode = 0
+
+    def __init__(self,
+                 args: Union[str, Sequence[str]],
+                 bufsize: int = ...,
+                 executable: Optional[str] = ...,
+                 stdin: Optional[_FILE] = ...,
+                 stdout: Optional[_FILE] = ...,
+                 stderr: Optional[_FILE] = ...,
+                 preexec_fn: Optional[Callable[[], Any]] = ...,
+                 close_fds: bool = ...,
+                 shell: bool = ...,
+                 cwd: Optional[str] = ...,
+                 env: Optional[Mapping[str, str]] = ...,
+                 universal_newlines: bool = ...,
+                 startupinfo: Optional[Any] = ...,
+                 creationflags: int = ...) -> None: ...
+
+    def poll(self) -> int: ...
+    def wait(self) -> int: ...
+    def communicate(self, input: Optional[AnyStr] = ...) -> Tuple[Optional[bytes], Optional[bytes]]: ...
+    def send_signal(self, signal: int) -> None: ...
+    def terminate(self) -> None: ...
+    def kill(self) -> None: ...
+    def __enter__(self) -> 'Popen': ...
+    def __exit__(self, type, value, traceback) -> bool: ...
+
+def getstatusoutput(cmd: str) -> Tuple[int, str]: ...
+def getoutput(cmd: str) -> str: ...
+
+# Windows-only: STARTUPINFO etc.
+
+STD_INPUT_HANDLE = ...  # type: Any
+STD_OUTPUT_HANDLE = ...  # type: Any
+STD_ERROR_HANDLE = ...  # type: Any
+SW_HIDE = ...  # type: Any
+STARTF_USESTDHANDLES = ...  # type: Any
+STARTF_USESHOWWINDOW = ...  # type: Any
+CREATE_NEW_CONSOLE = ...  # type: Any
+CREATE_NEW_PROCESS_GROUP = ...  # type: Any
diff --git a/typeshed/stdlib/2/sys.pyi b/typeshed/stdlib/2/sys.pyi
new file mode 100644
index 0000000..cb9172a
--- /dev/null
+++ b/typeshed/stdlib/2/sys.pyi
@@ -0,0 +1,137 @@
+"""Stubs for the 'sys' module."""
+
+from typing import (
+    IO, Union, List, Sequence, Any, Dict, Tuple, BinaryIO, Optional, Callable,
+    overload, Type,
+)
+from types import FrameType, ModuleType, TracebackType, ClassType
+from mypy_extensions import NoReturn
+
+class _flags:
+    bytes_warning = ...  # type: int
+    debug = ...  # type: int
+    division_new = ...  # type: int
+    division_warning = ...  # type: int
+    dont_write_bytecode = ...  # type: int
+    hash_randomization = ...  # type: int
+    ignore_environment = ...  # type: int
+    inspect = ...  # type: int
+    interactive = ...  # type: int
+    no_site = ...  # type: int
+    no_user_site = ...  # type: int
+    optimize = ...  # type: int
+    py3k_warning = ...  # type: int
+    tabcheck = ...  # type: int
+    unicode = ...  # type: int
+    verbose = ...  # type: int
+
+class _float_info:
+    max = ...  # type: float
+    max_exp = ...  # type: int
+    max_10_exp = ...  # type: int
+    min = ...  # type: float
+    min_exp = ...  # type: int
+    min_10_exp = ...  # type: int
+    dig = ...  # type: int
+    mant_dig = ...  # type: int
+    epsilon = ...  # type: float
+    radix = ...  # type: int
+    rounds = ...  # type: int
+
+class _version_info(Tuple[int, int, int, str, int]):
+    major = 0
+    minor = 0
+    micro = 0
+    releaselevel = ...  # type: str
+    serial = 0
+
+_mercurial = ...  # type: Tuple[str, str, str]
+api_version = ...  # type: int
+argv = ...  # type: List[str]
+builtin_module_names = ...  # type: Tuple[str, ...]
+byteorder = ...  # type: str
+copyright = ...  # type: str
+dont_write_bytecode = ...  # type: bool
+exec_prefix = ...  # type: str
+executable = ...  # type: str
+flags = ...  # type: _flags
+float_repr_style = ...  # type: str
+hexversion = ...  # type: int
+long_info = ...  # type: object
+maxint = ...  # type: int
+maxsize = ...  # type: int
+maxunicode = ...  # type: int
+modules = ...  # type: Dict[str, ModuleType]
+path = ...  # type: List[str]
+platform = ...  # type: str
+prefix = ...  # type: str
+py3kwarning = ...  # type: bool
+__stderr__ = ...  # type: IO[str]
+__stdin__ = ...  # type: IO[str]
+__stdout__ = ...  # type: IO[str]
+stderr = ...  # type: IO[str]
+stdin = ...  # type: IO[str]
+stdout = ...  # type: IO[str]
+subversion = ...  # type: Tuple[str, str, str]
+version = ...  # type: str
+warnoptions = ...  # type: object
+float_info = ...  # type: _float_info
+version_info = ...  # type: _version_info
+ps1 = ...  # type: str
+ps2 = ...  # type: str
+last_type = ...  # type: type
+last_value = ...  # type: BaseException
+last_traceback = ...  # type: TracebackType
+# TODO precise types
+meta_path = ...  # type: List[Any]
+path_hooks = ...  # type: List[Any]
+path_importer_cache = ...  # type: Dict[str, Any]
+displayhook = ...  # type: Optional[Callable[[int], None]]
+excepthook = ...  # type: Optional[Callable[[type, BaseException, TracebackType], None]]
+exc_type = ...  # type: Optional[type]
+exc_value = ...  # type: Union[BaseException, ClassType]
+exc_traceback = ...  # type: TracebackType
+
+class _WindowsVersionType:
+    major = ...  # type: Any
+    minor = ...  # type: Any
+    build = ...  # type: Any
+    platform = ...  # type: Any
+    service_pack = ...  # type: Any
+    service_pack_major = ...  # type: Any
+    service_pack_minor = ...  # type: Any
+    suite_mask = ...  # type: Any
+    product_type = ...  # type: Any
+
+def getwindowsversion() -> _WindowsVersionType: ...
+
+def _clear_type_cache() -> None: ...
+def _current_frames() -> Dict[int, FrameType]: ...
+def _getframe(depth: int = ...) -> FrameType: ...
+def call_tracing(fn: Any, args: Any) -> Any: ...
+def __displayhook__(value: int) -> None: ...
+def __excepthook__(type_: type, value: BaseException, traceback: TracebackType) -> None: ...
+def exc_clear() -> None:
+    raise DeprecationWarning()
+# TODO should be a union of tuple, see mypy#1178
+def exc_info() -> Tuple[Optional[Type[BaseException]],
+                        Optional[BaseException],
+                        Optional[TracebackType]]: ...
+
+# sys.exit() accepts an optional argument of anything printable
+def exit(arg: Any = ...) -> NoReturn:
+    raise SystemExit()
+def getcheckinterval() -> int: ...  # deprecated
+def getdefaultencoding() -> str: ...
+def getdlopenflags() -> int: ...
+def getfilesystemencoding() -> Union[str, None]: ...
+def getrefcount(arg: Any) -> int: ...
+def getrecursionlimit() -> int: ...
+def getsizeof(obj: object, default: int = ...) -> int: ...
+def getprofile() -> None: ...
+def gettrace() -> None: ...
+def setcheckinterval(interval: int) -> None: ...  # deprecated
+def setdlopenflags(n: int) -> None: ...
+def setprofile(profilefunc: Any) -> None: ...  # TODO type
+def setrecursionlimit(limit: int) -> None: ...
+def settrace(tracefunc: Any) -> None: ...  # TODO type
diff --git a/typeshed/stdlib/2/syslog.pyi b/typeshed/stdlib/2/syslog.pyi
new file mode 100644
index 0000000..82e0b9a
--- /dev/null
+++ b/typeshed/stdlib/2/syslog.pyi
@@ -0,0 +1,38 @@
+LOG_ALERT = ...  # type: int
+LOG_AUTH = ...  # type: int
+LOG_CONS = ...  # type: int
+LOG_CRIT = ...  # type: int
+LOG_CRON = ...  # type: int
+LOG_DAEMON = ...  # type: int
+LOG_DEBUG = ...  # type: int
+LOG_EMERG = ...  # type: int
+LOG_ERR = ...  # type: int
+LOG_INFO = ...  # type: int
+LOG_KERN = ...  # type: int
+LOG_LOCAL0 = ...  # type: int
+LOG_LOCAL1 = ...  # type: int
+LOG_LOCAL2 = ...  # type: int
+LOG_LOCAL3 = ...  # type: int
+LOG_LOCAL4 = ...  # type: int
+LOG_LOCAL5 = ...  # type: int
+LOG_LOCAL6 = ...  # type: int
+LOG_LOCAL7 = ...  # type: int
+LOG_LPR = ...  # type: int
+LOG_MAIL = ...  # type: int
+LOG_NDELAY = ...  # type: int
+LOG_NEWS = ...  # type: int
+LOG_NOTICE = ...  # type: int
+LOG_NOWAIT = ...  # type: int
+LOG_PERROR = ...  # type: int
+LOG_PID = ...  # type: int
+LOG_SYSLOG = ...  # type: int
+LOG_USER = ...  # type: int
+LOG_UUCP = ...  # type: int
+LOG_WARNING = ...  # type: int
+
+def LOG_MASK(a: int) -> int: ...
+def LOG_UPTO(a: int) -> int: ...
+def closelog() -> None: ...
+def openlog(ident: str = ..., logoption: int = ..., facility: int = ...) -> None: ...
+def setlogmask(x: int) -> int: ...
+def syslog(priority: int, message: str) -> None: ...
diff --git a/typeshed/stdlib/2/tempfile.pyi b/typeshed/stdlib/2/tempfile.pyi
new file mode 100644
index 0000000..d718bd7
--- /dev/null
+++ b/typeshed/stdlib/2/tempfile.pyi
@@ -0,0 +1,104 @@
+# Stubs for tempfile
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http: //docs.python.org/3.3/library/tempfile.html
+# Adapted for Python 2.7 by Michal Pokorny
+
+# TODO: Don't use basestring. Use Union[str, bytes] or AnyStr for arguments.
+#       Avoid using Union[str, bytes] for return values, as it implies that
+#       an isinstance() check will often be required, which is inconvenient.
+
+from typing import Tuple, IO, Union, AnyStr, Any, overload, Iterator, List, Type, Optional
+
+import thread
+import random
+
+TMP_MAX = ...  # type: int
+tempdir = ...  # type: str
+template = ...  # type: str
+_name_sequence = ...  # type: Optional[_RandomNameSequence]
+
+class _RandomNameSequence:
+    _rng = ...  # type: random.Random
+    _rng_pid = ...  # type: int
+    characters = ...  # type: str
+    mutex = ...  # type: thread.LockType
+    rng = ...  # type: random.Random
+    def __iter__(self) -> "_RandomNameSequence": ...
+    def next(self) -> str: ...
+    # from os.path:
+    def normcase(self, path: AnyStr) -> AnyStr: ...
+
+class _TemporaryFileWrapper(IO[str]):
+    close_called = ...  # type: bool
+    delete = ...  # type: bool
+    file = ...  # type: IO
+    name = ...  # type: Any
+    def __init__(self, file: IO, name, delete: bool = ...) -> None: ...
+    def __del__(self) -> None: ...
+    def __enter__(self) -> "_TemporaryFileWrapper": ...
+    def __exit__(self, exc, value, tb) -> bool: ...
+    def __getattr__(self, name: unicode) -> Any: ...
+    def close(self) -> None: ...
+    def unlink(self, path: unicode) -> None: ...
+
+# TODO text files
+
+def TemporaryFile(
+    mode: Union[bytes, unicode] = ...,
+    bufsize: int = ...,
+    suffix: Union[bytes, unicode] = ...,
+    prefix: Union[bytes, unicode] = ...,
+    dir: Union[bytes, unicode] = ...
+) -> _TemporaryFileWrapper:
+    ...
+
+def NamedTemporaryFile(
+    mode: Union[bytes, unicode] = ...,
+    bufsize: int = ...,
+    suffix: Union[bytes, unicode] = ...,
+    prefix: Union[bytes, unicode] = ...,
+    dir: Union[bytes, unicode] = ...,
+    delete: bool = ...
+) -> _TemporaryFileWrapper:
+    ...
+
+def SpooledTemporaryFile(
+    max_size: int = ...,
+    mode: Union[bytes, unicode] = ...,
+    buffering: int = ...,
+    suffix: Union[bytes, unicode] = ...,
+    prefix: Union[bytes, unicode] = ...,
+    dir: Union[bytes, unicode] = ...
+) -> _TemporaryFileWrapper:
+    ...
+
+class TemporaryDirectory:
+    name = ...  # type: Any  # Can be str or unicode
+    def __init__(self,
+                 suffix: Union[bytes, unicode] = ...,
+                 prefix: Union[bytes, unicode] = ...,
+                 dir: Union[bytes, unicode] = ...) -> None: ...
+    def cleanup(self) -> None: ...
+    def __enter__(self) -> Any: ...  # Can be str or unicode
+    def __exit__(self, type, value, traceback) -> bool: ...
+
+ at overload
+def mkstemp() -> Tuple[int, str]: ...
+ at overload
+def mkstemp(suffix: AnyStr = ..., prefix: AnyStr = ..., dir: AnyStr = ...,
+            text: bool = ...) -> Tuple[int, AnyStr]: ...
+ at overload
+def mkdtemp() -> str: ...
+ at overload
+def mkdtemp(suffix: AnyStr = ..., prefix: AnyStr = ..., dir: AnyStr = ...) -> AnyStr: ...
+ at overload
+def mktemp() -> str: ...
+ at overload
+def mktemp(suffix: AnyStr = ..., prefix: AnyStr = ..., dir: AnyStr = ...) -> AnyStr: ...
+def gettempdir() -> str: ...
+def gettempprefix() -> str: ...
+
+def _candidate_tempdir_list() -> List[str]: ...
+def _get_candidate_names() -> Optional[_RandomNameSequence]: ...
+def _get_default_tempdir() -> str: ...
diff --git a/typeshed/stdlib/2/textwrap.pyi b/typeshed/stdlib/2/textwrap.pyi
new file mode 100644
index 0000000..7d1a6d3
--- /dev/null
+++ b/typeshed/stdlib/2/textwrap.pyi
@@ -0,0 +1,33 @@
+# Stubs for textwrap (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _unicode: ...
+
+class TextWrapper:
+    whitespace_trans = ...  # type: Any
+    unicode_whitespace_trans = ...  # type: Any
+    uspace = ...  # type: Any
+    wordsep_re = ...  # type: Any
+    wordsep_simple_re = ...  # type: Any
+    sentence_end_re = ...  # type: Any
+    width = ...  # type: Any
+    initial_indent = ...  # type: Any
+    subsequent_indent = ...  # type: Any
+    expand_tabs = ...  # type: Any
+    replace_whitespace = ...  # type: Any
+    fix_sentence_endings = ...  # type: Any
+    break_long_words = ...  # type: Any
+    drop_whitespace = ...  # type: Any
+    break_on_hyphens = ...  # type: Any
+    wordsep_re_uni = ...  # type: Any
+    wordsep_simple_re_uni = ...  # type: Any
+    def __init__(self, width=..., initial_indent=..., subsequent_indent=..., expand_tabs=..., replace_whitespace=..., fix_sentence_endings=..., break_long_words=..., drop_whitespace=..., break_on_hyphens=...) -> None: ...
+    def wrap(self, text): ...
+    def fill(self, text): ...
+
+def wrap(text, width=..., **kwargs): ...
+def fill(text, width=..., **kwargs): ...
+def dedent(text): ...
diff --git a/typeshed/stdlib/2/thread.pyi b/typeshed/stdlib/2/thread.pyi
new file mode 100644
index 0000000..a54a946
--- /dev/null
+++ b/typeshed/stdlib/2/thread.pyi
@@ -0,0 +1,33 @@
+"""Stubs for the "thread" module."""
+from typing import Callable, Any
+
+def _count() -> int: ...
+
+class error(Exception): ...
+
+class LockType:
+    def acquire(self, waitflag: int = ...) -> bool: ...
+    def acquire_lock(self, waitflag: int = ...) -> bool: ...
+    def release(self) -> None: ...
+    def release_lock(self) -> None: ...
+    def locked(self) -> bool: ...
+    def locked_lock(self) -> bool: ...
+    def __enter__(self) -> LockType: ...
+    def __exit__(self, value: Any, traceback: Any) -> None: ...
+
+class _local(object):
+    pass
+
+class _localdummy(object):
+    pass
+
+def start_new(function: Callable[..., Any], args: Any, kwargs: Any = ...) -> int: ...
+def start_new_thread(function: Callable[..., Any], args: Any, kwargs: Any = ...) -> int: ...
+def interrupt_main() -> None: ...
+def exit() -> None:
+    raise SystemExit()
+def exit_thread() -> Any:
+    raise SystemExit()
+def allocate_lock() -> LockType: ...
+def get_ident() -> int: ...
+def stack_size(size: int = ...) -> int: ...
diff --git a/typeshed/stdlib/2/time.pyi b/typeshed/stdlib/2/time.pyi
new file mode 100644
index 0000000..6bea209
--- /dev/null
+++ b/typeshed/stdlib/2/time.pyi
@@ -0,0 +1,51 @@
+"""Stub file for the 'time' module."""
+# See https://docs.python.org/2/library/time.html
+
+from typing import NamedTuple, Tuple, Union, Any, Optional
+
+# ----- variables and constants -----
+accept2dyear = False
+altzone = 0
+daylight = 0
+timezone = 0
+tzname = ...  # type: Tuple[str, str]
+
+class struct_time(NamedTuple('_struct_time',
+                             [('tm_year', int), ('tm_mon', int), ('tm_mday', int),
+                              ('tm_hour', int), ('tm_min', int), ('tm_sec', int),
+                              ('tm_wday', int), ('tm_yday', int), ('tm_isdst', int)])):
+    def __init__(self, o: Tuple[int, int, int,
+                                int, int, int,
+                                int, int, int], _arg: Any = ...) -> None: ...
+
+_TIME_TUPLE = Tuple[int, int, int, int, int, int, int, int, int]
+
+def asctime(t: struct_time = ...) -> str:
+    raise ValueError()
+
+def clock() -> float: ...
+
+def ctime(secs: Optional[float] = ...) -> str:
+    raise ValueError()
+
+def gmtime(secs: Optional[float] = ...) -> struct_time: ...
+
+def localtime(secs: Optional[float] = ...) -> struct_time: ...
+
+def mktime(t: struct_time) -> float:
+    raise OverflowError()
+    raise ValueError()
+
+def sleep(secs: float) -> None: ...
+
+def strftime(format: str, t: struct_time = ...) -> str:
+    raise MemoryError()
+    raise ValueError()
+
+def strptime(string: str, format: str = ...) -> struct_time:
+    raise ValueError()
+
+def time() -> float:
+    raise IOError()
+
+def tzset() -> None: ...
diff --git a/typeshed/stdlib/2/token.pyi b/typeshed/stdlib/2/token.pyi
new file mode 100644
index 0000000..1c14dc4
--- /dev/null
+++ b/typeshed/stdlib/2/token.pyi
@@ -0,0 +1,62 @@
+from typing import Dict
+
+ENDMARKER = 0
+NAME = 0
+NUMBER = 0
+STRING = 0
+NEWLINE = 0
+INDENT = 0
+DEDENT = 0
+LPAR = 0
+RPAR = 0
+LSQB = 0
+RSQB = 0
+COLON = 0
+COMMA = 0
+SEMI = 0
+PLUS = 0
+MINUS = 0
+STAR = 0
+SLASH = 0
+VBAR = 0
+AMPER = 0
+LESS = 0
+GREATER = 0
+EQUAL = 0
+DOT = 0
+PERCENT = 0
+BACKQUOTE = 0
+LBRACE = 0
+RBRACE = 0
+EQEQUAL = 0
+NOTEQUAL = 0
+LESSEQUAL = 0
+GREATEREQUAL = 0
+TILDE = 0
+CIRCUMFLEX = 0
+LEFTSHIFT = 0
+RIGHTSHIFT = 0
+DOUBLESTAR = 0
+PLUSEQUAL = 0
+MINEQUAL = 0
+STAREQUAL = 0
+SLASHEQUAL = 0
+PERCENTEQUAL = 0
+AMPEREQUAL = 0
+VBAREQUAL = 0
+CIRCUMFLEXEQUAL = 0
+LEFTSHIFTEQUAL = 0
+RIGHTSHIFTEQUAL = 0
+DOUBLESTAREQUAL = 0
+DOUBLESLASH = 0
+DOUBLESLASHEQUAL = 0
+AT = 0
+OP = 0
+ERRORTOKEN = 0
+N_TOKENS = 0
+NT_OFFSET = 0
+tok_name = ...  # type: Dict[int, str]
+
+def ISTERMINAL(x) -> bool: ...
+def ISNONTERMINAL(x) -> bool: ...
+def ISEOF(x) -> bool: ...
diff --git a/typeshed/stdlib/2/tokenize.pyi b/typeshed/stdlib/2/tokenize.pyi
new file mode 100644
index 0000000..159adf9
--- /dev/null
+++ b/typeshed/stdlib/2/tokenize.pyi
@@ -0,0 +1,143 @@
+# Automatically generated by pytype, manually fixed up. May still contain errors.
+
+from typing import Any, Callable, Dict, Generator, Iterator, List, Tuple, Union, Iterable
+
+__all__ = ...  # type: List[str]
+__author__ = ...  # type: str
+__credits__ = ...  # type: str
+
+AMPER = ...  # type: int
+AMPEREQUAL = ...  # type: int
+AT = ...  # type: int
+BACKQUOTE = ...  # type: int
+Binnumber = ...  # type: str
+Bracket = ...  # type: str
+CIRCUMFLEX = ...  # type: int
+CIRCUMFLEXEQUAL = ...  # type: int
+COLON = ...  # type: int
+COMMA = ...  # type: int
+COMMENT = ...  # type: int
+Comment = ...  # type: str
+ContStr = ...  # type: str
+DEDENT = ...  # type: int
+DOT = ...  # type: int
+DOUBLESLASH = ...  # type: int
+DOUBLESLASHEQUAL = ...  # type: int
+DOUBLESTAR = ...  # type: int
+DOUBLESTAREQUAL = ...  # type: int
+Decnumber = ...  # type: str
+Double = ...  # type: str
+Double3 = ...  # type: str
+ENDMARKER = ...  # type: int
+EQEQUAL = ...  # type: int
+EQUAL = ...  # type: int
+ERRORTOKEN = ...  # type: int
+Expfloat = ...  # type: str
+Exponent = ...  # type: str
+Floatnumber = ...  # type: str
+Funny = ...  # type: str
+GREATER = ...  # type: int
+GREATEREQUAL = ...  # type: int
+Hexnumber = ...  # type: str
+INDENT = ...  # type: int
+
+def ISEOF(x: int) -> bool: ...
+def ISNONTERMINAL(x: int) -> bool: ...
+def ISTERMINAL(x: int) -> bool: ...
+
+Ignore = ...  # type: str
+Imagnumber = ...  # type: str
+Intnumber = ...  # type: str
+LBRACE = ...  # type: int
+LEFTSHIFT = ...  # type: int
+LEFTSHIFTEQUAL = ...  # type: int
+LESS = ...  # type: int
+LESSEQUAL = ...  # type: int
+LPAR = ...  # type: int
+LSQB = ...  # type: int
+MINEQUAL = ...  # type: int
+MINUS = ...  # type: int
+NAME = ...  # type: int
+NEWLINE = ...  # type: int
+NL = ...  # type: int
+NOTEQUAL = ...  # type: int
+NT_OFFSET = ...  # type: int
+NUMBER = ...  # type: int
+N_TOKENS = ...  # type: int
+Name = ...  # type: str
+Number = ...  # type: str
+OP = ...  # type: int
+Octnumber = ...  # type: str
+Operator = ...  # type: str
+PERCENT = ...  # type: int
+PERCENTEQUAL = ...  # type: int
+PLUS = ...  # type: int
+PLUSEQUAL = ...  # type: int
+PlainToken = ...  # type: str
+Pointfloat = ...  # type: str
+PseudoExtras = ...  # type: str
+PseudoToken = ...  # type: str
+RBRACE = ...  # type: int
+RIGHTSHIFT = ...  # type: int
+RIGHTSHIFTEQUAL = ...  # type: int
+RPAR = ...  # type: int
+RSQB = ...  # type: int
+SEMI = ...  # type: int
+SLASH = ...  # type: int
+SLASHEQUAL = ...  # type: int
+STAR = ...  # type: int
+STAREQUAL = ...  # type: int
+STRING = ...  # type: int
+Single = ...  # type: str
+Single3 = ...  # type: str
+Special = ...  # type: str
+String = ...  # type: str
+TILDE = ...  # type: int
+Token = ...  # type: str
+Triple = ...  # type: str
+VBAR = ...  # type: int
+VBAREQUAL = ...  # type: int
+Whitespace = ...  # type: str
+chain = ...  # type: type
+double3prog = ...  # type: type
+endprogs = ...  # type: Dict[str, Any]
+pseudoprog = ...  # type: type
+re = ...  # type: module
+single3prog = ...  # type: type
+single_quoted = ...  # type: Dict[str, str]
+string = ...  # type: module
+sys = ...  # type: module
+t = ...  # type: str
+tabsize = ...  # type: int
+tok_name = ...  # type: Dict[int, str]
+token = ...  # type: module
+tokenprog = ...  # type: type
+triple_quoted = ...  # type: Dict[str, str]
+x = ...  # type: str
+
+_Pos = Tuple[int, int]
+_TokenType = Tuple[int, str, _Pos, _Pos, str]
+
+def any(*args, **kwargs) -> str: ...
+def generate_tokens(readline: Callable[[], str]) -> Generator[_TokenType, None, None]: ...
+def group(*args: str) -> str: ...
+def maybe(*args: str) -> str: ...
+def printtoken(type: int, token: str, srow_scol: _Pos, erow_ecol: _Pos, line: str) -> None: ...
+def tokenize(readline: Callable[[], str], tokeneater: Callable[[Tuple[int, str, _Pos, _Pos, str]], None]) -> None: ...
+def tokenize_loop(readline: Callable[[], str], tokeneater: Callable[[Tuple[int, str, _Pos, _Pos, str]], None]) -> None: ...
+def untokenize(iterable: Iterable[_TokenType]) -> str: ...
+
+class StopTokenizing(Exception):
+    pass
+
+class TokenError(Exception):
+    pass
+
+class Untokenizer:
+    prev_col = ...  # type: int
+    prev_row = ...  # type: int
+    tokens = ...  # type: List[str]
+    def __init__(self) -> None: ...
+    def add_whitespace(self, _Pos) -> None: ...
+    def compat(self, token: Tuple[int, Any], iterable: Iterator[_TokenType]) -> None: ...
+    def untokenize(self, iterable: Iterable[_TokenType]) -> str: ...
diff --git a/typeshed/stdlib/2/types.pyi b/typeshed/stdlib/2/types.pyi
new file mode 100644
index 0000000..2f3b935
--- /dev/null
+++ b/typeshed/stdlib/2/types.pyi
@@ -0,0 +1,161 @@
+# Stubs for types
+# Note, all classes "defined" here require special handling.
+
+from typing import (
+    Any, Callable, Dict, Iterable, Iterator, List, Optional,
+    Tuple, TypeVar, Union, overload,
+)
+
+_T = TypeVar('_T')
+
+class NoneType: ...
+TypeType = type
+ObjectType = object
+
+IntType = int
+LongType = long
+FloatType = float
+BooleanType = bool
+ComplexType = complex
+StringType = str
+UnicodeType = unicode
+StringTypes = (StringType, UnicodeType)
+BufferType = buffer
+TupleType = tuple
+ListType = list
+DictType = DictionaryType = dict
+
+class _Cell:
+    cell_contents = ...  # type: Any
+
+class FunctionType:
+    func_closure = ...  # type: Optional[Tuple[_Cell, ...]]
+    func_code = ...  # type: CodeType
+    func_defaults = ...  # type: Optional[Tuple[Any, ...]]
+    func_dict = ...  # type: Dict[str, Any]
+    func_doc = ...  # type: Optional[str]
+    func_globals = ...  # type: Dict[str, Any]
+    func_name = ...  # type: str
+    __closure__ = func_closure
+    __code__ = func_code
+    __defaults__ = func_defaults
+    __dict__ = func_dict
+    __globals__ = func_globals
+    __name__ = func_name
+    def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+    def __get__(self, obj: Optional[object], type: Optional[type]) -> 'UnboundMethodType': ...
+
+LambdaType = FunctionType
+
+class CodeType:
+    co_argcount = ...  # type: int
+    co_cellvars = ...  # type: Tuple[str, ...]
+    co_code = ...  # type: str
+    co_consts = ...  # type: Tuple[Any, ...]
+    co_filename = ...  # type: Optional[str]
+    co_firstlineno = ...  # type: int
+    co_flags = ...  # type: int
+    co_freevars = ...  # type: Tuple[str, ...]
+    co_lnotab = ...  # type: str
+    co_name = ...  # type: str
+    co_names = ...  # type: Tuple[str, ...]
+    co_nlocals = ...  # type: int
+    co_stacksize = ...  # type: int
+    co_varnames = ...  # type: Tuple[str, ...]
+
+class GeneratorType:
+    gi_code = ...  # type: CodeType
+    gi_frame = ...  # type: FrameType
+    gi_running = ...  # type: int
+    def __iter__(self) -> 'GeneratorType': ...
+    def close(self) -> None: ...
+    def next(self) -> Any: ...
+    def send(self, arg: Any) -> Any: ...
+    @overload
+    def throw(self, val: BaseException) -> Any: ...
+    @overload
+    def throw(self, typ: type, val: BaseException = ..., tb: 'TracebackType' = ...) -> Any: ...
+
+class ClassType: ...
+class UnboundMethodType:
+    im_class = ...  # type: type
+    im_func = ...  # type: FunctionType
+    im_self = ...  # type: Optional[object]
+    __func__ = im_func
+    __self__ = im_self
+    def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+class InstanceType: ...
+MethodType = UnboundMethodType
+
+class BuiltinFunctionType:
+    __self__ = ...  # type: Optional[object]
+    def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+BuiltinMethodType = BuiltinFunctionType
+
+class ModuleType:
+    __doc__ = ...  # type: Optional[str]
+    __file__ = ...  # type: Optional[str]
+    __name__ = ...  # type: str
+    __package__ = ...  # type: Optional[str]
+    __path__ = ...  # type: Optional[Iterable[str]]
+    def __init__(self, name: str, doc: str) -> None: ...
+FileType = file
+XRangeType = xrange
+
+class TracebackType:
+    tb_frame = ...  # type: FrameType
+    tb_lasti = ...  # type: int
+    tb_lineno = ...  # type: int
+    tb_next = ...  # type: TracebackType
+
+class FrameType:
+    f_back = ...  # type: FrameType
+    f_builtins = ...  # type: Dict[str, Any]
+    f_code = ...  # type: CodeType
+    f_exc_type = ...  # type: None
+    f_exc_value = ...  # type: None
+    f_exc_traceback = ...  # type: None
+    f_globals = ...  # type: Dict[str, Any]
+    f_lasti = ...  # type: int
+    f_lineno = ...  # type: int
+    f_locals = ...  # type: Dict[str, Any]
+    f_restricted = ...  # type: bool
+    f_trace = ...  # type: Callable[[], None]
+
+    def clear(self) -> None: pass
+
+SliceType = slice
+class EllipsisType: ...
+
+class DictProxyType:
+    # TODO is it possible to have non-string keys?
+    # no __init__
+    def copy(self) -> dict: ...
+    def get(self, key: str, default: _T = ...) -> Union[Any, _T]: ...
+    def has_key(self, key: str) -> bool: ...
+    def items(self) -> List[Tuple[str, Any]]: ...
+    def iteritems(self) -> Iterator[Tuple[str, Any]]: ...
+    def iterkeys(self) -> Iterator[str]: ...
+    def itervalues(self) -> Iterator[Any]: ...
+    def keys(self) -> List[str]: ...
+    def values(self) -> List[Any]: ...
+    def __contains__(self, key: str) -> bool: ...
+    def __getitem__(self, key: str) -> Any: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def __len__(self) -> int: ...
+
+class NotImplementedType: ...
+
+class GetSetDescriptorType:
+    __name__ = ...  # type: str
+    __objclass__ = ...  # type: type
+    def __get__(self, obj: Any, type: type = ...) -> Any: ...
+    def __set__(self, obj: Any) -> None: ...
+    def __delete__(self, obj: Any) -> None: ...
+# Same type on Jython, different on CPython and PyPy, unknown on IronPython.
+class MemberDescriptorType:
+    __name__ = ...  # type: str
+    __objclass__ = ...  # type: type
+    def __get__(self, obj: Any, type: type = ...) -> Any: ...
+    def __set__(self, obj: Any) -> None: ...
+    def __delete__(self, obj: Any) -> None: ...
diff --git a/typeshed/stdlib/2/typing.pyi b/typeshed/stdlib/2/typing.pyi
new file mode 100644
index 0000000..035f36e
--- /dev/null
+++ b/typeshed/stdlib/2/typing.pyi
@@ -0,0 +1,360 @@
+# Stubs for typing (Python 2.7)
+
+from abc import abstractmethod, ABCMeta
+
+# Definitions of special type checking related constructs.  Their definition
+# are not used, so their value does not matter.
+
+overload = object()
+Any = object()
+TypeVar = object()
+Generic = object()
+Tuple = object()
+Callable = object()
+Type = object()
+_promote = object()
+
+class GenericMeta(type): ...
+
+# Type aliases
+
+class TypeAlias:
+    # Class for defining generic aliases for library types.
+    def __init__(self, target_type: type) -> None: ...
+    def __getitem__(self, typeargs: Any) -> Any: ...
+
+Union = TypeAlias(object)
+Optional = TypeAlias(object)
+List = TypeAlias(object)
+Dict = TypeAlias(object)
+DefaultDict = TypeAlias(object)
+Set = TypeAlias(object)
+
+# Predefined type variables.
+AnyStr = TypeVar('AnyStr', str, unicode)
+
+# Abstract base classes.
+
+# These type variables are used by the container types.
+_T = TypeVar('_T')
+_S = TypeVar('_S')
+_KT = TypeVar('_KT')  # Key type.
+_VT = TypeVar('_VT')  # Value type.
+_T_co = TypeVar('_T_co', covariant=True)  # Any type covariant containers.
+_V_co = TypeVar('_V_co', covariant=True)  # Any type covariant containers.
+_KT_co = TypeVar('_KT_co', covariant=True)  # Key type covariant containers.
+_VT_co = TypeVar('_VT_co', covariant=True)  # Value type covariant containers.
+_T_contra = TypeVar('_T_contra', contravariant=True)  # Ditto contravariant.
+
+class SupportsInt(metaclass=ABCMeta):
+    @abstractmethod
+    def __int__(self) -> int: ...
+
+class SupportsFloat(metaclass=ABCMeta):
+    @abstractmethod
+    def __float__(self) -> float: ...
+
+class SupportsAbs(Generic[_T]):
+    @abstractmethod
+    def __abs__(self) -> _T: ...
+
+class SupportsRound(Generic[_T]):
+    @abstractmethod
+    def __round__(self, ndigits: int = ...) -> _T: ...
+
+class Reversible(Generic[_T_co]):
+    @abstractmethod
+    def __reversed__(self) -> Iterator[_T_co]: ...
+
+class Sized(metaclass=ABCMeta):
+    @abstractmethod
+    def __len__(self) -> int: ...
+
+class Iterable(Generic[_T_co]):
+    @abstractmethod
+    def __iter__(self) -> Iterator[_T_co]: ...
+
+class Iterator(Iterable[_T_co], Generic[_T_co]):
+    @abstractmethod
+    def next(self) -> _T_co: ...
+
+class Generator(Iterator[_T_co], Generic[_T_co, _T_contra, _V_co]):
+    @abstractmethod
+    def next(self) -> _T_co: ...
+
+    @abstractmethod
+    def send(self, value: _T_contra) -> _T_co: ...
+
+    @abstractmethod
+    def throw(self, typ: BaseException, val: Any = None, tb: Any = None) -> None: ...
+
+    @abstractmethod
+    def close(self) -> None: ...
+
+class Container(Generic[_T_co]):
+    @abstractmethod
+    def __contains__(self, x: object) -> bool: ...
+
+class Sequence(Iterable[_T_co], Container[_T_co], Sized, Reversible[_T_co], Generic[_T_co]):
+    @overload
+    @abstractmethod
+    def __getitem__(self, i: int) -> _T_co: ...
+    @overload
+    @abstractmethod
+    def __getitem__(self, s: slice) -> Sequence[_T_co]: ...
+    # Mixin methods
+    def index(self, x: Any) -> int: ...
+    def count(self, x: Any) -> int: ...
+    def __contains__(self, x: object) -> bool: ...
+    def __iter__(self) -> Iterator[_T_co]: ...
+    def __reversed__(self) -> Iterator[_T_co]: ...
+
+class MutableSequence(Sequence[_T], Generic[_T]):
+    @abstractmethod
+    def insert(self, index: int, object: _T) -> None: ...
+    @overload
+    @abstractmethod
+    def __setitem__(self, i: int, o: _T) -> None: ...
+    @overload
+    @abstractmethod
+    def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
+    @abstractmethod
+    def __delitem__(self, i: Union[int, slice]) -> None: ...
+    # Mixin methods
+    def append(self, object: _T) -> None: ...
+    def extend(self, iterable: Iterable[_T]) -> None: ...
+    def reverse(self) -> None: ...
+    def pop(self, index: int = ...) -> _T: ...
+    def remove(self, object: _T) -> None: ...
+    def __iadd__(self, x: Iterable[_T]) -> MutableSequence[_T]: ...
+
+class AbstractSet(Sized, Iterable[_T_co], Container[_T_co], Generic[_T_co]):
+    @abstractmethod
+    def __contains__(self, x: object) -> bool: ...
+    # Mixin methods
+    def __le__(self, s: AbstractSet[Any]) -> bool: ...
+    def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+    def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+    def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+    def __and__(self, s: AbstractSet[Any]) -> AbstractSet[_T_co]: ...
+    def __or__(self, s: AbstractSet[_T]) -> AbstractSet[Union[_T_co, _T]]: ...
+    def __sub__(self, s: AbstractSet[Any]) -> AbstractSet[_T_co]: ...
+    def __xor__(self, s: AbstractSet[_T]) -> AbstractSet[Union[_T_co, _T]]: ...
+    # TODO: argument can be any container?
+    def isdisjoint(self, s: AbstractSet[Any]) -> bool: ...
+
+class FrozenSet(AbstractSet[_T_co], Generic[_T_co]): ...
+
+class MutableSet(AbstractSet[_T], Generic[_T]):
+    @abstractmethod
+    def add(self, x: _T) -> None: ...
+    @abstractmethod
+    def discard(self, x: _T) -> None: ...
+    # Mixin methods
+    def clear(self) -> None: ...
+    def pop(self) -> _T: ...
+    def remove(self, element: _T) -> None: ...
+    def __ior__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
+    def __iand__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...
+    def __ixor__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
+    def __isub__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...
+
+class MappingView(Sized):
+    def __len__(self) -> int: ...
+
+class ItemsView(AbstractSet[Tuple[_KT_co, _VT_co]], MappingView, Generic[_KT_co, _VT_co]):
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[Tuple[_KT_co, _VT_co]]: ...
+
+class KeysView(AbstractSet[_KT_co], MappingView, Generic[_KT_co]):
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_KT_co]: ...
+
+class ValuesView(MappingView, Iterable[_VT_co], Generic[_VT_co]):
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_VT_co]: ...
+
+class Mapping(Sized, Iterable[_KT], Container[_KT], Generic[_KT, _VT_co]):
+    # TODO: We wish the key type could also be covariant, but that doesn't work,
+    # see discussion in https: //github.com/python/typing/pull/273.
+    @abstractmethod
+    def __getitem__(self, k: _KT) -> _VT_co:
+        ...
+    # Mixin methods
+    def get(self, k: _KT, default: _VT_co = ...) -> _VT_co:  # type: ignore
+        ...
+    def keys(self) -> list[_KT]: ...
+    def values(self) -> list[_VT_co]: ...
+    def items(self) -> list[Tuple[_KT, _VT_co]]: ...
+    def iterkeys(self) -> Iterator[_KT]: ...
+    def itervalues(self) -> Iterator[_VT_co]: ...
+    def iteritems(self) -> Iterator[Tuple[_KT, _VT_co]]: ...
+    def __contains__(self, o: object) -> bool: ...
+
+class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
+    @abstractmethod
+    def __setitem__(self, k: _KT, v: _VT) -> None: ...
+    @abstractmethod
+    def __delitem__(self, v: _KT) -> None: ...
+
+    def clear(self) -> None: ...
+    def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
+    def popitem(self) -> Tuple[_KT, _VT]: ...
+    def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
+    @overload
+    def update(self, m: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+    @overload
+    def update(self, m: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+
+Text = unicode
+
+TYPE_CHECKING = True
+
+class IO(Iterator[AnyStr], Generic[AnyStr]):
+    # TODO detach
+    # TODO use abstract properties
+    @property
+    def mode(self) -> str: ...
+    @property
+    def name(self) -> str: ...
+    @abstractmethod
+    def close(self) -> None: ...
+    @property
+    def closed(self) -> bool: ...
+    @abstractmethod
+    def fileno(self) -> int: ...
+    @abstractmethod
+    def flush(self) -> None: ...
+    @abstractmethod
+    def isatty(self) -> bool: ...
+    # TODO what if n is None?
+    @abstractmethod
+    def read(self, n: int = ...) -> AnyStr: ...
+    @abstractmethod
+    def readable(self) -> bool: ...
+    @abstractmethod
+    def readline(self, limit: int = ...) -> AnyStr: ...
+    @abstractmethod
+    def readlines(self, hint: int = ...) -> list[AnyStr]: ...
+    @abstractmethod
+    def seek(self, offset: int, whence: int = ...) -> None: ...
+    @abstractmethod
+    def seekable(self) -> bool: ...
+    @abstractmethod
+    def tell(self) -> int: ...
+    @abstractmethod
+    def truncate(self, size: int = ...) -> Optional[int]: ...
+    @abstractmethod
+    def writable(self) -> bool: ...
+    # TODO buffer objects
+    @abstractmethod
+    def write(self, s: AnyStr) -> None: ...
+    @abstractmethod
+    def writelines(self, lines: Iterable[AnyStr]) -> None: ...
+
+    @abstractmethod
+    def next(self) -> AnyStr: ...
+    @abstractmethod
+    def __iter__(self) -> Iterator[AnyStr]: ...
+    @abstractmethod
+    def __enter__(self) -> 'IO[AnyStr]': ...
+    @abstractmethod
+    def __exit__(self, t: Optional[Type[BaseException]], value: Optional[BaseException],
+                 # TODO: traceback should be TracebackType but that's defined in types
+                 traceback: Optional[Any]) -> bool: ...
+
+class BinaryIO(IO[str]):
+    # TODO readinto
+    # TODO read1?
+    # TODO peek?
+    @abstractmethod
+    def __enter__(self) -> BinaryIO: ...
+
+class TextIO(IO[unicode]):
+    # TODO use abstractproperty
+    @property
+    def buffer(self) -> BinaryIO: ...
+    @property
+    def encoding(self) -> str: ...
+    @property
+    def errors(self) -> Optional[str]: ...
+    @property
+    def line_buffering(self) -> bool: ...
+    @property
+    def newlines(self) -> Any: ...  # None, str or tuple
+    @abstractmethod
+    def __enter__(self) -> TextIO: ...
+
+class Match(Generic[AnyStr]):
+    pos = 0
+    endpos = 0
+    lastindex = 0
+    lastgroup = ...  # type: AnyStr
+    string = ...  # type: AnyStr
+
+    # The regular expression object whose match() or search() method produced
+    # this match instance.
+    re = ...  # type: 'Pattern[AnyStr]'
+
+    def expand(self, template: AnyStr) -> AnyStr: ...
+
+    @overload
+    def group(self, group1: int = ...) -> AnyStr: ...
+    @overload
+    def group(self, group1: str) -> AnyStr: ...
+    @overload
+    def group(self, group1: int, group2: int,
+              *groups: int) -> Sequence[AnyStr]: ...
+    @overload
+    def group(self, group1: str, group2: str,
+              *groups: str) -> Sequence[AnyStr]: ...
+
+    def groups(self, default: AnyStr = ...) -> Sequence[AnyStr]: ...
+    def groupdict(self, default: AnyStr = ...) -> dict[str, AnyStr]: ...
+    def start(self, group: Union[int, str] = ...) -> int: ...
+    def end(self, group: Union[int, str] = ...) -> int: ...
+    def span(self, group: Union[int, str] = ...) -> Tuple[int, int]: ...
+
+class Pattern(Generic[AnyStr]):
+    flags = 0
+    groupindex = 0
+    groups = 0
+    pattern = ...  # type: AnyStr
+
+    def search(self, string: AnyStr, pos: int = ...,
+               endpos: int = ...) -> Match[AnyStr]: ...
+    def match(self, string: AnyStr, pos: int = ...,
+              endpos: int = ...) -> Match[AnyStr]: ...
+    def split(self, string: AnyStr, maxsplit: int = ...) -> list[AnyStr]: ...
+    def findall(self, string: AnyStr, pos: int = ...,
+                endpos: int = ...) -> list[Any]: ...
+    def finditer(self, string: AnyStr, pos: int = ...,
+                 endpos: int = ...) -> Iterator[Match[AnyStr]]: ...
+
+    @overload
+    def sub(self, repl: AnyStr, string: AnyStr,
+            count: int = ...) -> AnyStr: ...
+    @overload
+    def sub(self, repl: Callable[[Match[AnyStr]], AnyStr], string: AnyStr,
+            count: int = ...) -> AnyStr: ...
+
+    @overload
+    def subn(self, repl: AnyStr, string: AnyStr,
+             count: int = ...) -> Tuple[AnyStr, int]: ...
+    @overload
+    def subn(self, repl: Callable[[Match[AnyStr]], AnyStr], string: AnyStr,
+             count: int = ...) -> Tuple[AnyStr, int]: ...
+
+# Functions
+
+def get_type_hints(obj: Callable) -> dict[str, Any]: ...
+
+def cast(tp: Type[_T], obj: Any) -> _T: ...
+
+# Type constructors
+
+# NamedTuple is special-cased in the type checker; the initializer is ignored.
+def NamedTuple(typename: str, fields: Iterable[Tuple[str, Any]], *,
+               verbose: bool = ..., rename: bool = ...) -> Type[tuple]: ...
+
+def NewType(name: str, tp: Type[_T]) -> Type[_T]: ...
diff --git a/typeshed/stdlib/2/unicodedata.pyi b/typeshed/stdlib/2/unicodedata.pyi
new file mode 100644
index 0000000..1faf16a
--- /dev/null
+++ b/typeshed/stdlib/2/unicodedata.pyi
@@ -0,0 +1,40 @@
+"""Stubs for the 'unicodedata' module."""
+
+from typing import Any, TypeVar, Union
+
+ucd_3_2_0 = ...  # type: UCD
+unidata_version = ...  # type: str
+# PyCapsule
+ucnhash_CAPI = ...  # type: Any
+
+_default = TypeVar("_default")
+
+def bidirectional(unichr: unicode) -> str: ...
+def category(unichr: unicode) -> str: ...
+def combining(unichr: unicode) -> int: ...
+def decimal(chr: unicode, default: _default = ...) -> Union[int, _default]: ...
+def decomposition(unichr: unicode) -> str: ...
+def digit(chr: unicode, default: _default = ...) -> Union[int, _default]: ...
+def east_asian_width(unichr: unicode) -> str: ...
+def lookup(name: str) -> unicode: ...
+def mirrored(unichr: unicode) -> int: ...
+def name(chr: unicode, default: _default = ...) -> Union[str, _default]: ...
+def normalize(form: str, unistr: unicode) -> unicode: ...
+def numeric(chr, default: _default = ...) -> Union[float, _default]: ...
+
+class UCD(object):
+    unidata_version = ...  # type: str
+    # The methods below are constructed from the same array in C
+    # (unicodedata_functions) and hence identical to the methods above.
+    def bidirectional(self, unichr: unicode) -> str: ...
+    def category(self, unichr: unicode) -> str: ...
+    def combining(self, unichr: unicode) -> int: ...
+    def decimal(self, chr: unicode, default: _default = ...) -> Union[int, _default]: ...
+    def decomposition(self, unichr: unicode) -> str: ...
+    def digit(self, chr: unicode, default: _default = ...) -> Union[int, _default]: ...
+    def east_asian_width(self, unichr: unicode) -> str: ...
+    def lookup(self, name: str) -> unicode: ...
+    def mirrored(self, unichr: unicode) -> int: ...
+    def name(self, chr: unicode, default: _default = ...) -> Union[str, _default]: ...
+    def normalize(self, form: str, unistr: unicode) -> unicode: ...
+    def numeric(self, chr: unicode, default: _default = ...) -> Union[float, _default]: ...
diff --git a/typeshed/stdlib/2/unittest.pyi b/typeshed/stdlib/2/unittest.pyi
new file mode 100644
index 0000000..ce06d35
--- /dev/null
+++ b/typeshed/stdlib/2/unittest.pyi
@@ -0,0 +1,176 @@
+# Stubs for unittest
+
+# Based on http://docs.python.org/2.7/library/unittest.html
+
+# Only a subset of functionality is included.
+
+from typing import (
+    Any, Callable, Dict, Iterable, Tuple, List, TextIO, Sequence,
+    overload, Set, TypeVar, Pattern
+)
+from abc import abstractmethod, ABCMeta
+
+_T = TypeVar('_T')
+_FT = TypeVar('_FT')
+
+class Testable(metaclass=ABCMeta):
+    @abstractmethod
+    def run(self, result: 'TestResult') -> None: ...
+    @abstractmethod
+    def debug(self) -> None: ...
+    @abstractmethod
+    def countTestCases(self) -> int: ...
+
+# TODO ABC for test runners?
+
+class TestResult:
+    errors = ...  # type: List[Tuple[Testable, str]]
+    failures = ...  # type: List[Tuple[Testable, str]]
+    testsRun = 0
+    shouldStop = ...  # type: bool
+
+    def wasSuccessful(self) -> bool: ...
+    def stop(self) -> None: ...
+    def startTest(self, test: Testable) -> None: ...
+    def stopTest(self, test: Testable) -> None: ...
+    def addError(self, test: Testable,
+                  err: Tuple[type, Any, Any]) -> None: ...  # TODO
+    def addFailure(self, test: Testable,
+                    err: Tuple[type, Any, Any]) -> None: ...  # TODO
+    def addSuccess(self, test: Testable) -> None: ...
+
+class _AssertRaisesBaseContext:
+    expected = ...  # type: Any
+    failureException = ...  # type: type
+    obj_name = ...  # type: str
+    expected_regex = ...  # type: Pattern[str]
+
+class _AssertRaisesContext(_AssertRaisesBaseContext):
+    exception = ...  # type: Any # TODO precise type
+    def __enter__(self) -> _AssertRaisesContext: ...
+    def __exit__(self, exc_type, exc_value, tb) -> bool: ...
+
+class TestCase(Testable):
+    def __init__(self, methodName: str = ...) -> None: ...
+    # TODO failureException
+    def setUp(self) -> None: ...
+    def tearDown(self) -> None: ...
+    def run(self, result: TestResult = ...) -> None: ...
+    def debug(self) -> None: ...
+    def assert_(self, expr: Any, msg: object = ...) -> None: ...
+    def failUnless(self, expr: Any, msg: object = ...) -> None: ...
+    def assertTrue(self, expr: Any, msg: object = ...) -> None: ...
+    def assertEqual(self, first: Any, second: Any,
+                    msg: object = ...) -> None: ...
+    def assertEquals(self, first: Any, second: Any,
+                     msg: object = ...) -> None: ...
+    def failUnlessEqual(self, first: Any, second: Any,
+                        msg: object = ...) -> None: ...
+    def assertNotEqual(self, first: Any, second: Any,
+                       msg: object = ...) -> None: ...
+    def assertNotEquals(self, first: Any, second: Any,
+                        msg: object = ...) -> None: ...
+    def failIfEqual(self, first: Any, second: Any,
+                    msg: object = ...) -> None: ...
+    def assertAlmostEqual(self, first: float, second: float, places: int = ...,
+                          msg: object = ...,
+                          delta: float = ...) -> None: ...
+    def assertAlmostEquals(self, first: float, second: float, places: int = ...,
+                           msg: object = ...,
+                           delta: float = ...) -> None: ...
+    def failUnlessAlmostEqual(self, first: float, second: float, places: int = ...,
+                              msg: object = ...) -> None: ...
+    def assertNotAlmostEqual(self, first: float, second: float, places: int = ...,
+                             msg: object = ...,
+                             delta: float = ...) -> None: ...
+    def assertNotAlmostEquals(self, first: float, second: float, places: int = ...,
+                              msg: object = ...,
+                              delta: float = ...) -> None: ...
+    def failIfAlmostEqual(self, first: float, second: float, places: int = ...,
+                          msg: object = ...,
+                          delta: float = ...) -> None: ...
+    def assertGreater(self, first: Any, second: Any,
+                      msg: object = ...) -> None: ...
+    def assertGreaterEqual(self, first: Any, second: Any,
+                           msg: object = ...) -> None: ...
+    def assertMultiLineEqual(self, first: str, second: str,
+                             msg: object = ...) -> None: ...
+    def assertSequenceEqual(self, first: Sequence[Any], second: Sequence[Any],
+                            msg: object = ..., seq_type: type = ...) -> None: ...
+    def assertListEqual(self, first: List[Any], second: List[Any],
+                        msg: object = ...) -> None: ...
+    def assertTupleEqual(self, first: Tuple[Any, ...], second: Tuple[Any, ...],
+                         msg: object = ...) -> None: ...
+    def assertSetEqual(self, first: Set[Any], second: Set[Any],
+                       msg: object = ...) -> None: ...
+    def assertDictEqual(self, first: Dict[Any, Any], second: Dict[Any, Any],
+                        msg: object = ...) -> None: ...
+    def assertLess(self, first: Any, second: Any,
+                   msg: object = ...) -> None: ...
+    def assertLessEqual(self, first: Any, second: Any,
+                        msg: object = ...) -> None: ...
+    def assertRaises(self, expected_exception: type, *args: Any, **kwargs: Any) -> Any: ...
+    def failUnlessRaises(self, expected_exception: type, *args: Any, **kwargs: Any) -> Any: ...
+    def failIf(self, expr: Any, msg: object = ...) -> None: ...
+    def assertFalse(self, expr: Any, msg: object = ...) -> None: ...
+    def assertIs(self, first: object, second: object,
+                 msg: object = ...) -> None: ...
+    def assertIsNot(self, first: object, second: object,
+                    msg: object = ...) -> None: ...
+    def assertIsNone(self, expr: Any, msg: object = ...) -> None: ...
+    def assertIsNotNone(self, expr: Any, msg: object = ...) -> None: ...
+    def assertIn(self, first: _T, second: Iterable[_T],
+                 msg: object = ...) -> None: ...
+    def assertNotIn(self, first: _T, second: Iterable[_T],
+                    msg: object = ...) -> None: ...
+    def assertIsInstance(self, obj: Any, cls: type,
+                         msg: object = ...) -> None: ...
+    def assertNotIsInstance(self, obj: Any, cls: type,
+                            msg: object = ...) -> None: ...
+    def fail(self, msg: object = ...) -> None: ...
+    def countTestCases(self) -> int: ...
+    def defaultTestResult(self) -> TestResult: ...
+    def id(self) -> str: ...
+    def shortDescription(self) -> str: ...  # May return None
+    def addCleanup(function: Any, *args: Any, **kwargs: Any) -> None: ...
+    def skipTest(self, reason: Any) -> None: ...
+
+class CallableTestCase(Testable):
+    def __init__(self, testFunc: Callable[[], None],
+                 setUp: Callable[[], None] = ...,
+                 tearDown: Callable[[], None] = ...,
+                 description: str = ...) -> None: ...
+    def run(self, result: TestResult) -> None: ...
+    def debug(self) -> None: ...
+    def countTestCases(self) -> int: ...
+
+class TestSuite(Testable):
+    def __init__(self, tests: Iterable[Testable] = ...) -> None: ...
+    def addTest(self, test: Testable) -> None: ...
+    def addTests(self, tests: Iterable[Testable]) -> None: ...
+    def run(self, result: TestResult) -> None: ...
+    def debug(self) -> None: ...
+    def countTestCases(self) -> int: ...
+
+# TODO TestLoader
+# TODO defaultTestLoader
+
+class TextTestRunner:
+    def __init__(self, stream: TextIO = ..., descriptions: bool = ...,
+                 verbosity: int = ..., failfast: bool = ...) -> None: ...
+
+class SkipTest(Exception):
+    ...
+
+# TODO precise types
+def skipUnless(condition: Any, reason: str) -> Any: ...
+def skipIf(condition: Any, reason: str) -> Any: ...
+def expectedFailure(func: _FT) -> _FT: ...
+def skip(reason: str) -> Any: ...
+
+def main(module: str = ..., defaultTest: str = ...,
+         argv: List[str] = ..., testRunner: Any = ...,
+         testLoader: Any = ...) -> None: ...  # TODO types
+
+# private but occasionally used
+util = ...  # type: module
diff --git a/typeshed/stdlib/2/urllib.pyi b/typeshed/stdlib/2/urllib.pyi
new file mode 100644
index 0000000..0882926
--- /dev/null
+++ b/typeshed/stdlib/2/urllib.pyi
@@ -0,0 +1,135 @@
+# Stubs for urllib (Python 2)
+# NOTE: This dynamically typed stub was originally automatically generated by stubgen.
+
+from typing import Any, Mapping, Union, Tuple, Sequence, IO
+
+def url2pathname(pathname: str) -> str: ...
+def pathname2url(pathname: str) -> str: ...
+def urlopen(url: str, data=..., proxies: Mapping[str, str] = ..., context=...) -> IO[Any]: ...
+def urlretrieve(url, filename=..., reporthook=..., data=..., context=...): ...
+def urlcleanup() -> None: ...
+
+class ContentTooShortError(IOError):
+    content = ...  # type: Any
+    def __init__(self, message, content) -> None: ...
+
+class URLopener:
+    version = ...  # type: Any
+    proxies = ...  # type: Any
+    key_file = ...  # type: Any
+    cert_file = ...  # type: Any
+    context = ...  # type: Any
+    addheaders = ...  # type: Any
+    tempcache = ...  # type: Any
+    ftpcache = ...  # type: Any
+    def __init__(self, proxies: Mapping[str, str] = ..., context=..., **x509) -> None: ...
+    def __del__(self): ...
+    def close(self): ...
+    def cleanup(self): ...
+    def addheader(self, *args): ...
+    type = ...  # type: Any
+    def open(self, fullurl: str, data=...): ...
+    def open_unknown(self, fullurl, data=...): ...
+    def open_unknown_proxy(self, proxy, fullurl, data=...): ...
+    def retrieve(self, url, filename=..., reporthook=..., data=...): ...
+    def open_http(self, url, data=...): ...
+    def http_error(self, url, fp, errcode, errmsg, headers, data=...): ...
+    def http_error_default(self, url, fp, errcode, errmsg, headers): ...
+    def open_https(self, url, data=...): ...
+    def open_file(self, url): ...
+    def open_local_file(self, url): ...
+    def open_ftp(self, url): ...
+    def open_data(self, url, data=...): ...
+
+class FancyURLopener(URLopener):
+    auth_cache = ...  # type: Any
+    tries = ...  # type: Any
+    maxtries = ...  # type: Any
+    def __init__(self, *args, **kwargs) -> None: ...
+    def http_error_default(self, url, fp, errcode, errmsg, headers): ...
+    def http_error_302(self, url, fp, errcode, errmsg, headers, data=...): ...
+    def redirect_internal(self, url, fp, errcode, errmsg, headers, data): ...
+    def http_error_301(self, url, fp, errcode, errmsg, headers, data=...): ...
+    def http_error_303(self, url, fp, errcode, errmsg, headers, data=...): ...
+    def http_error_307(self, url, fp, errcode, errmsg, headers, data=...): ...
+    def http_error_401(self, url, fp, errcode, errmsg, headers, data=...): ...
+    def http_error_407(self, url, fp, errcode, errmsg, headers, data=...): ...
+    def retry_proxy_http_basic_auth(self, url, realm, data=...): ...
+    def retry_proxy_https_basic_auth(self, url, realm, data=...): ...
+    def retry_http_basic_auth(self, url, realm, data=...): ...
+    def retry_https_basic_auth(self, url, realm, data=...): ...
+    def get_user_passwd(self, host, realm, clear_cache=...): ...
+    def prompt_user_passwd(self, host, realm): ...
+
+class ftpwrapper:
+    user = ...  # type: Any
+    passwd = ...  # type: Any
+    host = ...  # type: Any
+    port = ...  # type: Any
+    dirs = ...  # type: Any
+    timeout = ...  # type: Any
+    refcount = ...  # type: Any
+    keepalive = ...  # type: Any
+    def __init__(self, user, passwd, host, port, dirs, timeout=..., persistent=...) -> None: ...
+    busy = ...  # type: Any
+    ftp = ...  # type: Any
+    def init(self): ...
+    def retrfile(self, file, type): ...
+    def endtransfer(self): ...
+    def close(self): ...
+    def file_close(self): ...
+    def real_close(self): ...
+
+class addbase:
+    fp = ...  # type: Any
+    read = ...  # type: Any
+    readline = ...  # type: Any
+    readlines = ...  # type: Any
+    fileno = ...  # type: Any
+    __iter__ = ...  # type: Any
+    next = ...  # type: Any
+    def __init__(self, fp) -> None: ...
+    def close(self): ...
+
+class addclosehook(addbase):
+    closehook = ...  # type: Any
+    hookargs = ...  # type: Any
+    def __init__(self, fp, closehook, *hookargs) -> None: ...
+    def close(self): ...
+
+class addinfo(addbase):
+    headers = ...  # type: Any
+    def __init__(self, fp, headers) -> None: ...
+    def info(self): ...
+
+class addinfourl(addbase):
+    headers = ...  # type: Any
+    url = ...  # type: Any
+    code = ...  # type: Any
+    def __init__(self, fp, headers, url, code=...) -> None: ...
+    def info(self): ...
+    def getcode(self): ...
+    def geturl(self): ...
+
+def unwrap(url): ...
+def splittype(url): ...
+def splithost(url): ...
+def splituser(host): ...
+def splitpasswd(user): ...
+def splitport(host): ...
+def splitnport(host, defport=...): ...
+def splitquery(url): ...
+def splittag(url): ...
+def splitattr(url): ...
+def splitvalue(attr): ...
+def unquote(s: str) -> str: ...
+def unquote_plus(s: str) -> str: ...
+def quote(s: str, safe=...) -> str: ...
+def quote_plus(s: str, safe=...) -> str: ...
+def urlencode(query: Union[Sequence[Tuple[Any, Any]], Mapping[Any, Any]], doseq=...) -> str: ...
+
+def getproxies() -> Mapping[str, str]: ...
+def proxy_bypass(host): ...
+
+# Names in __all__ with no definition:
+#   basejoin
diff --git a/typeshed/stdlib/2/urllib2.pyi b/typeshed/stdlib/2/urllib2.pyi
new file mode 100644
index 0000000..728d298
--- /dev/null
+++ b/typeshed/stdlib/2/urllib2.pyi
@@ -0,0 +1,160 @@
+
+from typing import AnyStr, Dict, List, Union
+from urllib import addinfourl
+
+class URLError(IOError):
+    reason = ...  # type: Union[str, BaseException]
+
+class HTTPError(URLError, addinfourl):
+    code = ...  # type: int
+    headers = ...  # type: Dict[str, str]
+
+class Request(object):
+    host = ...  # type: str
+    port = ...  # type: str
+    data = ...  # type: str
+    headers = ...  # type: Dict[str, str]
+    unverifiable = ...  # type: bool
+    type = ...
+    origin_req_host = ...
+    unredirected_hdrs = ...
+
+    def __init__(self, url: str, data: str = None, headers: Dict[str, str] = ...,
+                 origin_req_host: str = None, unverifiable: bool = ...) -> None: ...
+    def __getattr__(self, attr): ...
+    def get_method(self) -> str: ...
+    def add_data(self, data) -> None: ...
+    def has_data(self) -> bool: ...
+    def get_data(self) -> str: ...
+    def get_full_url(self) -> str: ...
+    def get_type(self): ...
+    def get_host(self) -> str: ...
+    def get_selector(self): ...
+    def set_proxy(self, host, type) -> None: ...
+    def has_proxy(self) -> bool: ...
+    def get_origin_req_host(self) -> str: ...
+    def is_unverifiable(self) -> bool: ...
+    def add_header(self, key: str, val: str) -> None: ...
+    def add_unredirected_header(self, key: str, val: str) -> None: ...
+    def has_header(self, header_name: str) -> bool: ...
+    def get_header(self, header_name: str, default: str = None) -> str: ...
+    def header_items(self): ...
+
+class OpenerDirector(object): ...
+
+def urlopen(url, data=None, timeout=..., cafile=None, capath=None, cadefault=False,
+            context=None): ...
+def install_opener(opener): ...
+def build_opener(*handlers): ...
+
+class BaseHandler:
+    handler_order = ...  # int
+
+    def add_parent(self, parent) -> None: ...
+    def close(self) -> None: ...
+    def __lt__(self, other) -> bool: ...
+
+class HTTPErrorProcessor(BaseHandler):
+    def http_response(self, request, response): ...
+
+class HTTPDefaultErrorHandler(BaseHandler):
+    def http_error_default(self, req, fp, code, msg, hdrs): ...
+
+class HTTPRedirectHandler(BaseHandler):
+    max_repeats = ...  # int
+    max_redirections = ...  # int
+    def redirect_request(self, req, fp, code, msg, headers, newurl): ...
+    def http_error_301(self, req, fp, code, msg, headers): ...
+    def http_error_302(self, req, fp, code, msg, headers): ...
+    def http_error_303(self, req, fp, code, msg, headers): ...
+    def http_error_307(self, req, fp, code, msg, headers): ...
+    inf_msg = ...  # type: str
+
+
+class ProxyHandler(BaseHandler):
+    def __init__(self, proxies=None): ...
+    def proxy_open(self, req, proxy, type): ...
+
+class HTTPPasswordMgr:
+    def __init__(self) -> None: ...
+    def add_password(self, realm, uri, user, passwd): ...
+    def find_user_password(self, realm, authuri): ...
+    def reduce_uri(self, uri, default_port: bool): ...
+    def is_suburi(self, base, test): ...
+
+class HTTPPasswordMgrWithDefaultRealm(HTTPPasswordMgr): ...
+
+class AbstractBasicAuthHandler:
+    def __init__(self, password_mgr=None): ...
+    def reset_retry_count(self): ...
+    def http_error_auth_reqed(self, authreq, host, req, headers): ...
+    def retry_http_basic_auth(self, host, req, realm): ...
+
+class HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
+    auth_header = ...  # type: str
+    def http_error_401(self, req, fp, code, msg, headers): ...
+
+class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
+    auth_header = ...  # type: str
+    def http_error_407(self, req, fp, code, msg, headers): ...
+
+class AbstractDigestAuthHandler:
+    def __init__(self, passwd=None): ...
+    def reset_retry_count(self): ...
+    def http_error_auth_reqed(self, auth_header, host, req, headers): ...
+    def retry_http_digest_auth(self, req, auth): ...
+    def get_cnonce(self, nonce): ...
+    def get_authorization(self, req, chal): ...
+    def get_algorithm_impls(self, algorithm): ...
+    def get_entity_digest(self, data, chal): ...
+
+class HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
+    auth_header = ...  # str
+    handler_order = ...  # int
+    def http_error_401(self, req, fp, code, msg, headers): ...
+
+class ProxyDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
+    auth_header = ...  # str
+    handler_order = ...  # int
+    def http_error_407(self, req, fp, code, msg, headers): ...
+
+class AbstractHTTPHandler(BaseHandler):
+    def __init__(self, debuglevel: int) -> None: ...
+    def do_request_(self, request): ...
+    def do_open(self, http_class, req): ...
+
+class HTTPHandler(AbstractHTTPHandler):
+    def http_open(self, req): ...
+    def http_request(self, request): ...
+
+class HTTPSHandler(AbstractHTTPHandler):
+    def __init__(self, debuglevel=0, context=None): ...
+    def https_open(self, req): ...
+    def https_request(self, request): ...
+
+class HTTPCookieProcessor(BaseHandler):
+    def __init__(self, cookiejar=None): ...
+    def http_request(self, request): ...
+    def http_response(self, request, response): ...
+
+class UnknownHandler(BaseHandler):
+    def unknown_open(self, req): ...
+
+class FileHandler(BaseHandler):
+    def file_open(self, req): ...
+    def get_names(self): ...
+    def open_local_file(self, req): ...
+
+class FTPHandler(BaseHandler):
+    def ftp_open(self, req): ...
+    def connect_ftp(self, user, passwd, host, port, dirs, timeout): ...
+
+class CacheFTPHandler(FTPHandler):
+    def __init__(self): ...
+    def setTimeout(self, t): ...
+    def setMaxConns(self, m): ...
+    def check_cache(self): ...
+    def clear_cache(self): ...
+
+def parse_http_list(s: AnyStr) -> List[AnyStr]: ...
+def parse_keqv_list(l: List[AnyStr]) -> Dict[AnyStr, AnyStr]: ...
diff --git a/typeshed/stdlib/2/urlparse.pyi b/typeshed/stdlib/2/urlparse.pyi
new file mode 100644
index 0000000..9d0a702
--- /dev/null
+++ b/typeshed/stdlib/2/urlparse.pyi
@@ -0,0 +1,68 @@
+# Stubs for urlparse (Python 2)
+
+from typing import Dict, List, NamedTuple, Tuple, Sequence, Union, overload
+
+uses_relative = ...  # type: List[str]
+uses_netloc = ...  # type: List[str]
+uses_params = ...  # type: List[str]
+non_hierarchical = ...  # type: List[str]
+uses_query = ...  # type: List[str]
+uses_fragment = ...  # type: List[str]
+scheme_chars = ...  # type: str
+MAX_CACHE_SIZE = 0
+
+def clear_cache() -> None: ...
+
+class ResultMixin(object):
+    @property
+    def username(self) -> str: ...
+    @property
+    def password(self) -> str: ...
+    @property
+    def hostname(self) -> str: ...
+    @property
+    def port(self) -> int: ...
+
+class SplitResult(
+    NamedTuple(
+        'SplitResult',
+        [
+            ('scheme', str), ('netloc', str), ('path', str), ('query', str), ('fragment', str)
+        ]
+    ),
+    ResultMixin
+):
+    def geturl(self) -> str: ...
+
+class ParseResult(
+    NamedTuple(
+        'ParseResult',
+        [
+            ('scheme', str), ('netloc', str), ('path', str), ('params', str), ('query', str),
+            ('fragment', str)
+        ]
+    ),
+    ResultMixin
+):
+    def geturl(self) -> str: ...
+
+def urlparse(url: Union[str, unicode], scheme: str = ...,
+             allow_fragments: bool = ...) -> ParseResult: ...
+def urlsplit(url: Union[str, unicode], scheme: str = ...,
+             allow_fragments: bool = ...) -> SplitResult: ...
+ at overload
+def urlunparse(data: Tuple[str, str, str, str, str, str]) -> str: ...
+ at overload
+def urlunparse(data: Sequence[str]) -> str: ...
+ at overload
+def urlunsplit(data: Tuple[str, str, str, str, str]) -> str: ...
+ at overload
+def urlunsplit(data: Sequence[str]) -> str: ...
+def urljoin(base: Union[str, unicode], url: Union[str, unicode],
+            allow_fragments: bool = ...) -> str: ...
+def urldefrag(url: Union[str, unicode]) -> str: ...
+def unquote(s: str) -> str: ...
+def parse_qs(qs: str, keep_blank_values: bool = ...,
+             strict_parsing: bool = ...) -> Dict[str, List[str]]: ...
+def parse_qsl(qs: str, keep_blank_values: int = ...,
+              strict_parsing: bool = ...) -> List[Tuple[str, str]]: ...
diff --git a/typeshed/stdlib/2/uuid.pyi b/typeshed/stdlib/2/uuid.pyi
new file mode 100644
index 0000000..ce8a2a4
--- /dev/null
+++ b/typeshed/stdlib/2/uuid.pyi
@@ -0,0 +1,36 @@
+from typing import NamedTuple, Any, Tuple
+
+_int_type = int
+
+class _UUIDFields(NamedTuple('_UUIDFields',
+                             [('time_low', int), ('time_mid', int), ('time_hi_version', int), ('clock_seq_hi_variant', int), ('clock_seq_low', int), ('node', int)])):
+    time = ...  # type: int
+    clock_seq = ...  # type: int
+
+class UUID:
+    def __init__(self, hex: str = ..., bytes: str = ..., bytes_le: str = ...,
+                  fields: Tuple[int, int, int, int, int, int] = ..., int: int = ..., version: Any = ...) -> None: ...
+    bytes = ...  # type: str
+    bytes_le = ...  # type: str
+    fields = ...  # type: _UUIDFields
+    hex = ...  # type: str
+    int = ...  # type: _int_type
+    urn = ...  # type: str
+    variant = ...  # type: _int_type
+    version = ...  # type: _int_type
+
+RESERVED_NCS = ...  # type: int
+RFC_4122 = ...  # type: int
+RESERVED_MICROSOFT = ...  # type: int
+RESERVED_FUTURE = ...  # type: int
+
+def getnode() -> int: ...
+def uuid1(node: int = ..., clock_seq: int = ...) -> UUID: ...
+def uuid3(namespace: UUID, name: str) -> UUID: ...
+def uuid4() -> UUID: ...
+def uuid5(namespace: UUID, name: str) -> UUID: ...
+
+NAMESPACE_DNS = ...  # type: UUID
+NAMESPACE_URL = ...  # type: UUID
+NAMESPACE_OID = ...  # type: UUID
+NAMESPACE_X500 = ...  # type: UUID
diff --git a/typeshed/stdlib/2/weakref.pyi b/typeshed/stdlib/2/weakref.pyi
new file mode 100644
index 0000000..b040e25
--- /dev/null
+++ b/typeshed/stdlib/2/weakref.pyi
@@ -0,0 +1,47 @@
+# Stubs for weakref (Python 2)
+#
+# Based on stub automatically generated by stubgen.
+
+from typing import Any, MutableMapping, Generic, Iterator, List, TypeVar
+from _weakref import (getweakrefcount, getweakrefs, ref, proxy,
+                      CallableProxyType, ProxyType, ReferenceType)
+from _weakrefset import WeakSet
+
+ProxyTypes = ...  # type: Any
+
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+# Don't inherit from typing.Dict since
+# isinstance(weakref.WeakValueDictionary(), dict) is False
+class WeakValueDictionary(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
+    def itervaluerefs(self) -> Iterator[ReferenceType[_VT]]: ...
+    def valuerefs(self) -> List[ReferenceType[_VT]]: ...
+
+    def __setitem__(self, k: _KT, v: _VT) -> None: ...
+    def __delitem__(self, v: _KT) -> None: ...
+    def __getitem__(self, k: _KT) -> _VT: ...
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[_KT]: ...
+
+    def has_key(self, key: _KT) -> bool: ...
+    def copy(self) -> WeakValueDictionary[_KT, _VT]: ...
+
+class WeakKeyDictionary(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
+    def iterkeyrefs(self) -> Iterator[ReferenceType[_KT]]: ...
+    def keyrefs(self) -> List[ReferenceType[_KT]]: ...
+
+    def __setitem__(self, k: _KT, v: _VT) -> None: ...
+    def __delitem__(self, v: _KT) -> None: ...
+    def __getitem__(self, k: _KT) -> _VT: ...
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[_KT]: ...
+
+    def has_key(self, key: _KT) -> bool: ...
+    def copy(self) -> WeakKeyDictionary[_KT, _VT]: ...
+
+# TODO: make generic
+class KeyedRef(ReferenceType):
+    key = ...  # type: Any
+    def __new__(type, ob, callback, key): ...
+    def __init__(self, ob, callback, key): ...
diff --git a/mypy/test/update.py b/typeshed/stdlib/2/wsgiref/__init__.pyi
similarity index 100%
rename from mypy/test/update.py
rename to typeshed/stdlib/2/wsgiref/__init__.pyi
diff --git a/typeshed/stdlib/2/wsgiref/validate.pyi b/typeshed/stdlib/2/wsgiref/validate.pyi
new file mode 100644
index 0000000..490889c
--- /dev/null
+++ b/typeshed/stdlib/2/wsgiref/validate.pyi
@@ -0,0 +1,47 @@
+# Stubs for wsgiref.validate (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class WSGIWarning(Warning): ...
+
+def validator(application): ...
+
+class InputWrapper:
+    input = ...  # type: Any
+    def __init__(self, wsgi_input): ...
+    def read(self, *args): ...
+    def readline(self): ...
+    def readlines(self, *args): ...
+    def __iter__(self): ...
+    def close(self): ...
+
+class ErrorWrapper:
+    errors = ...  # type: Any
+    def __init__(self, wsgi_errors): ...
+    def write(self, s): ...
+    def flush(self): ...
+    def writelines(self, seq): ...
+    def close(self): ...
+
+class WriteWrapper:
+    writer = ...  # type: Any
+    def __init__(self, wsgi_writer): ...
+    def __call__(self, s): ...
+
+class PartialIteratorWrapper:
+    iterator = ...  # type: Any
+    def __init__(self, wsgi_iterator): ...
+    def __iter__(self): ...
+
+class IteratorWrapper:
+    original_iterator = ...  # type: Any
+    iterator = ...  # type: Any
+    closed = ...  # type: Any
+    check_start_response = ...  # type: Any
+    def __init__(self, wsgi_iterator, check_start_response): ...
+    def __iter__(self): ...
+    def next(self): ...
+    def close(self): ...
+    def __del__(self): ...
diff --git a/pinfer/__init__.py b/typeshed/stdlib/2/xml/__init__.pyi
similarity index 100%
rename from pinfer/__init__.py
rename to typeshed/stdlib/2/xml/__init__.pyi
diff --git a/typeshed/stdlib/2/xml/etree/ElementInclude.pyi b/typeshed/stdlib/2/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..290ee09
--- /dev/null
+++ b/typeshed/stdlib/2/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from xml.etree.ElementTree import Element
+
+XINCLUDE = ...  # type: str
+XINCLUDE_INCLUDE = ...  # type: str
+XINCLUDE_FALLBACK = ...  # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, Element]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: Element, loader: Callable[..., Union[str, Element]]=...) -> None: ...
diff --git a/typeshed/stdlib/2/xml/etree/ElementPath.pyi b/typeshed/stdlib/2/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..d0095e3
--- /dev/null
+++ b/typeshed/stdlib/2/xml/etree/ElementPath.pyi
@@ -0,0 +1,35 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Pattern, Dict, Generator, Tuple, List, Union, TypeVar, Callable, Optional
+from xml.etree.ElementTree import Element
+
+xpath_tokenizer_re = ...  # type: Pattern
+
+_token = Tuple[str, str]
+_next = Callable[[], _token]
+_callback = Callable[['_SelectorContext', List[Element]], Generator[Element, None, None]]
+
+def xpath_tokenizer(pattern: str, namespaces: Dict[str, str]=...) -> Generator[_token, None, None]: ...
+def get_parent_map(context: '_SelectorContext') -> Dict[Element, Element]: ...
+def prepare_child(next: _next, token: _token) -> _callback: ...
+def prepare_star(next: _next, token: _token) -> _callback: ...
+def prepare_self(next: _next, token: _token) -> _callback: ...
+def prepare_descendant(next: _next, token: _token) -> _callback: ...
+def prepare_parent(next: _next, token: _token) -> _callback: ...
+def prepare_predicate(next: _next, token: _token) -> _callback: ...
+
+ops = ...  # type: Dict[str, Callable[[_next, _token], _callback]]
+
+class _SelectorContext:
+    parent_map = ...  # type: Dict[Element, Element]
+    root = ...  # type: Element
+    def __init__(self, root: Element) -> None: ...
+
+_T = TypeVar('_T')
+
+def iterfind(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def find(elem: Element, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+def findall(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def findtext(elem: Element, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
diff --git a/typeshed/stdlib/2/xml/etree/ElementTree.pyi b/typeshed/stdlib/2/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..89e61f6
--- /dev/null
+++ b/typeshed/stdlib/2/xml/etree/ElementTree.pyi
@@ -0,0 +1,116 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, Generator
+import io
+
+VERSION = ...  # type: str
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class _SimpleElementPath:
+    def find(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> Optional['Element']: ...
+    def findtext(self, element: 'Element', tag: _str_or_bytes, default: _T=..., namespaces: Any=...) -> Union[str, bytes, _T]: ...
+    def iterfind(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> Generator['Element', None, None]: ...
+    def findall(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> List['Element']: ...
+
+class ParseError(SyntaxError): ...
+
+def iselement(element: 'Element') -> bool: ...
+
+class Element(Sequence['Element']):
+    tag = ...  # type: _str_or_bytes
+    attrib = ...  # type: Dict[_str_or_bytes, _str_or_bytes]
+    text = ...  # type: Optional[_str_or_bytes]
+    tail = ...  # type: Optional[_str_or_bytes]
+    def __init__(self, tag: Union[AnyStr, Callable[..., 'Element']], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> None: ...
+    def append(self, element: 'Element') -> None: ...
+    def clear(self) -> None: ...
+    def copy(self) -> 'Element': ...
+    def extend(self, elements: Sequence['Element']) -> None: ...
+    def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional['Element']: ...
+    def findall(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+    def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+    def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+    def getchildren(self) -> List['Element']: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List['Element']: ...
+    def insert(self, index: int, element: 'Element') -> None: ...
+    def items(self) -> List[Tuple[AnyStr, AnyStr]]: ...
+    def iter(self, tag: Union[str, AnyStr]=...) -> Generator['Element', None, None]: ...
+    def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+    def itertext(self) -> Generator[str, None, None]: ...
+    def keys(self) -> List[AnyStr]: ...
+    def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> 'Element': ...
+    def remove(self, element: 'Element') -> None: ...
+    def set(self, key: AnyStr, value: AnyStr) -> None: ...
+    def __bool__(self) -> bool: ...
+    def __delitem__(self, index: int) -> None: ...
+    def __getitem__(self, index) -> 'Element': ...
+    def __len__(self) -> int: ...
+    def __setitem__(self, index: int, element: 'Element') -> None: ...
+
+def SubElement(parent: Element, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> Element: ...
+def Comment(text: _str_or_bytes=...) -> Element: ...
+def ProcessingInstruction(target: str, text: str=...) -> Element: ...
+
+PI = ...  # type: Callable[..., Element]
+
+class QName:
+    text = ...  # type: str
+    def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+    def __init__(self, element: Element=..., file: _file_or_filename=...) -> None: ...
+    def getroot(self) -> Element: ...
+    def parse(self, source: _file_or_filename, parser: 'XMLParser'=...) -> Element: ...
+    def iter(self, tag: Union[str, AnyStr]=...) -> Generator[Element, None, None]: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List[Element]: ...
+    def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+    def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+    def findall(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+    def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+    def write(self, file_or_filename: _file_or_filename, encoding: str=..., xml_declaration: Optional[bool]=..., default_namespace: str=..., method: str=...) -> None: ...
+    def write_c14n(self, file: _file_or_filename) -> None: ...
+
+def register_namespace(prefix: str, uri: str) -> None: ...
+def tostring(element: Element, encoding: str=..., method: str=...) -> str: ...
+def tostringlist(element: Element, encoding: str=..., method: str=...) -> List[str]: ...
+def dump(elem: Element) -> None: ...
+def parse(source: _file_or_filename, parser: 'XMLParser'=...) -> ElementTree: ...
+def iterparse(source: _file_or_filename, events: Sequence[str]=..., parser: 'XMLParser'=...) -> Iterator[Tuple[str, Element]]: ...
+
+class _IterParseIterator:
+    root = ...  # type: Any
+    def __init__(self, source: _file_or_filename, events: Sequence[str], parser: 'XMLParser', close_source: bool=...) -> None: ...
+    def next(self) -> Tuple[str, Element]: ...
+    def __iter__(self) -> _IterParseIterator: ...
+
+def XML(text: AnyStr, parser: 'XMLParser'=...) -> Element: ...
+def XMLID(text: AnyStr, parser: 'XMLParser'=...) -> Tuple[Element, Dict[str, Element]]: ...
+# TODO-improve this type
+fromstring = ...  # type: Callable[..., Element]
+def fromstringlist(sequence: Sequence[AnyStr], parser: 'XMLParser'=...) -> Element: ...
+
+class TreeBuilder:
+    def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], Element]=...) -> None: ...
+    def close(self) -> Element: ...
+    def data(self, data: AnyStr) -> None: ...
+    def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> Element: ...
+    def end(self, tag: AnyStr) -> Element: ...
+
+class XMLParser:
+    parser = ...  # type: Any
+    target = ...  # type: TreeBuilder
+    # TODO-what is entity used for???
+    entity = ...  # type: Any
+    version = ...  # type: str
+    def __init__(self, html: int=..., target: TreeBuilder=..., encoding: str=...) -> None: ...
+    def doctype(self, name: str, pubid: str, system: str) -> None: ...
+    def close(self) -> Any: ...  # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+    def feed(self, data: AnyStr)-> None: ...
diff --git a/test-data/stdlib-samples/3.2/incomplete/urllib/__init__.py b/typeshed/stdlib/2/xml/etree/__init__.pyi
similarity index 100%
rename from test-data/stdlib-samples/3.2/incomplete/urllib/__init__.py
rename to typeshed/stdlib/2/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/2/xml/etree/cElementTree.pyi b/typeshed/stdlib/2/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/2/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import *  # noqa: F403
diff --git a/typeshed/stdlib/2/xxsubtype.pyi b/typeshed/stdlib/2/xxsubtype.pyi
new file mode 100644
index 0000000..56a183f
--- /dev/null
+++ b/typeshed/stdlib/2/xxsubtype.pyi
@@ -0,0 +1,17 @@
+"""Stub file for the 'xxsubtype' module."""
+
+from typing import Any
+
+def bench(obj: Any, name: str, n: int = ...) -> float: ...
+
+class spamdict(dict):
+    state = ...  # type: int
+    def getstate(self) -> int: ...
+    def setstate(self, a: int) -> None: ...
+
+class spamlist(list):
+    state = ...  # type: int
+    def getstate(self) -> int: ...
+    def setstate(self, a: int) -> None: ...
+    def classmeth(self, *args, **kwargs) -> tuple: ...
+    def staticmeth(self, *args, **kwargs) -> tuple: ...
diff --git a/typeshed/stdlib/2/zlib.pyi b/typeshed/stdlib/2/zlib.pyi
new file mode 100644
index 0000000..a232cc5
--- /dev/null
+++ b/typeshed/stdlib/2/zlib.pyi
@@ -0,0 +1,42 @@
+# Stubs for zlib (Python 2.7)
+
+DEFLATED = ...  # type: int
+DEF_MEM_LEVEL = ...  # type: int
+MAX_WBITS = ...  # type: int
+ZLIB_VERSION = ...  # type: str
+Z_BEST_COMPRESSION = ...  # type: int
+Z_BEST_SPEED = ...  # type: int
+Z_DEFAULT_COMPRESSION = ...  # type: int
+Z_DEFAULT_STRATEGY = ...  # type: int
+Z_FILTERED = ...  # type: int
+Z_FINISH = ...  # type: int
+Z_FULL_FLUSH = ...  # type: int
+Z_HUFFMAN_ONLY = ...  # type: int
+Z_NO_FLUSH = ...  # type: int
+Z_SYNC_FLUSH = ...  # type: int
+
+
+class error(Exception): ...
+
+
+class Compress:
+    def compress(self, data: str) -> str: ...
+    def flush(self) -> str: ...
+    def copy(self) -> "Compress": ...
+
+
+class Decompress:
+    unused_data = ...  # type: str
+    unconsumed_tail = ...  # type: str
+    def decompress(self, data: str, max_length: int = ...) -> str: ...
+    def flush(self) -> str: ...
+    def copy(self) -> "Decompress": ...
+
+
+def adler32(data: str, value: int = ...) -> int: ...
+def compress(data: str, level: int = ...) -> str: ...
+def compressobj(level: int = ..., method: int = ..., wbits: int = ...,
+                memlevel: int = ..., strategy: int = ...) -> Compress: ...
+def crc32(data: str, value: int = ...) -> int: ...
+def decompress(data: str, wbits: int = ..., bufsize: int = ...) -> str: ...
+def decompressobj(wbits: int = ...) -> Decompress: ...
diff --git a/typeshed/stdlib/2and3/_bisect.pyi b/typeshed/stdlib/2and3/_bisect.pyi
new file mode 100644
index 0000000..4b6ad96
--- /dev/null
+++ b/typeshed/stdlib/2and3/_bisect.pyi
@@ -0,0 +1,11 @@
+"""Stub file for the '_bisect' module."""
+
+from typing import Any, Sequence, TypeVar
+
+T = TypeVar('T')
+def bisect(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> int: ...
+def bisect_left(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> int: ...
+def bisect_right(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> int: ...
+def insort(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> None: ...
+def insort_left(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> None: ...
+def insort_right(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/_heapq.pyi b/typeshed/stdlib/2and3/_heapq.pyi
new file mode 100644
index 0000000..8b7f6ea
--- /dev/null
+++ b/typeshed/stdlib/2and3/_heapq.pyi
@@ -0,0 +1,15 @@
+"""Stub file for the '_heapq' module."""
+
+from typing import TypeVar, List
+
+_T = TypeVar("_T")
+
+def heapify(heap: List[_T]) -> None: ...
+def heappop(heap: List[_T]) -> _T:
+    raise IndexError()  # if list is empty
+def heappush(heap: List[_T], item: _T) -> None: ...
+def heappushpop(heap: List[_T], item: _T) -> _T: ...
+def heapreplace(heap: List[_T], item: _T) -> _T:
+    raise IndexError()  # if list is empty
+def nlargest(a: int, b: List[_T]) -> List[_T]: ...
+def nsmallest(a: int, b: List[_T]) -> List[_T]: ...
diff --git a/typeshed/stdlib/2and3/argparse.pyi b/typeshed/stdlib/2and3/argparse.pyi
new file mode 100644
index 0000000..627426d
--- /dev/null
+++ b/typeshed/stdlib/2and3/argparse.pyi
@@ -0,0 +1,155 @@
+# Stubs for argparse (Python 3.4)
+
+from typing import (
+    Any, Callable, Iterable, List, IO, Optional, Sequence, Tuple, Type, Union,
+    TypeVar, overload
+)
+import sys
+
+_T = TypeVar('_T')
+
+
+ONE_OR_MORE = ...  # type: str
+OPTIONAL = ...  # type: str
+PARSER = ...  # type: str
+REMAINDER = ...  # type: str
+SUPPRESS = ...  # type: str
+ZERO_OR_MORE = ...  # type: str
+
+class ArgumentError(Exception): ...
+
+class ArgumentParser:
+    if sys.version_info >= (3, 5):
+        def __init__(self,
+                     prog: Optional[str] = ...,
+                     usage: Optional[str] = ...,
+                     description: Optional[str] = ...,
+                     epilog: Optional[str] = ...,
+                     parents: Sequence[ArgumentParser] = ...,
+                     formatter_class: Type[HelpFormatter] = ...,
+                     prefix_chars: str = ...,
+                     fromfile_prefix_chars: Optional[str] = ...,
+                     argument_default: Optional[str] = ...,
+                     conflict_handler: str = ...,
+                     add_help: bool = ...,
+                     allow_abbrev: bool = ...) -> None: ...
+    else:
+        def __init__(self,
+                     prog: Optional[str] = ...,
+                     usage: Optional[str] = ...,
+                     description: Optional[str] = ...,
+                     epilog: Optional[str] = ...,
+                     parents: Sequence[ArgumentParser] = ...,
+                     formatter_class: Type[HelpFormatter] = ...,
+                     prefix_chars: str = ...,
+                     fromfile_prefix_chars: Optional[str] = ...,
+                     argument_default: Optional[str] = ...,
+                     conflict_handler: str = ...,
+                     add_help: bool = ...) -> None: ...
+    def add_argument(self,
+                     *name_or_flags: Union[str, Sequence[str]],
+                     action: Union[str, Type[Action]] = ...,
+                     nargs: Union[int, str] = ...,
+                     const: Any = ...,
+                     default: Any = ...,
+                     type: Union[Callable[[str], _T], FileType] = ...,
+                     choices: Iterable[_T] = ...,
+                     required: bool = ...,
+                     help: str = ...,
+                     metavar: Union[str, Tuple[str, ...]] = ...,
+                     dest: str = ...,
+                     version: str = ...) -> None: ...  # weirdly documented
+    def parse_args(self, args: Optional[Sequence[str]] = ...,
+                   namespace: Optional[Namespace] = ...) -> Namespace: ...
+    def add_subparsers(self, title: str = ...,
+                       description: Optional[str] = ...,
+                       prog: str = ...,
+                       parser_class: Type[ArgumentParser] = ...,
+                       action: Type[Action] = ...,
+                       option_string: str = ...,
+                       dest: Optional[str] = ...,
+                       help: Optional[str] = ...,
+                       metavar: Optional[str] = ...) -> _SubParsersAction: ...
+    def add_argument_group(self, title: Optional[str] = ...,
+                           description: Optional[str] = ...) -> _ArgumentGroup: ...
+    def add_mutually_exclusive_group(self, required: bool = ...) -> _MutuallyExclusiveGroup: ...
+    def set_defaults(self, **kwargs: Any) -> None: ...
+    def get_default(self, dest: str) -> Any: ...
+    def print_usage(self, file: Optional[IO[str]] = ...) -> None: ...
+    def print_help(self, file: Optional[IO[str]] = ...) -> None: ...
+    def format_usage(self) -> str: ...
+    def format_help(self) -> str: ...
+    def parse_known_args(self, args: Optional[Sequence[str]] = ...,
+                         namespace: Optional[Namespace] = ...) -> Tuple[Namespace, List[str]]: ...
+    def convert_arg_line_to_args(self, arg_line: str) -> List[str]: ...
+    def exit(self, status: int = ..., message: Optional[str] = ...) -> None: ...
+    def error(self, message: str) -> None: ...
+
+class HelpFormatter:
+    # not documented
+    def __init__(self, prog: str, indent_increment: int = ...,
+                 max_help_position: int = ...,
+                 width: Optional[int] = ...) -> None: ...
+class RawDescriptionHelpFormatter(HelpFormatter): ...
+class RawTextHelpFormatter(HelpFormatter): ...
+class ArgumentDefaultsHelpFormatter(HelpFormatter): ...
+if sys.version_info >= (3,):
+    class MetavarTypeHelpFormatter(HelpFormatter): ...
+
+class Action:
+    def __init__(self,
+                 option_strings: Sequence[str],
+                 dest: str = ...,
+                 nargs: Optional[Union[int, str]] = ...,
+                 const: Any = ...,
+                 default: Any = ...,
+                 type: Union[Callable[[str], _T], FileType, None] = ...,
+                 choices: Optional[Iterable[_T]] = ...,
+                 required: bool = ...,
+                 help: Optional[str] = ...,
+                 metavar: Union[str, Tuple[str, ...]] = ...) -> None: ...
+    def __call__(self, parser: ArgumentParser, namespace: Namespace,
+                 values: Union[str, Sequence[Any], None],
+                 option_string: str = ...) -> None: ...
+
+class Namespace:
+    def __getattr__(self, name: str) -> Any: ...
+    def __setattr__(self, name: str, value: Any) -> None: ...
+
+class FileType:
+    if sys.version_info >= (3, 4):
+        def __init__(self, mode: str = ..., bufsize: int = ...,
+                     encoding: Optional[str] = ...,
+                     errors: Optional[str] = ...) -> None: ...
+    elif sys.version_info >= (3,):
+        def __init__(self,
+                     mode: str = ..., bufsize: int = ...) -> None: ...
+    else:
+        def __init__(self,
+                     mode: str = ..., bufsize: Optional[int] = ...) -> None: ...
+    def __call__(self, string: str) -> IO[Any]: ...
+
+class _ArgumentGroup:
+    def add_argument(self,
+                     *name_or_flags: Union[str, Sequence[str]],
+                     action: Union[str, Type[Action]] = ...,
+                     nargs: Union[int, str] = ...,
+                     const: Any = ...,
+                     default: Any = ...,
+                     type: Union[Callable[[str], _T], FileType] = ...,
+                     choices: Iterable[_T] = ...,
+                     required: bool = ...,
+                     help: str = ...,
+                     metavar: Union[str, Tuple[str, ...]] = ...,
+                     dest: str = ...,
+                     version: str = ...) -> None: ...
+    def add_mutually_exclusive_group(self, required: bool = ...) -> _MutuallyExclusiveGroup: ...
+
+class _MutuallyExclusiveGroup(_ArgumentGroup): ...
+
+class _SubParsersAction:
+    # TODO: Type keyword args properly.
+    def add_parser(self, name: str, **kwargs: Any) -> ArgumentParser: ...
+
+# not documented
+class ArgumentTypeError(Exception): ...
diff --git a/typeshed/stdlib/2and3/asynchat.pyi b/typeshed/stdlib/2and3/asynchat.pyi
new file mode 100644
index 0000000..b5cf3c0
--- /dev/null
+++ b/typeshed/stdlib/2and3/asynchat.pyi
@@ -0,0 +1,41 @@
+from abc import abstractmethod
+import asyncore
+import socket
+import sys
+from typing import Union, Tuple, Sequence
+
+
+class simple_producer:
+    def __init__(self, data: str, buffer_size: int = ...) -> None: ...
+    def more(self) -> str: ...
+
+class async_chat (asyncore.dispatcher):
+    ac_in_buffer_size = ...  # type: int
+    ac_out_buffer_size = ...  # type: int
+    def __init__(self, sock: socket.socket = None, map: asyncore._maptype = None) -> None: ...
+
+    @abstractmethod
+    def collect_incoming_data(self, data: str) -> None: ...
+    @abstractmethod
+    def found_terminator(self) -> None: ...
+    def set_terminator(self, term: Union[str, int, None]) -> None: ...
+    def get_terminator(self) -> Union[str, int, None]: ...
+    def handle_read(self) -> None: ...
+    def handle_write(self) -> None: ...
+    def handle_close(self) -> None: ...
+    def push(self, data: str) -> None: ...
+    def push_with_producer(self, producer: simple_producer) -> None: ...
+    def readable(self) -> bool: ...
+    def writable(self) -> bool: ...
+    def close_when_done(self) -> None: ...
+    def initiate_send(self) -> None: ...
+    def discard_buffers(self) -> None: ...
+
+if sys.version_info < (3, 0, 0):
+    class fifo:
+        def __init__(self, list: Sequence[Union[str, simple_producer]] = ...) -> None: ...
+        def __len__(self) -> int: ...
+        def is_empty(self) -> bool: ...
+        def first(self) -> str: ...
+        def push(self, data: Union[str, simple_producer]) -> None: ...
+        def pop(self) -> Tuple[int, str]: ...
diff --git a/typeshed/stdlib/2and3/asyncore.pyi b/typeshed/stdlib/2and3/asyncore.pyi
new file mode 100644
index 0000000..c7bf793
--- /dev/null
+++ b/typeshed/stdlib/2and3/asyncore.pyi
@@ -0,0 +1,132 @@
+from typing import Tuple, Union, Optional, Any, Dict, overload
+
+import os
+import select
+import socket
+import sys
+import time
+import warnings
+
+from errno import (EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL,
+                   ENOTCONN, ESHUTDOWN, EINTR, EISCONN, EBADF, ECONNABORTED,
+                   EPIPE, EAGAIN, errorcode)
+
+# cyclic dependence with asynchat
+_maptype = Dict[str, Any]
+
+
+class ExitNow(Exception): pass
+
+def read(obj: Any) -> None: ...
+def write(obj: Any) -> None: ...
+def readwrite(obj: Any, flags: int) -> None: ...
+def poll(timeout: float = ..., map: _maptype = ...) -> None: ...
+def poll2(timeout: float = ..., map: _maptype = ...) -> None: ...
+
+poll3 = poll2
+
+def loop(timeout: float = ..., use_poll: bool = ..., map: _maptype = ..., count: int = None) -> None: ...
+
+
+# Not really subclass of socket.socket; it's only delegation.
+# It is not covariant to it.
+class dispatcher:
+
+    debug = ...  # type: bool
+    connected = ...  # type: bool
+    accepting = ...  # type: bool
+    connecting = ...  # type: bool
+    closing = ...  # type: bool
+    ignore_log_types = ...  # type: frozenset[str]
+
+    def __init__(self, sock: socket.socket = None, map: _maptype = ...) -> None: ...
+    def add_channel(self, map: _maptype = ...) -> None: ...
+    def del_channel(self, map: _maptype = ...) -> None: ...
+    def create_socket(self, family: int, type: int) -> None: ...
+    def set_socket(self, sock: socket.socket, map: _maptype = ...) -> None: ...
+    def set_reuse_addr(self) -> None: ...
+    def readable(self) -> bool: ...
+    def writable(self) -> bool: ...
+    def accept(self) -> Optional[Tuple[socket.socket, Any]]: ...
+    def recv(self, buffer_size: int) -> str: ...
+    def log(self, message: Any) -> None: ...
+
+    def log_info(self, message: Any, type: str = ...) -> None: ...
+    def handle_read_event(self) -> None: ...
+    def handle_connect_event(self) -> None: ...
+    def handle_write_event(self) -> None: ...
+    def handle_expt_event(self) -> None: ...
+    def handle_error(self) -> None: ...
+    def handle_expt(self) -> None: ...
+    def handle_read(self) -> None: ...
+    def handle_write(self) -> None: ...
+    def handle_connect(self) -> None: ...
+    def handle_accept(self) -> None: ...
+    def handle_close(self) -> None: ...
+    def detach(self) -> int: ...
+    def fileno(self) -> int: ...
+
+    # return value is an address
+    def getpeername(self) -> Any: ...
+    def getsockname(self) -> Any: ...
+
+    @overload
+    def getsockopt(self, level: int, optname: int) -> int: ...
+    @overload
+    def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
+
+    def gettimeout(self) -> float: ...
+    def ioctl(self, control: object,
+              option: Tuple[int, int, int]) -> None: ...
+    def listen(self, backlog: int) -> None: ...
+    # TODO the return value may be BinaryIO or TextIO, depending on mode
+    def makefile(self, mode: str = ..., buffering: int = ...,
+                 encoding: str = ..., errors: str = ...,
+                 newline: str = ...) -> Any:
+        ...
+
+    # return type is an address
+    def recvfrom(self, bufsize: int, flags: int = ...) -> Any: ...
+    def recvfrom_into(self, buffer: str, nbytes: int, flags: int = ...) -> Any: ...
+    def recv_into(self, buffer: str, nbytes: int, flags: int = ...) -> Any: ...
+    def send(self, data: str, flags: int = ...) -> Optional[int]: ...
+    def sendall(self, data: str, flags: int = ...) -> None: ...
+    def sendto(self, data: str, address: Union[tuple, str], flags: int = ...) -> int: ...
+    def setblocking(self, flag: bool) -> None: ...
+    def settimeout(self, value: Union[float, None]) -> None: ...
+    def setsockopt(self, level: int, optname: int, value: Union[int, str]) -> None: ...
+    def shutdown(self, how: int) -> None: ...
+
+class dispatcher_with_send(dispatcher):
+    def __init__(self, sock: socket.socket = ..., map: _maptype = ...) -> None: ...
+    def initiate_send(self) -> None: ...
+    def handle_write(self) -> None: ...
+    # incompatible signature:
+    # def send(self, data: str) -> Optional[int]: ...
+
+def compact_traceback() -> Tuple[Tuple[str, str, str], type, type, str]: ...
+def close_all(map: _maptype = ..., ignore_all: bool = ...) -> None: ...
+
+# if os.name == 'posix':
+#    import fcntl
+class file_wrapper:
+    fd = ...  # type: int
+
+    def __init__(self, fd: int) -> None: ...
+    def recv(self, bufsize: int, flags: int = ...) -> str: ...
+    def send(self, data: str, flags: int = ...) -> int: ...
+
+    @overload
+    def getsockopt(self, level: int, optname: int) -> int: ...
+    @overload
+    def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
+
+    def read(self, bufsize: int, flags: int = ...) -> str: ...
+    def write(self, data: str, flags: int = ...) -> int: ...
+
+    def close(self) -> None: ...
+    def fileno(self) -> int: ...
+
+class file_dispatcher(dispatcher):
+    def __init__(self, fd: int, map: _maptype = ...) -> None: ...
+    def set_file(self, fd: int) -> None: ...
diff --git a/typeshed/stdlib/2and3/bisect.pyi b/typeshed/stdlib/2and3/bisect.pyi
new file mode 100644
index 0000000..5c54112
--- /dev/null
+++ b/typeshed/stdlib/2and3/bisect.pyi
@@ -0,0 +1,22 @@
+# Stubs for bisect
+
+from typing import Any, Sequence, TypeVar
+
+_T = TypeVar('_T')
+
+# TODO uncomment when mypy# 2035 is fixed
+# def bisect_left(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+# def bisect_right(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+# def bisect(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+#
+# def insort_left(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+# def insort_right(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+# def insort(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+
+def bisect_left(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
+def bisect_right(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
+def bisect(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
+
+def insort_left(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
+def insort_right(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
+def insort(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
diff --git a/typeshed/stdlib/2and3/bz2.pyi b/typeshed/stdlib/2and3/bz2.pyi
new file mode 100644
index 0000000..e7cdab5
--- /dev/null
+++ b/typeshed/stdlib/2and3/bz2.pyi
@@ -0,0 +1,33 @@
+# Stubs for bz2
+
+from typing import Any, BinaryIO, TextIO, IO, Union
+
+def compress(data: bytes, compresslevel: int = ...) -> bytes: ...
+def decompress(data: bytes) -> bytes: ...
+
+def open(filename: Union[str, bytes, IO[Any]],
+         mode: str = 'rb',
+         encoding: str = None,
+         errors: str = None,
+         newline: str = None) -> IO[Any]: ...
+
+class BZ2File(BinaryIO):
+    def __init__(self,
+                 filename: Union[str, bytes, IO[Any]],
+                 mode: str = "r",
+                 buffering: Any = None,
+                 compresslevel: int = 9) -> None: ...
+
+class BZ2Compressor(object):
+    def __init__(self, compresslevel: int = 9) -> None: ...
+    def compress(self, data: bytes) -> bytes: ...
+    def flush(self) -> bytes: ...
+
+class BZ2Decompressor(object):
+    def decompress(self, data: bytes) -> bytes: ...
+    @property
+    def eof(self) -> bool: ...
+    @property
+    def needs_input(self) -> bool: ...
+    @property
+    def unused_data(self) -> bytes: ...
diff --git a/typeshed/stdlib/2and3/cProfile.pyi b/typeshed/stdlib/2and3/cProfile.pyi
new file mode 100644
index 0000000..b31ea03
--- /dev/null
+++ b/typeshed/stdlib/2and3/cProfile.pyi
@@ -0,0 +1,18 @@
+from typing import Any, Callable, Dict, Optional, TypeVar
+
+def run(statement: str, filename: Optional[str] = ..., sort: int = ...) -> None: ...
+def runctx(statement: str, globals: Dict[str, Any], locals: Dict[str, Any], filename: Optional[str] = ..., sort: int = ...) -> None: ...
+
+_SelfT = TypeVar('_SelfT', bound='Profile')
+_T = TypeVar('_T')
+
+class Profile:
+    def __init__(self, custom_timer: Callable[[], float] = ..., time_unit: float = ..., subcalls: bool = ..., builtins: bool = ...) -> None: ...
+    def enable(self) -> None: ...
+    def disable(self) -> None: ...
+    def print_stats(self, sort: int = ...) -> None: ...
+    def dump_stats(self, file: str) -> None: ...
+    def create_stats(self) -> None: ...
+    def run(self: _SelfT, cmd: str) -> _SelfT: ...
+    def runctx(self: _SelfT, cmd: str, globals: Dict[str, Any], locals: Dict[str, Any]) -> _SelfT: ...
+    def runcall(self, func: Callable[..., _T], *args: Any, **kw: Any) -> _T: ...
diff --git a/typeshed/stdlib/2and3/cmath.pyi b/typeshed/stdlib/2and3/cmath.pyi
new file mode 100644
index 0000000..ada931c
--- /dev/null
+++ b/typeshed/stdlib/2and3/cmath.pyi
@@ -0,0 +1,34 @@
+"""Stub file for the 'cmath' module."""
+
+import sys
+from typing import Union, Tuple
+
+e = ...  # type: float
+pi = ...  # type: float
+
+_C = Union[float, complex]
+
+def acos(x: _C) -> complex: ...
+def acosh(x: _C) -> complex: ...
+def asin(x: _C) -> complex: ...
+def asinh(x: _C) -> complex: ...
+def atan(x: _C) -> complex: ...
+def atanh(x: _C) -> complex: ...
+def cos(x: _C) -> complex: ...
+def cosh(x: _C) -> complex: ...
+def exp(x: _C) -> complex: ...
+def isinf(z: _C) -> bool: ...
+def isnan(z: _C) -> bool: ...
+def log(x: _C, base: _C = ...) -> complex: ...
+def log10(x: _C) -> complex: ...
+def phase(z: _C) -> float: ...
+def polar(z: _C) -> Tuple[float, float]: ...
+def rect(r: float, phi: float) -> complex: ...
+def sin(x: _C) -> complex: ...
+def sinh(x: _C) -> complex: ...
+def sqrt(x: _C) -> complex: ...
+def tan(x: _C) -> complex: ...
+def tanh(x: _C) -> complex: ...
+
+if sys.version_info >= (3,):
+    def isfinite(z: _C) -> bool: ...
diff --git a/typeshed/stdlib/2and3/code.pyi b/typeshed/stdlib/2and3/code.pyi
new file mode 100644
index 0000000..e775851
--- /dev/null
+++ b/typeshed/stdlib/2and3/code.pyi
@@ -0,0 +1,27 @@
+# Stubs for code
+
+from typing import Any, Callable, Mapping, Optional
+from types import CodeType
+
+class InteractiveInterpreter:
+    def __init__(self, locals: Optional[Mapping[str, Any]] = ...) -> None: ...
+    def runsource(self, source: str, filename: str = ...,
+                  symbol: str = ...) -> bool: ...
+    def runcode(self, code: CodeType) -> None: ...
+    def showsyntaxerror(self, filename: Optional[str] = ...) -> None: ...
+    def showtraceback(self) -> None: ...
+    def write(self, data: str) -> None: ...
+
+class InteractiveConsole(InteractiveInterpreter):
+    def __init__(self, locals: Optional[Mapping[str, Any]] = ...,
+                 filename: str = ...) -> None: ...
+    def interact(self, banner: Optional[str] = ...) -> None: ...
+    def push(self, line: str) -> bool: ...
+    def resetbuffer(self) -> None: ...
+    def raw_input(self, prompt: str = ...) -> str: ...
+
+def interact(banner: Optional[str] = ...,
+             readfunc: Optional[Callable[[str], str]] = ...,
+             local: Optional[Mapping[str, Any]] = ...) -> None: ...
+def compile_command(source: str, filename: str = ...,
+                    symbol: str = ...) -> Optional[CodeType]: ...
diff --git a/typeshed/stdlib/2and3/colorsys.pyi b/typeshed/stdlib/2and3/colorsys.pyi
new file mode 100644
index 0000000..ee17ba9
--- /dev/null
+++ b/typeshed/stdlib/2and3/colorsys.pyi
@@ -0,0 +1,15 @@
+# Stubs for colorsys
+
+from typing import Tuple
+
+def rgb_to_yiq(r: float, g: float, b: float) -> Tuple[float, float, float]: ...
+def yiq_to_rgb(y: float, i: float, q: float) -> Tuple[float, float, float]: ...
+def rgb_to_hls(r: float, g: float, b: float) -> Tuple[float, float, float]: ...
+def hls_to_rgb(h: float, l: float, s: float) -> Tuple[float, float, float]: ...
+def rgb_to_hsv(r: float, g: float, b: float) -> Tuple[float, float, float]: ...
+def hsv_to_rgb(h: float, s: float, v: float) -> Tuple[float, float, float]: ...
+
+# TODO undocumented
+ONE_SIXTH = ...  # type: float
+ONE_THIRD = ...  # type: float
+TWO_THIRD = ...  # type: float
diff --git a/typeshed/stdlib/2and3/contextlib.pyi b/typeshed/stdlib/2and3/contextlib.pyi
new file mode 100644
index 0000000..0f14afa
--- /dev/null
+++ b/typeshed/stdlib/2and3/contextlib.pyi
@@ -0,0 +1,53 @@
+# Stubs for contextlib
+
+from typing import (
+    Any, Callable, Generator, IO, Iterable, Iterator, Optional, Type,
+    Generic, TypeVar,
+)
+from types import TracebackType
+import sys
+
+_T = TypeVar('_T')
+_ExitFunc = Callable[[Optional[Type[BaseException]],
+                      Optional[Exception],
+                      Optional[TracebackType]], bool]
+_CM_EF = TypeVar('_CM_EF', ContextManager, _ExitFunc)
+
+# TODO already in PEP, have to get added to mypy
+class ContextManager(Generic[_T]):
+    def __enter__(self) -> _T: ...
+    def __exit__(self, exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+
+def contextmanager(func: Callable[..., Iterator[_T]]) -> Callable[..., ContextManager[_T]]: ...
+
+if sys.version_info < (3,):
+    def nested(*mgr: ContextManager[Any]) -> ContextManager[Iterable[Any]]: ...
+
+class closing(Generic[_T], ContextManager[_T]):
+    def __init__(self, thing: _T) -> None: ...
+
+if sys.version_info >= (3, 4):
+    class suppress(ContextManager[None]):
+        def __init__(self, *exceptions: Type[BaseException]) -> None: ...
+
+    class redirect_stdout(ContextManager[None]):
+        def __init__(self, new_target: IO[str]) -> None: ...
+
+if sys.version_info >= (3, 5):
+    class redirect_stderr(ContextManager[None]):
+        def __init__(self, new_target: IO[str]) -> None: ...
+
+if sys.version_info >= (3,):
+    class ContextDecorator:
+        def __call__(self, func: Callable[..., None]) -> Callable[..., ContextManager[None]]: ...
+
+    class ExitStack(ContextManager[ExitStack]):
+        def __init__(self) -> None: ...
+        def enter_context(self, cm: ContextManager[_T]) -> _T: ...
+        def push(self, exit: _CM_EF) -> _CM_EF: ...
+        def callback(self, callback: Callable[..., None],
+                     *args: Any, **kwds: Any) -> Callable[..., None]: ...
+        def pop_all(self) -> ExitStack: ...
+        def close(self) -> None: ...
diff --git a/test-data/stdlib-samples/3.2/test/__init__.py b/typeshed/stdlib/2and3/distutils/__init__.pyi
similarity index 100%
rename from test-data/stdlib-samples/3.2/test/__init__.py
rename to typeshed/stdlib/2and3/distutils/__init__.pyi
diff --git a/typeshed/stdlib/2and3/distutils/archive_util.pyi b/typeshed/stdlib/2and3/distutils/archive_util.pyi
new file mode 100644
index 0000000..12172f3
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/archive_util.pyi
@@ -0,0 +1,12 @@
+# Stubs for distutils.archive_util
+
+from typing import Optional
+
+
+def make_archive(base_name: str, format: str, root_dir: Optional[str] = ...,
+                 base_dir: Optional[str] = ..., verbose: int = ...,
+                 dry_run: int = ...) -> str: ...
+def make_tarball(base_name: str, base_dir: str, compress: Optional[str] = ...,
+                 verbose: int = ..., dry_run: int = ...) -> str: ...
+def make_zipfile(base_name: str, base_dir: str, verbose: int = ...,
+                 dry_run: int = ...) -> str: ...
diff --git a/typeshed/stdlib/2and3/distutils/bcppcompiler.pyi b/typeshed/stdlib/2and3/distutils/bcppcompiler.pyi
new file mode 100644
index 0000000..9f27a0a
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/bcppcompiler.pyi
@@ -0,0 +1,6 @@
+# Stubs for distutils.bcppcompiler
+
+from distutils.ccompiler import CCompiler
+
+
+class BCPPCompiler(CCompiler): ...
diff --git a/typeshed/stdlib/2and3/distutils/ccompiler.pyi b/typeshed/stdlib/2and3/distutils/ccompiler.pyi
new file mode 100644
index 0000000..94fad8b
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/ccompiler.pyi
@@ -0,0 +1,119 @@
+# Stubs for distutils.ccompiler
+
+from typing import Any, Callable, List, Optional, Tuple, Union
+
+
+_Macro = Union[Tuple[str], Tuple[str, str]]
+
+
+def gen_lib_options(compiler: CCompiler, library_dirs: List[str],
+                    runtime_library_dirs: List[str],
+                    libraries: List[str]) -> List[str]: ...
+def gen_preprocess_options(macros: List[_Macro],
+                           include_dirs: List[str]) -> List[str]: ...
+def get_default_compiler(osname: Optional[str] = ...,
+                         platform: Optional[str] = ...) -> str: ...
+def new_compiler(plat: Optional[str] = ..., compiler: Optional[str] = ...,
+                 verbose: int = ..., dry_run: int = ...,
+                 force: int = ...) -> CCompiler: ...
+def show_compilers() -> None: ...
+
+class CCompiler:
+    def __init__(self, verbose: int = ..., dry_run: int = ...,
+                 force: int = ...) -> None: ...
+    def add_include_dir(self, dir: str) -> None: ...
+    def set_include_dirs(self, dirs: List[str]) -> None: ...
+    def add_library(self, libname: str) -> None: ...
+    def set_libraries(self, libnames: List[str]) -> None: ...
+    def add_library_dir(self, dir: str) -> None: ...
+    def set_library_dirs(self, dirs: List[str]) -> None: ...
+    def add_runtime_library_dir(self, dir: str) -> None: ...
+    def set_runtime_library_dirs(self, dirs: List[str]) -> None: ...
+    def define_macro(self, name: str, value: Optional[str] = ...) -> None: ...
+    def undefine_macro(self, name: str) -> None: ...
+    def add_link_object(self, object: str) -> None: ...
+    def set_link_objects(self, objects: List[str]) -> None: ...
+    def detect_language(self, sources: Union[str, List[str]]) -> Optional[str]: ...
+    def find_library_file(self, dirs: List[str], lib: str,
+                          debug: bool = ...) -> Optional[str]: ...
+    def has_function(self, funcname: str, includes: Optional[List[str]] = ...,
+                     include_dirs: Optional[List[str]] = ...,
+                     libraries: Optional[List[str]] = ...,
+                     library_dirs: Optional[List[str]] = ...) -> bool: ...
+    def library_dir_option(self, dir: str) -> str: ...
+    def library_option(self, lib: str) -> str: ...
+    def runtime_library_dir_option(self, dir: str) -> str: ...
+    def set_executables(self, **args: str) -> None: ...
+    def compile(self, sources: List[str], output_dir: Optional[str] = ...,
+                macros: Optional[_Macro] = ...,
+                include_dirs: Optional[List[str]] = ..., debug: bool = ...,
+                extra_preargs: Optional[List[str]] = ...,
+                extra_postargs: Optional[List[str]] = ...,
+                depends: Optional[List[str]] = ...) -> List[str]: ...
+    def create_static_lib(self, objects: List[str], output_libname: str,
+                          output_dir: Optional[str] = ..., debug: bool = ...,
+                          target_lang: Optional[str] = ...) -> None: ...
+    def link(self, target_desc: str, objects: List[str], output_filename: str,
+             output_dir: Optional[str] = ...,
+             libraries: Optional[List[str]] = ...,
+             library_dirs: Optional[List[str]] = ...,
+             runtime_library_dirs: Optional[List[str]] = ...,
+             export_symbols: Optional[List[str]] = ..., debug: bool = ...,
+             extra_preargs: Optional[List[str]] = ...,
+             extra_postargs: Optional[List[str]] = ...,
+             build_temp: Optional[str] = ...,
+             target_lang: Optional[str] = ...) -> None: ...
+    def link_executable(self, objects: List[str], output_progname: str,
+                        output_dir: Optional[str] = ...,
+                        libraries: Optional[List[str]] = ...,
+                        library_dirs: Optional[List[str]] = ...,
+                        runtime_library_dirs: Optional[List[str]] = ...,
+                        debug: bool = ...,
+                        extra_preargs: Optional[List[str]] = ...,
+                        extra_postargs: Optional[List[str]] = ...,
+                        target_lang: Optional[str] = ...) -> None: ...
+    def link_shared_lib(self, objects: List[str], output_libname: str,
+                        output_dir: Optional[str] = ...,
+                        libraries: Optional[List[str]] = ...,
+                        library_dirs: Optional[List[str]] = ...,
+                        runtime_library_dirs: Optional[List[str]] = ...,
+                        export_symbols: Optional[List[str]] = ...,
+                        debug: bool = ...,
+                        extra_preargs: Optional[List[str]] = ...,
+                        extra_postargs: Optional[List[str]] = ...,
+                        build_temp: Optional[str] = ...,
+                        target_lang: Optional[str] = ...) -> None: ...
+    def link_shared_object(self, objects: List[str], output_filename: str,
+                           output_dir: Optional[str] = ...,
+                           libraries: Optional[List[str]] = ...,
+                           library_dirs: Optional[List[str]] = ...,
+                           runtime_library_dirs: Optional[List[str]] = ...,
+                           export_symbols: Optional[List[str]] = ...,
+                           debug: bool = ...,
+                           extra_preargs: Optional[List[str]] = ...,
+                           extra_postargs: Optional[List[str]] = ...,
+                           build_temp: Optional[str] = ...,
+                           target_lang: Optional[str] = ...) -> None: ...
+    def preprocess(self, source: str, output_file: Optional[str] = ...,
+                   macros: Optional[List[_Macro]] = ...,
+                   include_dirs: Optional[List[str]] = ...,
+                   extra_preargs: Optional[List[str]] = ...,
+                   extra_postargs: Optional[List[str]] = ...) -> None: ...
+    def executable_filename(self, basename: str, strip_dir: int = ...,
+                            output_dir: str = ...) -> str: ...
+    def library_filename(self, libname: str, lib_type: str = ...,
+                         strip_dir: int = ...,
+                         output_dir: str = ...) -> str: ...
+    def object_filenames(self, source_filenames: List[str],
+                         strip_dir: int = ...,
+                         output_dir: str = ...) -> List[str]: ...
+    def shared_object_filename(self, basename: str, strip_dir: int = ...,
+                               output_dir: str = ...) -> str: ...
+    def execute(self, func: Callable[..., None], args: Tuple[Any, ...],
+                msg: Optional[str] = ..., level: int = ...) -> None: ...
+    def spawn(self, cmd: List[str]) -> None: ...
+    def mkpath(self, name: str, mode: int = ...) -> None: ...
+    def move_file(self, src: str, dst: str) -> str: ...
+    def announce(self, msg: str, level: int = ...) -> None: ...
+    def warn(self, msg: str) -> None: ...
+    def debug_print(self, msg: str) -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/cmd.pyi b/typeshed/stdlib/2and3/distutils/cmd.pyi
new file mode 100644
index 0000000..126ef15
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/cmd.pyi
@@ -0,0 +1,15 @@
+# Stubs for distutils.cmd
+
+from typing import Callable, List, Tuple, Union
+from abc import abstractmethod
+from distutils.dist import Distribution
+
+class Command:
+    sub_commands = ...  # type: List[Tuple[str, Union[Callable[[], bool], str, None]]]
+    def __init__(self, dist: Distribution) -> None: ...
+    @abstractmethod
+    def initialize_options(self) -> None: ...
+    @abstractmethod
+    def finalize_options(self) -> None: ...
+    @abstractmethod
+    def run(self) -> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/__init__.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/bdist.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/bdist.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/bdist_dumb.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/bdist_dumb.pyi
diff --git a/typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi b/typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi
new file mode 100644
index 0000000..3813699
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi
@@ -0,0 +1,5 @@
+# Stubs for distutils.command.bdist_msi
+
+from distutils.cmd import Command
+
+class bdist_msi(Command): ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/bdist_packager.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/bdist_packager.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/bdist_rpm.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/bdist_rpm.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/bdist_wininst.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/bdist_wininst.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/build.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/build.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/build_clib.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/build_clib.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/build_ext.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/build_ext.pyi
diff --git a/typeshed/stdlib/2and3/distutils/command/build_py.pyi b/typeshed/stdlib/2and3/distutils/command/build_py.pyi
new file mode 100644
index 0000000..23b3f9e
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/command/build_py.pyi
@@ -0,0 +1,8 @@
+# Stubs for distutils.command.bdist_msi
+
+from distutils.cmd import Command
+import sys
+
+if sys.version_info >= (3,):
+    class build_py(Command): ...
+    class build_py_2to3(Command): ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/build_scripts.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/build_scripts.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/check.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/check.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/clean.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/clean.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/config.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/config.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/install.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/install.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/install_data.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/install_data.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/install_headers.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/install_headers.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/install_lib.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/install_lib.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/install_scripts.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/install_scripts.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/register.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/register.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/sdist.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/sdist.pyi
diff --git a/typeshed/stdlib/2and3/distutils/core.pyi b/typeshed/stdlib/2and3/distutils/core.pyi
new file mode 100644
index 0000000..38d6a1a
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/core.pyi
@@ -0,0 +1,35 @@
+# Stubs for distutils.core
+
+from typing import Any, List, Mapping, Optional, Tuple, Type, Union
+from distutils.cmd import Command as Command
+from distutils.dist import Distribution as Distribution
+from distutils.extension import Extension as Extension
+
+def setup(name: str = ...,
+          version: str = ...,
+          description: str = ...,
+          long_description: str = ...,
+          author: str = ...,
+          author_email: str = ...,
+          maintainer: str = ...,
+          maintainer_email: str = ...,
+          url: str = ...,
+          download_url: str = ...,
+          packages: List[str] = ...,
+          py_modules: List[str] = ...,
+          scripts: List[str] = ...,
+          ext_modules: List[Extension] = ...,
+          classifiers: List[str] = ...,
+          distclass: Type[Distribution] = ...,
+          script_name: str = ...,
+          script_args: List[str] = ...,
+          options: Mapping[str, Any] = ...,
+          license: str = ...,
+          keywords: Union[List[str], str] = ...,
+          platforms: Union[List[str], str] = ...,
+          cmdclass: Mapping[str, Command] = ...,
+          data_files: List[Tuple[str, List[str]]] = ...,
+          package_dir: Mapping[str, str] = ...) -> None: ...
+def run_setup(script_name: str,
+              script_args: Optional[List[str]] = ...,
+              stop_after: str = ...) -> Distribution: ...
diff --git a/typeshed/stdlib/2and3/distutils/cygwinccompiler.pyi b/typeshed/stdlib/2and3/distutils/cygwinccompiler.pyi
new file mode 100644
index 0000000..1bfab90
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/cygwinccompiler.pyi
@@ -0,0 +1,7 @@
+# Stubs for distutils.cygwinccompiler
+
+from distutils.unixccompiler import UnixCCompiler
+
+
+class CygwinCCompiler(UnixCCompiler): ...
+class Mingw32CCompiler(CygwinCCompiler): ...
diff --git a/typeshed/stdlib/2and3/distutils/debug.pyi b/typeshed/stdlib/2and3/distutils/debug.pyi
new file mode 100644
index 0000000..c3a1849
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/debug.pyi
@@ -0,0 +1,3 @@
+# Stubs for distutils.debug
+
+DEBUG = ...  # type: bool
diff --git a/typeshed/stdlib/2and3/distutils/dep_util.pyi b/typeshed/stdlib/2and3/distutils/dep_util.pyi
new file mode 100644
index 0000000..7df5847
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/dep_util.pyi
@@ -0,0 +1,8 @@
+# Stubs for distutils.dep_util
+
+from typing import List, Tuple
+
+def newer(source: str, target: str) -> bool: ...
+def newer_pairwise(sources: List[str],
+                   targets: List[str]) -> List[Tuple[str, str]]: ...
+def newer_group(sources: List[str], target: str, missing: str = ...) -> bool: ...
diff --git a/typeshed/stdlib/2and3/distutils/dir_util.pyi b/typeshed/stdlib/2and3/distutils/dir_util.pyi
new file mode 100644
index 0000000..667ac2f
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/dir_util.pyi
@@ -0,0 +1,15 @@
+# Stubs for distutils.dir_util
+
+from typing import List
+
+
+def mkpath(name: str, mode: int = ..., verbose: int = ...,
+           dry_run: int = ...) -> List[str]: ...
+def create_tree(base_dir: str, files: List[str], mode: int = ...,
+                verbose: int = ..., dry_run: int = ...) -> None: ...
+def copy_tree(src: str, dst: str, preserve_mode: int = ...,
+              preserve_times: int = ..., preserve_symlinks: int = ...,
+              update: int = ..., verbose: int = ...,
+              dry_run: int = ...) -> List[str]: ...
+def remove_tree(directory: str, verbose: int = ...,
+                dry_run: int = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/dist.pyi b/typeshed/stdlib/2and3/distutils/dist.pyi
new file mode 100644
index 0000000..2d9c162
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/dist.pyi
@@ -0,0 +1,7 @@
+# Stubs for distutils.dist
+
+from typing import Any, Mapping, Optional
+
+
+class Distribution:
+    def __init__(self, attrs: Optional[Mapping[str, Any]] = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/errors.pyi b/typeshed/stdlib/2and3/distutils/errors.pyi
new file mode 100644
index 0000000..49ca06f
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/errors.pyi
@@ -0,0 +1,4 @@
+# Stubs for distutils.errors
+
+class DistutilsExecError(Exception): ...
+class DistutilsFileError(Exception): ...
diff --git a/typeshed/stdlib/2and3/distutils/extension.pyi b/typeshed/stdlib/2and3/distutils/extension.pyi
new file mode 100644
index 0000000..5aa070e
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/extension.pyi
@@ -0,0 +1,39 @@
+# Stubs for distutils.extension
+
+from typing import List, Optional, Tuple
+import sys
+
+class Extension:
+    if sys.version_info >= (3,):
+        def __init__(self,
+                     name: str,
+                     sources: List[str],
+                     include_dirs: List[str] = ...,
+                     define_macros: List[Tuple[str, Optional[str]]] = ...,
+                     undef_macros: List[str] = ...,
+                     library_dirs: List[str] = ...,
+                     libraries: List[str] = ...,
+                     runtime_library_dirs: List[str] = ...,
+                     extra_objects: List[str] = ...,
+                     extra_compile_args: List[str] = ...,
+                     extra_link_args: List[str] = ...,
+                     export_symbols: List[str] = ...,
+                     depends: List[str] = ...,
+                     language: str = ...,
+                     optional: bool = ...) -> None: ...
+    else:
+        def __init__(self,
+                     name: str,
+                     sources: List[str],
+                     include_dirs: List[str] = ...,
+                     define_macros: List[Tuple[str, Optional[str]]] = ...,
+                     undef_macros: List[str] = ...,
+                     library_dirs: List[str] = ...,
+                     libraries: List[str] = ...,
+                     runtime_library_dirs: List[str] = ...,
+                     extra_objects: List[str] = ...,
+                     extra_compile_args: List[str] = ...,
+                     extra_link_args: List[str] = ...,
+                     export_symbols: List[str] = ...,
+                     depends: List[str] = ...,
+                     language: str = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/fancy_getopt.pyi b/typeshed/stdlib/2and3/distutils/fancy_getopt.pyi
new file mode 100644
index 0000000..aa7e964
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/fancy_getopt.pyi
@@ -0,0 +1,27 @@
+# Stubs for distutils.fancy_getopt
+
+from typing import (
+    Any, List, Mapping, Optional, Tuple, Union,
+    TypeVar, overload,
+)
+
+_Option = Tuple[str, str, str]
+_GR = Tuple[List[str], OptionDummy]
+
+def fancy_getopt(options: List[_Option],
+                 negative_opt: Mapping[_Option, _Option],
+                 object: Any,
+                 args: Optional[List[str]]) -> Union[List[str], _GR]: ...
+def wrap_text(text: str, width: int) -> List[str]: ...
+
+class FancyGetopt:
+    def __init__(self, option_table: Optional[List[_Option]] = ...) -> None: ...
+    # TODO kinda wrong, `getopt(object=object())` is invalid
+    @overload
+    def getopt(self, args: Optional[List[str]] = ...) -> _GR: ...
+    @overload
+    def getopt(self, args: Optional[List[str]], object: Any) -> List[str]: ...
+    def get_option_order(self) -> List[Tuple[str, str]]: ...
+    def generate_help(self, header: Optional[str] = ...) -> List[str]: ...
+
+class OptionDummy: ...
diff --git a/typeshed/stdlib/2and3/distutils/file_util.pyi b/typeshed/stdlib/2and3/distutils/file_util.pyi
new file mode 100644
index 0000000..6324d63
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/file_util.pyi
@@ -0,0 +1,12 @@
+# Stubs for distutils.file_util
+
+from typing import Optional, Sequence, Tuple
+
+
+def copy_file(src: str, dst: str, preserve_mode: bool = ...,
+              preserve_times: bool = ..., update: bool = ...,
+              link: Optional[str] = ..., verbose: bool = ...,
+              dry_run: bool = ...) -> Tuple[str, str]: ...
+def move_file(src: str, dst: str, verbose: bool = ...,
+              dry_run: bool = ...) -> str: ...
+def write_file(filename: str, contents: Sequence[str]) -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/filelist.pyi b/typeshed/stdlib/2and3/distutils/filelist.pyi
new file mode 100644
index 0000000..4ecaeba
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/filelist.pyi
@@ -0,0 +1,3 @@
+# Stubs for distutils.filelist
+
+class FileList: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/log.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/log.pyi
diff --git a/typeshed/stdlib/2and3/distutils/msvccompiler.pyi b/typeshed/stdlib/2and3/distutils/msvccompiler.pyi
new file mode 100644
index 0000000..ffc9e44
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/msvccompiler.pyi
@@ -0,0 +1,6 @@
+# Stubs for distutils.msvccompiler
+
+from distutils.ccompiler import CCompiler
+
+
+class MSVCCompiler(CCompiler): ...
diff --git a/typeshed/stdlib/2and3/distutils/spawn.pyi b/typeshed/stdlib/2and3/distutils/spawn.pyi
new file mode 100644
index 0000000..8df9eba
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/spawn.pyi
@@ -0,0 +1,8 @@
+# Stubs for distutils.spawn
+
+from typing import List, Optional
+
+def spawn(cmd: List[str], search_path: bool = ...,
+          verbose: bool = ..., dry_run: bool = ...) -> None: ...
+def find_executable(executable: str,
+                    path: Optional[str] = ...) -> Optional[str]: ...
diff --git a/typeshed/stdlib/2and3/distutils/sysconfig.pyi b/typeshed/stdlib/2and3/distutils/sysconfig.pyi
new file mode 100644
index 0000000..f87cd46
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/sysconfig.pyi
@@ -0,0 +1,19 @@
+# Stubs for distutils.sysconfig
+
+from typing import Mapping, Optional, Union
+from distutils.ccompiler import CCompiler
+
+PREFIX = ...  # type: str
+EXEC_PREFIX = ...  # type: str
+
+def get_config_var(name: str) -> Union[int, str, None]: ...
+def get_config_vars(*args: str) -> Mapping[str, Union[int, str]]: ...
+def get_config_h_filename() -> str: ...
+def get_makefile_filename() -> str: ...
+def get_python_inc(plat_specific: bool = ...,
+                   prefix: Optional[str] = ...) -> str: ...
+def get_python_lib(plat_specific: bool = ..., standard_lib: bool = ...,
+                   prefix: Optional[str] = ...) -> str: ...
+
+def customize_compiler(compiler: CCompiler) -> None: ...
+def set_python_build() -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/text_file.pyi b/typeshed/stdlib/2and3/distutils/text_file.pyi
new file mode 100644
index 0000000..8f90d41
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/text_file.pyi
@@ -0,0 +1,18 @@
+# Stubs for distutils.text_file
+
+from typing import IO, List, Optional, Tuple, Union
+
+class TextFile:
+    def __init__(self, filename: Optional[str] = ...,
+                 file: Optional[IO[str]] = ...,
+                 *, strip_comments: bool = ...,
+                 lstrip_ws: bool = ..., rstrip_ws: bool = ...,
+                 skip_blanks: bool = ..., join_lines: bool = ...,
+                 collapse_join: bool = ...) -> None: ...
+    def open(self, filename: str) -> None: ...
+    def close(self) -> None: ...
+    def warn(self, msg: str,
+             line: Union[List[int], Tuple[int, int], int] = ...) -> None: ...
+    def readline(self) -> Optional[str]: ...
+    def readlines(self) -> List[str]: ...
+    def unreadline(self, line: str) -> str: ...
diff --git a/typeshed/stdlib/2and3/distutils/unixccompiler.pyi b/typeshed/stdlib/2and3/distutils/unixccompiler.pyi
new file mode 100644
index 0000000..7ab7298
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/unixccompiler.pyi
@@ -0,0 +1,6 @@
+# Stubs for distutils.unixccompiler
+
+from distutils.ccompiler import CCompiler
+
+
+class UnixCCompiler(CCompiler): ...
diff --git a/typeshed/stdlib/2and3/distutils/util.pyi b/typeshed/stdlib/2and3/distutils/util.pyi
new file mode 100644
index 0000000..942886d
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/util.pyi
@@ -0,0 +1,20 @@
+# Stubs for distutils.util
+
+from typing import Any, Callable, List, Mapping, Optional, Tuple
+
+
+def get_platform() -> str: ...
+def convert_path(pathname: str) -> str: ...
+def change_root(new_root: str, pathname: str) -> str: ...
+def check_environ() -> None: ...
+def subst_vars(s: str, local_vars: Mapping[str, str]) -> None: ...
+def split_quoted(s: str) -> List[str]: ...
+def execute(func: Callable[..., None], args: Tuple[Any, ...],
+            msg: Optional[str] = ..., verbose: bool = ...,
+            dry_run: bool = ...) -> None: ...
+def strtobool(val: str) -> bool: ...
+def byte_compile(py_files: List[str], optimize: int = ..., force: bool = ...,
+                 prefix: Optional[str] = ..., base_dir: Optional[str] = ...,
+                 verbose: bool = ..., dry_run: bool = ...,
+                 direct: Optional[bool] = ...) -> None: ...
+def rfc822_escape(header: str) -> str: ...
diff --git a/typeshed/stdlib/2and3/distutils/version.pyi b/typeshed/stdlib/2and3/distutils/version.pyi
new file mode 100644
index 0000000..6b6efbf
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/version.pyi
@@ -0,0 +1,35 @@
+# Stubs for distutils.version (Python 2 and 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+import sys
+from typing import Any
+
+class Version:
+    def __init__(self, vstring=None): ...
+
+    if sys.version_info >= (3,):
+        def __eq__(self, other): ...
+        def __lt__(self, other): ...
+        def __le__(self, other): ...
+        def __gt__(self, other): ...
+        def __ge__(self, other): ...
+
+class StrictVersion(Version):
+    version_re = ...  # type: Any
+    version = ...  # type: Any
+    prerelease = ...  # type: Any
+    def parse(self, vstring): ...
+
+    if sys.version_info < (3,):
+        def __cmp__(self, other): ...
+
+class LooseVersion(Version):
+    component_re = ...  # type: Any
+    def __init__(self, vstring=None): ...
+    vstring = ...  # type: Any
+    version = ...  # type: Any
+    def parse(self, vstring): ...
+
+    if sys.version_info < (3,):
+        def __cmp__(self, other): ...
diff --git a/typeshed/stdlib/2and3/errno.pyi b/typeshed/stdlib/2and3/errno.pyi
new file mode 100644
index 0000000..d24f2e4
--- /dev/null
+++ b/typeshed/stdlib/2and3/errno.pyi
@@ -0,0 +1,129 @@
+# Stubs for errno
+
+from typing import Mapping
+import sys
+
+errorcode = ...  # type: Mapping[int, str]
+
+EPERM = ...  # type: int
+ENOENT = ...  # type: int
+ESRCH = ...  # type: int
+EINTR = ...  # type: int
+EIO = ...  # type: int
+ENXIO = ...  # type: int
+E2BIG = ...  # type: int
+ENOEXEC = ...  # type: int
+EBADF = ...  # type: int
+ECHILD = ...  # type: int
+EAGAIN = ...  # type: int
+ENOMEM = ...  # type: int
+EACCES = ...  # type: int
+EFAULT = ...  # type: int
+ENOTBLK = ...  # type: int
+EBUSY = ...  # type: int
+EEXIST = ...  # type: int
+EXDEV = ...  # type: int
+ENODEV = ...  # type: int
+ENOTDIR = ...  # type: int
+EISDIR = ...  # type: int
+EINVAL = ...  # type: int
+ENFILE = ...  # type: int
+EMFILE = ...  # type: int
+ENOTTY = ...  # type: int
+ETXTBSY = ...  # type: int
+EFBIG = ...  # type: int
+ENOSPC = ...  # type: int
+ESPIPE = ...  # type: int
+EROFS = ...  # type: int
+EMLINK = ...  # type: int
+EPIPE = ...  # type: int
+EDOM = ...  # type: int
+ERANGE = ...  # type: int
+EDEADLCK = ...  # type: int
+ENAMETOOLONG = ...  # type: int
+ENOLCK = ...  # type: int
+ENOSYS = ...  # type: int
+ENOTEMPTY = ...  # type: int
+ELOOP = ...  # type: int
+EWOULDBLOCK = ...  # type: int
+ENOMSG = ...  # type: int
+EIDRM = ...  # type: int
+ECHRNG = ...  # type: int
+EL2NSYNC = ...  # type: int
+EL3HLT = ...  # type: int
+EL3RST = ...  # type: int
+ELNRNG = ...  # type: int
+EUNATCH = ...  # type: int
+ENOCSI = ...  # type: int
+EL2HLT = ...  # type: int
+EBADE = ...  # type: int
+EBADR = ...  # type: int
+EXFULL = ...  # type: int
+ENOANO = ...  # type: int
+EBADRQC = ...  # type: int
+EBADSLT = ...  # type: int
+EDEADLOCK = ...  # type: int
+EBFONT = ...  # type: int
+ENOSTR = ...  # type: int
+ENODATA = ...  # type: int
+ETIME = ...  # type: int
+ENOSR = ...  # type: int
+ENONET = ...  # type: int
+ENOPKG = ...  # type: int
+EREMOTE = ...  # type: int
+ENOLINK = ...  # type: int
+EADV = ...  # type: int
+ESRMNT = ...  # type: int
+ECOMM = ...  # type: int
+EPROTO = ...  # type: int
+EMULTIHOP = ...  # type: int
+EDOTDOT = ...  # type: int
+EBADMSG = ...  # type: int
+EOVERFLOW = ...  # type: int
+ENOTUNIQ = ...  # type: int
+EBADFD = ...  # type: int
+EREMCHG = ...  # type: int
+ELIBACC = ...  # type: int
+ELIBBAD = ...  # type: int
+ELIBSCN = ...  # type: int
+ELIBMAX = ...  # type: int
+ELIBEXEC = ...  # type: int
+EILSEQ = ...  # type: int
+ERESTART = ...  # type: int
+ESTRPIPE = ...  # type: int
+EUSERS = ...  # type: int
+ENOTSOCK = ...  # type: int
+EDESTADDRREQ = ...  # type: int
+EMSGSIZE = ...  # type: int
+EPROTOTYPE = ...  # type: int
+ENOPROTOOPT = ...  # type: int
+EPROTONOSUPPORT = ...  # type: int
+ESOCKTNOSUPPORT = ...  # type: int
+EOPNOTSUPP = ...  # type: int
+EPFNOSUPPORT = ...  # type: int
+EAFNOSUPPORT = ...  # type: int
+EADDRINUSE = ...  # type: int
+EADDRNOTAVAIL = ...  # type: int
+ENETDOWN = ...  # type: int
+ENETUNREACH = ...  # type: int
+ENETRESET = ...  # type: int
+ECONNABORTED = ...  # type: int
+ECONNRESET = ...  # type: int
+ENOBUFS = ...  # type: int
+EISCONN = ...  # type: int
+ENOTCONN = ...  # type: int
+ESHUTDOWN = ...  # type: int
+ETOOMANYREFS = ...  # type: int
+ETIMEDOUT = ...  # type: int
+ECONNREFUSED = ...  # type: int
+EHOSTDOWN = ...  # type: int
+EHOSTUNREACH = ...  # type: int
+EALREADY = ...  # type: int
+EINPROGRESS = ...  # type: int
+ESTALE = ...  # type: int
+EUCLEAN = ...  # type: int
+ENOTNAM = ...  # type: int
+ENAVAIL = ...  # type: int
+EISNAM = ...  # type: int
+EREMOTEIO = ...  # type: int
+EDQUOT = ...  # type: int
diff --git a/typeshed/stdlib/2and3/fractions.pyi b/typeshed/stdlib/2and3/fractions.pyi
new file mode 100644
index 0000000..66408fb
--- /dev/null
+++ b/typeshed/stdlib/2and3/fractions.pyi
@@ -0,0 +1,94 @@
+# Stubs for fractions
+# See https://docs.python.org/3/library/fractions.html
+#
+# Note: these stubs are incomplete. The more complex type
+# signatures are currently omitted. Also see numbers.pyi.
+
+from typing import Optional, TypeVar, Union, overload
+from numbers import Real, Integral, Rational
+from decimal import Decimal
+import sys
+
+_ComparableNum = Union[int, float, Decimal, Real]
+
+
+ at overload
+def gcd(a: int, b: int) -> int: ...
+ at overload
+def gcd(a: Integral, b: int) -> Integral: ...
+ at overload
+def gcd(a: int, b: Integral) -> Integral: ...
+ at overload
+def gcd(a: Integral, b: Integral) -> Integral: ...
+
+
+class Fraction(Rational):
+    @overload
+    def __init__(self,
+                 numerator: Union[int, Rational] = 0,
+                 denominator: Optional[Union[int, Rational]] = 0,
+                 *,
+                 _normalize: bool = True) -> None: ...
+    @overload
+    def __init__(self, value: float, *, _normalize=True) -> None: ...
+    @overload
+    def __init__(self, value: Decimal, *, _normalize=True) -> None: ...
+    @overload
+    def __init__(self, value: str, *, _normalize=True) -> None: ...
+
+    @classmethod
+    def from_float(cls, f: float) -> 'Fraction': ...
+    @classmethod
+    def from_decimal(cls, dec: Decimal) -> 'Fraction': ...
+    def limit_denominator(self, max_denominator: int = 1000000) -> 'Fraction': ...
+
+    @property
+    def numerator(self) -> int: ...
+    @property
+    def denominator(self) -> int: ...
+
+    def __add__(self, other): ...
+    def __radd__(self, other): ...
+    def __sub__(self, other): ...
+    def __rsub__(self, other): ...
+    def __mul__(self, other): ...
+    def __rmul__(self, other): ...
+    def __truediv__(self, other): ...
+    def __rtruediv__(self, other): ...
+    if sys.version_info < (3, 0):
+        def __div__(self, other): ...
+        def __rdiv__(self, other): ...
+    def __floordiv__(self, other) -> int: ...
+    def __rfloordiv__(self, other) -> int: ...
+    def __mod__(self, other): ...
+    def __rmod__(self, other): ...
+    def __pow__(self, other): ...
+    def __rpow__(self, other): ...
+
+    def __pos__(self) -> 'Fraction': ...
+    def __neg__(self) -> 'Fraction': ...
+    def __abs__(self) -> 'Fraction': ...
+    def __trunc__(self) -> int: ...
+    if sys.version_info >= (3, 0):
+        def __floor__(self) -> int: ...
+        def __ceil__(self) -> int: ...
+        def __round__(self, ndigits=None): ...
+
+    def __hash__(self) -> int: ...
+    def __eq__(self, other: object) -> bool: ...
+    def __lt__(self, other: _ComparableNum) -> bool: ...
+    def __gt__(self, other: _ComparableNum) -> bool: ...
+    def __le__(self, other: _ComparableNum) -> bool: ...
+    def __ge__(self, other: _ComparableNum) -> bool: ...
+    if sys.version_info >= (3, 0):
+        def __bool__(self) -> bool: ...
+    else:
+        def __nonzero__(self) -> bool: ...
+
+    # Not actually defined within fractions.py, but provides more useful
+    # overrides
+    @property
+    def real(self) -> 'Fraction': ...
+    @property
+    def imag(self) -> 'Fraction': ...
+    def conjugate(self) -> 'Fraction': ...
diff --git a/typeshed/stdlib/2and3/hmac.pyi b/typeshed/stdlib/2and3/hmac.pyi
new file mode 100644
index 0000000..59aaf36
--- /dev/null
+++ b/typeshed/stdlib/2and3/hmac.pyi
@@ -0,0 +1,35 @@
+# Stubs for hmac
+
+from typing import Any, Callable, Optional, Union, overload
+from types import ModuleType
+import sys
+
+_B = Union[bytes, bytearray]
+
+# TODO more precise type for object of hashlib
+_Hash = Any
+
+if sys.version_info >= (3, 4):
+    def new(key: _B, msg: Optional[_B] = ...,
+            digestmod: Optional[Union[str, Callable[[], _Hash], ModuleType]] = ...) -> HMAC: ...
+else:
+    def new(key: _B, msg: Optional[_B] = ...,
+            digestmod: Optional[Union[Callable[[], _Hash], ModuleType]] = ...) -> HMAC: ...
+
+class HMAC:
+    if sys.version_info >= (3,):
+        digest_size = ...  # type: int
+    if sys.version_info >= (3, 4):
+        block_size = ...  # type: int
+        name = ...  # type: str
+    def update(self, msg: _B) -> None: ...
+    def digest(self) -> bytes: ...
+    def hexdigest(self) -> str: ...
+    def copy(self) -> HMAC: ...
+
+ at overload
+def compare_digest(a: str, b: str) -> bool: ...
+ at overload
+def compare_digest(a: bytes, b: bytes) -> bool: ...
+ at overload
+def compare_digest(a: bytearray, b: bytearray) -> bool: ...
diff --git a/typeshed/stdlib/2and3/keyword.pyi b/typeshed/stdlib/2and3/keyword.pyi
new file mode 100644
index 0000000..6e0fb5f
--- /dev/null
+++ b/typeshed/stdlib/2and3/keyword.pyi
@@ -0,0 +1,6 @@
+# Stubs for keyword
+
+from typing import Sequence, Text, Union
+
+def iskeyword(s: Union[Text, bytes]) -> bool: ...
+kwlist = ...  # type: Sequence[str]
diff --git a/typeshed/stdlib/2and3/locale.pyi b/typeshed/stdlib/2and3/locale.pyi
new file mode 100644
index 0000000..9ad00e7
--- /dev/null
+++ b/typeshed/stdlib/2and3/locale.pyi
@@ -0,0 +1,104 @@
+# Stubs for locale
+
+from typing import Any, Iterable, List, Mapping, Optional, Sequence, Tuple, Union
+import sys
+
+# workaround for mypy#2010
+if sys.version_info < (3,):
+    from __builtin__ import str as _str
+else:
+    from builtins import str as _str
+
+CODESET = ...  # type: int
+D_T_FMT = ...  # type: int
+D_FMT = ...  # type: int
+T_FMT = ...  # type: int
+T_FMT_AMPM = ...  # type: int
+
+DAY_1 = ...  # type: int
+DAY_2 = ...  # type: int
+DAY_3 = ...  # type: int
+DAY_4 = ...  # type: int
+DAY_5 = ...  # type: int
+DAY_6 = ...  # type: int
+DAY_7 = ...  # type: int
+ABDAY_1 = ...  # type: int
+ABDAY_2 = ...  # type: int
+ABDAY_3 = ...  # type: int
+ABDAY_4 = ...  # type: int
+ABDAY_5 = ...  # type: int
+ABDAY_6 = ...  # type: int
+ABDAY_7 = ...  # type: int
+
+MON_1 = ...  # type: int
+MON_2 = ...  # type: int
+MON_3 = ...  # type: int
+MON_4 = ...  # type: int
+MON_5 = ...  # type: int
+MON_6 = ...  # type: int
+MON_7 = ...  # type: int
+MON_8 = ...  # type: int
+MON_9 = ...  # type: int
+MON_10 = ...  # type: int
+MON_11 = ...  # type: int
+MON_12 = ...  # type: int
+ABMON_1 = ...  # type: int
+ABMON_2 = ...  # type: int
+ABMON_3 = ...  # type: int
+ABMON_4 = ...  # type: int
+ABMON_5 = ...  # type: int
+ABMON_6 = ...  # type: int
+ABMON_7 = ...  # type: int
+ABMON_8 = ...  # type: int
+ABMON_9 = ...  # type: int
+ABMON_10 = ...  # type: int
+ABMON_11 = ...  # type: int
+ABMON_12 = ...  # type: int
+
+RADIXCHAR = ...  # type: int
+THOUSEP = ...  # type: int
+YESEXPR = ...  # type: int
+NOEXPR = ...  # type: int
+CRNCYSTR = ...  # type: int
+
+ERA = ...  # type: int
+ERA_D_T_FMT = ...  # type: int
+ERA_D_FMT = ...  # type: int
+ERA_T_FMT = ...  # type: int
+
+ALT_DIGITS = ...  # type: int
+
+LC_CTYPE = ...  # type: int
+LC_COLLATE = ...  # type: int
+LC_TIME = ...  # type: int
+LC_MONETARY = ...  # type: int
+LC_MESSAGES = ...  # type: int
+LC_NUMERIC = ...  # type: int
+LC_ALL = ...  # type: int
+
+CHAR_MAX = ...  # type: int
+
+class Error(Exception): ...
+
+def setlocale(category: int,
+              locale: Union[_str, Iterable[_str], None] = ...) -> _str: ...
+def localeconv() -> Mapping[_str, Union[int, _str, List[int]]]: ...
+def nl_langinfo(option: int) -> _str: ...
+def getdefaultlocale(envvars: Tuple[_str] = ...) -> Tuple[Optional[_str], Optional[_str]]: ...
+def getlocale(category: int = ...) -> Sequence[_str]: ...
+def getpreferredencoding(do_setlocale: bool = ...) -> _str: ...
+def normalize(localename: _str) -> _str: ...
+def resetlocale(category: int = ...) -> None: ...
+def strcoll(string1: _str, string2: _str) -> int: ...
+def strxfrm(string: _str) -> _str: ...
+def format(format: _str, val: int, grouping: bool = ...,
+           monetary: bool = ...) -> _str: ...
+def format_string(format: _str, val: Sequence[Any],
+                  grouping: bool = ...) -> _str: ...
+def currency(val: int, symbol: bool = ..., grouping: bool = ...,
+             international: bool = ...) -> _str: ...
+if sys.version_info >= (3, 5):
+    def delocalize(string: _str) -> None: ...
+def atof(string: _str) -> float: ...
+def atoi(string: _str) -> int: ...
+def str(float: float) -> _str: ...
diff --git a/typeshed/stdlib/2and3/logging/__init__.pyi b/typeshed/stdlib/2and3/logging/__init__.pyi
new file mode 100644
index 0000000..eb7fcee
--- /dev/null
+++ b/typeshed/stdlib/2and3/logging/__init__.pyi
@@ -0,0 +1,397 @@
+# Stubs for logging (Python 3.4)
+
+from typing import (
+    Any, Callable, Dict, Iterable, Mapping, MutableMapping, Optional, IO,
+    Tuple, Text, Union, overload,
+)
+from string import Template
+from time import struct_time
+from types import TracebackType
+import sys
+import threading
+
+_SysExcInfoType = Union[Tuple[type, BaseException, TracebackType],
+                        Tuple[None, None, None]]
+if sys.version_info >= (3, 5):
+    _ExcInfoType = Union[bool, _SysExcInfoType, Exception]
+else:
+    _ExcInfoType = Union[bool, _SysExcInfoType]
+_ArgsType = Union[Tuple[Any, ...], Dict[str, Any]]
+_FilterType = Union['Filter', Callable[['LogRecord'], int]]
+
+
+class Logger:
+    name = ...  # type: str
+    level = ...  # type: int
+    parent = ...  # type: Union[Logger, PlaceHolder]
+    propagate = ...  # type: bool
+    handlers = ...  # type: List[Handler]
+    disabled = ...  # type: int
+    def setLevel(self, lvl: Union[int, str]) -> None: ...
+    def isEnabledFor(self, lvl: int) -> bool: ...
+    def getEffectiveLevel(self) -> int: ...
+    def getChild(self, suffix: str) -> 'Logger': ...
+    if sys.version_info > (3,):
+        def debug(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                  stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                  **kwargs: Any) -> None: ...
+        def info(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                 stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                 **kwargs: Any) -> None: ...
+        def warning(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                    stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                    **kwargs: Any) -> None: ...
+        def warn(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                 stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                 **kwargs: Any) -> None: ...
+        def error(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                  stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                  **kwargs: Any) -> None: ...
+        def critical(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                     stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                     **kwargs: Any) -> None: ...
+        def log(self, lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                **kwargs: Any) -> None: ...
+        def exception(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                      stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                      **kwargs: Any) -> None: ...
+    else:
+        def debug(self,
+                  msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                  extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def info(self,
+                 msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                 extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def warning(self,
+                    msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                    extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def warn(self,
+                 msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                 extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def error(self,
+                  msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                  extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def critical(self,
+                     msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                     extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def log(self,
+                lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def exception(self,
+                      msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                      extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+    def addFilter(self, filt: _FilterType) -> None: ...
+    def removeFilter(self, filt: _FilterType) -> None: ...
+    def filter(self, record: 'LogRecord') -> bool: ...
+    def addHandler(self, hdlr: 'Handler') -> None: ...
+    def removeHandler(self, hdlr: 'Handler') -> None: ...
+    if sys.version_info >= (3,):
+        def findCaller(self, stack_info: bool = ...) -> Tuple[str, int, str, Optional[str]]: ...
+    else:
+        def findCaller(self) -> Tuple[str, int, str]: ...
+    def handle(self, record: 'LogRecord') -> None: ...
+    if sys.version_info >= (3,):
+        def makeRecord(self, name: str, lvl: int, fn: str, lno: int, msg: Text,
+                       args: Mapping[str, Any],
+                       exc_info: Optional[_SysExcInfoType],
+                       func: Optional[str] = ...,
+                       extra: Optional[Mapping[str, Any]] = ...,
+                       sinfo: Optional[str] = ...) -> None: ...
+    else:
+        def makeRecord(self,
+                       name: str, lvl: int, fn: str, lno: int, msg: Text,
+                       args: Mapping[str, Any],
+                       exc_info: Optional[_SysExcInfoType],
+                       func: Optional[str] = ...,
+                       extra: Optional[Mapping[str, Any]] = ...) -> None: ...
+    if sys.version_info >= (3,):
+        def hasHandlers(self) -> bool: ...
+
+
+CRITICAL = ...  # type: int
+ERROR = ...  # type: int
+WARNING = ...  # type: int
+WARN = ...  # type: int
+INFO = ...  # type: int
+DEBUG = ...  # type: int
+NOTSET = ...  # type: int
+
+
+class Filterer(object):
+    filters = ...  # type: List[Filter]
+    def __init__(self) -> None: ...
+    def addFilter(self, filter: Filter) -> None: ...
+    def removeFilter(self, filter: Filter) -> None: ...
+    def filter(self, record) -> bool: ...
+
+
+class Handler(Filterer):
+    level = ...  # type: int
+    formatter = ...  # type: Optional[Formatter]
+    lock = ...  # type: Optional[threading.Lock]
+    def __init__(self, level: int = ...) -> None: ...
+    def createLock(self) -> None: ...
+    def acquire(self) -> None: ...
+    def release(self) -> None: ...
+    def setLevel(self, lvl: Union[int, str]) -> None: ...
+    def setFormatter(self, form: 'Formatter') -> None: ...
+    def addFilter(self, filt: _FilterType) -> None: ...
+    def removeFilter(self, filt: _FilterType) -> None: ...
+    def filter(self, record: 'LogRecord') -> bool: ...
+    def flush(self) -> None: ...
+    def close(self) -> None: ...
+    def handle(self, record: 'LogRecord') -> None: ...
+    def handleError(self, record: 'LogRecord') -> None: ...
+    def format(self, record: 'LogRecord') -> None: ...
+    def emit(self, record: 'LogRecord') -> None: ...
+
+
+class Formatter:
+    converter = ...  # type: Callable[[Optional[float]], struct_time]
+    _fmt = ...  # type: Optional[str]
+    datefmt = ...  # type: Optional[str]
+    if sys.version_info >= (3,):
+        _style = ...  # type: PercentStyle
+        default_time_format = ...  # type: str
+        default_msec_format = ...  # type: str
+
+    if sys.version_info >= (3,):
+        def __init__(self, fmt: Optional[str] = ...,
+                     datefmt: Optional[str] =...,
+                     style: str = ...) -> None: ...
+    else:
+        def __init__(self,
+                     fmt: Optional[str] = ...,
+                     datefmt: Optional[str] =...) -> None: ...
+
+    def format(self, record: 'LogRecord') -> str: ...
+    def formatTime(self, record: 'LogRecord', datefmt: str = ...) -> str: ...
+    def formatException(self, exc_info: _SysExcInfoType) -> str: ...
+    if sys.version_info >= (3,):
+        def formatStack(self, stack_info: str) -> str: ...
+
+
+class Filter:
+    def __init__(self, name: str = ...) -> None: ...
+    def filter(self, record: 'LogRecord') -> int: ...
+
+
+class LogRecord:
+    args = ...  # type: _ArgsType
+    asctime = ...  # type: str
+    created = ...  # type: int
+    exc_info = ...  # type: Optional[_SysExcInfoType]
+    filename = ...  # type: str
+    funcName = ...  # type: str
+    levelname = ...  # type: str
+    levelno = ...  # type: int
+    lineno = ...  # type: int
+    module = ...  # type: str
+    msecs = ...  # type: int
+    message = ...  # type: str
+    msg = ...  # type: str
+    name = ...  # type: str
+    pathname = ...  # type: str
+    process = ...  # type: int
+    processName = ...  # type: str
+    relativeCreated = ...  # type: int
+    if sys.version_info >= (3,):
+        stack_info = ...  # type: Optional[str]
+    thread = ...  # type: int
+    threadName = ...  # type: str
+    if sys.version_info >= (3,):
+        def __init__(self, name: str, level: int, pathname: str, lineno: int,
+                     msg: Text, args: _ArgsType,
+                     exc_info: Optional[_SysExcInfoType],
+                     func: Optional[str] = ...,
+                     sinfo: Optional[str] = ...) -> None: ...
+    else:
+        def __init__(self,
+                     name: str, level: int, pathname: str, lineno: int,
+                     msg: Text, args: _ArgsType,
+                     exc_info: Optional[_SysExcInfoType],
+                     func: Optional[str] = ...) -> None: ...
+    def getMessage(self) -> str: ...
+
+
+class LoggerAdapter:
+    def __init__(self, logger: Logger, extra: Mapping[str, Any]) -> None: ...
+    def process(self, msg: Text, kwargs: MutableMapping[str, Any]) -> Tuple[str, MutableMapping[str, Any]]: ...
+    if sys.version_info > (3,):
+        def debug(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                  stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                  **kwargs: Any) -> None: ...
+        def info(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                 stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                 **kwargs: Any) -> None: ...
+        def warning(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                    stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                    **kwargs: Any) -> None: ...
+        def error(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                  stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                  **kwargs: Any) -> None: ...
+        def exception(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                      stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                      **kwargs: Any) -> None: ...
+        def critical(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                     stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                     **kwargs: Any) -> None: ...
+        def log(self, lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                **kwargs: Any) -> None: ...
+    else:
+        def debug(self,
+                  msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                  extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def info(self,
+                 msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                 extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def warning(self,
+                    msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                    extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def error(self,
+                  msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                  extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def exception(self,
+                      msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                      extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def critical(self,
+                     msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                     extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+        def log(self,
+                lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+    def isEnabledFor(self, lvl: int) -> bool: ...
+    if sys.version_info >= (3,):
+        def getEffectiveLevel(self) -> int: ...
+        def setLevel(self, lvl: Union[int, str]) -> None: ...
+        def hasHandlers(self) -> bool: ...
+
+
+if sys.version_info >= (3,):
+    def getLogger(name: Optional[str] = ...) -> Logger: ...
+else:
+    @overload
+    def getLogger() -> Logger: ...
+    @overload
+    def getLogger(name: str) -> Logger: ...
+def getLoggerClass() -> type: ...
+if sys.version_info >= (3,):
+    def getLogRecordFactory() -> Callable[..., LogRecord]: ...
+
+if sys.version_info > (3,):
+    def debug(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+              stack_info: bool = ..., extra: Dict[str, Any] = ...,
+              **kwargs: Any) -> None: ...
+    def info(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+             stack_info: bool = ..., extra: Dict[str, Any] = ...,
+             **kwargs: Any) -> None: ...
+    def warning(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                **kwargs: Any) -> None: ...
+    def warn(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+             stack_info: bool = ..., extra: Dict[str, Any] = ...,
+             **kwargs: Any) -> None: ...
+    def error(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+              stack_info: bool = ..., extra: Dict[str, Any] = ...,
+              **kwargs: Any) -> None: ...
+    def critical(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                 stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                 **kwargs: Any) -> None: ...
+    def exception(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                  stack_info: bool = ..., extra: Dict[str, Any] = ...,
+                  **kwargs: Any) -> None: ...
+    def log(lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+            stack_info: bool = ..., extra: Dict[str, Any] = ...,
+            **kwargs: Any) -> None: ...
+else:
+    def debug(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+              extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+    def info(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+             extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+    def warning(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+    def warn(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+             extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+    def error(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+              extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+    def critical(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                 extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+    def exception(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+                  extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+    def log(lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+            extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+
+def disable(lvl: int) -> None: ...
+def addLevelName(lvl: int, levelName: str) -> None: ...
+def getLevelName(lvl: int) -> str: ...
+
+def makeLogRecord(attrdict: Mapping[str, Any]) -> LogRecord: ...
+
+if sys.version_info >= (3,):
+    def basicConfig(*, filename: str = ..., filemode: str = ...,
+                    format: str = ..., datefmt: str = ..., style: str = ...,
+                    level: int = ..., stream: IO[str] = ...,
+                    handlers: Iterable[Handler] = ...) -> None: ...
+else:
+    @overload
+    def basicConfig() -> None: ...
+    @overload
+    def basicConfig(*, filename: str = ..., filemode: str = ...,
+                    format: str = ..., datefmt: str = ...,
+                    level: int = ..., stream: IO[str] = ...) -> None: ...
+def shutdown() -> None: ...
+
+def setLoggerClass(klass: type) -> None: ...
+if sys.version_info >= (3,):
+    def setLogRecordFactory(factory: Callable[..., LogRecord]) -> None: ...
+
+
+if sys.version_info >= (3,):
+    lastResort = ...  # type: Optional['StreamHandler']
+
+
+class StreamHandler(Handler):
+    def __init__(self, stream: Optional[IO[str]] = ...) -> None: ...
+
+
+class FileHandler(Handler):
+    def __init__(self, filename: str, mode: str = ...,
+                 encoding: Optional[str] = ..., delay: bool = ...) -> None: ...
+
+
+class NullHandler(Handler): ...
+
+
+class PlaceHolder:
+    def __init__(self, alogger: Logger) -> None: ...
+    def append(self, alogger: Logger) -> None: ...
+
+
+# Below aren't in module docs but still visible
+
+class RootLogger(Logger): ...
+
+root = ...  # type: RootLogger
+
+
+if sys.version_info >= (3,):
+    class PercentStyle(object):
+        default_format = ...  # type: str
+        asctime_format = ...  # type: str
+        asctime_search = ...  # type: str
+        _fmt = ...  # type: str
+
+        def __init__(self, fmt) -> None: ...
+        def usesTime(self) -> bool: ...
+        def format(self, record: Any) -> str: ...
+
+    class StrFormatStyle(PercentStyle):
+        ...
+
+    class StringTemplateStyle(PercentStyle):
+        _tpl = ...  # type: Template
+
+    BASIC_FORMAT = ...  # type: str
+    _STYLES = ...  # type: Dict[str, Tuple[PercentStyle, str]]
diff --git a/typeshed/stdlib/2and3/logging/config.pyi b/typeshed/stdlib/2and3/logging/config.pyi
new file mode 100644
index 0000000..99f7406
--- /dev/null
+++ b/typeshed/stdlib/2and3/logging/config.pyi
@@ -0,0 +1,25 @@
+# Stubs for logging.config (Python 3.4)
+
+from typing import Any, Callable, Dict, Optional, IO, Union
+import sys
+if sys.version_info >= (3,):
+    # from configparser import RawConfigParser
+    # TODO add RawConfigParser to configparser stubs
+    RawConfigParser = Any
+else:
+    from ConfigParser import RawConfigParser
+
+
+def dictConfig(config: Dict[str, Any]) -> None: ...
+if sys.version_info >= (3, 4):
+    def fileConfig(fname: Union[str, IO[str], RawConfigParser],
+                   defaults: Optional[Dict[str, str]] = ...,
+                   disable_existing_loggers: bool = ...) -> None: ...
+    def listen(port: int = ...,
+               verify: Optional[Callable[[bytes], Optional[bytes]]] = ...) -> None: ...
+else:
+    def fileConfig(fname: Union[str, IO[str]],
+                   defaults: Optional[Dict[str, str]] = ...,
+                   disable_existing_loggers: bool = ...) -> None: ...
+    def listen(port: int = ...) -> None: ...
+def stopListening() -> None: ...
diff --git a/typeshed/stdlib/2and3/logging/handlers.pyi b/typeshed/stdlib/2and3/logging/handlers.pyi
new file mode 100644
index 0000000..50ffa0e
--- /dev/null
+++ b/typeshed/stdlib/2and3/logging/handlers.pyi
@@ -0,0 +1,200 @@
+# Stubs for logging.handlers (Python 2.4)
+
+import datetime
+from logging import Handler, FileHandler, LogRecord
+from socket import SocketType
+import ssl
+import sys
+from typing import Any, Callable, Dict, List, Optional, Tuple, Union, overload
+if sys.version_info >= (3,):
+    from queue import Queue
+else:
+    from Queue import Queue
+# TODO update socket stubs to add SocketKind
+SocketKind = int
+
+
+class WatchedFileHandler(Handler):
+    @overload
+    def __init__(self, filename: str) -> None: ...
+    @overload
+    def __init__(self, filename: str, mode: str) -> None: ...
+    @overload
+    def __init__(self, filename: str, mode: str,
+                 encoding: Optional[str]) -> None: ...
+    @overload
+    def __init__(self, filename: str, mode: str, encoding: Optional[str],
+                 delay: bool) -> None: ...
+
+
+if sys.version_info >= (3,):
+    class BaseRotatingHandler(FileHandler):
+        namer = ...  # type: Optional[Callable[[str], None]]
+        rotator = ...  # type: Optional[Callable[[str, str], None]]
+        def __init__(self, filename: str, mode: str,
+                     encoding: Optional[str] = ...,
+                     delay: bool = ...) -> None: ...
+        def rotation_filename(self, default_name: str) -> None: ...
+        def rotate(self, source: str, dest: str) -> None: ...
+
+
+if sys.version_info >= (3,):
+    class RotatingFileHandler(BaseRotatingHandler):
+        def __init__(self, filename: str, mode: str = ..., maxBytes: int = ...,
+                     backupCount: int = ..., encoding: Optional[str] = ...,
+                     delay: bool = ...) -> None: ...
+        def doRollover(self) -> None: ...
+else:
+    class RotatingFileHandler(Handler):
+        def __init__(self, filename: str, mode: str = ..., maxBytes: int = ...,
+                     backupCount: int = ..., encoding: Optional[str] = ...,
+                     delay: bool = ...) -> None: ...
+        def doRollover(self) -> None: ...
+
+
+if sys.version_info >= (3,):
+    class TimedRotatingFileHandler(BaseRotatingHandler):
+        if sys.version_info >= (3, 4):
+            def __init__(self, filename: str, when: str = ...,
+                         interval: int = ...,
+                         backupCount: int = ..., encoding: Optional[str] = ...,
+                         delay: bool = ..., utc: bool = ...,
+                         atTime: Optional[datetime.datetime] = ...) -> None: ...
+        else:
+            def __init__(self,
+                         filename: str, when: str = ..., interval: int = ...,
+                         backupCount: int = ..., encoding: Optional[str] = ...,
+                         delay: bool = ..., utc: bool = ...) -> None: ...
+        def doRollover(self) -> None: ...
+else:
+    class TimedRotatingFileHandler:
+        def __init__(self,
+                     filename: str, when: str = ..., interval: int = ...,
+                     backupCount: int = ..., encoding: Optional[str] = ...,
+                     delay: bool = ..., utc: bool = ...) -> None: ...
+        def doRollover(self) -> None: ...
+
+
+class SocketHandler(Handler):
+    retryStart = ...  # type: float
+    retryFactor = ...  # type: float
+    retryMax = ...  # type: float
+    if sys.version_info >= (3, 4):
+        def __init__(self, host: str, port: Optional[int]) -> None: ...
+    else:
+        def __init__(self, host: str, port: int) -> None: ...
+    def makeSocket(self) -> SocketType: ...
+    def makePickle(self, record: LogRecord) -> bytes: ...
+    def send(self, packet: bytes) -> None: ...
+    def createSocket(self) -> None: ...
+
+
+class DatagramHandler(SocketHandler): ...
+
+
+class SysLogHandler(Handler):
+    LOG_ALERT = ...  # type: int
+    LOG_CRIT = ...  # type: int
+    LOG_DEBUG = ...  # type: int
+    LOG_EMERG = ...  # type: int
+    LOG_ERR = ...  # type: int
+    LOG_INFO = ...  # type: int
+    LOG_NOTICE = ...  # type: int
+    LOG_WARNING = ...  # type: int
+    LOG_AUTH = ...  # type: int
+    LOG_AUTHPRIV = ...  # type: int
+    LOG_CRON = ...  # type: int
+    LOG_DAEMON = ...  # type: int
+    LOG_FTP = ...  # type: int
+    LOG_KERN = ...  # type: int
+    LOG_LPR = ...  # type: int
+    LOG_MAIL = ...  # type: int
+    LOG_NEWS = ...  # type: int
+    LOG_SYSLOG = ...  # type: int
+    LOG_USER = ...  # type: int
+    LOG_UUCP = ...  # type: int
+    LOG_LOCAL0 = ...  # type: int
+    LOG_LOCAL1 = ...  # type: int
+    LOG_LOCAL2 = ...  # type: int
+    LOG_LOCAL3 = ...  # type: int
+    LOG_LOCAL4 = ...  # type: int
+    LOG_LOCAL5 = ...  # type: int
+    LOG_LOCAL6 = ...  # type: int
+    LOG_LOCAL7 = ...  # type: int
+    def __init__(self, address: Union[Tuple[str, int], str] = ...,
+            facility: int = ..., socktype: SocketKind = ...) -> None: ...
+    def encodePriority(self, facility: Union[int, str],
+                       priority: Union[int, str]) -> int: ...
+    def mapPriority(self, levelName: int) -> str: ...
+
+
+class NTEventLogHandler(Handler):
+    def __init__(self, appname: str, dllname: str = ...,
+                 logtype: str = ...) -> None: ...
+    def getEventCategory(self, record: LogRecord) -> int: ...
+    # TODO correct return value?
+    def getEventType(self, record: LogRecord) -> int: ...
+    def getMessageID(self, record: LogRecord) -> int: ...
+
+
+class SMTPHandler(Handler):
+    # TODO `secure` can also be an empty tuple
+    if sys.version_info >= (3,):
+        def __init__(self, mailhost: Union[str, Tuple[str, int]], fromaddr: str,
+                     toaddrs: List[str], subject: str,
+                     credentials: Optional[Tuple[str, str]] = ...,
+                     secure: Union[Tuple[str], Tuple[str, str], None] =...,
+                     timeout: float = ...) -> None: ...
+    else:
+        def __init__(self,
+                     mailhost: Union[str, Tuple[str, int]], fromaddr: str,
+                     toaddrs: List[str], subject: str,
+                     credentials: Optional[Tuple[str, str]] = ...,
+                     secure: Union[Tuple[str], Tuple[str, str], None] =...) -> None: ...
+    def getSubject(self, record: LogRecord) -> str: ...
+
+
+class BufferingHandler(Handler):
+    def __init__(self, capacity: int) -> None: ...
+    def shouldFlush(self, record: LogRecord) -> bool: ...
+
+class MemoryHandler(BufferingHandler):
+    def __init__(self, capacity: int, flushLevel: int = ...,
+                 target: Optional[Handler] =...) -> None: ...
+    def setTarget(self, target: Handler) -> None: ...
+
+
+class HTTPHandler(Handler):
+    if sys.version_info >= (3, 5):
+        def __init__(self, host: str, url: str, method: str = ...,
+                     secure: bool = ...,
+                     credentials: Optional[Tuple[str, str]] = ...,
+                     context: Optional[ssl.SSLContext] = ...) -> None: ...
+    elif sys.version_info >= (3,):
+        def __init__(self,
+                     host: str, url: str, method: str = ..., secure: bool = ...,
+                     credentials: Optional[Tuple[str, str]] = ...) -> None: ...
+    else:
+        def __init__(self,
+                     host: str, url: str, method: str = ...) -> None: ...
+    def mapLogRecord(self, record: LogRecord) -> Dict[str, Any]: ...
+
+
+if sys.version_info > (3,):
+    class QueueHandler(Handler):
+        def __init__(self, queue: Queue) -> None: ...
+        def prepare(self, record: LogRecord) -> Any: ...
+        def enqueue(self, record: LogRecord) -> None: ...
+
+    class QueueListener:
+        if sys.version_info >= (3, 5):
+            def __init__(self, queue: Queue, *handlers: Handler,
+                         respect_handler_level: bool = ...) -> None: ...
+        else:
+            def __init__(self,
+                         queue: Queue, *handlers: Handler) -> None: ...
+        def dequeue(self, block: bool) -> LogRecord: ...
+        def prepare(self, record: LogRecord) -> Any: ...
+        def start(self) -> None: ...
+        def stop(self) -> None: ...
+        def enqueue_sentinel(self) -> None: ...
diff --git a/typeshed/stdlib/2and3/marshal.pyi b/typeshed/stdlib/2and3/marshal.pyi
new file mode 100644
index 0000000..eb2d57a
--- /dev/null
+++ b/typeshed/stdlib/2and3/marshal.pyi
@@ -0,0 +1,8 @@
+from typing import Any, IO
+
+version = ...  # type: int
+
+def dump(value: Any, file: IO[Any], version: int = ...) -> None: ...
+def load(file: IO[Any]) -> Any: ...
+def dumps(value: Any, version: int = ...) -> str: ...
+def loads(string: str) -> Any: ...
diff --git a/typeshed/stdlib/2and3/math.pyi b/typeshed/stdlib/2and3/math.pyi
new file mode 100644
index 0000000..95f4115
--- /dev/null
+++ b/typeshed/stdlib/2and3/math.pyi
@@ -0,0 +1,66 @@
+# Stubs for math
+# See: http://docs.python.org/2/library/math.html
+
+from typing import Tuple, Iterable, Optional
+
+import sys
+
+e = ...  # type: float
+pi = ...  # type: float
+if sys.version_info >= (3, 5):
+    inf = ...  # type: float
+    nan = ...  # type: float
+if sys.version_info >= (3, 6):
+    tau = ...  # type: float
+
+def acos(x: float) -> float: ...
+def acosh(x: float) -> float: ...
+def asin(x: float) -> float: ...
+def asinh(x: float) -> float: ...
+def atan(x: float) -> float: ...
+def atan2(y: float, x: float) -> float: ...
+def atanh(x: float) -> float: ...
+def ceil(x: float) -> int: ...
+def copysign(x: float, y: float) -> float: ...
+def cos(x: float) -> float: ...
+def cosh(x: float) -> float: ...
+def degrees(x: float) -> float: ...
+def erf(x: float) -> float: ...
+def erfc(x: float) -> float: ...
+def exp(x: float) -> float: ...
+def expm1(x: float) -> float: ...
+def fabs(x: float) -> float: ...
+def factorial(x: int) -> int: ...
+if sys.version_info >= (3,):
+    def floor(x: float) -> int: ...
+else:
+    def floor(x: float) -> float: ...
+def fmod(x: float, y: float) -> float: ...
+def frexp(x: float) -> Tuple[float, int]: ...
+def fsum(iterable: Iterable) -> float: ...
+def gamma(x: float) -> float: ...
+if sys.version_info >= (3, 5):
+    def gcd(a: int, b: int) -> int: ...
+def hypot(x: float, y: float) -> float: ...
+if sys.version_info >= (3, 5):
+    def isclose(a: float, b: float, rel_tol: float = ..., abs_tol: float = ...) -> bool: ...
+def isinf(x: float) -> bool: ...
+if sys.version_info >= (3,):
+    def isfinite(x: float) -> bool: ...
+def isnan(x: float) -> bool: ...
+def ldexp(x: float, i: int) -> float: ...
+def lgamma(x: float) -> float: ...
+def log(x: float, base: float = ...) -> float: ...
+def log10(x: float) -> float: ...
+def log1p(x: float) -> float: ...
+if sys.version_info >= (3, 3):
+    def log2(x: float) -> float: ...
+def modf(x: float) -> Tuple[float, float]: ...
+def pow(x: float, y: float) -> float: ...
+def radians(x: float) -> float: ...
+def sin(x: float) -> float: ...
+def sinh(x: float) -> float: ...
+def sqrt(x: float) -> float: ...
+def tan(x: float) -> float: ...
+def tanh(x: float) -> float: ...
+def trunc(x: float) -> int: ...
diff --git a/typeshed/stdlib/2and3/mimetypes.pyi b/typeshed/stdlib/2and3/mimetypes.pyi
new file mode 100644
index 0000000..493e612
--- /dev/null
+++ b/typeshed/stdlib/2and3/mimetypes.pyi
@@ -0,0 +1,38 @@
+# Stubs for mimetypes
+
+from typing import Dict, IO, List, Optional, Sequence, Text, Tuple
+import sys
+
+def guess_type(url: Text,
+               strict: bool = ...) -> Tuple[Optional[str], Optional[str]]: ...
+def guess_all_extensions(type: str, strict: bool = ...) -> List[str]: ...
+def guess_extension(type: str, strict: bool = ...) -> Optional[str]: ...
+
+def init(files: Optional[Sequence[str]] = ...) -> None: ...
+def read_mime_types(filename: str) -> Optional[Dict[str, str]]: ...
+def add_type(type: str, ext: str, strict: bool = ...) -> None: ...
+
+inited = ...  # type: bool
+knownfiles = ...  # type: List[str]
+suffix_map = ...  # type: Dict[str, str]
+encodings_map = ...  # type: Dict[str, str]
+types_map = ...  # type: Dict[str, str]
+common_types = ...  # type: Dict[str, str]
+
+class MimeTypes:
+    suffix_map = ...  # type: Dict[str, str]
+    encodings_map = ...  # type: Dict[str, str]
+    types_map = ...  # type: Tuple[Dict[str, str], Dict[str, str]]
+    types_map_inv = ...  # type: Tuple[Dict[str, str], Dict[str, str]]
+    def __init__(self, filenames: Tuple[str, ...] = ...,
+                 strict: bool = ...) -> None: ...
+    def guess_extension(self, type: str,
+                        strict: bool = ...) -> Optional[str]: ...
+    def guess_type(self, url: str,
+                   strict: bool = ...) -> Tuple[Optional[str], Optional[str]]: ...
+    def guess_all_extensions(self, type: str,
+                             strict: bool = ...) -> List[str]: ...
+    def read(self, filename: str, strict: bool = ...) -> None: ...
+    def readfp(self, fp: IO[str], strict: bool = ...) -> None: ...
+    if sys.platform == 'win32':
+        def read_windows_registry(self, strict: bool = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/mmap.pyi b/typeshed/stdlib/2and3/mmap.pyi
new file mode 100644
index 0000000..d0be9df
--- /dev/null
+++ b/typeshed/stdlib/2and3/mmap.pyi
@@ -0,0 +1,79 @@
+# Stubs for mmap
+
+import sys
+from types import TracebackType
+from typing import (Optional, Sequence, Union, Generic, TypeVar, overload,
+                    Iterable, Container, Sized, Reversible, Type)
+
+
+_T = TypeVar('_T', str, bytes)
+
+# TODO already in PEP, have to get added to mypy
+_C = TypeVar('_C')
+class _ContextManager(Generic[_C]):
+    def __enter__(self) -> _C: ...
+    def __exit__(self, exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+
+
+ACCESS_READ = ...  # type: int
+ACCESS_WRITE = ...  # type: int
+ACCESS_COPY = ...  # type: int
+
+ALLOCATIONGRANULARITY = ...  # type: int
+
+if sys.platform != 'win32':
+    MAP_PRIVATE = ...  # type: int
+    MAP_SHARED = ...  # type: int
+    PROT_READ = ...  # type: int
+    PROT_WRITE = ...  # type: int
+
+    PAGESIZE = ...  # type: int
+
+class _mmap(Generic[_T]):
+    if sys.platform == 'win32':
+        def __init__(self, fileno: int, length: int,
+                     tagname: Optional[str] = ..., access: int = ...,
+                     offset: int = ...) -> None: ...
+    else:
+        def __init__(self,
+                     fileno: int, length: int, flags: int = ...,
+                     prot: int = ..., access: int = ...,
+                     offset: int = ...) -> None: ...
+    def close(self) -> None: ...
+    def find(self, sub: _T,
+             start: int = ..., end: int = ...) -> int: ...
+    def flush(self, offset: int = ..., size: int = ...) -> int: ...
+    def move(self, dest: int, src: int, count: int) -> None: ...
+    def read(self, n: int = ...) -> _T: ...
+    def read_byte(self) -> _T: ...
+    def readline(self) -> _T: ...
+    def resize(self, newsize: int) -> None: ...
+    def seek(self, pos: int, whence: int = ...) -> None: ...
+    def size(self) -> int: ...
+    def tell(self) -> int: ...
+    def write(self, bytes: _T) -> None: ...
+    def write_byte(self, byte: _T) -> None: ...
+    def __len__(self) -> int: ...
+
+if sys.version_info >= (3,):
+    class mmap(_mmap, _ContextManager[mmap], Iterable[bytes], Container[bytes],
+               Sized, Reversible[bytes]):
+        closed = ...  # type: bool
+        def rfind(self, sub: bytes, start: int = ..., stop: int = ...) -> int: ...
+        @overload
+        def __getitem__(self, index: int) -> int: ...
+        @overload
+        def __getitem__(self, index: slice) -> bytes: ...
+        def __delitem__(self, index: Union[int, slice]) -> None: ...
+        @overload
+        def __setitem__(self, index: int, object: int) -> None: ...
+        @overload
+        def __setitem__(self, index: slice, object: bytes) -> None: ...
+else:
+    class mmap(_mmap, Sequence[bytes]):
+        def rfind(self, string: bytes, start: int = ..., stop: int = ...) -> int: ...
+        def __getitem__(self, index: Union[int, slice]) -> bytes: ...
+        def __delitem__(self, index: Union[int, slice]) -> None: ...
+        def __setitem__(self, index: Union[int, slice], object: bytes) -> None: ...
diff --git a/typeshed/stdlib/2and3/numbers.pyi b/typeshed/stdlib/2and3/numbers.pyi
new file mode 100644
index 0000000..e4f7603
--- /dev/null
+++ b/typeshed/stdlib/2and3/numbers.pyi
@@ -0,0 +1,140 @@
+# Stubs for numbers (Python 3.5)
+# See https://docs.python.org/2.7/library/numbers.html
+# and https://docs.python.org/3/library/numbers.html
+#
+# Note: these stubs are incomplete. The more complex type
+# signatures are currently omitted.
+
+from typing import Any, Optional, TypeVar
+from abc import ABCMeta, abstractmethod
+import sys
+
+class Number(metaclass=ABCMeta):
+    @abstractmethod
+    def __hash__(self) -> int: ...
+
+class Complex(Number):
+    @abstractmethod
+    def __complex__(self) -> complex: ...
+    if sys.version_info >= (3, 0):
+        def __bool__(self) -> bool: ...
+    else:
+        def __nonzero__(self) -> bool: ...
+    @property
+    @abstractmethod
+    def real(self): ...
+    @property
+    @abstractmethod
+    def imag(self): ...
+    @abstractmethod
+    def __add__(self, other): ...
+    @abstractmethod
+    def __radd__(self, other): ...
+    @abstractmethod
+    def __neg__(self): ...
+    @abstractmethod
+    def __pos__(self): ...
+    def __sub__(self, other): ...
+    def __rsub__(self, other): ...
+    @abstractmethod
+    def __mul__(self, other): ...
+    @abstractmethod
+    def __rmul__(self, other): ...
+    if sys.version_info < (3, 0):
+        @abstractmethod
+        def __div__(self, other): ...
+        @abstractmethod
+        def __rdiv__(self, other): ...
+    @abstractmethod
+    def __truediv__(self, other): ...
+    @abstractmethod
+    def __rtruediv__(self, other): ...
+    @abstractmethod
+    def __pow__(self, exponent): ...
+    @abstractmethod
+    def __rpow__(self, base): ...
+    def __abs__(self): ...
+    def conjugate(self): ...
+    def __eq__(self, other: object) -> bool: ...
+    if sys.version_info < (3, 0):
+        def __ne__(self, other: object) -> bool: ...
+
+class Real(Complex):
+    @abstractmethod
+    def __float__(self) -> float: ...
+    @abstractmethod
+    def __trunc__(self) -> int: ...
+    if sys.version_info >= (3, 0):
+        @abstractmethod
+        def __floor__(self) -> int: ...
+        @abstractmethod
+        def __ceil__(self) -> int: ...
+        @abstractmethod
+        def __round__(self, ndigits: Optional[int] = None): ...
+    def __divmod__(self, other): ...
+    def __rdivmod__(self, other): ...
+    @abstractmethod
+    def __floordiv__(self, other): ...
+    @abstractmethod
+    def __rfloordiv__(self, other): ...
+    @abstractmethod
+    def __mod__(self, other): ...
+    @abstractmethod
+    def __rmod__(self, other): ...
+    @abstractmethod
+    def __lt__(self, other) -> bool: ...
+    @abstractmethod
+    def __le__(self, other) -> bool: ...
+    def __complex__(self) -> complex: ...
+    @property
+    def real(self): ...
+    @property
+    def imag(self): ...
+    def conjugate(self): ...
+
+class Rational(Real):
+    @property
+    @abstractmethod
+    def numerator(self) -> int: ...
+    @property
+    @abstractmethod
+    def denominator(self) -> int: ...
+    def __float__(self) -> float: ...
+
+class Integral(Rational):
+    if sys.version_info >= (3, 0):
+        @abstractmethod
+        def __int__(self) -> int: ...
+    else:
+        @abstractmethod
+        def __long__(self) -> long: ...
+    def __index__(self) -> int: ...
+    @abstractmethod
+    def __pow__(self, exponent, modulus=None): ...
+    @abstractmethod
+    def __lshift__(self, other): ...
+    @abstractmethod
+    def __rlshift__(self, other): ...
+    @abstractmethod
+    def __rshift__(self, other): ...
+    @abstractmethod
+    def __rrshift__(self, other): ...
+    @abstractmethod
+    def __and__(self, other): ...
+    @abstractmethod
+    def __rand__(self, other): ...
+    @abstractmethod
+    def __xor__(self, other): ...
+    @abstractmethod
+    def __rxor__(self, other): ...
+    @abstractmethod
+    def __or__(self, other): ...
+    @abstractmethod
+    def __ror__(self, other): ...
+    @abstractmethod
+    def __invert__(self): ...
+    def __float__(self) -> float: ...
+    @property
+    def numerator(self) -> int: ...
+    @property
+    def denominator(self) -> int: ...
diff --git a/typeshed/stdlib/2and3/operator.pyi b/typeshed/stdlib/2and3/operator.pyi
new file mode 100644
index 0000000..eafc37c
--- /dev/null
+++ b/typeshed/stdlib/2and3/operator.pyi
@@ -0,0 +1,227 @@
+# Stubs for operator
+
+from typing import (
+    Any, Callable, Container, Mapping, MutableMapping, MutableSequence, Sequence, SupportsAbs, Tuple,
+    TypeVar, overload,
+)
+import sys
+
+
+_T = TypeVar('_T')
+_K = TypeVar('_K')
+_V = TypeVar('_V')
+
+
+def lt(a: Any, b: Any) -> Any: ...
+def le(a: Any, b: Any) -> Any: ...
+def eq(a: Any, b: Any) -> Any: ...
+def ne(a: Any, b: Any) -> Any: ...
+def ge(a: Any, b: Any) -> Any: ...
+def gt(a: Any, b: Any) -> Any: ...
+def __lt__(a: Any, b: Any) -> Any: ...
+def __le__(a: Any, b: Any) -> Any: ...
+def __eq__(a: Any, b: Any) -> Any: ...
+def __ne__(a: Any, b: Any) -> Any: ...
+def __ge__(a: Any, b: Any) -> Any: ...
+def __gt__(a: Any, b: Any) -> Any: ...
+
+def not_(obj: Any) -> bool: ...
+def __not__(obj: Any) -> bool: ...
+
+def truth(x: Any) -> bool: ...
+
+def is_(a: Any, b: Any) -> bool: ...
+
+def is_not(a: Any, b: Any) -> bool: ...
+
+def abs(x: SupportsAbs) -> Any: ...
+def __abs__(a: SupportsAbs) -> Any: ...
+
+def add(a: Any, b: Any) -> Any: ...
+def __add__(a: Any, b: Any) -> Any: ...
+
+def and_(a: Any, b: Any) -> Any: ...
+def __and__(a: Any, b: Any) -> Any: ...
+
+if sys.version_info < (3, ):
+    def div(a: Any, b: Any) -> Any: ...
+    def __div__(a: Any, b: Any) -> Any: ...
+
+def floordiv(a: Any, b: Any) -> Any: ...
+def __floordiv__(a: Any, b: Any) -> Any: ...
+
+def index(a: Any) -> int: ...
+def __index__(a: Any) -> int: ...
+
+def inv(obj: Any) -> Any: ...
+def invert(obj: Any) -> Any: ...
+def __inv__(obj: Any) -> Any: ...
+def __invert__(obj: Any) -> Any: ...
+
+def lshift(a: Any, b: Any) -> Any: ...
+def __lshift__(a: Any, b: Any) -> Any: ...
+
+def mod(a: Any, b: Any) -> Any: ...
+def __mod__(a: Any, b: Any) -> Any: ...
+
+def mul(a: Any, b: Any) -> Any: ...
+def __mul__(a: Any, b: Any) -> Any: ...
+
+if sys.version_info >= (3, 5):
+    def matmul(a: Any, b: Any) -> Any: ...
+    def __matmul__(a: Any, b: Any) -> Any: ...
+
+def neg(obj: Any) -> Any: ...
+def __neg__(obj: Any) -> Any: ...
+
+def or_(a: Any, b: Any) -> Any: ...
+def __or__(a: Any, b: Any) -> Any: ...
+
+def pos(obj: Any) -> Any: ...
+def __pos__(obj: Any) -> Any: ...
+
+def pow(a: Any, b: Any) -> Any: ...
+def __pow__(a: Any, b: Any) -> Any: ...
+
+def rshift(a: Any, b: Any) -> Any: ...
+def __rshift__(a: Any, b: Any) -> Any: ...
+
+def sub(a: Any, b: Any) -> Any: ...
+def __sub__(a: Any, b: Any) -> Any: ...
+
+def truediv(a: Any, b: Any) -> Any: ...
+def __truediv__(a: Any, b: Any) -> Any: ...
+
+def xor(a: Any, b: Any) -> Any: ...
+def __xor__(a: Any, b: Any) -> Any: ...
+
+def concat(a: Sequence[_T], b: Sequence[_T]) -> Sequence[_T]: ...
+def __concat__(a: Sequence[_T], b: Sequence[_T]) -> Sequence[_T]: ...
+
+def contains(a: Container[Any], b: Any) -> bool: ...
+def __contains__(a: Container[Any], b: Any) -> bool: ...
+
+def countOf(a: Container[Any], b: Any) -> int: ...
+
+ at overload
+def delitem(a: MutableSequence[_T], b: int) -> None: ...
+ at overload
+def delitem(a: MutableMapping[_K, _V], b: _K) -> None: ...
+ at overload
+def __delitem__(a: MutableSequence[_T], b: int) -> None: ...
+ at overload
+def __delitem__(a: MutableMapping[_K, _V], b: _K) -> None: ...
+
+if sys.version_info < (3, ):
+    def delslice(a: MutableSequence[Any], b: int, c: int) -> None: ...
+    def __delslice__(a: MutableSequence[Any], b: int, c: int) -> None: ...
+
+ at overload
+def getitem(a: Sequence[_T], b: int) -> _T: ...
+ at overload
+def getitem(a: Mapping[_K, _V], b: _K) -> _V: ...
+ at overload
+def __getitem__(a: Sequence[_T], b: int) -> _T: ...
+ at overload
+def __getitem__(a: Mapping[_K, _V], b: _K) -> _V: ...
+
+if sys.version_info < (3, ):
+    def getslice(a: Sequence[_T], b: int, c: int) -> Sequence[_T]: ...
+    def __getslice__(a: Sequence[_T], b: int, c: int) -> Sequence[_T]: ...
+
+def indexOf(a: Sequence[_T], b: _T) -> int: ...
+
+if sys.version_info < (3, ):
+    def repeat(a: Any, b: int) -> Any: ...
+    def __repeat__(a: Any, b: int) -> Any: ...
+
+if sys.version_info < (3, ):
+    def sequenceIncludes(a: Container[Any], b: Any) -> bool: ...
+
+ at overload
+def setitem(a: MutableSequence[_T], b: int, c: _T) -> None: ...
+ at overload
+def setitem(a: MutableMapping[_K, _V], b: _K, c: _V) -> None: ...
+ at overload
+def __setitem__(a: MutableSequence[_T], b: int, c: _T) -> None: ...
+ at overload
+def __setitem__(a: MutableMapping[_K, _V], b: _K, c: _V) -> None: ...
+
+if sys.version_info < (3, ):
+    def setslice(a: MutableSequence[_T], b: int, c: int, v: Sequence[_T]) -> None: ...
+    def __setslice__(a: MutableSequence[_T], b: int, c: int, v: Sequence[_T]) -> None: ...
+
+
+if sys.version_info >= (3, 4):
+    def length_hint(obj: Any, default: int = ...) -> int: ...
+
+ at overload
+def attrgetter(attr: str) -> Callable[[Any], Any]: ...
+ at overload
+def attrgetter(*attrs: str) -> Callable[[Any], Tuple[Any, ...]]: ...
+
+ at overload
+def itemgetter(item: Any) -> Callable[[Any], Any]: ...
+ at overload
+def itemgetter(*items: Any) -> Callable[[Any], Tuple[Any, ...]]: ...
+
+def methodcaller(name: str, *args: Any, **kwargs: Any) -> Callable[..., Any]: ...
+
+
+def iadd(a: Any, b: Any) -> Any: ...
+def __iadd__(a: Any, b: Any) -> Any: ...
+
+def iand(a: Any, b: Any) -> Any: ...
+def __iand__(a: Any, b: Any) -> Any: ...
+
+def iconcat(a: Any, b: Any) -> Any: ...
+def __iconcat__(a: Any, b: Any) -> Any: ...
+
+if sys.version_info < (3, ):
+    def idiv(a: Any, b: Any) -> Any: ...
+    def __idiv__(a: Any, b: Any) -> Any: ...
+
+def ifloordiv(a: Any, b: Any) -> Any: ...
+def __ifloordiv__(a: Any, b: Any) -> Any: ...
+
+def ilshift(a: Any, b: Any) -> Any: ...
+def __ilshift__(a: Any, b: Any) -> Any: ...
+
+def imod(a: Any, b: Any) -> Any: ...
+def __imod__(a: Any, b: Any) -> Any: ...
+
+def imul(a: Any, b: Any) -> Any: ...
+def __imul__(a: Any, b: Any) -> Any: ...
+
+if sys.version_info >= (3, 5):
+    def imatmul(a: Any, b: Any) -> Any: ...
+    def __imatmul__(a: Any, b: Any) -> Any: ...
+
+def ior(a: Any, b: Any) -> Any: ...
+def __ior__(a: Any, b: Any) -> Any: ...
+
+def ipow(a: Any, b: Any) -> Any: ...
+def __ipow__(a: Any, b: Any) -> Any: ...
+
+if sys.version_info < (3, ):
+    def irepeat(a: Any, b: int) -> Any: ...
+    def __irepeat__(a: Any, b: int) -> Any: ...
+
+def irshift(a: Any, b: Any) -> Any: ...
+def __irshift__(a: Any, b: Any) -> Any: ...
+
+def isub(a: Any, b: Any) -> Any: ...
+def __isub__(a: Any, b: Any) -> Any: ...
+
+def itruediv(a: Any, b: Any) -> Any: ...
+def __itruediv__(a: Any, b: Any) -> Any: ...
+
+def ixor(a: Any, b: Any) -> Any: ...
+def __ixor__(a: Any, b: Any) -> Any: ...
+
+
+if sys.version_info < (3, ):
+    def isCallable(x: Any) -> bool: ...
+    def isMappingType(x: Any) -> bool: ...
+    def isNumberType(x: Any) -> bool: ...
+    def isSequenceType(x: Any) -> bool: ...
diff --git a/typeshed/stdlib/2and3/pkgutil.pyi b/typeshed/stdlib/2and3/pkgutil.pyi
new file mode 100644
index 0000000..e6d4672
--- /dev/null
+++ b/typeshed/stdlib/2and3/pkgutil.pyi
@@ -0,0 +1,31 @@
+# Stubs for pkgutil
+
+from typing import Any, Callable, Generator, IO, Iterable, List, Optional, Tuple
+import sys
+
+if sys.version_info >= (3,):
+    from importlib.abc import Loader
+else:
+    Loader = Any
+
+_YMFNI = Generator[Tuple[Any, str, bool], None, None]
+
+
+def extend_path(path: Iterable[str], name: str) -> Iterable[str]: ...
+
+class ImpImporter:
+    def __init__(self, dirname: Optional[str] = ...) -> None: ...
+
+class ImpLoader:
+    def __init__(self, fullname: str, file: IO[str], filename: str,
+                 etc: Tuple[str, str, int]) -> None: ...
+
+def find_loader(fullname: str) -> Loader: ...
+def get_importer(path_item: str) -> Any: ...  # TODO precise type
+def get_loader(module_or_name: str) -> Loader: ...
+def iter_importers(fullname: str = ...) -> Generator[Any, None, None]: ...  # TODO precise type
+def iter_modules(path: Optional[List[str]] = ...,
+                 prefix: str = ...) -> _YMFNI: ...  # TODO precise type
+def walk_packages(path: Optional[str] = ..., prefix: str = ...,
+                  onerror: Optional[Callable[[str], None]] = ...) -> _YMFNI: ...
+def get_data(package: str, resource: str) -> bytes: ...
diff --git a/typeshed/stdlib/2and3/plistlib.pyi b/typeshed/stdlib/2and3/plistlib.pyi
new file mode 100644
index 0000000..2790199
--- /dev/null
+++ b/typeshed/stdlib/2and3/plistlib.pyi
@@ -0,0 +1,60 @@
+# Stubs for plistlib
+
+from typing import (
+    Any, IO, Mapping, MutableMapping, Optional, Union,
+    Type, TypeVar,
+)
+from typing import Dict as DictT
+from enum import Enum
+import sys
+
+mm = MutableMapping[str, Any]
+_D = TypeVar('_D', mm)
+if sys.version_info >= (3,):
+    _Path = str
+else:
+    _Path = Union[str, unicode]
+
+
+if sys.version_info >= (3,):
+    class PlistFormat(Enum):
+        FMT_XML = ...  # type: PlistFormat
+        FMT_BINARY = ...  # type: PlistFormat
+
+if sys.version_info >= (3, 4):
+    def load(fp: IO[bytes], *, fmt: Optional[PlistFormat] = ...,
+             use_builtin_types: bool, dict_type: Type[_D] =...) -> _D: ...
+    def loads(data: bytes, *, fmt: Optional[PlistFormat] = ...,
+              use_builtin_types: bool = ..., dict_type: Type[_D] = ...) -> _D: ...
+    def dump(value: Mapping[str, Any], fp: IO[bytes], *,
+             fmt: PlistFormat =..., sort_keys: bool = ...,
+             skipkeys: bool = ...) -> None: ...
+    def dumps(value: Mapping[str, Any], *, fmt: PlistFormat = ...,
+              skipkeys: bool = ..., sort_keys: bool = ...) -> bytes: ...
+
+def readPlist(pathOrFile: Union[_Path, IO[bytes]]) -> DictT[str, Any]: ...
+def writePlist(value: Mapping[str, Any], pathOrFile: Union[_Path, IO[bytes]]) -> None: ...
+def readPlistFromBytes(data: bytes) -> DictT[str, Any]: ...
+def writePlistToBytes(value: Mapping[str, Any]) -> bytes: ...
+if sys.version_info < (3,):
+    def readPlistFromResource(path: _Path, restype: str = ...,
+                              resid: int = ...) -> DictT[str, Any]: ...
+    def writePlistToResource(rootObject: Mapping[str, Any], path: _Path,
+                             restype: str = ...,
+                             resid: int = ...) -> None: ...
+    def readPlistFromString(data: str) -> DictT[str, Any]: ...
+    def writePlistToString(rootObject: Mapping[str, Any]) -> str: ...
+
+if sys.version_info >= (3,):
+    class Dict(dict):
+        def __getattr__(self, attr: str) -> Any: ...
+        def __setattr__(self, attr: str, value: Any) -> None: ...
+        def __delattr__(self, attr: str) -> None: ...
+
+class Data:
+    data = ...  # type: bytes
+    def __init__(self, data: bytes) -> None: ...
+
+if sys.version_info >= (3,):
+    FMT_XML = PlistFormat.FMT_XML
+    FMT_BINARY = PlistFormat.FMT_BINARY
diff --git a/typeshed/stdlib/2and3/profile.pyi b/typeshed/stdlib/2and3/profile.pyi
new file mode 100644
index 0000000..21a7c8f
--- /dev/null
+++ b/typeshed/stdlib/2and3/profile.pyi
@@ -0,0 +1,21 @@
+from typing import Any, Callable, Dict, Optional, TypeVar
+
+def run(statement: str, filename: Optional[str] = ..., sort: int = ...) -> None: ...
+def runctx(statement: str, globals: Dict[str, Any], locals: Dict[str, Any], filename: Optional[str] = ..., sort: int = ...) -> None: ...
+
+_SelfT = TypeVar('_SelfT', bound='Profile')
+_T = TypeVar('_T')
+
+class Profile:
+    def __init__(self, timer: Optional[Callable[[], float]] = ..., bias: Optional[int] = ...) -> None: ...
+    def set_cmd(self, cmd: str) -> None: ...
+    def simulate_call(self, name: str) -> None: ...
+    def simulate_cmd_complete(self) -> None: ...
+    def print_stats(self, sort: int = ...) -> None: ...
+    def dump_stats(self, file: str) -> None: ...
+    def create_stats(self) -> None: ...
+    def snapshot_stats(self) -> None: ...
+    def run(self: _SelfT, cmd: str) -> _SelfT: ...
+    def runctx(self: _SelfT, cmd: str, globals: Dict[str, Any], locals: Dict[str, Any]) -> _SelfT: ...
+    def runcall(self, func: Callable[..., _T], *args: Any, **kw: Any) -> _T: ...
+    def calibrate(self, m: int, verbose: int = ...) -> float: ...
diff --git a/typeshed/stdlib/2and3/pstats.pyi b/typeshed/stdlib/2and3/pstats.pyi
new file mode 100644
index 0000000..9a872c2
--- /dev/null
+++ b/typeshed/stdlib/2and3/pstats.pyi
@@ -0,0 +1,33 @@
+from profile import Profile
+from cProfile import Profile as cProfile
+from typing import Any, AnyStr, Dict, IO, Iterable, List, Text, Tuple, TypeVar, Union, overload
+
+_Selector = Union[str, float, int]
+_T = TypeVar('_T', bound='Stats')
+
+class Stats:
+    def __init__(self: _T, __arg: Union[None, str, Text, Profile, cProfile] = ...,
+                 *args: Union[None, str, Text, Profile, cProfile, _T],
+                 stream: IO[Any]) -> None: ...
+    def init(self, arg: Union[None, str, Text, Profile, cProfile]) -> None: ...
+    def load_stats(self, arg: Union[None, str, Text, Profile, cProfile]) -> None: ...
+    def get_top_level_stats(self) -> None: ...
+    def add(self: _T, *arg_list: Union[None, str, Text, Profile, cProfile, _T]) -> _T: ...
+    def dump_stats(self, filename: AnyStr) -> None: ...
+    def get_sort_arg_defs(self) -> Dict[str, Tuple[Tuple[Tuple[int, int], ...], str]]: ...
+    @overload
+    def sort_stats(self: _T, field: int) -> _T: ...
+    @overload
+    def sort_stats(self: _T, *field: str) -> _T: ...
+    def reverse_order(self: _T) -> _T: ...
+    def strip_dirs(self: _T) -> _T: ...
+    def calc_callees(self) -> None: ...
+    def eval_print_amount(self, sel: _Selector, list: List[str], msg: str) -> Tuple[List[str], str]: ...
+    def get_print_list(self, sel_list: Iterable[_Selector]) -> Tuple[int, List[str]]: ...
+    def print_stats(self: _T, *amount: _Selector) -> _T: ...
+    def print_callees(self: _T, *amount: _Selector) -> _T: ...
+    def print_callers(self: _T, *amount: _Selector) -> _T: ...
+    def print_call_heading(self, name_size: int, column_title: str) -> None: ...
+    def print_call_line(self, name_size: int, source: str, call_dict: Dict[str, Any], arrow: str = ...) -> None: ...
+    def print_title(self) -> None: ...
+    def print_line(self, func: str) -> None: ...
diff --git a/typeshed/stdlib/2and3/readline.pyi b/typeshed/stdlib/2and3/readline.pyi
new file mode 100644
index 0000000..aff2deb
--- /dev/null
+++ b/typeshed/stdlib/2and3/readline.pyi
@@ -0,0 +1,41 @@
+# Stubs for readline
+
+from typing import Callable, Optional, Sequence
+import sys
+
+_CompleterT = Optional[Callable[[str, int], Optional[str]]]
+_CompDispT = Optional[Callable[[str, Sequence[str], int], None]]
+
+
+def parse_and_bind(string: str) -> None: ...
+def read_init_file(filename: str = ...) -> None: ...
+
+def get_line_buffer() -> str: ...
+def insert_text(string: str) -> None: ...
+def redisplay() -> None: ...
+
+def read_history_file(filename: str = ...) -> None: ...
+def write_history_file(filename: str = ...) -> None: ...
+if sys.version_info >= (3, 5):
+    def append_history_file(nelements: int, filename: str = ...) -> None: ...
+def get_history_length() -> int: ...
+def set_history_length(length: int) -> None: ...
+
+def clear_history() -> None: ...
+def get_current_history_length() -> int: ...
+def get_history_item(index: int) -> str: ...
+def remove_history_item(pos: int) -> None: ...
+def replace_history_item(pos: int, line: str) -> None: ...
+def add_history(string: str) -> None: ...
+
+def set_startup_hook(function: Optional[Callable[[], None]] = ...) -> None: ...
+def set_pre_input_hook(function: Optional[Callable[[], None]] = ...) -> None: ...
+
+def set_completer(function: _CompleterT = ...) -> None: ...
+def get_completer() -> _CompleterT: ...
+def get_completion_type() -> int: ...
+def get_begidx() -> int: ...
+def get_endidx() -> int: ...
+def set_completer_delims(string: str) -> None: ...
+def get_completer_delims() -> str: ...
+def set_completion_display_matches_hook(function: _CompDispT = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/rlcompleter.pyi b/typeshed/stdlib/2and3/rlcompleter.pyi
new file mode 100644
index 0000000..17e98c6
--- /dev/null
+++ b/typeshed/stdlib/2and3/rlcompleter.pyi
@@ -0,0 +1,13 @@
+# Stubs for rlcompleter
+
+from typing import Optional, Union
+import sys
+
+if sys.version_info >= (3,):
+    _Text = str
+else:
+    _Text = Union[str, unicode]
+
+
+class Completer:
+    def complete(self, text: _Text, state: int) -> Optional[str]: ...
diff --git a/typeshed/stdlib/2and3/site.pyi b/typeshed/stdlib/2and3/site.pyi
new file mode 100644
index 0000000..411677a
--- /dev/null
+++ b/typeshed/stdlib/2and3/site.pyi
@@ -0,0 +1,17 @@
+# Stubs for site
+
+from typing import List, Iterable, Optional
+import sys
+
+PREFIXES = ...  # type: List[str]
+ENABLE_USER_SITE = ...  # type: Optional[bool]
+USER_SITE = ...  # type: Optional[str]
+USER_BASE = ...  # type: Optional[str]
+
+if sys.version_info < (3,):
+    def main() -> None: ...
+def addsitedir(sitedir: str,
+               known_paths: Optional[Iterable[str]] = ...) -> None: ...
+def getsitepackages(prefixes: Optional[Iterable[str]] = ...) -> List[str]: ...
+def getuserbase() -> str: ...
+def getusersitepackages() -> str: ...
diff --git a/typeshed/stdlib/2and3/tarfile.pyi b/typeshed/stdlib/2and3/tarfile.pyi
new file mode 100644
index 0000000..32a7ca4
--- /dev/null
+++ b/typeshed/stdlib/2and3/tarfile.pyi
@@ -0,0 +1,178 @@
+# Stubs for tarfile
+
+from typing import (
+    Callable, IO, Iterable, Iterator, List, Mapping, Optional, Type,
+    Union,
+)
+import sys
+from types import TracebackType
+
+
+ENCODING = ...  # type: str
+
+USTAR_FORMAT = ...  # type: int
+GNU_FORMAT = ...  # type: int
+PAX_FORMAT = ...  # type: int
+DEFAULT_FORMAT = ...  # type: int
+
+REGTYPE = ...  # type: bytes
+AREGTYPE = ...  # type: bytes
+LNKTYPE = ...  # type: bytes
+SYMTYPE = ...  # type: bytes
+DIRTYPE = ...  # type: bytes
+FIFOTYPE = ...  # type: bytes
+CONTTYPE = ...  # type: bytes
+CHRTYPE = ...  # type: bytes
+BLKTYPE = ...  # type: bytes
+GNUTYPE_SPARSE = ...  # type: bytes
+
+if sys.version_info < (3,):
+    TAR_PLAIN = ...  # type: int
+    TAR_GZIPPED = ...  # type: int
+
+def open(name: Optional[str] = ..., mode: str = ...,
+        fileobj: Optional[IO[bytes]] = ..., bufsize: int = ...,
+        *, format: Optional[int] = ..., tarinfo: Optional[TarInfo] = ...,
+        dereference: Optional[bool] = ...,
+        ignore_zeros: Optional[bool] = ...,
+        encoding: Optional[str] = ..., errors: str = ...,
+        pax_headers: Optional[Mapping[str, str]] = ...,
+        debug: Optional[int] = ...,
+        errorlevel: Optional[int] = ...) -> TarFile: ...
+
+
+class TarFile(Iterable[TarInfo]):
+    name = ...  # type: Optional[str]
+    mode = ...  # type: str
+    fileobj = ...  # type: Optional[IO[bytes]]
+    format = ...  # type: Optional[int]
+    tarinfo = ...  # type: Optional[TarInfo]
+    dereference = ...  # type: Optional[bool]
+    ignore_zeros = ...  # type: Optional[bool]
+    encoding = ...  # type: Optional[str]
+    errors = ...  # type: str
+    pax_headers = ...  # type: Optional[Mapping[str, str]]
+    debug = ...  # type: Optional[int]
+    errorlevel = ...  # type: Optional[int]
+    if sys.version_info < (3,):
+        posix = ...  # type: bool
+    def __init__(self, name: Optional[str] = ..., mode: str = ...,
+                 fileobj: Optional[IO[bytes]] = ...,
+                 format: Optional[int] = ..., tarinfo: Optional[TarInfo] = ...,
+                 dereference: Optional[bool] = ...,
+                 ignore_zeros: Optional[bool] = ...,
+                 encoding: Optional[str] = ..., errors: str = ...,
+                 pax_headers: Optional[Mapping[str, str]] = ...,
+                 debug: Optional[int] = ...,
+                 errorlevel: Optional[int] = ...) -> None: ...
+    def __enter__(self) -> TarFile: ...
+    def __exit__(self,
+                 exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+    def __iter__(self) -> Iterator[TarInfo]: ...
+    @classmethod
+    def open(cls, name: Optional[str] = ..., mode: str = ...,
+             fileobj: Optional[IO[bytes]] = ..., bufsize: int = ...,
+             *, format: Optional[int] = ..., tarinfo: Optional[TarInfo] = ...,
+             dereference: Optional[bool] = ...,
+             ignore_zeros: Optional[bool] = ...,
+             encoding: Optional[str] = ..., errors: str = ...,
+             pax_headers: Optional[Mapping[str, str]] = ...,
+             debug: Optional[int] = ...,
+             errorlevel: Optional[int] = ...) -> TarFile: ...
+    def getmember(self, name: str) -> TarInfo: ...
+    def getmembers(self) -> List[TarInfo]: ...
+    def getnames(self) -> List[str]: ...
+    if sys.version_info >= (3, 5):
+        def list(self, verbose: bool = ...,
+                 *, members: Optional[List[TarInfo]] = ...) -> None: ...
+    else:
+        def list(self, verbose: bool = ...) -> None: ...
+    def next(self) -> Optional[TarInfo]: ...
+    if sys.version_info >= (3, 5):
+        def extractall(self, path: str = ...,
+                       members: Optional[List[TarInfo]] = ...,
+                       *, numeric_owner: bool = ...) -> None: ...
+    else:
+        def extractall(self, path: str = ...,
+                       members: Optional[List[TarInfo]] = ...) -> None: ...
+    if sys.version_info >= (3, 5):
+        def extract(self, member: Union[str, TarInfo], path: str = ...,
+                    set_attrs: bool = ...,
+                    *, numeric_owner: bool = ...) -> None: ...
+    elif sys.version_info >= (3,):
+        def extract(self, member: Union[str, TarInfo], path: str = ...,
+                    set_attrs: bool = ...) -> None: ...
+    else:
+        def extract(self, member: Union[str, TarInfo],
+                    path: str = ...) -> None: ...
+    def extractfile(self,
+                    member: Union[str, TarInfo]) -> Optional[IO[bytes]]: ...
+    if sys.version_info >= (3,):
+        def add(self, name: str, arcname: Optional[str] = ...,
+                recursive: bool = ...,
+                exclude: Optional[Callable[[str], bool]] = ..., *,
+                filter: Optional[Callable[[TarInfo], Optional[TarInfo]]] = ...) -> None: ...
+    else:
+        def add(self, name: str, arcname: Optional[str] = ...,
+                recursive: bool = ...,
+                exclude: Optional[Callable[[str], bool]] = ...,
+                filter: Optional[Callable[[TarInfo], Optional[TarInfo]]] = ...) -> None: ...
+    def addfile(self, tarinfo: TarInfo,
+                fileobj: Optional[IO[bytes]] = ...) -> None: ...
+    def gettarinfo(self, name: Optional[str] = ...,
+                   arcname: Optional[str] = ...,
+                   fileobj: Optional[IO[bytes]] = ...) -> TarInfo: ...
+    def close(self) -> None: ...
+
+
+def is_tarfile(name: str) -> bool: ...
+
+
+if sys.version_info < (3,):
+    class TarFileCompat:
+        def __init__(self, filename: str, mode: str = ...,
+                     compression: int = ...) -> None: ...
+
+
+class TarError(Exception): ...
+class ReadError(TarError): ...
+class CompressionError(TarError): ...
+class StreamError(TarError): ...
+class ExtractError(TarError): ...
+class HeaderError(TarError): ...
+
+
+class TarInfo:
+    name = ...  # type: str
+    size = ...  # type: int
+    mtime = ...  # type: int
+    mode = ...  # type: int
+    type = ...  # type: bytes
+    linkname = ...  # type: str
+    uid = ...  # type: int
+    gid = ...  # type: int
+    uname = ...  # type: str
+    gname = ...  # type: str
+    pax_headers = ...  # type: Mapping[str, str]
+    def __init__(self, name: str = ...) -> None: ...
+    if sys.version_info >= (3,):
+        @classmethod
+        def frombuf(cls, buf: bytes, encoding: str, errors: str) -> TarInfo: ...
+    else:
+        @classmethod
+        def frombuf(cls, buf: bytes) -> TarInfo: ...
+    @classmethod
+    def fromtarfile(cls, tarfile: TarFile) -> TarInfo: ...
+    def tobuf(self, format: Optional[int] = ...,
+              encoding: Optional[str] = ..., errors: str = ...) -> bytes: ...
+    def isfile(self) -> bool: ...
+    def isreg(self) -> bool: ...
+    def isdir(self) -> bool: ...
+    def issym(self) -> bool: ...
+    def islnk(self) -> bool: ...
+    def ischr(self) -> bool: ...
+    def isblk(self) -> bool: ...
+    def isfifo(self) -> bool: ...
+    def isdev(self) -> bool: ...
diff --git a/typeshed/stdlib/2and3/termios.pyi b/typeshed/stdlib/2and3/termios.pyi
new file mode 100644
index 0000000..2e800d4
--- /dev/null
+++ b/typeshed/stdlib/2and3/termios.pyi
@@ -0,0 +1,246 @@
+# Stubs for termios
+
+from typing import IO, List, Union
+
+_FD = Union[int, IO[str]]
+_Attr = List[Union[int, List[bytes]]]
+
+# TODO constants not really documented
+B0 = ...  # type: int
+B1000000 = ...  # type: int
+B110 = ...  # type: int
+B115200 = ...  # type: int
+B1152000 = ...  # type: int
+B1200 = ...  # type: int
+B134 = ...  # type: int
+B150 = ...  # type: int
+B1500000 = ...  # type: int
+B1800 = ...  # type: int
+B19200 = ...  # type: int
+B200 = ...  # type: int
+B2000000 = ...  # type: int
+B230400 = ...  # type: int
+B2400 = ...  # type: int
+B2500000 = ...  # type: int
+B300 = ...  # type: int
+B3000000 = ...  # type: int
+B3500000 = ...  # type: int
+B38400 = ...  # type: int
+B4000000 = ...  # type: int
+B460800 = ...  # type: int
+B4800 = ...  # type: int
+B50 = ...  # type: int
+B500000 = ...  # type: int
+B57600 = ...  # type: int
+B576000 = ...  # type: int
+B600 = ...  # type: int
+B75 = ...  # type: int
+B921600 = ...  # type: int
+B9600 = ...  # type: int
+BRKINT = ...  # type: int
+BS0 = ...  # type: int
+BS1 = ...  # type: int
+BSDLY = ...  # type: int
+CBAUD = ...  # type: int
+CBAUDEX = ...  # type: int
+CDSUSP = ...  # type: int
+CEOF = ...  # type: int
+CEOL = ...  # type: int
+CEOT = ...  # type: int
+CERASE = ...  # type: int
+CFLUSH = ...  # type: int
+CIBAUD = ...  # type: int
+CINTR = ...  # type: int
+CKILL = ...  # type: int
+CLNEXT = ...  # type: int
+CLOCAL = ...  # type: int
+CQUIT = ...  # type: int
+CR0 = ...  # type: int
+CR1 = ...  # type: int
+CR2 = ...  # type: int
+CR3 = ...  # type: int
+CRDLY = ...  # type: int
+CREAD = ...  # type: int
+CRPRNT = ...  # type: int
+CRTSCTS = ...  # type: int
+CS5 = ...  # type: int
+CS6 = ...  # type: int
+CS7 = ...  # type: int
+CS8 = ...  # type: int
+CSIZE = ...  # type: int
+CSTART = ...  # type: int
+CSTOP = ...  # type: int
+CSTOPB = ...  # type: int
+CSUSP = ...  # type: int
+CWERASE = ...  # type: int
+ECHO = ...  # type: int
+ECHOCTL = ...  # type: int
+ECHOE = ...  # type: int
+ECHOK = ...  # type: int
+ECHOKE = ...  # type: int
+ECHONL = ...  # type: int
+ECHOPRT = ...  # type: int
+EXTA = ...  # type: int
+EXTB = ...  # type: int
+FF0 = ...  # type: int
+FF1 = ...  # type: int
+FFDLY = ...  # type: int
+FIOASYNC = ...  # type: int
+FIOCLEX = ...  # type: int
+FIONBIO = ...  # type: int
+FIONCLEX = ...  # type: int
+FIONREAD = ...  # type: int
+FLUSHO = ...  # type: int
+HUPCL = ...  # type: int
+ICANON = ...  # type: int
+ICRNL = ...  # type: int
+IEXTEN = ...  # type: int
+IGNBRK = ...  # type: int
+IGNCR = ...  # type: int
+IGNPAR = ...  # type: int
+IMAXBEL = ...  # type: int
+INLCR = ...  # type: int
+INPCK = ...  # type: int
+IOCSIZE_MASK = ...  # type: int
+IOCSIZE_SHIFT = ...  # type: int
+ISIG = ...  # type: int
+ISTRIP = ...  # type: int
+IUCLC = ...  # type: int
+IXANY = ...  # type: int
+IXOFF = ...  # type: int
+IXON = ...  # type: int
+NCC = ...  # type: int
+NCCS = ...  # type: int
+NL0 = ...  # type: int
+NL1 = ...  # type: int
+NLDLY = ...  # type: int
+NOFLSH = ...  # type: int
+N_MOUSE = ...  # type: int
+N_PPP = ...  # type: int
+N_SLIP = ...  # type: int
+N_STRIP = ...  # type: int
+N_TTY = ...  # type: int
+OCRNL = ...  # type: int
+OFDEL = ...  # type: int
+OFILL = ...  # type: int
+OLCUC = ...  # type: int
+ONLCR = ...  # type: int
+ONLRET = ...  # type: int
+ONOCR = ...  # type: int
+OPOST = ...  # type: int
+PARENB = ...  # type: int
+PARMRK = ...  # type: int
+PARODD = ...  # type: int
+PENDIN = ...  # type: int
+TAB0 = ...  # type: int
+TAB1 = ...  # type: int
+TAB2 = ...  # type: int
+TAB3 = ...  # type: int
+TABDLY = ...  # type: int
+TCFLSH = ...  # type: int
+TCGETA = ...  # type: int
+TCGETS = ...  # type: int
+TCIFLUSH = ...  # type: int
+TCIOFF = ...  # type: int
+TCIOFLUSH = ...  # type: int
+TCION = ...  # type: int
+TCOFLUSH = ...  # type: int
+TCOOFF = ...  # type: int
+TCOON = ...  # type: int
+TCSADRAIN = ...  # type: int
+TCSAFLUSH = ...  # type: int
+TCSANOW = ...  # type: int
+TCSBRK = ...  # type: int
+TCSBRKP = ...  # type: int
+TCSETA = ...  # type: int
+TCSETAF = ...  # type: int
+TCSETAW = ...  # type: int
+TCSETS = ...  # type: int
+TCSETSF = ...  # type: int
+TCSETSW = ...  # type: int
+TCXONC = ...  # type: int
+TIOCCONS = ...  # type: int
+TIOCEXCL = ...  # type: int
+TIOCGETD = ...  # type: int
+TIOCGICOUNT = ...  # type: int
+TIOCGLCKTRMIOS = ...  # type: int
+TIOCGPGRP = ...  # type: int
+TIOCGSERIAL = ...  # type: int
+TIOCGSOFTCAR = ...  # type: int
+TIOCGWINSZ = ...  # type: int
+TIOCINQ = ...  # type: int
+TIOCLINUX = ...  # type: int
+TIOCMBIC = ...  # type: int
+TIOCMBIS = ...  # type: int
+TIOCMGET = ...  # type: int
+TIOCMIWAIT = ...  # type: int
+TIOCMSET = ...  # type: int
+TIOCM_CAR = ...  # type: int
+TIOCM_CD = ...  # type: int
+TIOCM_CTS = ...  # type: int
+TIOCM_DSR = ...  # type: int
+TIOCM_DTR = ...  # type: int
+TIOCM_LE = ...  # type: int
+TIOCM_RI = ...  # type: int
+TIOCM_RNG = ...  # type: int
+TIOCM_RTS = ...  # type: int
+TIOCM_SR = ...  # type: int
+TIOCM_ST = ...  # type: int
+TIOCNOTTY = ...  # type: int
+TIOCNXCL = ...  # type: int
+TIOCOUTQ = ...  # type: int
+TIOCPKT = ...  # type: int
+TIOCPKT_DATA = ...  # type: int
+TIOCPKT_DOSTOP = ...  # type: int
+TIOCPKT_FLUSHREAD = ...  # type: int
+TIOCPKT_FLUSHWRITE = ...  # type: int
+TIOCPKT_NOSTOP = ...  # type: int
+TIOCPKT_START = ...  # type: int
+TIOCPKT_STOP = ...  # type: int
+TIOCSCTTY = ...  # type: int
+TIOCSERCONFIG = ...  # type: int
+TIOCSERGETLSR = ...  # type: int
+TIOCSERGETMULTI = ...  # type: int
+TIOCSERGSTRUCT = ...  # type: int
+TIOCSERGWILD = ...  # type: int
+TIOCSERSETMULTI = ...  # type: int
+TIOCSERSWILD = ...  # type: int
+TIOCSER_TEMT = ...  # type: int
+TIOCSETD = ...  # type: int
+TIOCSLCKTRMIOS = ...  # type: int
+TIOCSPGRP = ...  # type: int
+TIOCSSERIAL = ...  # type: int
+TIOCSSOFTCAR = ...  # type: int
+TIOCSTI = ...  # type: int
+TIOCSWINSZ = ...  # type: int
+TOSTOP = ...  # type: int
+VDISCARD = ...  # type: int
+VEOF = ...  # type: int
+VEOL = ...  # type: int
+VEOL2 = ...  # type: int
+VERASE = ...  # type: int
+VINTR = ...  # type: int
+VKILL = ...  # type: int
+VLNEXT = ...  # type: int
+VMIN = ...  # type: int
+VQUIT = ...  # type: int
+VREPRINT = ...  # type: int
+VSTART = ...  # type: int
+VSTOP = ...  # type: int
+VSUSP = ...  # type: int
+VSWTC = ...  # type: int
+VSWTCH = ...  # type: int
+VT0 = ...  # type: int
+VT1 = ...  # type: int
+VTDLY = ...  # type: int
+VTIME = ...  # type: int
+VWERASE = ...  # type: int
+XCASE = ...  # type: int
+XTABS = ...  # type: int
+
+def tcgetattr(fd: _FD) -> _Attr: ...
+def tcsetattr(fd: _FD, when: int, attributes: _Attr) -> None: ...
+def tcsendbreak(fd: _FD, duration: int) -> None: ...
+def tcdrain(fd: _FD) -> None: ...
+def tcflush(fd: _FD, queue: int) -> None: ...
+def tcflow(fd: _FD, action: int) -> None: ...
diff --git a/typeshed/stdlib/2and3/threading.pyi b/typeshed/stdlib/2and3/threading.pyi
new file mode 100644
index 0000000..6d0e4a6
--- /dev/null
+++ b/typeshed/stdlib/2and3/threading.pyi
@@ -0,0 +1,191 @@
+# Stubs for threading
+
+from typing import (
+    Any, Callable, Iterable, List, Mapping, Optional, Tuple, Type, Union,
+    TypeVar,
+)
+from types import FrameType, TracebackType
+import sys
+
+# TODO recursive type
+_TF = Callable[[FrameType, str, Any], Optional[Callable[..., Any]]]
+
+_PF = Callable[[FrameType, str, Any], None]
+_T = TypeVar('_T')
+
+
+def active_count() -> int: ...
+if sys.version_info < (3,):
+    def activeCount() -> int: ...
+
+def current_thread() -> Thread: ...
+if sys.version_info < (3,):
+    def currentThread() -> Thread: ...
+
+if sys.version_info >= (3,):
+    def get_ident() -> int: ...
+
+def enumerate() -> List[Thread]: ...
+
+if sys.version_info >= (3, 4):
+    def main_thread() -> Thread: ...
+
+def settrace(func: _TF) -> None: ...
+def setprofile(func: _PF) -> None: ...
+def stack_size(size: int = ...) -> int: ...
+
+if sys.version_info >= (3,):
+    TIMEOUT_MAX = ...  # type: int
+
+if sys.version_info < (3,):
+    class ThreadError(Exception): ...
+
+
+# TODO: Change to a class with __getattr__ and __setattr__
+# once mypy supports universal __setattr__.
+# See https://github.com/python/mypy/issues/521
+local = ...  # type: Any
+
+
+class Thread:
+    name = ...  # type: str
+    ident = ...  # type: Optional[int]
+    daemon = ...  # type: bool
+    if sys.version_info >= (3,):
+        def __init__(self, group: None = ...,
+                     target: Optional[Callable[..., None]] = ...,
+                     name: Optional[str] = ...,
+                     args: Tuple[Any, ...] = ...,
+                     kwargs: Mapping[str, Any] = ...,
+                     *, daemon: Optional[bool] = ...) -> None: ...
+    else:
+        def __init__(self, group: None = ...,
+                     target: Optional[Callable[..., None]] = ...,
+                     name: Optional[str] = ...,
+                     args: Tuple[Any, ...] = ...,
+                     kwargs: Mapping[str, Any] = ...) -> None: ...
+    def start(self) -> None: ...
+    def run(self) -> None: ...
+    def join(self, timeout: Optional[float] = ...) -> None: ...
+    def getName(self) -> str: ...
+    def setName(self, name: str) -> None: ...
+    def is_alive(self) -> bool: ...
+    if sys.version_info < (3,):
+        def isAlive(self) -> bool: ...
+    def isDaemon(self) -> bool: ...
+    def setDaemon(self, daemonic: bool) -> None: ...
+
+
+class _DummyThread(Thread):
+    pass
+
+
+class Lock:
+    def __init__(self) -> None: ...
+    def __enter__(self) -> bool: ...
+    def __exit__(self, exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+    if sys.version_info >= (3,):
+        def acquire(self, blocking: bool = ..., timeout: int = ...) -> bool: ...
+    else:
+        def acquire(self, blocking: bool = ...) -> bool: ...
+    def release(self) -> None: ...
+    def locked(self) -> bool: ...
+
+
+class _RLock:
+    def __init__(self) -> None: ...
+    def __enter__(self) -> bool: ...
+    def __exit__(self, exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+    if sys.version_info >= (3,):
+        def acquire(self, blocking: bool = ..., timeout: int = ...) -> bool: ...
+    else:
+        def acquire(self, blocking: bool = ...) -> bool: ...
+    def release(self) -> None: ...
+
+
+RLock = _RLock
+
+
+class Condition:
+    def __init__(self, lock: Union[Lock, _RLock, None] = ...) -> None: ...
+    def __enter__(self) -> bool: ...
+    def __exit__(self, exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+    if sys.version_info >= (3,):
+        def acquire(self, blocking: bool = ..., timeout: int = ...) -> bool: ...
+    else:
+        def acquire(self, blocking: bool = ...) -> bool: ...
+    def release(self) -> None: ...
+    def wait(self, timeout: Optional[float] = ...) -> bool: ...
+    if sys.version_info >= (3,):
+        def wait_for(self, predicate: Callable[[], _T],
+                     timeout: Optional[float]) -> _T: ...
+    def notify(self, n: int = ...) -> None: ...
+    def notify_all(self) -> None: ...
+    def notifyAll(self) -> None: ...
+
+
+class Semaphore:
+    def __init__(self, value: int = ...) -> None: ...
+    def __enter__(self) -> bool: ...
+    def __exit__(self, exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+    if sys.version_info >= (3,):
+        def acquire(self, blocking: bool = ..., timeout: int = ...) -> bool: ...
+    else:
+        def acquire(self, blocking: bool = ...) -> bool: ...
+    def release(self) -> None: ...
+
+class BoundedSemaphore:
+    def __init__(self, value: int = ...) -> None: ...
+    def __enter__(self) -> bool: ...
+    def __exit__(self, exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+    if sys.version_info >= (3,):
+        def acquire(self, blocking: bool = ..., timeout: int = ...) -> bool: ...
+    else:
+        def acquire(self, blocking: bool = ...) -> bool: ...
+    def release(self) -> None: ...
+
+
+class Event:
+    def __init__(self) -> None: ...
+    def is_set(self) -> bool: ...
+    if sys.version_info < (3,):
+        def isSet(self) -> bool: ...
+    def set(self) -> None: ...
+    def clear(self) -> None: ...
+    def wait(self, timeout: Optional[float] = ...) -> bool: ...
+
+
+class Timer(Thread):
+    if sys.version_info >= (3,):
+        def __init__(self, interval: float, function: Callable[..., None],
+                     args: Optional[List[Any]] = ...,
+                     kwargs: Optional[Mapping[str, Any]] = ...) -> None: ...
+    else:
+        def __init__(self, interval: float, function: Callable[..., None],
+                     args: List[Any] = ...,
+                     kwargs: Mapping[str, Any] = ...) -> None: ...
+    def cancel(self) -> None: ...
+
+
+if sys.version_info >= (3,):
+    class Barrier:
+        parties = ...  # type: int
+        n_waiting = ...  # type: int
+        broken = ...  # type: bool
+        def __init__(self, parties: int, action: Optional[Callable[[], None]] = ...,
+                     timeout: Optional[float] = ...) -> None: ...
+        def wait(self, timeout: Optional[float] = ...) -> int: ...
+        def reset(self) -> None: ...
+        def abort(self) -> None: ...
+
+    class BrokenBarrierError(RuntimeError): ...
diff --git a/typeshed/stdlib/2and3/traceback.pyi b/typeshed/stdlib/2and3/traceback.pyi
new file mode 100644
index 0000000..ff34ad4
--- /dev/null
+++ b/typeshed/stdlib/2and3/traceback.pyi
@@ -0,0 +1,100 @@
+# Stubs for traceback
+
+from typing import Generator, IO, Iterator, List, Mapping, Optional, Tuple, Type
+from types import FrameType, TracebackType
+import sys
+
+_PT = Tuple[str, int, str, Optional[str]]
+
+
+def print_tb(tb: TracebackType, limit: Optional[int] = ...,
+             file: Optional[IO[str]] = ...) -> None: ...
+if sys.version_info >= (3,):
+    def print_exception(etype: Type[BaseException], value: BaseException,
+                        tb: Optional[TracebackType], limit: Optional[int] = ...,
+                        file: Optional[IO[str]] = ...,
+                        chain: bool = ...) -> None: ...
+    def print_exc(limit: Optional[int] = ..., file: Optional[IO[str]] = ...,
+                  chain: bool = ...) -> None: ...
+    def print_last(limit: Optional[int] = ..., file: Optional[IO[str]] = ...,
+                   chain: bool = ...) -> None: ...
+else:
+    def print_exception(etype: Type[BaseException], value: BaseException,
+                        tb: Optional[TracebackType], limit: Optional[int] = ...,
+                        file: Optional[IO[str]] = ...) -> None: ...
+    def print_exc(limit: Optional[int] = ...,
+                  file: Optional[IO[str]] = ...) -> None: ...
+    def print_last(limit: Optional[int] = ...,
+                   file: Optional[IO[str]] = ...) -> None: ...
+def print_stack(f: Optional[FrameType] = ..., limit: Optional[int] = ...,
+                file: Optional[IO[str]] = ...) -> None: ...
+def extract_tb(tb: TracebackType, limit: Optional[int] = ...) -> List[_PT]: ...
+def extract_stack(f: Optional[FrameType] = ...,
+                  limit: Optional[int] = ...) -> List[_PT]: ...
+def format_list(extracted_list: List[_PT]) -> List[str]: ...
+def format_exception_only(etype: Type[BaseException],
+                          value: BaseException) -> List[str]: ...
+if sys.version_info >= (3,):
+    def format_exception(etype: Type[BaseException], value: BaseException,
+                         tb: TracebackType, limit: Optional[int] = ...,
+                         chain: bool = ...) -> List[str]: ...
+    def format_exc(limit: Optional[int] = ..., chain: bool = ...) -> str: ...
+else:
+    def format_exception(etype: Type[BaseException], value: BaseException,
+                         tb: TracebackType,
+                         limit: Optional[int] = ...) -> List[str]: ...
+    def format_exc(limit: Optional[int] = ...) -> str: ...
+def format_tb(tb: TracebackType, limit: Optional[int] = ...) -> List[str]: ...
+def format_stack(f: Optional[FrameType] = ...,
+                 limit: Optional[int] = ...) -> List[str]: ...
+if sys.version_info >= (3, 4):
+    def clear_frames(tb: TracebackType) -> None: ...
+if sys.version_info >= (3, 5):
+    def walk_stack(f: Optional[FrameType]) -> Iterator[Tuple[FrameType, int]]: ...
+    def walk_tb(tb: TracebackType) -> Iterator[Tuple[FrameType, int]]: ...
+if sys.version_info < (3,):
+    def tb_lineno(tb: TracebackType) -> int: ...
+
+
+if sys.version_info >= (3, 5):
+    class TracebackException:
+        __cause__ = ...  # type:TracebackException
+        __context__ = ...  # type:TracebackException
+        __suppress_context__ = ...  # type: bool
+        stack = ...  # type: StackSummary
+        exc_type = ...  # type: Type[BaseException]
+        filename = ...  # type: str
+        lineno = ...  # type: int
+        text = ...  # type: str
+        offset = ...  # type: int
+        msg = ...  # type: str
+        def __init__(self, exc_type: Type[BaseException],
+                     exc_value: BaseException, exc_traceback: TracebackType,
+                     *, limit: Optional[int] = ..., lookup_lines: bool = ...,
+                     capture_locals: bool = ...) -> None: ...
+        @classmethod
+        def from_exception(cls, exc: BaseException,
+                           *, limit: Optional[int] = ...,
+                           lookup_lines: bool = ...,
+                           capture_locals: bool = ...) -> TracebackException: ...
+        def format(self, *, chain: bool = ...) -> Generator[str, None, None]: ...
+        def format_exception_only(self) -> Generator[str, None, None]: ...
+
+
+if sys.version_info >= (3, 5):
+    class StackSummary:
+        @classmethod
+        def extract(cls,
+                    frame_gen: Generator[Tuple[FrameType, int], None, None],
+                    *, limit: Optional[int] = ..., lookup_lines: bool = ...,
+                    capture_locals: bool = ...) -> StackSummary: ...
+        @classmethod
+        def from_list(cls, a_list: List[_PT]) -> StackSummary: ...
+
+
+if sys.version_info >= (3, 5):
+    class FrameSummary:
+        def __init__(self, filename: str, lineno: int, name: str,
+                     lookup_line: bool = ...,
+                     locals: Optional[Mapping[str, str]] = ...,
+                     line: Optional[int] = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/warnings.pyi b/typeshed/stdlib/2and3/warnings.pyi
new file mode 100644
index 0000000..6e8507b
--- /dev/null
+++ b/typeshed/stdlib/2and3/warnings.pyi
@@ -0,0 +1,39 @@
+# Stubs for warnings
+
+from typing import Any, Dict, List, NamedTuple, Optional, TextIO, Tuple, Type, Union
+from types import ModuleType, TracebackType
+
+def warn(message: Union[str, Warning], category: Optional[Type[Warning]] = ...,
+         stacklevel: int = ...) -> None: ...
+def warn_explicit(message: Union[str, Warning], category: Type[Warning],
+                  filename: str, lineno: int, module: Optional[str] = ...,
+                  registry: Optional[Dict[Union[str, Tuple[str, Type[Warning], int]], int]] = ...,
+                  module_globals: Optional[Dict[str, Any]] = ...) -> None: ...
+def showwarning(message: str, category: Type[Warning], filename: str,
+                lineno: int, file: Optional[TextIO] = ...,
+                line: Optional[str] = ...) -> None: ...
+def formatwarning(message: str, category: Type[Warning], filename: str,
+                  lineno: int, line: Optional[str] = ...) -> None: ...
+def filterwarnings(action: str, message: str = ...,
+                   category: Type[Warning] = ..., module: str = ...,
+                   lineno: int = ..., append: bool = ...) -> None: ...
+def simplefilter(action: str, category: Type[Warning] = ..., lineno: int = ...,
+                 append: bool = ...) -> None: ...
+def resetwarnings() -> None: ...
+
+_Record = NamedTuple('_Record',
+    [('message', str),
+     ('category', Type[Warning]),
+     ('filename', str),
+     ('lineno', int),
+     ('file', Optional[TextIO]),
+     ('line', Optional[str])]
+)
+
+class catch_warnings:
+    def __init__(self, *, record: bool = ...,
+                 module: Optional[ModuleType] = ...) -> None: ...
+    def __enter__(self) -> Optional[List[_Record]]: ...
+    def __exit__(self, exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
diff --git a/typeshed/stdlib/2and3/webbrowser.pyi b/typeshed/stdlib/2and3/webbrowser.pyi
new file mode 100644
index 0000000..a478edf
--- /dev/null
+++ b/typeshed/stdlib/2and3/webbrowser.pyi
@@ -0,0 +1,100 @@
+# Stubs for webbrowser (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+import sys
+from typing import Any, Optional, Callable, List
+
+class Error(Exception): ...
+
+def register(name: str, klass: Optional[Callable[[], BaseBrowser]], instance: BaseBrowser=..., update_tryorder: int=...) -> None: ...
+def get(using: str=...) -> BaseBrowser: ...
+def open(url: str, new: int=..., autoraise: bool=...) -> bool: ...
+def open_new(url: str) -> bool: ...
+def open_new_tab(url: str) -> bool: ...
+
+class BaseBrowser:
+    args = ...  # type: List[str]
+    name = ...  # type: str
+    basename = ...  # type: str
+    def __init__(self, name: str=...) -> None: ...
+    def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+    def open_new(self, url: str) -> bool: ...
+    def open_new_tab(self, url: str) -> bool: ...
+
+class GenericBrowser(BaseBrowser):
+    args = ...  # type: List[str]
+    name = ...  # type: str
+    basename = ...  # type: str
+    def __init__(self, name: str) -> None: ...
+    def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class BackgroundBrowser(GenericBrowser):
+    def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class UnixBrowser(BaseBrowser):
+    raise_opts = ...  # type: List[str]
+    background = ...  # type: bool
+    redirect_stdout = ...  # type: bool
+    remote_args = ...  # type: List[str]
+    remote_action = ...  # type: str
+    remote_action_newwin = ...  # type: str
+    remote_action_newtab = ...  # type: str
+    def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class Mozilla(UnixBrowser):
+    raise_opts = ...  # type: List[str]
+    remote_args = ...  # type: List[str]
+    remote_action = ...  # type: str
+    remote_action_newwin = ...  # type: str
+    remote_action_newtab = ...  # type: str
+    background = ...  # type: bool
+
+class Galeon(UnixBrowser):
+    raise_opts = ...  # type: List[str]
+    remote_args = ...  # type: List[str]
+    remote_action = ...  # type: str
+    remote_action_newwin = ...  # type: str
+    background = ...  # type: bool
+
+if sys.version_info[:2] == (2, 7) or sys.version_info >= (3, 3):
+    class Chrome(UnixBrowser):
+        remote_args = ...  # type: List[str]
+        remote_action = ...  # type: str
+        remote_action_newwin = ...  # type: str
+        remote_action_newtab = ...  # type: str
+        background = ...  # type: bool
+
+class Opera(UnixBrowser):
+    raise_opts = ...  # type: List[str]
+    remote_args = ...  # type: List[str]
+    remote_action = ...  # type: str
+    remote_action_newwin = ...  # type: str
+    remote_action_newtab = ...  # type: str
+    background = ...  # type: bool
+
+class Elinks(UnixBrowser):
+    remote_args = ...  # type: List[str]
+    remote_action = ...  # type: str
+    remote_action_newwin = ...  # type: str
+    remote_action_newtab = ...  # type: str
+    background = ...  # type: bool
+    redirect_stdout = ...  # type: bool
+
+class Konqueror(BaseBrowser):
+    def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class Grail(BaseBrowser):
+    def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class WindowsDefault(BaseBrowser):
+    def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class MacOSX(BaseBrowser):
+    name = ...  # type: str
+    def __init__(self, name: str) -> None: ...
+    def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class MacOSXOSAScript(BaseBrowser):
+    def __init__(self, name: str) -> None: ...
+    def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
diff --git a/typeshed/stdlib/2and3/xml/__init__.pyi b/typeshed/stdlib/2and3/xml/__init__.pyi
new file mode 100644
index 0000000..a0a0a89
--- /dev/null
+++ b/typeshed/stdlib/2and3/xml/__init__.pyi
@@ -0,0 +1,20 @@
+# Stubs for xml.sax (Python 3)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class SAXException(Exception):
+    def __init__(self, msg, exception=None): ...
+    def getMessage(self): ...
+    def getException(self): ...
+    def __getitem__(self, ix): ...
+
+class SAXParseException(SAXException):
+    def __init__(self, msg, exception, locator): ...
+    def getColumnNumber(self): ...
+    def getLineNumber(self): ...
+    def getPublicId(self): ...
+    def getSystemId(self): ...
+
+class SAXNotRecognizedException(SAXException): ...
+class SAXNotSupportedException(SAXException): ...
+class SAXReaderNotAvailable(SAXNotSupportedException): ...
diff --git a/typeshed/stdlib/2and3/xml/sax/__init__.pyi b/typeshed/stdlib/2and3/xml/sax/__init__.pyi
new file mode 100644
index 0000000..71534b0
--- /dev/null
+++ b/typeshed/stdlib/2and3/xml/sax/__init__.pyi
@@ -0,0 +1,34 @@
+from typing import List
+
+import xml.sax
+from xml.sax.xmlreader import InputSource
+from xml.sax.handler import ContentHandler, ErrorHandler
+
+class SAXException(Exception):
+    def __init__(self, msg, exception=None): ...
+    def getMessage(self): ...
+    def getException(self): ...
+    def __getitem__(self, ix): ...
+
+class SAXParseException(SAXException):
+    def __init__(self, msg, exception, locator): ...
+    def getColumnNumber(self): ...
+    def getLineNumber(self): ...
+    def getPublicId(self): ...
+    def getSystemId(self): ...
+
+class SAXNotRecognizedException(SAXException): ...
+class SAXNotSupportedException(SAXException): ...
+class SAXReaderNotAvailable(SAXNotSupportedException): ...
+
+default_parser_list = ...  # type: List[str]
+
+def make_parser(parser_list: List[str]) -> xml.sax.xmlreader.XMLReader: ...
+
+def parse(source: str, handler: xml.sax.handler.ContentHandler,
+          errorHandler: xml.sax.handler.ErrorHandler=...): ...
+
+def parseString(string: str, handler: xml.sax.handler.ContentHandler,
+                errorHandler: xml.sax.handler.ErrorHandler=...): ...
+
+def _create_parser(parser_name: str) -> xml.sax.xmlreader.XMLReader: ...
diff --git a/typeshed/stdlib/2and3/xml/sax/handler.pyi b/typeshed/stdlib/2and3/xml/sax/handler.pyi
new file mode 100644
index 0000000..f3221b5
--- /dev/null
+++ b/typeshed/stdlib/2and3/xml/sax/handler.pyi
@@ -0,0 +1,50 @@
+# Stubs for xml.sax.handler (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+version = ...  # type: Any
+
+class ErrorHandler:
+    def error(self, exception): ...
+    def fatalError(self, exception): ...
+    def warning(self, exception): ...
+
+class ContentHandler:
+    def __init__(self) -> None: ...
+    def setDocumentLocator(self, locator): ...
+    def startDocument(self): ...
+    def endDocument(self): ...
+    def startPrefixMapping(self, prefix, uri): ...
+    def endPrefixMapping(self, prefix): ...
+    def startElement(self, name, attrs): ...
+    def endElement(self, name): ...
+    def startElementNS(self, name, qname, attrs): ...
+    def endElementNS(self, name, qname): ...
+    def characters(self, content): ...
+    def ignorableWhitespace(self, whitespace): ...
+    def processingInstruction(self, target, data): ...
+    def skippedEntity(self, name): ...
+
+class DTDHandler:
+    def notationDecl(self, name, publicId, systemId): ...
+    def unparsedEntityDecl(self, name, publicId, systemId, ndata): ...
+
+class EntityResolver:
+    def resolveEntity(self, publicId, systemId): ...
+
+feature_namespaces = ...  # type: Any
+feature_namespace_prefixes = ...  # type: Any
+feature_string_interning = ...  # type: Any
+feature_validation = ...  # type: Any
+feature_external_ges = ...  # type: Any
+feature_external_pes = ...  # type: Any
+all_features = ...  # type: Any
+property_lexical_handler = ...  # type: Any
+property_declaration_handler = ...  # type: Any
+property_dom_node = ...  # type: Any
+property_xml_string = ...  # type: Any
+property_encoding = ...  # type: Any
+property_interning_dict = ...  # type: Any
+all_properties = ...  # type: Any
diff --git a/typeshed/stdlib/2and3/xml/sax/saxutils.pyi b/typeshed/stdlib/2and3/xml/sax/saxutils.pyi
new file mode 100644
index 0000000..7ff053a
--- /dev/null
+++ b/typeshed/stdlib/2and3/xml/sax/saxutils.pyi
@@ -0,0 +1,58 @@
+# Stubs for xml.sax.saxutils (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Mapping
+
+from xml.sax import handler
+from xml.sax import xmlreader
+
+def escape(data: str, entities: Mapping[str, str] = ...) -> str: ...
+def unescape(data: str, entities: Mapping[str, str] = ...) -> str: ...
+def quoteattr(data: str, entities: Mapping[str, str] = ...) -> str: ...
+
+class XMLGenerator(handler.ContentHandler):
+    def __init__(self, out=..., encoding=...) -> None: ...
+    def startDocument(self): ...
+    def endDocument(self): ...
+    def startPrefixMapping(self, prefix, uri): ...
+    def endPrefixMapping(self, prefix): ...
+    def startElement(self, name, attrs): ...
+    def endElement(self, name): ...
+    def startElementNS(self, name, qname, attrs): ...
+    def endElementNS(self, name, qname): ...
+    def characters(self, content): ...
+    def ignorableWhitespace(self, content): ...
+    def processingInstruction(self, target, data): ...
+
+class XMLFilterBase(xmlreader.XMLReader):
+    def __init__(self, parent=...) -> None: ...
+    def error(self, exception): ...
+    def fatalError(self, exception): ...
+    def warning(self, exception): ...
+    def setDocumentLocator(self, locator): ...
+    def startDocument(self): ...
+    def endDocument(self): ...
+    def startPrefixMapping(self, prefix, uri): ...
+    def endPrefixMapping(self, prefix): ...
+    def startElement(self, name, attrs): ...
+    def endElement(self, name): ...
+    def startElementNS(self, name, qname, attrs): ...
+    def endElementNS(self, name, qname): ...
+    def characters(self, content): ...
+    def ignorableWhitespace(self, chars): ...
+    def processingInstruction(self, target, data): ...
+    def skippedEntity(self, name): ...
+    def notationDecl(self, name, publicId, systemId): ...
+    def unparsedEntityDecl(self, name, publicId, systemId, ndata): ...
+    def resolveEntity(self, publicId, systemId): ...
+    def parse(self, source): ...
+    def setLocale(self, locale): ...
+    def getFeature(self, name): ...
+    def setFeature(self, name, state): ...
+    def getProperty(self, name): ...
+    def setProperty(self, name, value): ...
+    def getParent(self): ...
+    def setParent(self, parent): ...
+
+def prepare_input_source(source, base=...): ...
diff --git a/typeshed/stdlib/2and3/xml/sax/xmlreader.pyi b/typeshed/stdlib/2and3/xml/sax/xmlreader.pyi
new file mode 100644
index 0000000..a5f5553
--- /dev/null
+++ b/typeshed/stdlib/2and3/xml/sax/xmlreader.pyi
@@ -0,0 +1,75 @@
+# Stubs for xml.sax.xmlreader (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class XMLReader:
+    def __init__(self) -> None: ...
+    def parse(self, source): ...
+    def getContentHandler(self): ...
+    def setContentHandler(self, handler): ...
+    def getDTDHandler(self): ...
+    def setDTDHandler(self, handler): ...
+    def getEntityResolver(self): ...
+    def setEntityResolver(self, resolver): ...
+    def getErrorHandler(self): ...
+    def setErrorHandler(self, handler): ...
+    def setLocale(self, locale): ...
+    def getFeature(self, name): ...
+    def setFeature(self, name, state): ...
+    def getProperty(self, name): ...
+    def setProperty(self, name, value): ...
+
+class IncrementalParser(XMLReader):
+    def __init__(self, bufsize=...) -> None: ...
+    def parse(self, source): ...
+    def feed(self, data): ...
+    def prepareParser(self, source): ...
+    def close(self): ...
+    def reset(self): ...
+
+class Locator:
+    def getColumnNumber(self): ...
+    def getLineNumber(self): ...
+    def getPublicId(self): ...
+    def getSystemId(self): ...
+
+class InputSource:
+    def __init__(self, system_id=...) -> None: ...
+    def setPublicId(self, public_id): ...
+    def getPublicId(self): ...
+    def setSystemId(self, system_id): ...
+    def getSystemId(self): ...
+    def setEncoding(self, encoding): ...
+    def getEncoding(self): ...
+    def setByteStream(self, bytefile): ...
+    def getByteStream(self): ...
+    def setCharacterStream(self, charfile): ...
+    def getCharacterStream(self): ...
+
+class AttributesImpl:
+    def __init__(self, attrs) -> None: ...
+    def getLength(self): ...
+    def getType(self, name): ...
+    def getValue(self, name): ...
+    def getValueByQName(self, name): ...
+    def getNameByQName(self, name): ...
+    def getQNameByName(self, name): ...
+    def getNames(self): ...
+    def getQNames(self): ...
+    def __len__(self): ...
+    def __getitem__(self, name): ...
+    def keys(self): ...
+    def has_key(self, name): ...
+    def __contains__(self, name): ...
+    def get(self, name, alternative=...): ...
+    def copy(self): ...
+    def items(self): ...
+    def values(self): ...
+
+class AttributesNSImpl(AttributesImpl):
+    def __init__(self, attrs, qnames) -> None: ...
+    def getValueByQName(self, name): ...
+    def getNameByQName(self, name): ...
+    def getQNameByName(self, name): ...
+    def getQNames(self): ...
+    def copy(self): ...
diff --git a/typeshed/stdlib/2and3/zipfile.pyi b/typeshed/stdlib/2and3/zipfile.pyi
new file mode 100644
index 0000000..5a504e3
--- /dev/null
+++ b/typeshed/stdlib/2and3/zipfile.pyi
@@ -0,0 +1,94 @@
+# Stubs for zipfile
+
+from typing import Callable, IO, List, Optional, Tuple, Type, Union
+from types import TracebackType
+import sys
+
+
+_SZI = Union[str, ZipInfo]
+_DT = Tuple[int, int, int, int, int, int]
+
+
+if sys.version_info >= (3,):
+    class BadZipFile(Exception): ...
+    BadZipfile = BadZipFile
+else:
+    class BadZipfile(Exception): ...
+
+class LargeZipFile(Exception): ...
+
+class ZipFile:
+    debug = ...  # type: int
+    comment = ...  # type: bytes
+    def __init__(self, file: Union[str, IO[bytes]], mode: str = ..., compression: int = ...,
+                 allowZip64: bool = ...) -> None: ...
+    def __enter__(self) -> ZipFile: ...
+    def __exit__(self, exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+    def close(self) -> None: ...
+    def getinfo(self, name: str) -> ZipInfo: ...
+    def infolist(self) -> List[ZipInfo]: ...
+    def namelist(self) -> List[str]: ...
+    def open(self, name: _SZI, mode: str = ...,
+             pwd: Optional[bytes] = ...) -> IO[bytes]: ...
+    def extract(self, member: _SZI, path: Optional[_SZI] = ...,
+                pwd: bytes = ...) -> str: ...
+    def extractall(self, path: Optional[str] = ...,
+                   members: Optional[List[str]] = ...,
+                   pwd: Optional[bytes] = ...) -> None: ...
+    def printdir(self) -> None: ...
+    def setpassword(self, pwd: bytes) -> None: ...
+    def read(self, name: _SZI, pwd: Optional[bytes] = ...) -> bytes: ...
+    def testzip(self) -> Optional[str]: ...
+    def write(self, filename: str, arcname: Optional[str] = ...,
+              compress_type: Optional[int] = ...) -> None: ...
+    if sys.version_info >= (3,):
+        def writestr(self, zinfo_or_arcname: _SZI, data: Union[bytes, str],
+                     compress_type: Optional[int] = ...) -> None: ...
+    else:
+        def writestr(self,
+                     zinfo_or_arcname: _SZI, bytes: bytes,
+                     compress_type: Optional[int] = ...) -> None: ...
+
+class PyZipFile(ZipFile):
+    if sys.version_info >= (3,):
+        def __init__(self, file: Union[str, IO[bytes]], mode: str = ...,
+                     compression: int = ..., allowZip64: bool = ...,
+                     opimize: int = ...) -> None: ...
+        def writepy(self, pathname: str, basename: str = ...,
+                    filterfunc: Optional[Callable[[str], bool]] = ...) -> None: ...
+    else:
+        def writepy(self,
+                    pathname: str, basename: str = ...) -> None: ...
+
+class ZipInfo:
+    filename = ...  # type: str
+    date_time = ...  # type: _DT
+    compress_type = ...  # type: int
+    comment = ...  # type: bytes
+    extra = ...  # type: bytes
+    create_system = ...  # type: int
+    create_version = ...  # type: int
+    extract_version = ...  # type: int
+    reserved = ...  # type: int
+    flag_bits = ...  # type: int
+    volume = ...  # type: int
+    internal_attr = ...  # type: int
+    external_attr = ...  # type: int
+    header_offset = ...  # type: int
+    CRC = ...  # type: int
+    compress_size = ...  # type: int
+    file_size = ...  # type: int
+    if sys.version_info < (3,):
+        def __init__(self, filename: Optional[str] = ...,
+                     date_time: Optional[_DT] = ...) -> None: ...
+
+
+def is_zipfile(filename: Union[str, IO[bytes]]) -> bool: ...
+
+ZIP_STORED = ...  # type: int
+ZIP_DEFLATED = ...  # type: int
+if sys.version_info >= (3, 3):
+    ZIP_BZIP2 = ...  # type: int
+    ZIP_LZMA = ...  # type: int
diff --git a/typeshed/stdlib/2and3/zipimport.pyi b/typeshed/stdlib/2and3/zipimport.pyi
new file mode 100644
index 0000000..eb70eb3
--- /dev/null
+++ b/typeshed/stdlib/2and3/zipimport.pyi
@@ -0,0 +1,18 @@
+"""Stub file for the 'zipimport' module."""
+
+from typing import Optional
+from types import CodeType, ModuleType
+
+class ZipImportError(ImportError): ...
+
+class zipimporter(object):
+    archive = ...  # type: str
+    prefix = ...  # type: str
+    def __init__(self, archivepath: str) -> None: ...
+    def find_module(self, fullname: str, path: str = ...) -> Optional[zipimporter]: ...
+    def get_code(self, fullname: str) -> CodeType: ...
+    def get_data(self, pathname: str) -> str: ...
+    def get_filename(self, fullname: str) -> str: ...
+    def get_source(self, fullname: str) -> Optional[str]: ...
+    def is_package(self, fullname: str) -> bool: ...
+    def load_module(self, fullname: str) -> ModuleType: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.2/xml/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.2/xml/__init__.pyi
diff --git a/typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..bbe3fb3
--- /dev/null
+++ b/typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from .ElementTree import Element
+
+XINCLUDE = ...  # type: str
+XINCLUDE_INCLUDE = ...  # type: str
+XINCLUDE_FALLBACK = ...  # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, Element]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: Element, loader: Callable[..., Union[str, Element]]=...) -> None: ...
diff --git a/typeshed/stdlib/3.2/xml/etree/ElementPath.pyi b/typeshed/stdlib/3.2/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..b1ea50e
--- /dev/null
+++ b/typeshed/stdlib/3.2/xml/etree/ElementPath.pyi
@@ -0,0 +1,35 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Pattern, Dict, Generator, Tuple, List, Union, TypeVar, Callable, Optional
+from .ElementTree import Element
+
+xpath_tokenizer_re = ...  # type: Pattern
+
+_token = Tuple[str, str]
+_next = Callable[[], _token]
+_callback = Callable[['_SelectorContext', List[Element]], Generator[Element, None, None]]
+
+def xpath_tokenizer(pattern: str, namespaces: Dict[str, str]=...) -> Generator[_token, None, None]: ...
+def get_parent_map(context: '_SelectorContext') -> Dict[Element, Element]: ...
+def prepare_child(next: _next, token: _token) -> _callback: ...
+def prepare_star(next: _next, token: _token) -> _callback: ...
+def prepare_self(next: _next, token: _token) -> _callback: ...
+def prepare_descendant(next: _next, token: _token) -> _callback: ...
+def prepare_parent(next: _next, token: _token) -> _callback: ...
+def prepare_predicate(next: _next, token: _token) -> _callback: ...
+
+ops = ...  # type: Dict[str, Callable[[_next, _token], _callback]]
+
+class _SelectorContext:
+    parent_map = ...  # type: Dict[Element, Element]
+    root = ...  # type: Element
+    def __init__(self, root: Element) -> None: ...
+
+_T = TypeVar('_T')
+
+def iterfind(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def find(elem: Element, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+def findall(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def findtext(elem: Element, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
diff --git a/typeshed/stdlib/3.2/xml/etree/ElementTree.pyi b/typeshed/stdlib/3.2/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..0ae1e3f
--- /dev/null
+++ b/typeshed/stdlib/3.2/xml/etree/ElementTree.pyi
@@ -0,0 +1,120 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, KeysView, ItemsView, Generator
+import io
+
+VERSION = ...  # type: str
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class _SimpleElementPath:
+    def find(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> Optional['Element']: ...
+    def findtext(self, element: 'Element', tag: _str_or_bytes, default: _T=..., namespaces: Any=...) -> Union[str, bytes, _T]: ...
+    def iterfind(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> Generator['Element', None, None]: ...
+    def findall(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> List['Element']: ...
+
+class ParseError(SyntaxError): ...
+
+def iselement(element: 'Element') -> bool: ...
+
+class Element(Sequence['Element']):
+    tag = ...  # type: _str_or_bytes
+    attrib = ...  # type: Dict[_str_or_bytes, _str_or_bytes]
+    text = ...  # type: Optional[_str_or_bytes]
+    tail = ...  # type: Optional[_str_or_bytes]
+    def __init__(self, tag: Union[AnyStr, Callable[..., 'Element']], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> None: ...
+    def append(self, subelement: 'Element') -> None: ...
+    def clear(self) -> None: ...
+    def copy(self) -> 'Element': ...
+    def extend(self, elements: Sequence['Element']) -> None: ...
+    def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional['Element']: ...
+    def findall(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+    def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+    def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+    def getchildren(self) -> List['Element']: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List['Element']: ...
+    def insert(self, index: int, subelement: 'Element') -> None: ...
+    def items(self) -> ItemsView[AnyStr, AnyStr]: ...
+    def iter(self, tag: Union[str, AnyStr]=...) -> Generator['Element', None, None]: ...
+    def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+    def itertext(self) -> Generator[str, None, None]: ...
+    def keys(self) -> KeysView[AnyStr]: ...
+    def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> 'Element': ...
+    def remove(self, subelement: 'Element') -> None: ...
+    def set(self, key: AnyStr, value: AnyStr) -> None: ...
+    def __bool__(self) -> bool: ...
+    def __delitem__(self, index: int) -> None: ...
+    def __getitem__(self, index) -> 'Element': ...
+    def __len__(self) -> int: ...
+    def __setitem__(self, index: int, element: 'Element') -> None: ...
+
+def SubElement(parent: Element, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> Element: ...
+def Comment(text: _str_or_bytes=...) -> Element: ...
+def ProcessingInstruction(target: str, text: str=...) -> Element: ...
+
+PI = ...  # type: Callable[..., Element]
+
+class QName:
+    text = ...  # type: str
+    def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+    def __init__(self, element: Element=..., file: _file_or_filename=...) -> None: ...
+    def getroot(self) -> Element: ...
+    def parse(self, source: _file_or_filename, parser: 'XMLParser'=...) -> Element: ...
+    def iter(self, tag: Union[str, AnyStr]=...) -> Generator[Element, None, None]: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List[Element]: ...
+    def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+    def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+    def findall(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+    def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+    def write(self, file_or_filename: _file_or_filename, encoding: str=..., xml_declaration: Optional[bool]=..., default_namespace: str=..., method: str=...) -> None: ...
+    def write_c14n(self, file: _file_or_filename) -> None: ...
+
+def register_namespace(prefix: str, uri: str) -> None: ...
+def tostring(element: Element, encoding: str=..., method: str=...) -> str: ...
+
+def tostringlist(element: Element, encoding: str=..., method: str=...) -> List[str]: ...
+def dump(elem: Element) -> None: ...
+def parse(source: _file_or_filename, parser: 'XMLParser'=...) -> ElementTree: ...
+def iterparse(source: _file_or_filename, events: Sequence[str]=..., parser: 'XMLParser'=...) -> Iterator[Tuple[str, Element]]: ...
+
+
+class _IterParseIterator:
+    root = ...  # type: Any
+    def __init__(self, source: _file_or_filename, events: Sequence[str], parser: 'XMLParser', close_source: bool=...) -> None: ...
+    def __next__(self) -> Tuple[str, Element]: ...
+    def __iter__(self) -> _IterParseIterator: ...
+
+def XML(text: AnyStr, parser: 'XMLParser'=...) -> Element: ...
+def XMLID(text: AnyStr, parser: 'XMLParser'=...) -> Tuple[Element, Dict[str, Element]]: ...
+
+# TODO-improve this type
+fromstring = ...  # type: Callable[..., Element]
+
+def fromstringlist(sequence: Sequence[AnyStr], parser: 'XMLParser'=...) -> Element: ...
+
+class TreeBuilder:
+    def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], Element]=...) -> None: ...
+    def close(self) -> Element: ...
+    def data(self, data: AnyStr) -> None: ...
+    def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> Element: ...
+    def end(self, tag: AnyStr) -> Element: ...
+
+class XMLParser:
+    parser = ...  # type: Any
+    target = ...  # type: TreeBuilder
+    # TODO-what is entity used for???
+    entity = ...  # type: Any
+    version = ...  # type: str
+    def __init__(self, html: int=..., target: TreeBuilder=..., encoding: str=...) -> None: ...
+    def doctype(self, name: str, pubid: str, system: str) -> None: ...
+    def close(self) -> Any: ...  # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+    def feed(self, data: AnyStr)-> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.2/xml/etree/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.2/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/3.2/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.2/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/3.2/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import *  # noqa: F403
diff --git a/typeshed/stdlib/3.3/ipaddress.pyi b/typeshed/stdlib/3.3/ipaddress.pyi
new file mode 100644
index 0000000..69c2454
--- /dev/null
+++ b/typeshed/stdlib/3.3/ipaddress.pyi
@@ -0,0 +1,200 @@
+# Stubs for ipaddress (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+IPV4LENGTH = ...  # type: Any
+IPV6LENGTH = ...  # type: Any
+
+class AddressValueError(ValueError): ...
+class NetmaskValueError(ValueError): ...
+
+def ip_address(address): ...
+def ip_network(address, strict=...): ...
+def ip_interface(address): ...
+def v4_int_to_packed(address): ...
+def v6_int_to_packed(address): ...
+def summarize_address_range(first, last): ...
+def collapse_addresses(addresses): ...
+def get_mixed_type_key(obj): ...
+
+class _TotalOrderingMixin:
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    def __lt__(self, other): ...
+    def __le__(self, other): ...
+    def __gt__(self, other): ...
+    def __ge__(self, other): ...
+
+class _IPAddressBase(_TotalOrderingMixin):
+    @property
+    def exploded(self): ...
+    @property
+    def compressed(self): ...
+    @property
+    def version(self): ...
+
+class _BaseAddress(_IPAddressBase):
+    def __init__(self, address) -> None: ...
+    def __int__(self): ...
+    def __eq__(self, other): ...
+    def __lt__(self, other): ...
+    def __add__(self, other): ...
+    def __sub__(self, other): ...
+    def __hash__(self): ...
+
+class _BaseNetwork(_IPAddressBase):
+    def __init__(self, address) -> None: ...
+    def hosts(self): ...
+    def __iter__(self): ...
+    def __getitem__(self, n): ...
+    def __lt__(self, other): ...
+    def __eq__(self, other): ...
+    def __hash__(self): ...
+    def __contains__(self, other): ...
+    def overlaps(self, other): ...
+    @property
+    def broadcast_address(self): ...
+    @property
+    def hostmask(self): ...
+    @property
+    def with_prefixlen(self): ...
+    @property
+    def with_netmask(self): ...
+    @property
+    def with_hostmask(self): ...
+    @property
+    def num_addresses(self): ...
+    @property
+    def prefixlen(self): ...
+    def address_exclude(self, other): ...
+    def compare_networks(self, other): ...
+    def subnets(self, prefixlen_diff=..., new_prefix=...): ...
+    def supernet(self, prefixlen_diff=..., new_prefix=...): ...
+    @property
+    def is_multicast(self): ...
+    @property
+    def is_reserved(self): ...
+    @property
+    def is_link_local(self): ...
+    @property
+    def is_private(self): ...
+    @property
+    def is_global(self): ...
+    @property
+    def is_unspecified(self): ...
+    @property
+    def is_loopback(self): ...
+
+class _BaseV4:
+    def __init__(self, address) -> None: ...
+    @property
+    def max_prefixlen(self): ...
+    @property
+    def version(self): ...
+
+class IPv4Address(_BaseV4, _BaseAddress):
+    def __init__(self, address) -> None: ...
+    @property
+    def packed(self): ...
+    @property
+    def is_reserved(self): ...
+    @property
+    def is_private(self): ...
+    @property
+    def is_multicast(self): ...
+    @property
+    def is_unspecified(self): ...
+    @property
+    def is_loopback(self): ...
+    @property
+    def is_link_local(self): ...
+
+class IPv4Interface(IPv4Address):
+    network = ...  # type: Any
+    netmask = ...  # type: Any
+    hostmask = ...  # type: Any
+    def __init__(self, address) -> None: ...
+    def __eq__(self, other): ...
+    def __lt__(self, other): ...
+    def __hash__(self): ...
+    @property
+    def ip(self): ...
+    @property
+    def with_prefixlen(self): ...
+    @property
+    def with_netmask(self): ...
+    @property
+    def with_hostmask(self): ...
+
+class IPv4Network(_BaseV4, _BaseNetwork):
+    network_address = ...  # type: Any
+    netmask = ...  # type: Any
+    hosts = ...  # type: Any
+    def __init__(self, address, strict=...) -> None: ...
+    @property
+    def is_global(self): ...
+
+class _BaseV6:
+    def __init__(self, address) -> None: ...
+    @property
+    def max_prefixlen(self): ...
+    @property
+    def version(self): ...
+
+class IPv6Address(_BaseV6, _BaseAddress):
+    def __init__(self, address) -> None: ...
+    @property
+    def packed(self): ...
+    @property
+    def is_multicast(self): ...
+    @property
+    def is_reserved(self): ...
+    @property
+    def is_link_local(self): ...
+    @property
+    def is_site_local(self): ...
+    @property
+    def is_private(self): ...
+    @property
+    def is_global(self): ...
+    @property
+    def is_unspecified(self): ...
+    @property
+    def is_loopback(self): ...
+    @property
+    def ipv4_mapped(self): ...
+    @property
+    def teredo(self): ...
+    @property
+    def sixtofour(self): ...
+
+class IPv6Interface(IPv6Address):
+    network = ...  # type: Any
+    netmask = ...  # type: Any
+    hostmask = ...  # type: Any
+    def __init__(self, address) -> None: ...
+    def __eq__(self, other): ...
+    def __lt__(self, other): ...
+    def __hash__(self): ...
+    @property
+    def ip(self): ...
+    @property
+    def with_prefixlen(self): ...
+    @property
+    def with_netmask(self): ...
+    @property
+    def with_hostmask(self): ...
+    @property
+    def is_unspecified(self): ...
+    @property
+    def is_loopback(self): ...
+
+class IPv6Network(_BaseV6, _BaseNetwork):
+    network_address = ...  # type: Any
+    netmask = ...  # type: Any
+    def __init__(self, address, strict=...) -> None: ...
+    def hosts(self): ...
+    @property
+    def is_site_local(self): ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.3/xml/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.3/xml/__init__.pyi
diff --git a/typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..bbe3fb3
--- /dev/null
+++ b/typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from .ElementTree import Element
+
+XINCLUDE = ...  # type: str
+XINCLUDE_INCLUDE = ...  # type: str
+XINCLUDE_FALLBACK = ...  # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, Element]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: Element, loader: Callable[..., Union[str, Element]]=...) -> None: ...
diff --git a/typeshed/stdlib/3.3/xml/etree/ElementPath.pyi b/typeshed/stdlib/3.3/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..b1ea50e
--- /dev/null
+++ b/typeshed/stdlib/3.3/xml/etree/ElementPath.pyi
@@ -0,0 +1,35 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Pattern, Dict, Generator, Tuple, List, Union, TypeVar, Callable, Optional
+from .ElementTree import Element
+
+xpath_tokenizer_re = ...  # type: Pattern
+
+_token = Tuple[str, str]
+_next = Callable[[], _token]
+_callback = Callable[['_SelectorContext', List[Element]], Generator[Element, None, None]]
+
+def xpath_tokenizer(pattern: str, namespaces: Dict[str, str]=...) -> Generator[_token, None, None]: ...
+def get_parent_map(context: '_SelectorContext') -> Dict[Element, Element]: ...
+def prepare_child(next: _next, token: _token) -> _callback: ...
+def prepare_star(next: _next, token: _token) -> _callback: ...
+def prepare_self(next: _next, token: _token) -> _callback: ...
+def prepare_descendant(next: _next, token: _token) -> _callback: ...
+def prepare_parent(next: _next, token: _token) -> _callback: ...
+def prepare_predicate(next: _next, token: _token) -> _callback: ...
+
+ops = ...  # type: Dict[str, Callable[[_next, _token], _callback]]
+
+class _SelectorContext:
+    parent_map = ...  # type: Dict[Element, Element]
+    root = ...  # type: Element
+    def __init__(self, root: Element) -> None: ...
+
+_T = TypeVar('_T')
+
+def iterfind(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def find(elem: Element, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+def findall(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def findtext(elem: Element, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
diff --git a/typeshed/stdlib/3.3/xml/etree/ElementTree.pyi b/typeshed/stdlib/3.3/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..148b89e
--- /dev/null
+++ b/typeshed/stdlib/3.3/xml/etree/ElementTree.pyi
@@ -0,0 +1,113 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, KeysView, ItemsView, Generator
+import io
+
+VERSION = ...  # type: str
+
+class ParseError(SyntaxError): ...
+
+def iselement(element: 'Element') -> bool: ...
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class Element(Sequence['Element']):
+    tag = ...  # type: _str_or_bytes
+    attrib = ...  # type: Dict[_str_or_bytes, _str_or_bytes]
+    text = ...  # type: Optional[_str_or_bytes]
+    tail = ...  # type: Optional[_str_or_bytes]
+    def __init__(self, tag: Union[AnyStr, Callable[..., 'Element']], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> None: ...
+    def append(self, subelement: 'Element') -> None: ...
+    def clear(self) -> None: ...
+    def copy(self) -> 'Element': ...
+    def extend(self, elements: Sequence['Element']) -> None: ...
+    def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional['Element']: ...
+    def findall(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+    def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+    def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+    def getchildren(self) -> List['Element']: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List['Element']: ...
+    def insert(self, index: int, subelement: 'Element') -> None: ...
+    def items(self) -> ItemsView[AnyStr, AnyStr]: ...
+    def iter(self, tag: Union[str, AnyStr]=...) -> Generator['Element', None, None]: ...
+    def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+    def itertext(self) -> Generator[str, None, None]: ...
+    def keys(self) -> KeysView[AnyStr]: ...
+    def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> 'Element': ...
+    def remove(self, subelement: 'Element') -> None: ...
+    def set(self, key: AnyStr, value: AnyStr) -> None: ...
+    def __bool__(self) -> bool: ...
+    def __delitem__(self, index: int) -> None: ...
+    def __getitem__(self, index) -> 'Element': ...
+    def __len__(self) -> int: ...
+    def __setitem__(self, index: int, element: 'Element') -> None: ...
+
+def SubElement(parent: Element, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> Element: ...
+def Comment(text: _str_or_bytes=...) -> Element: ...
+def ProcessingInstruction(target: str, text: str=...) -> Element: ...
+
+PI = ...  # type: Callable[..., Element]
+
+class QName:
+    text = ...  # type: str
+    def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+    def __init__(self, element: Element=..., file: _file_or_filename=...) -> None: ...
+    def getroot(self) -> Element: ...
+    def parse(self, source: _file_or_filename, parser: 'XMLParser'=...) -> Element: ...
+    def iter(self, tag: Union[str, AnyStr]=...) -> Generator[Element, None, None]: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List[Element]: ...
+    def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+    def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+    def findall(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+    def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+    def write(self, file_or_filename: _file_or_filename, encoding: str=..., xml_declaration: Optional[bool]=..., default_namespace: str=..., method: str=...) -> None: ...
+    def write_c14n(self, file: _file_or_filename) -> None: ...
+
+def register_namespace(prefix: str, uri: str) -> None: ...
+def tostring(element: Element, encoding: str=..., method: str=...) -> str: ...
+def tostringlist(element: Element, encoding: str=..., method: str=...) -> List[str]: ...
+def dump(elem: Element) -> None: ...
+def parse(source: _file_or_filename, parser: 'XMLParser'=...) -> ElementTree: ...
+def iterparse(source: _file_or_filename, events: Sequence[str]=..., parser: 'XMLParser'=...) -> Iterator[Tuple[str, Element]]: ...
+
+
+class _IterParseIterator:
+    root = ...  # type: Any
+    def __init__(self, source: _file_or_filename, events: Sequence[str], parser: 'XMLParser', close_source: bool=...) -> None: ...
+    def __next__(self) -> Tuple[str, Element]: ...
+    def __iter__(self) -> _IterParseIterator: ...
+
+def XML(text: AnyStr, parser: 'XMLParser'=...) -> Element: ...
+def XMLID(text: AnyStr, parser: 'XMLParser'=...) -> Tuple[Element, Dict[str, Element]]: ...
+
+# TODO-improve this type
+fromstring = ...  # type: Callable[..., Element]
+
+def fromstringlist(sequence: Sequence[AnyStr], parser: 'XMLParser'=...) -> Element: ...
+
+class TreeBuilder:
+    def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], Element]=...) -> None: ...
+    def close(self) -> Element: ...
+    def data(self, data: AnyStr) -> None: ...
+    def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> Element: ...
+    def end(self, tag: AnyStr) -> Element: ...
+
+class XMLParser:
+    parser = ...  # type: Any
+    target = ...  # type: TreeBuilder
+    # TODO-what is entity used for???
+    entity = ...  # type: Any
+    version = ...  # type: str
+    def __init__(self, html: int=..., target: TreeBuilder=..., encoding: str=...) -> None: ...
+    def doctype(self, name: str, pubid: str, system: str) -> None: ...
+    def close(self) -> Any: ...  # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+    def feed(self, data: AnyStr)-> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.3/xml/etree/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.3/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/3.3/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.3/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/3.3/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import *  # noqa: F403
diff --git a/typeshed/stdlib/3.4/_stat.pyi b/typeshed/stdlib/3.4/_stat.pyi
new file mode 100644
index 0000000..867321a
--- /dev/null
+++ b/typeshed/stdlib/3.4/_stat.pyi
@@ -0,0 +1,69 @@
+"""Stub file for the '_stat' module."""
+
+SF_APPEND = ...  # type: int
+SF_ARCHIVED = ...  # type: int
+SF_IMMUTABLE = ...  # type: int
+SF_NOUNLINK = ...  # type: int
+SF_SNAPSHOT = ...  # type: int
+ST_ATIME = ...  # type: int
+ST_CTIME = ...  # type: int
+ST_DEV = ...  # type: int
+ST_GID = ...  # type: int
+ST_INO = ...  # type: int
+ST_MODE = ...  # type: int
+ST_MTIME = ...  # type: int
+ST_NLINK = ...  # type: int
+ST_SIZE = ...  # type: int
+ST_UID = ...  # type: int
+S_ENFMT = ...  # type: int
+S_IEXEC = ...  # type: int
+S_IFBLK = ...  # type: int
+S_IFCHR = ...  # type: int
+S_IFDIR = ...  # type: int
+S_IFDOOR = ...  # type: int
+S_IFIFO = ...  # type: int
+S_IFLNK = ...  # type: int
+S_IFPORT = ...  # type: int
+S_IFREG = ...  # type: int
+S_IFSOCK = ...  # type: int
+S_IFWHT = ...  # type: int
+S_IREAD = ...  # type: int
+S_IRGRP = ...  # type: int
+S_IROTH = ...  # type: int
+S_IRUSR = ...  # type: int
+S_IRWXG = ...  # type: int
+S_IRWXO = ...  # type: int
+S_IRWXU = ...  # type: int
+S_ISGID = ...  # type: int
+S_ISUID = ...  # type: int
+S_ISVTX = ...  # type: int
+S_IWGRP = ...  # type: int
+S_IWOTH = ...  # type: int
+S_IWRITE = ...  # type: int
+S_IWUSR = ...  # type: int
+S_IXGRP = ...  # type: int
+S_IXOTH = ...  # type: int
+S_IXUSR = ...  # type: int
+UF_APPEND = ...  # type: int
+UF_COMPRESSED = ...  # type: int
+UF_HIDDEN = ...  # type: int
+UF_IMMUTABLE = ...  # type: int
+UF_NODUMP = ...  # type: int
+UF_NOUNLINK = ...  # type: int
+UF_OPAQUE = ...  # type: int
+
+def S_IMODE(mode: int) -> int: ...
+def S_IFMT(mode: int) -> int: ...
+
+def S_ISBLK(mode: int) -> bool: ...
+def S_ISCHR(mode: int) -> bool: ...
+def S_ISDIR(mode: int) -> bool: ...
+def S_ISDOOR(mode: int) -> bool: ...
+def S_ISFIFO(mode: int) -> bool: ...
+def S_ISLNK(mode: int) -> bool: ...
+def S_ISPORT(mode: int) -> bool: ...
+def S_ISREG(mode: int) -> bool: ...
+def S_ISSOCK(mode: int) -> bool: ...
+def S_ISWHT(mode: int) -> bool: ...
+
+def filemode(mode: int) -> str: ...
diff --git a/typeshed/stdlib/3.4/_tracemalloc.pyi b/typeshed/stdlib/3.4/_tracemalloc.pyi
new file mode 100644
index 0000000..b1db5ab
--- /dev/null
+++ b/typeshed/stdlib/3.4/_tracemalloc.pyi
@@ -0,0 +1,26 @@
+"""Stub file for the '_tracemalloc' module."""
+# This is an autogenerated file. It serves as a starting point
+# for a more precise manual annotation of this module.
+# Feel free to edit the source below, but remove this header when you do.
+
+from typing import Any, List, Tuple, Dict, Generic
+
+def _get_object_traceback(*args, **kwargs) -> Any: ...
+
+def _get_traces() -> Any:
+    raise MemoryError()
+
+def clear_traces() -> None: ...
+
+def get_traceback_limit() -> int: ...
+
+def get_traced_memory() -> tuple: ...
+
+def get_tracemalloc_memory() -> Any: ...
+
+def is_tracing() -> bool: ...
+
+def start(*args, **kwargs) -> None:
+    raise ValueError()
+
+def stop() -> None: ...
diff --git a/typeshed/stdlib/3.4/asyncio/__init__.pyi b/typeshed/stdlib/3.4/asyncio/__init__.pyi
new file mode 100644
index 0000000..5f83bc6
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/__init__.pyi
@@ -0,0 +1,97 @@
+"""The asyncio package, tracking PEP 3156."""
+
+import sys
+from typing import Type
+
+from asyncio.coroutines import (
+    coroutine as coroutine,
+    iscoroutinefunction as iscoroutinefunction,
+    iscoroutine as iscoroutine,
+)
+from asyncio.protocols import (
+    BaseProtocol as BaseProtocol,
+    Protocol as Protocol,
+    DatagramProtocol as DatagramProtocol,
+    SubprocessProtocol as SubprocessProtocol,
+)
+from asyncio.streams import (
+    StreamReader as StreamReader,
+    StreamWriter as StreamWriter,
+    StreamReaderProtocol as StreamReaderProtocol,
+    open_connection as open_connection,
+    start_server as start_server,
+    IncompleteReadError as IncompleteReadError,
+    LimitOverrunError as LimitOverrunError,
+)
+from asyncio.subprocess import (
+    create_subprocess_exec as create_subprocess_exec,
+    create_subprocess_shell as create_subprocess_shell,
+)
+from asyncio.transports import (
+    BaseTransport as BaseTransport,
+    ReadTransport as ReadTransport,
+    WriteTransport as WriteTransport,
+    Transport as Transport,
+    DatagramTransport as DatagramTransport,
+    SubprocessTransport as SubprocessTransport,
+)
+from asyncio.futures import (
+    Future as Future,
+    CancelledError as CancelledError,
+    TimeoutError as TimeoutError,
+    InvalidStateError as InvalidStateError,
+)
+from asyncio.tasks import (
+    FIRST_COMPLETED as FIRST_COMPLETED,
+    FIRST_EXCEPTION as FIRST_EXCEPTION,
+    ALL_COMPLETED as ALL_COMPLETED,
+    as_completed as as_completed,
+    ensure_future as ensure_future,
+    gather as gather,
+    run_coroutine_threadsafe as run_coroutine_threadsafe,
+    shield as shield,
+    sleep as sleep,
+    wait as wait,
+    wait_for as wait_for,
+    Task as Task,
+)
+from asyncio.events import (
+    AbstractEventLoopPolicy as AbstractEventLoopPolicy,
+    AbstractEventLoop as AbstractEventLoop,
+    AbstractServer as AbstractServer,
+    Handle as Handle,
+    get_event_loop_policy as get_event_loop_policy,
+    set_event_loop_policy as set_event_loop_policy,
+    get_event_loop as get_event_loop,
+    set_event_loop as set_event_loop,
+    new_event_loop as new_event_loop,
+    get_child_watcher as get_child_watcher,
+    set_child_watcher as set_child_watcher,
+)
+from asyncio.queues import (
+    Queue as Queue,
+    PriorityQueue as PriorityQueue,
+    LifoQueue as LifoQueue,
+    JoinableQueue as JoinableQueue,
+    QueueFull as QueueFull,
+    QueueEmpty as QueueEmpty,
+)
+from asyncio.locks import (
+    Lock as Lock,
+    Event as Event,
+    Condition as Condition,
+    Semaphore as Semaphore,
+    BoundedSemaphore as BoundedSemaphore,
+)
+
+# TODO: It should be possible to instantiate these classes, but mypy
+# currently disallows this.
+# See https://github.com/python/mypy/issues/1843
+SelectorEventLoop = ...  # type: Type[AbstractEventLoop]
+if sys.platform == 'win32':
+    ProactorEventLoop = ...  # type: Type[AbstractEventLoop]
+DefaultEventLoopPolicy = ...  # type: Type[AbstractEventLoopPolicy]
+
+# TODO: AbstractChildWatcher (UNIX only)
+
+__all__ = ...  # type: str
diff --git a/typeshed/stdlib/3.4/asyncio/coroutines.pyi b/typeshed/stdlib/3.4/asyncio/coroutines.pyi
new file mode 100644
index 0000000..9072dd7
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/coroutines.pyi
@@ -0,0 +1,9 @@
+from typing import Any, Callable, Generator, TypeVar
+
+__all__ = ...  # type: str
+
+_F = TypeVar('_F', bound=Callable[..., Any])
+
+def coroutine(func: _F) -> _F: ...
+def iscoroutinefunction(func: Callable[..., Any]) -> bool: ...
+def iscoroutine(obj: Any) -> bool: ...
diff --git a/typeshed/stdlib/3.4/asyncio/events.pyi b/typeshed/stdlib/3.4/asyncio/events.pyi
new file mode 100644
index 0000000..2e87f70
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/events.pyi
@@ -0,0 +1,177 @@
+import sys
+from typing import Any, Awaitable, TypeVar, List, Callable, Tuple, Union, Dict, Generator, overload, Optional
+from abc import ABCMeta, abstractmethod
+from asyncio.futures import Future
+from asyncio.coroutines import coroutine
+from asyncio.tasks import Task
+
+__all__ = ...  # type: str
+
+_T = TypeVar('_T')
+
+PIPE = ...  # type: Any  # from subprocess.PIPE
+
+AF_UNSPEC = 0     # from socket
+AI_PASSIVE = 0
+
+class Handle:
+    _cancelled = False
+    _args = ...  # type: List[Any]
+    def __init__(self, callback: Callable[..., Any], args: List[Any],
+        loop: AbstractEventLoop) -> None: ...
+    def __repr__(self) -> str: ...
+    def cancel(self) -> None: ...
+    def _run(self) -> None: ...
+
+class AbstractServer:
+    def close(self) -> None: ...
+    @coroutine
+    def wait_closed(self) -> Generator[Any, Any, None]: ...
+
+class AbstractEventLoop(metaclass=ABCMeta):
+    @abstractmethod
+    def run_forever(self) -> None: ...
+
+    # Can't use a union, see mypy issue  # 1873.
+    @overload
+    @abstractmethod
+    def run_until_complete(self, future: Generator[Any, Any, _T]) -> _T: ...
+    @overload
+    @abstractmethod
+    def run_until_complete(self, future: Awaitable[_T]) -> _T: ...
+
+    @abstractmethod
+    def stop(self) -> None: ...
+    @abstractmethod
+    def is_running(self) -> bool: ...
+    @abstractmethod
+    def close(self) -> None: ...
+    # Methods scheduling callbacks.  All these return Handles.
+    @abstractmethod
+    def call_soon(self, callback: Callable[..., Any], *args: Any) -> Handle: ...
+    @abstractmethod
+    def call_later(self, delay: Union[int, float], callback: Callable[..., Any], *args: Any) -> Handle: ...
+    @abstractmethod
+    def call_at(self, when: float, callback: Callable[..., Any], *args: Any) -> Handle: ...
+    @abstractmethod
+    def time(self) -> float: ...
+    # Future methods
+    if sys.version_info >= (3, 5):
+        @abstractmethod
+        def create_future(self) -> Future[Any]: ...
+    # Tasks methods
+    @abstractmethod
+    def create_task(self, coro: Union[Future[_T], Generator[Any, None, _T]]) -> Task[_T]: ...
+    @abstractmethod
+    def set_task_factory(self, factory: Optional[Callable[[AbstractEventLoop, Generator[Any, None, _T]], Future[_T]]]) -> None: ...
+    @abstractmethod
+    def get_task_factory(self) -> Optional[Callable[[AbstractEventLoop, Generator[Any, None, _T]], Future[_T]]]: ...
+    # Methods for interacting with threads
+    @abstractmethod
+    def call_soon_threadsafe(self, callback: Callable[..., Any], *args: Any) -> Handle: ...
+    @abstractmethod
+    def run_in_executor(self, executor: Any,
+        callback: Callable[[], Any], *args: Any) -> Future[Any]: ...
+    @abstractmethod
+    def set_default_executor(self, executor: Any) -> None: ...
+    # Network I/O methods returning Futures.
+    @abstractmethod
+    def getaddrinfo(self, host: str, port: int, *,
+        family: int = ..., type: int = ..., proto: int = ..., flags: int = ...) -> Future[List[Tuple[int, int, int, str, tuple]]]: ...
+    @abstractmethod
+    def getnameinfo(self, sockaddr: tuple, flags: int = ...) -> Future[Tuple[str, int]]: ...
+    @abstractmethod
+    def create_connection(self, protocol_factory: Any, host: str = ..., port: int = ..., *,
+                          ssl: Any = ..., family: int = ..., proto: int = ..., flags: int = ..., sock: Any = ...,
+                          local_addr: str = ..., server_hostname: str = ...) -> tuple: ...
+    @abstractmethod
+    def create_server(self, protocol_factory: Any, host: str = ..., port: int = ..., *,
+                      family: int = ..., flags: int = ...,
+                      sock: Any = ..., backlog: int = ..., ssl: Any = ..., reuse_address: Any = ...) -> Any: ...
+    @abstractmethod
+    def create_unix_connection(self, protocol_factory: Any, path: str, *,
+                               ssl: Any = ..., sock: Any = ...,
+                               server_hostname: str = ...) -> tuple: ...
+    @abstractmethod
+    def create_unix_server(self, protocol_factory: Any, path: str, *,
+                           sock: Any = ..., backlog: int = ..., ssl: Any = ...) -> Any: ...
+    @abstractmethod
+    def create_datagram_endpoint(self, protocol_factory: Any,
+                                 local_addr: str = ..., remote_addr: str = ..., *,
+                                 family: int = ..., proto: int = ..., flags: int = ...) -> tuple: ...
+    # Pipes and subprocesses.
+    @abstractmethod
+    def connect_read_pipe(self, protocol_factory: Any, pipe: Any) -> tuple: ...
+    @abstractmethod
+    def connect_write_pipe(self, protocol_factory: Any, pipe: Any) -> tuple: ...
+    @abstractmethod
+    def subprocess_shell(self, protocol_factory: Any, cmd: Union[bytes, str], *, stdin: Any = ...,
+                         stdout: Any = ..., stderr: Any = ...,
+                         **kwargs: Any) -> tuple: ...
+    @abstractmethod
+    def subprocess_exec(self, protocol_factory: Any, *args: List[Any], stdin: Any = ...,
+                        stdout: Any = ..., stderr: Any = ...,
+                        **kwargs: Any) -> tuple: ...
+    @abstractmethod
+    def add_reader(self, fd: int, callback: Callable[[], Any], *args: List[Any]) -> None: ...
+    @abstractmethod
+    def remove_reader(self, fd: int) -> None: ...
+    @abstractmethod
+    def add_writer(self, fd: int, callback: Callable[[], Any], *args: List[Any]) -> None: ...
+    @abstractmethod
+    def remove_writer(self, fd: int) -> None: ...
+    # Completion based I/O methods returning Futures.
+    @abstractmethod
+    def sock_recv(self, sock: Any, nbytes: int) -> Any: ...  # TODO
+    @abstractmethod
+    def sock_sendall(self, sock: Any, data: bytes) -> None: ...  # TODO
+    @abstractmethod
+    def sock_connect(self, sock: Any, address: str) -> Any: ...  # TODO
+    @abstractmethod
+    def sock_accept(self, sock: Any) -> Any: ...
+    # Signal handling.
+    @abstractmethod
+    def add_signal_handler(self, sig: int, callback: Callable[[], Any], *args: List[Any]) -> None: ...
+    @abstractmethod
+    def remove_signal_handler(self, sig: int) -> None: ...
+    # Error handlers.
+    @abstractmethod
+    def set_exception_handler(self, handler: Callable[[], Any]) -> None: ...
+    @abstractmethod
+    def default_exception_handler(self, context: Any) -> None: ...
+    @abstractmethod
+    def call_exception_handler(self, context: Any) -> None: ...
+    # Debug flag management.
+    @abstractmethod
+    def get_debug(self) -> bool: ...
+    @abstractmethod
+    def set_debug(self, enabled: bool) -> None: ...
+
+class AbstractEventLoopPolicy(metaclass=ABCMeta):
+    @abstractmethod
+    def get_event_loop(self) -> AbstractEventLoop: ...
+    @abstractmethod
+    def set_event_loop(self, loop: AbstractEventLoop): ...
+    @abstractmethod
+    def new_event_loop(self) -> AbstractEventLoop: ...
+    # Child processes handling (Unix only).
+    @abstractmethod
+    def get_child_watcher(self) -> Any: ...  # TODO: unix_events.AbstractChildWatcher
+    @abstractmethod
+    def set_child_watcher(self, watcher: Any) -> None: ...  # TODO: unix_events.AbstractChildWatcher
+
+class BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy):
+    def __init__(self) -> None: ...
+    def get_event_loop(self) -> AbstractEventLoop: ...
+    def set_event_loop(self, loop: AbstractEventLoop): ...
+    def new_event_loop(self) -> AbstractEventLoop: ...
+
+def get_event_loop_policy() -> AbstractEventLoopPolicy: ...
+def set_event_loop_policy(policy: AbstractEventLoopPolicy) -> None: ...
+
+def get_event_loop() -> AbstractEventLoop: ...
+def set_event_loop(loop: AbstractEventLoop) -> None: ...
+def new_event_loop() -> AbstractEventLoop: ...
+
+def get_child_watcher() -> Any: ...  # TODO: unix_events.AbstractChildWatcher
+def set_child_watcher(watcher: Any) -> None: ...  # TODO: unix_events.AbstractChildWatcher
diff --git a/typeshed/stdlib/3.4/asyncio/futures.pyi b/typeshed/stdlib/3.4/asyncio/futures.pyi
new file mode 100644
index 0000000..b880093
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/futures.pyi
@@ -0,0 +1,46 @@
+from typing import Any, Union, Callable, TypeVar, List, Generic, Iterable, Generator, Awaitable
+from .events import AbstractEventLoop
+from concurrent.futures._base import (
+    Error as Error,
+)
+from concurrent.futures import (
+    CancelledError as CancelledError,
+    TimeoutError as TimeoutError,
+)
+
+__all__ = ...  # type: str
+
+_T = TypeVar('_T')
+
+class InvalidStateError(Error): ...
+
+class _TracebackLogger:
+    exc = ...  # type: BaseException
+    tb = ...  # type: List[str]
+    def __init__(self, exc: Any, loop: AbstractEventLoop) -> None: ...
+    def activate(self) -> None: ...
+    def clear(self) -> None: ...
+    def __del__(self) -> None: ...
+
+class Future(Iterable[_T], Awaitable[_T], Generic[_T]):
+    _state = ...  # type: str
+    _exception = ...  # type: BaseException
+    _blocking = False
+    _log_traceback = False
+    _tb_logger = _TracebackLogger
+    def __init__(self, *, loop: AbstractEventLoop = ...) -> None: ...
+    def __repr__(self) -> str: ...
+    def __del__(self) -> None: ...
+    def cancel(self) -> bool: ...
+    def _schedule_callbacks(self) -> None: ...
+    def cancelled(self) -> bool: ...
+    def done(self) -> bool: ...
+    def result(self) -> _T: ...
+    def exception(self) -> BaseException: ...
+    def add_done_callback(self, fn: Callable[[Future[_T]], Any]) -> None: ...
+    def remove_done_callback(self, fn: Callable[[Future[_T]], Any]) -> int: ...
+    def set_result(self, result: _T) -> None: ...
+    def set_exception(self, exception: Union[type, BaseException]) -> None: ...
+    def _copy_state(self, other: Any) -> None: ...
+    def __iter__(self) -> Generator[Any, None, _T]: ...
+    def __await__(self) -> Generator[Any, None, _T]: ...
diff --git a/typeshed/stdlib/3.4/asyncio/locks.pyi b/typeshed/stdlib/3.4/asyncio/locks.pyi
new file mode 100644
index 0000000..2467ffe
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/locks.pyi
@@ -0,0 +1,59 @@
+from typing import Any, Callable, Generator, Iterable, Iterator, TypeVar, Union
+
+from .coroutines import coroutine
+from .events import AbstractEventLoop
+from .futures import Future
+
+T = TypeVar('T')
+
+__all__ = ...  # type: str
+
+class _ContextManager:
+    def __init__(self, lock: Union[Lock, Semaphore]) -> None: ...
+    def __enter__(self) -> object: ...
+    def __exit__(self, *args: Any) -> None: ...
+
+class _ContextManagerMixin(Future[_ContextManager]):
+    # Apparently this exists to *prohibit* use as a context manager.
+    def __enter__(self) -> object: ...
+    def __exit__(self, *args: Any) -> None: ...
+    def __aenter__(self): ...
+    def __aexit__(self, exc_type, exc, tb): ...
+
+class Lock(_ContextManagerMixin):
+    def __init__(self, *, loop: AbstractEventLoop = None) -> None: ...
+    def locked(self) -> bool: ...
+    @coroutine
+    def acquire(self) -> Future[bool]: ...
+    def release(self) -> None: ...
+
+class Event:
+    def __init__(self, *, loop: AbstractEventLoop = None) -> None: ...
+    def is_set(self) -> bool: ...
+    def set(self) -> None: ...
+    def clear(self) -> None: ...
+    @coroutine
+    def wait(self) -> bool: ...
+
+class Condition(_ContextManagerMixin):
+    def __init__(self, lock: Lock = None, *, loop: AbstractEventLoop = None) -> None: ...
+    def locked(self) -> bool: ...
+    @coroutine
+    def acquire(self) -> Future[bool]: ...
+    def release(self) -> None: ...
+    @coroutine
+    def wait(self) -> Future[bool]: ...
+    @coroutine
+    def wait_for(self, predicate: Callable[[], T]) -> Future[T]: ...
+    def notify(self, n: int = 1) -> None: ...
+    def notify_all(self) -> None: ...
+
+class Semaphore(_ContextManagerMixin):
+    def __init__(self, value: int = 1, *, loop: AbstractEventLoop = None) -> None: ...
+    def locked(self) -> bool: ...
+    @coroutine
+    def acquire(self) -> Future[bool]: ...
+    def release(self) -> None: ...
+
+class BoundedSemaphore(Semaphore):
+    def __init__(self, value=1, *, loop: AbstractEventLoop = None) -> None: ...
diff --git a/typeshed/stdlib/3.4/asyncio/protocols.pyi b/typeshed/stdlib/3.4/asyncio/protocols.pyi
new file mode 100644
index 0000000..91b7d94
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/protocols.pyi
@@ -0,0 +1,24 @@
+from asyncio import transports
+from typing import AnyStr
+
+__all__ = ...  # type: str
+
+
+class BaseProtocol:
+    def connection_made(self, transport: transports.BaseTransport) -> None: ...
+    def connection_lost(self, exc: Exception) -> None: ...
+    def pause_writing(self) -> None: ...
+    def resume_writing(self) -> None: ...
+
+class Protocol(BaseProtocol):
+    def data_received(self, data: bytes) -> None: ...
+    def eof_received(self) -> bool: ...
+
+class DatagramProtocol(BaseProtocol):
+    def datagram_received(self, data: AnyStr, addr: str) -> None: ...
+    def error_received(self, exc: Exception) -> None: ...
+
+class SubprocessProtocol(BaseProtocol):
+    def pipe_data_received(self, fd: int, data: AnyStr) -> None: ...
+    def pipe_connection_lost(self, fd: int, exc: Exception) -> None: ...
+    def process_exited(self) -> None: ...
diff --git a/typeshed/stdlib/3.4/asyncio/queues.pyi b/typeshed/stdlib/3.4/asyncio/queues.pyi
new file mode 100644
index 0000000..dd1ffe6
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/queues.pyi
@@ -0,0 +1,46 @@
+from asyncio.events import AbstractEventLoop
+from .coroutines import coroutine
+from .futures import Future
+from typing import TypeVar, Generic
+
+__all__ = ...  # type: str
+
+
+class QueueEmpty(Exception): ...
+class QueueFull(Exception): ...
+
+T = TypeVar('T')
+
+class Queue(Generic[T]):
+    def __init__(self, maxsize: int = ..., *, loop: AbstractEventLoop = ...) -> None: ...
+    def _init(self, maxsize: int) -> None: ...
+    def _get(self) -> T: ...
+    def _put(self, item: T) -> None: ...
+    def __repr__(self) -> str: ...
+    def __str__(self) -> str: ...
+    def _format(self) -> str: ...
+    def _consume_done_getters(self) -> None: ...
+    def _consume_done_putters(self) -> None: ...
+    def qsize(self) -> int: ...
+    @property
+    def maxsize(self) -> int: ...
+    def empty(self) -> bool: ...
+    def full(self) -> bool: ...
+    @coroutine
+    def put(self, item: T) -> Future[None]: ...
+    def put_nowait(self, item: T) -> None: ...
+    @coroutine
+    def get(self) -> Future[T]: ...
+    def get_nowait(self) -> T: ...
+
+
+class PriorityQueue(Queue): ...
+
+
+class LifoQueue(Queue): ...
+
+
+class JoinableQueue(Queue):
+    def task_done(self) -> None: ...
+    @coroutine
+    def join(self) -> None: ...
diff --git a/typeshed/stdlib/3.4/asyncio/streams.pyi b/typeshed/stdlib/3.4/asyncio/streams.pyi
new file mode 100644
index 0000000..ed20303
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/streams.pyi
@@ -0,0 +1,105 @@
+import socket
+from typing import Any, Callable, Generator, Iterable, Tuple
+
+from . import coroutines
+from . import events
+from . import protocols
+from . import transports
+
+ClientConnectedCallback = Callable[[Tuple[StreamReader, StreamWriter]], None]
+
+
+__all__ = ...  # type: str
+
+class IncompleteReadError(EOFError):
+    def __init__(self, partial: str, expected: int) -> None: ...
+
+class LimitOverrunError(Exception):
+    def __init__(self, message: str, consumed: int) -> None: ...
+
+ at coroutines.coroutine
+def open_connection(
+    host: str = ...,
+    port: int = ...,
+    *,
+    loop: events.AbstractEventLoop = ...,
+    limit: int = ...,
+    **kwds: Any
+) -> Generator[Any, None, Tuple[StreamReader, StreamWriter]]: ...
+
+ at coroutines.coroutine
+def start_server(
+    client_connected_cb: ClientConnectedCallback,
+    host: str = ...,
+    port: int = ...,
+    *,
+    loop: events.AbstractEventLoop = ...,
+    limit: int = ...,
+    **kwds: Any
+) -> Generator[Any, None, events.AbstractServer]: ...
+
+if hasattr(socket, 'AF_UNIX'):
+    @coroutines.coroutine
+    def open_unix_connection(
+        path: str = ...,
+        *,
+        loop: events.AbstractEventLoop = ...,
+        limit: int = ...,
+        **kwds: Any
+    ) -> Generator[Any, None, Tuple[StreamReader, StreamWriter]]: ...
+
+    @coroutines.coroutine
+    def start_unix_server(
+        client_connected_cb: ClientConnectedCallback,
+        path: str = ...,
+        *,
+        loop: int = ...,
+        limit: int = ...,
+        **kwds: Any) -> Generator[Any, None, events.AbstractServer]: ...
+
+class FlowControlMixin(protocols.Protocol): ...
+
+class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
+    def __init__(self,
+            stream_reader: StreamReader,
+            client_connected_cb: ClientConnectedCallback = ...,
+            loop: events.AbstractEventLoop = ...) -> None: ...
+    def connection_made(self, transport: transports.BaseTransport) -> None: ...
+    def connection_lost(self, exc: Exception) -> None: ...
+    def data_received(self, data: bytes) -> None: ...
+    def eof_received(self) -> bool: ...
+
+class StreamWriter:
+    def __init__(self,
+            transport: transports.BaseTransport,
+            protocol: protocols.BaseProtocol,
+            reader: StreamReader,
+            loop: events.AbstractEventLoop) -> None: ...
+    @property
+    def transport(self) -> transports.BaseTransport: ...
+    def write(self, data: bytes) -> None: ...
+    def writelines(self, data: Iterable[bytes]) -> None: ...
+    def write_eof(self) -> None: ...
+    def can_write_eof(self) -> bool: ...
+    def close(self) -> None: ...
+    def get_extra_info(self, name: str, default: Any = ...) -> Any: ...
+    def drain(self) -> None: ...
+
+class StreamReader:
+    def __init__(self,
+            limit: int = ...,
+            loop: events.AbstractEventLoop = ...) -> None: ...
+    def exception(self) -> Exception: ...
+    def set_exception(self, exc: Exception) -> None: ...
+    def set_transport(self, transport: transports.BaseTransport) -> None: ...
+    def feed_eof(self) -> None: ...
+    def at_eof(self) -> bool: ...
+    def feed_data(self, data: bytes): ...
+    @coroutines.coroutine
+    def readline(self) -> Generator[Any, None, bytes]: ...
+    @coroutines.coroutine
+    def readuntil(self, separator=b'\n') -> Generator[Any, None, bytes]: ...
+    @coroutines.coroutine
+    def read(self, n=-1) -> Generator[Any, None, bytes]: ...
+    @coroutines.coroutine
+    def readexactly(self, n) -> Generator[Any, None, bytes]: ...
diff --git a/typeshed/stdlib/3.4/asyncio/subprocess.pyi b/typeshed/stdlib/3.4/asyncio/subprocess.pyi
new file mode 100644
index 0000000..2416f92
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/subprocess.pyi
@@ -0,0 +1,60 @@
+from asyncio import events
+from asyncio import protocols
+from asyncio import streams
+from asyncio import transports
+from asyncio.coroutines import coroutine
+from typing import Any, AnyStr, Tuple, Union
+
+__all__ = ...  # type: str
+
+PIPE = ...  # type: int
+STDOUT = ...  # type: int
+DEVNULL = ...  # type: int
+
+class SubprocessStreamProtocol(streams.FlowControlMixin,
+                               protocols.SubprocessProtocol):
+    def __init__(self, limit: int, loop: events.AbstractEventLoop) -> None: ...
+    def connection_made(self, transport: transports.BaseTransport) -> None: ...
+    def pipe_data_received(self, fd: int, data: AnyStr) -> None: ...
+    def pipe_connection_lost(self, fd: int, exc: Exception): ...
+    def process_exited(self) -> None: ...
+
+
+class Process:
+    def __init__(self,
+            transport: transports.BaseTransport,
+            protocol: protocols.BaseProtocol,
+            loop: events.AbstractEventLoop) -> None: ...
+    @property
+    def returncode(self) -> int: ...
+    @coroutine
+    def wait(self) -> int: ...
+    def send_signal(self, signal: int) -> None: ...
+    def terminate(self) -> None: ...
+    def kill(self) -> None: ...
+    @coroutine
+    def communicate(self, input: bytes = ...) -> Tuple[bytes, bytes]: ...
+
+
+ at coroutine
+def create_subprocess_shell(
+    *Args: Union[str, bytes],  # Union used instead of AnyStr due to mypy issue  #1236
+    stdin: int = ...,
+    stdout: int = ...,
+    stderr: int = ...,
+    loop: events.AbstractEventLoop = ...,
+    limit: int = ...,
+    **kwds: Any
+): ...
+
+ at coroutine
+def create_subprocess_exec(
+    program: Union[str, bytes],  # Union used instead of AnyStr due to mypy issue  #1236
+    *args: Any,
+    stdin: int = ...,
+    stdout: int = ...,
+    stderr: int = ...,
+    loop: events.AbstractEventLoop = ...,
+    limit: int = ...,
+    **kwds: Any
+) -> Process: ...
diff --git a/typeshed/stdlib/3.4/asyncio/tasks.pyi b/typeshed/stdlib/3.4/asyncio/tasks.pyi
new file mode 100644
index 0000000..a33fd15
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/tasks.pyi
@@ -0,0 +1,55 @@
+from typing import (Any, TypeVar, Set, Dict, List, TextIO, Union, Tuple, Generic, Callable,
+                    Coroutine, Generator, Iterable, Awaitable, overload, Sequence, Iterator,
+                    Optional)
+import concurrent.futures
+from .events import AbstractEventLoop
+from .futures import Future
+
+__all__ = ...  # type: str
+
+_T = TypeVar('_T')
+
+FIRST_EXCEPTION = 'FIRST_EXCEPTION'
+FIRST_COMPLETED = 'FIRST_COMPLETED'
+ALL_COMPLETED = 'ALL_COMPLETED'
+
+def as_completed(fs: Sequence[Future[_T]], *, loop: AbstractEventLoop = ...,
+                 timeout=None) -> Iterator[Generator[Any, None, _T]]: ...
+def ensure_future(coro_or_future: Union[Future[_T], Generator[Any, None, _T]],
+                  *, loop: AbstractEventLoop = ...) -> Future[_T]: ...
+# TODO: gather() should use variadic type vars instead of _TAny.
+_TAny = Any
+def gather(*coros_or_futures: Union[Future[_TAny], Generator[Any, None, _TAny], Awaitable[_TAny]],
+           loop: AbstractEventLoop = ..., return_exceptions: bool = False) -> Future[List[_TAny]]: ...
+def run_coroutine_threadsafe(coro: Union[Generator[Any, None, _T], Coroutine[Any, None, _T], Awaitable[_T]],
+                             loop: AbstractEventLoop) -> concurrent.futures.Future[_T]: ...
+def shield(arg: Union[Future[_T], Generator[Any, None, _T]],
+           *, loop: AbstractEventLoop = ...) -> Future[_T]: ...
+def sleep(delay: float, result: _T = ..., loop: AbstractEventLoop = ...) -> Future[_T]: ...
+def wait(fs: List[Task[_T]], *, loop: AbstractEventLoop = ...,
+    timeout: float = ...,
+         return_when: str = ...) -> Future[Tuple[Set[Future[_T]], Set[Future[_T]]]]: ...
+def wait_for(fut: Union[Future[_T], Generator[Any, None, _T], Awaitable[_T]], timeout: Optional[float],
+             *, loop: AbstractEventLoop = ...) -> Future[_T]: ...
+
+class Task(Future[_T], Generic[_T]):
+    _all_tasks = ...  # type: Set[Task]
+    _current_tasks = ...  # type: Dict[AbstractEventLoop, Task]
+    @classmethod
+    def current_task(cls, loop: AbstractEventLoop = ...) -> Task: ...
+    @classmethod
+    def all_tasks(cls, loop: AbstractEventLoop = ...) -> Set[Task]: ...
+
+    # Can't use a union, see mypy issue  #1873.
+    @overload
+    def __init__(self, coro: Generator[Any, None, _T],
+                 *, loop: AbstractEventLoop = ...) -> None: ...
+    @overload
+    def __init__(self, coro: Awaitable[_T], *, loop: AbstractEventLoop = ...) -> None: ...
+
+    def __repr__(self) -> str: ...
+    def get_stack(self, *, limit: int = ...) -> List[Any]: ...  # return List[stackframe]
+    def print_stack(self, *, limit: int = ..., file: TextIO = ...) -> None: ...
+    def cancel(self) -> bool: ...
+    def _step(self, value: Any = ..., exc: Exception = ...) -> None: ...
+    def _wakeup(self, future: Future[Any]) -> None: ...
diff --git a/typeshed/stdlib/3.4/asyncio/transports.pyi b/typeshed/stdlib/3.4/asyncio/transports.pyi
new file mode 100644
index 0000000..87320a1
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/transports.pyi
@@ -0,0 +1,38 @@
+from typing import Dict, Any, TypeVar, Mapping, List
+
+__all__ = ...  # type: str
+
+class BaseTransport:
+    def __init__(self, extra: Mapping[Any, Any] = ...) -> None: ...
+    def get_extra_info(self, name: Any, default: Any = ...) -> Any: ...
+    def is_closing(self) -> bool: ...
+    def close(self) -> None: ...
+
+class ReadTransport(BaseTransport):
+    def pause_reading(self) -> None: ...
+    def resume_reading(self) -> None: ...
+
+class WriteTransport(BaseTransport):
+    def set_write_buffer_limits(
+        self, high: int = ..., low: int = ...
+    ) -> None: ...
+    def get_write_buffer_size(self) -> int: ...
+    def write(self, data: Any) -> None: ...
+    def writelines(self, list_of_data: List[Any]): ...
+    def write_eof(self) -> None: ...
+    def can_write_eof(self) -> bool: ...
+    def abort(self) -> None: ...
+
+class Transport(ReadTransport, WriteTransport): ...
+
+class DatagramTransport(BaseTransport):
+    def sendto(self, data: Any, addr: str = ...) -> None: ...
+    def abort(self) -> None: ...
+
+class SubprocessTransport(BaseTransport):
+    def get_pid(self) -> int: ...
+    def get_returncode(self) -> int: ...
+    def get_pipe_transport(self, fd: int) -> BaseTransport: ...
+    def send_signal(self, signal: int) -> int: ...
+    def terminate(self) -> None: ...
+    def kill(self) -> None: ...
diff --git a/typeshed/stdlib/3.4/enum.pyi b/typeshed/stdlib/3.4/enum.pyi
new file mode 100644
index 0000000..3b97e1b
--- /dev/null
+++ b/typeshed/stdlib/3.4/enum.pyi
@@ -0,0 +1,50 @@
+# FIXME: Stub incomplete, ommissions include:
+# * the metaclass
+# * _sunder_ methods with their transformations
+
+import sys
+from typing import List, Any, TypeVar, Union
+
+class Enum:
+    def __new__(cls, value: Any) -> None: ...
+    def __repr__(self) -> str: ...
+    def __str__(self) -> str: ...
+    def __dir__(self) -> List[str]: ...
+    def __format__(self, format_spec: str) -> str: ...
+    def __hash__(self) -> Any: ...
+    def __reduce_ex__(self, proto: Any) -> Any: ...
+
+    name = ...  # type: str
+    value = ...  # type: Any
+
+class IntEnum(int, Enum):
+    value = ...  # type: int
+
+_T = TypeVar('_T')
+
+def unique(enumeration: _T) -> _T: ...
+
+if sys.version_info >= (3, 6):
+    _auto_null = ...  # type: Any
+
+    class auto:
+        value = ...  # type: Any
+
+    class Flag(Enum):
+        def __contains__(self: _T, other: _T) -> bool: ...
+        def __repr__(self) -> str: ...
+        def __str__(self) -> str: ...
+        def __bool__(self) -> bool: ...
+        def __or__(self: _T, other: _T) -> _T: ...
+        def __and__(self: _T, other: _T) -> _T: ...
+        def __xor__(self: _T, other: _T) -> _T: ...
+        def __invert__(self: _T) -> _T: ...
+
+    # All `type: ignore` comments below due to IntFlag making the function signatures more permissive.
+    class IntFlag(int, Flag):  # type: ignore
+        def __or__(self: _T, other: Union[int, _T]) -> _T: ...  # type: ignore
+        def __and__(self: _T, other: Union[int, _T]) -> _T: ...  # type: ignore
+        def __xor__(self: _T, other: Union[int, _T]) -> _T: ...  # type: ignore
+        __ror__ = __or__
+        __rand__ = __and__
+        __rxor__ = __xor__
diff --git a/typeshed/stdlib/3.4/pathlib.pyi b/typeshed/stdlib/3.4/pathlib.pyi
new file mode 100644
index 0000000..67ad853
--- /dev/null
+++ b/typeshed/stdlib/3.4/pathlib.pyi
@@ -0,0 +1,111 @@
+# Stubs for pathlib (Python 3.4)
+
+from typing import Any, Generator, IO, Optional, Sequence, Tuple, Type, TypeVar, Union
+import os
+import sys
+
+_P = TypeVar('_P', bound='PurePath')
+
+if sys.version_info >= (3, 6):
+    _PurePathBase = os.PathLike
+else:
+    _PurePathBase = object
+
+class PurePath(_PurePathBase):
+    parts = ...  # type: Tuple[str, ...]
+    drive = ...  # type: str
+    root = ...  # type: str
+    anchor = ...  # type: str
+    name = ...  # type: str
+    suffix = ...  # type: str
+    suffixes = ...  # type: List[str]
+    stem = ...  # type: str
+    if sys.version_info < (3, 5):
+        def __init__(self, *pathsegments: str) -> None: ...
+    else:
+        def __new__(cls: Type[_P], *args: Union[str, PurePath]) -> _P: ...
+    def __hash__(self) -> int: ...
+    def __lt__(self, other: PurePath) -> bool: ...
+    def __le__(self, other: PurePath) -> bool: ...
+    def __gt__(self, other: PurePath) -> bool: ...
+    def __ge__(self, other: PurePath) -> bool: ...
+    def __truediv__(self: _P, key: Union[str, PurePath]) -> _P: ...
+    def __bytes__(self) -> bytes: ...
+    def as_posix(self) -> str: ...
+    def as_uri(self) -> str: ...
+    def is_absolute(self) -> bool: ...
+    def is_reserved(self) -> bool: ...
+    def match(self, path_pattern: str) -> bool: ...
+    def relative_to(self: _P, *other: Union[str, PurePath]) -> _P: ...
+    def with_name(self: _P, name: str) -> _P: ...
+    def with_suffix(self: _P, suffix: str) -> _P: ...
+    def joinpath(self: _P, *other: Union[str, PurePath]) -> _P: ...
+
+    @property
+    def parents(self: _P) -> Sequence[_P]: ...
+    @property
+    def parent(self: _P) -> _P: ...
+
+class PurePosixPath(PurePath): ...
+class PureWindowsPath(PurePath): ...
+
+class Path(PurePath):
+    @classmethod
+    def cwd(cls: Type[_P]) -> _P: ...
+    def stat(self) -> os.stat_result: ...
+    def chmod(self, mode: int) -> None: ...
+    def exists(self) -> bool: ...
+    def glob(self, pattern: str) -> Generator[Path, None, None]: ...
+    def group(self) -> str: ...
+    def is_dir(self) -> bool: ...
+    def is_file(self) -> bool: ...
+    def is_symlink(self) -> bool: ...
+    def is_socket(self) -> bool: ...
+    def is_fifo(self) -> bool: ...
+    def is_block_device(self) -> bool: ...
+    def is_char_device(self) -> bool: ...
+    def iterdir(self) -> Generator[Path, None, None]: ...
+    def lchmod(self, mode: int) -> None: ...
+    def lstat(self) -> os.stat_result: ...
+    if sys.version_info <= (3, 4):
+        def mkdir(self, mode: int = ...,
+                  parents: bool = ...) -> None: ...
+    else:
+        def mkdir(self, mode: int = ..., parents: bool = ...,
+                  exist_ok: bool = ...) -> None: ...
+    def open(self, mode: str = ..., buffering: int = ...,
+             encoding: Optional[str] = ..., errors: Optional[str] = ...,
+             newline: Optional[str] = ...) -> IO[Any]: ...
+    def owner(self) -> str: ...
+    def rename(self, target: Union[str, PurePath]) -> None: ...
+    def replace(self, target: Union[str, PurePath]) -> None: ...
+    if sys.version_info <= (3, 5):
+        def resolve(self: _P) -> _P: ...
+    else:
+        def resolve(self: _P, strict: bool = ...) -> _P: ...
+    def rglob(self, pattern: str) -> Generator[Path, None, None]: ...
+    def rmdir(self) -> None: ...
+    def symlink_to(self, target: Union[str, Path],
+                   target_is_directory: bool = ...) -> None: ...
+    def touch(self, mode: int = ..., exist_ok: bool = ...) -> None: ...
+    def unlink(self) -> None: ...
+
+    if sys.version_info >= (3, 5):
+        @classmethod
+        def home(cls: Type[_P]) -> _P: ...
+        def __new__(cls: Type[_P], *args: Union[str, PurePath],
+                    **kwargs: Any) -> _P: ...
+
+        def absolute(self: _P) -> _P: ...
+        def expanduser(self: _P) -> _P: ...
+        def read_bytes(self) -> bytes: ...
+        def read_text(self, encoding: Optional[str] = ...,
+                      errors: Optional[str] = ...) -> str: ...
+        def samefile(self, other_path: Union[str, bytes, int, Path]) -> bool: ...
+        def write_bytes(self, data: bytes) -> int: ...
+        def write_text(self, data: str, encoding: Optional[str] = ...,
+                       errors: Optional[str] = ...) -> int: ...
+
+
+class PosixPath(Path, PurePosixPath): ...
+class WindowsPath(Path, PureWindowsPath): ...
diff --git a/typeshed/stdlib/3.4/selectors.pyi b/typeshed/stdlib/3.4/selectors.pyi
new file mode 100644
index 0000000..832212b
--- /dev/null
+++ b/typeshed/stdlib/3.4/selectors.pyi
@@ -0,0 +1,90 @@
+# Stubs for selector
+# See https://docs.python.org/3/library/selectors.html
+
+from typing import Any, List, NamedTuple, Mapping, Tuple, Optional, Union
+from abc import ABCMeta, abstractmethod
+import socket
+
+
+# Type aliases added mainly to preserve some context
+#
+# See https://github.com/python/typeshed/issues/482
+# for details regarding how FileObject is typed.
+FileObject = Union[int, socket.socket]
+FileDescriptor = int
+EventMask = int
+
+
+EVENT_READ = ...  # type: EventMask
+EVENT_WRITE = ...  # type: EventMask
+
+
+SelectorKey = NamedTuple('SelectorKey', [
+    ('fileobj', FileObject),
+    ('fd', FileDescriptor),
+    ('events', EventMask),
+    ('data', Any)
+])
+
+
+class BaseSelector(metaclass=ABCMeta):
+    @abstractmethod
+    def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+
+    @abstractmethod
+    def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+
+    def modify(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+
+    @abstractmethod
+    def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+
+    def close(self) -> None: ...
+
+    def get_key(self, fileobj: FileObject) -> SelectorKey: ...
+
+    @abstractmethod
+    def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+    def __enter__(self) -> BaseSelector: ...
+
+    def __exit__(self, *args: Any) -> None: ...
+
+class SelectSelector(BaseSelector):
+    def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+    def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+    def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+    def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+class PollSelector(BaseSelector):
+    def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+    def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+    def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+    def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+class EpollSelector(BaseSelector):
+    def fileno(self) -> int: ...
+    def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+    def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+    def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+    def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+class DevpollSelector(BaseSelector):
+    def fileno(self) -> int: ...
+    def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+    def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+    def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+    def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+class KqueueSelector(BaseSelector):
+    def fileno(self) -> int: ...
+    def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+    def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+    def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+    def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+class DefaultSelector(BaseSelector):
+    def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+    def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+    def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+    def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.4/xml/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.4/xml/__init__.pyi
diff --git a/typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..bbe3fb3
--- /dev/null
+++ b/typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from .ElementTree import Element
+
+XINCLUDE = ...  # type: str
+XINCLUDE_INCLUDE = ...  # type: str
+XINCLUDE_FALLBACK = ...  # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, Element]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: Element, loader: Callable[..., Union[str, Element]]=...) -> None: ...
diff --git a/typeshed/stdlib/3.4/xml/etree/ElementPath.pyi b/typeshed/stdlib/3.4/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..b1ea50e
--- /dev/null
+++ b/typeshed/stdlib/3.4/xml/etree/ElementPath.pyi
@@ -0,0 +1,35 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Pattern, Dict, Generator, Tuple, List, Union, TypeVar, Callable, Optional
+from .ElementTree import Element
+
+xpath_tokenizer_re = ...  # type: Pattern
+
+_token = Tuple[str, str]
+_next = Callable[[], _token]
+_callback = Callable[['_SelectorContext', List[Element]], Generator[Element, None, None]]
+
+def xpath_tokenizer(pattern: str, namespaces: Dict[str, str]=...) -> Generator[_token, None, None]: ...
+def get_parent_map(context: '_SelectorContext') -> Dict[Element, Element]: ...
+def prepare_child(next: _next, token: _token) -> _callback: ...
+def prepare_star(next: _next, token: _token) -> _callback: ...
+def prepare_self(next: _next, token: _token) -> _callback: ...
+def prepare_descendant(next: _next, token: _token) -> _callback: ...
+def prepare_parent(next: _next, token: _token) -> _callback: ...
+def prepare_predicate(next: _next, token: _token) -> _callback: ...
+
+ops = ...  # type: Dict[str, Callable[[_next, _token], _callback]]
+
+class _SelectorContext:
+    parent_map = ...  # type: Dict[Element, Element]
+    root = ...  # type: Element
+    def __init__(self, root: Element) -> None: ...
+
+_T = TypeVar('_T')
+
+def iterfind(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def find(elem: Element, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+def findall(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def findtext(elem: Element, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
diff --git a/typeshed/stdlib/3.4/xml/etree/ElementTree.pyi b/typeshed/stdlib/3.4/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..0592be7
--- /dev/null
+++ b/typeshed/stdlib/3.4/xml/etree/ElementTree.pyi
@@ -0,0 +1,118 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, KeysView, ItemsView, Generator
+import io
+
+VERSION = ...  # type: str
+
+class ParseError(SyntaxError): ...
+
+def iselement(element: 'Element') -> bool: ...
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class Element(Sequence['Element']):
+    tag = ...  # type: _str_or_bytes
+    attrib = ...  # type: Dict[_str_or_bytes, _str_or_bytes]
+    text = ...  # type: Optional[_str_or_bytes]
+    tail = ...  # type: Optional[_str_or_bytes]
+    def __init__(self, tag: Union[AnyStr, Callable[..., 'Element']], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> None: ...
+    def append(self, subelement: 'Element') -> None: ...
+    def clear(self) -> None: ...
+    def copy(self) -> 'Element': ...
+    def extend(self, elements: Sequence['Element']) -> None: ...
+    def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional['Element']: ...
+    def findall(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+    def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+    def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+    def getchildren(self) -> List['Element']: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List['Element']: ...
+    def insert(self, index: int, subelement: 'Element') -> None: ...
+    def items(self) -> ItemsView[AnyStr, AnyStr]: ...
+    def iter(self, tag: Union[str, AnyStr]=...) -> Generator['Element', None, None]: ...
+    def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+    def itertext(self) -> Generator[str, None, None]: ...
+    def keys(self) -> KeysView[AnyStr]: ...
+    def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> 'Element': ...
+    def remove(self, subelement: 'Element') -> None: ...
+    def set(self, key: AnyStr, value: AnyStr) -> None: ...
+    def __bool__(self) -> bool: ...
+    def __delitem__(self, index: int) -> None: ...
+    def __getitem__(self, index) -> 'Element': ...
+    def __len__(self) -> int: ...
+    def __setitem__(self, index: int, element: 'Element') -> None: ...
+
+def SubElement(parent: Element, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> Element: ...
+def Comment(text: _str_or_bytes=...) -> Element: ...
+def ProcessingInstruction(target: str, text: str=...) -> Element: ...
+
+PI = ...  # type: Callable[..., Element]
+
+class QName:
+    text = ...  # type: str
+    def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+    def __init__(self, element: Element=..., file: _file_or_filename=...) -> None: ...
+    def getroot(self) -> Element: ...
+    def parse(self, source: _file_or_filename, parser: 'XMLParser'=...) -> Element: ...
+    def iter(self, tag: Union[str, AnyStr]=...) -> Generator[Element, None, None]: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List[Element]: ...
+    def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+    def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+    def findall(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+    def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+    def write(self, file_or_filename: _file_or_filename, encoding: str=..., xml_declaration: Optional[bool]=..., default_namespace: str=..., method: str=..., *, short_empty_elements: bool=...) -> None: ...
+    def write_c14n(self, file: _file_or_filename) -> None: ...
+
+def register_namespace(prefix: str, uri: str) -> None: ...
+def tostring(element: Element, encoding: str=..., method: str=..., *, short_empty_elements: bool=...) -> str: ...
+def tostringlist(element: Element, encoding: str=..., method: str=..., *, short_empty_elements: bool=...) -> List[str]: ...
+def dump(elem: Element) -> None: ...
+def parse(source: _file_or_filename, parser: 'XMLParser'=...) -> ElementTree: ...
+def iterparse(source: _file_or_filename, events: Sequence[str]=..., parser: 'XMLParser'=...) -> Iterator[Tuple[str, Element]]: ...
+
+class XMLPullParser:
+    def __init__(self, events: Sequence[str]=..., *, _parser: 'XMLParser'=...) -> None: ...
+    def feed(self, data: bytes) -> None: ...
+    def close(self) -> None: ...
+    def read_events(self) -> Iterator[Tuple[str, Element]]: ...
+
+class _IterParseIterator:
+    root = ...  # type: Any
+    def __init__(self, source: _file_or_filename, events: Sequence[str], parser: 'XMLParser', close_source: bool=...) -> None: ...
+    def __next__(self) -> Tuple[str, Element]: ...
+    def __iter__(self) -> _IterParseIterator: ...
+
+def XML(text: AnyStr, parser: 'XMLParser'=...) -> Element: ...
+def XMLID(text: AnyStr, parser: 'XMLParser'=...) -> Tuple[Element, Dict[str, Element]]: ...
+
+# TODO-improve this type
+fromstring = ...  # type: Callable[..., Element]
+
+def fromstringlist(sequence: Sequence[AnyStr], parser: 'XMLParser'=...) -> Element: ...
+
+class TreeBuilder:
+    def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], Element]=...) -> None: ...
+    def close(self) -> Element: ...
+    def data(self, data: AnyStr) -> None: ...
+    def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> Element: ...
+    def end(self, tag: AnyStr) -> Element: ...
+
+class XMLParser:
+    parser = ...  # type: Any
+    target = ...  # type: TreeBuilder
+    # TODO-what is entity used for???
+    entity = ...  # type: Any
+    version = ...  # type: str
+    def __init__(self, html: int=..., target: TreeBuilder=..., encoding: str=...) -> None: ...
+    def doctype(self, name: str, pubid: str, system: str) -> None: ...
+    def close(self) -> Any: ...  # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+    def feed(self, data: AnyStr)-> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.4/xml/etree/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.4/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/3.4/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.4/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/3.4/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import *  # noqa: F403
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.5/xml/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.5/xml/__init__.pyi
diff --git a/typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..bbe3fb3
--- /dev/null
+++ b/typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from .ElementTree import Element
+
+XINCLUDE = ...  # type: str
+XINCLUDE_INCLUDE = ...  # type: str
+XINCLUDE_FALLBACK = ...  # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, Element]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: Element, loader: Callable[..., Union[str, Element]]=...) -> None: ...
diff --git a/typeshed/stdlib/3.5/xml/etree/ElementPath.pyi b/typeshed/stdlib/3.5/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..b1ea50e
--- /dev/null
+++ b/typeshed/stdlib/3.5/xml/etree/ElementPath.pyi
@@ -0,0 +1,35 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Pattern, Dict, Generator, Tuple, List, Union, TypeVar, Callable, Optional
+from .ElementTree import Element
+
+xpath_tokenizer_re = ...  # type: Pattern
+
+_token = Tuple[str, str]
+_next = Callable[[], _token]
+_callback = Callable[['_SelectorContext', List[Element]], Generator[Element, None, None]]
+
+def xpath_tokenizer(pattern: str, namespaces: Dict[str, str]=...) -> Generator[_token, None, None]: ...
+def get_parent_map(context: '_SelectorContext') -> Dict[Element, Element]: ...
+def prepare_child(next: _next, token: _token) -> _callback: ...
+def prepare_star(next: _next, token: _token) -> _callback: ...
+def prepare_self(next: _next, token: _token) -> _callback: ...
+def prepare_descendant(next: _next, token: _token) -> _callback: ...
+def prepare_parent(next: _next, token: _token) -> _callback: ...
+def prepare_predicate(next: _next, token: _token) -> _callback: ...
+
+ops = ...  # type: Dict[str, Callable[[_next, _token], _callback]]
+
+class _SelectorContext:
+    parent_map = ...  # type: Dict[Element, Element]
+    root = ...  # type: Element
+    def __init__(self, root: Element) -> None: ...
+
+_T = TypeVar('_T')
+
+def iterfind(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def find(elem: Element, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+def findall(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def findtext(elem: Element, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
diff --git a/typeshed/stdlib/3.5/xml/etree/ElementTree.pyi b/typeshed/stdlib/3.5/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..0592be7
--- /dev/null
+++ b/typeshed/stdlib/3.5/xml/etree/ElementTree.pyi
@@ -0,0 +1,118 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, KeysView, ItemsView, Generator
+import io
+
+VERSION = ...  # type: str
+
+class ParseError(SyntaxError): ...
+
+def iselement(element: 'Element') -> bool: ...
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class Element(Sequence['Element']):
+    tag = ...  # type: _str_or_bytes
+    attrib = ...  # type: Dict[_str_or_bytes, _str_or_bytes]
+    text = ...  # type: Optional[_str_or_bytes]
+    tail = ...  # type: Optional[_str_or_bytes]
+    def __init__(self, tag: Union[AnyStr, Callable[..., 'Element']], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> None: ...
+    def append(self, subelement: 'Element') -> None: ...
+    def clear(self) -> None: ...
+    def copy(self) -> 'Element': ...
+    def extend(self, elements: Sequence['Element']) -> None: ...
+    def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional['Element']: ...
+    def findall(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+    def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+    def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+    def getchildren(self) -> List['Element']: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List['Element']: ...
+    def insert(self, index: int, subelement: 'Element') -> None: ...
+    def items(self) -> ItemsView[AnyStr, AnyStr]: ...
+    def iter(self, tag: Union[str, AnyStr]=...) -> Generator['Element', None, None]: ...
+    def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+    def itertext(self) -> Generator[str, None, None]: ...
+    def keys(self) -> KeysView[AnyStr]: ...
+    def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> 'Element': ...
+    def remove(self, subelement: 'Element') -> None: ...
+    def set(self, key: AnyStr, value: AnyStr) -> None: ...
+    def __bool__(self) -> bool: ...
+    def __delitem__(self, index: int) -> None: ...
+    def __getitem__(self, index) -> 'Element': ...
+    def __len__(self) -> int: ...
+    def __setitem__(self, index: int, element: 'Element') -> None: ...
+
+def SubElement(parent: Element, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> Element: ...
+def Comment(text: _str_or_bytes=...) -> Element: ...
+def ProcessingInstruction(target: str, text: str=...) -> Element: ...
+
+PI = ...  # type: Callable[..., Element]
+
+class QName:
+    text = ...  # type: str
+    def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+    def __init__(self, element: Element=..., file: _file_or_filename=...) -> None: ...
+    def getroot(self) -> Element: ...
+    def parse(self, source: _file_or_filename, parser: 'XMLParser'=...) -> Element: ...
+    def iter(self, tag: Union[str, AnyStr]=...) -> Generator[Element, None, None]: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List[Element]: ...
+    def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+    def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+    def findall(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+    def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+    def write(self, file_or_filename: _file_or_filename, encoding: str=..., xml_declaration: Optional[bool]=..., default_namespace: str=..., method: str=..., *, short_empty_elements: bool=...) -> None: ...
+    def write_c14n(self, file: _file_or_filename) -> None: ...
+
+def register_namespace(prefix: str, uri: str) -> None: ...
+def tostring(element: Element, encoding: str=..., method: str=..., *, short_empty_elements: bool=...) -> str: ...
+def tostringlist(element: Element, encoding: str=..., method: str=..., *, short_empty_elements: bool=...) -> List[str]: ...
+def dump(elem: Element) -> None: ...
+def parse(source: _file_or_filename, parser: 'XMLParser'=...) -> ElementTree: ...
+def iterparse(source: _file_or_filename, events: Sequence[str]=..., parser: 'XMLParser'=...) -> Iterator[Tuple[str, Element]]: ...
+
+class XMLPullParser:
+    def __init__(self, events: Sequence[str]=..., *, _parser: 'XMLParser'=...) -> None: ...
+    def feed(self, data: bytes) -> None: ...
+    def close(self) -> None: ...
+    def read_events(self) -> Iterator[Tuple[str, Element]]: ...
+
+class _IterParseIterator:
+    root = ...  # type: Any
+    def __init__(self, source: _file_or_filename, events: Sequence[str], parser: 'XMLParser', close_source: bool=...) -> None: ...
+    def __next__(self) -> Tuple[str, Element]: ...
+    def __iter__(self) -> _IterParseIterator: ...
+
+def XML(text: AnyStr, parser: 'XMLParser'=...) -> Element: ...
+def XMLID(text: AnyStr, parser: 'XMLParser'=...) -> Tuple[Element, Dict[str, Element]]: ...
+
+# TODO-improve this type
+fromstring = ...  # type: Callable[..., Element]
+
+def fromstringlist(sequence: Sequence[AnyStr], parser: 'XMLParser'=...) -> Element: ...
+
+class TreeBuilder:
+    def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], Element]=...) -> None: ...
+    def close(self) -> Element: ...
+    def data(self, data: AnyStr) -> None: ...
+    def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> Element: ...
+    def end(self, tag: AnyStr) -> Element: ...
+
+class XMLParser:
+    parser = ...  # type: Any
+    target = ...  # type: TreeBuilder
+    # TODO-what is entity used for???
+    entity = ...  # type: Any
+    version = ...  # type: str
+    def __init__(self, html: int=..., target: TreeBuilder=..., encoding: str=...) -> None: ...
+    def doctype(self, name: str, pubid: str, system: str) -> None: ...
+    def close(self) -> Any: ...  # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+    def feed(self, data: AnyStr)-> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.5/xml/etree/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.5/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/3.5/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.5/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/3.5/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import *  # noqa: F403
diff --git a/typeshed/stdlib/3.6/secrets.pyi b/typeshed/stdlib/3.6/secrets.pyi
new file mode 100644
index 0000000..bff4716
--- /dev/null
+++ b/typeshed/stdlib/3.6/secrets.pyi
@@ -0,0 +1,14 @@
+# Stubs for secrets (Python 3.6)
+
+from typing import Optional, Sequence, TypeVar
+from hmac import compare_digest as compare_digest
+from random import SystemRandom as SystemRandom
+
+_T = TypeVar('_T')
+
+def randbelow(exclusive_upper_bound: int) -> int: ...
+def randbits(k: int) -> int: ...
+def choice(seq: Sequence[_T]) -> _T: ...
+def token_bytes(nbytes: Optional[int]) -> bytes: ...
+def token_hex(nbytes: Optional[int]) -> str: ...
+def token_urlsafe(nbytes: Optional[int]) -> str: ...
diff --git a/typeshed/stdlib/3/__future__.pyi b/typeshed/stdlib/3/__future__.pyi
new file mode 100644
index 0000000..f59753c
--- /dev/null
+++ b/typeshed/stdlib/3/__future__.pyi
@@ -0,0 +1,16 @@
+import sys
+
+class _Feature:
+    def getOptionalRelease(self) -> sys._version_info: ...
+    def getMandatoryRelease(self) -> sys._version_info: ...
+
+absolute_import = ...  # type: _Feature
+division = ...  # type: _Feature
+generators = ...  # type: _Feature
+nested_scopes = ...  # type: _Feature
+print_function = ...  # type: _Feature
+unicode_literals = ...  # type: _Feature
+with_statement = ...  # type: _Feature
+
+if sys.version_info[:2] >= (3, 5):
+    generator_stop = ...  # type: _Feature
diff --git a/typeshed/stdlib/3/_ast.pyi b/typeshed/stdlib/3/_ast.pyi
new file mode 100644
index 0000000..6736181
--- /dev/null
+++ b/typeshed/stdlib/3/_ast.pyi
@@ -0,0 +1,358 @@
+# Python 3.5 _ast
+import typing
+from typing import Any, Optional, Union
+
+PyCF_ONLY_AST = ...  # type: int
+
+identifier = str
+
+class AST:
+    _attributes = ...  # type: typing.Tuple[str, ...]
+    _fields = ...  # type: typing.Tuple[str, ...]
+    def __init__(self, *args: Any, **kwargs: Any) -> None: ...
+
+class mod(AST):
+    ...
+
+class Module(mod):
+    body = ...  # type: typing.List[stmt]
+
+class Interactive(mod):
+    body = ...  # type: typing.List[stmt]
+
+class Expression(mod):
+    body = ...  # type: expr
+
+class Suite(mod):
+    body = ...  # type: typing.List[stmt]
+
+
+class stmt(AST):
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+class FunctionDef(stmt):
+    name = ...  # type: identifier
+    args = ...  # type: arguments
+    body = ...  # type: typing.List[stmt]
+    decorator_list = ...  # type: typing.List[expr]
+    returns = ...  # type: Optional[expr]
+
+class AsyncFunctionDef(stmt):
+    name = ...  # type: identifier
+    args = ...  # type: arguments
+    body = ...  # type: typing.List[stmt]
+    decorator_list = ...  # type: typing.List[expr]
+    returns = ...  # type: Optional[expr]
+
+class ClassDef(stmt):
+    name = ...  # type: identifier
+    bases = ...  # type: typing.List[expr]
+    keywords = ...  # type: typing.List[keyword]
+    body = ...  # type: typing.List[stmt]
+    decorator_list = ...  # type: typing.List[expr]
+
+class Return(stmt):
+    value = ...  # type: Optional[expr]
+
+class Delete(stmt):
+    targets = ...  # type: typing.List[expr]
+
+class Assign(stmt):
+    targets = ...  # type: typing.List[expr]
+    value = ...  # type: expr
+
+class AugAssign(stmt):
+    target = ...  # type: expr
+    op = ...  # type: operator
+    value = ...  # type: expr
+
+class For(stmt):
+    target = ...  # type: expr
+    iter = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class AsyncFor(stmt):
+    target = ...  # type: expr
+    iter = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class While(stmt):
+    test = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class If(stmt):
+    test = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class With(stmt):
+    items = ...  # type: typing.List[withitem]
+    body = ...  # type: typing.List[stmt]
+
+class AsyncWith(stmt):
+    items = ...  # type: typing.List[withitem]
+    body = ...  # type: typing.List[stmt]
+
+class Raise(stmt):
+    exc = ...  # type: Optional[expr]
+    cause = ...  # type: Optional[expr]
+
+class Try(stmt):
+    body = ...  # type: typing.List[stmt]
+    handlers = ...  # type: typing.List[ExceptHandler]
+    orelse = ...  # type: typing.List[stmt]
+    finalbody = ...  # type: typing.List[stmt]
+
+class Assert(stmt):
+    test = ...  # type: expr
+    msg = ...  # type: Optional[expr]
+
+class Import(stmt):
+    names = ...  # type: typing.List[alias]
+
+class ImportFrom(stmt):
+    module = ...  # type: Optional[identifier]
+    names = ...  # type: typing.List[alias]
+    level = ...  # type: Optional[int]
+
+class Global(stmt):
+    names = ...  # type: typing.List[identifier]
+
+class Nonlocal(stmt):
+    names = ...  # type: typing.List[identifier]
+
+class Expr(stmt):
+    value = ...  # type: expr
+
+class Pass(stmt): ...
+class Break(stmt): ...
+class Continue(stmt): ...
+
+
+class slice(AST):
+    ...
+
+_slice = slice  # this lets us type the variable named 'slice' below
+
+class Slice(slice):
+    lower = ...  # type: Optional[expr]
+    upper = ...  # type: Optional[expr]
+    step = ...  # type: Optional[expr]
+
+class ExtSlice(slice):
+    dims = ...  # type: typing.List[slice]
+
+class Index(slice):
+    value = ...  # type: expr
+
+
+class expr(AST):
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+class BoolOp(expr):
+    op = ...  # type: boolop
+    values = ...  # type: typing.List[expr]
+
+class BinOp(expr):
+    left = ...  # type: expr
+    op = ...  # type: operator
+    right = ...  # type: expr
+
+class UnaryOp(expr):
+    op = ...  # type: unaryop
+    operand = ...  # type: expr
+
+class Lambda(expr):
+    args = ...  # type: arguments
+    body = ...  # type: expr
+
+class IfExp(expr):
+    test = ...  # type: expr
+    body = ...  # type: expr
+    orelse = ...  # type: expr
+
+class Dict(expr):
+    keys = ...  # type: typing.List[expr]
+    values = ...  # type: typing.List[expr]
+
+class Set(expr):
+    elts = ...  # type: typing.List[expr]
+
+class ListComp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class SetComp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class DictComp(expr):
+    key = ...  # type: expr
+    value = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class GeneratorExp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class Await(expr):
+    value = ...  # type: expr
+
+class Yield(expr):
+    value = ...  # type: Optional[expr]
+
+class YieldFrom(expr):
+    value = ...  # type: expr
+
+class Compare(expr):
+    left = ...  # type: expr
+    ops = ...  # type: typing.List[cmpop]
+    comparators = ...  # type: typing.List[expr]
+
+class Call(expr):
+    func = ...  # type: expr
+    args = ...  # type: typing.List[expr]
+    keywords = ...  # type: typing.List[keyword]
+
+class Num(expr):
+    n = ...  # type: Union[int, float]
+
+class Str(expr):
+    s = ...  # type: str
+
+class Bytes(expr):
+    s = ...  # type: bytes
+
+class NameConstant(expr):
+    value = ...  # type: Any
+
+class Ellipsis(expr): ...
+
+class Attribute(expr):
+    value = ...  # type: expr
+    attr = ...  # type: identifier
+    ctx = ...  # type: expr_context
+
+class Subscript(expr):
+    value = ...  # type: expr
+    slice = ...  # type: _slice
+    ctx = ...  # type: expr_context
+
+class Starred(expr):
+    value = ...  # type: expr
+    ctx = ...  # type: expr_context
+
+class Name(expr):
+    id = ...  # type: identifier
+    ctx = ...  # type: expr_context
+
+class List(expr):
+    elts = ...  # type: typing.List[expr]
+    ctx = ...  # type: expr_context
+
+class Tuple(expr):
+    elts = ...  # type: typing.List[expr]
+    ctx = ...  # type: expr_context
+
+
+class expr_context(AST):
+    ...
+
+class AugLoad(expr_context): ...
+class AugStore(expr_context): ...
+class Del(expr_context): ...
+class Load(expr_context): ...
+class Param(expr_context): ...
+class Store(expr_context): ...
+
+
+class boolop(AST):
+    ...
+
+class And(boolop): ...
+class Or(boolop): ...
+
+class operator(AST):
+    ...
+
+class Add(operator): ...
+class BitAnd(operator): ...
+class BitOr(operator): ...
+class BitXor(operator): ...
+class Div(operator): ...
+class FloorDiv(operator): ...
+class LShift(operator): ...
+class Mod(operator): ...
+class Mult(operator): ...
+class MatMult(operator): ...
+class Pow(operator): ...
+class RShift(operator): ...
+class Sub(operator): ...
+
+class unaryop(AST):
+    ...
+
+class Invert(unaryop): ...
+class Not(unaryop): ...
+class UAdd(unaryop): ...
+class USub(unaryop): ...
+
+class cmpop(AST):
+    ...
+
+class Eq(cmpop): ...
+class Gt(cmpop): ...
+class GtE(cmpop): ...
+class In(cmpop): ...
+class Is(cmpop): ...
+class IsNot(cmpop): ...
+class Lt(cmpop): ...
+class LtE(cmpop): ...
+class NotEq(cmpop): ...
+class NotIn(cmpop): ...
+
+
+class comprehension(AST):
+    target = ...  # type: expr
+    iter = ...  # type: expr
+    ifs = ...  # type: typing.List[expr]
+
+
+class ExceptHandler(AST):
+    type = ...  # type: Optional[expr]
+    name = ...  # type: Optional[identifier]
+    body = ...  # type: typing.List[stmt]
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+
+class arguments(AST):
+    args = ...  # type: typing.List[arg]
+    vararg = ...  # type: Optional[arg]
+    kwonlyargs = ...  # type: typing.List[arg]
+    kw_defaults = ...  # type: typing.List[expr]
+    kwarg = ...  # type: Optional[arg]
+    defaults = ...  # type: typing.List[expr]
+
+class arg(AST):
+    arg = ...  # type: identifier
+    annotation = ...  # type: Optional[expr]
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+class keyword(AST):
+    arg = ...  # type: Optional[identifier]
+    value = ...  # type: expr
+
+class alias(AST):
+    name = ...  # type: identifier
+    asname = ...  # type: Optional[identifier]
+
+class withitem(AST):
+    context_expr = ...  # type: expr
+    optional_vars = ...  # type: Optional[expr]
diff --git a/typeshed/stdlib/3/_codecs.pyi b/typeshed/stdlib/3/_codecs.pyi
new file mode 100644
index 0000000..8d4fb3c
--- /dev/null
+++ b/typeshed/stdlib/3/_codecs.pyi
@@ -0,0 +1,51 @@
+"""Stub file for the '_codecs' module."""
+
+from typing import Any, AnyStr, Callable, Tuple, Optional, Dict
+
+import codecs
+
+# For convenience:
+_Handler = Callable[[Exception], Tuple[str, int]]
+
+def register(search_function: Callable[[str], Any]) -> None: ...
+def register_error(errors: str, handler: _Handler) -> None: ...
+def lookup(a: str) -> codecs.CodecInfo: ...
+def lookup_error(a: str) -> _Handler: ...
+def decode(obj: Any, encoding: str = ..., errors: str = ...) -> Any: ...
+def encode(obj: Any, encoding: str = ..., errors: str = ...) -> Any: ...
+def charmap_build(a: str) -> Dict[int, int]: ...
+
+def ascii_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def ascii_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def charbuffer_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def charmap_decode(data: AnyStr, errors: str = ..., mapping: Optional[Dict[int, int]] = ...) -> Tuple[str, int]: ...
+def charmap_encode(data: AnyStr, errors: str, mapping: Optional[Dict[int, int]] = ...) -> Tuple[bytes, int]: ...
+def escape_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def escape_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def latin_1_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def latin_1_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def raw_unicode_escape_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def raw_unicode_escape_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def readbuffer_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def unicode_escape_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def unicode_escape_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def unicode_internal_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def unicode_internal_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def utf_16_be_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_be_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_16_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_16_ex_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_le_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_le_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_32_be_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_be_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_32_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_32_ex_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_le_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_le_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_7_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_7_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_8_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_8_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
diff --git a/typeshed/stdlib/3/_compression.pyi b/typeshed/stdlib/3/_compression.pyi
new file mode 100644
index 0000000..527d795
--- /dev/null
+++ b/typeshed/stdlib/3/_compression.pyi
@@ -0,0 +1,20 @@
+# Stubs for _compression (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import io
+
+BUFFER_SIZE = ...  # type: Any
+
+class BaseStream(io.BufferedIOBase): ...
+
+class DecompressReader(io.RawIOBase):
+    def readable(self): ...
+    def __init__(self, fp, decomp_factory, trailing_error=..., **decomp_args): ...
+    def close(self): ...
+    def seekable(self): ...
+    def readinto(self, b): ...
+    def read(self, size=-1): ...
+    def seek(self, offset, whence=...): ...
+    def tell(self): ...
diff --git a/typeshed/stdlib/3/_curses.pyi b/typeshed/stdlib/3/_curses.pyi
new file mode 100644
index 0000000..368dda2
--- /dev/null
+++ b/typeshed/stdlib/3/_curses.pyi
@@ -0,0 +1,297 @@
+# Stubs for _curses (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, BinaryIO, Tuple, Union
+
+chtype = Union[str, bytes, int]
+
+ALL_MOUSE_EVENTS = ...  # type: int
+A_ALTCHARSET = ...  # type: int
+A_ATTRIBUTES = ...  # type: int
+A_BLINK = ...  # type: int
+A_BOLD = ...  # type: int
+A_CHARTEXT = ...  # type: int
+A_COLOR = ...  # type: int
+A_DIM = ...  # type: int
+A_HORIZONTAL = ...  # type: int
+A_INVIS = ...  # type: int
+A_LEFT = ...  # type: int
+A_LOW = ...  # type: int
+A_NORMAL = ...  # type: int
+A_PROTECT = ...  # type: int
+A_REVERSE = ...  # type: int
+A_RIGHT = ...  # type: int
+A_STANDOUT = ...  # type: int
+A_TOP = ...  # type: int
+A_UNDERLINE = ...  # type: int
+A_VERTICAL = ...  # type: int
+BUTTON1_CLICKED = ...  # type: int
+BUTTON1_DOUBLE_CLICKED = ...  # type: int
+BUTTON1_PRESSED = ...  # type: int
+BUTTON1_RELEASED = ...  # type: int
+BUTTON1_TRIPLE_CLICKED = ...  # type: int
+BUTTON2_CLICKED = ...  # type: int
+BUTTON2_DOUBLE_CLICKED = ...  # type: int
+BUTTON2_PRESSED = ...  # type: int
+BUTTON2_RELEASED = ...  # type: int
+BUTTON2_TRIPLE_CLICKED = ...  # type: int
+BUTTON3_CLICKED = ...  # type: int
+BUTTON3_DOUBLE_CLICKED = ...  # type: int
+BUTTON3_PRESSED = ...  # type: int
+BUTTON3_RELEASED = ...  # type: int
+BUTTON3_TRIPLE_CLICKED = ...  # type: int
+BUTTON4_CLICKED = ...  # type: int
+BUTTON4_DOUBLE_CLICKED = ...  # type: int
+BUTTON4_PRESSED = ...  # type: int
+BUTTON4_RELEASED = ...  # type: int
+BUTTON4_TRIPLE_CLICKED = ...  # type: int
+BUTTON_ALT = ...  # type: int
+BUTTON_CTRL = ...  # type: int
+BUTTON_SHIFT = ...  # type: int
+COLOR_BLACK = ...  # type: int
+COLOR_BLUE = ...  # type: int
+COLOR_CYAN = ...  # type: int
+COLOR_GREEN = ...  # type: int
+COLOR_MAGENTA = ...  # type: int
+COLOR_RED = ...  # type: int
+COLOR_WHITE = ...  # type: int
+COLOR_YELLOW = ...  # type: int
+ERR = ...  # type: int
+KEY_A1 = ...  # type: int
+KEY_A3 = ...  # type: int
+KEY_B2 = ...  # type: int
+KEY_BACKSPACE = ...  # type: int
+KEY_BEG = ...  # type: int
+KEY_BREAK = ...  # type: int
+KEY_BTAB = ...  # type: int
+KEY_C1 = ...  # type: int
+KEY_C3 = ...  # type: int
+KEY_CANCEL = ...  # type: int
+KEY_CATAB = ...  # type: int
+KEY_CLEAR = ...  # type: int
+KEY_CLOSE = ...  # type: int
+KEY_COMMAND = ...  # type: int
+KEY_COPY = ...  # type: int
+KEY_CREATE = ...  # type: int
+KEY_CTAB = ...  # type: int
+KEY_DC = ...  # type: int
+KEY_DL = ...  # type: int
+KEY_DOWN = ...  # type: int
+KEY_EIC = ...  # type: int
+KEY_END = ...  # type: int
+KEY_ENTER = ...  # type: int
+KEY_EOL = ...  # type: int
+KEY_EOS = ...  # type: int
+KEY_EXIT = ...  # type: int
+KEY_F0 = ...  # type: int
+KEY_F1 = ...  # type: int
+KEY_F10 = ...  # type: int
+KEY_F11 = ...  # type: int
+KEY_F12 = ...  # type: int
+KEY_F13 = ...  # type: int
+KEY_F14 = ...  # type: int
+KEY_F15 = ...  # type: int
+KEY_F16 = ...  # type: int
+KEY_F17 = ...  # type: int
+KEY_F18 = ...  # type: int
+KEY_F19 = ...  # type: int
+KEY_F2 = ...  # type: int
+KEY_F20 = ...  # type: int
+KEY_F21 = ...  # type: int
+KEY_F22 = ...  # type: int
+KEY_F23 = ...  # type: int
+KEY_F24 = ...  # type: int
+KEY_F25 = ...  # type: int
+KEY_F26 = ...  # type: int
+KEY_F27 = ...  # type: int
+KEY_F28 = ...  # type: int
+KEY_F29 = ...  # type: int
+KEY_F3 = ...  # type: int
+KEY_F30 = ...  # type: int
+KEY_F31 = ...  # type: int
+KEY_F32 = ...  # type: int
+KEY_F33 = ...  # type: int
+KEY_F34 = ...  # type: int
+KEY_F35 = ...  # type: int
+KEY_F36 = ...  # type: int
+KEY_F37 = ...  # type: int
+KEY_F38 = ...  # type: int
+KEY_F39 = ...  # type: int
+KEY_F4 = ...  # type: int
+KEY_F40 = ...  # type: int
+KEY_F41 = ...  # type: int
+KEY_F42 = ...  # type: int
+KEY_F43 = ...  # type: int
+KEY_F44 = ...  # type: int
+KEY_F45 = ...  # type: int
+KEY_F46 = ...  # type: int
+KEY_F47 = ...  # type: int
+KEY_F48 = ...  # type: int
+KEY_F49 = ...  # type: int
+KEY_F5 = ...  # type: int
+KEY_F50 = ...  # type: int
+KEY_F51 = ...  # type: int
+KEY_F52 = ...  # type: int
+KEY_F53 = ...  # type: int
+KEY_F54 = ...  # type: int
+KEY_F55 = ...  # type: int
+KEY_F56 = ...  # type: int
+KEY_F57 = ...  # type: int
+KEY_F58 = ...  # type: int
+KEY_F59 = ...  # type: int
+KEY_F6 = ...  # type: int
+KEY_F60 = ...  # type: int
+KEY_F61 = ...  # type: int
+KEY_F62 = ...  # type: int
+KEY_F63 = ...  # type: int
+KEY_F7 = ...  # type: int
+KEY_F8 = ...  # type: int
+KEY_F9 = ...  # type: int
+KEY_FIND = ...  # type: int
+KEY_HELP = ...  # type: int
+KEY_HOME = ...  # type: int
+KEY_IC = ...  # type: int
+KEY_IL = ...  # type: int
+KEY_LEFT = ...  # type: int
+KEY_LL = ...  # type: int
+KEY_MARK = ...  # type: int
+KEY_MAX = ...  # type: int
+KEY_MESSAGE = ...  # type: int
+KEY_MIN = ...  # type: int
+KEY_MOUSE = ...  # type: int
+KEY_MOVE = ...  # type: int
+KEY_NEXT = ...  # type: int
+KEY_NPAGE = ...  # type: int
+KEY_OPEN = ...  # type: int
+KEY_OPTIONS = ...  # type: int
+KEY_PPAGE = ...  # type: int
+KEY_PREVIOUS = ...  # type: int
+KEY_PRINT = ...  # type: int
+KEY_REDO = ...  # type: int
+KEY_REFERENCE = ...  # type: int
+KEY_REFRESH = ...  # type: int
+KEY_REPLACE = ...  # type: int
+KEY_RESET = ...  # type: int
+KEY_RESIZE = ...  # type: int
+KEY_RESTART = ...  # type: int
+KEY_RESUME = ...  # type: int
+KEY_RIGHT = ...  # type: int
+KEY_SAVE = ...  # type: int
+KEY_SBEG = ...  # type: int
+KEY_SCANCEL = ...  # type: int
+KEY_SCOMMAND = ...  # type: int
+KEY_SCOPY = ...  # type: int
+KEY_SCREATE = ...  # type: int
+KEY_SDC = ...  # type: int
+KEY_SDL = ...  # type: int
+KEY_SELECT = ...  # type: int
+KEY_SEND = ...  # type: int
+KEY_SEOL = ...  # type: int
+KEY_SEXIT = ...  # type: int
+KEY_SF = ...  # type: int
+KEY_SFIND = ...  # type: int
+KEY_SHELP = ...  # type: int
+KEY_SHOME = ...  # type: int
+KEY_SIC = ...  # type: int
+KEY_SLEFT = ...  # type: int
+KEY_SMESSAGE = ...  # type: int
+KEY_SMOVE = ...  # type: int
+KEY_SNEXT = ...  # type: int
+KEY_SOPTIONS = ...  # type: int
+KEY_SPREVIOUS = ...  # type: int
+KEY_SPRINT = ...  # type: int
+KEY_SR = ...  # type: int
+KEY_SREDO = ...  # type: int
+KEY_SREPLACE = ...  # type: int
+KEY_SRESET = ...  # type: int
+KEY_SRIGHT = ...  # type: int
+KEY_SRSUME = ...  # type: int
+KEY_SSAVE = ...  # type: int
+KEY_SSUSPEND = ...  # type: int
+KEY_STAB = ...  # type: int
+KEY_SUNDO = ...  # type: int
+KEY_SUSPEND = ...  # type: int
+KEY_UNDO = ...  # type: int
+KEY_UP = ...  # type: int
+OK = ...  # type: int
+REPORT_MOUSE_POSITION = ...  # type: int
+_C_API = ...  # type: Any
+version = ...  # type: bytes
+
+def baudrate() -> int: ...
+def beep() -> None: ...
+def can_change_color() -> bool: ...
+def cbreak(flag: bool = ...) -> None: ...
+def color_content(color_number: int) -> Tuple[int, int, int]: ...
+def color_pair(color_number: int) -> int: ...
+def curs_set(visibility: int) -> int: ...
+def def_prog_mode() -> None: ...
+def def_shell_mode() -> None: ...
+def delay_output(ms: int) -> None: ...
+def doupdate() -> None: ...
+def echo(flag: bool = ...) -> None: ...
+def endwin() -> None: ...
+def erasechar() -> bytes: ...
+def filter() -> None: ...
+def flash() -> None: ...
+def flushinp() -> None: ...
+def getmouse() -> Tuple[int, int, int, int, int]: ...
+def getsyx() -> Tuple[int, int]: ...
+def getwin(f: BinaryIO): ...
+def halfdelay(tenths: int) -> None: ...
+def has_colors() -> bool: ...
+def has_ic() -> bool: ...
+def has_il() -> bool: ...
+def has_key(ch: int) -> bool: ...
+def init_color(color_number: int, r: int, g: int, b: int) -> None: ...
+def init_pair(pair_number: int, fg: int, bg: int) -> None: ...
+def initscr(): ...
+def intrflush(ch: bool) -> None: ...
+def is_term_resized(nlines: int, ncols: int) -> bool: ...
+def isendwin() -> bool: ...
+def keyname(k: int) -> bytes: ...
+def killchar() -> bytes: ...
+def longname() -> bytes: ...
+def meta(yes: bool) -> None: ...
+def mouseinterval(interval: int) -> None: ...
+def mousemask(mousemask: int) -> Tuple[int, int]: ...
+def napms(ms: int) -> int: ...
+def newpad(nlines: int, ncols: int): ...
+def newwin(nlines: int, ncols: int, begin_y: int = ..., begin_x: int = ...): ...
+def nl(flag: bool = ...) -> None: ...
+def nocbreak() -> None: ...
+def noecho() -> None: ...
+def nonl() -> None: ...
+def noqiflush() -> None: ...
+def noraw() -> None: ...
+def pair_content(pair_number: int) -> Tuple[int, int]: ...
+def pair_number(attr: int) -> int: ...
+def putp(string: bytes) -> None: ...
+def qiflush(flag: bool = ...) -> None: ...
+def raw(flag: bool = ...) -> None: ...
+def reset_prog_mode() -> None: ...
+def reset_shell_mode() -> None: ...
+def resetty() -> None: ...
+def resize_term(nlines: int, ncols: int) -> None: ...
+def resizeterm(nlines: int, ncols: int) -> None: ...
+def savetty() -> None: ...
+def setsyx(y: int, x: int) -> None: ...
+def setupterm(termstr: str = ..., fd: int = ...) -> None: ...
+def start_color() -> None: ...
+def termattrs() -> int: ...
+def termname() -> bytes: ...
+def tigetflag(capname: str) -> int: ...
+def tigetnum(capname: str) -> int: ...
+def tigetstr(capname: str) -> bytes: ...
+def tparm(fmt: str, i1: int = ..., i2: int = ..., i3: int = ..., i4: int = ..., i5: int = ..., i6: int = ..., i7: int = ..., i8: int = ..., i9: int = ...) -> str: ...
+def typeahead(fd: int) -> None: ...
+def unctrl(ch: chtype) -> bytes: ...
+def unget_wch(ch: chtype) -> None: ...
+def ungetch(ch: chtype) -> None: ...
+def ungetmouse(id: int, x: int, y: int, z: int, bstate: int) -> None: ...
+def update_lines_cols() -> int: ...
+def use_default_colors() -> None: ...
+def use_env(flag: bool) -> None: ...
+
+class error(Exception): ...
diff --git a/typeshed/stdlib/3/_dummy_thread.pyi b/typeshed/stdlib/3/_dummy_thread.pyi
new file mode 100644
index 0000000..a4ff81c
--- /dev/null
+++ b/typeshed/stdlib/3/_dummy_thread.pyi
@@ -0,0 +1,11 @@
+# Stubs for _dummy_thread
+
+# NOTE: These are incomplete!
+
+from typing import Any
+
+class LockType:
+    def acquire(self) -> None: ...
+    def release(self) -> None: ...
+
+def allocate_lock() -> LockType: ...
diff --git a/typeshed/stdlib/3/_importlib_modulespec.pyi b/typeshed/stdlib/3/_importlib_modulespec.pyi
new file mode 100644
index 0000000..1acd9f1
--- /dev/null
+++ b/typeshed/stdlib/3/_importlib_modulespec.pyi
@@ -0,0 +1,43 @@
+# ModuleSpec, ModuleType, Loader are part of a dependency cycle.
+# They are officially defined/exported in other places:
+#
+# - ModuleType in types
+# - Loader in importlib.abc
+# - ModuleSpec in importlib.machinery (3.4 and later only)
+
+from abc import ABCMeta
+import sys
+from typing import Any, Optional
+
+if sys.version_info >= (3, 4):
+    class ModuleSpec:
+        def __init__(self, name: str, loader: Optional['Loader'], *,
+                     origin: str = None, loader_state: Any = None,
+                     is_package: bool = None) -> None: ...
+        name = ...  # type: str
+        loader = ...  # type: Optional[Loader]
+        origin = ...  # type: Optional[str]
+        submodule_search_locations = ...  # type: Optional[List[str]]
+        loader_state = ...  # type: Any
+        cached = ...  # type: Optional[str]
+        parent = ...  # type: Optional[str]
+        has_location = ...  # type: bool
+
+class ModuleType:
+    __name__ = ...  # type: str
+    __file__ = ...  # type: str
+    if sys.version_info >= (3, 4):
+        __loader__ = ...  # type: Optional[Loader]
+        __package__ = ...  # type: Optional[str]
+        __spec__ = ...  # type: Optional[ModuleSpec]
+    def __init__(self, name: str, doc: str) -> None: ...
+
+class Loader(metaclass=ABCMeta):
+    def load_module(self, fullname: str) -> ModuleType: ...
+    if sys.version_info >= (3, 3):
+        def module_repr(self, module: ModuleType) -> str: ...
+    if sys.version_info >= (3, 4):
+        def create_module(self, spec: ModuleSpec) -> Optional[ModuleType]: ...
+        # Not defined on the actual class for backwards-compatibility reasons,
+        # but expected in new code.
+        def exec_module(self, module: ModuleType) -> None: ...
diff --git a/typeshed/stdlib/3/_json.pyi b/typeshed/stdlib/3/_json.pyi
new file mode 100644
index 0000000..ce9483a
--- /dev/null
+++ b/typeshed/stdlib/3/_json.pyi
@@ -0,0 +1,30 @@
+"""Stub file for the '_json' module."""
+
+from typing import Any, Tuple
+
+class make_encoder:
+    sort_keys = ...  # type: Any
+    skipkeys = ...  # type: Any
+    key_separator = ...  # type: Any
+    indent = ...  # type: Any
+    markers = ...  # type: Any
+    default = ...  # type: Any
+    encoder = ...  # type: Any
+    item_separator = ...  # type: Any
+    def __init__(self, markers, default, encoder, indent, key_separator,
+                 item_separator, sort_keys, skipkeys, allow_nan) -> None: ...
+    def __call__(self, *args, **kwargs) -> Any: ...
+
+class make_scanner:
+    object_hook = ...  # type: Any
+    object_pairs_hook = ...  # type: Any
+    parse_int = ...  # type: Any
+    parse_constant = ...  # type: Any
+    parse_float = ...  # type: Any
+    strict = ...  # type: bool
+    # TODO: 'context' needs the attrs above (ducktype), but not __call__.
+    def __init__(self, context: "make_scanner") -> None: ...
+    def __call__(self, string: str, index: int) -> Tuple[Any, int]: ...
+
+def encode_basestring_ascii(s: str) -> str: ...
+def scanstring(string: str, end: int, strict: bool = ...) -> Tuple[str, int]: ...
diff --git a/typeshed/stdlib/3/_markupbase.pyi b/typeshed/stdlib/3/_markupbase.pyi
new file mode 100644
index 0000000..129b49b
--- /dev/null
+++ b/typeshed/stdlib/3/_markupbase.pyi
@@ -0,0 +1,9 @@
+from typing import Tuple
+
+class ParserBase(object):
+    def __init__(self) -> None: ...
+    def error(self, message: str) -> None: ...
+    def reset(self) -> None: ...
+    def getpos(self) -> Tuple[int, int]: ...
+
+    def unkown_decl(self, data: str) -> None: ...
diff --git a/typeshed/stdlib/3/_operator.pyi b/typeshed/stdlib/3/_operator.pyi
new file mode 100644
index 0000000..0f64f95
--- /dev/null
+++ b/typeshed/stdlib/3/_operator.pyi
@@ -0,0 +1,71 @@
+# Stubs for _operator (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def _compare_digest(*args, **kwargs): ...
+def abs(a): ...
+def add(a, b): ...
+def and_(a, b): ...
+def concat(a, b): ...
+def contains(a, b): ...
+def countOf(a, b): ...
+def delitem(a, b): ...
+def eq(a, b): ...
+def floordiv(a, b): ...
+def ge(a, b): ...
+def getitem(a, b): ...
+def gt(a, b): ...
+def iadd(*args, **kwargs): ...
+def iand(*args, **kwargs): ...
+def iconcat(*args, **kwargs): ...
+def ifloordiv(*args, **kwargs): ...
+def ilshift(*args, **kwargs): ...
+def imatmul(*args, **kwargs): ...
+def imod(*args, **kwargs): ...
+def imul(*args, **kwargs): ...
+def index(a): ...
+def indexOf(a, b): ...
+def inv(a): ...
+def invert(a): ...
+def ior(*args, **kwargs): ...
+def ipow(*args, **kwargs): ...
+def irshift(*args, **kwargs): ...
+def is_(a, b): ...
+def is_not(a, b): ...
+def isub(*args, **kwargs): ...
+def itruediv(*args, **kwargs): ...
+def ixor(*args, **kwargs): ...
+def le(a, b): ...
+def length_hint(obj, default=0): ...
+def lshift(a, b): ...
+def lt(a, b): ...
+def matmul(a, b): ...
+def mod(a, b): ...
+def mul(a, b): ...
+def ne(a, b): ...
+def neg(a): ...
+def not_(a): ...
+def or_(a, b): ...
+def pos(a): ...
+def pow(a, b): ...
+def rshift(a, b): ...
+def setitem(a, b, c): ...
+def sub(a, b): ...
+def truediv(a, b): ...
+def truth(a): ...
+def xor(a, b): ...
+
+class attrgetter:
+    def __init__(self, *args, **kwargs): ...
+    def __call__(self, *args, **kwargs): ...
+    def __reduce__(self): ...
+
+class itemgetter:
+    def __init__(self, *args, **kwargs): ...
+    def __call__(self, *args, **kwargs): ...
+    def __reduce__(self): ...
+
+class methodcaller:
+    def __init__(self, *args, **kwargs): ...
+    def __call__(self, *args, **kwargs): ...
+    def __reduce__(self): ...
diff --git a/typeshed/stdlib/3/_posixsubprocess.pyi b/typeshed/stdlib/3/_posixsubprocess.pyi
new file mode 100644
index 0000000..a048a10
--- /dev/null
+++ b/typeshed/stdlib/3/_posixsubprocess.pyi
@@ -0,0 +1,13 @@
+# Stubs for _posixsubprocess
+
+# NOTE: These are incomplete!
+
+from typing import Tuple, Sequence
+
+def cloexec_pipe() -> Tuple[int, int]: ...
+def fork_exec(args: Sequence[str],
+              executable_list, close_fds, fds_to_keep, cwd: str, env_list,
+              p2cread: int, p2cwrite: int, c2pred: int, c2pwrite: int,
+              errread: int, errwrite: int, errpipe_read: int,
+              errpipe_write: int, restore_signals, start_new_session,
+              preexec_fn) -> int: ...
diff --git a/typeshed/stdlib/3/_random.pyi b/typeshed/stdlib/3/_random.pyi
new file mode 100644
index 0000000..b3fcdb4
--- /dev/null
+++ b/typeshed/stdlib/3/_random.pyi
@@ -0,0 +1,12 @@
+# Stubs for _random
+
+# NOTE: These are incomplete!
+
+from typing import Any
+
+class Random:
+    def seed(self, x: Any = ...) -> None: ...
+    def getstate(self) -> tuple: ...
+    def setstate(self, state: tuple) -> None: ...
+    def random(self) -> float: ...
+    def getrandbits(self, k: int) -> int: ...
diff --git a/typeshed/stdlib/3/_subprocess.pyi b/typeshed/stdlib/3/_subprocess.pyi
new file mode 100644
index 0000000..76967b9
--- /dev/null
+++ b/typeshed/stdlib/3/_subprocess.pyi
@@ -0,0 +1,38 @@
+# Stubs for _subprocess
+
+# NOTE: These are incomplete!
+
+from typing import Mapping, Any, Tuple
+
+CREATE_NEW_CONSOLE = 0
+CREATE_NEW_PROCESS_GROUP = 0
+STD_INPUT_HANDLE = 0
+STD_OUTPUT_HANDLE = 0
+STD_ERROR_HANDLE = 0
+SW_HIDE = 0
+STARTF_USESTDHANDLES = 0
+STARTF_USESHOWWINDOW = 0
+INFINITE = 0
+DUPLICATE_SAME_ACCESS = 0
+WAIT_OBJECT_0 = 0
+
+# TODO not exported by the Python module
+class Handle:
+    def Close(self) -> None: ...
+
+def GetVersion() -> int: ...
+def GetExitCodeProcess(handle: Handle) -> int: ...
+def WaitForSingleObject(handle: Handle, timeout: int) -> int: ...
+def CreateProcess(executable: str, cmd_line: str,
+                  proc_attrs, thread_attrs,
+                  inherit: int, flags: int,
+                  env_mapping: Mapping[str, str],
+                  curdir: str,
+                  startupinfo: Any) -> Tuple[Any, Handle, int, int]: ...
+def GetModuleFileName(module: int) -> str: ...
+def GetCurrentProcess() -> Handle: ...
+def DuplicateHandle(source_proc: Handle, source: Handle, target_proc: Handle,
+                    target: Any, access: int, inherit: int) -> int: ...
+def CreatePipe(pipe_attrs, size: int) -> Tuple[Handle, Handle]: ...
+def GetStdHandle(arg: int) -> int: ...
+def TerminateProcess(handle: Handle, exit_code: int) -> None: ...
diff --git a/typeshed/stdlib/3/_thread.pyi b/typeshed/stdlib/3/_thread.pyi
new file mode 100644
index 0000000..a8e38a9
--- /dev/null
+++ b/typeshed/stdlib/3/_thread.pyi
@@ -0,0 +1,15 @@
+# Stubs for _thread
+
+# NOTE: These are incomplete!
+
+from typing import Any
+
+def _count() -> int: ...
+_dangling = ...  # type: Any
+
+class LockType:
+    def acquire(self) -> None: ...
+    def release(self) -> None: ...
+
+def allocate_lock() -> LockType: ...
+def get_ident() -> int: ...
diff --git a/typeshed/stdlib/3/_warnings.pyi b/typeshed/stdlib/3/_warnings.pyi
new file mode 100644
index 0000000..b1f0431
--- /dev/null
+++ b/typeshed/stdlib/3/_warnings.pyi
@@ -0,0 +1,11 @@
+from typing import Any, List
+
+_defaultaction = ...  # type: str
+_onceregistry = ...  # type: dict
+filters = ...  # type: List[tuple]
+
+def warn(message: Warning, category: type = ..., stacklevel: int = ...) -> None: ...
+def warn_explicit(message: Warning, category: type,
+                  filename: str, lineno: int,
+                  module: Any = ..., registry: dict = ...,
+                  module_globals: dict = ...) -> None: ...
diff --git a/typeshed/stdlib/3/abc.pyi b/typeshed/stdlib/3/abc.pyi
new file mode 100644
index 0000000..80287e1
--- /dev/null
+++ b/typeshed/stdlib/3/abc.pyi
@@ -0,0 +1,13 @@
+from typing import Any
+import sys
+# Stubs for abc.
+
+# Thesee definitions have special processing in type checker.
+class ABCMeta(type):
+    def register(cls: "ABCMeta", subclass: Any) -> None: ...
+abstractmethod = object()
+abstractproperty = object()
+
+if sys.version_info >= (3, 4):
+    class ABC(metaclass=ABCMeta):
+        pass
diff --git a/typeshed/stdlib/3/array.pyi b/typeshed/stdlib/3/array.pyi
new file mode 100644
index 0000000..77ed052
--- /dev/null
+++ b/typeshed/stdlib/3/array.pyi
@@ -0,0 +1,49 @@
+# Stubs for array
+
+# Based on http://docs.python.org/3.2/library/array.html
+
+from typing import Any, Iterable, Tuple, List, Iterator, BinaryIO, overload
+
+typecodes = ...  # type: str
+
+class array:
+    typecode = ...  # type: str
+    itemsize = ...  # type: int
+    def __init__(self, typecode: str,
+                 initializer: Iterable[Any] = ...) -> None: ...
+    def append(self, x: Any) -> None: ...
+    def buffer_info(self) -> Tuple[int, int]: ...
+    def byteswap(self) -> None: ...
+    def count(self, x: Any) -> int: ...
+    def extend(self, iterable: Iterable[Any]) -> None: ...
+    def frombytes(self, s: bytes) -> None: ...
+    def fromfile(self, f: BinaryIO, n: int) -> None: ...
+    def fromlist(self, list: List[Any]) -> None: ...
+    def fromstring(self, s: bytes) -> None: ...
+    def fromunicode(self, s: str) -> None: ...
+    def index(self, x: Any) -> int: ...
+    def insert(self, i: int, x: Any) -> None: ...
+    def pop(self, i: int = ...) -> Any: ...
+    def remove(self, x: Any) -> None: ...
+    def reverse(self) -> None: ...
+    def tobytes(self) -> bytes: ...
+    def tofile(self, f: BinaryIO) -> None: ...
+    def tolist(self) -> List[Any]: ...
+    def tostring(self) -> bytes: ...
+    def tounicode(self) -> str: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[Any]: ...
+    def __str__(self) -> str: ...
+    def __hash__(self) -> int: ...
+
+    @overload
+    def __getitem__(self, i: int) -> Any: ...
+    @overload
+    def __getitem__(self, s: slice) -> 'array': ...
+
+    def __setitem__(self, i: int, o: Any) -> None: ...
+    def __delitem__(self, i: int) -> None: ...
+    def __add__(self, x: 'array') -> 'array': ...
+    def __mul__(self, n: int) -> 'array': ...
+    def __contains__(self, o: object) -> bool: ...
diff --git a/typeshed/stdlib/3/ast.pyi b/typeshed/stdlib/3/ast.pyi
new file mode 100644
index 0000000..f9488c9
--- /dev/null
+++ b/typeshed/stdlib/3/ast.pyi
@@ -0,0 +1,39 @@
+# Python 3.5 ast
+
+import typing
+from typing import Any, Union, Iterator
+
+from _ast import (
+    Add, alias, And, arg, arguments, Assert, Assign, AST, AsyncFor,
+    AsyncFunctionDef, AsyncWith, Attribute, AugAssign, AugLoad, AugStore,
+    Await, BinOp, BitAnd, BitOr, BitXor, BoolOp, boolop, Break, Bytes, Call,
+    ClassDef, cmpop, Compare, comprehension, Continue, Del, Delete, Dict,
+    DictComp, Div, Ellipsis, Eq, ExceptHandler, Expr, expr, Expression,
+    expr_context, ExtSlice, FloorDiv, For, FunctionDef, GeneratorExp, Global,
+    Gt, GtE, If, IfExp, Import, ImportFrom, In, Index, Interactive, Invert, Is,
+    IsNot, keyword, Lambda, List, ListComp, Load, LShift, Lt, LtE, MatMult,
+    Mod, mod, Module, Mult, Name, NameConstant, Nonlocal, Not, NotEq, NotIn,
+    Num, operator, Or, Param, Pass, Pow, Raise, Return, RShift, Set, SetComp,
+    Slice, slice, Starred, stmt, Store, Str, Sub, Subscript, Suite, Try, Tuple,
+    UAdd, UnaryOp, unaryop, USub, While, With, withitem, Yield, YieldFrom
+)
+
+class NodeVisitor():
+    def visit(self, node: AST) -> Any: ...
+    def generic_visit(self, node: AST) -> None: ...
+
+class NodeTransformer(NodeVisitor):
+    def generic_visit(self, node: AST) -> None: ...
+
+def parse(source: Union[str, bytes], filename: Union[str, bytes] = ..., mode: str = ...) -> AST: ...
+def copy_location(new_node: AST, old_node: AST) -> AST: ...
+def dump(node: AST, annotate_fields: bool = ..., include_attributes: bool = ...) -> str: ...
+def fix_missing_locations(node: AST) -> AST: ...
+def get_docstring(node: AST, clean: bool = ...) -> str: ...
+def increment_lineno(node: AST, n: int = ...) -> AST: ...
+def iter_child_nodes(node: AST) -> Iterator[AST]: ...
+def iter_fields(node: AST) -> Iterator[typing.Tuple[str, Any]]: ...
+def literal_eval(node_or_string: Union[str, AST]) -> Any: ...
+def walk(node: AST) -> Iterator[AST]: ...
+
+PyCF_ONLY_AST = ...  # type: int
diff --git a/typeshed/stdlib/3/atexit.pyi b/typeshed/stdlib/3/atexit.pyi
new file mode 100644
index 0000000..24f9389
--- /dev/null
+++ b/typeshed/stdlib/3/atexit.pyi
@@ -0,0 +1,9 @@
+"""Stub file for the 'atexit' module."""
+
+from typing import Any, Callable
+
+def _clear() -> None: ...
+def _ncallbacks() -> int: ...
+def _run_exitfuncs() -> None: ...
+def register(func: Callable[..., Any], *args: Any, **kwargs: Any) -> Callable[..., Any]: ...
+def unregister(func: Callable[..., Any]) -> None: ...
diff --git a/typeshed/stdlib/3/base64.pyi b/typeshed/stdlib/3/base64.pyi
new file mode 100644
index 0000000..4e76ebb
--- /dev/null
+++ b/typeshed/stdlib/3/base64.pyi
@@ -0,0 +1,42 @@
+# Stubs for base64
+
+from typing import IO, Union
+import sys
+
+
+if sys.version_info <= (3, 2):
+    _encodable = bytes
+    _decodable = bytes
+elif sys.version_info[:2] == (3, 3):
+    _encodable = bytes
+    _decodable = Union[bytes, str]
+elif sys.version_info >= (3, 4):
+    _encodable = Union[bytes, bytearray, memoryview]
+    _decodable = Union[bytes, bytearray, memoryview, str]
+
+def b64encode(s: _encodable, altchars: bytes = ...) -> bytes: ...
+def b64decode(s: _decodable, altchars: bytes = ...,
+              validate: bool = ...) -> bytes: ...
+def standard_b64encode(s: _encodable) -> bytes: ...
+def standard_b64decode(s: _decodable) -> bytes: ...
+def urlsafe_b64encode(s: _encodable) -> bytes: ...
+def urlsafe_b64decode(s: _decodable) -> bytes: ...
+def b32encode(s: _encodable) -> bytes: ...
+def b32decode(s: _decodable, casefold: bool = ...,
+              map01: bytes = ...) -> bytes: ...
+def b16encode(s: _encodable) -> bytes: ...
+def b16decode(s: _decodable, casefold: bool = ...) -> bytes: ...
+if sys.version_info >= (3, 4):
+    def a85encode(b: _encodable, *, foldspaces: bool = ..., wrapcol: int = ...,
+                  pad: bool = ..., adobe: bool = ...) -> bytes: ...
+    def a85decode(b: _decodable, *, foldspaces: bool = ...,
+                  adobe: bool = ..., ignorechars: Union[str, bytes] = ...) -> bytes: ...
+    def b85encode(b: _encodable, pad: bool = ...) -> bytes: ...
+    def b85decode(b: _decodable) -> bytes: ...
+
+def decode(input: IO[bytes], output: IO[bytes]) -> None: ...
+def decodebytes(s: bytes) -> bytes: ...
+def decodestring(s: bytes) -> bytes: ...
+def encode(input: IO[bytes], output: IO[bytes]) -> None: ...
+def encodebytes(s: bytes) -> bytes: ...
+def encodestring(s: bytes) -> bytes: ...
diff --git a/typeshed/stdlib/3/binascii.pyi b/typeshed/stdlib/3/binascii.pyi
new file mode 100644
index 0000000..edbd970
--- /dev/null
+++ b/typeshed/stdlib/3/binascii.pyi
@@ -0,0 +1,26 @@
+# Stubs for binascii
+
+# Based on http://docs.python.org/3.2/library/binascii.html
+
+from typing import Union
+
+def a2b_uu(string: Union[str, bytes]) -> bytes: ...
+def b2a_uu(data: bytes) -> bytes: ...
+def a2b_base64(string: Union[str, bytes]) -> bytes: ...
+def b2a_base64(data: bytes) -> bytes: ...
+def a2b_qp(string: Union[str, bytes], header: bool = ...) -> bytes: ...
+def b2a_qp(data: bytes, quotetabs: bool = ..., istext: bool = ...,
+             header: bool = ...) -> bytes: ...
+def a2b_hqx(string: Union[str, bytes]) -> bytes: ...
+def rledecode_hqx(data: bytes) -> bytes: ...
+def rlecode_hqx(data: bytes) -> bytes: ...
+def b2a_hqx(data: bytes) -> bytes: ...
+def crc_hqx(data: bytes, crc: int) -> int: ...
+def crc32(data: bytes, crc: int = ...) -> int: ...
+def b2a_hex(data: bytes) -> bytes: ...
+def hexlify(data: bytes) -> bytes: ...
+def a2b_hex(hexstr: Union[str, bytes]) -> bytes: ...
+def unhexlify(hexlify: Union[str, bytes]) -> bytes: ...
+
+class Error(Exception): ...
+class Incomplete(Exception): ...
diff --git a/typeshed/stdlib/3/builtins.pyi b/typeshed/stdlib/3/builtins.pyi
new file mode 100644
index 0000000..7000ad5
--- /dev/null
+++ b/typeshed/stdlib/3/builtins.pyi
@@ -0,0 +1,908 @@
+# Stubs for builtins (Python 3)
+
+from typing import (
+    TypeVar, Iterator, Iterable, overload, Container,
+    Sequence, MutableSequence, Mapping, MutableMapping, Tuple, List, Any, Dict, Callable, Generic,
+    Set, AbstractSet, FrozenSet, MutableSet, Sized, Reversible, SupportsInt, SupportsFloat,
+    SupportsBytes, SupportsAbs, SupportsRound, IO, Union, ItemsView, KeysView, ValuesView,
+    ByteString, Optional
+)
+from abc import abstractmethod, ABCMeta
+from types import TracebackType
+import sys
+from mypy_extensions import NoReturn
+
+# Note that names imported above are not automatically made visible via the
+# implicit builtins import.
+
+_T = TypeVar('_T')
+_T_co = TypeVar('_T_co', covariant=True)
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+_S = TypeVar('_S')
+_T1 = TypeVar('_T1')
+_T2 = TypeVar('_T2')
+_T3 = TypeVar('_T3')
+_T4 = TypeVar('_T4')
+_TT = TypeVar('_TT', bound='type')
+
+class staticmethod: pass   # Special, only valid as a decorator.
+class classmethod: pass  # Special, only valid as a decorator.
+
+class object:
+    __doc__ = ...  # type: Optional[str]
+    __class__ = ...  # type: type
+    __dict__ = ...  # type: Dict[str, Any]
+    __slots__ = ...  # type: Optional[Union[str, Iterable[str]]]
+
+    def __init__(self) -> None: ...
+    def __new__(cls) -> Any: ...
+    def __setattr__(self, name: str, value: Any) -> None: ...
+    def __eq__(self, o: object) -> bool: ...
+    def __ne__(self, o: object) -> bool: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __hash__(self) -> int: ...
+    def __format__(self, format_spec: str) -> str: ...
+    def __getattribute__(self, name: str) -> Any: ...
+    def __delattr__(self, name: str) -> None: ...
+
+    if sys.version_info >= (3, 6):
+        def __init_subclass__(cls) -> None: ...
+
+class type:
+    __bases__ = ...  # type: Tuple[type, ...]
+    __name__ = ...  # type: str
+    __qualname__ = ...  # type: str
+    __module__ = ...  # type: str
+    __dict__ = ...  # type: Dict[str, Any]
+    __mro__ = ...  # type: Tuple[type, ...]
+
+    @overload
+    def __init__(self, o: object) -> None: ...
+    @overload
+    def __init__(self, name: str, bases: Tuple[type, ...], dict: Dict[str, Any]) -> None: ...
+    @overload
+    def __new__(cls, o: object) -> type: ...
+    @overload
+    def __new__(cls, name: str, bases: Tuple[type, ...], namespace: Dict[str, Any]) -> type: ...
+    def __call__(self, *args: Any, **kwds: Any) -> Any: ...
+    def __subclasses__(self: _TT) -> List[_TT]: ...
+    # Note: the documentation doesnt specify what the return type is, the standard
+    # implementation seems to be returning a list.
+    def mro(self) -> List[type]: ...
+
+class int(SupportsInt, SupportsFloat, SupportsAbs[int]):
+    def __init__(self, x: Union[SupportsInt, str, bytes] = ..., base: int = ...) -> None: ...
+    def bit_length(self) -> int: ...
+    def to_bytes(self, length: int, byteorder: str, *, signed: bool = ...) -> bytes: ...
+    @classmethod
+    def from_bytes(cls, bytes: Sequence[int], byteorder: str, *,
+                   signed: bool = ...) -> int: ...  # TODO buffer object argument
+
+    def __add__(self, x: int) -> int: ...
+    def __sub__(self, x: int) -> int: ...
+    def __mul__(self, x: int) -> int: ...
+    def __floordiv__(self, x: int) -> int: ...
+    def __truediv__(self, x: int) -> float: ...
+    def __mod__(self, x: int) -> int: ...
+    def __radd__(self, x: int) -> int: ...
+    def __rsub__(self, x: int) -> int: ...
+    def __rmul__(self, x: int) -> int: ...
+    def __rfloordiv__(self, x: int) -> int: ...
+    def __rtruediv__(self, x: int) -> float: ...
+    def __rmod__(self, x: int) -> int: ...
+    def __pow__(self, x: int) -> Any: ...  # Return type can be int or float, depending on x.
+    def __rpow__(self, x: int) -> Any: ...
+    def __and__(self, n: int) -> int: ...
+    def __or__(self, n: int) -> int: ...
+    def __xor__(self, n: int) -> int: ...
+    def __lshift__(self, n: int) -> int: ...
+    def __rshift__(self, n: int) -> int: ...
+    def __rand__(self, n: int) -> int: ...
+    def __ror__(self, n: int) -> int: ...
+    def __rxor__(self, n: int) -> int: ...
+    def __rlshift__(self, n: int) -> int: ...
+    def __rrshift__(self, n: int) -> int: ...
+    def __neg__(self) -> int: ...
+    def __pos__(self) -> int: ...
+    def __invert__(self) -> int: ...
+
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: int) -> bool: ...
+    def __le__(self, x: int) -> bool: ...
+    def __gt__(self, x: int) -> bool: ...
+    def __ge__(self, x: int) -> bool: ...
+
+    def __str__(self) -> str: ...
+    def __float__(self) -> float: ...
+    def __int__(self) -> int: return self
+    def __abs__(self) -> int: ...
+    def __hash__(self) -> int: ...
+
+class float(SupportsFloat, SupportsInt, SupportsAbs[float]):
+    def __init__(self, x: Union[SupportsFloat, str, bytes] = ...) -> None: ...
+    def as_integer_ratio(self) -> Tuple[int, int]: ...
+    def hex(self) -> str: ...
+    def is_integer(self) -> bool: ...
+    @classmethod
+    def fromhex(cls, s: str) -> float: ...
+
+    def __add__(self, x: float) -> float: ...
+    def __sub__(self, x: float) -> float: ...
+    def __mul__(self, x: float) -> float: ...
+    def __floordiv__(self, x: float) -> float: ...
+    def __truediv__(self, x: float) -> float: ...
+    def __mod__(self, x: float) -> float: ...
+    def __pow__(self, x: float) -> float: ...
+    def __radd__(self, x: float) -> float: ...
+    def __rsub__(self, x: float) -> float: ...
+    def __rmul__(self, x: float) -> float: ...
+    def __rfloordiv__(self, x: float) -> float: ...
+    def __rtruediv__(self, x: float) -> float: ...
+    def __rmod__(self, x: float) -> float: ...
+    def __rpow__(self, x: float) -> float: ...
+
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: float) -> bool: ...
+    def __le__(self, x: float) -> bool: ...
+    def __gt__(self, x: float) -> bool: ...
+    def __ge__(self, x: float) -> bool: ...
+    def __neg__(self) -> float: ...
+    def __pos__(self) -> float: ...
+
+    def __str__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __abs__(self) -> float: ...
+    def __hash__(self) -> int: ...
+
+class complex(SupportsAbs[float]):
+    @overload
+    def __init__(self, re: float = 0.0, im: float = 0.0) -> None: ...
+    @overload
+    def __init__(self, s: str) -> None: ...
+
+    @property
+    def real(self) -> float: ...
+    @property
+    def imag(self) -> float: ...
+
+    def conjugate(self) -> complex: ...
+
+    def __add__(self, x: complex) -> complex: ...
+    def __sub__(self, x: complex) -> complex: ...
+    def __mul__(self, x: complex) -> complex: ...
+    def __pow__(self, x: complex) -> complex: ...
+    def __truediv__(self, x: complex) -> complex: ...
+    def __radd__(self, x: complex) -> complex: ...
+    def __rsub__(self, x: complex) -> complex: ...
+    def __rmul__(self, x: complex) -> complex: ...
+    def __rpow__(self, x: complex) -> complex: ...
+    def __rtruediv__(self, x: complex) -> complex: ...
+
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __neg__(self) -> complex: ...
+    def __pos__(self) -> complex: ...
+
+    def __str__(self) -> str: ...
+    def __abs__(self) -> float: ...
+    def __hash__(self) -> int: ...
+
+class str(Sequence[str]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, o: object) -> None: ...
+    @overload
+    def __init__(self, o: bytes, encoding: str = ..., errors: str = 'strict') -> None: ...
+    def capitalize(self) -> str: ...
+    def center(self, width: int, fillchar: str = ' ') -> str: ...
+    def count(self, x: str) -> int: ...
+    def encode(self, encoding: str = 'utf-8', errors: str = 'strict') -> bytes: ...
+    def endswith(self, suffix: Union[str, Tuple[str, ...]], start: int = None,
+                 end: int = None) -> bool: ...
+    def expandtabs(self, tabsize: int = 8) -> str: ...
+    def find(self, sub: str, start: int = 0, end: int = 0) -> int: ...
+    def format(self, *args: Any, **kwargs: Any) -> str: ...
+    def format_map(self, map: Mapping[str, Any]) -> str: ...
+    def index(self, sub: str, start: int = 0, end: int = 0) -> int: ...
+    def isalnum(self) -> bool: ...
+    def isalpha(self) -> bool: ...
+    def isdecimal(self) -> bool: ...
+    def isdigit(self) -> bool: ...
+    def isidentifier(self) -> bool: ...
+    def islower(self) -> bool: ...
+    def isnumeric(self) -> bool: ...
+    def isprintable(self) -> bool: ...
+    def isspace(self) -> bool: ...
+    def istitle(self) -> bool: ...
+    def isupper(self) -> bool: ...
+    def join(self, iterable: Iterable[str]) -> str: ...
+    def ljust(self, width: int, fillchar: str = ' ') -> str: ...
+    def lower(self) -> str: ...
+    def lstrip(self, chars: str = None) -> str: ...
+    def partition(self, sep: str) -> Tuple[str, str, str]: ...
+    def replace(self, old: str, new: str, count: int = -1) -> str: ...
+    def rfind(self, sub: str, start: int = 0, end: int = 0) -> int: ...
+    def rindex(self, sub: str, start: int = 0, end: int = 0) -> int: ...
+    def rjust(self, width: int, fillchar: str = ' ') -> str: ...
+    def rpartition(self, sep: str) -> Tuple[str, str, str]: ...
+    def rsplit(self, sep: str = None, maxsplit: int = -1) -> List[str]: ...
+    def rstrip(self, chars: str = None) -> str: ...
+    def split(self, sep: str = None, maxsplit: int = -1) -> List[str]: ...
+    def splitlines(self, keepends: bool = ...) -> List[str]: ...
+    def startswith(self, prefix: Union[str, Tuple[str, ...]], start: int = None,
+                   end: int = None) -> bool: ...
+    def strip(self, chars: str = None) -> str: ...
+    def swapcase(self) -> str: ...
+    def title(self) -> str: ...
+    def translate(self, table: Dict[int, Any]) -> str: ...
+    def upper(self) -> str: ...
+    def zfill(self, width: int) -> str: ...
+    @staticmethod
+    @overload
+    def maketrans(x: Union[Dict[int, Any], Dict[str, Any]]) -> Dict[int, Any]: ...
+    @staticmethod
+    @overload
+    def maketrans(x: str, y: str, z: str = ...) -> Dict[int, Any]: ...
+
+    def __getitem__(self, i: Union[int, slice]) -> str: ...
+    def __add__(self, s: str) -> str: ...
+    def __mul__(self, n: int) -> str: ...
+    def __rmul__(self, n: int) -> str: ...
+    def __mod__(self, *args: Any) -> str: ...
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: str) -> bool: ...
+    def __le__(self, x: str) -> bool: ...
+    def __gt__(self, x: str) -> bool: ...
+    def __ge__(self, x: str) -> bool: ...
+
+    def __len__(self) -> int: ...
+    def __contains__(self, s: object) -> bool: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def __str__(self) -> str: return self
+    def __repr__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __hash__(self) -> int: ...
+
+class bytes(ByteString):
+    @overload
+    def __init__(self, ints: Iterable[int]) -> None: ...
+    @overload
+    def __init__(self, string: str, encoding: str,
+                 errors: str = 'strict') -> None: ...
+    @overload
+    def __init__(self, length: int) -> None: ...
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, o: SupportsBytes) -> None: ...
+    def capitalize(self) -> bytes: ...
+    def center(self, width: int, fillchar: bytes = ...) -> bytes: ...
+    def count(self, x: bytes) -> int: ...
+    def decode(self, encoding: str = 'utf-8', errors: str = 'strict') -> str: ...
+    def endswith(self, suffix: Union[bytes, Tuple[bytes, ...]]) -> bool: ...
+    def expandtabs(self, tabsize: int = 8) -> bytes: ...
+    def find(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+    if sys.version_info >= (3, 5):
+        def hex(self) -> str: ...
+    def index(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+    def isalnum(self) -> bool: ...
+    def isalpha(self) -> bool: ...
+    def isdigit(self) -> bool: ...
+    def islower(self) -> bool: ...
+    def isspace(self) -> bool: ...
+    def istitle(self) -> bool: ...
+    def isupper(self) -> bool: ...
+    def join(self, iterable: Iterable[bytes]) -> bytes: ...
+    def ljust(self, width: int, fillchar: bytes = ...) -> bytes: ...
+    def lower(self) -> bytes: ...
+    def lstrip(self, chars: bytes = None) -> bytes: ...
+    def partition(self, sep: bytes) -> Tuple[bytes, bytes, bytes]: ...
+    def replace(self, old: bytes, new: bytes, count: int = -1) -> bytes: ...
+    def rfind(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+    def rindex(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+    def rjust(self, width: int, fillchar: bytes = ...) -> bytes: ...
+    def rpartition(self, sep: bytes) -> Tuple[bytes, bytes, bytes]: ...
+    def rsplit(self, sep: bytes = None, maxsplit: int = -1) -> List[bytes]: ...
+    def rstrip(self, chars: bytes = None) -> bytes: ...
+    def split(self, sep: bytes = None, maxsplit: int = -1) -> List[bytes]: ...
+    def splitlines(self, keepends: bool = ...) -> List[bytes]: ...
+    def startswith(self, prefix: Union[bytes, Tuple[bytes, ...]]) -> bool: ...
+    def strip(self, chars: bytes = None) -> bytes: ...
+    def swapcase(self) -> bytes: ...
+    def title(self) -> bytes: ...
+    def translate(self, table: Optional[bytes], delete: bytes = ...) -> bytes: ...
+    def upper(self) -> bytes: ...
+    def zfill(self, width: int) -> bytes: ...
+    @classmethod
+    def fromhex(cls, s: str) -> bytes: ...
+    @classmethod
+    def maketrans(cls, frm: bytes, to: bytes) -> bytes: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[int]: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __hash__(self) -> int: ...
+    @overload
+    def __getitem__(self, i: int) -> int: ...
+    @overload
+    def __getitem__(self, s: slice) -> bytes: ...
+    def __add__(self, s: bytes) -> bytes: ...
+    def __mul__(self, n: int) -> bytes: ...
+    def __rmul__(self, n: int) -> bytes: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: bytes) -> bool: ...
+    def __le__(self, x: bytes) -> bool: ...
+    def __gt__(self, x: bytes) -> bool: ...
+    def __ge__(self, x: bytes) -> bool: ...
+
+class bytearray(MutableSequence[int], ByteString):
+    @overload
+    def __init__(self, ints: Iterable[int]) -> None: ...
+    @overload
+    def __init__(self, string: str, encoding: str, errors: str = 'strict') -> None: ...
+    @overload
+    def __init__(self, length: int) -> None: ...
+    @overload
+    def __init__(self) -> None: ...
+    def capitalize(self) -> bytearray: ...
+    def center(self, width: int, fillchar: bytes = ...) -> bytearray: ...
+    def count(self, x: bytes) -> int: ...
+    def decode(self, encoding: str = 'utf-8', errors: str = 'strict') -> str: ...
+    def endswith(self, suffix: bytes) -> bool: ...
+    def expandtabs(self, tabsize: int = 8) -> bytearray: ...
+    def find(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+    if sys.version_info >= (3, 5):
+        def hex(self) -> str: ...
+    def index(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+    def insert(self, index: int, object: int) -> None: ...
+    def isalnum(self) -> bool: ...
+    def isalpha(self) -> bool: ...
+    def isdigit(self) -> bool: ...
+    def islower(self) -> bool: ...
+    def isspace(self) -> bool: ...
+    def istitle(self) -> bool: ...
+    def isupper(self) -> bool: ...
+    def join(self, iterable: Iterable[bytes]) -> bytearray: ...
+    def ljust(self, width: int, fillchar: bytes = ...) -> bytearray: ...
+    def lower(self) -> bytearray: ...
+    def lstrip(self, chars: bytes = None) -> bytearray: ...
+    def partition(self, sep: bytes) -> Tuple[bytearray, bytearray, bytearray]: ...
+    def replace(self, old: bytes, new: bytes, count: int = -1) -> bytearray: ...
+    def rfind(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+    def rindex(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+    def rjust(self, width: int, fillchar: bytes = ...) -> bytearray: ...
+    def rpartition(self, sep: bytes) -> Tuple[bytearray, bytearray, bytearray]: ...
+    def rsplit(self, sep: bytes = None, maxsplit: int = -1) -> List[bytearray]: ...
+    def rstrip(self, chars: bytes = None) -> bytearray: ...
+    def split(self, sep: bytes = None, maxsplit: int = -1) -> List[bytearray]: ...
+    def splitlines(self, keepends: bool = ...) -> List[bytearray]: ...
+    def startswith(self, prefix: bytes) -> bool: ...
+    def strip(self, chars: bytes = None) -> bytearray: ...
+    def swapcase(self) -> bytearray: ...
+    def title(self) -> bytearray: ...
+    def translate(self, table: Optional[bytes], delete: bytes = ...) -> bytearray: ...
+    def upper(self) -> bytearray: ...
+    def zfill(self, width: int) -> bytearray: ...
+    @classmethod
+    def fromhex(cls, s: str) -> bytearray: ...
+    @classmethod
+    def maketrans(cls, frm: bytes, to: bytes) -> bytes: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[int]: ...
+    def __str__(self) -> str: ...
+    def __repr__(self) -> str: ...
+    def __int__(self) -> int: ...
+    def __float__(self) -> float: ...
+    def __hash__(self) -> int: ...
+    @overload
+    def __getitem__(self, i: int) -> int: ...
+    @overload
+    def __getitem__(self, s: slice) -> bytearray: ...
+    @overload
+    def __setitem__(self, i: int, x: int) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, x: Union[Iterable[int], bytes]) -> None: ...
+    def __delitem__(self, i: Union[int, slice]) -> None: ...
+    def __add__(self, s: bytes) -> bytearray: ...
+    def __iadd__(self, s: Iterable[int]) -> bytearray: ...
+    def __mul__(self, n: int) -> bytearray: ...
+    def __rmul__(self, n: int) -> bytearray: ...
+    def __imul__(self, n: int) -> bytearray: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __eq__(self, x: object) -> bool: ...
+    def __ne__(self, x: object) -> bool: ...
+    def __lt__(self, x: bytes) -> bool: ...
+    def __le__(self, x: bytes) -> bool: ...
+    def __gt__(self, x: bytes) -> bool: ...
+    def __ge__(self, x: bytes) -> bool: ...
+
+
+class memoryview(Sized, Container[bytes]):
+    format = ...  # type: str
+    itemsize = ...  # type: int
+    shape = ...  # type: Optional[Tuple[int, ...]]
+    strides = ...  # type: Optional[Tuple[int, ...]]
+    suboffsets = ...  # type: Optional[Tuple[int, ...]]
+    readonly = ...  # type: bool
+    ndim = ...  # type: int
+
+    def __init__(self, obj: Union[str, bytes, bytearray, memoryview]) -> None: ...
+
+    @overload
+    def __getitem__(self, i: int) -> int: ...
+    @overload
+    def __getitem__(self, s: slice) -> memoryview: ...
+
+    def __contains__(self, x: object) -> bool: ...
+    def __iter__(self) -> Iterator[bytes]: ...
+    def __len__(self) -> int: ...
+
+    @overload
+    def __setitem__(self, i: int, o: bytes) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, o: Sequence[bytes]) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, o: memoryview) -> None: ...
+
+    def tobytes(self) -> bytes: ...
+    def tolist(self) -> List[int]: ...
+
+    if sys.version_info >= (3, 5):
+        def hex(self) -> str: ...
+
+
+class bool(int, SupportsInt, SupportsFloat):
+    def __init__(self, o: object = ...) -> None: ...
+
+class slice:
+    start = 0
+    step = 0
+    stop = 0
+    def __init__(self, start: int, stop: int = 0, step: int = 0) -> None: ...
+
+class tuple(Sequence[_T_co], Generic[_T_co]):
+    def __init__(self, iterable: Iterable[_T_co] = ...) -> None: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, x: object) -> bool: ...
+    @overload
+    def __getitem__(self, x: int) -> _T_co: ...
+    @overload
+    def __getitem__(self, x: slice) -> Tuple[_T_co, ...]: ...
+    def __iter__(self) -> Iterator[_T_co]: ...
+    def __lt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __le__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __gt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __ge__(self, x: Tuple[_T_co, ...]) -> bool: ...
+    def __add__(self, x: Tuple[_T_co, ...]) -> Tuple[_T_co, ...]: ...
+    def __mul__(self, n: int) -> Tuple[_T_co, ...]: ...
+    def __rmul__(self, n: int) -> Tuple[_T_co, ...]: ...
+    def count(self, x: Any) -> int: ...
+    if sys.version_info >= (3, 5):
+        def index(self, x: Any, start: int = 0, end: int = 0) -> int: ...
+    else:
+        def index(self, x: Any) -> int: ...
+
+class function:
+    # TODO not defined in builtins!
+    __name__ = ...  # type: str
+    __qualname__ = ...  # type: str
+    __module__ = ...  # type: str
+    __code__ = ...  # type: Any
+
+class list(MutableSequence[_T], Generic[_T]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[_T]) -> None: ...
+    def clear(self) -> None: ...
+    def copy(self) -> List[_T]: ...
+    def append(self, object: _T) -> None: ...
+    def extend(self, iterable: Iterable[_T]) -> None: ...
+    def pop(self, index: int = -1) -> _T: ...
+    def index(self, object: _T, start: int = 0, stop: int = ...) -> int: ...
+    def count(self, object: _T) -> int: ...
+    def insert(self, index: int, object: _T) -> None: ...
+    def remove(self, object: _T) -> None: ...
+    def reverse(self) -> None: ...
+    def sort(self, *, key: Callable[[_T], Any] = None, reverse: bool = ...) -> None: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __hash__(self) -> int: ...
+    @overload
+    def __getitem__(self, i: int) -> _T: ...
+    @overload
+    def __getitem__(self, s: slice) -> List[_T]: ...
+    @overload
+    def __setitem__(self, i: int, o: _T) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
+    def __delitem__(self, i: Union[int, slice]) -> None: ...
+    def __add__(self, x: List[_T]) -> List[_T]: ...
+    def __iadd__(self, x: Iterable[_T]) -> List[_T]: ...
+    def __mul__(self, n: int) -> List[_T]: ...
+    def __rmul__(self, n: int) -> List[_T]: ...
+    def __imul__(self, n: int) -> List[_T]: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __reversed__(self) -> Iterator[_T]: ...
+    def __gt__(self, x: List[_T]) -> bool: ...
+    def __ge__(self, x: List[_T]) -> bool: ...
+    def __lt__(self, x: List[_T]) -> bool: ...
+    def __le__(self, x: List[_T]) -> bool: ...
+
+class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
+    # NOTE: Keyword arguments are special. If they are used, _KT must include
+    #       str, but we have no way of enforcing it here.
+    @overload
+    def __init__(self, **kwargs: _VT) -> None: ...
+    @overload
+    def __init__(self, map: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+    def clear(self) -> None: ...
+    def copy(self) -> Dict[_KT, _VT]: ...
+    def get(self, k: _KT, default: _VT = None) -> _VT: ...
+    def pop(self, k: _KT, default: _VT = None) -> _VT: ...
+    def popitem(self) -> Tuple[_KT, _VT]: ...
+    def setdefault(self, k: _KT, default: _VT = None) -> _VT: ...
+    @overload
+    def update(self, m: Mapping[_KT, _VT]) -> None: ...
+    @overload
+    def update(self, m: Iterable[Tuple[_KT, _VT]]) -> None: ...
+    def keys(self) -> KeysView[_KT]: ...
+    def values(self) -> ValuesView[_VT]: ...
+    def items(self) -> ItemsView[_KT, _VT]: ...
+    @staticmethod
+    @overload
+    def fromkeys(seq: Sequence[_T]) -> Dict[_T, Any]: ...  # TODO: Actually a class method (mypy/issues#328)
+    @staticmethod
+    @overload
+    def fromkeys(seq: Sequence[_T], value: _S) -> Dict[_T, _S]: ...
+    def __len__(self) -> int: ...
+    def __getitem__(self, k: _KT) -> _VT: ...
+    def __setitem__(self, k: _KT, v: _VT) -> None: ...
+    def __delitem__(self, v: _KT) -> None: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_KT]: ...
+    def __str__(self) -> str: ...
+
+class set(MutableSet[_T], Generic[_T]):
+    def __init__(self, iterable: Iterable[_T] = ...) -> None: ...
+    def add(self, element: _T) -> None: ...
+    def clear(self) -> None: ...
+    def copy(self) -> set[_T]: ...
+    def difference(self, *s: Iterable[Any]) -> set[_T]: ...
+    def difference_update(self, *s: Iterable[Any]) -> None: ...
+    def discard(self, element: _T) -> None: ...
+    def intersection(self, *s: Iterable[Any]) -> set[_T]: ...
+    def intersection_update(self, *s: Iterable[Any]) -> None: ...
+    def isdisjoint(self, s: Iterable[Any]) -> bool: ...
+    def issubset(self, s: Iterable[Any]) -> bool: ...
+    def issuperset(self, s: Iterable[Any]) -> bool: ...
+    def pop(self) -> _T: ...
+    def remove(self, element: _T) -> None: ...
+    def symmetric_difference(self, s: Iterable[_T]) -> set[_T]: ...
+    def symmetric_difference_update(self, s: Iterable[_T]) -> None: ...
+    def union(self, *s: Iterable[_T]) -> set[_T]: ...
+    def update(self, *s: Iterable[_T]) -> None: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __and__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __iand__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __or__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __ior__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __sub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __isub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+    def __xor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __ixor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+    def __le__(self, s: AbstractSet[Any]) -> bool: ...
+    def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+    def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+    def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+    # TODO more set operations
+
+class frozenset(FrozenSet[_T], Generic[_T]):
+    def __init__(self, iterable: Iterable[_T] = ...) -> None: ...
+    def copy(self) -> frozenset[_T]: ...
+    def difference(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+    def intersection(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+    def isdisjoint(self, s: Iterable[_T]) -> bool: ...
+    def issubset(self, s: Iterable[Any]) -> bool: ...
+    def issuperset(self, s: Iterable[Any]) -> bool: ...
+    def symmetric_difference(self, s: Iterable[_T]) -> frozenset[_T]: ...
+    def union(self, *s: Iterable[_T]) -> frozenset[_T]: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __and__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+    def __or__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+    def __sub__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+    def __xor__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+    def __le__(self, s: AbstractSet[Any]) -> bool: ...
+    def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+    def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+    def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+
+class enumerate(Iterator[Tuple[int, _T]], Generic[_T]):
+    def __init__(self, iterable: Iterable[_T], start: int = 0) -> None: ...
+    def __iter__(self) -> Iterator[Tuple[int, _T]]: ...
+    def __next__(self) -> Tuple[int, _T]: ...
+
+class range(Sequence[int]):
+    @overload
+    def __init__(self, stop: int) -> None: ...
+    @overload
+    def __init__(self, start: int, stop: int, step: int = 1) -> None: ...
+    def count(self, value: int) -> int: ...
+    def index(self, value: int, start: int = 0, stop: int = None) -> int: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[int]: ...
+    @overload
+    def __getitem__(self, i: int) -> int: ...
+    @overload
+    def __getitem__(self, s: slice) -> range: ...
+    def __repr__(self) -> str: ...
+    def __reversed__(self) -> Iterator[int]: ...
+
+class module:
+    # TODO not defined in builtins!
+    __name__ = ...  # type: str
+    __file__ = ...  # type: str
+    __dict__ = ...  # type: Dict[str, Any]
+
+class property:
+    def __init__(self, fget: Callable[[Any], Any] = None,
+                 fset: Callable[[Any, Any], None] = None,
+                 fdel: Callable[[Any], None] = None, doc: str = None) -> None: ...
+    def getter(self, fget: Callable[[Any], Any]) -> property: ...
+    def setter(self, fset: Callable[[Any, Any], None]) -> property: ...
+    def deleter(self, fdel: Callable[[Any], None]) -> property: ...
+    def __get__(self, obj: Any, type: type=None) -> Any: ...
+    def __set__(self, obj: Any, value: Any) -> None: ...
+    def __delete__(self, obj: Any) -> None: ...
+
+NotImplemented = ...  # type: Any
+
+def abs(n: SupportsAbs[_T]) -> _T: ...
+def all(i: Iterable) -> bool: ...
+def any(i: Iterable) -> bool: ...
+def ascii(o: object) -> str: ...
+def bin(number: int) -> str: ...
+def callable(o: object) -> bool: ...
+def chr(code: int) -> str: ...
+def compile(source: Any, filename: Union[str, bytes], mode: str, flags: int = 0,
+            dont_inherit: int = 0) -> Any: ...
+def copyright() -> None: ...
+def credits() -> None: ...
+def delattr(o: Any, name: str) -> None: ...
+def dir(o: object = ...) -> List[str]: ...
+_N = TypeVar('_N', int, float)
+def divmod(a: _N, b: _N) -> Tuple[_N, _N]: ...
+def eval(source: str, globals: Dict[str, Any] = None,
+         locals: Mapping[str, Any] = None) -> Any: ...  # TODO code object as source
+def exec(object: str, globals: Dict[str, Any] = None,
+         locals: Mapping[str, Any] = None) -> Any: ...  # TODO code object as source
+def exit(code: int = None) -> NoReturn: ...
+ at overload
+def filter(function: Callable[[_T], Any], iterable: Iterable[_T]) -> Iterator[_T]: ...
+ at overload
+def filter(function: None, iterable: Iterable[Optional[_T]]) -> Iterator[_T]: ...
+def format(o: object, format_spec: str = '') -> str: ...
+def getattr(o: Any, name: str, default: Any = ...) -> Any: ...
+def globals() -> Dict[str, Any]: ...
+def hasattr(o: Any, name: str) -> bool: ...
+def hash(o: object) -> int: ...
+def help(*args: Any, **kwds: Any) -> None: ...
+def hex(i: int) -> str: ...  # TODO __index__
+def id(o: object) -> int: ...
+def input(prompt: str = None) -> str: ...
+ at overload
+def iter(iterable: Iterable[_T]) -> Iterator[_T]: ...
+ at overload
+def iter(function: Callable[[], _T], sentinel: _T) -> Iterator[_T]: ...
+def isinstance(o: object, t: Union[type, Tuple[type, ...]]) -> bool: ...
+def issubclass(cls: type, classinfo: Union[type, Tuple[type, ...]]) -> bool: ...
+def len(o: Sized) -> int: ...
+def license() -> None: ...
+def locals() -> Dict[str, Any]: ...
+ at overload
+def map(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> Iterator[_S]: ...
+ at overload
+def map(func: Callable[[_T1, _T2], _S], iter1: Iterable[_T1],
+        iter2: Iterable[_T2]) -> Iterator[_S]: ...  # TODO more than two iterables
+ at overload
+def max(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def max(iterable: Iterable[_T], key: Callable[[_T], Any] = ..., default: _T = ...) -> _T: ...
+ at overload
+def min(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def min(iterable: Iterable[_T], key: Callable[[_T], Any] = ..., default: _T = ...) -> _T: ...
+ at overload
+def next(i: Iterator[_T]) -> _T: ...
+ at overload
+def next(i: Iterator[_T], default: _T) -> _T: ...
+def oct(i: int) -> str: ...  # TODO __index__
+
+if sys.version_info >= (3, 6):
+    from pathlib import Path
+    def open(file: Union[str, bytes, int, Path], mode: str = 'r', buffering: int = -1, encoding: str = None,
+             errors: str = None, newline: str = None, closefd: bool = ...) -> IO[Any]: ...
+else:
+    def open(file: Union[str, bytes, int], mode: str = 'r', buffering: int = -1, encoding: str = None,
+             errors: str = None, newline: str = None, closefd: bool = ...) -> IO[Any]: ...
+
+def ord(c: Union[str, bytes, bytearray]) -> int: ...
+# TODO: in Python 3.2, print() does not support flush
+def print(*values: Any, sep: str = ' ', end: str = '\n', file: IO[str] = None, flush: bool = False) -> None: ...
+ at overload
+def pow(x: int, y: int) -> Any: ...  # The return type can be int or float, depending on y
+ at overload
+def pow(x: int, y: int, z: int) -> Any: ...
+ at overload
+def pow(x: float, y: float) -> float: ...
+ at overload
+def pow(x: float, y: float, z: float) -> float: ...
+def quit(code: int = None) -> None: ...
+ at overload
+def reversed(object: Reversible[_T]) -> Iterator[_T]: ...
+ at overload
+def reversed(object: Sequence[_T]) -> Iterator[_T]: ...
+def repr(o: object) -> str: ...
+ at overload
+def round(number: float) -> int: ...
+ at overload
+def round(number: float, ndigits: int) -> float: ...  # Always return a float if given ndigits.
+ at overload
+def round(number: SupportsRound[_T]) -> _T: ...
+ at overload
+def round(number: SupportsRound[_T], ndigits: int) -> _T: ...
+def setattr(object: Any, name: str, value: Any) -> None: ...
+def sorted(iterable: Iterable[_T], *, key: Callable[[_T], Any] = None,
+           reverse: bool = False) -> List[_T]: ...
+def sum(iterable: Iterable[_T], start: _T = ...) -> _T: ...
+def vars(object: Any = ...) -> Dict[str, Any]: ...
+ at overload
+def zip(iter1: Iterable[_T1]) -> Iterator[Tuple[_T1]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2]) -> Iterator[Tuple[_T1, _T2]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2],
+        iter3: Iterable[_T3]) -> Iterator[Tuple[_T1, _T2, _T3]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3],
+        iter4: Iterable[_T4]) -> Iterator[Tuple[_T1, _T2,
+                                               _T3, _T4]]: ...  # TODO more than four iterables
+def __import__(name: str, globals: Dict[str, Any] = ..., locals: Dict[str, Any] = ...,
+               fromlist: List[str] = ..., level: int = -1) -> Any: ...
+
+# Ellipsis
+
+# Actually the type of Ellipsis is <type 'ellipsis'>, but since it's
+# not exposed anywhere under that name, we make it private here.
+class ellipsis: ...
+Ellipsis = ...  # type: ellipsis
+
+# Exceptions
+
+class BaseException:
+    args = ...  # type: Tuple[Any, ...]
+    __cause__ = ...  # type: BaseException
+    __context__ = ...  # type: BaseException
+    __traceback__ = ...  # type: TracebackType
+    def __init__(self, *args: Any) -> None: ...
+    def with_traceback(self, tb: Any) -> BaseException: ...
+
+class GeneratorExit(BaseException): ...
+class KeyboardInterrupt(BaseException): ...
+class SystemExit(BaseException):
+    code = 0
+class Exception(BaseException): ...
+class ArithmeticError(Exception): ...
+class EnvironmentError(Exception):
+    errno = 0
+    strerror = ...  # type: str
+    # TODO can this be bytes?
+    filename = ...  # type: str
+class LookupError(Exception): ...
+class RuntimeError(Exception): ...
+class ValueError(Exception): ...
+class AssertionError(Exception): ...
+class AttributeError(Exception): ...
+class BufferError(Exception): ...
+class EOFError(Exception): ...
+class FloatingPointError(ArithmeticError): ...
+class IOError(EnvironmentError): ...
+class ImportError(Exception): ...
+class IndexError(LookupError): ...
+class KeyError(LookupError): ...
+class MemoryError(Exception): ...
+class NameError(Exception): ...
+class NotImplementedError(RuntimeError): ...
+class OSError(EnvironmentError): ...
+class BlockingIOError(OSError):
+    characters_written = 0
+class ChildProcessError(OSError): ...
+class ConnectionError(OSError): ...
+class BrokenPipeError(ConnectionError): ...
+class ConnectionAbortedError(ConnectionError): ...
+class ConnectionRefusedError(ConnectionError): ...
+class ConnectionResetError(ConnectionError): ...
+class FileExistsError(OSError): ...
+class FileNotFoundError(OSError): ...
+class InterruptedError(OSError): ...
+class IsADirectoryError(OSError): ...
+class NotADirectoryError(OSError): ...
+class PermissionError(OSError): ...
+class ProcessLookupError(OSError): ...
+class TimeoutError(OSError): ...
+class WindowsError(OSError):
+    winerror = ...  # type: int
+class OverflowError(ArithmeticError): ...
+class ReferenceError(Exception): ...
+class StopIteration(Exception):
+    value = ...  # type: Any
+if sys.version_info >= (3, 5):
+    class StopAsyncIteration(Exception):
+        value = ...  # type: Any
+    class RecursionError(RuntimeError): ...
+class SyntaxError(Exception):
+    msg = ...  # type: str
+    lineno = ...  # type: int
+    offset = ...  # type: int
+    text = ...  # type: str
+class IndentationError(SyntaxError): ...
+class TabError(IndentationError): ...
+class SystemError(Exception): ...
+class TypeError(Exception): ...
+class UnboundLocalError(NameError): ...
+class UnicodeError(ValueError): ...
+class UnicodeDecodeError(UnicodeError):
+    encoding = ...  # type: str
+    object = ...  # type: bytes
+    start = ...  # type: int
+    end = ...  # type: int
+    reason = ...  # type: str
+    def __init__(self, __encoding: str, __object: bytes, __start: int, __end: int,
+                 __reason: str) -> None: ...
+class UnicodeEncodeError(UnicodeError):
+    encoding = ...  # type: str
+    object = ...  # type: str
+    start = ...  # type: int
+    end = ...  # type: int
+    reason = ...  # type: str
+    def __init__(self, __encoding: str, __object: str, __start: int, __end: int,
+                 __reason: str) -> None: ...
+class UnicodeTranslateError(UnicodeError): ...
+class ZeroDivisionError(ArithmeticError): ...
+
+class Warning(Exception): ...
+class UserWarning(Warning): ...
+class DeprecationWarning(Warning): ...
+class SyntaxWarning(Warning): ...
+class RuntimeWarning(Warning): ...
+class FutureWarning(Warning): ...
+class PendingDeprecationWarning(Warning): ...
+class ImportWarning(Warning): ...
+class UnicodeWarning(Warning): ...
+class BytesWarning(Warning): ...
+class ResourceWarning(Warning): ...
diff --git a/typeshed/stdlib/3/calendar.pyi b/typeshed/stdlib/3/calendar.pyi
new file mode 100644
index 0000000..80848fd
--- /dev/null
+++ b/typeshed/stdlib/3/calendar.pyi
@@ -0,0 +1,92 @@
+from typing import Any, Iterable, List, Optional, Tuple, Sequence
+import datetime
+
+LocaleType = Tuple[Optional[str], Optional[str]]
+
+class IllegalMonthError(ValueError):
+    def __init__(self, month: int) -> None: ...
+    def __str__(self) -> str: ...
+
+class IllegalWeekdayError(ValueError):
+    def __init__(self, weekday: int) -> None: ...
+    def __str__(self) -> str: ...
+
+def isleap(year: int) -> bool: ...
+def leapdays(y1: int, y2: int) -> int: ...
+def weekday(year: int, month: int, day: int) -> int: ...
+def monthrange(year: int, month: int) -> Tuple[int, int]: ...
+
+class Calendar(object):
+    def __init__(self, firstweekday: int = 0) -> None: ...
+    def getfirstweekday(self) -> int: ...
+    def setfirstweekday(self, firstweekday: int) -> None: ...
+    def iterweekdays(self) -> Iterable[int]: ...
+    def itermonthdates(self, year: int, month: int) -> Iterable[datetime.date]: ...
+    def itermonthdays2(self, year: int, month: int) -> Iterable[Tuple[int, int]]: ...
+    def itermonthdays(self, year: int, month: int) -> Iterable[int]: ...
+    def monthdatescalendar(self, year: int, month: int) -> List[List[datetime.date]]: ...
+    def monthdays2calendar(self, year: int, month: int) -> List[List[Tuple[int, int]]]: ...
+    def monthdayscalendar(self, year: int, month: int) -> List[List[int]]: ...
+    def yeardatescalendar(self, year: int, width: int = 3) -> List[List[int]]: ...
+    def yeardays2calendar(self, year: int, width: int = 3) -> List[List[Tuple[int, int]]]: ...
+    def yeardayscalendar(self, year: int, width: int = 3) -> List[List[int]]: ...
+
+class TextCalendar(Calendar):
+    def prweek(self, theweek: int, width: int) -> None: ...
+    def formatday(self, day: int, weekday: int, width: int) -> str: ...
+    def formatweek(self, theweek: int, width: int) -> str: ...
+    def formatweekday(self, day: int, width: int) -> str: ...
+    def formatweekheader(self, width: int) -> str: ...
+    def formatmonthname(self, theyear: int, themonth: int, width: int, withyear: bool = ...) -> str: ...
+    def prmonth(self, theyear: int, themonth: int, w: Any=0, l: Any = 0) -> None: ...
+    def formatmonth(self, theyear: int, themonth: int, w: int = 0, l: int = 0) -> str: ...
+    def formatyear(self, theyear: int, w: int = 2, l: int = 1, c: int = 6, m: int = 3) -> str: ...
+    def pryear(self, theyear: int, w: Any = 0, l: Any = 0, c: Any = 6, m: Any = 3) -> None: ...
+
+class HTMLCalendar(Calendar):
+    def formatday(self, day: int, weekday: int) -> str: ...
+    def formatweek(self, theweek: int) -> str: ...
+    def formatweekday(self, day: int) -> str: ...
+    def formatweekheader(self) -> str: ...
+    def formatmonthname(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+    def formatmonth(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+    def formatyear(self, theyear: int, width: int = 3) -> str: ...
+    def formatyearpage(self, theyear: int, width: int = 3, css: Optional[str] = 'calendar.css', encoding: Optional[str] = ...) -> str: ...
+
+class different_locale:
+    def __init__(self, locale: LocaleType) -> None: ...
+    def __enter__(self) -> LocaleType: ...
+    def __exit__(self, *args) -> None: ...
+
+class LocaleTextCalendar(TextCalendar):
+    def __init__(self, firstweekday: int = 0, locale: Optional[LocaleType] = ...) -> None: ...
+    def formatweekday(self, day: int, width: int) -> str: ...
+    def formatmonthname(self, theyear: int, themonth: int, width: int, withyear: bool = ...) -> str: ...
+
+class LocaleHTMLCalendar(HTMLCalendar):
+    def __init__(self, firstweekday: int = 0, locale: Optional[LocaleType] = ...) -> None: ...
+    def formatweekday(self, day: int) -> str: ...
+    def formatmonthname(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+
+c = ...  # type: TextCalendar
+def setfirstweekday(firstweekday: int) -> None: ...
+def format(cols: int, colwidth: int = ..., spacing: int = ...) -> str: ...
+def formatstring(cols: int, colwidth: int = ..., spacing: int = ...) -> str: ...
+def timegm(tuple: Tuple[int, ...]) -> int: ...
+
+# Data attributes
+day_name = ...  # type: Sequence[str]
+day_abbr = ...  # type: Sequence[str]
+month_name = ...  # type: Sequence[str]
+month_abbr = ...  # type: Sequence[str]
+
+# Below constants are not in docs or __all__, but enough people have used them
+# they are now effectively public.
+
+MONDAY = ...  # type: int
+TUESDAY = ...  # type: int
+WEDNESDAY = ...  # type: int
+THURSDAY = ...  # type: int
+FRIDAY = ...  # type: int
+SATURDAY = ...  # type: int
+SUNDAY = ...  # type: int
diff --git a/typeshed/stdlib/3/cgi.pyi b/typeshed/stdlib/3/cgi.pyi
new file mode 100644
index 0000000..16f5598
--- /dev/null
+++ b/typeshed/stdlib/3/cgi.pyi
@@ -0,0 +1,4 @@
+from typing import Dict, Tuple
+
+def escape(s: str, quote: bool = ...) -> str: ...
+def parse_header(s: str) -> Tuple[str, Dict[str, str]]: ...
diff --git a/typeshed/stdlib/3/codecs.pyi b/typeshed/stdlib/3/codecs.pyi
new file mode 100644
index 0000000..287b7de
--- /dev/null
+++ b/typeshed/stdlib/3/codecs.pyi
@@ -0,0 +1,194 @@
+# Better codecs stubs hand-written by o11c.
+# https://docs.python.org/3/library/codecs.html
+from typing import (
+    BinaryIO,
+    Callable,
+    Iterable,
+    Iterator,
+    List,
+    Tuple,
+    Union,
+)
+
+from abc import abstractmethod
+
+
+# TODO: this only satisfies the most common interface, where
+# bytes is the raw form and str is the cooked form.
+# In the long run, both should become template parameters maybe?
+# There *are* bytes->bytes and str->str encodings in the standard library.
+# Python 3.5 supposedly might change something there.
+
+_decoded = str
+_encoded = bytes
+
+# TODO: It is not possible to specify these signatures correctly, because
+# they have an optional positional or keyword argument for errors=.
+_encode_type = Callable[[_decoded], _encoded]  # signature of Codec().encode
+_decode_type = Callable[[_encoded], _decoded]  # signature of Codec().decode
+_stream_reader_type = Callable[[BinaryIO], 'StreamReader']  # signature of StreamReader __init__
+_stream_writer_type = Callable[[BinaryIO], 'StreamWriter']  # signature of StreamWriter __init__
+_incremental_encoder_type = Callable[[], 'IncrementalEncoder']  # signature of IncrementalEncoder __init__
+_incremental_decode_type = Callable[[], 'IncrementalDecoder']  # signature of IncrementalDecoder __init__
+
+
+def encode(obj: _decoded, encoding: str = ..., errors: str = ...) -> _encoded:
+    ...
+def decode(obj: _encoded, encoding: str = ..., errors: str = ...) -> _decoded:
+    ...
+
+def lookup(encoding: str) -> 'CodecInfo':
+    ...
+class CodecInfo(Tuple[_encode_type, _decode_type, _stream_reader_type, _stream_writer_type]):
+    def __init__(self, encode: _encode_type, decode: _decode_type, streamreader: _stream_reader_type = ..., streamwriter: _stream_writer_type = ..., incrementalencoder: _incremental_encoder_type = ..., incrementaldecoder: _incremental_decode_type = ..., name: str = ...) -> None:
+        self.encode = encode
+        self.decode = decode
+        self.streamreader = streamreader
+        self.streamwriter = streamwriter
+        self.incrementalencoder = incrementalencoder
+        self.incrementaldecoder = incrementaldecoder
+        self.name = name
+
+def getencoder(encoding: str) -> _encode_type:
+    ...
+def getdecoder(encoding: str) -> _encode_type:
+    ...
+def getincrementalencoder(encoding: str) -> _incremental_encoder_type:
+    ...
+def getincrementaldecoder(encoding: str) -> _incremental_encoder_type:
+    ...
+def getreader(encoding: str) -> _stream_reader_type:
+    ...
+def getwriter(encoding: str) -> _stream_writer_type:
+    ...
+
+def register(search_function: Callable[[str], CodecInfo]) -> None:
+    ...
+
+def open(filename: str, mode: str = ..., encoding: str = ..., errors: str = ..., buffering: int = ...) -> StreamReaderWriter:
+    ...
+
+def EncodedFile(file: BinaryIO, data_encoding: str, file_encoding: str = ..., errors: str = ...) -> 'StreamRecoder':
+    ...
+
+def iterencode(iterator: Iterable[_decoded], encoding: str, errors: str = ...) -> Iterator[_encoded]:
+    ...
+def iterdecode(iterator: Iterable[_encoded], encoding: str, errors: str = ...) -> Iterator[_decoded]:
+    ...
+
+BOM = b''
+BOM_BE = b''
+BOM_LE = b''
+BOM_UTF8 = b''
+BOM_UTF16 = b''
+BOM_UTF16_BE = b''
+BOM_UTF16_LE = b''
+BOM_UTF32 = b''
+BOM_UTF32_BE = b''
+BOM_UTF32_LE = b''
+
+# It is expected that different actions be taken depending on which of the
+# three subclasses of `UnicodeError` is actually ...ed. However, the Union
+# is still needed for at least one of the cases.
+def register_error(name: str, error_handler: Callable[[UnicodeError], Tuple[Union[str, bytes], int]]) -> None:
+    ...
+def lookup_error(name: str) -> Callable[[UnicodeError], Tuple[Union[str, bytes], int]]:
+    ...
+
+def strict_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+    ...
+def replace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+    ...
+def ignore_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+    ...
+def xmlcharrefreplace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+    ...
+def backslashreplace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+    ...
+
+class Codec:
+    # These are sort of @abstractmethod but sort of not.
+    # The StreamReader and StreamWriter subclasses only implement one.
+    def encode(self, input: _decoded, errors: str = ...) -> Tuple[_encoded, int]:
+        ...
+    def decode(self, input: _encoded, errors: str = ...) -> Tuple[_decoded, int]:
+        ...
+
+class IncrementalEncoder:
+    def __init__(self, errors: str = ...) -> None:
+        self.errors = errors
+    @abstractmethod
+    def encode(self, object: _decoded, final: bool = ...) -> _encoded:
+        ...
+    def reset(self) -> None:
+        ...
+    # documentation says int but str is needed for the subclass.
+    def getstate(self) -> Union[int, _decoded]:
+        ...
+    def setstate(self, state: Union[int, _decoded]) -> None:
+        ...
+
+class IncrementalDecoder:
+    def __init__(self, errors: str = ...) -> None:
+        self.errors = errors
+    @abstractmethod
+    def decode(self, object: _encoded, final: bool = ...) -> _decoded:
+        ...
+    def reset(self) -> None:
+        ...
+    def getstate(self) -> Tuple[_encoded, int]:
+        ...
+    def setstate(self, state: Tuple[_encoded, int]) -> None:
+        ...
+
+# These are not documented but used in encodings/*.py implementations.
+class BufferedIncrementalEncoder(IncrementalEncoder):
+    def __init__(self, errors: str = ...) -> None:
+        IncrementalEncoder.__init__(self, errors)
+        self.buffer = ''
+    @abstractmethod
+    def _buffer_encode(self, input: _decoded, errors: str, final: bool) -> _encoded:
+        ...
+    def encode(self, input: _decoded, final: bool = ...) -> _encoded:
+        ...
+class BufferedIncrementalDecoder(IncrementalDecoder):
+    def __init__(self, errors: str = ...) -> None:
+        IncrementalDecoder.__init__(self, errors)
+        self.buffer = b''
+    @abstractmethod
+    def _buffer_decode(self, input: _encoded, errors: str, final: bool) -> Tuple[_decoded, int]:
+        ...
+    def decode(self, object: _encoded, final: bool = ...) -> _decoded:
+        ...
+
+# TODO: it is not possible to specify the requirement that all other
+# attributes and methods are passed-through from the stream.
+class StreamWriter(Codec):
+    def __init__(self, stream: BinaryIO, errors: str = ...) -> None:
+        self.errors = errors
+    def write(self, obj: _decoded) -> None:
+        ...
+    def writelines(self, list: List[str]) -> None:
+        ...
+    def reset(self) -> None:
+        ...
+
+class StreamReader(Codec):
+    def __init__(self, stream: BinaryIO, errors: str = ...) -> None:
+        self.errors = errors
+    def read(self, size: int = ..., chars: int = ..., firstline: bool = ...) -> _decoded:
+        ...
+    def readline(self, size: int = ..., keepends: bool = ...) -> _decoded:
+        ...
+    def readlines(self, sizehint: int = ..., keepends: bool = ...) -> List[_decoded]:
+        ...
+    def reset(self) -> None:
+        ...
+
+class StreamReaderWriter:
+    def __init__(self, stream: BinaryIO, Reader: _stream_reader_type, Writer: _stream_writer_type, errors: str = ...) -> None:
+        ...
+
+class StreamRecoder(BinaryIO):
+    def __init__(self, stream: BinaryIO, encode: _encode_type, decode: _decode_type, Reader: _stream_reader_type, Writer: _stream_writer_type, errors: str = ...) -> None:
+        ...
diff --git a/typeshed/stdlib/3/collections/__init__.pyi b/typeshed/stdlib/3/collections/__init__.pyi
new file mode 100644
index 0000000..00f463b
--- /dev/null
+++ b/typeshed/stdlib/3/collections/__init__.pyi
@@ -0,0 +1,178 @@
+# Stubs for collections
+
+# Based on http://docs.python.org/3.2/library/collections.html
+
+# TODO more abstract base classes (interfaces in mypy)
+
+# These are not exported.
+from typing import (
+    TypeVar, Generic, Dict, overload, List, Tuple,
+    Callable, Any, Type, Optional, Union
+)
+# These are exported.
+# TODO reexport more.
+from typing import (
+    Container as Container,
+    Hashable as Hashable,
+    Iterable as Iterable,
+    Iterator as Iterator,
+    Sized as Sized,
+    Generator as Generator,
+    ByteString as ByteString,
+    Awaitable as Awaitable,
+    Coroutine as Coroutine,
+    AsyncIterable as AsyncIterable,
+    AsyncIterator as AsyncIterator,
+    Reversible as Reversible,
+    Mapping as Mapping,
+    MappingView as MappingView,
+    ItemsView as ItemsView,
+    KeysView as KeysView,
+    ValuesView as ValuesView,
+    MutableMapping as MutableMapping,
+    Sequence as Sequence,
+    MutableSequence as MutableSequence,
+    MutableSet as MutableSet,
+    AbstractSet as Set,
+)
+
+_T = TypeVar('_T')
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+
+# namedtuple is special-cased in the type checker; the initializer is ignored.
+def namedtuple(typename: str, field_names: Union[str, Iterable[Any]], *,
+               verbose: bool = ..., rename: bool = ..., module: str = None) -> Type[tuple]: ...
+
+class UserDict(MutableMapping): ...
+class UserList(MutableSequence): ...
+class UserString(Sequence): ...
+class MutableString(UserString, MutableSequence): ...
+
+# Technically, deque only derives from MutableSequence in 3.5.
+# But in practice it's not worth losing sleep over.
+class deque(MutableSequence[_T], Generic[_T]):
+    maxlen = ...  # type: Optional[int] # TODO readonly
+    def __init__(self, iterable: Iterable[_T] = ...,
+                 maxlen: int = ...) -> None: ...
+    def append(self, x: _T) -> None: ...
+    def appendleft(self, x: _T) -> None: ...
+    def insert(self, i: int, x: _T) -> None: ...
+    def clear(self) -> None: ...
+    def count(self, x: _T) -> int: ...
+    def extend(self, iterable: Iterable[_T]) -> None: ...
+    def extendleft(self, iterable: Iterable[_T]) -> None: ...
+    def pop(self, i: int = ...) -> _T: ...
+    def popleft(self) -> _T: ...
+    def remove(self, value: _T) -> None: ...
+    def reverse(self) -> None: ...
+    def rotate(self, n: int) -> None: ...
+
+    def __len__(self) -> int: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    def __str__(self) -> str: ...
+    def __hash__(self) -> int: ...
+
+    # These methods of deque don't really take slices, but we need to
+    # define them as taking a slice to satisfy MutableSequence.
+    @overload
+    def __getitem__(self, index: int) -> _T: ...
+    @overload
+    def __getitem__(self, s: slice) -> Sequence[_T]: raise TypeError
+    @overload
+    def __setitem__(self, i: int, x: _T) -> None: ...
+    @overload
+    def __setitem__(self, s: slice, o: Iterable[_T]) -> None: raise TypeError
+    @overload
+    def __delitem__(self, i: int) -> None: ...
+    @overload
+    def __delitem__(self, s: slice) -> None: raise TypeError
+
+    def __contains__(self, o: object) -> bool: ...
+
+    # TODO __reversed__
+
+
+class Counter(Dict[_T, int], Generic[_T]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, Mapping: Mapping[_T, int]) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[_T]) -> None: ...
+    # TODO keyword arguments
+
+    def elements(self) -> Iterator[_T]: ...
+
+    @overload
+    def most_common(self) -> List[_T]: ...
+    @overload
+    def most_common(self, n: int) -> List[_T]: ...
+
+    @overload
+    def subtract(self, Mapping: Mapping[_T, int]) -> None: ...
+    @overload
+    def subtract(self, iterable: Iterable[_T]) -> None: ...
+
+    # The Iterable[Tuple[...]] argument type is not actually desirable
+    # (the tuples will be added as keys, breaking type safety) but
+    # it's included so that the signature is compatible with
+    # Dict.update. Not sure if we should use '# type: ignore' instead
+    # and omit the type from the union.
+    @overload
+    def update(self, m: Mapping[_T, int]) -> None: ...
+    @overload
+    def update(self, m: Union[Iterable[_T], Iterable[Tuple[_T, int]]]) -> None: ...
+
+    def __add__(self, other: Counter[_T]) -> Counter[_T]: ...
+    def __sub__(self, other: Counter[_T]) -> Counter[_T]: ...
+    def __and__(self, other: Counter[_T]) -> Counter[_T]: ...
+    def __or__(self, other: Counter[_T]) -> Counter[_T]: ...
+    def __pos__(self) -> Counter[_T]: ...
+    def __neg__(self) -> Counter[_T]: ...
+    def __iadd__(self, other: Counter[_T]) -> Counter[_T]: ...
+    def __isub__(self, other: Counter[_T]) -> Counter[_T]: ...
+    def __iand__(self, other: Counter[_T]) -> Counter[_T]: ...
+    def __ior__(self, other: Counter[_T]) -> Counter[_T]: ...
+
+class OrderedDict(Dict[_KT, _VT], Generic[_KT, _VT]):
+    def popitem(self, last: bool = ...) -> Tuple[_KT, _VT]: ...
+    def move_to_end(self, key: _KT, last: bool = ...) -> None: ...
+
+
+class defaultdict(Dict[_KT, _VT], Generic[_KT, _VT]):
+    default_factory = ...  # type: Callable[[], _VT]
+
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, map: Mapping[_KT, _VT]) -> None: ...
+    @overload
+    def __init__(self, iterable: Iterable[Tuple[_KT, _VT]]) -> None: ...
+    @overload
+    def __init__(self, default_factory: Callable[[], _VT]) -> None: ...
+    @overload
+    def __init__(self, default_factory: Callable[[], _VT],
+                 map: Mapping[_KT, _VT]) -> None: ...
+    @overload
+    def __init__(self, default_factory: Callable[[], _VT],
+                 iterable: Iterable[Tuple[_KT, _VT]]) -> None: ...
+    # TODO __init__ keyword args
+
+    def __missing__(self, key: _KT) -> _VT: ...
+    # TODO __reversed__
+
+class ChainMap(Dict[_KT, _VT], Generic[_KT, _VT]):
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, *maps: Mapping[_KT, _VT]) -> None: ...
+
+    @property
+    def maps(self) -> List[Mapping[_KT, _VT]]: ...
+
+    def new_child(self, m: Mapping[_KT, _VT] = ...) -> ChainMap[_KT, _VT]: ...
+
+    @property
+    def parents(self) -> ChainMap[_KT, _VT]: ...
diff --git a/typeshed/stdlib/3/collections/abc.pyi b/typeshed/stdlib/3/collections/abc.pyi
new file mode 100644
index 0000000..f7d3ae4
--- /dev/null
+++ b/typeshed/stdlib/3/collections/abc.pyi
@@ -0,0 +1,38 @@
+# Stubs for collections.abc (introduced from Python 3.3)
+#
+# https://docs.python.org/3.3/whatsnew/3.3.html#collections
+import sys
+
+if sys.version_info >= (3, 3):
+    from . import (
+        Container as Container,
+        Hashable as Hashable,
+        Iterable as Iterable,
+        Iterator as Iterator,
+        Sized as Sized,
+        Mapping as Mapping,
+        MutableMapping as MutableMapping,
+        Sequence as Sequence,
+        MutableSequence as MutableSequence,
+        Set as Set,
+        MutableSet as MutableSet,
+        MappingView as MappingView,
+        ItemsView as ItemsView,
+        KeysView as KeysView,
+        ValuesView as ValuesView,
+    )
+
+if sys.version_info >= (3, 5):
+    from . import (
+        Generator as Generator,
+        ByteString as ByteString,
+        Awaitable as Awaitable,
+        Coroutine as Coroutine,
+        AsyncIterable as AsyncIterable,
+        AsyncIterator as AsyncIterator,
+    )
+
+if sys.version_info >= (3, 6):
+    from . import (
+        Reversible as Reversible,
+    )
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3/concurrent/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3/concurrent/__init__.pyi
diff --git a/typeshed/stdlib/3/concurrent/futures/__init__.pyi b/typeshed/stdlib/3/concurrent/futures/__init__.pyi
new file mode 100644
index 0000000..4439dca
--- /dev/null
+++ b/typeshed/stdlib/3/concurrent/futures/__init__.pyi
@@ -0,0 +1,3 @@
+from ._base import *  # noqa: F403
+from .thread import *  # noqa: F403
+from .process import *  # noqa: F403
diff --git a/typeshed/stdlib/3/concurrent/futures/_base.pyi b/typeshed/stdlib/3/concurrent/futures/_base.pyi
new file mode 100644
index 0000000..27c2711
--- /dev/null
+++ b/typeshed/stdlib/3/concurrent/futures/_base.pyi
@@ -0,0 +1,44 @@
+from typing import TypeVar, Generic, Any, Iterable, Iterator, Callable, Tuple, Optional, Set
+from collections import namedtuple
+
+FIRST_COMPLETED = ...  # type: Any
+FIRST_EXCEPTION = ...  # type: Any
+ALL_COMPLETED = ...  # type: Any
+PENDING = ...  # type: Any
+RUNNING = ...  # type: Any
+CANCELLED = ...  # type: Any
+CANCELLED_AND_NOTIFIED = ...  # type: Any
+FINISHED = ...  # type: Any
+LOGGER = ...  # type: Any
+
+class Error(Exception): ...
+class CancelledError(Error): ...
+class TimeoutError(Error): ...
+
+DoneAndNotDoneFutures = namedtuple('DoneAndNotDoneFutures', 'done not_done')
+
+_T = TypeVar('_T')
+
+class Future(Generic[_T]):
+    def __init__(self) -> None: ...
+    def cancel(self) -> bool: ...
+    def cancelled(self) -> bool: ...
+    def running(self) -> bool: ...
+    def done(self) -> bool: ...
+    def add_done_callback(self, fn: Callable[[Future], Any]) -> None: ...
+    def result(self, timeout: Optional[float] = ...) -> _T: ...
+    def exception(self, timeout: Optional[float] = ...) -> Exception: ...
+    def set_running_or_notify_cancel(self) -> None: ...
+    def set_result(self, result: _T) -> None: ...
+    def set_exception(self, exception: Exception) -> None: ...
+
+class Executor:
+    def submit(self, fn: Callable[..., _T], *args: Any, **kwargs: Any) -> Future[_T]: ...
+    def map(self, func: Callable[..., _T], *iterables: Any, timeout: Optional[float] = ..., chunksize: int = ...) -> Iterable[_T]: ...
+    def shutdown(self, wait: bool = ...) -> None: ...
+    def __enter__(self) -> Executor: ...
+    def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool: ...
+
+def as_completed(fs: Iterable[Future], timeout: Optional[float] = ...) -> Iterator[Future]: ...
+
+def wait(fs: Iterable[Future], timeout: Optional[float] = ..., return_when: str = ...) -> Tuple[Set[Future], Set[Future]]: ...
diff --git a/typeshed/stdlib/3/concurrent/futures/process.pyi b/typeshed/stdlib/3/concurrent/futures/process.pyi
new file mode 100644
index 0000000..b157d2b
--- /dev/null
+++ b/typeshed/stdlib/3/concurrent/futures/process.pyi
@@ -0,0 +1,14 @@
+from typing import Any, Callable, TypeVar, Iterable, Optional
+from ._base import Future, Executor
+
+EXTRA_QUEUED_CALLS = ...  # type: Any
+
+class BrokenProcessPool(RuntimeError): ...
+
+_T = TypeVar('_T')
+
+class ProcessPoolExecutor(Executor):
+    def __init__(self, max_workers: Optional[int] = ...) -> None: ...
+    def submit(self, fn: Callable[..., _T], *args: Any, **kwargs: Any) -> Future[_T]: ...
+    def map(self, func: Callable[..., _T], *iterables: Any, timeout: Optional[float] = ..., chunksize: int = ...) -> Iterable[_T]: ...
+    def shutdown(self, wait: bool = ...) -> None: ...
diff --git a/typeshed/stdlib/3/concurrent/futures/thread.pyi b/typeshed/stdlib/3/concurrent/futures/thread.pyi
new file mode 100644
index 0000000..e366d4d
--- /dev/null
+++ b/typeshed/stdlib/3/concurrent/futures/thread.pyi
@@ -0,0 +1,10 @@
+from typing import Any, TypeVar, Callable, Iterable, Optional
+from ._base import Executor, Future
+
+_T = TypeVar('_T')
+
+class ThreadPoolExecutor(Executor):
+    def __init__(self, max_workers: Optional[int] = ...) -> None: ...
+    def submit(self, fn: Callable[..., _T], *args: Any, **kwargs: Any) -> Future[_T]: ...
+    def map(self, func: Callable[..., _T], *iterables: Any, timeout: Optional[float] = ..., chunksize: int = ...) -> Iterable[_T]: ...
+    def shutdown(self, wait: bool = ...) -> None: ...
diff --git a/typeshed/stdlib/3/configparser.pyi b/typeshed/stdlib/3/configparser.pyi
new file mode 100644
index 0000000..22a42a1
--- /dev/null
+++ b/typeshed/stdlib/3/configparser.pyi
@@ -0,0 +1,188 @@
+# Stubs for configparser
+
+# Based on http://docs.python.org/3.5/library/configparser.html and on
+# reading configparser.py.
+
+from typing import (MutableMapping, Mapping, Dict, Sequence, List, Union,
+                    Iterable, Iterator, Callable, Any, IO, overload, Optional)
+# Types only used in type comments only
+from typing import Optional, Tuple  # noqa
+
+# Internal type aliases
+_section = Dict[str, str]
+_parser = MutableMapping[str, _section]
+_converters = Dict[str, Callable[[str], Any]]
+
+
+DEFAULTSECT = ...  # type: str
+
+
+class Interpolation:
+    def before_get(self, parser: _parser,
+                   section: str,
+                   option: str,
+                   value: str,
+                   defaults: _section) -> str: ...
+
+    def before_set(self, parser: _parser,
+                   section: str,
+                   option: str,
+                   value: str) -> str: ...
+
+    def before_read(self, parser: _parser,
+                    section: str,
+                    option: str,
+                    value: str) -> str: ...
+
+    def before_write(self, parser: _parser,
+                     section: str,
+                     option: str,
+                     value: str) -> str: ...
+
+
+class BasicInterpolation(Interpolation):
+    pass
+
+
+class ExtendedInterpolation(Interpolation):
+    pass
+
+
+class RawConfigParser(_parser):
+    def __init__(self,
+                 defaults: _section = None,
+                 dict_type: Mapping[str, str] = ...,
+                 allow_no_value: bool = ...,
+                 *,
+                 delimiters: Sequence[str] = ...,
+                 comment_prefixes: Sequence[str] = ...,
+                 inline_comment_prefixes: Sequence[str] = None,
+                 strict: bool = ...,
+                 empty_lines_in_values: bool = ...,
+                 default_section: str = ...,
+                 interpolation: Interpolation = None) -> None: ...
+
+    def __len__(self) -> int: ...
+
+    def __getitem__(self, section: str) -> _section: ...
+
+    def __setitem__(self, section: str, options: _section) -> None: ...
+
+    def __delitem__(self, section: str) -> None: ...
+
+    def __iter__(self) -> Iterator[str]: ...
+
+    def defaults(self) -> _section: ...
+
+    def sections(self) -> List[str]: ...
+
+    def add_section(self, section: str) -> None: ...
+
+    def has_section(self, section: str) -> bool: ...
+
+    def options(self, section: str) -> List[str]: ...
+
+    def has_option(self, section: str, option: str) -> bool: ...
+
+    def read(self, filenames: Union[str, Sequence[str]],
+             encoding: str = None) -> List[str]: ...
+
+    def read_file(self, f: Iterable[str], source: str = None) -> None: ...
+
+    def read_string(self, string: str, source: str = ...) -> None: ...
+
+    def read_dict(self, dictionary: Mapping[str, Mapping[str, Any]],
+                  source: str = ...) -> None: ...
+
+    def getint(self, section: str, option: str, *, raw: bool = ..., vars: _section = ..., fallback: int = ...) -> int: ...
+
+    def getfloat(self, section: str, option: str, *, raw: bool = ..., vars: _section = ..., fallback: float = ...) -> float: ...
+
+    def getboolean(self, section: str, option: str, *, raw: bool = ..., vars: _section = ..., fallback: bool = ...) -> bool: ...
+
+    # This is incompatible with MutableMapping so we ignore the type
+    def get(self, section: str, option: str, *, raw: bool = ..., vars: _section = ..., fallback: str = ...) -> str:  # type: ignore
+        ...
+
+    # This is incompatible with Mapping so we ignore the type.
+    def items(self, section: str = ..., raw: bool = ..., vars: _section = ...) -> Iterable[Tuple[str, _section]]: ...  # type: ignore
+
+    def set(self, section: str, option: str, value: str) -> None: ...
+
+    def write(self,
+              fileobject: IO[str],
+              space_around_delimiters: bool = True) -> None: ...
+
+    def remove_option(self, section: str, option: str) -> bool: ...
+
+    def remove_section(self, section: str) -> bool: ...
+
+    def optionxform(self, option: str) -> str: ...
+
+
+class ConfigParser(RawConfigParser):
+    def __init__(self,
+                 defaults: _section = None,
+                 dict_type: Mapping[str, str] = ...,
+                 allow_no_value: bool = ...,
+                 delimiters: Sequence[str] = ...,
+                 comment_prefixes: Sequence[str] = ...,
+                 inline_comment_prefixes: Sequence[str] = None,
+                 strict: bool = ...,
+                 empty_lines_in_values: bool = ...,
+                 default_section: str = ...,
+                 interpolation: Interpolation = None,
+                 converters: _converters = ...) -> None: ...
+
+
+class Error(Exception):
+    pass
+
+
+class NoSectionError(Error):
+    pass
+
+
+class DuplicateSectionError(Error):
+    section = ...  # type: str
+    source = ...   # type: Optional[str]
+    lineno = ...   # type: Optional[int]
+
+
+class DuplicateOptionError(Error):
+    section = ...  # type: str
+    option = ...   # type: str
+    source = ...   # type: Optional[str]
+    lineno = ...   # type: Optional[int]
+
+
+class NoOptionError(Error):
+    section = ...  # type: str
+    option = ...   # type: str
+
+
+class InterpolationError(Error):
+    section = ...  # type: str
+    option = ...   # type: str
+
+
+class InterpolationDepthError(InterpolationError):
+    pass
+
+
+class InterpolationMissingOptionError(InterpolationError):
+    reference = ...  # type: str
+
+
+class InterpolationSyntaxError(InterpolationError):
+    pass
+
+
+class ParsingError:
+    source = ...  # type: str
+    errors = ...  # type: Sequence[Tuple[int, str]]
+
+
+class MissingSectionHeaderError(ParsingError):
+    lineno = ...  # type: int
+    line = ...    # type: str
diff --git a/typeshed/stdlib/3/copy.pyi b/typeshed/stdlib/3/copy.pyi
new file mode 100644
index 0000000..0661cb7
--- /dev/null
+++ b/typeshed/stdlib/3/copy.pyi
@@ -0,0 +1,10 @@
+# Stubs for copy
+
+# NOTE: These are incomplete!
+
+from typing import TypeVar, Dict, Any
+
+_T = TypeVar('_T')
+
+def deepcopy(x: _T, memo: Dict[Any, Any] = ...) -> _T: ...
+def copy(x: _T) -> _T: ...
diff --git a/typeshed/stdlib/3/csv.pyi b/typeshed/stdlib/3/csv.pyi
new file mode 100644
index 0000000..7b41cc8
--- /dev/null
+++ b/typeshed/stdlib/3/csv.pyi
@@ -0,0 +1,77 @@
+# Stubs for csv (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Iterable
+
+QUOTE_ALL = ...  # type: int
+QUOTE_MINIMAL = ...  # type: int
+QUOTE_NONE = ...  # type: int
+QUOTE_NONNUMERIC = ...  # type: int
+
+class Error(Exception): ...
+
+def writer(csvfile, dialect=..., **fmtparams): ...
+def reader(csvfile, dialect=..., **fmtparams): ...
+def register_dialect(name, dialect=..., **fmtparams): ...
+def unregister_dialect(name): ...
+def get_dialect(name): ...
+def list_dialects(): ...
+def field_size_limit(new_limit=...): ...
+
+class Dialect:
+    delimiter = ...  # type: Any
+    quotechar = ...  # type: Any
+    escapechar = ...  # type: Any
+    doublequote = ...  # type: Any
+    skipinitialspace = ...  # type: Any
+    lineterminator = ...  # type: Any
+    quoting = ...  # type: Any
+    def __init__(self) -> None: ...
+
+class excel(Dialect):
+    delimiter = ...  # type: Any
+    quotechar = ...  # type: Any
+    doublequote = ...  # type: Any
+    skipinitialspace = ...  # type: Any
+    lineterminator = ...  # type: Any
+    quoting = ...  # type: Any
+
+class excel_tab(excel):
+    delimiter = ...  # type: Any
+
+class unix_dialect(Dialect):
+    delimiter = ...  # type: Any
+    quotechar = ...  # type: Any
+    doublequote = ...  # type: Any
+    skipinitialspace = ...  # type: Any
+    lineterminator = ...  # type: Any
+    quoting = ...  # type: Any
+
+class DictReader(Iterable):
+    restkey = ...  # type: Any
+    restval = ...  # type: Any
+    reader = ...  # type: Any
+    dialect = ...  # type: Any
+    line_num = ...  # type: Any
+    fieldnames = ...  # type: Any # Actually a property
+    def __init__(self, f, fieldnames=..., restkey=..., restval=..., dialect=...,
+                 *args, **kwds): ...
+    def __iter__(self): ...
+    def __next__(self): ...
+
+class DictWriter:
+    fieldnames = ...  # type: Any
+    restval = ...  # type: Any
+    extrasaction = ...  # type: Any
+    writer = ...  # type: Any
+    def __init__(self, f, fieldnames, restval=..., extrasaction=..., dialect=..., *args, **kwds) -> None: ...
+    def writeheader(self): ...
+    def writerow(self, rowdict): ...
+    def writerows(self, rowdicts): ...
+
+class Sniffer:
+    preferred = ...  # type: Any
+    def __init__(self) -> None: ...
+    def sniff(self, sample, delimiters=...): ...
+    def has_header(self, sample): ...
diff --git a/typeshed/stdlib/3/curses/__init__.pyi b/typeshed/stdlib/3/curses/__init__.pyi
new file mode 100644
index 0000000..63a4bd9
--- /dev/null
+++ b/typeshed/stdlib/3/curses/__init__.pyi
@@ -0,0 +1,12 @@
+# Stubs for curses (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from _curses import *  # noqa: F403
+# Stubgen imports a python version of has_key only if it's not present
+# in _curses (which it is in this stub)
+# from .has_key import has_key as has_key
+
+def initscr(): ...
+def start_color(): ...
+def wrapper(func, *args, **kwds): ...
diff --git a/typeshed/stdlib/3/datetime.pyi b/typeshed/stdlib/3/datetime.pyi
new file mode 100644
index 0000000..7925226
--- /dev/null
+++ b/typeshed/stdlib/3/datetime.pyi
@@ -0,0 +1,223 @@
+# Stubs for datetime
+
+# NOTE: These are incomplete!
+
+from typing import Optional, SupportsAbs, Tuple, overload
+
+MINYEAR = 0
+MAXYEAR = 0
+
+TimeTuple = Tuple[int, int, int, int, int, int, int, int, int]
+
+class tzinfo:
+    def tzname(self, dt: Optional[datetime]) -> str: ...
+    def utcoffset(self, dt: Optional[datetime]) -> Optional[timedelta]: ...
+    def dst(self, dt: Optional[datetime]) -> Optional[timedelta]: ...
+    def fromutc(self, dt: datetime) -> datetime: ...
+
+class timezone(tzinfo):
+    utc = ...  # type: timezone
+    min = ...  # type: timezone
+    max = ...  # type: timezone
+
+    def __init__(self, offset: timedelta, name: str = ...) -> None: ...
+    def __hash__(self) -> int: ...
+
+_tzinfo = tzinfo
+_timezone = timezone
+
+class date:
+    min = ...  # type: date
+    max = ...  # type: date
+    resolution = ...  # type: timedelta
+
+    def __init__(self, year: int, month: int = ..., day: int = ...) -> None: ...
+
+    @classmethod
+    def fromtimestamp(cls, t: float) -> date: ...
+    @classmethod
+    def today(cls) -> date: ...
+    @classmethod
+    def fromordinal(cls, n: int) -> date: ...
+
+    @property
+    def year(self) -> int: ...
+    @property
+    def month(self) -> int: ...
+    @property
+    def day(self) -> int: ...
+
+    def ctime(self) -> str: ...
+    def strftime(self, fmt: str) -> str: ...
+    def __format__(self, fmt: str) -> str: ...
+    def isoformat(self) -> str: ...
+    def timetuple(self) -> tuple: ...  # TODO return type
+    def toordinal(self) -> int: ...
+    def replace(self, year: int = ..., month: int = ..., day: int = ...) -> date: ...
+    def __le__(self, other: date) -> bool: ...
+    def __lt__(self, other: date) -> bool: ...
+    def __ge__(self, other: date) -> bool: ...
+    def __gt__(self, other: date) -> bool: ...
+    def __add__(self, other: timedelta) -> date: ...
+    @overload
+    def __sub__(self, other: timedelta) -> date: ...
+    @overload
+    def __sub__(self, other: date) -> timedelta: ...
+    def __hash__(self) -> int: ...
+    def weekday(self) -> int: ...
+    def isoweekday(self) -> int: ...
+    def isocalendar(self) -> Tuple[int, int, int]: ...
+
+class time:
+    min = ...  # type: time
+    max = ...  # type: time
+    resolution = ...  # type: timedelta
+
+    def __init__(self, hour: int = ..., minute: int = ..., second: int = ..., microsecond: int = ...,
+                 tzinfo: Optional[tzinfo] = ...) -> None: ...
+
+    @property
+    def hour(self) -> int: ...
+    @property
+    def minute(self) -> int: ...
+    @property
+    def second(self) -> int: ...
+    @property
+    def microsecond(self) -> int: ...
+    @property
+    def tzinfo(self) -> Optional[_tzinfo]: ...
+
+    def __le__(self, other: time) -> bool: ...
+    def __lt__(self, other: time) -> bool: ...
+    def __ge__(self, other: time) -> bool: ...
+    def __gt__(self, other: time) -> bool: ...
+    def __hash__(self) -> int: ...
+    def isoformat(self) -> str: ...
+    def strftime(self, fmt: str) -> str: ...
+    def __format__(self, fmt: str) -> str: ...
+    def utcoffset(self) -> Optional[timedelta]: ...
+    def tzname(self) -> Optional[str]: ...
+    def dst(self) -> Optional[int]: ...
+    def replace(self, hour: int = ..., minute: int = ..., second: int = ...,
+                microsecond: int = ..., tzinfo: Optional[_tzinfo] = None) -> time: ...
+
+_date = date
+_time = time
+
+class timedelta(SupportsAbs[timedelta]):
+    min = ...  # type: timedelta
+    max = ...  # type: timedelta
+    resolution = ...  # type: timedelta
+
+    def __init__(self, days: float = ..., seconds: float = ..., microseconds: float = ...,
+                 milliseconds: float = ..., minutes: float = ..., hours: float = ...,
+                 weeks: float = ...) -> None: ...
+
+    @property
+    def days(self) -> int: ...
+    @property
+    def seconds(self) -> int: ...
+    @property
+    def microseconds(self) -> int: ...
+
+    def total_seconds(self) -> float: ...
+    def __add__(self, other: timedelta) -> timedelta: ...
+    def __radd__(self, other: timedelta) -> timedelta: ...
+    def __sub__(self, other: timedelta) -> timedelta: ...
+    def __rsub(self, other: timedelta) -> timedelta: ...
+    def __neg__(self) -> timedelta: ...
+    def __pos__(self) -> timedelta: ...
+    def __abs__(self) -> timedelta: ...
+    def __mul__(self, other: float) -> timedelta: ...
+    def __rmul__(self, other: float) -> timedelta: ...
+    @overload
+    def __floordiv__(self, other: timedelta) -> int: ...
+    @overload
+    def __floordiv__(self, other: int) -> timedelta: ...
+    @overload
+    def __truediv__(self, other: timedelta) -> float: ...
+    @overload
+    def __truediv__(self, other: float) -> timedelta: ...
+    def __mod__(self, other: timedelta) -> timedelta: ...
+    def __divmod__(self, other: timedelta) -> Tuple[int, timedelta]: ...
+    def __le__(self, other: timedelta) -> bool: ...
+    def __lt__(self, other: timedelta) -> bool: ...
+    def __ge__(self, other: timedelta) -> bool: ...
+    def __gt__(self, other: timedelta) -> bool: ...
+    def __hash__(self) -> int: ...
+
+
+class datetime:
+    # TODO: Is a subclass of date, but this would make some types incompatible.
+    min = ...  # type: datetime
+    max = ...  # type: datetime
+    resolution = ...  # type: timedelta
+
+    def __init__(self, year: int, month: int = ..., day: int = ..., hour: int = ...,
+                 minute: int = ..., second: int = ..., microsecond: int = ...,
+                 tzinfo: Optional[tzinfo] = ...) -> None: ...
+
+    @property
+    def year(self) -> int: ...
+    @property
+    def month(self) -> int: ...
+    @property
+    def day(self) -> int: ...
+    @property
+    def hour(self) -> int: ...
+    @property
+    def minute(self) -> int: ...
+    @property
+    def second(self) -> int: ...
+    @property
+    def microsecond(self) -> int: ...
+    @property
+    def tzinfo(self) -> Optional[_tzinfo]: ...
+
+    @classmethod
+    def fromtimestamp(cls, t: float, tz: Optional[_tzinfo] = ...) -> datetime: ...
+    @classmethod
+    def utcfromtimestamp(cls, t: float) -> datetime: ...
+    @classmethod
+    def today(cls) -> datetime: ...
+    @classmethod
+    def fromordinal(cls, n: int) -> datetime: ...
+    @classmethod
+    def now(cls, tz: Optional[_tzinfo] = ...) -> datetime: ...
+    @classmethod
+    def utcnow(cls) -> datetime: ...
+    @classmethod
+    def combine(cls, date: date, time: time) -> datetime: ...
+    def strftime(self, fmt: str) -> str: ...
+    def __format__(self, fmt: str) -> str: ...
+    def toordinal(self) -> int: ...
+    def timetuple(self) -> TimeTuple: ...  # TODO return type
+    def timestamp(self) -> float: ...
+    def utctimetuple(self) -> TimeTuple: ...  # TODO return type
+    def date(self) -> _date: ...
+    def time(self) -> _time: ...
+    def timetz(self) -> _time: ...
+    def replace(self, year: int = ..., month: int = ..., day: int = ..., hour: int = ...,
+                minute: int = ..., second: int = ..., microsecond: int = ..., tzinfo:
+                Optional[_tzinfo] = None) -> datetime: ...
+    def astimezone(self, tz: Optional[_tzinfo] = ...) -> datetime: ...
+    def ctime(self) -> str: ...
+    def isoformat(self, sep: str = ...) -> str: ...
+    @classmethod
+    def strptime(cls, date_string: str, format: str) -> datetime: ...
+    def utcoffset(self) -> Optional[timedelta]: ...
+    def tzname(self) -> Optional[str]: ...
+    def dst(self) -> Optional[int]: ...
+    def __le__(self, other: datetime) -> bool: ...
+    def __lt__(self, other: datetime) -> bool: ...
+    def __ge__(self, other: datetime) -> bool: ...
+    def __gt__(self, other: datetime) -> bool: ...
+    def __add__(self, other: timedelta) -> datetime: ...
+    @overload
+    def __sub__(self, other: datetime) -> timedelta: ...
+    @overload
+    def __sub__(self, other: timedelta) -> datetime: ...
+    def __hash__(self) -> int: ...
+    def weekday(self) -> int: ...
+    def isoweekday(self) -> int: ...
+    def isocalendar(self) -> Tuple[int, int, int]: ...
diff --git a/typeshed/stdlib/3/decimal.pyi b/typeshed/stdlib/3/decimal.pyi
new file mode 100644
index 0000000..5106e46
--- /dev/null
+++ b/typeshed/stdlib/3/decimal.pyi
@@ -0,0 +1,256 @@
+# Stubs for decimal (Python 3.4)
+
+from typing import (
+    Any, Union, SupportsInt, SupportsFloat, SupportsAbs, SupportsRound, Sequence,
+    Tuple, NamedTuple, Dict
+)
+
+_Decimal = Union[Decimal, int]
+_ComparableNum = Union[Decimal, int, float]
+
+BasicContext = ...  # type: Context
+DefaultContext = ...  # type: Context
+ExtendedContext = ...  # type: Context
+HAVE_THREADS = ...  # type: bool
+MAX_EMAX = ...  # type: int
+MAX_PREC = ...  # type: int
+MIN_EMIN = ...  # type: int
+MIN_ETINY = ...  # type: int
+ROUND_05UP = ...  # type: str
+ROUND_CEILING = ...  # type: str
+ROUND_DOWN = ...  # type: str
+ROUND_FLOOR = ...  # type: str
+ROUND_HALF_DOWN = ...  # type: str
+ROUND_HALF_EVEN = ...  # type: str
+ROUND_HALF_UP = ...  # type: str
+ROUND_UP = ...  # type: str
+
+def getcontext() -> Context: ...
+def localcontext(ctx: Context = ...) -> _ContextManager: ...
+def setcontext(c: Context) -> None: ...
+
+DecimalTuple = NamedTuple('DecimalTuple',
+                          [('sign', int),
+                           ('digits', Sequence[int]),  # TODO: Use Tuple[int, ...]
+                           ('exponent', int)])
+
+class _ContextManager:
+    def __enter__(self) -> Context: ...
+    def __exit__(self, t, v, tb) -> None: ...
+
+class Context:
+    Emax = ...  # type: int
+    Emin = ...  # type: int
+    capitals = ...  # type: int
+    clamp = ...  # type: int
+    prec = ...  # type: int
+    rounding = ...  # type: str
+    traps = ...  # type: Dict[type, bool]
+    def __init__(self, prec: int = ..., rounding: str = ..., Emin: int = ..., Emax: int = ...,
+                 capitals: int = ..., clamp: int = ..., flags=..., traps=...,
+                 _ignored_flags=...) -> None: ...
+    def Etiny(self): ...
+    def Etop(self): ...
+    def abs(self, x: _Decimal) -> Decimal: ...
+    def add(self, x: _Decimal, y: _Decimal) -> Decimal: ...
+    def canonical(self, x): ...
+    def clear_flags(self): ...
+    def clear_traps(self): ...
+    def compare(self, x, y): ...
+    def compare_signal(self, x, y): ...
+    def compare_total(self, x, y): ...
+    def compare_total_mag(self, x, y): ...
+    def copy(self): ...
+    def copy_abs(self, x): ...
+    def copy_decimal(self, x): ...
+    def copy_negate(self, x): ...
+    def copy_sign(self, x, y): ...
+    def create_decimal(self, x): ...
+    def create_decimal_from_float(self, f): ...
+    def divide(self, x, y): ...
+    def divide_int(self, x, y): ...
+    def divmod(self, x, y): ...
+    def exp(self, x): ...
+    def fma(self, x, y, z): ...
+    def is_canonical(self, x): ...
+    def is_finite(self, x): ...
+    def is_infinite(self, x): ...
+    def is_nan(self, x): ...
+    def is_normal(self, x): ...
+    def is_qnan(self, x): ...
+    def is_signed(self, x): ...
+    def is_snan(self): ...
+    def is_subnormal(self, x): ...
+    def is_zero(self, x): ...
+    def ln(self, x): ...
+    def log10(self, x): ...
+    def logb(self, x): ...
+    def logical_and(self, x, y): ...
+    def logical_invert(self, x): ...
+    def logical_or(self, x, y): ...
+    def logical_xor(self, x, y): ...
+    def max(self, x, y): ...
+    def max_mag(self, x, y): ...
+    def min(self, x, y): ...
+    def min_mag(self, x, y): ...
+    def minus(self, x): ...
+    def multiply(self, x, y): ...
+    def next_minus(self, x): ...
+    def next_plus(self, x): ...
+    def next_toward(self, x): ...
+    def normalize(self, x): ...
+    def number_class(self, x): ...
+    def plus(self, x): ...
+    def power(self, x, y): ...
+    def quantize(self, x, y): ...
+    def radix(self): ...
+    def remainder(self, x, y): ...
+    def remainder_near(self, x, y): ...
+    def rotate(self, x, y): ...
+    def same_quantum(self, x, y): ...
+    def scaleb(self, x, y): ...
+    def shift(self, x, y): ...
+    def sqrt(self, x): ...
+    def subtract(self, x, y): ...
+    def to_eng_string(self, x): ...
+    def to_integral(self, x): ...
+    def to_integral_exact(self, x): ...
+    def to_integral_value(self, x): ...
+    def to_sci_string(self, x): ...
+    def __copy__(self) -> Context: ...
+    def __delattr__(self, name): ...
+    def __reduce__(self): ...
+
+class ConversionSyntax(InvalidOperation): ...
+
+class Decimal(SupportsInt, SupportsFloat, SupportsAbs[Decimal], SupportsRound[int]):
+    # TODO: SupportsCeil, SupportsFloor, SupportsTrunc?
+
+    def __init__(cls, value: Union[_Decimal, float, str,
+                                   Tuple[int, Sequence[int], int]] = ...,
+                 context: Context = ...) -> None: ...
+
+    @property
+    def imag(self) -> Decimal: ...
+    @property
+    def real(self) -> Decimal: ...
+
+    def adjusted(self) -> int: ...
+    def as_tuple(self) -> DecimalTuple: ...
+    def canonical(self) -> Decimal: ...
+    def compare(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def compare_signal(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def compare_total(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def compare_total_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def conjugate(self) -> Decimal: ...
+    def copy_abs(self) -> Decimal: ...
+    def copy_negate(self) -> Decimal: ...
+    def copy_sign(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def exp(self, context: Context = ...) -> Decimal: ...
+    def fma(self, other: _Decimal, third: _Decimal, context: Context = ...) -> Decimal: ...
+    @classmethod
+    def from_float(cls, f: float) -> Decimal: ...
+    def is_canonical(self) -> bool: ...
+    def is_finite(self) -> bool: ...
+    def is_infinite(self) -> bool: ...
+    def is_nan(self) -> bool: ...
+    def is_normal(self, context: Context = ...) -> bool: ...
+    def is_qnan(self) -> bool: ...
+    def is_signed(self) -> bool: ...
+    def is_snan(self) -> bool: ...
+    def is_subnormal(self, context: Context = ...) -> bool: ...
+    def is_zero(self) -> bool: ...
+    def ln(self, context: Context = ...) -> Decimal: ...
+    def log10(self, context: Context = ...) -> Decimal: ...
+    def logb(self, context: Context = ...) -> Decimal: ...
+    def logical_and(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def logical_invert(self, context: Context = ...) -> Decimal: ...
+    def logical_or(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def logical_xor(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def max(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def max_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def min(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def min_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def next_minus(self, context: Context = ...) -> Decimal: ...
+    def next_plus(self, context: Context = ...) -> Decimal: ...
+    def next_toward(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def normalize(self, context: Context = ...) -> Decimal: ...
+    def number_class(self, context: Context = ...) -> str: ...
+    def quantize(self, exp: _Decimal, rounding: str = ...,
+                 context: Context = ...) -> Decimal: ...
+    def radix(self) -> Decimal: ...
+    def remainder_near(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def rotate(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def same_quantum(self, other: _Decimal, context: Context = ...) -> bool: ...
+    def scaleb(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def shift(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+    def sqrt(self, context: Context = ...) -> Decimal: ...
+    def to_eng_string(self, context: Context = ...) -> str: ...
+    def to_integral(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+    def to_integral_exact(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+    def to_integral_value(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+    def __abs__(self) -> Decimal: ...
+    def __add__(self, other: _Decimal) -> Decimal: ...
+    def __bool__(self) -> bool: ...
+    def __ceil__(self) -> int: ...
+    def __complex__(self) -> complex: ...
+    def __copy__(self) -> Decimal: ...
+    def __deepcopy__(self) -> Decimal: ...
+    def __divmod__(self, other: _Decimal) -> Tuple[Decimal, Decimal]: ...
+    def __eq__(self, other: object) -> bool: ...
+    def __float__(self) -> float: ...
+    def __floor__(self) -> int: ...
+    def __floordiv__(self, other: _Decimal) -> Decimal: ...
+    def __format__(self, specifier, context=..., _localeconv=...) -> str: ...
+    def __ge__(self, other: _ComparableNum) -> bool: ...
+    def __gt__(self, other: _ComparableNum) -> bool: ...
+    def __hash__(self) -> int: ...
+    def __int__(self) -> int: ...
+    def __le__(self, other: _ComparableNum) -> bool: ...
+    def __lt__(self, other: _ComparableNum) -> bool: ...
+    def __mod__(self, other: _Decimal) -> Decimal: ...
+    def __mul__(self, other: _Decimal) -> Decimal: ...
+    def __ne__(self, other: object) -> bool: ...
+    def __neg__(self) -> Decimal: ...
+    def __pos__(self) -> Decimal: ...
+    def __pow__(self, other: _Decimal) -> Decimal: ...
+    def __radd__(self, other: int) -> Decimal: ...
+    def __rdivmod__(self, other: int) -> Tuple[Decimal, Decimal]: ...
+    def __reduce__(self): ...
+    def __rfloordiv__(self, other: int) -> Decimal: ...
+    def __rmod__(self, other: int) -> Decimal: ...
+    def __rmul__(self, other: int) -> Decimal: ...
+    def __round__(self, n=...) -> int: ...
+    def __rpow__(self, other: int) -> Decimal: ...
+    def __rsub__(self, other: int) -> Decimal: ...
+    def __rtruediv__(self, other: int) -> Decimal: ...
+    def __sizeof__(self) -> int: ...
+    def __sub__(self, other: _Decimal) -> Decimal: ...
+    def __truediv__(self, other: _Decimal) -> Decimal: ...
+    def __trunc__(self) -> int: ...
+
+class DecimalException(ArithmeticError): ...
+
+class Clamped(DecimalException): ...
+
+class DivisionByZero(DecimalException, ZeroDivisionError): ...
+
+class DivisionImpossible(InvalidOperation): ...
+
+class DivisionUndefined(InvalidOperation, ZeroDivisionError): ...
+
+class FloatOperation(DecimalException, TypeError): ...
+
+class Inexact(DecimalException): ...
+
+class InvalidContext(InvalidOperation): ...
+
+class InvalidOperation(DecimalException): ...
+
+class Overflow(Inexact, Rounded): ...
+
+class Rounded(DecimalException): ...
+
+class Subnormal(DecimalException): ...
+
+class Underflow(Inexact, Rounded, Subnormal): ...
diff --git a/typeshed/stdlib/3/difflib.pyi b/typeshed/stdlib/3/difflib.pyi
new file mode 100644
index 0000000..eaf068e
--- /dev/null
+++ b/typeshed/stdlib/3/difflib.pyi
@@ -0,0 +1,62 @@
+# Stubs for difflib
+
+# Based on https://docs.python.org/3.2/library/difflib.html
+
+from typing import (
+    TypeVar, Callable, Iterable, Iterator, List, NamedTuple, Sequence, Tuple,
+    Generic, Optional
+)
+
+_T = TypeVar('_T')
+
+class SequenceMatcher(Generic[_T]):
+    def __init__(self, isjunk: Optional[Callable[[_T], bool]] = ...,
+                 a: Sequence[_T] = ..., b: Sequence[_T] = ...,
+                 autojunk: bool = ...) -> None: ...
+    def set_seqs(self, a: Sequence[_T], b: Sequence[_T]) -> None: ...
+    def set_seq1(self, a: Sequence[_T]) -> None: ...
+    def set_seq2(self, b: Sequence[_T]) -> None: ...
+    def find_longest_match(self, alo: int, ahi: int, blo: int,
+                           bhi: int) -> Tuple[int, int, int]: ...
+    def get_matching_blocks(self) -> List[Tuple[int, int, int]]: ...
+    def get_opcodes(self) -> List[Tuple[str, int, int, int, int]]: ...
+    def get_grouped_opcodes(self, n: int = ...
+                            ) -> Iterable[Tuple[str, int, int, int, int]]: ...
+    def ratio(self) -> float: ...
+    def quick_ratio(self) -> float: ...
+    def real_quick_ratio(self) -> float: ...
+
+def get_close_matches(word: Sequence[_T], possibilities: List[Sequence[_T]],
+                      n: int = ..., cutoff: float = ...) -> List[Sequence[_T]]: ...
+
+class Differ:
+    def __init__(self, linejunk: Callable[[str], bool] = ...,
+                 charjunk: Callable[[str], bool] = ...) -> None: ...
+    def compare(self, a: Sequence[str], b: Sequence[str]) -> Iterator[str]: ...
+
+def IS_LINE_JUNK(str) -> bool: ...
+def IS_CHARACTER_JUNK(str) -> bool: ...
+def unified_diff(a: Sequence[str], b: Sequence[str], fromfile: str = ...,
+                 tofile: str = ..., fromfiledate: str = ..., tofiledate: str = ...,
+                 n: int = ..., lineterm: str = ...) -> Iterator[str]: ...
+def context_diff(a: Sequence[str], b: Sequence[str], fromfile: str=...,
+                 tofile: str = ..., fromfiledate: str = ..., tofiledate: str = ...,
+                 n: int = ..., lineterm: str = ...) -> Iterator[str]: ...
+def ndiff(a: Sequence[str], b: Sequence[str],
+          linejunk: Callable[[str], bool] = ...,
+          charjunk: Callable[[str], bool] = ...
+          ) -> Iterator[str]: ...
+
+class HtmlDiff(object):
+    def __init__(self, tabsize: int = ..., wrapcolumn: int = ...,
+                 linejunk: Callable[[str], bool] = ...,
+                 charjunk: Callable[[str], bool] = ...
+                 ) -> None: ...
+    def make_file(self, fromlines: Sequence[str], tolines: Sequence[str],
+                  fromdesc: str = ..., todesc: str = ..., context: bool = ...,
+                  numlines: int = ...) -> str: ...
+    def make_table(self, fromlines: Sequence[str], tolines: Sequence[str],
+                   fromdesc: str = ..., todesc: str = ..., context: bool = ...,
+                   numlines: int = ...) -> str: ...
+
+def restore(delta: Iterable[str], which: int) -> Iterator[int]: ...
diff --git a/typeshed/stdlib/3/dis.pyi b/typeshed/stdlib/3/dis.pyi
new file mode 100644
index 0000000..c26afc1
--- /dev/null
+++ b/typeshed/stdlib/3/dis.pyi
@@ -0,0 +1,63 @@
+from typing import List, Union, Iterator, Tuple, Optional, Any, IO, NamedTuple
+
+from opcode import (hasconst, hasname, hasjrel, hasjabs, haslocal, hascompare,
+                    hasfree, hasnargs, cmp_op, opname, opmap, HAVE_ARGUMENT,
+                    EXTENDED_ARG, stack_effect)
+
+import types
+
+_have_code = Union[types.MethodType, types.FunctionType, types.CodeType, type]
+_have_code_or_string = Union[_have_code, str, bytes]
+
+
+Instruction = NamedTuple(
+    "Instruction",
+    [
+        ('opname', str),
+        ('opcode', int),
+        ('arg', Optional[int]),
+        ('argval', Any),
+        ('argrepr', str),
+        ('offset', int),
+        ('starts_line', Optional[int]),
+        ('is_jump_target', bool)
+    ]
+)
+
+
+# if sys.version_info >= (3, 4):
+class Bytecode:
+    codeobj = ...  # type: types.CodeType
+    first_line = ...  # type: int
+    def __init__(self, x: _have_code_or_string, *, first_line: int=...,
+                 current_offset: int=...) -> None: ...
+    def __iter__(self) -> Iterator[Instruction]: ...
+    def __repr__(self) -> str: ...
+    def info(self) -> str: ...
+    def dis(self) -> str: ...
+
+    @classmethod
+    def from_traceback(cls, tb: types.TracebackType) -> Bytecode: ...
+
+
+COMPILER_FLAG_NAMES = ...  # type:  Dict[int, str]
+
+
+def pretty_flags(flags: int) -> str: ...
+def findlabels(code: _have_code) -> List[int]: ...
+def findlinestarts(code: _have_code) -> Iterator[Tuple[int, int]]: ...
+
+# Signature changes are not allowed by mypy
+# 'All conditional function variants must have identical signatures'
+# TODO: mypy issue #698
+
+# if sys.version_info >= (3, 2):
+def code_info(x: _have_code_or_string) -> str: ...
+
+# `file` parameter requires sys.version_info >= (3, 4):
+def dis(x: _have_code_or_string = ..., *, file: IO[str] = None) -> None: ...
+def distb(tb: types.TracebackType = ..., *, file: IO[str] = None) -> None: ...
+def disassemble(co: _have_code, lasti: int = ..., *, file: IO[str] = None) -> None: ...
+def show_code(co: _have_code, *, file: IO[str] = None) -> None: ...
+
+def get_instructions(x: _have_code, *, first_line: int = ...) -> Iterator[Instruction]: ...
diff --git a/typeshed/stdlib/3/doctest.pyi b/typeshed/stdlib/3/doctest.pyi
new file mode 100644
index 0000000..5cbdc1f
--- /dev/null
+++ b/typeshed/stdlib/3/doctest.pyi
@@ -0,0 +1,9 @@
+# Stubs for doctest
+
+# NOTE: These are incomplete!
+
+from typing import Any, Tuple
+
+# TODO arguments missing
+def testmod(module: Any = ..., *, name: str = ..., globs: Any = ...,
+            verbose: bool = ...) -> Tuple[int, int]: ...
diff --git a/typeshed/stdlib/3/email/__init__.pyi b/typeshed/stdlib/3/email/__init__.pyi
new file mode 100644
index 0000000..d42a901
--- /dev/null
+++ b/typeshed/stdlib/3/email/__init__.pyi
@@ -0,0 +1,46 @@
+# Stubs for email (Python 3.4)
+
+from typing import Callable, Optional, IO
+import sys
+from email.message import Message
+if sys.version_info >= (3, 3):
+    from email.policy import Policy
+
+if sys.version_info >= (3, 3):
+    def message_from_string(s: str, _class: Callable[[], Message] = ..., *,
+                            policy: Policy = ...) -> Message: ...
+    def message_from_bytes(s: bytes, _class: Callable[[], Message] = ..., *,
+                           policy: Policy = ...) -> Message: ...
+    def message_from_file(fp: IO[str], _class: Callable[[], Message] = ..., *,
+                           policy: Policy = ...) -> Message: ...
+    def message_from_binary_file(fp: IO[bytes],
+                                 _class: Callable[[], Message] = ..., *,
+                                 policy: Policy = ...) -> Message: ...
+elif sys.version_info >= (3, 2):
+    def message_from_string(s: str,
+                            _class: Callable[[], Message] = ..., *,
+                            strict: Optional[bool] = ...) -> Message: ...
+    def message_from_bytes(s: bytes,
+                           _class: Callable[[], Message] = ..., *,
+                           strict: Optional[bool] = ...) -> Message: ...
+    def message_from_file(fp: IO[str],
+                          _class: Callable[[], Message] = ..., *,
+                          strict: Optional[bool] = ...) -> Message: ...
+    def message_from_binary_file(fp: IO[bytes],
+                                 _class: Callable[[], Message] = ..., *,
+                                 strict: Optional[bool] = ...) -> Message: ...
+
+# Names in __all__ with no definition:
+#   base64mime
+#   charset
+#   encoders
+#   errors
+#   feedparser
+#   generator
+#   header
+#   iterators
+#   message
+#   mime
+#   parser
+#   quoprimime
+#   utils
diff --git a/typeshed/stdlib/3/email/charset.pyi b/typeshed/stdlib/3/email/charset.pyi
new file mode 100644
index 0000000..5c674e4
--- /dev/null
+++ b/typeshed/stdlib/3/email/charset.pyi
@@ -0,0 +1,27 @@
+# Stubs for email.charset (Python 3.4)
+
+from typing import List, Optional, Iterator, Any
+
+class Charset:
+    input_charset = ...  # type: str
+    header_encoding = ...  # type: int
+    body_encoding = ...  # type: int
+    output_charset = ...  # type: Optional[str]
+    input_codec = ...  # type: Optional[str]
+    output_codec = ...  # type: Optional[str]
+    def __init__(self, input_charset: str = ...) -> None: ...
+    def get_body_encoding(self) -> str: ...
+    def get_output_charset(self) -> Optional[str]: ...
+    def header_encode(self, string: str) -> str: ...
+    def header_encode_lines(self, string: str,
+                            maxlengths: Iterator[int]) -> List[str]: ...
+    def body_encode(self, string: str) -> str: ...
+    def __str__(self) -> str: ...
+    def __eq__(self, other: Any) -> bool: ...
+    def __ne__(self, other: Any) -> bool: ...
+
+def add_charset(charset: Charset, header_enc: Optional[int] = ...,
+                body_enc: Optional[int] = ...,
+                output_charset: Optional[str] = ...) -> None: ...
+def add_alias(alias: str, canonical: str) -> None: ...
+def add_codec(charset: str, codecname: str) -> None: ...
diff --git a/typeshed/stdlib/3/email/contentmanager.pyi b/typeshed/stdlib/3/email/contentmanager.pyi
new file mode 100644
index 0000000..6f37fba
--- /dev/null
+++ b/typeshed/stdlib/3/email/contentmanager.pyi
@@ -0,0 +1,22 @@
+# Stubs for email.contentmanager (Python 3.4)
+
+from typing import Any, Callable
+import sys
+import email.message
+from email.message import Message
+
+if sys.version_info >= (3, 4):
+
+    EmailMessage = email.message.EmailMessage
+    MIMEPart = email.message.MIMEPart
+
+    class ContentManager:
+        def __init__(self) -> None: ...
+        def get_content(self, msg: Message, *args: Any, **kw: Any) -> Any: ...
+        def set_content(self, msg: Message, obj: Any, *args: Any,
+                        **kw: Any) -> Any: ...
+        def add_get_handler(self, key: str, handler: Callable[..., Any]) -> None: ...
+        def add_set_handler(self, typekey: type,
+                            handler: Callable[..., Any]) -> None: ...
+
+    raw_data_manager = ...  # type: ContentManager
diff --git a/typeshed/stdlib/3/email/encoders.pyi b/typeshed/stdlib/3/email/encoders.pyi
new file mode 100644
index 0000000..bb5c84c
--- /dev/null
+++ b/typeshed/stdlib/3/email/encoders.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.encoders (Python 3.4)
+
+from email.message import Message
+
+def encode_base64(msg: Message) -> None: ...
+def encode_quopri(msg: Message) -> None: ...
+def encode_7or8bit(msg: Message) -> None: ...
+def encode_noop(msg: Message) -> None: ...
diff --git a/typeshed/stdlib/3/email/errors.pyi b/typeshed/stdlib/3/email/errors.pyi
new file mode 100644
index 0000000..b51d7d3
--- /dev/null
+++ b/typeshed/stdlib/3/email/errors.pyi
@@ -0,0 +1,22 @@
+# Stubs for email.errors (Python 3.4)
+
+import sys
+
+class MessageError(Exception): ...
+class MessageParseError(MessageError): ...
+class HeaderParseError(MessageParseError): ...
+class BoundaryError(MessageParseError): ...
+class MultipartConversionError(MessageError, TypeError): ...
+
+class MessageDefect(ValueError): ...
+class NoBoundaryInMultipartDefect(MessageDefect): ...
+class StartBoundaryNotFoundDefect(MessageDefect): ...
+class FirstHeaderLineIsContinuationDefect(MessageDefect): ...
+class MisplacedEnvelopeHeaderDefect(MessageDefect): ...
+class MalformedHeaderDefect(MessageDefect): ...
+class MultipartInvariantViolationDefect(MessageDefect): ...
+class InvalidBase64PaddingDefect(MessageDefect): ...
+class InvalidBase64CharactersDefect(MessageDefect): ...
+if sys.version_info >= (3, 3):
+    class CloseBoundaryNotFoundDefect(MessageDefect): ...
+    class MissingHeaderBodySeparatorDefect(MessageDefect): ...
diff --git a/typeshed/stdlib/3/email/feedparser.pyi b/typeshed/stdlib/3/email/feedparser.pyi
new file mode 100644
index 0000000..a86032d
--- /dev/null
+++ b/typeshed/stdlib/3/email/feedparser.pyi
@@ -0,0 +1,28 @@
+# Stubs for email.feedparser (Python 3.4)
+
+from typing import Callable
+import sys
+from email.message import Message
+if sys.version_info >= (3, 3):
+    from email.policy import Policy
+
+class FeedParser:
+    if sys.version_info >= (3, 3):
+        def __init__(self, _factory: Callable[[], Message] = ..., *,
+                     policy: Policy = ...) -> None: ...
+    else:
+        def __init__(self,
+                     _factory: Callable[[], Message] = ...) -> None: ...
+    def feed(self, data: str) -> None: ...
+    def close(self) -> Message: ...
+
+if sys.version_info >= (3, 2):
+    class BytesFeedParser:
+        if sys.version_info >= (3, 3):
+            def __init__(self, _factory: Callable[[], Message] = ..., *,
+                         policy: Policy = ...) -> None: ...
+        else:
+            def __init__(self,
+                         _factory: Callable[[], Message] = ...) -> None: ...
+        def feed(self, data: str) -> None: ...
+        def close(self) -> Message: ...
diff --git a/typeshed/stdlib/3/email/generator.pyi b/typeshed/stdlib/3/email/generator.pyi
new file mode 100644
index 0000000..4be36d1
--- /dev/null
+++ b/typeshed/stdlib/3/email/generator.pyi
@@ -0,0 +1,45 @@
+# Stubs for email.generator (Python 3.4)
+
+from typing import TextIO, Optional
+import sys
+from email.message import Message
+if sys.version_info >= (3, 3):
+    from email.policy import Policy
+
+class Generator:
+    def clone(self, fp: TextIO) -> 'Generator': ...
+    def write(self, s: str) -> None: ...
+    if sys.version_info >= (3, 3):
+        def __init__(self, outfp: TextIO, mangle_from_: bool = ...,
+                     maxheaderlen: int = ..., *,
+                     policy: Policy = ...) -> None: ...
+    else:
+        def __init__(self, outfp: TextIO,
+                     mangle_from_: bool = ...,
+                     maxheaderlen: int = ...) -> None: ...
+    if sys.version_info >= (3, 2):
+        def flatten(self, msg: Message, unixfrom: bool = ...,
+                    linesep: Optional[str] =...) -> None: ...
+    else:
+        def flatten(self, msg: Message,
+                    unixfrom: bool = ...) -> None: ...
+
+if sys.version_info >= (3, 2):
+    class BytesGenerator:
+        def clone(self, fp: TextIO) -> 'Generator': ...
+        def write(self, s: str) -> None: ...
+        if sys.version_info >= (3, 3):
+            def __init__(self, outfp: TextIO, mangle_from_: bool = ...,
+                         maxheaderlen: int = ..., *,
+                         policy: Policy = ...) -> None: ...
+        else:
+            def __init__(self, outfp: TextIO,
+                         mangle_from_: bool = ...,
+                         maxheaderlen: int = ...) -> None: ...
+        def flatten(self, msg: Message, unixfrom: bool = ...,
+                    linesep: Optional[str] =...) -> None: ...
+
+class DecodedGenerator(Generator):
+    # TODO `fmt` is positional
+    def __init__(self, outfp: TextIO, mangle_from_: bool = ...,
+                 maxheaderlen: int = ..., *, fmt: Optional[str]) -> None: ...
diff --git a/typeshed/stdlib/3/email/header.pyi b/typeshed/stdlib/3/email/header.pyi
new file mode 100644
index 0000000..f446d4a
--- /dev/null
+++ b/typeshed/stdlib/3/email/header.pyi
@@ -0,0 +1,25 @@
+# Stubs for email.header (Python 3.4)
+
+from typing import Union, Optional, Any, List, Tuple
+from email.charset import Charset
+
+class Header:
+    def __init__(self, s: Union[bytes, str, None] = ...,
+                 charset: Union[Charset, str, None] = ...,
+                 maxlinelen: Optional[int] = ...,
+                 header_name: Optional[str] = ..., continuation_ws: str = ...,
+                 errors: str = ...) -> None: ...
+    def append(self, s: Union[bytes, str],
+               charset: Union[Charset, str, None] = ...,
+               errors: str = ...) -> None: ...
+    def encode(self, splitchars: str = ..., maxlinelen: Optional[int] = ...,
+               linesep: str = ...) -> str: ...
+    def __str__(self) -> str: ...
+    def __eq__(self, other: Any) -> bool: ...
+    def __ne__(self, other: Any) -> bool: ...
+
+def decode_header(header: Union[Header, str]) -> List[Tuple[bytes, Optional[str]]]: ...
+def make_header(decoded_seq: List[Tuple[bytes, Optional[str]]],
+                maxlinelen: Optional[int] =...,
+                header_name: Optional[str] = ...,
+                continuation_ws: str = ...) -> Header: ...
diff --git a/typeshed/stdlib/3/email/headerregistry.pyi b/typeshed/stdlib/3/email/headerregistry.pyi
new file mode 100644
index 0000000..a39f0e2
--- /dev/null
+++ b/typeshed/stdlib/3/email/headerregistry.pyi
@@ -0,0 +1,102 @@
+# Stubs for email.headerregistry (Python 3.4)
+
+import datetime as dt
+import sys
+from typing import Dict, Tuple, Optional, Any, Union, Mapping
+from email.errors import MessageDefect
+if sys.version_info >= (3, 3):
+    from email.policy import Policy
+
+if sys.version_info >= (3, 3):
+
+    class BaseHeader(str):
+        @property
+        def name(self) -> str: ...
+        @property
+        def defects(self) -> Tuple[MessageDefect, ...]: ...
+        @property
+        def max_count(self) -> Optional[int]: ...
+        def __new__(cls, name: str, value: Any) -> 'BaseHeader': ...
+        def init(self, *args: Any, **kw: Any) -> None: ...
+        def fold(self, *, policy: Policy) -> str: ...
+
+    class UnstructuredHeader:
+        @classmethod
+        def parse(cls, string: str, kwds: Dict[str, Any]) -> None: ...
+
+    class UniqueUnstructuredHeader(UnstructuredHeader): ...
+
+    class DateHeader:
+        datetime = ...  # type: dt.datetime
+        @classmethod
+        def parse(cls, string: Union[str, dt.datetime],
+                  kwds: Dict[str, Any]) -> None: ...
+
+    class UniqueDateHeader(DateHeader): ...
+
+    class AddressHeader:
+        groups = ...  # type: Tuple[Group, ...]
+        addresses = ...  # type: Tuple[Address, ...]
+        @classmethod
+        def parse(cls, string: str, kwds: Dict[str, Any]) -> None: ...
+
+    class UniqueAddressHeader(AddressHeader): ...
+
+    class SingleAddressHeader(AddressHeader):
+        @property
+        def address(self) -> Address: ...
+
+    class UniqueSingleAddressHeader(SingleAddressHeader): ...
+
+    class MIMEVersionHeader:
+        version = ...  # type: Optional[str]
+        major = ...  # type: Optional[int]
+        minor = ...  # type: Optional[int]
+        @classmethod
+        def parse(cls, string: str, kwds: Dict[str, Any]) -> None: ...
+
+    class ParameterizedMIMEHeader:
+        params = ...  # type: Mapping[str, Any]
+        @classmethod
+        def parse(cls, string: str, kwds: Dict[str, Any]) -> None: ...
+
+    class ContentTypeHeader(ParameterizedMIMEHeader):
+        content_type = ...  # type: str
+        maintype = ...  # type: str
+        subtype = ...  # type: str
+
+    class ContentDispositionHeader(ParameterizedMIMEHeader):
+        content_disposition = ...  # type: str
+
+    class ContentTransferEncoding:
+        cte = ...  # type: str
+        @classmethod
+        def parse(cls, string: str, kwds: Dict[str, Any]) -> None: ...
+
+    class HeaderRegistry:
+        def __init__(self, base_class: BaseHeader = ...,
+                     default_class: BaseHeader = ...,
+                     use_default_map: bool = ...) -> None: ...
+        def map_to_type(self, name: str, cls: BaseHeader) -> None: ...
+        def __getitem__(self, name: str) -> BaseHeader: ...
+        def __call__(self, name: str, value: Any) -> BaseHeader: ...
+
+    class Address:
+        display_name = ...  # type: str
+        username = ...  # type: str
+        domain = ...  # type: str
+        @property
+        def addr_spec(self) -> str: ...
+        def __init__(self, display_name: str = ...,
+                     username: Optional[str] = ...,
+                     domain: Optional[str] = ...,
+                     addr_spec: Optional[str]=...) -> None: ...
+        def __str__(self) -> str: ...
+
+    class Group:
+        display_name = ...  # type: Optional[str]
+        addresses = ...  # type: Tuple[Address, ...]
+        def __init__(self, display_name: Optional[str] = ...,
+                     addresses: Optional[Tuple[Address, ...]] = ...) \
+                     -> None: ...
+        def __str__(self) -> str: ...
diff --git a/typeshed/stdlib/3/email/iterators.pyi b/typeshed/stdlib/3/email/iterators.pyi
new file mode 100644
index 0000000..6a69f39
--- /dev/null
+++ b/typeshed/stdlib/3/email/iterators.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.iterators (Python 3.4)
+
+from typing import Iterator, Optional
+from email.message import Message
+
+def body_line_iterator(msg: Message, decode: bool = ...) -> Iterator[str]: ...
+def typed_subpart_iterator(msg: Message, maintype: str = ...,
+                           subtype: Optional[str] = ...) -> Iterator[str]: ...
diff --git a/typeshed/stdlib/3/email/message.pyi b/typeshed/stdlib/3/email/message.pyi
new file mode 100644
index 0000000..d2068f6
--- /dev/null
+++ b/typeshed/stdlib/3/email/message.pyi
@@ -0,0 +1,130 @@
+# Stubs for email.message (Python 3.4)
+
+from typing import (
+    List, Optional, Union, Tuple, TypeVar, Generator, Sequence, Iterator, Any
+)
+import sys
+from email.charset import Charset
+from email.errors import MessageDefect
+if sys.version_info >= (3, 3):
+    from email.policy import Policy
+if sys.version_info >= (3, 4):
+    from email.contentmanager import ContentManager
+else:
+    ContentManager = object  # Hack so we can reference it in argument types.
+
+_T = TypeVar('_T')
+
+_PayloadType = Union[List[Message], str, bytes]
+_CharsetType = Union[Charset, str, None]
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+_ParamType = Union[str, Tuple[Optional[str], Optional[str], str]]
+
+class Message:
+    preamble = ...  # type: Optional[str]
+    epilogue = ...  # type: Optional[str]
+    defects = ...  # type: List[MessageDefect]
+    def __str__(self) -> str: ...
+    def is_multipart(self) -> bool: ...
+    def set_unixfrom(self, unixfrom: str) -> None: ...
+    def get_unixfrom(self) -> Optional[str]: ...
+    def attach(self, payload: 'Message') -> None: ...
+    def get_payload(self, i: int = ..., decode: bool = ...) \
+                    -> Optional[_PayloadType]: ...
+    def set_payload(self, payload: _PayloadType,
+                    charset: _CharsetType = ...) -> None: ...
+    def set_charset(self, charset: _CharsetType) -> None: ...
+    def get_charset(self) -> _CharsetType: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, name: str) -> bool: ...
+    def __getitem__(self, name: str) -> Optional[str]: ...
+    def __setitem__(self, name: str, val: str) -> None: ...
+    def __delitem__(self, name: str) -> None: ...
+    def keys(self) -> List[str]: ...
+    def values(self) -> List[str]: ...
+    def items(self) -> List[Tuple[str, str]]: ...
+    def get(self, name: str, failobj: _T = ...) -> Union[str, _T]: ...
+    def get_all(self, name: str, failobj: _T = ...) -> Union[List[str], _T]: ...
+    def add_header(self, _name: str, _value: str, **_params: _ParamsType) \
+                   -> None: ...
+    def replace_header(self, _name: str, _value: str) -> None: ...
+    def get_content_type(self) -> str: ...
+    def get_content_maintype(self) -> str: ...
+    def get_content_subtype(self) -> str: ...
+    def get_default_type(self) -> str: ...
+    def set_default_type(self, ctype: str) -> None: ...
+    def get_params(self, failobj: _T = ..., header: str = ...,
+                   unquote: bool = ...) -> Union[List[Tuple[str, str]], _T]: ...
+    def get_param(self, param: str, failobj: _T = ..., header: str = ...,
+                  unquote: bool = ...) -> Union[_T, _ParamType]: ...
+    def del_param(self, param: str, header: str = ...,
+                  requote: bool = ...) -> None: ...
+    def set_type(self, type: str, header: str = ...,
+                 requote: bool = ...) -> None: ...
+    def get_filename(self, failobj: _T = ...) -> Union[_T, str]: ...
+    def get_boundary(self, failobj: _T = ...) -> Union[_T, str]: ...
+    def set_boundary(self, boundary: str) -> None: ...
+    def get_content_charset(self, failobj: _T = ...) -> Union[_T, str]: ...
+    def get_charsets(self, failobj: _T = ...) -> Union[_T, List[str]]: ...
+    def walk(self) -> Generator['Message', None, None]: ...
+    if sys.version_info >= (3, 5):
+        def get_content_disposition(self) -> Optional[str]: ...
+    if sys.version_info >= (3, 4):
+        def as_string(self, unixfrom: bool = ..., maxheaderlen: int = ...,
+                      policy: Optional[Policy] = ...) -> str: ...
+        def as_bytes(self, unixfrom: bool = ...,
+                     policy: Optional[Policy] = ...) -> bytes: ...
+        def __bytes__(self) -> bytes: ...
+        def set_param(self, param: str, value: str, header: str = ...,
+                      requote: bool = ..., charset: str = ...,
+                      language: str = ..., replace: bool = ...) -> None: ...
+    else:
+        def as_string(self, unixfrom: bool = ...,
+                      maxheaderlen: int = ...) -> str: ...
+        def set_param(self, param: str, value: str,
+                      header: str = ..., requote: bool = ...,
+                      charset: str = ..., language: str = ...) -> None: ...
+    if sys.version_info >= (3, 3):
+        def __init__(self, policy: Policy = ...) -> None: ...
+    else:
+        def __init__(self) -> None: ...
+
+class MIMEPart:
+    if sys.version_info >= (3, 3):
+        def __init__(self, policy: Policy = ...) -> None: ...
+    else:
+        def __init__(self) -> None: ...
+    def get_body(self,
+                 preferencelist: Sequence[str] = ...) -> Optional[Message]: ...
+    def iter_attachments(self) -> Iterator[Message]: ...
+    def iter_parts(self) -> Iterator[Message]: ...
+    def get_content(self, *args: Any,
+                    content_manager: Optional[ContentManager] = ...,
+                    **kw: Any) -> Any: ...
+    def set_content(self, *args: Any,
+                    content_manager: Optional[ContentManager] = ...,
+                    **kw: Any) -> None: ...
+    def make_related(self, boundary: Optional[str] = ...) -> None: ...
+    def make_alternative(self, boundary: Optional[str] = ...) -> None: ...
+    def make_mixed(self, boundary: Optional[str] = ...) -> None: ...
+    def add_related(self, *args: Any,
+                    content_manager: Optional[ContentManager] = ...,
+                    **kw: Any) -> None: ...
+    def add_alternative(self, *args: Any,
+                        content_manager: Optional[ContentManager] = ...,
+                        **kw: Any) -> None: ...
+    def add_attachement(self, *args: Any,
+                        content_manager: Optional[ContentManager] = ...,
+                        **kw: Any) -> None: ...
+    def clear(self) -> None: ...
+    def clear_content(self) -> None: ...
+    if sys.version_info >= (3, 4, 2):
+        def is_attachment(self) -> bool: ...
+    else:
+        @property
+        def is_attachment(self) -> bool: ...
+
+class EmailMessage(MIMEPart):
+    def set_content(self, *args: Any,
+                    content_manager: Optional[ContentManager] = ...,
+                    **kw: Any) -> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3/email/mime/__init__.py
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3/email/mime/__init__.py
diff --git a/typeshed/stdlib/3/email/mime/application.pyi b/typeshed/stdlib/3/email/mime/application.pyi
new file mode 100644
index 0000000..1aa0580
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/application.pyi
@@ -0,0 +1,11 @@
+# Stubs for email.mime.application (Python 3.4)
+
+from typing import Callable, Optional, Tuple, Union
+from email.mime.nonmultipart import MIMENonMultipart
+
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+
+class MIMEApplication(MIMENonMultipart):
+    def __init__(self, _data: bytes, _subtype: str = ...,
+                 _encoder: Callable[[MIMEApplication], None] = ...,
+                 **_params: _ParamsType) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/audio.pyi b/typeshed/stdlib/3/email/mime/audio.pyi
new file mode 100644
index 0000000..2d2c90c
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/audio.pyi
@@ -0,0 +1,11 @@
+# Stubs for email.mime.audio (Python 3.4)
+
+from typing import Callable, Optional, Tuple, Union
+from email.mime.nonmultipart import MIMENonMultipart
+
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+
+class MIMEAudio(MIMENonMultipart):
+    def __init__(self, _audiodata: bytes, _subtype: Optional[str] = ...,
+                 _encoder: Callable[[MIMEAudio], None] = ...,
+                 **_params: _ParamsType) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/base.pyi b/typeshed/stdlib/3/email/mime/base.pyi
new file mode 100644
index 0000000..448d34b
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/base.pyi
@@ -0,0 +1,10 @@
+# Stubs for email.mime.base (Python 3.4)
+
+from typing import Optional, Tuple, Union
+import email.message
+
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+
+class MIMEBase(email.message.Message):
+    def __init__(self, _maintype: str, _subtype: str,
+                 **_params: _ParamsType) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/image.pyi b/typeshed/stdlib/3/email/mime/image.pyi
new file mode 100644
index 0000000..9ec5deb
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/image.pyi
@@ -0,0 +1,11 @@
+# Stubs for email.mime.image (Python 3.4)
+
+from typing import Callable, Optional, Tuple, Union
+from email.mime.nonmultipart import MIMENonMultipart
+
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+
+class MIMEImage(MIMENonMultipart):
+    def __init__(self, _imagedata: bytes, _subtype: Optional[str] = ...,
+                 _encoder: Callable[[MIMEImage], None] = ...,
+                 **_params: _ParamsType) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/message.pyi b/typeshed/stdlib/3/email/mime/message.pyi
new file mode 100644
index 0000000..561e8c3
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/message.pyi
@@ -0,0 +1,7 @@
+# Stubs for email.mime.message (Python 3.4)
+
+from email.message import Message
+from email.mime.nonmultipart import MIMENonMultipart
+
+class MIMEMessage(MIMENonMultipart):
+    def __init__(self, _msg: Message, _subtype: str = ...) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/multipart.pyi b/typeshed/stdlib/3/email/mime/multipart.pyi
new file mode 100644
index 0000000..ea5eba1
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/multipart.pyi
@@ -0,0 +1,12 @@
+# Stubs for email.mime.multipart (Python 3.4)
+
+from typing import Optional, Sequence, Tuple, Union
+from email.message import Message
+from email.mime.base import MIMEBase
+
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+
+class MIMEMultipart(MIMEBase):
+    def __init__(self, _subtype: str = ..., boundary: Optional[str] = ...,
+                 _subparts: Optional[Sequence[Message]] = ...,
+                 **_params: _ParamsType) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/nonmultipart.pyi b/typeshed/stdlib/3/email/mime/nonmultipart.pyi
new file mode 100644
index 0000000..1fd3ea9
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/nonmultipart.pyi
@@ -0,0 +1,5 @@
+# Stubs for email.mime.nonmultipart (Python 3.4)
+
+from email.mime.base import MIMEBase
+
+class MIMENonMultipart(MIMEBase): ...
diff --git a/typeshed/stdlib/3/email/mime/text.pyi b/typeshed/stdlib/3/email/mime/text.pyi
new file mode 100644
index 0000000..73adaf5
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/text.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.mime.text (Python 3.4)
+
+from typing import Optional
+from email.mime.nonmultipart import MIMENonMultipart
+
+class MIMEText(MIMENonMultipart):
+    def __init__(self, _text: str, _subtype: str = ...,
+                 _charset: Optional[str] = ...) -> None: ...
diff --git a/typeshed/stdlib/3/email/parser.pyi b/typeshed/stdlib/3/email/parser.pyi
new file mode 100644
index 0000000..d0da73f
--- /dev/null
+++ b/typeshed/stdlib/3/email/parser.pyi
@@ -0,0 +1,61 @@
+# Stubs for email.parser (Python 3.4)
+
+import email.feedparser
+from email.message import Message
+import sys
+from typing import Callable, Optional, TextIO, BinaryIO
+if sys.version_info >= (3, 3):
+    from email.policy import Policy
+
+FeedParser = email.feedparser.FeedParser
+BytesFeedParser = email.feedparser.BytesFeedParser
+
+class Parser:
+    if sys.version_info >= (3, 3):
+        def __init__(self, _class: Callable[[], Message] = ..., *,
+                     policy: Policy = ...) -> None: ...
+    else:
+        # TODO `strict` is positional
+        def __init__(self,
+                     _class: Callable[[], Message] = ..., *,
+                     strict: Optional[bool]) -> None: ...
+    def parse(self, fp: TextIO, headersonly: bool = ...) -> Message: ...
+    def parsestr(self, text: str, headersonly: bool = ...) -> Message: ...
+
+class HeaderParser(Parser):
+    if sys.version_info >= (3, 3):
+        def __init__(self, _class: Callable[[], Message] = ..., *,
+                     policy: Policy = ...) -> None: ...
+    else:
+        # TODO `strict` is positional
+        def __init__(self,
+                     _class: Callable[[], Message] = ..., *,
+                     strict: Optional[bool]) -> None: ...
+    def parse(self, fp: TextIO, headersonly: bool = ...) -> Message: ...
+    def parsestr(self, text: str, headersonly: bool = ...) -> Message: ...
+
+if sys.version_info >= (3, 3):
+    class BytesHeaderParser(BytesParser):
+        if sys.version_info >= (3, 3):
+            def __init__(self, _class: Callable[[], Message] = ..., *,
+                         policy: Policy = ...) -> None: ...
+        else:
+            # TODO `strict` is positional
+            def __init__(self,
+                         _class: Callable[[], Message] = ..., *,
+                         strict: Optional[bool]) -> None: ...
+        def parse(self, fp: BinaryIO, headersonly: bool = ...) -> Message: ...
+        def parsestr(self, text: str, headersonly: bool = ...) -> Message: ...
+
+if sys.version_info >= (3, 2):
+    class BytesParser:
+        if sys.version_info >= (3, 3):
+            def __init__(self, _class: Callable[[], Message] = ..., *,
+                         policy: Policy = ...) -> None: ...
+        else:
+            # TODO `strict` is positional
+            def __init__(self,
+                         _class: Callable[[], Message] = ..., *,
+                         strict: Optional[bool]) -> None: ...
+        def parse(self, fp: BinaryIO, headersonly: bool = ...) -> Message: ...
+        def parsestr(self, text: str, headersonly: bool = ...) -> Message: ...
diff --git a/typeshed/stdlib/3/email/policy.pyi b/typeshed/stdlib/3/email/policy.pyi
new file mode 100644
index 0000000..97f0c51
--- /dev/null
+++ b/typeshed/stdlib/3/email/policy.pyi
@@ -0,0 +1,69 @@
+# Stubs for email.policy (Python 3.4)
+
+from abc import abstractmethod
+from typing import Any, List, Optional, Tuple, Union, Callable
+import sys
+from email.message import Message
+from email.errors import MessageDefect
+from email.header import Header
+if sys.version_info >= (3, 4):
+    from email.contentmanager import ContentManager
+
+if sys.version_info >= (3, 3):
+
+    class Policy:
+        max_line_length = ...  # type: Optional[int]
+        linesep = ...  # type: str
+        cte_type = ...  # type: str
+        raise_on_defect = ...  # type: bool
+        if sys.version_info >= (3, 5):
+            mange_from = ...  # type: bool
+        def __init__(**kw: Any) -> None: ...
+        def clone(**kw: Any) -> 'Policy': ...
+        def handle_defect(self, obj: Message,
+                          defect: MessageDefect) -> None: ...
+        def register_defect(self, obj: Message,
+                            defect: MessageDefect) -> None: ...
+        def header_max_count(self, name: str) -> Optional[int]: ...
+        @abstractmethod
+        def header_source_parse(self, sourcelines: List[str]) -> str: ...
+        @abstractmethod
+        def header_store_parse(self, name: str,
+                               value: str) -> Tuple[str, str]: ...
+        @abstractmethod
+        def header_fetch_parse(self, name: str,
+                               value: str) -> str: ...
+        @abstractmethod
+        def fold(self, name: str, value: str) -> str: ...
+        @abstractmethod
+        def fold_binary(self, name: str, value: str) -> bytes: ...
+
+    class Compat32(Policy):
+        def header_source_parse(self, sourcelines: List[str]) -> str: ...
+        def header_store_parse(self, name: str,
+                               value: str) -> Tuple[str, str]: ...
+        def header_fetch_parse(self, name: str,  # type: ignore
+                               value: str) -> Union[str, Header]: ...
+        def fold(self, name: str, value: str) -> str: ...
+        def fold_binary(self, name: str, value: str) -> bytes: ...
+
+    compat32 = ...  # type: Compat32
+
+    class EmailPolicy(Policy):
+        utf8 = ...  # type: bool
+        refold_source = ...  # type: str
+        header_factory = ...  # type: Callable[[str, str], str]
+        if sys.version_info >= (3, 4):
+            content_manager = ...  # type: ContentManager
+        def header_source_parse(self, sourcelines: List[str]) -> str: ...
+        def header_store_parse(self, name: str,
+                               value: str) -> Tuple[str, str]: ...
+        def header_fetch_parse(self, name: str, value: str) -> str: ...
+        def fold(self, name: str, value: str) -> str: ...
+        def fold_binary(self, name: str, value: str) -> bytes: ...
+
+    default = ...  # type: EmailPolicy
+    SMTP = ...  # type: EmailPolicy
+    SMTPUTF8 = ...  # type: EmailPolicy
+    HTTP = ...  # type: EmailPolicy
+    strict = ...  # type: EmailPolicy
diff --git a/typeshed/stdlib/3/email/utils.pyi b/typeshed/stdlib/3/email/utils.pyi
new file mode 100644
index 0000000..efc93c1
--- /dev/null
+++ b/typeshed/stdlib/3/email/utils.pyi
@@ -0,0 +1,33 @@
+# Stubs for email.utils (Python 3.4)
+
+from typing import List, Optional, Tuple, Union
+from email.charset import Charset
+import datetime
+
+_ParamType = Union[str, Tuple[Optional[str], Optional[str], str]]
+_PDTZ = Tuple[int, int, int, int, int, int, int, int, int, Optional[int]]
+
+def quote(str: str) -> str: ...
+def unquote(str: str) -> str: ...
+def parseaddr(address: str) -> Tuple[str, str]: ...
+def formataddr(pair: Tuple[str, str],
+               charset: Union[str, Charset] = ...) -> str: ...
+def getaddresses(fieldvalues: List[str]) -> List[Tuple[str, str]]: ...
+def parsedate(date: str) -> Optional[Tuple[int, int, int, int, int, int, int, int, int]]: ...
+def parsedate_tz(date: str) -> Optional[_PDTZ]: ...
+def parsedate_to_datetime(date: str) -> datetime.datetime: ...
+def mktime_tz(tuple: _PDTZ) -> int: ...
+def formatdate(timeval: Optional[float] = ..., localtime: bool = ...,
+               usegmt: bool = ...) -> str: ...
+def format_datetime(dt: datetime.datetime, usegmt: bool = ...) -> str: ...
+def localtime(dt: Optional[datetime.datetime] = ...) -> datetime.datetime: ...
+def make_msgid(idstring: Optional[str] = ...,
+               domain: Optional[str] = ...) -> str: ...
+def decode_rfc2231(s: str) -> Tuple[Optional[str], Optional[str], str]: ...
+def encode_rfc2231(s: str, charset: Optional[str] = ...,
+                   language: Optional[str] = ...) -> str: ...
+def collapse_rfc2231_value(value: _ParamType, errors: str = ...,
+                           fallback_charset: str = ...) -> str: ...
+def decode_params(
+    params: List[Tuple[str, str]]
+) -> List[Tuple[str, _ParamType]]: ...
diff --git a/typeshed/stdlib/3/encodings/__init__.pyi b/typeshed/stdlib/3/encodings/__init__.pyi
new file mode 100644
index 0000000..2ae6c0a
--- /dev/null
+++ b/typeshed/stdlib/3/encodings/__init__.pyi
@@ -0,0 +1,6 @@
+import codecs
+
+import typing
+
+def search_function(encoding: str) -> codecs.CodecInfo:
+    ...
diff --git a/typeshed/stdlib/3/encodings/utf_8.pyi b/typeshed/stdlib/3/encodings/utf_8.pyi
new file mode 100644
index 0000000..3be496a
--- /dev/null
+++ b/typeshed/stdlib/3/encodings/utf_8.pyi
@@ -0,0 +1,14 @@
+import codecs
+
+class IncrementalEncoder(codecs.IncrementalEncoder):
+    pass
+class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
+    pass
+class StreamWriter(codecs.StreamWriter):
+    pass
+class StreamReader(codecs.StreamReader):
+    pass
+
+def getregentry() -> codecs.CodecInfo: pass
+def encode(input: str, errors: str = ...) -> bytes: pass
+def decode(input: bytes, errors: str = ...) -> str: pass
diff --git a/typeshed/stdlib/3/fcntl.pyi b/typeshed/stdlib/3/fcntl.pyi
new file mode 100644
index 0000000..a50fa0d
--- /dev/null
+++ b/typeshed/stdlib/3/fcntl.pyi
@@ -0,0 +1,96 @@
+# Stubs for fcntl
+from typing import Any, IO, Union
+import typing
+
+FASYNC = ...  # type: int
+FD_CLOEXEC = ...  # type: int
+DN_ACCESS = ...  # type: int
+DN_ATTRIB = ...  # type: int
+DN_CREATE = ...  # type: int
+DN_DELETE = ...  # type: int
+DN_MODIFY = ...  # type: int
+DN_MULTISHOT = ...  # type: int
+DN_RENAME = ...  # type: int
+F_DUPFD = ...  # type: int
+F_DUPFD_CLOEXEC = ...  # type: int
+F_FULLFSYNC = ...  # type: int
+F_EXLCK = ...  # type: int
+F_GETFD = ...  # type: int
+F_GETFL = ...  # type: int
+F_GETLEASE = ...  # type: int
+F_GETLK = ...  # type: int
+F_GETLK64 = ...  # type: int
+F_GETOWN = ...  # type: int
+F_NOCACHE = ...  # type: int
+F_GETSIG = ...  # type: int
+F_NOTIFY = ...  # type: int
+F_RDLCK = ...  # type: int
+F_SETFD = ...  # type: int
+F_SETFL = ...  # type: int
+F_SETLEASE = ...  # type: int
+F_SETLK = ...  # type: int
+F_SETLK64 = ...  # type: int
+F_SETLKW = ...  # type: int
+F_SETLKW64 = ...  # type: int
+F_SETOWN = ...  # type: int
+F_SETSIG = ...  # type: int
+F_SHLCK = ...  # type: int
+F_UNLCK = ...  # type: int
+F_WRLCK = ...  # type: int
+I_ATMARK = ...  # type: int
+I_CANPUT = ...  # type: int
+I_CKBAND = ...  # type: int
+I_FDINSERT = ...  # type: int
+I_FIND = ...  # type: int
+I_FLUSH = ...  # type: int
+I_FLUSHBAND = ...  # type: int
+I_GETBAND = ...  # type: int
+I_GETCLTIME = ...  # type: int
+I_GETSIG = ...  # type: int
+I_GRDOPT = ...  # type: int
+I_GWROPT = ...  # type: int
+I_LINK = ...  # type: int
+I_LIST = ...  # type: int
+I_LOOK = ...  # type: int
+I_NREAD = ...  # type: int
+I_PEEK = ...  # type: int
+I_PLINK = ...  # type: int
+I_POP = ...  # type: int
+I_PUNLINK = ...  # type: int
+I_PUSH = ...  # type: int
+I_RECVFD = ...  # type: int
+I_SENDFD = ...  # type: int
+I_SETCLTIME = ...  # type: int
+I_SETSIG = ...  # type: int
+I_SRDOPT = ...  # type: int
+I_STR = ...  # type: int
+I_SWROPT = ...  # type: int
+I_UNLINK = ...  # type: int
+LOCK_EX = ...  # type: int
+LOCK_MAND = ...  # type: int
+LOCK_NB = ...  # type: int
+LOCK_READ = ...  # type: int
+LOCK_RW = ...  # type: int
+LOCK_SH = ...  # type: int
+LOCK_UN = ...  # type: int
+LOCK_WRITE = ...  # type: int
+
+_AnyFile = Union[int, IO[Any]]
+
+# TODO All these return either int or bytes depending on the value of
+# cmd (not on the type of arg).
+def fcntl(fd: _AnyFile,
+          cmd: int,
+          arg: Union[int, bytes] = ...) -> Any: ...
+# TODO This function accepts any object supporting a buffer interface,
+# as arg, is there a better way to express this than bytes?
+def ioctl(fd: _AnyFile,
+          request: int,
+          arg: Union[int, bytes] = ...,
+          mutate_flag: bool = ...) -> Any: ...
+def flock(fd: _AnyFile, operation: int) -> None: ...
+def lockf(fd: _AnyFile,
+          cmd: int,
+          len: int = ...,
+          start: int = ...,
+          whence: int = ...) -> Any: ...
diff --git a/typeshed/stdlib/3/fileinput.pyi b/typeshed/stdlib/3/fileinput.pyi
new file mode 100644
index 0000000..dead939
--- /dev/null
+++ b/typeshed/stdlib/3/fileinput.pyi
@@ -0,0 +1,48 @@
+from typing import Iterable, Callable, IO, AnyStr, Generic, Any, Union, Iterator
+
+
+def input(
+    files: Union[str, Iterable[str]]=None,
+    inplace: bool=...,
+    backup: str=...,
+    bufsize: int=...,
+    mode: str=...,
+    openhook: Callable[[str, str], IO[AnyStr]]=...) -> Iterable[AnyStr]: ...
+
+
+def close() -> None: ...
+def nextfile() -> None: ...
+def filename() -> str: ...
+def lineno() -> int: ...
+def isfirstline() -> bool: ...
+def isstdin() -> bool: ...
+
+class FileInput(Iterable[AnyStr], Generic[AnyStr]):
+    def __init__(
+        self,
+        files: Union[str, Iterable[str]]=None,
+        inplace: bool=...,
+        backup: str=...,
+        bufsize: int=...,
+        mode: str=...,
+        openhook: Callable[[str, str], IO[AnyStr]]=...
+    ) -> None: ...
+
+    def __del__(self) -> None: ...
+    def close(self) -> None: ...
+    def __enter__(self) -> 'FileInput[AnyStr]': ...
+    def __exit__(self, type: Any, value: Any, traceback: Any) -> None: ...
+    def __iter__(self) -> Iterator[AnyStr]: ...
+    def __next__(self) -> AnyStr: ...
+    def __getitem__(self, i) -> AnyStr: ...
+    def nextfile(self) -> None: ...
+    def readline(self) -> AnyStr: ...
+    def filename(self) -> str: ...
+    def lineno(self) -> int: ...
+    def filelineno(self) -> int: ...
+    def fileno(self) -> int: ...
+    def isfirstline(self) -> bool: ...
+    def isstdin(self) -> bool: ...
+
+def hook_compressed(filename: str, mode: str) -> IO[AnyStr]: ...
+def hook_encoded(encoding: str) -> IO[AnyStr]: ...
diff --git a/typeshed/stdlib/3/fnmatch.pyi b/typeshed/stdlib/3/fnmatch.pyi
new file mode 100644
index 0000000..4f99b4a
--- /dev/null
+++ b/typeshed/stdlib/3/fnmatch.pyi
@@ -0,0 +1,11 @@
+# Stubs for fnmatch
+
+# Based on http://docs.python.org/3.2/library/fnmatch.html and
+# python-lib/fnmatch.py
+
+from typing import Iterable, List, AnyStr
+
+def fnmatch(name: AnyStr, pat: AnyStr) -> bool: ...
+def fnmatchcase(name: AnyStr, pat: AnyStr) -> bool: ...
+def filter(names: Iterable[AnyStr], pat: AnyStr) -> List[AnyStr]: ...
+def translate(pat: str) -> str: ...
diff --git a/typeshed/stdlib/3/functools.pyi b/typeshed/stdlib/3/functools.pyi
new file mode 100644
index 0000000..b4295c4
--- /dev/null
+++ b/typeshed/stdlib/3/functools.pyi
@@ -0,0 +1,64 @@
+# Stubs for functools (Python 3)
+
+# NOTE: These are incomplete!
+
+from abc import ABCMeta, abstractmethod
+import sys
+from typing import Any, Callable, Generic, Dict, Iterable, Mapping, Optional, Sequence, Tuple, TypeVar, NamedTuple, overload
+from collections import namedtuple
+
+_AnyCallable = Callable[..., Any]
+
+_T = TypeVar("_T")
+_S = TypeVar("_S")
+ at overload
+def reduce(function: Callable[[_T, _S], _T],
+           sequence: Iterable[_S], initial: _T) -> _T: ...
+ at overload
+def reduce(function: Callable[[_T, _T], _T],
+           sequence: Iterable[_T]) -> _T: ...
+
+
+class CacheInfo(NamedTuple('CacheInfo', [
+    ('hits', int), ('misses', int), ('maxsize', int), ('currsize', int)])
+):
+    ...
+
+class _lru_cache_wrapper(Generic[_T]):
+    __wrapped__ = ...  # type: Callable[..., _T]
+    def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
+    def cache_info(self) -> CacheInfo: ...
+
+class lru_cache():
+    def __init__(self, maxsize: Optional[int] = ..., typed: bool = ...) -> None: ...
+    def __call__(self, f: Callable[..., _T]) -> _lru_cache_wrapper[_T]: ...
+
+
+WRAPPER_ASSIGNMENTS = ...  # type: Sequence[str]
+WRAPPER_UPDATES = ...  # type: Sequence[str]
+
+def update_wrapper(wrapper: _AnyCallable, wrapped: _AnyCallable, assigned: Sequence[str] = ...,
+                   updated: Sequence[str] = ...) -> None: ...
+def wraps(wrapped: _AnyCallable, assigned: Sequence[str] = ..., updated: Sequence[str] = ...) -> Callable[[_AnyCallable], _AnyCallable]: ...
+def total_ordering(cls: type) -> type: ...
+def cmp_to_key(mycmp: Callable[[_T, _T], int]) -> Callable[[_T], Any]: ...
+
+class partial(Generic[_T]):
+    func = ...  # type: Callable[..., _T]
+    args = ...  # type: Tuple[Any, ...]
+    keywords = ...  # type: Dict[str, Any]
+    def __init__(self, func: Callable[..., _T], *args: Any, **kwargs: Any) -> None: ...
+    def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
+
+if sys.version_info >= (3, 4):
+    class _SingleDispatchCallable(Generic[_T]):
+        registry = ...  # type: Mapping[Any, Callable[..., _T]]
+        def dispatch(self, cls: Any) -> Callable[..., _T]: ...
+        @overload
+        def register(self, cls: Any) -> Callable[[Callable[..., _T]], Callable[..., _T]]: ...
+        @overload
+        def register(self, cls: Any, func: Callable[..., _T]) -> Callable[..., _T]: ...
+        def _clear_cache(self) -> None: ...
+        def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
+
+    def singledispatch(func: Callable[..., _T]) -> _SingleDispatchCallable[_T]: ...
diff --git a/typeshed/stdlib/3/gc.pyi b/typeshed/stdlib/3/gc.pyi
new file mode 100644
index 0000000..ec94f29
--- /dev/null
+++ b/typeshed/stdlib/3/gc.pyi
@@ -0,0 +1,28 @@
+# Stubs for gc
+
+from typing import Any, Dict, List, Tuple
+
+
+DEBUG_COLLECTABLE = ...  # type: int
+DEBUG_LEAK = ...  # type: int
+DEBUG_SAVEALL = ...  # type: int
+DEBUG_STATS = ...  # type: int
+DEBUG_UNCOLLECTABLE = ...  # type: int
+callbacks = ...  # type: List[Any]
+garbage = ...  # type: List[Any]
+
+def collect(generations: int = ...) -> int: ...
+def disable() -> None: ...
+def enable() -> None: ...
+def get_count() -> Tuple[int, int, int]: ...
+def get_debug() -> int: ...
+def get_objects() -> List[Any]: ...
+def get_referents(*objs: Any) -> List[Any]: ...
+def get_referrers(*objs: Any) -> List[Any]: ...
+def get_stats() -> List[Dict[str, Any]]: ...
+def get_threshold() -> Tuple[int, int, int]: ...
+def is_tracked(obj: Any) -> bool: ...
+def isenabled() -> bool: ...
+def set_debug(flags: int) -> None: ...
+def set_threshold(threshold0: int, threshold1: int = ...,
+                  threshold2: int = ...) -> None: ...
diff --git a/typeshed/stdlib/3/getopt.pyi b/typeshed/stdlib/3/getopt.pyi
new file mode 100644
index 0000000..dc75699
--- /dev/null
+++ b/typeshed/stdlib/3/getopt.pyi
@@ -0,0 +1,19 @@
+# Stubs for getopt
+
+# Based on http://docs.python.org/3.2/library/getopt.html
+
+from typing import List, Tuple
+
+def getopt(args: List[str], shortopts: str,
+           longopts: List[str]=...) -> Tuple[List[Tuple[str, str]],
+                                             List[str]]: ...
+
+def gnu_getopt(args: List[str], shortopts: str,
+               longopts: List[str]=...) -> Tuple[List[Tuple[str, str]],
+                                                 List[str]]: ...
+
+class GetoptError(Exception):
+    msg = ...  # type: str
+    opt = ...  # type: str
+
+error = GetoptError
diff --git a/typeshed/stdlib/3/getpass.pyi b/typeshed/stdlib/3/getpass.pyi
new file mode 100644
index 0000000..73c0cb9
--- /dev/null
+++ b/typeshed/stdlib/3/getpass.pyi
@@ -0,0 +1,13 @@
+# Stubs for getpass
+
+from typing import TextIO
+
+
+def getpass(prompt: str = ..., stream: TextIO = None) -> str: ...
+
+
+def getuser() -> str: ...
+
+
+class GetPassWarning(UserWarning):
+    pass
diff --git a/typeshed/stdlib/3/gettext.pyi b/typeshed/stdlib/3/gettext.pyi
new file mode 100644
index 0000000..04bf34a
--- /dev/null
+++ b/typeshed/stdlib/3/gettext.pyi
@@ -0,0 +1,44 @@
+# Stubs for gettext (Python 3.4)
+
+from typing import Any, IO, List, Optional, Union, Callable
+
+class NullTranslations:
+    def __init__(self, fp: IO[str] = ...) -> None: ...
+    def add_fallback(self, fallback: NullTranslations) -> None: ...
+    def gettext(self, message: str) -> str: ...
+    def lgettext(self, message: str) -> str: ...
+    def ngettext(self, singular: str, plural: str, n: int) -> str: ...
+    def lngettext(self, singular: str, plural: str, n: int) -> str: ...
+    def info(self) -> Any: ...
+    def charset(self) -> Any: ...
+    def output_charset(self) -> Any: ...
+    def set_output_charset(self, charset: Any) -> None: ...
+    def install(self, names: List[str] = ...) -> None: ...
+
+class GNUTranslations(NullTranslations):
+    LE_MAGIC = ...  # type: int
+    BE_MAGIC = ...  # type: int
+
+def find(domain: str, localedir: str = ..., languages: List[str] = ...,
+         all: bool = ...): ...
+
+def translation(domain: str, localedir: str = ..., languages: List[str] = ...,
+                class_: Callable[[IO[str]], NullTranslations] = ...,
+                fallback: bool =..., codeset: Any = ...) -> NullTranslations: ...
+
+def install(domain: str, localedir: str = ..., codeset: Any = ...,
+            names: List[str] = ...): ...
+
+def textdomain(domain: str = ...) -> str: ...
+def bindtextdomain(domain: str, localedir: str = ...) -> str: ...
+def bind_textdomain_codeset(domain: str, codeset: str = ...) -> str: ...
+def dgettext(domain: str, message: str) -> str: ...
+def ldgettext(domain: str, message: str) -> str: ...
+def dngettext(domain: str, singular: str, plural: str, n: int) -> str: ...
+def ldngettext(domain: str, singular: str, plural: str, n: int) -> str: ...
+def gettext(message: str) -> str: ...
+def lgettext(message: str) -> str: ...
+def ngettext(singular: str, plural: str, n: int) -> str: ...
+def lngettext(singular: str, plural: str, n: int) -> str: ...
+
+Catalog = translation
diff --git a/typeshed/stdlib/3/glob.pyi b/typeshed/stdlib/3/glob.pyi
new file mode 100644
index 0000000..ab58e9a
--- /dev/null
+++ b/typeshed/stdlib/3/glob.pyi
@@ -0,0 +1,15 @@
+# Stubs for glob
+# Based on http://docs.python.org/3/library/glob.html
+
+from typing import List, Iterator, AnyStr
+import sys
+
+if sys.version_info >= (3, 5):
+    def glob(pathname: AnyStr, *, recursive: bool = ...) -> List[AnyStr]: ...
+    def iglob(pathname: AnyStr, *, recursive: bool = ...) -> Iterator[AnyStr]: ...
+else:
+    def glob(pathname: AnyStr) -> List[AnyStr]: ...
+    def iglob(pathname: AnyStr) -> Iterator[AnyStr]: ...
+
+if sys.version_info >= (3, 4):
+    def escape(pathname: AnyStr) -> AnyStr: ...
diff --git a/typeshed/stdlib/3/grp.pyi b/typeshed/stdlib/3/grp.pyi
new file mode 100644
index 0000000..ad14951
--- /dev/null
+++ b/typeshed/stdlib/3/grp.pyi
@@ -0,0 +1,13 @@
+from typing import List
+
+# TODO group database entry object type
+
+class struct_group:
+    gr_name = ...  # type: str
+    gr_passwd = ...  # type: str
+    gr_gid = 0
+    gr_mem = ...  # type: List[str]
+
+def getgrgid(gid: int) -> struct_group: ...
+def getgrnam(name: str) -> struct_group: ...
+def getgrall() -> List[struct_group]: ...
diff --git a/typeshed/stdlib/3/gzip.pyi b/typeshed/stdlib/3/gzip.pyi
new file mode 100644
index 0000000..44d8064
--- /dev/null
+++ b/typeshed/stdlib/3/gzip.pyi
@@ -0,0 +1,51 @@
+# Stubs for gzip (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import _compression
+
+def open(filename, mode='', compresslevel=9, encoding=None, errors=None, newline=None): ...
+
+class _PaddedFile:
+    file = ...  # type: Any
+    def __init__(self, f, prepend=b''): ...
+    def read(self, size): ...
+    def prepend(self, prepend=b''): ...
+    def seek(self, off): ...
+    def seekable(self): ...
+
+class GzipFile(_compression.BaseStream):
+    myfileobj = ...  # type: Any
+    mode = ...  # type: Any
+    name = ...  # type: Any
+    compress = ...  # type: Any
+    fileobj = ...  # type: Any
+    def __init__(self, filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None): ...
+    @property
+    def filename(self): ...
+    @property
+    def mtime(self): ...
+    crc = ...  # type: Any
+    def write(self, data): ...
+    def read(self, size=-1): ...
+    def read1(self, size=-1): ...
+    def peek(self, n): ...
+    @property
+    def closed(self): ...
+    def close(self): ...
+    def flush(self, zlib_mode=...): ...
+    def fileno(self): ...
+    def rewind(self): ...
+    def readable(self): ...
+    def writable(self): ...
+    def seekable(self): ...
+    def seek(self, offset, whence=...): ...
+    def readline(self, size=-1): ...
+
+class _GzipReader(_compression.DecompressReader):
+    def __init__(self, fp): ...
+    def read(self, size=-1): ...
+
+def compress(data, compresslevel=9): ...
+def decompress(data): ...
diff --git a/typeshed/stdlib/3/hashlib.pyi b/typeshed/stdlib/3/hashlib.pyi
new file mode 100644
index 0000000..4d3709b
--- /dev/null
+++ b/typeshed/stdlib/3/hashlib.pyi
@@ -0,0 +1,40 @@
+# Stubs for hashlib
+
+from abc import abstractmethod, ABCMeta
+from typing import AbstractSet
+
+class Hash(metaclass=ABCMeta):
+    digest_size = ...  # type: int
+    block_size = ...  # type: int
+
+    # [Python documentation note] Changed in version 3.4: The name attribute has
+    # been present in CPython since its inception, but until Python 3.4 was not
+    # formally specified, so may not exist on some platforms
+    name = ...  # type: str
+
+    @abstractmethod
+    def update(self, arg: bytes) -> None: ...
+    @abstractmethod
+    def digest(self) -> bytes: ...
+    @abstractmethod
+    def hexdigest(self) -> str: ...
+    @abstractmethod
+    def copy(self) -> 'Hash': ...
+
+def md5(arg: bytes = ...) -> Hash: ...
+def sha1(arg: bytes = ...) -> Hash: ...
+def sha224(arg: bytes = ...) -> Hash: ...
+def sha256(arg: bytes = ...) -> Hash: ...
+def sha384(arg: bytes = ...) -> Hash: ...
+def sha512(arg: bytes = ...) -> Hash: ...
+
+def new(name: str, data: bytes = ...) -> Hash: ...
+
+# New in version 3.2
+algorithms_guaranteed = ...  # type: AbstractSet[str]
+algorithms_available = ...  # type: AbstractSet[str]
+
+# New in version 3.4
+# TODO The documentation says "password and salt are interpreted as buffers of
+# bytes", should we declare something other than bytes here?
+def pbkdf2_hmac(name: str, password: bytes, salt: bytes, rounds: int, dklen: int = ...) -> bytes: ...
diff --git a/typeshed/stdlib/3/heapq.pyi b/typeshed/stdlib/3/heapq.pyi
new file mode 100644
index 0000000..f56ae72
--- /dev/null
+++ b/typeshed/stdlib/3/heapq.pyi
@@ -0,0 +1,23 @@
+# Stubs for heapq
+
+# Based on http://docs.python.org/3.2/library/heapq.html
+
+import sys
+from typing import TypeVar, List, Iterable, Any, Callable
+
+_T = TypeVar('_T')
+
+def heappush(heap: List[_T], item: _T) -> None: ...
+def heappop(heap: List[_T]) -> _T: ...
+def heappushpop(heap: List[_T], item: _T) -> _T: ...
+def heapify(x: List[_T]) -> None: ...
+def heapreplace(heap: List[_T], item: _T) -> _T: ...
+if sys.version_info >= (3, 5):
+    def merge(*iterables: Iterable[_T], key: Callable[[_T], Any] = ...,
+              reverse: bool = ...) -> Iterable[_T]: ...
+else:
+    def merge(*iterables: Iterable[_T]) -> Iterable[_T]: ...
+def nlargest(n: int, iterable: Iterable[_T],
+             key: Callable[[_T], Any] = ...) -> List[_T]: ...
+def nsmallest(n: int, iterable: Iterable[_T],
+              key: Callable[[_T], Any] = ...) -> List[_T]: ...
diff --git a/typeshed/stdlib/3/html/__init__.pyi b/typeshed/stdlib/3/html/__init__.pyi
new file mode 100644
index 0000000..af2a800
--- /dev/null
+++ b/typeshed/stdlib/3/html/__init__.pyi
@@ -0,0 +1,4 @@
+from typing import AnyStr
+
+def escape(s: AnyStr, quote: bool = ...) -> AnyStr: ...
+def unescape(s: AnyStr) -> AnyStr: ...
diff --git a/typeshed/stdlib/3/html/entities.pyi b/typeshed/stdlib/3/html/entities.pyi
new file mode 100644
index 0000000..b3fa66b
--- /dev/null
+++ b/typeshed/stdlib/3/html/entities.pyi
@@ -0,0 +1,10 @@
+# Stubs for html.entities (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+name2codepoint = ...  # type: Any
+html5 = ...  # type: Any
+codepoint2name = ...  # type: Any
+entitydefs = ...  # type: Any
diff --git a/typeshed/stdlib/3/html/parser.pyi b/typeshed/stdlib/3/html/parser.pyi
new file mode 100644
index 0000000..a72d194
--- /dev/null
+++ b/typeshed/stdlib/3/html/parser.pyi
@@ -0,0 +1,33 @@
+from typing import List, Tuple
+from _markupbase import ParserBase
+import sys
+
+class HTMLParser(ParserBase):
+    if sys.version_info >= (3, 5):
+        def __init__(self, *, convert_charrefs: bool = ...) -> None: ...
+    elif sys.version_info >= (3, 4):
+        def __init__(self, strict: bool = ..., *,
+                     convert_charrefs: bool = ...) -> None: ...
+    else:
+        def __init__(self, strict: bool = ...) -> None: ...
+    def feed(self, feed: str) -> None: ...
+    def close(self) -> None: ...
+    def reset(self) -> None: ...
+    def getpos(self) -> Tuple[int, int]: ...
+    def get_starttag_text(self) -> str: ...
+
+    def handle_starttag(self, tag: str,
+                        attrs: List[Tuple[str, str]]) -> None: ...
+    def handle_endtag(self, tag: str) -> None: ...
+    def handle_startendtag(self, tag: str,
+                           attrs: List[Tuple[str, str]]) -> None: ...
+    def handle_data(self, data: str) -> None: ...
+    def handle_entityref(self, name: str) -> None: ...
+    def handle_charref(self, name: str) -> None: ...
+    def handle_comment(self, data: str) -> None: ...
+    def handle_decl(self, decl: str) -> None: ...
+    def handle_pi(self, data: str) -> None: ...
+    def unknown_decl(self, data: str) -> None: ...
+
+if sys.version_info < (3, 5):
+    class HTMLParseError(Exception): ...
diff --git a/typeshed/stdlib/3/http/__init__.pyi b/typeshed/stdlib/3/http/__init__.pyi
new file mode 100644
index 0000000..a9a77da
--- /dev/null
+++ b/typeshed/stdlib/3/http/__init__.pyi
@@ -0,0 +1,68 @@
+import sys
+
+from enum import IntEnum
+
+if sys.version_info >= (3, 5):
+    class HTTPStatus(IntEnum):
+
+        def __init__(self, *a) -> None:
+            self.phrase = ...  # type: str
+            self.description = ...  # type: str
+
+        CONTINUE = ...  # type: object
+        SWITCHING_PROTOCOLS = ...  # type: object
+        PROCESSING = ...  # type: object
+        OK = ...  # type: object
+        CREATED = ...  # type: object
+        ACCEPTED = ...  # type: object
+        NON_AUTHORITATIVE_INFORMATION = ...  # type: object
+        NO_CONTENT = ...  # type: object
+        RESET_CONTENT = ...  # type: object
+        PARTIAL_CONTENT = ...  # type: object
+        MULTI_STATUS = ...  # type: object
+        ALREADY_REPORTED = ...  # type: object
+        IM_USED = ...  # type: object
+        MULTIPLE_CHOICES = ...  # type: object
+        MOVED_PERMANENTLY = ...  # type: object
+        FOUND = ...  # type: object
+        SEE_OTHER = ...  # type: object
+        NOT_MODIFIED = ...  # type: object
+        USE_PROXY = ...  # type: object
+        TEMPORARY_REDIRECT = ...  # type: object
+        PERMANENT_REDIRECT = ...  # type: object
+        BAD_REQUEST = ...  # type: object
+        UNAUTHORIZED = ...  # type: object
+        PAYMENT_REQUIRED = ...  # type: object
+        FORBIDDEN = ...  # type: object
+        NOT_FOUND = ...  # type: object
+        METHOD_NOT_ALLOWED = ...  # type: object
+        NOT_ACCEPTABLE = ...  # type: object
+        PROXY_AUTHENTICATION_REQUIRED = ...  # type: object
+        REQUEST_TIMEOUT = ...  # type: object
+        CONFLICT = ...  # type: object
+        GONE = ...  # type: object
+        LENGTH_REQUIRED = ...  # type: object
+        PRECONDITION_FAILED = ...  # type: object
+        REQUEST_ENTITY_TOO_LARGE = ...  # type: object
+        REQUEST_URI_TOO_LONG = ...  # type: object
+        UNSUPPORTED_MEDIA_TYPE = ...  # type: object
+        REQUESTED_RANGE_NOT_SATISFIABLE = ...  # type: object
+        EXPECTATION_FAILED = ...  # type: object
+        UNPROCESSABLE_ENTITY = ...  # type: object
+        LOCKED = ...  # type: object
+        FAILED_DEPENDENCY = ...  # type: object
+        UPGRADE_REQUIRED = ...  # type: object
+        PRECONDITION_REQUIRED = ...  # type: object
+        TOO_MANY_REQUESTS = ...  # type: object
+        REQUEST_HEADER_FIELDS_TOO_LARGE = ...  # type: object
+        INTERNAL_SERVER_ERROR = ...  # type: object
+        NOT_IMPLEMENTED = ...  # type: object
+        BAD_GATEWAY = ...  # type: object
+        SERVICE_UNAVAILABLE = ...  # type: object
+        GATEWAY_TIMEOUT = ...  # type: object
+        HTTP_VERSION_NOT_SUPPORTED = ...  # type: object
+        VARIANT_ALSO_NEGOTIATES = ...  # type: object
+        INSUFFICIENT_STORAGE = ...  # type: object
+        LOOP_DETECTED = ...  # type: object
+        NOT_EXTENDED = ...  # type: object
+        NETWORK_AUTHENTICATION_REQUIRED = ...  # type: object
diff --git a/typeshed/stdlib/3/http/client.pyi b/typeshed/stdlib/3/http/client.pyi
new file mode 100644
index 0000000..6a55f5c
--- /dev/null
+++ b/typeshed/stdlib/3/http/client.pyi
@@ -0,0 +1,194 @@
+# Stubs for http.client (Python 3.4)
+
+from typing import (
+    Any, Dict, IO, Iterable, List, Iterator, Mapping, Optional, Tuple, TypeVar,
+    Union,
+    overload,
+)
+import email.message
+import io
+import sys
+import ssl
+import types
+
+_DataType = Union[bytes, IO[Any], Iterable[bytes], str]
+_T = TypeVar('_T')
+
+HTTP_PORT = ...  # type: int
+HTTPS_PORT = ...  # type: int
+
+CONTINUE = ...  # type: int
+SWITCHING_PROTOCOLS = ...  # type: int
+PROCESSING = ...  # type: int
+
+OK = ...  # type: int
+CREATED = ...  # type: int
+ACCEPTED = ...  # type: int
+NON_AUTHORITATIVE_INFORMATION = ...  # type: int
+NO_CONTENT = ...  # type: int
+RESET_CONTENT = ...  # type: int
+PARTIAL_CONTENT = ...  # type: int
+MULTI_STATUS = ...  # type: int
+IM_USED = ...  # type: int
+
+MULTIPLE_CHOICES = ...  # type: int
+MOVED_PERMANENTLY = ...  # type: int
+FOUND = ...  # type: int
+SEE_OTHER = ...  # type: int
+NOT_MODIFIED = ...  # type: int
+USE_PROXY = ...  # type: int
+TEMPORARY_REDIRECT = ...  # type: int
+
+BAD_REQUEST = ...  # type: int
+UNAUTHORIZED = ...  # type: int
+PAYMENT_REQUIRED = ...  # type: int
+FORBIDDEN = ...  # type: int
+NOT_FOUND = ...  # type: int
+METHOD_NOT_ALLOWED = ...  # type: int
+NOT_ACCEPTABLE = ...  # type: int
+PROXY_AUTHENTICATION_REQUIRED = ...  # type: int
+REQUEST_TIMEOUT = ...  # type: int
+CONFLICT = ...  # type: int
+GONE = ...  # type: int
+LENGTH_REQUIRED = ...  # type: int
+PRECONDITION_FAILED = ...  # type: int
+REQUEST_ENTITY_TOO_LARGE = ...  # type: int
+REQUEST_URI_TOO_LONG = ...  # type: int
+UNSUPPORTED_MEDIA_TYPE = ...  # type: int
+REQUESTED_RANGE_NOT_SATISFIABLE = ...  # type: int
+EXPECTATION_FAILED = ...  # type: int
+UNPROCESSABLE_ENTITY = ...  # type: int
+LOCKED = ...  # type: int
+FAILED_DEPENDENCY = ...  # type: int
+UPGRADE_REQUIRED = ...  # type: int
+PRECONDITION_REQUIRED = ...  # type: int
+TOO_MANY_REQUESTS = ...  # type: int
+REQUEST_HEADER_FIELDS_TOO_LARGE = ...  # type: int
+
+INTERNAL_SERVER_ERROR = ...  # type: int
+NOT_IMPLEMENTED = ...  # type: int
+BAD_GATEWAY = ...  # type: int
+SERVICE_UNAVAILABLE = ...  # type: int
+GATEWAY_TIMEOUT = ...  # type: int
+HTTP_VERSION_NOT_SUPPORTED = ...  # type: int
+INSUFFICIENT_STORAGE = ...  # type: int
+NOT_EXTENDED = ...  # type: int
+NETWORK_AUTHENTICATION_REQUIRED = ...  # type: int
+
+responses = ...  # type: Dict[int, str]
+
+class HTTPMessage(email.message.Message): ...
+
+if sys.version_info >= (3, 5):
+    class HTTPResponse(io.BufferedIOBase):
+        msg = ...  # type: HTTPMessage
+        version = ...  # type: int
+        debuglevel = ...  # type: int
+        closed = ...  # type: bool
+        status = ...  # type: int
+        reason = ...  # type: str
+        def read(self, amt: Optional[int] = ...) -> bytes: ...
+        def readinto(self, b: bytearray) -> int: ...
+        @overload
+        def getheader(self, name: str) -> Optional[str]: ...
+        @overload
+        def getheader(self, name: str, default: _T) -> Union[str, _T]: ...
+        def getheaders(self) -> List[Tuple[str, str]]: ...
+        def fileno(self) -> int: ...
+        def __iter__(self) -> Iterator[bytes]: ...
+        def __enter__(self) -> 'HTTPResponse': ...
+        def __exit__(self, exc_type: Optional[type],
+                     exc_val: Optional[Exception],
+                     exc_tb: Optional[types.TracebackType]) -> bool: ...
+else:
+    class HTTPResponse:
+        msg = ...  # type: HTTPMessage
+        version = ...  # type: int
+        debuglevel = ...  # type: int
+        closed = ...  # type: bool
+        status = ...  # type: int
+        reason = ...  # type: str
+        def read(self, amt: Optional[int] = ...) -> bytes: ...
+        if sys.version_info >= (3, 3):
+            def readinto(self, b: bytearray) -> int: ...
+        @overload
+        def getheader(self, name: str) -> Optional[str]: ...
+        @overload
+        def getheader(self, name: str, default: _T) -> Union[str, _T]: ...
+        def getheaders(self) -> List[Tuple[str, str]]: ...
+        def fileno(self) -> int: ...
+        def __iter__(self) -> Iterator[bytes]: ...
+        def __enter__(self) -> 'HTTPResponse': ...
+        def __exit__(self, exc_type: Optional[type],
+                     exc_val: Optional[Exception],
+                     exc_tb: Optional[types.TracebackType]) -> bool: ...
+
+class HTTPConnection:
+    if sys.version_info >= (3, 4):
+        def __init__(
+            self,
+            host: str, port: Optional[int] = ...,
+            timeout: int = ...,
+            source_address: Optional[Tuple[str, int]] = ...
+        ) -> None: ...
+    else:
+        def __init__(
+            self,
+            host: str, port: Optional[int] = ...,
+            strict: bool = ..., timeout: int = ...,
+            source_address: Optional[Tuple[str, int]] = ...
+        )-> None: ...
+    def request(self, method: str, url: str,
+                body: Optional[_DataType] = ...,
+                headers: Mapping[str, str] = ...) -> None: ...
+    def getresponse(self) -> HTTPResponse: ...
+    def set_debuglevel(self, level: int) -> None: ...
+    def set_tunnel(self, host: str, port: Optional[int] = ...,
+                   headers: Optional[Mapping[str, str]] = ...) -> None: ...
+    def connect(self) -> None: ...
+    def close(self) -> None: ...
+    def putrequest(self, request: str, selector: str, skip_host: bool = ...,
+                   skip_accept_encoding: bool = ...) -> None: ...
+    def putheader(self, header: str, *argument: str) -> None: ...
+    def endheaders(self, message_body: Optional[_DataType] = ...) -> None: ...
+    def send(self, data: _DataType) -> None: ...
+
+class HTTPSConnection(HTTPConnection):
+    if sys.version_info >= (3, 4):
+        def __init__(self,
+                     host: str, port: Optional[int] = ...,
+                     key_file: Optional[str] = ...,
+                     cert_file: Optional[str] = ...,
+                     timeout: int = ...,
+                     source_address: Optional[Tuple[str, int]] = ...,
+                     *, context: Optional[ssl.SSLContext] = ...,
+                     check_hostname: Optional[bool] = ...) -> None: ...
+    else:
+        def __init__(self,
+                     host: str, port: Optional[int] = ...,
+                     key_file: Optional[str] = ...,
+                     cert_file: Optional[str] = ...,
+                     strict: bool = ..., timeout: int = ...,
+                     source_address: Optional[Tuple[str, int]] = ...,
+                     *, context: Optional[ssl.SSLContext] = ...,
+                     check_hostname: Optional[bool] = ...) -> None: ...
+
+class HTTPException(Exception): ...
+
+class NotConnected(HTTPException): ...
+class InvalidURL(HTTPException): ...
+class UnknownProtocol(HTTPException): ...
+class UnknownTransferEncoding(HTTPException): ...
+class UnimplementedFileMode(HTTPException): ...
+class IncompleteRead(HTTPException): ...
+
+class ImproperConnectionState(HTTPException): ...
+class CannotSendRequest(ImproperConnectionState): ...
+class CannotSendHeader(ImproperConnectionState): ...
+class ResponseNotReady(ImproperConnectionState): ...
+
+class BadStatusLine(HTTPException): ...
+class LineTooLong(HTTPException): ...
+
+if sys.version_info >= (3, 5):
+    class RemoteDisconnected(ConnectionResetError, BadStatusLine): ...
diff --git a/typeshed/stdlib/3/http/cookiejar.pyi b/typeshed/stdlib/3/http/cookiejar.pyi
new file mode 100644
index 0000000..38de5a3
--- /dev/null
+++ b/typeshed/stdlib/3/http/cookiejar.pyi
@@ -0,0 +1,112 @@
+# Stubs for http.cookiejar (Python 3.4)
+
+from typing import Iterable, Iterator, Optional, Sequence, Tuple, TypeVar, Union, overload
+from http.client import HTTPResponse
+import sys
+from urllib.request import Request
+
+_T = TypeVar('_T')
+
+if sys.version_info >= (3, 3):
+    class LoadError(OSError): ...
+else:
+    class LoadError(IOError): ...
+
+
+class CookieJar(Iterable['Cookie']):
+    def __init__(self, policy: Optional['CookiePolicy'] = ...) -> None: ...
+    def add_cookie_header(self, request: Request) -> None: ...
+    def extract_cookies(self, response: HTTPResponse,
+                        request: Request) -> None: ...
+    def set_policy(self, policy: 'CookiePolicy') -> None: ...
+    def make_cookies(self, response: HTTPResponse,
+                     request: Request) -> Sequence['Cookie']: ...
+    def set_cookie(self, cookie: 'Cookie') -> None: ...
+    def set_cookie_if_ok(self, cookie: 'Cookie',
+                         request: Request) -> None: ...
+    def clear(self, domain: str = ..., path: str = ...,
+              name: str = ...) -> None: ...
+    def clear_session_cookies(self) -> None: ...
+    def __iter__(self) -> Iterator['Cookie']: ...
+
+class FileCookieJar(CookieJar):
+    filename = ...  # type: str
+    delayload = ...  # type: bool
+    def __init__(self, filename: str = ..., delayload: bool = ...,
+                 policy: Optional['CookiePolicy'] = ...) -> None: ...
+    def save(self, filename: Optional[str] = ..., ignore_discard: bool = ...,
+             ignore_expires: bool = ...) -> None: ...
+    def load(self, filename: Optional[str] = ..., ignore_discard: bool = ...,
+             ignore_expires: bool = ...) -> None: ...
+    def revert(self, filename: Optional[str] = ..., ignore_discard: bool = ...,
+               ignore_expires: bool = ...) -> None: ...
+
+class MozillaCookieJar(FileCookieJar): ...
+class LWPCookieJar(FileCookieJar): ...
+
+
+class CookiePolicy:
+    netscape = ...  # type: bool
+    rfc2965 = ...  # type: bool
+    hide_cookie2 = ...  # type: bool
+    def set_ok(self, cookie: 'Cookie', request: Request) -> bool: ...
+    def return_ok(self, cookie: 'Cookie', request: Request) -> bool: ...
+    def domain_return_ok(self, domain: str, request: Request) -> bool: ...
+    def path_return_ok(self, path: str, request: Request) -> bool: ...
+
+
+class DefaultCookiePolicy(CookiePolicy):
+    rfc2109_as_netscape = ...  # type: bool
+    strict_domain = ...  # type: bool
+    strict_rfc2965_unverifiable = ...  # type: bool
+    strict_ns_unverifiable = ...  # type: bool
+    strict_ns_domain = ...  # type: int
+    strict_ns_set_initial_dollar = ...  # type: bool
+    strict_ns_set_path = ...  # type: bool
+    DomainStrictNoDots = ...  # type: int
+    DomainStrictNonDomain = ...  # type: int
+    DomainRFC2965Match = ...  # type: int
+    DomainLiberal = ...  # type: int
+    DomainStrict = ...  # type: int
+    def __init__(self, blocked_domains: Optional[Sequence[str]] = ...,
+                 allowed_domains: Optional[Sequence[str]] = ...,
+                 netscape: bool = ...,
+                 rfc2965: bool = ...,
+                 rfc2109_as_netscape: Optional[bool] = ...,
+                 hide_cookie2: bool = ..., strict_domain: bool = ...,
+                 strict_rfc2965_unverifiable: bool =...,
+                 strict_ns_unverifiable: bool = ...,
+                 strict_ns_domain: int = ...,
+                 strict_ns_set_initial_dollar: bool = ...,
+                 strict_ns_set_path: bool = ...) -> None: ...
+    def blocked_domains(self) -> Tuple[str, ...]: ...
+    def set_blocked_domains(self, blocked_domains: Sequence[str]) -> None: ...
+    def is_blocked(self, domain: str) -> bool: ...
+    def allowed_domains(self) -> Optional[Tuple[str, ...]]: ...
+    def set_allowed_domains(self, allowed_domains: Optional[Sequence[str]]) \
+                            -> None: ...
+    def is_not_allowed(self, domain: str) -> bool: ...
+
+
+class Cookie:
+    version = ...  # type: Optional[int]
+    name = ...  # type: str
+    value = ...  # type: Optional[str]
+    port = ...  # type: Optional[str]
+    path = ...  # type: str
+    secure = ...  # type: bool
+    expires = ...  # type: Optional[int]
+    discard = ...  # type: bool
+    comment = ...  # type: Optional[str]
+    comment_url = ...  # type: Optional[str]
+    rfc2109 = ...  # type: bool
+    port_specified = ...  # type: bool
+    domain_specified = ...  # type: bool
+    domain_initial_dot = ...  # type: bool
+    def has_nonstandard_attr(self, name: str) -> bool: ...
+    @overload
+    def get_nonstandard_attr(self, name: str) -> Optional[str]: ...
+    @overload
+    def get_nonstandard_attr(self, name: str, default: _T = ...) -> Union[str, _T]: ...
+    def set_nonstandard_attr(self, name: str, value: str) -> None: ...
+    def is_expired(self, now: int = ...) -> bool: ...
diff --git a/typeshed/stdlib/3/http/cookies.pyi b/typeshed/stdlib/3/http/cookies.pyi
new file mode 100644
index 0000000..b693aa7
--- /dev/null
+++ b/typeshed/stdlib/3/http/cookies.pyi
@@ -0,0 +1,31 @@
+# Stubs for http.cookies (Python 3.5)
+
+from typing import Generic, Dict, List, Mapping, MutableMapping, Optional, TypeVar, Union
+
+_DataType = Union[str, Mapping[str, Union[str, 'Morsel']]]
+_T = TypeVar('_T')
+
+class CookieError(Exception): ...
+
+class Morsel(Dict[str, str], Generic[_T]):
+    value = ...  # type: str
+    coded_value = ...  # type: _T
+    key = ...  # type: str
+    def set(self, key: str, val: str, coded_val: _T) -> None: ...
+    def isReservedKey(self, K: str) -> bool: ...
+    def output(self, attrs: Optional[List[str]] = ...,
+               header: str = ...) -> str: ...
+    def js_output(self, attrs: Optional[List[str]] = ...) -> str: ...
+    def OutputString(self, attrs: Optional[List[str]] = ...) -> str: ...
+
+class BaseCookie(MutableMapping[str, Morsel], Generic[_T]):
+    def __init__(self, input: Optional[_DataType] = ...) -> None: ...
+    def value_decode(self, val: str) -> _T: ...
+    def value_encode(self, val: _T) -> str: ...
+    def output(self, attrs: Optional[List[str]] = ..., header: str = ...,
+               sep: str = ...) -> str: ...
+    def js_output(self, attrs: Optional[List[str]] = ...) -> str: ...
+    def load(self, rawdata: _DataType) -> None: ...
+    def __setitem__(self, key: str, value: Union[str, Morsel]) -> None: ...
+
+class SimpleCookie(BaseCookie): ...
diff --git a/typeshed/stdlib/3/http/server.pyi b/typeshed/stdlib/3/http/server.pyi
new file mode 100644
index 0000000..2f1d0c2
--- /dev/null
+++ b/typeshed/stdlib/3/http/server.pyi
@@ -0,0 +1,63 @@
+# Stubs for http.server (Python 3.4)
+
+from typing import Any, BinaryIO, Dict, List, Mapping, Optional, Tuple, Union
+import socketserver
+import email.message
+
+class HTTPServer(socketserver.TCPServer):
+    server_name = ...  # type: str
+    server_port = ...  # type: int
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type) -> None: ...
+
+class BaseHTTPRequestHandler:
+    client_address = ...  # type: Tuple[str, int]
+    server = ...  # type: socketserver.BaseServer
+    close_connection = ...  # type: bool
+    requestline = ...  # type: str
+    command = ...  # type: str
+    path = ...  # type: str
+    request_version = ...  # type: str
+    headers = ...  # type: email.message.Message
+    rfile = ...  # type: BinaryIO
+    wfile = ...  # type: BinaryIO
+    server_version = ...  # type: str
+    sys_version = ...  # type: str
+    error_message_format = ...  # type: str
+    error_content_type = ...  # type: str
+    protocol_version = ...  # type: str
+    MessageClass = ...  # type: type
+    responses = ...  # type: Mapping[int, Tuple[str, str]]
+    def __init__(self, request: bytes, client_address: Tuple[str, int],
+                 server: socketserver.BaseServer) -> None: ...
+    def handle(self) -> None: ...
+    def handle_one_request(self) -> None: ...
+    def handle_expect_100(self) -> bool: ...
+    def send_error(self, code: int, message: Optional[str] = ...,
+                   explain: Optional[str] = ...) -> None: ...
+    def send_response(self, code: int,
+                      message: Optional[str] = ...) -> None: ...
+    def send_header(self, keyword: str, value: str) -> None: ...
+    def send_response_only(self, code: int,
+                           message: Optional[str] = ...) -> None: ...
+    def end_headers(self) -> None: ...
+    def flush_headers(self) -> None: ...
+    def log_request(self, code: Union[int, str] = ...,
+                    size: Union[int, str] = ...) -> None: ...
+    def log_error(self, format: str, *args: Any) -> None: ...
+    def log_message(self, format: str, *args: Any) -> None: ...
+    def version_string(self) -> str: ...
+    def date_time_string(self, timestamp: Optional[int] = ...) -> str: ...
+    def log_date_time_string(self) -> str: ...
+    def address_string(self) -> str: ...
+
+class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
+    extensions_map = ...  # type: Dict[str, str]
+    def __init__(self, request: bytes, client_address: Tuple[str, int],
+                 server: socketserver.BaseServer) -> None: ...
+    def do_GET(self) -> None: ...
+    def do_HEAD(self) -> None: ...
+
+class CGIHTTPRequestHandler(SimpleHTTPRequestHandler):
+    cgi_directories = ...  # type: List[str]
+    def do_POST(self) -> None: ...
diff --git a/typeshed/stdlib/3/imp.pyi b/typeshed/stdlib/3/imp.pyi
new file mode 100644
index 0000000..3abe628
--- /dev/null
+++ b/typeshed/stdlib/3/imp.pyi
@@ -0,0 +1,10 @@
+# Stubs for imp
+
+# NOTE: These are incomplete!
+
+from typing import TypeVar
+
+_T = TypeVar('_T')
+
+def cache_from_source(path: str, debug_override: bool = ...) -> str: ...
+def reload(module: _T) -> _T: ...  # TODO imprecise signature
diff --git a/typeshed/stdlib/3/importlib/__init__.pyi b/typeshed/stdlib/3/importlib/__init__.pyi
new file mode 100644
index 0000000..7969a3c
--- /dev/null
+++ b/typeshed/stdlib/3/importlib/__init__.pyi
@@ -0,0 +1,18 @@
+from importlib.abc import Loader
+import sys
+import types
+from typing import Any, Mapping, Optional, Sequence
+
+def __import__(name: str, globals: Mapping[str, Any] = None,
+               locals: Mapping[str, Any] = None, fromlist: Sequence[str] = (),
+               level: int = 0) -> types.ModuleType: ...
+
+def import_module(name: str, package: str = None) -> types.ModuleType: ...
+
+if sys.version_info >= (3, 3):
+    def find_loader(name: str, path: str = None) -> Optional[Loader]: ...
+
+    def invalidate_caches() -> None: ...
+
+if sys.version_info >= (3, 4):
+    def reload(module: types.ModuleType) -> types.ModuleType: ...
diff --git a/typeshed/stdlib/3/importlib/abc.pyi b/typeshed/stdlib/3/importlib/abc.pyi
new file mode 100644
index 0000000..6ae74d6
--- /dev/null
+++ b/typeshed/stdlib/3/importlib/abc.pyi
@@ -0,0 +1,89 @@
+from abc import ABCMeta, abstractmethod
+import sys
+import types
+from typing import Any, Mapping, Optional, Sequence, Tuple, Union
+
+# Loader is exported from this module, but for circular import reasons
+# exists in its own stub file (with ModuleSpec and ModuleType).
+from _importlib_modulespec import Loader as Loader  # Exported
+
+if sys.version_info >= (3, 4):
+    from _importlib_modulespec import ModuleSpec
+
+_Path = Union[bytes, str]
+
+class Finder(metaclass=ABCMeta):
+    ...
+    # Technically this class defines the following method, but its subclasses
+    # in this module violate its signature. Since this class is deprecated, it's
+    # easier to simply ignore that this method exists.
+    # @abstractmethod
+    # def find_module(self, fullname: str,
+    #                 path: Sequence[_Path] = None) -> Optional[Loader]: ...
+
+class ResourceLoader(Loader):
+    @abstractmethod
+    def get_data(self, path: _Path) -> bytes: ...
+
+class InspectLoader(Loader):
+    def is_package(self, fullname: str) -> bool: ...
+    def get_code(self, fullname: str) -> Optional[types.CodeType]: ...
+    def load_module(self, fullname: str) -> types.ModuleType: ...
+    @abstractmethod
+    def get_source(self, fullname: str) -> Optional[str]: ...
+    if sys.version_info >= (3, 4):
+        def exec_module(self, module: types.ModuleType) -> None: ...
+    if sys.version_info[:2] == (3, 4):
+        def source_to_code(self, data: Union[bytes, str],
+                           path: str = '<string>') -> types.CodeType: ...
+    elif sys.version_info >= (3, 5):
+        @staticmethod
+        def source_to_code(data: Union[bytes, str],
+                           path: str = '<string>') -> types.CodeType: ...
+
+class ExecutionLoader(InspectLoader):
+    @abstractmethod
+    def get_filename(self, fullname: str) -> _Path: ...
+    def get_code(self, fullname: str) -> Optional[types.CodeType]: ...
+
+class SourceLoader(ResourceLoader, ExecutionLoader):
+    def path_mtime(self, path: _Path) -> Union[int, float]: ...
+    def set_data(self, path: _Path, data: bytes) -> None: ...
+    def get_source(self, fullname: str) -> Optional[str]: ...
+    if sys.version_info >= (3, 3):
+        def path_stats(self, path: _Path) -> Mapping[str, Any]: ...
+
+
+if sys.version_info >= (3, 3):
+    class MetaPathFinder(Finder):
+        def find_module(self, fullname: str,
+                        path: Optional[Sequence[_Path]]) -> Optional[Loader]:
+            ...
+        def invalidate_caches(self) -> None: ...
+        if sys.version_info >= (3, 4):
+            # Not defined on the actual class, but expected to exist.
+            def find_spec(
+                self, fullname: str, path: Optional[Sequence[_Path]],
+                target: types.ModuleType = None
+            ) -> Optional[ModuleSpec]:
+                ...
+
+    class PathEntryFinder(Finder):
+        def find_module(self, fullname: str) -> Optional[Loader]: ...
+        def find_loader(
+            self, fullname: str
+        ) -> Tuple[Optional[Loader], Sequence[_Path]]: ...
+        def invalidate_caches(self) -> None: ...
+        if sys.version_info >= (3, 4):
+            # Not defined on the actual class, but expected to exist.
+            def find_spec(
+                self, fullname: str,
+                target: types.ModuleType = None
+            ) -> Optional[ModuleSpec]: ...
+
+    class FileLoader(ResourceLoader, ExecutionLoader):
+        name = ...  # type: str
+        path = ...  # type: _Path
+        def __init__(self, fullname: str, path: _Path) -> None: ...
+        def get_data(self, path: _Path) -> bytes: ...
+        def get_filename(self, fullname: str) -> _Path: ...
diff --git a/typeshed/stdlib/3/importlib/machinery.pyi b/typeshed/stdlib/3/importlib/machinery.pyi
new file mode 100644
index 0000000..78aaf80
--- /dev/null
+++ b/typeshed/stdlib/3/importlib/machinery.pyi
@@ -0,0 +1,185 @@
+import importlib.abc
+import sys
+import types
+from typing import Any, Callable, List, Optional, Sequence, Tuple, Union
+
+# ModuleSpec is exported from this module, but for circular import
+# reasons exists in its own stub file (with Loader and ModuleType).
+if sys.version_info >= (3, 4):
+    from _importlib_modulespec import ModuleSpec as ModuleSpec  # Exported
+
+if sys.version_info >= (3, 3):
+    class BuiltinImporter(importlib.abc.MetaPathFinder,
+                          importlib.abc.InspectLoader):
+        # MetaPathFinder
+        @classmethod
+        def find_module(
+            cls, fullname: str,
+            path: Optional[Sequence[importlib.abc._Path]]
+        ) -> Optional[importlib.abc.Loader]:
+            ...
+        if sys.version_info >= (3, 4):
+            @classmethod
+            def find_spec(cls, fullname: str,
+                          path: Optional[Sequence[importlib.abc._Path]],
+                          target: types.ModuleType = None) -> Optional[ModuleSpec]:
+                ...
+        # InspectLoader
+        @classmethod
+        def is_package(cls, fullname: str) -> bool: ...
+        @classmethod
+        def load_module(cls, fullname: str) -> types.ModuleType: ...
+        @classmethod
+        def get_code(cls, fullname: str) -> None: ...  # type: ignore
+        @classmethod
+        def get_source(cls, fullname: str) -> None: ...  # type: ignore
+        # Loader
+        @classmethod
+        def load_module(cls, fullname: str) -> types.ModuleType: ...
+        if sys.version_info >= (3, 3):
+            @staticmethod
+            def module_repr(module: types.ModuleType) -> str: ...  # type: ignore
+        if sys.version_info >= (3, 4):
+            @classmethod
+            def create_module(cls, spec: ModuleSpec) -> Optional[types.ModuleType]: ...
+            @classmethod
+            def exec_module(cls, module: types.ModuleType) -> None: ...
+else:
+    class BuiltinImporter(importlib.abc.InspectLoader):
+        # MetaPathFinder
+        @classmethod
+        def find_module(
+            cls, fullname: str,
+            path: Optional[Sequence[importlib.abc._Path]]
+        ) -> Optional[importlib.abc.Loader]:
+            ...
+        # InspectLoader
+        @classmethod
+        def is_package(cls, fullname: str) -> bool: ...
+        @classmethod
+        def load_module(cls, fullname: str) -> types.ModuleType: ...
+        @classmethod
+        def get_code(cls, fullname: str) -> None: ...  # type: ignore
+        @classmethod
+        def get_source(cls, fullname: str) -> None: ...  # type: ignore
+        # Loader
+        @classmethod
+        def load_module(cls, fullname: str) -> types.ModuleType: ...
+
+if sys.version_info >= (3, 3):
+    class FrozenImporter(importlib.abc.MetaPathFinder, importlib.abc.InspectLoader):
+        # MetaPathFinder
+        @classmethod
+        def find_module(
+            cls, fullname: str,
+            path: Optional[Sequence[importlib.abc._Path]]
+        ) -> Optional[importlib.abc.Loader]:
+            ...
+        if sys.version_info >= (3, 4):
+            @classmethod
+            def find_spec(cls, fullname: str,
+                          path: Optional[Sequence[importlib.abc._Path]],
+                          target: types.ModuleType = None) -> Optional[ModuleSpec]:
+                ...
+        # InspectLoader
+        @classmethod
+        def is_package(cls, fullname: str) -> bool: ...
+        @classmethod
+        def load_module(cls, fullname: str) -> types.ModuleType: ...
+        @classmethod
+        def get_code(cls, fullname: str) -> None: ...  # type: ignore
+        @classmethod
+        def get_source(cls, fullname: str) -> None: ...  # type: ignore
+        # Loader
+        @classmethod
+        def load_module(cls, fullname: str) -> types.ModuleType: ...
+        if sys.version_info >= (3, 3):
+            @staticmethod
+            def module_repr(module: types.ModuleType) -> str: ...  # type: ignore
+        if sys.version_info >= (3, 4):
+            @classmethod
+            def create_module(cls, spec: ModuleSpec) -> Optional[types.ModuleType]:
+                ...
+            @staticmethod
+            def exec_module(module: types.ModuleType) -> None: ...  # type: ignore
+else:
+    class FrozenImporter(importlib.abc.InspectLoader):
+        # MetaPathFinder
+        @classmethod
+        def find_module(
+            cls, fullname: str,
+            path: Optional[Sequence[importlib.abc._Path]]
+        ) -> Optional[importlib.abc.Loader]:
+            ...
+        # InspectLoader
+        @classmethod
+        def is_package(cls, fullname: str) -> bool: ...
+        @classmethod
+        def load_module(cls, fullname: str) -> types.ModuleType: ...
+        @classmethod
+        def get_code(cls, fullname: str) -> None: ...  # type: ignore
+        @classmethod
+        def get_source(cls, fullname: str) -> None: ...  # type: ignore
+        # Loader
+        @classmethod
+        def load_module(cls, fullname: str) -> types.ModuleType: ...
+
+if sys.version_info >= (3, 3):
+    class WindowsRegisteryFinder(importlib.abc.MetaPathFinder):
+        @classmethod
+        def find_module(
+            cls, fullname: str,
+            path: Optional[Sequence[importlib.abc._Path]]
+        ) -> Optional[importlib.abc.Loader]:
+            ...
+        if sys.version_info >= (3, 4):
+            @classmethod
+            def find_spec(cls, fullname: str,
+                          path: Optional[Sequence[importlib.abc._Path]],
+                          target: types.ModuleType = None) -> Optional[ModuleSpec]:
+                ...
+else:
+    class WindowsRegisteryFinder:
+        @classmethod
+        def find_module(
+            cls, fullname: str,
+            path: Optional[Sequence[importlib.abc._Path]]
+        ) -> Optional[importlib.abc.Loader]:
+            ...
+
+if sys.version_info >= (3, 3):
+    class PathFinder(importlib.abc.MetaPathFinder): ...
+else:
+    class PathFinder: ...
+
+if sys.version_info >= (3, 3):
+    SOURCE_SUFFIXES = ...  # type: List[str]
+    DEBUG_BYTECODE_SUFFIXES = ...  # type: List[str]
+    OPTIMIZED_BYTECODE_SUFFIXES = ...  # type: List[str]
+    BYTECODE_SUFFIXES = ...  # type: List[str]
+    EXTENSION_SUFFIXES = ...  # type: List[str]
+
+    def all_suffixes() -> List[str]: ...
+
+    class FileFinder(importlib.abc.PathEntryFinder):
+        path = ...  # type: str
+        def __init__(
+            self, path: str,
+            *loader_details: Tuple[importlib.abc.Loader, List[str]]
+        ) -> None: ...
+        @classmethod
+        def path_hook(
+            *loader_details: Tuple[importlib.abc.Loader, List[str]]
+        ) -> Callable[[str], importlib.abc.PathEntryFinder]: ...
+
+    class SourceFileLoader(importlib.abc.FileLoader,
+                           importlib.abc.SourceLoader):
+        ...
+
+    class SourcelessFileLoader(importlib.abc.FileLoader,
+                               importlib.abc.SourceLoader):
+        ...
+
+    class ExtensionFileLoader(importlib.abc.ExecutionLoader):
+        def get_filename(self, fullname: str) -> importlib.abc._Path: ...
+        def get_source(self, fullname: str) -> None: ...  # type: ignore
diff --git a/typeshed/stdlib/3/importlib/util.pyi b/typeshed/stdlib/3/importlib/util.pyi
new file mode 100644
index 0000000..6f0232b
--- /dev/null
+++ b/typeshed/stdlib/3/importlib/util.pyi
@@ -0,0 +1,55 @@
+import importlib.abc
+import importlib.machinery
+import sys
+import types
+from typing import Any, Callable, List, Optional
+
+def module_for_loader(
+    fxn: Callable[..., types.ModuleType]
+) -> Callable[..., types.ModuleType]: ...
+def set_loader(
+    fxn: Callable[..., types.ModuleType]
+) -> Callable[..., types.ModuleType]: ...
+def set_package(
+    fxn: Callable[..., types.ModuleType]
+) -> Callable[..., types.ModuleType]: ...
+
+if sys.version_info >= (3, 3):
+    def resolve_name(name: str, package: str) -> str: ...
+
+if sys.version_info >= (3, 4):
+    MAGIC_NUMBER = ...  # type: bytes
+
+    def cache_from_source(path: str, debug_override: bool = None, *,
+                          optimization: Any = None) -> str: ...
+    def source_from_cache(path: str) -> str: ...
+    def decode_source(source_bytes: bytes) -> str: ...
+    def find_spec(
+        name: str, package: str = None
+    ) -> importlib.machinery.ModuleSpec: ...
+    def spec_from_loader(
+        name: str, loader: Optional[importlib.abc.Loader], *,
+        origin: str = None, loader_state: Any = None,
+        is_package: bool = None
+    ) -> importlib.machinery.ModuleSpec: ...
+    def spec_from_file_location(
+        name: str, location: str, *,
+        loader: importlib.abc.Loader = None,
+        submodule_search_locations: List[str]=None
+    ) -> importlib.machinery.ModuleSpec: ...
+
+if sys.version_info >= (3, 5):
+    def module_from_spec(
+        spec: importlib.machinery.ModuleSpec
+    ) -> types.ModuleType: ...
+
+    class LazyLoader(importlib.abc.Loader):
+        def __init__(self, loader: importlib.abc.Loader) -> None: ...
+        @classmethod
+        def factory(
+            cls, loader: importlib.abc.Loader
+        ) -> Callable[..., 'LazyLoader']: ...
+        def create_module(
+            self, spec: importlib.machinery.ModuleSpec
+        ) -> Optional[types.ModuleType]: ...
+        def exec_module(self, module: types.ModuleType) -> None: ...
diff --git a/typeshed/stdlib/3/inspect.pyi b/typeshed/stdlib/3/inspect.pyi
new file mode 100644
index 0000000..5fc5b19
--- /dev/null
+++ b/typeshed/stdlib/3/inspect.pyi
@@ -0,0 +1,289 @@
+# Stubs for inspect
+
+from typing import (AbstractSet, Any, Tuple, List, Dict, Callable, Generator,
+                    Mapping, MutableMapping, NamedTuple, Optional, Sequence, Union,
+                    )
+from types import FrameType, ModuleType, TracebackType
+
+#
+# Types and members
+#
+ModuleInfo = NamedTuple('ModuleInfo', [('name', str),
+                                       ('suffix', str),
+                                       ('mode', str),
+                                       ('module_type', int),
+                                       ])
+def getmembers(object: object,
+               predicate: Callable[[Any], bool] = ...,
+               ) -> List[Tuple[str, Any]]: ...
+def getmoduleinfo(path: str) -> Optional[ModuleInfo]: ...
+def getmodulename(path: str) -> Optional[str]: ...
+
+def ismodule(object: object) -> bool: ...
+def isclass(object: object) -> bool: ...
+def ismethod(object: object) -> bool: ...
+def isfunction(object: object) -> bool: ...
+def isgeneratorfunction(object: object) -> bool: ...
+def isgenerator(object: object) -> bool: ...
+
+# Python 3.5+
+def iscoroutinefunction(object: object) -> bool: ...
+def iscoroutine(object: object) -> bool: ...
+def isawaitable(object: object) -> bool: ...
+
+def istraceback(object: object) -> bool: ...
+def isframe(object: object) -> bool: ...
+def iscode(object: object) -> bool: ...
+def isbuiltin(object: object) -> bool: ...
+def isroutine(object: object) -> bool: ...
+def isabstract(object: object) -> bool: ...
+def ismethoddescriptor(object: object) -> bool: ...
+def isdatadescriptor(object: object) -> bool: ...
+def isgetsetdescriptor(object: object) -> bool: ...
+def ismemberdescriptor(object: object) -> bool: ...
+
+
+#
+# Retrieving source code
+#
+def getdoc(object: object) -> str: ...
+def getcomments(object: object) -> str: ...
+def getfile(object: object) -> str: ...
+def getmodule(object: object) -> ModuleType: ...
+def getsourcefile(object: object) -> str: ...
+# TODO restrict to "module, class, method, function, traceback, frame,
+# or code object"
+def getsourcelines(object: object) -> Tuple[List[str], int]: ...
+# TODO restrict to "a module, class, method, function, traceback, frame,
+# or code object"
+def getsource(object: object) -> str: ...
+def cleandoc(doc: str) -> str: ...
+
+
+#
+# Introspecting callables with the Signature object (Python 3.3+)
+#
+def signature(callable: Callable[..., Any],
+              *,
+              follow_wrapped: bool = True) -> 'Signature': ...
+
+class Signature:
+    def __init__(self,
+                 parameters: Optional[Sequence['Parameter']] = ...,
+                 *,
+                 return_annotation: Any = ...) -> None: ...
+    # TODO: can we be more specific here?
+    empty = ...  # type: object
+
+    parameters = ...  # type: Mapping[str, 'Parameter']
+
+    # TODO: can we be more specific here?
+    return_annotation = ...  # type: Any
+
+    def bind(self, *args: Any, **kwargs: Any) -> 'BoundArguments': ...
+    def bind_partial(self, *args: Any, **kwargs: Any) -> 'BoundArguments': ...
+    def replace(self,
+                *,
+                parameters: Optional[Sequence['Parameter']] = ...,
+                return_annotation: Any = ...) -> 'Signature': ...
+
+    # Python 3.5+
+    @classmethod
+    def from_callable(cls,
+                      obj: Callable[..., Any],
+                      *,
+                      follow_wrapped: bool = True) -> 'Signature': ...
+
+# The name is the same as the enum's name in CPython
+class _ParameterKind: pass
+
+class Parameter:
+    def __init__(self,
+                 name: str,
+                 kind: _ParameterKind,
+                 *,
+                 default: Any = ...,
+                 annotation: Any = ...) -> None: ...
+    empty = ...  # type: Any
+    name = ...  # type: str
+    default = ...  # type: Any
+    annotation = ...  # type: Any
+
+    kind = ...  # type: _ParameterKind
+    POSITIONAL_ONLY = ...  # type: _ParameterKind
+    POSITIONAL_OR_KEYWORD = ...  # type: _ParameterKind
+    VAR_POSITIONAL = ...  # type: _ParameterKind
+    KEYWORD_ONLY = ...  # type: _ParameterKind
+    VAR_KEYWORD = ...  # type: _ParameterKind
+
+    def replace(self,
+                *,
+                name: Optional[str] = ...,
+                kind: Optional[_ParameterKind] = ...,
+                default: Any = ...,
+                annotation: Any = ...) -> 'Parameter': ...
+
+class BoundArguments:
+    arguments = ...  # type: MutableMapping[str, Any]
+    args = ...  # Tuple[Any, ...]
+    kwargs = ...  # Dict[str, Any]
+    signature = ...  # type: Signature
+
+    # Python 3.5+
+    def apply_defaults(self) -> None: ...
+
+
+#
+# Classes and functions
+#
+
+# TODO: The actual return type should be List[_ClassTreeItem] but mypy doesn't
+# seem to be supporting this at the moment:
+# _ClassTreeItem = Union[List['_ClassTreeItem'], Tuple[type, Tuple[type, ...]]]
+def getclasstree(classes: List[type], unique: bool = ...) -> Any: ...
+
+ArgSpec = NamedTuple('ArgSpec', [('args', List[str]),
+                                 ('varargs', str),
+                                 ('keywords', str),
+                                 ('defaults', tuple),
+                                 ])
+
+def getargspec(func: object) -> ArgSpec: ...
+
+FullArgSpec = NamedTuple('FullArgSpec', [('args', List[str]),
+                                         ('varargs', str),
+                                         ('varkw', str),
+                                         ('defaults', tuple),
+                                         ('kwonlyargs', List[str]),
+                                         ('kwonlydefaults', Dict[str, Any]),
+                                         ('annotations', Dict[str, Any]),
+                                         ])
+
+def getfullargspec(func: object) -> FullArgSpec: ...
+
+# TODO make the field types more specific here
+ArgInfo = NamedTuple('ArgInfo', [('args', List[str]),
+                                 ('varargs', Optional[str]),
+                                 ('keywords', Optional[str]),
+                                 ('locals', Dict[str, Any]),
+                                 ])
+
+def getargvalues(frame: FrameType) -> ArgInfo: ...
+def formatargspec(args: List[str],
+                  varargs: Optional[str] = ...,
+                  varkw: Optional[str] = ...,
+                  defaults: Optional[Tuple[Any]] = ...,
+                  kwonlyargs: Optional[List[str]] = ...,
+                  kwonlydefaults: Optional[Dict[str, Any]] = ...,
+                  annotations: Optional[Dict[str, Any]] = ...,
+                  formatarg: Optional[Callable[[str], str]] = ...,
+                  formatvarargs: Optional[Callable[[str], str]] = ...,
+                  formatvarkw: Optional[Callable[[str], str]] = ...,
+                  formatvalue: Optional[Callable[[Any], str]] = ...,
+                  formatreturns: Optional[Callable[[Any], str]] = ...,
+                  formatannotations: Optional[Callable[[Any], str]] = ...,
+                  ) -> str: ...
+def formatargvalues(args: List[str],
+                    varargs: Optional[str] = ...,
+                    varkw: Optional[str] = ...,
+                    locals: Optional[Dict[str, Any]] = ...,
+                    formatarg: Optional[Callable[[str], str]] = ...,
+                    formatvarargs: Optional[Callable[[str], str]] = ...,
+                    formatvarkw: Optional[Callable[[str], str]] = ...,
+                    formatvalue: Optional[Callable[[Any], str]] = ...,
+                    ) -> str: ...
+def getmro(cls: type) -> Tuple[type, ...]: ...
+
+# Python 3.2+
+def getcallargs(func: Callable[..., Any],
+                *args: Any,
+                **kwds: Any) -> Dict[str, Any]: ...
+
+
+# Python 3.3+
+ClosureVars = NamedTuple('ClosureVars', [('nonlocals', Mapping[str, Any]),
+                                         ('globals', Mapping[str, Any]),
+                                         ('builtins', Mapping[str, Any]),
+                                         ('unbound', AbstractSet[str]),
+                                         ])
+def getclosurevars(func: Callable[..., Any]) -> ClosureVars: ...
+
+# Python 3.4+
+def unwrap(func: Callable[..., Any],
+           *,
+           stop: Callable[[Any], Any]) -> Any: ...
+
+
+#
+# The interpreter stack
+#
+
+# Python 3.5+ (functions returning it used to return regular tuples)
+FrameInfo = NamedTuple('FrameInfo', [('frame', FrameType),
+                                     ('filename', str),
+                                     ('lineno', int),
+                                     ('function', str),
+                                     ('code_context', List[str]),
+                                     ('index', int),
+                                     ])
+
+# TODO make the frame type more specific
+def getframeinfo(frame: Any, context: int = 1) -> FrameInfo: ...
+def getouterframes(frame: Any, context: int = 1) -> List[FrameInfo]: ...
+def getinnerframes(traceback: TracebackType, context: int = 1) -> List[FrameInfo]:
+    ...
+def currentframe() -> Optional[FrameType]: ...
+def stack(context: int = 1) -> List[FrameInfo]: ...
+def trace(context: int = 1) -> List[FrameInfo]: ...
+
+#
+# Fetching attributes statically
+#
+
+# Python 3.2+
+def getattr_static(obj: object, attr: str, default: Optional[Any] = ...) -> Any: ...
+
+
+#
+# Current State of Generators and Coroutines
+#
+
+# TODO In the next two blocks of code, can we be more specific regarding the
+# type of the "enums"?
+
+# Python 3.2+
+GEN_CREATED = ...  # type: str
+GEN_RUNNING = ...  # type: str
+GEN_SUSPENDED = ...  # type: str
+GEN_CLOSED = ...  # type: str
+def getgeneratorstate(generator: Generator[Any, Any, Any]) -> str: ...
+
+# Python 3.5+
+CORO_CREATED = ...  # type: str
+CORO_RUNNING = ...  # type: str
+CORO_SUSPENDED = ...  # type: str
+CORO_CLOSED = ...  # type: str
+# TODO can we be more specific than "object"?
+def getcoroutinestate(coroutine: object) -> str: ...
+
+# Python 3.3+
+def getgeneratorlocals(generator: Generator[Any, Any, Any]) -> Dict[str, Any]: ...
+
+# Python 3.5+
+# TODO can we be more specific than "object"?
+def getcoroutinelocals(coroutine: object) -> Dict[str, Any]: ...
+
+
+#
+# The following seems undocumented but it was already present in this file
+#
+_object = object
+
+# namedtuple('Attribute', 'name kind defining_class object')
+class Attribute(tuple):
+    name = ...  # type: str
+    kind = ...  # type: str
+    defining_class = ...  # type: type
+    object = ...  # type: _object
+
+def classify_class_attrs(cls: type) -> List[Attribute]: ...
diff --git a/typeshed/stdlib/3/io.pyi b/typeshed/stdlib/3/io.pyi
new file mode 100644
index 0000000..be70e54
--- /dev/null
+++ b/typeshed/stdlib/3/io.pyi
@@ -0,0 +1,259 @@
+# Stubs for io
+
+from typing import (
+    List, BinaryIO, TextIO, Iterator, Union, Optional, Callable, Tuple, Any, IO
+)
+import builtins
+import codecs
+import sys
+from types import TracebackType
+
+DEFAULT_BUFFER_SIZE = ...  # type: int
+
+SEEK_SET = ...  # type: int
+SEEK_CUR = ...  # type: int
+SEEK_END = ...  # type: int
+
+open = builtins.open
+
+# FIXME when mypy handle condtional, we can uncomment the next block and remove
+# the temporary fix
+# if sys.version_info >= (3, 3):
+#     BlockingIOError = BlockingIOError
+#     class UnsupportedOperation(OSError, ValueError): ...
+# else:
+#     class BlockingIOError(IOError):
+#         characters_written = ...  # type: int
+#     class UnsupportedOperation(IOError, ValueError): ...
+class BlockingIOError(OSError):
+    characters_written = ...  # type: int
+class UnsupportedOperation(OSError, ValueError): ...
+
+
+class IOBase:
+    def __iter__(self) -> Iterator[bytes]: ...
+    def __next__(self) -> bytes: ...
+    def __enter__(self) -> 'IOBase': ...
+    def __exit__(self, exc_type: Optional[type], exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+    def close(self) -> None: ...
+    def fileno(self) -> int: ...
+    def flush(self) -> None: ...
+    def isatty(self) -> bool: ...
+    def readable(self) -> bool: ...
+    def readlines(self, hint: int = ...) -> List[bytes]: ...
+    def seek(self, offset: int, whence: int = ...) -> int: ...
+    def seekable(self) -> bool: ...
+    def tell(self) -> int: ...
+    def truncate(self, size: Optional[int] = ...) -> int: ...
+    def writable(self) -> bool: ...
+    def writelines(self, lines: List[Union[bytes, bytearray]]) -> None: ...
+    if sys.version_info >= (3, 4):
+        def readline(self, size: int = ...) -> bytes: ...
+        def __del__(self) -> None: ...
+    else:
+        def readline(self, limit: int = ...) -> bytes: ...
+    if sys.version_info >= (3, 2):
+        closed = ...  # type: bool
+    else:
+        def closed(self) -> bool: ...
+
+class RawIOBase(IOBase):
+    def readall(self) -> bytes: ...
+    def readinto(self, b: bytearray) -> Optional[int]: ...
+    def write(self, b: Union[bytes, bytearray]) -> Optional[int]: ...
+    if sys.version_info >= (3, 4):
+        def read(self, size: int = ...) -> Optional[bytes]: ...
+    else:
+        def read(self, n: int = ...) -> Optional[bytes]: ...
+
+class BufferedIOBase(IOBase):
+    def detach(self) -> RawIOBase: ...
+    def readinto(self, b: bytearray) -> int: ...
+    def write(self, b: Union[bytes, bytearray]) -> int: ...
+    if sys.version_info >= (3, 5):
+        def readinto1(self, b: bytearray) -> int: ...
+    if sys.version_info >= (3, 4):
+        def read(self, size: Optional[int] = ...) -> bytes: ...
+        def read1(self, size: int = ...) -> bytes: ...
+    else:
+        def read(self, n: Optional[int] = ...) -> bytes: ...
+        def read1(self, n: int = ...) -> bytes: ...
+
+
+class FileIO(RawIOBase):
+    mode = ...  # type: str
+    name = ...  # type: Union[int, str]
+    if sys.version_info >= (3, 3):
+        def __init__(
+            self,
+            name: Union[str, bytes, int],
+            mode: str = ...,
+            closefd: bool = ...,
+            opener: Optional[Callable[[Union[int, str], str], int]] = ...
+        ) -> None: ...
+    else:
+        def __init__(self, name: Union[str, bytes, int],
+                     mode: str = ..., closefd: bool = ...) -> None: ...
+
+# TODO should extend from BufferedIOBase
+class BytesIO(BinaryIO):
+    def __init__(self, initial_bytes: bytes = ...) -> None: ...
+    def getvalue(self) -> bytes: ...
+    if sys.version_info >= (3, 2):
+        def getbuffer(self) -> memoryview: ...
+    # copied from IOBase
+    def __iter__(self) -> Iterator[bytes]: ...
+    def __next__(self) -> bytes: ...
+    def __enter__(self) -> 'BytesIO': ...
+    def __exit__(self, t: type = None, value: BaseException = None,
+                 traceback: Any = None) -> bool: ...
+    def close(self) -> None: ...
+    def fileno(self) -> int: ...
+    def flush(self) -> None: ...
+    def isatty(self) -> bool: ...
+    def readable(self) -> bool: ...
+    def readlines(self, hint: int = ...) -> List[bytes]: ...
+    def seek(self, offset: int, whence: int = ...) -> int: ...
+    def seekable(self) -> bool: ...
+    def tell(self) -> int: ...
+    def truncate(self, size: Optional[int] = ...) -> int: ...
+    def writable(self) -> bool: ...
+    # TODO should be the next line instead
+    # def writelines(self, lines: List[Union[bytes, bytearray]]) -> None: ...
+    def writelines(self, lines: Any) -> None: ...
+    if sys.version_info >= (3, 4):
+        def readline(self, size: int = ...) -> bytes: ...
+        def __del__(self) -> None: ...
+    else:
+        def readline(self, limit: int = ...): ...
+    if sys.version_info >= (3, 2):
+        closed = ...  # type: bool
+    else:
+        def closed(self) -> bool: ...
+    # copied from BufferedIOBase
+    def detach(self) -> RawIOBase: ...
+    def readinto(self, b: bytearray) -> int: ...
+    def write(self, b: Union[bytes, bytearray]) -> int: ...
+    if sys.version_info >= (3, 5):
+        def readinto1(self, b: bytearray) -> int: ...
+    if sys.version_info >= (3, 4):
+        def read(self, size: Optional[int] = ...) -> bytes: ...
+        def read1(self, size: int = ...) -> bytes: ...
+    else:
+        def read(self, n: Optional[int] = ...) -> bytes: ...
+        def read1(self, n: int = ...) -> bytes: ...
+
+class BufferedReader(BufferedIOBase):
+    def __init__(self, raw: RawIOBase, buffer_size: int = ...) -> None: ...
+    if sys.version_info >= (3, 4):
+        def peek(self, size: int = ...) -> bytes: ...
+    else:
+        def peek(self, n: int = ...) -> bytes: ...
+
+class BufferedWriter(BufferedIOBase):
+    def __init__(self, raw: RawIOBase, buffer_size: int = ...) -> None: ...
+    def flush(self) -> None: ...
+    def write(self, b: Union[bytes, bytearray]) -> int: ...
+
+class BufferedRandom(BufferedReader, BufferedWriter):
+    def __init__(self, raw: RawIOBase, buffer_size: int = ...) -> None: ...
+    def seek(self, offset: int, whence: int = ...) -> int: ...
+    def tell(self) -> int: ...
+
+class BufferedRWPair(BufferedIOBase):
+    def __init__(self, reader: RawIOBase, writer: RawIOBase,
+                 buffer_size: int = ...) -> None: ...
+
+
+class TextIOBase(IOBase):
+    encoding = ...  # type: str
+    errors = ...  # type: Optional[str]
+    newlines = ...  # type: Union[str, Tuple[str, ...], None]
+    def __iter__(self) -> Iterator[str]: ...  # type: ignore
+    def __next__(self) -> str: ...  # type: ignore
+    def __enter__(self) -> 'TextIOBase': ...
+    def detach(self) -> IOBase: ...
+    def write(self, s: str) -> int: ...
+    if sys.version_info >= (3, 4):
+        def readline(self, size: int = ...) -> str: ...  # type: ignore
+        def read(self, size: Optional[int] = ...) -> str: ...
+    elif sys.version_info >= (3, 2):
+        def readline(self, limit: int = ...) -> str: ...  # type: ignore
+    else:
+        def readline(self) -> str: ...
+    if sys.version_info >= (3, 2):
+        def seek(self, offset: int, whence: int = ...) -> int: ...
+        def tell(self) -> int: ...
+
+# TODO should extend from TextIOBase
+class TextIOWrapper(TextIO):
+    line_buffering = ...  # type: bool
+    # TODO uncomment after fixing mypy about using write_through
+    # if sys.version_info >= (3, 3):
+    #    def __init__(self, buffer: IO[bytes], encoding: str = ...,
+    #                 errors: Optional[str] = ..., newline: Optional[str] = ...,
+    #                 line_buffering: bool = ..., write_through: bool = ...) \
+    #                 -> None: ...
+    # else:
+    #    def __init__(self, buffer: IO[bytes],
+    #                 encoding: str = ..., errors: Optional[str] = ...,
+    #                 newline: Optional[str] = ..., line_buffering: bool = ...) \
+    #                 -> None: ...
+    def __init__(
+        self,
+        buffer: IO[bytes],
+        encoding: str = ...,
+        errors: Optional[str] = ...,
+        newline: Optional[str] = ...,
+        line_buffering: bool = ...,
+        write_through: bool = ...
+    ) -> None: ...
+    # copied from IOBase
+    def __exit__(self, t: type = None, value: BaseException = None,
+                 traceback: Any = None) -> bool: ...
+    def close(self) -> None: ...
+    def fileno(self) -> int: ...
+    def flush(self) -> None: ...
+    def isatty(self) -> bool: ...
+    def readable(self) -> bool: ...
+    def readlines(self, hint: int = ...) -> List[str]: ...
+    def seekable(self) -> bool: ...
+    def truncate(self, size: Optional[int] = ...) -> int: ...
+    def writable(self) -> bool: ...
+    # TODO should be the next line instead
+    # def writelines(self, lines: List[str]) -> None: ...
+    def writelines(self, lines: Any) -> None: ...
+    if sys.version_info >= (3, 4):
+        def __del__(self) -> None: ...
+    if sys.version_info >= (3, 2):
+        closed = ...  # type: bool
+    else:
+        def closed(self) -> bool: ...
+    # copied from TextIOBase
+    encoding = ...  # type: str
+    errors = ...  # type: Optional[str]
+    newlines = ...  # type: Union[str, Tuple[str, ...], None]
+    def __iter__(self) -> Iterator[str]: ...
+    def __next__(self) -> str: ...
+    def __enter__(self) -> 'TextIO': ...
+    def detach(self) -> IOBase: ...
+    def write(self, s: str) -> int: ...
+    if sys.version_info >= (3, 4):
+        def readline(self, size: int = ...) -> str: ...
+        def read(self, size: Optional[int] = ...) -> str: ...
+    elif sys.version_info >= (3, 2):
+        def readline(self, limit: int = ...) -> str: ...
+    else:
+        def readline(self) -> str: ...
+    if sys.version_info >= (3, 2):
+        def seek(self, offset: int, whence: int = ...) -> int: ...
+        def tell(self) -> int: ...
+
+class StringIO(TextIOWrapper):
+    def __init__(self, initial_value: str = ...,
+                 newline: Optional[str] = ...) -> None: ...
+    name = ...  # type: str
+    def getvalue(self) -> str: ...
+
+class IncrementalNewlineDecoder(codecs.IncrementalDecoder): ...
diff --git a/typeshed/stdlib/3/itertools.pyi b/typeshed/stdlib/3/itertools.pyi
new file mode 100644
index 0000000..8296d62
--- /dev/null
+++ b/typeshed/stdlib/3/itertools.pyi
@@ -0,0 +1,63 @@
+# Stubs for itertools
+
+# Based on http://docs.python.org/3.2/library/itertools.html
+
+from typing import (Iterator, TypeVar, Iterable, overload, Any, Callable, Tuple,
+                    Union, Sequence, Generic, Optional)
+
+_T = TypeVar('_T')
+_S = TypeVar('_S')
+
+def count(start: int = ...,
+          step: int = ...) -> Iterator[int]: ...  # more general types?
+def cycle(iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+ at overload
+def repeat(object: _T) -> Iterator[_T]: ...
+ at overload
+def repeat(object: _T, times: int) -> Iterator[_T]: ...
+
+def accumulate(iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+class chain(Iterator[_T], Generic[_T]):
+    def __init__(self, *iterables: Iterable[_T]) -> None: ...
+    def __next__(self) -> _T: ...
+    def __iter__(self) -> Iterator[_T]: ...
+    @staticmethod
+    def from_iterable(iterable: Iterable[Iterable[_S]]) -> Iterator[_S]: ...
+
+def compress(data: Iterable[_T], selectors: Iterable[Any]) -> Iterator[_T]: ...
+def dropwhile(predicate: Callable[[_T], Any],
+              iterable: Iterable[_T]) -> Iterator[_T]: ...
+def filterfalse(predicate: Callable[[_T], Any],
+                iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+ at overload
+def groupby(iterable: Iterable[_T]) -> Iterator[Tuple[_T, Iterator[_T]]]: ...
+ at overload
+def groupby(iterable: Iterable[_T],
+            key: Callable[[_T], _S]) -> Iterator[Tuple[_S, Iterator[_T]]]: ...
+
+ at overload
+def islice(iterable: Iterable[_T], stop: int) -> Iterator[_T]: ...
+ at overload
+def islice(iterable: Iterable[_T], start: int, stop: Optional[int],
+           step: int = ...) -> Iterator[_T]: ...
+
+def starmap(func: Any, iterable: Iterable[Any]) -> Iterator[Any]: ...
+def takewhile(predicate: Callable[[_T], Any],
+              iterable: Iterable[_T]) -> Iterator[_T]: ...
+def tee(iterable: Iterable[Any], n: int = ...) -> Iterator[Any]: ...
+def zip_longest(*p: Iterable[Any],
+                fillvalue: Any = ...) -> Iterator[Any]: ...
+
+# TODO: Return type should be Iterator[Tuple[..]], but unknown tuple shape.
+#       Iterator[Sequence[_T]] loses this type information.
+def product(*p: Iterable[_T], repeat: int = ...) -> Iterator[Sequence[_T]]: ...
+
+def permutations(iterable: Iterable[_T],
+                 r: Union[int, None] = ...) -> Iterator[Sequence[_T]]: ...
+def combinations(iterable: Iterable[_T],
+                 r: int) -> Iterable[Sequence[_T]]: ...
+def combinations_with_replacement(iterable: Iterable[_T],
+                                  r: int) -> Iterable[Sequence[_T]]: ...
diff --git a/typeshed/stdlib/3/json.pyi b/typeshed/stdlib/3/json.pyi
new file mode 100644
index 0000000..368cae4
--- /dev/null
+++ b/typeshed/stdlib/3/json.pyi
@@ -0,0 +1,88 @@
+from typing import Any, IO, Iterator, Optional, Tuple, Callable, Dict, List, Union
+
+class JSONDecodeError(ValueError):
+    def dumps(self, obj: Any) -> str: ...
+    def dump(self, obj: Any, fp: IO[str], *args: Any, **kwds: Any) -> None: ...
+    def loads(self, s: str) -> Any: ...
+    def load(self, fp: IO[str]) -> Any: ...
+
+def dumps(obj: Any,
+    skipkeys: bool = ...,
+    ensure_ascii: bool = ...,
+    check_circular: bool = ...,
+    allow_nan: bool = ...,
+    cls: Any = ...,
+    indent: Union[None, int, str] = ...,
+    separators: Optional[Tuple[str, str]] = ...,
+    default: Optional[Callable[[Any], Any]] = ...,
+    sort_keys: bool = ...,
+    **kwds: Any) -> str: ...
+
+def dump(obj: Any,
+    fp: IO[str],
+    skipkeys: bool = ...,
+    ensure_ascii: bool = ...,
+    check_circular: bool = ...,
+    allow_nan: bool = ...,
+    cls: Any = ...,
+    indent: Union[None, int, str] = ...,
+    separators: Optional[Tuple[str, str]] = ...,
+    default: Optional[Callable[[Any], Any]] = ...,
+    sort_keys: bool = ...,
+    **kwds: Any) -> None: ...
+
+def loads(s: str,
+    encoding: Any = ...,  # ignored and deprecated
+    cls: Any = ...,
+    object_hook: Optional[Callable[[Dict], Any]] = ...,
+    parse_float: Optional[Callable[[str], Any]] = ...,
+    parse_int: Optional[Callable[[str], Any]] = ...,
+    parse_constant: Optional[Callable[[str], Any]] = ...,
+    object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ...,
+    **kwds: Any) -> Any: ...
+
+def load(fp: IO[str],
+    cls: Any = ...,
+    object_hook: Optional[Callable[[Dict], Any]] = ...,
+    parse_float: Optional[Callable[[str], Any]] = ...,
+    parse_int: Optional[Callable[[str], Any]] = ...,
+    parse_constant: Optional[Callable[[str], Any]] = ...,
+    object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ...,
+    **kwds: Any) -> Any: ...
+
+class JSONEncoder(object):
+    item_separator = ...  # type: str
+    key_separator = ...  # type: str
+
+    skipkeys = ...  # type: bool
+    ensure_ascii = ...  # type: bool
+    check_circular = ...  # type: bool
+    allow_nan = ...  # type: bool
+    sort_keys = ...  # type: bool
+    indent = None  # type: int
+
+    def __init__(self, skipkeys: bool=..., ensure_ascii: bool=...,
+            check_circular: bool=..., allow_nan: bool=..., sort_keys: bool=...,
+            indent: int=None, separators: Tuple[str, str]=None, default: Callable=None) -> None: ...
+
+    def default(self, o: Any) -> Any: ...
+    def encode(self, o: Any) -> str: ...
+    def iterencode(self, o: Any, _one_shot: bool=False) -> Iterator[str]: ...
+
+class JSONDecoder(object):
+
+    object_hook = None  # type: Callable[[Dict[str, Any]], Any]
+    parse_float = ...  # Callable[[str], Any]
+    parse_int = ...  # Callable[[str], Any]
+    parse_constant = ...  # Callable[[str], Any]
+    strict = ...  # type: bool
+    object_pairs_hook = None  # type: Callable[[List[Tuple[str, Any]]], Any]
+
+    def __init__(self, object_hook: Callable[[Dict[str, Any]], Any]=None,
+            parse_float: Callable[[str], Any]=None,
+            parse_int: Callable[[str], Any]=None,
+            parse_constant: Callable[[str], Any]=None,
+            strict: bool=True,
+            object_pairs_hook: Callable[[List[Tuple[str, Any]]], Any]=None) -> None: ...
+    def decode(self, s: str) -> Any: ...
+    def raw_decode(self, s: str, idx: int=...) -> Tuple[Any, int]: ...
diff --git a/typeshed/stdlib/3/linecache.pyi b/typeshed/stdlib/3/linecache.pyi
new file mode 100644
index 0000000..a77de88
--- /dev/null
+++ b/typeshed/stdlib/3/linecache.pyi
@@ -0,0 +1,5 @@
+from typing import Any
+
+def getline(filename: str, lineno: int, module_globals: Any=...) -> str: pass
+def clearcache() -> None: pass
+def getlines(filename: str, module_globals: Any=...) -> None: pass
diff --git a/typeshed/stdlib/3/msvcrt.pyi b/typeshed/stdlib/3/msvcrt.pyi
new file mode 100644
index 0000000..bcab64c
--- /dev/null
+++ b/typeshed/stdlib/3/msvcrt.pyi
@@ -0,0 +1,8 @@
+# Stubs for msvcrt
+
+# NOTE: These are incomplete!
+
+from typing import overload, BinaryIO, TextIO
+
+def get_osfhandle(file: int) -> int: ...
+def open_osfhandle(handle: int, flags: int) -> int: ...
diff --git a/typeshed/stdlib/3/multiprocessing/__init__.pyi b/typeshed/stdlib/3/multiprocessing/__init__.pyi
new file mode 100644
index 0000000..8ab505e
--- /dev/null
+++ b/typeshed/stdlib/3/multiprocessing/__init__.pyi
@@ -0,0 +1,99 @@
+# Stubs for multiprocessing
+
+from typing import Any, Callable, Iterable, Mapping, Optional, Dict, List
+
+from multiprocessing.process import current_process as current_process
+
+class Lock():
+    def acquire(self, block: bool = ..., timeout: int = ...) -> None: ...
+    def release(self) -> None: ...
+
+class AsyncResult():
+    def get(self, timeout: float = -1) -> Any: ...
+    def wait(self, timeout: float = -1) -> None: ...
+    def ready(self) -> bool: ...
+    def successful(self) -> bool: ...
+
+class Pool():
+    def __init__(self, processes: Optional[int] = None,
+                 initializer: Optional[Callable[..., None]] = None,
+                 initargs: Iterable[Any] = (),
+                 maxtasksperchild: Optional[int] = None,
+                 context: Any = None) -> None: ...
+    def apply(self,
+              func: Callable[..., Any],
+              args: Iterable[Any]=(),
+              kwds: Dict[str, Any]=...) -> Any: ...
+    def apply_async(self,
+                func: Callable[..., Any],
+                args: Iterable[Any]=(),
+                kwds: Dict[str, Any]=...,
+                callback: Callable[..., None] = None,
+                error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+    def map(self,
+            func: Callable[..., Any],
+            iterable: Iterable[Any]=(),
+            chunksize: Optional[int] = None) -> List[Any]: ...
+    def map_async(self, func: Callable[..., Any],
+                  iterable: Iterable[Any] = (),
+                  chunksize: Optional[int] = None,
+                  callback: Callable[..., None] = None,
+                  error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+    def imap(self,
+             func: Callable[..., Any],
+             iterable: Iterable[Any]=(),
+             chunksize: Optional[int] = None) -> Iterable[Any]: ...
+    def imap_unordered(self,
+                       func: Callable[..., Any],
+                       iterable: Iterable[Any]=(),
+                       chunksize: Optional[int] = None) -> Iterable[Any]: ...
+    def starmap(self,
+                func: Callable[..., Any],
+                iterable: Iterable[Iterable[Any]]=(),
+                chunksize: Optional[int] = None) -> List[Any]: ...
+    def starmap_async(self,
+                      func: Callable[..., Any],
+                      iterable: Iterable[Iterable[Any]] = (),
+                      chunksize: Optional[int] = None,
+                      callback: Callable[..., None] = None,
+                      error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+    def close(self) -> None: ...
+    def terminate(self) -> None: ...
+    def join(self) -> None: ...
+    def __enter__(self) -> 'Pool': ...
+    def __exit__(self, exc_type, exc_val, exc_tb) -> None: ...
+
+class Process():
+    # TODO: set type of group to None
+    def __init__(self,
+                 group: Any = ...,
+                 target: Callable = ...,
+                 name: str = ...,
+                 args: Iterable[Any] = ...,
+                 kwargs: Mapping[Any, Any] = ...,
+                 daemon: bool = ...) -> None: ...
+    def start(self) -> None: ...
+    def run(self) -> None: ...
+    def terminate(self) -> None: ...
+    def is_alive(self) -> bool: ...
+    def join(self, timeout: float = ...) -> None: ...
+
+class Queue():
+    def __init__(self, maxsize: int = ...) -> None: ...
+    def get(self, block: bool = ..., timeout: float = ...) -> Any: ...
+    def put(self, item: Any, block: bool = ..., timeout: float = ...) -> None: ...
+    def qsize(self) -> int: ...
+    def empty(self) -> bool: ...
+    def full(self) -> bool: ...
+    def put_nowait(self, item: Any) -> None: ...
+    def get_nowait(self) -> Any: ...
+    def close(self) -> None: ...
+    def join_thread(self) -> None: ...
+    def cancel_join_thread(self) -> None: ...
+
+class Value():
+    def __init__(self, typecode_or_type: str, *args: Any, lock: bool = ...) -> None: ...
+
+# ----- multiprocessing function stubs -----
+def cpu_count() -> int: ...
+def freeze_support() -> None: ...
diff --git a/typeshed/stdlib/3/multiprocessing/managers.pyi b/typeshed/stdlib/3/multiprocessing/managers.pyi
new file mode 100644
index 0000000..c5d053e
--- /dev/null
+++ b/typeshed/stdlib/3/multiprocessing/managers.pyi
@@ -0,0 +1,10 @@
+# Stubs for multiprocessing.managers
+
+# NOTE: These are incomplete!
+
+from typing import Any
+
+class BaseManager:
+    def register(self, typeid: str, callable: Any = ...) -> None: ...
+
+class RemoteError(Exception): ...
diff --git a/typeshed/stdlib/3/multiprocessing/pool.pyi b/typeshed/stdlib/3/multiprocessing/pool.pyi
new file mode 100644
index 0000000..ed91749
--- /dev/null
+++ b/typeshed/stdlib/3/multiprocessing/pool.pyi
@@ -0,0 +1,58 @@
+# Stubs for multiprocessing.pool
+
+# NOTE: These are incomplete!
+
+from typing import Any, Callable, Iterable, Mapping, Optional, Dict, List
+
+class AsyncResult():
+    def get(self, timeout: float = -1) -> Any: ...
+    def wait(self, timeout: float = -1) -> None: ...
+    def ready(self) -> bool: ...
+    def successful(self) -> bool: ...
+
+class ThreadPool():
+    def __init__(self, processes: Optional[int] = None,
+                 initializer: Optional[Callable[..., None]] = None,
+                 initargs: Iterable[Any] = ()) -> None: ...
+    def apply(self,
+              func: Callable[..., Any],
+              args: Iterable[Any]=(),
+              kwds: Dict[str, Any]=...) -> Any: ...
+    def apply_async(self,
+                func: Callable[..., Any],
+                args: Iterable[Any]=(),
+                kwds: Dict[str, Any]=...,
+                callback: Callable[..., None] = None,
+                error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+    def map(self,
+            func: Callable[..., Any],
+            iterable: Iterable[Any]=(),
+            chunksize: Optional[int] = None) -> List[Any]: ...
+    def map_async(self, func: Callable[..., Any],
+                  iterable: Iterable[Any] = (),
+                  chunksize: Optional[int] = None,
+                  callback: Callable[..., None] = None,
+                  error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+    def imap(self,
+             func: Callable[..., Any],
+             iterable: Iterable[Any]=(),
+             chunksize: Optional[int] = None) -> Iterable[Any]: ...
+    def imap_unordered(self,
+                       func: Callable[..., Any],
+                       iterable: Iterable[Any]=(),
+                       chunksize: Optional[int] = None) -> Iterable[Any]: ...
+    def starmap(self,
+                func: Callable[..., Any],
+                iterable: Iterable[Iterable[Any]]=(),
+                chunksize: Optional[int] = None) -> List[Any]: ...
+    def starmap_async(self,
+                      func: Callable[..., Any],
+                      iterable: Iterable[Iterable[Any]] = (),
+                      chunksize: Optional[int] = None,
+                      callback: Callable[..., None] = None,
+                      error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+    def close(self) -> None: ...
+    def terminate(self) -> None: ...
+    def join(self) -> None: ...
+    def __enter__(self) -> 'ThreadPool': ...
+    def __exit__(self, exc_type, exc_val, exc_tb) -> None: ...
diff --git a/typeshed/stdlib/3/multiprocessing/process.pyi b/typeshed/stdlib/3/multiprocessing/process.pyi
new file mode 100644
index 0000000..df8ea93
--- /dev/null
+++ b/typeshed/stdlib/3/multiprocessing/process.pyi
@@ -0,0 +1,5 @@
+from typing import List
+from multiprocessing import Process
+
+def current_process() -> Process: ...
+def active_children() -> List[Process]: ...
diff --git a/typeshed/stdlib/3/opcode.pyi b/typeshed/stdlib/3/opcode.pyi
new file mode 100644
index 0000000..e577a9f
--- /dev/null
+++ b/typeshed/stdlib/3/opcode.pyi
@@ -0,0 +1,18 @@
+from typing import List, Dict, Sequence
+
+cmp_op = ...  # type: Sequence[str]
+hasconst = ...  # type: List[int]
+hasname = ...  # type: List[int]
+hasjrel = ...  # type: List[int]
+hasjabs = ...  # type: List[int]
+haslocal = ...  # type: List[int]
+hascompare = ...  # type: List[int]
+hasfree = ...  # type: List[int]
+opname = ...  # type: List[str]
+
+opmap = ...  # Dict[str, int]
+HAVE_ARGUMENT = ...  # type: int
+EXTENDED_ARG = ...  # type: int
+hasnargs = ...  # type: List[int]
+
+def stack_effect(opcode: int, oparg: int = ...) -> int: ...
diff --git a/typeshed/stdlib/3/os/__init__.pyi b/typeshed/stdlib/3/os/__init__.pyi
new file mode 100644
index 0000000..4f5deea
--- /dev/null
+++ b/typeshed/stdlib/3/os/__init__.pyi
@@ -0,0 +1,386 @@
+# Stubs for os
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http: //docs.python.org/3.2/library/os.html
+
+from builtins import OSError as error
+from io import TextIOWrapper as _TextIOWrapper
+import sys
+from typing import (
+    Mapping, MutableMapping, Dict, List, Any, Tuple, Iterator, overload, Union, AnyStr,
+    Optional, Generic, Set, Callable
+)
+from . import path
+from mypy_extensions import NoReturn
+
+# ----- os variables -----
+
+supports_bytes_environ = False  # TODO: True when bytes implemented?
+
+SEEK_SET = 0
+SEEK_CUR = 0
+SEEK_END = 0
+
+O_RDONLY = 0
+O_WRONLY = 0
+O_RDWR = 0
+O_APPEND = 0
+O_CREAT = 0
+O_EXCL = 0
+O_TRUNC = 0
+O_DSYNC = 0    # Unix only
+O_RSYNC = 0    # Unix only
+O_SYNC = 0     # Unix only
+O_NDELAY = 0   # Unix only
+O_NONBLOCK = 0  # Unix only
+O_NOCTTY = 0   # Unix only
+O_SHLOCK = 0   # Unix only
+O_EXLOCK = 0   # Unix only
+O_BINARY = 0     # Windows only
+O_NOINHERIT = 0  # Windows only
+O_SHORT_LIVED = 0  # Windows only
+O_TEMPORARY = 0  # Windows only
+O_RANDOM = 0     # Windows only
+O_SEQUENTIAL = 0  # Windows only
+O_TEXT = 0       # Windows only
+O_ASYNC = 0      # Gnu extension if in C library
+O_DIRECT = 0     # Gnu extension if in C library
+O_DIRECTORY = 0  # Gnu extension if in C library
+O_NOFOLLOW = 0   # Gnu extension if in C library
+O_NOATIME = 0    # Gnu extension if in C library
+
+curdir = ...  # type: str
+pardir = ...  # type: str
+sep = ...  # type: str
+altsep = ...  # type: str
+extsep = ...  # type: str
+pathsep = ...  # type: str
+defpath = ...  # type: str
+linesep = ...  # type: str
+devnull = ...  # type: str
+name = ...  # type: str
+
+F_OK = 0
+R_OK = 0
+W_OK = 0
+X_OK = 0
+
+class _Environ(MutableMapping[AnyStr, AnyStr], Generic[AnyStr]):
+    def copy(self) -> Dict[AnyStr, AnyStr]: ...
+
+environ = ...  # type: _Environ[str]
+environb = ...  # type: _Environ[bytes]
+
+confstr_names = ...  # type: Dict[str, int]  # Unix only
+pathconf_names = ...  # type: Dict[str, int]  # Unix only
+sysconf_names = ...  # type: Dict[str, int]  # Unix only
+
+EX_OK = 0        # Unix only
+EX_USAGE = 0     # Unix only
+EX_DATAERR = 0   # Unix only
+EX_NOINPUT = 0   # Unix only
+EX_NOUSER = 0    # Unix only
+EX_NOHOST = 0    # Unix only
+EX_UNAVAILABLE = 0  # Unix only
+EX_SOFTWARE = 0  # Unix only
+EX_OSERR = 0     # Unix only
+EX_OSFILE = 0    # Unix only
+EX_CANTCREAT = 0  # Unix only
+EX_IOERR = 0     # Unix only
+EX_TEMPFAIL = 0  # Unix only
+EX_PROTOCOL = 0  # Unix only
+EX_NOPERM = 0    # Unix only
+EX_CONFIG = 0    # Unix only
+EX_NOTFOUND = 0  # Unix only
+
+P_NOWAIT = 0
+P_NOWAITO = 0
+P_WAIT = 0
+# P_DETACH = 0  # Windows only
+# P_OVERLAY = 0  # Windows only
+
+# wait()/waitpid() options
+WNOHANG = 0  # Unix only
+# WCONTINUED = 0  # some Unix systems
+# WUNTRACED = 0  # Unix only
+
+TMP_MAX = 0  # Undocumented, but used by tempfile
+
+# ----- os classes (structures) -----
+if sys.version_info >= (3, 6):
+    class PathLike:
+        def __fspath__(self) -> AnyStr: ...
+
+
+if sys.version_info >= (3, 5):
+    class DirEntry:
+        # This is what the scandir interator yields
+        # The constructor is hidden
+
+        name = ''
+        path = ''
+        def inode(self) -> int: ...
+        def is_dir(self, follow_symlinks: bool = ...) -> bool: ...
+        def is_file(self, follow_symlinks: bool = ...) -> bool: ...
+        def is_symlink(self) -> bool: ...
+        def stat(self) -> stat_result: ...
+
+
+class stat_result:
+    # For backward compatibility, the return value of stat() is also
+    # accessible as a tuple of at least 10 integers giving the most important
+    # (and portable) members of the stat structure, in the order st_mode,
+    # st_ino, st_dev, st_nlink, st_uid, st_gid, st_size, st_atime, st_mtime,
+    # st_ctime. More items may be added at the end by some implementations.
+
+    st_mode = 0  # protection bits,
+    st_ino = 0  # inode number,
+    st_dev = 0  # device,
+    st_nlink = 0  # number of hard links,
+    st_uid = 0  # user id of owner,
+    st_gid = 0  # group id of owner,
+    st_size = 0  # size of file, in bytes,
+    st_atime = 0.0  # time of most recent access,
+    st_mtime = 0.0  # time of most recent content modification,
+    st_ctime = 0.0  # platform dependent (time of most recent metadata change on Unix, or the time of creation on Windows)
+
+    if sys.version_info >= (3, 3):
+        st_atime_ns = 0  # time of most recent access, in nanoseconds
+        st_mtime_ns = 0  # time of most recent content modification in nanoseconds
+        st_ctime_ns = 0  # platform dependent (time of most recent metadata change on Unix, or the time of creation on Windows) in nanoseconds
+
+    # not documented
+    def __init__(self, tuple: Tuple[int, ...]) -> None: ...
+
+    # On some Unix systems (such as Linux), the following attributes may also
+    # be available:
+    st_blocks = 0  # number of blocks allocated for file
+    st_blksize = 0  # filesystem blocksize
+    st_rdev = 0  # type of device if an inode device
+    st_flags = 0  # user defined flags for file
+
+    # On other Unix systems (such as FreeBSD), the following attributes may be
+    # available (but may be only filled out if root tries to use them):
+    st_gen = 0  # file generation number
+    st_birthtime = 0  # time of file creation
+
+    # On Mac OS systems, the following attributes may also be available:
+    st_rsize = 0
+    st_creator = 0
+    st_type = 0
+
+class statvfs_result:  # Unix only
+    f_bsize = 0
+    f_frsize = 0
+    f_blocks = 0
+    f_bfree = 0
+    f_bavail = 0
+    f_files = 0
+    f_ffree = 0
+    f_favail = 0
+    f_flag = 0
+    f_namemax = 0
+
+# ----- os function stubs -----
+def fsencode(filename: str) -> bytes: ...
+def fsdecode(filename: bytes) -> str: ...
+def get_exec_path(env: Optional[Mapping[str, str]] = ...) -> List[str]: ...
+# NOTE: get_exec_path(): returns List[bytes] when env not None
+def ctermid() -> str: ...  # Unix only
+def getegid() -> int: ...  # Unix only
+def geteuid() -> int: ...  # Unix only
+def getgid() -> int: ...   # Unix only
+def getgroups() -> List[int]: ...  # Unix only, behaves differently on Mac
+def initgroups(username: str, gid: int) -> None: ...  # Unix only
+def getlogin() -> str: ...
+def getpgid(pid: int) -> int: ...  # Unix only
+def getpgrp() -> int: ...  # Unix only
+def getpid() -> int: ...
+def getppid() -> int: ...
+def getresuid() -> Tuple[int, int, int]: ...  # Unix only
+def getresgid() -> Tuple[int, int, int]: ...  # Unix only
+def getuid() -> int: ...  # Unix only
+def getenv(key: str, default: str = ...) -> str: ...
+def getenvb(key: bytes, default: bytes = ...) -> bytes: ...
+# TODO mixed str/bytes putenv arguments
+def putenv(key: AnyStr, value: AnyStr) -> None: ...
+def setegid(egid: int) -> None: ...  # Unix only
+def seteuid(euid: int) -> None: ...  # Unix only
+def setgid(gid: int) -> None: ...  # Unix only
+def setgroups(groups: List[int]) -> None: ...  # Unix only
+def setpgrp() -> int: ...  # Unix only
+def setpgid(pid: int, pgrp: int) -> int: ...  # Unix only
+def setregid(rgid: int, egid: int) -> None: ...  # Unix only
+def setresgid(rgid: int, egid: int, sgid: int) -> None: ...  # Unix only
+def setresuid(ruid: int, euid: int, suid: int) -> None: ...  # Unix only
+def setreuid(ruid: int, euid: int) -> None: ...  # Unix only
+def getsid(pid: int) -> int: ...  # Unix only
+def setsid() -> int: ...  # Unix only
+def setuid(uid: int) -> None: ...  # Unix only
+def strerror(code: int) -> str: ...
+def umask(mask: int) -> int: ...
+def uname() -> Tuple[str, str, str, str, str]: ...  # Unix only
+def unsetenv(key: AnyStr) -> None: ...
+# Return IO or TextIO
+def fdopen(fd: int, mode: str = ..., buffering: int = ..., encoding: str = ...,
+           errors: str = ..., newline: str = ..., closefd: bool = ...) -> Any: ...
+def close(fd: int) -> None: ...
+def closerange(fd_low: int, fd_high: int) -> None: ...
+def device_encoding(fd: int) -> Optional[str]: ...
+def dup(fd: int) -> int: ...
+def dup2(fd: int, fd2: int) -> None: ...
+def fchmod(fd: int, mode: int) -> None: ...  # Unix only
+def fchown(fd: int, uid: int, gid: int) -> None: ...  # Unix only
+def fdatasync(fd: int) -> None: ...  # Unix only, not Mac
+def fpathconf(fd: int, name: str) -> int: ...  # Unix only
+def fstat(fd: int) -> stat_result: ...
+def fstatvfs(fd: int) -> statvfs_result: ...  # Unix only
+def fsync(fd: int) -> None: ...
+def ftruncate(fd: int, length: int) -> None: ...  # Unix only
+def isatty(fd: int) -> bool: ...  # Unix only
+def lseek(fd: int, pos: int, how: int) -> int: ...
+def open(file: AnyStr, flags: int, mode: int = ...) -> int: ...
+def openpty() -> Tuple[int, int]: ...  # some flavors of Unix
+def pipe() -> Tuple[int, int]: ...
+def read(fd: int, n: int) -> bytes: ...
+def tcgetpgrp(fd: int) -> int: ...  # Unix only
+def tcsetpgrp(fd: int, pg: int) -> None: ...  # Unix only
+def ttyname(fd: int) -> str: ...  # Unix only
+def write(fd: int, string: bytes) -> int: ...
+def access(path: AnyStr, mode: int) -> bool: ...
+def chdir(path: AnyStr) -> None: ...
+def fchdir(fd: int) -> None: ...
+def getcwd() -> str: ...
+def getcwdb() -> bytes: ...
+def chflags(path: str, flags: int) -> None: ...  # Unix only
+def chroot(path: str) -> None: ...  # Unix only
+def chmod(path: AnyStr, mode: int) -> None: ...
+def chown(path: AnyStr, uid: int, gid: int) -> None: ...  # Unix only
+def lchflags(path: str, flags: int) -> None: ...  # Unix only
+def lchmod(path: str, mode: int) -> None: ...  # Unix only
+def lchown(path: str, uid: int, gid: int) -> None: ...  # Unix only
+def link(src: AnyStr, link_name: AnyStr) -> None: ...
+
+ at overload
+def listdir(path: str = ...) -> List[str]: ...
+ at overload
+def listdir(path: bytes) -> List[bytes]: ...
+
+def lstat(path: AnyStr) -> stat_result: ...
+def mkfifo(path: str, mode: int = ...) -> None: ...  # Unix only
+def mknod(filename: AnyStr, mode: int = ..., device: int = ...) -> None: ...
+def major(device: int) -> int: ...
+def minor(device: int) -> int: ...
+def makedev(major: int, minor: int) -> int: ...
+def mkdir(path: AnyStr, mode: int = ...) -> None: ...
+def makedirs(path: AnyStr, mode: int = ...,
+             exist_ok: bool = ...) -> None: ...
+def pathconf(path: str, name: str) -> int: ...  # Unix only
+def readlink(path: AnyStr) -> AnyStr: ...
+def remove(path: AnyStr) -> None: ...
+def removedirs(path: AnyStr) -> None: ...
+def rename(src: AnyStr, dst: AnyStr) -> None: ...
+def renames(old: AnyStr, new: AnyStr) -> None: ...
+if sys.version_info >= (3, 3):
+    def replace(src: AnyStr, dst: AnyStr) -> None: ...
+def rmdir(path: AnyStr) -> None: ...
+if sys.version_info >= (3, 5):
+    @overload
+    def scandir(path: str = ...) -> Iterator[DirEntry]: ...
+    @overload
+    def scandir(path: bytes) -> Iterator[DirEntry]: ...
+def stat(path: AnyStr) -> stat_result: ...
+def stat_float_times(newvalue: Union[bool, None] = ...) -> bool: ...
+def statvfs(path: str) -> statvfs_result: ...  # Unix only
+def symlink(source: AnyStr, link_name: AnyStr,
+            target_is_directory: bool = ...) -> None:
+    ...  # final argument in Windows only
+def unlink(path: AnyStr) -> None: ...
+def utime(path: AnyStr, times: Union[Tuple[int, int], Tuple[float, float]] = ...) -> None: ...
+
+# TODO onerror: function from OSError to void
+def walk(top: AnyStr, topdown: bool = ..., onerror: Any = ...,
+         followlinks: bool = ...) -> Iterator[Tuple[AnyStr, List[AnyStr],
+                                                    List[AnyStr]]]: ...
+
+def abort() -> 'None': ...
+def execl(path: AnyStr, arg0: AnyStr, *args: AnyStr) -> None: ...
+def execle(path: AnyStr, arg0: AnyStr,
+           *args: Any) -> None: ...  # Imprecise signature
+def execlp(path: AnyStr, arg0: AnyStr, *args: AnyStr) -> None: ...
+def execlpe(path: AnyStr, arg0: AnyStr,
+            *args: Any) -> None: ...  # Imprecise signature
+def execv(path: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]]) -> None: ...
+def execve(path: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]], env: Mapping[AnyStr, AnyStr]) -> None: ...
+def execvp(file: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]]) -> None: ...
+def execvpe(file: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]],
+            env: Mapping[str, str]) -> None: ...
+def _exit(n: int) -> NoReturn: ...
+def fork() -> int: ...  # Unix only
+def forkpty() -> Tuple[int, int]: ...  # some flavors of Unix
+def kill(pid: int, sig: int) -> None: ...
+def killpg(pgid: int, sig: int) -> None: ...  # Unix only
+def nice(increment: int) -> int: ...  # Unix only
+def plock(op: int) -> None: ...  # Unix only ???op is int?
+
+class popen(_TextIOWrapper):
+    # TODO 'b' modes or bytes command not accepted?
+    def __init__(self, command: str, mode: str = ...,
+                 bufsize: int = ...) -> None: ...
+    def close(self) -> Any: ...  # may return int
+
+def spawnl(mode: int, path: AnyStr, arg0: AnyStr, *args: AnyStr) -> int: ...
+def spawnle(mode: int, path: AnyStr, arg0: AnyStr,
+            *args: Any) -> int: ...  # Imprecise sig
+def spawnlp(mode: int, file: AnyStr, arg0: AnyStr,
+            *args: AnyStr) -> int: ...  # Unix only TODO
+def spawnlpe(mode: int, file: AnyStr, arg0: AnyStr, *args: Any) -> int:
+    ...  # Imprecise signature; Unix only TODO
+def spawnv(mode: int, path: AnyStr, args: List[AnyStr]) -> int: ...
+def spawnve(mode: int, path: AnyStr, args: List[AnyStr],
+            env: Mapping[str, str]) -> int: ...
+def spawnvp(mode: int, file: AnyStr, args: List[AnyStr]) -> int: ...  # Unix only
+def spawnvpe(mode: int, file: AnyStr, args: List[AnyStr],
+             env: Mapping[str, str]) -> int:
+    ...  # Unix only
+def startfile(path: str, operation: Union[str, None] = ...) -> None: ...  # Windows only
+def system(command: AnyStr) -> int: ...
+def times() -> Tuple[float, float, float, float, float]: ...
+def wait() -> Tuple[int, int]: ...  # Unix only
+def waitpid(pid: int, options: int) -> Tuple[int, int]: ...
+def wait3(options: Union[int, None] = ...) -> Tuple[int, int, Any]: ...  # Unix only
+def wait4(pid: int, options: int) -> Tuple[int, int, Any]:
+    ...  # Unix only
+def WCOREDUMP(status: int) -> bool: ...  # Unix only
+def WIFCONTINUED(status: int) -> bool: ...  # Unix only
+def WIFSTOPPED(status: int) -> bool: ...  # Unix only
+def WIFSIGNALED(status: int) -> bool: ...  # Unix only
+def WIFEXITED(status: int) -> bool: ...  # Unix only
+def WEXITSTATUS(status: int) -> bool: ...  # Unix only
+def WSTOPSIG(status: int) -> bool: ...  # Unix only
+def WTERMSIG(status: int) -> bool: ...  # Unix only
+def confstr(name: str) -> str: ...  # Unix only
+def getloadavg() -> Tuple[float, float, float]: ...  # Unix only
+def sysconf(name: str) -> int: ...  # Unix only
+def urandom(n: int) -> bytes: ...
+
+def sched_getaffinity(id: int) -> Set[int]: ...
+class waitresult:
+    si_pid = 0
+def waitid(idtype: int, id: int, options: int) -> waitresult: ...
+P_ALL = 0
+WEXITED = 0
+WNOWAIT = 0
+
+if sys.version_info >= (3, 3):
+    def sync() -> None: ...  # Unix only
+
+    def truncate(path: Union[AnyStr, int], length: int) -> None: ...  # Unix only up to version 3.4
+
+    def fwalk(top: AnyStr = ..., topdown: bool = ...,
+              onerror: Callable = ..., *, follow_symlinks: bool = ...,
+              dir_fd: int = ...) -> Iterator[Tuple[AnyStr, List[AnyStr],
+                                             List[AnyStr], int]]: ...  # Unix only
+
+if sys.version_info >= (3, 4):
+    def cpu_count() -> Optional[int]: ...
diff --git a/typeshed/stdlib/3/os/path.pyi b/typeshed/stdlib/3/os/path.pyi
new file mode 100644
index 0000000..c695c57
--- /dev/null
+++ b/typeshed/stdlib/3/os/path.pyi
@@ -0,0 +1,65 @@
+# Stubs for os.path
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http://docs.python.org/3.2/library/os.path.html
+
+import sys
+from typing import overload, List, Any, AnyStr, Sequence, Tuple, BinaryIO, TextIO
+
+# ----- os.path variables -----
+supports_unicode_filenames = False
+# aliases (also in os)
+curdir = ...  # type: str
+pardir = ...  # type: str
+sep = ...  # type: str
+altsep = ...  # type: str
+extsep = ...  # type: str
+pathsep = ...  # type: str
+defpath = ...  # type: str
+devnull = ...  # type: str
+
+# ----- os.path function stubs -----
+def abspath(path: AnyStr) -> AnyStr: ...
+def basename(path: AnyStr) -> AnyStr: ...
+
+if sys.version_info >= (3, 5):
+    def commonpath(paths: Sequence[AnyStr]) -> AnyStr: ...
+
+# NOTE: Empty List[bytes] results in '' (str) => fall back to Any return type.
+def commonprefix(list: List[AnyStr]) -> Any: ...
+def dirname(path: AnyStr) -> AnyStr: ...
+def exists(path: AnyStr) -> bool: ...
+def lexists(path: AnyStr) -> bool: ...
+def expanduser(path: AnyStr) -> AnyStr: ...
+def expandvars(path: AnyStr) -> AnyStr: ...
+
+
+# These return float if os.stat_float_times() == True
+def getatime(path: AnyStr) -> Any: ...
+def getmtime(path: AnyStr) -> Any: ...
+def getctime(path: AnyStr) -> Any: ...
+
+def getsize(path: AnyStr) -> int: ...
+def isabs(path: AnyStr) -> bool: ...
+def isfile(path: AnyStr) -> bool: ...
+def isdir(path: AnyStr) -> bool: ...
+def islink(path: AnyStr) -> bool: ...
+def ismount(path: AnyStr) -> bool: ...
+
+def join(path: AnyStr, *paths: AnyStr) -> AnyStr: ...
+
+def normcase(path: AnyStr) -> AnyStr: ...
+def normpath(path: AnyStr) -> AnyStr: ...
+def realpath(path: AnyStr) -> AnyStr: ...
+def relpath(path: AnyStr, start: AnyStr = ...) -> AnyStr: ...
+
+def samefile(path1: AnyStr, path2: AnyStr) -> bool: ...
+def sameopenfile(fp1: int, fp2: int) -> bool: ...
+# def samestat(stat1: stat_result,
+#             stat2: stat_result) -> bool: ...  # Unix only
+
+def split(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+def splitdrive(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+def splitext(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+
+# def splitunc(path: str) -> Tuple[str, str]: ...  # Windows only, deprecated
diff --git a/typeshed/stdlib/3/pdb.pyi b/typeshed/stdlib/3/pdb.pyi
new file mode 100644
index 0000000..1c375fe
--- /dev/null
+++ b/typeshed/stdlib/3/pdb.pyi
@@ -0,0 +1,30 @@
+# Stub for pdb (incomplete, only some global functions)
+
+from typing import Any, Dict
+
+def run(statement: str,
+        globals: Dict[str, Any] = None,
+        locals: Dict[str, Any] = None) -> None:
+    ...
+
+def runeval(expression: str,
+            globals: Dict[str, Any] = None,
+            locals: Dict[str, Any] = None) -> Any:
+    ...
+
+def runctx(statement: str,
+        globals: Dict[str, Any],
+        locals: Dict[str, Any]) -> None:
+    ...
+
+def runcall(*args: Any, **kwds: Any) -> Any:
+    ...
+
+def set_trace() -> None:
+    ...
+
+def post_mortem(t: Any = None) -> None:
+    ...
+
+def pm() -> None:
+    ...
diff --git a/typeshed/stdlib/3/pickle.pyi b/typeshed/stdlib/3/pickle.pyi
new file mode 100644
index 0000000..e6a14b2
--- /dev/null
+++ b/typeshed/stdlib/3/pickle.pyi
@@ -0,0 +1,67 @@
+# Stubs for pickle
+
+from typing import Any, IO, Union, Tuple, Callable, Optional, Iterator
+# Imports used in type comments only.
+from typing import Mapping  # noqa
+
+HIGHEST_PROTOCOL = ...  # type: int
+DEFAULT_PROTOCOL = ...  # type: int
+
+
+def dump(obj: Any, file: IO[bytes], protocol: int = None, *,
+         fix_imports: bool = ...) -> None: ...
+
+
+def dumps(obj: Any, protocol: int = ..., *,
+          fix_imports: bool = ...) -> bytes: ...
+
+
+def loads(bytes_object: bytes, *, fix_imports: bool = ...,
+          encoding: str = ..., errors: str = ...) -> Any: ...
+
+
+def load(file: IO[bytes], *, fix_imports: bool = ..., encoding: str = ...,
+         errors: str = ...) -> Any: ...
+
+
+class PickleError(Exception):
+    pass
+
+
+class PicklingError(PickleError):
+    pass
+
+
+class UnpicklingError(PickleError):
+    pass
+
+
+_reducedtype = Union[str,
+                     Tuple[Callable[..., Any], Tuple],
+                     Tuple[Callable[..., Any], Tuple, Any],
+                     Tuple[Callable[..., Any], Tuple, Any,
+                           Optional[Iterator]],
+                     Tuple[Callable[..., Any], Tuple, Any,
+                           Optional[Iterator], Optional[Iterator]]]
+
+
+class Pickler:
+    dispatch_table = ...  # type: Mapping[type, Callable[[Any], _reducedtype]]
+
+    def __init__(self, file: IO[bytes], protocol: int = None, *,
+                 fix_imports: bool = ...) -> None: ...
+
+    def dump(self, obj: Any) -> None: ...
+
+    def persistent_id(self, obj: Any) -> Any: ...
+
+
+class Unpickler:
+    def __init__(self, file: IO[bytes], *, fix_imports: bool = ...,
+                 encoding: str = ..., errors: str = ...) -> None: ...
+
+    def load(self) -> Any: ...
+
+    def persistent_load(self, pid: Any) -> Any: ...
+
+    def find_class(self, module: str, name: str) -> Any: ...
diff --git a/typeshed/stdlib/3/pipes.pyi b/typeshed/stdlib/3/pipes.pyi
new file mode 100644
index 0000000..62163d6
--- /dev/null
+++ b/typeshed/stdlib/3/pipes.pyi
@@ -0,0 +1,19 @@
+# Stubs for pipes
+
+# Based on http://docs.python.org/3.5/library/pipes.html
+
+import os
+
+class Template:
+    def __init__(self) -> None: ...
+    def reset(self) -> None: ...
+    def clone(self) -> 'Template': ...
+    def debug(self, flag: bool) -> None: ...
+    def append(self, cmd: str, kind: str) -> None: ...
+    def prepend(self, cmd: str, kind: str) -> None: ...
+    def open(self, file: str, rw: str) -> os.popen: ...
+    def copy(self, file: str, rw: str) -> os.popen: ...
+
+# Not documented, but widely used.
+# Documented as shlex.quote since 3.3.
+def quote(s: str) -> str: ...
diff --git a/typeshed/stdlib/3/platform.pyi b/typeshed/stdlib/3/platform.pyi
new file mode 100644
index 0000000..728e259
--- /dev/null
+++ b/typeshed/stdlib/3/platform.pyi
@@ -0,0 +1,34 @@
+# Stubs for platform (Python 3.5)
+
+from os import devnull as DEV_NULL
+from os import popen
+from typing import Tuple, NamedTuple
+
+def libc_ver(executable: str = ..., lib: str = ..., version: str = ..., chunksize: int = ...) -> Tuple[str, str]: ...
+def linux_distribution(distname: str = ..., version: str = ..., id: str = ..., supported_dists: Tuple[str, ...] = ..., full_distribution_name: bool = ...) -> Tuple[str, str, str]: ...
+def dist(distname: str = ..., version: str = ..., id: str = ..., supported_dists: Tuple[str, ...] = ...) -> Tuple[str, str, str]: ...
+def win32_ver(release: str = ..., version: str = ..., csd: str = ..., ptype: str = ...) -> Tuple[str, str, str, str]: ...
+def mac_ver(release: str = ..., versioninfo: Tuple[str, str, str] = ..., machine: str = ...) -> Tuple[str, Tuple[str, str, str], str]: ...
+def java_ver(release: str = ..., vendor: str = ..., vminfo: Tuple[str, str, str] = ..., osinfo: Tuple[str, str, str] = ...) -> Tuple[str, str, Tuple[str, str, str], Tuple[str, str, str]]: ...
+def system_alias(system: str, release: str, version: str) -> Tuple[str, str, str]: ...
+def architecture(executable: str = ..., bits: str = ..., linkage: str = ...) -> Tuple[str, str]: ...
+
+uname_result = NamedTuple('uname_result', [('system', str), ('node', str), ('release', str), ('version', str), ('machine', str), ('processor', str)])
+
+def uname() -> uname_result: ...
+def system() -> str: ...
+def node() -> str: ...
+def release() -> str: ...
+def version() -> str: ...
+def machine() -> str: ...
+def processor() -> str: ...
+
+def python_implementation() -> str: ...
+def python_version() -> str: ...
+def python_version_tuple() -> Tuple[str, str, str]: ...
+def python_branch() -> str: ...
+def python_revision() -> str: ...
+def python_build() -> Tuple[str, str]: ...
+def python_compiler() -> str: ...
+
+def platform(aliased: bool = ..., terse: bool = ...) -> str: ...
diff --git a/typeshed/stdlib/3/posix.pyi b/typeshed/stdlib/3/posix.pyi
new file mode 100644
index 0000000..03e4523
--- /dev/null
+++ b/typeshed/stdlib/3/posix.pyi
@@ -0,0 +1,6 @@
+# Stubs for posix
+
+# NOTE: These are incomplete!
+
+import typing
+from os import stat_result
diff --git a/typeshed/stdlib/3/posixpath.pyi b/typeshed/stdlib/3/posixpath.pyi
new file mode 100644
index 0000000..7d8bb09
--- /dev/null
+++ b/typeshed/stdlib/3/posixpath.pyi
@@ -0,0 +1,46 @@
+# Stubs for os.path
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http://docs.python.org/3.2/library/os.path.html
+
+from typing import Any, List, Tuple, IO
+
+# ----- os.path variables -----
+supports_unicode_filenames = False
+
+# ----- os.path function stubs -----
+def abspath(path: str) -> str: ...
+def basename(path) -> str: ...
+def commonprefix(list: List[str]) -> str: ...
+def dirname(path: str) -> str: ...
+def exists(path: str) -> bool: ...
+def lexists(path: str) -> bool: ...
+def expanduser(path: str) -> str: ...
+def expandvars(path: str) -> str: ...
+def getatime(path: str) -> int:
+    ...  # return float if os.stat_float_times() returns True
+def getmtime(path: str) -> int:
+    ...  # return float if os.stat_float_times() returns True
+def getctime(path: str) -> int:
+    ...  # return float if os.stat_float_times() returns True
+def getsize(path: str) -> int: ...
+def isabs(path: str) -> bool: ...
+def isfile(path: str) -> bool: ...
+def isdir(path: str) -> bool: ...
+def islink(path: str) -> bool: ...
+def ismount(path: str) -> bool: ...
+def join(path: str, *paths: str) -> str: ...
+def normcase(path: str) -> str: ...
+def normpath(path: str) -> str: ...
+def realpath(path: str) -> str: ...
+def relpath(path: str, start: str = ...) -> str: ...
+def samefile(path1: str, path2: str) -> bool: ...
+
+def sameopenfile(fp1: IO[Any], fp2: IO[Any]) -> bool: ...
+
+# def samestat(stat1: stat_result, stat2: stat_result) -> bool:
+#    ...  # Unix only
+def split(path: str) -> Tuple[str, str]: ...
+def splitdrive(path: str) -> Tuple[str, str]: ...
+def splitext(path: str) -> Tuple[str, str]: ...
+# def splitunc(path: str) -> Tuple[str, str] : ...  # Windows only, deprecated
diff --git a/typeshed/stdlib/3/pprint.pyi b/typeshed/stdlib/3/pprint.pyi
new file mode 100644
index 0000000..b846ff9
--- /dev/null
+++ b/typeshed/stdlib/3/pprint.pyi
@@ -0,0 +1,23 @@
+# Stubs for pprint
+
+# Based on http://docs.python.org/3.2/library/pprint.html
+
+from typing import Any, Dict, Tuple, IO
+
+def pformat(o: object, indent: int = ..., width: int = ...,
+            depth: int = ...) -> str: ...
+def pprint(o: object, stream: IO[str] = ..., indent: int = ..., width: int = ...,
+           depth: int = ...) -> None: ...
+def isreadable(o: object) -> bool: ...
+def isrecursive(o: object) -> bool: ...
+def saferepr(o: object) -> str: ...
+
+class PrettyPrinter:
+    def __init__(self, indent: int = ..., width: int = ..., depth: int = ...,
+                 stream: IO[str] = ...) -> None: ...
+    def pformat(self, o: object) -> str: ...
+    def pprint(self, o: object) -> None: ...
+    def isreadable(self, o: object) -> bool: ...
+    def isrecursive(self, o: object) -> bool: ...
+    def format(self, o: object, context: Dict[int, Any], maxlevels: int,
+               level: int) -> Tuple[str, bool, bool]: ...
diff --git a/typeshed/stdlib/3/pwd.pyi b/typeshed/stdlib/3/pwd.pyi
new file mode 100644
index 0000000..a5a8171
--- /dev/null
+++ b/typeshed/stdlib/3/pwd.pyi
@@ -0,0 +1,18 @@
+# Stubs for pwd
+
+# NOTE: These are incomplete!
+
+import typing
+
+class struct_passwd:
+    # TODO use namedtuple
+    pw_name = ...  # type: str
+    pw_passwd = ...  # type: str
+    pw_uid = 0
+    pw_gid = 0
+    pw_gecos = ...  # type: str
+    pw_dir = ...  # type: str
+    pw_shell = ...  # type: str
+
+def getpwuid(uid: int) -> struct_passwd: ...
+def getpwnam(name: str) -> struct_passwd: ...
diff --git a/typeshed/stdlib/3/pyclbr.pyi b/typeshed/stdlib/3/pyclbr.pyi
new file mode 100644
index 0000000..03c83f9
--- /dev/null
+++ b/typeshed/stdlib/3/pyclbr.pyi
@@ -0,0 +1,40 @@
+from typing import List, Union, Sequence, Optional, Dict
+
+
+class Class:
+    module = ...  # type: str
+    name = ...  # type: str
+    super = Optional[List[Union["Class", str]]]
+    methods = ...  # type: Dict[str, int]
+    file = ...  # type: int
+    lineno = ...  # type: int
+
+    def __init__(self,
+                 module: str,
+                 name: str,
+                 super: Optional[List[Union["Class", str]]],
+                 file: str,
+                 lineno: int) -> None: ...
+
+
+class Function:
+    module = ...  # type: str
+    name = ...  # type: str
+    file = ...  # type: int
+    lineno = ...  # type: int
+
+    def __init__(self,
+                 module: str,
+                 name: str,
+                 file: str,
+                 lineno: int) -> None: ...
+
+
+def readmodule(module: str,
+               path: Optional[Sequence[str]] = ...
+               ) -> Dict[str, Class]: ...
+
+
+def readmodule_ex(module: str,
+                  path: Optional[Sequence[str]] = ...
+                  ) -> Dict[str, Union[Class, Function, List[str]]]: ...
diff --git a/typeshed/stdlib/3/queue.pyi b/typeshed/stdlib/3/queue.pyi
new file mode 100644
index 0000000..f85490d
--- /dev/null
+++ b/typeshed/stdlib/3/queue.pyi
@@ -0,0 +1,24 @@
+# Stubs for queue
+
+# NOTE: These are incomplete!
+
+from typing import Any, TypeVar, Generic, Optional
+
+_T = TypeVar('_T')
+
+class Empty(Exception): ...
+class Full(Exception): ...
+
+class Queue(Generic[_T]):
+    def __init__(self, maxsize: int = ...) -> None: ...
+    def full(self) -> bool: ...
+    def get(self, block: bool = ..., timeout: Optional[float] = ...) -> _T: ...
+    def get_nowait(self) -> _T: ...
+    def put(self, item: _T, block: bool = ..., timeout: Optional[float] = ...) -> None: ...
+    def put_nowait(self, item: _T) -> None: ...
+    def join(self) -> None: ...
+    def qsize(self) -> int: ...
+    def task_done(self) -> None: pass
+
+class PriorityQueue(Queue): ...
+class LifoQueue(Queue): ...
diff --git a/typeshed/stdlib/3/random.pyi b/typeshed/stdlib/3/random.pyi
new file mode 100644
index 0000000..f40d973
--- /dev/null
+++ b/typeshed/stdlib/3/random.pyi
@@ -0,0 +1,67 @@
+# Stubs for random
+# Ron Murawski <ron at horizonchess.com>
+# Updated by Jukka Lehtosalo
+
+# based on http://docs.python.org/3.2/library/random.html
+
+# ----- random classes -----
+
+import _random
+from typing import (
+    Any, TypeVar, Sequence, List, Callable, AbstractSet, Union
+)
+
+_T = TypeVar('_T')
+
+class Random(_random.Random):
+    def __init__(self, x: Any = ...) -> None: ...
+    def seed(self, a: Any = ..., version: int = ...) -> None: ...
+    def getstate(self) -> tuple: ...
+    def setstate(self, state: tuple) -> None: ...
+    def getrandbits(self, k: int) -> int: ...
+    def randrange(self, start: int, stop: Union[int, None] = ..., step: int = ...) -> int: ...
+    def randint(self, a: int, b: int) -> int: ...
+    def choice(self, seq: Sequence[_T]) -> _T: ...
+    def shuffle(self, x: List[Any], random: Union[Callable[[], float], None] = ...) -> None: ...
+    def sample(self, population: Union[Sequence[_T], AbstractSet[_T]], k: int) -> List[_T]: ...
+    def random(self) -> float: ...
+    def uniform(self, a: float, b: float) -> float: ...
+    def triangular(self, low: float = ..., high: float = ...,
+                     mode: float = ...) -> float: ...
+    def betavariate(self, alpha: float, beta: float) -> float: ...
+    def expovariate(self, lambd: float) -> float: ...
+    def gammavariate(self, alpha: float, beta: float) -> float: ...
+    def gauss(self, mu: float, sigma: float) -> float: ...
+    def lognormvariate(self, mu: float, sigma: float) -> float: ...
+    def normalvariate(self, mu: float, sigma: float) -> float: ...
+    def vonmisesvariate(self, mu: float, kappa: float) -> float: ...
+    def paretovariate(self, alpha: float) -> float: ...
+    def weibullvariate(self, alpha: float, beta: float) -> float: ...
+
+# SystemRandom is not implemented for all OS's; good on Windows & Linux
+class SystemRandom(Random):
+    ...
+
+# ----- random function stubs -----
+def seed(a: Any = ..., version: int = ...) -> None: ...
+def getstate() -> object: ...
+def setstate(state: object) -> None: ...
+def getrandbits(k: int) -> int: ...
+def randrange(start: int, stop: Union[None, int] = ..., step: int = ...) -> int: ...
+def randint(a: int, b: int) -> int: ...
+def choice(seq: Sequence[_T]) -> _T: ...
+def shuffle(x: List[Any], random: Union[Callable[[], float], None] = ...) -> None: ...
+def sample(population: Union[Sequence[_T], AbstractSet[_T]], k: int) -> List[_T]: ...
+def random() -> float: ...
+def uniform(a: float, b: float) -> float: ...
+def triangular(low: float = ..., high: float = ...,
+               mode: float = ...) -> float: ...
+def betavariate(alpha: float, beta: float) -> float: ...
+def expovariate(lambd: float) -> float: ...
+def gammavariate(alpha: float, beta: float) -> float: ...
+def gauss(mu: float, sigma: float) -> float: ...
+def lognormvariate(mu: float, sigma: float) -> float: ...
+def normalvariate(mu: float, sigma: float) -> float: ...
+def vonmisesvariate(mu: float, kappa: float) -> float: ...
+def paretovariate(alpha: float) -> float: ...
+def weibullvariate(alpha: float, beta: float) -> float: ...
diff --git a/typeshed/stdlib/3/re.pyi b/typeshed/stdlib/3/re.pyi
new file mode 100644
index 0000000..5bdd083
--- /dev/null
+++ b/typeshed/stdlib/3/re.pyi
@@ -0,0 +1,106 @@
+# Stubs for re
+# Ron Murawski <ron at horizonchess.com>
+# 'bytes' support added by Jukka Lehtosalo
+
+# based on: http://docs.python.org/3.2/library/re.html
+# and http://hg.python.org/cpython/file/618ea5612e83/Lib/re.py
+
+from typing import (
+    List, Iterator, overload, Callable, Tuple, Sequence, Dict,
+    Generic, AnyStr, Match, Pattern, Any, Optional
+)
+
+# ----- re variables and constants -----
+A = 0
+ASCII = 0
+DEBUG = 0
+I = 0
+IGNORECASE = 0
+L = 0
+LOCALE = 0
+M = 0
+MULTILINE = 0
+S = 0
+DOTALL = 0
+X = 0
+VERBOSE = 0
+U = 0
+UNICODE = 0
+
+class error(Exception): ...
+
+ at overload
+def compile(pattern: AnyStr, flags: int = ...) -> Pattern[AnyStr]: ...
+ at overload
+def compile(pattern: Pattern[AnyStr], flags: int = ...) -> Pattern[AnyStr]: ...
+
+ at overload
+def search(pattern: AnyStr, string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+ at overload
+def search(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+
+ at overload
+def match(pattern: AnyStr, string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+ at overload
+def match(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+
+# New in Python 3.4
+ at overload
+def fullmatch(pattern: AnyStr, string: AnyStr, flags: int = ...) -> Optional[Match[AnyStr]]: ...
+ at overload
+def fullmatch(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> Optional[Match[AnyStr]]: ...
+
+ at overload
+def split(pattern: AnyStr, string: AnyStr,
+          maxsplit: int = ..., flags: int = ...) -> List[AnyStr]: ...
+ at overload
+def split(pattern: Pattern[AnyStr], string: AnyStr,
+          maxsplit: int = ..., flags: int = ...) -> List[AnyStr]: ...
+
+ at overload
+def findall(pattern: AnyStr, string: AnyStr, flags: int = ...) -> List[Any]: ...
+ at overload
+def findall(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> List[Any]: ...
+
+# Return an iterator yielding match objects over all non-overlapping matches
+# for the RE pattern in string. The string is scanned left-to-right, and
+# matches are returned in the order found. Empty matches are included in the
+# result unless they touch the beginning of another match.
+ at overload
+def finditer(pattern: AnyStr, string: AnyStr,
+             flags: int = ...) -> Iterator[Match[AnyStr]]: ...
+ at overload
+def finditer(pattern: Pattern[AnyStr], string: AnyStr,
+             flags: int = ...) -> Iterator[Match[AnyStr]]: ...
+
+ at overload
+def sub(pattern: AnyStr, repl: AnyStr, string: AnyStr, count: int = ...,
+        flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: AnyStr, repl: Callable[[Match[AnyStr]], AnyStr],
+        string: AnyStr, count: int = ..., flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: Pattern[AnyStr], repl: AnyStr, string: AnyStr, count: int = ...,
+        flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: Pattern[AnyStr], repl: Callable[[Match[AnyStr]], AnyStr],
+        string: AnyStr, count: int = ..., flags: int = ...) -> AnyStr: ...
+
+ at overload
+def subn(pattern: AnyStr, repl: AnyStr, string: AnyStr, count: int = ...,
+         flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: AnyStr, repl: Callable[[Match[AnyStr]], AnyStr],
+         string: AnyStr, count: int = ...,
+         flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: Pattern[AnyStr], repl: AnyStr, string: AnyStr, count: int = ...,
+         flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: Pattern[AnyStr], repl: Callable[[Match[AnyStr]], AnyStr],
+         string: AnyStr, count: int = ...,
+         flags: int = ...) -> Tuple[AnyStr, int]: ...
+
+def escape(string: AnyStr) -> AnyStr: ...
+
+def purge() -> None: ...
diff --git a/typeshed/stdlib/3/resource.pyi b/typeshed/stdlib/3/resource.pyi
new file mode 100644
index 0000000..2dcb913
--- /dev/null
+++ b/typeshed/stdlib/3/resource.pyi
@@ -0,0 +1,32 @@
+# Stubs for resource
+
+# NOTE: These are incomplete!
+
+from typing import Tuple
+
+RLIMIT_AS = ...  # type: int
+RLIMIT_CORE = ...  # type: int
+RLIMIT_CPU = ...  # type: int
+RLIMIT_DATA = ...  # type: int
+RLIMIT_FSIZE = ...  # type: int
+RLIMIT_MEMLOCK = ...  # type: int
+RLIMIT_MSGQUEUE = ...  # type: int
+RLIMIT_NICE = ...  # type: int
+RLIMIT_NOFILE = ...  # type: int
+RLIMIT_NPROC = ...  # type: int
+RLIMIT_OFILE = ...  # type: int
+RLIMIT_RSS = ...  # type: int
+RLIMIT_RTPRIO = ...  # type: int
+RLIMIT_RTTIME = ...  # type: int
+RLIMIT_SIGPENDING = ...  # type: int
+RLIMIT_STACK = ...  # type: int
+RLIM_INFINITY = ...  # type: int
+RUSAGE_CHILDREN = ...  # type: int
+RUSAGE_SELF = ...  # type: int
+RUSAGE_THREAD = ...  # type: int
+
+def getrlimit(resource: int) -> Tuple[int, int]: ...
+def setrlimit(resource: int, limits: Tuple[int, int]) -> None: ...
+
+# NOTE: This is an alias of OSError in Python 3.3.
+class error(Exception): ...
diff --git a/typeshed/stdlib/3/runpy.pyi b/typeshed/stdlib/3/runpy.pyi
new file mode 100644
index 0000000..5768a4c
--- /dev/null
+++ b/typeshed/stdlib/3/runpy.pyi
@@ -0,0 +1,21 @@
+# Stubs for runpy (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _TempModule:
+    mod_name = ...  # type: Any
+    module = ...  # type: Any
+    def __init__(self, mod_name): ...
+    def __enter__(self): ...
+    def __exit__(self, *args): ...
+
+class _ModifiedArgv0:
+    value = ...  # type: Any
+    def __init__(self, value): ...
+    def __enter__(self): ...
+    def __exit__(self, *args): ...
+
+def run_module(mod_name, init_globals=None, run_name=None, alter_sys=False): ...
+def run_path(path_name, init_globals=None, run_name=None): ...
diff --git a/typeshed/stdlib/3/select.pyi b/typeshed/stdlib/3/select.pyi
new file mode 100644
index 0000000..83446f0
--- /dev/null
+++ b/typeshed/stdlib/3/select.pyi
@@ -0,0 +1,27 @@
+# Stubs for select
+
+# NOTE: These are incomplete!
+
+from typing import Any, Tuple, List, Sequence
+
+class error(Exception): ...
+
+POLLIN = 0
+POLLPRI = 0
+POLLOUT = 0
+POLLERR = 0
+POLLHUP = 0
+POLLNVAL = 0
+
+class poll:
+    def __init__(self) -> None: ...
+    def register(self, fd: Any,
+                 eventmask: int = ...) -> None: ...
+    def modify(self, fd: Any, eventmask: int) -> None: ...
+    def unregister(self, fd: Any) -> None: ...
+    def poll(self, timeout: int = ...) -> List[Tuple[int, int]]: ...
+
+def select(rlist: Sequence, wlist: Sequence, xlist: Sequence,
+           timeout: float = ...) -> Tuple[List[Any],
+                                           List[Any],
+                                           List[Any]]: ...
diff --git a/typeshed/stdlib/3/shelve.pyi b/typeshed/stdlib/3/shelve.pyi
new file mode 100644
index 0000000..ab6b2d9
--- /dev/null
+++ b/typeshed/stdlib/3/shelve.pyi
@@ -0,0 +1,31 @@
+from typing import Any, Dict, Iterator, Optional, Tuple
+import collections
+
+
+class Shelf(collections.MutableMapping):
+    def __init__(self, dict: Dict[bytes, Any], protocol: Optional[int] = None, writeback: bool = ..., keyencoding: str = 'utf-8') -> None: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def __len__(self) -> int: ...
+    def __contains__(self, key: Any) -> bool: ...  # key should be str, but it would conflict with superclass's type signature
+    def get(self, key: str, default: Any = None) -> Any: ...
+    def __getitem__(self, key: str) -> Any: ...
+    def __setitem__(self, key: str, value: Any) -> None: ...
+    def __delitem__(self, key: str) -> None: ...
+    def __enter__(self) -> Shelf: ...
+    def __exit__(self, type: Any, value: Any, traceback: Any) -> None: ...
+    def close(self) -> None: ...
+    def __del__(self) -> None: ...
+    def sync(self) -> None: ...
+
+class BsdDbShelf(Shelf):
+    def __init__(self, dict: Dict[bytes, Any], protocol: Optional[int] = None, writeback: bool = ..., keyencoding: str = 'utf-8') -> None: ...
+    def set_location(self, key: Any) -> Tuple[str, Any]: ...
+    def next(self) -> Tuple[str, Any]: ...
+    def previous(self) -> Tuple[str, Any]: ...
+    def first(self) -> Tuple[str, Any]: ...
+    def last(self) -> Tuple[str, Any]: ...
+
+class DbfilenameShelf(Shelf):
+    def __init__(self, filename: str, flag: str = 'c', protocol: Optional[int] = None, writeback: bool = ...) -> None: ...
+
+def open(filename: str, flag: str = 'c', protocol: Optional[int] = None, writeback: bool = ...) -> DbfilenameShelf: ...
diff --git a/typeshed/stdlib/3/shlex.pyi b/typeshed/stdlib/3/shlex.pyi
new file mode 100644
index 0000000..db99fc6
--- /dev/null
+++ b/typeshed/stdlib/3/shlex.pyi
@@ -0,0 +1,39 @@
+# Stubs for shlex
+
+# Based on http://docs.python.org/3.2/library/shlex.html
+
+from typing import List, Tuple, Any, TextIO
+
+def split(s: str, comments: bool = ...,
+          posix: bool = ...) -> List[str]: ...
+
+# Added in 3.3, use (undocumented) pipes.quote in previous versions.
+def quote(s: str) -> str: ...
+
+class shlex:
+    commenters = ...  # type: str
+    wordchars = ...  # type: str
+    whitespace = ...  # type: str
+    escape = ...  # type: str
+    quotes = ...  # type: str
+    escapedquotes = ...  # type: str
+    whitespace_split = ...  # type: bool
+    infile = ...  # type: str
+    instream = ...  # type: TextIO
+    source = ...  # type: str
+    debug = 0
+    lineno = 0
+    token = ...  # type: str
+    eof = ...  # type: str
+
+    def __init__(self, instream=..., infile=...,
+                 posix: bool = ...) -> None: ...
+    def get_token(self) -> str: ...
+    def push_token(self, tok: str) -> None: ...
+    def read_token(self) -> str: ...
+    def sourcehook(self, filename: str) -> Tuple[str, TextIO]: ...
+    # TODO argument types
+    def push_source(self, newstream: Any, newfile: Any = ...) -> None: ...
+    def pop_source(self) -> None: ...
+    def error_leader(self, infile: str = ...,
+                     lineno: int = ...) -> None: ...
diff --git a/typeshed/stdlib/3/shutil.pyi b/typeshed/stdlib/3/shutil.pyi
new file mode 100644
index 0000000..1b917e6
--- /dev/null
+++ b/typeshed/stdlib/3/shutil.pyi
@@ -0,0 +1,51 @@
+# Stubs for shutil
+import sys
+
+# Based on http://docs.python.org/3.2/library/shutil.html
+
+# 'bytes' paths are not properly supported: they don't work with all functions,
+# sometimes they only work partially (broken exception messages), and the test
+# cases don't use them.
+
+from typing import List, Iterable, Callable, Any, Tuple, Sequence, IO, AnyStr, Optional
+
+def copyfileobj(fsrc: IO[AnyStr], fdst: IO[AnyStr],
+                length: int = ...) -> None: ...
+
+def copyfile(src: str, dst: str) -> None: ...
+def copymode(src: str, dst: str) -> None: ...
+def copystat(src: str, dst: str) -> None: ...
+def copy(src: str, dst: str) -> None: ...
+def copy2(src: str, dst: str) -> None: ...
+def ignore_patterns(*patterns: str) -> Callable[[str, List[str]],
+                                                Iterable[str]]: ...
+def copytree(src: str, dst: str, symlinks: bool = ...,
+             ignore: Optional[Callable[[str, List[str]], Iterable[str]]] = ...,
+             copy_function: Callable[[str, str], None] = ...,
+             ignore_dangling_symlinks: bool = ...) -> None: ...
+def rmtree(path: str, ignore_errors: bool = ...,
+           onerror: Callable[[Any, str, Any], None] = ...) -> None: ...
+def move(src: str, dst: str) -> None: ...
+
+class Error(Exception): ...
+if sys.version_info >= (3, 4):
+    class SameFileError(Error): ...
+
+def make_archive(base_name: str, format: str, root_dir: str = ...,
+                 base_dir: str = ..., verbose: bool = ...,
+                 dry_run: bool = ..., owner: str = ..., group: str = ...,
+                 logger: Any = ...) -> str: ...
+def get_archive_formats() -> List[Tuple[str, str]]: ...
+def register_archive_format(name: str, function: Any,
+                            extra_args: Sequence[Tuple[str, Any]] = ...,
+                            description: str = ...) -> None: ...
+def unregister_archive_format(name: str) -> None: ...
+def unpack_archive(filename: str, extract_dir: str = ...,
+                   format: str = ...) -> None: ...
+def register_unpack_format(name: str, extensions: List[str], function: Any,
+                           extra_args: Sequence[Tuple[str, Any]] = ...,
+                           description: str = ...) -> None: ...
+def unregister_unpack_format(name: str) -> None: ...
+def get_unpack_formats() -> List[Tuple[str, List[str], str]]: ...
+
+def which(cmd: str, mode: int = ..., path: str = ...) -> Optional[str]: ...
diff --git a/typeshed/stdlib/3/signal.pyi b/typeshed/stdlib/3/signal.pyi
new file mode 100644
index 0000000..41bbd11
--- /dev/null
+++ b/typeshed/stdlib/3/signal.pyi
@@ -0,0 +1,180 @@
+"""Stub file for the 'signal' module."""
+
+import sys
+from enum import IntEnum
+from typing import Any, Callable, List, Tuple, Dict, Generic, Union, Optional, Iterable, Set
+from types import FrameType
+
+class ItimerError(IOError): ...
+
+ITIMER_PROF = ...  # type: int
+ITIMER_REAL = ...  # type: int
+ITIMER_VIRTUAL = ...  # type: int
+
+NSIG = ...  # type: int
+
+if sys.version_info >= (3, 5):
+    class Signals(IntEnum):
+        SIGABRT = ...
+        SIGALRM = ...
+        SIGBUS = ...
+        SIGCHLD = ...
+        SIGCLD = ...
+        SIGCONT = ...
+        SIGFPE = ...
+        SIGHUP = ...
+        SIGILL = ...
+        SIGINT = ...
+        SIGIO = ...
+        SIGIOT = ...
+        SIGKILL = ...
+        SIGPIPE = ...
+        SIGPOLL = ...
+        SIGPROF = ...
+        SIGPWR = ...
+        SIGQUIT = ...
+        SIGRTMAX = ...
+        SIGRTMIN = ...
+        SIGSEGV = ...
+        SIGSTOP = ...
+        SIGSYS = ...
+        SIGTERM = ...
+        SIGTRAP = ...
+        SIGTSTP = ...
+        SIGTTIN = ...
+        SIGTTOU = ...
+        SIGURG = ...
+        SIGUSR1 = ...
+        SIGUSR2 = ...
+        SIGVTALRM = ...
+        SIGWINCH = ...
+        SIGXCPU = ...
+        SIGXFSZ = ...
+
+    class Handlers(IntEnum):
+        SIG_DFL = ...
+        SIG_IGN = ...
+
+    SIG_DFL = Handlers.SIG_DFL
+    SIG_IGN = Handlers.SIG_IGN
+
+    class Sigmasks(IntEnum):
+        SIG_BLOCK = ...
+        SIG_UNBLOCK = ...
+        SIG_SETMASK = ...
+
+    SIG_BLOCK = Sigmasks.SIG_BLOCK
+    SIG_UNBLOCK = Sigmasks.SIG_UNBLOCK
+    SIG_SETMASK = Sigmasks.SIG_SETMASK
+
+    _SIG = Signals
+    _SIGNUM = Union[int, Signals]
+    _HANDLER = Union[Callable[[Signals, FrameType], None], int, Handlers, None]
+else:
+    SIG_DFL = ...  # type: int
+    SIG_IGN = ...  # type: int
+
+    SIG_BLOCK = ...  # type: int
+    SIG_UNBLOCK = ...  # type: int
+    SIG_SETMASK = ...  # type: int
+
+    _SIG = int
+    _SIGNUM = int
+    _HANDLER = Union[Callable[[int, FrameType], None], int, None]
+
+SIGABRT = ...  # type: _SIG
+SIGALRM = ...  # type: _SIG
+SIGBUS = ...  # type: _SIG
+SIGCHLD = ...  # type: _SIG
+SIGCLD = ...  # type: _SIG
+SIGCONT = ...  # type: _SIG
+SIGFPE = ...  # type: _SIG
+SIGHUP = ...  # type: _SIG
+SIGILL = ...  # type: _SIG
+SIGINT = ...  # type: _SIG
+SIGIO = ...  # type: _SIG
+SIGIOT = ...  # type: _SIG
+SIGKILL = ...  # type: _SIG
+SIGPIPE = ...  # type: _SIG
+SIGPOLL = ...  # type: _SIG
+SIGPROF = ...  # type: _SIG
+SIGPWR = ...  # type: _SIG
+SIGQUIT = ...  # type: _SIG
+SIGRTMAX = ...  # type: _SIG
+SIGRTMIN = ...  # type: _SIG
+SIGSEGV = ...  # type: _SIG
+SIGSTOP = ...  # type: _SIG
+SIGSYS = ...  # type: _SIG
+SIGTERM = ...  # type: _SIG
+SIGTRAP = ...  # type: _SIG
+SIGTSTP = ...  # type: _SIG
+SIGTTIN = ...  # type: _SIG
+SIGTTOU = ...  # type: _SIG
+SIGURG = ...  # type: _SIG
+SIGUSR1 = ...  # type: _SIG
+SIGUSR2 = ...  # type: _SIG
+SIGVTALRM = ...  # type: _SIG
+SIGWINCH = ...  # type: _SIG
+SIGXCPU = ...  # type: _SIG
+SIGXFSZ = ...  # type: _SIG
+
+CTRL_C_EVENT = 0  # Windows
+CTRL_BREAK_EVENT = 0  # Windows
+
+class struct_siginfo(Tuple[int, int, int, int, int, int, int]):
+    def __init__(self, sequence: Iterable[int]) -> None: ...
+    @property
+    def si_signo(self) -> int: ...
+    @property
+    def si_code(self) -> int: ...
+    @property
+    def si_errno(self) -> int: ...
+    @property
+    def si_pid(self) -> int: ...
+    @property
+    def si_uid(self) -> int: ...
+    @property
+    def si_status(self) -> int: ...
+    @property
+    def si_band(self) -> int: ...
+
+def alarm(time: int) -> int: ...
+
+def default_int_handler(signum: int, frame: FrameType) -> None:
+    raise KeyboardInterrupt()
+
+def getitimer(which: int) -> Tuple[float, float]: ...
+
+def getsignal(signalnum: _SIGNUM) -> _HANDLER:
+    raise ValueError()
+
+def pause() -> None: ...
+
+def pthread_kill(thread_id: int, signum: int) -> None:
+    raise OSError()
+
+def pthread_sigmask(how: int, mask: Iterable[int]) -> Set[_SIGNUM]:
+    raise OSError()
+
+def set_wakeup_fd(fd: int) -> int: ...
+
+def setitimer(which: int, seconds: float, interval: float = ...) -> Tuple[float, float]: ...
+
+def siginterrupt(signalnum: int, flag: bool) -> None:
+    raise OSError()
+
+def signal(signalnum: _SIGNUM, handler: _HANDLER) -> _HANDLER:
+    raise OSError()
+
+def sigpending() -> Any:
+    raise OSError()
+
+def sigtimedwait(sigset: Iterable[int], timeout: float) -> Optional[struct_siginfo]:
+    raise OSError()
+    raise ValueError()
+
+def sigwait(sigset: Iterable[int]) -> _SIGNUM:
+    raise OSError()
+
+def sigwaitinfo(sigset: Iterable[int]) -> struct_siginfo:
+    raise OSError()
diff --git a/typeshed/stdlib/3/smtplib.pyi b/typeshed/stdlib/3/smtplib.pyi
new file mode 100644
index 0000000..56a4729
--- /dev/null
+++ b/typeshed/stdlib/3/smtplib.pyi
@@ -0,0 +1,94 @@
+# Stubs for smtplib (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class SMTPException(OSError): ...
+class SMTPServerDisconnected(SMTPException): ...
+
+class SMTPResponseException(SMTPException):
+    smtp_code = ...  # type: Any
+    smtp_error = ...  # type: Any
+    args = ...  # type: Any
+    def __init__(self, code, msg) -> None: ...
+
+class SMTPSenderRefused(SMTPResponseException):
+    smtp_code = ...  # type: Any
+    smtp_error = ...  # type: Any
+    sender = ...  # type: Any
+    args = ...  # type: Any
+    def __init__(self, code, msg, sender) -> None: ...
+
+class SMTPRecipientsRefused(SMTPException):
+    recipients = ...  # type: Any
+    args = ...  # type: Any
+    def __init__(self, recipients) -> None: ...
+
+class SMTPDataError(SMTPResponseException): ...
+class SMTPConnectError(SMTPResponseException): ...
+class SMTPHeloError(SMTPResponseException): ...
+class SMTPAuthenticationError(SMTPResponseException): ...
+
+def quoteaddr(addrstring): ...
+def quotedata(data): ...
+
+class SMTP:
+    debuglevel = ...  # type: Any
+    file = ...  # type: Any
+    helo_resp = ...  # type: Any
+    ehlo_msg = ...  # type: Any
+    ehlo_resp = ...  # type: Any
+    does_esmtp = ...  # type: Any
+    default_port = ...  # type: Any
+    timeout = ...  # type: Any
+    esmtp_features = ...  # type: Any
+    source_address = ...  # type: Any
+    local_hostname = ...  # type: Any
+    def __init__(self, host=..., port=..., local_hostname=..., timeout=...,
+                 source_address=...): ...
+    def __enter__(self): ...
+    def __exit__(self, *args): ...
+    def set_debuglevel(self, debuglevel): ...
+    sock = ...  # type: Any
+    def connect(self, host=..., port=..., source_address=...): ...
+    def send(self, s): ...
+    def putcmd(self, cmd, args=...): ...
+    def getreply(self): ...
+    def docmd(self, cmd, args=...): ...
+    def helo(self, name=...): ...
+    def ehlo(self, name=...): ...
+    def has_extn(self, opt): ...
+    def help(self, args=...): ...
+    def rset(self): ...
+    def noop(self): ...
+    def mail(self, sender, options=...): ...
+    def rcpt(self, recip, options=...): ...
+    def data(self, msg): ...
+    def verify(self, address): ...
+    vrfy = ...  # type: Any
+    def expn(self, address): ...
+    def ehlo_or_helo_if_needed(self): ...
+    def login(self, user, password): ...
+    def starttls(self, keyfile=..., certfile=..., context=...): ...
+    def sendmail(self, from_addr, to_addrs, msg, mail_options=...,
+                 rcpt_options=...): ...
+    def send_message(self, msg, from_addr=..., to_addrs=..., mail_options=...,
+                     rcpt_options=...): ...
+    def close(self): ...
+    def quit(self): ...
+
+class SMTP_SSL(SMTP):
+    default_port = ...  # type: Any
+    keyfile = ...  # type: Any
+    certfile = ...  # type: Any
+    context = ...  # type: Any
+    def __init__(self, host=..., port=..., local_hostname=..., keyfile=..., certfile=...,
+                 timeout=..., source_address=..., context=...): ...
+
+class LMTP(SMTP):
+    ehlo_msg = ...  # type: Any
+    def __init__(self, host=..., port=..., local_hostname=..., source_address=...) -> None: ...
+    sock = ...  # type: Any
+    file = ...  # type: Any
+    def connect(self, host=..., port=..., source_address=...): ...
diff --git a/typeshed/stdlib/3/socket.pyi b/typeshed/stdlib/3/socket.pyi
new file mode 100644
index 0000000..4915d8a
--- /dev/null
+++ b/typeshed/stdlib/3/socket.pyi
@@ -0,0 +1,361 @@
+# Stubs for socket
+# Ron Murawski <ron at horizonchess.com>
+
+# based on: http://docs.python.org/3.2/library/socket.html
+# see: http://hg.python.org/cpython/file/3d0686d90f55/Lib/socket.py
+# see: http://nullege.com/codes/search/socket
+
+from typing import Any, Tuple, List, Optional, Union, overload
+
+# ----- variables and constants -----
+
+AF_UNIX = 0
+AF_INET = 0
+AF_INET6 = 0
+SOCK_STREAM = 0
+SOCK_DGRAM = 0
+SOCK_RAW = 0
+SOCK_RDM = 0
+SOCK_SEQPACKET = 0
+SOCK_CLOEXEC = 0
+SOCK_NONBLOCK = 0
+SOMAXCONN = 0
+has_ipv6 = False
+_GLOBAL_DEFAULT_TIMEOUT = 0.0
+SocketType = ...  # type: Any
+SocketIO = ...  # type: Any
+
+
+# the following constants are included with Python 3.2.3 (Ubuntu)
+# some of the constants may be Linux-only
+# all Windows/Mac-specific constants are absent
+AF_APPLETALK = 0
+AF_ASH = 0
+AF_ATMPVC = 0
+AF_ATMSVC = 0
+AF_AX25 = 0
+AF_BLUETOOTH = 0
+AF_BRIDGE = 0
+AF_DECnet = 0
+AF_ECONET = 0
+AF_IPX = 0
+AF_IRDA = 0
+AF_KEY = 0
+AF_LLC = 0
+AF_NETBEUI = 0
+AF_NETLINK = 0
+AF_NETROM = 0
+AF_PACKET = 0
+AF_PPPOX = 0
+AF_ROSE = 0
+AF_ROUTE = 0
+AF_SECURITY = 0
+AF_SNA = 0
+AF_TIPC = 0
+AF_UNSPEC = 0
+AF_WANPIPE = 0
+AF_X25 = 0
+AI_ADDRCONFIG = 0
+AI_ALL = 0
+AI_CANONNAME = 0
+AI_NUMERICHOST = 0
+AI_NUMERICSERV = 0
+AI_PASSIVE = 0
+AI_V4MAPPED = 0
+BDADDR_ANY = 0
+BDADDR_LOCAL = 0
+BTPROTO_HCI = 0
+BTPROTO_L2CAP = 0
+BTPROTO_RFCOMM = 0
+BTPROTO_SCO = 0
+CAPI = 0
+EAGAIN = 0
+EAI_ADDRFAMILY = 0
+EAI_AGAIN = 0
+EAI_BADFLAGS = 0
+EAI_FAIL = 0
+EAI_FAMILY = 0
+EAI_MEMORY = 0
+EAI_NODATA = 0
+EAI_NONAME = 0
+EAI_OVERFLOW = 0
+EAI_SERVICE = 0
+EAI_SOCKTYPE = 0
+EAI_SYSTEM = 0
+EBADF = 0
+EINTR = 0
+EWOULDBLOCK = 0
+HCI_DATA_DIR = 0
+HCI_FILTER = 0
+HCI_TIME_STAMP = 0
+INADDR_ALLHOSTS_GROUP = 0
+INADDR_ANY = 0
+INADDR_BROADCAST = 0
+INADDR_LOOPBACK = 0
+INADDR_MAX_LOCAL_GROUP = 0
+INADDR_NONE = 0
+INADDR_UNSPEC_GROUP = 0
+IPPORT_RESERVED = 0
+IPPORT_USERRESERVED = 0
+IPPROTO_AH = 0
+IPPROTO_DSTOPTS = 0
+IPPROTO_EGP = 0
+IPPROTO_ESP = 0
+IPPROTO_FRAGMENT = 0
+IPPROTO_GRE = 0
+IPPROTO_HOPOPTS = 0
+IPPROTO_ICMP = 0
+IPPROTO_ICMPV6 = 0
+IPPROTO_IDP = 0
+IPPROTO_IGMP = 0
+IPPROTO_IP = 0
+IPPROTO_IPIP = 0
+IPPROTO_IPV6 = 0
+IPPROTO_NONE = 0
+IPPROTO_PIM = 0
+IPPROTO_PUP = 0
+IPPROTO_RAW = 0
+IPPROTO_ROUTING = 0
+IPPROTO_RSVP = 0
+IPPROTO_TCP = 0
+IPPROTO_TP = 0
+IPPROTO_UDP = 0
+IPV6_CHECKSUM = 0
+IPV6_DSTOPTS = 0
+IPV6_HOPLIMIT = 0
+IPV6_HOPOPTS = 0
+IPV6_JOIN_GROUP = 0
+IPV6_LEAVE_GROUP = 0
+IPV6_MULTICAST_HOPS = 0
+IPV6_MULTICAST_IF = 0
+IPV6_MULTICAST_LOOP = 0
+IPV6_NEXTHOP = 0
+IPV6_PKTINFO = 0
+IPV6_RECVDSTOPTS = 0
+IPV6_RECVHOPLIMIT = 0
+IPV6_RECVHOPOPTS = 0
+IPV6_RECVPKTINFO = 0
+IPV6_RECVRTHDR = 0
+IPV6_RECVTCLASS = 0
+IPV6_RTHDR = 0
+IPV6_RTHDRDSTOPTS = 0
+IPV6_RTHDR_TYPE_0 = 0
+IPV6_TCLASS = 0
+IPV6_UNICAST_HOPS = 0
+IPV6_V6ONLY = 0
+IP_ADD_MEMBERSHIP = 0
+IP_DEFAULT_MULTICAST_LOOP = 0
+IP_DEFAULT_MULTICAST_TTL = 0
+IP_DROP_MEMBERSHIP = 0
+IP_HDRINCL = 0
+IP_MAX_MEMBERSHIPS = 0
+IP_MULTICAST_IF = 0
+IP_MULTICAST_LOOP = 0
+IP_MULTICAST_TTL = 0
+IP_OPTIONS = 0
+IP_RECVOPTS = 0
+IP_RECVRETOPTS = 0
+IP_RETOPTS = 0
+IP_TOS = 0
+IP_TTL = 0
+MSG_CTRUNC = 0
+MSG_DONTROUTE = 0
+MSG_DONTWAIT = 0
+MSG_EOR = 0
+MSG_OOB = 0
+MSG_PEEK = 0
+MSG_TRUNC = 0
+MSG_WAITALL = 0
+NETLINK_DNRTMSG = 0
+NETLINK_FIREWALL = 0
+NETLINK_IP6_FW = 0
+NETLINK_NFLOG = 0
+NETLINK_ROUTE = 0
+NETLINK_USERSOCK = 0
+NETLINK_XFRM = 0
+NI_DGRAM = 0
+NI_MAXHOST = 0
+NI_MAXSERV = 0
+NI_NAMEREQD = 0
+NI_NOFQDN = 0
+NI_NUMERICHOST = 0
+NI_NUMERICSERV = 0
+PACKET_BROADCAST = 0
+PACKET_FASTROUTE = 0
+PACKET_HOST = 0
+PACKET_LOOPBACK = 0
+PACKET_MULTICAST = 0
+PACKET_OTHERHOST = 0
+PACKET_OUTGOING = 0
+PF_PACKET = 0
+SHUT_RD = 0
+SHUT_RDWR = 0
+SHUT_WR = 0
+SOL_HCI = 0
+SOL_IP = 0
+SOL_SOCKET = 0
+SOL_TCP = 0
+SOL_TIPC = 0
+SOL_UDP = 0
+SO_ACCEPTCONN = 0
+SO_BROADCAST = 0
+SO_DEBUG = 0
+SO_DONTROUTE = 0
+SO_ERROR = 0
+SO_KEEPALIVE = 0
+SO_LINGER = 0
+SO_OOBINLINE = 0
+SO_RCVBUF = 0
+SO_RCVLOWAT = 0
+SO_RCVTIMEO = 0
+SO_REUSEADDR = 0
+SO_SNDBUF = 0
+SO_SNDLOWAT = 0
+SO_SNDTIMEO = 0
+SO_TYPE = 0
+TCP_CORK = 0
+TCP_DEFER_ACCEPT = 0
+TCP_INFO = 0
+TCP_KEEPCNT = 0
+TCP_KEEPIDLE = 0
+TCP_KEEPINTVL = 0
+TCP_LINGER2 = 0
+TCP_MAXSEG = 0
+TCP_NODELAY = 0
+TCP_QUICKACK = 0
+TCP_SYNCNT = 0
+TCP_WINDOW_CLAMP = 0
+TIPC_ADDR_ID = 0
+TIPC_ADDR_NAME = 0
+TIPC_ADDR_NAMESEQ = 0
+TIPC_CFG_SRV = 0
+TIPC_CLUSTER_SCOPE = 0
+TIPC_CONN_TIMEOUT = 0
+TIPC_CRITICAL_IMPORTANCE = 0
+TIPC_DEST_DROPPABLE = 0
+TIPC_HIGH_IMPORTANCE = 0
+TIPC_IMPORTANCE = 0
+TIPC_LOW_IMPORTANCE = 0
+TIPC_MEDIUM_IMPORTANCE = 0
+TIPC_NODE_SCOPE = 0
+TIPC_PUBLISHED = 0
+TIPC_SRC_DROPPABLE = 0
+TIPC_SUBSCR_TIMEOUT = 0
+TIPC_SUB_CANCEL = 0
+TIPC_SUB_PORTS = 0
+TIPC_SUB_SERVICE = 0
+TIPC_TOP_SRV = 0
+TIPC_WAIT_FOREVER = 0
+TIPC_WITHDRAWN = 0
+TIPC_ZONE_SCOPE = 0
+
+
+# ----- exceptions -----
+class error(IOError):
+    ...
+
+class herror(error):
+    def __init__(self, herror: int, string: str) -> None: ...
+
+class gaierror(error):
+    def __init__(self, error: int, string: str) -> None: ...
+
+class timeout(error):
+    ...
+
+
+# Addresses can be either tuples of varying lengths (AF_INET, AF_INET6,
+# AF_NETLINK, AF_TIPC) or strings (AF_UNIX).
+
+# TODO AF_PACKET and AF_BLUETOOTH address objects
+
+
+# ----- classes -----
+class socket:
+    family = 0
+    type = 0
+    proto = 0
+
+    def __init__(self, family: int = ..., type: int = ...,
+                 proto: int = ..., fileno: Optional[int] = ...) -> None: ...
+
+    # --- methods ---
+    # second tuple item is an address
+    def accept(self) -> Tuple['socket', Any]: ...
+    def bind(self, address: Union[tuple, str]) -> None: ...
+    def close(self) -> None: ...
+    def connect(self, address: Union[tuple, str]) -> None: ...
+    def connect_ex(self, address: Union[tuple, str]) -> int: ...
+    def detach(self) -> int: ...
+    def fileno(self) -> int: ...
+
+    # return value is an address
+    def getpeername(self) -> Any: ...
+    def getsockname(self) -> Any: ...
+
+    @overload
+    def getsockopt(self, level: int, optname: int) -> int: ...
+    @overload
+    def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
+
+    def gettimeout(self) -> float: ...
+    def ioctl(self, control: object,
+              option: Tuple[int, int, int]) -> None: ...
+    def listen(self, backlog: int) -> None: ...
+    # TODO the return value may be BinaryIO or TextIO, depending on mode
+    def makefile(self, mode: str = ..., buffering: int = ...,
+                 encoding: str = ..., errors: str = ...,
+                 newline: str = ...) -> Any:
+        ...
+    def recv(self, bufsize: int, flags: int = ...) -> bytes: ...
+
+    # return type is an address
+    def recvfrom(self, bufsize: int, flags: int = ...) -> Any: ...
+    def recvfrom_into(self, buffer: bytes, nbytes: int,
+                      flags: int = ...) -> Any: ...
+    def recv_into(self, buffer: bytes, nbytes: int,
+                  flags: int = ...) -> Any: ...
+    def send(self, data: bytes, flags: int = ...) -> int: ...
+    def sendall(self, data: bytes, flags: int =...) -> None:
+        ...  # return type: None on success
+    def sendto(self, data: bytes, address: Union[tuple, str], flags: int = ...) -> int: ...
+    def setblocking(self, flag: bool) -> None: ...
+    def settimeout(self, value: Union[float, None]) -> None: ...
+    def setsockopt(self, level: int, optname: int, value: Union[int, bytes]) -> None: ...
+    def shutdown(self, how: int) -> None: ...
+
+
+# ----- functions -----
+def create_connection(address: Tuple[str, int],
+                      timeout: float = ...,
+                      source_address: Tuple[str, int] = ...) -> socket: ...
+
+# the 5th tuple item is an address
+def getaddrinfo(
+        host: str, port: int, family: int = ..., type: int = ..., proto: int = ...,
+        flags: int = ...) -> List[Tuple[int, int, int, str, tuple]]:
+    ...
+
+def getfqdn(name: str = ...) -> str: ...
+def gethostbyname(hostname: str) -> str: ...
+def gethostbyname_ex(hostname: str) -> Tuple[str, List[str], List[str]]: ...
+def gethostname() -> str: ...
+def gethostbyaddr(ip_address: str) -> Tuple[str, List[str], List[str]]: ...
+def getnameinfo(sockaddr: tuple, flags: int) -> Tuple[str, int]: ...
+def getprotobyname(protocolname: str) -> int: ...
+def getservbyname(servicename: str, protocolname: str = ...) -> int: ...
+def getservbyport(port: int, protocolname: str = ...) -> str: ...
+def socketpair(family: int = ...,
+               type: int = ...,
+               proto: int = ...) -> Tuple[socket, socket]: ...
+def fromfd(fd: int, family: int, type: int, proto: int = ...) -> socket: ...
+def ntohl(x: int) -> int: ...  # param & ret val are 32-bit ints
+def ntohs(x: int) -> int: ...  # param & ret val are 16-bit ints
+def htonl(x: int) -> int: ...  # param & ret val are 32-bit ints
+def htons(x: int) -> int: ...  # param & ret val are 16-bit ints
+def inet_aton(ip_string: str) -> bytes: ...  # ret val 4 bytes in length
+def inet_ntoa(packed_ip: bytes) -> str: ...
+def inet_pton(address_family: int, ip_string: str) -> bytes: ...
+def inet_ntop(address_family: int, packed_ip: bytes) -> str: ...
+def getdefaulttimeout() -> Union[float, None]: ...
+def setdefaulttimeout(timeout: float) -> None: ...
diff --git a/typeshed/stdlib/3/socketserver.pyi b/typeshed/stdlib/3/socketserver.pyi
new file mode 100644
index 0000000..14a739b
--- /dev/null
+++ b/typeshed/stdlib/3/socketserver.pyi
@@ -0,0 +1,93 @@
+# Stubs for socketserver
+
+from typing import Any, BinaryIO, Optional, Tuple
+from socket import SocketType
+import sys
+import types
+
+class BaseServer:
+    address_family = ...  # type: int
+    RequestHandlerClass = ...  # type: type
+    server_address = ...  # type: Tuple[str, int]
+    socket = ...  # type: SocketType
+    allow_reuse_address = ...  # type: bool
+    request_queue_size = ...  # type: int
+    socket_type = ...  # type: int
+    timeout = ...  # type: Optional[float]
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type) -> None: ...
+    def fileno(self) -> int: ...
+    def handle_request(self) -> None: ...
+    def serve_forever(self, poll_interval: float = ...) -> None: ...
+    def shutdown(self) -> None: ...
+    def server_close(self) -> None: ...
+    def finish_request(self) -> None: ...
+    def get_request(self) -> None: ...
+    def handle_error(self, request: bytes,
+                     client_address: Tuple[str, int]) -> None: ...
+    def handle_timeout(self) -> None: ...
+    def process_request(self, request: bytes,
+                        client_address: Tuple[str, int]) -> None: ...
+    def server_activate(self) -> None: ...
+    def server_bind(self) -> None: ...
+    def verify_request(self, request: bytes,
+                       client_address: Tuple[str, int]) -> bool: ...
+    if sys.version_info >= (3, 6):
+        def __enter__(self) -> 'BaseServer': ...
+        def __exit__(self, exc_type: Optional[type],
+                     exc_val: Optional[Exception],
+                     exc_tb: Optional[types.TracebackType]) -> bool: ...
+    if sys.version_info >= (3, 3):
+        def service_actions(self) -> None: ...
+
+class TCPServer(BaseServer):
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type,
+                 bind_and_activate: bool = ...) -> None: ...
+
+class UDPServer(BaseServer):
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type,
+                 bind_and_activate: bool = ...) -> None: ...
+
+class UnixStreamServer(BaseServer):
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type,
+                 bind_and_activate: bool = ...) -> None: ...
+
+class UnixDatagramServer(BaseServer):
+    def __init__(self, server_address: Tuple[str, int],
+                 RequestHandlerClass: type,
+                 bind_and_activate: bool = ...) -> None: ...
+
+class ForkingMixIn: ...
+class ThreadingMixIn: ...
+
+class ForkingTCPServer(ForkingMixIn, TCPServer): ...
+class ForkingUDPServer(ForkingMixIn, UDPServer): ...
+class ThreadingTCPServer(ThreadingMixIn, TCPServer): ...
+class ThreadingUDPServer(ThreadingMixIn, UDPServer): ...
+
+
+class BaseRequestHandler:
+    # Those are technically of types, respectively:
+    # * Union[SocketType, Tuple[bytes, SocketType]]
+    # * Union[Tuple[str, int], str]
+    # But there are some concerns that having unions here would cause
+    # too much inconvenience to people using it (see
+    # https://github.com/python/typeshed/pull/384#issuecomment-234649696)
+    request = ...  # type: Any
+    client_address = ...  # type: Any
+
+    server = ...  # type: BaseServer
+    def setup(self) -> None: ...
+    def handle(self) -> None: ...
+    def finish(self) -> None: ...
+
+class StreamRequestHandler(BaseRequestHandler):
+    rfile = ...  # type: BinaryIO
+    wfile = ...  # type: BinaryIO
+
+class DatagramRequestHandler(BaseRequestHandler):
+    rfile = ...  # type: BinaryIO
+    wfile = ...  # type: BinaryIO
diff --git a/typeshed/stdlib/3/sqlite3/__init__.pyi b/typeshed/stdlib/3/sqlite3/__init__.pyi
new file mode 100644
index 0000000..fc22e5d
--- /dev/null
+++ b/typeshed/stdlib/3/sqlite3/__init__.pyi
@@ -0,0 +1,5 @@
+# Stubs for sqlite3 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from sqlite3.dbapi2 import *  # noqa: F403
diff --git a/typeshed/stdlib/3/sqlite3/dbapi2.pyi b/typeshed/stdlib/3/sqlite3/dbapi2.pyi
new file mode 100644
index 0000000..dcc2026
--- /dev/null
+++ b/typeshed/stdlib/3/sqlite3/dbapi2.pyi
@@ -0,0 +1,256 @@
+# Filip Hron <filip.hron at gmail.com>
+# based heavily on Andrey Vlasovskikh's python-skeletons https://github.com/JetBrains/python-skeletons/blob/master/sqlite3.py
+
+from typing import Any, Union, List, AnyStr, Iterator, Optional
+from numbers import Integral
+from datetime import time, datetime
+from collections import Iterable
+
+paramstyle = ...  # type: str
+threadsafety = ...  # type: int
+apilevel = ...  # type: str
+Date = ...  # type: datetime
+Time = ...  # type: time
+Timestamp = ...  # type: datetime
+
+def DateFromTicks(ticks): ...
+def TimeFromTicks(ticks): ...
+def TimestampFromTicks(ticks): ...
+
+version_info = ...  # type: Any
+sqlite_version_info = ...  # type: Any
+Binary = ...  # type: Any
+
+def register_adapters_and_converters(): ...
+
+# The remaining definitions are imported from _sqlite3.
+
+PARSE_COLNAMES = ...  # type: int
+PARSE_DECLTYPES = ...  # type: int
+SQLITE_ALTER_TABLE = ...  # type: int
+SQLITE_ANALYZE = ...  # type: int
+SQLITE_ATTACH = ...  # type: int
+SQLITE_CREATE_INDEX = ...  # type: int
+SQLITE_CREATE_TABLE = ...  # type: int
+SQLITE_CREATE_TEMP_INDEX = ...  # type: int
+SQLITE_CREATE_TEMP_TABLE = ...  # type: int
+SQLITE_CREATE_TEMP_TRIGGER = ...  # type: int
+SQLITE_CREATE_TEMP_VIEW = ...  # type: int
+SQLITE_CREATE_TRIGGER = ...  # type: int
+SQLITE_CREATE_VIEW = ...  # type: int
+SQLITE_DELETE = ...  # type: int
+SQLITE_DENY = ...  # type: int
+SQLITE_DETACH = ...  # type: int
+SQLITE_DROP_INDEX = ...  # type: int
+SQLITE_DROP_TABLE = ...  # type: int
+SQLITE_DROP_TEMP_INDEX = ...  # type: int
+SQLITE_DROP_TEMP_TABLE = ...  # type: int
+SQLITE_DROP_TEMP_TRIGGER = ...  # type: int
+SQLITE_DROP_TEMP_VIEW = ...  # type: int
+SQLITE_DROP_TRIGGER = ...  # type: int
+SQLITE_DROP_VIEW = ...  # type: int
+SQLITE_IGNORE = ...  # type: int
+SQLITE_INSERT = ...  # type: int
+SQLITE_OK = ...  # type: int
+SQLITE_PRAGMA = ...  # type: int
+SQLITE_READ = ...  # type: int
+SQLITE_REINDEX = ...  # type: int
+SQLITE_SELECT = ...  # type: int
+SQLITE_TRANSACTION = ...  # type: int
+SQLITE_UPDATE = ...  # type: int
+adapters = ...  # type: Any
+converters = ...  # type: Any
+sqlite_version = ...  # type: str
+version = ...  # type: str
+
+# TODO: adapt needs to get probed
+def adapt(obj, protocol, alternate): ...
+def complete_statement(sql: str) -> bool: ...
+def connect(database: Union[bytes, AnyStr],
+            timeout: float = ...,
+            detect_types: int = ...,
+            isolation_level: Union[str, None] = ...,
+            check_same_thread: bool = ...,
+            factory: Union[Connection, None] = ...,
+            cached_statements: int = ...) -> Connection: ...
+def enable_callback_tracebacks(flag: bool) -> None: ...
+def enable_shared_cache(do_enable: int) -> None: ...
+def register_adapter(type: type, callable: Any) -> None: ...
+# TODO: sqlite3.register_converter.__doc__ specifies callable as unknown
+def register_converter(typename: str, callable: bytes) -> None: ...
+
+class Cache:
+    def __init__(self, *args, **kwargs) -> None: ...
+    def display(self, *args, **kwargs) -> None: ...
+    def get(self, *args, **kwargs) -> None: ...
+
+class Connection:
+    DataError = ...  # type: Any
+    DatabaseError = ...  # type: Any
+    Error = ...  # type: Any
+    IntegrityError = ...  # type: Any
+    InterfaceError = ...  # type: Any
+    InternalError = ...  # type: Any
+    NotSupportedError = ...  # type: Any
+    OperationalError = ...  # type: Any
+    ProgrammingError = ...  # type: Any
+    Warning = ...  # type: Any
+    in_transaction = ...  # type: Any
+    isolation_level = ...  # type: Any
+    row_factory = ...  # type: Any
+    text_factory = ...  # type: Any
+    total_changes = ...  # type: Any
+    def __init__(self, *args, **kwargs): ...
+    def close(self) -> None: ...
+    def commit(self) -> None: ...
+    def create_aggregate(self, name: str, num_params: int, aggregate_class: type) -> None: ...
+    def create_collation(self, name: str, callable: Any) -> None: ...
+    def create_function(self, name: str, num_params: int, func: Any) -> None: ...
+    def cursor(self, cursorClass: Optional[type] = ...) -> Cursor: ...
+    def execute(self, sql: str, parameters: Iterable = ...) -> Cursor: ...
+    # TODO: please check in executemany() if seq_of_parameters type is possible like this
+    def executemany(self, sql: str, seq_of_parameters: Iterable[Iterable]) -> Cursor: ...
+    def executescript(self, sql_script: Union[bytes, AnyStr]) -> Cursor: ...
+    def interrupt(self, *args, **kwargs) -> None: ...
+    def iterdump(self, *args, **kwargs) -> None: ...
+    def rollback(self, *args, **kwargs) -> None: ...
+    # TODO: set_authorizer(authorzer_callback)
+    # see https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.set_authorizer
+    # returns [SQLITE_OK, SQLITE_DENY, SQLITE_IGNORE] so perhaps int
+    def set_authorizer(self, *args, **kwargs) -> None: ...
+    # set_progress_handler(handler, n) -> see https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.set_progress_handler
+    def set_progress_handler(self, *args, **kwargs) -> None: ...
+    def set_trace_callback(self, *args, **kwargs): ...
+    def __call__(self, *args, **kwargs): ...
+    def __enter__(self, *args, **kwargs): ...
+    def __exit__(self, *args, **kwargs): ...
+
+class Cursor(Iterator[Any]):
+    arraysize = ...  # type: Any
+    connection = ...  # type: Any
+    description = ...  # type: Any
+    lastrowid = ...  # type: Any
+    row_factory = ...  # type: Any
+    rowcount = ...  # type: Any
+    # TODO: Cursor class accepts exactly 1 argument
+    # required type is sqlite3.Connection (which is imported as _Connection)
+    # however, the name of the __init__ variable is unknown
+    def __init__(self, *args, **kwargs): ...
+    def close(self, *args, **kwargs): ...
+    def execute(self, sql: str, parameters: Iterable = ...) -> Cursor: ...
+    def executemany(self, sql: str, seq_of_parameters: Iterable[Iterable]): ...
+    def executescript(self, sql_script: Union[bytes, AnyStr]) -> Cursor: ...
+    def fetchall(self) -> List[Any]: ...
+    def fetchmany(self, size: Integral = ...) -> List[Any]: ...
+    def fetchone(self) -> Any: ...
+    def setinputsizes(self, *args, **kwargs): ...
+    def setoutputsize(self, *args, **kwargs): ...
+    def __iter__(self) -> Cursor: ...
+    def __next__(self) -> Any: ...
+
+
+class DataError(DatabaseError): ...
+
+class DatabaseError(Error): ...
+
+class Error(Exception): ...
+
+class IntegrityError(DatabaseError): ...
+
+class InterfaceError(Error): ...
+
+class InternalError(DatabaseError): ...
+
+class NotSupportedError(DatabaseError): ...
+
+class OperationalError(DatabaseError): ...
+
+class OptimizedUnicode:
+    maketrans = ...  # type: Any
+    def __init__(self, *args, **kwargs): ...
+    def capitalize(self, *args, **kwargs): ...
+    def casefold(self, *args, **kwargs): ...
+    def center(self, *args, **kwargs): ...
+    def count(self, *args, **kwargs): ...
+    def encode(self, *args, **kwargs): ...
+    def endswith(self, *args, **kwargs): ...
+    def expandtabs(self, *args, **kwargs): ...
+    def find(self, *args, **kwargs): ...
+    def format(self, *args, **kwargs): ...
+    def format_map(self, *args, **kwargs): ...
+    def index(self, *args, **kwargs): ...
+    def isalnum(self, *args, **kwargs): ...
+    def isalpha(self, *args, **kwargs): ...
+    def isdecimal(self, *args, **kwargs): ...
+    def isdigit(self, *args, **kwargs): ...
+    def isidentifier(self, *args, **kwargs): ...
+    def islower(self, *args, **kwargs): ...
+    def isnumeric(self, *args, **kwargs): ...
+    def isprintable(self, *args, **kwargs): ...
+    def isspace(self, *args, **kwargs): ...
+    def istitle(self, *args, **kwargs): ...
+    def isupper(self, *args, **kwargs): ...
+    def join(self, *args, **kwargs): ...
+    def ljust(self, *args, **kwargs): ...
+    def lower(self, *args, **kwargs): ...
+    def lstrip(self, *args, **kwargs): ...
+    def partition(self, *args, **kwargs): ...
+    def replace(self, *args, **kwargs): ...
+    def rfind(self, *args, **kwargs): ...
+    def rindex(self, *args, **kwargs): ...
+    def rjust(self, *args, **kwargs): ...
+    def rpartition(self, *args, **kwargs): ...
+    def rsplit(self, *args, **kwargs): ...
+    def rstrip(self, *args, **kwargs): ...
+    def split(self, *args, **kwargs): ...
+    def splitlines(self, *args, **kwargs): ...
+    def startswith(self, *args, **kwargs): ...
+    def strip(self, *args, **kwargs): ...
+    def swapcase(self, *args, **kwargs): ...
+    def title(self, *args, **kwargs): ...
+    def translate(self, *args, **kwargs): ...
+    def upper(self, *args, **kwargs): ...
+    def zfill(self, *args, **kwargs): ...
+    def __add__(self, other): ...
+    def __contains__(self, *args, **kwargs): ...
+    def __eq__(self, other): ...
+    def __format__(self, *args, **kwargs): ...
+    def __ge__(self, other): ...
+    def __getitem__(self, index): ...
+    def __getnewargs__(self, *args, **kwargs): ...
+    def __gt__(self, other): ...
+    def __hash__(self): ...
+    def __iter__(self): ...
+    def __le__(self, other): ...
+    def __len__(self, *args, **kwargs): ...
+    def __lt__(self, other): ...
+    def __mod__(self, other): ...
+    def __mul__(self, other): ...
+    def __ne__(self, other): ...
+    def __rmod__(self, other): ...
+    def __rmul__(self, other): ...
+    def __sizeof__(self): ...
+
+class PrepareProtocol:
+    def __init__(self, *args, **kwargs): ...
+
+class ProgrammingError(DatabaseError): ...
+
+class Row:
+    def __init__(self, *args, **kwargs): ...
+    def keys(self, *args, **kwargs): ...
+    def __eq__(self, other): ...
+    def __ge__(self, other): ...
+    def __getitem__(self, index): ...
+    def __gt__(self, other): ...
+    def __hash__(self): ...
+    def __iter__(self): ...
+    def __le__(self, other): ...
+    def __len__(self, *args, **kwargs): ...
+    def __lt__(self, other): ...
+    def __ne__(self, other): ...
+
+class Statement:
+    def __init__(self, *args, **kwargs): ...
+
+class Warning(Exception): ...
diff --git a/typeshed/stdlib/3/ssl.pyi b/typeshed/stdlib/3/ssl.pyi
new file mode 100644
index 0000000..250034e
--- /dev/null
+++ b/typeshed/stdlib/3/ssl.pyi
@@ -0,0 +1,285 @@
+# Stubs for ssl (Python 3.4)
+
+from typing import (
+    Any, Dict, Callable, List, NamedTuple, Optional, Set, Tuple, Union,
+)
+import socket
+import sys
+
+_PCTRTT = Tuple[Tuple[str, str], ...]
+_PCTRTTT = Tuple[_PCTRTT, ...]
+_PeerCertRetDictType = Dict[str, Union[str, _PCTRTTT, _PCTRTT]]
+_PeerCertRetType = Union[_PeerCertRetDictType, bytes, None]
+_EnumRetType = List[Tuple[bytes, str, Union[Set[str], bool]]]
+_PasswordType = Union[Callable[[], Union[str, bytes]], str, bytes]
+
+
+if sys.version_info >= (3, 5):
+    _SC1ArgT = Union[SSLSocket, SSLObject]
+else:
+    _SC1ArgT = SSLSocket
+_SrvnmeCbType = Callable[[_SC1ArgT, Optional[str], 'SSLSocket'], Optional[int]]
+
+class SSLError(OSError):
+    library = ...  # type: str
+    reason = ...  # type: str
+class SSLZeroReturnError(SSLError): ...
+class SSLWantReadError(SSLError): ...
+class SSLWantWriteError(SSLError): ...
+class SSLSyscallError(SSLError): ...
+class SSLEOFError(SSLError): ...
+class CertificateError(Exception): ...
+
+
+def wrap_socket(sock: socket.socket, keyfile: Optional[str] = ...,
+                certfile: Optional[str] = ..., server_side: bool = ...,
+                cert_reqs: int = ..., ssl_version: int = ...,
+                ca_certs: Optional[str] = ...,
+                do_handshake_on_connect: bool = ...,
+                suppress_ragged_eofs: bool = ...,
+                ciphers: Optional[str] = ...) -> 'SSLSocket': ...
+
+
+if sys.version_info >= (3, 4):
+    def create_default_context(purpose: Any = ..., *,
+                               cafile: Optional[str] = ...,
+                               capath: Optional[str] = ...,
+                               cadata: Optional[str] = ...) -> 'SSLContext': ...
+
+if sys.version_info >= (3, 4, 3):
+    def _create_unverified_context(protocol: int = ..., *,
+                                   cert_reqs: int = ...,
+                                   check_hostname: bool = ...,
+                                   purpose: Any = ...,
+                                   certfile: Optional[str] = ...,
+                                   keyfile: Optional[str] = ...,
+                                   cafile: Optional[str] = ...,
+                                   capath: Optional[str] = ...,
+                                   cadata: Optional[str] = ...) -> 'SSLContext': ...
+    _create_default_https_context = ...  # type: Callable[..., 'SSLContext']
+
+def RAND_bytes(num: int) -> bytes: ...
+def RAND_pseudo_bytes(num: int) -> Tuple[bytes, bool]: ...
+def RAND_status() -> bool: ...
+def RAND_egd(path: str) -> None: ...
+def RAND_add(bytes: bytes, entropy: float) -> None: ...
+
+
+def match_hostname(cert: _PeerCertRetType, hostname: str) -> None: ...
+def cert_time_to_seconds(cert_time: str) -> int: ...
+def get_server_certificate(addr: Tuple[str, int], ssl_version: int = ...,
+                           ca_certs: Optional[str] = ...) -> str: ...
+def DER_cert_to_PEM_cert(der_cert_bytes: bytes) -> str: ...
+def PEM_cert_to_DER_cert(pem_cert_string: str) -> bytes: ...
+if sys.version_info >= (3, 4):
+    DefaultVerifyPaths = NamedTuple('DefaultVerifyPaths',
+                                    [('cafile', str), ('capath', str),
+                                     ('openssl_cafile_env', str),
+                                     ('openssl_cafile', str),
+                                     ('openssl_capath_env', str),
+                                     ('openssl_capath', str)])
+    def get_default_verify_paths() -> DefaultVerifyPaths: ...
+
+if sys.version_info >= (3, 4) and sys.platform == 'win32':
+    def enum_certificates(store_name: str) -> _EnumRetType: ...
+    def enum_crls(store_name: str) -> _EnumRetType: ...
+
+
+CERT_NONE = ...  # type: int
+CERT_OPTIONAL = ...  # type: int
+CERT_REQUIRED = ...  # type: int
+
+if sys.version_info >= (3, 4):
+    VERIFY_DEFAULT = ...  # type: int
+    VERIFY_CRL_CHECK_LEAF = ...  # type: int
+    VERIFY_CRL_CHECK_CHAIN = ...  # type: int
+    VERIFY_X509_STRICT = ...  # type: int
+if sys.version_info >= (3, 4, 4):
+    VERIFY_X509_TRUSTED_FIRST = ...  # type: int
+
+PROTOCOL_SSLv23 = ...  # type: int
+PROTOCOL_SSLv2 = ...  # type: int
+PROTOCOL_SSLv3 = ...  # type: int
+PROTOCOL_TLSv1 = ...  # type: int
+if sys.version_info >= (3, 4):
+    PROTOCOL_TLSv1_1 = ...  # type: int
+    PROTOCOL_TLSv1_2 = ...  # type: int
+
+OP_ALL = ...  # type: int
+OP_NO_SSLv2 = ...  # type: int
+OP_NO_SSLv3 = ...  # type: int
+OP_NO_TLSv1 = ...  # type: int
+if sys.version_info >= (3, 4):
+    OP_NO_TLSv1_1 = ...  # type: int
+    OP_NO_TLSv1_2 = ...  # type: int
+OP_CIPHER_SERVER_PREFERENCE = ...  # type: int
+OP_SINGLE_DH_USE = ...  # type: int
+OP_SINGLE_ECDH_USE = ...  # type: int
+OP_NO_COMPRESSION = ...  # type: int
+
+if sys.version_info >= (3, 5):
+    HAS_ALPN = ...  # type: int
+HAS_ECDH = ...  # type: bool
+HAS_SNI = ...  # type: bool
+HAS_NPN = ...  # type: bool
+CHANNEL_BINDING_TYPES = ...  # type: List[str]
+
+OPENSSL_VERSION = ...  # type: str
+OPENSSL_VERSION_INFO = ...  # type: Tuple[int, int, int, int, int]
+OPENSSL_VERSION_NUMBER = ...  # type: int
+
+if sys.version_info >= (3, 4):
+    ALERT_DESCRIPTION_HANDSHAKE_FAILURE = ...  # type: int
+    ALERT_DESCRIPTION_INTERNAL_ERROR = ...  # type: int
+    ALERT_DESCRIPTION_ACCESS_DENIED = ...  # type: int
+    ALERT_DESCRIPTION_BAD_CERTIFICATE = ...  # type: int
+    ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE = ...  # type: int
+    ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE = ...  # type: int
+    ALERT_DESCRIPTION_BAD_RECORD_MAC = ...  # type: int
+    ALERT_DESCRIPTION_CERTIFICATE_EXPIRED = ...  # type: int
+    ALERT_DESCRIPTION_CERTIFICATE_REVOKED = ...  # type: int
+    ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN = ...  # type: int
+    ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE = ...  # type: int
+    ALERT_DESCRIPTION_CLOSE_NOTIFY = ...  # type: int
+    ALERT_DESCRIPTION_DECODE_ERROR = ...  # type: int
+    ALERT_DESCRIPTION_DECOMPRESSION_FAILURE = ...  # type: int
+    ALERT_DESCRIPTION_DECRYPT_ERROR = ...  # type: int
+    ALERT_DESCRIPTION_ILLEGAL_PARAMETER = ...  # type: int
+    ALERT_DESCRIPTION_INSUFFICIENT_SECURITY = ...  # type: int
+    ALERT_DESCRIPTION_NO_RENEGOTIATION = ...  # type: int
+    ALERT_DESCRIPTION_PROTOCOL_VERSION = ...  # type: int
+    ALERT_DESCRIPTION_RECORD_OVERFLOW = ...  # type: int
+    ALERT_DESCRIPTION_UNEXPECTED_MESSAGE = ...  # type: int
+    ALERT_DESCRIPTION_UNKNOWN_CA = ...  # type: int
+    ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY = ...  # type: int
+    ALERT_DESCRIPTION_UNRECOGNIZED_NAME = ...  # type: int
+    ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE = ...  # type: int
+    ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION = ...  # type: int
+    ALERT_DESCRIPTION_USER_CANCELLED = ...  # type: int
+
+if sys.version_info >= (3, 4):
+    _PurposeType = NamedTuple('_PurposeType',
+                             [('nid', int), ('shortname', str),
+                              ('longname', str), ('oid', str)])
+    class Purpose:
+        SERVER_AUTH = ...  # type: _PurposeType
+        CLIENT_AUTH = ...  # type: _PurposeType
+
+
+class SSLSocket(socket.socket):
+    context = ...  # type: SSLContext
+    server_side = ...  # type: bool
+    server_hostname = ...  # type: Optional[str]
+    def read(self, len: int = ...,
+             buffer: Optional[bytearray] = ...) -> bytes: ...
+    def write(self, buf: bytes) -> int: ...
+    def do_handshake(self) -> None: ...
+    def getpeercert(self, binary_form: bool = ...) -> _PeerCertRetType: ...
+    def cipher(self) -> Tuple[str, int, int]: ...
+    if sys.version_info >= (3, 5):
+        def shared_cipher(self) -> Optional[List[Tuple[str, int, int]]]: ...
+    def compression(self) -> Optional[str]: ...
+    def get_channel_binding(self, cb_type: str = ...) -> Optional[bytes]: ...
+    if sys.version_info >= (3, 5):
+        def selected_alpn_protocol(self) -> Optional[str]: ...
+    def selected_npn_protocol(self) -> Optional[str]: ...
+    def unwrap(self) -> socket.socket: ...
+    if sys.version_info >= (3, 5):
+        def version(self) -> Optional[str]: ...
+    def pending(self) -> int: ...
+
+
+class SSLContext:
+    if sys.version_info >= (3, 4):
+        check_hostname = ...  # type: bool
+    options = ...  # type: int
+    @property
+    def protocol(self) -> int: ...
+    if sys.version_info >= (3, 4):
+        verify_flags = ...  # type: int
+    verify_mode = ...  # type: int
+    def __init__(self, protocol: int) -> None: ...
+    if sys.version_info >= (3, 4):
+        def cert_store_stats(self) -> Dict[str, int]: ...
+    def load_cert_chain(self, certfile: str, keyfile: Optional[str] = ...,
+                        password: _PasswordType = ...) -> None: ...
+    if sys.version_info >= (3, 4):
+        def load_default_certs(self, purpose: _PurposeType = ...) -> None: ...
+        def load_verify_locations(self, cafile: Optional[str] = ...,
+                                  capath: Optional[str] = ...,
+                                  cadata: Union[str, bytes, None] = ...) \
+                                  -> None: ...
+        def get_ca_certs(self,
+                         binary_form: bool = ...) \
+                         -> Union[List[_PeerCertRetDictType], List[bytes]]: ...
+    else:
+        def load_verify_locations(self,
+                                  cafile: Optional[str] = ...,
+                                  capath: Optional[str] = ...) -> None: ...
+    def set_default_verify_paths(self) -> None: ...
+    def set_ciphers(self, ciphers: str) -> None: ...
+    if sys.version_info >= (3, 5):
+        def set_alpn_protocols(self, protocols: List[str]) -> None: ...
+    def set_npn_protocols(self, protocols: List[str]) -> None: ...
+    def set_servername_callback(self,
+                                server_name_callback: Optional[_SrvnmeCbType]) \
+                                -> None: ...
+    def load_dh_params(self, dhfile: str) -> None: ...
+    def set_ecdh_curve(self, curve_name: str) -> None: ...
+    def wrap_socket(self, sock: socket.socket, server_side: bool = ...,
+                    do_handshake_on_connect: bool = ...,
+                    suppress_ragged_eofs: bool = ...,
+                    server_hostname: Optional[str] = ...) -> 'SSLContext': ...
+    if sys.version_info >= (3, 5):
+        def wrap_bio(self, incoming: 'MemoryBIO', outgoing: 'MemoryBIO',
+                     server_side: bool = ...,
+                     server_hostname: Optional[str] = ...) -> 'SSLObject': ...
+    def session_stats(self) -> Dict[str, int]: ...
+
+
+if sys.version_info >= (3, 5):
+    class SSLObject:
+        context = ...  # type: SSLContext
+        server_side = ...  # type: bool
+        server_hostname = ...  # type: Optional[str]
+        def read(self, len: int = ...,
+                 buffer: Optional[bytearray] = ...) -> bytes: ...
+        def write(self, buf: bytes) -> int: ...
+        def getpeercert(self, binary_form: bool = ...) -> _PeerCertRetType: ...
+        def selected_npn_protocol(self) -> Optional[str]: ...
+        def cipher(self) -> Tuple[str, int, int]: ...
+        def shared_cipher(self) -> Optional[List[Tuple[str, int, int]]]: ...
+        def compression(self) -> Optional[str]: ...
+        def pending(self) -> int: ...
+        def do_handshake(self) -> None: ...
+        def unwrap(self) -> None: ...
+        def get_channel_binding(self, cb_type: str = ...) -> Optional[bytes]: ...
+
+    class MemoryBIO:
+        pending = ...  # type: int
+        eof = ...  # type: bool
+        def read(self, n: int = ...) -> bytes: ...
+        def write(self, buf: bytes) -> int: ...
+        def write_eof(self) -> None: ...
+
+
+# TODO below documented in cpython but not in docs.python.org
+# taken from python 3.4
+SSL_ERROR_EOF = ...  # type: int
+SSL_ERROR_INVALID_ERROR_CODE = ...  # type: int
+SSL_ERROR_SSL = ...  # type: int
+SSL_ERROR_SYSCALL = ...  # type: int
+SSL_ERROR_WANT_CONNECT = ...  # type: int
+SSL_ERROR_WANT_READ = ...  # type: int
+SSL_ERROR_WANT_WRITE = ...  # type: int
+SSL_ERROR_WANT_X509_LOOKUP = ...  # type: int
+SSL_ERROR_ZERO_RETURN = ...  # type: int
+
+def get_protocol_name(protocol_code: int) -> str: ...
+
+AF_INET = ...  # type: int
+PEM_FOOTER = ...  # type: str
+PEM_HEADER = ...  # type: str
+SOCK_STREAM = ...  # type: int
+SOL_SOCKET = ...  # type: int
+SO_TYPE = ...  # type: int
diff --git a/typeshed/stdlib/3/stat.pyi b/typeshed/stdlib/3/stat.pyi
new file mode 100644
index 0000000..92e640f
--- /dev/null
+++ b/typeshed/stdlib/3/stat.pyi
@@ -0,0 +1,73 @@
+# Stubs for stat
+
+# Based on http://docs.python.org/3.2/library/stat.html
+
+import sys
+import typing
+
+def S_ISDIR(mode: int) -> bool: ...
+def S_ISCHR(mode: int) -> bool: ...
+def S_ISBLK(mode: int) -> bool: ...
+def S_ISREG(mode: int) -> bool: ...
+def S_ISFIFO(mode: int) -> bool: ...
+def S_ISLNK(mode: int) -> bool: ...
+def S_ISSOCK(mode: int) -> bool: ...
+
+def S_IMODE(mode: int) -> int: ...
+def S_IFMT(mode: int) -> int: ...
+
+ST_MODE = 0
+ST_INO = 0
+ST_DEV = 0
+ST_NLINK = 0
+ST_UID = 0
+ST_GID = 0
+ST_SIZE = 0
+ST_ATIME = 0
+ST_MTIME = 0
+ST_CTIME = 0
+
+S_IFSOCK = 0
+S_IFLNK = 0
+S_IFREG = 0
+S_IFBLK = 0
+S_IFDIR = 0
+S_IFCHR = 0
+S_IFIFO = 0
+S_ISUID = 0
+S_ISGID = 0
+S_ISVTX = 0
+
+S_IRWXU = 0
+S_IRUSR = 0
+S_IWUSR = 0
+S_IXUSR = 0
+
+S_IRWXG = 0
+S_IRGRP = 0
+S_IWGRP = 0
+S_IXGRP = 0
+
+S_IRWXO = 0
+S_IROTH = 0
+S_IWOTH = 0
+S_IXOTH = 0
+
+S_ENFMT = 0
+S_IREAD = 0
+S_IWRITE = 0
+S_IEXEC = 0
+
+UF_NODUMP = 0
+UF_IMMUTABLE = 0
+UF_APPEND = 0
+UF_OPAQUE = 0
+UF_NOUNLINK = 0
+if sys.platform == 'darwin':
+    UF_COMPRESSED = 0  # OS X 10.6+ only
+    UF_HIDDEN = 0     # OX X 10.5+ only
+SF_ARCHIVED = 0
+SF_IMMUTABLE = 0
+SF_APPEND = 0
+SF_NOUNLINK = 0
+SF_SNAPSHOT = 0
diff --git a/typeshed/stdlib/3/string.pyi b/typeshed/stdlib/3/string.pyi
new file mode 100644
index 0000000..365449e
--- /dev/null
+++ b/typeshed/stdlib/3/string.pyi
@@ -0,0 +1,42 @@
+# Stubs for string
+
+# Based on http://docs.python.org/3.2/library/string.html
+
+from typing import Mapping, Sequence, Any, Optional, Union, List, Tuple, Iterable, AnyStr
+
+ascii_letters = ...  # type: str
+ascii_lowercase = ...  # type: str
+ascii_uppercase = ...  # type: str
+digits = ...  # type: str
+hexdigits = ...  # type: str
+octdigits = ...  # type: str
+punctuation = ...  # type: str
+printable = ...  # type: str
+whitespace = ...  # type: str
+
+def capwords(s: str, sep: str = ...) -> str: ...
+
+class Template:
+    template = ...  # type: str
+
+    def __init__(self, template: str) -> None: ...
+    def substitute(self, mapping: Mapping[str, str] = ..., **kwds: str) -> str: ...
+    def safe_substitute(self, mapping: Mapping[str, str] = ...,
+                        **kwds: str) -> str: ...
+
+# TODO(MichalPokorny): This is probably badly and/or loosely typed.
+class Formatter(object):
+    def format(self, format_string: str, *args, **kwargs) -> str: ...
+    def vformat(self, format_string: str, args: Sequence[Any],
+                kwargs: Mapping[str, Any]) -> str: ...
+    def parse(self, format_string: str) -> Iterable[Tuple[str, Optional[str], Optional[str], Optional[str]]]: ...
+    def get_field(self, field_name: str, args: Sequence[Any],
+                  kwargs: Mapping[str, Any]) -> Any: ...
+    def get_value(self, key: Union[int, str], args: Sequence[Any],
+                  kwargs: Mapping[str, Any]) -> Any:
+        raise IndexError()
+        raise KeyError()
+    def check_unused_args(self, used_args: Sequence[Union[int, str]], args: Sequence[Any],
+                          kwargs: Mapping[str, Any]) -> None: ...
+    def format_field(self, value: Any, format_spec: str) -> Any: ...
+    def convert_field(self, value: Any, conversion: str) -> Any: ...
diff --git a/typeshed/stdlib/3/struct.pyi b/typeshed/stdlib/3/struct.pyi
new file mode 100644
index 0000000..f539610
--- /dev/null
+++ b/typeshed/stdlib/3/struct.pyi
@@ -0,0 +1,30 @@
+# Stubs for struct
+
+# Based on http://docs.python.org/3.2/library/struct.html
+
+from typing import overload, Any, Tuple
+
+class error(Exception): ...
+
+def pack(fmt: str, *v: Any) -> bytes: ...
+# TODO buffer type
+def pack_into(fmt: str, buffer: Any, offset: int, *v: Any) -> None: ...
+
+# TODO buffer type
+def unpack(fmt: str, buffer: Any) -> Tuple[Any, ...]: ...
+def unpack_from(fmt: str, buffer: Any, offset: int = ...) -> Tuple[Any, ...]: ...
+
+def calcsize(fmt: str) -> int: ...
+
+class Struct:
+    format = b''
+    size = 0
+
+    def __init__(self, format: str) -> None: ...
+
+    def pack(self, *v: Any) -> bytes: ...
+    # TODO buffer type
+    def pack_into(self, buffer: Any, offset: int, *v: Any) -> None: ...
+    # TODO buffer type
+    def unpack(self, buffer: Any) -> Tuple[Any, ...]: ...
+    def unpack_from(self, buffer: Any, offset: int = ...) -> Tuple[Any, ...]: ...
diff --git a/typeshed/stdlib/3/subprocess.pyi b/typeshed/stdlib/3/subprocess.pyi
new file mode 100644
index 0000000..c22ba00
--- /dev/null
+++ b/typeshed/stdlib/3/subprocess.pyi
@@ -0,0 +1,249 @@
+# Stubs for subprocess
+
+# Based on http://docs.python.org/3.5/library/subprocess.html
+import sys
+from typing import Sequence, Any, AnyStr, Mapping, Callable, Tuple, IO, Optional, Union, List, Type
+from types import TracebackType
+
+
+if sys.version_info >= (3, 5):
+    class CompletedProcess:
+        args = ...  # type: Union[List, str]
+        returncode = ...  # type: int
+        stdout = ...  # type: Any
+        stderr = ...  # type: Any
+        def __init__(self, args: Union[List, str],
+                     returncode: int,
+                     stdout: Union[str, bytes],
+                     stderr: Union[str, bytes]) -> None: ...
+        def check_returncode(self) -> None: ...
+
+    # Nearly same args as Popen.__init__ except for timeout, input, and check
+    def run(args: Union[str, Sequence[str]],
+            timeout: float = ...,
+            input: Union[str, bytes] = ...,
+            check: bool = ...,
+            bufsize: int = ...,
+            executable: str = ...,
+            stdin: Any = ...,
+            stdout: Any = ...,
+            stderr: Any = ...,
+            preexec_fn: Callable[[], Any] = ...,
+            close_fds: bool = ...,
+            shell: bool = ...,
+            cwd: str = ...,
+            env: Mapping[str, str] = ...,
+            universal_newlines: bool = ...,
+            startupinfo: Any = ...,
+            creationflags: int = ...,
+            restore_signals: bool = ...,
+            start_new_session: bool = ...,
+            pass_fds: Any = ...) -> CompletedProcess: ...
+
+# Same args as Popen.__init__
+if sys.version_info >= (3, 3):
+    # 3.3 added timeout
+    def call(args: Union[str, Sequence[str]],
+             bufsize: int = ...,
+             executable: str = ...,
+             stdin: Any = ...,
+             stdout: Any = ...,
+             stderr: Any = ...,
+             preexec_fn: Callable[[], Any] = ...,
+             close_fds: bool = ...,
+             shell: bool = ...,
+             cwd: str = ...,
+             env: Mapping[str, str] = ...,
+             universal_newlines: bool = ...,
+             startupinfo: Any = ...,
+             creationflags: int = ...,
+             restore_signals: bool = ...,
+             start_new_session: bool = ...,
+             pass_fds: Any = ...,
+             timeout: float = ...) -> int: ...
+else:
+    def call(args: Union[str, Sequence[str]],
+             bufsize: int = ...,
+             executable: str = ...,
+             stdin: Any = ...,
+             stdout: Any = ...,
+             stderr: Any = ...,
+             preexec_fn: Callable[[], Any] = ...,
+             close_fds: bool = ...,
+             shell: bool = ...,
+             cwd: str = ...,
+             env: Mapping[str, str] = ...,
+             universal_newlines: bool = ...,
+             startupinfo: Any = ...,
+             creationflags: int = ...,
+             restore_signals: bool = ...,
+             start_new_session: bool = ...,
+             pass_fds: Any = ...) -> int: ...
+
+# Same args as Popen.__init__
+if sys.version_info >= (3, 3):
+    # 3.3 added timeout
+    def check_call(args: Union[str, Sequence[str]],
+                   bufsize: int = ...,
+                   executable: str = ...,
+                   stdin: Any = ...,
+                   stdout: Any = ...,
+                   stderr: Any = ...,
+                   preexec_fn: Callable[[], Any] = ...,
+                   close_fds: bool = ...,
+                   shell: bool = ...,
+                   cwd: str = ...,
+                   env: Mapping[str, str] = ...,
+                   universal_newlines: bool = ...,
+                   startupinfo: Any = ...,
+                   creationflags: int = ...,
+                   restore_signals: bool = ...,
+                   start_new_session: bool = ...,
+                   pass_fds: Any = ...,
+                   timeout: float = ...) -> int: ...
+else:
+    def check_call(args: Union[str, Sequence[str]],
+                   bufsize: int = ...,
+                   executable: str = ...,
+                   stdin: Any = ...,
+                   stdout: Any = ...,
+                   stderr: Any = ...,
+                   preexec_fn: Callable[[], Any] = ...,
+                   close_fds: bool = ...,
+                   shell: bool = ...,
+                   cwd: str = ...,
+                   env: Mapping[str, str] = ...,
+                   universal_newlines: bool = ...,
+                   startupinfo: Any = ...,
+                   creationflags: int = ...,
+                   restore_signals: bool = ...,
+                   start_new_session: bool = ...,
+                   pass_fds: Any = ...) -> int: ...
+
+if sys.version_info >= (3, 4):
+    # 3.4 added input
+    def check_output(args: Union[str, Sequence[str]],
+                     bufsize: int = ...,
+                     executable: str = ...,
+                     stdin: Any = ...,
+                     stderr: Any = ...,
+                     preexec_fn: Callable[[], Any] = ...,
+                     close_fds: bool = ...,
+                     shell: bool = ...,
+                     cwd: str = ...,
+                     env: Mapping[str, str] = ...,
+                     universal_newlines: bool = ...,
+                     startupinfo: Any = ...,
+                     creationflags: int = ...,
+                     restore_signals: bool = ...,
+                     start_new_session: bool = ...,
+                     pass_fds: Any = ...,
+                     timeout: float = ...,
+                     input: Union[str, bytes] = ...) -> Any: ...
+elif sys.version_info >= (3, 3):
+    # 3.3 added timeout
+    def check_output(args: Union[str, Sequence[str]],
+                     bufsize: int = ...,
+                     executable: str = ...,
+                     stdin: Any = ...,
+                     stderr: Any = ...,
+                     preexec_fn: Callable[[], Any] = ...,
+                     close_fds: bool = ...,
+                     shell: bool = ...,
+                     cwd: str = ...,
+                     env: Mapping[str, str] = ...,
+                     universal_newlines: bool = ...,
+                     startupinfo: Any = ...,
+                     creationflags: int = ...,
+                     restore_signals: bool = ...,
+                     start_new_session: bool = ...,
+                     pass_fds: Any = ...,
+                     timeout: float = ...) -> Any: ...
+else:
+    # Same args as Popen.__init__, except for stdout
+    def check_output(args: Union[str, Sequence[str]],
+                     bufsize: int = ...,
+                     executable: str = ...,
+                     stdin: Any = ...,
+                     stderr: Any = ...,
+                     preexec_fn: Callable[[], Any] = ...,
+                     close_fds: bool = ...,
+                     shell: bool = ...,
+                     cwd: str = ...,
+                     env: Mapping[str, str] = ...,
+                     universal_newlines: bool = ...,
+                     startupinfo: Any = ...,
+                     creationflags: int = ...,
+                     restore_signals: bool = ...,
+                     start_new_session: bool = ...,
+                     pass_fds: Any = ...) -> Any: ...
+
+
+# TODO types
+PIPE = ...  # type: Any
+STDOUT = ...  # type: Any
+if sys.version_info >= (3, 3):
+    DEVNULL = ...  # type: Any
+    class SubprocessError(Exception): ...
+    class TimeoutExpired(SubprocessError): ...
+
+
+class CalledProcessError(Exception):
+    returncode = 0
+    cmd = ...  # type: str
+    output = b''  # May be None
+
+    if sys.version_info >= (3, 5):
+        stdout = b''
+        stderr = b''
+
+    def __init__(self, returncode: int, cmd: str, output: Optional[str] = ...,
+                 stderr: Optional[str] = ...) -> None: ...
+
+class Popen:
+    stdin = ...  # type: IO[Any]
+    stdout = ...  # type: IO[Any]
+    stderr = ...  # type: IO[Any]
+    pid = 0
+    returncode = 0
+
+    def __init__(self,
+                  args: Union[str, Sequence[str]],
+                  bufsize: int = ...,
+                  executable: Optional[str] = ...,
+                  stdin: Optional[Any] = ...,
+                  stdout: Optional[Any] = ...,
+                  stderr: Optional[Any] = ...,
+                  preexec_fn: Optional[Callable[[], Any]] = ...,
+                  close_fds: bool = ...,
+                  shell: bool = ...,
+                  cwd: Optional[str] = ...,
+                  env: Optional[Mapping[str, str]] = ...,
+                  universal_newlines: bool = ...,
+                  startupinfo: Optional[Any] = ...,
+                  creationflags: int = ...,
+                  restore_signals: bool = ...,
+                  start_new_session: bool = ...,
+                  pass_fds: Any = ...) -> None: ...
+
+    def poll(self) -> int: ...
+    if sys.version_info >= (3, 3):
+        # 3.3 added timeout
+        def wait(self, timeout: Optional[float] = ...) -> int: ...
+    else:
+        def wait(self) ->int: ...
+    # Return str/bytes
+    if sys.version_info >= (3, 3):
+        def communicate(self, input: Optional[AnyStr] = ..., timeout: Optional[float] = ...) -> Tuple[Any, Any]: ...
+    else:
+        def communicate(self, input: Optional[AnyStr] = ...) -> Tuple[Any, Any]: ...
+    def send_signal(self, signal: int) -> None: ...
+    def terminate(self) -> None: ...
+    def kill(self) -> None: ...
+    def __enter__(self) -> 'Popen': ...
+    def __exit__(self, type: Optional[Type[BaseException]], value: Optional[BaseException], traceback: Optional[TracebackType]) -> bool: ...
+
+def getstatusoutput(cmd: str) -> Tuple[int, str]: ...
+def getoutput(cmd: str) -> str: ...
+
+# Windows-only: STARTUPINFO etc.
diff --git a/typeshed/stdlib/3/sys.pyi b/typeshed/stdlib/3/sys.pyi
new file mode 100644
index 0000000..042fcf1
--- /dev/null
+++ b/typeshed/stdlib/3/sys.pyi
@@ -0,0 +1,161 @@
+# Stubs for sys
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http://docs.python.org/3.2/library/sys.html
+
+from typing import (
+    List, Sequence, Any, Dict, Tuple, TextIO, overload, Optional, Union,
+    TypeVar, Callable, Type,
+)
+from types import TracebackType
+from mypy_extensions import NoReturn
+
+_T = TypeVar('_T')
+
+# ----- sys variables -----
+abiflags = ...  # type: str
+argv = ...  # type: List[str]
+byteorder = ...  # type: str
+builtin_module_names = ...  # type: Sequence[str] # actually a tuple of strings
+copyright = ...  # type: str
+# dllhandle = 0  # Windows only
+dont_write_bytecode = False
+__displayhook__ = ...  # type: Any # contains the original value of displayhook
+__excepthook__ = ...  # type: Any  # contains the original value of excepthook
+exec_prefix = ...  # type: str
+executable = ...  # type: str
+float_repr_style = ...  # type: str
+hexversion = 0  # this is a 32-bit int
+last_type = ...  # type: Any
+last_value = ...  # type: Any
+last_traceback = ...  # type: Any
+maxsize = 0
+maxunicode = 0
+meta_path = ...  # type: List[Any]
+modules = ...  # type: Dict[str, Any]
+path = ...  # type: List[str]
+path_hooks = ...  # type: List[Any] # TODO precise type; function, path to finder
+path_importer_cache = ...  # type: Dict[str, Any] # TODO precise type
+platform = ...  # type: str
+prefix = ...  # type: str
+ps1 = ...  # type: str
+ps2 = ...  # type: str
+stdin = ...  # type: TextIO
+stdout = ...  # type: TextIO
+stderr = ...  # type: TextIO
+__stdin__ = ...  # type: TextIO
+__stdout__ = ...  # type: TextIO
+__stderr__ = ...  # type: TextIO
+# deprecated and removed in Python 3.3:
+subversion = ...  # type: Tuple[str, str, str]
+tracebacklimit = 0
+version = ...  # type: str
+api_version = 0
+warnoptions = ...  # type: Any
+#  Each entry is a tuple of the form (action, message, category, module,
+#    lineno)
+# winver = ''  # Windows only
+_xoptions = ...  # type: Dict[Any, Any]
+
+flags = ...  # type: _flags
+class _flags:
+    debug = 0
+    division_warning = 0
+    inspect = 0
+    interactive = 0
+    optimize = 0
+    dont_write_bytecode = 0
+    no_user_site = 0
+    no_site = 0
+    ignore_environment = 0
+    verbose = 0
+    bytes_warning = 0
+    quiet = 0
+    hash_randomization = 0
+
+float_info = ...  # type: _float_info
+class _float_info:
+    epsilon = 0.0   # DBL_EPSILON
+    dig = 0         # DBL_DIG
+    mant_dig = 0    # DBL_MANT_DIG
+    max = 0.0       # DBL_MAX
+    max_exp = 0     # DBL_MAX_EXP
+    max_10_exp = 0  # DBL_MAX_10_EXP
+    min = 0.0       # DBL_MIN
+    min_exp = 0     # DBL_MIN_EXP
+    min_10_exp = 0  # DBL_MIN_10_EXP
+    radix = 0       # FLT_RADIX
+    rounds = 0      # FLT_ROUNDS
+
+hash_info = ...  # type: _hash_info
+class _hash_info:
+    width = 0    # width in bits used for hash values
+    modulus = 0  # prime modulus P used for numeric hash scheme
+    inf = 0      # hash value returned for a positive infinity
+    nan = 0      # hash value returned for a nan
+    imag = 0     # multiplier used for the imaginary part of a complex number
+
+int_info = ...  # type: _int_info
+class _int_info:
+    bits_per_digit = 0  # number of bits held in each digit. Python integers are stored internally in base 2**int_info.bits_per_digit
+    sizeof_digit = 0    # size in bytes of C type used to represent a digit
+
+class _version_info(Tuple[int, int, int, str, int]):
+    major = 0
+    minor = 0
+    micro = 0
+    releaselevel = ...  # type: str
+    serial = 0
+version_info = ...  # type: _version_info
+
+
+# ----- sys function stubs -----
+def call_tracing(fn: Callable[..., _T], args: Any) -> _T: ...
+def _clear_type_cache() -> None: ...
+def _current_frames() -> Dict[int, Any]: ...
+def displayhook(value: Optional[int]) -> None: ...
+def excepthook(type_: Type[BaseException], value: BaseException,
+               traceback: TracebackType) -> None: ...
+# TODO should be a union of tuple, see mypy#1178
+def exc_info() -> Tuple[Optional[Type[BaseException]],
+                        Optional[BaseException],
+                        Optional[TracebackType]]: ...
+# sys.exit() accepts an optional argument of anything printable
+def exit(arg: Any = ...) -> NoReturn:
+    raise SystemExit()
+def getcheckinterval() -> int: ...  # deprecated
+def getdefaultencoding() -> str: ...
+def getdlopenflags() -> int: ...  # Unix only
+def getfilesystemencoding() -> str: ...  # cannot return None
+def getrefcount(arg: Any) -> int: ...
+def getrecursionlimit() -> int: ...
+
+ at overload
+def getsizeof(obj: object) -> int: ...
+ at overload
+def getsizeof(obj: object, default: int) -> int: ...
+
+def getswitchinterval() -> float: ...
+
+ at overload
+def _getframe() -> Any: ...
+ at overload
+def _getframe(depth: int) -> Any: ...
+
+def getprofile() -> Any: ...  # TODO return type
+def gettrace() -> Any: ...  # TODO return
+def getwindowsversion() -> Any: ...  # Windows only, TODO return type
+def intern(string: str) -> str: ...
+def setcheckinterval(interval: int) -> None: ...  # deprecated
+def setdlopenflags(n: int) -> None: ...  # Linux only
+def setprofile(profilefunc: Any) -> None: ...  # TODO type
+def setrecursionlimit(limit: int) -> None: ...
+def setswitchinterval(interval: float) -> None: ...
+def settrace(tracefunc: Any) -> None: ...  # TODO type
+# Trace functions should have three arguments: frame, event, and arg. frame
+# is the current stack frame. event is a string: 'call', 'line', 'return',
+# 'exception', 'c_call', 'c_return', or 'c_exception'. arg depends on the
+# event type.
+def settscdump(on_flag: bool) -> None: ...
+
+def gettotalrefcount() -> int: ...  # Debug builds only
diff --git a/typeshed/stdlib/3/sysconfig.pyi b/typeshed/stdlib/3/sysconfig.pyi
new file mode 100644
index 0000000..8d7ab2c
--- /dev/null
+++ b/typeshed/stdlib/3/sysconfig.pyi
@@ -0,0 +1,8 @@
+# Stubs for sysconfig
+
+# NOTE: These are incomplete!
+
+import typing
+
+def get_config_var(name: str) -> str: ...
+def is_python_build() -> bool: ...
diff --git a/typeshed/stdlib/3/tempfile.pyi b/typeshed/stdlib/3/tempfile.pyi
new file mode 100644
index 0000000..ea5207a
--- /dev/null
+++ b/typeshed/stdlib/3/tempfile.pyi
@@ -0,0 +1,51 @@
+# Stubs for tempfile
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http://docs.python.org/3.3/library/tempfile.html
+
+from types import TracebackType
+from typing import BinaryIO, Optional, Tuple, Type
+
+# global variables
+tempdir = ...  # type: str
+template = ...  # type: str
+
+# TODO text files
+
+# function stubs
+def TemporaryFile(
+    mode: str = ..., buffering: int = ..., encoding: str = ...,
+    newline: str = ..., suffix: str = ..., prefix: str = ...,
+    dir: str = ...
+) -> BinaryIO:
+    ...
+def NamedTemporaryFile(
+    mode: str = ..., buffering: int = ..., encoding: str = ...,
+    newline: str = ..., suffix: str = ..., prefix: str = ...,
+    dir: str = ..., delete: bool =...
+) -> BinaryIO:
+    ...
+def SpooledTemporaryFile(
+    max_size: int = ..., mode: str = ..., buffering: int = ...,
+    encoding: str = ..., newline: str = ..., suffix: str = ...,
+    prefix: str = ..., dir: str = ...
+) -> BinaryIO:
+    ...
+
+class TemporaryDirectory:
+    name = ...  # type: str
+    def __init__(self, suffix: str = ..., prefix: str = ...,
+                 dir: str = ...) -> None: ...
+    def cleanup(self) -> None: ...
+    def __enter__(self) -> str: ...
+    def __exit__(self, exc_type: Optional[Type[BaseException]],
+                 exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+
+def mkstemp(suffix: str = ..., prefix: str = ..., dir: str = ...,
+            text: bool = ...) -> Tuple[int, str]: ...
+def mkdtemp(suffix: str = ..., prefix: str = ...,
+            dir: str = ...) -> str: ...
+def mktemp(suffix: str = ..., prefix: str = ..., dir: str = ...) -> str: ...
+def gettempdir() -> str: ...
+def gettempprefix() -> str: ...
diff --git a/typeshed/stdlib/3/textwrap.pyi b/typeshed/stdlib/3/textwrap.pyi
new file mode 100644
index 0000000..319297b
--- /dev/null
+++ b/typeshed/stdlib/3/textwrap.pyi
@@ -0,0 +1,122 @@
+# Better textwrap stubs hand-written by o11c.
+# https://docs.python.org/3/library/textwrap.html
+from typing import (
+    Callable,
+    List,
+)
+
+class TextWrapper:
+    def __init__(
+        self,
+        width: int = ...,
+        *,
+        initial_indent: str = ...,
+        subsequent_indent: str = ...,
+        expand_tabs: bool = ...,
+        tabsize: int = ...,
+        replace_whitespace: bool = ...,
+        fix_sentence_endings: bool = ...,
+        break_long_words: bool = ...,
+        break_on_hyphens: bool = ...,
+        drop_whitespace: bool = ...,
+        max_lines: int = ...,
+        placeholder: str = ...
+    ) -> None:
+        self.width = width
+        self.initial_indent = initial_indent
+        self.subsequent_indent = subsequent_indent
+        self.expand_tabs = expand_tabs
+        self.tabsize = tabsize
+        self.replace_whitespace = replace_whitespace
+        self.fix_sentence_endings = fix_sentence_endings
+        self.break_long_words = break_long_words
+        self.break_on_hyphens = break_on_hyphens
+        self.drop_whitespace = drop_whitespace
+        self.max_lines = max_lines
+        self.placeholder = placeholder
+
+    # Private methods *are* part of the documented API for subclasses.
+    def _munge_whitespace(self, text: str) -> str:
+        ...
+
+    def _split(self, text: str) -> List[str]:
+        ...
+
+    def _fix_sentence_endings(self, chunks: List[str]) -> None:
+        ...
+
+    def _handle_long_word(self, reversed_chunks: List[str], cur_line: List[str], cur_len: int, width: int) -> None:
+        ...
+
+    def _wrap_chunks(self, chunks: List[str]) -> List[str]:
+        ...
+
+    def _split_chunks(self, text: str) -> List[str]:
+        ...
+
+    def wrap(self, text: str) -> List[str]:
+        ...
+
+    def fill(self, text: str) -> str:
+        ...
+
+
+def wrap(
+        text: str = ...,
+        width: int = ...,
+        *,
+        initial_indent: str = ...,
+        subsequent_indent: str = ...,
+        expand_tabs: bool = ...,
+        tabsize: int = ...,
+        replace_whitespace: bool = ...,
+        fix_sentence_endings: bool = ...,
+        break_long_words: bool = ...,
+        break_on_hyphens: bool = ...,
+        drop_whitespace: bool = ...,
+        max_lines: int = ...,
+        placeholder: str = ...
+) -> List[str]:
+    ...
+
+def fill(
+        text: str,
+        width: int = ...,
+        *,
+        initial_indent: str = ...,
+        subsequent_indent: str = ...,
+        expand_tabs: bool = ...,
+        tabsize: int = ...,
+        replace_whitespace: bool = ...,
+        fix_sentence_endings: bool = ...,
+        break_long_words: bool = ...,
+        break_on_hyphens: bool = ...,
+        drop_whitespace: bool = ...,
+        max_lines: int = ...,
+        placeholder: str = ...
+):
+    ...
+
+def shorten(
+        text: str,
+        width: int,
+        *,
+        initial_indent: str = ...,
+        subsequent_indent: str = ...,
+        expand_tabs: bool = ...,
+        tabsize: int = ...,
+        replace_whitespace: bool = ...,
+        fix_sentence_endings: bool = ...,
+        break_long_words: bool = ...,
+        break_on_hyphens: bool = ...,
+        drop_whitespace: bool = ...,
+        # Omit `max_lines: int = None`, it is forced to 1 here.
+        placeholder: str = ...
+):
+    ...
+
+def dedent(text: str) -> str:
+    ...
+
+def indent(text: str, prefix: str, predicate: Callable[[str], bool] = ...) -> str:
+    ...
diff --git a/typeshed/stdlib/3/time.pyi b/typeshed/stdlib/3/time.pyi
new file mode 100644
index 0000000..edcb9d6
--- /dev/null
+++ b/typeshed/stdlib/3/time.pyi
@@ -0,0 +1,84 @@
+# Stubs for time
+# Ron Murawski <ron at horizonchess.com>
+
+# based on: http://docs.python.org/3.3/library/time.html#module-time
+# see: http://nullege.com/codes/search?cq=time
+
+import sys
+from typing import Any, NamedTuple, Tuple, Union
+from types import SimpleNamespace
+
+TimeTuple = Tuple[int, int, int, int, int, int, int, int, int]
+
+# ----- variables and constants -----
+accept2dyear = False
+altzone = 0
+daylight = 0
+timezone = 0
+tzname = ...  # type: Tuple[str, str]
+
+if sys.version_info >= (3, 3) and sys.platform != 'win32':
+    CLOCK_HIGHRES = 0  # Solaris only
+    CLOCK_MONOTONIC = 0  # Unix only
+    CLOCK_MONOTONIC_RAW = 0  # Linux 2.6.28 or later
+    CLOCK_PROCESS_CPUTIME_ID = 0  # Unix only
+    CLOCK_REALTIME = 0  # Unix only
+    CLOCK_THREAD_CPUTIME_ID = 0  # Unix only
+
+
+if sys.version_info >= (3, 3):
+    class struct_time(
+        NamedTuple(
+            '_struct_time',
+            [('tm_year', int), ('tm_mon', int), ('tm_mday', int),
+             ('tm_hour', int), ('tm_min', int), ('tm_sec', int),
+             ('tm_wday', int), ('tm_yday', int), ('tm_isdst', int),
+             ('tm_zone', str), ('tm_gmtoff', int)]
+        )
+    ):
+        def __init__(
+            self,
+            o: Union[
+                Tuple[int, int, int, int, int, int, int, int, int],
+                Tuple[int, int, int, int, int, int, int, int, int, str],
+                Tuple[int, int, int, int, int, int, int, int, int, str, int]
+            ],
+            _arg: Any = ...,
+        ) -> None: ...
+else:
+    class struct_time(
+        NamedTuple(
+            '_struct_time',
+            [('tm_year', int), ('tm_mon', int), ('tm_mday', int),
+             ('tm_hour', int), ('tm_min', int), ('tm_sec', int),
+             ('tm_wday', int), ('tm_yday', int), ('tm_isdst', int)]
+        )
+    ):
+        def __init__(self, o: TimeTuple, _arg: Any = ...) -> None: ...
+
+
+# ----- functions -----
+def asctime(t: Union[TimeTuple, struct_time, None] = ...) -> str: ...  # return current time
+def clock() -> float: ...
+def ctime(secs: Union[float, None] = ...) -> str: ...  # return current time
+def gmtime(secs: Union[float, None] = ...) -> struct_time: ...  # return current time
+def localtime(secs: Union[float, None] = ...) -> struct_time: ...  # return current time
+def mktime(t: Union[TimeTuple, struct_time]) -> float: ...
+def sleep(secs: Union[int, float]) -> None: ...
+def strftime(format: str,
+             t: Union[TimeTuple, struct_time, None] = ...) -> str: ...  # return current time
+def strptime(string: str,
+             format: str = ...) -> struct_time: ...
+def time() -> float: ...
+if sys.platform != 'win32':
+    def tzset() -> None: ...  # Unix only
+
+if sys.version_info >= (3, 3):
+    def get_clock_info(str) -> SimpleNamespace: ...
+    def monotonic() -> float: ...
+    def perf_counter() -> float: ...
+    def process_time() -> float: ...
+    if sys.platform != 'win32':
+        def clock_getres(int) -> float: ...  # Unix only
+        def clock_gettime(int) -> float: ...  # Unix only
+        def clock_settime(int, struct_time) -> float: ...  # Unix only
diff --git a/typeshed/stdlib/3/tkinter/__init__.pyi b/typeshed/stdlib/3/tkinter/__init__.pyi
new file mode 100644
index 0000000..ec61243
--- /dev/null
+++ b/typeshed/stdlib/3/tkinter/__init__.pyi
@@ -0,0 +1,660 @@
+# Stubs for tkinter (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tkinter.constants import *  # noqa: F403
+
+TclError = ...  # type: Any
+wantobjects = ...  # type: Any
+TkVersion = ...  # type: Any
+TclVersion = ...  # type: Any
+READABLE = ...  # type: Any
+WRITABLE = ...  # type: Any
+EXCEPTION = ...  # type: Any
+
+class Event: ...
+
+def NoDefaultRoot(): ...
+
+class Variable:
+    def __init__(self, master=None, value=None, name=None): ...
+    def __del__(self): ...
+    def set(self, value): ...
+    initialize = ...  # type: Any
+    def get(self): ...
+    def trace_variable(self, mode, callback): ...
+    trace = ...  # type: Any
+    def trace_vdelete(self, mode, cbname): ...
+    def trace_vinfo(self): ...
+    def __eq__(self, other): ...
+
+class StringVar(Variable):
+    def __init__(self, master=None, value=None, name=None): ...
+    def get(self): ...
+
+class IntVar(Variable):
+    def __init__(self, master=None, value=None, name=None): ...
+    def get(self): ...
+
+class DoubleVar(Variable):
+    def __init__(self, master=None, value=None, name=None): ...
+    def get(self): ...
+
+class BooleanVar(Variable):
+    def __init__(self, master=None, value=None, name=None): ...
+    def set(self, value): ...
+    initialize = ...  # type: Any
+    def get(self): ...
+
+def mainloop(n=0): ...
+
+getint = ...  # type: Any
+getdouble = ...  # type: Any
+
+def getboolean(s): ...
+
+class Misc:
+    def destroy(self): ...
+    def deletecommand(self, name): ...
+    def tk_strictMotif(self, boolean=None): ...
+    def tk_bisque(self): ...
+    def tk_setPalette(self, *args, **kw): ...
+    def tk_menuBar(self, *args): ...
+    def wait_variable(self, name=''): ...
+    waitvar = ...  # type: Any
+    def wait_window(self, window=None): ...
+    def wait_visibility(self, window=None): ...
+    def setvar(self, name='', value=''): ...
+    def getvar(self, name=''): ...
+    def getint(self, s): ...
+    def getdouble(self, s): ...
+    def getboolean(self, s): ...
+    def focus_set(self): ...
+    focus = ...  # type: Any
+    def focus_force(self): ...
+    def focus_get(self): ...
+    def focus_displayof(self): ...
+    def focus_lastfor(self): ...
+    def tk_focusFollowsMouse(self): ...
+    def tk_focusNext(self): ...
+    def tk_focusPrev(self): ...
+    def after(self, ms, func=None, *args): ...
+    def after_idle(self, func, *args): ...
+    def after_cancel(self, id): ...
+    def bell(self, displayof=0): ...
+    def clipboard_get(self, **kw): ...
+    def clipboard_clear(self, **kw): ...
+    def clipboard_append(self, string, **kw): ...
+    def grab_current(self): ...
+    def grab_release(self): ...
+    def grab_set(self): ...
+    def grab_set_global(self): ...
+    def grab_status(self): ...
+    def option_add(self, pattern, value, priority=None): ...
+    def option_clear(self): ...
+    def option_get(self, name, className): ...
+    def option_readfile(self, fileName, priority=None): ...
+    def selection_clear(self, **kw): ...
+    def selection_get(self, **kw): ...
+    def selection_handle(self, command, **kw): ...
+    def selection_own(self, **kw): ...
+    def selection_own_get(self, **kw): ...
+    def send(self, interp, cmd, *args): ...
+    def lower(self, belowThis=None): ...
+    def tkraise(self, aboveThis=None): ...
+    lift = ...  # type: Any
+    def winfo_atom(self, name, displayof=0): ...
+    def winfo_atomname(self, id, displayof=0): ...
+    def winfo_cells(self): ...
+    def winfo_children(self): ...
+    def winfo_class(self): ...
+    def winfo_colormapfull(self): ...
+    def winfo_containing(self, rootX, rootY, displayof=0): ...
+    def winfo_depth(self): ...
+    def winfo_exists(self): ...
+    def winfo_fpixels(self, number): ...
+    def winfo_geometry(self): ...
+    def winfo_height(self): ...
+    def winfo_id(self): ...
+    def winfo_interps(self, displayof=0): ...
+    def winfo_ismapped(self): ...
+    def winfo_manager(self): ...
+    def winfo_name(self): ...
+    def winfo_parent(self): ...
+    def winfo_pathname(self, id, displayof=0): ...
+    def winfo_pixels(self, number): ...
+    def winfo_pointerx(self): ...
+    def winfo_pointerxy(self): ...
+    def winfo_pointery(self): ...
+    def winfo_reqheight(self): ...
+    def winfo_reqwidth(self): ...
+    def winfo_rgb(self, color): ...
+    def winfo_rootx(self): ...
+    def winfo_rooty(self): ...
+    def winfo_screen(self): ...
+    def winfo_screencells(self): ...
+    def winfo_screendepth(self): ...
+    def winfo_screenheight(self): ...
+    def winfo_screenmmheight(self): ...
+    def winfo_screenmmwidth(self): ...
+    def winfo_screenvisual(self): ...
+    def winfo_screenwidth(self): ...
+    def winfo_server(self): ...
+    def winfo_toplevel(self): ...
+    def winfo_viewable(self): ...
+    def winfo_visual(self): ...
+    def winfo_visualid(self): ...
+    def winfo_visualsavailable(self, includeids=0): ...
+    def winfo_vrootheight(self): ...
+    def winfo_vrootwidth(self): ...
+    def winfo_vrootx(self): ...
+    def winfo_vrooty(self): ...
+    def winfo_width(self): ...
+    def winfo_x(self): ...
+    def winfo_y(self): ...
+    def update(self): ...
+    def update_idletasks(self): ...
+    def bindtags(self, tagList=None): ...
+    def bind(self, sequence=None, func=None, add=None): ...
+    def unbind(self, sequence, funcid=None): ...
+    def bind_all(self, sequence=None, func=None, add=None): ...
+    def unbind_all(self, sequence): ...
+    def bind_class(self, className, sequence=None, func=None, add=None): ...
+    def unbind_class(self, className, sequence): ...
+    def mainloop(self, n=0): ...
+    def quit(self): ...
+    def nametowidget(self, name): ...
+    register = ...  # type: Any
+    def configure(self, cnf=None, **kw): ...
+    config = ...  # type: Any
+    def cget(self, key): ...
+    __getitem__ = ...  # type: Any
+    def __setitem__(self, key, value): ...
+    def keys(self): ...
+    def pack_propagate(self, flag=...): ...
+    propagate = ...  # type: Any
+    def pack_slaves(self): ...
+    slaves = ...  # type: Any
+    def place_slaves(self): ...
+    def grid_anchor(self, anchor=None): ...
+    anchor = ...  # type: Any
+    def grid_bbox(self, column=None, row=None, col2=None, row2=None): ...
+    bbox = ...  # type: Any
+    def grid_columnconfigure(self, index, cnf=..., **kw): ...
+    columnconfigure = ...  # type: Any
+    def grid_location(self, x, y): ...
+    def grid_propagate(self, flag=...): ...
+    def grid_rowconfigure(self, index, cnf=..., **kw): ...
+    rowconfigure = ...  # type: Any
+    def grid_size(self): ...
+    size = ...  # type: Any
+    def grid_slaves(self, row=None, column=None): ...
+    def event_add(self, virtual, *sequences): ...
+    def event_delete(self, virtual, *sequences): ...
+    def event_generate(self, sequence, **kw): ...
+    def event_info(self, virtual=None): ...
+    def image_names(self): ...
+    def image_types(self): ...
+
+class CallWrapper:
+    func = ...  # type: Any
+    subst = ...  # type: Any
+    widget = ...  # type: Any
+    def __init__(self, func, subst, widget): ...
+    def __call__(self, *args): ...
+
+class XView:
+    def xview(self, *args): ...
+    def xview_moveto(self, fraction): ...
+    def xview_scroll(self, number, what): ...
+
+class YView:
+    def yview(self, *args): ...
+    def yview_moveto(self, fraction): ...
+    def yview_scroll(self, number, what): ...
+
+class Wm:
+    def wm_aspect(self, minNumer=None, minDenom=None, maxNumer=None, maxDenom=None): ...
+    aspect = ...  # type: Any
+    def wm_attributes(self, *args): ...
+    attributes = ...  # type: Any
+    def wm_client(self, name=None): ...
+    client = ...  # type: Any
+    def wm_colormapwindows(self, *wlist): ...
+    colormapwindows = ...  # type: Any
+    def wm_command(self, value=None): ...
+    command = ...  # type: Any
+    def wm_deiconify(self): ...
+    deiconify = ...  # type: Any
+    def wm_focusmodel(self, model=None): ...
+    focusmodel = ...  # type: Any
+    def wm_forget(self, window): ...
+    forget = ...  # type: Any
+    def wm_frame(self): ...
+    frame = ...  # type: Any
+    def wm_geometry(self, newGeometry=None): ...
+    geometry = ...  # type: Any
+    def wm_grid(self, baseWidth=None, baseHeight=None, widthInc=None, heightInc=None): ...
+    grid = ...  # type: Any
+    def wm_group(self, pathName=None): ...
+    group = ...  # type: Any
+    def wm_iconbitmap(self, bitmap=None, default=None): ...
+    iconbitmap = ...  # type: Any
+    def wm_iconify(self): ...
+    iconify = ...  # type: Any
+    def wm_iconmask(self, bitmap=None): ...
+    iconmask = ...  # type: Any
+    def wm_iconname(self, newName=None): ...
+    iconname = ...  # type: Any
+    def wm_iconphoto(self, default=False, *args): ...
+    iconphoto = ...  # type: Any
+    def wm_iconposition(self, x=None, y=None): ...
+    iconposition = ...  # type: Any
+    def wm_iconwindow(self, pathName=None): ...
+    iconwindow = ...  # type: Any
+    def wm_manage(self, widget): ...
+    manage = ...  # type: Any
+    def wm_maxsize(self, width=None, height=None): ...
+    maxsize = ...  # type: Any
+    def wm_minsize(self, width=None, height=None): ...
+    minsize = ...  # type: Any
+    def wm_overrideredirect(self, boolean=None): ...
+    overrideredirect = ...  # type: Any
+    def wm_positionfrom(self, who=None): ...
+    positionfrom = ...  # type: Any
+    def wm_protocol(self, name=None, func=None): ...
+    protocol = ...  # type: Any
+    def wm_resizable(self, width=None, height=None): ...
+    resizable = ...  # type: Any
+    def wm_sizefrom(self, who=None): ...
+    sizefrom = ...  # type: Any
+    def wm_state(self, newstate=None): ...
+    state = ...  # type: Any
+    def wm_title(self, string=None): ...
+    title = ...  # type: Any
+    def wm_transient(self, master=None): ...
+    transient = ...  # type: Any
+    def wm_withdraw(self): ...
+    withdraw = ...  # type: Any
+
+class Tk(Misc, Wm):
+    master = ...  # type: Any
+    children = ...  # type: Any
+    tk = ...  # type: Any
+    def __init__(self, screenName=None, baseName=None, className='', useTk=1, sync=0, use=None): ...
+    def loadtk(self): ...
+    def destroy(self): ...
+    def readprofile(self, baseName, className): ...
+    def report_callback_exception(self, exc, val, tb): ...
+    def __getattr__(self, attr): ...
+
+def Tcl(screenName=None, baseName=None, className='', useTk=0): ...
+
+class Pack:
+    def pack_configure(self, cnf=..., **kw): ...
+    pack = ...  # type: Any
+    def pack_forget(self): ...
+    forget = ...  # type: Any
+    def pack_info(self): ...
+    info = ...  # type: Any
+    propagate = ...  # type: Any
+    slaves = ...  # type: Any
+
+class Place:
+    def place_configure(self, cnf=..., **kw): ...
+    place = ...  # type: Any
+    def place_forget(self): ...
+    forget = ...  # type: Any
+    def place_info(self): ...
+    info = ...  # type: Any
+    slaves = ...  # type: Any
+
+class Grid:
+    def grid_configure(self, cnf=..., **kw): ...
+    grid = ...  # type: Any
+    bbox = ...  # type: Any
+    columnconfigure = ...  # type: Any
+    def grid_forget(self): ...
+    forget = ...  # type: Any
+    def grid_remove(self): ...
+    def grid_info(self): ...
+    info = ...  # type: Any
+    location = ...  # type: Any
+    propagate = ...  # type: Any
+    rowconfigure = ...  # type: Any
+    size = ...  # type: Any
+    slaves = ...  # type: Any
+
+class BaseWidget(Misc):
+    widgetName = ...  # type: Any
+    def __init__(self, master, widgetName, cnf=..., kw=..., extra=...): ...
+    def destroy(self): ...
+
+class Widget(BaseWidget, Pack, Place, Grid): ...
+
+class Toplevel(BaseWidget, Wm):
+    def __init__(self, master=None, cnf=..., **kw): ...
+
+class Button(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def flash(self): ...
+    def invoke(self): ...
+
+class Canvas(Widget, XView, YView):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def addtag(self, *args): ...
+    def addtag_above(self, newtag, tagOrId): ...
+    def addtag_all(self, newtag): ...
+    def addtag_below(self, newtag, tagOrId): ...
+    def addtag_closest(self, newtag, x, y, halo=None, start=None): ...
+    def addtag_enclosed(self, newtag, x1, y1, x2, y2): ...
+    def addtag_overlapping(self, newtag, x1, y1, x2, y2): ...
+    def addtag_withtag(self, newtag, tagOrId): ...
+    def bbox(self, *args): ...
+    def tag_unbind(self, tagOrId, sequence, funcid=None): ...
+    def tag_bind(self, tagOrId, sequence=None, func=None, add=None): ...
+    def canvasx(self, screenx, gridspacing=None): ...
+    def canvasy(self, screeny, gridspacing=None): ...
+    def coords(self, *args): ...
+    def create_arc(self, *args, **kw): ...
+    def create_bitmap(self, *args, **kw): ...
+    def create_image(self, *args, **kw): ...
+    def create_line(self, *args, **kw): ...
+    def create_oval(self, *args, **kw): ...
+    def create_polygon(self, *args, **kw): ...
+    def create_rectangle(self, *args, **kw): ...
+    def create_text(self, *args, **kw): ...
+    def create_window(self, *args, **kw): ...
+    def dchars(self, *args): ...
+    def delete(self, *args): ...
+    def dtag(self, *args): ...
+    def find(self, *args): ...
+    def find_above(self, tagOrId): ...
+    def find_all(self): ...
+    def find_below(self, tagOrId): ...
+    def find_closest(self, x, y, halo=None, start=None): ...
+    def find_enclosed(self, x1, y1, x2, y2): ...
+    def find_overlapping(self, x1, y1, x2, y2): ...
+    def find_withtag(self, tagOrId): ...
+    def focus(self, *args): ...
+    def gettags(self, *args): ...
+    def icursor(self, *args): ...
+    def index(self, *args): ...
+    def insert(self, *args): ...
+    def itemcget(self, tagOrId, option): ...
+    def itemconfigure(self, tagOrId, cnf=None, **kw): ...
+    itemconfig = ...  # type: Any
+    def tag_lower(self, *args): ...
+    lower = ...  # type: Any
+    def move(self, *args): ...
+    def postscript(self, cnf=..., **kw): ...
+    def tag_raise(self, *args): ...
+    lift = ...  # type: Any
+    def scale(self, *args): ...
+    def scan_mark(self, x, y): ...
+    def scan_dragto(self, x, y, gain=10): ...
+    def select_adjust(self, tagOrId, index): ...
+    def select_clear(self): ...
+    def select_from(self, tagOrId, index): ...
+    def select_item(self): ...
+    def select_to(self, tagOrId, index): ...
+    def type(self, tagOrId): ...
+
+class Checkbutton(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def deselect(self): ...
+    def flash(self): ...
+    def invoke(self): ...
+    def select(self): ...
+    def toggle(self): ...
+
+class Entry(Widget, XView):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def delete(self, first, last=None): ...
+    def get(self): ...
+    def icursor(self, index): ...
+    def index(self, index): ...
+    def insert(self, index, string): ...
+    def scan_mark(self, x): ...
+    def scan_dragto(self, x): ...
+    def selection_adjust(self, index): ...
+    select_adjust = ...  # type: Any
+    def selection_clear(self): ...
+    select_clear = ...  # type: Any
+    def selection_from(self, index): ...
+    select_from = ...  # type: Any
+    def selection_present(self): ...
+    select_present = ...  # type: Any
+    def selection_range(self, start, end): ...
+    select_range = ...  # type: Any
+    def selection_to(self, index): ...
+    select_to = ...  # type: Any
+
+class Frame(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+
+class Label(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+
+class Listbox(Widget, XView, YView):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def activate(self, index): ...
+    def bbox(self, index): ...
+    def curselection(self): ...
+    def delete(self, first, last=None): ...
+    def get(self, first, last=None): ...
+    def index(self, index): ...
+    def insert(self, index, *elements): ...
+    def nearest(self, y): ...
+    def scan_mark(self, x, y): ...
+    def scan_dragto(self, x, y): ...
+    def see(self, index): ...
+    def selection_anchor(self, index): ...
+    select_anchor = ...  # type: Any
+    def selection_clear(self, first, last=None): ...
+    select_clear = ...  # type: Any
+    def selection_includes(self, index): ...
+    select_includes = ...  # type: Any
+    def selection_set(self, first, last=None): ...
+    select_set = ...  # type: Any
+    def size(self): ...
+    def itemcget(self, index, option): ...
+    def itemconfigure(self, index, cnf=None, **kw): ...
+    itemconfig = ...  # type: Any
+
+class Menu(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def tk_popup(self, x, y, entry=''): ...
+    def tk_bindForTraversal(self): ...
+    def activate(self, index): ...
+    def add(self, itemType, cnf=..., **kw): ...
+    def add_cascade(self, cnf=..., **kw): ...
+    def add_checkbutton(self, cnf=..., **kw): ...
+    def add_command(self, cnf=..., **kw): ...
+    def add_radiobutton(self, cnf=..., **kw): ...
+    def add_separator(self, cnf=..., **kw): ...
+    def insert(self, index, itemType, cnf=..., **kw): ...
+    def insert_cascade(self, index, cnf=..., **kw): ...
+    def insert_checkbutton(self, index, cnf=..., **kw): ...
+    def insert_command(self, index, cnf=..., **kw): ...
+    def insert_radiobutton(self, index, cnf=..., **kw): ...
+    def insert_separator(self, index, cnf=..., **kw): ...
+    def delete(self, index1, index2=None): ...
+    def entrycget(self, index, option): ...
+    def entryconfigure(self, index, cnf=None, **kw): ...
+    entryconfig = ...  # type: Any
+    def index(self, index): ...
+    def invoke(self, index): ...
+    def post(self, x, y): ...
+    def type(self, index): ...
+    def unpost(self): ...
+    def xposition(self, index): ...
+    def yposition(self, index): ...
+
+class Menubutton(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+
+class Message(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+
+class Radiobutton(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def deselect(self): ...
+    def flash(self): ...
+    def invoke(self): ...
+    def select(self): ...
+
+class Scale(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def get(self): ...
+    def set(self, value): ...
+    def coords(self, value=None): ...
+    def identify(self, x, y): ...
+
+class Scrollbar(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def activate(self, index=None): ...
+    def delta(self, deltax, deltay): ...
+    def fraction(self, x, y): ...
+    def identify(self, x, y): ...
+    def get(self): ...
+    def set(self, first, last): ...
+
+class Text(Widget, XView, YView):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def bbox(self, index): ...
+    def compare(self, index1, op, index2): ...
+    def count(self, index1, index2, *args): ...
+    def debug(self, boolean=None): ...
+    def delete(self, index1, index2=None): ...
+    def dlineinfo(self, index): ...
+    def dump(self, index1, index2=None, command=None, **kw): ...
+    def edit(self, *args): ...
+    def edit_modified(self, arg=None): ...
+    def edit_redo(self): ...
+    def edit_reset(self): ...
+    def edit_separator(self): ...
+    def edit_undo(self): ...
+    def get(self, index1, index2=None): ...
+    def image_cget(self, index, option): ...
+    def image_configure(self, index, cnf=None, **kw): ...
+    def image_create(self, index, cnf=..., **kw): ...
+    def image_names(self): ...
+    def index(self, index): ...
+    def insert(self, index, chars, *args): ...
+    def mark_gravity(self, markName, direction=None): ...
+    def mark_names(self): ...
+    def mark_set(self, markName, index): ...
+    def mark_unset(self, *markNames): ...
+    def mark_next(self, index): ...
+    def mark_previous(self, index): ...
+    def peer_create(self, newPathName, cnf=..., **kw): ...
+    def peer_names(self): ...
+    def replace(self, index1, index2, chars, *args): ...
+    def scan_mark(self, x, y): ...
+    def scan_dragto(self, x, y): ...
+    def search(self, pattern, index, stopindex=None, forwards=None, backwards=None, exact=None, regexp=None, nocase=None, count=None, elide=None): ...
+    def see(self, index): ...
+    def tag_add(self, tagName, index1, *args): ...
+    def tag_unbind(self, tagName, sequence, funcid=None): ...
+    def tag_bind(self, tagName, sequence, func, add=None): ...
+    def tag_cget(self, tagName, option): ...
+    def tag_configure(self, tagName, cnf=None, **kw): ...
+    tag_config = ...  # type: Any
+    def tag_delete(self, *tagNames): ...
+    def tag_lower(self, tagName, belowThis=None): ...
+    def tag_names(self, index=None): ...
+    def tag_nextrange(self, tagName, index1, index2=None): ...
+    def tag_prevrange(self, tagName, index1, index2=None): ...
+    def tag_raise(self, tagName, aboveThis=None): ...
+    def tag_ranges(self, tagName): ...
+    def tag_remove(self, tagName, index1, index2=None): ...
+    def window_cget(self, index, option): ...
+    def window_configure(self, index, cnf=None, **kw): ...
+    window_config = ...  # type: Any
+    def window_create(self, index, cnf=..., **kw): ...
+    def window_names(self): ...
+    def yview_pickplace(self, *what): ...
+
+class _setit:
+    def __init__(self, var, value, callback=None): ...
+    def __call__(self, *args): ...
+
+class OptionMenu(Menubutton):
+    widgetName = ...  # type: Any
+    menuname = ...  # type: Any
+    def __init__(self, master, variable, value, *values, **kwargs): ...
+    def __getitem__(self, name): ...
+    def destroy(self): ...
+
+class Image:
+    name = ...  # type: Any
+    tk = ...  # type: Any
+    def __init__(self, imgtype, name=None, cnf=..., master=None, **kw): ...
+    def __del__(self): ...
+    def __setitem__(self, key, value): ...
+    def __getitem__(self, key): ...
+    def configure(self, **kw): ...
+    config = ...  # type: Any
+    def height(self): ...
+    def type(self): ...
+    def width(self): ...
+
+class PhotoImage(Image):
+    def __init__(self, name=None, cnf=..., master=None, **kw): ...
+    def blank(self): ...
+    def cget(self, option): ...
+    def __getitem__(self, key): ...
+    def copy(self): ...
+    def zoom(self, x, y=''): ...
+    def subsample(self, x, y=''): ...
+    def get(self, x, y): ...
+    def put(self, data, to=None): ...
+    def write(self, filename, format=None, from_coords=None): ...
+
+class BitmapImage(Image):
+    def __init__(self, name=None, cnf=..., master=None, **kw): ...
+
+def image_names(): ...
+def image_types(): ...
+
+class Spinbox(Widget, XView):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def bbox(self, index): ...
+    def delete(self, first, last=None): ...
+    def get(self): ...
+    def icursor(self, index): ...
+    def identify(self, x, y): ...
+    def index(self, index): ...
+    def insert(self, index, s): ...
+    def invoke(self, element): ...
+    def scan(self, *args): ...
+    def scan_mark(self, x): ...
+    def scan_dragto(self, x): ...
+    def selection(self, *args): ...
+    def selection_adjust(self, index): ...
+    def selection_clear(self): ...
+    def selection_element(self, element=None): ...
+
+class LabelFrame(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+
+class PanedWindow(Widget):
+    def __init__(self, master=None, cnf=..., **kw): ...
+    def add(self, child, **kw): ...
+    def remove(self, child): ...
+    forget = ...  # type: Any
+    def identify(self, x, y): ...
+    def proxy(self, *args): ...
+    def proxy_coord(self): ...
+    def proxy_forget(self): ...
+    def proxy_place(self, x, y): ...
+    def sash(self, *args): ...
+    def sash_coord(self, index): ...
+    def sash_mark(self, index): ...
+    def sash_place(self, index, x, y): ...
+    def panecget(self, child, option): ...
+    def paneconfigure(self, tagOrId, cnf=None, **kw): ...
+    paneconfig = ...  # type: Any
+    def panes(self): ...
diff --git a/typeshed/stdlib/3/tkinter/constants.pyi b/typeshed/stdlib/3/tkinter/constants.pyi
new file mode 100644
index 0000000..77645ef
--- /dev/null
+++ b/typeshed/stdlib/3/tkinter/constants.pyi
@@ -0,0 +1,83 @@
+# Stubs for tkinter.constants (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+NO = ...  # type: Any
+YES = ...  # type: Any
+TRUE = ...  # type: Any
+FALSE = ...  # type: Any
+ON = ...  # type: Any
+OFF = ...  # type: Any
+N = ...  # type: Any
+S = ...  # type: Any
+W = ...  # type: Any
+E = ...  # type: Any
+NW = ...  # type: Any
+SW = ...  # type: Any
+NE = ...  # type: Any
+SE = ...  # type: Any
+NS = ...  # type: Any
+EW = ...  # type: Any
+NSEW = ...  # type: Any
+CENTER = ...  # type: Any
+NONE = ...  # type: Any
+X = ...  # type: Any
+Y = ...  # type: Any
+BOTH = ...  # type: Any
+LEFT = ...  # type: Any
+TOP = ...  # type: Any
+RIGHT = ...  # type: Any
+BOTTOM = ...  # type: Any
+RAISED = ...  # type: Any
+SUNKEN = ...  # type: Any
+FLAT = ...  # type: Any
+RIDGE = ...  # type: Any
+GROOVE = ...  # type: Any
+SOLID = ...  # type: Any
+HORIZONTAL = ...  # type: Any
+VERTICAL = ...  # type: Any
+NUMERIC = ...  # type: Any
+CHAR = ...  # type: Any
+WORD = ...  # type: Any
+BASELINE = ...  # type: Any
+INSIDE = ...  # type: Any
+OUTSIDE = ...  # type: Any
+SEL = ...  # type: Any
+SEL_FIRST = ...  # type: Any
+SEL_LAST = ...  # type: Any
+END = ...  # type: Any
+INSERT = ...  # type: Any
+CURRENT = ...  # type: Any
+ANCHOR = ...  # type: Any
+ALL = ...  # type: Any
+NORMAL = ...  # type: Any
+DISABLED = ...  # type: Any
+ACTIVE = ...  # type: Any
+HIDDEN = ...  # type: Any
+CASCADE = ...  # type: Any
+CHECKBUTTON = ...  # type: Any
+COMMAND = ...  # type: Any
+RADIOBUTTON = ...  # type: Any
+SEPARATOR = ...  # type: Any
+SINGLE = ...  # type: Any
+BROWSE = ...  # type: Any
+MULTIPLE = ...  # type: Any
+EXTENDED = ...  # type: Any
+DOTBOX = ...  # type: Any
+UNDERLINE = ...  # type: Any
+PIESLICE = ...  # type: Any
+CHORD = ...  # type: Any
+ARC = ...  # type: Any
+FIRST = ...  # type: Any
+LAST = ...  # type: Any
+BUTT = ...  # type: Any
+PROJECTING = ...  # type: Any
+ROUND = ...  # type: Any
+BEVEL = ...  # type: Any
+MITER = ...  # type: Any
+MOVETO = ...  # type: Any
+SCROLL = ...  # type: Any
+UNITS = ...  # type: Any
+PAGES = ...  # type: Any
diff --git a/typeshed/stdlib/3/tkinter/ttk.pyi b/typeshed/stdlib/3/tkinter/ttk.pyi
new file mode 100644
index 0000000..099f308
--- /dev/null
+++ b/typeshed/stdlib/3/tkinter/ttk.pyi
@@ -0,0 +1,158 @@
+# Stubs for tkinter.ttk (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import tkinter
+
+def tclobjs_to_py(adict): ...
+def setup_master(master=None): ...
+
+class Style:
+    master = ...  # type: Any
+    tk = ...  # type: Any
+    def __init__(self, master=None): ...
+    def configure(self, style, query_opt=None, **kw): ...
+    def map(self, style, query_opt=None, **kw): ...
+    def lookup(self, style, option, state=None, default=None): ...
+    def layout(self, style, layoutspec=None): ...
+    def element_create(self, elementname, etype, *args, **kw): ...
+    def element_names(self): ...
+    def element_options(self, elementname): ...
+    def theme_create(self, themename, parent=None, settings=None): ...
+    def theme_settings(self, themename, settings): ...
+    def theme_names(self): ...
+    def theme_use(self, themename=None): ...
+
+class Widget(tkinter.Widget):
+    def __init__(self, master, widgetname, kw=None): ...
+    def identify(self, x, y): ...
+    def instate(self, statespec, callback=None, *args, **kw): ...
+    def state(self, statespec=None): ...
+
+class Button(Widget):
+    def __init__(self, master=None, **kw): ...
+    def invoke(self): ...
+
+class Checkbutton(Widget):
+    def __init__(self, master=None, **kw): ...
+    def invoke(self): ...
+
+class Entry(Widget, tkinter.Entry):
+    def __init__(self, master=None, widget=None, **kw): ...
+    def bbox(self, index): ...
+    def identify(self, x, y): ...
+    def validate(self): ...
+
+class Combobox(Entry):
+    def __init__(self, master=None, **kw): ...
+    def current(self, newindex=None): ...
+    def set(self, value): ...
+
+class Frame(Widget):
+    def __init__(self, master=None, **kw): ...
+
+class Label(Widget):
+    def __init__(self, master=None, **kw): ...
+
+class Labelframe(Widget):
+    def __init__(self, master=None, **kw): ...
+
+LabelFrame = ...  # type: Any
+
+class Menubutton(Widget):
+    def __init__(self, master=None, **kw): ...
+
+class Notebook(Widget):
+    def __init__(self, master=None, **kw): ...
+    def add(self, child, **kw): ...
+    def forget(self, tab_id): ...
+    def hide(self, tab_id): ...
+    def identify(self, x, y): ...
+    def index(self, tab_id): ...
+    def insert(self, pos, child, **kw): ...
+    def select(self, tab_id=None): ...
+    def tab(self, tab_id, option=None, **kw): ...
+    def tabs(self): ...
+    def enable_traversal(self): ...
+
+class Panedwindow(Widget, tkinter.PanedWindow):
+    def __init__(self, master=None, **kw): ...
+    forget = ...  # type: Any
+    def insert(self, pos, child, **kw): ...
+    def pane(self, pane, option=None, **kw): ...
+    def sashpos(self, index, newpos=None): ...
+
+PanedWindow = ...  # type: Any
+
+class Progressbar(Widget):
+    def __init__(self, master=None, **kw): ...
+    def start(self, interval=None): ...
+    def step(self, amount=None): ...
+    def stop(self): ...
+
+class Radiobutton(Widget):
+    def __init__(self, master=None, **kw): ...
+    def invoke(self): ...
+
+class Scale(Widget, tkinter.Scale):
+    def __init__(self, master=None, **kw): ...
+    def configure(self, cnf=None, **kw): ...
+    def get(self, x=None, y=None): ...
+
+class Scrollbar(Widget, tkinter.Scrollbar):
+    def __init__(self, master=None, **kw): ...
+
+class Separator(Widget):
+    def __init__(self, master=None, **kw): ...
+
+class Sizegrip(Widget):
+    def __init__(self, master=None, **kw): ...
+
+class Treeview(Widget, tkinter.XView, tkinter.YView):
+    def __init__(self, master=None, **kw): ...
+    def bbox(self, item, column=None): ...
+    def get_children(self, item=None): ...
+    def set_children(self, item, *newchildren): ...
+    def column(self, column, option=None, **kw): ...
+    def delete(self, *items): ...
+    def detach(self, *items): ...
+    def exists(self, item): ...
+    def focus(self, item=None): ...
+    def heading(self, column, option=None, **kw): ...
+    def identify(self, component, x, y): ...
+    def identify_row(self, y): ...
+    def identify_column(self, x): ...
+    def identify_region(self, x, y): ...
+    def identify_element(self, x, y): ...
+    def index(self, item): ...
+    def insert(self, parent, index, iid=None, **kw): ...
+    def item(self, item, option=None, **kw): ...
+    def move(self, item, parent, index): ...
+    reattach = ...  # type: Any
+    def next(self, item): ...
+    def parent(self, item): ...
+    def prev(self, item): ...
+    def see(self, item): ...
+    def selection(self, selop=None, items=None): ...
+    def selection_set(self, items): ...
+    def selection_add(self, items): ...
+    def selection_remove(self, items): ...
+    def selection_toggle(self, items): ...
+    def set(self, item, column=None, value=None): ...
+    def tag_bind(self, tagname, sequence=None, callback=None): ...
+    def tag_configure(self, tagname, option=None, **kw): ...
+    def tag_has(self, tagname, item=None): ...
+
+class LabeledScale(Frame):
+    label = ...  # type: Any
+    scale = ...  # type: Any
+    def __init__(self, master=None, variable=None, from_=0, to=10, **kw): ...
+    def destroy(self): ...
+    value = ...  # type: Any
+
+class OptionMenu(Menubutton):
+    def __init__(self, master, variable, default=None, *values, **kwargs): ...
+    def __getitem__(self, item): ...
+    def set_menu(self, default=None, *values): ...
+    def destroy(self): ...
diff --git a/typeshed/stdlib/3/token.pyi b/typeshed/stdlib/3/token.pyi
new file mode 100644
index 0000000..24e6ea3
--- /dev/null
+++ b/typeshed/stdlib/3/token.pyi
@@ -0,0 +1,63 @@
+from typing import Dict
+
+ENDMARKER = 0
+NAME = 0
+NUMBER = 0
+STRING = 0
+NEWLINE = 0
+INDENT = 0
+DEDENT = 0
+LPAR = 0
+RPAR = 0
+LSQB = 0
+RSQB = 0
+COLON = 0
+COMMA = 0
+SEMI = 0
+PLUS = 0
+MINUS = 0
+STAR = 0
+SLASH = 0
+VBAR = 0
+AMPER = 0
+LESS = 0
+GREATER = 0
+EQUAL = 0
+DOT = 0
+PERCENT = 0
+LBRACE = 0
+RBRACE = 0
+EQEQUAL = 0
+NOTEQUAL = 0
+LESSEQUAL = 0
+GREATEREQUAL = 0
+TILDE = 0
+CIRCUMFLEX = 0
+LEFTSHIFT = 0
+RIGHTSHIFT = 0
+DOUBLESTAR = 0
+PLUSEQUAL = 0
+MINEQUAL = 0
+STAREQUAL = 0
+SLASHEQUAL = 0
+PERCENTEQUAL = 0
+AMPEREQUAL = 0
+VBAREQUAL = 0
+CIRCUMFLEXEQUAL = 0
+LEFTSHIFTEQUAL = 0
+RIGHTSHIFTEQUAL = 0
+DOUBLESTAREQUAL = 0
+DOUBLESLASH = 0
+DOUBLESLASHEQUAL = 0
+AT = 0
+RARROW = 0
+ELLIPSIS = 0
+OP = 0
+ERRORTOKEN = 0
+N_TOKENS = 0
+NT_OFFSET = 0
+tok_name = ...  # type: Dict[int, str]
+
+def ISTERMINAL(x: int) -> bool: pass
+def ISNONTERMINAL(x: int) -> bool: pass
+def ISEOF(x: int) -> bool: pass
diff --git a/typeshed/stdlib/3/tokenize.pyi b/typeshed/stdlib/3/tokenize.pyi
new file mode 100644
index 0000000..9849f68
--- /dev/null
+++ b/typeshed/stdlib/3/tokenize.pyi
@@ -0,0 +1,99 @@
+# Stubs for tokenize (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, TextIO
+from builtins import open as _builtin_open
+from token import *  # noqa: F403
+
+COMMENT = ...  # type: Any
+NL = ...  # type: Any
+ENCODING = ...  # type: Any
+
+class TokenInfo:
+    @property
+    def exact_type(self): ...
+
+class TokenError(Exception): ...
+class StopTokenizing(Exception): ...
+
+class Untokenizer:
+    tokens = ...  # type: Any
+    prev_row = ...  # type: Any
+    prev_col = ...  # type: Any
+    encoding = ...  # type: Any
+    def __init__(self): ...
+    def add_whitespace(self, start): ...
+    def untokenize(self, iterable): ...
+    def compat(self, token, iterable): ...
+
+def untokenize(iterable): ...
+def detect_encoding(readline): ...
+def tokenize(readline): ...
+
+def open(filename: Union[str, bytes, int]) -> TextIO: ...
+
+# Names in __all__ with no definition:
+#   AMPER
+#   AMPEREQUAL
+#   ASYNC
+#   AT
+#   ATEQUAL
+#   AWAIT
+#   CIRCUMFLEX
+#   CIRCUMFLEXEQUAL
+#   COLON
+#   COMMA
+#   DEDENT
+#   DOT
+#   DOUBLESLASH
+#   DOUBLESLASHEQUAL
+#   DOUBLESTAR
+#   DOUBLESTAREQUAL
+#   ELLIPSIS
+#   ENDMARKER
+#   EQEQUAL
+#   EQUAL
+#   ERRORTOKEN
+#   GREATER
+#   GREATEREQUAL
+#   INDENT
+#   ISEOF
+#   ISNONTERMINAL
+#   ISTERMINAL
+#   LBRACE
+#   LEFTSHIFT
+#   LEFTSHIFTEQUAL
+#   LESS
+#   LESSEQUAL
+#   LPAR
+#   LSQB
+#   MINEQUAL
+#   MINUS
+#   NAME
+#   NEWLINE
+#   NOTEQUAL
+#   NT_OFFSET
+#   NUMBER
+#   N_TOKENS
+#   OP
+#   PERCENT
+#   PERCENTEQUAL
+#   PLUS
+#   PLUSEQUAL
+#   RARROW
+#   RBRACE
+#   RIGHTSHIFT
+#   RIGHTSHIFTEQUAL
+#   RPAR
+#   RSQB
+#   SEMI
+#   SLASH
+#   SLASHEQUAL
+#   STAR
+#   STAREQUAL
+#   STRING
+#   TILDE
+#   VBAR
+#   VBAREQUAL
+#   tok_name
diff --git a/typeshed/stdlib/3/types.pyi b/typeshed/stdlib/3/types.pyi
new file mode 100644
index 0000000..17e3347
--- /dev/null
+++ b/typeshed/stdlib/3/types.pyi
@@ -0,0 +1,151 @@
+# Stubs for types
+# Note, all classes "defined" here require special handling.
+
+# TODO parts of this should be conditional on version
+
+import sys
+from typing import (
+    Any, Callable, Dict, Generic, Iterator, Mapping, Optional, Tuple, TypeVar,
+    Union, overload
+)
+
+# ModuleType is exported from this module, but for circular import
+# reasons exists in its own stub file (with ModuleSpec and Loader).
+from _importlib_modulespec import ModuleType as ModuleType  # Exported
+
+_T = TypeVar('_T')
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+class _Cell:
+    cell_contents = ...  # type: Any
+
+class FunctionType:
+    __closure__ = ...  # type: Optional[Tuple[_Cell, ...]]
+    __code__ = ...  # type: CodeType
+    __defaults__ = ...  # type: Optional[Tuple[Any, ...]]
+    __dict__ = ...  # type: Dict[str, Any]
+    __globals__ = ...  # type: Dict[str, Any]
+    __name__ = ...  # type: str
+    def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+    def __get__(self, obj: Optional[object], type: Optional[type]) -> 'MethodType': ...
+LambdaType = FunctionType
+
+class CodeType:
+    """Create a code object.  Not for the faint of heart."""
+    co_argcount = ...  # type: int
+    co_kwonlyargcount = ...  # type: int
+    co_nlocals = ...  # type: int
+    co_stacksize = ...  # type: int
+    co_flags = ...  # type: int
+    co_code = ...  # type: bytes
+    co_consts = ...  # type: Tuple[Any, ...]
+    co_names = ...  # type: Tuple[str, ...]
+    co_varnames = ...  # type: Tuple[str, ...]
+    co_filename = ...  # type: Optional[str]
+    co_name = ...  # type: str
+    co_firstlineno = ...  # type: int
+    co_lnotab = ...  # type: bytes
+    co_freevars = ...  # type: Tuple[str, ...]
+    co_cellvars = ...  # type: Tuple[str, ...]
+    def __init__(
+        self,
+        argcount: int,
+        kwonlyargcount: int,
+        nlocals: int,
+        stacksize: int,
+        flags: int,
+        codestring: bytes,
+        constants: Tuple[Any, ...],
+        names: Tuple[str, ...],
+        varnames: Tuple[str, ...],
+        filename: str,
+        name: str,
+        firstlineno: int,
+        lnotab: bytes,
+        freevars: Tuple[str, ...] = ...,
+        cellvars: Tuple[str, ...] = ...,
+    ) -> None: ...
+
+class MappingProxyType(Mapping[_KT, _VT], Generic[_KT, _VT]):
+    def __init__(self, mapping: Mapping[_KT, _VT]) -> None: ...
+    def __getitem__(self, k: _KT) -> _VT: ...
+    def __iter__(self) -> Iterator[_KT]: ...
+    def __len__(self) -> int: ...
+
+# TODO: use __getattr__ and __setattr__ instead of inheriting from Any, pending mypy#521.
+class SimpleNamespace(Any): ...  # type: ignore
+
+class GeneratorType:
+    gi_code = ...  # type: CodeType
+    gi_frame = ...  # type: FrameType
+    gi_running = ...  # type: bool
+    gi_yieldfrom = ...  # type: Optional[GeneratorType]
+    def __iter__(self) -> 'GeneratorType': ...
+    def __next__(self) -> Any: ...
+    def close(self) -> None: ...
+    def send(self, arg: Any) -> Any: ...
+    @overload
+    def throw(self, val: BaseException) -> Any: ...
+    @overload
+    def throw(self, typ: type, val: BaseException = ..., tb: 'TracebackType' = ...) -> Any: ...
+
+class CoroutineType:
+    cr_await = ...  # type: Optional[Any]
+    cr_code = ...  # type: CodeType
+    cr_frame = ...  # type: FrameType
+    cr_running = ...  # type: bool
+    def close(self) -> None: ...
+    def send(self, arg: Any) -> Any: ...
+    @overload
+    def throw(self, val: BaseException) -> Any: ...
+    @overload
+    def throw(self, typ: type, val: BaseException = ..., tb: 'TracebackType' = ...) -> Any: ...
+
+class MethodType:
+    __func__ = ...  # type: FunctionType
+    __self__ = ...  # type: object
+    def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+class BuiltinFunctionType:
+    __self__ = ...  # type: Union[object, ModuleType]
+    def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+BuiltinMethodType = BuiltinFunctionType
+
+class TracebackType:
+    tb_frame = ...  # type: FrameType
+    tb_lasti = ...  # type: int
+    tb_lineno = ...  # type: int
+    tb_next = ...  # type: TracebackType
+
+class FrameType:
+    f_back = ...  # type: FrameType
+    f_builtins = ...  # type: Dict[str, Any]
+    f_code = ...  # type: CodeType
+    f_globals = ...  # type: Dict[str, Any]
+    f_lasti = ...  # type: int
+    f_lineno = ...  # type: int
+    f_locals = ...  # type: Dict[str, Any]
+    f_trace = ...  # type: Callable[[], None]
+
+    def clear(self) -> None: pass
+
+class GetSetDescriptorType:
+    __name__ = ...  # type: str
+    __objclass__ = ...  # type: type
+    def __get__(self, obj: Any, type: type = ...) -> Any: ...
+    def __set__(self, obj: Any) -> None: ...
+    def __delete__(self, obj: Any) -> None: ...
+class MemberDescriptorType:
+    __name__ = ...  # type: str
+    __objclass__ = ...  # type: type
+    def __get__(self, obj: Any, type: type = ...) -> Any: ...
+    def __set__(self, obj: Any) -> None: ...
+    def __delete__(self, obj: Any) -> None: ...
+
+def new_class(name: str, bases: Tuple[type, ...] = ..., kwds: Dict[str, Any] = ..., exec_body: Callable[[Dict[str, Any]], None] = ...) -> type: ...
+def prepare_class(name: str, bases: Tuple[type, ...] = ..., kwds: Dict[str, Any] = ...) -> Tuple[type, Dict[str, Any], Dict[str, Any]]: ...
+
+# Actually a different type, but `property` is special and we want that too.
+DynamicClassAttribute = property
+
+def coroutine(f: Callable[..., Any]) -> CoroutineType: ...
diff --git a/typeshed/stdlib/3/typing.pyi b/typeshed/stdlib/3/typing.pyi
new file mode 100644
index 0000000..099f925
--- /dev/null
+++ b/typeshed/stdlib/3/typing.pyi
@@ -0,0 +1,449 @@
+# Stubs for typing
+
+import sys
+from abc import abstractmethod, ABCMeta
+
+# Definitions of special type checking related constructs.  Their definition
+# are not used, so their value does not matter.
+
+overload = object()
+Any = object()
+TypeVar = object()
+Generic = object()
+Tuple = object()
+Callable = object()
+Type = object()
+_promote = object()
+no_type_check = object()
+
+class GenericMeta(type): ...
+
+# Type aliases and type constructors
+
+class TypeAlias:
+    # Class for defining generic aliases for library types.
+    def __init__(self, target_type: type) -> None: ...
+    def __getitem__(self, typeargs: Any) -> Any: ...
+
+Union = TypeAlias(object)
+Optional = TypeAlias(object)
+List = TypeAlias(object)
+Dict = TypeAlias(object)
+DefaultDict = TypeAlias(object)
+Set = TypeAlias(object)
+
+# Predefined type variables.
+AnyStr = TypeVar('AnyStr', str, bytes)
+
+# Abstract base classes.
+
+# These type variables are used by the container types.
+_T = TypeVar('_T')
+_S = TypeVar('_S')
+_KT = TypeVar('_KT')  # Key type.
+_VT = TypeVar('_VT')  # Value type.
+_T_co = TypeVar('_T_co', covariant=True)  # Any type covariant containers.
+_V_co = TypeVar('_V_co', covariant=True)  # Any type covariant containers.
+_KT_co = TypeVar('_KT_co', covariant=True)  # Key type covariant containers.
+_VT_co = TypeVar('_VT_co', covariant=True)  # Value type covariant containers.
+_T_contra = TypeVar('_T_contra', contravariant=True)  # Ditto contravariant.
+
+class SupportsInt(metaclass=ABCMeta):
+    @abstractmethod
+    def __int__(self) -> int: ...
+
+class SupportsFloat(metaclass=ABCMeta):
+    @abstractmethod
+    def __float__(self) -> float: ...
+
+class SupportsComplex(metaclass=ABCMeta):
+    @abstractmethod
+    def __complex__(self) -> complex: pass
+
+class SupportsBytes(metaclass=ABCMeta):
+    @abstractmethod
+    def __bytes__(self) -> bytes: pass
+
+class SupportsAbs(Generic[_T]):
+    @abstractmethod
+    def __abs__(self) -> _T: ...
+
+class SupportsRound(Generic[_T]):
+    @abstractmethod
+    def __round__(self, ndigits: int = ...) -> _T: ...
+
+class Reversible(Generic[_T_co]):
+    @abstractmethod
+    def __reversed__(self) -> Iterator[_T_co]: ...
+
+class Sized(metaclass=ABCMeta):
+    @abstractmethod
+    def __len__(self) -> int: ...
+
+class Hashable(metaclass=ABCMeta):
+    # TODO: This is special, in that a subclass of a hashable class may not be hashable
+    #   (for example, list vs. object). It's not obvious how to represent this. This class
+    #   is currently mostly useless for static checking.
+    @abstractmethod
+    def __hash__(self) -> int: ...
+
+class Iterable(Generic[_T_co]):
+    @abstractmethod
+    def __iter__(self) -> Iterator[_T_co]: ...
+
+class Iterator(Iterable[_T_co], Generic[_T_co]):
+    @abstractmethod
+    def __next__(self) -> _T_co: ...
+    def __iter__(self) -> 'Iterator[_T_co]': ...
+
+class Generator(Iterator[_T_co], Generic[_T_co, _T_contra, _V_co]):
+    @abstractmethod
+    def __next__(self) -> _T_co: ...
+
+    @abstractmethod
+    def send(self, value: _T_contra) -> _T_co: ...
+
+    @abstractmethod
+    def throw(self, typ: Type[BaseException], val: Optional[BaseException] = None,
+              # TODO: tb should be TracebackType but that's defined in types
+              tb: Any = None) -> None: ...
+
+    @abstractmethod
+    def close(self) -> None: ...
+
+    @abstractmethod
+    def __iter__(self) -> 'Generator[_T_co, _T_contra, _V_co]': ...
+
+# TODO: Several types should only be defined if sys.python_version >= (3, 5):
+# Awaitable, AsyncIterator, AsyncIterable, Coroutine, Collection, ContextManager.
+# See https: //github.com/python/typeshed/issues/655 for why this is not easy.
+
+class Awaitable(Generic[_T_co]):
+    @abstractmethod
+    def __await__(self) -> Generator[Any, None, _T_co]: ...
+
+class Coroutine(Awaitable[_V_co], Generic[_T_co, _T_contra, _V_co]):
+    @abstractmethod
+    def send(self, value: _T_contra) -> _T_co: ...
+
+    @abstractmethod
+    def throw(self, typ: Type[BaseException], val: Optional[BaseException] = None,
+              # TODO: tb should be TracebackType but that's defined in types
+              tb: Any = None) -> None: ...
+
+    @abstractmethod
+    def close(self) -> None: ...
+
+
+# NOTE: This type does not exist in typing.py or PEP 484.
+# The parameters corrrespond to Generator, but the 4th is the original type.
+class AwaitableGenerator(Generator[_T_co, _T_contra, _V_co], Awaitable[_V_co],
+                         Generic[_T_co, _T_contra, _V_co, _S]):
+    pass
+
+class AsyncIterable(Generic[_T_co]):
+    @abstractmethod
+    def __anext__(self) -> Awaitable[_T_co]: ...
+
+class AsyncIterator(AsyncIterable[_T_co],
+                    Generic[_T_co]):
+    @abstractmethod
+    def __anext__(self) -> Awaitable[_T_co]: ...
+    def __aiter__(self) -> 'AsyncIterator[_T_co]': ...
+
+class Container(Generic[_T_co]):
+    @abstractmethod
+    def __contains__(self, x: object) -> bool: ...
+
+class Sequence(Iterable[_T_co], Container[_T_co], Sized, Reversible[_T_co], Generic[_T_co]):
+    @overload
+    @abstractmethod
+    def __getitem__(self, i: int) -> _T_co: ...
+    @overload
+    @abstractmethod
+    def __getitem__(self, s: slice) -> Sequence[_T_co]: ...
+    # Mixin methods
+    if sys.version_info >= (3, 5):
+        def index(self, x: Any, start: int = 0, end: int = 0) -> int: ...
+    else:
+        def index(self, x: Any) -> int: ...
+    def count(self, x: Any) -> int: ...
+    def __contains__(self, x: object) -> bool: ...
+    def __iter__(self) -> Iterator[_T_co]: ...
+    def __reversed__(self) -> Iterator[_T_co]: ...
+
+class MutableSequence(Sequence[_T], Generic[_T]):
+    @abstractmethod
+    def insert(self, index: int, object: _T) -> None: ...
+    @overload
+    @abstractmethod
+    def __setitem__(self, i: int, o: _T) -> None: ...
+    @overload
+    @abstractmethod
+    def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
+    @overload
+    @abstractmethod
+    def __delitem__(self, i: int) -> None: ...
+    @overload
+    @abstractmethod
+    def __delitem__(self, i: slice) -> None: ...
+    # Mixin methods
+    def append(self, object: _T) -> None: ...
+    def extend(self, iterable: Iterable[_T]) -> None: ...
+    def reverse(self) -> None: ...
+    def pop(self, index: int = ...) -> _T: ...
+    def remove(self, object: _T) -> None: ...
+    def __iadd__(self, x: Iterable[_T]) -> MutableSequence[_T]: ...
+
+class AbstractSet(Iterable[_T_co], Container[_T_co], Sized, Generic[_T_co]):
+    @abstractmethod
+    def __contains__(self, x: object) -> bool: ...
+    # Mixin methods
+    def __le__(self, s: AbstractSet[Any]) -> bool: ...
+    def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+    def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+    def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+    def __and__(self, s: AbstractSet[Any]) -> AbstractSet[_T_co]: ...
+    def __or__(self, s: AbstractSet[_T]) -> AbstractSet[Union[_T_co, _T]]: ...
+    def __sub__(self, s: AbstractSet[Any]) -> AbstractSet[_T_co]: ...
+    def __xor__(self, s: AbstractSet[_T]) -> AbstractSet[Union[_T_co, _T]]: ...
+    # TODO: Argument can be a more general ABC?
+    def isdisjoint(self, s: AbstractSet[Any]) -> bool: ...
+
+class FrozenSet(AbstractSet[_T_co], Generic[_T_co]): ...
+
+class MutableSet(AbstractSet[_T], Generic[_T]):
+    @abstractmethod
+    def add(self, x: _T) -> None: ...
+    @abstractmethod
+    def discard(self, x: _T) -> None: ...
+    # Mixin methods
+    def clear(self) -> None: ...
+    def pop(self) -> _T: ...
+    def remove(self, element: _T) -> None: ...
+    def __ior__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
+    def __iand__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...
+    def __ixor__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
+    def __isub__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...
+
+class MappingView(Sized):
+    def __len__(self) -> int: ...
+
+class ItemsView(AbstractSet[Tuple[_KT_co, _VT_co]], MappingView, Generic[_KT_co, _VT_co]):
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[Tuple[_KT_co, _VT_co]]: ...
+
+class KeysView(AbstractSet[_KT_co], MappingView, Generic[_KT_co]):
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_KT_co]: ...
+
+class ValuesView(MappingView, Iterable[_VT_co], Generic[_VT_co]):
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_VT_co]: ...
+
+# TODO: ContextManager (only if contextlib.AbstractContextManager exists)
+
+class Mapping(Iterable[_KT], Container[_KT], Sized, Generic[_KT, _VT_co]):
+    # TODO: We wish the key type could also be covariant, but that doesn't work,
+    # see discussion in https: //github.com/python/typing/pull/273.
+    @abstractmethod
+    def __getitem__(self, k: _KT) -> _VT_co:
+        ...
+    # Mixin methods
+    def get(self, k: _KT, default: _VT_co = ...) -> _VT_co:  # type: ignore
+        ...
+    def items(self) -> AbstractSet[Tuple[_KT, _VT_co]]: ...
+    def keys(self) -> AbstractSet[_KT]: ...
+    def values(self) -> ValuesView[_VT_co]: ...
+    def __contains__(self, o: object) -> bool: ...
+
+class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
+    @abstractmethod
+    def __setitem__(self, k: _KT, v: _VT) -> None: ...
+    @abstractmethod
+    def __delitem__(self, v: _KT) -> None: ...
+
+    def clear(self) -> None: ...
+    def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
+    def popitem(self) -> Tuple[_KT, _VT]: ...
+    def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
+    # 'update' used to take a Union, but using overloading is better.
+    # The second overloaded type here is a bit too general, because
+    # Mapping[Tuple[_KT, _VT], W] is a subclass of Iterable[Tuple[_KT, _VT]],
+    # but will always have the behavior of the first overloaded type
+    # at runtime, leading to keys of a mix of types _KT and Tuple[_KT, _VT].
+    # We don't currently have any way of forcing all Mappings to use
+    # the first overload, but by using overloading rather than a Union,
+    # mypy will commit to using the first overload when the argument is
+    # known to be a Mapping with unknown type parameters, which is closer
+    # to the behavior we want. See mypy issue  #1430.
+    @overload
+    def update(self, m: Mapping[_KT, _VT]) -> None: ...
+    @overload
+    def update(self, m: Iterable[Tuple[_KT, _VT]]) -> None: ...
+
+Text = str
+
+TYPE_CHECKING = True
+
+class IO(Iterator[AnyStr], Generic[AnyStr]):
+    # TODO detach
+    # TODO use abstract properties
+    @property
+    def mode(self) -> str: ...
+    @property
+    def name(self) -> str: ...
+    @abstractmethod
+    def close(self) -> None: ...
+    @property
+    def closed(self) -> bool: ...
+    @abstractmethod
+    def fileno(self) -> int: ...
+    @abstractmethod
+    def flush(self) -> None: ...
+    @abstractmethod
+    def isatty(self) -> bool: ...
+    # TODO what if n is None?
+    @abstractmethod
+    def read(self, n: int = ...) -> AnyStr: ...
+    @abstractmethod
+    def readable(self) -> bool: ...
+    @abstractmethod
+    def readline(self, limit: int = ...) -> AnyStr: ...
+    @abstractmethod
+    def readlines(self, hint: int = ...) -> list[AnyStr]: ...
+    @abstractmethod
+    def seek(self, offset: int, whence: int = ...) -> int: ...
+    @abstractmethod
+    def seekable(self) -> bool: ...
+    @abstractmethod
+    def tell(self) -> int: ...
+    # TODO None should not be compatible with int
+    @abstractmethod
+    def truncate(self, size: int = ...) -> int: ...
+    @abstractmethod
+    def writable(self) -> bool: ...
+    # TODO buffer objects
+    @abstractmethod
+    def write(self, s: AnyStr) -> int: ...
+    @abstractmethod
+    def writelines(self, lines: Iterable[AnyStr]) -> None: ...
+
+    @abstractmethod
+    def __next__(self) -> AnyStr: ...
+    @abstractmethod
+    def __iter__(self) -> Iterator[AnyStr]: ...
+    @abstractmethod
+    def __enter__(self) -> 'IO[AnyStr]': ...
+    @abstractmethod
+    def __exit__(self, t: Optional[Type[BaseException]], value: Optional[BaseException],
+                 # TODO: traceback should be TracebackType but that's defined in types
+                 traceback: Optional[Any]) -> bool: ...
+
+class BinaryIO(IO[bytes]):
+    # TODO readinto
+    # TODO read1?
+    # TODO peek?
+    @overload
+    @abstractmethod
+    def write(self, s: bytes) -> int: ...
+    @overload
+    @abstractmethod
+    def write(self, s: bytearray) -> int: ...
+
+    @abstractmethod
+    def __enter__(self) -> BinaryIO: ...
+
+class TextIO(IO[str]):
+    # TODO use abstractproperty
+    @property
+    def buffer(self) -> BinaryIO: ...
+    @property
+    def encoding(self) -> str: ...
+    @property
+    def errors(self) -> Optional[str]: ...
+    @property
+    def line_buffering(self) -> int: ...  # int on PyPy, bool on CPython
+    @property
+    def newlines(self) -> Any: ...  # None, str or tuple
+    @abstractmethod
+    def __enter__(self) -> TextIO: ...
+
+class ByteString(Sequence[int]): ...
+
+class Match(Generic[AnyStr]):
+    pos = 0
+    endpos = 0
+    lastindex = 0
+    lastgroup = ...  # type: AnyStr
+    string = ...  # type: AnyStr
+
+    # The regular expression object whose match() or search() method produced
+    # this match instance.
+    re = ...  # type: 'Pattern[AnyStr]'
+
+    def expand(self, template: AnyStr) -> AnyStr: ...
+
+    @overload
+    def group(self, group1: int = ...) -> AnyStr: ...
+    @overload
+    def group(self, group1: str) -> AnyStr: ...
+    @overload
+    def group(self, group1: int, group2: int,
+              *groups: int) -> Sequence[AnyStr]: ...
+    @overload
+    def group(self, group1: str, group2: str,
+              *groups: str) -> Sequence[AnyStr]: ...
+
+    def groups(self, default: AnyStr = ...) -> Sequence[AnyStr]: ...
+    def groupdict(self, default: AnyStr = ...) -> dict[str, AnyStr]: ...
+    def start(self, group: Union[int, str] = ...) -> int: ...
+    def end(self, group: Union[int, str] = ...) -> int: ...
+    def span(self, group: Union[int, str] = ...) -> Tuple[int, int]: ...
+
+class Pattern(Generic[AnyStr]):
+    flags = 0
+    groupindex = 0
+    groups = 0
+    pattern = ...  # type: AnyStr
+
+    def search(self, string: AnyStr, pos: int = ...,
+               endpos: int = ...) -> Match[AnyStr]: ...
+    def match(self, string: AnyStr, pos: int = ...,
+              endpos: int = ...) -> Match[AnyStr]: ...
+    # New in Python 3.4
+    def fullmatch(self, string: AnyStr, pos: int = ...,
+                  endpos: int = ...) -> Optional[Match[AnyStr]]: ...
+    def split(self, string: AnyStr, maxsplit: int = ...) -> list[AnyStr]: ...
+    def findall(self, string: AnyStr, pos: int = ...,
+                endpos: int = ...) -> list[Any]: ...
+    def finditer(self, string: AnyStr, pos: int = ...,
+                 endpos: int = ...) -> Iterator[Match[AnyStr]]: ...
+
+    @overload
+    def sub(self, repl: AnyStr, string: AnyStr,
+            count: int = ...) -> AnyStr: ...
+    @overload
+    def sub(self, repl: Callable[[Match[AnyStr]], AnyStr], string: AnyStr,
+            count: int = ...) -> AnyStr: ...
+
+    @overload
+    def subn(self, repl: AnyStr, string: AnyStr,
+             count: int = ...) -> Tuple[AnyStr, int]: ...
+    @overload
+    def subn(self, repl: Callable[[Match[AnyStr]], AnyStr], string: AnyStr,
+             count: int = ...) -> Tuple[AnyStr, int]: ...
+
+# Functions
+
+def get_type_hints(obj: Callable) -> dict[str, Any]: ...
+
+def cast(tp: Type[_T], obj: Any) -> _T: ...
+
+# Type constructors
+
+# NamedTuple is special-cased in the type checker; the initializer is ignored.
+def NamedTuple(typename: str, fields: Iterable[Tuple[str, Any]], *,
+               verbose: bool = ..., rename: bool = ..., module: str = None) -> Type[tuple]: ...
+
+def NewType(name: str, tp: Type[_T]) -> Type[_T]: ...
diff --git a/typeshed/stdlib/3/unicodedata.pyi b/typeshed/stdlib/3/unicodedata.pyi
new file mode 100644
index 0000000..07b5c47
--- /dev/null
+++ b/typeshed/stdlib/3/unicodedata.pyi
@@ -0,0 +1,37 @@
+# Stubs for unicodedata (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+ucd_3_2_0 = ...  # type: Any
+ucnhash_CAPI = ...  # type: Any
+unidata_version = ...  # type: str
+
+def bidirectional(unichr): ...
+def category(unichr): ...
+def combining(unichr): ...
+def decimal(chr, default=...): ...
+def decomposition(unichr): ...
+def digit(chr, default=...): ...
+def east_asian_width(unichr): ...
+def lookup(name): ...
+def mirrored(unichr): ...
+def name(chr, default=...): ...
+def normalize(form, unistr): ...
+def numeric(chr, default=...): ...
+
+class UCD:
+    unidata_version = ...  # type: Any
+    def bidirectional(self, unichr): ...
+    def category(self, unichr): ...
+    def combining(self, unichr): ...
+    def decimal(self, chr, default=...): ...
+    def decomposition(self, unichr): ...
+    def digit(self, chr, default=...): ...
+    def east_asian_width(self, unichr): ...
+    def lookup(self, name): ...
+    def mirrored(self, unichr): ...
+    def name(self, chr, default=...): ...
+    def normalize(self, form, unistr): ...
+    def numeric(self, chr, default=...): ...
diff --git a/typeshed/stdlib/3/unittest/__init__.pyi b/typeshed/stdlib/3/unittest/__init__.pyi
new file mode 100644
index 0000000..15ebff6
--- /dev/null
+++ b/typeshed/stdlib/3/unittest/__init__.pyi
@@ -0,0 +1,333 @@
+# Stubs for unittest
+
+from typing import (
+    Any, Callable, Dict, Iterable, Iterator, List, Optional, Pattern, Sequence,
+    Set, TextIO, Tuple, Type, TypeVar, Union,
+    overload,
+)
+import logging
+import sys
+from types import ModuleType, TracebackType
+from contextlib import ContextManager
+
+
+_T = TypeVar('_T')
+_FT = TypeVar('_FT', Callable[[Any], Any])
+
+
+def skip(reason: str) -> Callable[[_FT], _FT]: ...
+def skipIf(condition: object, reason: str) -> Callable[[_FT], _FT]: ...
+def skipUnless(condition: object, reason: str) -> Callable[[_FT], _FT]: ...
+def expectedFailure(func: _FT) -> _FT: ...
+
+class SkipTest(Exception):
+    def __init__(self, reason: str) -> None: ...
+
+
+class TestCase:
+    failureException = ...  # type: Type[BaseException]
+    longMessage = ...  # type: bool
+    maxDiff = ...  # type: Optional[int]
+    def __init__(self, methodName: str = ...) -> None: ...
+    def setUp(self) -> None: ...
+    def tearDown(self) -> None: ...
+    @classmethod
+    def setUpClass(cls) -> None: ...
+    @classmethod
+    def tearDownClass(cls) -> None: ...
+    def run(self, result: Optional[TestResult] = ...) -> TestCase: ...
+    def skipTest(self, reason: Any) -> None: ...
+    if sys.version_info >= (3, 4):
+        def subTest(self, msg: Any = ..., **params: Any) -> ContextManager[None]: ...
+    def debug(self) -> None: ...
+    def assertEqual(self, first: Any, second: Any, msg: Any = ...) -> None: ...
+    def assertNotEqual(self, first: Any, second: Any,
+                       msg: Any = ...) -> None: ...
+    def assertTrue(self, expr: Any, msg: Any = ...) -> None: ...
+    def assertFalse(self, expr: Any, msg: Any = ...) -> None: ...
+    def assertIs(self, first: Any, second: Any, msg: Any = ...) -> None: ...
+    def assertIsNot(self, first: Any, second: Any,
+                    msg: Any = ...) -> None: ...
+    def assertIsNone(self, expr: Any, msg: Any = ...) -> None: ...
+    def assertIsNotNone(self, expr: Any, msg: Any = ...) -> None: ...
+    def assertIn(self, first: _T, second: Iterable[_T],
+                 msg: Any = ...) -> None: ...
+    def assertNotIn(self, first: _T, second: Iterable[_T],
+                    msg: Any = ...) -> None: ...
+    def assertIsInstance(self, obj: Any,
+                         cls: Union[type, Tuple[type, ...]],
+                         msg: Any = ...) -> None: ...
+    def assertNotIsInstance(self, obj: Any,
+                            cls: Union[type, Tuple[type, ...]],
+                            msg: Any = ...) -> None: ...
+    def assertGreater(self, first: Any, second: Any,
+                      msg: Any = ...) -> None: ...
+    def assertGreaterEqual(self, first: Any, second: Any,
+                           msg: Any = ...) -> None: ...
+    def assertLess(self, first: Any, second: Any, msg: Any = ...) -> None: ...
+    def assertLessEqual(self, first: Any, second: Any,
+                        msg: Any = ...) -> None: ...
+    @overload
+    def assertRaises(self,  # type: ignore
+                     exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+                     callable: Callable[..., Any] = ...,
+                     *args: Any, **kwargs: Any) -> None: ...
+    @overload
+    def assertRaises(self,
+                     exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+                     msg: Any = ...) -> _AssertRaisesContext: ...
+    @overload
+    def assertRaisesRegex(self,  # type: ignore
+                          exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+                          callable: Callable[..., Any] = ...,
+                          *args: Any, **kwargs: Any) -> None: ...
+    @overload
+    def assertRaisesRegex(self,
+                          exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+                          msg: Any = ...) -> _AssertRaisesContext: ...
+    @overload
+    def assertWarns(self,  # type: ignore
+                    exception: Union[Type[Warning], Tuple[Type[Warning], ...]],
+                    callable: Callable[..., Any] = ...,
+                    *args: Any, **kwargs: Any) -> None: ...
+    @overload
+    def assertWarns(self,
+                    exception: Union[Type[Warning], Tuple[Type[Warning], ...]],
+                    msg: Any = ...) -> _AssertWarnsContext: ...
+    @overload
+    def assertWarnsRegex(self,  # type: ignore
+                         exception: Union[Type[Warning], Tuple[Type[Warning], ...]],
+                         callable: Callable[..., Any] = ...,
+                         *args: Any, **kwargs: Any) -> None: ...
+    @overload
+    def assertWarnsRegex(self,
+                         exception: Union[Type[Warning], Tuple[Type[Warning], ...]],
+                         msg: Any = ...) -> _AssertWarnsContext: ...
+    if sys.version_info >= (3, 4):
+        def assertLogs(
+            self, logger: Optional[logging.Logger] = ...,
+            level: Union[int, str, None] = ...
+        ) -> _AssertLogsContext: ...
+    def assertAlmostEqual(self, first: float, second: float, places: int = ...,
+                          msg: Any = ..., delta: float = ...) -> None: ...
+    def assertNotAlmostEqual(self, first: float, second: float,
+                             places: int = ..., msg: Any = ...,
+                             delta: float = ...) -> None: ...
+    def assertRegex(self, text: str, regex: Union[str, Pattern[str]],
+                    msg: Any = ...) -> None: ...
+    def assertNotRegex(self, text: str, regex: Union[str, Pattern[str]],
+                       msg: Any = ...) -> None: ...
+    def assertCountEqual(self, first: Sequence[Any], second: Sequence[Any],
+                         msg: Any = ...) -> None: ...
+    def addTypeEqualityFunc(self, typeobj: Type[Any],
+                            function: Callable[..., None]) -> None: ...
+    def assertMultiLineEqual(self, first: str, second: str,
+                             msg: Any = ...) -> None: ...
+    def assertSequenceEqual(self, first: Sequence[Any], second: Sequence[Any],
+                            msg: Any = ...,
+                            seq_type: Type[Sequence[Any]] = ...) -> None: ...
+    def assertListEqual(self, first: List[Any], second: List[Any],
+                        msg: Any = ...) -> None: ...
+    def assertTupleEqual(self, first: Tuple[Any, ...], second: Tuple[Any, ...],
+                         msg: Any = ...) -> None: ...
+    def assertSetEqual(self, first: Set[Any], second: Set[Any],
+                       msg: Any = ...) -> None: ...
+    def assertDictEqual(self, first: Dict[Any, Any], second: Dict[Any, Any],
+                        msg: Any = ...) -> None: ...
+    def fail(self, msg: Any = ...) -> None: ...
+    def countTestCases(self) -> int: ...
+    def defaultTestResult(self) -> TestResult: ...
+    def id(self) -> str: ...
+    def shortDescription(self) -> Optional[str]: ...
+    def addCleanup(self, function: Callable[..., Any], *args: Any,
+                   **kwargs: Any) -> None: ...
+    def doCleanups(self) -> None: ...
+    # below is deprecated
+    def failUnlessEqual(self, first: Any, second: Any,
+                        msg: Any = ...) -> None: ...
+    def assertEquals(self, first: Any, second: Any, msg: Any = ...) -> None: ...
+    def failIfEqual(self, first: Any, second: Any, msg: Any = ...) -> None: ...
+    def assertNotEquals(self, first: Any, second: Any,
+                        msg: Any = ...) -> None: ...
+    def failUnless(self, expr: bool, msg: Any = ...) -> None: ...
+    def assert_(self, expr: bool, msg: Any = ...) -> None: ...
+    def failIf(self, expr: bool, msg: Any = ...) -> None: ...
+    @overload
+    def failUnlessRaises(self,  # type: ignore
+                         exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+                         callable: Callable[..., Any] = ...,
+                         *args: Any, **kwargs: Any) -> None: ...
+    @overload
+    def failUnlessRaises(self,
+                         exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+                         msg: Any = ...) -> _AssertRaisesContext: ...
+    def failUnlessAlmostEqual(self, first: float, second: float,
+                              places: int = ..., msg: Any = ...) -> None: ...
+    def assertAlmostEquals(self, first: float, second: float, places: int = ...,
+                           msg: Any = ..., delta: float = ...) -> None: ...
+    def failIfAlmostEqual(self, first: float, second: float, places: int = ...,
+                          msg: Any = ...) -> None: ...
+    def assertNotAlmostEquals(self, first: float, second: float,
+                              places: int = ..., msg: Any = ...,
+                              delta: float = ...) -> None: ...
+    def assertRegexpMatches(self, text: str, regex: Union[str, Pattern[str]],
+                            msg: Any = ...) -> None: ...
+    @overload
+    def assertRaisesRegexp(self,  # type: ignore
+                           exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+                           callable: Callable[..., Any] = ...,
+                           *args: Any, **kwargs: Any) -> None: ...
+    @overload
+    def assertRaisesRegexp(self,
+                           exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+                           msg: Any = ...) -> _AssertRaisesContext: ...
+
+class FunctionTestCase(TestCase):
+    def __init__(self, testFunc: Callable[[], None],
+                 setUp: Optional[Callable[[], None]] = ...,
+                 tearDown: Optional[Callable[[], None]] = ...,
+                 description: Optional[str] = ...) -> None: ...
+
+class _AssertRaisesContext:
+    exception = ...  # type: Exception
+    def __enter__(self) -> _AssertRaisesContext: ...
+    def __exit__(self, exc_type: Optional[type], exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+
+class _AssertWarnsContext:
+    warning = ...  # type: Warning
+    filename = ...  # type: str
+    lineno = ...  # type: int
+    def __enter__(self) -> _AssertWarnsContext: ...
+    def __exit__(self, exc_type: Optional[type], exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+
+class _AssertLogsContext:
+    records = ...  # type: List[logging.LogRecord]
+    output = ...  # type: List[str]
+    def __enter__(self) -> _AssertLogsContext: ...
+    def __exit__(self, exc_type: Optional[type], exc_val: Optional[Exception],
+                 exc_tb: Optional[TracebackType]) -> bool: ...
+
+
+_TestType = Union[TestCase, TestSuite]
+
+class TestSuite(Iterable[_TestType]):
+    def __init__(self, tests: Iterable[_TestType] = ...) -> None: ...
+    def addTest(self, test: _TestType) -> None: ...
+    def addTests(self, tests: Iterable[_TestType]) -> None: ...
+    def run(self, result: TestResult) -> TestResult: ...
+    def debug(self) -> None: ...
+    def countTestCases(self) -> int: ...
+    def __iter__(self) -> Iterator[_TestType]: ...
+
+
+class TestLoader:
+    if sys.version_info >= (3, 5):
+        errors = ...  # type: List[Type[BaseException]]
+    testMethodPrefix = ...  # type: str
+    sortTestMethodsUsing = ...  # type: Callable[[str, str], bool]
+    suiteClass = ...  # type: Callable[[List[TestCase]], TestSuite]
+    def loadTestsFromTestCase(self,
+                              testCaseClass: Type[TestCase]) -> TestSuite: ...
+    if sys.version_info >= (3, 5):
+        def loadTestsFromModule(self, module: ModuleType,
+                                *, pattern: Any = ...) -> TestSuite: ...
+    else:
+        def loadTestsFromModule(self,
+                                module: ModuleType) -> TestSuite: ...
+    def loadTestsFromName(self, name: str,
+                          module: Optional[ModuleType] = ...) -> TestSuite: ...
+    def loadTestsFromNames(self, names: Sequence[str],
+                           module: Optional[ModuleType] = ...) -> TestSuite: ...
+    def getTestCaseNames(self,
+                         testCaseClass: Type[TestCase]) -> Sequence[str]: ...
+    def discover(self, start_dir: str, pattern: str = ...,
+                 top_level_dir: Optional[str] = ...) -> TestSuite: ...
+
+_SysExcInfoType = Tuple[Optional[Type[BaseException]],
+                        Optional[BaseException],
+                        Optional[TracebackType]]
+
+class TestResult:
+    errors = ...  # type: List[Tuple[TestCase, str]]
+    failures = ...  # type: List[Tuple[TestCase, str]]
+    skipped = ...  # type: List[Tuple[TestCase, str]]
+    expectedFailures = ...  # type: List[Tuple[TestCase, str]]
+    unexpectedSuccesses = ...  # type: List[TestCase]
+    shouldStop = ...  # type: bool
+    testsRun = ...  # type: int
+    buffer = ...  # type: bool
+    failfast = ...  # type: bool
+    tb_locals = ...  # type: bool
+    def wasSuccessful(self) -> bool: ...
+    def stop(self) -> None: ...
+    def startTest(self, test: TestCase) -> None: ...
+    def stopTest(self, test: TestCase) -> None: ...
+    def startTestRun(self) -> None: ...
+    def stopTestRun(self) -> None: ...
+    def addError(self, test: TestCase, err: _SysExcInfoType) -> None: ...
+    def addFailure(self, test: TestCase, err: _SysExcInfoType) -> None: ...
+    def addSuccess(self, test: TestCase) -> None: ...
+    def addSkip(self, test: TestCase, reason: str) -> None: ...
+    def addExpectedFailure(self, test: TestCase,
+                           err: _SysExcInfoType) -> None: ...
+    def addUnexpectedSuccess(self, test: TestCase) -> None: ...
+    if sys.version_info >= (3, 4):
+        def addSubTest(self, test: TestCase, subtest: TestCase,
+                       outcome: Optional[_SysExcInfoType]) -> None: ...
+
+class TextTestResult(TestResult):
+    def __init__(self, stream: TextIO = ..., descriptions: bool = ...,
+                 verbosity: int = ...) -> None: ...
+_TextTestResult = TextTestResult
+
+defaultTestLoader = ...  # type: TestLoader
+
+_ResultClassType = Callable[[TextIO, bool, int], TestResult]
+
+class TestRunner:
+    def run(self, test: Union[TestSuite, TestCase]) -> TestResult: ...
+
+class TextTestRunner(TestRunner):
+    if sys.version_info >= (3, 5):
+        def __init__(self, stream: Optional[TextIO] = ...,
+                     descriptions: bool = ..., verbosity: int = ...,
+                     failfast: bool = ..., buffer: bool = ...,
+                     resultclass: Optional[_ResultClassType] = ...,
+                     warnings: Optional[Type[Warning]] = ...,
+                     *, tb_locals: bool = ...) -> None: ...
+    else:
+        def __init__(self,
+                     stream: Optional[TextIO] = ...,
+                     descriptions: bool = ..., verbosity: int = ...,
+                     failfast: bool = ..., buffer: bool = ...,
+                     resultclass: Optional[_ResultClassType] = ...,
+                     warnings: Optional[Type[Warning]] = ...) -> None: ...
+    def _makeResult(self) -> TestResult: ...
+
+if sys.version_info >= (3, 4):
+    _DefaultTestType = Union[str, Iterable[str], None]
+else:
+    _DefaultTestType = Union[str, None]
+
+# not really documented
+class TestProgram:
+    result = ...  # type: TestResult
+
+def main(module: str = ..., defaultTest: _DefaultTestType = ...,
+         argv: Optional[List[str]] = ...,
+         testRunner: Union[Type[TestRunner], TestRunner, None] = ...,
+         testLoader: TestLoader = ..., exit: bool = ..., verbosity: int = ...,
+         failfast: Optional[bool] = ..., catchbreak: Optional[bool] = ...,
+         buffer: Optional[bool] = ...,
+         warnings: Optional[str] = ...) -> TestProgram: ...
+
+
+def installHandler() -> None: ...
+def registerResult(result: TestResult) -> None: ...
+def removeResult(result: TestResult) -> None: ...
+ at overload
+def removeHandler() -> None: ...
+ at overload
+def removeHandler(function: _FT) -> _FT: ...
diff --git a/typeshed/stdlib/3/unittest/mock.pyi b/typeshed/stdlib/3/unittest/mock.pyi
new file mode 100644
index 0000000..3d54fe9
--- /dev/null
+++ b/typeshed/stdlib/3/unittest/mock.pyi
@@ -0,0 +1,163 @@
+# Stubs for unittest.mock
+
+import sys
+from typing import Any
+
+if sys.version_info >= (3, 3):
+    FILTER_DIR = ...  # type: Any
+
+    class _slotted: ...
+
+    class _SentinelObject:
+        name = ...  # type: Any
+        def __init__(self, name): ...
+
+    class _Sentinel:
+        def __init__(self): ...
+        def __getattr__(self, name): ...
+
+    sentinel = ...  # type: Any
+    DEFAULT = ...  # type: Any
+
+    class _CallList(list):
+        def __contains__(self, value): ...
+
+    class _MockIter:
+        obj = ...  # type: Any
+        def __init__(self, obj): ...
+        def __iter__(self): ...
+        def __next__(self): ...
+
+    class Base:
+        def __init__(self, *args, **kwargs): ...
+
+    class NonCallableMock(Base):
+        def __new__(cls, *args, **kw): ...
+        def __init__(self, spec=None, wraps=None, name=None, spec_set=None, parent=None, _spec_state=None, _new_name='', _new_parent=None, _spec_as_instance=False, _eat_self=None, unsafe=False, **kwargs): ...
+        def attach_mock(self, mock, attribute): ...
+        def mock_add_spec(self, spec, spec_set=False): ...
+        return_value = ...  # type: Any
+        @property
+        def __class__(self): ...
+        called = ...  # type: Any
+        call_count = ...  # type: Any
+        call_args = ...  # type: Any
+        call_args_list = ...  # type: Any
+        mock_calls = ...  # type: Any
+        side_effect = ...  # type: Any
+        method_calls = ...  # type: Any
+        def reset_mock(self, visited=None): ...
+        def configure_mock(self, **kwargs): ...
+        def __getattr__(self, name): ...
+        def __dir__(self): ...
+        def __setattr__(self, name, value): ...
+        def __delattr__(self, name): ...
+        def assert_not_called(_mock_self): ...
+        def assert_called_with(_mock_self, *args, **kwargs): ...
+        def assert_called_once_with(_mock_self, *args, **kwargs): ...
+        def assert_has_calls(self, calls, any_order=False): ...
+        def assert_any_call(self, *args, **kwargs): ...
+
+    class CallableMixin(Base):
+        side_effect = ...  # type: Any
+        def __init__(self, spec=None, side_effect=None, return_value=..., wraps=None, name=None, spec_set=None, parent=None, _spec_state=None, _new_name='', _new_parent=None, **kwargs): ...
+        def __call__(_mock_self, *args, **kwargs): ...
+
+    class Mock(CallableMixin, NonCallableMock): ...
+
+    class _patch:
+        attribute_name = ...  # type: Any
+        getter = ...  # type: Any
+        attribute = ...  # type: Any
+        new = ...  # type: Any
+        new_callable = ...  # type: Any
+        spec = ...  # type: Any
+        create = ...  # type: Any
+        has_local = ...  # type: Any
+        spec_set = ...  # type: Any
+        autospec = ...  # type: Any
+        kwargs = ...  # type: Any
+        additional_patchers = ...  # type: Any
+        def __init__(self, getter, attribute, new, spec, create, spec_set, autospec, new_callable, kwargs): ...
+        def copy(self): ...
+        def __call__(self, func): ...
+        def decorate_class(self, klass): ...
+        def decorate_callable(self, func): ...
+        def get_original(self): ...
+        target = ...  # type: Any
+        temp_original = ...  # type: Any
+        is_local = ...  # type: Any
+        def __enter__(self): ...
+        def __exit__(self, *exc_info): ...
+        def start(self): ...
+        def stop(self): ...
+
+    def patch(target, new=..., spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs): ...
+
+    class _patch_dict:
+        in_dict = ...  # type: Any
+        values = ...  # type: Any
+        clear = ...  # type: Any
+        def __init__(self, in_dict, values=..., clear=False, **kwargs): ...
+        def __call__(self, f): ...
+        def decorate_class(self, klass): ...
+        def __enter__(self): ...
+        def __exit__(self, *args): ...
+        start = ...  # type: Any
+        stop = ...  # type: Any
+
+    class MagicMixin:
+        def __init__(self, *args, **kw): ...
+
+    class NonCallableMagicMock(MagicMixin, NonCallableMock):
+        def mock_add_spec(self, spec, spec_set=False): ...
+
+    class MagicMock(MagicMixin, Mock):
+        def mock_add_spec(self, spec, spec_set=False): ...
+
+    class MagicProxy:
+        name = ...  # type: Any
+        parent = ...  # type: Any
+        def __init__(self, name, parent): ...
+        def __call__(self, *args, **kwargs): ...
+        def create_mock(self): ...
+        def __get__(self, obj, _type=None): ...
+
+    class _ANY:
+        def __eq__(self, other): ...
+        def __ne__(self, other): ...
+
+    ANY = ...  # type: Any
+
+    class _Call(tuple):
+        def __new__(cls, value=..., name=None, parent=None, two=False, from_kall=True): ...
+        name = ...  # type: Any
+        parent = ...  # type: Any
+        from_kall = ...  # type: Any
+        def __init__(self, value=..., name=None, parent=None, two=False, from_kall=True): ...
+        def __eq__(self, other): ...
+        __ne__ = ...  # type: Any
+        def __call__(self, *args, **kwargs): ...
+        def __getattr__(self, attr): ...
+        def count(self, *args, **kwargs): ...
+        def index(self, *args, **kwargs): ...
+        def call_list(self): ...
+
+    call = ...  # type: Any
+
+    def create_autospec(spec, spec_set=False, instance=False, _parent=None, _name=None, **kwargs): ...
+
+    class _SpecState:
+        spec = ...  # type: Any
+        ids = ...  # type: Any
+        spec_set = ...  # type: Any
+        parent = ...  # type: Any
+        instance = ...  # type: Any
+        name = ...  # type: Any
+        def __init__(self, spec, spec_set=False, parent=None, name=None, ids=None, instance=False): ...
+
+    def mock_open(mock=None, read_data=''): ...
+
+    class PropertyMock(Mock):
+        def __get__(self, obj, obj_type): ...
+        def __set__(self, obj, val): ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3/urllib/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3/urllib/__init__.pyi
diff --git a/typeshed/stdlib/3/urllib/error.pyi b/typeshed/stdlib/3/urllib/error.pyi
new file mode 100644
index 0000000..fe4dbb1
--- /dev/null
+++ b/typeshed/stdlib/3/urllib/error.pyi
@@ -0,0 +1,11 @@
+from typing import Any, Dict, Union
+from urllib.response import addinfourl
+
+# Stubs for urllib.error
+
+class URLError(IOError):
+    reason = ...  # type: Union[str, BaseException]
+class HTTPError(URLError, addinfourl):
+    code = ...  # type: int
+    headers = ...  # type: Dict[str, str]
+class ContentTooShortError(URLError): ...
diff --git a/typeshed/stdlib/3/urllib/parse.pyi b/typeshed/stdlib/3/urllib/parse.pyi
new file mode 100644
index 0000000..d427e40
--- /dev/null
+++ b/typeshed/stdlib/3/urllib/parse.pyi
@@ -0,0 +1,152 @@
+# Stubs for urllib.parse
+from typing import Any, List, Dict, Tuple, AnyStr, Generic, overload, Sequence, Mapping, Union, NamedTuple
+
+__all__ = (
+    'urlparse',
+    'urlunparse',
+    'urljoin',
+    'urldefrag',
+    'urlsplit',
+    'urlunsplit',
+    'urlencode',
+    'parse_qs',
+    'parse_qsl',
+    'quote',
+    'quote_plus',
+    'quote_from_bytes',
+    'unquote',
+    'unquote_plus',
+    'unquote_to_bytes'
+)
+
+uses_relative = ...  # type: List[str]
+uses_netloc = ...  # type: List[str]
+uses_params = ...  # type: List[str]
+non_hierarchical = ...  # type: List[str]
+uses_query = ...  # type: List[str]
+uses_fragment = ...  # type: List[str]
+scheme_chars = ...  # type: str
+MAX_CACHE_SIZE = 0
+
+class _ResultMixinBase(Generic[AnyStr]):
+    def geturl(self) -> AnyStr: ...
+
+class _ResultMixinStr(_ResultMixinBase[str]):
+    def encode(self, encoding: str = ..., errors: str = ...) -> '_ResultMixinBytes': ...
+
+
+class _ResultMixinBytes(_ResultMixinBase[str]):
+    def decode(self, encoding: str = ..., errors: str = ...) -> '_ResultMixinStr': ...
+
+
+class _NetlocResultMixinBase(Generic[AnyStr]):
+    username = ...  # type: AnyStr
+    password = ...  # type: AnyStr
+    hostname = ...  # type: AnyStr
+    port = ...  # type: int
+
+class _NetlocResultMixinStr(_NetlocResultMixinBase[str], _ResultMixinStr): ...
+
+
+class _NetlocResultMixinBytes(_NetlocResultMixinBase[str], _ResultMixinBytes): ...
+
+class _DefragResultBase(tuple, Generic[AnyStr]):
+    url = ...  # type: AnyStr
+    fragment = ...  # type: AnyStr
+
+
+_SplitResultBase = NamedTuple(
+    '_SplitResultBase',
+    [
+        ('scheme', str), ('netloc', str), ('path', str), ('query', str), ('fragment', str)
+    ]
+)
+_SplitResultBytesBase = NamedTuple(
+    '_SplitResultBytesBase',
+    [
+        ('scheme', bytes), ('netloc', bytes), ('path', bytes), ('query', bytes), ('fragment', bytes)
+    ]
+)
+
+_ParseResultBase = NamedTuple(
+    '_ParseResultBase',
+    [
+        ('scheme', str), ('netloc', str), ('path', str), ('params', str), ('query', str), ('fragment', str)
+    ]
+)
+_ParseResultBytesBase = NamedTuple(
+    '_ParseResultBytesBase',
+    [
+        ('scheme', bytes), ('netloc', bytes), ('path', bytes), ('params', bytes), ('query', bytes), ('fragment', bytes)
+    ]
+)
+
+# Structured result objects for string data
+class DefragResult(_DefragResultBase[str], _ResultMixinStr): ...
+
+class SplitResult(_SplitResultBase, _NetlocResultMixinStr): ...
+
+class ParseResult(_ParseResultBase, _NetlocResultMixinStr): ...
+
+# Structured result objects for bytes data
+class DefragResultBytes(_DefragResultBase[bytes], _ResultMixinBytes): ...
+
+class SplitResultBytes(_SplitResultBytesBase, _NetlocResultMixinBytes): ...
+
+class ParseResultBytes(_ParseResultBytesBase, _NetlocResultMixinBytes): ...
+
+
+def parse_qs(qs: str, keep_blank_values: bool = ..., strict_parsing: bool = ..., encoding: str = ..., errors: str = ...) -> Dict[str, List[str]]: ...
+
+def parse_qsl(qs: str, keep_blank_values: bool = ..., strict_parsing: bool = ..., encoding: str = ..., errors: str = ...) -> List[Tuple[str, str]]: ...
+
+ at overload
+def quote(string: str, safe: AnyStr = ..., encoding: str = ..., errors: str = ...) -> str: ...
+ at overload
+def quote(string: bytes, safe: AnyStr = ...) -> str: ...
+
+def quote_from_bytes(bs: bytes, safe: AnyStr = ...) -> str: ...
+
+ at overload
+def quote_plus(string: str, safe: AnyStr = ..., encoding: str = ..., errors: str = ...) -> str: ...
+ at overload
+def quote_plus(string: bytes, safe: AnyStr = ...) -> str: ...
+
+def unquote(string: str, encoding: str = ..., errors: str = ...) -> str: ...
+
+def unquote_to_bytes(string: AnyStr) -> bytes: ...
+
+def unquote_plus(string: str, encoding: str = ..., errors: str = ...) -> str: ...
+
+ at overload
+def urldefrag(url: str) -> DefragResult: ...
+ at overload
+def urldefrag(url: bytes) -> DefragResultBytes: ...
+
+def urlencode(query: Union[Mapping[Any, Any],
+                           Mapping[Any, Sequence[Any]],
+                           Sequence[Tuple[Any, Any]],
+                           Sequence[Tuple[Any, Sequence[Any]]]],
+              doseq: bool = ..., safe: AnyStr = ..., encoding: str = ..., errors: str = ...) -> str: ...
+
+def urljoin(base: AnyStr, url: AnyStr, allow_fragments: bool = ...) -> AnyStr: ...
+
+ at overload
+def urlparse(url: str, scheme: str = ..., allow_fragments: bool = ...) -> ParseResult: ...
+ at overload
+def urlparse(url: bytes, scheme: bytes = ..., allow_fragments: bool = ...) -> ParseResultBytes: ...
+
+ at overload
+def urlsplit(url: str, scheme: str = ..., allow_fragments: bool = ...) -> SplitResult: ...
+ at overload
+def urlsplit(url: bytes, scheme: bytes = ..., allow_fragments: bool = ...) -> SplitResultBytes: ...
+
+ at overload
+def urlunparse(components: Sequence[AnyStr]) -> AnyStr: ...
+ at overload
+def urlunparse(components: Tuple[AnyStr, AnyStr, AnyStr, AnyStr, AnyStr, AnyStr]) -> AnyStr: ...
+
+ at overload
+def urlunsplit(components: Sequence[AnyStr]) -> AnyStr: ...
+ at overload
+def urlunsplit(components: Tuple[AnyStr, AnyStr, AnyStr, AnyStr, AnyStr]) -> AnyStr: ...
diff --git a/typeshed/stdlib/3/urllib/request.pyi b/typeshed/stdlib/3/urllib/request.pyi
new file mode 100644
index 0000000..b8d2190
--- /dev/null
+++ b/typeshed/stdlib/3/urllib/request.pyi
@@ -0,0 +1,201 @@
+# Stubs for urllib.request (Python 3.4)
+
+from typing import (
+    Any, Callable, Dict, List, IO, Mapping, Optional, Sequence, Tuple, TypeVar,
+    Union, overload,
+)
+from http.client import HTTPResponse, HTTPMessage
+from http.cookiejar import CookieJar
+from email.message import Message
+from urllib.response import addinfourl
+import ssl
+import sys
+
+
+_T = TypeVar('_T')
+_UrlopenRet = Union[HTTPResponse, addinfourl]
+
+
+def urlopen(
+    url: Union[str, 'Request'], data: Optional[bytes] = ...,
+    timeout: float = ..., *, cafile: Optional[str] = ...,
+    capath: Optional[str] = ..., cadefault: bool = ...,
+    context: Optional[ssl.SSLContext] = ...
+) -> _UrlopenRet: ...
+def install_opener(opener: OpenerDirector) -> None: ...
+def build_opener(
+    *handlers: Union[BaseHandler, Callable[[], BaseHandler]]
+) -> OpenerDirector: ...
+def url2pathname(path: str) -> str: ...
+def pathname2url(path: str) -> str: ...
+def getproxies() -> Dict[str, str]: ...
+def parse_http_list(s: str) -> List[str]: ...
+
+class Request:
+    if sys.version_info >= (3, 4):
+        @property
+        def full_url(self) -> str: ...
+        @full_url.setter
+        def full_url(self, value: str) -> None: ...
+        @full_url.deleter
+        def full_url(self) -> None: ...
+    else:
+        full_url = ...  # type: str
+    type = ...  # type: str
+    host = ...  # type: str
+    origin_req_host = ...  # type: str
+    selector = ...  # type: str
+    data = ...  # type: Optional[bytes]
+    unverifiable = ...  # type: bool
+    method = ...  # type: Optional[str]
+    def __init__(self, url: str, data: Optional[bytes] = ...,
+            headers: Dict[str, str] =..., origin_req_host: Optional[str] = ...,
+            unverifiable: bool = ..., method: Optional[str] = ...) -> None: ...
+    def get_method(self) -> str: ...
+    def add_header(self, key: str, val: str) -> None: ...
+    def add_unredirected_header(self, key: str, val: str) -> None: ...
+    def has_header(self, header_name: str) -> bool: ...
+    if sys.version_info >= (3, 4):
+        def remove_header(self, header_name: str) -> None: ...
+    def get_full_url(self) -> str: ...
+    def set_proxy(self, host: str, type: str) -> None: ...
+    @overload
+    def get_header(self, header_name: str) -> Optional[str]: ...
+    @overload
+    def get_header(self, header_name: str, default: _T) -> Union[str, _T]: ...
+    def header_items(self) -> List[Tuple[str, str]]: ...
+
+class OpenerDirector:
+    def add_handler(self, handler: BaseHandler) -> None: ...
+    def open(self, url: Union[str, Request], data: Optional[bytes] = None,
+             timeout: float = ...) -> _UrlopenRet: ...
+    def error(self, proto: str, *args: Any) -> _UrlopenRet: ...
+
+
+class BaseHandler:
+    parent = ...  # type: OpenerDirector
+    def add_parent(self, parent: OpenerDirector) -> None: ...
+    def close(self) -> None: ...
+    def http_error_nnn(self, req: Request, fp: IO[str], code: int, msg: int,
+                       hdrs: Mapping[str, str]) -> _UrlopenRet: ...
+
+class HTTPDefaultErrorHandler(BaseHandler): ...
+
+class HTTPRedirectHandler(BaseHandler):
+    def redirect_request(self, req: Request, fp: IO[str], code: int, msg: int,
+                         hdrs: Mapping[str, str],
+                         newurl: str) -> Optional[Request]: ...
+    def http_error_301(self, req: Request, fp: IO[str], code: int, msg: int,
+                       hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+    def http_error_302(self, req: Request, fp: IO[str], code: int, msg: int,
+                       hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+    def http_error_303(self, req: Request, fp: IO[str], code: int, msg: int,
+                       hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+    def http_error_307(self, req: Request, fp: IO[str], code: int, msg: int,
+                       hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+
+class HTTPCookieProcessor(BaseHandler):
+    cookiejar = ...  # type: CookieJar
+    def __init__(self, cookiejar: Optional[CookieJar] = ...) -> None: ...
+
+class ProxyHandler(BaseHandler):
+    def __init__(self, proxies: Optional[Dict[str, str]] = ...) -> None: ...
+    # TODO add a method for every (common) proxy protocol
+
+class HTTPPasswordMgr:
+    def add_password(self, realm: str, uri: Union[str, Sequence[str]],
+                     user: str, passwd: str) -> None: ...
+    def find_user_password(self, realm: str, authuri: str) \
+                           -> Tuple[Optional[str], Optional[str]]: ...
+
+class HTTPPasswordMgrWithDefaultRealm:
+    def add_password(self, realm: str, uri: Union[str, Sequence[str]],
+                     user: str, passwd: str) -> None: ...
+    def find_user_password(self, realm: str, authuri: str) \
+                           -> Tuple[Optional[str], Optional[str]]: ...
+
+if sys.version_info >= (3, 5):
+    class HTTPPasswordMgrWithPriorAuth(HTTPPasswordMgrWithDefaultRealm):
+        def add_password(self, realm: str, uri: Union[str, Sequence[str]],
+                         user: str, passwd: str,
+                         is_authenticated: bool = ...) -> None: ...
+        def update_authenticated(self, uri: Union[str, Sequence[str]],
+                                 is_authenticated: bool = ...) -> None: ...
+        def is_authenticated(self, authuri: str) -> bool: ...
+
+class AbstractBasicAuthHandler:
+    def __init__(self,
+                 password_mgr: Optional[HTTPPasswordMgr] = ...) -> None: ...
+    def http_error_auth_reqed(self, authreq: str, host: str, req: Request,
+                              headers: Mapping[str, str]) -> None: ...
+
+class HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
+    def http_error_401(self, req: Request, fp: IO[str], code: int, msg: int,
+                       hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+
+class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
+    def http_error_407(self, req: Request, fp: IO[str], code: int, msg: int,
+                       hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+
+class AbstractDigestAuthHandler:
+    def __init__(self,
+                 password_mgr: Optional[HTTPPasswordMgr] = ...) -> None: ...
+    def http_error_auth_reqed(self, auth_header: str, host: str, req: Request,
+                              headers: Mapping[str, str]) -> None: ...
+
+class HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
+    def http_error_401(self, req: Request, fp: IO[str], code: int, msg: int,
+                       hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+
+class ProxyDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
+    def http_error_407(self, req: Request, fp: IO[str], code: int, msg: int,
+                       hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+
+class HTTPHandler(BaseHandler):
+    def http_open(self, req: Request) -> _UrlopenRet: ...
+
+class HTTPSHandler(BaseHandler):
+    def __init__(self, debuglevel: int = 0,
+                 context: Optional[ssl.SSLContext] = ...,
+                 check_hostname: bool = ...) -> None: ...
+    def https_open(self, req: Request) -> _UrlopenRet: ...
+
+class FileHandler(BaseHandler):
+    def file_open(self, req: Request) -> _UrlopenRet: ...
+
+class DataHandler(BaseHandler):
+    def data_open(self, req: Request) -> _UrlopenRet: ...
+
+class FTPHandler(BaseHandler):
+    def ftp_open(self, req: Request) -> _UrlopenRet: ...
+
+class CacheFTPHandler(FTPHandler):
+    def setTimeout(self, t: float) -> None: ...
+    def setMaxConns(self, m: int) -> None: ...
+
+class UnknownHandler(BaseHandler):
+    def unknown_open(self, req: Request) -> _UrlopenRet: ...
+
+class HTTPErrorProcessor(BaseHandler):
+    def http_response(self) -> _UrlopenRet: ...
+    def https_response(self) -> _UrlopenRet: ...
+
+
+def urlretrieve(url: str, filename: Optional[str] = ...,
+                reporthook: Optional[Callable[[int, int, int], None]] = ...,
+                data: Optional[bytes] = ...) -> Tuple[str, HTTPMessage]: ...
+def urlcleanup() -> None: ...
+
+class URLopener:
+    version = ...  # type: str
+    def __init__(self, proxies: Optional[Dict[str, str]] = ...,
+                 **x509: str) -> None: ...
+    def open(self, fullurl: str, data: Optional[bytes] = ...) -> _UrlopenRet: ...
+    def open_unknown(self, fullurl: str,
+                     data: Optional[bytes] = ...) -> _UrlopenRet: ...
+    def retrieve(self, url: str, filename: Optional[str] = ...,
+                 reporthook: Optional[Callable[[int, int, int], None]] = ...,
+                 data: Optional[bytes] = ...) -> Tuple[str, Optional[Message]]: ...
+
+class FancyURLopener(URLopener):
+    def prompt_user_passwd(self, host: str, realm: str) -> Tuple[str, str]: ...
diff --git a/typeshed/stdlib/3/urllib/response.pyi b/typeshed/stdlib/3/urllib/response.pyi
new file mode 100644
index 0000000..033bbaa
--- /dev/null
+++ b/typeshed/stdlib/3/urllib/response.pyi
@@ -0,0 +1,8 @@
+# private module, we only expose what's needed
+
+from typing import BinaryIO, Mapping, Optional
+from types import TracebackType
+
+class addinfourl(BinaryIO):
+    def info(self) -> Mapping[str, str]: ...
+    def geturl(self) -> str: ...
diff --git a/typeshed/stdlib/3/urllib/robotparser.pyi b/typeshed/stdlib/3/urllib/robotparser.pyi
new file mode 100644
index 0000000..36150ab
--- /dev/null
+++ b/typeshed/stdlib/3/urllib/robotparser.pyi
@@ -0,0 +1,18 @@
+# Stubs for urllib.robotparser (Python 3.4)
+
+from typing import Iterable, NamedTuple, Optional
+import sys
+
+_RequestRate = NamedTuple('_RequestRate', [('requests', int), ('seconds', int)])
+
+class RobotFileParser:
+    def __init__(self, url: str = ...) -> None: ...
+    def set_url(self, url: str) -> None: ...
+    def read(self) -> None: ...
+    def parse(self, lines: Iterable[str]) -> None: ...
+    def can_fetch(self, user_agent: str, url: str) -> bool: ...
+    def mtime(self) -> int: ...
+    def modified(self) -> None: ...
+    if sys.version_info >= (3, 6):
+        def crawl_delay(self, useragent: str) -> Optional[str]: ...
+        def request_rate(self, useragent: str) -> Optional[_RequestRate]: ...
diff --git a/typeshed/stdlib/3/uuid.pyi b/typeshed/stdlib/3/uuid.pyi
new file mode 100644
index 0000000..efd48e5
--- /dev/null
+++ b/typeshed/stdlib/3/uuid.pyi
@@ -0,0 +1,73 @@
+# Stubs for uuid
+
+from typing import Tuple
+
+Int = __builtins__.int
+Bytes = __builtins__.bytes
+FieldsType = Tuple[Int, Int, Int, Int, Int, Int]
+
+class UUID:
+    def __init__(self, hex: str=..., bytes: Bytes=..., bytes_le: Bytes=..., fields: FieldsType=..., int: Int=..., version: Int=...) -> None: ...
+
+    @property
+    def bytes(self) -> Bytes: ...
+
+    @property
+    def bytes_le(self) -> Bytes: ...
+
+    @property
+    def clock_seq(self) -> Int: ...
+
+    @property
+    def clock_seq_hi_variant(self) -> Int: ...
+
+    @property
+    def clock_seq_low(self) -> Int: ...
+
+    @property
+    def fields(self) -> FieldsType: ...
+
+    @property
+    def hex(self) -> str: ...
+
+    @property
+    def int(self) -> Int: ...
+
+    @property
+    def node(self) -> Int: ...
+
+    @property
+    def time(self) -> Int: ...
+
+    @property
+    def time_hi_version(self) -> Int: ...
+
+    @property
+    def time_low(self) -> Int: ...
+
+    @property
+    def time_mid(self) -> Int: ...
+
+    @property
+    def urn(self) -> str: ...
+
+    @property
+    def variant(self) -> str: ...
+
+    @property
+    def version(self) -> str: ...
+
+def getnode() -> Int: ...
+def uuid1(node: Int=..., clock_seq: Int=...) -> UUID: ...
+def uuid3(namespace: UUID, name: str) -> UUID: ...
+def uuid4() -> UUID: ...
+def uuid5(namespace: UUID, name: str) -> UUID: ...
+
+NAMESPACE_DNS = ...  # type: UUID
+NAMESPACE_URL = ...  # type: UUID
+NAMESPACE_OID = ...  # type: UUID
+NAMESPACE_X500 = ...  # type: UUID
+RESERVED_NCS = ...  # type: str
+RFC_4122 = ...  # type: str
+RESERVED_MICROSOFT = ...  # type: str
+RESERVED_FUTURE = ...  # type: str
diff --git a/typeshed/stdlib/3/weakref.pyi b/typeshed/stdlib/3/weakref.pyi
new file mode 100644
index 0000000..6c4981a
--- /dev/null
+++ b/typeshed/stdlib/3/weakref.pyi
@@ -0,0 +1,120 @@
+# Stubs for weakref
+
+# NOTE: These are incomplete!
+
+from typing import (
+    TypeVar, Generic, Any, Callable, overload, Mapping, Iterator, Dict, Tuple,
+    Iterable, Optional
+)
+
+_T = TypeVar('_T')
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+class ReferenceType(Generic[_T]):
+    # TODO rest of members
+    def __init__(self, o: _T, callback: Callable[[ReferenceType[_T]],
+                                           Any] = ...) -> None: ...
+    def __call__(self) -> Optional[_T]: ...
+
+ref = ReferenceType
+
+# TODO callback
+def proxy(object: _T) -> _T: ...
+
+class WeakValueDictionary(Generic[_KT, _VT]):
+    # TODO tuple iterable argument?
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, map: Mapping[_KT, _VT]) -> None: ...
+
+    def __len__(self) -> int: ...
+    def __getitem__(self, k: _KT) -> _VT: ...
+    def __setitem__(self, k: _KT, v: _VT) -> None: ...
+    def __delitem__(self, v: _KT) -> None: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_KT]: ...
+    def __str__(self) -> str: ...
+
+    def clear(self) -> None: ...
+    def copy(self) -> Dict[_KT, _VT]: ...
+
+    @overload
+    def get(self, k: _KT) -> _VT: ...
+    @overload
+    def get(self, k: _KT, default: _VT) -> _VT: ...
+
+    @overload
+    def pop(self, k: _KT) -> _VT: ...
+    @overload
+    def pop(self, k: _KT, default: _VT) -> _VT: ...
+
+    def popitem(self) -> Tuple[_KT, _VT]: ...
+
+    @overload
+    def setdefault(self, k: _KT) -> _VT: ...
+    @overload
+    def setdefault(self, k: _KT, default: _VT) -> _VT: ...
+
+    @overload
+    def update(self, m: Mapping[_KT, _VT]) -> None: ...
+    @overload
+    def update(self, m: Iterable[Tuple[_KT, _VT]]) -> None: ...
+
+    # NOTE: incompatible with Mapping
+    def keys(self) -> Iterator[_KT]: ...
+    def values(self) -> Iterator[_VT]: ...
+    def items(self) -> Iterator[Tuple[_KT, _VT]]: ...
+
+    # TODO return type
+    def valuerefs(self) -> Iterable[Any]: ...
+
+
+class WeakKeyDictionary(Generic[_KT, _VT]):
+    # TODO tuple iterable argument?
+    @overload
+    def __init__(self) -> None: ...
+    @overload
+    def __init__(self, map: Mapping[_KT, _VT]) -> None: ...
+
+    def __len__(self) -> int: ...
+    def __getitem__(self, k: _KT) -> _VT: ...
+    def __setitem__(self, k: _KT, v: _VT) -> None: ...
+    def __delitem__(self, v: _KT) -> None: ...
+    def __contains__(self, o: object) -> bool: ...
+    def __iter__(self) -> Iterator[_KT]: ...
+    def __str__(self) -> str: ...
+
+    def clear(self) -> None: ...
+    def copy(self) -> Dict[_KT, _VT]: ...
+
+    @overload
+    def get(self, k: _KT) -> _VT: ...
+    @overload
+    def get(self, k: _KT, default: _VT) -> _VT: ...
+
+    @overload
+    def pop(self, k: _KT) -> _VT: ...
+    @overload
+    def pop(self, k: _KT, default: _VT) -> _VT: ...
+
+    def popitem(self) -> Tuple[_KT, _VT]: ...
+
+    @overload
+    def setdefault(self, k: _KT) -> _VT: ...
+    @overload
+    def setdefault(self, k: _KT, default: _VT) -> _VT: ...
+
+    @overload
+    def update(self, m: Mapping[_KT, _VT]) -> None: ...
+    @overload
+    def update(self, m: Iterable[Tuple[_KT, _VT]]) -> None: ...
+
+    # NOTE: incompatible with Mapping
+    def keys(self) -> Iterator[_KT]: ...
+    def values(self) -> Iterator[_VT]: ...
+    def items(self) -> Iterator[Tuple[_KT, _VT]]: ...
+
+    # TODO return type
+    def valuerefs(self) -> Iterable[Any]: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3/wsgiref/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3/wsgiref/__init__.pyi
diff --git a/typeshed/stdlib/3/wsgiref/validate.pyi b/typeshed/stdlib/3/wsgiref/validate.pyi
new file mode 100644
index 0000000..bd7fd16
--- /dev/null
+++ b/typeshed/stdlib/3/wsgiref/validate.pyi
@@ -0,0 +1,47 @@
+# Stubs for wsgiref.validate (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class WSGIWarning(Warning): ...
+
+def validator(application): ...
+
+class InputWrapper:
+    input = ...  # type: Any
+    def __init__(self, wsgi_input): ...
+    def read(self, *args): ...
+    def readline(self, *args): ...
+    def readlines(self, *args): ...
+    def __iter__(self): ...
+    def close(self): ...
+
+class ErrorWrapper:
+    errors = ...  # type: Any
+    def __init__(self, wsgi_errors): ...
+    def write(self, s): ...
+    def flush(self): ...
+    def writelines(self, seq): ...
+    def close(self): ...
+
+class WriteWrapper:
+    writer = ...  # type: Any
+    def __init__(self, wsgi_writer): ...
+    def __call__(self, s): ...
+
+class PartialIteratorWrapper:
+    iterator = ...  # type: Any
+    def __init__(self, wsgi_iterator): ...
+    def __iter__(self): ...
+
+class IteratorWrapper:
+    original_iterator = ...  # type: Any
+    iterator = ...  # type: Any
+    closed = ...  # type: Any
+    check_start_response = ...  # type: Any
+    def __init__(self, wsgi_iterator, check_start_response): ...
+    def __iter__(self): ...
+    def __next__(self): ...
+    def close(self): ...
+    def __del__(self): ...
diff --git a/typeshed/stdlib/3/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..ef1a591
--- /dev/null
+++ b/typeshed/stdlib/3/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from .ElementTree import _ElementInterface
+
+XINCLUDE = ...  # type: str
+XINCLUDE_INCLUDE = ...  # type: str
+XINCLUDE_FALLBACK = ...  # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, _ElementInterface]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: _ElementInterface, loader: Callable[..., Union[str, _ElementInterface]]=...) -> None: ...
diff --git a/typeshed/stdlib/3/xml/etree/ElementPath.pyi b/typeshed/stdlib/3/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..db0aa36
--- /dev/null
+++ b/typeshed/stdlib/3/xml/etree/ElementPath.pyi
@@ -0,0 +1,25 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Tuple, List, Union, TypeVar, Callable, Optional
+from .ElementTree import _ElementInterface
+
+xpath_tokenizer_re = ...  # type: Callable[..., List[Tuple[str, str]]]
+
+
+class xpath_descendant_or_self: ...
+
+_T = TypeVar('_T')
+
+class Path:
+    def __init__(self, path: str) -> None: ...
+    def find(self, element: _ElementInterface) -> Optional[_ElementInterface]: ...
+    def findtext(self, element: _ElementInterface, default: _T=...) -> Union[str, _T]: ...
+    def findall(self, element: _ElementInterface) -> List[_ElementInterface]: ...
+
+def find(element: _ElementInterface, path: str) -> Optional[_ElementInterface]: ...
+
+def findtext(element: _ElementInterface, path: str, default: _T=...) -> Union[str, _T]: ...
+
+def findall(element: _ElementInterface, path: str) -> List[_ElementInterface]: ...
diff --git a/typeshed/stdlib/3/xml/etree/ElementTree.pyi b/typeshed/stdlib/3/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..6f26818
--- /dev/null
+++ b/typeshed/stdlib/3/xml/etree/ElementTree.pyi
@@ -0,0 +1,98 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, KeysView, ItemsView, Generator
+import io
+
+VERSION = ...  # type: str
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class _ElementInterface(Sequence['_ElementInterface']):
+    tag = ...  # type: _str_or_bytes
+    attrib = ...  # type: Dict[_str_or_bytes, _str_or_bytes]
+    text = ...  # type: Optional[_str_or_bytes]
+    tail = ...  # type: Optional[_str_or_bytes]
+    def __init__(self, tag: Union[AnyStr, Callable[..., '_ElementInterface']], attrib: Dict[AnyStr, AnyStr]) -> None: ...
+    def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> '_ElementInterface': ...
+    def __len__(self) -> int: ...
+    def __getitem__(self, index: int) -> '_ElementInterface': ...
+    def __setitem__(self, index: int, element: '_ElementInterface') -> None: ...
+    def __delitem__(self, index: int) -> None: ...
+    def __getslice__(self, start: int, stop: int) -> Sequence['_ElementInterface']: ...
+    def __setslice__(self, start: int, stop: int, elements: Sequence['_ElementInterface']) -> None: ...
+    def __delslice__(self, start: int, stop: int) -> None: ...
+    def append(self, element: '_ElementInterface') -> None: ...
+    def insert(self, index: int, element: '_ElementInterface') -> None: ...
+    def remove(self, element: '_ElementInterface') -> None: ...
+    def getchildren(self) -> List['_ElementInterface']: ...
+    def find(self, path: str) -> Optional['_ElementInterface']: ...
+    def findtext(self, path: str, default: _T=...) -> Union[str, _T]: ...
+    def findall(self, path: str) -> List['_ElementInterface']: ...
+    def clear(self) -> None: ...
+    def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+    def set(self, key: AnyStr, value: AnyStr) -> None: ...
+    def keys(self) -> KeysView[AnyStr]: ...
+    def items(self) -> ItemsView[AnyStr, AnyStr]: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List['_ElementInterface']: ...
+
+def Element(tag: Union[AnyStr, Callable[..., _ElementInterface]], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> _ElementInterface: ...
+def SubElement(parent: _ElementInterface, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> _ElementInterface: ...
+def Comment(text: _str_or_bytes=...) -> _ElementInterface: ...
+def ProcessingInstruction(target: str, text: str=...) -> _ElementInterface: ...
+
+PI = ...  # type: Callable[..., _ElementInterface]
+
+class QName:
+    text = ...  # type: str
+    def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+    def __init__(self, element: _ElementInterface=..., file: _file_or_filename=...) -> None: ...
+    def getroot(self) -> _ElementInterface: ...
+    def parse(self, source: _file_or_filename, parser: 'XMLTreeBuilder'=...) -> _ElementInterface: ...
+    def getiterator(self, tag: Union[str, AnyStr]=...) -> List[_ElementInterface]: ...
+    def find(self, path: str) -> Optional[_ElementInterface]: ...
+    def findtext(self, path: str, default: _T=...) -> Union[_T, str]: ...
+    def findall(self, path: str) -> List[_ElementInterface]: ...
+    def write(self, file_or_filename: _file_or_filename, encoding: str=...) -> None: ...
+
+def iselement(element: _ElementInterface) -> bool: ...
+def dump(elem: _ElementInterface) -> None: ...
+def fixtag(tag: Union[str, QName], namespaces: Dict[str, str]) -> Tuple[str, Optional[str]]: ...
+def parse(source: _file_or_filename, parser: 'XMLTreeBuilder'=...) -> ElementTree: ...
+
+
+class iterparse:
+    def __init__(self, source: _file_or_filename, events: Sequence[str]=...) -> None: ...
+    # TODO-figure out this type...
+    def __next__(self) -> Tuple[str, _ElementInterface]: ...
+
+def XML(text: AnyStr) -> _ElementInterface: ...
+def XMLID(text: AnyStr) -> Tuple[_ElementInterface, Dict[str, _ElementInterface]]: ...
+
+# TODO-improve this type
+fromstring = ...  # type: Callable[..., _ElementInterface]
+
+def tostring(element: _ElementInterface, encoding: str=...) -> AnyStr: ...
+
+class TreeBuilder:
+    def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], _ElementInterface]=...) -> None: ...
+    def close(self) -> _ElementInterface: ...
+    def data(self, data: AnyStr) -> None: ...
+    def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> _ElementInterface: ...
+    def end(self, tag: AnyStr) -> _ElementInterface: ...
+
+class XMLTreeBuilder:
+    # TODO-what is entity used for???
+    entity = ...  # type: Any
+    def __init__(self, html: int=..., target: TreeBuilder=...) -> None: ...
+    def doctype(self, name: str, pubid: str, system: str) -> None: ...
+    def close(self) -> Any: ...  # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+    def feed(self, data: AnyStr)-> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3/xml/etree/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/3/xml/etree/cElementTree.pyi b/typeshed/stdlib/3/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/3/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import *  # noqa: F403
diff --git a/typeshed/stdlib/3/zlib.pyi b/typeshed/stdlib/3/zlib.pyi
new file mode 100644
index 0000000..39db843
--- /dev/null
+++ b/typeshed/stdlib/3/zlib.pyi
@@ -0,0 +1,46 @@
+# Stubs for zlib
+
+DEFLATED = ...  # type: int
+DEF_BUF_SIZE = ...  # type: int
+DEF_MEM_LEVEL = ...  # type: int
+MAX_WBITS = ...  # type: int
+ZLIB_RUNTIME_VERSION = ...  # type: str
+ZLIB_VERSION = ...  # type: str
+Z_BEST_COMPRESSION = ...  # type: int
+Z_BEST_SPEED = ...  # type: int
+Z_DEFAULT_COMPRESSION = ...  # type: int
+Z_DEFAULT_STRATEGY = ...  # type: int
+Z_FILTERED = ...  # type: int
+Z_FINISH = ...  # type: int
+Z_FULL_FLUSH = ...  # type: int
+Z_HUFFMAN_ONLY = ...  # type: int
+Z_NO_FLUSH = ...  # type: int
+Z_SYNC_FLUSH = ...  # type: int
+
+
+class error(Exception): ...
+
+
+class Compress:
+    def compress(self, data: bytes) -> bytes: ...
+    def flush(self, mode: int = ...) -> bytes: ...
+    def copy(self) -> "Compress": ...
+
+
+class Decompress:
+    unused_data = ...  # type: bytes
+    unconsumed_tail = ...  # type: bytes
+    eof = ...  # type: bool
+    def decompress(self, data: bytes, max_length: int = ...) -> bytes: ...
+    def flush(self, length: int = ...) -> bytes: ...
+    def copy(self) -> "Decompress": ...
+
+
+def adler32(data: bytes, value: int = ...) -> int: ...
+def compress(data: bytes, level: int = ...) -> bytes: ...
+def compressobj(level: int = ..., method: int = ..., wbits: int = ...,
+                memlevel: int = ..., strategy: int = ...,
+                zdict: bytes = ...) -> Compress: ...
+def crc32(data: bytes, value: int = ...) -> int: ...
+def decompress(data: bytes, wbits: int = ..., bufsize: int = ...) -> bytes: ...
+def decompressobj(wbits: int = ..., zdict: bytes = ...) -> Decompress: ...
diff --git a/typeshed/tests/mypy_test.py b/typeshed/tests/mypy_test.py
new file mode 100755
index 0000000..d474009
--- /dev/null
+++ b/typeshed/tests/mypy_test.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python3
+"""Test runner for typeshed.
+
+Depends on mypy being installed.
+
+Approach:
+
+1. Parse sys.argv
+2. Compute appropriate arguments for mypy
+3. Stuff those arguments into sys.argv
+4. Run mypy.main('')
+5. Repeat steps 2-4 for other mypy runs (e.g. --py2)
+"""
+
+import os
+import re
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(description="Test runner for typeshed. "
+                                             "Patterns are unanchored regexps on the full path.")
+parser.add_argument('-v', '--verbose', action='count', default=0, help="More output")
+parser.add_argument('-n', '--dry-run', action='store_true', help="Don't actually run mypy")
+parser.add_argument('-x', '--exclude', type=str, nargs='*', help="Exclude pattern")
+parser.add_argument('-p', '--python-version', type=str, nargs='*',
+                    help="These versions only (major[.minor])")
+parser.add_argument('filter', type=str, nargs='*', help="Include pattern (default all)")
+
+
+def log(args, *varargs):
+    if args.verbose >= 2:
+        print(*varargs)
+
+
+def match(fn, args, blacklist):
+    if blacklist.match(fn):
+        log(args, fn, 'exluded by blacklist')
+        return False
+    if not args.filter and not args.exclude:
+        log(args, fn, 'accept by default')
+        return True
+    if args.exclude:
+        for f in args.exclude:
+            if re.search(f, fn):
+                log(args, fn, 'excluded by pattern', f)
+                return False
+    if args.filter:
+        for f in args.filter:
+            if re.search(f, fn):
+                log(args, fn, 'accepted by pattern', f)
+                return True
+    if args.filter:
+        log(args, fn, 'rejected (no pattern matches)')
+        return False
+    log(args, fn, 'accepted (no exclude pattern matches)')
+    return True
+
+
+def libpath(major, minor):
+    versions = ['%d.%d' % (major, minor)
+                for minor in reversed(range(minor + 1))]
+    versions.append(str(major))
+    versions.append('2and3')
+    paths = []
+    for v in versions:
+        for top in ['stdlib', 'third_party']:
+            p = os.path.join(top, v)
+            if os.path.isdir(p):
+                paths.append(p)
+    return paths
+
+
+def main():
+    args = parser.parse_args()
+
+    with open(os.path.join(os.path.dirname(__file__), "mypy_blacklist.txt")) as f:
+        blacklist = re.compile("(%s)$" % "|".join(
+            re.findall(r"^\s*([^\s#]+)\s*(?:#.*)?$", f.read(), flags=re.M)))
+
+    try:
+        from mypy.main import main as mypy_main
+    except ImportError:
+        print("Cannot import mypy. Did you install it?")
+        sys.exit(1)
+
+    versions = [(3, 6), (3, 5), (3, 4), (3, 3), (3, 2), (2, 7)]
+    if args.python_version:
+        versions = [v for v in versions
+                    if any(('%d.%d' % v).startswith(av) for av in args.python_version)]
+        if not versions:
+            print("--- no versions selected ---")
+            sys.exit(1)
+
+    code = 0
+    runs = 0
+    for major, minor in versions:
+        roots = libpath(major, minor)
+        files = []
+        seen = {'__builtin__', 'builtins', 'typing'}  # Always ignore these.
+        for root in roots:
+            names = os.listdir(root)
+            for name in names:
+                full = os.path.join(root, name)
+                mod, ext = os.path.splitext(name)
+                if mod in seen or mod.startswith('.'):
+                    continue
+                if ext in ['.pyi', '.py']:
+                    if match(full, args, blacklist):
+                        seen.add(mod)
+                        files.append(full)
+                elif (os.path.isfile(os.path.join(full, '__init__.pyi')) or
+                      os.path.isfile(os.path.join(full, '__init__.py'))):
+                    for r, ds, fs in os.walk(full):
+                        ds.sort()
+                        fs.sort()
+                        for f in fs:
+                            m, x = os.path.splitext(f)
+                            if x in ['.pyi', '.py']:
+                                fn = os.path.join(r, f)
+                                if match(fn, args, blacklist):
+                                    seen.add(mod)
+                                    files.append(fn)
+        if files:
+            runs += 1
+            flags = ['--python-version', '%d.%d' % (major, minor)]
+            flags.append('--strict-optional')
+            if (major, minor) >= (3, 6):
+                flags.append('--fast-parser')
+            # flags.append('--warn-unused-ignores')  # Fast parser and regular parser disagree.
+            sys.argv = ['mypy'] + flags + files
+            if args.verbose:
+                print("running", ' '.join(sys.argv))
+            else:
+                print("running mypy", ' '.join(flags), "# with", len(files), "files")
+            try:
+                if not args.dry_run:
+                    mypy_main('')
+            except SystemExit as err:
+                code = max(code, err.code)
+    if code:
+        print("--- exit status", code, "---")
+        sys.exit(code)
+    if not runs:
+        print("--- nothing to do; exit 1 ---")
+        sys.exit(1)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/typeshed/tests/pytype_test.py b/typeshed/tests/pytype_test.py
new file mode 100755
index 0000000..e7475c0
--- /dev/null
+++ b/typeshed/tests/pytype_test.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+"""Test runner for typeshed.
+
+Depends on mypy and pytype being installed.
+
+If pytype is installed:
+    1. For every pyi, run "pytd <foo.pyi>" in a separate process
+"""
+
+import os
+import re
+import sys
+import argparse
+import subprocess
+import collections
+
+parser = argparse.ArgumentParser(description="Pytype tests.")
+parser.add_argument('-n', '--dry-run', action='store_true', help="Don't actually run tests")
+parser.add_argument('--num-parallel', type=int, default=1,
+                    help="Number of test processes to spawn")
+
+
+def main():
+    args = parser.parse_args()
+    code, runs = pytype_test(args)
+
+    if code:
+        print("--- exit status %d ---" % code)
+        sys.exit(code)
+    if not runs:
+        print("--- nothing to do; exit 1 ---")
+        sys.exit(1)
+
+
+def load_blacklist():
+    filename = os.path.join(os.path.dirname(__file__), "pytype_blacklist.txt")
+    regex = r"^\s*([^\s#]+)\s*(?:#.*)?$"
+
+    with open(filename) as f:
+        return re.findall(regex, f.read(), flags=re.M)
+
+
+class PytdRun(object):
+    def __init__(self, args, dry_run=False):
+        self.args = args
+        self.dry_run = dry_run
+        self.results = None
+
+        if dry_run:
+            self.results = (0, "", "")
+        else:
+            self.proc = subprocess.Popen(
+                ["pytd"] + args,
+                stdout=subprocess.PIPE,
+                stderr=subprocess.PIPE)
+
+    def communicate(self):
+        if self.results:
+            return self.results
+
+        stdout, stderr = self.proc.communicate()
+        self.results = self.proc.returncode, stdout, stderr
+        return self.results
+
+
+def pytype_test(args):
+    try:
+        PytdRun(["-h"]).communicate()
+    except OSError:
+        print("Cannot run pytd. Did you install pytype?")
+        return 0, 0
+
+    wanted = re.compile(r"stdlib/(2|2\.7|2and3)/.*\.pyi$")
+    skipped = re.compile("(%s)$" % "|".join(load_blacklist()))
+    files = []
+
+    for root, _, filenames in os.walk("stdlib"):
+        for f in sorted(filenames):
+            f = os.path.join(root, f)
+            if wanted.search(f) and not skipped.search(f):
+                files.append(f)
+
+    running_tests = collections.deque()
+    max_code, runs, errors = 0, 0, 0
+    print("Running pytype tests...")
+    while 1:
+        while files and len(running_tests) < args.num_parallel:
+            test_run = PytdRun([files.pop()], dry_run=args.dry_run)
+            running_tests.append(test_run)
+
+        if not running_tests:
+            break
+
+        test_run = running_tests.popleft()
+        code, stdout, stderr = test_run.communicate()
+        max_code = max(max_code, code)
+        runs += 1
+
+        if code:
+            print("pytd error processing \"%s\":" % test_run.args[0])
+            print(stderr)
+            errors += 1
+
+    print("Ran pytype with %d pyis, got %d errors." % (runs, errors))
+    return max_code, runs
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/OpenSSL/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/OpenSSL/__init__.pyi
diff --git a/typeshed/third_party/2/OpenSSL/crypto.pyi b/typeshed/third_party/2/OpenSSL/crypto.pyi
new file mode 100644
index 0000000..ef352ac
--- /dev/null
+++ b/typeshed/third_party/2/OpenSSL/crypto.pyi
@@ -0,0 +1,6 @@
+class X509:
+    ...
+
+def sign(key: str, data: str, digest: str) -> str: ...
+def verify(certificate: X509, signature: str, data: str, digest: str) -> None:
+    raise Exception()
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/concurrent/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/concurrent/__init__.pyi
diff --git a/typeshed/third_party/2/concurrent/futures/__init__.pyi b/typeshed/third_party/2/concurrent/futures/__init__.pyi
new file mode 100644
index 0000000..8e915ae
--- /dev/null
+++ b/typeshed/third_party/2/concurrent/futures/__init__.pyi
@@ -0,0 +1,37 @@
+from typing import TypeVar, Generic, Any, Iterable, Iterator, Callable, Tuple, Union
+
+_T = TypeVar('_T')
+
+class Future(Generic[_T]):
+    def cancel(self) -> bool: ...
+    def cancelled(self) -> bool: ...
+    def running(self) -> bool: ...
+    def done(self) -> bool: ...
+    def result(self, timeout: float = ...) -> _T: ...
+    def exception(self, timeout: float = ...) -> Exception: ...
+    def add_done_callback(self, fn: Callable[[Future], Any]) -> None: ...
+
+    def set_running_or_notify_cancel(self) -> None: ...
+    def set_result(self, result: _T) -> None: ...
+    def set_exception(self, exception: Exception) -> None: ...
+
+class Executor:
+    def submit(self, fn: Callable[..., _T], *args: Any, **kwargs: Any) -> Future[_T]: ...
+    def map(self, func: Callable[..., _T], *iterables: Any, timeout: float = ...) -> Iterable[_T]: ...
+    def shutdown(self, wait: bool = ...) -> None: ...
+    def __enter__(self) -> Executor: ...
+    def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool: ...
+
+class ThreadPoolExecutor(Executor):
+    def __init__(self, max_workers: int) -> None: ...
+
+class ProcessPoolExecutor(Executor):
+    def __init__(self, max_workers: Union[int, None] = ...) -> None: ...
+
+def wait(fs: Iterable[Future], timeout: float = ..., return_when: str = ...) -> Tuple[Iterable[Future], Iterable[Future]]: ...
+
+FIRST_COMPLETED = ...  # type: str
+FIRST_EXCEPTION = ...  # type: str
+ALL_COMPLETED = ...  # type: str
+
+def as_completed(fs: Iterable[Future], timeout: float = ...) -> Iterator[Future]: ...
diff --git a/typeshed/third_party/2/croniter.pyi b/typeshed/third_party/2/croniter.pyi
new file mode 100644
index 0000000..2495495
--- /dev/null
+++ b/typeshed/third_party/2/croniter.pyi
@@ -0,0 +1,27 @@
+# Stubs for croniter.croniter (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class croniter:
+    MONTHS_IN_YEAR = ...  # type: Any
+    RANGES = ...  # type: Any
+    DAYS = ...  # type: Any
+    ALPHACONV = ...  # type: Any
+    LOWMAP = ...  # type: Any
+    bad_length = ...  # type: Any
+    tzinfo = ...  # type: Any
+    cur = ...  # type: Any
+    exprs = ...  # type: Any
+    expanded = ...  # type: Any
+    def __init__(self, expr_format, start_time=..., ret_type=...) -> None: ...
+    def get_next(self, ret_type=...): ...
+    def get_prev(self, ret_type=...): ...
+    def get_current(self, ret_type=...): ...
+    def __iter__(self): ...
+    __next__ = ...  # type: Any
+    def all_next(self, ret_type=...): ...
+    def all_prev(self, ret_type=...): ...
+    iter = ...  # type: Any
+    def is_leap(self, year): ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/dateutil/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/dateutil/__init__.pyi
diff --git a/typeshed/third_party/2/dateutil/parser.pyi b/typeshed/third_party/2/dateutil/parser.pyi
new file mode 100644
index 0000000..d2927e8
--- /dev/null
+++ b/typeshed/third_party/2/dateutil/parser.pyi
@@ -0,0 +1,39 @@
+from typing import List, Tuple, Optional, Callable, Union, IO, Any, Dict
+from datetime import datetime, tzinfo
+
+__all__ = ...  # type: List[str]
+
+
+class parserinfo(object):
+    JUMP = ...  # type: List[str]
+    WEEKDAYS = ...  # type: List[Tuple[str, str]]
+    MONTHS = ...  # type: List[Tuple[str, str]]
+    HMS = ...  # type: List[Tuple[str, str, str]]
+    AMPM = ...  # type: List[Tuple[str, str]]
+    UTCZONE = ...  # type: List[str]
+    PERTAIN = ...  # type: List[str]
+    TZOFFSET = ...  # type: Dict[str, int]
+
+    def __init__(self, dayfirst: bool=..., yearfirst: bool=...) -> None: ...
+    def jump(self, name: unicode) -> bool: ...
+    def weekday(self, name: unicode) -> Union[int, None]: ...
+    def month(self, name: unicode) -> Union[int, None]: ...
+    def hms(self, name: unicode) -> Union[int, None]: ...
+    def ampm(self, name: unicode) -> Union[int, None]: ...
+    def pertain(self, name: unicode) -> bool: ...
+    def utczone(self, name: unicode) -> bool: ...
+    def tzoffset(self, name: unicode) -> Union[int, None]: ...
+    def convertyear(self, year: int) -> int: ...
+    def validate(self, res: datetime) -> bool: ...
+
+class parser(object):
+    def __init__(self, info: parserinfo = None) -> None: ...
+    def parse(self, timestr: Union[str, unicode, IO[unicode]],
+              default: datetime = None,
+              ignoretz: bool = ..., tzinfos: Dict[Union[str, unicode], tzinfo] = None,
+              **kwargs: Any) -> datetime: ...
+
+DEFAULTPARSER = ...  # type: parser
+def parse(timestr: Union[str, unicode, IO[unicode]],
+          parserinfo: parserinfo = None,
+          **kwargs: Any) -> datetime: ...
diff --git a/typeshed/third_party/2/dateutil/relativedelta.pyi b/typeshed/third_party/2/dateutil/relativedelta.pyi
new file mode 100644
index 0000000..3a99eaf
--- /dev/null
+++ b/typeshed/third_party/2/dateutil/relativedelta.pyi
@@ -0,0 +1,86 @@
+from typing import Any, Optional, Union
+from datetime import date, datetime, timedelta
+
+__all__ = ...  # type: List[str]
+
+
+class weekday(object):
+    def __init__(self, weekday: int, n: Optional[int]=...) -> None: ...
+
+    def __call__(self, n: int) -> 'weekday': ...
+
+    def __eq__(self, other) -> bool: ...
+
+    def __repr__(self) -> str: ...
+
+    weekday = ...  # type: int
+    n = ...  # type: int
+
+MO = ...  # type: weekday
+TU = ...  # type: weekday
+WE = ...  # type: weekday
+TH = ...  # type: weekday
+FR = ...  # type: weekday
+SA = ...  # type: weekday
+SU = ...  # type: weekday
+
+
+class relativedelta(object):
+    def __init__(self,
+                 dt1: Optional[date]=...,
+                 dt2: Optional[date]=...,
+                 years: Optional[int]=..., months: Optional[int]=...,
+                 days: Optional[int]=..., leapdays: Optional[int]=...,
+                 weeks: Optional[int]=...,
+                 hours: Optional[int]=..., minutes: Optional[int]=...,
+                 seconds: Optional[int]=..., microseconds: Optional[int]=...,
+                 year: Optional[int]=..., month: Optional[int]=...,
+                 day: Optional[int]=...,
+                 weekday: Optional[Union[int, weekday]]=...,
+                 yearday: Optional[int]=...,
+                 nlyearday: Optional[int]=...,
+                 hour: Optional[int]=..., minute: Optional[int]=...,
+                 second: Optional[int]=...,
+                 microsecond: Optional[int]=...) -> None: ...
+
+    @property
+    def weeks(self) -> int: ...
+
+    @weeks.setter
+    def weeks(self, value: int) -> None: ...
+
+    def normalized(self) -> 'relativedelta': ...
+
+    def __add__(
+        self,
+        other: Union['relativedelta', timedelta, date, datetime]) -> 'relativedelta': ...
+
+    def __radd__(
+        self,
+        other: Any) -> 'relativedelta': ...
+
+    def __rsub__(
+        self,
+        other: Any) -> 'relativedelta': ...
+
+    def __sub__(self, other: 'relativedelta') -> 'relativedelta': ...
+
+    def __neg__(self) -> 'relativedelta': ...
+
+    def __bool__(self) -> bool: ...
+
+    def __nonzero__(self) -> bool: ...
+
+    def __mul__(self, other: float) -> 'relativedelta': ...
+
+    def __rmul__(self, other: float) -> 'relativedelta': ...
+
+    def __eq__(self, other) -> bool: ...
+
+    def __ne__(self, other: object) -> bool: ...
+
+    def __div__(self, other: float) -> 'relativedelta': ...
+
+    def __truediv__(self, other: float) -> 'relativedelta': ...
+
+    def __repr__(self) -> str: ...
diff --git a/typeshed/third_party/2/enum.pyi b/typeshed/third_party/2/enum.pyi
new file mode 100644
index 0000000..4032e81
--- /dev/null
+++ b/typeshed/third_party/2/enum.pyi
@@ -0,0 +1,19 @@
+from typing import List, Any, TypeVar
+
+class Enum:
+    def __new__(cls, value: Any) -> None: ...
+    def __repr__(self) -> str: ...
+    def __str__(self) -> str: ...
+    def __dir__(self) -> List[str]: ...
+    def __format__(self, format_spec: str) -> str: ...
+    def __hash__(self) -> Any: ...
+    def __reduce_ex__(self, proto: Any) -> Any: ...
+
+    name = ...  # type: str
+    value = ...  # type: Any
+
+class IntEnum(int, Enum): ...
+
+_T = TypeVar('_T')
+
+def unique(enumeration: _T) -> _T: ...
diff --git a/typeshed/third_party/2/fb303/FacebookService.pyi b/typeshed/third_party/2/fb303/FacebookService.pyi
new file mode 100644
index 0000000..09c6ef1
--- /dev/null
+++ b/typeshed/third_party/2/fb303/FacebookService.pyi
@@ -0,0 +1,301 @@
+# Stubs for fb303.FacebookService (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from thrift.Thrift import TProcessor
+
+fastbinary = ...  # type: Any
+
+class Iface:
+    def getName(self): ...
+    def getVersion(self): ...
+    def getStatus(self): ...
+    def getStatusDetails(self): ...
+    def getCounters(self): ...
+    def getCounter(self, key): ...
+    def setOption(self, key, value): ...
+    def getOption(self, key): ...
+    def getOptions(self): ...
+    def getCpuProfile(self, profileDurationInSec): ...
+    def aliveSince(self): ...
+    def reinitialize(self): ...
+    def shutdown(self): ...
+
+class Client(Iface):
+    def __init__(self, iprot, oprot=...) -> None: ...
+    def getName(self): ...
+    def send_getName(self): ...
+    def recv_getName(self): ...
+    def getVersion(self): ...
+    def send_getVersion(self): ...
+    def recv_getVersion(self): ...
+    def getStatus(self): ...
+    def send_getStatus(self): ...
+    def recv_getStatus(self): ...
+    def getStatusDetails(self): ...
+    def send_getStatusDetails(self): ...
+    def recv_getStatusDetails(self): ...
+    def getCounters(self): ...
+    def send_getCounters(self): ...
+    def recv_getCounters(self): ...
+    def getCounter(self, key): ...
+    def send_getCounter(self, key): ...
+    def recv_getCounter(self): ...
+    def setOption(self, key, value): ...
+    def send_setOption(self, key, value): ...
+    def recv_setOption(self): ...
+    def getOption(self, key): ...
+    def send_getOption(self, key): ...
+    def recv_getOption(self): ...
+    def getOptions(self): ...
+    def send_getOptions(self): ...
+    def recv_getOptions(self): ...
+    def getCpuProfile(self, profileDurationInSec): ...
+    def send_getCpuProfile(self, profileDurationInSec): ...
+    def recv_getCpuProfile(self): ...
+    def aliveSince(self): ...
+    def send_aliveSince(self): ...
+    def recv_aliveSince(self): ...
+    def reinitialize(self): ...
+    def send_reinitialize(self): ...
+    def shutdown(self): ...
+    def send_shutdown(self): ...
+
+class Processor(Iface, TProcessor):
+    def __init__(self, handler) -> None: ...
+    def process(self, iprot, oprot): ...
+    def process_getName(self, seqid, iprot, oprot): ...
+    def process_getVersion(self, seqid, iprot, oprot): ...
+    def process_getStatus(self, seqid, iprot, oprot): ...
+    def process_getStatusDetails(self, seqid, iprot, oprot): ...
+    def process_getCounters(self, seqid, iprot, oprot): ...
+    def process_getCounter(self, seqid, iprot, oprot): ...
+    def process_setOption(self, seqid, iprot, oprot): ...
+    def process_getOption(self, seqid, iprot, oprot): ...
+    def process_getOptions(self, seqid, iprot, oprot): ...
+    def process_getCpuProfile(self, seqid, iprot, oprot): ...
+    def process_aliveSince(self, seqid, iprot, oprot): ...
+    def process_reinitialize(self, seqid, iprot, oprot): ...
+    def process_shutdown(self, seqid, iprot, oprot): ...
+
+class getName_args:
+    thrift_spec = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getName_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getVersion_args:
+    thrift_spec = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getVersion_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getStatus_args:
+    thrift_spec = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getStatus_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getStatusDetails_args:
+    thrift_spec = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getStatusDetails_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getCounters_args:
+    thrift_spec = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getCounters_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getCounter_args:
+    thrift_spec = ...  # type: Any
+    key = ...  # type: Any
+    def __init__(self, key=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getCounter_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class setOption_args:
+    thrift_spec = ...  # type: Any
+    key = ...  # type: Any
+    value = ...  # type: Any
+    def __init__(self, key=..., value=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class setOption_result:
+    thrift_spec = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getOption_args:
+    thrift_spec = ...  # type: Any
+    key = ...  # type: Any
+    def __init__(self, key=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getOption_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getOptions_args:
+    thrift_spec = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getOptions_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getCpuProfile_args:
+    thrift_spec = ...  # type: Any
+    profileDurationInSec = ...  # type: Any
+    def __init__(self, profileDurationInSec=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class getCpuProfile_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class aliveSince_args:
+    thrift_spec = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class aliveSince_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class reinitialize_args:
+    thrift_spec = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class shutdown_args:
+    thrift_spec = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/fb303/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/fb303/__init__.pyi
diff --git a/typeshed/third_party/2/gflags.pyi b/typeshed/third_party/2/gflags.pyi
new file mode 100644
index 0000000..cdec93a
--- /dev/null
+++ b/typeshed/third_party/2/gflags.pyi
@@ -0,0 +1,214 @@
+from typing import Any, Callable, Dict, Iterable, IO, List, Union
+from types import ModuleType
+
+class FlagsError(Exception): ...
+
+class DuplicateFlag(FlagsError): ...
+
+class CantOpenFlagFileError(FlagsError): ...
+
+class DuplicateFlagCannotPropagateNoneToSwig(DuplicateFlag): ...
+
+class DuplicateFlagError(DuplicateFlag):
+    def __init__(self, flagname: str, flag_values: FlagValues, other_flag_values: FlagValues = ...) -> None: ...
+
+class IllegalFlagValue(FlagsError): ...
+
+class UnrecognizedFlag(FlagsError): ...
+
+class UnrecognizedFlagError(UnrecognizedFlag):
+    def __init__(self, flagname: str, flagvalue: str = ...) -> None: ...
+
+def GetHelpWidth() -> int: ...
+def CutCommonSpacePrefix(text) -> str: ...
+def TextWrap(text: str, length: int = ..., indent: str = ..., firstline_indent: str = ..., tabs: str = ...) -> str: ...
+def DocToHelp(doc: str) -> str: ...
+
+class FlagValues:
+    def __init__(self) -> None: ...
+    def UseGnuGetOpt(self, use_gnu_getopt: bool = ...) -> None: ...
+    def IsGnuGetOpt(self) -> bool: ...
+# TODO dict type
+    def FlagDict(self) -> dict: ...
+    def FlagsByModuleDict(self) -> Dict[str, List[Flag]]: ...
+    def FlagsByModuleIdDict(self) -> Dict[int, List[Flag]]: ...
+    def KeyFlagsByModuleDict(self) -> Dict[str, List[Flag]]: ...
+    def FindModuleDefiningFlag(self, flagname: str, default: str = ...) -> str: ...
+    def FindModuleIdDefiningFlag(self, flagname: str, default: int = ...) -> int: ...
+    def AppendFlagValues(self, flag_values: FlagValues) -> None: ...
+    def RemoveFlagValues(self, flag_values: FlagValues) -> None: ...
+    def __setitem__(self, name: str, flag: Flag) -> None: ...
+    def __getitem__(self, name: str) -> Flag: ...
+    def __getattr__(self, name: str) -> Any: ...
+    def __setattr__(self, name: str, value: Any): ...
+    def __delattr__(self, flag_name: str) -> None: ...
+    def SetDefault(self, name: str, value: Any) -> None: ...
+    def __contains__(self, name: str) -> bool: ...
+    has_key = __contains__
+    def __iter__(self) -> Iterable[str]: ...
+    def __call__(self, argv: List[str]) -> List[str]: ...
+    def Reset(self) -> None: ...
+    def RegisteredFlags(self) -> List[str]: ...
+    def FlagValuesDict(self) -> Dict[str, Any]: ...
+    def __str__(self) -> str: ...
+    def GetHelp(self, prefix: str = ...) -> str: ...
+    def ModuleHelp(self, module: Union[ModuleType, str]) -> str: ...
+    def MainModuleHelp(self) -> str: ...
+    def get(self, name: str, default: Any) -> Any: ...
+    def ShortestUniquePrefixes(self, fl: Dict[str, Flag]) -> Dict[str, str]: ...
+    def ExtractFilename(self, flagfile_str: str) -> str: ...
+    def ReadFlagsFromFiles(self, argv: List[str], force_gnu: bool = ...) -> List[str]: ...
+    def FlagsIntoString(self) -> str: ...
+    def AppendFlagsIntoFile(self, filename: str) -> None: ...
+    def WriteHelpInXMLFormat(self, outfile: IO[str] = ...) -> None: ...
+# TODO validator: gflags_validators.Validator
+    def AddValidator(self, validator: Any) -> None: ...
+
+FLAGS = ...  # type: FlagValues
+
+class Flag:
+    name = ...  # type: str
+    default = ...  # type: Any
+    default_as_str = ...  # type: str
+    value = ...  # type: Any
+    help = ...  # type: str
+    short_name = ...  # type: str
+    boolean = False
+    present = False
+    parser = ...  # type: ArgumentParser
+    serializer = ...  # type: ArgumentSerializer
+    allow_override = False
+
+    def __init__(self, parser: ArgumentParser, serializer: ArgumentSerializer, name: str,
+               default: str, help_string: str, short_name: str = ..., boolean: bool = ...,
+               allow_override: bool = ...) -> None: ...
+    def Parse(self, argument: Any) -> Any: ...
+    def Unparse(self) -> None: ...
+    def Serialize(self) -> str: ...
+    def SetDefault(self, value: Any) -> None: ...
+    def Type(self) -> str: ...
+    def WriteInfoInXMLFormat(self, outfile: IO[str], module_name: str, is_key: bool = ..., indent: str = ...) -> None: ...
+
+class ArgumentParser(object):
+    syntactic_help = ...  # type: str
+# TODO what is this
+    def Parse(self, argument: Any) -> Any: ...
+    def Type(self) -> str: ...
+    def WriteCustomInfoInXMLFormat(self, outfile: IO[str], indent: str) -> None: ...
+
+class ArgumentSerializer:
+    def Serialize(self, value: Any) -> unicode: ...
+
+class ListSerializer(ArgumentSerializer):
+    def __init__(self, list_sep: str) -> None: ...
+    def Serialize(self, value: List[Any]) -> str: ...
+
+def RegisterValidator(flag_name: str,
+                      checker: Callable[[Any], bool],
+                      message: str = ...,
+                      flag_values: FlagValues = ...) -> None: ...
+def MarkFlagAsRequired(flag_name: str, flag_values: FlagValues = ...) -> None: ...
+
+def DEFINE(parser: ArgumentParser, name: str, default: Any, help: str,
+           flag_values: FlagValues = ..., serializer: ArgumentSerializer = ..., **args: Any) -> None: ...
+def DEFINE_flag(flag: Flag, flag_values: FlagValues = ...) -> None: ...
+def DECLARE_key_flag(flag_name: str, flag_values: FlagValues = ...) -> None: ...
+def ADOPT_module_key_flags(module: ModuleType, flag_values: FlagValues = ...) -> None: ...
+def DEFINE_string(name: str, default: str, help: str, flag_values: FlagValues = ..., **args: Any): ...
+
+class BooleanParser(ArgumentParser):
+    def Convert(self, argument: Any) -> bool: ...
+    def Parse(self, argument: Any) -> bool: ...
+    def Type(self) -> str: ...
+
+class BooleanFlag(Flag):
+    def __init__(self, name: str, default: bool, help: str, short_name=..., **args: Any) -> None: ...
+
+def DEFINE_boolean(name: str, default: bool, help: str, flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+DEFINE_bool = DEFINE_boolean
+
+class HelpFlag(BooleanFlag):
+    def __init__(self) -> None: ...
+    def Parse(self, arg: Any) -> None: ...
+
+class HelpXMLFlag(BooleanFlag):
+    def __init__(self) -> None: ...
+    def Parse(self, arg: Any) -> None: ...
+
+class HelpshortFlag(BooleanFlag):
+    def __init__(self) -> None: ...
+    def Parse(self, arg: Any) -> None: ...
+
+class NumericParser(ArgumentParser):
+    def IsOutsideBounds(self, val: float) -> bool: ...
+    def Parse(self, argument: Any) -> float: ...
+    def WriteCustomInfoInXMLFormat(self, outfile: IO[str], indent: str) -> None: ...
+    def Convert(self, argument: Any) -> Any: ...
+
+class FloatParser(NumericParser):
+    number_article = ...  # type: str
+    number_name = ...  # type: str
+    syntactic_help = ...  # type: str
+    def __init__(self, lower_bound: float = ..., upper_bound: float = ...) -> None: ...
+    def Convert(self, argument: Any) -> float: ...
+    def Type(self) -> str: ...
+
+def DEFINE_float(name: str, default: float, help: str, lower_bound: float = ...,
+                 upper_bound: float = ..., flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+class IntegerParser(NumericParser):
+    number_article = ...  # type: str
+    number_name = ...  # type: str
+    syntactic_help = ...  # type: str
+    def __init__(self, lower_bound: int = ..., upper_bound: int = ...) -> None: ...
+    def Convert(self, argument: Any) -> int: ...
+    def Type(self) -> str: ...
+
+def DEFINE_integer(name: str, default: int, help: str, lower_bound: int = ...,
+                   upper_bound: int = ..., flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+class EnumParser(ArgumentParser):
+    def __init__(self, enum_values: List[str]) -> None: ...
+    def Parse(self, argument: Any) -> Any: ...
+    def Type(self) -> str: ...
+
+class EnumFlag(Flag):
+    def __init__(self, name: str, default: str, help: str, enum_values: List[str],
+               short_name: str, **args: Any) -> None: ...
+
+def DEFINE_enum(name: str, default: str, enum_values: List[str], help: str,
+                flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+class BaseListParser(ArgumentParser):
+    def __init__(self, token: str = ..., name: str = ...) -> None: ...
+    def Parse(self, argument: Any) -> list: ...
+    def Type(self) -> str: ...
+
+class ListParser(BaseListParser):
+    def __init__(self) -> None: ...
+    def WriteCustomInfoInXMLFormat(self, outfile: IO[str], indent: str): ...
+
+class WhitespaceSeparatedListParser(BaseListParser):
+    def __init__(self) -> None: ...
+    def WriteCustomInfoInXMLFormat(self, outfile: IO[str], indent: str): ...
+
+def DEFINE_list(name: str, default: List[str], help: str, flag_values: FlagValues = ..., **args: Any) -> None: ...
+def DEFINE_spaceseplist(name: str, default: List[str], help: str, flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+class MultiFlag(Flag):
+    def __init__(self, *args: Any, **kwargs: Any) -> None: ...
+    def Parse(self, arguments: Any) -> None: ...
+    def Serialize(self) -> str: ...
+    def Type(self) -> str: ...
+
+def DEFINE_multistring(name: str, default: Union[str, List[str]], help: str,
+                       flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+def DEFINE_multi_int(name: str, default: Union[int, List[int]], help: str, lower_bound: int = ...,
+                     upper_bound: int = ..., flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+
+def DEFINE_multi_float(name: str, default: Union[float, List[float]], help: str,
+                       lower_bound: float = ..., upper_bound: float = ...,
+                       flag_values: FlagValues = ..., **args: Any) -> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/google/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/google/__init__.pyi
diff --git a/typeshed/third_party/2/google/protobuf/__init__.pyi b/typeshed/third_party/2/google/protobuf/__init__.pyi
new file mode 100644
index 0000000..d232164
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/__init__.pyi
@@ -0,0 +1 @@
+__version__ = ...  # type: str
diff --git a/typeshed/third_party/2/google/protobuf/descriptor.pyi b/typeshed/third_party/2/google/protobuf/descriptor.pyi
new file mode 100644
index 0000000..7e9bc67
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/descriptor.pyi
@@ -0,0 +1,165 @@
+# Stubs for google.protobuf.descriptor (Python 2.7)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+from .message import Message
+
+class Error(Exception): ...
+class TypeTransformationError(Error): ...
+
+class DescriptorMetaclass(type):
+    def __instancecheck__(cls, obj): ...
+
+class DescriptorBase:
+    __metaclass__ = ...  # type: Any
+    has_options = ...  # type: Any
+    def __init__(self, options, options_class_name) -> None: ...
+    def GetOptions(self): ...
+
+class _NestedDescriptorBase(DescriptorBase):
+    name = ...  # type: Any
+    full_name = ...  # type: Any
+    file = ...  # type: Any
+    containing_type = ...  # type: Any
+    def __init__(self, options, options_class_name, name, full_name, file, containing_type, serialized_start=..., serialized_end=...) -> None: ...
+    def GetTopLevelContainingType(self): ...
+    def CopyToProto(self, proto): ...
+
+class Descriptor(_NestedDescriptorBase):
+    def __new__(cls, name, full_name, filename, containing_type, fields, nested_types, enum_types, extensions, options=..., is_extendable=..., extension_ranges=..., oneofs=..., file=..., serialized_start=..., serialized_end=..., syntax=...): ...
+    fields = ...  # type: Any
+    fields_by_number = ...  # type: Any
+    fields_by_name = ...  # type: Any
+    nested_types = ...  # type: Any
+    nested_types_by_name = ...  # type: Any
+    enum_types = ...  # type: Any
+    enum_types_by_name = ...  # type: Any
+    enum_values_by_name = ...  # type: Any
+    extensions = ...  # type: Any
+    extensions_by_name = ...  # type: Any
+    is_extendable = ...  # type: Any
+    extension_ranges = ...  # type: Any
+    oneofs = ...  # type: Any
+    oneofs_by_name = ...  # type: Any
+    syntax = ...  # type: Any
+    def __init__(self, name, full_name, filename, containing_type, fields, nested_types, enum_types, extensions, options=..., is_extendable=..., extension_ranges=..., oneofs=..., file=..., serialized_start=..., serialized_end=..., syntax=...) -> None: ...
+    def EnumValueName(self, enum, value): ...
+    def CopyToProto(self, proto): ...
+
+class FieldDescriptor(DescriptorBase):
+    TYPE_DOUBLE = ...  # type: Any
+    TYPE_FLOAT = ...  # type: Any
+    TYPE_INT64 = ...  # type: Any
+    TYPE_UINT64 = ...  # type: Any
+    TYPE_INT32 = ...  # type: Any
+    TYPE_FIXED64 = ...  # type: Any
+    TYPE_FIXED32 = ...  # type: Any
+    TYPE_BOOL = ...  # type: Any
+    TYPE_STRING = ...  # type: Any
+    TYPE_GROUP = ...  # type: Any
+    TYPE_MESSAGE = ...  # type: Any
+    TYPE_BYTES = ...  # type: Any
+    TYPE_UINT32 = ...  # type: Any
+    TYPE_ENUM = ...  # type: Any
+    TYPE_SFIXED32 = ...  # type: Any
+    TYPE_SFIXED64 = ...  # type: Any
+    TYPE_SINT32 = ...  # type: Any
+    TYPE_SINT64 = ...  # type: Any
+    MAX_TYPE = ...  # type: Any
+    CPPTYPE_INT32 = ...  # type: Any
+    CPPTYPE_INT64 = ...  # type: Any
+    CPPTYPE_UINT32 = ...  # type: Any
+    CPPTYPE_UINT64 = ...  # type: Any
+    CPPTYPE_DOUBLE = ...  # type: Any
+    CPPTYPE_FLOAT = ...  # type: Any
+    CPPTYPE_BOOL = ...  # type: Any
+    CPPTYPE_ENUM = ...  # type: Any
+    CPPTYPE_STRING = ...  # type: Any
+    CPPTYPE_MESSAGE = ...  # type: Any
+    MAX_CPPTYPE = ...  # type: Any
+    LABEL_OPTIONAL = ...  # type: Any
+    LABEL_REQUIRED = ...  # type: Any
+    LABEL_REPEATED = ...  # type: Any
+    MAX_LABEL = ...  # type: Any
+    MAX_FIELD_NUMBER = ...  # type: Any
+    FIRST_RESERVED_FIELD_NUMBER = ...  # type: Any
+    LAST_RESERVED_FIELD_NUMBER = ...  # type: Any
+    def __new__(cls, name, full_name, index, number, type, cpp_type, label, default_value, message_type, enum_type, containing_type, is_extension, extension_scope, options=..., has_default_value=..., containing_oneof=...): ...
+    name = ...  # type: Any
+    full_name = ...  # type: Any
+    index = ...  # type: Any
+    number = ...  # type: Any
+    type = ...  # type: Any
+    cpp_type = ...  # type: Any
+    label = ...  # type: Any
+    has_default_value = ...  # type: Any
+    default_value = ...  # type: Any
+    containing_type = ...  # type: Any
+    message_type = ...  # type: Any
+    enum_type = ...  # type: Any
+    is_extension = ...  # type: Any
+    extension_scope = ...  # type: Any
+    containing_oneof = ...  # type: Any
+    def __init__(self, name, full_name, index, number, type, cpp_type, label, default_value, message_type, enum_type, containing_type, is_extension, extension_scope, options=..., has_default_value=..., containing_oneof=...) -> None: ...
+    @staticmethod
+    def ProtoTypeToCppProtoType(proto_type): ...
+
+class EnumDescriptor(_NestedDescriptorBase):
+    def __new__(cls, name, full_name, filename, values, containing_type=..., options=..., file=..., serialized_start=..., serialized_end=...): ...
+    values = ...  # type: Any
+    values_by_name = ...  # type: Any
+    values_by_number = ...  # type: Any
+    def __init__(self, name, full_name, filename, values, containing_type=..., options=..., file=..., serialized_start=..., serialized_end=...) -> None: ...
+    def CopyToProto(self, proto): ...
+
+class EnumValueDescriptor(DescriptorBase):
+    def __new__(cls, name, index, number, type=..., options=...): ...
+    name = ...  # type: Any
+    index = ...  # type: Any
+    number = ...  # type: Any
+    type = ...  # type: Any
+    def __init__(self, name, index, number, type=..., options=...) -> None: ...
+
+class OneofDescriptor:
+    def __new__(cls, name, full_name, index, containing_type, fields): ...
+    name = ...  # type: Any
+    full_name = ...  # type: Any
+    index = ...  # type: Any
+    containing_type = ...  # type: Any
+    fields = ...  # type: Any
+    def __init__(self, name, full_name, index, containing_type, fields) -> None: ...
+
+class ServiceDescriptor(_NestedDescriptorBase):
+    index = ...  # type: Any
+    methods = ...  # type: Any
+    def __init__(self, name, full_name, index, methods, options=..., file=..., serialized_start=..., serialized_end=...) -> None: ...
+    def FindMethodByName(self, name): ...
+    def CopyToProto(self, proto): ...
+
+class MethodDescriptor(DescriptorBase):
+    name = ...  # type: Any
+    full_name = ...  # type: Any
+    index = ...  # type: Any
+    containing_service = ...  # type: Any
+    input_type = ...  # type: Any
+    output_type = ...  # type: Any
+    def __init__(self, name, full_name, index, containing_service, input_type, output_type, options=...) -> None: ...
+
+class FileDescriptor(DescriptorBase):
+    def __new__(cls, name, package, options=..., serialized_pb=..., dependencies=..., syntax=...): ...
+    _options = ...  # type: Any
+    message_types_by_name = ...  # type: Any
+    name = ...  # type: Any
+    package = ...  # type: Any
+    syntax = ...  # type: Any
+    serialized_pb = ...  # type: Any
+    enum_types_by_name = ...  # type: Any
+    extensions_by_name = ...  # type: Any
+    dependencies = ...  # type: Any
+    def __init__(self, name, package, options=..., serialized_pb=..., dependencies=..., syntax=...) -> None: ...
+    def CopyToProto(self, proto): ...
+
+def MakeDescriptor(desc_proto, package=..., build_file_if_cpp=..., syntax=...): ...
+def _ParseOptions(message: Message, string: str) -> Message: ...
diff --git a/typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi b/typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi
new file mode 100644
index 0000000..4ac2e4c
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi
@@ -0,0 +1,2 @@
+class FileOptions(object): ...
+class FieldOptions(object): ...
diff --git a/typeshed/third_party/2/google/protobuf/descriptor_pool.pyi b/typeshed/third_party/2/google/protobuf/descriptor_pool.pyi
new file mode 100644
index 0000000..f22ea57
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/descriptor_pool.pyi
@@ -0,0 +1,22 @@
+# Stubs for google.protobuf.descriptor_pool (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class DescriptorPool:
+    def __new__(cls, descriptor_db: Optional[Any] = ...): ...
+    def __init__(self, descriptor_db: Optional[Any] = ...) -> None: ...
+    def Add(self, file_desc_proto): ...
+    def AddSerializedFile(self, serialized_file_desc_proto): ...
+    def AddDescriptor(self, desc): ...
+    def AddEnumDescriptor(self, enum_desc): ...
+    def AddFileDescriptor(self, file_desc): ...
+    def FindFileByName(self, file_name): ...
+    def FindFileContainingSymbol(self, symbol): ...
+    def FindMessageTypeByName(self, full_name): ...
+    def FindEnumTypeByName(self, full_name): ...
+    def FindFieldByName(self, full_name): ...
+    def FindExtensionByName(self, full_name): ...
+
+def Default(): ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/google/protobuf/internal/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/google/protobuf/internal/__init__.pyi
diff --git a/typeshed/third_party/2/google/protobuf/internal/decoder.pyi b/typeshed/third_party/2/google/protobuf/internal/decoder.pyi
new file mode 100644
index 0000000..e7737ee
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/internal/decoder.pyi
@@ -0,0 +1,34 @@
+# Stubs for google.protobuf.internal.decoder (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def ReadTag(buffer, pos): ...
+def EnumDecoder(field_number, is_repeated, is_packed, key, new_default): ...
+
+Int32Decoder = ...  # type: Any
+Int64Decoder = ...  # type: Any
+UInt32Decoder = ...  # type: Any
+UInt64Decoder = ...  # type: Any
+SInt32Decoder = ...  # type: Any
+SInt64Decoder = ...  # type: Any
+Fixed32Decoder = ...  # type: Any
+Fixed64Decoder = ...  # type: Any
+SFixed32Decoder = ...  # type: Any
+SFixed64Decoder = ...  # type: Any
+FloatDecoder = ...  # type: Any
+DoubleDecoder = ...  # type: Any
+BoolDecoder = ...  # type: Any
+
+def StringDecoder(field_number, is_repeated, is_packed, key, new_default): ...
+def BytesDecoder(field_number, is_repeated, is_packed, key, new_default): ...
+def GroupDecoder(field_number, is_repeated, is_packed, key, new_default): ...
+def MessageDecoder(field_number, is_repeated, is_packed, key, new_default): ...
+
+MESSAGE_SET_ITEM_TAG = ...  # type: Any
+
+def MessageSetItemDecoder(extensions_by_number): ...
+def MapDecoder(field_descriptor, new_default, is_message_map): ...
+
+SkipField = ...  # type: Any
diff --git a/typeshed/third_party/2/google/protobuf/internal/encoder.pyi b/typeshed/third_party/2/google/protobuf/internal/encoder.pyi
new file mode 100644
index 0000000..c3ab6ff
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/internal/encoder.pyi
@@ -0,0 +1,38 @@
+# Stubs for google.protobuf.internal.encoder (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+Int32Sizer = ...  # type: Any
+UInt32Sizer = ...  # type: Any
+SInt32Sizer = ...  # type: Any
+Fixed32Sizer = ...  # type: Any
+Fixed64Sizer = ...  # type: Any
+BoolSizer = ...  # type: Any
+
+def StringSizer(field_number, is_repeated, is_packed): ...
+def BytesSizer(field_number, is_repeated, is_packed): ...
+def GroupSizer(field_number, is_repeated, is_packed): ...
+def MessageSizer(field_number, is_repeated, is_packed): ...
+def MessageSetItemSizer(field_number): ...
+def MapSizer(field_descriptor): ...
+def TagBytes(field_number, wire_type): ...
+
+Int32Encoder = ...  # type: Any
+UInt32Encoder = ...  # type: Any
+SInt32Encoder = ...  # type: Any
+Fixed32Encoder = ...  # type: Any
+Fixed64Encoder = ...  # type: Any
+SFixed32Encoder = ...  # type: Any
+SFixed64Encoder = ...  # type: Any
+FloatEncoder = ...  # type: Any
+DoubleEncoder = ...  # type: Any
+
+def BoolEncoder(field_number, is_repeated, is_packed): ...
+def StringEncoder(field_number, is_repeated, is_packed): ...
+def BytesEncoder(field_number, is_repeated, is_packed): ...
+def GroupEncoder(field_number, is_repeated, is_packed): ...
+def MessageEncoder(field_number, is_repeated, is_packed): ...
+def MessageSetItemEncoder(field_number): ...
+def MapEncoder(field_descriptor): ...
diff --git a/typeshed/third_party/2/google/protobuf/internal/enum_type_wrapper.pyi b/typeshed/third_party/2/google/protobuf/internal/enum_type_wrapper.pyi
new file mode 100644
index 0000000..ced66b8
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/internal/enum_type_wrapper.pyi
@@ -0,0 +1,11 @@
+from typing import Any, List, Tuple
+
+class EnumTypeWrapper(object):
+    def __init__(self, enum_type: Any) -> None: ...
+    def Name(self, number: int) -> str: ...
+    def Value(self, name: str) -> int: ...
+    def keys(self) -> List[str]: ...
+    def values(self) -> List[int]: ...
+
+    @classmethod
+    def items(cls) -> List[Tuple[str, int]]: ...
diff --git a/typeshed/third_party/2/google/protobuf/internal/wire_format.pyi b/typeshed/third_party/2/google/protobuf/internal/wire_format.pyi
new file mode 100644
index 0000000..19b7c3f
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/internal/wire_format.pyi
@@ -0,0 +1,54 @@
+# Stubs for google.protobuf.internal.wire_format (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+TAG_TYPE_BITS = ...  # type: Any
+TAG_TYPE_MASK = ...  # type: Any
+WIRETYPE_VARINT = ...  # type: Any
+WIRETYPE_FIXED64 = ...  # type: Any
+WIRETYPE_LENGTH_DELIMITED = ...  # type: Any
+WIRETYPE_START_GROUP = ...  # type: Any
+WIRETYPE_END_GROUP = ...  # type: Any
+WIRETYPE_FIXED32 = ...  # type: Any
+INT32_MAX = ...  # type: Any
+INT32_MIN = ...  # type: Any
+UINT32_MAX = ...  # type: Any
+INT64_MAX = ...  # type: Any
+INT64_MIN = ...  # type: Any
+UINT64_MAX = ...  # type: Any
+FORMAT_UINT32_LITTLE_ENDIAN = ...  # type: Any
+FORMAT_UINT64_LITTLE_ENDIAN = ...  # type: Any
+FORMAT_FLOAT_LITTLE_ENDIAN = ...  # type: Any
+FORMAT_DOUBLE_LITTLE_ENDIAN = ...  # type: Any
+
+def PackTag(field_number, wire_type): ...
+def UnpackTag(tag): ...
+def ZigZagEncode(value): ...
+def ZigZagDecode(value): ...
+def Int32ByteSize(field_number, int32): ...
+def Int32ByteSizeNoTag(int32): ...
+def Int64ByteSize(field_number, int64): ...
+def UInt32ByteSize(field_number, uint32): ...
+def UInt64ByteSize(field_number, uint64): ...
+def SInt32ByteSize(field_number, int32): ...
+def SInt64ByteSize(field_number, int64): ...
+def Fixed32ByteSize(field_number, fixed32): ...
+def Fixed64ByteSize(field_number, fixed64): ...
+def SFixed32ByteSize(field_number, sfixed32): ...
+def SFixed64ByteSize(field_number, sfixed64): ...
+def FloatByteSize(field_number, flt): ...
+def DoubleByteSize(field_number, double): ...
+def BoolByteSize(field_number, b): ...
+def EnumByteSize(field_number, enum): ...
+def StringByteSize(field_number, string): ...
+def BytesByteSize(field_number, b): ...
+def GroupByteSize(field_number, message): ...
+def MessageByteSize(field_number, message): ...
+def MessageSetItemByteSize(field_number, msg): ...
+def TagByteSize(field_number): ...
+
+NON_PACKABLE_TYPES = ...  # type: Any
+
+def IsTypePackable(field_type): ...
diff --git a/typeshed/third_party/2/google/protobuf/message.pyi b/typeshed/third_party/2/google/protobuf/message.pyi
new file mode 100644
index 0000000..09c7716
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/message.pyi
@@ -0,0 +1,36 @@
+# Stubs for google.protobuf.message (Python 2.7)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Sequence, Optional, Tuple
+
+from .descriptor import FieldDescriptor
+
+class Error(Exception): ...
+class DecodeError(Error): ...
+class EncodeError(Error): ...
+
+class Message:
+    DESCRIPTOR = ...  # type: Any
+    def __deepcopy__(self, memo=...): ...
+    def __eq__(self, other_msg): ...
+    def __ne__(self, other_msg): ...
+    def MergeFrom(self, other_msg: Message) -> None: ...
+    def CopyFrom(self, other_msg: Message) -> None: ...
+    def Clear(self) -> None: ...
+    def SetInParent(self) -> None: ...
+    def IsInitialized(self) -> bool: ...
+    def MergeFromString(self, serialized: Any) -> int: ...  # TODO: we need to be able to call buffer() on serialized
+    def ParseFromString(self, serialized: Any) -> None: ...
+    def SerializeToString(self) -> str: ...
+    def SerializePartialToString(self) -> str: ...
+    def ListFields(self) -> Sequence[Tuple[FieldDescriptor, Any]]: ...
+    def HasField(self, field_name: str) -> bool: ...
+    def ClearField(self, field_name: str) -> None: ...
+    def WhichOneof(self, oneof_group) -> Optional[str]: ...
+    def HasExtension(self, extension_handle): ...
+    def ClearExtension(self, extension_handle): ...
+    def ByteSize(self) -> int: ...
+
+    # TODO: check kwargs
+    def __init__(self, **kwargs) -> None: ...
diff --git a/typeshed/third_party/2/google/protobuf/message_factory.pyi b/typeshed/third_party/2/google/protobuf/message_factory.pyi
new file mode 100644
index 0000000..a76333d
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/message_factory.pyi
@@ -0,0 +1,17 @@
+# Stubs for google.protobuf.message_factory (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Dict, Iterable, Optional, Type
+
+from .message import Message
+from .descriptor import Descriptor
+from .descriptor_pool import DescriptorPool
+
+class MessageFactory:
+    pool = ...  # type: Any
+    def __init__(self, pool: DescriptorPool=None) -> None: ...
+    def GetPrototype(self, descriptor: Descriptor) -> Type[Message]: ...
+    def GetMessages(self, files: Iterable[str]) -> Dict[str, Type[Message]]: ...
+
+def GetMessages(file_protos: Iterable[str]) -> Dict[str, Type[Message]]: ...
diff --git a/typeshed/third_party/2/google/protobuf/reflection.pyi b/typeshed/third_party/2/google/protobuf/reflection.pyi
new file mode 100644
index 0000000..3d3e76b
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/reflection.pyi
@@ -0,0 +1,10 @@
+# Stubs for google.protobuf.reflection (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class GeneratedProtocolMessageType(type):
+    def __new__(cls, name, bases, dictionary): ...
+    def __init__(cls, name, bases, dictionary) -> None: ...
+
+def ParseMessage(descriptor, byte_str): ...
+def MakeClass(descriptor): ...
diff --git a/typeshed/third_party/2/google/protobuf/symbol_database.pyi b/typeshed/third_party/2/google/protobuf/symbol_database.pyi
new file mode 100644
index 0000000..e29070c
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/symbol_database.pyi
@@ -0,0 +1,18 @@
+# Stubs for google.protobuf.symbol_database
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Dict, Iterable, Type
+
+from .descriptor import EnumDescriptor, FileDescriptor
+from .message import Message
+from .message_factory import MessageFactory
+
+class SymbolDatabase(MessageFactory):
+    def RegisterMessage(self, message: Type[Message]) -> Type[Message]: ...
+    def RegisterEnumDescriptor(self, enum_descriptor: Type[EnumDescriptor]) -> EnumDescriptor: ...
+    def RegisterFileDescriptor(self, file_descriptor: Type[FileDescriptor]) -> FileDescriptor: ...
+    def GetSymbol(self, symbol: str) -> Type[Message]: ...
+    def GetMessages(self, files: Iterable[str]) -> Dict[str, Type[Message]]: ...
+
+def Default(): ...
diff --git a/typeshed/third_party/2/itsdangerous.pyi b/typeshed/third_party/2/itsdangerous.pyi
new file mode 100644
index 0000000..0efb3d6
--- /dev/null
+++ b/typeshed/third_party/2/itsdangerous.pyi
@@ -0,0 +1,153 @@
+# Stubs for itsdangerous (Python 2.7)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from datetime import datetime
+from itertools import izip
+from typing import Any, Callable, IO, MutableMapping, Optional, Text, Tuple, Union
+
+PY2 = ...  # type: bool
+text_type = unicode
+int_to_byte = chr
+number_types = (int, long, float)
+
+bytes_like = Union[bytearray, str]
+
+class _CompactJSON:
+    def loads(self, payload: Text) -> Any: ...
+    def dumps(self, obj: Any) -> Text: ...
+
+compact_json = _CompactJSON
+EPOCH = ...  # type: int
+
+def want_bytes(s: str, encoding='', errors='') -> str: ...
+def is_text_serializer(serializer: Any) -> bool: ...
+def constant_time_compare(val1: bytes_like, val2: bytes_like) -> bool: ...
+
+class BadData(Exception):
+    message = ...  # type: str
+    def __init__(self, message: str) -> None: ...
+
+class BadPayload(BadData):
+    original_error = ...  # type: Optional[Exception]
+    def __init__(self, message: str, original_error: Optional[Exception]=None) -> None: ...
+
+class BadSignature(BadData):
+    payload = ...  # type: Optional[Any]
+    def __init__(self, message: str, payload: Optional[Any]=None) -> None: ...
+
+class BadTimeSignature(BadSignature):
+    date_signed = ...  # type: Optional[int]
+    def __init__(self, message, payload: Optional[Any]=None, date_signed: Optional[int]=None) -> None: ...
+
+class BadHeader(BadSignature):
+    header = ...  # type: Any
+    original_error = ...  # type: Any
+    def __init__(self, message, payload=None, header=None, original_error=None) -> None: ...
+
+class SignatureExpired(BadTimeSignature): ...
+
+def base64_encode(string: bytes_like) -> str: ...
+def base64_decode(string: bytes_like) -> str: ...
+def int_to_bytes(num: int) -> str: ...
+def bytes_to_int(bytestr: bytes_like) -> int: ...
+
+class SigningAlgorithm:
+    def get_signature(self, key: bytes_like, value: bytes_like) -> str: ...
+    def verify_signature(self, key: bytes_like, value: bytes_like, sig: bytes_like) -> bool: ...
+
+class NoneAlgorithm(SigningAlgorithm):
+    def get_signature(self, key: bytes_like, value: bytes_like) -> str: ...
+
+class HMACAlgorithm(SigningAlgorithm):
+    default_digest_method = ...  # type: Callable
+    digest_method = ...  # type: Callable
+    def __init__(self, digest_method: Optional[Callable]=None) -> None: ...
+    def get_signature(self, key: bytes_like, value: bytes_like) -> str: ...
+
+class Signer:
+    default_digest_method = ...  # type: Callable
+    default_key_derivation = ...  # type: str
+    secret_key = ...  # type: bytes_like
+    sep = ...  # type: str
+    salt = ...  # type: bytes_like
+    key_derivation = ...  # type: str
+    digest_method = ...  # type: Callable
+    algorithm = ...  # type: SigningAlgorithm
+    def __init__(self, secret_key: bytes_like, salt: Optional[bytes_like]=None, sep: Optional[str]='',
+                 key_derivation: Optional[str]=None,
+                 digest_method: Optional[Callable]=None,
+                 algorithm: Optional[SigningAlgorithm]=None) -> None: ...
+    def derive_key(self) -> str: ...
+    def get_signature(self, value: bytes_like) -> str: ...
+    def sign(self, value: bytes_like) -> str: ...
+    def verify_signature(self, value: bytes_like, sig: bytes_like) -> bool: ...
+    def unsign(self, signed_value: str) -> str: ...
+    def validate(self, signed_value: str) -> bool: ...
+
+class TimestampSigner(Signer):
+    def get_timestamp(self) -> int: ...
+    def timestamp_to_datetime(self, ts: int) -> datetime: ...
+    def sign(self, value: bytes_like) -> str: ...
+    def unsign(self, value: str, max_age: Optional[int]=None, return_timestamp=False) -> Any: ...
+    def validate(self, signed_value: str, max_age: Optional[int]=None) -> bool: ...
+
+class Serializer:
+    default_serializer = ...  # type: Any
+    default_signer = ...  # type: Callable[..., Signer]
+    secret_key = ...  # type: Any
+    salt = ...  # type: bytes_like
+    serializer = ...  # type: Any
+    is_text_serializer = ...  # type: bool
+    signer = ...  # type: Signer
+    signer_kwargs = ...  # type: MutableMapping
+    def __init__(self, secret_key: bytes_like, salt: Optional[bytes_like]=b'', serializer=None, signer: Optional[Callable[..., Signer]]=None, signer_kwargs: Optional[MutableMapping]=None) -> None: ...
+    def load_payload(self, payload: Any, serializer=None) -> Any: ...
+    def dump_payload(self, *args, **kwargs) -> str: ...
+    def make_signer(self, salt: Optional[bytes_like]=None) -> Signer: ...
+    def dumps(self, obj: Any, salt: Optional[bytes_like]=None) -> str: ...
+    def dump(self, obj: Any, f: IO[str], salt: Optional[bytes_like]=None) -> None: ...
+    def loads(self, s: str, salt: Optional[bytes_like]=None) -> Any: ...
+    def load(self, f: IO[str], salt: Optional[bytes_like]=None): ...
+    def loads_unsafe(self, s, salt: Optional[bytes_like]=None) -> Tuple[bool, Any]: ...
+    def load_unsafe(self, f: IO[str], *args, **kwargs) -> Tuple[bool, Any]: ...
+
+class TimedSerializer(Serializer):
+    default_signer = ...  # type: Callable[..., TimestampSigner]
+    def loads(self, s: str, salt: Optional[bytes_like]=None, max_age: Optional[int]=None, return_timestamp=False) -> Any: ...
+    def loads_unsafe(self, s: str, salt: Optional[bytes_like]=None, max_age: Optional[int]=None) -> Tuple[bool, Any]: ...
+
+class JSONWebSignatureSerializer(Serializer):
+    jws_algorithms = ...  # type: MutableMapping[str, SigningAlgorithm]
+    default_algorithm = ...  # type: str
+    default_serializer = ...  # type: Any
+    algorithm_name = ...  # type: str
+    algorithm = ...  # type: Any
+    def __init__(self, secret_key: bytes_like, salt: Optional[bytes_like]=None, serializer=None, signer: Optional[Callable[..., Signer]]=None, signer_kwargs: Optional[MutableMapping]=None, algorithm_name: Optional[str]=None) -> None: ...
+    def load_payload(self, payload: Any, return_header=False) -> Any: ...
+    def dump_payload(self, *args, **kwargs) -> str: ...
+    def make_algorithm(self, algorithm_name: str) -> SigningAlgorithm: ...
+    def make_signer(self, salt: Optional[bytes_like]=None, algorithm_name: Optional[str]=None) -> Signer: ...
+    def make_header(self, header_fields=Optional[MutableMapping]) -> MutableMapping: ...
+    def dumps(self, obj: Any, salt: Optional[bytes_like]=None, header_fields=Optional[MutableMapping]) -> str: ...
+    def loads(self, s: str, salt: Optional[bytes_like]=None, return_header=False) -> Any: ...
+    def loads_unsafe(self, s, salt: Optional[bytes_like]=None, return_header=False) -> Tuple[bool, Any]: ...
+
+class TimedJSONWebSignatureSerializer(JSONWebSignatureSerializer):
+    DEFAULT_EXPIRES_IN = ...  # type: int
+    expires_in = ...  # type: int
+    def __init__(self, secret_key: bytes_like, expires_in: Optional[int]=None, **kwargs) -> None: ...
+    def make_header(self, header_fields=Optional[MutableMapping]) -> MutableMapping: ...
+    def loads(self, s: str, salt: Optional[bytes_like]=None, return_header=False) -> Any: ...
+    def get_issue_date(self, header: MutableMapping) -> Optional[datetime]: ...
+    def now(self) -> int: ...
+
+class URLSafeSerializerMixin:
+    def load_payload(self, payload: Any, serializer=None, return_header=False, **kwargs) -> Any: ...  # FIXME: This is invalid but works around https://github.com/pallets/itsdangerous/issues/74
+    def dump_payload(self, *args, **kwargs) -> str: ...
+
+class URLSafeSerializer(URLSafeSerializerMixin, Serializer):
+    default_serializer = ...  # type: Any
+
+class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer):
+    default_serializer = ...  # type: Any
diff --git a/typeshed/third_party/2/kazoo/__init__.pyi b/typeshed/third_party/2/kazoo/__init__.pyi
new file mode 100644
index 0000000..1aae9a5
--- /dev/null
+++ b/typeshed/third_party/2/kazoo/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for kazoo (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2/kazoo/client.pyi b/typeshed/third_party/2/kazoo/client.pyi
new file mode 100644
index 0000000..8db0eda
--- /dev/null
+++ b/typeshed/third_party/2/kazoo/client.pyi
@@ -0,0 +1,100 @@
+# Stubs for kazoo.client (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+string_types = ...  # type: Any
+bytes_types = ...  # type: Any
+LOST_STATES = ...  # type: Any
+ENVI_VERSION = ...  # type: Any
+ENVI_VERSION_KEY = ...  # type: Any
+log = ...  # type: Any
+
+class KazooClient:
+    logger = ...  # type: Any
+    handler = ...  # type: Any
+    auth_data = ...  # type: Any
+    default_acl = ...  # type: Any
+    randomize_hosts = ...  # type: Any
+    hosts = ...  # type: Any
+    chroot = ...  # type: Any
+    state = ...  # type: Any
+    state_listeners = ...  # type: Any
+    read_only = ...  # type: Any
+    retry = ...  # type: Any
+    Barrier = ...  # type: Any
+    Counter = ...  # type: Any
+    DoubleBarrier = ...  # type: Any
+    ChildrenWatch = ...  # type: Any
+    DataWatch = ...  # type: Any
+    Election = ...  # type: Any
+    NonBlockingLease = ...  # type: Any
+    MultiNonBlockingLease = ...  # type: Any
+    Lock = ...  # type: Any
+    Party = ...  # type: Any
+    Queue = ...  # type: Any
+    LockingQueue = ...  # type: Any
+    SetPartitioner = ...  # type: Any
+    Semaphore = ...  # type: Any
+    ShallowParty = ...  # type: Any
+    def __init__(self, hosts=..., timeout=..., client_id=..., handler=..., default_acl=..., auth_data=..., read_only=..., randomize_hosts=..., connection_retry=..., command_retry=..., logger=..., **kwargs) -> None: ...
+    @property
+    def client_state(self): ...
+    @property
+    def client_id(self): ...
+    @property
+    def connected(self): ...
+    def set_hosts(self, hosts, randomize_hosts=...): ...
+    def add_listener(self, listener): ...
+    def remove_listener(self, listener): ...
+    def start(self, timeout=...): ...
+    def start_async(self): ...
+    def stop(self): ...
+    def restart(self): ...
+    def close(self): ...
+    def command(self, cmd=...): ...
+    def server_version(self, retries=...): ...
+    def add_auth(self, scheme, credential): ...
+    def add_auth_async(self, scheme, credential): ...
+    def unchroot(self, path): ...
+    def sync_async(self, path): ...
+    def sync(self, path): ...
+    def create(self, path, value=..., acl=..., ephemeral=..., sequence=..., makepath=...): ...
+    def create_async(self, path, value=..., acl=..., ephemeral=..., sequence=..., makepath=...): ...
+    def ensure_path(self, path, acl=...): ...
+    def ensure_path_async(self, path, acl=...): ...
+    def exists(self, path, watch=...): ...
+    def exists_async(self, path, watch=...): ...
+    def get(self, path, watch=...): ...
+    def get_async(self, path, watch=...): ...
+    def get_children(self, path, watch=..., include_data=...): ...
+    def get_children_async(self, path, watch=..., include_data=...): ...
+    def get_acls(self, path): ...
+    def get_acls_async(self, path): ...
+    def set_acls(self, path, acls, version=...): ...
+    def set_acls_async(self, path, acls, version=...): ...
+    def set(self, path, value, version=...): ...
+    def set_async(self, path, value, version=...): ...
+    def transaction(self): ...
+    def delete(self, path, version=..., recursive=...): ...
+    def delete_async(self, path, version=...): ...
+    def reconfig(self, joining, leaving, new_members, from_config=...): ...
+    def reconfig_async(self, joining, leaving, new_members, from_config): ...
+
+class TransactionRequest:
+    client = ...  # type: Any
+    operations = ...  # type: Any
+    committed = ...  # type: Any
+    def __init__(self, client) -> None: ...
+    def create(self, path, value=..., acl=..., ephemeral=..., sequence=...): ...
+    def delete(self, path, version=...): ...
+    def set_data(self, path, value, version=...): ...
+    def check(self, path, version): ...
+    def commit_async(self): ...
+    def commit(self): ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_value, exc_tb): ...
+
+class KazooState:
+    ...
diff --git a/typeshed/third_party/2/kazoo/exceptions.pyi b/typeshed/third_party/2/kazoo/exceptions.pyi
new file mode 100644
index 0000000..ed632ba
--- /dev/null
+++ b/typeshed/third_party/2/kazoo/exceptions.pyi
@@ -0,0 +1,62 @@
+# Stubs for kazoo.exceptions (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class KazooException(Exception): ...
+class ZookeeperError(KazooException): ...
+class CancelledError(KazooException): ...
+class ConfigurationError(KazooException): ...
+class ZookeeperStoppedError(KazooException): ...
+class ConnectionDropped(KazooException): ...
+class LockTimeout(KazooException): ...
+class WriterNotClosedException(KazooException): ...
+
+EXCEPTIONS = ...  # type: Any
+
+class RolledBackError(ZookeeperError): ...
+class SystemZookeeperError(ZookeeperError): ...
+class RuntimeInconsistency(ZookeeperError): ...
+class DataInconsistency(ZookeeperError): ...
+class ConnectionLoss(ZookeeperError): ...
+class MarshallingError(ZookeeperError): ...
+class UnimplementedError(ZookeeperError): ...
+class OperationTimeoutError(ZookeeperError): ...
+class BadArgumentsError(ZookeeperError): ...
+class NewConfigNoQuorumError(ZookeeperError): ...
+class ReconfigInProcessError(ZookeeperError): ...
+class APIError(ZookeeperError): ...
+class NoNodeError(ZookeeperError): ...
+class NoAuthError(ZookeeperError): ...
+class BadVersionError(ZookeeperError): ...
+class NoChildrenForEphemeralsError(ZookeeperError): ...
+class NodeExistsError(ZookeeperError): ...
+class NotEmptyError(ZookeeperError): ...
+class SessionExpiredError(ZookeeperError): ...
+class InvalidCallbackError(ZookeeperError): ...
+class InvalidACLError(ZookeeperError): ...
+class AuthFailedError(ZookeeperError): ...
+class SessionMovedError(ZookeeperError): ...
+class NotReadOnlyCallError(ZookeeperError): ...
+class ConnectionClosedError(SessionExpiredError): ...
+
+ConnectionLossException = ...  # type: Any
+MarshallingErrorException = ...  # type: Any
+SystemErrorException = ...  # type: Any
+RuntimeInconsistencyException = ...  # type: Any
+DataInconsistencyException = ...  # type: Any
+UnimplementedException = ...  # type: Any
+OperationTimeoutException = ...  # type: Any
+BadArgumentsException = ...  # type: Any
+ApiErrorException = ...  # type: Any
+NoNodeException = ...  # type: Any
+NoAuthException = ...  # type: Any
+BadVersionException = ...  # type: Any
+NoChildrenForEphemeralsException = ...  # type: Any
+NodeExistsException = ...  # type: Any
+InvalidACLException = ...  # type: Any
+AuthFailedException = ...  # type: Any
+NotEmptyException = ...  # type: Any
+SessionExpiredException = ...  # type: Any
+InvalidCallbackException = ...  # type: Any
diff --git a/typeshed/third_party/2/kazoo/recipe/__init__.pyi b/typeshed/third_party/2/kazoo/recipe/__init__.pyi
new file mode 100644
index 0000000..44bc4cb
--- /dev/null
+++ b/typeshed/third_party/2/kazoo/recipe/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for kazoo.recipe (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2/kazoo/recipe/watchers.pyi b/typeshed/third_party/2/kazoo/recipe/watchers.pyi
new file mode 100644
index 0000000..f942163
--- /dev/null
+++ b/typeshed/third_party/2/kazoo/recipe/watchers.pyi
@@ -0,0 +1,25 @@
+# Stubs for kazoo.recipe.watchers (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+log = ...  # type: Any
+
+class DataWatch:
+    def __init__(self, client, path, func=..., *args, **kwargs) -> None: ...
+    def __call__(self, func): ...
+
+class ChildrenWatch:
+    def __init__(self, client, path, func=..., allow_session_lost=..., send_event=...) -> None: ...
+    def __call__(self, func): ...
+
+class PatientChildrenWatch:
+    client = ...  # type: Any
+    path = ...  # type: Any
+    children = ...  # type: Any
+    time_boundary = ...  # type: Any
+    children_changed = ...  # type: Any
+    def __init__(self, client, path, time_boundary=...) -> None: ...
+    asy = ...  # type: Any
+    def start(self): ...
diff --git a/typeshed/third_party/2/pycurl.pyi b/typeshed/third_party/2/pycurl.pyi
new file mode 100644
index 0000000..85f2b13
--- /dev/null
+++ b/typeshed/third_party/2/pycurl.pyi
@@ -0,0 +1,378 @@
+# TODO(MichalPokorny): more precise types
+
+from typing import Any, Tuple, Optional
+
+GLOBAL_SSL = ...  # type: int
+GLOBAL_WIN32 = ...  # type: int
+GLOBAL_ALL = ...  # type: int
+GLOBAL_NOTHING = ...  # type: int
+GLOBAL_DEFAULT = ...  # type: int
+
+def global_init(option: int) -> None: ...
+def global_cleanup() -> None: ...
+
+version = ...  # type: str
+
+def version_info() -> Tuple[int, str, int, str, int, str,
+                            int, str, tuple, Any, int, Any]: ...
+
+class error(Exception):
+    pass
+
+class Curl(object):
+    def close(self) -> None: ...
+    def setopt(self, option: int, value: Any) -> None: ...
+    def perform(self) -> None: ...
+    def getinfo(self, info: Any) -> Any: ...
+    def reset(self) -> None: ...
+    def unsetopt(self, option: int) -> Any: ...
+    def pause(self, bitmask: Any) -> Any: ...
+    def errstr(self) -> str: ...
+
+    # TODO(MichalPokorny): wat?
+    USERPWD = ...  # type: int
+
+class CurlMulti(object):
+    def close(self) -> None: ...
+    def add_handle(self, obj: Curl) -> None: ...
+    def remove_handle(self, obj: Curl) -> None: ...
+    def perform(self) -> Tuple[Any, int]: ...
+    def fdset(self) -> tuple: ...
+    def select(self, timeout: float = ...) -> int: ...
+    def info_read(self, max_objects: int) -> tuple: ...
+
+class CurlShare(object):
+    def close(self) -> None: ...
+    def setopt(self, option: int, value: Any) -> Any: ...
+
+ADDRESS_SCOPE = ...  # type: int
+APPCONNECT_TIME = ...  # type: int
+AUTOREFERER = ...  # type: int
+BUFFERSIZE = ...  # type: int
+CAINFO = ...  # type: int
+CAPATH = ...  # type: int
+COMPILE_LIBCURL_VERSION_NUM = ...  # type: int
+COMPILE_PY_VERSION_HEX = ...  # type: int
+CONNECTTIMEOUT = ...  # type: int
+CONNECTTIMEOUT_MS = ...  # type: int
+CONNECT_ONLY = ...  # type: int
+CONNECT_TIME = ...  # type: int
+CONTENT_LENGTH_DOWNLOAD = ...  # type: int
+CONTENT_LENGTH_UPLOAD = ...  # type: int
+CONTENT_TYPE = ...  # type: int
+COOKIE = ...  # type: int
+COOKIEFILE = ...  # type: int
+COOKIEJAR = ...  # type: int
+COOKIELIST = ...  # type: int
+COPYPOSTFIELDS = ...  # type: int
+CRLF = ...  # type: int
+CRLFILE = ...  # type: int
+CSELECT_ERR = ...  # type: int
+CSELECT_IN = ...  # type: int
+CSELECT_OUT = ...  # type: int
+CURL_HTTP_VERSION_1_0 = ...  # type: int
+CURL_HTTP_VERSION_1_1 = ...  # type: int
+CURL_HTTP_VERSION_LAST = ...  # type: int
+CURL_HTTP_VERSION_NONE = ...  # type: int
+CUSTOMREQUEST = ...  # type: int
+DEBUGFUNCTION = ...  # type: int
+DNS_CACHE_TIMEOUT = ...  # type: int
+DNS_USE_GLOBAL_CACHE = ...  # type: int
+EFFECTIVE_URL = ...  # type: int
+EGDSOCKET = ...  # type: int
+ENCODING = ...  # type: int
+FAILONERROR = ...  # type: int
+FILE = ...  # type: int
+FOLLOWLOCATION = ...  # type: int
+FORBID_REUSE = ...  # type: int
+FORM_CONTENTS = ...  # type: int
+FORM_CONTENTTYPE = ...  # type: int
+FORM_FILE = ...  # type: int
+FORM_FILENAME = ...  # type: int
+FRESH_CONNECT = ...  # type: int
+FTPAPPEND = ...  # type: int
+FTPAUTH_DEFAULT = ...  # type: int
+FTPAUTH_SSL = ...  # type: int
+FTPAUTH_TLS = ...  # type: int
+FTPLISTONLY = ...  # type: int
+FTPMETHOD_DEFAULT = ...  # type: int
+FTPMETHOD_MULTICWD = ...  # type: int
+FTPMETHOD_NOCWD = ...  # type: int
+FTPMETHOD_SINGLECWD = ...  # type: int
+FTPPORT = ...  # type: int
+FTPSSLAUTH = ...  # type: int
+FTPSSL_ALL = ...  # type: int
+FTPSSL_CONTROL = ...  # type: int
+FTPSSL_NONE = ...  # type: int
+FTPSSL_TRY = ...  # type: int
+FTP_ACCOUNT = ...  # type: int
+FTP_ALTERNATIVE_TO_USER = ...  # type: int
+FTP_CREATE_MISSING_DIRS = ...  # type: int
+FTP_ENTRY_PATH = ...  # type: int
+FTP_FILEMETHOD = ...  # type: int
+FTP_RESPONSE_TIMEOUT = ...  # type: int
+FTP_SKIP_PASV_IP = ...  # type: int
+FTP_SSL = ...  # type: int
+FTP_SSL_CCC = ...  # type: int
+FTP_USE_EPRT = ...  # type: int
+FTP_USE_EPSV = ...  # type: int
+HEADER = ...  # type: int
+HEADERFUNCTION = ...  # type: int
+HEADER_SIZE = ...  # type: int
+HTTP200ALIASES = ...  # type: int
+HTTPAUTH = ...  # type: int
+HTTPAUTH_ANY = ...  # type: int
+HTTPAUTH_ANYSAFE = ...  # type: int
+HTTPAUTH_AVAIL = ...  # type: int
+HTTPAUTH_BASIC = ...  # type: int
+HTTPAUTH_DIGEST = ...  # type: int
+HTTPAUTH_GSSNEGOTIATE = ...  # type: int
+HTTPAUTH_NONE = ...  # type: int
+HTTPAUTH_NTLM = ...  # type: int
+HTTPGET = ...  # type: int
+HTTPHEADER = ...  # type: int
+HTTPPOST = ...  # type: int
+HTTPPROXYTUNNEL = ...  # type: int
+HTTP_CODE = ...  # type: int
+HTTP_CONNECTCODE = ...  # type: int
+HTTP_CONTENT_DECODING = ...  # type: int
+HTTP_TRANSFER_DECODING = ...  # type: int
+HTTP_VERSION = ...  # type: int
+IGNORE_CONTENT_LENGTH = ...  # type: int
+INFILE = ...  # type: int
+INFILESIZE = ...  # type: int
+INFILESIZE_LARGE = ...  # type: int
+INFOTYPE_DATA_IN = ...  # type: int
+INFOTYPE_DATA_OUT = ...  # type: int
+INFOTYPE_HEADER_IN = ...  # type: int
+INFOTYPE_HEADER_OUT = ...  # type: int
+INFOTYPE_SSL_DATA_IN = ...  # type: int
+INFOTYPE_SSL_DATA_OUT = ...  # type: int
+INFOTYPE_TEXT = ...  # type: int
+INFO_COOKIELIST = ...  # type: int
+INFO_FILETIME = ...  # type: int
+INTERFACE = ...  # type: int
+IOCMD_NOP = ...  # type: int
+IOCMD_RESTARTREAD = ...  # type: int
+IOCTLDATA = ...  # type: int
+IOCTLFUNCTION = ...  # type: int
+IOE_FAILRESTART = ...  # type: int
+IOE_OK = ...  # type: int
+IOE_UNKNOWNCMD = ...  # type: int
+IPRESOLVE = ...  # type: int
+IPRESOLVE_V4 = ...  # type: int
+IPRESOLVE_V6 = ...  # type: int
+IPRESOLVE_WHATEVER = ...  # type: int
+ISSUERCERT = ...  # type: int
+KRB4LEVEL = ...  # type: int
+LASTSOCKET = ...  # type: int
+LOCALPORT = ...  # type: int
+LOCALPORTRANGE = ...  # type: int
+LOCK_DATA_COOKIE = ...  # type: int
+LOCK_DATA_DNS = ...  # type: int
+LOW_SPEED_LIMIT = ...  # type: int
+LOW_SPEED_TIME = ...  # type: int
+MAXCONNECTS = ...  # type: int
+MAXFILESIZE = ...  # type: int
+MAXFILESIZE_LARGE = ...  # type: int
+MAXREDIRS = ...  # type: int
+MAX_RECV_SPEED_LARGE = ...  # type: int
+MAX_SEND_SPEED_LARGE = ...  # type: int
+NAMELOOKUP_TIME = ...  # type: int
+NETRC = ...  # type: int
+NETRC_FILE = ...  # type: int
+NETRC_IGNORED = ...  # type: int
+NETRC_OPTIONAL = ...  # type: int
+NETRC_REQUIRED = ...  # type: int
+NEW_DIRECTORY_PERMS = ...  # type: int
+NEW_FILE_PERMS = ...  # type: int
+NOBODY = ...  # type: int
+NOPROGRESS = ...  # type: int
+NOSIGNAL = ...  # type: int
+NUM_CONNECTS = ...  # type: int
+OPENSOCKETFUNCTION = ...  # type: int
+OPT_FILETIME = ...  # type: int
+OS_ERRNO = ...  # type: int
+POLL_IN = ...  # type: int
+POLL_INOUT = ...  # type: int
+POLL_NONE = ...  # type: int
+POLL_OUT = ...  # type: int
+POLL_REMOVE = ...  # type: int
+PORT = ...  # type: int
+POST = ...  # type: int
+POST301 = ...  # type: int
+POSTFIELDS = ...  # type: int
+POSTFIELDSIZE = ...  # type: int
+POSTFIELDSIZE_LARGE = ...  # type: int
+POSTQUOTE = ...  # type: int
+PREQUOTE = ...  # type: int
+PRETRANSFER_TIME = ...  # type: int
+PRIMARY_IP = ...  # type: int
+PROGRESSFUNCTION = ...  # type: int
+PROXY = ...  # type: int
+PROXYAUTH = ...  # type: int
+PROXYAUTH_AVAIL = ...  # type: int
+PROXYPORT = ...  # type: int
+PROXYTYPE = ...  # type: int
+PROXYTYPE_HTTP = ...  # type: int
+PROXYTYPE_SOCKS4 = ...  # type: int
+PROXYTYPE_SOCKS5 = ...  # type: int
+PROXYUSERPWD = ...  # type: int
+PROXY_TRANSFER_MODE = ...  # type: int
+PUT = ...  # type: int
+QUOTE = ...  # type: int
+RANDOM_FILE = ...  # type: int
+RANGE = ...  # type: int
+READDATA = ...  # type: int
+READFUNCTION = ...  # type: int
+READFUNC_ABORT = ...  # type: int
+REDIRECT_COUNT = ...  # type: int
+REDIRECT_TIME = ...  # type: int
+REDIRECT_URL = ...  # type: int
+REFERER = ...  # type: int
+REQUEST_SIZE = ...  # type: int
+RESPONSE_CODE = ...  # type: int
+RESUME_FROM = ...  # type: int
+RESUME_FROM_LARGE = ...  # type: int
+SHARE = ...  # type: int
+SH_SHARE = ...  # type: int
+SH_UNSHARE = ...  # type: int
+SIZE_DOWNLOAD = ...  # type: int
+SIZE_UPLOAD = ...  # type: int
+SOCKET_TIMEOUT = ...  # type: int
+SPEED_DOWNLOAD = ...  # type: int
+SPEED_UPLOAD = ...  # type: int
+SSH_AUTH_ANY = ...  # type: int
+SSH_AUTH_DEFAULT = ...  # type: int
+SSH_AUTH_HOST = ...  # type: int
+SSH_AUTH_KEYBOARD = ...  # type: int
+SSH_AUTH_NONE = ...  # type: int
+SSH_AUTH_PASSWORD = ...  # type: int
+SSH_AUTH_PUBLICKEY = ...  # type: int
+SSH_AUTH_TYPES = ...  # type: int
+SSH_HOST_PUBLIC_KEY_MD5 = ...  # type: int
+SSH_PRIVATE_KEYFILE = ...  # type: int
+SSH_PUBLIC_KEYFILE = ...  # type: int
+SSLCERT = ...  # type: int
+SSLCERTPASSWD = ...  # type: int
+SSLCERTTYPE = ...  # type: int
+SSLENGINE = ...  # type: int
+SSLENGINE_DEFAULT = ...  # type: int
+SSLKEY = ...  # type: int
+SSLKEYPASSWD = ...  # type: int
+SSLKEYTYPE = ...  # type: int
+SSLVERSION = ...  # type: int
+SSLVERSION_DEFAULT = ...  # type: int
+SSLVERSION_SSLv2 = ...  # type: int
+SSLVERSION_SSLv3 = ...  # type: int
+SSLVERSION_TLSv1 = ...  # type: int
+SSL_CIPHER_LIST = ...  # type: int
+SSL_ENGINES = ...  # type: int
+SSL_SESSIONID_CACHE = ...  # type: int
+SSL_VERIFYHOST = ...  # type: int
+SSL_VERIFYPEER = ...  # type: int
+SSL_VERIFYRESULT = ...  # type: int
+STARTTRANSFER_TIME = ...  # type: int
+STDERR = ...  # type: int
+TCP_NODELAY = ...  # type: int
+TIMECONDITION = ...  # type: int
+TIMECONDITION_IFMODSINCE = ...  # type: int
+TIMECONDITION_IFUNMODSINCE = ...  # type: int
+TIMECONDITION_LASTMOD = ...  # type: int
+TIMECONDITION_NONE = ...  # type: int
+TIMEOUT = ...  # type: int
+TIMEOUT_MS = ...  # type: int
+TIMEVALUE = ...  # type: int
+TOTAL_TIME = ...  # type: int
+TRANSFERTEXT = ...  # type: int
+UNRESTRICTED_AUTH = ...  # type: int
+UPLOAD = ...  # type: int
+URL = ...  # type: int
+USERAGENT = ...  # type: int
+USERPWD = ...  # type: int
+VERBOSE = ...  # type: int
+WRITEDATA = ...  # type: int
+WRITEFUNCTION = ...  # type: int
+WRITEHEADER = ...  # type: int
+
+E_ABORTED_BY_CALLBACK = ...  # type: int
+E_BAD_CONTENT_ENCODING = ...  # type: int
+E_BAD_DOWNLOAD_RESUME = ...  # type: int
+E_BAD_FUNCTION_ARGUMENT = ...  # type: int
+E_CALL_MULTI_PERFORM = ...  # type: int
+E_CONV_FAILED = ...  # type: int
+E_CONV_REQD = ...  # type: int
+E_COULDNT_CONNECT = ...  # type: int
+E_COULDNT_RESOLVE_HOST = ...  # type: int
+E_COULDNT_RESOLVE_PROXY = ...  # type: int
+E_FAILED_INIT = ...  # type: int
+E_FILESIZE_EXCEEDED = ...  # type: int
+E_FILE_COULDNT_READ_FILE = ...  # type: int
+E_FTP_ACCESS_DENIED = ...  # type: int
+E_FTP_CANT_GET_HOST = ...  # type: int
+E_FTP_CANT_RECONNECT = ...  # type: int
+E_FTP_COULDNT_GET_SIZE = ...  # type: int
+E_FTP_COULDNT_RETR_FILE = ...  # type: int
+E_FTP_COULDNT_SET_ASCII = ...  # type: int
+E_FTP_COULDNT_SET_BINARY = ...  # type: int
+E_FTP_COULDNT_STOR_FILE = ...  # type: int
+E_FTP_COULDNT_USE_REST = ...  # type: int
+E_FTP_PORT_FAILED = ...  # type: int
+E_FTP_QUOTE_ERROR = ...  # type: int
+E_FTP_SSL_FAILED = ...  # type: int
+E_FTP_WEIRD_227_FORMAT = ...  # type: int
+E_FTP_WEIRD_PASS_REPLY = ...  # type: int
+E_FTP_WEIRD_PASV_REPLY = ...  # type: int
+E_FTP_WEIRD_SERVER_REPLY = ...  # type: int
+E_FTP_WEIRD_USER_REPLY = ...  # type: int
+E_FTP_WRITE_ERROR = ...  # type: int
+E_FUNCTION_NOT_FOUND = ...  # type: int
+E_GOT_NOTHING = ...  # type: int
+E_HTTP_POST_ERROR = ...  # type: int
+E_HTTP_RANGE_ERROR = ...  # type: int
+E_HTTP_RETURNED_ERROR = ...  # type: int
+E_INTERFACE_FAILED = ...  # type: int
+E_LDAP_CANNOT_BIND = ...  # type: int
+E_LDAP_INVALID_URL = ...  # type: int
+E_LDAP_SEARCH_FAILED = ...  # type: int
+E_LIBRARY_NOT_FOUND = ...  # type: int
+E_LOGIN_DENIED = ...  # type: int
+E_MULTI_BAD_EASY_HANDLE = ...  # type: int
+E_MULTI_BAD_HANDLE = ...  # type: int
+E_MULTI_INTERNAL_ERROR = ...  # type: int
+E_MULTI_OK = ...  # type: int
+E_MULTI_OUT_OF_MEMORY = ...  # type: int
+E_OK = ...  # type: int
+E_OPERATION_TIMEOUTED = ...  # type: int
+E_OUT_OF_MEMORY = ...  # type: int
+E_PARTIAL_FILE = ...  # type: int
+E_READ_ERROR = ...  # type: int
+E_RECV_ERROR = ...  # type: int
+E_REMOTE_FILE_NOT_FOUND = ...  # type: int
+E_SEND_ERROR = ...  # type: int
+E_SEND_FAIL_REWIND = ...  # type: int
+E_SHARE_IN_USE = ...  # type: int
+E_SSH = ...  # type: int
+E_SSL_CACERT = ...  # type: int
+E_SSL_CACERT_BADFILE = ...  # type: int
+E_SSL_CERTPROBLEM = ...  # type: int
+E_SSL_CIPHER = ...  # type: int
+E_SSL_CONNECT_ERROR = ...  # type: int
+E_SSL_ENGINE_INITFAILED = ...  # type: int
+E_SSL_ENGINE_NOTFOUND = ...  # type: int
+E_SSL_ENGINE_SETFAILED = ...  # type: int
+E_SSL_PEER_CERTIFICATE = ...  # type: int
+E_SSL_SHUTDOWN_FAILED = ...  # type: int
+E_TELNET_OPTION_SYNTAX = ...  # type: int
+E_TFTP_DISKFULL = ...  # type: int
+E_TFTP_EXISTS = ...  # type: int
+E_TFTP_ILLEGAL = ...  # type: int
+E_TFTP_NOSUCHUSER = ...  # type: int
+E_TFTP_NOTFOUND = ...  # type: int
+E_TFTP_PERM = ...  # type: int
+E_TFTP_UNKNOWNID = ...  # type: int
+E_TOO_MANY_REDIRECTS = ...  # type: int
+E_UNKNOWN_TELNET_OPTION = ...  # type: int
+E_UNSUPPORTED_PROTOCOL = ...  # type: int
+E_URL_MALFORMAT = ...  # type: int
+E_WRITE_ERROR = ...  # type: int
diff --git a/typeshed/third_party/2/pymssql.pyi b/typeshed/third_party/2/pymssql.pyi
new file mode 100644
index 0000000..3f75b31
--- /dev/null
+++ b/typeshed/third_party/2/pymssql.pyi
@@ -0,0 +1,48 @@
+from datetime import datetime, date, time
+
+from typing import Any, Dict, Tuple, Iterable, List, Optional, Union, Sequence
+
+Scalar = Union[int, float, str, datetime, date, time]
+Result = Union[Tuple[Scalar, ...], Dict[str, Scalar]]
+
+class Connection(object):
+    def __init__(self, user, password, host, database, timeout,
+                 login_timeout, charset, as_dict) -> None: ...
+    def autocommit(self, status: bool) -> None: ...
+    def close(self) -> None: ...
+    def commit(self) -> None: ...
+    def cursor(self) -> 'Cursor': ...
+    def rollback(self) -> None: ...
+
+class Cursor(object):
+    def __init__(self) -> None: ...
+    def __iter__(self): ...
+    def __next__(self) -> Any: ...
+    def callproc(self, procname: str, **kwargs) -> None: ...
+    def close(self) -> None: ...
+    def execute(self, stmt: str,
+                params: Optional[Union[Scalar, Tuple[Scalar, ...],
+                                       Dict[str, Scalar]]]) -> None: ...
+    def executemany(self, stmt: str,
+                    params: Optional[Sequence[Tuple[Scalar, ...]]]) -> None: ...
+    def fetchall(self) -> List[Result]: ...
+    def fetchmany(self, size: Optional[Union[int, None]]) -> List[Result]: ...
+    def fetchone(self) -> Result: ...
+
+def connect(server: Optional[str],
+            user: Optional[str],
+            password: Optional[str],
+            database: Optional[str],
+            timeout: Optional[int],
+            login_timeout: Optional[int],
+            charset: Optional[str],
+            as_dict: Optional[bool],
+            host: Optional[str],
+            appname: Optional[str],
+            port: Optional[str],
+
+            conn_properties: Optional[Union[str, Sequence[str]]],
+            autocommit: Optional[bool],
+            tds_version: Optional[str]) -> Connection: ...
+def get_max_connections() -> int: ...
+def set_max_connections(n: int) -> None: ...
diff --git a/typeshed/third_party/2/redis/__init__.pyi b/typeshed/third_party/2/redis/__init__.pyi
new file mode 100644
index 0000000..53ec818
--- /dev/null
+++ b/typeshed/third_party/2/redis/__init__.pyi
@@ -0,0 +1,28 @@
+# Stubs for redis (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import client
+from . import connection
+from . import utils
+from . import exceptions
+
+Redis = client.Redis
+StrictRedis = client.StrictRedis
+BlockingConnectionPool = connection.BlockingConnectionPool
+ConnectionPool = connection.ConnectionPool
+Connection = connection.Connection
+SSLConnection = connection.SSLConnection
+UnixDomainSocketConnection = connection.UnixDomainSocketConnection
+from_url = utils.from_url
+AuthenticationError = exceptions.AuthenticationError
+BusyLoadingError = exceptions.BusyLoadingError
+ConnectionError = exceptions.ConnectionError
+DataError = exceptions.DataError
+InvalidResponse = exceptions.InvalidResponse
+PubSubError = exceptions.PubSubError
+ReadOnlyError = exceptions.ReadOnlyError
+RedisError = exceptions.RedisError
+ResponseError = exceptions.ResponseError
+TimeoutError = exceptions.TimeoutError
+WatchError = exceptions.WatchError
diff --git a/typeshed/third_party/2/redis/client.pyi b/typeshed/third_party/2/redis/client.pyi
new file mode 100644
index 0000000..43693ec
--- /dev/null
+++ b/typeshed/third_party/2/redis/client.pyi
@@ -0,0 +1,293 @@
+# Stubs for redis.client (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+SYM_EMPTY = ...  # type: Any
+
+def list_or_args(keys, args): ...
+def timestamp_to_datetime(response): ...
+def string_keys_to_dict(key_string, callback): ...
+def dict_merge(*dicts): ...
+def parse_debug_object(response): ...
+def parse_object(response, infotype): ...
+def parse_info(response): ...
+
+SENTINEL_STATE_TYPES = ...  # type: Any
+
+def parse_sentinel_state(item): ...
+def parse_sentinel_master(response): ...
+def parse_sentinel_masters(response): ...
+def parse_sentinel_slaves_and_sentinels(response): ...
+def parse_sentinel_get_master(response): ...
+def pairs_to_dict(response): ...
+def pairs_to_dict_typed(response, type_info): ...
+def zset_score_pairs(response, **options): ...
+def sort_return_tuples(response, **options): ...
+def int_or_none(response): ...
+def float_or_none(response): ...
+def bool_ok(response): ...
+def parse_client_list(response, **options): ...
+def parse_config_get(response, **options): ...
+def parse_scan(response, **options): ...
+def parse_hscan(response, **options): ...
+def parse_zscan(response, **options): ...
+def parse_slowlog_get(response, **options): ...
+
+class StrictRedis:
+    RESPONSE_CALLBACKS = ...  # type: Any
+    @classmethod
+    def from_url(cls, url, db=..., **kwargs): ...
+    connection_pool = ...  # type: Any
+    response_callbacks = ...  # type: Any
+    def __init__(self, host=..., port=..., db=..., password=..., socket_timeout=..., socket_connect_timeout=..., socket_keepalive=..., socket_keepalive_options=..., connection_pool=..., unix_socket_path=..., encoding=..., encoding_errors=..., charset=..., errors=..., decode_responses=..., retry_on_timeout=..., ssl=..., ssl_keyfile=..., ssl_certfile=..., ssl_cert_reqs=..., ssl_ca_certs=...) -> None: ...
+    def set_response_callback(self, command, callback): ...
+    def pipeline(self, transaction=..., shard_hint=...): ...
+    def transaction(self, func, *watches, **kwargs): ...
+    def lock(self, name, timeout=..., sleep=..., blocking_timeout=..., lock_class=..., thread_local=...): ...
+    def pubsub(self, **kwargs): ...
+    def execute_command(self, *args, **options): ...
+    def parse_response(self, connection, command_name, **options): ...
+    def bgrewriteaof(self): ...
+    def bgsave(self): ...
+    def client_kill(self, address): ...
+    def client_list(self): ...
+    def client_getname(self): ...
+    def client_setname(self, name): ...
+    def config_get(self, pattern=...): ...
+    def config_set(self, name, value): ...
+    def config_resetstat(self): ...
+    def config_rewrite(self): ...
+    def dbsize(self): ...
+    def debug_object(self, key): ...
+    def echo(self, value): ...
+    def flushall(self): ...
+    def flushdb(self): ...
+    def info(self, section=...): ...
+    def lastsave(self): ...
+    def object(self, infotype, key): ...
+    def ping(self): ...
+    def save(self): ...
+    def sentinel(self, *args): ...
+    def sentinel_get_master_addr_by_name(self, service_name): ...
+    def sentinel_master(self, service_name): ...
+    def sentinel_masters(self): ...
+    def sentinel_monitor(self, name, ip, port, quorum): ...
+    def sentinel_remove(self, name): ...
+    def sentinel_sentinels(self, service_name): ...
+    def sentinel_set(self, name, option, value): ...
+    def sentinel_slaves(self, service_name): ...
+    def shutdown(self): ...
+    def slaveof(self, host=..., port=...): ...
+    def slowlog_get(self, num=...): ...
+    def slowlog_len(self): ...
+    def slowlog_reset(self): ...
+    def time(self): ...
+    def append(self, key, value): ...
+    def bitcount(self, key, start=..., end=...): ...
+    def bitop(self, operation, dest, *keys): ...
+    def bitpos(self, key, bit, start=..., end=...): ...
+    def decr(self, name, amount=...): ...
+    def delete(self, *names): ...
+    def __delitem__(self, name): ...
+    def dump(self, name): ...
+    def exists(self, name): ...
+    __contains__ = ...  # type: Any
+    def expire(self, name, time): ...
+    def expireat(self, name, when): ...
+    def get(self, name): ...
+    def __getitem__(self, name): ...
+    def getbit(self, name, offset): ...
+    def getrange(self, key, start, end): ...
+    def getset(self, name, value): ...
+    def incr(self, name, amount=...): ...
+    def incrby(self, name, amount=...): ...
+    def incrbyfloat(self, name, amount=...): ...
+    def keys(self, pattern=...): ...
+    def mget(self, keys, *args): ...
+    def mset(self, *args, **kwargs): ...
+    def msetnx(self, *args, **kwargs): ...
+    def move(self, name, db): ...
+    def persist(self, name): ...
+    def pexpire(self, name, time): ...
+    def pexpireat(self, name, when): ...
+    def psetex(self, name, time_ms, value): ...
+    def pttl(self, name): ...
+    def randomkey(self): ...
+    def rename(self, src, dst): ...
+    def renamenx(self, src, dst): ...
+    def restore(self, name, ttl, value): ...
+    def set(self, name, value, ex=..., px=..., nx=..., xx=...): ...
+    def __setitem__(self, name, value): ...
+    def setbit(self, name, offset, value): ...
+    def setex(self, name, time, value): ...
+    def setnx(self, name, value): ...
+    def setrange(self, name, offset, value): ...
+    def strlen(self, name): ...
+    def substr(self, name, start, end=...): ...
+    def ttl(self, name): ...
+    def type(self, name): ...
+    def watch(self, *names): ...
+    def unwatch(self): ...
+    def blpop(self, keys, timeout=...): ...
+    def brpop(self, keys, timeout=...): ...
+    def brpoplpush(self, src, dst, timeout=...): ...
+    def lindex(self, name, index): ...
+    def linsert(self, name, where, refvalue, value): ...
+    def llen(self, name): ...
+    def lpop(self, name): ...
+    def lpush(self, name, *values): ...
+    def lpushx(self, name, value): ...
+    def lrange(self, name, start, end): ...
+    def lrem(self, name, count, value): ...
+    def lset(self, name, index, value): ...
+    def ltrim(self, name, start, end): ...
+    def rpop(self, name): ...
+    def rpoplpush(self, src, dst): ...
+    def rpush(self, name, *values): ...
+    def rpushx(self, name, value): ...
+    def sort(self, name, start=..., num=..., by=..., get=..., desc=..., alpha=..., store=..., groups=...): ...
+    def scan(self, cursor=..., match=..., count=...): ...
+    def scan_iter(self, match=..., count=...): ...
+    def sscan(self, name, cursor=..., match=..., count=...): ...
+    def sscan_iter(self, name, match=..., count=...): ...
+    def hscan(self, name, cursor=..., match=..., count=...): ...
+    def hscan_iter(self, name, match=..., count=...): ...
+    def zscan(self, name, cursor=..., match=..., count=..., score_cast_func=...): ...
+    def zscan_iter(self, name, match=..., count=..., score_cast_func=...): ...
+    def sadd(self, name, *values): ...
+    def scard(self, name): ...
+    def sdiff(self, keys, *args): ...
+    def sdiffstore(self, dest, keys, *args): ...
+    def sinter(self, keys, *args): ...
+    def sinterstore(self, dest, keys, *args): ...
+    def sismember(self, name, value): ...
+    def smembers(self, name): ...
+    def smove(self, src, dst, value): ...
+    def spop(self, name): ...
+    def srandmember(self, name, number=...): ...
+    def srem(self, name, *values): ...
+    def sunion(self, keys, *args): ...
+    def sunionstore(self, dest, keys, *args): ...
+    def zadd(self, name, *args, **kwargs): ...
+    def zcard(self, name): ...
+    def zcount(self, name, min, max): ...
+    def zincrby(self, name, value, amount=...): ...
+    def zinterstore(self, dest, keys, aggregate=...): ...
+    def zlexcount(self, name, min, max): ...
+    def zrange(self, name, start, end, desc=..., withscores=..., score_cast_func=...): ...
+    def zrangebylex(self, name, min, max, start=..., num=...): ...
+    def zrangebyscore(self, name, min, max, start=..., num=..., withscores=..., score_cast_func=...): ...
+    def zrank(self, name, value): ...
+    def zrem(self, name, *values): ...
+    def zremrangebylex(self, name, min, max): ...
+    def zremrangebyrank(self, name, min, max): ...
+    def zremrangebyscore(self, name, min, max): ...
+    def zrevrange(self, name, start, end, withscores=..., score_cast_func=...): ...
+    def zrevrangebyscore(self, name, max, min, start=..., num=..., withscores=..., score_cast_func=...): ...
+    def zrevrank(self, name, value): ...
+    def zscore(self, name, value): ...
+    def zunionstore(self, dest, keys, aggregate=...): ...
+    def pfadd(self, name, *values): ...
+    def pfcount(self, name): ...
+    def pfmerge(self, dest, *sources): ...
+    def hdel(self, name, *keys): ...
+    def hexists(self, name, key): ...
+    def hget(self, name, key): ...
+    def hgetall(self, name): ...
+    def hincrby(self, name, key, amount=...): ...
+    def hincrbyfloat(self, name, key, amount=...): ...
+    def hkeys(self, name): ...
+    def hlen(self, name): ...
+    def hset(self, name, key, value): ...
+    def hsetnx(self, name, key, value): ...
+    def hmset(self, name, mapping): ...
+    def hmget(self, name, keys, *args): ...
+    def hvals(self, name): ...
+    def publish(self, channel, message): ...
+    def eval(self, script, numkeys, *keys_and_args): ...
+    def evalsha(self, sha, numkeys, *keys_and_args): ...
+    def script_exists(self, *args): ...
+    def script_flush(self): ...
+    def script_kill(self): ...
+    def script_load(self, script): ...
+    def register_script(self, script): ...
+
+class Redis(StrictRedis):
+    RESPONSE_CALLBACKS = ...  # type: Any
+    def pipeline(self, transaction=..., shard_hint=...): ...
+    def setex(self, name, value, time): ...
+    def lrem(self, name, value, num=...): ...
+    def zadd(self, name, *args, **kwargs): ...
+
+class PubSub:
+    PUBLISH_MESSAGE_TYPES = ...  # type: Any
+    UNSUBSCRIBE_MESSAGE_TYPES = ...  # type: Any
+    connection_pool = ...  # type: Any
+    shard_hint = ...  # type: Any
+    ignore_subscribe_messages = ...  # type: Any
+    connection = ...  # type: Any
+    encoding = ...  # type: Any
+    encoding_errors = ...  # type: Any
+    decode_responses = ...  # type: Any
+    def __init__(self, connection_pool, shard_hint=..., ignore_subscribe_messages=...) -> None: ...
+    def __del__(self): ...
+    channels = ...  # type: Any
+    patterns = ...  # type: Any
+    def reset(self): ...
+    def close(self): ...
+    def on_connect(self, connection): ...
+    def encode(self, value): ...
+    @property
+    def subscribed(self): ...
+    def execute_command(self, *args, **kwargs): ...
+    def parse_response(self, block=...): ...
+    def psubscribe(self, *args, **kwargs): ...
+    def punsubscribe(self, *args): ...
+    def subscribe(self, *args, **kwargs): ...
+    def unsubscribe(self, *args): ...
+    def listen(self): ...
+    def get_message(self, ignore_subscribe_messages=...): ...
+    def handle_message(self, response, ignore_subscribe_messages=...): ...
+    def run_in_thread(self, sleep_time=...): ...
+
+class BasePipeline:
+    UNWATCH_COMMANDS = ...  # type: Any
+    connection_pool = ...  # type: Any
+    connection = ...  # type: Any
+    response_callbacks = ...  # type: Any
+    transaction = ...  # type: Any
+    shard_hint = ...  # type: Any
+    watching = ...  # type: Any
+    def __init__(self, connection_pool, response_callbacks, transaction, shard_hint) -> None: ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_value, traceback): ...
+    def __del__(self): ...
+    def __len__(self): ...
+    command_stack = ...  # type: Any
+    scripts = ...  # type: Any
+    explicit_transaction = ...  # type: Any
+    def reset(self): ...
+    def multi(self): ...
+    def execute_command(self, *args, **kwargs): ...
+    def immediate_execute_command(self, *args, **options): ...
+    def pipeline_execute_command(self, *args, **options): ...
+    def raise_first_error(self, commands, response): ...
+    def annotate_exception(self, exception, number, command): ...
+    def parse_response(self, connection, command_name, **options): ...
+    def load_scripts(self): ...
+    def execute(self, raise_on_error=...): ...
+    def watch(self, *names): ...
+    def unwatch(self): ...
+    def script_load_for_pipeline(self, script): ...
+
+class StrictPipeline(BasePipeline, StrictRedis): ...
+class Pipeline(BasePipeline, Redis): ...
+
+class Script:
+    registered_client = ...  # type: Any
+    script = ...  # type: Any
+    sha = ...  # type: Any
+    def __init__(self, registered_client, script) -> None: ...
+    def __call__(self, keys=..., args=..., client=...): ...
diff --git a/typeshed/third_party/2/redis/connection.pyi b/typeshed/third_party/2/redis/connection.pyi
new file mode 100644
index 0000000..214cd8d
--- /dev/null
+++ b/typeshed/third_party/2/redis/connection.pyi
@@ -0,0 +1,135 @@
+# Stubs for redis.connection (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+ssl_available = ...  # type: Any
+hiredis_version = ...  # type: Any
+HIREDIS_SUPPORTS_CALLABLE_ERRORS = ...  # type: Any
+HIREDIS_SUPPORTS_BYTE_BUFFER = ...  # type: Any
+msg = ...  # type: Any
+HIREDIS_USE_BYTE_BUFFER = ...  # type: Any
+SYM_STAR = ...  # type: Any
+SYM_DOLLAR = ...  # type: Any
+SYM_CRLF = ...  # type: Any
+SYM_EMPTY = ...  # type: Any
+SERVER_CLOSED_CONNECTION_ERROR = ...  # type: Any
+
+class Token:
+    value = ...  # type: Any
+    def __init__(self, value) -> None: ...
+
+class BaseParser:
+    EXCEPTION_CLASSES = ...  # type: Any
+    def parse_error(self, response): ...
+
+class SocketBuffer:
+    socket_read_size = ...  # type: Any
+    bytes_written = ...  # type: Any
+    bytes_read = ...  # type: Any
+    def __init__(self, socket, socket_read_size) -> None: ...
+    @property
+    def length(self): ...
+    def read(self, length): ...
+    def readline(self): ...
+    def purge(self): ...
+    def close(self): ...
+
+class PythonParser(BaseParser):
+    encoding = ...  # type: Any
+    socket_read_size = ...  # type: Any
+    def __init__(self, socket_read_size) -> None: ...
+    def __del__(self): ...
+    def on_connect(self, connection): ...
+    def on_disconnect(self): ...
+    def can_read(self): ...
+    def read_response(self): ...
+
+class HiredisParser(BaseParser):
+    socket_read_size = ...  # type: Any
+    def __init__(self, socket_read_size) -> None: ...
+    def __del__(self): ...
+    def on_connect(self, connection): ...
+    def on_disconnect(self): ...
+    def can_read(self): ...
+    def read_response(self): ...
+
+DefaultParser = ...  # type: Any
+
+class Connection:
+    description_format = ...  # type: Any
+    pid = ...  # type: Any
+    host = ...  # type: Any
+    port = ...  # type: Any
+    db = ...  # type: Any
+    password = ...  # type: Any
+    socket_timeout = ...  # type: Any
+    socket_connect_timeout = ...  # type: Any
+    socket_keepalive = ...  # type: Any
+    socket_keepalive_options = ...  # type: Any
+    retry_on_timeout = ...  # type: Any
+    encoding = ...  # type: Any
+    encoding_errors = ...  # type: Any
+    decode_responses = ...  # type: Any
+    def __init__(self, host=..., port=..., db=..., password=..., socket_timeout=..., socket_connect_timeout=..., socket_keepalive=..., socket_keepalive_options=..., retry_on_timeout=..., encoding=..., encoding_errors=..., decode_responses=..., parser_class=..., socket_read_size=...) -> None: ...
+    def __del__(self): ...
+    def register_connect_callback(self, callback): ...
+    def clear_connect_callbacks(self): ...
+    def connect(self): ...
+    def on_connect(self): ...
+    def disconnect(self): ...
+    def send_packed_command(self, command): ...
+    def send_command(self, *args): ...
+    def can_read(self): ...
+    def read_response(self): ...
+    def encode(self, value): ...
+    def pack_command(self, *args): ...
+    def pack_commands(self, commands): ...
+
+class SSLConnection(Connection):
+    description_format = ...  # type: Any
+    keyfile = ...  # type: Any
+    certfile = ...  # type: Any
+    cert_reqs = ...  # type: Any
+    ca_certs = ...  # type: Any
+    def __init__(self, ssl_keyfile=..., ssl_certfile=..., ssl_cert_reqs=..., ssl_ca_certs=..., **kwargs) -> None: ...
+
+class UnixDomainSocketConnection(Connection):
+    description_format = ...  # type: Any
+    pid = ...  # type: Any
+    path = ...  # type: Any
+    db = ...  # type: Any
+    password = ...  # type: Any
+    socket_timeout = ...  # type: Any
+    retry_on_timeout = ...  # type: Any
+    encoding = ...  # type: Any
+    encoding_errors = ...  # type: Any
+    decode_responses = ...  # type: Any
+    def __init__(self, path=..., db=..., password=..., socket_timeout=..., encoding=..., encoding_errors=..., decode_responses=..., retry_on_timeout=..., parser_class=..., socket_read_size=...) -> None: ...
+
+class ConnectionPool:
+    @classmethod
+    def from_url(cls, url, db=..., **kwargs): ...
+    connection_class = ...  # type: Any
+    connection_kwargs = ...  # type: Any
+    max_connections = ...  # type: Any
+    def __init__(self, connection_class=..., max_connections=..., **connection_kwargs) -> None: ...
+    pid = ...  # type: Any
+    def reset(self): ...
+    def get_connection(self, command_name, *keys, **options): ...
+    def make_connection(self): ...
+    def release(self, connection): ...
+    def disconnect(self): ...
+
+class BlockingConnectionPool(ConnectionPool):
+    queue_class = ...  # type: Any
+    timeout = ...  # type: Any
+    def __init__(self, max_connections=..., timeout=..., connection_class=..., queue_class=..., **connection_kwargs) -> None: ...
+    pid = ...  # type: Any
+    pool = ...  # type: Any
+    def reset(self): ...
+    def make_connection(self): ...
+    def get_connection(self, command_name, *keys, **options): ...
+    def release(self, connection): ...
+    def disconnect(self): ...
diff --git a/typeshed/third_party/2/redis/exceptions.pyi b/typeshed/third_party/2/redis/exceptions.pyi
new file mode 100644
index 0000000..97a11f5
--- /dev/null
+++ b/typeshed/third_party/2/redis/exceptions.pyi
@@ -0,0 +1,21 @@
+# Stubs for redis.exceptions (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class RedisError(Exception): ...
+
+def __unicode__(self): ...
+
+class AuthenticationError(RedisError): ...
+class ConnectionError(RedisError): ...
+class TimeoutError(RedisError): ...
+class BusyLoadingError(ConnectionError): ...
+class InvalidResponse(RedisError): ...
+class ResponseError(RedisError): ...
+class DataError(RedisError): ...
+class PubSubError(RedisError): ...
+class WatchError(RedisError): ...
+class NoScriptError(ResponseError): ...
+class ExecAbortError(ResponseError): ...
+class ReadOnlyError(ResponseError): ...
+class LockError(RedisError, ValueError): ...
diff --git a/typeshed/third_party/2/redis/utils.pyi b/typeshed/third_party/2/redis/utils.pyi
new file mode 100644
index 0000000..fe1388c
--- /dev/null
+++ b/typeshed/third_party/2/redis/utils.pyi
@@ -0,0 +1,12 @@
+# Stubs for redis.utils (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+HIREDIS_AVAILABLE = ...  # type: Any
+
+def from_url(url, db=..., **kwargs): ...
+def pipeline(redis_obj): ...
+
+class dummy: ...
diff --git a/typeshed/third_party/2/requests/__init__.pyi b/typeshed/third_party/2/requests/__init__.pyi
new file mode 100644
index 0000000..51e4131
--- /dev/null
+++ b/typeshed/third_party/2/requests/__init__.pyi
@@ -0,0 +1,39 @@
+# Stubs for requests (based on version 2.6.0, Python 3)
+
+from typing import Any
+from requests import models
+from requests import api
+from requests import sessions
+from requests import status_codes
+from requests import exceptions
+import logging
+
+__title__ = ...  # type: Any
+__build__ = ...  # type: Any
+__license__ = ...  # type: Any
+__copyright__ = ...  # type: Any
+__version__ = ...  # type: Any
+
+Request = models.Request
+Response = models.Response
+PreparedRequest = models.PreparedRequest
+request = api.request
+get = api.get
+head = api.head
+post = api.post
+patch = api.patch
+put = api.put
+delete = api.delete
+options = api.options
+session = sessions.session
+Session = sessions.Session
+codes = status_codes.codes
+RequestException = exceptions.RequestException
+Timeout = exceptions.Timeout
+URLRequired = exceptions.URLRequired
+TooManyRedirects = exceptions.TooManyRedirects
+HTTPError = exceptions.HTTPError
+ConnectionError = exceptions.ConnectionError
+
+class NullHandler(logging.Handler):
+    def emit(self, record): ...
diff --git a/typeshed/third_party/2/requests/adapters.pyi b/typeshed/third_party/2/requests/adapters.pyi
new file mode 100644
index 0000000..00cc000
--- /dev/null
+++ b/typeshed/third_party/2/requests/adapters.pyi
@@ -0,0 +1,72 @@
+# Stubs for requests.adapters (Python 3)
+
+from typing import Any, Container, Union, Tuple
+from . import models
+from .packages.urllib3 import poolmanager
+from .packages.urllib3 import response
+from .packages.urllib3.util import retry
+from . import compat
+from . import utils
+from . import structures
+from .packages.urllib3 import exceptions as urllib3_exceptions
+from . import cookies
+from . import exceptions
+from . import auth
+
+PreparedRequest = models.PreparedRequest
+Response = models.Response
+PoolManager = poolmanager.PoolManager
+proxy_from_url = poolmanager.proxy_from_url
+HTTPResponse = response.HTTPResponse
+Retry = retry.Retry
+DEFAULT_CA_BUNDLE_PATH = utils.DEFAULT_CA_BUNDLE_PATH
+get_encoding_from_headers = utils.get_encoding_from_headers
+prepend_scheme_if_needed = utils.prepend_scheme_if_needed
+get_auth_from_url = utils.get_auth_from_url
+urldefragauth = utils.urldefragauth
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+ConnectTimeoutError = urllib3_exceptions.ConnectTimeoutError
+MaxRetryError = urllib3_exceptions.MaxRetryError
+ProtocolError = urllib3_exceptions.ProtocolError
+ReadTimeoutError = urllib3_exceptions.ReadTimeoutError
+ResponseError = urllib3_exceptions.ResponseError
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+ConnectionError = exceptions.ConnectionError
+ConnectTimeout = exceptions.ConnectTimeout
+ReadTimeout = exceptions.ReadTimeout
+SSLError = exceptions.SSLError
+ProxyError = exceptions.ProxyError
+RetryError = exceptions.RetryError
+
+DEFAULT_POOLBLOCK = ...  # type: Any
+DEFAULT_POOLSIZE = ...  # type: Any
+DEFAULT_RETRIES = ...  # type: Any
+
+class BaseAdapter:
+    def __init__(self) -> None: ...
+    def send(self, request: PreparedRequest, stream=False,
+             timeout: Union[None, float, Tuple[float, float]]=None,
+             verify=False,
+             cert: Union[None, Union[str, unicode, bytes], Container[Union[str, unicode]]]=None) -> Response: ...
+    def close(self) -> None: ...
+
+class HTTPAdapter(BaseAdapter):
+    __attrs__ = ...  # type: Any
+    max_retries = ...  # type: Any
+    config = ...  # type: Any
+    proxy_manager = ...  # type: Any
+    def __init__(self, pool_connections=..., pool_maxsize=..., max_retries=...,
+                 pool_block=...): ...
+    poolmanager = ...  # type: Any
+    def init_poolmanager(self, connections, maxsize, block=..., **pool_kwargs): ...
+    def proxy_manager_for(self, proxy, **proxy_kwargs): ...
+    def cert_verify(self, conn, url, verify, cert): ...
+    def build_response(self, req, resp): ...
+    def get_connection(self, url, proxies=...): ...
+    def close(self): ...
+    def request_url(self, request, proxies): ...
+    def add_headers(self, request, **kwargs): ...
+    def proxy_headers(self, proxy): ...
+    # TODO: "request" is not actually optional, modified to please mypy.
+    def send(self, request=..., stream=..., timeout=..., verify=..., cert=...,
+             proxies=...): ...
diff --git a/typeshed/third_party/2/requests/api.pyi b/typeshed/third_party/2/requests/api.pyi
new file mode 100644
index 0000000..785439e
--- /dev/null
+++ b/typeshed/third_party/2/requests/api.pyi
@@ -0,0 +1,21 @@
+# Stubs for requests.api (Python 3)
+
+from typing import Union, Optional, AnyStr
+
+from .models import Response
+
+def request(method: str, url: str, **kwargs) -> Response: ...
+
+def get(url: Union[str, unicode],
+        params: Optional[Union[dict[Union[str, unicode],
+                                    Union[str, unicode]],
+                               Union[str, unicode]]]=None,
+        **kwargs) -> Response: ...
+
+def options(url: Union[str, unicode], **kwargs) -> Response: ...
+def head(url: Union[str, unicode], **kwargs) -> Response: ...
+def post(url: Union[str, unicode], data=..., json=...,
+         **kwargs) -> Response: ...
+def put(url: Union[str, unicode], data=..., **kwargs) -> Response: ...
+def patch(url: Union[str, unicode], data=..., **kwargs) -> Response: ...
+def delete(url: Union[str, unicode], **kwargs) -> Response: ...
diff --git a/typeshed/third_party/2/requests/auth.pyi b/typeshed/third_party/2/requests/auth.pyi
new file mode 100644
index 0000000..8eea2b0
--- /dev/null
+++ b/typeshed/third_party/2/requests/auth.pyi
@@ -0,0 +1,41 @@
+# Stubs for requests.auth (Python 3)
+
+from typing import Any
+from . import compat
+from . import cookies
+from . import utils
+from . import status_codes
+
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+parse_dict_header = utils.parse_dict_header
+to_native_string = utils.to_native_string
+codes = status_codes.codes
+
+CONTENT_TYPE_FORM_URLENCODED = ...  # type: Any
+CONTENT_TYPE_MULTI_PART = ...  # type: Any
+
+class AuthBase:
+    def __call__(self, r): ...
+
+class HTTPBasicAuth(AuthBase):
+    username = ...  # type: Any
+    password = ...  # type: Any
+    def __init__(self, username, password) -> None: ...
+    def __call__(self, r): ...
+
+class HTTPProxyAuth(HTTPBasicAuth):
+    def __call__(self, r): ...
+
+class HTTPDigestAuth(AuthBase):
+    username = ...  # type: Any
+    password = ...  # type: Any
+    last_nonce = ...  # type: Any
+    nonce_count = ...  # type: Any
+    chal = ...  # type: Any
+    pos = ...  # type: Any
+    num_401_calls = ...  # type: Any
+    def __init__(self, username, password) -> None: ...
+    def build_digest_header(self, method, url): ...
+    def handle_redirect(self, r, **kwargs): ...
+    def handle_401(self, r, **kwargs): ...
+    def __call__(self, r): ...
diff --git a/typeshed/third_party/2/requests/compat.pyi b/typeshed/third_party/2/requests/compat.pyi
new file mode 100644
index 0000000..63b92f6
--- /dev/null
+++ b/typeshed/third_party/2/requests/compat.pyi
@@ -0,0 +1,6 @@
+# Stubs for requests.compat (Python 3.4)
+
+from typing import Any
+import collections
+
+OrderedDict = collections.OrderedDict
diff --git a/typeshed/third_party/2/requests/cookies.pyi b/typeshed/third_party/2/requests/cookies.pyi
new file mode 100644
index 0000000..6f56c82
--- /dev/null
+++ b/typeshed/third_party/2/requests/cookies.pyi
@@ -0,0 +1,61 @@
+# Stubs for requests.cookies (Python 3)
+
+from typing import Any, MutableMapping
+import collections
+from . import compat
+
+class MockRequest:
+    type = ...  # type: Any
+    def __init__(self, request) -> None: ...
+    def get_type(self): ...
+    def get_host(self): ...
+    def get_origin_req_host(self): ...
+    def get_full_url(self): ...
+    def is_unverifiable(self): ...
+    def has_header(self, name): ...
+    def get_header(self, name, default=...): ...
+    def add_header(self, key, val): ...
+    def add_unredirected_header(self, name, value): ...
+    def get_new_headers(self): ...
+    @property
+    def unverifiable(self): ...
+    @property
+    def origin_req_host(self): ...
+    @property
+    def host(self): ...
+
+class MockResponse:
+    def __init__(self, headers) -> None: ...
+    def info(self): ...
+    def getheaders(self, name): ...
+
+def extract_cookies_to_jar(jar, request, response): ...
+def get_cookie_header(jar, request): ...
+def remove_cookie_by_name(cookiejar, name, domain=..., path=...): ...
+
+class CookieConflictError(RuntimeError): ...
+
+class RequestsCookieJar(MutableMapping):
+    def get(self, name, default=..., domain=..., path=...): ...
+    def set(self, name, value, **kwargs): ...
+    def iterkeys(self): ...
+    def keys(self): ...
+    def itervalues(self): ...
+    def values(self): ...
+    def iteritems(self): ...
+    def items(self): ...
+    def list_domains(self): ...
+    def list_paths(self): ...
+    def multiple_domains(self): ...
+    def get_dict(self, domain=..., path=...): ...
+    def __getitem__(self, name): ...
+    def __setitem__(self, name, value): ...
+    def __delitem__(self, name): ...
+    def set_cookie(self, cookie, *args, **kwargs): ...
+    def update(self, other): ...
+    def copy(self): ...
+
+def create_cookie(name, value, **kwargs): ...
+def morsel_to_cookie(morsel): ...
+def cookiejar_from_dict(cookie_dict, cookiejar=..., overwrite=...): ...
+def merge_cookies(cookiejar, cookies): ...
diff --git a/typeshed/third_party/2/requests/exceptions.pyi b/typeshed/third_party/2/requests/exceptions.pyi
new file mode 100644
index 0000000..ff0c328
--- /dev/null
+++ b/typeshed/third_party/2/requests/exceptions.pyi
@@ -0,0 +1,26 @@
+# Stubs for requests.exceptions (Python 3)
+
+from typing import Any
+from .packages.urllib3.exceptions import HTTPError as BaseHTTPError
+
+class RequestException(IOError):
+    response = ...  # type: Any
+    request = ...  # type: Any
+    def __init__(self, *args, **kwargs) -> None: ...
+
+class HTTPError(RequestException): ...
+class ConnectionError(RequestException): ...
+class ProxyError(ConnectionError): ...
+class SSLError(ConnectionError): ...
+class Timeout(RequestException): ...
+class ConnectTimeout(ConnectionError, Timeout): ...
+class ReadTimeout(Timeout): ...
+class URLRequired(RequestException): ...
+class TooManyRedirects(RequestException): ...
+class MissingSchema(RequestException, ValueError): ...
+class InvalidSchema(RequestException, ValueError): ...
+class InvalidURL(RequestException, ValueError): ...
+class ChunkedEncodingError(RequestException): ...
+class ContentDecodingError(RequestException, BaseHTTPError): ...
+class StreamConsumedError(RequestException, TypeError): ...
+class RetryError(RequestException): ...
diff --git a/typeshed/third_party/2/requests/hooks.pyi b/typeshed/third_party/2/requests/hooks.pyi
new file mode 100644
index 0000000..3367d9a
--- /dev/null
+++ b/typeshed/third_party/2/requests/hooks.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.hooks (Python 3)
+
+from typing import Any
+
+HOOKS = ...  # type: Any
+
+def default_hooks(): ...
+def dispatch_hook(key, hooks, hook_data, **kwargs): ...
diff --git a/typeshed/third_party/2/requests/models.pyi b/typeshed/third_party/2/requests/models.pyi
new file mode 100644
index 0000000..a9f2b59
--- /dev/null
+++ b/typeshed/third_party/2/requests/models.pyi
@@ -0,0 +1,135 @@
+# Stubs for requests.models (Python 3)
+
+from typing import Any, List, MutableMapping, Iterator, Dict
+import datetime
+
+from . import hooks
+from . import structures
+from . import auth
+from . import cookies
+from .cookies import RequestsCookieJar
+from .packages.urllib3 import fields
+from .packages.urllib3 import filepost
+from .packages.urllib3 import util
+from .packages.urllib3 import exceptions as urllib3_exceptions
+from . import exceptions
+from . import utils
+from . import compat
+from . import status_codes
+
+from typing import Optional, Union
+
+default_hooks = hooks.default_hooks
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+HTTPBasicAuth = auth.HTTPBasicAuth
+cookiejar_from_dict = cookies.cookiejar_from_dict
+get_cookie_header = cookies.get_cookie_header
+RequestField = fields.RequestField
+encode_multipart_formdata = filepost.encode_multipart_formdata
+DecodeError = urllib3_exceptions.DecodeError
+ReadTimeoutError = urllib3_exceptions.ReadTimeoutError
+ProtocolError = urllib3_exceptions.ProtocolError
+LocationParseError = urllib3_exceptions.LocationParseError
+HTTPError = exceptions.HTTPError
+MissingSchema = exceptions.MissingSchema
+InvalidURL = exceptions.InvalidURL
+ChunkedEncodingError = exceptions.ChunkedEncodingError
+ContentDecodingError = exceptions.ContentDecodingError
+ConnectionError = exceptions.ConnectionError
+StreamConsumedError = exceptions.StreamConsumedError
+guess_filename = utils.guess_filename
+get_auth_from_url = utils.get_auth_from_url
+requote_uri = utils.requote_uri
+stream_decode_response_unicode = utils.stream_decode_response_unicode
+to_key_val_list = utils.to_key_val_list
+parse_header_links = utils.parse_header_links
+iter_slices = utils.iter_slices
+guess_json_utf = utils.guess_json_utf
+super_len = utils.super_len
+to_native_string = utils.to_native_string
+codes = status_codes.codes
+
+REDIRECT_STATI = ...  # type: Any
+DEFAULT_REDIRECT_LIMIT = ...  # type: Any
+CONTENT_CHUNK_SIZE = ...  # type: Any
+ITER_CHUNK_SIZE = ...  # type: Any
+json_dumps = ...  # type: Any
+
+class RequestEncodingMixin:
+    @property
+    def path_url(self): ...
+
+class RequestHooksMixin:
+    def register_hook(self, event, hook): ...
+    def deregister_hook(self, event, hook): ...
+
+class Request(RequestHooksMixin):
+    hooks = ...  # type: Any
+    method = ...  # type: Any
+    url = ...  # type: Any
+    headers = ...  # type: Any
+    files = ...  # type: Any
+    data = ...  # type: Any
+    json = ...  # type: Any
+    params = ...  # type: Any
+    auth = ...  # type: Any
+    cookies = ...  # type: Any
+    def __init__(self, method=..., url=..., headers=..., files=..., data=..., params=...,
+                 auth=..., cookies=..., hooks=..., json=...): ...
+    def prepare(self): ...
+
+class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
+    method = ...  # type: Optional[Union[str, unicode]]
+    url = ...  # type: Optional[Union[str, unicode]]
+    headers = ...  # type: CaseInsensitiveDict
+    body = ...  # type: Optional[Union[str, unicode]]
+    hooks = ...  # type: Any
+    def __init__(self) -> None: ...
+    def prepare(self, method=..., url=..., headers=..., files=..., data=..., params=...,
+                auth=..., cookies=..., hooks=..., json=...): ...
+    def copy(self): ...
+    def prepare_method(self, method): ...
+    def prepare_url(self, url, params): ...
+    def prepare_headers(self, headers): ...
+    def prepare_body(self, data, files, json=...): ...
+    def prepare_content_length(self, body): ...
+    def prepare_auth(self, auth, url=...): ...
+    def prepare_cookies(self, cookies): ...
+    def prepare_hooks(self, hooks): ...
+
+class Response:
+    __attrs__ = ...  # type: Any
+    status_code = ...  # type: int
+    headers = ...  # type: MutableMapping[str, str]
+    raw = ...  # type: Any
+    url = ...  # type: str
+    encoding = ...  # type: str
+    history = ...  # type: List[Response]
+    reason = ...  # type: str
+    cookies = ...  # type: RequestsCookieJar
+    elapsed = ...  # type: datetime.timedelta
+    request = ...  # type: PreparedRequest
+    def __init__(self) -> None: ...
+    def __bool__(self) -> bool: ...
+    def __nonzero__(self) -> bool: ...
+    def __iter__(self) -> Iterator[str]: ...
+    @property
+    def ok(self) -> bool: ...
+    @property
+    def is_redirect(self) -> bool: ...
+    @property
+    def is_permanent_redirect(self) -> bool: ...
+    @property
+    def apparent_encoding(self) -> str: ...
+    def iter_content(self, chunk_size: int = ...,
+                     decode_unicode: bool = ...) -> Iterator[Any]: ...
+    def iter_lines(self, chunk_size=..., decode_unicode=..., delimiter=...): ...
+    @property
+    def content(self) -> str: ...
+    @property
+    def text(self) -> str: ...
+    def json(self, **kwargs) -> Any: ...
+    @property
+    def links(self) -> Dict[Any, Any]: ...
+    def raise_for_status(self) -> None: ...
+    def close(self) -> None: ...
diff --git a/typeshed/third_party/2/requests/packages/__init__.pyi b/typeshed/third_party/2/requests/packages/__init__.pyi
new file mode 100644
index 0000000..2b1bff8
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/__init__.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.packages (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class VendorAlias:
+    def __init__(self, package_names) -> None: ...
+    def find_module(self, fullname, path=...): ...
+    def load_module(self, name): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/__init__.pyi b/typeshed/third_party/2/requests/packages/urllib3/__init__.pyi
new file mode 100644
index 0000000..38cf672
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/__init__.pyi
@@ -0,0 +1,12 @@
+# Stubs for requests.packages.urllib3 (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import logging
+
+class NullHandler(logging.Handler):
+    def emit(self, record): ...
+
+def add_stderr_logger(level=...): ...
+def disable_warnings(category=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/_collections.pyi b/typeshed/third_party/2/requests/packages/urllib3/_collections.pyi
new file mode 100644
index 0000000..58aa944
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/_collections.pyi
@@ -0,0 +1,51 @@
+# Stubs for requests.packages.urllib3._collections (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from collections import MutableMapping
+
+class RLock:
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_value, traceback): ...
+
+class RecentlyUsedContainer(MutableMapping):
+    ContainerCls = ...  # type: Any
+    dispose_func = ...  # type: Any
+    lock = ...  # type: Any
+    def __init__(self, maxsize=..., dispose_func=...) -> None: ...
+    def __getitem__(self, key): ...
+    def __setitem__(self, key, value): ...
+    def __delitem__(self, key): ...
+    def __len__(self): ...
+    def __iter__(self): ...
+    def clear(self): ...
+    def keys(self): ...
+
+class HTTPHeaderDict(dict):
+    def __init__(self, headers=..., **kwargs) -> None: ...
+    def __setitem__(self, key, val): ...
+    def __getitem__(self, key): ...
+    def __delitem__(self, key): ...
+    def __contains__(self, key): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    values = ...  # type: Any
+    get = ...  # type: Any
+    update = ...  # type: Any
+    iterkeys = ...  # type: Any
+    itervalues = ...  # type: Any
+    def pop(self, key, default=...): ...
+    def discard(self, key): ...
+    def add(self, key, val): ...
+    def extend(*args, **kwargs): ...
+    def getlist(self, key): ...
+    getheaders = ...  # type: Any
+    getallmatchingheaders = ...  # type: Any
+    iget = ...  # type: Any
+    def copy(self): ...
+    def iteritems(self): ...
+    def itermerged(self): ...
+    def items(self): ...
+    @classmethod
+    def from_httplib(cls, message, duplicates=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/connection.pyi b/typeshed/third_party/2/requests/packages/urllib3/connection.pyi
new file mode 100644
index 0000000..289fd18
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/connection.pyi
@@ -0,0 +1,51 @@
+# Stubs for requests.packages.urllib3.connection (Python 3.4)
+
+from typing import Any
+from httplib import HTTPException
+from . import packages
+from . import exceptions
+from . import util
+
+class DummyConnection: ...
+
+ConnectTimeoutError = exceptions.ConnectTimeoutError
+SystemTimeWarning = exceptions.SystemTimeWarning
+SecurityWarning = exceptions.SecurityWarning
+
+port_by_scheme = ...  # type: Any
+RECENT_DATE = ...  # type: Any
+
+class HTTPConnection(object):
+    default_port = ...  # type: Any
+    default_socket_options = ...  # type: Any
+    is_verified = ...  # type: Any
+    source_address = ...  # type: Any
+    socket_options = ...  # type: Any
+    def __init__(self, *args, **kw) -> None: ...
+    def connect(self): ...
+
+class HTTPSConnection(HTTPConnection):
+    default_port = ...  # type: Any
+    key_file = ...  # type: Any
+    cert_file = ...  # type: Any
+    def __init__(self, host, port=..., key_file=..., cert_file=..., strict=..., timeout=..., **kw) -> None: ...
+    sock = ...  # type: Any
+    def connect(self): ...
+
+class VerifiedHTTPSConnection(HTTPSConnection):
+    cert_reqs = ...  # type: Any
+    ca_certs = ...  # type: Any
+    ssl_version = ...  # type: Any
+    assert_fingerprint = ...  # type: Any
+    key_file = ...  # type: Any
+    cert_file = ...  # type: Any
+    assert_hostname = ...  # type: Any
+    def set_cert(self, key_file=..., cert_file=..., cert_reqs=..., ca_certs=..., assert_hostname=..., assert_fingerprint=...): ...
+    sock = ...  # type: Any
+    auto_open = ...  # type: Any
+    is_verified = ...  # type: Any
+    def connect(self): ...
+
+UnverifiedHTTPSConnection = ...  # type: Any
+
+class ConnectionError(Exception): pass
diff --git a/typeshed/third_party/2/requests/packages/urllib3/connectionpool.pyi b/typeshed/third_party/2/requests/packages/urllib3/connectionpool.pyi
new file mode 100644
index 0000000..03c3140
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/connectionpool.pyi
@@ -0,0 +1,87 @@
+# Stubs for requests.packages.urllib3.connectionpool (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from ssl import SSLError as BaseSSLError
+from . import exceptions
+from .packages import ssl_match_hostname
+from . import packages
+from . import connection
+from . import request
+from . import response
+from .util import connection as _connection
+from .util import retry
+from .util import timeout
+from .util import url
+
+ClosedPoolError = exceptions.ClosedPoolError
+ProtocolError = exceptions.ProtocolError
+EmptyPoolError = exceptions.EmptyPoolError
+HostChangedError = exceptions.HostChangedError
+LocationValueError = exceptions.LocationValueError
+MaxRetryError = exceptions.MaxRetryError
+ProxyError = exceptions.ProxyError
+ReadTimeoutError = exceptions.ReadTimeoutError
+SSLError = exceptions.SSLError
+TimeoutError = exceptions.TimeoutError
+InsecureRequestWarning = exceptions.InsecureRequestWarning
+CertificateError = ssl_match_hostname.CertificateError
+port_by_scheme = connection.port_by_scheme
+DummyConnection = connection.DummyConnection
+HTTPConnection = connection.HTTPConnection
+HTTPSConnection = connection.HTTPSConnection
+VerifiedHTTPSConnection = connection.VerifiedHTTPSConnection
+HTTPException = connection.HTTPException
+ConnectionError = connection.ConnectionError
+RequestMethods = request.RequestMethods
+HTTPResponse = response.HTTPResponse
+is_connection_dropped = _connection.is_connection_dropped
+Retry = retry.Retry
+Timeout = timeout.Timeout
+get_host = url.get_host
+
+xrange = ...  # type: Any
+log = ...  # type: Any
+
+class ConnectionPool:
+    scheme = ...  # type: Any
+    QueueCls = ...  # type: Any
+    host = ...  # type: Any
+    port = ...  # type: Any
+    def __init__(self, host, port=...) -> None: ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_val, exc_tb): ...
+    def close(self): ...
+
+class HTTPConnectionPool(ConnectionPool, RequestMethods):
+    scheme = ...  # type: Any
+    ConnectionCls = ...  # type: Any
+    strict = ...  # type: Any
+    timeout = ...  # type: Any
+    retries = ...  # type: Any
+    pool = ...  # type: Any
+    block = ...  # type: Any
+    proxy = ...  # type: Any
+    proxy_headers = ...  # type: Any
+    num_connections = ...  # type: Any
+    num_requests = ...  # type: Any
+    conn_kw = ...  # type: Any
+    def __init__(self, host, port=..., strict=..., timeout=..., maxsize=..., block=..., headers=..., retries=..., _proxy=..., _proxy_headers=..., **conn_kw) -> None: ...
+    def close(self): ...
+    def is_same_host(self, url): ...
+    def urlopen(self, method, url, body=..., headers=..., retries=..., redirect=..., assert_same_host=..., timeout=..., pool_timeout=..., release_conn=..., **response_kw): ...
+
+class HTTPSConnectionPool(HTTPConnectionPool):
+    scheme = ...  # type: Any
+    ConnectionCls = ...  # type: Any
+    key_file = ...  # type: Any
+    cert_file = ...  # type: Any
+    cert_reqs = ...  # type: Any
+    ca_certs = ...  # type: Any
+    ssl_version = ...  # type: Any
+    assert_hostname = ...  # type: Any
+    assert_fingerprint = ...  # type: Any
+    def __init__(self, host, port=..., strict=..., timeout=..., maxsize=..., block=..., headers=..., retries=..., _proxy=..., _proxy_headers=..., key_file=..., cert_file=..., cert_reqs=..., ca_certs=..., ssl_version=..., assert_hostname=..., assert_fingerprint=..., **conn_kw) -> None: ...
+
+def connection_from_url(url, **kw): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/contrib/__init__.pyi b/typeshed/third_party/2/requests/packages/urllib3/contrib/__init__.pyi
new file mode 100644
index 0000000..69e47f7
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/contrib/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for requests.packages.urllib3.contrib (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2/requests/packages/urllib3/exceptions.pyi b/typeshed/third_party/2/requests/packages/urllib3/exceptions.pyi
new file mode 100644
index 0000000..3e7d0f6
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/exceptions.pyi
@@ -0,0 +1,54 @@
+# Stubs for requests.packages.urllib3.exceptions (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class HTTPError(Exception): ...
+class HTTPWarning(Warning): ...
+
+class PoolError(HTTPError):
+    pool = ...  # type: Any
+    def __init__(self, pool, message) -> None: ...
+    def __reduce__(self): ...
+
+class RequestError(PoolError):
+    url = ...  # type: Any
+    def __init__(self, pool, url, message) -> None: ...
+    def __reduce__(self): ...
+
+class SSLError(HTTPError): ...
+class ProxyError(HTTPError): ...
+class DecodeError(HTTPError): ...
+class ProtocolError(HTTPError): ...
+
+ConnectionError = ...  # type: Any
+
+class MaxRetryError(RequestError):
+    reason = ...  # type: Any
+    def __init__(self, pool, url, reason=...) -> None: ...
+
+class HostChangedError(RequestError):
+    retries = ...  # type: Any
+    def __init__(self, pool, url, retries=...) -> None: ...
+
+class TimeoutStateError(HTTPError): ...
+class TimeoutError(HTTPError): ...
+class ReadTimeoutError(TimeoutError, RequestError): ...
+class ConnectTimeoutError(TimeoutError): ...
+class EmptyPoolError(PoolError): ...
+class ClosedPoolError(PoolError): ...
+class LocationValueError(ValueError, HTTPError): ...
+
+class LocationParseError(LocationValueError):
+    location = ...  # type: Any
+    def __init__(self, location) -> None: ...
+
+class ResponseError(HTTPError):
+    GENERIC_ERROR = ...  # type: Any
+    SPECIFIC_ERROR = ...  # type: Any
+
+class SecurityWarning(HTTPWarning): ...
+class InsecureRequestWarning(SecurityWarning): ...
+class SystemTimeWarning(SecurityWarning): ...
+class InsecurePlatformWarning(SecurityWarning): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/fields.pyi b/typeshed/third_party/2/requests/packages/urllib3/fields.pyi
new file mode 100644
index 0000000..cdc7734
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/fields.pyi
@@ -0,0 +1,16 @@
+# Stubs for requests.packages.urllib3.fields (Python 3.4)
+
+from typing import Any
+from . import packages
+
+def guess_content_type(filename, default=...): ...
+def format_header_param(name, value): ...
+
+class RequestField:
+    data = ...  # type: Any
+    headers = ...  # type: Any
+    def __init__(self, name, data, filename=..., headers=...) -> None: ...
+    @classmethod
+    def from_tuples(cls, fieldname, value): ...
+    def render_headers(self): ...
+    def make_multipart(self, content_disposition=..., content_type=..., content_location=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/filepost.pyi b/typeshed/third_party/2/requests/packages/urllib3/filepost.pyi
new file mode 100644
index 0000000..f1ce517
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/filepost.pyi
@@ -0,0 +1,19 @@
+# Stubs for requests.packages.urllib3.filepost (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import packages
+# from .packages import six
+from . import fields
+
+# six = packages.six
+# b = six.b
+RequestField = fields.RequestField
+
+writer = ...  # type: Any
+
+def choose_boundary(): ...
+def iter_field_objects(fields): ...
+def iter_fields(fields): ...
+def encode_multipart_formdata(fields, boundary=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/packages/__init__.pyi b/typeshed/third_party/2/requests/packages/urllib3/packages/__init__.pyi
new file mode 100644
index 0000000..67507f9
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/packages/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for requests.packages.urllib3.packages (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi b/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
new file mode 100644
index 0000000..05c03dc
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
@@ -0,0 +1 @@
+class CertificateError(ValueError): pass
diff --git a/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi b/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
new file mode 100644
index 0000000..5abbc9d
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
@@ -0,0 +1,7 @@
+# Stubs for requests.packages.urllib3.packages.ssl_match_hostname._implementation (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class CertificateError(ValueError): ...
+
+def match_hostname(cert, hostname): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/poolmanager.pyi b/typeshed/third_party/2/requests/packages/urllib3/poolmanager.pyi
new file mode 100644
index 0000000..a65f664
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/poolmanager.pyi
@@ -0,0 +1,31 @@
+# Stubs for requests.packages.urllib3.poolmanager (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .request import RequestMethods
+
+class PoolManager(RequestMethods):
+    proxy = ...  # type: Any
+    connection_pool_kw = ...  # type: Any
+    pools = ...  # type: Any
+    def __init__(self, num_pools=..., headers=..., **connection_pool_kw) -> None: ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_val, exc_tb): ...
+    def clear(self): ...
+    def connection_from_host(self, host, port=..., scheme=...): ...
+    def connection_from_url(self, url): ...
+    # TODO: This was the original signature -- copied another one from base class to fix complaint.
+    # def urlopen(self, method, url, redirect=True, **kw): ...
+    def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+
+class ProxyManager(PoolManager):
+    proxy = ...  # type: Any
+    proxy_headers = ...  # type: Any
+    def __init__(self, proxy_url, num_pools=..., headers=..., proxy_headers=..., **connection_pool_kw) -> None: ...
+    def connection_from_host(self, host, port=..., scheme=...): ...
+    # TODO: This was the original signature -- copied another one from base class to fix complaint.
+    # def urlopen(self, method, url, redirect=True, **kw): ...
+    def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+
+def proxy_from_url(url, **kw): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/request.pyi b/typeshed/third_party/2/requests/packages/urllib3/request.pyi
new file mode 100644
index 0000000..788c759
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/request.pyi
@@ -0,0 +1,13 @@
+# Stubs for requests.packages.urllib3.request (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class RequestMethods:
+    headers = ...  # type: Any
+    def __init__(self, headers=...) -> None: ...
+    def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+    def request(self, method, url, fields=..., headers=..., **urlopen_kw): ...
+    def request_encode_url(self, method, url, fields=..., **urlopen_kw): ...
+    def request_encode_body(self, method, url, fields=..., headers=..., encode_multipart=..., multipart_boundary=..., **urlopen_kw): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/response.pyi b/typeshed/third_party/2/requests/packages/urllib3/response.pyi
new file mode 100644
index 0000000..9e310d2
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/response.pyi
@@ -0,0 +1,58 @@
+# Stubs for requests.packages.urllib3.response (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, IO
+import io
+from . import _collections
+from . import exceptions
+# from .packages import six
+from . import connection
+from .util import response
+
+HTTPHeaderDict = _collections.HTTPHeaderDict
+ProtocolError = exceptions.ProtocolError
+DecodeError = exceptions.DecodeError
+ReadTimeoutError = exceptions.ReadTimeoutError
+binary_type = str  # six.binary_type
+PY3 = True  # six.PY3
+is_fp_closed = response.is_fp_closed
+
+class DeflateDecoder:
+    def __init__(self) -> None: ...
+    def __getattr__(self, name): ...
+    def decompress(self, data): ...
+
+class GzipDecoder:
+    def __init__(self) -> None: ...
+    def __getattr__(self, name): ...
+    def decompress(self, data): ...
+
+class HTTPResponse(IO[Any]):
+    CONTENT_DECODERS = ...  # type: Any
+    REDIRECT_STATUSES = ...  # type: Any
+    headers = ...  # type: Any
+    status = ...  # type: Any
+    version = ...  # type: Any
+    reason = ...  # type: Any
+    strict = ...  # type: Any
+    decode_content = ...  # type: Any
+    def __init__(self, body=..., headers=..., status=..., version=..., reason=..., strict=..., preload_content=..., decode_content=..., original_response=..., pool=..., connection=...) -> None: ...
+    def get_redirect_location(self): ...
+    def release_conn(self): ...
+    @property
+    def data(self): ...
+    def tell(self): ...
+    def read(self, amt=..., decode_content=..., cache_content=...): ...
+    def stream(self, amt=..., decode_content=...): ...
+    @classmethod
+    def from_httplib(ResponseCls, r, **response_kw): ...
+    def getheaders(self): ...
+    def getheader(self, name, default=...): ...
+    def close(self): ...
+    @property
+    def closed(self): ...
+    def fileno(self): ...
+    def flush(self): ...
+    def readable(self): ...
+    def readinto(self, b): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/__init__.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/__init__.pyi
new file mode 100644
index 0000000..0a2c9ba
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/__init__.pyi
@@ -0,0 +1,6 @@
+# Stubs for requests.packages.urllib3.util (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import connection
+from . import request
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/connection.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/connection.pyi
new file mode 100644
index 0000000..cd67309
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/connection.pyi
@@ -0,0 +1,11 @@
+# Stubs for requests.packages.urllib3.util.connection (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+poll = ...  # type: Any
+select = ...  # type: Any
+
+def is_connection_dropped(conn): ...
+def create_connection(address, timeout=..., source_address=..., socket_options=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/request.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/request.pyi
new file mode 100644
index 0000000..0be64df
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/request.pyi
@@ -0,0 +1,12 @@
+# Stubs for requests.packages.urllib3.util.request (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+# from ..packages import six
+
+# b = six.b
+
+ACCEPT_ENCODING = ...  # type: Any
+
+def make_headers(keep_alive=..., accept_encoding=..., user_agent=..., basic_auth=..., proxy_basic_auth=..., disable_cache=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/response.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/response.pyi
new file mode 100644
index 0000000..761a006
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/response.pyi
@@ -0,0 +1,5 @@
+# Stubs for requests.packages.urllib3.util.response (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def is_fp_closed(obj): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/retry.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/retry.pyi
new file mode 100644
index 0000000..e958d90
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/retry.pyi
@@ -0,0 +1,36 @@
+# Stubs for requests.packages.urllib3.util.retry (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+from .. import packages
+
+ConnectTimeoutError = exceptions.ConnectTimeoutError
+MaxRetryError = exceptions.MaxRetryError
+ProtocolError = exceptions.ProtocolError
+ReadTimeoutError = exceptions.ReadTimeoutError
+ResponseError = exceptions.ResponseError
+
+log = ...  # type: Any
+
+class Retry:
+    DEFAULT_METHOD_WHITELIST = ...  # type: Any
+    BACKOFF_MAX = ...  # type: Any
+    total = ...  # type: Any
+    connect = ...  # type: Any
+    read = ...  # type: Any
+    redirect = ...  # type: Any
+    status_forcelist = ...  # type: Any
+    method_whitelist = ...  # type: Any
+    backoff_factor = ...  # type: Any
+    raise_on_redirect = ...  # type: Any
+    def __init__(self, total=..., connect=..., read=..., redirect=..., method_whitelist=..., status_forcelist=..., backoff_factor=..., raise_on_redirect=..., _observed_errors=...) -> None: ...
+    def new(self, **kw): ...
+    @classmethod
+    def from_int(cls, retries, redirect=..., default=...): ...
+    def get_backoff_time(self): ...
+    def sleep(self): ...
+    def is_forced_retry(self, method, status_code): ...
+    def is_exhausted(self): ...
+    def increment(self, method=..., url=..., response=..., error=..., _pool=..., _stacktrace=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/timeout.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/timeout.pyi
new file mode 100644
index 0000000..0a7653c
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/timeout.pyi
@@ -0,0 +1,24 @@
+# Stubs for requests.packages.urllib3.util.timeout (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+
+TimeoutStateError = exceptions.TimeoutStateError
+
+def current_time(): ...
+
+class Timeout:
+    DEFAULT_TIMEOUT = ...  # type: Any
+    total = ...  # type: Any
+    def __init__(self, total=..., connect=..., read=...) -> None: ...
+    @classmethod
+    def from_float(cls, timeout): ...
+    def clone(self): ...
+    def start_connect(self): ...
+    def get_connect_duration(self): ...
+    @property
+    def connect_timeout(self): ...
+    @property
+    def read_timeout(self): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/url.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/url.pyi
new file mode 100644
index 0000000..9877b4a
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/url.pyi
@@ -0,0 +1,26 @@
+# Stubs for requests.packages.urllib3.util.url (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+
+LocationParseError = exceptions.LocationParseError
+
+url_attrs = ...  # type: Any
+
+class Url:
+    slots = ...  # type: Any
+    def __new__(cls, scheme=..., auth=..., host=..., port=..., path=..., query=..., fragment=...): ...
+    @property
+    def hostname(self): ...
+    @property
+    def request_uri(self): ...
+    @property
+    def netloc(self): ...
+    @property
+    def url(self): ...
+
+def split_first(s, delims): ...
+def parse_url(url): ...
+def get_host(url): ...
diff --git a/typeshed/third_party/2/requests/sessions.pyi b/typeshed/third_party/2/requests/sessions.pyi
new file mode 100644
index 0000000..9cc60d2
--- /dev/null
+++ b/typeshed/third_party/2/requests/sessions.pyi
@@ -0,0 +1,106 @@
+# Stubs for requests.sessions (Python 2.7)
+
+from typing import Any, Union, MutableMapping, Text, Optional, IO, Tuple, Callable
+from . import adapters
+from . import auth
+from . import compat
+from . import cookies
+from . import models
+from .models import Response
+from . import hooks
+from . import utils
+from . import exceptions
+from .packages.urllib3 import _collections
+from . import structures
+from . import adapters
+from . import status_codes
+
+BaseAdapter = adapters.BaseAdapter
+OrderedDict = compat.OrderedDict
+cookiejar_from_dict = cookies.cookiejar_from_dict
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+RequestsCookieJar = cookies.RequestsCookieJar
+merge_cookies = cookies.merge_cookies
+Request = models.Request
+PreparedRequest = models.PreparedRequest
+DEFAULT_REDIRECT_LIMIT = models.DEFAULT_REDIRECT_LIMIT
+default_hooks = hooks.default_hooks
+dispatch_hook = hooks.dispatch_hook
+to_key_val_list = utils.to_key_val_list
+default_headers = utils.default_headers
+to_native_string = utils.to_native_string
+TooManyRedirects = exceptions.TooManyRedirects
+InvalidSchema = exceptions.InvalidSchema
+ChunkedEncodingError = exceptions.ChunkedEncodingError
+ContentDecodingError = exceptions.ContentDecodingError
+RecentlyUsedContainer = _collections.RecentlyUsedContainer
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+HTTPAdapter = adapters.HTTPAdapter
+requote_uri = utils.requote_uri
+get_environ_proxies = utils.get_environ_proxies
+get_netrc_auth = utils.get_netrc_auth
+should_bypass_proxies = utils.should_bypass_proxies
+get_auth_from_url = utils.get_auth_from_url
+codes = status_codes.codes
+REDIRECT_STATI = models.REDIRECT_STATI
+
+REDIRECT_CACHE_SIZE = ...  # type: Any
+
+def merge_setting(request_setting, session_setting, dict_class=...): ...
+def merge_hooks(request_hooks, session_hooks, dict_class=...): ...
+
+class SessionRedirectMixin:
+    def resolve_redirects(self, resp, req, stream=..., timeout=..., verify=..., cert=...,
+                          proxies=...): ...
+    def rebuild_auth(self, prepared_request, response): ...
+    def rebuild_proxies(self, prepared_request, proxies): ...
+
+class Session(SessionRedirectMixin):
+    __attrs__ = ...  # type: Any
+    headers = ...  # type: Optional[MutableMapping[Text, Text]]
+    auth = ...  # type: Union[None, Tuple[Text, Text], Callable[[Request], Request]]
+    proxies = ...  # type: Optional[MutableMapping[Text, Text]]
+    hooks = ...  # type: Optional[MutableMapping[Text, Callable[[Request], Any]]]
+    params = ...  # type: Union[None, bytes, MutableMapping[Text, Text]]
+    stream = ...  # type: bool
+    verify = ...  # type: bool
+    cert = ...  # type: Union[None, Text, Tuple[Text, Text]]
+    max_redirects = ...  # type: int
+    trust_env = ...  # type: bool
+    cookies = ...  # type: Union[None, RequestsCookieJar, MutableMapping[Text, Text]]
+    adapters = ...  # type: MutableMapping
+    redirect_cache = ...  # type: RecentlyUsedContainer
+    def __init__(self) -> None: ...
+    def __enter__(self) -> 'Session': ...
+    def __exit__(self, *args) -> None: ...
+    def prepare_request(self, request): ...
+    def request(self, method: str, url: str,
+                params,  # type: Union[None, bytes, MutableMapping[Text, Text]]
+                data,  # type: Union[None, bytes, MutableMapping[Text, Text], IO]
+                headers,  # type: Optional[MutableMapping[Text, Text]]
+                cookies,  # type: Union[None, RequestsCookieJar, MutableMapping[Text, Text]]
+                files,  # type: Optional[MutableMapping[Text, IO]]
+                auth,  # type: Union[None, Tuple[Text, Text], Callable[[Request], Request]]
+                timeout,  # type: Union[None, float, Tuple[float, float]]
+                allow_redirects,  # type: Optional[bool]
+                proxies,  # type: Optional[MutableMapping[Text, Text]]
+                hooks,  # type: Optional[MutableMapping[Text, Callable[[Request], Any]]]
+                stream,  # type: Optional[bool]
+                verify,  # type: Optional[bool]
+                cert,  # type: Union[Text, Tuple[Text, Text], None]
+                json  # type: Optional[MutableMapping]
+                ) -> Response: ...
+    def get(self, url: str, **kwargs) -> Response: ...
+    def options(self, url: str, **kwargs) -> Response: ...
+    def head(self, url: str, **kwargs) -> Response: ...
+    def post(self, url: str, data=..., json=..., **kwargs) -> Response: ...
+    def put(self, url: str, data=..., **kwargs) -> Response: ...
+    def patch(self, url: str, data=..., **kwargs) -> Response: ...
+    def delete(self, url: str, **kwargs) -> Response: ...
+    def send(self, request, **kwargs): ...
+    def merge_environment_settings(self, url, proxies, stream, verify, cert): ...
+    def get_adapter(self, url): ...
+    def close(self) -> None: ...
+    def mount(self, prefix: str, adapter: BaseAdapter) -> None: ...
+
+def session() -> Session: ...
diff --git a/typeshed/third_party/2/requests/status_codes.pyi b/typeshed/third_party/2/requests/status_codes.pyi
new file mode 100644
index 0000000..e3035eb
--- /dev/null
+++ b/typeshed/third_party/2/requests/status_codes.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.status_codes (Python 3)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .structures import LookupDict
+
+codes = ...  # type: Any
diff --git a/typeshed/third_party/2/requests/structures.pyi b/typeshed/third_party/2/requests/structures.pyi
new file mode 100644
index 0000000..a7f77b2
--- /dev/null
+++ b/typeshed/third_party/2/requests/structures.pyi
@@ -0,0 +1,12 @@
+# Stubs for requests.structures (Python 3)
+
+from typing import Any, Iterator, MutableMapping, Tuple, Union
+
+class CaseInsensitiveDict(MutableMapping[str, Union[str, unicode]]):
+    def lower_items(self) -> Iterator[Tuple[str, Union[str, unicode]]]: ...
+
+class LookupDict(dict):
+    name = ...  # type: Any
+    def __init__(self, name=...) -> None: ...
+    def __getitem__(self, key): ...
+    def get(self, key, default=...): ...
diff --git a/typeshed/third_party/2/requests/utils.pyi b/typeshed/third_party/2/requests/utils.pyi
new file mode 100644
index 0000000..945277a
--- /dev/null
+++ b/typeshed/third_party/2/requests/utils.pyi
@@ -0,0 +1,52 @@
+# Stubs for requests.utils (Python 3)
+
+from typing import Any
+from . import compat
+from . import cookies
+from . import structures
+from . import exceptions
+
+OrderedDict = compat.OrderedDict
+RequestsCookieJar = cookies.RequestsCookieJar
+cookiejar_from_dict = cookies.cookiejar_from_dict
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+InvalidURL = exceptions.InvalidURL
+
+NETRC_FILES = ...  # type: Any
+DEFAULT_CA_BUNDLE_PATH = ...  # type: Any
+
+def dict_to_sequence(d): ...
+def super_len(o): ...
+def get_netrc_auth(url): ...
+def guess_filename(obj): ...
+def from_key_val_list(value): ...
+def to_key_val_list(value): ...
+def parse_list_header(value): ...
+def parse_dict_header(value): ...
+def unquote_header_value(value, is_filename=...): ...
+def dict_from_cookiejar(cj): ...
+def add_dict_to_cookiejar(cj, cookie_dict): ...
+def get_encodings_from_content(content): ...
+def get_encoding_from_headers(headers): ...
+def stream_decode_response_unicode(iterator, r): ...
+def iter_slices(string, slice_length): ...
+def get_unicode_from_response(r): ...
+
+UNRESERVED_SET = ...  # type: Any
+
+def unquote_unreserved(uri): ...
+def requote_uri(uri): ...
+def address_in_network(ip, net): ...
+def dotted_netmask(mask): ...
+def is_ipv4_address(string_ip): ...
+def is_valid_cidr(string_network): ...
+def should_bypass_proxies(url): ...
+def get_environ_proxies(url): ...
+def default_user_agent(name=...): ...
+def default_headers(): ...
+def parse_header_links(value): ...
+def guess_json_utf(data): ...
+def prepend_scheme_if_needed(url, new_scheme): ...
+def get_auth_from_url(url): ...
+def to_native_string(string, encoding=...): ...
+def urldefragauth(url): ...
diff --git a/typeshed/third_party/2/routes/__init__.pyi b/typeshed/third_party/2/routes/__init__.pyi
new file mode 100644
index 0000000..5d7864d
--- /dev/null
+++ b/typeshed/third_party/2/routes/__init__.pyi
@@ -0,0 +1,19 @@
+# Stubs for routes (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import mapper
+from . import util
+
+class _RequestConfig:
+    def __getattr__(self, name): ...
+    def __setattr__(self, name, value): ...
+    def __delattr__(self, name): ...
+    def load_wsgi_environ(self, environ): ...
+
+def request_config(original=...): ...
+
+Mapper = mapper.Mapper
+redirect_to = util.redirect_to
+url_for = util.url_for
+URLGenerator = util.URLGenerator
diff --git a/typeshed/third_party/2/routes/mapper.pyi b/typeshed/third_party/2/routes/mapper.pyi
new file mode 100644
index 0000000..573a2ef
--- /dev/null
+++ b/typeshed/third_party/2/routes/mapper.pyi
@@ -0,0 +1,70 @@
+# Stubs for routes.mapper (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+COLLECTION_ACTIONS = ...  # type: Any
+MEMBER_ACTIONS = ...  # type: Any
+
+def strip_slashes(name): ...
+
+class SubMapperParent:
+    def submapper(self, **kargs): ...
+    def collection(self, collection_name, resource_name, path_prefix=..., member_prefix=..., controller=..., collection_actions=..., member_actions=..., member_options=..., **kwargs): ...
+
+class SubMapper(SubMapperParent):
+    kwargs = ...  # type: Any
+    obj = ...  # type: Any
+    collection_name = ...  # type: Any
+    member = ...  # type: Any
+    resource_name = ...  # type: Any
+    formatted = ...  # type: Any
+    def __init__(self, obj, resource_name=..., collection_name=..., actions=..., formatted=..., **kwargs) -> None: ...
+    def connect(self, *args, **kwargs): ...
+    def link(self, rel=..., name=..., action=..., method=..., formatted=..., **kwargs): ...
+    def new(self, **kwargs): ...
+    def edit(self, **kwargs): ...
+    def action(self, name=..., action=..., method=..., formatted=..., **kwargs): ...
+    def index(self, name=..., **kwargs): ...
+    def show(self, name=..., **kwargs): ...
+    def create(self, **kwargs): ...
+    def update(self, **kwargs): ...
+    def delete(self, **kwargs): ...
+    def add_actions(self, actions): ...
+    def __enter__(self): ...
+    def __exit__(self, type, value, tb): ...
+
+class Mapper(SubMapperParent):
+    matchlist = ...  # type: Any
+    maxkeys = ...  # type: Any
+    minkeys = ...  # type: Any
+    urlcache = ...  # type: Any
+    prefix = ...  # type: Any
+    req_data = ...  # type: Any
+    directory = ...  # type: Any
+    always_scan = ...  # type: Any
+    controller_scan = ...  # type: Any
+    debug = ...  # type: Any
+    append_slash = ...  # type: Any
+    sub_domains = ...  # type: Any
+    sub_domains_ignore = ...  # type: Any
+    domain_match = ...  # type: Any
+    explicit = ...  # type: Any
+    encoding = ...  # type: Any
+    decode_errors = ...  # type: Any
+    hardcode_names = ...  # type: Any
+    minimization = ...  # type: Any
+    create_regs_lock = ...  # type: Any
+    def __init__(self, controller_scan=..., directory=..., always_scan=..., register=..., explicit=...) -> None: ...
+    environ = ...  # type: Any
+    def extend(self, routes, path_prefix=...): ...
+    def make_route(self, *args, **kargs): ...
+    def connect(self, *args, **kargs): ...
+    def create_regs(self, *args, **kwargs): ...
+    def match(self, url=..., environ=...): ...
+    def routematch(self, url=..., environ=...): ...
+    obj = ...  # type: Any
+    def generate(self, *args, **kargs): ...
+    def resource(self, member_name, collection_name, **kwargs): ...
+    def redirect(self, match_path, destination_path, *args, **kwargs): ...
diff --git a/typeshed/third_party/2/routes/util.pyi b/typeshed/third_party/2/routes/util.pyi
new file mode 100644
index 0000000..e5210e3
--- /dev/null
+++ b/typeshed/third_party/2/routes/util.pyi
@@ -0,0 +1,24 @@
+# Stubs for routes.util (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class RoutesException(Exception): ...
+class MatchException(RoutesException): ...
+class GenerationException(RoutesException): ...
+
+def url_for(*args, **kargs): ...
+
+class URLGenerator:
+    mapper = ...  # type: Any
+    environ = ...  # type: Any
+    def __init__(self, mapper, environ) -> None: ...
+    def __call__(self, *args, **kargs): ...
+    def current(self, *args, **kwargs): ...
+
+def redirect_to(*args, **kargs): ...
+def cache_hostinfo(environ): ...
+def controller_scan(directory=...): ...
+def as_unicode(value, encoding, errors=...): ...
+def ascii_characters(string): ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/scribe/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/scribe/__init__.pyi
diff --git a/typeshed/third_party/2/scribe/scribe.pyi b/typeshed/third_party/2/scribe/scribe.pyi
new file mode 100644
index 0000000..ec2a71f
--- /dev/null
+++ b/typeshed/third_party/2/scribe/scribe.pyi
@@ -0,0 +1,43 @@
+# Stubs for scribe.scribe (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+import fb303.FacebookService
+from .ttypes import *  # noqa: F403
+from thrift.Thrift import TProcessor
+
+class Iface(fb303.FacebookService.Iface):
+    def Log(self, messages): ...
+
+class Client(fb303.FacebookService.Client, Iface):
+    def __init__(self, iprot, oprot=...) -> None: ...
+    def Log(self, messages): ...
+    def send_Log(self, messages): ...
+    def recv_Log(self): ...
+
+class Processor(fb303.FacebookService.Processor, Iface, TProcessor):
+    def __init__(self, handler) -> None: ...
+    def process(self, iprot, oprot): ...
+    def process_Log(self, seqid, iprot, oprot): ...
+
+class Log_args:
+    thrift_spec = ...  # type: Any
+    messages = ...  # type: Any
+    def __init__(self, messages=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class Log_result:
+    thrift_spec = ...  # type: Any
+    success = ...  # type: Any
+    def __init__(self, success=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
diff --git a/typeshed/third_party/2/scribe/ttypes.pyi b/typeshed/third_party/2/scribe/ttypes.pyi
new file mode 100644
index 0000000..32f01bd
--- /dev/null
+++ b/typeshed/third_party/2/scribe/ttypes.pyi
@@ -0,0 +1,22 @@
+# Stubs for scribe.ttypes (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+fastbinary = ...  # type: Any
+
+class ResultCode:
+    OK = ...  # type: Any
+    TRY_LATER = ...  # type: Any
+
+class LogEntry:
+    thrift_spec = ...  # type: Any
+    category = ...  # type: Any
+    message = ...  # type: Any
+    def __init__(self, category=..., message=...) -> None: ...
+    def read(self, iprot): ...
+    def write(self, oprot): ...
+    def validate(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
diff --git a/typeshed/third_party/2/selenium/webdriver/remote/webdriver.pyi b/typeshed/third_party/2/selenium/webdriver/remote/webdriver.pyi
new file mode 100644
index 0000000..9e0f24c
--- /dev/null
+++ b/typeshed/third_party/2/selenium/webdriver/remote/webdriver.pyi
@@ -0,0 +1,111 @@
+# Stubs for selenium.webdriver.remote.webdriver (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Dict, List, Optional
+from .mobile import Mobile as Mobile
+from selenium.webdriver.remote.webelement import WebElement
+from selenium.webdriver.remote.errorhandler import ErrorHandler
+from selenium.webdriver.remote.file_detector import FileDetector
+
+Capabilities = Dict[basestring, Any]
+ExecuteResult = Dict[basestring, Any]  # containing 'success', 'value', 'sessionId'
+
+class WebDriver:
+    command_executor = ...  # type: basestring
+    session_id = ...  # type: Any
+    capabilities = ...  # type: Capabilities
+    error_handler = ...  # type: ErrorHandler
+    file_detector = ...  # type: FileDetector
+    def __init__(self,
+                 command_executor: basestring='',
+                 desired_capabilities: Capabilities=None,
+                 browser_profile=None,
+                 proxy=None,
+                 keep_alive: bool=False
+                 ) -> None: ...
+    @property
+    def mobile(self) -> Mobile: ...
+    @property
+    def name(self) -> basestring: ...
+    def start_client(self): ...
+    def stop_client(self): ...
+    w3c = ...  # type: Any
+    def start_session(self, desired_capabilities, browser_profile=None): ...
+    def create_web_element(self, element_id: basestring) -> WebElement: ...
+    def execute(self, driver_command: basestring, params: Optional[Dict[basestring, Any]]=None) -> ExecuteResult: ...
+    def get(self, url: basestring) -> None: ...
+    @property
+    def title(self) -> basestring: ...
+    def find_element_by_id(self, id_: basestring) -> WebElement: ...
+    def find_elements_by_id(self, id_: basestring) -> List[WebElement]: ...
+    def find_element_by_xpath(self, xpath: basestring) -> WebElement: ...
+    def find_elements_by_xpath(self, xpath: basestring) -> List[WebElement]: ...
+    def find_element_by_link_text(self, link_text: basestring) -> WebElement: ...
+    def find_elements_by_link_text(self, text: basestring) -> List[WebElement]: ...
+    def find_element_by_partial_link_text(self, link_text: basestring) -> WebElement: ...
+    def find_elements_by_partial_link_text(self, link_text: basestring) -> List[WebElement]: ...
+    def find_element_by_name(self, name: basestring) -> WebElement: ...
+    def find_elements_by_name(self, name: basestring) -> List[WebElement]: ...
+    def find_element_by_tag_name(self, name: basestring) -> WebElement: ...
+    def find_elements_by_tag_name(self, name: basestring) -> List[WebElement]: ...
+    def find_element_by_class_name(self, name: basestring) -> WebElement: ...
+    def find_elements_by_class_name(self, name: basestring) -> List[WebElement]: ...
+    def find_element_by_css_selector(self, css_selector: basestring) -> WebElement: ...
+    def find_elements_by_css_selector(self, css_selector: basestring) -> List[WebElement]: ...
+    def execute_script(self, script, *args): ...
+    def execute_async_script(self, script, *args): ...
+    @property
+    def current_url(self) -> basestring: ...
+    @property
+    def page_source(self): ...
+    def close(self): ...
+    def quit(self): ...
+    @property
+    def current_window_handle(self): ...
+    @property
+    def window_handles(self): ...
+    def maximize_window(self): ...
+    @property
+    def switch_to(self): ...
+    def switch_to_active_element(self): ...
+    def switch_to_window(self, window_name): ...
+    def switch_to_frame(self, frame_reference): ...
+    def switch_to_default_content(self): ...
+    def switch_to_alert(self): ...
+    def back(self): ...
+    def forward(self): ...
+    def refresh(self): ...
+    def get_cookies(self): ...
+    def get_cookie(self, name): ...
+    def delete_cookie(self, name): ...
+    def delete_all_cookies(self): ...
+    def add_cookie(self, cookie_dict): ...
+    def implicitly_wait(self, time_to_wait): ...
+    def set_script_timeout(self, time_to_wait): ...
+    def set_page_load_timeout(self, time_to_wait): ...
+    def find_element(self, by=..., value=None): ...
+    def find_elements(self, by=..., value=None): ...
+    @property
+    def desired_capabilities(self): ...
+    def get_screenshot_as_file(self, filename): ...
+    save_screenshot = ...  # type: Any
+    def get_screenshot_as_png(self): ...
+    def get_screenshot_as_base64(self): ...
+    def set_window_size(self, width, height, windowHandle=''): ...
+    def get_window_size(self, windowHandle=''): ...
+    def set_window_position(self, x, y, windowHandle=''): ...
+    def get_window_position(self, windowHandle=''): ...
+    @property
+    def file_detector(self): ...
+    @file_detector.setter
+    def file_detector(self, detector): ...
+    @property
+    def orientation(self): ...
+    @orientation.setter
+    def orientation(self, value): ...
+    @property
+    def application_cache(self): ...
+    @property
+    def log_types(self): ...
+    def get_log(self, log_type): ...
diff --git a/typeshed/third_party/2/selenium/webdriver/remote/webelement.pyi b/typeshed/third_party/2/selenium/webdriver/remote/webelement.pyi
new file mode 100644
index 0000000..0577036
--- /dev/null
+++ b/typeshed/third_party/2/selenium/webdriver/remote/webelement.pyi
@@ -0,0 +1,65 @@
+# Stubs for selenium.webdriver.remote.webelement (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from selenium.webdriver.remote.webdriver import WebDriver
+from typing import Any, Optional, Dict, List
+
+SizeDict = Dict[str, int]  # containing "height", "width"
+PointDict = Dict[str, int]  # containing "x", "y"
+
+class WebElement:
+    def __init__(self, parent: WebDriver, id_: Optional[basestring], w3c: bool=False) -> None: ...
+    @property
+    def tag_name(self) -> basestring: ...
+    @property
+    def text(self) -> Optional[basestring]: ...
+    def click(self) -> None: ...
+    def submit(self) -> None: ...
+    def clear(self) -> None: ...
+    def get_attribute(self, name: basestring) -> Optional[basestring]: ...
+    def is_selected(self) -> bool: ...
+    def is_enabled(self) -> bool: ...
+
+    def find_element_by_id(self, id_: basestring) -> WebElement: ...
+    def find_elements_by_id(self, id_: basestring) -> List[WebElement]: ...
+    def find_element_by_name(self, name: basestring) -> WebElement: ...
+    def find_elements_by_name(self, name: basestring) -> List[WebElement]: ...
+    def find_element_by_link_text(self, link_text: basestring) -> WebElement: ...
+    def find_elements_by_link_text(self, link_text: basestring) -> List[WebElement]: ...
+    def find_element_by_partial_link_text(self, link_text: basestring) -> WebElement: ...
+    def find_elements_by_partial_link_text(self, link_text: basestring) -> List[WebElement]: ...
+    def find_element_by_tag_name(self, name: basestring) -> WebElement: ...
+    def find_elements_by_tag_name(self, name: basestring) -> List[WebElement]: ...
+    def find_element_by_xpath(self, xpath: basestring) -> WebElement: ...
+    def find_elements_by_xpath(self, xpath: basestring) -> List[WebElement]: ...
+    def find_element_by_class_name(self, name: basestring) -> WebElement: ...
+    def find_elements_by_class_name(self, name: basestring) -> List[WebElement]: ...
+    def find_element_by_css_selector(self, css_selector: basestring) -> WebElement: ...
+    def find_elements_by_css_selector(self, css_selector: basestring) -> List[WebElement]: ...
+
+    def send_keys(self, *value: basestring) -> None: ...
+    def is_displayed(self) -> bool: ...
+    @property
+    def location_once_scrolled_into_view(self): ...
+    @property
+    def size(self) -> SizeDict: ...
+    def value_of_css_property(self, property_name): ...
+    @property
+    def location(self) -> PointDict: ...
+    @property
+    def rect(self): ...
+    @property
+    def screenshot_as_base64(self): ...
+    @property
+    def screenshot_as_png(self): ...
+    def screenshot(self, filename: basestring): ...
+    @property
+    def parent(self) -> WebDriver: ...
+    @property
+    def id(self) -> Optional[basestring]: ...
+    def __eq__(self, element: object) -> bool: ...
+    def __ne__(self, element: object) -> bool: ...
+    def find_element(self, by: basestring=..., value: basestring=None) -> WebElement: ...
+    def find_elements(self, by: basestring=..., value: basestring=None) -> List[WebElement]: ...
+    def __hash__(self) -> int: ...
diff --git a/typeshed/third_party/2/simplejson/__init__.pyi b/typeshed/third_party/2/simplejson/__init__.pyi
new file mode 100644
index 0000000..5f94eb9
--- /dev/null
+++ b/typeshed/third_party/2/simplejson/__init__.pyi
@@ -0,0 +1,10 @@
+from typing import Any, IO
+
+from simplejson.scanner import JSONDecodeError
+from simplejson.decoder import JSONDecoder
+from simplejson.encoder import JSONEncoder, JSONEncoderForHTML
+
+def dumps(obj: Any, *args: Any, **kwds: Any) -> str: ...
+def dump(obj: Any, fp: IO[str], *args: Any, **kwds: Any) -> None: ...
+def loads(s: str, **kwds: Any) -> Any: ...
+def load(fp: IO[str]) -> Any: ...
diff --git a/typeshed/third_party/2/simplejson/decoder.pyi b/typeshed/third_party/2/simplejson/decoder.pyi
new file mode 100644
index 0000000..59111ce
--- /dev/null
+++ b/typeshed/third_party/2/simplejson/decoder.pyi
@@ -0,0 +1,6 @@
+from typing import Any, Match
+
+class JSONDecoder(object):
+    def __init__(self, **kwargs): ...
+    def decode(self, s: str, _w: Match[str], _PY3: bool): ...
+    def raw_decode(self, s: str, idx: int, _w: Match[str], _PY3: bool): ...
diff --git a/typeshed/third_party/2/simplejson/encoder.pyi b/typeshed/third_party/2/simplejson/encoder.pyi
new file mode 100644
index 0000000..0e31806
--- /dev/null
+++ b/typeshed/third_party/2/simplejson/encoder.pyi
@@ -0,0 +1,9 @@
+from typing import Any, IO
+
+class JSONEncoder(object):
+    def __init__(self, *args, **kwargs): ...
+    def encode(self, o: Any): ...
+    def default(self, o: Any): ...
+    def iterencode(self, o: Any, _one_shot: bool): ...
+
+class JSONEncoderForHTML(JSONEncoder): ...
diff --git a/typeshed/third_party/2/simplejson/scanner.pyi b/typeshed/third_party/2/simplejson/scanner.pyi
new file mode 100644
index 0000000..760b24d
--- /dev/null
+++ b/typeshed/third_party/2/simplejson/scanner.pyi
@@ -0,0 +1,7 @@
+from typing import Any, IO
+
+class JSONDecodeError(ValueError):
+    def dumps(self, obj: Any) -> str: ...
+    def dump(self, obj: Any, fp: IO[str], *args: Any, **kwds: Any) -> None: ...
+    def loads(self, s: str) -> Any: ...
+    def load(self, fp: IO[str]) -> Any: ...
diff --git a/typeshed/third_party/2/six/__init__.pyi b/typeshed/third_party/2/six/__init__.pyi
new file mode 100644
index 0000000..302c458
--- /dev/null
+++ b/typeshed/third_party/2/six/__init__.pyi
@@ -0,0 +1,91 @@
+# Stubs for six (Python 2.7)
+
+from __future__ import print_function
+
+import types
+from typing import (
+    Any, AnyStr, Callable, Dict, Iterable, Mapping, Optional,
+    Pattern, Tuple, Type, TypeVar, Union, overload, ValuesView, KeysView, ItemsView
+)
+import typing
+import unittest
+from mypy_extensions import NoReturn
+
+# Exports
+from __builtin__ import unichr as unichr
+from StringIO import StringIO as StringIO, StringIO as BytesIO
+from functools import wraps as wraps
+
+
+_T = TypeVar('_T')
+_K = TypeVar('_K')
+_V = TypeVar('_V')
+
+# TODO make constant, then move this stub to 2and3
+# https://github.com/python/typeshed/issues/17
+PY2 = True
+PY3 = False
+PY34 = False
+
+string_types = basestring,
+integer_types = (int, long)
+class_types = (type, types.ClassType)
+text_type = unicode
+binary_type = str
+
+MAXSIZE = ...  # type: int
+
+# def add_move
+# def remove_move
+
+def advance_iterator(it: typing.Iterator[_T]) -> _T: ...
+next = advance_iterator
+
+def callable(obj: object) -> bool: ...
+
+def get_unbound_function(unbound: types.MethodType) -> types.FunctionType: ...
+def create_bound_method(func: types.FunctionType, obj: object) -> types.MethodType: ...
+def create_unbound_method(func: types.FunctionType, cls: Union[type, types.ClassType]) -> types.MethodType: ...
+
+class Iterator:
+    def next(self) -> Any: ...
+
+def get_method_function(meth: types.MethodType) -> types.FunctionType: ...
+def get_method_self(meth: types.MethodType) -> Optional[object]: ...
+def get_function_closure(fun: types.FunctionType) -> Optional[Tuple[types._Cell, ...]]: ...
+def get_function_code(fun: types.FunctionType) -> types.CodeType: ...
+def get_function_defaults(fun: types.FunctionType) -> Optional[Tuple[Any, ...]]: ...
+def get_function_globals(fun: types.FunctionType) -> Dict[str, Any]: ...
+
+def iterkeys(d: Mapping[_K, _V]) -> typing.Iterator[_K]: ...
+def itervalues(d: Mapping[_K, _V]) -> typing.Iterator[_V]: ...
+def iteritems(d: Mapping[_K, _V]) -> typing.Iterator[Tuple[_K, _V]]: ...
+# def iterlists
+
+def viewkeys(d: Mapping[_K, _V]) -> KeysView[_K]: ...
+def viewvalues(d: Mapping[_K, _V]) -> ValuesView[_V]: ...
+def viewitems(d: Mapping[_K, _V]) -> ItemsView[_K, _V]: ...
+
+def b(s: str) -> binary_type: ...
+def u(s: str) -> text_type: ...
+int2byte = chr
+def byte2int(bs: binary_type) -> int: ...
+def indexbytes(buf: binary_type, i: int) -> int: ...
+def iterbytes(buf: binary_type) -> typing.Iterator[int]: ...
+
+def assertCountEqual(self: unittest.TestCase, first: Iterable[_T], second: Iterable[_T], msg: str = ...) -> None: ...
+ at overload
+def assertRaisesRegex(self: unittest.TestCase, msg: str = ...) -> Any: ...
+ at overload
+def assertRaisesRegex(self: unittest.TestCase, callable_obj: Callable[..., Any], *args: Any, **kwargs: Any) -> Any: ...
+def assertRegex(self: unittest.TestCase, text: AnyStr, expected_regex: Union[AnyStr, Pattern[AnyStr]], msg: str = ...) -> None: ...
+
+def reraise(tp: Optional[Type[BaseException]], value: Optional[BaseException], tb: Optional[types.TracebackType] = ...) -> NoReturn: ...
+def exec_(_code_: Union[unicode, types.CodeType], _globs_: Dict[str, Any] = ..., _locs_: Dict[str, Any] = ...): ...
+def raise_from(value: BaseException, from_value: BaseException) -> None: ...
+
+print_ = print
+
+def with_metaclass(meta: type, *bases: type) -> type: ...
+def add_metaclass(metaclass: type) -> Callable[[_T], _T]: ...
+def python_2_unicode_compatible(klass: _T) -> _T: ...
diff --git a/typeshed/third_party/2/six/moves/__init__.pyi b/typeshed/third_party/2/six/moves/__init__.pyi
new file mode 100644
index 0000000..2e09f98
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/__init__.pyi
@@ -0,0 +1,31 @@
+# Provisional stubs for six.moves (Python 2.7)
+
+import Cookie as http_cookies
+from cStringIO import StringIO as cStringIO
+from itertools import ifilter as filter
+from itertools import ifilterfalse as filterfalse
+from __builtin__ import raw_input as input
+from __builtin__ import intern as intern
+from itertools import imap as map
+from os import getcwdu as getcwd
+from os import getcwd as getcwdb
+from __builtin__ import xrange as range
+from __builtin__ import reload as reload_module
+from __builtin__ import reduce as reduce
+from pipes import quote as shlex_quote
+from StringIO import StringIO as StringIO
+from UserDict import UserDict as UserDict
+from UserList import UserList as UserList
+from UserString import UserString as UserString
+from __builtin__ import xrange as xrange
+from itertools import izip as zip
+from itertools import izip_longest as zip_longest
+import six.moves.cPickle as cPickle
+import HTMLParser as html_parser
+import htmlentitydefs as html_entities
+import httplib as http_client
+
+import six.moves.urllib_parse as urllib_parse
+import six.moves.urllib_error as urllib_error
+import six.moves.urllib as urllib
+import six.moves.urllib_robotparser as urllib_robotparser
diff --git a/typeshed/third_party/2/six/moves/cPickle.pyi b/typeshed/third_party/2/six/moves/cPickle.pyi
new file mode 100644
index 0000000..3feedc6
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/cPickle.pyi
@@ -0,0 +1,6 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.cPickle (Python 2.7)
+
+from cPickle import *  # noqa: F403
diff --git a/typeshed/third_party/2/six/moves/urllib/__init__.pyi b/typeshed/third_party/2/six/moves/urllib/__init__.pyi
new file mode 100644
index 0000000..71523cd
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/__init__.pyi
@@ -0,0 +1,10 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib (Python 2.7)
+
+import six.moves.urllib.error as error
+import six.moves.urllib.parse as parse
+import six.moves.urllib.request as request
+import six.moves.urllib.response as response
+import six.moves.urllib.robotparser as robotparser
diff --git a/typeshed/third_party/2/six/moves/urllib/error.pyi b/typeshed/third_party/2/six/moves/urllib/error.pyi
new file mode 100644
index 0000000..05eda84
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/error.pyi
@@ -0,0 +1,8 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.error (Python 2.7)
+
+from urllib2 import URLError as URLError
+from urllib2 import HTTPError as HTTPError
+from urllib import ContentTooShortError as ContentTooShortError
diff --git a/typeshed/third_party/2/six/moves/urllib/parse.pyi b/typeshed/third_party/2/six/moves/urllib/parse.pyi
new file mode 100644
index 0000000..25351fb
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/parse.pyi
@@ -0,0 +1,30 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.parse (Python 2.7)
+
+from six.moves.urllib_parse import (
+    ParseResult as ParseResult,
+    SplitResult as SplitResult,
+    parse_qs as parse_qs,
+    parse_qsl as parse_qsl,
+    urldefrag as urldefrag,
+    urljoin as urljoin,
+    urlparse as urlparse,
+    urlsplit as urlsplit,
+    urlunparse as urlunparse,
+    urlunsplit as urlunsplit,
+    quote as quote,
+    quote_plus as quote_plus,
+    unquote as unquote,
+    unquote_plus as unquote_plus,
+    urlencode as urlencode,
+    splitquery as splitquery,
+    splittag as splittag,
+    splituser as splituser,
+    uses_fragment as uses_fragment,
+    uses_netloc as uses_netloc,
+    uses_params as uses_params,
+    uses_query as uses_query,
+    uses_relative as uses_relative,
+)
diff --git a/typeshed/third_party/2/six/moves/urllib/request.pyi b/typeshed/third_party/2/six/moves/urllib/request.pyi
new file mode 100644
index 0000000..109cda8
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/request.pyi
@@ -0,0 +1,38 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.request (Python 2.7)
+
+from urllib2 import urlopen as urlopen
+from urllib2 import install_opener as install_opener
+from urllib2 import build_opener as build_opener
+from urllib import pathname2url as pathname2url
+from urllib import url2pathname as url2pathname
+from urllib import getproxies as getproxies
+from urllib2 import Request as Request
+from urllib2 import OpenerDirector as OpenerDirector
+from urllib2 import HTTPDefaultErrorHandler as HTTPDefaultErrorHandler
+from urllib2 import HTTPRedirectHandler as HTTPRedirectHandler
+from urllib2 import HTTPCookieProcessor as HTTPCookieProcessor
+from urllib2 import ProxyHandler as ProxyHandler
+from urllib2 import BaseHandler as BaseHandler
+from urllib2 import HTTPPasswordMgr as HTTPPasswordMgr
+from urllib2 import HTTPPasswordMgrWithDefaultRealm as HTTPPasswordMgrWithDefaultRealm
+from urllib2 import AbstractBasicAuthHandler as AbstractBasicAuthHandler
+from urllib2 import HTTPBasicAuthHandler as HTTPBasicAuthHandler
+from urllib2 import ProxyBasicAuthHandler as ProxyBasicAuthHandler
+from urllib2 import AbstractDigestAuthHandler as AbstractDigestAuthHandler
+from urllib2 import HTTPDigestAuthHandler as HTTPDigestAuthHandler
+from urllib2 import ProxyDigestAuthHandler as ProxyDigestAuthHandler
+from urllib2 import HTTPHandler as HTTPHandler
+from urllib2 import HTTPSHandler as HTTPSHandler
+from urllib2 import FileHandler as FileHandler
+from urllib2 import FTPHandler as FTPHandler
+from urllib2 import CacheFTPHandler as CacheFTPHandler
+from urllib2 import UnknownHandler as UnknownHandler
+from urllib2 import HTTPErrorProcessor as HTTPErrorProcessor
+from urllib import urlretrieve as urlretrieve
+from urllib import urlcleanup as urlcleanup
+from urllib import URLopener as URLopener
+from urllib import FancyURLopener as FancyURLopener
+from urllib import proxy_bypass as proxy_bypass
diff --git a/typeshed/third_party/2/six/moves/urllib/response.pyi b/typeshed/third_party/2/six/moves/urllib/response.pyi
new file mode 100644
index 0000000..d778514
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/response.pyi
@@ -0,0 +1,9 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.response (Python 2.7)
+
+from urllib import addbase as addbase
+from urllib import addclosehook as addclosehook
+from urllib import addinfo as addinfo
+from urllib import addinfourl as addinfourl
diff --git a/typeshed/third_party/2/six/moves/urllib/robotparser.pyi b/typeshed/third_party/2/six/moves/urllib/robotparser.pyi
new file mode 100644
index 0000000..3b33758
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/robotparser.pyi
@@ -0,0 +1,6 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.robotparser (Python 2.7)
+
+from robotparser import RobotFileParser as RobotFileParser
diff --git a/typeshed/third_party/2/six/moves/urllib_error.pyi b/typeshed/third_party/2/six/moves/urllib_error.pyi
new file mode 100644
index 0000000..4872659
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib_error.pyi
@@ -0,0 +1,10 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_error (Python 2.7)
+
+from six.moves.urllib.error import (
+    URLError as URLError,
+    HTTPError as HTTPError,
+    ContentTooShortError as ContentTooShortError,
+)
diff --git a/typeshed/third_party/2/six/moves/urllib_parse.pyi b/typeshed/third_party/2/six/moves/urllib_parse.pyi
new file mode 100644
index 0000000..2416b96
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib_parse.pyi
@@ -0,0 +1,28 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_parse (Python 2.7)
+
+from urlparse import ParseResult as ParseResult
+from urlparse import SplitResult as SplitResult
+from urlparse import parse_qs as parse_qs
+from urlparse import parse_qsl as parse_qsl
+from urlparse import urldefrag as urldefrag
+from urlparse import urljoin as urljoin
+from urlparse import urlparse as urlparse
+from urlparse import urlsplit as urlsplit
+from urlparse import urlunparse as urlunparse
+from urlparse import urlunsplit as urlunsplit
+from urllib import quote as quote
+from urllib import quote_plus as quote_plus
+from urllib import unquote as unquote
+from urllib import unquote_plus as unquote_plus
+from urllib import urlencode as urlencode
+from urllib import splitquery as splitquery
+from urllib import splittag as splittag
+from urllib import splituser as splituser
+from urlparse import uses_fragment as uses_fragment
+from urlparse import uses_netloc as uses_netloc
+from urlparse import uses_params as uses_params
+from urlparse import uses_query as uses_query
+from urlparse import uses_relative as uses_relative
diff --git a/typeshed/third_party/2/six/moves/urllib_request.pyi b/typeshed/third_party/2/six/moves/urllib_request.pyi
new file mode 100644
index 0000000..832055a
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib_request.pyi
@@ -0,0 +1,40 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_request (Python 2.7)
+
+from six.moves.urllib.request import (
+    urlopen as urlopen,
+    install_opener as install_opener,
+    build_opener as build_opener,
+    pathname2url as pathname2url,
+    url2pathname as url2pathname,
+    getproxies as getproxies,
+    Request as Request,
+    OpenerDirector as OpenerDirector,
+    HTTPDefaultErrorHandler as HTTPDefaultErrorHandler,
+    HTTPRedirectHandler as HTTPRedirectHandler,
+    HTTPCookieProcessor as HTTPCookieProcessor,
+    ProxyHandler as ProxyHandler,
+    BaseHandler as BaseHandler,
+    HTTPPasswordMgr as HTTPPasswordMgr,
+    HTTPPasswordMgrWithDefaultRealm as HTTPPasswordMgrWithDefaultRealm,
+    AbstractBasicAuthHandler as AbstractBasicAuthHandler,
+    HTTPBasicAuthHandler as HTTPBasicAuthHandler,
+    ProxyBasicAuthHandler as ProxyBasicAuthHandler,
+    AbstractDigestAuthHandler as AbstractDigestAuthHandler,
+    HTTPDigestAuthHandler as HTTPDigestAuthHandler,
+    ProxyDigestAuthHandler as ProxyDigestAuthHandler,
+    HTTPHandler as HTTPHandler,
+    HTTPSHandler as HTTPSHandler,
+    FileHandler as FileHandler,
+    FTPHandler as FTPHandler,
+    CacheFTPHandler as CacheFTPHandler,
+    UnknownHandler as UnknownHandler,
+    HTTPErrorProcessor as HTTPErrorProcessor,
+    urlretrieve as urlretrieve,
+    urlcleanup as urlcleanup,
+    URLopener as URLopener,
+    FancyURLopener as FancyURLopener,
+    proxy_bypass as proxy_bypass,
+)
diff --git a/typeshed/third_party/2/six/moves/urllib_response.pyi b/typeshed/third_party/2/six/moves/urllib_response.pyi
new file mode 100644
index 0000000..ca00492
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib_response.pyi
@@ -0,0 +1,11 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_response (Python 2.7)
+
+from six.moves.urllib.response import (
+    addbase as addbase,
+    addclosehook as addclosehook,
+    addinfo as addinfo,
+    addinfourl as addinfourl,
+)
diff --git a/typeshed/third_party/2/six/moves/urllib_robotparser.pyi b/typeshed/third_party/2/six/moves/urllib_robotparser.pyi
new file mode 100644
index 0000000..d990bb5
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib_robotparser.pyi
@@ -0,0 +1,8 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_robotparser (Python 2.7)
+
+from six.moves.urllib.robotparser import (
+    RobotFileParser as RobotFileParser,
+)
diff --git a/typeshed/third_party/2/sqlalchemy/__init__.pyi b/typeshed/third_party/2/sqlalchemy/__init__.pyi
new file mode 100644
index 0000000..8d58e25
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/__init__.pyi
@@ -0,0 +1,124 @@
+# Stubs for sqlalchemy (Python 2)
+
+from .sql import (
+    alias,
+    and_,
+    asc,
+    between,
+    bindparam,
+    case,
+    cast,
+    collate,
+    column,
+    delete,
+    desc,
+    distinct,
+    except_,
+    except_all,
+    exists,
+    extract,
+    false,
+    func,
+    funcfilter,
+    insert,
+    intersect,
+    intersect_all,
+    join,
+    literal,
+    literal_column,
+    modifier,
+    not_,
+    null,
+    or_,
+    outerjoin,
+    outparam,
+    over,
+    select,
+    subquery,
+    table,
+    text,
+    true,
+    tuple_,
+    type_coerce,
+    union,
+    union_all,
+    update,
+)
+
+from .types import (
+    BIGINT,
+    BINARY,
+    BLOB,
+    BOOLEAN,
+    BigInteger,
+    Binary,
+    Boolean,
+    CHAR,
+    CLOB,
+    DATE,
+    DATETIME,
+    DECIMAL,
+    Date,
+    DateTime,
+    Enum,
+    FLOAT,
+    Float,
+    INT,
+    INTEGER,
+    Integer,
+    Interval,
+    LargeBinary,
+    NCHAR,
+    NVARCHAR,
+    NUMERIC,
+    Numeric,
+    PickleType,
+    REAL,
+    SMALLINT,
+    SmallInteger,
+    String,
+    TEXT,
+    TIME,
+    TIMESTAMP,
+    Text,
+    Time,
+    TypeDecorator,
+    Unicode,
+    UnicodeText,
+    VARBINARY,
+    VARCHAR,
+)
+
+from .schema import (
+    CheckConstraint,
+    Column,
+    ColumnDefault,
+    Constraint,
+    DefaultClause,
+    FetchedValue,
+    ForeignKey,
+    ForeignKeyConstraint,
+    Index,
+    MetaData,
+    PassiveDefault,
+    PrimaryKeyConstraint,
+    Sequence,
+    Table,
+    ThreadLocalMetaData,
+    UniqueConstraint,
+    DDL,
+)
+
+from . import sql as sql
+from . import schema as schema
+from . import types as types
+from . import exc as exc
+from . import dialects as dialects
+from . import pool as pool
+# This should re-export orm but orm is totally broken right now
+# from . import orm as orm
+
+from .inspection import inspect
+from .engine import create_engine, engine_from_config
+
+__version__ = ...  # type: int
diff --git a/typeshed/third_party/2/sqlalchemy/databases/__init__.pyi b/typeshed/third_party/2/sqlalchemy/databases/__init__.pyi
new file mode 100644
index 0000000..b1ac4a4
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/databases/__init__.pyi
@@ -0,0 +1,12 @@
+# Stubs for sqlalchemy.databases (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   firebird
+#   mssql
+#   mysql
+#   oracle
+#   postgresql
+#   sqlite
+#   sybase
diff --git a/typeshed/third_party/2/sqlalchemy/databases/mysql.pyi b/typeshed/third_party/2/sqlalchemy/databases/mysql.pyi
new file mode 100644
index 0000000..4cda14f
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/databases/mysql.pyi
@@ -0,0 +1 @@
+from sqlalchemy.dialects.mysql.base import *  # noqa: F403
diff --git a/typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi b/typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi
new file mode 100644
index 0000000..2d261de
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi
@@ -0,0 +1,12 @@
+# Stubs for sqlalchemy.dialects (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   firebird
+#   mssql
+#   mysql
+#   oracle
+#   postgresql
+#   sqlite
+#   sybase
diff --git a/typeshed/third_party/2/sqlalchemy/dialects/mysql/__init__.pyi b/typeshed/third_party/2/sqlalchemy/dialects/mysql/__init__.pyi
new file mode 100644
index 0000000..5a0a4bf
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/dialects/mysql/__init__.pyi
@@ -0,0 +1,40 @@
+# Stubs for sqlalchemy.dialects.mysql (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import base
+
+BIGINT = base.BIGINT
+BINARY = base.BINARY
+BIT = base.BIT
+BLOB = base.BLOB
+BOOLEAN = base.BOOLEAN
+CHAR = base.CHAR
+DATE = base.DATE
+DATETIME = base.DATETIME
+DECIMAL = base.DECIMAL
+DOUBLE = base.DOUBLE
+ENUM = base.ENUM
+FLOAT = base.FLOAT
+INTEGER = base.INTEGER
+LONGBLOB = base.LONGBLOB
+LONGTEXT = base.LONGTEXT
+MEDIUMBLOB = base.MEDIUMBLOB
+MEDIUMINT = base.MEDIUMINT
+MEDIUMTEXT = base.MEDIUMTEXT
+NCHAR = base.NCHAR
+NVARCHAR = base.NVARCHAR
+NUMERIC = base.NUMERIC
+SET = base.SET
+SMALLINT = base.SMALLINT
+REAL = base.REAL
+TEXT = base.TEXT
+TIME = base.TIME
+TIMESTAMP = base.TIMESTAMP
+TINYBLOB = base.TINYBLOB
+TINYINT = base.TINYINT
+TINYTEXT = base.TINYTEXT
+VARBINARY = base.VARBINARY
+VARCHAR = base.VARCHAR
+YEAR = base.YEAR
+# dialect = base.dialect
diff --git a/typeshed/third_party/2/sqlalchemy/dialects/mysql/base.pyi b/typeshed/third_party/2/sqlalchemy/dialects/mysql/base.pyi
new file mode 100644
index 0000000..51b8b26
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/dialects/mysql/base.pyi
@@ -0,0 +1,413 @@
+# Stubs for sqlalchemy.dialects.mysql.base (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from ... import sql
+from ... import engine
+from ... import util
+from ... import types
+
+sqltypes = sql.sqltypes
+# compiler = sql.compiler
+# reflection = engine.reflection
+# default = engine.default
+# topological = util.topological
+DATE = types.DATE
+BOOLEAN = types.BOOLEAN
+BLOB = types.BLOB
+BINARY = types.BINARY
+VARBINARY = types.VARBINARY
+
+RESERVED_WORDS = ...  # type: Any
+AUTOCOMMIT_RE = ...  # type: Any
+SET_RE = ...  # type: Any
+
+class _NumericType:
+    unsigned = ...  # type: Any
+    zerofill = ...  # type: Any
+    def __init__(self, unsigned=..., zerofill=..., **kw) -> None: ...
+
+class _FloatType(_NumericType,
+                 # sqltypes.Float
+                 ):
+    scale = ...  # type: Any
+    def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+
+class _IntegerType(_NumericType,
+                   # sqltypes.Integer
+                   ):
+    display_width = ...  # type: Any
+    def __init__(self, display_width=..., **kw) -> None: ...
+
+class _StringType(object,
+                  # sqltypes.String
+                  ):
+    charset = ...  # type: Any
+    ascii = ...  # type: Any
+    unicode = ...  # type: Any
+    binary = ...  # type: Any
+    national = ...  # type: Any
+    def __init__(self, charset=..., collation=..., ascii=..., binary=..., unicode=..., national=..., **kw) -> None: ...
+
+class _MatchType(object,
+                 # sqltypes.Float,
+                 # sqltypes.MatchType
+                 ):
+    def __init__(self, **kw) -> None: ...
+
+class NUMERIC(_NumericType,
+              # sqltypes.NUMERIC
+              ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+
+class DECIMAL(_NumericType,
+              # sqltypes.DECIMAL
+              ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+
+class DOUBLE(_FloatType):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+
+class REAL(_FloatType,
+           # sqltypes.REAL
+           ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+
+class FLOAT(_FloatType,
+            # sqltypes.FLOAT
+            ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+    def bind_processor(self, dialect): ...
+
+class INTEGER(_IntegerType,
+              # sqltypes.INTEGER
+              ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, display_width=..., **kw) -> None: ...
+
+class BIGINT(_IntegerType,
+             # sqltypes.BIGINT
+             ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, display_width=..., **kw) -> None: ...
+
+class MEDIUMINT(_IntegerType):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, display_width=..., **kw) -> None: ...
+
+class TINYINT(_IntegerType):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, display_width=..., **kw) -> None: ...
+
+class SMALLINT(_IntegerType,
+               # sqltypes.SMALLINT
+               ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, display_width=..., **kw) -> None: ...
+
+class BIT(object,
+          # sqltypes.TypeEngine
+          ):
+    __visit_name__ = ...  # type: Any
+    length = ...  # type: Any
+    def __init__(self, length=...) -> None: ...
+    def result_processor(self, dialect, coltype): ...
+
+class TIME(object,
+           # sqltypes.TIME
+           ):
+    __visit_name__ = ...  # type: Any
+    fsp = ...  # type: Any
+    def __init__(self, timezone=..., fsp=...) -> None: ...
+    def result_processor(self, dialect, coltype): ...
+
+class TIMESTAMP(object,
+                # sqltypes.TIMESTAMP
+                ):
+    __visit_name__ = ...  # type: Any
+    fsp = ...  # type: Any
+    def __init__(self, timezone=..., fsp=...) -> None: ...
+
+class DATETIME(object,
+               # sqltypes.DATETIME
+               ):
+    __visit_name__ = ...  # type: Any
+    fsp = ...  # type: Any
+    def __init__(self, timezone=..., fsp=...) -> None: ...
+
+class YEAR(object,
+           # sqltypes.TypeEngine
+           ):
+    __visit_name__ = ...  # type: Any
+    display_width = ...  # type: Any
+    def __init__(self, display_width=...) -> None: ...
+
+class TEXT(_StringType,
+           # sqltypes.TEXT
+           ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, length=..., **kw) -> None: ...
+
+class TINYTEXT(_StringType):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, **kwargs) -> None: ...
+
+class MEDIUMTEXT(_StringType):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, **kwargs) -> None: ...
+
+class LONGTEXT(_StringType):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, **kwargs) -> None: ...
+
+class VARCHAR(_StringType,
+              # sqltypes.VARCHAR
+              ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, length=..., **kwargs) -> None: ...
+
+class CHAR(_StringType,
+           # sqltypes.CHAR
+           ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, length=..., **kwargs) -> None: ...
+
+class NVARCHAR(_StringType,
+               # sqltypes.NVARCHAR
+               ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, length=..., **kwargs) -> None: ...
+
+class NCHAR(_StringType,
+            # sqltypes.NCHAR
+            ):
+    __visit_name__ = ...  # type: Any
+    def __init__(self, length=..., **kwargs) -> None: ...
+
+class TINYBLOB(object,
+               # sqltypes._Binary
+               ):
+    __visit_name__ = ...  # type: Any
+
+class MEDIUMBLOB(object,
+                 # sqltypes._Binary
+                 ):
+    __visit_name__ = ...  # type: Any
+
+class LONGBLOB(object,
+               # sqltypes._Binary
+               ):
+    __visit_name__ = ...  # type: Any
+
+class _EnumeratedValues(_StringType): ...
+
+class ENUM(  # sqltypes.Enum,
+    _EnumeratedValues
+):
+    __visit_name__ = ...  # type: Any
+    strict = ...  # type: Any
+    def __init__(self, *enums, **kw) -> None: ...
+    def bind_processor(self, dialect): ...
+    def adapt(self, cls, **kw): ...
+
+class SET(_EnumeratedValues):
+    __visit_name__ = ...  # type: Any
+    retrieve_as_bitwise = ...  # type: Any
+    values = ...  # type: Any
+    def __init__(self, *values, **kw) -> None: ...
+    def column_expression(self, colexpr): ...
+    def result_processor(self, dialect, coltype): ...
+    def bind_processor(self, dialect): ...
+    def adapt(self, impltype, **kw): ...
+
+MSTime = ...  # type: Any
+MSSet = ...  # type: Any
+MSEnum = ...  # type: Any
+MSLongBlob = ...  # type: Any
+MSMediumBlob = ...  # type: Any
+MSTinyBlob = ...  # type: Any
+MSBlob = ...  # type: Any
+MSBinary = ...  # type: Any
+MSVarBinary = ...  # type: Any
+MSNChar = ...  # type: Any
+MSNVarChar = ...  # type: Any
+MSChar = ...  # type: Any
+MSString = ...  # type: Any
+MSLongText = ...  # type: Any
+MSMediumText = ...  # type: Any
+MSTinyText = ...  # type: Any
+MSText = ...  # type: Any
+MSYear = ...  # type: Any
+MSTimeStamp = ...  # type: Any
+MSBit = ...  # type: Any
+MSSmallInteger = ...  # type: Any
+MSTinyInteger = ...  # type: Any
+MSMediumInteger = ...  # type: Any
+MSBigInteger = ...  # type: Any
+MSNumeric = ...  # type: Any
+MSDecimal = ...  # type: Any
+MSDouble = ...  # type: Any
+MSReal = ...  # type: Any
+MSFloat = ...  # type: Any
+MSInteger = ...  # type: Any
+colspecs = ...  # type: Any
+ischema_names = ...  # type: Any
+
+class MySQLExecutionContext(object,
+                            # default.DefaultExecutionContext
+                            ):
+    def should_autocommit_text(self, statement): ...
+
+class MySQLCompiler(object,
+                    # compiler.SQLCompiler
+                    ):
+    render_table_with_column_in_update_from = ...  # type: Any
+    extract_map = ...  # type: Any
+    def visit_random_func(self, fn, **kw): ...
+    def visit_utc_timestamp_func(self, fn, **kw): ...
+    def visit_sysdate_func(self, fn, **kw): ...
+    def visit_concat_op_binary(self, binary, operator, **kw): ...
+    def visit_match_op_binary(self, binary, operator, **kw): ...
+    def get_from_hint_text(self, table, text): ...
+    def visit_typeclause(self, typeclause, type_=...): ...
+    def visit_cast(self, cast, **kwargs): ...
+    def render_literal_value(self, value, type_): ...
+    def visit_true(self, element, **kw): ...
+    def visit_false(self, element, **kw): ...
+    def get_select_precolumns(self, select, **kw): ...
+    def visit_join(self, join, asfrom=..., **kwargs): ...
+    def for_update_clause(self, select, **kw): ...
+    def limit_clause(self, select, **kw): ...
+    def update_limit_clause(self, update_stmt): ...
+    def update_tables_clause(self, update_stmt, from_table, extra_froms, **kw): ...
+    def update_from_clause(self, update_stmt, from_table, extra_froms, from_hints, **kw): ...
+
+class MySQLDDLCompiler(object,
+                       # compiler.DDLCompiler
+                       ):
+    def create_table_constraints(self, table, **kw): ...
+    def get_column_specification(self, column, **kw): ...
+    def post_create_table(self, table): ...
+    def visit_create_index(self, create): ...
+    def visit_primary_key_constraint(self, constraint): ...
+    def visit_drop_index(self, drop): ...
+    def visit_drop_constraint(self, drop): ...
+    def define_constraint_match(self, constraint): ...
+
+class MySQLTypeCompiler(object,
+                        # compiler.GenericTypeCompiler
+                        ):
+    def visit_NUMERIC(self, type_, **kw): ...
+    def visit_DECIMAL(self, type_, **kw): ...
+    def visit_DOUBLE(self, type_, **kw): ...
+    def visit_REAL(self, type_, **kw): ...
+    def visit_FLOAT(self, type_, **kw): ...
+    def visit_INTEGER(self, type_, **kw): ...
+    def visit_BIGINT(self, type_, **kw): ...
+    def visit_MEDIUMINT(self, type_, **kw): ...
+    def visit_TINYINT(self, type_, **kw): ...
+    def visit_SMALLINT(self, type_, **kw): ...
+    def visit_BIT(self, type_, **kw): ...
+    def visit_DATETIME(self, type_, **kw): ...
+    def visit_DATE(self, type_, **kw): ...
+    def visit_TIME(self, type_, **kw): ...
+    def visit_TIMESTAMP(self, type_, **kw): ...
+    def visit_YEAR(self, type_, **kw): ...
+    def visit_TEXT(self, type_, **kw): ...
+    def visit_TINYTEXT(self, type_, **kw): ...
+    def visit_MEDIUMTEXT(self, type_, **kw): ...
+    def visit_LONGTEXT(self, type_, **kw): ...
+    def visit_VARCHAR(self, type_, **kw): ...
+    def visit_CHAR(self, type_, **kw): ...
+    def visit_NVARCHAR(self, type_, **kw): ...
+    def visit_NCHAR(self, type_, **kw): ...
+    def visit_VARBINARY(self, type_, **kw): ...
+    def visit_large_binary(self, type_, **kw): ...
+    def visit_enum(self, type_, **kw): ...
+    def visit_BLOB(self, type_, **kw): ...
+    def visit_TINYBLOB(self, type_, **kw): ...
+    def visit_MEDIUMBLOB(self, type_, **kw): ...
+    def visit_LONGBLOB(self, type_, **kw): ...
+    def visit_ENUM(self, type_, **kw): ...
+    def visit_SET(self, type_, **kw): ...
+    def visit_BOOLEAN(self, type, **kw): ...
+
+class MySQLIdentifierPreparer(object,
+                              # compiler.IdentifierPreparer
+                              ):
+    reserved_words = ...  # type: Any
+    def __init__(self, dialect, server_ansiquotes=..., **kw) -> None: ...
+
+class MySQLDialect(object,
+                   # default.DefaultDialect
+                   ):
+    name = ...  # type: Any
+    supports_alter = ...  # type: Any
+    supports_native_boolean = ...  # type: Any
+    max_identifier_length = ...  # type: Any
+    max_index_name_length = ...  # type: Any
+    supports_native_enum = ...  # type: Any
+    supports_sane_rowcount = ...  # type: Any
+    supports_sane_multi_rowcount = ...  # type: Any
+    supports_multivalues_insert = ...  # type: Any
+    default_paramstyle = ...  # type: Any
+    colspecs = ...  # type: Any
+    statement_compiler = ...  # type: Any
+    ddl_compiler = ...  # type: Any
+    type_compiler = ...  # type: Any
+    ischema_names = ...  # type: Any
+    preparer = ...  # type: Any
+    construct_arguments = ...  # type: Any
+    isolation_level = ...  # type: Any
+    def __init__(self, isolation_level=..., **kwargs) -> None: ...
+    def on_connect(self): ...
+    def set_isolation_level(self, connection, level): ...
+    def get_isolation_level(self, connection): ...
+    def do_commit(self, dbapi_connection): ...
+    def do_rollback(self, dbapi_connection): ...
+    def do_begin_twophase(self, connection, xid): ...
+    def do_prepare_twophase(self, connection, xid): ...
+    def do_rollback_twophase(self, connection, xid, is_prepared=..., recover=...): ...
+    def do_commit_twophase(self, connection, xid, is_prepared=..., recover=...): ...
+    def do_recover_twophase(self, connection): ...
+    def is_disconnect(self, e, connection, cursor): ...
+    def has_table(self, connection, table_name, schema=...): ...
+    identifier_preparer = ...  # type: Any
+    def initialize(self, connection): ...
+    def get_schema_names(self, connection, **kw): ...
+    def get_table_names(self, connection, schema=..., **kw): ...
+    def get_view_names(self, connection, schema=..., **kw): ...
+    def get_table_options(self, connection, table_name, schema=..., **kw): ...
+    def get_columns(self, connection, table_name, schema=..., **kw): ...
+    def get_pk_constraint(self, connection, table_name, schema=..., **kw): ...
+    def get_foreign_keys(self, connection, table_name, schema=..., **kw): ...
+    def get_indexes(self, connection, table_name, schema=..., **kw): ...
+    def get_unique_constraints(self, connection, table_name, schema=..., **kw): ...
+    def get_view_definition(self, connection, view_name, schema=..., **kw): ...
+
+class ReflectedState:
+    columns = ...  # type: Any
+    table_options = ...  # type: Any
+    table_name = ...  # type: Any
+    keys = ...  # type: Any
+    constraints = ...  # type: Any
+    def __init__(self) -> None: ...
+
+class MySQLTableDefinitionParser:
+    dialect = ...  # type: Any
+    preparer = ...  # type: Any
+    def __init__(self, dialect, preparer) -> None: ...
+    def parse(self, show_create, charset): ...
+
+class _DecodingRowProxy:
+    rowproxy = ...  # type: Any
+    charset = ...  # type: Any
+    def __init__(self, rowproxy, charset) -> None: ...
+    def __getitem__(self, index): ...
+    def __getattr__(self, attr): ...
diff --git a/typeshed/third_party/2/sqlalchemy/engine/__init__.pyi b/typeshed/third_party/2/sqlalchemy/engine/__init__.pyi
new file mode 100644
index 0000000..49eca6d
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/engine/__init__.pyi
@@ -0,0 +1,11 @@
+# Stubs for sqlalchemy.engine (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .base import Connection as Connection
+from .base import Engine as Engine
+from .base import RowProxy as RowProxy
+from .base import Transaction as Transaction
+
+def create_engine(*args, **kwargs): ...
+def engine_from_config(configuration, prefix=..., **kwargs): ...
diff --git a/typeshed/third_party/2/sqlalchemy/engine/base.pyi b/typeshed/third_party/2/sqlalchemy/engine/base.pyi
new file mode 100644
index 0000000..71f6e19
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/engine/base.pyi
@@ -0,0 +1,21 @@
+from typing import Any, List, Tuple
+
+# Dummy until I figure out something better.
+class Connectable:
+    pass
+
+class Connection:
+    def begin(self): ...
+    def execute(self, object, *multiparams, **params): ...
+
+class Engine(object): ...
+
+class RowProxy:
+    def items(self) -> List[Tuple[Any, Any]]: ...
+    def keys(self) -> List[Any]: ...
+    def values(self) -> List[Any]: ...
+    def __getitem__(self, key: str): ...
+
+class Transaction:
+    def commit(self): ...
+    def rollback(self): ...
diff --git a/typeshed/third_party/2/sqlalchemy/engine/strategies.pyi b/typeshed/third_party/2/sqlalchemy/engine/strategies.pyi
new file mode 100644
index 0000000..06c2f00
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/engine/strategies.pyi
@@ -0,0 +1,39 @@
+# Stubs for sqlalchemy.engine.strategies (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+from . import base
+
+strategies = ...  # type: Any
+
+class EngineStrategy:
+    def __init__(self) -> None: ...
+    def create(self, *args, **kwargs): ...
+
+class DefaultEngineStrategy(EngineStrategy):
+    def create(self, name_or_url, **kwargs): ...
+
+class PlainEngineStrategy(DefaultEngineStrategy):
+    name = ...  # type: Any
+    engine_cls = ...  # type: Any
+
+class ThreadLocalEngineStrategy(DefaultEngineStrategy):
+    name = ...  # type: Any
+    engine_cls = ...  # type: Any
+
+class MockEngineStrategy(EngineStrategy):
+    name = ...  # type: Any
+    def create(self, name_or_url, executor, **kwargs): ...
+    class MockConnection(base.Connectable):
+        def __init__(self, dialect, execute) -> None: ...
+        engine = ...  # type: Any
+        dialect = ...  # type: Any
+        name = ...  # type: Any
+        def contextual_connect(self, **kwargs): ...
+        def execution_options(self, **kw): ...
+        def compiler(self, statement, parameters, **kwargs): ...
+        def create(self, entity, **kwargs): ...
+        def drop(self, entity, **kwargs): ...
+        def execute(self, object, *multiparams, **params): ...
diff --git a/typeshed/third_party/2/sqlalchemy/engine/url.pyi b/typeshed/third_party/2/sqlalchemy/engine/url.pyi
new file mode 100644
index 0000000..76dd1ef
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/engine/url.pyi
@@ -0,0 +1,27 @@
+# Stubs for sqlalchemy.engine.url (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import dialects
+
+# registry = dialects.registry
+
+class URL:
+    drivername = ...  # type: Any
+    username = ...  # type: Any
+    password = ...  # type: Any
+    host = ...  # type: Any
+    port = ...  # type: Any
+    database = ...  # type: Any
+    query = ...  # type: Any
+    def __init__(self, drivername, username=..., password=..., host=..., port=..., database=..., query=...) -> None: ...
+    def __to_string__(self, hide_password=...): ...
+    def __hash__(self): ...
+    def __eq__(self, other): ...
+    def get_backend_name(self): ...
+    def get_driver_name(self): ...
+    def get_dialect(self): ...
+    def translate_connect_args(self, names=..., **kw): ...
+
+def make_url(name_or_url): ...
diff --git a/typeshed/third_party/2/sqlalchemy/exc.pyi b/typeshed/third_party/2/sqlalchemy/exc.pyi
new file mode 100644
index 0000000..b87b9cd
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/exc.pyi
@@ -0,0 +1,77 @@
+# Stubs for sqlalchemy.exc (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class SQLAlchemyError(Exception): ...
+class ArgumentError(SQLAlchemyError): ...
+class NoSuchModuleError(ArgumentError): ...
+class NoForeignKeysError(ArgumentError): ...
+class AmbiguousForeignKeysError(ArgumentError): ...
+
+class CircularDependencyError(SQLAlchemyError):
+    cycles = ...  # type: Any
+    edges = ...  # type: Any
+    def __init__(self, message, cycles, edges, msg=...) -> None: ...
+    def __reduce__(self): ...
+
+class CompileError(SQLAlchemyError): ...
+
+class UnsupportedCompilationError(CompileError):
+    def __init__(self, compiler, element_type) -> None: ...
+
+class IdentifierError(SQLAlchemyError): ...
+class DisconnectionError(SQLAlchemyError): ...
+class TimeoutError(SQLAlchemyError): ...
+class InvalidRequestError(SQLAlchemyError): ...
+class NoInspectionAvailable(InvalidRequestError): ...
+class ResourceClosedError(InvalidRequestError): ...
+class NoSuchColumnError(KeyError, InvalidRequestError): ...
+class NoReferenceError(InvalidRequestError): ...
+
+class NoReferencedTableError(NoReferenceError):
+    table_name = ...  # type: Any
+    def __init__(self, message, tname) -> None: ...
+    def __reduce__(self): ...
+
+class NoReferencedColumnError(NoReferenceError):
+    table_name = ...  # type: Any
+    column_name = ...  # type: Any
+    def __init__(self, message, tname, cname) -> None: ...
+    def __reduce__(self): ...
+
+class NoSuchTableError(InvalidRequestError): ...
+class UnboundExecutionError(InvalidRequestError): ...
+class DontWrapMixin: ...
+
+UnmappedColumnError = ...  # type: Any
+
+class StatementError(SQLAlchemyError):
+    statement = ...  # type: Any
+    params = ...  # type: Any
+    orig = ...  # type: Any
+    detail = ...  # type: Any
+    def __init__(self, message, statement, params, orig) -> None: ...
+    def add_detail(self, msg): ...
+    def __reduce__(self): ...
+    def __unicode__(self): ...
+
+class DBAPIError(StatementError):
+    @classmethod
+    def instance(cls, statement, params, orig, dbapi_base_err, connection_invalidated=..., dialect=...): ...
+    def __reduce__(self): ...
+    connection_invalidated = ...  # type: Any
+    def __init__(self, statement, params, orig, connection_invalidated=...) -> None: ...
+
+class InterfaceError(DBAPIError): ...
+class DatabaseError(DBAPIError): ...
+class DataError(DatabaseError): ...
+class OperationalError(DatabaseError): ...
+class IntegrityError(DatabaseError): ...
+class InternalError(DatabaseError): ...
+class ProgrammingError(DatabaseError): ...
+class NotSupportedError(DatabaseError): ...
+class SADeprecationWarning(DeprecationWarning): ...
+class SAPendingDeprecationWarning(PendingDeprecationWarning): ...
+class SAWarning(RuntimeWarning): ...
diff --git a/typeshed/third_party/2/sqlalchemy/inspection.pyi b/typeshed/third_party/2/sqlalchemy/inspection.pyi
new file mode 100644
index 0000000..2d550cd
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/inspection.pyi
@@ -0,0 +1,5 @@
+# Stubs for sqlalchemy.inspection (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def inspect(subject, raiseerr=...): ...
diff --git a/typeshed/third_party/2/sqlalchemy/log.pyi b/typeshed/third_party/2/sqlalchemy/log.pyi
new file mode 100644
index 0000000..9e73bd9
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/log.pyi
@@ -0,0 +1,14 @@
+import logging
+from typing import Any
+
+rootlogger = ...  # type: Any
+
+class Identified(object):
+    def _should_log_debug(self) -> bool: ...
+    def _should_log_info(self) -> bool: ...
+
+class InstanceLogger(object): ...
+
+def instance_logger(instance, echoflag) -> None: ...
+
+class echo_property(object): ...
diff --git a/typeshed/third_party/2/sqlalchemy/orm/__init__.pyi b/typeshed/third_party/2/sqlalchemy/orm/__init__.pyi
new file mode 100644
index 0000000..280dd02
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/orm/__init__.pyi
@@ -0,0 +1,95 @@
+# Stubs for sqlalchemy.orm (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+# from . import mapper
+# from . import interfaces
+# from . import deprecated_interfaces
+# from . import util
+# from . import properties
+# from . import relationships
+# from . import descriptor_props
+from . import session
+# from . import scoping
+# from . import query
+from ..util import langhelpers
+# from . import strategy_options
+
+# Mapper = mapper.Mapper
+# class_mapper = mapper.class_mapper
+# configure_mappers = mapper.configure_mappers
+# reconstructor = mapper.reconstructor
+# validates = mapper.validates
+# EXT_CONTINUE = interfaces.EXT_CONTINUE
+# EXT_STOP = interfaces.EXT_STOP
+# PropComparator = interfaces.PropComparator
+# MapperExtension = deprecated_interfaces.MapperExtension
+# SessionExtension = deprecated_interfaces.SessionExtension
+# AttributeExtension = deprecated_interfaces.AttributeExtension
+# aliased = util.aliased
+# join = util.join
+# object_mapper = util.object_mapper
+# outerjoin = util.outerjoin
+# polymorphic_union = util.polymorphic_union
+# was_deleted = util.was_deleted
+# with_parent = util.with_parent
+# with_polymorphic = util.with_polymorphic
+# ColumnProperty = properties.ColumnProperty
+# RelationshipProperty = relationships.RelationshipProperty
+# ComparableProperty = descriptor_props.ComparableProperty
+# CompositeProperty = descriptor_props.CompositeProperty
+# SynonymProperty = descriptor_props.SynonymProperty
+# foreign = relationships.foreign
+# remote = relationships.remote
+Session = session.Session
+object_session = Session.object_session
+sessionmaker = session.sessionmaker
+# make_transient = session.make_transient
+# make_transient_to_detached = session.make_transient_to_detached
+# scoped_session = scoping.scoped_session
+# AliasOption = query.AliasOption
+# Query = query.Query
+# Bundle = query.Bundle
+public_factory = langhelpers.public_factory
+
+def create_session(bind=..., **kwargs): ...
+
+relationship = ...  # type: Any
+
+def relation(*arg, **kw): ...
+def dynamic_loader(argument, **kw): ...
+
+column_property = ...  # type: Any
+composite = ...  # type: Any
+
+def backref(name, **kwargs): ...
+def deferred(*columns, **kw): ...
+
+synonym = ...  # type: Any
+comparable_property = ...  # type: Any
+
+def compile_mappers(): ...
+def clear_mappers(): ...
+
+joinedload = ...  # type: Any
+joinedload_all = ...  # type: Any
+contains_eager = ...  # type: Any
+defer = ...  # type: Any
+undefer = ...  # type: Any
+undefer_group = ...  # type: Any
+load_only = ...  # type: Any
+lazyload = ...  # type: Any
+lazyload_all = ...  # type: Any
+subqueryload = ...  # type: Any
+subqueryload_all = ...  # type: Any
+immediateload = ...  # type: Any
+noload = ...  # type: Any
+defaultload = ...  # type: Any
+
+# Load = strategy_options.Load
+
+def eagerload(*args, **kwargs): ...
+def eagerload_all(*args, **kwargs): ...
+
+contains_alias = ...  # type: Any
diff --git a/typeshed/third_party/2/sqlalchemy/orm/session.pyi b/typeshed/third_party/2/sqlalchemy/orm/session.pyi
new file mode 100644
index 0000000..a53d619
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/orm/session.pyi
@@ -0,0 +1,93 @@
+# Stubs for sqlalchemy.orm.session (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _SessionClassMethods:
+    @classmethod
+    def close_all(cls): ...
+    @classmethod
+    def identity_key(cls, orm_util, *args, **kwargs): ...
+    @classmethod
+    def object_session(cls, instance): ...
+
+class SessionTransaction:
+    session = ...  # type: Any
+    nested = ...  # type: Any
+    def __init__(self, session, parent=..., nested=...) -> None: ...
+    @property
+    def is_active(self): ...
+    def connection(self, bindkey, execution_options=..., **kwargs): ...
+    def prepare(self): ...
+    def commit(self): ...
+    def rollback(self, _capture_exception=...): ...
+    def close(self, invalidate=...): ...
+    def __enter__(self): ...
+    def __exit__(self, type, value, traceback): ...
+
+class Session(_SessionClassMethods):
+    public_methods = ...  # type: Any
+    identity_map = ...  # type: Any
+    bind = ...  # type: Any
+    transaction = ...  # type: Any
+    hash_key = ...  # type: Any
+    autoflush = ...  # type: Any
+    autocommit = ...  # type: Any
+    expire_on_commit = ...  # type: Any
+    twophase = ...  # type: Any
+    def __init__(self, bind=..., autoflush=..., expire_on_commit=..., _enable_transaction_accounting=..., autocommit=..., twophase=..., weak_identity_map=..., binds=..., extension=..., info=..., query_cls=...) -> None: ...
+    connection_callable = ...  # type: Any
+    def info(self): ...
+    def begin(self, subtransactions=..., nested=...): ...
+    def begin_nested(self): ...
+    def rollback(self): ...
+    def commit(self): ...
+    def prepare(self): ...
+    def connection(self, mapper=..., clause=..., bind=..., close_with_result=..., execution_options=..., **kw): ...
+    def execute(self, clause, params=..., mapper=..., bind=..., **kw): ...
+    def scalar(self, clause, params=..., mapper=..., bind=..., **kw): ...
+    def close(self): ...
+    def invalidate(self): ...
+    def expunge_all(self): ...
+    def bind_mapper(self, mapper, bind): ...
+    def bind_table(self, table, bind): ...
+    def get_bind(self, mapper=..., clause=...): ...
+    def query(self, *entities, **kwargs): ...
+    @property
+    def no_autoflush(self): ...
+    def refresh(self, instance, attribute_names=..., lockmode=...): ...
+    def expire_all(self): ...
+    def expire(self, instance, attribute_names=...): ...
+    def prune(self): ...
+    def expunge(self, instance): ...
+    def add(self, instance, _warn=...): ...
+    def add_all(self, instances): ...
+    def delete(self, instance): ...
+    def merge(self, instance, load=...): ...
+    def enable_relationship_loading(self, obj): ...
+    def __contains__(self, instance): ...
+    def __iter__(self): ...
+    def flush(self, objects=...): ...
+    def bulk_save_objects(self, objects, return_defaults=..., update_changed_only=...): ...
+    def bulk_insert_mappings(self, mapper, mappings, return_defaults=...): ...
+    def bulk_update_mappings(self, mapper, mappings): ...
+    def is_modified(self, instance, include_collections=..., passive=...): ...
+    @property
+    def is_active(self): ...
+    @property
+    def dirty(self): ...
+    @property
+    def deleted(self): ...
+    @property
+    def new(self): ...
+
+class sessionmaker(_SessionClassMethods):
+    kw = ...  # type: Any
+    class_ = ...  # type: Any
+    def __init__(self, bind=..., class_=..., autoflush=..., autocommit=..., expire_on_commit=..., info=..., **kw) -> None: ...
+    def __call__(self, **local_kw): ...
+    def configure(self, **new_kw): ...
+
+# Names in __all__ with no definition:
+#   SessionExtension
diff --git a/typeshed/third_party/2/sqlalchemy/pool.pyi b/typeshed/third_party/2/sqlalchemy/pool.pyi
new file mode 100644
index 0000000..a278d6e
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/pool.pyi
@@ -0,0 +1,118 @@
+# Stubs for sqlalchemy.pool (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import log
+from . import util
+
+threading = util.threading
+memoized_property = util.memoized_property
+chop_traceback = util.chop_traceback
+
+proxies = ...  # type: Any
+
+def manage(module, **params): ...
+def clear_managers(): ...
+
+reset_rollback = ...  # type: Any
+reset_commit = ...  # type: Any
+reset_none = ...  # type: Any
+
+class _ConnDialect:
+    def do_rollback(self, dbapi_connection): ...
+    def do_commit(self, dbapi_connection): ...
+    def do_close(self, dbapi_connection): ...
+
+class Pool(log.Identified):
+    logging_name = ...  # type: Any
+    echo = ...  # type: Any
+    def __init__(self, creator, recycle=..., echo=..., use_threadlocal=..., logging_name=..., reset_on_return=..., listeners=..., events=..., _dispatch=..., _dialect=...) -> None: ...
+    def add_listener(self, listener): ...
+    def unique_connection(self): ...
+    def recreate(self): ...
+    def dispose(self): ...
+    def connect(self): ...
+    def status(self): ...
+
+    _threadconns = ...  # type: Any
+    _creator = ...  # type: Any
+    _recycle = ...  # type: Any
+    _invalidate_time = ...  # type: Any
+    dispatch = ...  # type: Any
+    _dialect = ...  # type: Any
+    _orig_logging_name = ...  # type: Any
+    _reset_on_return = ...  # type: Any
+    _use_threadlocal = ...  # type: Any
+
+class _ConnectionRecord:
+    connection = ...  # type: Any
+    finalize_callback = ...  # type: Any
+    def __init__(self, pool) -> None: ...
+    def info(self): ...
+    @classmethod
+    def checkout(cls, pool): ...
+    fairy_ref = ...  # type: Any
+    def checkin(self): ...
+    def close(self): ...
+    def invalidate(self, e=..., soft=...): ...
+    def get_connection(self): ...
+
+class _ConnectionFairy:
+    connection = ...  # type: Any
+    def __init__(self, dbapi_connection, connection_record, echo) -> None: ...
+    @property
+    def is_valid(self): ...
+    def info(self): ...
+    def invalidate(self, e=..., soft=...): ...
+    def cursor(self, *args, **kwargs): ...
+    def __getattr__(self, key): ...
+    def detach(self): ...
+    def close(self): ...
+
+class SingletonThreadPool(Pool):
+    size = ...  # type: Any
+    def __init__(self, creator, pool_size=..., **kw) -> None: ...
+    def recreate(self): ...
+    def dispose(self): ...
+    def status(self): ...
+
+class QueuePool(Pool):
+    def __init__(self, creator, pool_size=..., max_overflow=..., timeout=..., **kw) -> None: ...
+    def recreate(self): ...
+    def dispose(self): ...
+    def status(self): ...
+    def size(self): ...
+    def checkedin(self): ...
+    def overflow(self): ...
+    def checkedout(self): ...
+
+class NullPool(Pool):
+    def status(self): ...
+    def recreate(self): ...
+    def dispose(self): ...
+
+class StaticPool(Pool):
+    def connection(self): ...
+    def status(self): ...
+    def dispose(self): ...
+    def recreate(self): ...
+
+class AssertionPool(Pool):
+    def __init__(self, *args, **kw) -> None: ...
+    def status(self): ...
+    def dispose(self): ...
+    def recreate(self): ...
+
+class _DBProxy:
+    module = ...  # type: Any
+    kw = ...  # type: Any
+    poolclass = ...  # type: Any
+    pools = ...  # type: Any
+    def __init__(self, module, poolclass=..., **kw) -> None: ...
+    def close(self): ...
+    def __del__(self): ...
+    def __getattr__(self, key): ...
+    def get_pool(self, *args, **kw): ...
+    def connect(self, *args, **kw): ...
+    def dispose(self, *args, **kw): ...
diff --git a/typeshed/third_party/2/sqlalchemy/schema.pyi b/typeshed/third_party/2/sqlalchemy/schema.pyi
new file mode 100644
index 0000000..f788897
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/schema.pyi
@@ -0,0 +1,50 @@
+# Stubs for sqlalchemy.schema (Python 2)
+
+from .sql import base
+from .sql import schema
+from .sql import naming
+from .sql import ddl
+from .sql import elements
+
+SchemaVisitor = base.SchemaVisitor
+CheckConstraint = schema.CheckConstraint
+Column = schema.Column
+ColumnDefault = schema.ColumnDefault
+Constraint = schema.Constraint
+DefaultClause = schema.DefaultClause
+DefaultGenerator = schema.DefaultGenerator
+FetchedValue = schema.FetchedValue
+ForeignKey = schema.ForeignKey
+ForeignKeyConstraint = schema.ForeignKeyConstraint
+Index = schema.Index
+MetaData = schema.MetaData
+PassiveDefault = schema.PassiveDefault
+PrimaryKeyConstraint = schema.PrimaryKeyConstraint
+SchemaItem = schema.SchemaItem
+Sequence = schema.Sequence
+Table = schema.Table
+ThreadLocalMetaData = schema.ThreadLocalMetaData
+UniqueConstraint = schema.UniqueConstraint
+_get_table_key = schema._get_table_key
+ColumnCollectionConstraint = schema.ColumnCollectionConstraint
+ColumnCollectionMixin = schema.ColumnCollectionMixin
+conv = elements.conv
+DDL = ddl.DDL
+CreateTable = ddl.CreateTable
+DropTable = ddl.DropTable
+CreateSequence = ddl.CreateSequence
+DropSequence = ddl.DropSequence
+CreateIndex = ddl.CreateIndex
+DropIndex = ddl.DropIndex
+CreateSchema = ddl.CreateSchema
+DropSchema = ddl.DropSchema
+_DropView = ddl._DropView
+CreateColumn = ddl.CreateColumn
+AddConstraint = ddl.AddConstraint
+DropConstraint = ddl.DropConstraint
+DDLBase = ddl.DDLBase
+DDLElement = ddl.DDLElement
+_CreateDropBase = ddl._CreateDropBase
+_DDLCompiles = ddl._DDLCompiles
+sort_tables = ddl.sort_tables
+sort_tables_and_constraints = ddl.sort_tables_and_constraints
diff --git a/typeshed/third_party/2/sqlalchemy/sql/__init__.pyi b/typeshed/third_party/2/sqlalchemy/sql/__init__.pyi
new file mode 100644
index 0000000..91d06d8
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/__init__.pyi
@@ -0,0 +1,66 @@
+# Stubs for sqlalchemy.sql (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import expression
+from . import visitors
+
+Alias = expression.Alias
+ClauseElement = expression.ClauseElement
+ColumnCollection = expression.ColumnCollection
+ColumnElement = expression.ColumnElement
+CompoundSelect = expression.CompoundSelect
+Delete = expression.Delete
+FromClause = expression.FromClause
+Insert = expression.Insert
+Join = expression.Join
+Select = expression.Select
+Selectable = expression.Selectable
+TableClause = expression.TableClause
+Update = expression.Update
+alias = expression.alias
+and_ = expression.and_
+asc = expression.asc
+between = expression.between
+bindparam = expression.bindparam
+case = expression.case
+cast = expression.cast
+collate = expression.collate
+column = expression.column
+delete = expression.delete
+desc = expression.desc
+distinct = expression.distinct
+except_ = expression.except_
+except_all = expression.except_all
+exists = expression.exists
+extract = expression.extract
+false = expression.false
+False_ = expression.False_
+func = expression.func
+funcfilter = expression.funcfilter
+insert = expression.insert
+intersect = expression.intersect
+intersect_all = expression.intersect_all
+join = expression.join
+label = expression.label
+literal = expression.literal
+literal_column = expression.literal_column
+modifier = expression.modifier
+not_ = expression.not_
+null = expression.null
+or_ = expression.or_
+outerjoin = expression.outerjoin
+outparam = expression.outparam
+over = expression.over
+select = expression.select
+subquery = expression.subquery
+table = expression.table
+text = expression.text
+true = expression.true
+True_ = expression.True_
+tuple_ = expression.tuple_
+type_coerce = expression.type_coerce
+union = expression.union
+union_all = expression.union_all
+update = expression.update
+ClauseVisitor = visitors.ClauseVisitor
diff --git a/typeshed/third_party/2/sqlalchemy/sql/annotation.pyi b/typeshed/third_party/2/sqlalchemy/sql/annotation.pyi
new file mode 100644
index 0000000..ba0aba4
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/annotation.pyi
@@ -0,0 +1,11 @@
+class Annotated(object):
+    def __new__(cls, *args): ...
+    def __init__(self, element, values): ...
+    def _annotate(self, values): ...
+    def _with_annotations(self, values): ...
+    def _deannotate(self, values=..., clone: bool=...): ...
+    def _compiler_dispatch(self, visitor, **kw): ...
+    def _constructor(self): ...
+    def _clone(self): ...
+    def __hash__(self): ...
+    def __eq__(self): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/base.pyi b/typeshed/third_party/2/sqlalchemy/sql/base.pyi
new file mode 100644
index 0000000..48e68c7
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/base.pyi
@@ -0,0 +1,42 @@
+from typing import Any, Iterable
+
+from .visitors import ClauseVisitor
+from .. import util
+
+class Immutable(object):
+    def unique_params(self, *optionaldict, **kwargs): ...
+    def params(self, *optionaldict, **kwargs): ...
+    def _clone(self) -> Immutable: ...
+
+class DialectKWArgs(object):
+    def argument_for(cls, dialect_name, argument_name, default): ...
+    def kwargs(self): ...
+    def dialect_options(self): ...
+
+class Generative(object): ...
+
+class Executable(Generative):
+    def execution_options(self, **kw): ...
+    def execute(self, *multiparams, **params): ...
+    def scalar(self, *multiparams, **params): ...
+
+    @property
+    def bind(self): ...
+
+class SchemaEventTarget(object): ...
+class SchemaVisitor(ClauseVisitor): ...
+class ColumnCollection(util.OrderedProperties):
+    def replace(self, column): ...
+    def add(self, column): ...
+    def clear(self): ...
+    def remove(self, column): ...
+    def update(self, iter: Iterable[Any]): ...
+    def extend(self, iter: Iterable[Any]): ...
+    def contains_column(self, col): ...
+    def as_immutable(self): ...
+
+class ImmutableColumnCollection(util.ImmutableProperties, ColumnCollection): ...
+
+class ColumnSet(util.ordered_column_set): ...
+
+def _bind_or_error(schemaitem, msg): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/ddl.pyi b/typeshed/third_party/2/sqlalchemy/sql/ddl.pyi
new file mode 100644
index 0000000..06ac96a
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/ddl.pyi
@@ -0,0 +1,25 @@
+from .elements import ClauseElement
+from .base import Executable, SchemaVisitor
+
+class _DDLCompiles(ClauseElement): ...
+class DDLElement(Executable, _DDLCompiles): ...
+class DDL(DDLElement): ...
+class _CreateDropBase(DDLElement): ...
+class CreateSchema(_CreateDropBase): ...
+class DropSchema(_CreateDropBase): ...
+class CreateTable(_CreateDropBase): ...
+class _DropView(_CreateDropBase): ...
+class CreateColumn(_DDLCompiles): ...
+class DropTable(_CreateDropBase): ...
+class CreateSequence(_CreateDropBase): ...
+class DropSequence(_CreateDropBase): ...
+class CreateIndex(_CreateDropBase): ...
+class DropIndex(_CreateDropBase): ...
+class AddConstraint(_CreateDropBase): ...
+class DropConstraint(_CreateDropBase): ...
+class DDLBase(SchemaVisitor): ...
+class SchemaGenerator(DDLBase): ...
+class SchemaDropper(DDLBase): ...
+
+def sort_tables(tables, skip_fn=..., extra_dependencies=...): ...
+def sort_tables_and_constraints(tables, filter_fn=..., extra_dependencies=...): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/dml.pyi b/typeshed/third_party/2/sqlalchemy/sql/dml.pyi
new file mode 100644
index 0000000..79cb201
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/dml.pyi
@@ -0,0 +1,20 @@
+from typing import AnyStr
+
+from .base import Executable, DialectKWArgs
+from .elements import ClauseElement
+from .selectable import HasPrefixes
+
+class UpdateBase(DialectKWArgs, HasPrefixes, Executable, ClauseElement):
+    def params(self, *arg, **kw): ...
+    @property
+    def bind(self): ...
+    def returning(self, *cols): ...
+    def with_hint(self, text, selectable=..., dialect_name: AnyStr=...): ...
+
+class ValuesBase(UpdateBase):
+    def values(self, *args, **kwargs): ...
+    def return_defaults(self, *cols): ...
+
+class Insert(ValuesBase): ...
+class Update(ValuesBase): ...
+class Delete(UpdateBase): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/elements.pyi b/typeshed/third_party/2/sqlalchemy/sql/elements.pyi
new file mode 100644
index 0000000..e2a8d38
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/elements.pyi
@@ -0,0 +1,60 @@
+
+from .visitors import Visitable
+from .annotation import Annotated
+from .base import Executable, Immutable
+from .operators import ColumnOperators
+from .. import util
+
+class ClauseElement(Visitable): ...
+
+class ColumnElement(ColumnOperators, ClauseElement): ...
+
+class BindParameter(ColumnElement): ...
+class BinaryExpression(ColumnElement): ...
+
+class TypeClause(ClauseElement): ...
+class TextClause(Executable, ClauseElement): ...
+
+class Null(ColumnElement): ...
+class False_(ColumnElement): ...
+class True_(ColumnElement): ...
+
+class ClauseList(ClauseElement): ...
+class BooleanClauseList(ClauseList, ColumnElement): ...
+class Tuple(ClauseList, ColumnElement): ...
+class Case(ColumnElement): ...
+class Cast(ColumnElement): ...
+class Extract(ColumnElement): ...
+class _label_reference(ColumnElement): ...
+
+class _textual_label_reference(ColumnElement): ...
+class UnaryExpression(ColumnElement): ...
+class AsBoolean(UnaryExpression): ...
+class Grouping(ColumnElement): ...
+class Over(ColumnElement): ...
+class FunctionFilter(ColumnElement): ...
+class Label(ColumnElement): ...
+class ColumnClause(Immutable, ColumnElement): ...
+class _IdentifiedClause(Executable, ClauseElement): ...
+class SavepointClause(_IdentifiedClause): ...
+class RollbackToSavepointClause(_IdentifiedClause): ...
+class ReleaseSavepointClause(_IdentifiedClause): ...
+class quoted_name(util.MemoizedSlots, util.text_type): ...
+class _truncated_label(quoted_name): ...
+class conv(_truncated_label): ...
+class _defer_name(_truncated_label): ...
+class _defer_none_name(_defer_name): ...
+class _anonymous_label(_truncated_label): ...
+class AnnotatedColumnElement(Annotated): ...
+
+def _clone(element, **kw): ...
+def _type_from_args(args): ...
+def _literal_as_binds(element, name, type_=None): ...
+
+def collate(expression, collation) -> BinaryExpression: ...
+def between(expr, lower_bound, upper_bound, symmetric: bool=...): ...
+def literal(value, type_=None) -> BindParameter: ...
+def outparam(key, type_=None) -> BindParameter: ...
+def type_coerce(expression, type_): ...
+def not_(clause): ...
+def literal_column(text, type_=None): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/expression.pyi b/typeshed/third_party/2/sqlalchemy/sql/expression.pyi
new file mode 100644
index 0000000..48fc3b8
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/expression.pyi
@@ -0,0 +1,87 @@
+# Stubs for sqlalchemy.sql.expression (Python 2)
+
+from typing import Any
+from . import functions
+from . import elements
+from . import base
+from . import selectable
+from . import dml
+
+from .visitors import Visitable
+
+from .elements import ClauseElement, ColumnElement,\
+    BindParameter, UnaryExpression, BooleanClauseList, \
+    Label, Cast, Case, ColumnClause, TextClause, Over, Null, \
+    True_, False_, BinaryExpression, Tuple, TypeClause, Extract, \
+    Grouping, not_, \
+    collate, literal_column, between,\
+    literal, outparam, type_coerce, ClauseList, FunctionFilter
+from .elements import SavepointClause, RollbackToSavepointClause, \
+    ReleaseSavepointClause
+from .base import ColumnCollection, Generative, Executable
+from .selectable import Alias, Join, Select, Selectable, TableClause, \
+    CompoundSelect, CTE, FromClause, FromGrouping, SelectBase, \
+    alias, GenerativeSelect, \
+    subquery, HasPrefixes, HasSuffixes, Exists, ScalarSelect, TextAsFrom
+from .dml import Insert, Update, Delete, UpdateBase, ValuesBase
+
+func = functions.func  # type: functions._FunctionGenerator
+modifier = functions.modifier  # type: functions._FunctionGenerator
+
+and_ = ...  # type: Any
+or_ = ...  # type: Any
+bindparam = ...  # type: Any
+select = ...  # type: Any
+text = ...  # type: Any
+table = ...  # type: Any
+column = ...  # type: Any
+over = ...  # type: Any
+label = ...  # type: Any
+case = ...  # type: Any
+cast = ...  # type: Any
+extract = ...  # type: Any
+tuple_ = ...  # type: Any
+except_ = ...  # type: Any
+except_all = ...  # type: Any
+intersect = ...  # type: Any
+intersect_all = ...  # type: Any
+union = ...  # type: Any
+union_all = ...  # type: Any
+exists = ...  # type: Any
+nullsfirst = ...  # type: Any
+nullslast = ...  # type: Any
+asc = ...  # type: Any
+desc = ...  # type: Any
+distinct = ...  # type: Any
+true = ...  # type: Any
+false = ...  # type: Any
+null = ...  # type: Any
+join = ...  # type: Any
+outerjoin = ...  # type: Any
+insert = ...  # type: Any
+update = ...  # type: Any
+delete = ...  # type: Any
+funcfilter = ...  # type: Any
+
+# old names for compatibility
+_Executable = Executable
+_BindParamClause = BindParameter
+_Label = Label
+_SelectBase = SelectBase
+_BinaryExpression = BinaryExpression
+_Cast = Cast
+_Null = Null
+_False = False_
+_True = True_
+_TextClause = TextClause
+_UnaryExpression = UnaryExpression
+_Case = Case
+_Tuple = Tuple
+_Over = Over
+_Generative = Generative
+_TypeClause = TypeClause
+_Extract = Extract
+_Exists = Exists
+_Grouping = Grouping
+_FromGrouping = FromGrouping
+_ScalarSelect = ScalarSelect
diff --git a/typeshed/third_party/2/sqlalchemy/sql/functions.pyi b/typeshed/third_party/2/sqlalchemy/sql/functions.pyi
new file mode 100644
index 0000000..b656456
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/functions.pyi
@@ -0,0 +1,47 @@
+
+from .base import Executable, ColumnCollection
+from .elements import ClauseList, Cast, Extract, _literal_as_binds, \
+    literal_column, _type_from_args, ColumnElement, _clone,\
+    Over, BindParameter, FunctionFilter
+from .selectable import FromClause, Select, Alias
+from .visitors import VisitableType
+
+class FunctionElement(Executable, ColumnElement, FromClause): ...
+
+class _FunctionGenerator(object):
+    def __init__(self, **opts): ...
+    def __getattr__(self, name): ...
+    def __call__(self, *c, **kwargs) -> Function: ...
+
+func = ...  # type: _FunctionGenerator
+modifier = ...  # type: _FunctionGenerator
+
+class Function(FunctionElement): ...
+
+class _GenericMeta(VisitableType): ...
+# TODO: Use GenericFunction(util.with_metaclass(_GenericMeta, Function))
+class GenericFunction(_GenericMeta, Function): ...
+class next_value(GenericFunction): ...
+
+class AnsiFunction(GenericFunction): ...
+class ReturnTypeFromArgs(GenericFunction): ...
+
+class coalesce(ReturnTypeFromArgs): ...
+class max(ReturnTypeFromArgs): ...
+class min(ReturnTypeFromArgs): ...
+class sum(ReturnTypeFromArgs): ...
+class now(GenericFunction): ...
+class concat(GenericFunction): ...
+
+class char_length(GenericFunction): ...
+class random(GenericFunction): ...
+class count(GenericFunction): ...
+class current_date(AnsiFunction): ...
+class current_time(AnsiFunction): ...
+class current_timestamp(AnsiFunction): ...
+class current_user(AnsiFunction): ...
+class localtime(AnsiFunction): ...
+class localtimestamp(AnsiFunction): ...
+class session_user(AnsiFunction): ...
+class sysdate(AnsiFunction): ...
+class user(AnsiFunction): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/naming.pyi b/typeshed/third_party/2/sqlalchemy/sql/naming.pyi
new file mode 100644
index 0000000..d9172c4
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/naming.pyi
@@ -0,0 +1 @@
+class ConventionDict(object): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/operators.pyi b/typeshed/third_party/2/sqlalchemy/sql/operators.pyi
new file mode 100644
index 0000000..5ae39cd
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/operators.pyi
@@ -0,0 +1,99 @@
+from typing import Any, AnyStr, Callable
+
+class Operators(object):
+    def op(self, opstring: AnyStr, precedence: int, is_comparison: bool): ...
+    def operate(self, op: Callable[[Any], Any], *other, **kwargs): ...
+    def reverse_operator(self, op: Callable[[Any], Any], *other, **kwargs): ...
+    def __and__(self, other): ...
+    def __or__(self, other): ...
+    def __invert__(self): ...
+
+
+class ColumnOperators(Operators):
+    def concat(self, other): ...
+    def like(self, other, escape=None): ...
+    def ilike(self, other, escape=None): ...
+    def notlike(self, other, escape=None): ...
+    def notilike(self, other, escape=None): ...
+    def in_(self, other): ...
+    def notin_(self, other): ...
+    def is_(self, other): ...
+    def startswith(self, other, **kwargs): ...
+    def endswith(self, other, **kwargs): ...
+    def contains(self, other, **kwargs): ...
+    def match(self, other, **kwargs): ...
+    def desc(self): ...
+    def asc(self): ...
+    def nullsfirst(self): ...
+    def nullslast(self): ...
+    def collate(self, collation): ...
+    def between(self, cleft, cright, symmetric: bool = ...): ...
+    def distinct(self): ...
+
+    def __lt__(self, other): ...
+    def __le__(self, other): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    def __gt__(self, other): ...
+    def __ge__(self, other): ...
+    def __neg__(self, other): ...
+    def __getitem__(self, index): ...
+    def __lshift__(self, other): ...
+    def __rshift__(self, other): ...
+
+    def __radd__(self, other): ...
+    def __rsub__(self, other): ...
+    def __rmul__(self, other): ...
+    def __rdiv__(self, other): ...
+    def __rmod__(self, other): ...
+    def __add__(self, other): ...
+    def __sub__(self, other): ...
+    def __mul__(self, other): ...
+    def __div__(self, other): ...
+    def __mod__(self, other): ...
+    def __truediv__(self, other): ...
+    def __rtruediv__(self, other): ...
+
+def from_(): ...
+def as_(): ...
+def exists(): ...
+def istrue(a): ...
+def isfalse(a): ...
+def is_(a, b): ...
+def isnot(a, b): ...
+def collate(a, b): ...
+def op(a, opstring, b): ...
+
+def like_op(a, b, escape=None): ...
+def notlike_op(a, b, escape=None): ...
+def ilike_op(a, b, escape=None): ...
+def notilike_op(a, b, escape=None): ...
+def between_op(a, b, symmetric: bool): ...
+def notbetween_(a, b, symmetric: bool): ...
+
+def in_op(a, b): ...
+def notin_op(a, b): ...
+def distinct_op(a): ...
+
+def startswith_op(a, b, escape=None): ...
+def notstartswith_op(a, b, escape=None): ...
+def endswith_op(a, b, escape=None): ...
+def notendswith_op(a, b, escape=None): ...
+def contains_op(a, b, escape=None): ...
+def notcontains_op(a, b, escape=None): ...
+
+def match_op(a, b, **kw): ...
+def notmatch_op(a, b, **kw): ...
+
+def comma_op(a, b): ...
+def concat_op(a, b): ...
+
+def desc_op(a): ...
+def asc_op(a): ...
+def nullsfirst_op(a): ...
+def nullslast_op(a): ...
+
+def is_comparison(op): ...
+def is_commutative(op): ...
+def is_ordering_modified(op): ...
+def is_precedent(operator, against): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/schema.pyi b/typeshed/third_party/2/sqlalchemy/sql/schema.pyi
new file mode 100644
index 0000000..b2b3e4c
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/schema.pyi
@@ -0,0 +1,126 @@
+from typing import Any, AnyStr
+
+from .base import SchemaEventTarget, DialectKWArgs
+from .base import ColumnCollection
+from .elements import ClauseElement, ColumnClause, TextClause, \
+    ColumnElement
+from .selectable import TableClause
+
+from . import visitors
+
+class SchemaItem(SchemaEventTarget, visitors.Visitable):
+    def _execute_on_connection(self, connection, multiparams, params): ...
+    @property
+    def info(self): ...
+    @property
+    def quote(self): ...
+    def get_children(self, **kwargs): ...
+    def _init_items(self, *args): ...
+    def _schema_item_copy(self, schema_item): ...
+    def __repr__(self): ...
+
+
+class Table(DialectKWArgs, SchemaItem, TableClause):
+    def __init__(self, name, metadata, *args, **kwargs): ...
+    @property
+    def key(self): ...
+    @property
+    def primary_key(self): ...
+    def __repr__(self): ...
+    def __str__(self): ...
+    def append_column(self, column): ...
+    def append_constraint(self, constraint): ...
+    def append_ddl_listener(self, event, listener): ...
+    def get_children(self, column_collections=True, schema_visitor=False, **kwargs): ...
+    def exists(self, bind=None): ...
+    def create(self, bind=None, checkfirst=False): ...
+    def drop(self, bind=None, checkfirst=False): ...
+    def tometadata(self, metadata, schema=None): ...
+    c = ...  # type: ColumnCollection
+    constraints = ...  # type: Set[Constraint]
+
+
+class Column(SchemaItem, ColumnClause):
+    primary_key = ...  # type: Any
+    def __init__(self, *args, **kwargs): ...
+    def references(self, column): ...
+    def append_foreign_key(self, fk): ...
+    def __repr__(self): ...
+    def _set_parent(self, table): ...
+    def _setup_on_memoized_fks(self, fn): ...
+    def _on_table_attach(self, fn): ...
+    def copy(self, **kw): ...
+    def _make_proxy(self, selectable, name=None, key=None,
+                    name_is_truncatable=False, **kw): ...
+    def get_children(self, schema_visitor=False, **kwargs): ...
+
+
+class ForeignKey(DialectKWArgs, SchemaItem):
+    def __init__(self, column, _constraint=None, use_alter=False, name=None,
+                 onupdate=None, ondelete=None, deferrable=None,
+                 initially=None, link_to_name=False, match=None,
+                 info=None, **dialect_kw) -> None: ...
+    def __repr__(self): ...
+    def copy(self, schema=None): ...
+    def _get_colspec(self, schema=None, table_name=None): ...
+    @property
+    def _referred_schema(self): ...
+    def _table_key(self): ...
+    def references(self, table): ...
+    def get_referent(self, table): ...
+    @property
+    def _column_tokens(self): ...
+    def _resolve_col_tokens(self): ...
+    def _link_to_col_by_colstring(self, parenttable, table, colname): ...
+    def _set_target_column(self, column): ...
+    @property
+    def column(self): ...
+    def _set_parent(self, column): ...
+    def _set_remote_table(self, table): ...
+    def _remove_from_metadata(self, metadata): ...
+    def _set_table(self, column, table): ...
+
+class _NotAColumnExpr(object): ...
+class DefaultGenerator(_NotAColumnExpr, SchemaItem): ...
+class ColumnDefault(DefaultGenerator): ...
+class Sequence(DefaultGenerator): ...
+class FetchedValue(_NotAColumnExpr, SchemaEventTarget): ...
+class DefaultClause(FetchedValue): ...
+class PassiveDefault(DefaultClause): ...
+
+class Constraint(DialectKWArgs, SchemaItem):
+    def __init__(self, name=None, deferrable=None, initially=None): ...
+    def __contains__(self, x): ...
+    def contains_column(self, col): ...
+    def keys(self): ...
+    def __add__(self, other): ...
+    def __iter__(self): ...
+    def __len__(self): ...
+    def copy(self, **kw): ...
+
+class ColumnCollectionMixin(object):
+    columns = ...  # type: Any
+    def __init__(self, *columns, **kw): ...
+    @classmethod
+    def _extract_col_expression_collection(cls, expressions): ...
+    def _check_attach(self, evt=False): ...
+    def _set_parent(self, table): ...
+
+class ColumnCollectionConstraint(ColumnCollectionMixin, Constraint):
+    def __init__(self, *columns, **kw): ...
+    def _set_parent(self, table): ...
+    def __contains__(self, x): ...
+    def copy(self, **kw): ...
+    def contains_column(self, col): ...
+    def __iter__(self): ...
+    def __len__(self): ...
+
+class CheckConstraint(ColumnCollectionConstraint): ...
+class ForeignKeyConstraint(ColumnCollectionConstraint): ...
+class PrimaryKeyConstraint(ColumnCollectionConstraint): ...
+class UniqueConstraint(ColumnCollectionConstraint): ...
+class Index(DialectKWArgs, ColumnCollectionMixin, SchemaItem): ...
+class MetaData(SchemaItem): ...
+class ThreadLocalMetaData(MetaData): ...
+
+def _get_table_key(name: AnyStr, schema: AnyStr): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/selectable.pyi b/typeshed/third_party/2/sqlalchemy/sql/selectable.pyi
new file mode 100644
index 0000000..a3b1925
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/selectable.pyi
@@ -0,0 +1,74 @@
+from .base import Immutable, Executable, \
+    ColumnCollection, ColumnSet, Generative
+from .elements import ClauseElement, TextClause, ClauseList, \
+    Grouping, UnaryExpression, BindParameter
+from .annotation import Annotated
+from .visitors import Visitable
+from .. import util
+
+def subquery(alias, *args, **kwargs): ...
+def alias(selectable, name=..., flat: bool=...): ...
+
+class Selectable(ClauseElement):
+    def selectable(self): ...
+
+class HasPrefixes(object):
+    def prefix_with(self, *expr, **kw): ...
+
+class HasSuffixes(object):
+    def suffix_with(self, *expr, **kw): ...
+
+class FromClause(Selectable):
+    def count(self, functions, whereclause=None, **params): ...
+    def select(self, whereclause=None, **params): ...
+    def join(self, right, onclause=None, isouter: bool=False): ...
+    def outerjoin(self, right, onclause=None): ...
+    def alias(self, name=None, flat: bool=False): ...
+    def is_derived_from(self, fromclause): ...
+    def _is_lexical_equivalent(self, other): ...
+    def replace_selectable(self, sqlutil, old, alias): ...
+    def correspond_on_equivalents(self, column, equivalents): ...
+    def corresponding_column(self, column, require_embedded: bool=False): ...
+    @property
+    def description(self): ...
+    def _reset_exported(self): ...
+    @property
+    def columns(self): ...
+    @property
+    def primary_key(self): ...
+    @property
+    def foreign_keys(self): ...
+    def _init_collections(self): ...
+    @property
+    def _cols_populated(self): ...
+    def _populate_column_collection(self): ...
+    def _refresh_for_new_column(self, column): ...
+
+class Join(FromClause): ...
+class Alias(FromClause): ...
+class CTE(Generative, HasSuffixes, Alias): ...
+class FromGrouping(FromClause): ...
+
+class TableClause(Immutable, FromClause):
+    def __init__(self, name, *columns): ...
+    def _export_columns(self): ...
+    @util.memoized_property
+    def description(self): ...
+    def append_column(self, c): ...
+    def get_children(self, **kwargs): ...
+    def count(self, whereclause=None, **params): ...
+    def insert(self, values=None, inline=False, **kwargs): ...
+    def update(self, whereclause=None, values=None, inline=False, **kwargs): ...
+    def delete(self, whereclause=None, **kwargs): ...
+    @property
+    def _from_objects(self): ...
+
+class ForUpdateArg(ClauseElement): ...
+class SelectBase(Executable, FromClause): ...
+class GenerativeSelect(SelectBase): ...
+class CompoundSelect(GenerativeSelect): ...
+class Select(HasPrefixes, HasSuffixes, GenerativeSelect): ...
+class ScalarSelect(Generative, Grouping): ...
+class Exists(UnaryExpression): ...
+class TextAsFrom(SelectBase): ...
+class AnnotatedFromClause(Annotated): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi b/typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi
new file mode 100644
index 0000000..6c51ef7
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi
@@ -0,0 +1,57 @@
+from .type_api import TypeEngine, TypeDecorator
+from .base import SchemaEventTarget
+
+class _DateAffinity(object): ...
+class Concatenable(object): ...
+class String(TypeEngine, Concatenable):
+    def __init__(self, length=None, collation=None,
+                 convert_unicode=False,
+                 unicode_error=None,
+                 _warn_on_bytestring=False): ...
+
+class Text(String): ...
+class Unicode(String): ...
+class UnicodeText(Text): ...
+class Integer(TypeEngine, _DateAffinity): ...
+class SmallInteger(Integer): ...
+class BigInteger(Integer): ...
+class Numeric(TypeEngine, _DateAffinity): ...
+class Float(Numeric): ...
+class DateTime(TypeEngine, _DateAffinity):
+    def __init__(self, timezone=None): ...
+class Date(TypeEngine, _DateAffinity): ...
+class Time(TypeEngine, _DateAffinity): ...
+class _Binary(TypeEngine): ...
+class LargeBinary(_Binary): ...
+class Binary(LargeBinary): ...
+class SchemaType(SchemaEventTarget): ...
+class Enum(String, SchemaType): ...
+class PickleType(TypeDecorator): ...
+class Boolean(TypeEngine, SchemaType): ...
+class Interval(_DateAffinity, TypeDecorator): ...
+
+class REAL(Float): ...
+class FLOAT(Float): ...
+class NUMERIC(Numeric): ...
+class DECIMAL(Numeric): ...
+class INTEGER(Integer): ...
+# In code it's INT=INTEGER
+class INT(Integer): ...
+class SMALLINT(SmallInteger): ...
+class BIGINT(BigInteger): ...
+class TIMESTAMP(DateTime): ...
+class DATETIME(DateTime): ...
+class DATE(Date): ...
+class TIME(Time): ...
+class TEXT(Text): ...
+class CLOB(Text): ...
+class VARCHAR(String): ...
+class NVARCHAR(Unicode): ...
+class CHAR(String): ...
+class NCHAR(Unicode): ...
+class BLOB(LargeBinary): ...
+class BINARY(_Binary): ...
+class VARBINARY(_Binary): ...
+class BOOLEAN(Boolean): ...
+class NullType(TypeEngine): ...
+class MatchType(Boolean): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/type_api.pyi b/typeshed/third_party/2/sqlalchemy/sql/type_api.pyi
new file mode 100644
index 0000000..9b8d0e8
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/type_api.pyi
@@ -0,0 +1,16 @@
+from .. import util
+from .visitors import Visitable, VisitableType
+
+class TypeEngine(Visitable):
+    @property
+    def python_type(self): ...
+    def get_dbapi_type(self, dbapi): ...
+    def literal_processor(self, dialect): ...
+    def bind_processor(self, dialect): ...
+    def result_processor(self, dialect, coltype): ...
+
+class VisitableCheckKWArg(util.EnsureKWArgType, VisitableType): ...
+# TODO: class UserDefinedType(util.with_metaclass(VisitableCheckKWArg, TypeEngine)):
+class UserDefinedType(VisitableCheckKWArg, TypeEngine): ...
+class TypeDecorator(TypeEngine): ...
+class Variant(TypeDecorator): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/visitors.pyi b/typeshed/third_party/2/sqlalchemy/sql/visitors.pyi
new file mode 100644
index 0000000..6fc58e7
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/visitors.pyi
@@ -0,0 +1,33 @@
+# Stubs for sqlalchemy.sql.visitors (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class VisitableType(type):
+    def __init__(cls, clsname, bases, clsdict) -> None: ...
+
+class Visitable: ...
+
+class ClauseVisitor:
+    __traverse_options__ = ...  # type: Any
+    def traverse_single(self, obj, **kw): ...
+    def iterate(self, obj): ...
+    def traverse(self, obj): ...
+    def chain(self, visitor): ...
+
+class CloningVisitor(ClauseVisitor):
+    def copy_and_process(self, list_): ...
+    def traverse(self, obj): ...
+
+class ReplacingCloningVisitor(CloningVisitor):
+    def replace(self, elem): ...
+    def traverse(self, obj): ...
+
+def iterate(obj, opts): ...
+def iterate_depthfirst(obj, opts): ...
+def traverse_using(iterator, obj, visitors): ...
+def traverse(obj, opts, visitors): ...
+def traverse_depthfirst(obj, opts, visitors): ...
+def cloned_traverse(obj, opts, visitors): ...
+def replacement_traverse(obj, opts, replace): ...
diff --git a/typeshed/third_party/2/sqlalchemy/types.pyi b/typeshed/third_party/2/sqlalchemy/types.pyi
new file mode 100644
index 0000000..7aa160c
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/types.pyi
@@ -0,0 +1,51 @@
+# Stubs for sqlalchemy.types (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .sql import type_api
+from .sql import sqltypes
+
+TypeEngine = type_api.TypeEngine
+TypeDecorator = type_api.TypeDecorator
+UserDefinedType = type_api.UserDefinedType
+BIGINT = sqltypes.BIGINT
+BINARY = sqltypes.BINARY
+BLOB = sqltypes.BLOB
+BOOLEAN = sqltypes.BOOLEAN
+BigInteger = sqltypes.BigInteger
+Binary = sqltypes.Binary
+Boolean = sqltypes.Boolean
+CHAR = sqltypes.CHAR
+CLOB = sqltypes.CLOB
+Concatenable = sqltypes.Concatenable
+DATE = sqltypes.DATE
+DATETIME = sqltypes.DATETIME
+DECIMAL = sqltypes.DECIMAL
+Date = sqltypes.Date
+DateTime = sqltypes.DateTime
+Enum = sqltypes.Enum
+FLOAT = sqltypes.FLOAT
+Float = sqltypes.Float
+INT = sqltypes.INT
+INTEGER = sqltypes.INTEGER
+Integer = sqltypes.Integer
+Interval = sqltypes.Interval
+LargeBinary = sqltypes.LargeBinary
+NCHAR = sqltypes.NCHAR
+NVARCHAR = sqltypes.NVARCHAR
+NUMERIC = sqltypes.NUMERIC
+Numeric = sqltypes.Numeric
+PickleType = sqltypes.PickleType
+REAL = sqltypes.REAL
+SMALLINT = sqltypes.SMALLINT
+SmallInteger = sqltypes.SmallInteger
+String = sqltypes.String
+TEXT = sqltypes.TEXT
+TIME = sqltypes.TIME
+TIMESTAMP = sqltypes.TIMESTAMP
+Text = sqltypes.Text
+Time = sqltypes.Time
+Unicode = sqltypes.Unicode
+UnicodeText = sqltypes.UnicodeText
+VARBINARY = sqltypes.VARBINARY
+VARCHAR = sqltypes.VARCHAR
diff --git a/typeshed/third_party/2/sqlalchemy/util/__init__.pyi b/typeshed/third_party/2/sqlalchemy/util/__init__.pyi
new file mode 100644
index 0000000..a42c2ce
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/util/__init__.pyi
@@ -0,0 +1,133 @@
+# Stubs for sqlalchemy.util (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import compat
+from . import _collections
+from . import langhelpers
+from . import deprecations
+
+callable = compat.callable
+cmp = compat.cmp
+reduce = compat.reduce
+threading = compat.threading
+py3k = compat.py3k
+py33 = compat.py33
+py2k = compat.py2k
+jython = compat.jython
+pypy = compat.pypy
+cpython = compat.cpython
+win32 = compat.win32
+pickle = compat.pickle
+dottedgetter = compat.dottedgetter
+parse_qsl = compat.parse_qsl
+namedtuple = compat.namedtuple
+next = compat.next
+reraise = compat.reraise
+raise_from_cause = compat.raise_from_cause
+text_type = compat.text_type
+safe_kwarg = compat.safe_kwarg
+string_types = compat.string_types
+int_types = compat.int_types
+binary_type = compat.binary_type
+nested = compat.nested
+quote_plus = compat.quote_plus
+with_metaclass = compat.with_metaclass
+print_ = compat.print_
+itertools_filterfalse = compat.itertools_filterfalse
+u = compat.u
+ue = compat.ue
+b = compat.b
+unquote_plus = compat.unquote_plus
+unquote = compat.unquote
+b64decode = compat.b64decode
+b64encode = compat.b64encode
+byte_buffer = compat.byte_buffer
+itertools_filter = compat.itertools_filter
+iterbytes = compat.iterbytes
+StringIO = compat.StringIO
+inspect_getargspec = compat.inspect_getargspec
+zip_longest = compat.zip_longest
+KeyedTuple = _collections.KeyedTuple
+ImmutableContainer = _collections.ImmutableContainer
+immutabledict = _collections.immutabledict
+Properties = _collections.Properties
+OrderedProperties = _collections.OrderedProperties
+ImmutableProperties = _collections.ImmutableProperties
+OrderedDict = _collections.OrderedDict
+OrderedSet = _collections.OrderedSet
+IdentitySet = _collections.IdentitySet
+OrderedIdentitySet = _collections.OrderedIdentitySet
+column_set = _collections.column_set
+column_dict = _collections.column_dict
+ordered_column_set = _collections.ordered_column_set
+populate_column_dict = _collections.populate_column_dict
+unique_list = _collections.unique_list
+UniqueAppender = _collections.UniqueAppender
+PopulateDict = _collections.PopulateDict
+EMPTY_SET = _collections.EMPTY_SET
+to_list = _collections.to_list
+to_set = _collections.to_set
+to_column_set = _collections.to_column_set
+update_copy = _collections.update_copy
+flatten_iterator = _collections.flatten_iterator
+has_intersection = _collections.has_intersection
+LRUCache = _collections.LRUCache
+ScopedRegistry = _collections.ScopedRegistry
+ThreadLocalRegistry = _collections.ThreadLocalRegistry
+WeakSequence = _collections.WeakSequence
+coerce_generator_arg = _collections.coerce_generator_arg
+lightweight_named_tuple = _collections.lightweight_named_tuple
+iterate_attributes = langhelpers.iterate_attributes
+class_hierarchy = langhelpers.class_hierarchy
+portable_instancemethod = langhelpers.portable_instancemethod
+unbound_method_to_callable = langhelpers.unbound_method_to_callable
+getargspec_init = langhelpers.getargspec_init
+format_argspec_init = langhelpers.format_argspec_init
+format_argspec_plus = langhelpers.format_argspec_plus
+get_func_kwargs = langhelpers.get_func_kwargs
+get_cls_kwargs = langhelpers.get_cls_kwargs
+decorator = langhelpers.decorator
+as_interface = langhelpers.as_interface
+memoized_property = langhelpers.memoized_property
+memoized_instancemethod = langhelpers.memoized_instancemethod
+md5_hex = langhelpers.md5_hex
+group_expirable_memoized_property = langhelpers.group_expirable_memoized_property
+dependencies = langhelpers.dependencies
+decode_slice = langhelpers.decode_slice
+monkeypatch_proxied_specials = langhelpers.monkeypatch_proxied_specials
+asbool = langhelpers.asbool
+bool_or_str = langhelpers.bool_or_str
+coerce_kw_type = langhelpers.coerce_kw_type
+duck_type_collection = langhelpers.duck_type_collection
+assert_arg_type = langhelpers.assert_arg_type
+symbol = langhelpers.symbol
+dictlike_iteritems = langhelpers.dictlike_iteritems
+classproperty = langhelpers.classproperty
+set_creation_order = langhelpers.set_creation_order
+warn_exception = langhelpers.warn_exception
+warn = langhelpers.warn
+NoneType = langhelpers.NoneType
+constructor_copy = langhelpers.constructor_copy
+methods_equivalent = langhelpers.methods_equivalent
+chop_traceback = langhelpers.chop_traceback
+asint = langhelpers.asint
+generic_repr = langhelpers.generic_repr
+counter = langhelpers.counter
+PluginLoader = langhelpers.PluginLoader
+hybridproperty = langhelpers.hybridproperty
+hybridmethod = langhelpers.hybridmethod
+safe_reraise = langhelpers.safe_reraise
+get_callable_argspec = langhelpers.get_callable_argspec
+only_once = langhelpers.only_once
+attrsetter = langhelpers.attrsetter
+ellipses_string = langhelpers.ellipses_string
+warn_limited = langhelpers.warn_limited
+map_bits = langhelpers.map_bits
+MemoizedSlots = langhelpers.MemoizedSlots
+EnsureKWArgType = langhelpers.EnsureKWArgType
+warn_deprecated = deprecations.warn_deprecated
+warn_pending_deprecation = deprecations.warn_pending_deprecation
+deprecated = deprecations.deprecated
+pending_deprecation = deprecations.pending_deprecation
+inject_docstring_text = deprecations.inject_docstring_text
diff --git a/typeshed/third_party/2/sqlalchemy/util/_collections.pyi b/typeshed/third_party/2/sqlalchemy/util/_collections.pyi
new file mode 100644
index 0000000..58ca80a
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/util/_collections.pyi
@@ -0,0 +1,214 @@
+# Stubs for sqlalchemy.util._collections (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import compat
+
+threading = compat.threading
+itertools_filterfalse = compat.itertools_filterfalse
+string_types = compat.string_types
+
+EMPTY_SET = ...  # type: Any
+
+class AbstractKeyedTuple(tuple):
+    def keys(self): ...
+
+class KeyedTuple(AbstractKeyedTuple):
+    def __new__(cls, vals, labels=...): ...
+    def __setattr__(self, key, value): ...
+
+class _LW(AbstractKeyedTuple):
+    def __new__(cls, vals): ...
+    def __reduce__(self): ...
+
+class ImmutableContainer:
+    __delitem__ = ...  # type: Any
+
+class immutabledict(ImmutableContainer, dict):
+    clear = ...  # type: Any
+    def __new__(cls, *args): ...
+    def __init__(self, *args) -> None: ...
+    def __reduce__(self): ...
+    def union(self, d): ...
+
+class Properties:
+    def __init__(self, data) -> None: ...
+    def __len__(self): ...
+    def __iter__(self): ...
+    def __add__(self, other): ...
+    def __setitem__(self, key, object): ...
+    def __getitem__(self, key): ...
+    def __delitem__(self, key): ...
+    def __setattr__(self, key, obj): ...
+    def __getattr__(self, key): ...
+    def __contains__(self, key): ...
+    def as_immutable(self): ...
+    def update(self, value): ...
+    def get(self, key, default=...): ...
+    def keys(self): ...
+    def values(self): ...
+    def items(self): ...
+    def has_key(self, key): ...
+    def clear(self): ...
+
+class OrderedProperties(Properties):
+    def __init__(self) -> None: ...
+
+class ImmutableProperties(ImmutableContainer, Properties): ...
+
+class OrderedDict(dict):
+    def __reduce__(self): ...
+    def __init__(self, ____sequence=..., **kwargs) -> None: ...
+    def clear(self): ...
+    def copy(self): ...
+    def __copy__(self): ...
+    def sort(self, *arg, **kw): ...
+    def update(self, ____sequence=..., **kwargs): ...
+    def setdefault(self, key, value): ...
+    def __iter__(self): ...
+    def keys(self): ...
+    def values(self): ...
+    def items(self): ...
+    def itervalues(self): ...
+    def iterkeys(self): ...
+    def iteritems(self): ...
+    def __setitem__(self, key, object): ...
+    def __delitem__(self, key): ...
+    def pop(self, key, *default): ...
+    def popitem(self): ...
+
+class OrderedSet(set):
+    def __init__(self, d=...) -> None: ...
+    def add(self, element): ...
+    def remove(self, element): ...
+    def insert(self, pos, element): ...
+    def discard(self, element): ...
+    def clear(self): ...
+    def __getitem__(self, key): ...
+    def __iter__(self): ...
+    def __add__(self, other): ...
+    def update(self, iterable): ...
+    __ior__ = ...  # type: Any
+    def union(self, other): ...
+    __or__ = ...  # type: Any
+    def intersection(self, other): ...
+    __and__ = ...  # type: Any
+    def symmetric_difference(self, other): ...
+    __xor__ = ...  # type: Any
+    def difference(self, other): ...
+    __sub__ = ...  # type: Any
+    def intersection_update(self, other): ...
+    __iand__ = ...  # type: Any
+    def symmetric_difference_update(self, other): ...
+    __ixor__ = ...  # type: Any
+    def difference_update(self, other): ...
+    __isub__ = ...  # type: Any
+
+class IdentitySet:
+    def __init__(self, iterable=...) -> None: ...
+    def add(self, value): ...
+    def __contains__(self, value): ...
+    def remove(self, value): ...
+    def discard(self, value): ...
+    def pop(self): ...
+    def clear(self): ...
+    def __cmp__(self, other): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    def issubset(self, iterable): ...
+    def __le__(self, other): ...
+    def __lt__(self, other): ...
+    def issuperset(self, iterable): ...
+    def __ge__(self, other): ...
+    def __gt__(self, other): ...
+    def union(self, iterable): ...
+    def __or__(self, other): ...
+    def update(self, iterable): ...
+    def __ior__(self, other): ...
+    def difference(self, iterable): ...
+    def __sub__(self, other): ...
+    def difference_update(self, iterable): ...
+    def __isub__(self, other): ...
+    def intersection(self, iterable): ...
+    def __and__(self, other): ...
+    def intersection_update(self, iterable): ...
+    def __iand__(self, other): ...
+    def symmetric_difference(self, iterable): ...
+    def __xor__(self, other): ...
+    def symmetric_difference_update(self, iterable): ...
+    def __ixor__(self, other): ...
+    def copy(self): ...
+    __copy__ = ...  # type: Any
+    def __len__(self): ...
+    def __iter__(self): ...
+    def __hash__(self): ...
+
+class WeakSequence:
+    def __init__(self, __elements=...) -> None: ...
+    def append(self, item): ...
+    def __len__(self): ...
+    def __iter__(self): ...
+    def __getitem__(self, index): ...
+
+class OrderedIdentitySet(IdentitySet):
+    class _working_set(OrderedSet):
+        __sa_hash_exempt__ = ...  # type: Any
+    def __init__(self, iterable=...) -> None: ...
+
+class PopulateDict(dict):
+    creator = ...  # type: Any
+    def __init__(self, creator) -> None: ...
+    def __missing__(self, key): ...
+
+column_set = set
+column_dict = dict
+ordered_column_set = OrderedSet
+populate_column_dict = PopulateDict
+
+def unique_list(seq, hashfunc=...): ...
+
+class UniqueAppender:
+    data = ...  # type: Any
+    def __init__(self, data, via=...) -> None: ...
+    def append(self, item): ...
+    def __iter__(self): ...
+
+def coerce_generator_arg(arg): ...
+def to_list(x, default=...): ...
+def has_intersection(set_, iterable): ...
+def to_set(x): ...
+def to_column_set(x): ...
+def update_copy(d, _new=..., **kw): ...
+def flatten_iterator(x): ...
+
+class LRUCache(dict):
+    capacity = ...  # type: Any
+    threshold = ...  # type: Any
+    def __init__(self, capacity=..., threshold=...) -> None: ...
+    def get(self, key, default=...): ...
+    def __getitem__(self, key): ...
+    def values(self): ...
+    def setdefault(self, key, value): ...
+    def __setitem__(self, key, value): ...
+
+def lightweight_named_tuple(name, fields): ...
+
+class ScopedRegistry:
+    createfunc = ...  # type: Any
+    scopefunc = ...  # type: Any
+    registry = ...  # type: Any
+    def __init__(self, createfunc, scopefunc) -> None: ...
+    def __call__(self): ...
+    def has(self): ...
+    def set(self, obj): ...
+    def clear(self): ...
+
+class ThreadLocalRegistry(ScopedRegistry):
+    createfunc = ...  # type: Any
+    registry = ...  # type: Any
+    def __init__(self, createfunc) -> None: ...
+    def __call__(self): ...
+    def has(self): ...
+    def set(self, obj): ...
+    def clear(self): ...
diff --git a/typeshed/third_party/2/sqlalchemy/util/compat.pyi b/typeshed/third_party/2/sqlalchemy/util/compat.pyi
new file mode 100644
index 0000000..39ec058
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/util/compat.pyi
@@ -0,0 +1,67 @@
+# Stubs for sqlalchemy.util.compat (Python 2)
+
+from typing import Any
+from collections import namedtuple
+
+import threading
+import pickle
+from six.moves.urllib.parse import (quote_plus, unquote_plus,
+                                    parse_qsl, quote, unquote)
+# import configparser
+from six.moves import StringIO
+
+from io import BytesIO as byte_buffer
+
+from operator import attrgetter as dottedgetter
+
+from six.moves import zip_longest
+
+py33 = ...  # type: Any
+py32 = ...  # type: Any
+py3k = ...  # type: Any
+py2k = ...  # type: Any
+py265 = ...  # type: Any
+jython = ...  # type: Any
+pypy = ...  # type: Any
+win32 = ...  # type: Any
+cpython = ...  # type: Any
+next = ...  # type: Any
+safe_kwarg = ...  # type: Any
+
+ArgSpec = namedtuple('ArgSpec', ['args', 'varargs', 'keywords', 'defaults'])
+
+def inspect_getargspec(func): ...
+
+string_types = ...  # type: Any
+binary_type = ...  # type: Any
+text_type = unicode
+int_types = ...  # type: Any
+
+def callable(fn): ...
+def cmp(a, b): ...
+
+itertools_filterfalse = ...  # type: Any
+itertools_filter = ...  # type: Any
+itertools_imap = ...  # type: Any
+
+def b64encode(x): ...
+def b64decode(x): ...
+
+def iterbytes(buf): ...
+def u(s): ...
+def ue(s): ...
+def b(s): ...
+def import_(*args): ...
+
+reduce = ...  # type: Any
+
+def print_(*args, **kwargs): ...
+
+time_func = ...  # type: Any
+
+def reraise(tp, value, tb=..., cause=...): ...
+def raise_from_cause(exception, exc_info=...): ...
+
+def exec_(func_text, globals_, lcl=...): ...
+def with_metaclass(meta, *bases): ...
+def nested(*managers): ...
diff --git a/typeshed/third_party/2/sqlalchemy/util/deprecations.pyi b/typeshed/third_party/2/sqlalchemy/util/deprecations.pyi
new file mode 100644
index 0000000..49940cf
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/util/deprecations.pyi
@@ -0,0 +1,13 @@
+# Stubs for sqlalchemy.util.deprecations (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import langhelpers
+
+decorator = langhelpers.decorator
+
+def warn_deprecated(msg, stacklevel=...): ...
+def warn_pending_deprecation(msg, stacklevel=...): ...
+def deprecated(version, message=..., add_deprecation_to_docstring=...): ...
+def pending_deprecation(version, message=..., add_deprecation_to_docstring=...): ...
+def inject_docstring_text(doctext, injecttext, pos): ...
diff --git a/typeshed/third_party/2/sqlalchemy/util/langhelpers.pyi b/typeshed/third_party/2/sqlalchemy/util/langhelpers.pyi
new file mode 100644
index 0000000..2dadc07
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/util/langhelpers.pyi
@@ -0,0 +1,134 @@
+# Stubs for sqlalchemy.util.langhelpers (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import compat
+
+def md5_hex(x): ...
+
+class safe_reraise:
+    def __enter__(self): ...
+    def __exit__(self, type_, value, traceback): ...
+
+def decode_slice(slc): ...
+def map_bits(fn, n): ...
+def decorator(target): ...
+def public_factory(target, location): ...
+
+class PluginLoader:
+    group = ...  # type: Any
+    impls = ...  # type: Any
+    auto_fn = ...  # type: Any
+    def __init__(self, group, auto_fn=...) -> None: ...
+    def load(self, name): ...
+    def register(self, name, modulepath, objname): ...
+
+def get_cls_kwargs(cls, _set=...): ...
+def inspect_func_args(fn): ...
+def get_func_kwargs(func): ...
+def get_callable_argspec(fn, no_self=..., _is_init=...): ...
+def format_argspec_plus(fn, grouped=...): ...
+def format_argspec_init(method, grouped=...): ...
+def getargspec_init(method): ...
+def unbound_method_to_callable(func_or_cls): ...
+def generic_repr(obj, additional_kw=..., to_inspect=..., omit_kwarg=...): ...
+
+class portable_instancemethod:
+    target = ...  # type: Any
+    name = ...  # type: Any
+    def __init__(self, meth) -> None: ...
+    def __call__(self, *arg, **kw): ...
+
+def class_hierarchy(cls): ...
+def iterate_attributes(cls): ...
+def monkeypatch_proxied_specials(into_cls, from_cls, skip=..., only=..., name=..., from_instance=...): ...
+def methods_equivalent(meth1, meth2): ...
+def as_interface(obj, cls=..., methods=..., required=...): ...
+
+class memoized_property:
+    fget = ...  # type: Any
+    __name__ = ...  # type: Any
+    def __init__(self, fget, doc=...) -> None: ...
+    def __get__(self, obj, cls): ...
+    @classmethod
+    def reset(cls, obj, name): ...
+
+def memoized_instancemethod(fn): ...
+
+class group_expirable_memoized_property:
+    attributes = ...  # type: Any
+    def __init__(self, attributes=...) -> None: ...
+    def expire_instance(self, instance): ...
+    def __call__(self, fn): ...
+    def method(self, fn): ...
+
+class MemoizedSlots:
+    def __getattr__(self, key): ...
+
+def dependency_for(modulename): ...
+
+class dependencies:
+    import_deps = ...  # type: Any
+    def __init__(self, *deps) -> None: ...
+    def __call__(self, fn): ...
+    @classmethod
+    def resolve_all(cls, path): ...
+    class _importlater:
+        def __new__(cls, path, addtl): ...
+        def __init__(self, path, addtl) -> None: ...
+        def module(self): ...
+        def __getattr__(self, key): ...
+
+def asbool(obj): ...
+def bool_or_str(*text): ...
+def asint(value): ...
+def coerce_kw_type(kw, key, type_, flexi_bool=...): ...
+def constructor_copy(obj, cls, *args, **kw): ...
+def counter(): ...
+def duck_type_collection(specimen, default=...): ...
+def assert_arg_type(arg, argtype, name): ...
+def dictlike_iteritems(dictlike): ...
+
+class classproperty:
+    def __init__(self, fget, *arg, **kw) -> None: ...
+    def __get__(desc, self, cls): ...
+
+class hybridproperty:
+    func = ...  # type: Any
+    def __init__(self, func) -> None: ...
+    def __get__(self, instance, owner): ...
+
+class hybridmethod:
+    func = ...  # type: Any
+    def __init__(self, func) -> None: ...
+    def __get__(self, instance, owner): ...
+
+class _symbol(int):
+    def __new__(self, name, doc=..., canonical=...): ...
+    def __reduce__(self): ...
+
+class symbol:
+    symbols = ...  # type: Any
+    def __new__(cls, name, doc=..., canonical=...): ...
+
+def set_creation_order(instance): ...
+def warn_exception(func, *args, **kwargs): ...
+def ellipses_string(value, len_=...): ...
+
+class _hash_limit_string(compat.text_type):
+    def __new__(cls, value, num, args): ...
+    def __hash__(self): ...
+    def __eq__(self, other): ...
+
+def warn(msg): ...
+def warn_limited(msg, args): ...
+def only_once(fn): ...
+def chop_traceback(tb, exclude_prefix=..., exclude_suffix=...): ...
+
+NoneType = ...  # type: Any
+
+def attrsetter(attrname): ...
+
+class EnsureKWArgType(type):
+    def __init__(cls, clsname, bases, clsdict) -> None: ...
diff --git a/typeshed/third_party/2/thrift/Thrift.pyi b/typeshed/third_party/2/thrift/Thrift.pyi
new file mode 100644
index 0000000..4397fb6
--- /dev/null
+++ b/typeshed/third_party/2/thrift/Thrift.pyi
@@ -0,0 +1,55 @@
+# Stubs for thrift.Thrift (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class TType:
+    STOP = ...  # type: Any
+    VOID = ...  # type: Any
+    BOOL = ...  # type: Any
+    BYTE = ...  # type: Any
+    I08 = ...  # type: Any
+    DOUBLE = ...  # type: Any
+    I16 = ...  # type: Any
+    I32 = ...  # type: Any
+    I64 = ...  # type: Any
+    STRING = ...  # type: Any
+    UTF7 = ...  # type: Any
+    STRUCT = ...  # type: Any
+    MAP = ...  # type: Any
+    SET = ...  # type: Any
+    LIST = ...  # type: Any
+    UTF8 = ...  # type: Any
+    UTF16 = ...  # type: Any
+
+class TMessageType:
+    CALL = ...  # type: Any
+    REPLY = ...  # type: Any
+    EXCEPTION = ...  # type: Any
+    ONEWAY = ...  # type: Any
+
+class TProcessor:
+    def process(iprot, oprot): ...
+
+class TException(Exception):
+    message = ...  # type: Any
+    def __init__(self, message=...) -> None: ...
+
+class TApplicationException(TException):
+    UNKNOWN = ...  # type: Any
+    UNKNOWN_METHOD = ...  # type: Any
+    INVALID_MESSAGE_TYPE = ...  # type: Any
+    WRONG_METHOD_NAME = ...  # type: Any
+    BAD_SEQUENCE_ID = ...  # type: Any
+    MISSING_RESULT = ...  # type: Any
+    INTERNAL_ERROR = ...  # type: Any
+    PROTOCOL_ERROR = ...  # type: Any
+    INVALID_TRANSFORM = ...  # type: Any
+    INVALID_PROTOCOL = ...  # type: Any
+    UNSUPPORTED_CLIENT_TYPE = ...  # type: Any
+    type = ...  # type: Any
+    def __init__(self, type=..., message=...) -> None: ...
+    message = ...  # type: Any
+    def read(self, iprot): ...
+    def write(self, oprot): ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/thrift/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/thrift/__init__.pyi
diff --git a/typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi b/typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi
new file mode 100644
index 0000000..a1e5e71
--- /dev/null
+++ b/typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi
@@ -0,0 +1,66 @@
+# Stubs for thrift.protocol.TBinaryProtocol (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+from .TProtocol import TProtocolBase
+from .TProtocol import *  # noqa: F403
+
+class TBinaryProtocol(TProtocolBase):
+    VERSION_MASK = ...  # type: Any
+    VERSION_1 = ...  # type: Any
+    TYPE_MASK = ...  # type: Any
+    strictRead = ...  # type: Any
+    strictWrite = ...  # type: Any
+    def __init__(self, trans, strictRead=..., strictWrite=...) -> None: ...
+    def writeMessageBegin(self, name, type, seqid): ...
+    def writeMessageEnd(self): ...
+    def writeStructBegin(self, name): ...
+    def writeStructEnd(self): ...
+    def writeFieldBegin(self, name, type, id): ...
+    def writeFieldEnd(self): ...
+    def writeFieldStop(self): ...
+    def writeMapBegin(self, ktype, vtype, size): ...
+    def writeMapEnd(self): ...
+    def writeListBegin(self, etype, size): ...
+    def writeListEnd(self): ...
+    def writeSetBegin(self, etype, size): ...
+    def writeSetEnd(self): ...
+    def writeBool(self, bool): ...
+    def writeByte(self, byte): ...
+    def writeI16(self, i16): ...
+    def writeI32(self, i32): ...
+    def writeI64(self, i64): ...
+    def writeDouble(self, dub): ...
+    def writeString(self, str): ...
+    def readMessageBegin(self): ...
+    def readMessageEnd(self): ...
+    def readStructBegin(self): ...
+    def readStructEnd(self): ...
+    def readFieldBegin(self): ...
+    def readFieldEnd(self): ...
+    def readMapBegin(self): ...
+    def readMapEnd(self): ...
+    def readListBegin(self): ...
+    def readListEnd(self): ...
+    def readSetBegin(self): ...
+    def readSetEnd(self): ...
+    def readBool(self): ...
+    def readByte(self): ...
+    def readI16(self): ...
+    def readI32(self): ...
+    def readI64(self): ...
+    def readDouble(self): ...
+    def readString(self): ...
+
+class TBinaryProtocolFactory:
+    strictRead = ...  # type: Any
+    strictWrite = ...  # type: Any
+    def __init__(self, strictRead=..., strictWrite=...) -> None: ...
+    def getProtocol(self, trans): ...
+
+class TBinaryProtocolAccelerated(TBinaryProtocol): ...
+
+class TBinaryProtocolAcceleratedFactory:
+    def getProtocol(self, trans): ...
diff --git a/typeshed/third_party/2/thrift/protocol/TProtocol.pyi b/typeshed/third_party/2/thrift/protocol/TProtocol.pyi
new file mode 100644
index 0000000..e59765a
--- /dev/null
+++ b/typeshed/third_party/2/thrift/protocol/TProtocol.pyi
@@ -0,0 +1,80 @@
+# Stubs for thrift.protocol.TProtocol (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+from thrift.Thrift import TException
+from thrift.Thrift import *  # noqa: F403
+
+class TProtocolException(TException):
+    UNKNOWN = ...  # type: Any
+    INVALID_DATA = ...  # type: Any
+    NEGATIVE_SIZE = ...  # type: Any
+    SIZE_LIMIT = ...  # type: Any
+    BAD_VERSION = ...  # type: Any
+    NOT_IMPLEMENTED = ...  # type: Any
+    DEPTH_LIMIT = ...  # type: Any
+    type = ...  # type: Any
+    def __init__(self, type=..., message=...) -> None: ...
+
+class TProtocolBase:
+    trans = ...  # type: Any
+    def __init__(self, trans) -> None: ...
+    def writeMessageBegin(self, name, ttype, seqid): ...
+    def writeMessageEnd(self): ...
+    def writeStructBegin(self, name): ...
+    def writeStructEnd(self): ...
+    def writeFieldBegin(self, name, ttype, fid): ...
+    def writeFieldEnd(self): ...
+    def writeFieldStop(self): ...
+    def writeMapBegin(self, ktype, vtype, size): ...
+    def writeMapEnd(self): ...
+    def writeListBegin(self, etype, size): ...
+    def writeListEnd(self): ...
+    def writeSetBegin(self, etype, size): ...
+    def writeSetEnd(self): ...
+    def writeBool(self, bool_val): ...
+    def writeByte(self, byte): ...
+    def writeI16(self, i16): ...
+    def writeI32(self, i32): ...
+    def writeI64(self, i64): ...
+    def writeDouble(self, dub): ...
+    def writeString(self, str_val): ...
+    def readMessageBegin(self): ...
+    def readMessageEnd(self): ...
+    def readStructBegin(self): ...
+    def readStructEnd(self): ...
+    def readFieldBegin(self): ...
+    def readFieldEnd(self): ...
+    def readMapBegin(self): ...
+    def readMapEnd(self): ...
+    def readListBegin(self): ...
+    def readListEnd(self): ...
+    def readSetBegin(self): ...
+    def readSetEnd(self): ...
+    def readBool(self): ...
+    def readByte(self): ...
+    def readI16(self): ...
+    def readI32(self): ...
+    def readI64(self): ...
+    def readDouble(self): ...
+    def readString(self): ...
+    def skip(self, ttype): ...
+    def readFieldByTType(self, ttype, spec): ...
+    def readContainerList(self, spec): ...
+    def readContainerSet(self, spec): ...
+    def readContainerStruct(self, spec): ...
+    def readContainerMap(self, spec): ...
+    def readStruct(self, obj, thrift_spec): ...
+    def writeContainerStruct(self, val, spec): ...
+    def writeContainerList(self, val, spec): ...
+    def writeContainerSet(self, val, spec): ...
+    def writeContainerMap(self, val, spec): ...
+    def writeStruct(self, obj, thrift_spec): ...
+    def writeFieldByTType(self, ttype, val, spec): ...
+
+def checkIntegerLimits(i, bits): ...
+
+class TProtocolFactory:
+    def getProtocol(self, trans): ...
diff --git a/typeshed/third_party/2/thrift/protocol/__init__.pyi b/typeshed/third_party/2/thrift/protocol/__init__.pyi
new file mode 100644
index 0000000..f98118b
--- /dev/null
+++ b/typeshed/third_party/2/thrift/protocol/__init__.pyi
@@ -0,0 +1,11 @@
+# Stubs for thrift.protocol (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   TBase
+#   TBinaryProtocol
+#   TCompactProtocol
+#   TJSONProtocol
+#   TProtocol
+#   fastbinary
diff --git a/typeshed/third_party/2/thrift/transport/TSocket.pyi b/typeshed/third_party/2/thrift/transport/TSocket.pyi
new file mode 100644
index 0000000..6148117
--- /dev/null
+++ b/typeshed/third_party/2/thrift/transport/TSocket.pyi
@@ -0,0 +1,33 @@
+# Stubs for thrift.transport.TSocket (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+from .TTransport import TTransportBase, TServerTransportBase
+from .TTransport import *  # noqa: F403
+
+class TSocketBase(TTransportBase):
+    handle = ...  # type: Any
+    def close(self): ...
+
+class TSocket(TSocketBase):
+    host = ...  # type: Any
+    port = ...  # type: Any
+    handle = ...  # type: Any
+    def __init__(self, host=..., port=..., unix_socket=..., socket_family=...) -> None: ...
+    def setHandle(self, h): ...
+    def isOpen(self): ...
+    def setTimeout(self, ms): ...
+    def open(self): ...
+    def read(self, sz): ...
+    def write(self, buff): ...
+    def flush(self): ...
+
+class TServerSocket(TSocketBase, TServerTransportBase):
+    host = ...  # type: Any
+    port = ...  # type: Any
+    handle = ...  # type: Any
+    def __init__(self, host=..., port=..., unix_socket=..., socket_family=...) -> None: ...
+    def listen(self): ...
+    def accept(self): ...
diff --git a/typeshed/third_party/2/thrift/transport/TTransport.pyi b/typeshed/third_party/2/thrift/transport/TTransport.pyi
new file mode 100644
index 0000000..d46cca0
--- /dev/null
+++ b/typeshed/third_party/2/thrift/transport/TTransport.pyi
@@ -0,0 +1,111 @@
+# Stubs for thrift.transport.TTransport (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from thrift.Thrift import TException
+
+class TTransportException(TException):
+    UNKNOWN = ...  # type: Any
+    NOT_OPEN = ...  # type: Any
+    ALREADY_OPEN = ...  # type: Any
+    TIMED_OUT = ...  # type: Any
+    END_OF_FILE = ...  # type: Any
+    type = ...  # type: Any
+    def __init__(self, type=..., message=...) -> None: ...
+
+class TTransportBase:
+    def isOpen(self): ...
+    def open(self): ...
+    def close(self): ...
+    def read(self, sz): ...
+    def readAll(self, sz): ...
+    def write(self, buf): ...
+    def flush(self): ...
+
+class CReadableTransport:
+    @property
+    def cstringio_buf(self): ...
+    def cstringio_refill(self, partialread, reqlen): ...
+
+class TServerTransportBase:
+    def listen(self): ...
+    def accept(self): ...
+    def close(self): ...
+
+class TTransportFactoryBase:
+    def getTransport(self, trans): ...
+
+class TBufferedTransportFactory:
+    def getTransport(self, trans): ...
+
+class TBufferedTransport(TTransportBase, CReadableTransport):
+    DEFAULT_BUFFER = ...  # type: Any
+    def __init__(self, trans, rbuf_size=...) -> None: ...
+    def isOpen(self): ...
+    def open(self): ...
+    def close(self): ...
+    def read(self, sz): ...
+    def write(self, buf): ...
+    def flush(self): ...
+    @property
+    def cstringio_buf(self): ...
+    def cstringio_refill(self, partialread, reqlen): ...
+
+class TMemoryBuffer(TTransportBase, CReadableTransport):
+    def __init__(self, value=...) -> None: ...
+    def isOpen(self): ...
+    def open(self): ...
+    def close(self): ...
+    def read(self, sz): ...
+    def write(self, buf): ...
+    def flush(self): ...
+    def getvalue(self): ...
+    @property
+    def cstringio_buf(self): ...
+    def cstringio_refill(self, partialread, reqlen): ...
+
+class TFramedTransportFactory:
+    def getTransport(self, trans): ...
+
+class TFramedTransport(TTransportBase, CReadableTransport):
+    def __init__(self, trans) -> None: ...
+    def isOpen(self): ...
+    def open(self): ...
+    def close(self): ...
+    def read(self, sz): ...
+    def readFrame(self): ...
+    def write(self, buf): ...
+    def flush(self): ...
+    @property
+    def cstringio_buf(self): ...
+    def cstringio_refill(self, prefix, reqlen): ...
+
+class TFileObjectTransport(TTransportBase):
+    fileobj = ...  # type: Any
+    def __init__(self, fileobj) -> None: ...
+    def isOpen(self): ...
+    def close(self): ...
+    def read(self, sz): ...
+    def write(self, buf): ...
+    def flush(self): ...
+
+class TSaslClientTransport(TTransportBase, CReadableTransport):
+    START = ...  # type: Any
+    OK = ...  # type: Any
+    BAD = ...  # type: Any
+    ERROR = ...  # type: Any
+    COMPLETE = ...  # type: Any
+    transport = ...  # type: Any
+    sasl = ...  # type: Any
+    def __init__(self, transport, host, service, mechanism=..., **sasl_kwargs) -> None: ...
+    def open(self): ...
+    def send_sasl_msg(self, status, body): ...
+    def recv_sasl_msg(self): ...
+    def write(self, data): ...
+    def flush(self): ...
+    def read(self, sz): ...
+    def close(self): ...
+    @property
+    def cstringio_buf(self): ...
+    def cstringio_refill(self, prefix, reqlen): ...
diff --git a/typeshed/third_party/2/thrift/transport/__init__.pyi b/typeshed/third_party/2/thrift/transport/__init__.pyi
new file mode 100644
index 0000000..ce02c61
--- /dev/null
+++ b/typeshed/third_party/2/thrift/transport/__init__.pyi
@@ -0,0 +1,9 @@
+# Stubs for thrift.transport (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   THttpClient
+#   TSocket
+#   TTransport
+#   TZlibTransport
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/tornado/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/tornado/__init__.pyi
diff --git a/typeshed/third_party/2/tornado/concurrent.pyi b/typeshed/third_party/2/tornado/concurrent.pyi
new file mode 100644
index 0000000..46f39a3
--- /dev/null
+++ b/typeshed/third_party/2/tornado/concurrent.pyi
@@ -0,0 +1,47 @@
+# Stubs for tornado.concurrent (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+futures = ...  # type: Any
+
+class ReturnValueIgnoredError(Exception): ...
+
+class _TracebackLogger:
+    exc_info = ...  # type: Any
+    formatted_tb = ...  # type: Any
+    def __init__(self, exc_info) -> None: ...
+    def activate(self): ...
+    def clear(self): ...
+    def __del__(self): ...
+
+class Future:
+    def __init__(self) -> None: ...
+    def cancel(self): ...
+    def cancelled(self): ...
+    def running(self): ...
+    def done(self): ...
+    def result(self, timeout=...): ...
+    def exception(self, timeout=...): ...
+    def add_done_callback(self, fn): ...
+    def set_result(self, result): ...
+    def set_exception(self, exception): ...
+    def exc_info(self): ...
+    def set_exc_info(self, exc_info): ...
+    def __del__(self): ...
+
+TracebackFuture = ...  # type: Any
+FUTURES = ...  # type: Any
+
+def is_future(x): ...
+
+class DummyExecutor:
+    def submit(self, fn, *args, **kwargs): ...
+    def shutdown(self, wait=...): ...
+
+dummy_executor = ...  # type: Any
+
+def run_on_executor(*args, **kwargs): ...
+def return_future(f): ...
+def chain_future(a, b): ...
diff --git a/typeshed/third_party/2/tornado/gen.pyi b/typeshed/third_party/2/tornado/gen.pyi
new file mode 100644
index 0000000..fbde2da
--- /dev/null
+++ b/typeshed/third_party/2/tornado/gen.pyi
@@ -0,0 +1,113 @@
+# Stubs for tornado.gen (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from collections import namedtuple
+
+singledispatch = ...  # type: Any
+
+class KeyReuseError(Exception): ...
+class UnknownKeyError(Exception): ...
+class LeakedCallbackError(Exception): ...
+class BadYieldError(Exception): ...
+class ReturnValueIgnoredError(Exception): ...
+class TimeoutError(Exception): ...
+
+def engine(func): ...
+def coroutine(func, replace_callback=...): ...
+
+class Return(Exception):
+    value = ...  # type: Any
+    def __init__(self, value=...) -> None: ...
+
+class WaitIterator:
+    current_index = ...  # type: Any
+    def __init__(self, *args, **kwargs) -> None: ...
+    def done(self): ...
+    def next(self): ...
+
+class YieldPoint:
+    def start(self, runner): ...
+    def is_ready(self): ...
+    def get_result(self): ...
+
+class Callback(YieldPoint):
+    key = ...  # type: Any
+    def __init__(self, key) -> None: ...
+    runner = ...  # type: Any
+    def start(self, runner): ...
+    def is_ready(self): ...
+    def get_result(self): ...
+
+class Wait(YieldPoint):
+    key = ...  # type: Any
+    def __init__(self, key) -> None: ...
+    runner = ...  # type: Any
+    def start(self, runner): ...
+    def is_ready(self): ...
+    def get_result(self): ...
+
+class WaitAll(YieldPoint):
+    keys = ...  # type: Any
+    def __init__(self, keys) -> None: ...
+    runner = ...  # type: Any
+    def start(self, runner): ...
+    def is_ready(self): ...
+    def get_result(self): ...
+
+def Task(func, *args, **kwargs): ...
+
+class YieldFuture(YieldPoint):
+    future = ...  # type: Any
+    io_loop = ...  # type: Any
+    def __init__(self, future, io_loop=...) -> None: ...
+    runner = ...  # type: Any
+    key = ...  # type: Any
+    result_fn = ...  # type: Any
+    def start(self, runner): ...
+    def is_ready(self): ...
+    def get_result(self): ...
+
+class Multi(YieldPoint):
+    keys = ...  # type: Any
+    children = ...  # type: Any
+    unfinished_children = ...  # type: Any
+    quiet_exceptions = ...  # type: Any
+    def __init__(self, children, quiet_exceptions=...) -> None: ...
+    def start(self, runner): ...
+    def is_ready(self): ...
+    def get_result(self): ...
+
+def multi_future(children, quiet_exceptions=...): ...
+def maybe_future(x): ...
+def with_timeout(timeout, future, io_loop=..., quiet_exceptions=...): ...
+def sleep(duration): ...
+
+moment = ...  # type: Any
+
+class Runner:
+    gen = ...  # type: Any
+    result_future = ...  # type: Any
+    future = ...  # type: Any
+    yield_point = ...  # type: Any
+    pending_callbacks = ...  # type: Any
+    results = ...  # type: Any
+    running = ...  # type: Any
+    finished = ...  # type: Any
+    had_exception = ...  # type: Any
+    io_loop = ...  # type: Any
+    stack_context_deactivate = ...  # type: Any
+    def __init__(self, gen, result_future, first_yielded) -> None: ...
+    def register_callback(self, key): ...
+    def is_ready(self, key): ...
+    def set_result(self, key, result): ...
+    def pop_result(self, key): ...
+    def run(self): ...
+    def handle_yield(self, yielded): ...
+    def result_callback(self, key): ...
+    def handle_exception(self, typ, value, tb): ...
+
+Arguments = namedtuple('Arguments', ['args', 'kwargs'])
+
+def convert_yielded(yielded): ...
diff --git a/typeshed/third_party/2/tornado/httpclient.pyi b/typeshed/third_party/2/tornado/httpclient.pyi
new file mode 100644
index 0000000..fa41d16
--- /dev/null
+++ b/typeshed/third_party/2/tornado/httpclient.pyi
@@ -0,0 +1,112 @@
+# Stubs for tornado.httpclient (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado.util import Configurable
+
+class HTTPClient:
+    def __init__(self, async_client_class=..., **kwargs) -> None: ...
+    def __del__(self): ...
+    def close(self): ...
+    def fetch(self, request, **kwargs): ...
+
+class AsyncHTTPClient(Configurable):
+    @classmethod
+    def configurable_base(cls): ...
+    @classmethod
+    def configurable_default(cls): ...
+    def __new__(cls, io_loop=..., force_instance=..., **kwargs): ...
+    io_loop = ...  # type: Any
+    defaults = ...  # type: Any
+    def initialize(self, io_loop, defaults=...): ...
+    def close(self): ...
+    def fetch(self, request, callback=..., raise_error=..., **kwargs): ...
+    def fetch_impl(self, request, callback): ...
+    @classmethod
+    def configure(cls, impl, **kwargs): ...
+
+class HTTPRequest:
+    headers = ...  # type: Any
+    proxy_host = ...  # type: Any
+    proxy_port = ...  # type: Any
+    proxy_username = ...  # type: Any
+    proxy_password = ...  # type: Any
+    url = ...  # type: Any
+    method = ...  # type: Any
+    body = ...  # type: Any
+    body_producer = ...  # type: Any
+    auth_username = ...  # type: Any
+    auth_password = ...  # type: Any
+    auth_mode = ...  # type: Any
+    connect_timeout = ...  # type: Any
+    request_timeout = ...  # type: Any
+    follow_redirects = ...  # type: Any
+    max_redirects = ...  # type: Any
+    user_agent = ...  # type: Any
+    decompress_response = ...  # type: Any
+    network_interface = ...  # type: Any
+    streaming_callback = ...  # type: Any
+    header_callback = ...  # type: Any
+    prepare_curl_callback = ...  # type: Any
+    allow_nonstandard_methods = ...  # type: Any
+    validate_cert = ...  # type: Any
+    ca_certs = ...  # type: Any
+    allow_ipv6 = ...  # type: Any
+    client_key = ...  # type: Any
+    client_cert = ...  # type: Any
+    ssl_options = ...  # type: Any
+    expect_100_continue = ...  # type: Any
+    start_time = ...  # type: Any
+    def __init__(self, url, method=..., headers=..., body=..., auth_username=..., auth_password=..., auth_mode=..., connect_timeout=..., request_timeout=..., if_modified_since=..., follow_redirects=..., max_redirects=..., user_agent=..., use_gzip=..., network_interface=..., streaming_callback=..., header_callback=..., prepare_curl_callback=..., proxy_host=..., proxy_port=..., proxy_username=..., proxy_password=..., allow_nonstandard_methods=..., validate_cert=..., ca_certs=..., allow_ipv [...]
+    @property
+    def headers(self): ...
+    @headers.setter
+    def headers(self, value): ...
+    @property
+    def body(self): ...
+    @body.setter
+    def body(self, value): ...
+    @property
+    def body_producer(self): ...
+    @body_producer.setter
+    def body_producer(self, value): ...
+    @property
+    def streaming_callback(self): ...
+    @streaming_callback.setter
+    def streaming_callback(self, value): ...
+    @property
+    def header_callback(self): ...
+    @header_callback.setter
+    def header_callback(self, value): ...
+    @property
+    def prepare_curl_callback(self): ...
+    @prepare_curl_callback.setter
+    def prepare_curl_callback(self, value): ...
+
+class HTTPResponse:
+    request = ...  # type: Any
+    code = ...  # type: Any
+    reason = ...  # type: Any
+    headers = ...  # type: Any
+    buffer = ...  # type: Any
+    effective_url = ...  # type: Any
+    error = ...  # type: Any
+    request_time = ...  # type: Any
+    time_info = ...  # type: Any
+    def __init__(self, request, code, headers=..., buffer=..., effective_url=..., error=..., request_time=..., time_info=..., reason=...) -> None: ...
+    body = ...  # type: Any
+    def rethrow(self): ...
+
+class HTTPError(Exception):
+    code = ...  # type: Any
+    response = ...  # type: Any
+    def __init__(self, code, message=..., response=...) -> None: ...
+
+class _RequestProxy:
+    request = ...  # type: Any
+    defaults = ...  # type: Any
+    def __init__(self, request, defaults) -> None: ...
+    def __getattr__(self, name): ...
+
+def main(): ...
diff --git a/typeshed/third_party/2/tornado/httpserver.pyi b/typeshed/third_party/2/tornado/httpserver.pyi
new file mode 100644
index 0000000..f4b2aa9
--- /dev/null
+++ b/typeshed/third_party/2/tornado/httpserver.pyi
@@ -0,0 +1,45 @@
+# Stubs for tornado.httpserver (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado import httputil
+from tornado.tcpserver import TCPServer
+from tornado.util import Configurable
+
+class HTTPServer(TCPServer, Configurable, httputil.HTTPServerConnectionDelegate):
+    def __init__(self, *args, **kwargs) -> None: ...
+    request_callback = ...  # type: Any
+    no_keep_alive = ...  # type: Any
+    xheaders = ...  # type: Any
+    protocol = ...  # type: Any
+    conn_params = ...  # type: Any
+    def initialize(self, request_callback, no_keep_alive=..., io_loop=..., xheaders=..., ssl_options=..., protocol=..., decompress_request=..., chunk_size=..., max_header_size=..., idle_connection_timeout=..., body_timeout=..., max_body_size=..., max_buffer_size=...): ...
+    @classmethod
+    def configurable_base(cls): ...
+    @classmethod
+    def configurable_default(cls): ...
+    def close_all_connections(self): ...
+    def handle_stream(self, stream, address): ...
+    def start_request(self, server_conn, request_conn): ...
+    def on_close(self, server_conn): ...
+
+class _HTTPRequestContext:
+    address = ...  # type: Any
+    protocol = ...  # type: Any
+    address_family = ...  # type: Any
+    remote_ip = ...  # type: Any
+    def __init__(self, stream, address, protocol) -> None: ...
+
+class _ServerRequestAdapter(httputil.HTTPMessageDelegate):
+    server = ...  # type: Any
+    connection = ...  # type: Any
+    request = ...  # type: Any
+    delegate = ...  # type: Any
+    def __init__(self, server, server_conn, request_conn) -> None: ...
+    def headers_received(self, start_line, headers): ...
+    def data_received(self, chunk): ...
+    def finish(self): ...
+    def on_connection_close(self): ...
+
+HTTPRequest = ...  # type: Any
diff --git a/typeshed/third_party/2/tornado/httputil.pyi b/typeshed/third_party/2/tornado/httputil.pyi
new file mode 100644
index 0000000..f8fefb5
--- /dev/null
+++ b/typeshed/third_party/2/tornado/httputil.pyi
@@ -0,0 +1,93 @@
+# Stubs for tornado.httputil (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado.util import ObjectDict
+from collections import namedtuple
+
+class SSLError(Exception): ...
+
+class _NormalizedHeaderCache(dict):
+    size = ...  # type: Any
+    queue = ...  # type: Any
+    def __init__(self, size) -> None: ...
+    def __missing__(self, key): ...
+
+class HTTPHeaders(dict):
+    def __init__(self, *args, **kwargs) -> None: ...
+    def add(self, name, value): ...
+    def get_list(self, name): ...
+    def get_all(self): ...
+    def parse_line(self, line): ...
+    @classmethod
+    def parse(cls, headers): ...
+    def __setitem__(self, name, value): ...
+    def __getitem__(self, name): ...
+    def __delitem__(self, name): ...
+    def __contains__(self, name): ...
+    def get(self, name, default=...): ...
+    def update(self, *args, **kwargs): ...
+    def copy(self): ...
+    __copy__ = ...  # type: Any
+    def __deepcopy__(self, memo_dict): ...
+
+class HTTPServerRequest:
+    method = ...  # type: Any
+    uri = ...  # type: Any
+    version = ...  # type: Any
+    headers = ...  # type: Any
+    body = ...  # type: Any
+    remote_ip = ...  # type: Any
+    protocol = ...  # type: Any
+    host = ...  # type: Any
+    files = ...  # type: Any
+    connection = ...  # type: Any
+    arguments = ...  # type: Any
+    query_arguments = ...  # type: Any
+    body_arguments = ...  # type: Any
+    def __init__(self, method=..., uri=..., version=..., headers=..., body=..., host=..., files=..., connection=..., start_line=...) -> None: ...
+    def supports_http_1_1(self): ...
+    @property
+    def cookies(self): ...
+    def write(self, chunk, callback=...): ...
+    def finish(self): ...
+    def full_url(self): ...
+    def request_time(self): ...
+    def get_ssl_certificate(self, binary_form=...): ...
+
+class HTTPInputError(Exception): ...
+class HTTPOutputError(Exception): ...
+
+class HTTPServerConnectionDelegate:
+    def start_request(self, server_conn, request_conn): ...
+    def on_close(self, server_conn): ...
+
+class HTTPMessageDelegate:
+    def headers_received(self, start_line, headers): ...
+    def data_received(self, chunk): ...
+    def finish(self): ...
+    def on_connection_close(self): ...
+
+class HTTPConnection:
+    def write_headers(self, start_line, headers, chunk=..., callback=...): ...
+    def write(self, chunk, callback=...): ...
+    def finish(self): ...
+
+def url_concat(url, args): ...
+
+class HTTPFile(ObjectDict): ...
+
+def parse_body_arguments(content_type, body, arguments, files, headers=...): ...
+def parse_multipart_form_data(boundary, data, arguments, files): ...
+def format_timestamp(ts): ...
+
+RequestStartLine = namedtuple('RequestStartLine', ['method', 'path', 'version'])
+
+def parse_request_start_line(line): ...
+
+ResponseStartLine = namedtuple('ResponseStartLine', ['version', 'code', 'reason'])
+
+def parse_response_start_line(line): ...
+def doctests(): ...
+def split_host_and_port(netloc): ...
diff --git a/typeshed/third_party/2/tornado/ioloop.pyi b/typeshed/third_party/2/tornado/ioloop.pyi
new file mode 100644
index 0000000..38624c5
--- /dev/null
+++ b/typeshed/third_party/2/tornado/ioloop.pyi
@@ -0,0 +1,88 @@
+# Stubs for tornado.ioloop (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado.util import Configurable
+
+signal = ...  # type: Any
+
+class TimeoutError(Exception): ...
+
+class IOLoop(Configurable):
+    NONE = ...  # type: Any
+    READ = ...  # type: Any
+    WRITE = ...  # type: Any
+    ERROR = ...  # type: Any
+    @staticmethod
+    def instance(): ...
+    @staticmethod
+    def initialized(): ...
+    def install(self): ...
+    @staticmethod
+    def clear_instance(): ...
+    @staticmethod
+    def current(instance=...): ...
+    def make_current(self): ...
+    @staticmethod
+    def clear_current(): ...
+    @classmethod
+    def configurable_base(cls): ...
+    @classmethod
+    def configurable_default(cls): ...
+    def initialize(self, make_current=...): ...
+    def close(self, all_fds=...): ...
+    def add_handler(self, fd, handler, events): ...
+    def update_handler(self, fd, events): ...
+    def remove_handler(self, fd): ...
+    def set_blocking_signal_threshold(self, seconds, action): ...
+    def set_blocking_log_threshold(self, seconds): ...
+    def log_stack(self, signal, frame): ...
+    def start(self): ...
+    def stop(self): ...
+    def run_sync(self, func, timeout=...): ...
+    def time(self): ...
+    def add_timeout(self, deadline, callback, *args, **kwargs): ...
+    def call_later(self, delay, callback, *args, **kwargs): ...
+    def call_at(self, when, callback, *args, **kwargs): ...
+    def remove_timeout(self, timeout): ...
+    def add_callback(self, callback, *args, **kwargs): ...
+    def add_callback_from_signal(self, callback, *args, **kwargs): ...
+    def spawn_callback(self, callback, *args, **kwargs): ...
+    def add_future(self, future, callback): ...
+    def handle_callback_exception(self, callback): ...
+    def split_fd(self, fd): ...
+    def close_fd(self, fd): ...
+
+class PollIOLoop(IOLoop):
+    time_func = ...  # type: Any
+    def initialize(self, impl, time_func=..., **kwargs): ...
+    def close(self, all_fds=...): ...
+    def add_handler(self, fd, handler, events): ...
+    def update_handler(self, fd, events): ...
+    def remove_handler(self, fd): ...
+    def set_blocking_signal_threshold(self, seconds, action): ...
+    def start(self): ...
+    def stop(self): ...
+    def time(self): ...
+    def call_at(self, deadline, callback, *args, **kwargs): ...
+    def remove_timeout(self, timeout): ...
+    def add_callback(self, callback, *args, **kwargs): ...
+    def add_callback_from_signal(self, callback, *args, **kwargs): ...
+
+class _Timeout:
+    deadline = ...  # type: Any
+    callback = ...  # type: Any
+    tiebreaker = ...  # type: Any
+    def __init__(self, deadline, callback, io_loop) -> None: ...
+    def __lt__(self, other): ...
+    def __le__(self, other): ...
+
+class PeriodicCallback:
+    callback = ...  # type: Any
+    callback_time = ...  # type: Any
+    io_loop = ...  # type: Any
+    def __init__(self, callback, callback_time, io_loop=...) -> None: ...
+    def start(self): ...
+    def stop(self): ...
+    def is_running(self): ...
diff --git a/typeshed/third_party/2/tornado/locks.pyi b/typeshed/third_party/2/tornado/locks.pyi
new file mode 100644
index 0000000..ea61761
--- /dev/null
+++ b/typeshed/third_party/2/tornado/locks.pyi
@@ -0,0 +1,49 @@
+# Stubs for tornado.locks (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _TimeoutGarbageCollector:
+    def __init__(self): ...
+
+class Condition(_TimeoutGarbageCollector):
+    io_loop = ...  # type: Any
+    def __init__(self): ...
+    def wait(self, timeout=None): ...
+    def notify(self, n=1): ...
+    def notify_all(self): ...
+
+class Event:
+    def __init__(self): ...
+    def is_set(self): ...
+    def set(self): ...
+    def clear(self): ...
+    def wait(self, timeout=None): ...
+
+class _ReleasingContextManager:
+    def __init__(self, obj): ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_val, exc_tb): ...
+
+class Semaphore(_TimeoutGarbageCollector):
+    def __init__(self, value=1): ...
+    def release(self): ...
+    def acquire(self, timeout=None): ...
+    def __enter__(self): ...
+    __exit__ = ...  # type: Any
+    def __aenter__(self): ...
+    def __aexit__(self, typ, value, tb): ...
+
+class BoundedSemaphore(Semaphore):
+    def __init__(self, value=1): ...
+    def release(self): ...
+
+class Lock:
+    def __init__(self): ...
+    def acquire(self, timeout=None): ...
+    def release(self): ...
+    def __enter__(self): ...
+    __exit__ = ...  # type: Any
+    def __aenter__(self): ...
+    def __aexit__(self, typ, value, tb): ...
diff --git a/typeshed/third_party/2/tornado/netutil.pyi b/typeshed/third_party/2/tornado/netutil.pyi
new file mode 100644
index 0000000..bfbc6b1
--- /dev/null
+++ b/typeshed/third_party/2/tornado/netutil.pyi
@@ -0,0 +1,49 @@
+# Stubs for tornado.netutil (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado.util import Configurable
+
+ssl = ...  # type: Any
+certifi = ...  # type: Any
+xrange = ...  # type: Any
+ssl_match_hostname = ...  # type: Any
+SSLCertificateError = ...  # type: Any
+
+def bind_sockets(port, address=..., family=..., backlog=..., flags=...): ...
+def bind_unix_socket(file, mode=..., backlog=...): ...
+def add_accept_handler(sock, callback, io_loop=...): ...
+def is_valid_ip(ip): ...
+
+class Resolver(Configurable):
+    @classmethod
+    def configurable_base(cls): ...
+    @classmethod
+    def configurable_default(cls): ...
+    def resolve(self, host, port, family=..., callback=...): ...
+    def close(self): ...
+
+class ExecutorResolver(Resolver):
+    io_loop = ...  # type: Any
+    executor = ...  # type: Any
+    close_executor = ...  # type: Any
+    def initialize(self, io_loop=..., executor=..., close_executor=...): ...
+    def close(self): ...
+    def resolve(self, host, port, family=...): ...
+
+class BlockingResolver(ExecutorResolver):
+    def initialize(self, io_loop=...): ...
+
+class ThreadedResolver(ExecutorResolver):
+    def initialize(self, io_loop=..., num_threads=...): ...
+
+class OverrideResolver(Resolver):
+    resolver = ...  # type: Any
+    mapping = ...  # type: Any
+    def initialize(self, resolver, mapping): ...
+    def close(self): ...
+    def resolve(self, host, port, *args, **kwargs): ...
+
+def ssl_options_to_context(ssl_options): ...
+def ssl_wrap_socket(socket, ssl_options, server_hostname=..., **kwargs): ...
diff --git a/typeshed/third_party/2/tornado/tcpserver.pyi b/typeshed/third_party/2/tornado/tcpserver.pyi
new file mode 100644
index 0000000..9fa7a09
--- /dev/null
+++ b/typeshed/third_party/2/tornado/tcpserver.pyi
@@ -0,0 +1,21 @@
+# Stubs for tornado.tcpserver (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+ssl = ...  # type: Any
+
+class TCPServer:
+    io_loop = ...  # type: Any
+    ssl_options = ...  # type: Any
+    max_buffer_size = ...  # type: Any
+    read_chunk_size = ...  # type: Any
+    def __init__(self, io_loop=..., ssl_options=..., max_buffer_size=..., read_chunk_size=...) -> None: ...
+    def listen(self, port, address=...): ...
+    def add_sockets(self, sockets): ...
+    def add_socket(self, socket): ...
+    def bind(self, port, address=..., family=..., backlog=...): ...
+    def start(self, num_processes=...): ...
+    def stop(self): ...
+    def handle_stream(self, stream, address): ...
diff --git a/typeshed/third_party/2/tornado/testing.pyi b/typeshed/third_party/2/tornado/testing.pyi
new file mode 100644
index 0000000..c6fde57
--- /dev/null
+++ b/typeshed/third_party/2/tornado/testing.pyi
@@ -0,0 +1,64 @@
+# Stubs for tornado.testing (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import unittest
+import logging
+
+AsyncHTTPClient = ...  # type: Any
+gen = ...  # type: Any
+HTTPServer = ...  # type: Any
+IOLoop = ...  # type: Any
+netutil = ...  # type: Any
+SimpleAsyncHTTPClient = ...  # type: Any
+
+def get_unused_port(): ...
+def bind_unused_port(): ...
+
+class AsyncTestCase(unittest.TestCase):
+    def __init__(self, *args, **kwargs): ...
+    io_loop = ...  # type: Any
+    def setUp(self): ...
+    def tearDown(self): ...
+    def get_new_ioloop(self): ...
+    def run(self, result=None): ...
+    def stop(self, _arg=None, **kwargs): ...
+    def wait(self, condition=None, timeout=5): ...
+
+class AsyncHTTPTestCase(AsyncTestCase):
+    http_client = ...  # type: Any
+    http_server = ...  # type: Any
+    def setUp(self): ...
+    def get_http_client(self): ...
+    def get_http_server(self): ...
+    def get_app(self): ...
+    def fetch(self, path, **kwargs): ...
+    def get_httpserver_options(self): ...
+    def get_http_port(self): ...
+    def get_protocol(self): ...
+    def get_url(self, path): ...
+    def tearDown(self): ...
+
+class AsyncHTTPSTestCase(AsyncHTTPTestCase):
+    def get_http_client(self): ...
+    def get_httpserver_options(self): ...
+    def get_ssl_options(self): ...
+    def get_protocol(self): ...
+
+def gen_test(f): ...
+
+class LogTrapTestCase(unittest.TestCase):
+    def run(self, result=None): ...
+
+class ExpectLog(logging.Filter):
+    logger = ...  # type: Any
+    regex = ...  # type: Any
+    required = ...  # type: Any
+    matched = ...  # type: Any
+    def __init__(self, logger, regex, required=True): ...
+    def filter(self, record): ...
+    def __enter__(self): ...
+    def __exit__(self, typ, value, tb): ...
+
+def main(**kwargs): ...
diff --git a/typeshed/third_party/2/tornado/util.pyi b/typeshed/third_party/2/tornado/util.pyi
new file mode 100644
index 0000000..3b07131
--- /dev/null
+++ b/typeshed/third_party/2/tornado/util.pyi
@@ -0,0 +1,50 @@
+# Stubs for tornado.util (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+xrange = ...  # type: Any
+
+class ObjectDict(dict):
+    def __getattr__(self, name): ...
+    def __setattr__(self, name, value): ...
+
+class GzipDecompressor:
+    decompressobj = ...  # type: Any
+    def __init__(self) -> None: ...
+    def decompress(self, value, max_length=...): ...
+    @property
+    def unconsumed_tail(self): ...
+    def flush(self): ...
+
+unicode_type = ...  # type: Any
+basestring_type = ...  # type: Any
+
+def import_object(name): ...
+
+bytes_type = ...  # type: Any
+
+def errno_from_exception(e): ...
+
+class Configurable:
+    def __new__(cls, *args, **kwargs): ...
+    @classmethod
+    def configurable_base(cls): ...
+    @classmethod
+    def configurable_default(cls): ...
+    def initialize(self): ...
+    @classmethod
+    def configure(cls, impl, **kwargs): ...
+    @classmethod
+    def configured_class(cls): ...
+
+class ArgReplacer:
+    name = ...  # type: Any
+    arg_pos = ...  # type: Any
+    def __init__(self, func, name) -> None: ...
+    def get_old_value(self, args, kwargs, default=...): ...
+    def replace(self, new_value, args, kwargs): ...
+
+def timedelta_to_seconds(td): ...
+def doctests(): ...
diff --git a/typeshed/third_party/2/tornado/web.pyi b/typeshed/third_party/2/tornado/web.pyi
new file mode 100644
index 0000000..ca0c7c0
--- /dev/null
+++ b/typeshed/third_party/2/tornado/web.pyi
@@ -0,0 +1,261 @@
+# Stubs for tornado.web (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado import httputil
+
+MIN_SUPPORTED_SIGNED_VALUE_VERSION = ...  # type: Any
+MAX_SUPPORTED_SIGNED_VALUE_VERSION = ...  # type: Any
+DEFAULT_SIGNED_VALUE_VERSION = ...  # type: Any
+DEFAULT_SIGNED_VALUE_MIN_VERSION = ...  # type: Any
+
+class RequestHandler:
+    SUPPORTED_METHODS = ...  # type: Any
+    application = ...  # type: Any
+    request = ...  # type: Any
+    path_args = ...  # type: Any
+    path_kwargs = ...  # type: Any
+    ui = ...  # type: Any
+    def __init__(self, application, request, **kwargs) -> None: ...
+    def initialize(self): ...
+    @property
+    def settings(self): ...
+    def head(self, *args, **kwargs): ...
+    def get(self, *args, **kwargs): ...
+    def post(self, *args, **kwargs): ...
+    def delete(self, *args, **kwargs): ...
+    def patch(self, *args, **kwargs): ...
+    def put(self, *args, **kwargs): ...
+    def options(self, *args, **kwargs): ...
+    def prepare(self): ...
+    def on_finish(self): ...
+    def on_connection_close(self): ...
+    def clear(self): ...
+    def set_default_headers(self): ...
+    def set_status(self, status_code, reason=...): ...
+    def get_status(self): ...
+    def set_header(self, name, value): ...
+    def add_header(self, name, value): ...
+    def clear_header(self, name): ...
+    def get_argument(self, name, default=..., strip=...): ...
+    def get_arguments(self, name, strip=...): ...
+    def get_body_argument(self, name, default=..., strip=...): ...
+    def get_body_arguments(self, name, strip=...): ...
+    def get_query_argument(self, name, default=..., strip=...): ...
+    def get_query_arguments(self, name, strip=...): ...
+    def decode_argument(self, value, name=...): ...
+    @property
+    def cookies(self): ...
+    def get_cookie(self, name, default=...): ...
+    def set_cookie(self, name, value, domain=..., expires=..., path=..., expires_days=..., **kwargs): ...
+    def clear_cookie(self, name, path=..., domain=...): ...
+    def clear_all_cookies(self, path=..., domain=...): ...
+    def set_secure_cookie(self, name, value, expires_days=..., version=..., **kwargs): ...
+    def create_signed_value(self, name, value, version=...): ...
+    def get_secure_cookie(self, name, value=..., max_age_days=..., min_version=...): ...
+    def get_secure_cookie_key_version(self, name, value=...): ...
+    def redirect(self, url, permanent=..., status=...): ...
+    def write(self, chunk): ...
+    def render(self, template_name, **kwargs): ...
+    def render_string(self, template_name, **kwargs): ...
+    def get_template_namespace(self): ...
+    def create_template_loader(self, template_path): ...
+    def flush(self, include_footers=..., callback=...): ...
+    def finish(self, chunk=...): ...
+    def send_error(self, status_code=..., **kwargs): ...
+    def write_error(self, status_code, **kwargs): ...
+    @property
+    def locale(self): ...
+    @locale.setter
+    def locale(self, value): ...
+    def get_user_locale(self): ...
+    def get_browser_locale(self, default=...): ...
+    @property
+    def current_user(self): ...
+    @current_user.setter
+    def current_user(self, value): ...
+    def get_current_user(self): ...
+    def get_login_url(self): ...
+    def get_template_path(self): ...
+    @property
+    def xsrf_token(self): ...
+    def check_xsrf_cookie(self): ...
+    def xsrf_form_html(self): ...
+    def static_url(self, path, include_host=..., **kwargs): ...
+    def require_setting(self, name, feature=...): ...
+    def reverse_url(self, name, *args): ...
+    def compute_etag(self): ...
+    def set_etag_header(self): ...
+    def check_etag_header(self): ...
+    def data_received(self, chunk): ...
+    def log_exception(self, typ, value, tb): ...
+
+def asynchronous(method): ...
+def stream_request_body(cls): ...
+def removeslash(method): ...
+def addslash(method): ...
+
+class Application(httputil.HTTPServerConnectionDelegate):
+    transforms = ...  # type: Any
+    handlers = ...  # type: Any
+    named_handlers = ...  # type: Any
+    default_host = ...  # type: Any
+    settings = ...  # type: Any
+    ui_modules = ...  # type: Any
+    ui_methods = ...  # type: Any
+    def __init__(self, handlers=..., default_host=..., transforms=..., **settings) -> None: ...
+    def listen(self, port, address=..., **kwargs): ...
+    def add_handlers(self, host_pattern, host_handlers): ...
+    def add_transform(self, transform_class): ...
+    def start_request(self, server_conn, request_conn): ...
+    def __call__(self, request): ...
+    def reverse_url(self, name, *args): ...
+    def log_request(self, handler): ...
+
+class _RequestDispatcher(httputil.HTTPMessageDelegate):
+    application = ...  # type: Any
+    connection = ...  # type: Any
+    request = ...  # type: Any
+    chunks = ...  # type: Any
+    handler_class = ...  # type: Any
+    handler_kwargs = ...  # type: Any
+    path_args = ...  # type: Any
+    path_kwargs = ...  # type: Any
+    def __init__(self, application, connection) -> None: ...
+    def headers_received(self, start_line, headers): ...
+    stream_request_body = ...  # type: Any
+    def set_request(self, request): ...
+    def data_received(self, data): ...
+    def finish(self): ...
+    def on_connection_close(self): ...
+    handler = ...  # type: Any
+    def execute(self): ...
+
+class HTTPError(Exception):
+    status_code = ...  # type: Any
+    log_message = ...  # type: Any
+    args = ...  # type: Any
+    reason = ...  # type: Any
+    def __init__(self, status_code, log_message=..., *args, **kwargs) -> None: ...
+
+class Finish(Exception): ...
+
+class MissingArgumentError(HTTPError):
+    arg_name = ...  # type: Any
+    def __init__(self, arg_name) -> None: ...
+
+class ErrorHandler(RequestHandler):
+    def initialize(self, status_code): ...
+    def prepare(self): ...
+    def check_xsrf_cookie(self): ...
+
+class RedirectHandler(RequestHandler):
+    def initialize(self, url, permanent=...): ...
+    def get(self): ...
+
+class StaticFileHandler(RequestHandler):
+    CACHE_MAX_AGE = ...  # type: Any
+    root = ...  # type: Any
+    default_filename = ...  # type: Any
+    def initialize(self, path, default_filename=...): ...
+    @classmethod
+    def reset(cls): ...
+    def head(self, path): ...
+    path = ...  # type: Any
+    absolute_path = ...  # type: Any
+    modified = ...  # type: Any
+    def get(self, path, include_body=...): ...
+    def compute_etag(self): ...
+    def set_headers(self): ...
+    def should_return_304(self): ...
+    @classmethod
+    def get_absolute_path(cls, root, path): ...
+    def validate_absolute_path(self, root, absolute_path): ...
+    @classmethod
+    def get_content(cls, abspath, start=..., end=...): ...
+    @classmethod
+    def get_content_version(cls, abspath): ...
+    def get_content_size(self): ...
+    def get_modified_time(self): ...
+    def get_content_type(self): ...
+    def set_extra_headers(self, path): ...
+    def get_cache_time(self, path, modified, mime_type): ...
+    @classmethod
+    def make_static_url(cls, settings, path, include_version=...): ...
+    def parse_url_path(self, url_path): ...
+    @classmethod
+    def get_version(cls, settings, path): ...
+
+class FallbackHandler(RequestHandler):
+    fallback = ...  # type: Any
+    def initialize(self, fallback): ...
+    def prepare(self): ...
+
+class OutputTransform:
+    def __init__(self, request) -> None: ...
+    def transform_first_chunk(self, status_code, headers, chunk, finishing): ...
+    def transform_chunk(self, chunk, finishing): ...
+
+class GZipContentEncoding(OutputTransform):
+    CONTENT_TYPES = ...  # type: Any
+    MIN_LENGTH = ...  # type: Any
+    def __init__(self, request) -> None: ...
+    def transform_first_chunk(self, status_code, headers, chunk, finishing): ...
+    def transform_chunk(self, chunk, finishing): ...
+
+def authenticated(method): ...
+
+class UIModule:
+    handler = ...  # type: Any
+    request = ...  # type: Any
+    ui = ...  # type: Any
+    locale = ...  # type: Any
+    def __init__(self, handler) -> None: ...
+    @property
+    def current_user(self): ...
+    def render(self, *args, **kwargs): ...
+    def embedded_javascript(self): ...
+    def javascript_files(self): ...
+    def embedded_css(self): ...
+    def css_files(self): ...
+    def html_head(self): ...
+    def html_body(self): ...
+    def render_string(self, path, **kwargs): ...
+
+class _linkify(UIModule):
+    def render(self, text, **kwargs): ...
+
+class _xsrf_form_html(UIModule):
+    def render(self): ...
+
+class TemplateModule(UIModule):
+    def __init__(self, handler) -> None: ...
+    def render(self, path, **kwargs): ...
+    def embedded_javascript(self): ...
+    def javascript_files(self): ...
+    def embedded_css(self): ...
+    def css_files(self): ...
+    def html_head(self): ...
+    def html_body(self): ...
+
+class _UIModuleNamespace:
+    handler = ...  # type: Any
+    ui_modules = ...  # type: Any
+    def __init__(self, handler, ui_modules) -> None: ...
+    def __getitem__(self, key): ...
+    def __getattr__(self, key): ...
+
+class URLSpec:
+    regex = ...  # type: Any
+    handler_class = ...  # type: Any
+    kwargs = ...  # type: Any
+    name = ...  # type: Any
+    def __init__(self, pattern, handler, kwargs=..., name=...) -> None: ...
+    def reverse(self, *args): ...
+
+url = ...  # type: Any
+
+def create_signed_value(secret, name, value, version=..., clock=..., key_version=...): ...
+def decode_signed_value(secret, name, value, max_age_days=..., clock=..., min_version=...): ...
+def get_signature_key_version(value): ...
diff --git a/typeshed/third_party/2/werkzeug/__init__.pyi b/typeshed/third_party/2/werkzeug/__init__.pyi
new file mode 100644
index 0000000..5bb4845
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/__init__.pyi
@@ -0,0 +1,155 @@
+# Stubs for werkzeug (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from types import ModuleType
+
+from typing import Any
+
+from werkzeug import _internal
+from werkzeug import datastructures
+from werkzeug import debug
+from werkzeug import exceptions
+from werkzeug import formparser
+from werkzeug import http
+from werkzeug import local
+from werkzeug import security
+from werkzeug import serving
+from werkzeug import test
+from werkzeug import testapp
+from werkzeug import urls
+from werkzeug import useragents
+from werkzeug import utils
+from werkzeug import wrappers
+from werkzeug import wsgi
+
+class module(ModuleType):
+    def __getattr__(self, name): ...
+    def __dir__(self): ...
+
+
+__version__ = ...  # type: Any
+
+run_simple = serving.run_simple
+test_app = testapp.test_app
+UserAgent = useragents.UserAgent
+_easteregg = _internal._easteregg
+DebuggedApplication = debug.DebuggedApplication
+MultiDict = datastructures.MultiDict
+CombinedMultiDict = datastructures.CombinedMultiDict
+Headers = datastructures.Headers
+EnvironHeaders = datastructures.EnvironHeaders
+ImmutableList = datastructures.ImmutableList
+ImmutableDict = datastructures.ImmutableDict
+ImmutableMultiDict = datastructures.ImmutableMultiDict
+TypeConversionDict = datastructures.TypeConversionDict
+ImmutableTypeConversionDict = datastructures.ImmutableTypeConversionDict
+Accept = datastructures.Accept
+MIMEAccept = datastructures.MIMEAccept
+CharsetAccept = datastructures.CharsetAccept
+LanguageAccept = datastructures.LanguageAccept
+RequestCacheControl = datastructures.RequestCacheControl
+ResponseCacheControl = datastructures.ResponseCacheControl
+ETags = datastructures.ETags
+HeaderSet = datastructures.HeaderSet
+WWWAuthenticate = datastructures.WWWAuthenticate
+Authorization = datastructures.Authorization
+FileMultiDict = datastructures.FileMultiDict
+CallbackDict = datastructures.CallbackDict
+FileStorage = datastructures.FileStorage
+OrderedMultiDict = datastructures.OrderedMultiDict
+ImmutableOrderedMultiDict = datastructures.ImmutableOrderedMultiDict
+escape = utils.escape
+environ_property = utils.environ_property
+append_slash_redirect = utils.append_slash_redirect
+redirect = utils.redirect
+cached_property = utils.cached_property
+import_string = utils.import_string
+dump_cookie = http.dump_cookie
+parse_cookie = http.parse_cookie
+unescape = utils.unescape
+format_string = utils.format_string
+find_modules = utils.find_modules
+header_property = utils.header_property
+html = utils.html
+xhtml = utils.xhtml
+HTMLBuilder = utils.HTMLBuilder
+validate_arguments = utils.validate_arguments
+ArgumentValidationError = utils.ArgumentValidationError
+bind_arguments = utils.bind_arguments
+secure_filename = utils.secure_filename
+BaseResponse = wrappers.BaseResponse
+BaseRequest = wrappers.BaseRequest
+Request = wrappers.Request
+Response = wrappers.Response
+AcceptMixin = wrappers.AcceptMixin
+ETagRequestMixin = wrappers.ETagRequestMixin
+ETagResponseMixin = wrappers.ETagResponseMixin
+ResponseStreamMixin = wrappers.ResponseStreamMixin
+CommonResponseDescriptorsMixin = wrappers.CommonResponseDescriptorsMixin
+UserAgentMixin = wrappers.UserAgentMixin
+AuthorizationMixin = wrappers.AuthorizationMixin
+WWWAuthenticateMixin = wrappers.WWWAuthenticateMixin
+CommonRequestDescriptorsMixin = wrappers.CommonRequestDescriptorsMixin
+Local = local.Local
+LocalManager = local.LocalManager
+LocalProxy = local.LocalProxy
+LocalStack = local.LocalStack
+release_local = local.release_local
+generate_password_hash = security.generate_password_hash
+check_password_hash = security.check_password_hash
+Client = test.Client
+EnvironBuilder = test.EnvironBuilder
+create_environ = test.create_environ
+run_wsgi_app = test.run_wsgi_app
+get_current_url = wsgi.get_current_url
+get_host = wsgi.get_host
+pop_path_info = wsgi.pop_path_info
+peek_path_info = wsgi.peek_path_info
+SharedDataMiddleware = wsgi.SharedDataMiddleware
+DispatcherMiddleware = wsgi.DispatcherMiddleware
+ClosingIterator = wsgi.ClosingIterator
+FileWrapper = wsgi.FileWrapper
+make_line_iter = wsgi.make_line_iter
+LimitedStream = wsgi.LimitedStream
+responder = wsgi.responder
+wrap_file = wsgi.wrap_file
+extract_path_info = wsgi.extract_path_info
+parse_etags = http.parse_etags
+parse_date = http.parse_date
+http_date = http.http_date
+cookie_date = http.cookie_date
+parse_cache_control_header = http.parse_cache_control_header
+is_resource_modified = http.is_resource_modified
+parse_accept_header = http.parse_accept_header
+parse_set_header = http.parse_set_header
+quote_etag = http.quote_etag
+unquote_etag = http.unquote_etag
+generate_etag = http.generate_etag
+dump_header = http.dump_header
+parse_list_header = http.parse_list_header
+parse_dict_header = http.parse_dict_header
+parse_authorization_header = http.parse_authorization_header
+parse_www_authenticate_header = http.parse_www_authenticate_header
+remove_entity_headers = http.remove_entity_headers
+is_entity_header = http.is_entity_header
+remove_hop_by_hop_headers = http.remove_hop_by_hop_headers
+parse_options_header = http.parse_options_header
+dump_options_header = http.dump_options_header
+is_hop_by_hop_header = http.is_hop_by_hop_header
+unquote_header_value = http.unquote_header_value
+quote_header_value = http.quote_header_value
+HTTP_STATUS_CODES = http.HTTP_STATUS_CODES
+url_decode = urls.url_decode
+url_encode = urls.url_encode
+url_quote = urls.url_quote
+url_quote_plus = urls.url_quote_plus
+url_unquote = urls.url_unquote
+url_unquote_plus = urls.url_unquote_plus
+url_fix = urls.url_fix
+Href = urls.Href
+iri_to_uri = urls.iri_to_uri
+uri_to_iri = urls.uri_to_iri
+parse_form_data = formparser.parse_form_data
+abort = exceptions.Aborter
+Aborter = exceptions.Aborter
diff --git a/typeshed/third_party/2/werkzeug/_compat.pyi b/typeshed/third_party/2/werkzeug/_compat.pyi
new file mode 100644
index 0000000..801bdda
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/_compat.pyi
@@ -0,0 +1,47 @@
+# Stubs for werkzeug._compat (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import StringIO as BytesIO
+
+PY2 = ...  # type: Any
+WIN = ...  # type: Any
+unichr = ...  # type: Any
+text_type = ...  # type: Any
+string_types = ...  # type: Any
+integer_types = ...  # type: Any
+iterkeys = ...  # type: Any
+itervalues = ...  # type: Any
+iteritems = ...  # type: Any
+iterlists = ...  # type: Any
+iterlistvalues = ...  # type: Any
+int_to_byte = ...  # type: Any
+iter_bytes = ...  # type: Any
+
+def fix_tuple_repr(obj): ...
+def implements_iterator(cls): ...
+def implements_to_string(cls): ...
+def native_string_result(func): ...
+def implements_bool(cls): ...
+
+range_type = ...  # type: Any
+NativeStringIO = ...  # type: Any
+
+def make_literal_wrapper(reference): ...
+def normalize_string_tuple(tup): ...
+def try_coerce_native(s): ...
+
+wsgi_get_bytes = ...  # type: Any
+
+def wsgi_decoding_dance(s, charset='', errors=''): ...
+def wsgi_encoding_dance(s, charset='', errors=''): ...
+def to_bytes(x, charset=..., errors=''): ...
+def to_native(x, charset=..., errors=''): ...
+def reraise(tp, value, tb=None): ...
+
+imap = ...  # type: Any
+izip = ...  # type: Any
+ifilter = ...  # type: Any
+
+def to_unicode(x, charset=..., errors='', allow_none_charset=False): ...
diff --git a/typeshed/third_party/2/werkzeug/_internal.pyi b/typeshed/third_party/2/werkzeug/_internal.pyi
new file mode 100644
index 0000000..1a1bbd5
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/_internal.pyi
@@ -0,0 +1,22 @@
+# Stubs for werkzeug._internal (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _Missing:
+    def __reduce__(self): ...
+
+class _DictAccessorProperty:
+    read_only = ...  # type: Any
+    name = ...  # type: Any
+    default = ...  # type: Any
+    load_func = ...  # type: Any
+    dump_func = ...  # type: Any
+    __doc__ = ...  # type: Any
+    def __init__(self, name, default=None, load_func=None, dump_func=None, read_only=None, doc=None): ...
+    def __get__(self, obj, type=None): ...
+    def __set__(self, obj, value): ...
+    def __delete__(self, obj): ...
+
+def _easteregg(app=None): ...
diff --git a/typeshed/third_party/2/werkzeug/_reloader.pyi b/typeshed/third_party/2/werkzeug/_reloader.pyi
new file mode 100644
index 0000000..9bfea1f
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/_reloader.pyi
@@ -0,0 +1,33 @@
+# Stubs for werkzeug._reloader (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class ReloaderLoop:
+    name = ...  # type: Any
+    extra_files = ...  # type: Any
+    interval = ...  # type: Any
+    def __init__(self, extra_files=None, interval=1): ...
+    def run(self): ...
+    def restart_with_reloader(self): ...
+    def trigger_reload(self, filename): ...
+    def log_reload(self, filename): ...
+
+class StatReloaderLoop(ReloaderLoop):
+    name = ...  # type: Any
+    def run(self): ...
+
+class WatchdogReloaderLoop(ReloaderLoop):
+    observable_paths = ...  # type: Any
+    name = ...  # type: Any
+    observer_class = ...  # type: Any
+    event_handler = ...  # type: Any
+    should_reload = ...  # type: Any
+    def __init__(self, *args, **kwargs): ...
+    def trigger_reload(self, filename): ...
+    def run(self): ...
+
+reloader_loops = ...  # type: Any
+
+def run_with_reloader(main_func, extra_files=None, interval=1, reloader_type=''): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/__init__.pyi b/typeshed/third_party/2/werkzeug/contrib/__init__.pyi
new file mode 100644
index 0000000..4b77b01
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for werkzeug.contrib (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2/werkzeug/contrib/atom.pyi b/typeshed/third_party/2/werkzeug/contrib/atom.pyi
new file mode 100644
index 0000000..98f994d
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/atom.pyi
@@ -0,0 +1,54 @@
+# Stubs for werkzeug.contrib.atom (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+XHTML_NAMESPACE = ...  # type: Any
+
+def format_iso8601(obj): ...
+
+class AtomFeed:
+    default_generator = ...  # type: Any
+    title = ...  # type: Any
+    title_type = ...  # type: Any
+    url = ...  # type: Any
+    feed_url = ...  # type: Any
+    id = ...  # type: Any
+    updated = ...  # type: Any
+    author = ...  # type: Any
+    icon = ...  # type: Any
+    logo = ...  # type: Any
+    rights = ...  # type: Any
+    rights_type = ...  # type: Any
+    subtitle = ...  # type: Any
+    subtitle_type = ...  # type: Any
+    generator = ...  # type: Any
+    links = ...  # type: Any
+    entries = ...  # type: Any
+    def __init__(self, title=None, entries=None, **kwargs): ...
+    def add(self, *args, **kwargs): ...
+    def generate(self): ...
+    def to_string(self): ...
+    def get_response(self): ...
+    def __call__(self, environ, start_response): ...
+
+class FeedEntry:
+    title = ...  # type: Any
+    title_type = ...  # type: Any
+    content = ...  # type: Any
+    content_type = ...  # type: Any
+    url = ...  # type: Any
+    id = ...  # type: Any
+    updated = ...  # type: Any
+    summary = ...  # type: Any
+    summary_type = ...  # type: Any
+    author = ...  # type: Any
+    published = ...  # type: Any
+    rights = ...  # type: Any
+    links = ...  # type: Any
+    categories = ...  # type: Any
+    xml_base = ...  # type: Any
+    def __init__(self, title=None, content=None, feed_url=None, **kwargs): ...
+    def generate(self): ...
+    def to_string(self): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/cache.pyi b/typeshed/third_party/2/werkzeug/contrib/cache.pyi
new file mode 100644
index 0000000..1c9fcbe
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/cache.pyi
@@ -0,0 +1,77 @@
+# Stubs for werkzeug.contrib.cache (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class BaseCache:
+    default_timeout = ...  # type: Any
+    def __init__(self, default_timeout=300): ...
+    def get(self, key): ...
+    def delete(self, key): ...
+    def get_many(self, *keys): ...
+    def get_dict(self, *keys): ...
+    def set(self, key, value, timeout=None): ...
+    def add(self, key, value, timeout=None): ...
+    def set_many(self, mapping, timeout=None): ...
+    def delete_many(self, *keys): ...
+    def has(self, key): ...
+    def clear(self): ...
+    def inc(self, key, delta=1): ...
+    def dec(self, key, delta=1): ...
+
+class NullCache(BaseCache): ...
+
+class SimpleCache(BaseCache):
+    clear = ...  # type: Any
+    def __init__(self, threshold=500, default_timeout=300): ...
+    def get(self, key): ...
+    def set(self, key, value, timeout=None): ...
+    def add(self, key, value, timeout=None): ...
+    def delete(self, key): ...
+    def has(self, key): ...
+
+class MemcachedCache(BaseCache):
+    key_prefix = ...  # type: Any
+    def __init__(self, servers=None, default_timeout=300, key_prefix=None): ...
+    def get(self, key): ...
+    def get_dict(self, *keys): ...
+    def add(self, key, value, timeout=None): ...
+    def set(self, key, value, timeout=None): ...
+    def get_many(self, *keys): ...
+    def set_many(self, mapping, timeout=None): ...
+    def delete(self, key): ...
+    def delete_many(self, *keys): ...
+    def has(self, key): ...
+    def clear(self): ...
+    def inc(self, key, delta=1): ...
+    def dec(self, key, delta=1): ...
+    def import_preferred_memcache_lib(self, servers): ...
+
+GAEMemcachedCache = ...  # type: Any
+
+class RedisCache(BaseCache):
+    key_prefix = ...  # type: Any
+    def __init__(self, host='', port=6379, password=None, db=0, default_timeout=300, key_prefix=None, **kwargs): ...
+    def dump_object(self, value): ...
+    def load_object(self, value): ...
+    def get(self, key): ...
+    def get_many(self, *keys): ...
+    def set(self, key, value, timeout=None): ...
+    def add(self, key, value, timeout=None): ...
+    def set_many(self, mapping, timeout=None): ...
+    def delete(self, key): ...
+    def delete_many(self, *keys): ...
+    def has(self, key): ...
+    def clear(self): ...
+    def inc(self, key, delta=1): ...
+    def dec(self, key, delta=1): ...
+
+class FileSystemCache(BaseCache):
+    def __init__(self, cache_dir, threshold=500, default_timeout=300, mode=384): ...
+    def clear(self): ...
+    def get(self, key): ...
+    def add(self, key, value, timeout=None): ...
+    def set(self, key, value, timeout=None): ...
+    def delete(self, key): ...
+    def has(self, key): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/fixers.pyi b/typeshed/third_party/2/werkzeug/contrib/fixers.pyi
new file mode 100644
index 0000000..147456e
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/fixers.pyi
@@ -0,0 +1,41 @@
+# Stubs for werkzeug.contrib.fixers (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class CGIRootFix:
+    app = ...  # type: Any
+    app_root = ...  # type: Any
+    def __init__(self, app, app_root=''): ...
+    def __call__(self, environ, start_response): ...
+
+LighttpdCGIRootFix = ...  # type: Any
+
+class PathInfoFromRequestUriFix:
+    app = ...  # type: Any
+    def __init__(self, app): ...
+    def __call__(self, environ, start_response): ...
+
+class ProxyFix:
+    app = ...  # type: Any
+    num_proxies = ...  # type: Any
+    def __init__(self, app, num_proxies=1): ...
+    def get_remote_addr(self, forwarded_for): ...
+    def __call__(self, environ, start_response): ...
+
+class HeaderRewriterFix:
+    app = ...  # type: Any
+    remove_headers = ...  # type: Any
+    add_headers = ...  # type: Any
+    def __init__(self, app, remove_headers=None, add_headers=None): ...
+    def __call__(self, environ, start_response): ...
+
+class InternetExplorerFix:
+    app = ...  # type: Any
+    fix_vary = ...  # type: Any
+    fix_attach = ...  # type: Any
+    def __init__(self, app, fix_vary=True, fix_attach=True): ...
+    def fix_headers(self, environ, headers, status=None): ...
+    def run_fixed(self, environ, start_response): ...
+    def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/iterio.pyi b/typeshed/third_party/2/werkzeug/contrib/iterio.pyi
new file mode 100644
index 0000000..fd2c2a2
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/iterio.pyi
@@ -0,0 +1,42 @@
+# Stubs for werkzeug.contrib.iterio (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+greenlet = ...  # type: Any
+
+class IterIO:
+    def __new__(cls, obj, sentinel=''): ...
+    def __iter__(self): ...
+    def tell(self): ...
+    def isatty(self): ...
+    def seek(self, pos, mode=0): ...
+    def truncate(self, size=None): ...
+    def write(self, s): ...
+    def writelines(self, list): ...
+    def read(self, n=-1): ...
+    def readlines(self, sizehint=0): ...
+    def readline(self, length=None): ...
+    def flush(self): ...
+    def __next__(self): ...
+
+class IterI(IterIO):
+    def __new__(cls, func, sentinel=''): ...
+    closed = ...  # type: Any
+    def close(self): ...
+    def write(self, s): ...
+    def writelines(self, list): ...
+    def flush(self): ...
+
+class IterO(IterIO):
+    sentinel = ...  # type: Any
+    closed = ...  # type: Any
+    pos = ...  # type: Any
+    def __new__(cls, gen, sentinel=''): ...
+    def __iter__(self): ...
+    def close(self): ...
+    def seek(self, pos, mode=0): ...
+    def read(self, n=-1): ...
+    def readline(self, length=None): ...
+    def readlines(self, sizehint=0): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/jsrouting.pyi b/typeshed/third_party/2/werkzeug/contrib/jsrouting.pyi
new file mode 100644
index 0000000..6fdd615
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/jsrouting.pyi
@@ -0,0 +1,14 @@
+# Stubs for werkzeug.contrib.jsrouting (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def dumps(*args): ...
+def render_template(name_parts, rules, converters): ...
+def generate_map(map, name=''): ...
+def generate_adapter(adapter, name='', map_name=''): ...
+def js_to_url_function(converter): ...
+def NumberConverter_js_to_url(conv): ...
+
+js_to_url_functions = ...  # type: Any
diff --git a/typeshed/third_party/2/werkzeug/contrib/limiter.pyi b/typeshed/third_party/2/werkzeug/contrib/limiter.pyi
new file mode 100644
index 0000000..d51038e
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/limiter.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.contrib.limiter (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class StreamLimitMiddleware:
+    app = ...  # type: Any
+    maximum_size = ...  # type: Any
+    def __init__(self, app, maximum_size=...): ...
+    def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/lint.pyi b/typeshed/third_party/2/werkzeug/contrib/lint.pyi
new file mode 100644
index 0000000..a0c2295
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/lint.pyi
@@ -0,0 +1,47 @@
+# Stubs for werkzeug.contrib.lint (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class WSGIWarning(Warning): ...
+class HTTPWarning(Warning): ...
+
+def check_string(context, obj, stacklevel=3): ...
+
+class InputStream:
+    def __init__(self, stream): ...
+    def read(self, *args): ...
+    def readline(self, *args): ...
+    def __iter__(self): ...
+    def close(self): ...
+
+class ErrorStream:
+    def __init__(self, stream): ...
+    def write(self, s): ...
+    def flush(self): ...
+    def writelines(self, seq): ...
+    def close(self): ...
+
+class GuardedWrite:
+    def __init__(self, write, chunks): ...
+    def __call__(self, s): ...
+
+class GuardedIterator:
+    closed = ...  # type: Any
+    headers_set = ...  # type: Any
+    chunks = ...  # type: Any
+    def __init__(self, iterator, headers_set, chunks): ...
+    def __iter__(self): ...
+    def next(self): ...
+    def close(self): ...
+    def __del__(self): ...
+
+class LintMiddleware:
+    app = ...  # type: Any
+    def __init__(self, app): ...
+    def check_environ(self, environ): ...
+    def check_start_response(self, status, headers, exc_info): ...
+    def check_headers(self, headers): ...
+    def check_iterator(self, app_iter): ...
+    def __call__(self, *args, **kwargs): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/profiler.pyi b/typeshed/third_party/2/werkzeug/contrib/profiler.pyi
new file mode 100644
index 0000000..b41c1c8
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/profiler.pyi
@@ -0,0 +1,18 @@
+# Stubs for werkzeug.contrib.profiler (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+available = ...  # type: Any
+
+class MergeStream:
+    streams = ...  # type: Any
+    def __init__(self, *streams): ...
+    def write(self, data): ...
+
+class ProfilerMiddleware:
+    def __init__(self, app, stream=None, sort_by=..., restrictions=..., profile_dir=None): ...
+    def __call__(self, environ, start_response): ...
+
+def make_action(app_factory, hostname='', port=5000, threaded=False, processes=1, stream=None, sort_by=..., restrictions=...): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/securecookie.pyi b/typeshed/third_party/2/werkzeug/contrib/securecookie.pyi
new file mode 100644
index 0000000..c262bed
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/securecookie.pyi
@@ -0,0 +1,30 @@
+# Stubs for werkzeug.contrib.securecookie (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from hmac import new as hmac
+from hashlib import sha1 as _default_hash
+from werkzeug.contrib.sessions import ModificationTrackingDict
+
+class UnquoteError(Exception): ...
+
+class SecureCookie(ModificationTrackingDict):
+    hash_method = ...  # type: Any
+    serialization_method = ...  # type: Any
+    quote_base64 = ...  # type: Any
+    secret_key = ...  # type: Any
+    new = ...  # type: Any
+    def __init__(self, data=None, secret_key=None, new=True): ...
+    @property
+    def should_save(self): ...
+    @classmethod
+    def quote(cls, value): ...
+    @classmethod
+    def unquote(cls, value): ...
+    def serialize(self, expires=None): ...
+    @classmethod
+    def unserialize(cls, string, secret_key): ...
+    @classmethod
+    def load_cookie(cls, request, key='', secret_key=None): ...
+    def save_cookie(self, response, key='', expires=None, session_expires=None, max_age=None, path='', domain=None, secure=None, httponly=False, force=False): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/sessions.pyi b/typeshed/third_party/2/werkzeug/contrib/sessions.pyi
new file mode 100644
index 0000000..5b84ede
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/sessions.pyi
@@ -0,0 +1,58 @@
+# Stubs for werkzeug.contrib.sessions (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.datastructures import CallbackDict
+
+def generate_key(salt=None): ...
+
+class ModificationTrackingDict(CallbackDict):
+    modified = ...  # type: Any
+    def __init__(self, *args, **kwargs): ...
+    def copy(self): ...
+    def __copy__(self): ...
+
+class Session(ModificationTrackingDict):
+    sid = ...  # type: Any
+    new = ...  # type: Any
+    def __init__(self, data, sid, new=False): ...
+    @property
+    def should_save(self): ...
+
+class SessionStore:
+    session_class = ...  # type: Any
+    def __init__(self, session_class=None): ...
+    def is_valid_key(self, key): ...
+    def generate_key(self, salt=None): ...
+    def new(self): ...
+    def save(self, session): ...
+    def save_if_modified(self, session): ...
+    def delete(self, session): ...
+    def get(self, sid): ...
+
+class FilesystemSessionStore(SessionStore):
+    path = ...  # type: Any
+    filename_template = ...  # type: Any
+    renew_missing = ...  # type: Any
+    mode = ...  # type: Any
+    def __init__(self, path=None, filename_template='', session_class=None, renew_missing=False, mode=420): ...
+    def get_session_filename(self, sid): ...
+    def save(self, session): ...
+    def delete(self, session): ...
+    def get(self, sid): ...
+    def list(self): ...
+
+class SessionMiddleware:
+    app = ...  # type: Any
+    store = ...  # type: Any
+    cookie_name = ...  # type: Any
+    cookie_age = ...  # type: Any
+    cookie_expires = ...  # type: Any
+    cookie_path = ...  # type: Any
+    cookie_domain = ...  # type: Any
+    cookie_secure = ...  # type: Any
+    cookie_httponly = ...  # type: Any
+    environ_key = ...  # type: Any
+    def __init__(self, app, store, cookie_name='', cookie_age=None, cookie_expires=None, cookie_path='', cookie_domain=None, cookie_secure=None, cookie_httponly=False, environ_key=''): ...
+    def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/testtools.pyi b/typeshed/third_party/2/werkzeug/contrib/testtools.pyi
new file mode 100644
index 0000000..c304f39
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/testtools.pyi
@@ -0,0 +1,13 @@
+# Stubs for werkzeug.contrib.testtools (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import Response
+
+class ContentAccessors:
+    def xml(self): ...
+    def lxml(self): ...
+    def json(self): ...
+
+class TestResponse(Response, ContentAccessors): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/wrappers.pyi b/typeshed/third_party/2/werkzeug/contrib/wrappers.pyi
new file mode 100644
index 0000000..b538462
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/wrappers.pyi
@@ -0,0 +1,31 @@
+# Stubs for werkzeug.contrib.wrappers (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def is_known_charset(charset): ...
+
+class JSONRequestMixin:
+    def json(self): ...
+
+class ProtobufRequestMixin:
+    protobuf_check_initialization = ...  # type: Any
+    def parse_protobuf(self, proto_type): ...
+
+class RoutingArgsRequestMixin:
+    routing_args = ...  # type: Any
+    routing_vars = ...  # type: Any
+
+class ReverseSlashBehaviorRequestMixin:
+    def path(self): ...
+    def script_root(self): ...
+
+class DynamicCharsetRequestMixin:
+    default_charset = ...  # type: Any
+    def unknown_charset(self, charset): ...
+    def charset(self): ...
+
+class DynamicCharsetResponseMixin:
+    default_charset = ...  # type: Any
+    charset = ...  # type: Any
diff --git a/typeshed/third_party/2/werkzeug/datastructures.pyi b/typeshed/third_party/2/werkzeug/datastructures.pyi
new file mode 100644
index 0000000..cbbddf9
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/datastructures.pyi
@@ -0,0 +1,389 @@
+# Stubs for werkzeug.datastructures (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from collections import Container, Iterable, Mapping, MutableSet
+
+def is_immutable(self): ...
+def iter_multi_items(mapping): ...
+def native_itermethods(names): ...
+
+class ImmutableListMixin:
+    def __hash__(self): ...
+    def __reduce_ex__(self, protocol): ...
+    def __delitem__(self, key): ...
+    def __delslice__(self, i, j): ...
+    def __iadd__(self, other): ...
+    __imul__ = ...  # type: Any
+    def __setitem__(self, key, value): ...
+    def __setslice__(self, i, j, value): ...
+    def append(self, item): ...
+    remove = ...  # type: Any
+    def extend(self, iterable): ...
+    def insert(self, pos, value): ...
+    def pop(self, index=-1): ...
+    def reverse(self): ...
+    def sort(self, cmp=None, key=None, reverse=None): ...
+
+class ImmutableList(ImmutableListMixin, list): ...
+
+class ImmutableDictMixin:
+    @classmethod
+    def fromkeys(cls, *args, **kwargs): ...
+    def __reduce_ex__(self, protocol): ...
+    def __hash__(self): ...
+    def setdefault(self, key, default=None): ...
+    def update(self, *args, **kwargs): ...
+    def pop(self, key, default=None): ...
+    def popitem(self): ...
+    def __setitem__(self, key, value): ...
+    def __delitem__(self, key): ...
+    def clear(self): ...
+
+class ImmutableMultiDictMixin(ImmutableDictMixin):
+    def __reduce_ex__(self, protocol): ...
+    def add(self, key, value): ...
+    def popitemlist(self): ...
+    def poplist(self, key): ...
+    def setlist(self, key, new_list): ...
+    def setlistdefault(self, key, default_list=None): ...
+
+class UpdateDictMixin:
+    on_update = ...  # type: Any
+    def calls_update(name): ...
+    def setdefault(self, key, default=None): ...
+    def pop(self, key, default=...): ...
+    __setitem__ = ...  # type: Any
+    __delitem__ = ...  # type: Any
+    clear = ...  # type: Any
+    popitem = ...  # type: Any
+    update = ...  # type: Any
+
+class TypeConversionDict(dict):
+    def get(self, key, default=None, type=None): ...
+
+class ImmutableTypeConversionDict(ImmutableDictMixin, TypeConversionDict):
+    def copy(self): ...
+    def __copy__(self): ...
+
+class ViewItems:
+    def __init__(self, multi_dict, method, repr_name, *a, **kw): ...
+    def __iter__(self): ...
+
+class MultiDict(TypeConversionDict):
+    def __init__(self, mapping=None): ...
+    def __getitem__(self, key): ...
+    def __setitem__(self, key, value): ...
+    def add(self, key, value): ...
+    def getlist(self, key, type=None): ...
+    def setlist(self, key, new_list): ...
+    def setdefault(self, key, default=None): ...
+    def setlistdefault(self, key, default_list=None): ...
+    def items(self, multi=False): ...
+    def lists(self): ...
+    def keys(self): ...
+    __iter__ = ...  # type: Any
+    def values(self): ...
+    def listvalues(self): ...
+    def copy(self): ...
+    def deepcopy(self, memo=None): ...
+    def to_dict(self, flat=True): ...
+    def update(self, other_dict): ...
+    def pop(self, key, default=...): ...
+    def popitem(self): ...
+    def poplist(self, key): ...
+    def popitemlist(self): ...
+    def __copy__(self): ...
+    def __deepcopy__(self, memo): ...
+
+class _omd_bucket:
+    prev = ...  # type: Any
+    key = ...  # type: Any
+    value = ...  # type: Any
+    next = ...  # type: Any
+    def __init__(self, omd, key, value): ...
+    def unlink(self, omd): ...
+
+class OrderedMultiDict(MultiDict):
+    def __init__(self, mapping=None): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    def __reduce_ex__(self, protocol): ...
+    def __getitem__(self, key): ...
+    def __setitem__(self, key, value): ...
+    def __delitem__(self, key): ...
+    def keys(self): ...
+    __iter__ = ...  # type: Any
+    def values(self): ...
+    def items(self, multi=False): ...
+    def lists(self): ...
+    def listvalues(self): ...
+    def add(self, key, value): ...
+    def getlist(self, key, type=None): ...
+    def setlist(self, key, new_list): ...
+    def setlistdefault(self, key, default_list=None): ...
+    def update(self, mapping): ...
+    def poplist(self, key): ...
+    def pop(self, key, default=...): ...
+    def popitem(self): ...
+    def popitemlist(self): ...
+
+class Headers(Mapping):
+    def __init__(self, defaults=None): ...
+    def __getitem__(self, key, _get_mode=False): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    def get(self, key, default=None, type=None, as_bytes=False): ...
+    def getlist(self, key, type=None, as_bytes=False): ...
+    def get_all(self, name): ...
+    def items(self, lower=False): ...
+    def keys(self, lower=False): ...
+    def values(self): ...
+    def extend(self, iterable): ...
+    def __delitem__(self, key, _index_operation=True): ...
+    def remove(self, key): ...
+    def pop(self, **kwargs): ...
+    def popitem(self): ...
+    def __contains__(self, key): ...
+    has_key = ...  # type: Any
+    def __iter__(self): ...
+    def __len__(self): ...
+    def add(self, _key, _value, **kw): ...
+    def add_header(self, _key, _value, **_kw): ...
+    def clear(self): ...
+    def set(self, _key, _value, **kw): ...
+    def setdefault(self, key, value): ...
+    def __setitem__(self, key, value): ...
+    def to_list(self, charset=''): ...
+    def to_wsgi_list(self): ...
+    def copy(self): ...
+    def __copy__(self): ...
+
+class ImmutableHeadersMixin:
+    def __delitem__(self, key, _index_operation=True): ...  # FIXME: This is invalid but works around https://github.com/pallets/werkzeug/issues/1051
+    def __setitem__(self, key, value): ...
+    set = ...  # type: Any
+    def add(self, *args, **kwargs): ...
+    remove = ...  # type: Any
+    add_header = ...  # type: Any
+    def extend(self, iterable): ...
+    def insert(self, pos, value): ...
+    def pop(self, **kwargs): ...
+    def popitem(self): ...
+    def setdefault(self, key, default): ...
+
+class EnvironHeaders(ImmutableHeadersMixin, Headers):
+    environ = ...  # type: Any
+    def __init__(self, environ): ...
+    def __eq__(self, other): ...
+    def __getitem__(self, key, _get_mode=False): ...
+    def __len__(self): ...
+    def __iter__(self): ...
+    def copy(self): ...
+
+class CombinedMultiDict(ImmutableMultiDictMixin, MultiDict):
+    def __reduce_ex__(self, protocol): ...
+    dicts = ...  # type: Any
+    def __init__(self, dicts=None): ...
+    @classmethod
+    def fromkeys(cls): ...
+    def __getitem__(self, key): ...
+    def get(self, key, default=None, type=None): ...
+    def getlist(self, key, type=None): ...
+    def keys(self): ...
+    __iter__ = ...  # type: Any
+    def items(self, multi=False): ...
+    def values(self): ...
+    def lists(self): ...
+    def listvalues(self): ...
+    def copy(self): ...
+    def to_dict(self, flat=True): ...
+    def __len__(self): ...
+    def __contains__(self, key): ...
+    has_key = ...  # type: Any
+
+class FileMultiDict(MultiDict):
+    def add_file(self, name, file, filename=None, content_type=None): ...
+
+class ImmutableDict(ImmutableDictMixin, dict):
+    def copy(self): ...
+    def __copy__(self): ...
+
+class ImmutableMultiDict(ImmutableMultiDictMixin, MultiDict):
+    def copy(self): ...
+    def __copy__(self): ...
+
+class ImmutableOrderedMultiDict(ImmutableMultiDictMixin, OrderedMultiDict):
+    def copy(self): ...
+    def __copy__(self): ...
+
+class Accept(ImmutableList):
+    provided = ...  # type: Any
+    def __init__(self, values=...): ...
+    def __getitem__(self, key): ...
+    def quality(self, key): ...
+    def __contains__(self, value): ...
+    def index(self, key): ...
+    def find(self, key): ...
+    def values(self): ...
+    def to_header(self): ...
+    def best_match(self, matches, default=None): ...
+    @property
+    def best(self): ...
+
+class MIMEAccept(Accept):
+    @property
+    def accept_html(self): ...
+    @property
+    def accept_xhtml(self): ...
+    @property
+    def accept_json(self): ...
+
+class LanguageAccept(Accept): ...
+class CharsetAccept(Accept): ...
+
+def cache_property(key, empty, type): ...
+
+class _CacheControl(UpdateDictMixin, dict):
+    no_cache = ...  # type: Any
+    no_store = ...  # type: Any
+    max_age = ...  # type: Any
+    no_transform = ...  # type: Any
+    on_update = ...  # type: Any
+    provided = ...  # type: Any
+    def __init__(self, values=..., on_update=None): ...
+    def to_header(self): ...
+
+class RequestCacheControl(ImmutableDictMixin, _CacheControl):
+    max_stale = ...  # type: Any
+    min_fresh = ...  # type: Any
+    no_transform = ...  # type: Any
+    only_if_cached = ...  # type: Any
+
+class ResponseCacheControl(_CacheControl):
+    public = ...  # type: Any
+    private = ...  # type: Any
+    must_revalidate = ...  # type: Any
+    proxy_revalidate = ...  # type: Any
+    s_maxage = ...  # type: Any
+
+class CallbackDict(UpdateDictMixin, dict):
+    on_update = ...  # type: Any
+    def __init__(self, initial=None, on_update=None): ...
+
+class HeaderSet(MutableSet):
+    on_update = ...  # type: Any
+    def __init__(self, headers=None, on_update=None): ...
+    def add(self, header): ...
+    def remove(self, header): ...
+    def update(self, iterable): ...
+    def discard(self, header): ...
+    def find(self, header): ...
+    def index(self, header): ...
+    def clear(self): ...
+    def as_set(self, preserve_casing=False): ...
+    def to_header(self): ...
+    def __getitem__(self, idx): ...
+    def __delitem__(self, idx): ...
+    def __setitem__(self, idx, value): ...
+    def __contains__(self, header): ...
+    def __len__(self): ...
+    def __iter__(self): ...
+    def __nonzero__(self): ...
+
+class ETags(Container, Iterable):
+    star_tag = ...  # type: Any
+    def __init__(self, strong_etags=None, weak_etags=None, star_tag=False): ...
+    def as_set(self, include_weak=False): ...
+    def is_weak(self, etag): ...
+    def contains_weak(self, etag): ...
+    def contains(self, etag): ...
+    def contains_raw(self, etag): ...
+    def to_header(self): ...
+    def __call__(self, etag=None, data=None, include_weak=False): ...
+    def __bool__(self): ...
+    __nonzero__ = ...  # type: Any
+    def __iter__(self): ...
+    def __contains__(self, etag): ...
+
+class IfRange:
+    etag = ...  # type: Any
+    date = ...  # type: Any
+    def __init__(self, etag=None, date=None): ...
+    def to_header(self): ...
+
+class Range:
+    units = ...  # type: Any
+    ranges = ...  # type: Any
+    def __init__(self, units, ranges): ...
+    def range_for_length(self, length): ...
+    def make_content_range(self, length): ...
+    def to_header(self): ...
+    def to_content_range_header(self, length): ...
+
+class ContentRange:
+    on_update = ...  # type: Any
+    def __init__(self, units, start, stop, length=None, on_update=None): ...
+    units = ...  # type: Any
+    start = ...  # type: Any
+    stop = ...  # type: Any
+    length = ...  # type: Any
+    def set(self, start, stop, length=None, units=''): ...
+    def unset(self): ...
+    def to_header(self): ...
+    def __nonzero__(self): ...
+    __bool__ = ...  # type: Any
+
+class Authorization(ImmutableDictMixin, dict):
+    type = ...  # type: Any
+    def __init__(self, auth_type, data=None): ...
+    username = ...  # type: Any
+    password = ...  # type: Any
+    realm = ...  # type: Any
+    nonce = ...  # type: Any
+    uri = ...  # type: Any
+    nc = ...  # type: Any
+    cnonce = ...  # type: Any
+    response = ...  # type: Any
+    opaque = ...  # type: Any
+    @property
+    def qop(self): ...
+
+class WWWAuthenticate(UpdateDictMixin, dict):
+    on_update = ...  # type: Any
+    def __init__(self, auth_type=None, values=None, on_update=None): ...
+    def set_basic(self, realm=''): ...
+    def set_digest(self, realm, nonce, qop=..., opaque=None, algorithm=None, stale=False): ...
+    def to_header(self): ...
+    @staticmethod
+    def auth_property(name, doc=None): ...
+    type = ...  # type: Any
+    realm = ...  # type: Any
+    domain = ...  # type: Any
+    nonce = ...  # type: Any
+    opaque = ...  # type: Any
+    algorithm = ...  # type: Any
+    qop = ...  # type: Any
+    stale = ...  # type: Any
+
+class FileStorage:
+    name = ...  # type: Any
+    stream = ...  # type: Any
+    filename = ...  # type: Any
+    headers = ...  # type: Any
+    def __init__(self, stream=None, filename=None, name=None, content_type=None, content_length=None, headers=None): ...
+    @property
+    def content_type(self): ...
+    @property
+    def content_length(self): ...
+    @property
+    def mimetype(self): ...
+    @property
+    def mimetype_params(self): ...
+    def save(self, dst, buffer_size=16384): ...
+    def close(self): ...
+    def __nonzero__(self): ...
+    __bool__ = ...  # type: Any
+    def __getattr__(self, name): ...
+    def __iter__(self): ...
diff --git a/typeshed/third_party/2/werkzeug/debug/__init__.pyi b/typeshed/third_party/2/werkzeug/debug/__init__.pyi
new file mode 100644
index 0000000..abe6495
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/debug/__init__.pyi
@@ -0,0 +1,40 @@
+# Stubs for werkzeug.debug (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response
+
+PIN_TIME = ...  # type: Any
+
+class _ConsoleFrame:
+    console = ...  # type: Any
+    id = ...  # type: Any
+    def __init__(self, namespace): ...
+
+def get_pin_and_cookie_name(app): ...
+
+class DebuggedApplication:
+    app = ...  # type: Any
+    evalex = ...  # type: Any
+    frames = ...  # type: Any
+    tracebacks = ...  # type: Any
+    request_key = ...  # type: Any
+    console_path = ...  # type: Any
+    console_init_func = ...  # type: Any
+    show_hidden_frames = ...  # type: Any
+    secret = ...  # type: Any
+    pin_logging = ...  # type: Any
+    pin = ...  # type: Any
+    def __init__(self, app, evalex=False, request_key='', console_path='', console_init_func=None, show_hidden_frames=False, lodgeit_url=None, pin_security=True, pin_logging=True): ...
+    @property
+    def pin_cookie_name(self): ...
+    def debug_application(self, environ, start_response): ...
+    def execute_command(self, request, command, frame): ...
+    def display_console(self, request): ...
+    def paste_traceback(self, request, traceback): ...
+    def get_resource(self, request, filename): ...
+    def is_trusted(self, environ): ...
+    def pin_auth(self, request): ...
+    def log_pin_request(self): ...
+    def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/2/werkzeug/debug/console.pyi b/typeshed/third_party/2/werkzeug/debug/console.pyi
new file mode 100644
index 0000000..ddc1a33
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/debug/console.pyi
@@ -0,0 +1,48 @@
+# Stubs for werkzeug.debug.console (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import code
+
+class HTMLStringO:
+    def __init__(self): ...
+    def isatty(self): ...
+    def close(self): ...
+    def flush(self): ...
+    def seek(self, n, mode=0): ...
+    def readline(self): ...
+    def reset(self): ...
+    def write(self, x): ...
+    def writelines(self, x): ...
+
+class ThreadedStream:
+    @staticmethod
+    def push(): ...
+    @staticmethod
+    def fetch(): ...
+    @staticmethod
+    def displayhook(obj): ...
+    def __setattr__(self, name, value): ...
+    def __dir__(self): ...
+    def __getattribute__(self, name): ...
+
+class _ConsoleLoader:
+    def __init__(self): ...
+    def register(self, code, source): ...
+    def get_source_by_code(self, code): ...
+
+class _InteractiveConsole(code.InteractiveInterpreter):
+    globals = ...  # type: Any
+    more = ...  # type: Any
+    buffer = ...  # type: Any
+    def __init__(self, globals, locals): ...
+    def runsource(self, source): ...
+    def runcode(self, code): ...
+    def showtraceback(self): ...
+    def showsyntaxerror(self, filename=None): ...
+    def write(self, data): ...
+
+class Console:
+    def __init__(self, globals=None, locals=None): ...
+    def eval(self, code): ...
diff --git a/typeshed/third_party/2/werkzeug/debug/repr.pyi b/typeshed/third_party/2/werkzeug/debug/repr.pyi
new file mode 100644
index 0000000..6889a27
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/debug/repr.pyi
@@ -0,0 +1,37 @@
+# Stubs for werkzeug.debug.repr (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+deque = ...  # type: Any
+missing = ...  # type: Any
+RegexType = ...  # type: Any
+HELP_HTML = ...  # type: Any
+OBJECT_DUMP_HTML = ...  # type: Any
+
+def debug_repr(obj): ...
+def dump(obj=...): ...
+
+class _Helper:
+    def __call__(self, topic=None): ...
+
+helper = ...  # type: Any
+
+class DebugReprGenerator:
+    def __init__(self): ...
+    list_repr = ...  # type: Any
+    tuple_repr = ...  # type: Any
+    set_repr = ...  # type: Any
+    frozenset_repr = ...  # type: Any
+    deque_repr = ...  # type: Any
+    def regex_repr(self, obj): ...
+    def string_repr(self, obj, limit=70): ...
+    def dict_repr(self, d, recursive, limit=5): ...
+    def object_repr(self, obj): ...
+    def dispatch_repr(self, obj, recursive): ...
+    def fallback_repr(self): ...
+    def repr(self, obj): ...
+    def dump_object(self, obj): ...
+    def dump_locals(self, d): ...
+    def render_object_dump(self, items, title, repr=None): ...
diff --git a/typeshed/third_party/2/werkzeug/debug/tbtools.pyi b/typeshed/third_party/2/werkzeug/debug/tbtools.pyi
new file mode 100644
index 0000000..1279409
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/debug/tbtools.pyi
@@ -0,0 +1,67 @@
+# Stubs for werkzeug.debug.tbtools (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+UTF8_COOKIE = ...  # type: Any
+system_exceptions = ...  # type: Any
+HEADER = ...  # type: Any
+FOOTER = ...  # type: Any
+PAGE_HTML = ...  # type: Any
+CONSOLE_HTML = ...  # type: Any
+SUMMARY_HTML = ...  # type: Any
+FRAME_HTML = ...  # type: Any
+SOURCE_LINE_HTML = ...  # type: Any
+
+def render_console_html(secret, evalex_trusted=True): ...
+def get_current_traceback(ignore_system_exceptions=False, show_hidden_frames=False, skip=0): ...
+
+class Line:
+    lineno = ...  # type: Any
+    code = ...  # type: Any
+    in_frame = ...  # type: Any
+    current = ...  # type: Any
+    def __init__(self, lineno, code): ...
+    def classes(self): ...
+    def render(self): ...
+
+class Traceback:
+    exc_type = ...  # type: Any
+    exc_value = ...  # type: Any
+    exception_type = ...  # type: Any
+    frames = ...  # type: Any
+    def __init__(self, exc_type, exc_value, tb): ...
+    def filter_hidden_frames(self): ...
+    def is_syntax_error(self): ...
+    def exception(self): ...
+    def log(self, logfile=None): ...
+    def paste(self): ...
+    def render_summary(self, include_title=True): ...
+    def render_full(self, evalex=False, secret=None, evalex_trusted=True): ...
+    def generate_plaintext_traceback(self): ...
+    def plaintext(self): ...
+    id = ...  # type: Any
+
+class Frame:
+    lineno = ...  # type: Any
+    function_name = ...  # type: Any
+    locals = ...  # type: Any
+    globals = ...  # type: Any
+    filename = ...  # type: Any
+    module = ...  # type: Any
+    loader = ...  # type: Any
+    code = ...  # type: Any
+    hide = ...  # type: Any
+    info = ...  # type: Any
+    def __init__(self, exc_type, exc_value, tb): ...
+    def render(self): ...
+    def render_line_context(self): ...
+    def get_annotated_lines(self): ...
+    def eval(self, code, mode=''): ...
+    def sourcelines(self): ...
+    def get_context_lines(self, context=5): ...
+    @property
+    def current_line(self): ...
+    def console(self): ...
+    id = ...  # type: Any
diff --git a/typeshed/third_party/2/werkzeug/exceptions.pyi b/typeshed/third_party/2/werkzeug/exceptions.pyi
new file mode 100644
index 0000000..d520518
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/exceptions.pyi
@@ -0,0 +1,140 @@
+# Stubs for werkzeug.exceptions (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class HTTPException(Exception):
+    code = ...  # type: Any
+    description = ...  # type: Any
+    response = ...  # type: Any
+    def __init__(self, description=None, response=None): ...
+    @classmethod
+    def wrap(cls, exception, name=None): ...
+    @property
+    def name(self): ...
+    def get_description(self, environ=None): ...
+    def get_body(self, environ=None): ...
+    def get_headers(self, environ=None): ...
+    def get_response(self, environ=None): ...
+    def __call__(self, environ, start_response): ...
+
+class BadRequest(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class ClientDisconnected(BadRequest): ...
+class SecurityError(BadRequest): ...
+class BadHost(BadRequest): ...
+
+class Unauthorized(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class Forbidden(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class NotFound(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class MethodNotAllowed(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+    valid_methods = ...  # type: Any
+    def __init__(self, valid_methods=None, description=None): ...
+    def get_headers(self, environ): ...
+
+class NotAcceptable(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class RequestTimeout(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class Conflict(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class Gone(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class LengthRequired(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class PreconditionFailed(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class RequestEntityTooLarge(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class RequestURITooLarge(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class UnsupportedMediaType(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class RequestedRangeNotSatisfiable(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class ExpectationFailed(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class ImATeapot(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class UnprocessableEntity(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class PreconditionRequired(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class TooManyRequests(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class RequestHeaderFieldsTooLarge(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class InternalServerError(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class NotImplemented(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class BadGateway(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class ServiceUnavailable(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class GatewayTimeout(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class HTTPVersionNotSupported(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class Aborter:
+    mapping = ...  # type: Any
+    def __init__(self, mapping=None, extra=None): ...
+    def __call__(self, code, *args, **kwargs): ...
diff --git a/typeshed/third_party/2/werkzeug/filesystem.pyi b/typeshed/third_party/2/werkzeug/filesystem.pyi
new file mode 100644
index 0000000..9f1b0bb
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/filesystem.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.filesystem (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+has_likely_buggy_unicode_filesystem = ...  # type: Any
+
+class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning): ...
+
+def get_filesystem_encoding(): ...
diff --git a/typeshed/third_party/2/werkzeug/formparser.pyi b/typeshed/third_party/2/werkzeug/formparser.pyi
new file mode 100644
index 0000000..4b61d27
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/formparser.pyi
@@ -0,0 +1,44 @@
+# Stubs for werkzeug.formparser (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def default_stream_factory(total_content_length, filename, content_type, content_length=None): ...
+def parse_form_data(environ, stream_factory=None, charset='', errors='', max_form_memory_size=None, max_content_length=None, cls=None, silent=True): ...
+def exhaust_stream(f): ...
+
+class FormDataParser:
+    stream_factory = ...  # type: Any
+    charset = ...  # type: Any
+    errors = ...  # type: Any
+    max_form_memory_size = ...  # type: Any
+    max_content_length = ...  # type: Any
+    cls = ...  # type: Any
+    silent = ...  # type: Any
+    def __init__(self, stream_factory=None, charset='', errors='', max_form_memory_size=None, max_content_length=None, cls=None, silent=True): ...
+    def get_parse_func(self, mimetype, options): ...
+    def parse_from_environ(self, environ): ...
+    def parse(self, stream, mimetype, content_length, options=None): ...
+    parse_functions = ...  # type: Any
+
+def is_valid_multipart_boundary(boundary): ...
+def parse_multipart_headers(iterable): ...
+
+class MultiPartParser:
+    stream_factory = ...  # type: Any
+    charset = ...  # type: Any
+    errors = ...  # type: Any
+    max_form_memory_size = ...  # type: Any
+    cls = ...  # type: Any
+    buffer_size = ...  # type: Any
+    def __init__(self, stream_factory=None, charset='', errors='', max_form_memory_size=None, cls=None, buffer_size=...): ...
+    def fail(self, message): ...
+    def get_part_encoding(self, headers): ...
+    def get_part_charset(self, headers): ...
+    def start_file_streaming(self, filename, headers, total_content_length): ...
+    def in_memory_threshold_reached(self, bytes): ...
+    def validate_boundary(self, boundary): ...
+    def parse_lines(self, file, boundary, content_length): ...
+    def parse_parts(self, file, boundary, content_length): ...
+    def parse(self, file, boundary, content_length): ...
diff --git a/typeshed/third_party/2/werkzeug/http.pyi b/typeshed/third_party/2/werkzeug/http.pyi
new file mode 100644
index 0000000..1c6e3e8
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/http.pyi
@@ -0,0 +1,41 @@
+# Stubs for werkzeug.http (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from urllib2 import parse_http_list as _parse_list_header
+
+HTTP_STATUS_CODES = ...  # type: Any
+
+def wsgi_to_bytes(data): ...
+def bytes_to_wsgi(data): ...
+def quote_header_value(value, extra_chars='', allow_token=True): ...
+def unquote_header_value(value, is_filename=False): ...
+def dump_options_header(header, options): ...
+def dump_header(iterable, allow_token=True): ...
+def parse_list_header(value): ...
+def parse_dict_header(value, cls=...): ...
+def parse_options_header(value, multiple=False): ...
+def parse_accept_header(value, cls=None): ...
+def parse_cache_control_header(value, on_update=None, cls=None): ...
+def parse_set_header(value, on_update=None): ...
+def parse_authorization_header(value): ...
+def parse_www_authenticate_header(value, on_update=None): ...
+def parse_if_range_header(value): ...
+def parse_range_header(value, make_inclusive=True): ...
+def parse_content_range_header(value, on_update=None): ...
+def quote_etag(etag, weak=False): ...
+def unquote_etag(etag): ...
+def parse_etags(value): ...
+def generate_etag(data): ...
+def parse_date(value): ...
+def cookie_date(expires=None): ...
+def http_date(timestamp=None): ...
+def is_resource_modified(environ, etag=None, data=None, last_modified=None): ...
+def remove_entity_headers(headers, allowed=...): ...
+def remove_hop_by_hop_headers(headers): ...
+def is_entity_header(header): ...
+def is_hop_by_hop_header(header): ...
+def parse_cookie(header, charset='', errors='', cls=None): ...
+def dump_cookie(key, value='', max_age=None, expires=None, path='', domain=None, secure=False, httponly=False, charset='', sync_expires=True): ...
+def is_byte_range_valid(start, stop, length): ...
diff --git a/typeshed/third_party/2/werkzeug/local.pyi b/typeshed/third_party/2/werkzeug/local.pyi
new file mode 100644
index 0000000..8b32367
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/local.pyi
@@ -0,0 +1,104 @@
+# Stubs for werkzeug.local (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def release_local(local): ...
+
+class Local:
+    def __init__(self): ...
+    def __iter__(self): ...
+    def __call__(self, proxy): ...
+    def __release_local__(self): ...
+    def __getattr__(self, name): ...
+    def __setattr__(self, name, value): ...
+    def __delattr__(self, name): ...
+
+class LocalStack:
+    def __init__(self): ...
+    def __release_local__(self): ...
+    def _get__ident_func__(self): ...
+    def _set__ident_func__(self, value): ...
+    __ident_func__ = ...  # type: Any
+    def __call__(self): ...
+    def push(self, obj): ...
+    def pop(self): ...
+    @property
+    def top(self): ...
+
+class LocalManager:
+    locals = ...  # type: Any
+    ident_func = ...  # type: Any
+    def __init__(self, locals=None, ident_func=None): ...
+    def get_ident(self): ...
+    def cleanup(self): ...
+    def make_middleware(self, app): ...
+    def middleware(self, func): ...
+
+class LocalProxy:
+    def __init__(self, local, name=None): ...
+    @property
+    def __dict__(self): ...
+    def __bool__(self): ...
+    def __unicode__(self): ...
+    def __dir__(self): ...
+    def __getattr__(self, name): ...
+    def __setitem__(self, key, value): ...
+    def __delitem__(self, key): ...
+    __getslice__ = ...  # type: Any
+    def __setslice__(self, i, j, seq): ...
+    def __delslice__(self, i, j): ...
+    __setattr__ = ...  # type: Any
+    __delattr__ = ...  # type: Any
+    __lt__ = ...  # type: Any
+    __le__ = ...  # type: Any
+    __eq__ = ...  # type: Any
+    __ne__ = ...  # type: Any
+    __gt__ = ...  # type: Any
+    __ge__ = ...  # type: Any
+    __cmp__ = ...  # type: Any
+    __hash__ = ...  # type: Any
+    __call__ = ...  # type: Any
+    __len__ = ...  # type: Any
+    __getitem__ = ...  # type: Any
+    __iter__ = ...  # type: Any
+    __contains__ = ...  # type: Any
+    __add__ = ...  # type: Any
+    __sub__ = ...  # type: Any
+    __mul__ = ...  # type: Any
+    __floordiv__ = ...  # type: Any
+    __mod__ = ...  # type: Any
+    __divmod__ = ...  # type: Any
+    __pow__ = ...  # type: Any
+    __lshift__ = ...  # type: Any
+    __rshift__ = ...  # type: Any
+    __and__ = ...  # type: Any
+    __xor__ = ...  # type: Any
+    __or__ = ...  # type: Any
+    __div__ = ...  # type: Any
+    __truediv__ = ...  # type: Any
+    __neg__ = ...  # type: Any
+    __pos__ = ...  # type: Any
+    __abs__ = ...  # type: Any
+    __invert__ = ...  # type: Any
+    __complex__ = ...  # type: Any
+    __int__ = ...  # type: Any
+    __long__ = ...  # type: Any
+    __float__ = ...  # type: Any
+    __oct__ = ...  # type: Any
+    __hex__ = ...  # type: Any
+    __index__ = ...  # type: Any
+    __coerce__ = ...  # type: Any
+    __enter__ = ...  # type: Any
+    __exit__ = ...  # type: Any
+    __radd__ = ...  # type: Any
+    __rsub__ = ...  # type: Any
+    __rmul__ = ...  # type: Any
+    __rdiv__ = ...  # type: Any
+    __rtruediv__ = ...  # type: Any
+    __rfloordiv__ = ...  # type: Any
+    __rmod__ = ...  # type: Any
+    __rdivmod__ = ...  # type: Any
+    __copy__ = ...  # type: Any
+    __deepcopy__ = ...  # type: Any
diff --git a/typeshed/third_party/2/werkzeug/posixemulation.pyi b/typeshed/third_party/2/werkzeug/posixemulation.pyi
new file mode 100644
index 0000000..5234999
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/posixemulation.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.posixemulation (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from ._compat import to_unicode as to_unicode
+from .filesystem import get_filesystem_encoding as get_filesystem_encoding
+
+can_rename_open_file = ...  # type: Any
+
+def rename(src, dst): ...
diff --git a/typeshed/third_party/2/werkzeug/routing.pyi b/typeshed/third_party/2/werkzeug/routing.pyi
new file mode 100644
index 0000000..ab94060
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/routing.pyi
@@ -0,0 +1,181 @@
+# Stubs for werkzeug.routing (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.exceptions import HTTPException
+
+def parse_converter_args(argstr): ...
+def parse_rule(rule): ...
+
+class RoutingException(Exception): ...
+
+class RequestRedirect(HTTPException, RoutingException):
+    code = ...  # type: Any
+    new_url = ...  # type: Any
+    def __init__(self, new_url): ...
+    def get_response(self, environ): ...
+
+class RequestSlash(RoutingException): ...
+
+class RequestAliasRedirect(RoutingException):
+    matched_values = ...  # type: Any
+    def __init__(self, matched_values): ...
+
+class BuildError(RoutingException, LookupError):
+    endpoint = ...  # type: Any
+    values = ...  # type: Any
+    method = ...  # type: Any
+    suggested = ...  # type: Any
+    def __init__(self, endpoint, values, method, adapter=None): ...
+    def closest_rule(self, adapter): ...
+
+class ValidationError(ValueError): ...
+
+class RuleFactory:
+    def get_rules(self, map): ...
+
+class Subdomain(RuleFactory):
+    subdomain = ...  # type: Any
+    rules = ...  # type: Any
+    def __init__(self, subdomain, rules): ...
+    def get_rules(self, map): ...
+
+class Submount(RuleFactory):
+    path = ...  # type: Any
+    rules = ...  # type: Any
+    def __init__(self, path, rules): ...
+    def get_rules(self, map): ...
+
+class EndpointPrefix(RuleFactory):
+    prefix = ...  # type: Any
+    rules = ...  # type: Any
+    def __init__(self, prefix, rules): ...
+    def get_rules(self, map): ...
+
+class RuleTemplate:
+    rules = ...  # type: Any
+    def __init__(self, rules): ...
+    def __call__(self, *args, **kwargs): ...
+
+class RuleTemplateFactory(RuleFactory):
+    rules = ...  # type: Any
+    context = ...  # type: Any
+    def __init__(self, rules, context): ...
+    def get_rules(self, map): ...
+
+class Rule(RuleFactory):
+    rule = ...  # type: Any
+    is_leaf = ...  # type: Any
+    map = ...  # type: Any
+    strict_slashes = ...  # type: Any
+    subdomain = ...  # type: Any
+    host = ...  # type: Any
+    defaults = ...  # type: Any
+    build_only = ...  # type: Any
+    alias = ...  # type: Any
+    methods = ...  # type: Any
+    endpoint = ...  # type: Any
+    redirect_to = ...  # type: Any
+    arguments = ...  # type: Any
+    def __init__(self, string, defaults=None, subdomain=None, methods=None, build_only=False, endpoint=None, strict_slashes=None, redirect_to=None, alias=False, host=None): ...
+    def empty(self): ...
+    def get_empty_kwargs(self): ...
+    def get_rules(self, map): ...
+    def refresh(self): ...
+    def bind(self, map, rebind=False): ...
+    def get_converter(self, variable_name, converter_name, args, kwargs): ...
+    def compile(self): ...
+    def match(self, path): ...
+    def build(self, values, append_unknown=True): ...
+    def provides_defaults_for(self, rule): ...
+    def suitable_for(self, values, method=None): ...
+    def match_compare_key(self): ...
+    def build_compare_key(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class BaseConverter:
+    regex = ...  # type: Any
+    weight = ...  # type: Any
+    map = ...  # type: Any
+    def __init__(self, map): ...
+    def to_python(self, value): ...
+    def to_url(self, value): ...
+
+class UnicodeConverter(BaseConverter):
+    regex = ...  # type: Any
+    def __init__(self, map, minlength=1, maxlength=None, length=None): ...
+
+class AnyConverter(BaseConverter):
+    regex = ...  # type: Any
+    def __init__(self, map, *items): ...
+
+class PathConverter(BaseConverter):
+    regex = ...  # type: Any
+    weight = ...  # type: Any
+
+class NumberConverter(BaseConverter):
+    weight = ...  # type: Any
+    fixed_digits = ...  # type: Any
+    min = ...  # type: Any
+    max = ...  # type: Any
+    def __init__(self, map, fixed_digits=0, min=None, max=None): ...
+    def to_python(self, value): ...
+    def to_url(self, value): ...
+
+class IntegerConverter(NumberConverter):
+    regex = ...  # type: Any
+    num_convert = ...  # type: Any
+
+class FloatConverter(NumberConverter):
+    regex = ...  # type: Any
+    num_convert = ...  # type: Any
+    def __init__(self, map, min=None, max=None): ...
+
+class UUIDConverter(BaseConverter):
+    regex = ...  # type: Any
+    def to_python(self, value): ...
+    def to_url(self, value): ...
+
+DEFAULT_CONVERTERS = ...  # type: Any
+
+class Map:
+    default_converters = ...  # type: Any
+    default_subdomain = ...  # type: Any
+    charset = ...  # type: Any
+    encoding_errors = ...  # type: Any
+    strict_slashes = ...  # type: Any
+    redirect_defaults = ...  # type: Any
+    host_matching = ...  # type: Any
+    converters = ...  # type: Any
+    sort_parameters = ...  # type: Any
+    sort_key = ...  # type: Any
+    def __init__(self, rules=None, default_subdomain='', charset='', strict_slashes=True, redirect_defaults=True, converters=None, sort_parameters=False, sort_key=None, encoding_errors='', host_matching=False): ...
+    def is_endpoint_expecting(self, endpoint, *arguments): ...
+    def iter_rules(self, endpoint=None): ...
+    def add(self, rulefactory): ...
+    def bind(self, server_name, script_name=None, subdomain=None, url_scheme='', default_method='', path_info=None, query_args=None): ...
+    def bind_to_environ(self, environ, server_name=None, subdomain=None): ...
+    def update(self): ...
+
+class MapAdapter:
+    map = ...  # type: Any
+    server_name = ...  # type: Any
+    script_name = ...  # type: Any
+    subdomain = ...  # type: Any
+    url_scheme = ...  # type: Any
+    path_info = ...  # type: Any
+    default_method = ...  # type: Any
+    query_args = ...  # type: Any
+    def __init__(self, map, server_name, script_name, subdomain, url_scheme, path_info, default_method, query_args=None): ...
+    def dispatch(self, view_func, path_info=None, method=None, catch_http_exceptions=False): ...
+    def match(self, path_info=None, method=None, return_rule=False, query_args=None): ...
+    def test(self, path_info=None, method=None): ...
+    def allowed_methods(self, path_info=None): ...
+    def get_host(self, domain_part): ...
+    def get_default_redirect(self, rule, method, values, query_args): ...
+    def encode_query_args(self, query_args): ...
+    def make_redirect_url(self, path_info, query_args=None, domain_part=None): ...
+    def make_alias_redirect_url(self, path, endpoint, values, method, query_args): ...
+    def build(self, endpoint, values=None, method=None, force_external=False, append_unknown=True): ...
diff --git a/typeshed/third_party/2/werkzeug/script.pyi b/typeshed/third_party/2/werkzeug/script.pyi
new file mode 100644
index 0000000..e84180e
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/script.pyi
@@ -0,0 +1,16 @@
+# Stubs for werkzeug.script (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+argument_types = ...  # type: Any
+converters = ...  # type: Any
+
+def run(namespace=None, action_prefix='', args=None): ...
+def fail(message, code=-1): ...
+def find_actions(namespace, action_prefix): ...
+def print_usage(actions): ...
+def analyse_action(func): ...
+def make_shell(init_func=None, banner=None, use_ipython=True): ...
+def make_runserver(app_factory, hostname='', port=5000, use_reloader=False, use_debugger=False, use_evalex=True, threaded=False, processes=1, static_files=None, extra_files=None, ssl_context=None): ...
diff --git a/typeshed/third_party/2/werkzeug/security.pyi b/typeshed/third_party/2/werkzeug/security.pyi
new file mode 100644
index 0000000..c3752c1
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/security.pyi
@@ -0,0 +1,16 @@
+# Stubs for werkzeug.security (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+SALT_CHARS = ...  # type: Any
+DEFAULT_PBKDF2_ITERATIONS = ...  # type: Any
+
+def pbkdf2_hex(data, salt, iterations=..., keylen=None, hashfunc=None): ...
+def pbkdf2_bin(data, salt, iterations=..., keylen=None, hashfunc=None): ...
+def safe_str_cmp(a, b): ...
+def gen_salt(length): ...
+def generate_password_hash(password, method='', salt_length=8): ...
+def check_password_hash(pwhash, password): ...
+def safe_join(directory, filename): ...
diff --git a/typeshed/third_party/2/werkzeug/serving.pyi b/typeshed/third_party/2/werkzeug/serving.pyi
new file mode 100644
index 0000000..752e3e7
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/serving.pyi
@@ -0,0 +1,83 @@
+# Stubs for werkzeug.serving (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from ._compat import PY2 as PY2
+from SocketServer import ThreadingMixIn, ForkingMixIn
+from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
+
+class _SslDummy:
+    def __getattr__(self, name): ...
+
+ssl = ...  # type: Any
+LISTEN_QUEUE = ...  # type: Any
+can_open_by_fd = ...  # type: Any
+
+class WSGIRequestHandler(BaseHTTPRequestHandler):
+    @property
+    def server_version(self): ...
+    def make_environ(self): ...
+    environ = ...  # type: Any
+    close_connection = ...  # type: Any
+    def run_wsgi(self): ...
+    def handle(self): ...
+    def initiate_shutdown(self): ...
+    def connection_dropped(self, error, environ=None): ...
+    raw_requestline = ...  # type: Any
+    def handle_one_request(self): ...
+    def send_response(self, code, message=None): ...
+    def version_string(self): ...
+    def address_string(self): ...
+    def log_request(self, code='', size=''): ...
+    def log_error(self, *args): ...
+    def log_message(self, format, *args): ...
+    def log(self, type, message, *args): ...
+
+BaseRequestHandler = ...  # type: Any
+
+def generate_adhoc_ssl_pair(cn=None): ...
+def make_ssl_devcert(base_path, host=None, cn=None): ...
+def generate_adhoc_ssl_context(): ...
+def load_ssl_context(cert_file, pkey_file=None, protocol=None): ...
+
+class _SSLContext:
+    def __init__(self, protocol): ...
+    def load_cert_chain(self, certfile, keyfile=None, password=None): ...
+    def wrap_socket(self, sock, **kwargs): ...
+
+def is_ssl_error(error=None): ...
+def select_ip_version(host, port): ...
+
+class BaseWSGIServer(HTTPServer):
+    multithread = ...  # type: Any
+    multiprocess = ...  # type: Any
+    request_queue_size = ...  # type: Any
+    address_family = ...  # type: Any
+    app = ...  # type: Any
+    passthrough_errors = ...  # type: Any
+    shutdown_signal = ...  # type: Any
+    host = ...  # type: Any
+    port = ...  # type: Any
+    socket = ...  # type: Any
+    server_address = ...  # type: Any
+    ssl_context = ...  # type: Any
+    def __init__(self, host, port, app, handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+    def log(self, type, message, *args): ...
+    def serve_forever(self): ...
+    def handle_error(self, request, client_address): ...
+    def get_request(self): ...
+
+class ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer):
+    multithread = ...  # type: Any
+
+class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer):
+    multiprocess = ...  # type: Any
+    max_children = ...  # type: Any
+    def __init__(self, host, port, app, processes=40, handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+
+def make_server(host=None, port=None, app=None, threaded=False, processes=1, request_handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+def is_running_from_reloader(): ...
+def run_simple(hostname, port, application, use_reloader=False, use_debugger=False, use_evalex=True, extra_files=None, reloader_interval=1, reloader_type='', threaded=False, processes=1, request_handler=None, static_files=None, passthrough_errors=False, ssl_context=None): ...
+def run_with_reloader(*args, **kwargs): ...
+def main(): ...
diff --git a/typeshed/third_party/2/werkzeug/test.pyi b/typeshed/third_party/2/werkzeug/test.pyi
new file mode 100644
index 0000000..89315ca
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/test.pyi
@@ -0,0 +1,85 @@
+# Stubs for werkzeug.test (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from urllib2 import Request as U2Request
+from cookielib import CookieJar
+
+def stream_encode_multipart(values, use_tempfile=True, threshold=..., boundary=None, charset=''): ...
+def encode_multipart(values, boundary=None, charset=''): ...
+def File(fd, filename=None, mimetype=None): ...
+
+class _TestCookieHeaders:
+    headers = ...  # type: Any
+    def __init__(self, headers): ...
+    def getheaders(self, name): ...
+    def get_all(self, name, default=None): ...
+
+class _TestCookieResponse:
+    headers = ...  # type: Any
+    def __init__(self, headers): ...
+    def info(self): ...
+
+class _TestCookieJar(CookieJar):
+    def inject_wsgi(self, environ): ...
+    def extract_wsgi(self, environ, headers): ...
+
+class EnvironBuilder:
+    server_protocol = ...  # type: Any
+    wsgi_version = ...  # type: Any
+    request_class = ...  # type: Any
+    charset = ...  # type: Any
+    path = ...  # type: Any
+    base_url = ...  # type: Any
+    query_string = ...  # type: Any
+    args = ...  # type: Any
+    method = ...  # type: Any
+    headers = ...  # type: Any
+    content_type = ...  # type: Any
+    errors_stream = ...  # type: Any
+    multithread = ...  # type: Any
+    multiprocess = ...  # type: Any
+    run_once = ...  # type: Any
+    environ_base = ...  # type: Any
+    environ_overrides = ...  # type: Any
+    input_stream = ...  # type: Any
+    content_length = ...  # type: Any
+    closed = ...  # type: Any
+    def __init__(self, path='', base_url=None, query_string=None, method='', input_stream=None, content_type=None, content_length=None, errors_stream=None, multithread=False, multiprocess=False, run_once=False, headers=None, data=None, environ_base=None, environ_overrides=None, charset=''): ...
+    def form_property(name, storage, doc): ...
+    form = ...  # type: Any
+    files = ...  # type: Any
+    @property
+    def server_name(self): ...
+    @property
+    def server_port(self): ...
+    def __del__(self): ...
+    def close(self): ...
+    def get_environ(self): ...
+    def get_request(self, cls=None): ...
+
+class ClientRedirectError(Exception): ...
+
+class Client:
+    application = ...  # type: Any
+    response_wrapper = ...  # type: Any
+    cookie_jar = ...  # type: Any
+    allow_subdomain_redirects = ...  # type: Any
+    def __init__(self, application, response_wrapper=None, use_cookies=True, allow_subdomain_redirects=False): ...
+    def set_cookie(self, server_name, key, value='', max_age=None, expires=None, path='', domain=None, secure=None, httponly=False, charset=''): ...
+    def delete_cookie(self, server_name, key, path='', domain=None): ...
+    def run_wsgi_app(self, environ, buffered=False): ...
+    def resolve_redirect(self, response, new_location, environ, buffered=False): ...
+    def open(self, *args, **kwargs): ...
+    def get(self, *args, **kw): ...
+    def patch(self, *args, **kw): ...
+    def post(self, *args, **kw): ...
+    def head(self, *args, **kw): ...
+    def put(self, *args, **kw): ...
+    def delete(self, *args, **kw): ...
+    def options(self, *args, **kw): ...
+    def trace(self, *args, **kw): ...
+
+def create_environ(*args, **kwargs): ...
+def run_wsgi_app(app, environ, buffered=False): ...
diff --git a/typeshed/third_party/2/werkzeug/testapp.pyi b/typeshed/third_party/2/werkzeug/testapp.pyi
new file mode 100644
index 0000000..3a85843
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/testapp.pyi
@@ -0,0 +1,13 @@
+# Stubs for werkzeug.testapp (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response
+
+logo = ...  # type: Any
+TEMPLATE = ...  # type: Any
+
+def iter_sys_path(): ...
+def render_testapp(req): ...
+def test_app(environ, start_response): ...
diff --git a/typeshed/third_party/2/werkzeug/urls.pyi b/typeshed/third_party/2/werkzeug/urls.pyi
new file mode 100644
index 0000000..5f55e12
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/urls.pyi
@@ -0,0 +1,69 @@
+# Stubs for werkzeug.urls (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from collections import namedtuple
+from typing import Any
+
+_URLTuple = namedtuple(
+    '_URLTuple',
+    ['scheme', 'netloc', 'path', 'query', 'fragment']
+)
+
+class BaseURL(_URLTuple):
+    def replace(self, **kwargs): ...
+    @property
+    def host(self): ...
+    @property
+    def ascii_host(self): ...
+    @property
+    def port(self): ...
+    @property
+    def auth(self): ...
+    @property
+    def username(self): ...
+    @property
+    def raw_username(self): ...
+    @property
+    def password(self): ...
+    @property
+    def raw_password(self): ...
+    def decode_query(self, *args, **kwargs): ...
+    def join(self, *args, **kwargs): ...
+    def to_url(self): ...
+    def decode_netloc(self): ...
+    def to_uri_tuple(self): ...
+    def to_iri_tuple(self): ...
+    def get_file_location(self, pathformat=None): ...
+
+class URL(BaseURL):
+    def encode_netloc(self): ...
+    def encode(self, charset='', errors=''): ...
+
+class BytesURL(BaseURL):
+    def encode_netloc(self): ...
+    def decode(self, charset='', errors=''): ...
+
+def url_parse(url, scheme=None, allow_fragments=True): ...
+def url_quote(string, charset='', errors='', safe='', unsafe=''): ...
+def url_quote_plus(string, charset='', errors='', safe=''): ...
+def url_unparse(components): ...
+def url_unquote(string, charset='', errors='', unsafe=''): ...
+def url_unquote_plus(s, charset='', errors=''): ...
+def url_fix(s, charset=''): ...
+def uri_to_iri(uri, charset='', errors=''): ...
+def iri_to_uri(iri, charset='', errors='', safe_conversion=False): ...
+def url_decode(s, charset='', decode_keys=False, include_empty=True, errors='', separator='', cls=None): ...
+def url_decode_stream(stream, charset='', decode_keys=False, include_empty=True, errors='', separator='', cls=None, limit=None, return_iterator=False): ...
+def url_encode(obj, charset='', encode_keys=False, sort=False, key=None, separator=''): ...
+def url_encode_stream(obj, stream=None, charset='', encode_keys=False, sort=False, key=None, separator=''): ...
+def url_join(base, url, allow_fragments=True): ...
+
+class Href:
+    base = ...  # type: Any
+    charset = ...  # type: Any
+    sort = ...  # type: Any
+    key = ...  # type: Any
+    def __init__(self, base='', charset='', sort=False, key=None): ...
+    def __getattr__(self, name): ...
+    def __call__(self, *path, **query): ...
diff --git a/typeshed/third_party/2/werkzeug/useragents.pyi b/typeshed/third_party/2/werkzeug/useragents.pyi
new file mode 100644
index 0000000..96b262a
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/useragents.pyi
@@ -0,0 +1,18 @@
+# Stubs for werkzeug.useragents (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class UserAgentParser:
+    platforms = ...  # type: Any
+    browsers = ...  # type: Any
+    def __init__(self): ...
+    def __call__(self, user_agent): ...
+
+class UserAgent:
+    string = ...  # type: Any
+    def __init__(self, environ_or_string): ...
+    def to_header(self): ...
+    def __nonzero__(self): ...
+    __bool__ = ...  # type: Any
diff --git a/typeshed/third_party/2/werkzeug/utils.pyi b/typeshed/third_party/2/werkzeug/utils.pyi
new file mode 100644
index 0000000..ff7fd39
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/utils.pyi
@@ -0,0 +1,53 @@
+# Stubs for werkzeug.utils (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug._internal import _DictAccessorProperty
+
+class cached_property(property):
+    __name__ = ...  # type: Any
+    __module__ = ...  # type: Any
+    __doc__ = ...  # type: Any
+    func = ...  # type: Any
+    def __init__(self, func, name=None, doc=None): ...
+    def __set__(self, obj, value): ...
+    def __get__(self, obj, type=None): ...
+
+class environ_property(_DictAccessorProperty):
+    read_only = ...  # type: Any
+    def lookup(self, obj): ...
+
+class header_property(_DictAccessorProperty):
+    def lookup(self, obj): ...
+
+class HTMLBuilder:
+    def __init__(self, dialect): ...
+    def __call__(self, s): ...
+    def __getattr__(self, tag): ...
+
+html = ...  # type: Any
+xhtml = ...  # type: Any
+
+def get_content_type(mimetype, charset): ...
+def format_string(string, context): ...
+def secure_filename(filename): ...
+def escape(s, quote=None): ...
+def unescape(s): ...
+def redirect(location, code=302, Response=None): ...
+def append_slash_redirect(environ, code=301): ...
+def import_string(import_name, silent=False): ...
+def find_modules(import_path, include_packages=False, recursive=False): ...
+def validate_arguments(func, args, kwargs, drop_extra=True): ...
+def bind_arguments(func, args, kwargs): ...
+
+class ArgumentValidationError(ValueError):
+    missing = ...  # type: Any
+    extra = ...  # type: Any
+    extra_positional = ...  # type: Any
+    def __init__(self, missing=None, extra=None, extra_positional=None): ...
+
+class ImportStringError(ImportError):
+    import_name = ...  # type: Any
+    exception = ...  # type: Any
+    def __init__(self, import_name, exception): ...
diff --git a/typeshed/third_party/2/werkzeug/wrappers.pyi b/typeshed/third_party/2/werkzeug/wrappers.pyi
new file mode 100644
index 0000000..7924bcb
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/wrappers.pyi
@@ -0,0 +1,194 @@
+# Stubs for werkzeug.wrappers (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class BaseRequest:
+    charset = ...  # type: Any
+    encoding_errors = ...  # type: Any
+    max_content_length = ...  # type: Any
+    max_form_memory_size = ...  # type: Any
+    parameter_storage_class = ...  # type: Any
+    list_storage_class = ...  # type: Any
+    dict_storage_class = ...  # type: Any
+    form_data_parser_class = ...  # type: Any
+    trusted_hosts = ...  # type: Any
+    disable_data_descriptor = ...  # type: Any
+    environ = ...  # type: Any
+    shallow = ...  # type: Any
+    def __init__(self, environ, populate_request=True, shallow=False): ...
+    @property
+    def url_charset(self): ...
+    @classmethod
+    def from_values(cls, *args, **kwargs): ...
+    @classmethod
+    def application(cls, f): ...
+    @property
+    def want_form_data_parsed(self): ...
+    def make_form_data_parser(self): ...
+    def close(self): ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_value, tb): ...
+    def stream(self): ...
+    input_stream = ...  # type: Any
+    def args(self): ...
+    def data(self): ...
+    def get_data(self, cache=True, as_text=False, parse_form_data=False): ...
+    def form(self): ...
+    def values(self): ...
+    def files(self): ...
+    def cookies(self): ...
+    def headers(self): ...
+    def path(self): ...
+    def full_path(self): ...
+    def script_root(self): ...
+    def url(self): ...
+    def base_url(self): ...
+    def url_root(self): ...
+    def host_url(self): ...
+    def host(self): ...
+    query_string = ...  # type: Any
+    method = ...  # type: Any
+    def access_route(self): ...
+    @property
+    def remote_addr(self): ...
+    remote_user = ...  # type: Any
+    scheme = ...  # type: Any
+    is_xhr = ...  # type: Any
+    is_secure = ...  # type: Any
+    is_multithread = ...  # type: Any
+    is_multiprocess = ...  # type: Any
+    is_run_once = ...  # type: Any
+
+class BaseResponse:
+    charset = ...  # type: Any
+    default_status = ...  # type: Any
+    default_mimetype = ...  # type: Any
+    implicit_sequence_conversion = ...  # type: Any
+    autocorrect_location_header = ...  # type: Any
+    automatically_set_content_length = ...  # type: Any
+    headers = ...  # type: Any
+    status_code = ...  # type: Any
+    status = ...  # type: Any
+    direct_passthrough = ...  # type: Any
+    response = ...  # type: Any
+    def __init__(self, response=None, status=None, headers=None, mimetype=None, content_type=None, direct_passthrough=False): ...
+    def call_on_close(self, func): ...
+    @classmethod
+    def force_type(cls, response, environ=None): ...
+    @classmethod
+    def from_app(cls, app, environ, buffered=False): ...
+    def get_data(self, as_text=False): ...
+    def set_data(self, value): ...
+    data = ...  # type: Any
+    def calculate_content_length(self): ...
+    def make_sequence(self): ...
+    def iter_encoded(self): ...
+    def set_cookie(self, key, value='', max_age=None, expires=None, path='', domain=None, secure=False, httponly=False): ...
+    def delete_cookie(self, key, path='', domain=None): ...
+    @property
+    def is_streamed(self): ...
+    @property
+    def is_sequence(self): ...
+    def close(self): ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_value, tb): ...
+    def freeze(self): ...
+    def get_wsgi_headers(self, environ): ...
+    def get_app_iter(self, environ): ...
+    def get_wsgi_response(self, environ): ...
+    def __call__(self, environ, start_response): ...
+
+class AcceptMixin:
+    def accept_mimetypes(self): ...
+    def accept_charsets(self): ...
+    def accept_encodings(self): ...
+    def accept_languages(self): ...
+
+class ETagRequestMixin:
+    def cache_control(self): ...
+    def if_match(self): ...
+    def if_none_match(self): ...
+    def if_modified_since(self): ...
+    def if_unmodified_since(self): ...
+    def if_range(self): ...
+    def range(self): ...
+
+class UserAgentMixin:
+    def user_agent(self): ...
+
+class AuthorizationMixin:
+    def authorization(self): ...
+
+class StreamOnlyMixin:
+    disable_data_descriptor = ...  # type: Any
+    want_form_data_parsed = ...  # type: Any
+
+class ETagResponseMixin:
+    @property
+    def cache_control(self): ...
+    status_code = ...  # type: Any
+    def make_conditional(self, request_or_environ, accept_ranges=False, complete_length=None): ...
+    def add_etag(self, overwrite=False, weak=False): ...
+    def set_etag(self, etag, weak=False): ...
+    def get_etag(self): ...
+    def freeze(self, no_etag=False): ...
+    accept_ranges = ...  # type: Any
+    content_range = ...  # type: Any
+
+class ResponseStream:
+    mode = ...  # type: Any
+    response = ...  # type: Any
+    closed = ...  # type: Any
+    def __init__(self, response): ...
+    def write(self, value): ...
+    def writelines(self, seq): ...
+    def close(self): ...
+    def flush(self): ...
+    def isatty(self): ...
+    @property
+    def encoding(self): ...
+
+class ResponseStreamMixin:
+    def stream(self): ...
+
+class CommonRequestDescriptorsMixin:
+    content_type = ...  # type: Any
+    def content_length(self): ...
+    content_encoding = ...  # type: Any
+    content_md5 = ...  # type: Any
+    referrer = ...  # type: Any
+    date = ...  # type: Any
+    max_forwards = ...  # type: Any
+    @property
+    def mimetype(self): ...
+    @property
+    def mimetype_params(self): ...
+    def pragma(self): ...
+
+class CommonResponseDescriptorsMixin:
+    mimetype = ...  # type: Any
+    mimetype_params = ...  # type: Any
+    location = ...  # type: Any
+    age = ...  # type: Any
+    content_type = ...  # type: Any
+    content_length = ...  # type: Any
+    content_location = ...  # type: Any
+    content_encoding = ...  # type: Any
+    content_md5 = ...  # type: Any
+    date = ...  # type: Any
+    expires = ...  # type: Any
+    last_modified = ...  # type: Any
+    retry_after = ...  # type: Any
+    vary = ...  # type: Any
+    content_language = ...  # type: Any
+    allow = ...  # type: Any
+
+class WWWAuthenticateMixin:
+    @property
+    def www_authenticate(self): ...
+
+class Request(BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthorizationMixin, CommonRequestDescriptorsMixin): ...
+class PlainRequest(StreamOnlyMixin, Request): ...
+class Response(ETagResponseMixin, BaseResponse, ResponseStreamMixin, CommonResponseDescriptorsMixin, WWWAuthenticateMixin): ...   # FIXME: This is invalid but works around https://github.com/pallets/werkzeug/issues/1052
diff --git a/typeshed/third_party/2/werkzeug/wsgi.pyi b/typeshed/third_party/2/werkzeug/wsgi.pyi
new file mode 100644
index 0000000..9c4d005
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/wsgi.pyi
@@ -0,0 +1,88 @@
+# Stubs for werkzeug.wsgi (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def responder(f): ...
+def get_current_url(environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None): ...
+def host_is_trusted(hostname, trusted_list): ...
+def get_host(environ, trusted_hosts=None): ...
+def get_content_length(environ): ...
+def get_input_stream(environ, safe_fallback=True): ...
+def get_query_string(environ): ...
+def get_path_info(environ, charset='', errors=''): ...
+def get_script_name(environ, charset='', errors=''): ...
+def pop_path_info(environ, charset='', errors=''): ...
+def peek_path_info(environ, charset='', errors=''): ...
+def extract_path_info(environ_or_baseurl, path_or_url, charset='', errors='', collapse_http_schemes=True): ...
+
+class SharedDataMiddleware:
+    app = ...  # type: Any
+    exports = ...  # type: Any
+    cache = ...  # type: Any
+    cache_timeout = ...  # type: Any
+    fallback_mimetype = ...  # type: Any
+    def __init__(self, app, exports, disallow=None, cache=True, cache_timeout=..., fallback_mimetype=''): ...
+    def is_allowed(self, filename): ...
+    def get_file_loader(self, filename): ...
+    def get_package_loader(self, package, package_path): ...
+    def get_directory_loader(self, directory): ...
+    def generate_etag(self, mtime, file_size, real_filename): ...
+    def __call__(self, environ, start_response): ...
+
+class DispatcherMiddleware:
+    app = ...  # type: Any
+    mounts = ...  # type: Any
+    def __init__(self, app, mounts=None): ...
+    def __call__(self, environ, start_response): ...
+
+class ClosingIterator:
+    def __init__(self, iterable, callbacks=None): ...
+    def __iter__(self): ...
+    def __next__(self): ...
+    def close(self): ...
+
+def wrap_file(environ, file, buffer_size=8192): ...
+
+class FileWrapper:
+    file = ...  # type: Any
+    buffer_size = ...  # type: Any
+    def __init__(self, file, buffer_size=8192): ...
+    def close(self): ...
+    def seekable(self): ...
+    def seek(self, *args): ...
+    def tell(self): ...
+    def __iter__(self): ...
+    def __next__(self): ...
+
+class _RangeWrapper:
+    iterable = ...  # type: Any
+    byte_range = ...  # type: Any
+    start_byte = ...  # type: Any
+    end_byte = ...  # type: Any
+    read_length = ...  # type: Any
+    seekable = ...  # type: Any
+    end_reached = ...  # type: Any
+    def __init__(self, iterable, start_byte=0, byte_range=None): ...
+    def __iter__(self): ...
+    def __next__(self): ...
+    def close(self): ...
+
+def make_line_iter(stream, limit=None, buffer_size=..., cap_at_buffer=False): ...
+def make_chunk_iter(stream, separator, limit=None, buffer_size=..., cap_at_buffer=False): ...
+
+class LimitedStream:
+    limit = ...  # type: Any
+    def __init__(self, stream, limit): ...
+    def __iter__(self): ...
+    @property
+    def is_exhausted(self): ...
+    def on_exhausted(self): ...
+    def on_disconnect(self): ...
+    def exhaust(self, chunk_size=...): ...
+    def read(self, size=None): ...
+    def readline(self, size=None): ...
+    def readlines(self, size=None): ...
+    def tell(self): ...
+    def __next__(self): ...
diff --git a/typeshed/third_party/2/yaml/__init__.pyi b/typeshed/third_party/2/yaml/__init__.pyi
new file mode 100644
index 0000000..6efac20
--- /dev/null
+++ b/typeshed/third_party/2/yaml/__init__.pyi
@@ -0,0 +1,51 @@
+# Stubs for yaml (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+# from yaml.error import *
+# from yaml.tokens import *
+# from yaml.events import *
+# from yaml.nodes import *
+# from yaml.loader import *
+# from yaml.dumper import *
+# TODO: stubs for cyaml?
+# from cyaml import *
+
+__with_libyaml__ = ...  # type: Any
+
+def scan(stream, Loader=...): ...
+def parse(stream, Loader=...): ...
+def compose(stream, Loader=...): ...
+def compose_all(stream, Loader=...): ...
+def load(stream, Loader=...): ...
+def load_all(stream, Loader=...): ...
+def safe_load(stream): ...
+def safe_load_all(stream): ...
+def emit(events, stream=..., Dumper=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=...): ...
+def serialize_all(nodes, stream=..., Dumper=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=..., encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...): ...
+def serialize(node, stream=..., Dumper=..., **kwds): ...
+def dump_all(documents, stream=..., Dumper=..., default_style=..., default_flow_style=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=..., encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...): ...
+def dump(data, stream=..., Dumper=..., **kwds): ...
+def safe_dump_all(documents, stream=..., **kwds): ...
+def safe_dump(data, stream=..., **kwds): ...
+def add_implicit_resolver(tag, regexp, first=..., Loader=..., Dumper=...): ...
+def add_path_resolver(tag, path, kind=..., Loader=..., Dumper=...): ...
+def add_constructor(tag, constructor, Loader=...): ...
+def add_multi_constructor(tag_prefix, multi_constructor, Loader=...): ...
+def add_representer(data_type, representer, Dumper=...): ...
+def add_multi_representer(data_type, multi_representer, Dumper=...): ...
+
+class YAMLObjectMetaclass(type):
+    def __init__(cls, name, bases, kwds) -> None: ...
+
+class YAMLObject:
+    __metaclass__ = ...  # type: Any
+    yaml_loader = ...  # type: Any
+    yaml_dumper = ...  # type: Any
+    yaml_tag = ...  # type: Any
+    yaml_flow_style = ...  # type: Any
+    @classmethod
+    def from_yaml(cls, loader, node): ...
+    @classmethod
+    def to_yaml(cls, dumper, data): ...
diff --git a/typeshed/third_party/2/yaml/composer.pyi b/typeshed/third_party/2/yaml/composer.pyi
new file mode 100644
index 0000000..f5f7e61
--- /dev/null
+++ b/typeshed/third_party/2/yaml/composer.pyi
@@ -0,0 +1,21 @@
+# Stubs for yaml.composer (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import Mark, YAMLError, MarkedYAMLError
+from yaml.nodes import Node, ScalarNode, CollectionNode, SequenceNode, MappingNode
+
+class ComposerError(MarkedYAMLError): ...
+
+class Composer:
+    anchors = ...  # type: Any
+    def __init__(self) -> None: ...
+    def check_node(self): ...
+    def get_node(self): ...
+    def get_single_node(self): ...
+    def compose_document(self): ...
+    def compose_node(self, parent, index): ...
+    def compose_scalar_node(self, anchor): ...
+    def compose_sequence_node(self, anchor): ...
+    def compose_mapping_node(self, anchor): ...
diff --git a/typeshed/third_party/2/yaml/constructor.pyi b/typeshed/third_party/2/yaml/constructor.pyi
new file mode 100644
index 0000000..36b7124
--- /dev/null
+++ b/typeshed/third_party/2/yaml/constructor.pyi
@@ -0,0 +1,70 @@
+# Stubs for yaml.constructor (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from yaml.error import Mark, YAMLError, MarkedYAMLError
+from yaml.nodes import Node, ScalarNode, CollectionNode, SequenceNode, MappingNode
+
+from typing import Any
+
+class ConstructorError(MarkedYAMLError): ...
+
+class BaseConstructor:
+    yaml_constructors = ...  # type: Any
+    yaml_multi_constructors = ...  # type: Any
+    constructed_objects = ...  # type: Any
+    recursive_objects = ...  # type: Any
+    state_generators = ...  # type: Any
+    deep_construct = ...  # type: Any
+    def __init__(self) -> None: ...
+    def check_data(self): ...
+    def get_data(self): ...
+    def get_single_data(self): ...
+    def construct_document(self, node): ...
+    def construct_object(self, node, deep=...): ...
+    def construct_scalar(self, node): ...
+    def construct_sequence(self, node, deep=...): ...
+    def construct_mapping(self, node, deep=...): ...
+    def construct_pairs(self, node, deep=...): ...
+    def add_constructor(cls, tag, constructor): ...
+    def add_multi_constructor(cls, tag_prefix, multi_constructor): ...
+
+class SafeConstructor(BaseConstructor):
+    def construct_scalar(self, node): ...
+    def flatten_mapping(self, node): ...
+    def construct_mapping(self, node, deep=...): ...
+    def construct_yaml_null(self, node): ...
+    bool_values = ...  # type: Any
+    def construct_yaml_bool(self, node): ...
+    def construct_yaml_int(self, node): ...
+    inf_value = ...  # type: Any
+    nan_value = ...  # type: Any
+    def construct_yaml_float(self, node): ...
+    def construct_yaml_binary(self, node): ...
+    timestamp_regexp = ...  # type: Any
+    def construct_yaml_timestamp(self, node): ...
+    def construct_yaml_omap(self, node): ...
+    def construct_yaml_pairs(self, node): ...
+    def construct_yaml_set(self, node): ...
+    def construct_yaml_str(self, node): ...
+    def construct_yaml_seq(self, node): ...
+    def construct_yaml_map(self, node): ...
+    def construct_yaml_object(self, node, cls): ...
+    def construct_undefined(self, node): ...
+
+class Constructor(SafeConstructor):
+    def construct_python_str(self, node): ...
+    def construct_python_unicode(self, node): ...
+    def construct_python_long(self, node): ...
+    def construct_python_complex(self, node): ...
+    def construct_python_tuple(self, node): ...
+    def find_python_module(self, name, mark): ...
+    def find_python_name(self, name, mark): ...
+    def construct_python_name(self, suffix, node): ...
+    def construct_python_module(self, suffix, node): ...
+    class classobj: ...
+    def make_python_instance(self, suffix, node, args=..., kwds=..., newobj=...): ...
+    def set_python_instance_state(self, instance, state): ...
+    def construct_python_object(self, suffix, node): ...
+    def construct_python_object_apply(self, suffix, node, newobj=...): ...
+    def construct_python_object_new(self, suffix, node): ...
diff --git a/typeshed/third_party/2/yaml/dumper.pyi b/typeshed/third_party/2/yaml/dumper.pyi
new file mode 100644
index 0000000..85b75fb
--- /dev/null
+++ b/typeshed/third_party/2/yaml/dumper.pyi
@@ -0,0 +1,17 @@
+# Stubs for yaml.dumper (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from yaml.emitter import Emitter
+from yaml.serializer import Serializer
+from yaml.representer import BaseRepresenter, Representer, SafeRepresenter
+from yaml.resolver import BaseResolver, Resolver
+
+class BaseDumper(Emitter, Serializer, BaseRepresenter, BaseResolver):
+    def __init__(self, stream, default_style=..., default_flow_style=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=..., encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...) -> None: ...
+
+class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver):
+    def __init__(self, stream, default_style=..., default_flow_style=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=..., encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...) -> None: ...
+
+class Dumper(Emitter, Serializer, Representer, Resolver):
+    def __init__(self, stream, default_style=..., default_flow_style=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=..., encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...) -> None: ...
diff --git a/typeshed/third_party/2/yaml/emitter.pyi b/typeshed/third_party/2/yaml/emitter.pyi
new file mode 100644
index 0000000..99e72ac
--- /dev/null
+++ b/typeshed/third_party/2/yaml/emitter.pyi
@@ -0,0 +1,110 @@
+# Stubs for yaml.emitter (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import YAMLError
+
+class EmitterError(YAMLError): ...
+
+class ScalarAnalysis:
+    scalar = ...  # type: Any
+    empty = ...  # type: Any
+    multiline = ...  # type: Any
+    allow_flow_plain = ...  # type: Any
+    allow_block_plain = ...  # type: Any
+    allow_single_quoted = ...  # type: Any
+    allow_double_quoted = ...  # type: Any
+    allow_block = ...  # type: Any
+    def __init__(self, scalar, empty, multiline, allow_flow_plain, allow_block_plain, allow_single_quoted, allow_double_quoted, allow_block) -> None: ...
+
+class Emitter:
+    DEFAULT_TAG_PREFIXES = ...  # type: Any
+    stream = ...  # type: Any
+    encoding = ...  # type: Any
+    states = ...  # type: Any
+    state = ...  # type: Any
+    events = ...  # type: Any
+    event = ...  # type: Any
+    indents = ...  # type: Any
+    indent = ...  # type: Any
+    flow_level = ...  # type: Any
+    root_context = ...  # type: Any
+    sequence_context = ...  # type: Any
+    mapping_context = ...  # type: Any
+    simple_key_context = ...  # type: Any
+    line = ...  # type: Any
+    column = ...  # type: Any
+    whitespace = ...  # type: Any
+    indention = ...  # type: Any
+    open_ended = ...  # type: Any
+    canonical = ...  # type: Any
+    allow_unicode = ...  # type: Any
+    best_indent = ...  # type: Any
+    best_width = ...  # type: Any
+    best_line_break = ...  # type: Any
+    tag_prefixes = ...  # type: Any
+    prepared_anchor = ...  # type: Any
+    prepared_tag = ...  # type: Any
+    analysis = ...  # type: Any
+    style = ...  # type: Any
+    def __init__(self, stream, canonical=..., indent=..., width=..., allow_unicode=..., line_break=...) -> None: ...
+    def dispose(self): ...
+    def emit(self, event): ...
+    def need_more_events(self): ...
+    def need_events(self, count): ...
+    def increase_indent(self, flow=..., indentless=...): ...
+    def expect_stream_start(self): ...
+    def expect_nothing(self): ...
+    def expect_first_document_start(self): ...
+    def expect_document_start(self, first=...): ...
+    def expect_document_end(self): ...
+    def expect_document_root(self): ...
+    def expect_node(self, root=..., sequence=..., mapping=..., simple_key=...): ...
+    def expect_alias(self): ...
+    def expect_scalar(self): ...
+    def expect_flow_sequence(self): ...
+    def expect_first_flow_sequence_item(self): ...
+    def expect_flow_sequence_item(self): ...
+    def expect_flow_mapping(self): ...
+    def expect_first_flow_mapping_key(self): ...
+    def expect_flow_mapping_key(self): ...
+    def expect_flow_mapping_simple_value(self): ...
+    def expect_flow_mapping_value(self): ...
+    def expect_block_sequence(self): ...
+    def expect_first_block_sequence_item(self): ...
+    def expect_block_sequence_item(self, first=...): ...
+    def expect_block_mapping(self): ...
+    def expect_first_block_mapping_key(self): ...
+    def expect_block_mapping_key(self, first=...): ...
+    def expect_block_mapping_simple_value(self): ...
+    def expect_block_mapping_value(self): ...
+    def check_empty_sequence(self): ...
+    def check_empty_mapping(self): ...
+    def check_empty_document(self): ...
+    def check_simple_key(self): ...
+    def process_anchor(self, indicator): ...
+    def process_tag(self): ...
+    def choose_scalar_style(self): ...
+    def process_scalar(self): ...
+    def prepare_version(self, version): ...
+    def prepare_tag_handle(self, handle): ...
+    def prepare_tag_prefix(self, prefix): ...
+    def prepare_tag(self, tag): ...
+    def prepare_anchor(self, anchor): ...
+    def analyze_scalar(self, scalar): ...
+    def flush_stream(self): ...
+    def write_stream_start(self): ...
+    def write_stream_end(self): ...
+    def write_indicator(self, indicator, need_whitespace, whitespace=..., indention=...): ...
+    def write_indent(self): ...
+    def write_line_break(self, data=...): ...
+    def write_version_directive(self, version_text): ...
+    def write_tag_directive(self, handle_text, prefix_text): ...
+    def write_single_quoted(self, text, split=...): ...
+    ESCAPE_REPLACEMENTS = ...  # type: Any
+    def write_double_quoted(self, text, split=...): ...
+    def determine_block_hints(self, text): ...
+    def write_folded(self, text): ...
+    def write_literal(self, text): ...
+    def write_plain(self, text, split=...): ...
diff --git a/typeshed/third_party/2/yaml/error.pyi b/typeshed/third_party/2/yaml/error.pyi
new file mode 100644
index 0000000..247e25d
--- /dev/null
+++ b/typeshed/third_party/2/yaml/error.pyi
@@ -0,0 +1,25 @@
+# Stubs for yaml.error (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class Mark:
+    name = ...  # type: Any
+    index = ...  # type: Any
+    line = ...  # type: Any
+    column = ...  # type: Any
+    buffer = ...  # type: Any
+    pointer = ...  # type: Any
+    def __init__(self, name, index, line, column, buffer, pointer) -> None: ...
+    def get_snippet(self, indent=..., max_length=...): ...
+
+class YAMLError(Exception): ...
+
+class MarkedYAMLError(YAMLError):
+    context = ...  # type: Any
+    context_mark = ...  # type: Any
+    problem = ...  # type: Any
+    problem_mark = ...  # type: Any
+    note = ...  # type: Any
+    def __init__(self, context=..., context_mark=..., problem=..., problem_mark=..., note=...) -> None: ...
diff --git a/typeshed/third_party/2/yaml/events.pyi b/typeshed/third_party/2/yaml/events.pyi
new file mode 100644
index 0000000..ff5f12b
--- /dev/null
+++ b/typeshed/third_party/2/yaml/events.pyi
@@ -0,0 +1,66 @@
+# Stubs for yaml.events (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class Event:
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    def __init__(self, start_mark=..., end_mark=...) -> None: ...
+
+class NodeEvent(Event):
+    anchor = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    def __init__(self, anchor, start_mark=..., end_mark=...) -> None: ...
+
+class CollectionStartEvent(NodeEvent):
+    anchor = ...  # type: Any
+    tag = ...  # type: Any
+    implicit = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    flow_style = ...  # type: Any
+    def __init__(self, anchor, tag, implicit, start_mark=..., end_mark=..., flow_style=...) -> None: ...
+
+class CollectionEndEvent(Event): ...
+
+class StreamStartEvent(Event):
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    encoding = ...  # type: Any
+    def __init__(self, start_mark=..., end_mark=..., encoding=...) -> None: ...
+
+class StreamEndEvent(Event): ...
+
+class DocumentStartEvent(Event):
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    explicit = ...  # type: Any
+    version = ...  # type: Any
+    tags = ...  # type: Any
+    def __init__(self, start_mark=..., end_mark=..., explicit=..., version=..., tags=...) -> None: ...
+
+class DocumentEndEvent(Event):
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    explicit = ...  # type: Any
+    def __init__(self, start_mark=..., end_mark=..., explicit=...) -> None: ...
+
+class AliasEvent(NodeEvent): ...
+
+class ScalarEvent(NodeEvent):
+    anchor = ...  # type: Any
+    tag = ...  # type: Any
+    implicit = ...  # type: Any
+    value = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    style = ...  # type: Any
+    def __init__(self, anchor, tag, implicit, value, start_mark=..., end_mark=..., style=...) -> None: ...
+
+class SequenceStartEvent(CollectionStartEvent): ...
+class SequenceEndEvent(CollectionEndEvent): ...
+class MappingStartEvent(CollectionStartEvent): ...
+class MappingEndEvent(CollectionEndEvent): ...
diff --git a/typeshed/third_party/2/yaml/loader.pyi b/typeshed/third_party/2/yaml/loader.pyi
new file mode 100644
index 0000000..6d3b4c1
--- /dev/null
+++ b/typeshed/third_party/2/yaml/loader.pyi
@@ -0,0 +1,19 @@
+# Stubs for yaml.loader (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from yaml.reader import Reader
+from yaml.scanner import Scanner
+from yaml.parser import Parser
+from yaml.composer import Composer
+from yaml.constructor import BaseConstructor, SafeConstructor, Constructor
+from yaml.resolver import BaseResolver, Resolver
+
+class BaseLoader(Reader, Scanner, Parser, Composer, BaseConstructor, BaseResolver):
+    def __init__(self, stream) -> None: ...
+
+class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver):
+    def __init__(self, stream) -> None: ...
+
+class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver):
+    def __init__(self, stream) -> None: ...
diff --git a/typeshed/third_party/2/yaml/nodes.pyi b/typeshed/third_party/2/yaml/nodes.pyi
new file mode 100644
index 0000000..a4039cd
--- /dev/null
+++ b/typeshed/third_party/2/yaml/nodes.pyi
@@ -0,0 +1,35 @@
+# Stubs for yaml.nodes (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class Node:
+    tag = ...  # type: Any
+    value = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    def __init__(self, tag, value, start_mark, end_mark) -> None: ...
+
+class ScalarNode(Node):
+    id = ...  # type: Any
+    tag = ...  # type: Any
+    value = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    style = ...  # type: Any
+    def __init__(self, tag, value, start_mark=..., end_mark=..., style=...) -> None: ...
+
+class CollectionNode(Node):
+    tag = ...  # type: Any
+    value = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    flow_style = ...  # type: Any
+    def __init__(self, tag, value, start_mark=..., end_mark=..., flow_style=...) -> None: ...
+
+class SequenceNode(CollectionNode):
+    id = ...  # type: Any
+
+class MappingNode(CollectionNode):
+    id = ...  # type: Any
diff --git a/typeshed/third_party/2/yaml/parser.pyi b/typeshed/third_party/2/yaml/parser.pyi
new file mode 100644
index 0000000..ed47b39
--- /dev/null
+++ b/typeshed/third_party/2/yaml/parser.pyi
@@ -0,0 +1,48 @@
+# Stubs for yaml.parser (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import MarkedYAMLError
+
+class ParserError(MarkedYAMLError): ...
+
+class Parser:
+    DEFAULT_TAGS = ...  # type: Any
+    current_event = ...  # type: Any
+    yaml_version = ...  # type: Any
+    tag_handles = ...  # type: Any
+    states = ...  # type: Any
+    marks = ...  # type: Any
+    state = ...  # type: Any
+    def __init__(self) -> None: ...
+    def dispose(self): ...
+    def check_event(self, *choices): ...
+    def peek_event(self): ...
+    def get_event(self): ...
+    def parse_stream_start(self): ...
+    def parse_implicit_document_start(self): ...
+    def parse_document_start(self): ...
+    def parse_document_end(self): ...
+    def parse_document_content(self): ...
+    def process_directives(self): ...
+    def parse_block_node(self): ...
+    def parse_flow_node(self): ...
+    def parse_block_node_or_indentless_sequence(self): ...
+    def parse_node(self, block=..., indentless_sequence=...): ...
+    def parse_block_sequence_first_entry(self): ...
+    def parse_block_sequence_entry(self): ...
+    def parse_indentless_sequence_entry(self): ...
+    def parse_block_mapping_first_key(self): ...
+    def parse_block_mapping_key(self): ...
+    def parse_block_mapping_value(self): ...
+    def parse_flow_sequence_first_entry(self): ...
+    def parse_flow_sequence_entry(self, first=...): ...
+    def parse_flow_sequence_entry_mapping_key(self): ...
+    def parse_flow_sequence_entry_mapping_value(self): ...
+    def parse_flow_sequence_entry_mapping_end(self): ...
+    def parse_flow_mapping_first_key(self): ...
+    def parse_flow_mapping_key(self, first=...): ...
+    def parse_flow_mapping_value(self): ...
+    def parse_flow_mapping_empty_value(self): ...
+    def process_empty_scalar(self, mark): ...
diff --git a/typeshed/third_party/2/yaml/reader.pyi b/typeshed/third_party/2/yaml/reader.pyi
new file mode 100644
index 0000000..20bbc8f
--- /dev/null
+++ b/typeshed/third_party/2/yaml/reader.pyi
@@ -0,0 +1,38 @@
+# Stubs for yaml.reader (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import YAMLError
+
+class ReaderError(YAMLError):
+    name = ...  # type: Any
+    character = ...  # type: Any
+    position = ...  # type: Any
+    encoding = ...  # type: Any
+    reason = ...  # type: Any
+    def __init__(self, name, position, character, encoding, reason) -> None: ...
+
+class Reader:
+    name = ...  # type: Any
+    stream = ...  # type: Any
+    stream_pointer = ...  # type: Any
+    eof = ...  # type: Any
+    buffer = ...  # type: Any
+    pointer = ...  # type: Any
+    raw_buffer = ...  # type: Any
+    raw_decode = ...  # type: Any
+    encoding = ...  # type: Any
+    index = ...  # type: Any
+    line = ...  # type: Any
+    column = ...  # type: Any
+    def __init__(self, stream) -> None: ...
+    def peek(self, index=...): ...
+    def prefix(self, length=...): ...
+    def forward(self, length=...): ...
+    def get_mark(self): ...
+    def determine_encoding(self): ...
+    NON_PRINTABLE = ...  # type: Any
+    def check_printable(self, data): ...
+    def update(self, length): ...
+    def update_raw(self, size=...): ...
diff --git a/typeshed/third_party/2/yaml/representer.pyi b/typeshed/third_party/2/yaml/representer.pyi
new file mode 100644
index 0000000..b2a3c50
--- /dev/null
+++ b/typeshed/third_party/2/yaml/representer.pyi
@@ -0,0 +1,56 @@
+# Stubs for yaml.representer (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import YAMLError
+
+class RepresenterError(YAMLError): ...
+
+class BaseRepresenter:
+    yaml_representers = ...  # type: Any
+    yaml_multi_representers = ...  # type: Any
+    default_style = ...  # type: Any
+    default_flow_style = ...  # type: Any
+    represented_objects = ...  # type: Any
+    object_keeper = ...  # type: Any
+    alias_key = ...  # type: Any
+    def __init__(self, default_style=..., default_flow_style=...) -> None: ...
+    def represent(self, data): ...
+    def get_classobj_bases(self, cls): ...
+    def represent_data(self, data): ...
+    def add_representer(cls, data_type, representer): ...
+    def add_multi_representer(cls, data_type, representer): ...
+    def represent_scalar(self, tag, value, style=...): ...
+    def represent_sequence(self, tag, sequence, flow_style=...): ...
+    def represent_mapping(self, tag, mapping, flow_style=...): ...
+    def ignore_aliases(self, data): ...
+
+class SafeRepresenter(BaseRepresenter):
+    def ignore_aliases(self, data): ...
+    def represent_none(self, data): ...
+    def represent_str(self, data): ...
+    def represent_unicode(self, data): ...
+    def represent_bool(self, data): ...
+    def represent_int(self, data): ...
+    def represent_long(self, data): ...
+    inf_value = ...  # type: Any
+    def represent_float(self, data): ...
+    def represent_list(self, data): ...
+    def represent_dict(self, data): ...
+    def represent_set(self, data): ...
+    def represent_date(self, data): ...
+    def represent_datetime(self, data): ...
+    def represent_yaml_object(self, tag, data, cls, flow_style=...): ...
+    def represent_undefined(self, data): ...
+
+class Representer(SafeRepresenter):
+    def represent_str(self, data): ...
+    def represent_unicode(self, data): ...
+    def represent_long(self, data): ...
+    def represent_complex(self, data): ...
+    def represent_tuple(self, data): ...
+    def represent_name(self, data): ...
+    def represent_module(self, data): ...
+    def represent_instance(self, data): ...
+    def represent_object(self, data): ...
diff --git a/typeshed/third_party/2/yaml/resolver.pyi b/typeshed/third_party/2/yaml/resolver.pyi
new file mode 100644
index 0000000..0920e7c
--- /dev/null
+++ b/typeshed/third_party/2/yaml/resolver.pyi
@@ -0,0 +1,26 @@
+# Stubs for yaml.resolver (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import YAMLError
+
+class ResolverError(YAMLError): ...
+
+class BaseResolver:
+    DEFAULT_SCALAR_TAG = ...  # type: Any
+    DEFAULT_SEQUENCE_TAG = ...  # type: Any
+    DEFAULT_MAPPING_TAG = ...  # type: Any
+    yaml_implicit_resolvers = ...  # type: Any
+    yaml_path_resolvers = ...  # type: Any
+    resolver_exact_paths = ...  # type: Any
+    resolver_prefix_paths = ...  # type: Any
+    def __init__(self) -> None: ...
+    def add_implicit_resolver(cls, tag, regexp, first): ...
+    def add_path_resolver(cls, tag, path, kind=...): ...
+    def descend_resolver(self, current_node, current_index): ...
+    def ascend_resolver(self): ...
+    def check_resolver_prefix(self, depth, path, kind, current_node, current_index): ...
+    def resolve(self, kind, value, implicit): ...
+
+class Resolver(BaseResolver): ...
diff --git a/typeshed/third_party/2/yaml/scanner.pyi b/typeshed/third_party/2/yaml/scanner.pyi
new file mode 100644
index 0000000..b4058ef
--- /dev/null
+++ b/typeshed/third_party/2/yaml/scanner.pyi
@@ -0,0 +1,100 @@
+# Stubs for yaml.scanner (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import MarkedYAMLError
+
+class ScannerError(MarkedYAMLError): ...
+
+class SimpleKey:
+    token_number = ...  # type: Any
+    required = ...  # type: Any
+    index = ...  # type: Any
+    line = ...  # type: Any
+    column = ...  # type: Any
+    mark = ...  # type: Any
+    def __init__(self, token_number, required, index, line, column, mark) -> None: ...
+
+class Scanner:
+    done = ...  # type: Any
+    flow_level = ...  # type: Any
+    tokens = ...  # type: Any
+    tokens_taken = ...  # type: Any
+    indent = ...  # type: Any
+    indents = ...  # type: Any
+    allow_simple_key = ...  # type: Any
+    possible_simple_keys = ...  # type: Any
+    def __init__(self) -> None: ...
+    def check_token(self, *choices): ...
+    def peek_token(self): ...
+    def get_token(self): ...
+    def need_more_tokens(self): ...
+    def fetch_more_tokens(self): ...
+    def next_possible_simple_key(self): ...
+    def stale_possible_simple_keys(self): ...
+    def save_possible_simple_key(self): ...
+    def remove_possible_simple_key(self): ...
+    def unwind_indent(self, column): ...
+    def add_indent(self, column): ...
+    def fetch_stream_start(self): ...
+    def fetch_stream_end(self): ...
+    def fetch_directive(self): ...
+    def fetch_document_start(self): ...
+    def fetch_document_end(self): ...
+    def fetch_document_indicator(self, TokenClass): ...
+    def fetch_flow_sequence_start(self): ...
+    def fetch_flow_mapping_start(self): ...
+    def fetch_flow_collection_start(self, TokenClass): ...
+    def fetch_flow_sequence_end(self): ...
+    def fetch_flow_mapping_end(self): ...
+    def fetch_flow_collection_end(self, TokenClass): ...
+    def fetch_flow_entry(self): ...
+    def fetch_block_entry(self): ...
+    def fetch_key(self): ...
+    def fetch_value(self): ...
+    def fetch_alias(self): ...
+    def fetch_anchor(self): ...
+    def fetch_tag(self): ...
+    def fetch_literal(self): ...
+    def fetch_folded(self): ...
+    def fetch_block_scalar(self, style): ...
+    def fetch_single(self): ...
+    def fetch_double(self): ...
+    def fetch_flow_scalar(self, style): ...
+    def fetch_plain(self): ...
+    def check_directive(self): ...
+    def check_document_start(self): ...
+    def check_document_end(self): ...
+    def check_block_entry(self): ...
+    def check_key(self): ...
+    def check_value(self): ...
+    def check_plain(self): ...
+    def scan_to_next_token(self): ...
+    def scan_directive(self): ...
+    def scan_directive_name(self, start_mark): ...
+    def scan_yaml_directive_value(self, start_mark): ...
+    def scan_yaml_directive_number(self, start_mark): ...
+    def scan_tag_directive_value(self, start_mark): ...
+    def scan_tag_directive_handle(self, start_mark): ...
+    def scan_tag_directive_prefix(self, start_mark): ...
+    def scan_directive_ignored_line(self, start_mark): ...
+    def scan_anchor(self, TokenClass): ...
+    def scan_tag(self): ...
+    def scan_block_scalar(self, style): ...
+    def scan_block_scalar_indicators(self, start_mark): ...
+    def scan_block_scalar_ignored_line(self, start_mark): ...
+    def scan_block_scalar_indentation(self): ...
+    def scan_block_scalar_breaks(self, indent): ...
+    def scan_flow_scalar(self, style): ...
+    ESCAPE_REPLACEMENTS = ...  # type: Any
+    ESCAPE_CODES = ...  # type: Any
+    def scan_flow_scalar_non_spaces(self, double, start_mark): ...
+    def scan_flow_scalar_spaces(self, double, start_mark): ...
+    def scan_flow_scalar_breaks(self, double, start_mark): ...
+    def scan_plain(self): ...
+    def scan_plain_spaces(self, indent, start_mark): ...
+    def scan_tag_handle(self, name, start_mark): ...
+    def scan_tag_uri(self, name, start_mark): ...
+    def scan_uri_escapes(self, name, start_mark): ...
+    def scan_line_break(self): ...
diff --git a/typeshed/third_party/2/yaml/serializer.pyi b/typeshed/third_party/2/yaml/serializer.pyi
new file mode 100644
index 0000000..c502056
--- /dev/null
+++ b/typeshed/third_party/2/yaml/serializer.pyi
@@ -0,0 +1,27 @@
+# Stubs for yaml.serializer (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import YAMLError
+
+class SerializerError(YAMLError): ...
+
+class Serializer:
+    ANCHOR_TEMPLATE = ...  # type: Any
+    use_encoding = ...  # type: Any
+    use_explicit_start = ...  # type: Any
+    use_explicit_end = ...  # type: Any
+    use_version = ...  # type: Any
+    use_tags = ...  # type: Any
+    serialized_nodes = ...  # type: Any
+    anchors = ...  # type: Any
+    last_anchor_id = ...  # type: Any
+    closed = ...  # type: Any
+    def __init__(self, encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...) -> None: ...
+    def open(self): ...
+    def close(self): ...
+    def serialize(self, node): ...
+    def anchor_node(self, node): ...
+    def generate_anchor(self, node): ...
+    def serialize_node(self, node, parent, index): ...
diff --git a/typeshed/third_party/2/yaml/tokens.pyi b/typeshed/third_party/2/yaml/tokens.pyi
new file mode 100644
index 0000000..0d659f7
--- /dev/null
+++ b/typeshed/third_party/2/yaml/tokens.pyi
@@ -0,0 +1,97 @@
+# Stubs for yaml.tokens (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class Token:
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    def __init__(self, start_mark, end_mark) -> None: ...
+
+class DirectiveToken(Token):
+    id = ...  # type: Any
+    name = ...  # type: Any
+    value = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    def __init__(self, name, value, start_mark, end_mark) -> None: ...
+
+class DocumentStartToken(Token):
+    id = ...  # type: Any
+
+class DocumentEndToken(Token):
+    id = ...  # type: Any
+
+class StreamStartToken(Token):
+    id = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    encoding = ...  # type: Any
+    def __init__(self, start_mark=..., end_mark=..., encoding=...) -> None: ...
+
+class StreamEndToken(Token):
+    id = ...  # type: Any
+
+class BlockSequenceStartToken(Token):
+    id = ...  # type: Any
+
+class BlockMappingStartToken(Token):
+    id = ...  # type: Any
+
+class BlockEndToken(Token):
+    id = ...  # type: Any
+
+class FlowSequenceStartToken(Token):
+    id = ...  # type: Any
+
+class FlowMappingStartToken(Token):
+    id = ...  # type: Any
+
+class FlowSequenceEndToken(Token):
+    id = ...  # type: Any
+
+class FlowMappingEndToken(Token):
+    id = ...  # type: Any
+
+class KeyToken(Token):
+    id = ...  # type: Any
+
+class ValueToken(Token):
+    id = ...  # type: Any
+
+class BlockEntryToken(Token):
+    id = ...  # type: Any
+
+class FlowEntryToken(Token):
+    id = ...  # type: Any
+
+class AliasToken(Token):
+    id = ...  # type: Any
+    value = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    def __init__(self, value, start_mark, end_mark) -> None: ...
+
+class AnchorToken(Token):
+    id = ...  # type: Any
+    value = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    def __init__(self, value, start_mark, end_mark) -> None: ...
+
+class TagToken(Token):
+    id = ...  # type: Any
+    value = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    def __init__(self, value, start_mark, end_mark) -> None: ...
+
+class ScalarToken(Token):
+    id = ...  # type: Any
+    value = ...  # type: Any
+    plain = ...  # type: Any
+    start_mark = ...  # type: Any
+    end_mark = ...  # type: Any
+    style = ...  # type: Any
+    def __init__(self, value, plain, start_mark, end_mark, style=...) -> None: ...
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/AES.pyi b/typeshed/third_party/2and3/Crypto/Cipher/AES.pyi
new file mode 100644
index 0000000..45b13ab
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/AES.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.Cipher.AES (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+from .blockalgo import BlockAlgo
+
+__revision__ = ...  # type: str
+
+class AESCipher(BlockAlgo):
+    def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> AESCipher: ...
+
+MODE_ECB = ...  # type: int
+MODE_CBC = ...  # type: int
+MODE_CFB = ...  # type: int
+MODE_PGP = ...  # type: int
+MODE_OFB = ...  # type: int
+MODE_CTR = ...  # type: int
+MODE_OPENPGP = ...  # type: int
+block_size = ...  # type: int
+key_size = ...  # type: int
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/ARC2.pyi b/typeshed/third_party/2and3/Crypto/Cipher/ARC2.pyi
new file mode 100644
index 0000000..08aec54
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/ARC2.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.Cipher.ARC2 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+from .blockalgo import BlockAlgo
+
+__revision__ = ...  # type: str
+
+class RC2Cipher(BlockAlgo):
+    def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> RC2Cipher: ...
+
+MODE_ECB = ...  # type: int
+MODE_CBC = ...  # type: int
+MODE_CFB = ...  # type: int
+MODE_PGP = ...  # type: int
+MODE_OFB = ...  # type: int
+MODE_CTR = ...  # type: int
+MODE_OPENPGP = ...  # type: int
+block_size = ...  # type: int
+key_size = ...  # type: int
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/ARC4.pyi b/typeshed/third_party/2and3/Crypto/Cipher/ARC4.pyi
new file mode 100644
index 0000000..3a52539
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/ARC4.pyi
@@ -0,0 +1,19 @@
+# Stubs for Crypto.Cipher.ARC4 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+
+__revision__ = ...  # type: str
+
+class ARC4Cipher:
+    block_size = ...  # type: int
+    key_size = ...  # type: int
+    def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+    def encrypt(self, plaintext): ...
+    def decrypt(self, ciphertext): ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> ARC4Cipher: ...
+
+block_size = ...  # type: int
+key_size = ...  # type: int
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/Blowfish.pyi b/typeshed/third_party/2and3/Crypto/Cipher/Blowfish.pyi
new file mode 100644
index 0000000..546eac2
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/Blowfish.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.Cipher.Blowfish (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+from .blockalgo import BlockAlgo
+
+__revision__ = ...  # type: str
+
+class BlowfishCipher(BlockAlgo):
+    def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> BlowfishCipher: ...
+
+MODE_ECB = ...  # type: int
+MODE_CBC = ...  # type: int
+MODE_CFB = ...  # type: int
+MODE_PGP = ...  # type: int
+MODE_OFB = ...  # type: int
+MODE_CTR = ...  # type: int
+MODE_OPENPGP = ...  # type: int
+block_size = ...  # type: int
+key_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/CAST.pyi b/typeshed/third_party/2and3/Crypto/Cipher/CAST.pyi
new file mode 100644
index 0000000..f63a43b
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/CAST.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.Cipher.CAST (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+from .blockalgo import BlockAlgo
+
+__revision__ = ...  # type: str
+
+class CAST128Cipher(BlockAlgo):
+    def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> CAST128Cipher: ...
+
+MODE_ECB = ...  # type: int
+MODE_CBC = ...  # type: int
+MODE_CFB = ...  # type: int
+MODE_PGP = ...  # type: int
+MODE_OFB = ...  # type: int
+MODE_CTR = ...  # type: int
+MODE_OPENPGP = ...  # type: int
+block_size = ...  # type: int
+key_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/DES.pyi b/typeshed/third_party/2and3/Crypto/Cipher/DES.pyi
new file mode 100644
index 0000000..c2b2f5c
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/DES.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.Cipher.DES (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+from .blockalgo import BlockAlgo
+
+__revision__ = ...  # type: str
+
+class DESCipher(BlockAlgo):
+    def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> DESCipher: ...
+
+MODE_ECB = ...  # type: int
+MODE_CBC = ...  # type: int
+MODE_CFB = ...  # type: int
+MODE_PGP = ...  # type: int
+MODE_OFB = ...  # type: int
+MODE_CTR = ...  # type: int
+MODE_OPENPGP = ...  # type: int
+block_size = ...  # type: int
+key_size = ...  # type: int
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/DES3.pyi b/typeshed/third_party/2and3/Crypto/Cipher/DES3.pyi
new file mode 100644
index 0000000..f8684b7
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/DES3.pyi
@@ -0,0 +1,24 @@
+# Stubs for Crypto.Cipher.DES3 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+
+from .blockalgo import BlockAlgo
+
+__revision__ = ...  # type: str
+
+class DES3Cipher(BlockAlgo):
+    def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> DES3Cipher: ...
+
+MODE_ECB = ...  # type: int
+MODE_CBC = ...  # type: int
+MODE_CFB = ...  # type: int
+MODE_PGP = ...  # type: int
+MODE_OFB = ...  # type: int
+MODE_CTR = ...  # type: int
+MODE_OPENPGP = ...  # type: int
+block_size = ...  # type: int
+key_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_OAEP.pyi b/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_OAEP.pyi
new file mode 100644
index 0000000..4f57f48
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_OAEP.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Cipher.PKCS1_OAEP (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional, Union, Text
+
+from Crypto.PublicKey.RSA import _RSAobj
+
+class PKCS1OAEP_Cipher:
+    def __init__(self, key: _RSAobj, hashAlgo: Any, mgfunc: Any, label: Any) -> None: ...
+    def can_encrypt(self): ...
+    def can_decrypt(self): ...
+    def encrypt(self, message: Union[bytes, Text]) -> bytes: ...
+    def decrypt(self, ct: bytes) -> bytes: ...
+
+
+def new(key: _RSAobj, hashAlgo: Optional[Any] = ..., mgfunc: Optional[Any] = ..., label: Any = ...) -> PKCS1OAEP_Cipher: ...
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_v1_5.pyi b/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_v1_5.pyi
new file mode 100644
index 0000000..5d10282
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_v1_5.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Cipher.PKCS1_v1_5 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+
+from Crypto.PublicKey.RSA import _RSAobj
+
+class PKCS115_Cipher:
+    def __init__(self, key: _RSAobj) -> None: ...
+    def can_encrypt(self) -> bool: ...
+    def can_decrypt(self) -> bool: ...
+    rf = ...  # type: Any
+    def encrypt(self, message: Union[bytes, Text]) -> bytes: ...
+    def decrypt(self, ct: bytes, sentinel: Any) -> bytes: ...
+
+def new(key: _RSAobj) -> PKCS115_Cipher: ...
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/XOR.pyi b/typeshed/third_party/2and3/Crypto/Cipher/XOR.pyi
new file mode 100644
index 0000000..c131867
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/XOR.pyi
@@ -0,0 +1,20 @@
+# Stubs for Crypto.Cipher.XOR (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+
+__revision__ = ...  # type: str
+
+class XORCipher:
+    block_size = ...  # type: int
+    key_size = ...  # type: int
+    def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+    def encrypt(self, plaintext: Union[bytes, Text]) -> bytes: ...
+    def decrypt(self, ciphertext: bytes) -> bytes: ...
+
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> XORCipher: ...
+
+block_size = ...  # type: int
+key_size = ...  # type: int
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/__init__.pyi b/typeshed/third_party/2and3/Crypto/Cipher/__init__.pyi
new file mode 100644
index 0000000..3d42ce3
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/__init__.pyi
@@ -0,0 +1,15 @@
+# Stubs for Crypto.Cipher (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   AES
+#   ARC2
+#   ARC4
+#   Blowfish
+#   CAST
+#   DES
+#   DES3
+#   PKCS1_OAEP
+#   PKCS1_v1_5
+#   XOR
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/blockalgo.pyi b/typeshed/third_party/2and3/Crypto/Cipher/blockalgo.pyi
new file mode 100644
index 0000000..fa71377
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/blockalgo.pyi
@@ -0,0 +1,21 @@
+# Stubs for Crypto.Cipher.blockalgo (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+
+MODE_ECB = ...  # type: int
+MODE_CBC = ...  # type: int
+MODE_CFB = ...  # type: int
+MODE_PGP = ...  # type: int
+MODE_OFB = ...  # type: int
+MODE_CTR = ...  # type: int
+MODE_OPENPGP = ...  # type: int
+
+class BlockAlgo:
+    mode = ...  # type: int
+    block_size = ...  # type: int
+    IV = ...  # type: Any
+    def __init__(self, factory: Any, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+    def encrypt(self, plaintext: Union[bytes, Text]) -> bytes: ...
+    def decrypt(self, ciphertext: bytes) -> bytes: ...
diff --git a/typeshed/third_party/2and3/Crypto/Hash/HMAC.pyi b/typeshed/third_party/2and3/Crypto/Hash/HMAC.pyi
new file mode 100644
index 0000000..3a71ac4
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/HMAC.pyi
@@ -0,0 +1,20 @@
+# Stubs for Crypto.Hash.HMAC (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+digest_size = ...  # type: Any
+
+class HMAC:
+    digest_size = ...  # type: Any
+    digestmod = ...  # type: Any
+    outer = ...  # type: Any
+    inner = ...  # type: Any
+    def __init__(self, key, msg: Optional[Any] = ..., digestmod: Optional[Any] = ...) -> None: ...
+    def update(self, msg): ...
+    def copy(self): ...
+    def digest(self): ...
+    def hexdigest(self): ...
+
+def new(key, msg: Optional[Any] = ..., digestmod: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Hash/MD2.pyi b/typeshed/third_party/2and3/Crypto/Hash/MD2.pyi
new file mode 100644
index 0000000..4449c71
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/MD2.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.MD2 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class MD2Hash(HashAlgo):
+    oid = ...  # type: Any
+    digest_size = ...  # type: int
+    block_size = ...  # type: int
+    def __init__(self, data: Optional[Any] = ...) -> None: ...
+    def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/MD4.pyi b/typeshed/third_party/2and3/Crypto/Hash/MD4.pyi
new file mode 100644
index 0000000..b2e7ee0
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/MD4.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.MD4 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class MD4Hash(HashAlgo):
+    oid = ...  # type: Any
+    digest_size = ...  # type: int
+    block_size = ...  # type: int
+    def __init__(self, data: Optional[Any] = ...) -> None: ...
+    def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/MD5.pyi b/typeshed/third_party/2and3/Crypto/Hash/MD5.pyi
new file mode 100644
index 0000000..15f7ce4
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/MD5.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.MD5 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class MD5Hash(HashAlgo):
+    oid = ...  # type: Any
+    digest_size = ...  # type: int
+    block_size = ...  # type: int
+    def __init__(self, data: Optional[Any] = ...) -> None: ...
+    def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/RIPEMD.pyi b/typeshed/third_party/2and3/Crypto/Hash/RIPEMD.pyi
new file mode 100644
index 0000000..ba965de
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/RIPEMD.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.RIPEMD (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class RIPEMD160Hash(HashAlgo):
+    oid = ...  # type: Any
+    digest_size = ...  # type: int
+    block_size = ...  # type: int
+    def __init__(self, data: Optional[Any] = ...) -> None: ...
+    def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/SHA.pyi b/typeshed/third_party/2and3/Crypto/Hash/SHA.pyi
new file mode 100644
index 0000000..16965f7
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/SHA.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.SHA (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class SHA1Hash(HashAlgo):
+    oid = ...  # type: Any
+    digest_size = ...  # type: int
+    block_size = ...  # type: int
+    def __init__(self, data: Optional[Any] = ...) -> None: ...
+    def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/SHA224.pyi b/typeshed/third_party/2and3/Crypto/Hash/SHA224.pyi
new file mode 100644
index 0000000..e9b68d2
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/SHA224.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.SHA224 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class SHA224Hash(HashAlgo):
+    oid = ...  # type: Any
+    digest_size = ...  # type: int
+    block_size = ...  # type: int
+    def __init__(self, data: Optional[Any] = ...) -> None: ...
+    def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/SHA256.pyi b/typeshed/third_party/2and3/Crypto/Hash/SHA256.pyi
new file mode 100644
index 0000000..ca21b6f
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/SHA256.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.SHA256 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class SHA256Hash(HashAlgo):
+    oid = ...  # type: Any
+    digest_size = ...  # type: int
+    block_size = ...  # type: int
+    def __init__(self, data: Optional[Any] = ...) -> None: ...
+    def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/SHA384.pyi b/typeshed/third_party/2and3/Crypto/Hash/SHA384.pyi
new file mode 100644
index 0000000..c318eed
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/SHA384.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.SHA384 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class SHA384Hash(HashAlgo):
+    oid = ...  # type: Any
+    digest_size = ...  # type: int
+    block_size = ...  # type: int
+    def __init__(self, data: Optional[Any] = ...) -> None: ...
+    def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/SHA512.pyi b/typeshed/third_party/2and3/Crypto/Hash/SHA512.pyi
new file mode 100644
index 0000000..6239511
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/SHA512.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.SHA512 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class SHA512Hash(HashAlgo):
+    oid = ...  # type: Any
+    digest_size = ...  # type: int
+    block_size = ...  # type: int
+    def __init__(self, data: Optional[Any] = ...) -> None: ...
+    def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/__init__.pyi b/typeshed/third_party/2and3/Crypto/Hash/__init__.pyi
new file mode 100644
index 0000000..6385911
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/__init__.pyi
@@ -0,0 +1,15 @@
+# Stubs for Crypto.Hash (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   HMAC
+#   MD2
+#   MD4
+#   MD5
+#   RIPEMD
+#   SHA
+#   SHA224
+#   SHA256
+#   SHA384
+#   SHA512
diff --git a/typeshed/third_party/2and3/Crypto/Hash/hashalgo.pyi b/typeshed/third_party/2and3/Crypto/Hash/hashalgo.pyi
new file mode 100644
index 0000000..e762453
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/hashalgo.pyi
@@ -0,0 +1,15 @@
+# Stubs for Crypto.Hash.hashalgo (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class HashAlgo:
+    digest_size = ...  # type: Any
+    block_size = ...  # type: Any
+    def __init__(self, hashFactory, data: Optional[Any] = ...) -> None: ...
+    def update(self, data): ...
+    def digest(self): ...
+    def hexdigest(self): ...
+    def copy(self): ...
+    def new(self, data: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Protocol/AllOrNothing.pyi b/typeshed/third_party/2and3/Crypto/Protocol/AllOrNothing.pyi
new file mode 100644
index 0000000..300e1bf
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Protocol/AllOrNothing.pyi
@@ -0,0 +1,14 @@
+# Stubs for Crypto.Protocol.AllOrNothing (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+__revision__ = ...  # type: str
+
+def isInt(x): ...
+
+class AllOrNothing:
+    def __init__(self, ciphermodule, mode: Optional[Any] = ..., IV: Optional[Any] = ...) -> None: ...
+    def digest(self, text): ...
+    def undigest(self, blocks): ...
diff --git a/typeshed/third_party/2and3/Crypto/Protocol/Chaffing.pyi b/typeshed/third_party/2and3/Crypto/Protocol/Chaffing.pyi
new file mode 100644
index 0000000..73c1d56
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Protocol/Chaffing.pyi
@@ -0,0 +1,9 @@
+# Stubs for Crypto.Protocol.Chaffing (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+__revision__ = ...  # type: str
+
+class Chaff:
+    def __init__(self, factor: float = ..., blocksper: int = ...) -> None: ...
+    def chaff(self, blocks): ...
diff --git a/typeshed/third_party/2and3/Crypto/Protocol/KDF.pyi b/typeshed/third_party/2and3/Crypto/Protocol/KDF.pyi
new file mode 100644
index 0000000..a14b351
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Protocol/KDF.pyi
@@ -0,0 +1,11 @@
+# Stubs for Crypto.Protocol.KDF (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash import SHA as SHA1
+
+__revision__ = ...  # type: str
+
+def PBKDF1(password, salt, dkLen, count: int = ..., hashAlgo: Optional[Any] = ...): ...
+def PBKDF2(password, salt, dkLen: int = ..., count: int = ..., prf: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Protocol/__init__.pyi b/typeshed/third_party/2and3/Crypto/Protocol/__init__.pyi
new file mode 100644
index 0000000..afcab98
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Protocol/__init__.pyi
@@ -0,0 +1,8 @@
+# Stubs for Crypto.Protocol (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   AllOrNothing
+#   Chaffing
+#   KDF
diff --git a/typeshed/third_party/2and3/Crypto/PublicKey/DSA.pyi b/typeshed/third_party/2and3/Crypto/PublicKey/DSA.pyi
new file mode 100644
index 0000000..30b7b1c
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/PublicKey/DSA.pyi
@@ -0,0 +1,31 @@
+# Stubs for Crypto.PublicKey.DSA (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from .pubkey import pubkey
+
+class _DSAobj(pubkey):
+    keydata = ...  # type: Any
+    implementation = ...  # type: Any
+    key = ...  # type: Any
+    def __init__(self, implementation, key) -> None: ...
+    def __getattr__(self, attrname): ...
+    def sign(self, M, K): ...
+    def verify(self, M, signature): ...
+    def has_private(self): ...
+    def size(self): ...
+    def can_blind(self): ...
+    def can_encrypt(self): ...
+    def can_sign(self): ...
+    def publickey(self): ...
+
+class DSAImplementation:
+    error = ...  # type: Any
+    def __init__(self, **kwargs) -> None: ...
+    def generate(self, bits, randfunc: Optional[Any] = ..., progress_func: Optional[Any] = ...): ...
+    def construct(self, tup): ...
+
+generate = ...  # type: Any
+construct = ...  # type: Any
+error = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/PublicKey/ElGamal.pyi b/typeshed/third_party/2and3/Crypto/PublicKey/ElGamal.pyi
new file mode 100644
index 0000000..4ed2c5b
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/PublicKey/ElGamal.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.PublicKey.ElGamal (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+from Crypto.PublicKey.pubkey import pubkey
+from Crypto.PublicKey.pubkey import *  # noqa: F403
+
+class error(Exception): ...
+
+def generate(bits, randfunc, progress_func: Optional[Any] = ...): ...
+def construct(tup): ...
+
+class ElGamalobj(pubkey):
+    keydata = ...  # type: Any
+    def encrypt(self, plaintext, K): ...
+    def decrypt(self, ciphertext): ...
+    def sign(self, M, K): ...
+    def verify(self, M, signature): ...
+    def size(self): ...
+    def has_private(self): ...
+    def publickey(self): ...
diff --git a/typeshed/third_party/2and3/Crypto/PublicKey/RSA.pyi b/typeshed/third_party/2and3/Crypto/PublicKey/RSA.pyi
new file mode 100644
index 0000000..1fbd6ff
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/PublicKey/RSA.pyi
@@ -0,0 +1,36 @@
+# Stubs for Crypto.PublicKey.RSA (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional, Union, Text
+from .pubkey import pubkey
+
+class _RSAobj(pubkey):
+    keydata = ...  # type: Any
+    implementation = ...  # type: Any
+    key = ...  # type: Any
+    def __init__(self, implementation, key, randfunc: Optional[Any] = ...) -> None: ...
+    def __getattr__(self, attrname): ...
+    def encrypt(self, plaintext, K): ...
+    def decrypt(self, ciphertext): ...
+    def sign(self, M, K): ...
+    def verify(self, M, signature): ...
+    def has_private(self): ...
+    def size(self): ...
+    def can_blind(self): ...
+    def can_encrypt(self): ...
+    def can_sign(self): ...
+    def publickey(self): ...
+    def exportKey(self, format: str = ..., passphrase: Optional[Any] = ..., pkcs: int = ...): ...
+
+class RSAImplementation:
+    error = ...  # type: Any
+    def __init__(self, **kwargs) -> None: ...
+    def generate(self, bits, randfunc: Optional[Any] = ..., progress_func: Optional[Any] = ..., e: int = ...): ...
+    def construct(self, tup): ...
+    def importKey(self, externKey: Any, passphrase: Union[None, bytes, Text] = ...) -> _RSAobj: ...
+
+generate = ...  # type: Any
+construct = ...  # type: Any
+importKey = ...  # type: Any
+error = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/PublicKey/__init__.pyi b/typeshed/third_party/2and3/Crypto/PublicKey/__init__.pyi
new file mode 100644
index 0000000..84bc3bc
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/PublicKey/__init__.pyi
@@ -0,0 +1,8 @@
+# Stubs for Crypto.PublicKey (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   DSA
+#   ElGamal
+#   RSA
diff --git a/typeshed/third_party/2and3/Crypto/PublicKey/pubkey.pyi b/typeshed/third_party/2and3/Crypto/PublicKey/pubkey.pyi
new file mode 100644
index 0000000..dd34d69
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/PublicKey/pubkey.pyi
@@ -0,0 +1,25 @@
+# Stubs for Crypto.PublicKey.pubkey (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from Crypto.Util.number import *  # noqa: F403
+
+__revision__ = ...  # type: str
+
+class pubkey:
+    def __init__(self) -> None: ...
+    def encrypt(self, plaintext, K): ...
+    def decrypt(self, ciphertext): ...
+    def sign(self, M, K): ...
+    def verify(self, M, signature): ...
+    def validate(self, M, signature): ...
+    def blind(self, M, B): ...
+    def unblind(self, M, B): ...
+    def can_sign(self): ...
+    def can_encrypt(self): ...
+    def can_blind(self): ...
+    def size(self): ...
+    def has_private(self): ...
+    def publickey(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaAccumulator.pyi b/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaAccumulator.pyi
new file mode 100644
index 0000000..e843070
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaAccumulator.pyi
@@ -0,0 +1,29 @@
+# Stubs for Crypto.Random.Fortuna.FortunaAccumulator (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+__revision__ = ...  # type: str
+
+class FortunaPool:
+    digest_size = ...  # type: Any
+    def __init__(self) -> None: ...
+    def append(self, data): ...
+    def digest(self): ...
+    def hexdigest(self): ...
+    length = ...  # type: int
+    def reset(self): ...
+
+def which_pools(r): ...
+
+class FortunaAccumulator:
+    min_pool_size = ...  # type: int
+    reseed_interval = ...  # type: float
+    reseed_count = ...  # type: int
+    generator = ...  # type: Any
+    last_reseed = ...  # type: Any
+    pools = ...  # type: Any
+    def __init__(self) -> None: ...
+    def random_data(self, bytes): ...
+    def add_random_event(self, source_number, pool_number, data): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaGenerator.pyi b/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaGenerator.pyi
new file mode 100644
index 0000000..89d13ab
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaGenerator.pyi
@@ -0,0 +1,20 @@
+# Stubs for Crypto.Random.Fortuna.FortunaGenerator (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+__revision__ = ...  # type: str
+
+class AESGenerator:
+    block_size = ...  # type: Any
+    key_size = ...  # type: int
+    max_blocks_per_request = ...  # type: Any
+    counter = ...  # type: Any
+    key = ...  # type: Any
+    block_size_shift = ...  # type: Any
+    blocks_per_key = ...  # type: Any
+    max_bytes_per_request = ...  # type: Any
+    def __init__(self) -> None: ...
+    def reseed(self, seed): ...
+    def pseudo_random_data(self, bytes): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/Fortuna/SHAd256.pyi b/typeshed/third_party/2and3/Crypto/Random/Fortuna/SHAd256.pyi
new file mode 100644
index 0000000..5a83fd9
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/Fortuna/SHAd256.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Random.Fortuna.SHAd256 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class _SHAd256:
+    digest_size = ...  # type: Any
+    def __init__(self, internal_api_check, sha256_hash_obj) -> None: ...
+    def copy(self): ...
+    def digest(self): ...
+    def hexdigest(self): ...
+    def update(self, data): ...
+
+digest_size = ...  # type: Any
+
+def new(data: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/Fortuna/__init__.pyi b/typeshed/third_party/2and3/Crypto/Random/Fortuna/__init__.pyi
new file mode 100644
index 0000000..fd03fb2
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/Fortuna/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for Crypto.Random.Fortuna (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2and3/Crypto/Random/OSRNG/__init__.pyi b/typeshed/third_party/2and3/Crypto/Random/OSRNG/__init__.pyi
new file mode 100644
index 0000000..e73ed2e
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/OSRNG/__init__.pyi
@@ -0,0 +1,5 @@
+# Stubs for Crypto.Random.OSRNG (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+__revision__ = ...  # type: str
diff --git a/typeshed/third_party/2and3/Crypto/Random/OSRNG/fallback.pyi b/typeshed/third_party/2and3/Crypto/Random/OSRNG/fallback.pyi
new file mode 100644
index 0000000..fafc388
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/OSRNG/fallback.pyi
@@ -0,0 +1,9 @@
+# Stubs for Crypto.Random.OSRNG.fallback (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .rng_base import BaseRNG
+
+class PythonOSURandomRNG(BaseRNG):
+    name = ...  # type: str
+    def __init__(self) -> None: ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/OSRNG/posix.pyi b/typeshed/third_party/2and3/Crypto/Random/OSRNG/posix.pyi
new file mode 100644
index 0000000..c7d4613
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/OSRNG/posix.pyi
@@ -0,0 +1,10 @@
+# Stubs for Crypto.Random.OSRNG.posix (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from .rng_base import BaseRNG
+
+class DevURandomRNG(BaseRNG):
+    name = ...  # type: str
+    def __init__(self, devname: Optional[Any] = ...) -> None: ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/OSRNG/rng_base.pyi b/typeshed/third_party/2and3/Crypto/Random/OSRNG/rng_base.pyi
new file mode 100644
index 0000000..4fa634a
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/OSRNG/rng_base.pyi
@@ -0,0 +1,15 @@
+# Stubs for Crypto.Random.OSRNG.rng_base (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+__revision__ = ...  # type: str
+
+class BaseRNG:
+    closed = ...  # type: bool
+    def __init__(self) -> None: ...
+    def __del__(self): ...
+    def __enter__(self): ...
+    def __exit__(self): ...
+    def close(self): ...
+    def flush(self): ...
+    def read(self, N: int = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/__init__.pyi b/typeshed/third_party/2and3/Crypto/Random/__init__.pyi
new file mode 100644
index 0000000..d9872cb
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/__init__.pyi
@@ -0,0 +1,5 @@
+# Stubs for Crypto.Random (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def new(*args, **kwargs): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/random.pyi b/typeshed/third_party/2and3/Crypto/Random/random.pyi
new file mode 100644
index 0000000..12a2e6f
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/random.pyi
@@ -0,0 +1,21 @@
+# Stubs for Crypto.Random.random (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class StrongRandom:
+    def __init__(self, rng: Optional[Any] = ..., randfunc: Optional[Any] = ...) -> None: ...
+    def getrandbits(self, k): ...
+    def randrange(self, *args): ...
+    def randint(self, a, b): ...
+    def choice(self, seq): ...
+    def shuffle(self, x): ...
+    def sample(self, population, k): ...
+
+getrandbits = ...  # type: Any
+randrange = ...  # type: Any
+randint = ...  # type: Any
+choice = ...  # type: Any
+shuffle = ...  # type: Any
+sample = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Signature/PKCS1_PSS.pyi b/typeshed/third_party/2and3/Crypto/Signature/PKCS1_PSS.pyi
new file mode 100644
index 0000000..12edf26
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Signature/PKCS1_PSS.pyi
@@ -0,0 +1,13 @@
+# Stubs for Crypto.Signature.PKCS1_PSS (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class PSS_SigScheme:
+    def __init__(self, key, mgfunc, saltLen) -> None: ...
+    def can_sign(self): ...
+    def sign(self, mhash): ...
+    def verify(self, mhash, S): ...
+
+def new(key, mgfunc: Optional[Any] = ..., saltLen: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Signature/PKCS1_v1_5.pyi b/typeshed/third_party/2and3/Crypto/Signature/PKCS1_v1_5.pyi
new file mode 100644
index 0000000..d48d3a3
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Signature/PKCS1_v1_5.pyi
@@ -0,0 +1,12 @@
+# Stubs for Crypto.Signature.PKCS1_v1_5 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+
+class PKCS115_SigScheme:
+    def __init__(self, key) -> None: ...
+    def can_sign(self): ...
+    def sign(self, mhash): ...
+    def verify(self, mhash, S): ...
+
+def new(key): ...
diff --git a/typeshed/third_party/2and3/Crypto/Signature/__init__.pyi b/typeshed/third_party/2and3/Crypto/Signature/__init__.pyi
new file mode 100644
index 0000000..710372a
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Signature/__init__.pyi
@@ -0,0 +1,7 @@
+# Stubs for Crypto.Signature (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   PKCS1_PSS
+#   PKCS1_v1_5
diff --git a/typeshed/third_party/2and3/Crypto/Util/Counter.pyi b/typeshed/third_party/2and3/Crypto/Util/Counter.pyi
new file mode 100644
index 0000000..620c1be
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/Counter.pyi
@@ -0,0 +1,7 @@
+# Stubs for Crypto.Util.Counter (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def new(nbits, prefix: Any = ..., suffix: Any = ..., initial_value: int = ..., overflow: int = ..., little_endian: bool = ..., allow_wraparound: bool = ..., disable_shortcut: bool = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Util/RFC1751.pyi b/typeshed/third_party/2and3/Crypto/Util/RFC1751.pyi
new file mode 100644
index 0000000..abd7444
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/RFC1751.pyi
@@ -0,0 +1,13 @@
+# Stubs for Crypto.Util.RFC1751 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+__revision__ = ...  # type: str
+binary = ...  # type: Any
+
+def key_to_english(key): ...
+def english_to_key(s): ...
+
+wordlist = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Util/__init__.pyi b/typeshed/third_party/2and3/Crypto/Util/__init__.pyi
new file mode 100644
index 0000000..26f6576
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/__init__.pyi
@@ -0,0 +1,10 @@
+# Stubs for Crypto.Util (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   RFC1751
+#   asn1
+#   number
+#   randpool
+#   strxor
diff --git a/typeshed/third_party/2and3/Crypto/Util/asn1.pyi b/typeshed/third_party/2and3/Crypto/Util/asn1.pyi
new file mode 100644
index 0000000..b9227af
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/asn1.pyi
@@ -0,0 +1,49 @@
+# Stubs for Crypto.Util.asn1 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class DerObject:
+    typeTags = ...  # type: Any
+    typeTag = ...  # type: Any
+    payload = ...  # type: Any
+    def __init__(self, ASN1Type: Optional[Any] = ..., payload: Any = ...) -> None: ...
+    def isType(self, ASN1Type): ...
+    def encode(self): ...
+    def decode(self, derEle, noLeftOvers: int = ...): ...
+
+class DerInteger(DerObject):
+    value = ...  # type: Any
+    def __init__(self, value: int = ...) -> None: ...
+    payload = ...  # type: Any
+    def encode(self): ...
+    def decode(self, derEle, noLeftOvers: int = ...): ...
+
+class DerSequence(DerObject):
+    def __init__(self, startSeq: Optional[Any] = ...) -> None: ...
+    def __delitem__(self, n): ...
+    def __getitem__(self, n): ...
+    def __setitem__(self, key, value): ...
+    def __setslice__(self, i, j, sequence): ...
+    def __delslice__(self, i, j): ...
+    def __getslice__(self, i, j): ...
+    def __len__(self): ...
+    def append(self, item): ...
+    def hasInts(self): ...
+    def hasOnlyInts(self): ...
+    payload = ...  # type: Any
+    def encode(self): ...
+    def decode(self, derEle, noLeftOvers: int = ...): ...
+
+class DerOctetString(DerObject):
+    payload = ...  # type: Any
+    def __init__(self, value: Any = ...) -> None: ...
+    def decode(self, derEle, noLeftOvers: int = ...): ...
+
+class DerNull(DerObject):
+    def __init__(self) -> None: ...
+
+class DerObjectId(DerObject):
+    def __init__(self) -> None: ...
+    def decode(self, derEle, noLeftOvers: int = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Util/number.pyi b/typeshed/third_party/2and3/Crypto/Util/number.pyi
new file mode 100644
index 0000000..265f142
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/number.pyi
@@ -0,0 +1,26 @@
+# Stubs for Crypto.Util.number (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from warnings import warn as _warn
+
+__revision__ = ...  # type: str
+bignum = ...  # type: Any
+
+def size(N): ...
+def getRandomNumber(N, randfunc: Optional[Any] = ...): ...
+def getRandomInteger(N, randfunc: Optional[Any] = ...): ...
+def getRandomRange(a, b, randfunc: Optional[Any] = ...): ...
+def getRandomNBitInteger(N, randfunc: Optional[Any] = ...): ...
+def GCD(x, y): ...
+def inverse(u, v): ...
+def getPrime(N, randfunc: Optional[Any] = ...): ...
+def getStrongPrime(N, e: int = ..., false_positive_prob: float = ..., randfunc: Optional[Any] = ...): ...
+def isPrime(N, false_positive_prob: float = ..., randfunc: Optional[Any] = ...): ...
+def long_to_bytes(n, blocksize: int = ...): ...
+def bytes_to_long(s): ...
+def long2str(n, blocksize: int = ...): ...
+def str2long(s): ...
+
+sieve_base = ...  # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Util/randpool.pyi b/typeshed/third_party/2and3/Crypto/Util/randpool.pyi
new file mode 100644
index 0000000..4a5f2ac
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/randpool.pyi
@@ -0,0 +1,20 @@
+# Stubs for Crypto.Util.randpool (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+__revision__ = ...  # type: str
+
+class RandomPool:
+    bytes = ...  # type: Any
+    bits = ...  # type: Any
+    entropy = ...  # type: Any
+    def __init__(self, numbytes: int = ..., cipher: Optional[Any] = ..., hash: Optional[Any] = ..., file: Optional[Any] = ...) -> None: ...
+    def get_bytes(self, N): ...
+    def randomize(self, N: int = ...): ...
+    def stir(self, s: str = ...): ...
+    def stir_n(self, N: int = ...): ...
+    def add_event(self, s: str = ...): ...
+    def getBytes(self, N): ...
+    def addEvent(self, event, s: str = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Util/strxor.pyi b/typeshed/third_party/2and3/Crypto/Util/strxor.pyi
new file mode 100644
index 0000000..8ba57b5
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/strxor.pyi
@@ -0,0 +1,6 @@
+# Stubs for Crypto.Util.strxor (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def strxor(*args, **kwargs): ...
+def strxor_c(*args, **kwargs): ...
diff --git a/typeshed/third_party/2and3/Crypto/__init__.pyi b/typeshed/third_party/2and3/Crypto/__init__.pyi
new file mode 100644
index 0000000..7b99b04
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/__init__.pyi
@@ -0,0 +1,11 @@
+# Stubs for Crypto (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+#   Cipher
+#   Hash
+#   Protocol
+#   PublicKey
+#   Signature
+#   Util
diff --git a/typeshed/third_party/2and3/Crypto/pct_warnings.pyi b/typeshed/third_party/2and3/Crypto/pct_warnings.pyi
new file mode 100644
index 0000000..6fb4fc8
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/pct_warnings.pyi
@@ -0,0 +1,11 @@
+# Stubs for Crypto.pct_warnings (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class CryptoWarning(Warning): ...
+class CryptoDeprecationWarning(DeprecationWarning, CryptoWarning): ...
+class CryptoRuntimeWarning(RuntimeWarning, CryptoWarning): ...
+class RandomPool_DeprecationWarning(CryptoDeprecationWarning): ...
+class ClockRewindWarning(CryptoRuntimeWarning): ...
+class GetRandomNumber_DeprecationWarning(CryptoDeprecationWarning): ...
+class PowmInsecureWarning(CryptoRuntimeWarning): ...
diff --git a/typeshed/third_party/2and3/atomicwrites/__init__.pyi b/typeshed/third_party/2and3/atomicwrites/__init__.pyi
new file mode 100644
index 0000000..34d74fb
--- /dev/null
+++ b/typeshed/third_party/2and3/atomicwrites/__init__.pyi
@@ -0,0 +1,16 @@
+import contextlib
+import os
+import sys
+import tempfile
+from typing import Any, AnyStr, Callable, IO, Iterator, Text
+def replace_atomic(src: AnyStr, dst: AnyStr) -> None: ...
+def move_atomic(src: AnyStr, dst: AnyStr) -> None: ...
+class AtomicWriter(object):
+    def __init__(self, path: AnyStr, mode: Text='w', overwrite: bool=False) -> None: ...
+    def open(self) -> contextlib.ContextManager[IO]: ...
+    def _open(self, get_fileobject: Callable) -> contextlib.ContextManager[IO]: ...
+    def get_fileobject(self, dir: AnyStr=None, **kwargs) -> IO: ...
+    def sync(self, f: IO) -> None: ...
+    def commit(self, f: IO) -> None: ...
+    def rollback(self, f: IO) -> None: ...
+def atomic_write(path: AnyStr, writer_cls: type=AtomicWriter, **cls_kwargs) -> contextlib.ContextManager[IO]: ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2and3/backports/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2and3/backports/__init__.pyi
diff --git a/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi b/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi
new file mode 100644
index 0000000..c219980
--- /dev/null
+++ b/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi
@@ -0,0 +1,3 @@
+class CertificateError(ValueError): ...
+
+def match_hostname(cert, hostname): ...
diff --git a/typeshed/third_party/2and3/backports_abc.pyi b/typeshed/third_party/2and3/backports_abc.pyi
new file mode 100644
index 0000000..1b4c3a2
--- /dev/null
+++ b/typeshed/third_party/2and3/backports_abc.pyi
@@ -0,0 +1,19 @@
+# Stubs for backports_abc (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def mk_gen(): ...
+def mk_awaitable(): ...
+def mk_coroutine(): ...
+
+Generator = ...  # type: Any
+Awaitable = ...  # type: Any
+Coroutine = ...  # type: Any
+
+def isawaitable(obj): ...
+
+PATCHED = ...  # type: Any
+
+def patch(patch_inspect=True): ...
diff --git a/typeshed/third_party/2and3/boto/__init__.pyi b/typeshed/third_party/2and3/boto/__init__.pyi
new file mode 100644
index 0000000..a95c1df
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/__init__.pyi
@@ -0,0 +1,80 @@
+# Stubs for boto (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional, Text
+import logging
+
+from .s3.connection import S3Connection
+
+Version = ...  # type: Any
+UserAgent = ...  # type: Any
+config = ...  # type: Any
+BUCKET_NAME_RE = ...  # type: Any
+TOO_LONG_DNS_NAME_COMP = ...  # type: Any
+GENERATION_RE = ...  # type: Any
+VERSION_RE = ...  # type: Any
+ENDPOINTS_PATH = ...  # type: Any
+
+def init_logging(): ...
+
+class NullHandler(logging.Handler):
+    def emit(self, record): ...
+
+log = ...  # type: Any
+perflog = ...  # type: Any
+
+def set_file_logger(name, filepath, level: Any = ..., format_string: Optional[Any] = ...): ...
+def set_stream_logger(name, level: Any = ..., format_string: Optional[Any] = ...): ...
+def connect_sqs(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_s3(aws_access_key_id: Optional[Text] = ..., aws_secret_access_key: Optional[Text] = ..., **kwargs) -> S3Connection: ...
+def connect_gs(gs_access_key_id: Optional[Any] = ..., gs_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_ec2(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_elb(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_autoscale(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudwatch(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_sdb(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_fps(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_mturk(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudfront(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_vpc(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_rds(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_rds2(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_emr(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_sns(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_iam(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_route53(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudformation(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_euca(host: Optional[Any] = ..., aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., port: int = ..., path: str = ..., is_secure: bool = ..., **kwargs): ...
+def connect_glacier(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_ec2_endpoint(url, aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_walrus(host: Optional[Any] = ..., aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., port: int = ..., path: str = ..., is_secure: bool = ..., **kwargs): ...
+def connect_ses(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_sts(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_ia(ia_access_key_id: Optional[Any] = ..., ia_secret_access_key: Optional[Any] = ..., is_secure: bool = ..., **kwargs): ...
+def connect_dynamodb(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_swf(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudsearch(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudsearch2(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., sign_request: bool = ..., **kwargs): ...
+def connect_cloudsearchdomain(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_beanstalk(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_elastictranscoder(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_opsworks(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_redshift(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_support(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudtrail(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_directconnect(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_kinesis(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_logs(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_route53domains(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cognito_identity(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cognito_sync(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_kms(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_awslambda(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_codedeploy(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_configservice(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudhsm(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_ec2containerservice(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_machinelearning(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def storage_uri(uri_str, default_scheme: str = ..., debug: int = ..., validate: bool = ..., bucket_storage_uri_class: Any = ..., suppress_consec_slashes: bool = ..., is_latest: bool = ...): ...
+def storage_uri_for_key(key): ...
diff --git a/typeshed/third_party/2and3/boto/auth.pyi b/typeshed/third_party/2and3/boto/auth.pyi
new file mode 100644
index 0000000..8fdf6ae
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/auth.pyi
@@ -0,0 +1,112 @@
+# Stubs for boto.auth (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from boto.auth_handler import AuthHandler
+
+SIGV4_DETECT = ...  # type: Any
+
+class HmacKeys:
+    host = ...  # type: Any
+    def __init__(self, host, config, provider) -> None: ...
+    def update_provider(self, provider): ...
+    def algorithm(self): ...
+    def sign_string(self, string_to_sign): ...
+
+class AnonAuthHandler(AuthHandler, HmacKeys):
+    capability = ...  # type: Any
+    def __init__(self, host, config, provider) -> None: ...
+    def add_auth(self, http_request, **kwargs): ...
+
+class HmacAuthV1Handler(AuthHandler, HmacKeys):
+    capability = ...  # type: Any
+    def __init__(self, host, config, provider) -> None: ...
+    def update_provider(self, provider): ...
+    def add_auth(self, http_request, **kwargs): ...
+
+class HmacAuthV2Handler(AuthHandler, HmacKeys):
+    capability = ...  # type: Any
+    def __init__(self, host, config, provider) -> None: ...
+    def update_provider(self, provider): ...
+    def add_auth(self, http_request, **kwargs): ...
+
+class HmacAuthV3Handler(AuthHandler, HmacKeys):
+    capability = ...  # type: Any
+    def __init__(self, host, config, provider) -> None: ...
+    def add_auth(self, http_request, **kwargs): ...
+
+class HmacAuthV3HTTPHandler(AuthHandler, HmacKeys):
+    capability = ...  # type: Any
+    def __init__(self, host, config, provider) -> None: ...
+    def headers_to_sign(self, http_request): ...
+    def canonical_headers(self, headers_to_sign): ...
+    def string_to_sign(self, http_request): ...
+    def add_auth(self, req, **kwargs): ...
+
+class HmacAuthV4Handler(AuthHandler, HmacKeys):
+    capability = ...  # type: Any
+    service_name = ...  # type: Any
+    region_name = ...  # type: Any
+    def __init__(self, host, config, provider, service_name: Optional[Any] = ..., region_name: Optional[Any] = ...) -> None: ...
+    def headers_to_sign(self, http_request): ...
+    def host_header(self, host, http_request): ...
+    def query_string(self, http_request): ...
+    def canonical_query_string(self, http_request): ...
+    def canonical_headers(self, headers_to_sign): ...
+    def signed_headers(self, headers_to_sign): ...
+    def canonical_uri(self, http_request): ...
+    def payload(self, http_request): ...
+    def canonical_request(self, http_request): ...
+    def scope(self, http_request): ...
+    def split_host_parts(self, host): ...
+    def determine_region_name(self, host): ...
+    def determine_service_name(self, host): ...
+    def credential_scope(self, http_request): ...
+    def string_to_sign(self, http_request, canonical_request): ...
+    def signature(self, http_request, string_to_sign): ...
+    def add_auth(self, req, **kwargs): ...
+
+class S3HmacAuthV4Handler(HmacAuthV4Handler, AuthHandler):
+    capability = ...  # type: Any
+    region_name = ...  # type: Any
+    def __init__(self, *args, **kwargs) -> None: ...
+    def clean_region_name(self, region_name): ...
+    def canonical_uri(self, http_request): ...
+    def canonical_query_string(self, http_request): ...
+    def host_header(self, host, http_request): ...
+    def headers_to_sign(self, http_request): ...
+    def determine_region_name(self, host): ...
+    def determine_service_name(self, host): ...
+    def mangle_path_and_params(self, req): ...
+    def payload(self, http_request): ...
+    def add_auth(self, req, **kwargs): ...
+    def presign(self, req, expires, iso_date: Optional[Any] = ...): ...
+
+class STSAnonHandler(AuthHandler):
+    capability = ...  # type: Any
+    def add_auth(self, http_request, **kwargs): ...
+
+class QuerySignatureHelper(HmacKeys):
+    def add_auth(self, http_request, **kwargs): ...
+
+class QuerySignatureV0AuthHandler(QuerySignatureHelper, AuthHandler):
+    SignatureVersion = ...  # type: int
+    capability = ...  # type: Any
+
+class QuerySignatureV1AuthHandler(QuerySignatureHelper, AuthHandler):
+    SignatureVersion = ...  # type: int
+    capability = ...  # type: Any
+    def __init__(self, *args, **kw) -> None: ...
+
+class QuerySignatureV2AuthHandler(QuerySignatureHelper, AuthHandler):
+    SignatureVersion = ...  # type: int
+    capability = ...  # type: Any
+
+class POSTPathQSV2AuthHandler(QuerySignatureV2AuthHandler, AuthHandler):
+    capability = ...  # type: Any
+    def add_auth(self, req, **kwargs): ...
+
+def get_auth_handler(host, config, provider, requested_capability: Optional[Any] = ...): ...
+def detect_potential_sigv4(func): ...
+def detect_potential_s3sigv4(func): ...
diff --git a/typeshed/third_party/2and3/boto/auth_handler.pyi b/typeshed/third_party/2and3/boto/auth_handler.pyi
new file mode 100644
index 0000000..097f762
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/auth_handler.pyi
@@ -0,0 +1,13 @@
+# Stubs for boto.auth_handler (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from boto.plugin import Plugin
+
+class NotReadyToAuthenticate(Exception): ...
+
+class AuthHandler(Plugin):
+    capability = ...  # type: Any
+    def __init__(self, host, config, provider) -> None: ...
+    def add_auth(self, http_request): ...
diff --git a/typeshed/third_party/2and3/boto/compat.pyi b/typeshed/third_party/2and3/boto/compat.pyi
new file mode 100644
index 0000000..85539f8
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/compat.pyi
@@ -0,0 +1,14 @@
+# Stubs for boto.compat (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from base64 import encodestring as encodebytes
+
+from six.moves import http_client
+
+expanduser = ...  # type: Any
+StandardError = ...  # type: Any
+long_type = ...  # type: Any
+unquote_str = ...  # type: Any
+parse_qs_safe = ...  # type: Any
diff --git a/typeshed/third_party/2and3/boto/connection.pyi b/typeshed/third_party/2and3/boto/connection.pyi
new file mode 100644
index 0000000..c8275b8
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/connection.pyi
@@ -0,0 +1,119 @@
+# Stubs for boto.connection (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Dict, Optional, Text
+from six.moves import http_client
+
+HAVE_HTTPS_CONNECTION = ...  # type: bool
+ON_APP_ENGINE = ...  # type: Any
+PORTS_BY_SECURITY = ...  # type: Any
+DEFAULT_CA_CERTS_FILE = ...  # type: Any
+
+class HostConnectionPool:
+    queue = ...  # type: Any
+    def __init__(self) -> None: ...
+    def size(self): ...
+    def put(self, conn): ...
+    def get(self): ...
+    def clean(self): ...
+
+class ConnectionPool:
+    CLEAN_INTERVAL = ...  # type: float
+    STALE_DURATION = ...  # type: float
+    host_to_pool = ...  # type: Any
+    last_clean_time = ...  # type: float
+    mutex = ...  # type: Any
+    def __init__(self) -> None: ...
+    def size(self): ...
+    def get_http_connection(self, host, port, is_secure): ...
+    def put_http_connection(self, host, port, is_secure, conn): ...
+    def clean(self): ...
+
+class HTTPRequest:
+    method = ...  # type: Any
+    protocol = ...  # type: Any
+    host = ...  # type: Any
+    port = ...  # type: Any
+    path = ...  # type: Any
+    auth_path = ...  # type: Any
+    params = ...  # type: Any
+    headers = ...  # type: Any
+    body = ...  # type: Any
+    def __init__(self, method, protocol, host, port, path, auth_path, params, headers, body) -> None: ...
+    def authorize(self, connection, **kwargs): ...
+
+class HTTPResponse(http_client.HTTPResponse):
+    def __init__(self, *args, **kwargs) -> None: ...
+    def read(self, amt: Optional[Any] = ...): ...
+
+class AWSAuthConnection:
+    suppress_consec_slashes = ...  # type: Any
+    num_retries = ...  # type: int
+    is_secure = ...  # type: Any
+    https_validate_certificates = ...  # type: Any
+    ca_certificates_file = ...  # type: Any
+    port = ...  # type: Any
+    http_exceptions = ...  # type: Any
+    http_unretryable_exceptions = ...  # type: Any
+    socket_exception_values = ...  # type: Any
+    https_connection_factory = ...  # type: Any
+    protocol = ...  # type: str
+    host = ...  # type: Any
+    path = ...  # type: Any
+    debug = ...  # type: Any
+    host_header = ...  # type: Any
+    http_connection_kwargs = ...  # type: Any
+    provider = ...  # type: Any
+    auth_service_name = ...  # type: Any
+    request_hook = ...  # type: Any
+    def __init__(self, host, aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., is_secure: bool = ..., port: Optional[Any] = ..., proxy: Optional[Any] = ..., proxy_port: Optional[Any] = ..., proxy_user: Optional[Any] = ..., proxy_pass: Optional[Any] = ..., debug: int = ..., https_connection_factory: Optional[Any] = ..., path: str = ..., provider: str = ..., security_token: Optional[Any] = ..., suppress_consec_slashes: bool = ..., validate_certs: bool = .. [...]
+    auth_region_name = ...  # type: Any
+    @property
+    def connection(self): ...
+    @property
+    def aws_access_key_id(self): ...
+    @property
+    def gs_access_key_id(self): ...  # type: Any
+    access_key = ...  # type: Any
+    @property
+    def aws_secret_access_key(self): ...
+    @property
+    def gs_secret_access_key(self): ...
+    secret_key = ...  # type: Any
+    @property
+    def profile_name(self): ...
+    def get_path(self, path: str = ...): ...
+    def server_name(self, port: Optional[Any] = ...): ...
+    proxy = ...  # type: Any
+    proxy_port = ...  # type: Any
+    proxy_user = ...  # type: Any
+    proxy_pass = ...  # type: Any
+    no_proxy = ...  # type: Any
+    use_proxy = ...  # type: Any
+    def handle_proxy(self, proxy, proxy_port, proxy_user, proxy_pass): ...
+    def get_http_connection(self, host, port, is_secure): ...
+    def skip_proxy(self, host): ...
+    def new_http_connection(self, host, port, is_secure): ...
+    def put_http_connection(self, host, port, is_secure, connection): ...
+    def proxy_ssl(self, host: Optional[Any] = ..., port: Optional[Any] = ...): ...
+    def prefix_proxy_to_path(self, path, host: Optional[Any] = ...): ...
+    def get_proxy_auth_header(self): ...
+    def get_proxy_url_with_auth(self): ...
+    def set_host_header(self, request): ...
+    def set_request_hook(self, hook): ...
+    def build_base_http_request(self, method, path, auth_path, params: Optional[Any] = ..., headers: Optional[Any] = ..., data: str = ..., host: Optional[Any] = ...): ...
+    def make_request(self, method, path, headers: Optional[Any] = ..., data: str = ..., host: Optional[Any] = ..., auth_path: Optional[Any] = ..., sender: Optional[Any] = ..., override_num_retries: Optional[Any] = ..., params: Optional[Any] = ..., retry_handler: Optional[Any] = ...): ...
+    def close(self): ...
+
+class AWSQueryConnection(AWSAuthConnection):
+    APIVersion = ...  # type: str
+    ResponseError = ...  # type: Any
+    def __init__(self, aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., is_secure: bool = ..., port: Optional[Any] = ..., proxy: Optional[Any] = ..., proxy_port: Optional[Any] = ..., proxy_user: Optional[Any] = ..., proxy_pass: Optional[Any] = ..., host: Optional[Any] = ..., debug: int = ..., https_connection_factory: Optional[Any] = ..., path: str = ..., security_token: Optional[Any] = ..., validate_certs: bool = ..., profile_name: Optional[Any] = ..., [...]
+    def get_utf8_value(self, value): ...
+    def make_request(self, action, params: Optional[Any] = ..., path: str = ..., verb: str = ..., *args, **kwargs): ...  # type: ignore # https://github.com/python/mypy/issues/1237
+    def build_list_params(self, params, items, label): ...
+    def build_complex_list_params(self, params, items, label, names): ...
+    def get_list(self, action, params, markers, path: str = ..., parent: Optional[Any] = ..., verb: str = ...): ...
+    def get_object(self, action, params, cls, path: str = ..., parent: Optional[Any] = ..., verb: str = ...): ...
+    def get_status(self, action, params, path: str = ..., parent: Optional[Any] = ..., verb: str = ...): ...
diff --git a/typeshed/third_party/2and3/boto/ec2/__init__.pyi b/typeshed/third_party/2and3/boto/ec2/__init__.pyi
new file mode 100644
index 0000000..64fa781
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/ec2/__init__.pyi
@@ -0,0 +1,11 @@
+# Stubs for boto.ec2 (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+RegionData = ...  # type: Any
+
+def regions(**kw_params): ...
+def connect_to_region(region_name, **kw_params): ...
+def get_region(region_name, **kw_params): ...
diff --git a/typeshed/third_party/2and3/boto/elb/__init__.pyi b/typeshed/third_party/2and3/boto/elb/__init__.pyi
new file mode 100644
index 0000000..82e17fa
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/elb/__init__.pyi
@@ -0,0 +1,43 @@
+# Stubs for boto.ec2.elb (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from boto.connection import AWSQueryConnection
+
+RegionData = ...  # type: Any
+
+def regions(): ...
+def connect_to_region(region_name, **kw_params): ...
+
+class ELBConnection(AWSQueryConnection):
+    APIVersion = ...  # type: Any
+    DefaultRegionName = ...  # type: Any
+    DefaultRegionEndpoint = ...  # type: Any
+    region = ...  # type: Any
+    def __init__(self, aws_access_key_id=..., aws_secret_access_key=..., is_secure=..., port=..., proxy=..., proxy_port=..., proxy_user=..., proxy_pass=..., debug=..., https_connection_factory=..., region=..., path=..., security_token=..., validate_certs=..., profile_name=...) -> None: ...
+    def build_list_params(self, params, items, label): ...
+    def get_all_load_balancers(self, load_balancer_names=..., marker=...): ...
+    def create_load_balancer(self, name, zones, listeners=..., subnets=..., security_groups=..., scheme=..., complex_listeners=...): ...
+    def create_load_balancer_listeners(self, name, listeners=..., complex_listeners=...): ...
+    def delete_load_balancer(self, name): ...
+    def delete_load_balancer_listeners(self, name, ports): ...
+    def enable_availability_zones(self, load_balancer_name, zones_to_add): ...
+    def disable_availability_zones(self, load_balancer_name, zones_to_remove): ...
+    def modify_lb_attribute(self, load_balancer_name, attribute, value): ...
+    def get_all_lb_attributes(self, load_balancer_name): ...
+    def get_lb_attribute(self, load_balancer_name, attribute): ...
+    def register_instances(self, load_balancer_name, instances): ...
+    def deregister_instances(self, load_balancer_name, instances): ...
+    def describe_instance_health(self, load_balancer_name, instances=...): ...
+    def configure_health_check(self, name, health_check): ...
+    def set_lb_listener_SSL_certificate(self, lb_name, lb_port, ssl_certificate_id): ...
+    def create_app_cookie_stickiness_policy(self, name, lb_name, policy_name): ...
+    def create_lb_cookie_stickiness_policy(self, cookie_expiration_period, lb_name, policy_name): ...
+    def create_lb_policy(self, lb_name, policy_name, policy_type, policy_attributes): ...
+    def delete_lb_policy(self, lb_name, policy_name): ...
+    def set_lb_policies_of_listener(self, lb_name, lb_port, policies): ...
+    def set_lb_policies_of_backend_server(self, lb_name, instance_port, policies): ...
+    def apply_security_groups_to_lb(self, name, security_groups): ...
+    def attach_lb_to_subnets(self, name, subnets): ...
+    def detach_lb_from_subnets(self, name, subnets): ...
diff --git a/typeshed/third_party/2and3/boto/exception.pyi b/typeshed/third_party/2and3/boto/exception.pyi
new file mode 100644
index 0000000..83778af
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/exception.pyi
@@ -0,0 +1,150 @@
+# Stubs for boto.exception (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from boto.compat import StandardError
+
+class BotoClientError(StandardError):
+    reason = ...  # type: Any
+    def __init__(self, reason, *args) -> None: ...
+
+class SDBPersistenceError(StandardError): ...
+class StoragePermissionsError(BotoClientError): ...
+class S3PermissionsError(StoragePermissionsError): ...
+class GSPermissionsError(StoragePermissionsError): ...
+
+class BotoServerError(StandardError):
+    status = ...  # type: Any
+    reason = ...  # type: Any
+    body = ...  # type: Any
+    request_id = ...  # type: Any
+    error_code = ...  # type: Any
+    message = ...  # type: str
+    box_usage = ...  # type: Any
+    def __init__(self, status, reason, body: Optional[Any] = ..., *args) -> None: ...
+    def __getattr__(self, name): ...
+    def __setattr__(self, name, value): ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+
+class ConsoleOutput:
+    parent = ...  # type: Any
+    instance_id = ...  # type: Any
+    timestamp = ...  # type: Any
+    comment = ...  # type: Any
+    output = ...  # type: Any
+    def __init__(self, parent: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+
+class StorageCreateError(BotoServerError):
+    bucket = ...  # type: Any
+    def __init__(self, status, reason, body: Optional[Any] = ...) -> None: ...
+    def endElement(self, name, value, connection): ...
+
+class S3CreateError(StorageCreateError): ...
+class GSCreateError(StorageCreateError): ...
+class StorageCopyError(BotoServerError): ...
+class S3CopyError(StorageCopyError): ...
+class GSCopyError(StorageCopyError): ...
+
+class SQSError(BotoServerError):
+    detail = ...  # type: Any
+    type = ...  # type: Any
+    def __init__(self, status, reason, body: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+
+class SQSDecodeError(BotoClientError):
+    message = ...  # type: Any
+    def __init__(self, reason, message) -> None: ...
+
+class StorageResponseError(BotoServerError):
+    resource = ...  # type: Any
+    def __init__(self, status, reason, body: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+
+class S3ResponseError(StorageResponseError): ...
+class GSResponseError(StorageResponseError): ...
+
+class EC2ResponseError(BotoServerError):
+    errors = ...  # type: Any
+    def __init__(self, status, reason, body: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    request_id = ...  # type: Any
+    def endElement(self, name, value, connection): ...
+
+class JSONResponseError(BotoServerError):
+    status = ...  # type: Any
+    reason = ...  # type: Any
+    body = ...  # type: Any
+    error_message = ...  # type: Any
+    error_code = ...  # type: Any
+    def __init__(self, status, reason, body: Optional[Any] = ..., *args) -> None: ...
+
+class DynamoDBResponseError(JSONResponseError): ...
+class SWFResponseError(JSONResponseError): ...
+class EmrResponseError(BotoServerError): ...
+
+class _EC2Error:
+    connection = ...  # type: Any
+    error_code = ...  # type: Any
+    error_message = ...  # type: Any
+    def __init__(self, connection: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+
+class SDBResponseError(BotoServerError): ...
+class AWSConnectionError(BotoClientError): ...
+class StorageDataError(BotoClientError): ...
+class S3DataError(StorageDataError): ...
+class GSDataError(StorageDataError): ...
+
+class InvalidUriError(Exception):
+    message = ...  # type: Any
+    def __init__(self, message) -> None: ...
+
+class InvalidAclError(Exception):
+    message = ...  # type: Any
+    def __init__(self, message) -> None: ...
+
+class InvalidCorsError(Exception):
+    message = ...  # type: Any
+    def __init__(self, message) -> None: ...
+
+class NoAuthHandlerFound(Exception): ...
+
+class InvalidLifecycleConfigError(Exception):
+    message = ...  # type: Any
+    def __init__(self, message) -> None: ...
+
+class ResumableTransferDisposition:
+    START_OVER = ...  # type: str
+    WAIT_BEFORE_RETRY = ...  # type: str
+    ABORT_CUR_PROCESS = ...  # type: str
+    ABORT = ...  # type: str
+
+class ResumableUploadException(Exception):
+    message = ...  # type: Any
+    disposition = ...  # type: Any
+    def __init__(self, message, disposition) -> None: ...
+
+class ResumableDownloadException(Exception):
+    message = ...  # type: Any
+    disposition = ...  # type: Any
+    def __init__(self, message, disposition) -> None: ...
+
+class TooManyRecordsException(Exception):
+    message = ...  # type: Any
+    def __init__(self, message) -> None: ...
+
+class PleaseRetryException(Exception):
+    message = ...  # type: Any
+    response = ...  # type: Any
+    def __init__(self, message, response: Optional[Any] = ...) -> None: ...
+
+class InvalidInstanceMetadataError(Exception):
+    MSG = ...  # type: str
+    def __init__(self, msg) -> None: ...
diff --git a/typeshed/third_party/2and3/boto/plugin.pyi b/typeshed/third_party/2and3/boto/plugin.pyi
new file mode 100644
index 0000000..37b9721
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/plugin.pyi
@@ -0,0 +1,13 @@
+# Stubs for boto.plugin (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Plugin:
+    capability = ...  # type: Any
+    @classmethod
+    def is_capable(cls, requested_capability): ...
+
+def get_plugin(cls, requested_capability: Optional[Any] = ...): ...
+def load_plugins(config): ...
diff --git a/typeshed/third_party/2and3/boto/regioninfo.pyi b/typeshed/third_party/2and3/boto/regioninfo.pyi
new file mode 100644
index 0000000..9dbb46f
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/regioninfo.pyi
@@ -0,0 +1,20 @@
+# Stubs for boto.regioninfo (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+def load_endpoint_json(path): ...
+def merge_endpoints(defaults, additions): ...
+def load_regions(): ...
+def get_regions(service_name, region_cls: Optional[Any] = ..., connection_cls: Optional[Any] = ...): ...
+
+class RegionInfo:
+    connection = ...  # type: Any
+    name = ...  # type: Any
+    endpoint = ...  # type: Any
+    connection_cls = ...  # type: Any
+    def __init__(self, connection: Optional[Any] = ..., name: Optional[Any] = ..., endpoint: Optional[Any] = ..., connection_cls: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def connect(self, **kw_params): ...
diff --git a/typeshed/third_party/2and3/boto/s3/__init__.pyi b/typeshed/third_party/2and3/boto/s3/__init__.pyi
new file mode 100644
index 0000000..b359694
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/__init__.pyi
@@ -0,0 +1,16 @@
+# Stubs for boto.s3 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .connection import S3Connection
+
+from boto.connection import AWSAuthConnection
+from boto.regioninfo import RegionInfo
+
+from typing import List, Type, Text
+
+class S3RegionInfo(RegionInfo):
+    def connect(self, name: Text=None, endpoint: str=None, connection_cls: Type[AWSAuthConnection]=None, **kw_params) -> S3Connection: ...
+
+def regions() -> List[S3RegionInfo]: ...
+def connect_to_region(region_name: Text, **kw_params): ...
diff --git a/typeshed/third_party/2and3/boto/s3/acl.pyi b/typeshed/third_party/2and3/boto/s3/acl.pyi
new file mode 100644
index 0000000..8813009
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/acl.pyi
@@ -0,0 +1,43 @@
+# Stubs for boto.s3.acl (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .connection import S3Connection
+from .user import User
+from typing import Any, Dict, Optional, List, Text, Union
+
+CannedACLStrings = ...  # type: List[str]
+
+class Policy:
+    parent = ...  # type: Any
+    namespace = ...  # type: Any
+    acl = ...  # type: ACL
+    def __init__(self, parent: Optional[Any] = ...) -> None: ...
+    owner = ...  # type: User
+    def startElement(self, name: Text, attrs: Dict[str, Any], connection: S3Connection) -> Union[None, User, ACL]: ...
+    def endElement(self, name: Text, value: Any, connection: S3Connection) -> None: ...
+    def to_xml(self) -> str: ...
+
+class ACL:
+    policy = ...  # type: Policy
+    grants = ...  # type: List[Grant]
+    def __init__(self, policy: Optional[Policy] = ...) -> None: ...
+    def add_grant(self, grant: Grant) -> None: ...
+    def add_email_grant(self, permission: Text, email_address: Text) -> None: ...
+    def add_user_grant(self, permission: Text, user_id: Text, display_name: Optional[Text] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name: Text, value: Any, connection: S3Connection) -> None: ...
+    def to_xml(self) -> str: ...
+
+class Grant:
+    NameSpace = ...  # type: Text
+    permission = ...  # type: Text
+    id = ...  # type: Text
+    display_name = ...  # type: Text
+    uri = ...  # type: Text
+    email_address = ...  # type: Text
+    type = ...  # type: Text
+    def __init__(self, permission: Optional[Text] = ..., type: Optional[Text] = ..., id: Optional[Text] = ..., display_name: Optional[Text] = ..., uri: Optional[Text] = ..., email_address: Optional[Text] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name: Text, value: Any, connection: S3Connection) -> None: ...
+    def to_xml(self) -> str: ...
diff --git a/typeshed/third_party/2and3/boto/s3/bucket.pyi b/typeshed/third_party/2and3/boto/s3/bucket.pyi
new file mode 100644
index 0000000..3b6efb6
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/bucket.pyi
@@ -0,0 +1,98 @@
+# Stubs for boto.s3.bucket (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .bucketlistresultset import BucketListResultSet
+from .connection import S3Connection
+from .key import Key
+
+from typing import Any, Dict, Optional, Text, Type
+
+class S3WebsiteEndpointTranslate:
+    trans_region = ...  # type: Dict[str, str]
+    @classmethod
+    def translate_region(self, reg: Text) -> str: ...
+
+S3Permissions = ...  # type: List[str]
+
+class Bucket:
+    LoggingGroup = ...  # type: str
+    BucketPaymentBody = ...  # type: str
+    VersioningBody = ...  # type: str
+    VersionRE = ...  # type: str
+    MFADeleteRE = ...  # type: str
+    name = ...  # type: Text
+    connection = ...  # type: S3Connection
+    key_class = ...  # type: Type[Key]
+    def __init__(self, connection: Optional[S3Connection] = ..., name: Optional[Text] = ..., key_class: Type[Key] = ...) -> None: ...
+    def __iter__(self): ...
+    def __contains__(self, key_name) -> bool: ...
+    def startElement(self, name, attrs, connection): ...
+    creation_date = ...  # type: Any
+    def endElement(self, name, value, connection): ...
+    def set_key_class(self, key_class): ...
+    def lookup(self, key_name, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_key(self, key_name, headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ..., validate: bool = ...) -> Key: ...
+    def list(self, prefix: Text = ..., delimiter: Text = ..., marker: Text = ..., headers: Optional[Dict[Text, Text]] = ..., encoding_type: Optional[Any] = ...) -> BucketListResultSet: ...
+    def list_versions(self, prefix: str = ..., delimiter: str = ..., key_marker: str = ..., version_id_marker: str = ..., headers: Optional[Dict[Text, Text]] = ..., encoding_type: Optional[Text] = ...) -> BucketListResultSet: ...
+    def list_multipart_uploads(self, key_marker: str = ..., upload_id_marker: str = ..., headers: Optional[Dict[Text, Text]] = ..., encoding_type: Optional[Any] = ...): ...
+    def validate_kwarg_names(self, kwargs, names): ...
+    def get_all_keys(self, headers: Optional[Dict[Text, Text]] = ..., **params): ...
+    def get_all_versions(self, headers: Optional[Dict[Text, Text]] = ..., **params): ...
+    def validate_get_all_versions_params(self, params): ...
+    def get_all_multipart_uploads(self, headers: Optional[Dict[Text, Text]] = ..., **params): ...
+    def new_key(self, key_name: Optional[Any] = ...): ...
+    def generate_url(self, expires_in, method: str = ..., headers: Optional[Dict[Text, Text]] = ..., force_http: bool = ..., response_headers: Optional[Dict[Text, Text]] = ..., expires_in_absolute: bool = ...): ...
+    def delete_keys(self, keys, quiet: bool = ..., mfa_token: Optional[Any] = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+    def delete_key(self, key_name, headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ..., mfa_token: Optional[Any] = ...): ...
+    def copy_key(self, new_key_name, src_bucket_name, src_key_name, metadata: Optional[Any] = ..., src_version_id: Optional[Any] = ..., storage_class: str = ..., preserve_acl: bool = ..., encrypt_key: bool = ..., headers: Optional[Dict[Text, Text]] = ..., query_args: Optional[Any] = ...): ...
+    def set_canned_acl(self, acl_str, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+    def get_xml_acl(self, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+    def set_xml_acl(self, acl_str, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ..., query_args: str = ...): ...
+    def set_acl(self, acl_or_str, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+    def get_acl(self, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+    def set_subresource(self, subresource, value, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+    def get_subresource(self, subresource, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+    def make_public(self, recursive: bool = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+    def add_email_grant(self, permission, email_address, recursive: bool = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+    def add_user_grant(self, permission, user_id, recursive: bool = ..., headers: Optional[Dict[Text, Text]] = ..., display_name: Optional[Any] = ...): ...
+    def list_grants(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_location(self): ...
+    def set_xml_logging(self, logging_str, headers: Optional[Dict[Text, Text]] = ...): ...
+    def enable_logging(self, target_bucket, target_prefix: str = ..., grants: Optional[Any] = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+    def disable_logging(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_logging_status(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def set_as_logging_target(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_request_payment(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def set_request_payment(self, payer: str = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+    def configure_versioning(self, versioning, mfa_delete: bool = ..., mfa_token: Optional[Any] = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_versioning_status(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def configure_lifecycle(self, lifecycle_config, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_lifecycle_config(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def delete_lifecycle_configuration(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def configure_website(self, suffix: Optional[Any] = ..., error_key: Optional[Any] = ..., redirect_all_requests_to: Optional[Any] = ..., routing_rules: Optional[Any] = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+    def set_website_configuration(self, config, headers: Optional[Dict[Text, Text]] = ...): ...
+    def set_website_configuration_xml(self, xml, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_website_configuration(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_website_configuration_obj(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_website_configuration_with_xml(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_website_configuration_xml(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def delete_website_configuration(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_website_endpoint(self): ...
+    def get_policy(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def set_policy(self, policy, headers: Optional[Dict[Text, Text]] = ...): ...
+    def delete_policy(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def set_cors_xml(self, cors_xml, headers: Optional[Dict[Text, Text]] = ...): ...
+    def set_cors(self, cors_config, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_cors_xml(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_cors(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def delete_cors(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def initiate_multipart_upload(self, key_name, headers: Optional[Dict[Text, Text]] = ..., reduced_redundancy: bool = ..., metadata: Optional[Any] = ..., encrypt_key: bool = ..., policy: Optional[Any] = ...): ...
+    def complete_multipart_upload(self, key_name, upload_id, xml_body, headers: Optional[Dict[Text, Text]] = ...): ...
+    def cancel_multipart_upload(self, key_name, upload_id, headers: Optional[Dict[Text, Text]] = ...): ...
+    def delete(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_tags(self): ...
+    def get_xml_tags(self): ...
+    def set_xml_tags(self, tag_str, headers: Optional[Dict[Text, Text]] = ..., query_args: str = ...): ...
+    def set_tags(self, tags, headers: Optional[Dict[Text, Text]] = ...): ...
+    def delete_tags(self, headers: Optional[Dict[Text, Text]] = ...): ...
diff --git a/typeshed/third_party/2and3/boto/s3/bucketlistresultset.pyi b/typeshed/third_party/2and3/boto/s3/bucketlistresultset.pyi
new file mode 100644
index 0000000..97e79b0
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/bucketlistresultset.pyi
@@ -0,0 +1,44 @@
+# Stubs for boto.s3.bucketlistresultset (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .bucket import Bucket
+from .key import Key
+
+from typing import Any, Iterable, Iterator, Optional
+
+def bucket_lister(bucket, prefix: str = ..., delimiter: str = ..., marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...): ...
+
+class BucketListResultSet(Iterable[Key]):
+    bucket = ...  # type: Any
+    prefix = ...  # type: Any
+    delimiter = ...  # type: Any
+    marker = ...  # type: Any
+    headers = ...  # type: Any
+    encoding_type = ...  # type: Any
+    def __init__(self, bucket: Optional[Any] = ..., prefix: str = ..., delimiter: str = ..., marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...) -> None: ...
+    def __iter__(self) -> Iterator[Key]: ...
+
+def versioned_bucket_lister(bucket, prefix: str = ..., delimiter: str = ..., key_marker: str = ..., version_id_marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...): ...
+
+class VersionedBucketListResultSet:
+    bucket = ...  # type: Any
+    prefix = ...  # type: Any
+    delimiter = ...  # type: Any
+    key_marker = ...  # type: Any
+    version_id_marker = ...  # type: Any
+    headers = ...  # type: Any
+    encoding_type = ...  # type: Any
+    def __init__(self, bucket: Optional[Any] = ..., prefix: str = ..., delimiter: str = ..., key_marker: str = ..., version_id_marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...) -> None: ...
+    def __iter__(self) -> Iterator[Key]: ...
+
+def multipart_upload_lister(bucket, key_marker: str = ..., upload_id_marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...): ...
+
+class MultiPartUploadListResultSet:
+    bucket = ...  # type: Any
+    key_marker = ...  # type: Any
+    upload_id_marker = ...  # type: Any
+    headers = ...  # type: Any
+    encoding_type = ...  # type: Any
+    def __init__(self, bucket: Optional[Any] = ..., key_marker: str = ..., upload_id_marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...) -> None: ...
+    def __iter__(self): ...
diff --git a/typeshed/third_party/2and3/boto/s3/bucketlogging.pyi b/typeshed/third_party/2and3/boto/s3/bucketlogging.pyi
new file mode 100644
index 0000000..a3f83a5
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/bucketlogging.pyi
@@ -0,0 +1,15 @@
+# Stubs for boto.s3.bucketlogging (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class BucketLogging:
+    target = ...  # type: Any
+    prefix = ...  # type: Any
+    grants = ...  # type: Any
+    def __init__(self, target: Optional[Any] = ..., prefix: Optional[Any] = ..., grants: Optional[Any] = ...) -> None: ...
+    def add_grant(self, grant): ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
diff --git a/typeshed/third_party/2and3/boto/s3/connection.pyi b/typeshed/third_party/2and3/boto/s3/connection.pyi
new file mode 100644
index 0000000..73661f0
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/connection.pyi
@@ -0,0 +1,71 @@
+# Stubs for boto.s3.connection (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .bucket import Bucket
+
+from typing import Any, Dict, Optional, Text, Type
+from boto.connection import AWSAuthConnection
+from boto.exception import BotoClientError
+
+def check_lowercase_bucketname(n): ...
+def assert_case_insensitive(f): ...
+
+class _CallingFormat:
+    def get_bucket_server(self, server, bucket): ...
+    def build_url_base(self, connection, protocol, server, bucket, key: str = ...): ...
+    def build_host(self, server, bucket): ...
+    def build_auth_path(self, bucket, key: str = ...): ...
+    def build_path_base(self, bucket, key: str = ...): ...
+
+class SubdomainCallingFormat(_CallingFormat):
+    def get_bucket_server(self, server, bucket): ...
+
+class VHostCallingFormat(_CallingFormat):
+    def get_bucket_server(self, server, bucket): ...
+
+class OrdinaryCallingFormat(_CallingFormat):
+    def get_bucket_server(self, server, bucket): ...
+    def build_path_base(self, bucket, key: str = ...): ...
+
+class ProtocolIndependentOrdinaryCallingFormat(OrdinaryCallingFormat):
+    def build_url_base(self, connection, protocol, server, bucket, key: str = ...): ...
+
+class Location:
+    DEFAULT = ...  # type: str
+    EU = ...  # type: str
+    EUCentral1 = ...  # type: str
+    USWest = ...  # type: str
+    USWest2 = ...  # type: str
+    SAEast = ...  # type: str
+    APNortheast = ...  # type: str
+    APSoutheast = ...  # type: str
+    APSoutheast2 = ...  # type: str
+    CNNorth1 = ...  # type: str
+
+class NoHostProvided: ...
+class HostRequiredError(BotoClientError): ...
+
+class S3Connection(AWSAuthConnection):
+    DefaultHost = ...  # type: Any
+    DefaultCallingFormat = ...  # type: Any
+    QueryString = ...  # type: str
+    calling_format = ...  # type: Any
+    bucket_class = ...  # type: Type[Bucket]
+    anon = ...  # type: Any
+    def __init__(self, aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., is_secure: bool = ..., port: Optional[Any] = ..., proxy: Optional[Any] = ..., proxy_port: Optional[Any] = ..., proxy_user: Optional[Any] = ..., proxy_pass: Optional[Any] = ..., host: Any = ..., debug: int = ..., https_connection_factory: Optional[Any] = ..., calling_format: Any = ..., path: str = ..., provider: str = ..., bucket_class: Type[Bucket] = ..., security_token: Optional[An [...]
+    def __iter__(self): ...
+    def __contains__(self, bucket_name): ...
+    def set_bucket_class(self, bucket_class: Type[Bucket]) -> None: ...
+    def build_post_policy(self, expiration_time, conditions): ...
+    def build_post_form_args(self, bucket_name, key, expires_in: int = ..., acl: Optional[Any] = ..., success_action_redirect: Optional[Any] = ..., max_content_length: Optional[Any] = ..., http_method: str = ..., fields: Optional[Any] = ..., conditions: Optional[Any] = ..., storage_class: str = ..., server_side_encryption: Optional[Any] = ...): ...
+    def generate_url_sigv4(self, expires_in, method, bucket: str = ..., key: str = ..., headers: Optional[Dict[Text, Text]] = ..., force_http: bool = ..., response_headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ..., iso_date: Optional[Any] = ...): ...
+    def generate_url(self, expires_in, method, bucket: str = ..., key: str = ..., headers: Optional[Dict[Text, Text]] = ..., query_auth: bool = ..., force_http: bool = ..., response_headers: Optional[Dict[Text, Text]] = ..., expires_in_absolute: bool = ..., version_id: Optional[Any] = ...): ...
+    def get_all_buckets(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_canonical_user_id(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_bucket(self, bucket_name: Text, validate: bool = ..., headers: Optional[Dict[Text, Text]] = ...) -> Bucket: ...
+    def head_bucket(self, bucket_name, headers: Optional[Dict[Text, Text]] = ...): ...
+    def lookup(self, bucket_name, validate: bool = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+    def create_bucket(self, bucket_name, headers: Optional[Dict[Text, Text]] = ..., location: Any = ..., policy: Optional[Any] = ...): ...
+    def delete_bucket(self, bucket, headers: Optional[Dict[Text, Text]] = ...): ...
+    def make_request(self, method, bucket: str = ..., key: str = ..., headers: Optional[Any] = ..., data: str = ..., query_args: Optional[Any] = ..., sender: Optional[Any] = ..., override_num_retries: Optional[Any] = ..., retry_handler: Optional[Any] = ..., *args, **kwargs): ...  # type: ignore # https://github.com/python/mypy/issues/1237
diff --git a/typeshed/third_party/2and3/boto/s3/cors.pyi b/typeshed/third_party/2and3/boto/s3/cors.pyi
new file mode 100644
index 0000000..07f49b0
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/cors.pyi
@@ -0,0 +1,23 @@
+# Stubs for boto.s3.cors (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class CORSRule:
+    allowed_method = ...  # type: Any
+    allowed_origin = ...  # type: Any
+    id = ...  # type: Any
+    allowed_header = ...  # type: Any
+    max_age_seconds = ...  # type: Any
+    expose_header = ...  # type: Any
+    def __init__(self, allowed_method: Optional[Any] = ..., allowed_origin: Optional[Any] = ..., id: Optional[Any] = ..., allowed_header: Optional[Any] = ..., max_age_seconds: Optional[Any] = ..., expose_header: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self) -> str: ...
+
+class CORSConfiguration(list):
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self) -> str: ...
+    def add_rule(self, allowed_method, allowed_origin, id: Optional[Any] = ..., allowed_header: Optional[Any] = ..., max_age_seconds: Optional[Any] = ..., expose_header: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/boto/s3/deletemarker.pyi b/typeshed/third_party/2and3/boto/s3/deletemarker.pyi
new file mode 100644
index 0000000..cf7bc64
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/deletemarker.pyi
@@ -0,0 +1,16 @@
+# Stubs for boto.s3.deletemarker (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class DeleteMarker:
+    bucket = ...  # type: Any
+    name = ...  # type: Any
+    version_id = ...  # type: Any
+    is_latest = ...  # type: bool
+    last_modified = ...  # type: Any
+    owner = ...  # type: Any
+    def __init__(self, bucket: Optional[Any] = ..., name: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
diff --git a/typeshed/third_party/2and3/boto/s3/key.pyi b/typeshed/third_party/2and3/boto/s3/key.pyi
new file mode 100644
index 0000000..f7232b7
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/key.pyi
@@ -0,0 +1,91 @@
+# Stubs for boto.s3.key (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Callable, Dict, Optional, Text
+
+class Key:
+    DefaultContentType = ...  # type: str
+    RestoreBody = ...  # type: str
+    BufferSize = ...  # type: Any
+    base_user_settable_fields = ...  # type: Any
+    base_fields = ...  # type: Any
+    bucket = ...  # type: Any
+    name = ...  # type: str
+    metadata = ...  # type: Any
+    cache_control = ...  # type: Any
+    content_type = ...  # type: Any
+    content_encoding = ...  # type: Any
+    content_disposition = ...  # type: Any
+    content_language = ...  # type: Any
+    filename = ...  # type: Any
+    etag = ...  # type: Any
+    is_latest = ...  # type: bool
+    last_modified = ...  # type: Any
+    owner = ...  # type: Any
+    path = ...  # type: Any
+    resp = ...  # type: Any
+    mode = ...  # type: Any
+    size = ...  # type: Any
+    version_id = ...  # type: Any
+    source_version_id = ...  # type: Any
+    delete_marker = ...  # type: bool
+    encrypted = ...  # type: Any
+    ongoing_restore = ...  # type: Any
+    expiry_date = ...  # type: Any
+    local_hashes = ...  # type: Any
+    def __init__(self, bucket: Optional[Any] = ..., name: Optional[Any] = ...) -> None: ...
+    def __iter__(self): ...
+    @property
+    def provider(self): ...
+    key = ...  # type: Any
+    md5 = ...  # type: Any
+    base64md5 = ...  # type: Any
+    storage_class = ...  # type: Any
+    def get_md5_from_hexdigest(self, md5_hexdigest): ...
+    def handle_encryption_headers(self, resp): ...
+    def handle_version_headers(self, resp, force: bool = ...): ...
+    def handle_restore_headers(self, response): ...
+    def handle_addl_headers(self, headers): ...
+    def open_read(self, headers: Optional[Dict[Text, Text]] = ..., query_args: str = ..., override_num_retries: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ...): ...
+    def open_write(self, headers: Optional[Dict[Text, Text]] = ..., override_num_retries: Optional[Any] = ...): ...
+    def open(self, mode: str = ..., headers: Optional[Dict[Text, Text]] = ..., query_args: Optional[Any] = ..., override_num_retries: Optional[Any] = ...): ...
+    closed = ...  # type: bool
+    def close(self, fast: bool = ...): ...
+    def next(self): ...
+    __next__ = ...  # type: Any
+    def read(self, size: int = ...): ...
+    def change_storage_class(self, new_storage_class, dst_bucket: Optional[Any] = ..., validate_dst_bucket: bool = ...): ...
+    def copy(self, dst_bucket, dst_key, metadata: Optional[Any] = ..., reduced_redundancy: bool = ..., preserve_acl: bool = ..., encrypt_key: bool = ..., validate_dst_bucket: bool = ...): ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def exists(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def delete(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_metadata(self, name): ...
+    def set_metadata(self, name, value): ...
+    def update_metadata(self, d): ...
+    def set_acl(self, acl_str, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_acl(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_xml_acl(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def set_xml_acl(self, acl_str, headers: Optional[Dict[Text, Text]] = ...): ...
+    def set_canned_acl(self, acl_str, headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_redirect(self): ...
+    def set_redirect(self, redirect_location, headers: Optional[Dict[Text, Text]] = ...): ...
+    def make_public(self, headers: Optional[Dict[Text, Text]] = ...): ...
+    def generate_url(self, expires_in, method: str = ..., headers: Optional[Dict[Text, Text]] = ..., query_auth: bool = ..., force_http: bool = ..., response_headers: Optional[Dict[Text, Text]] = ..., expires_in_absolute: bool = ..., version_id: Optional[Any] = ..., policy: Optional[Any] = ..., reduced_redundancy: bool = ..., encrypt_key: bool = ...): ...
+    def send_file(self, fp, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., query_args: Optional[Any] = ..., chunked_transfer: bool = ..., size: Optional[Any] = ...): ...
+    def should_retry(self, response, chunked_transfer: bool = ...): ...
+    def compute_md5(self, fp, size: Optional[Any] = ...): ...
+    def set_contents_from_stream(self, fp, headers: Optional[Dict[Text, Text]] = ..., replace: bool = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., policy: Optional[Any] = ..., reduced_redundancy: bool = ..., query_args: Optional[Any] = ..., size: Optional[Any] = ...): ...
+    def set_contents_from_file(self, fp, headers: Optional[Dict[Text, Text]] = ..., replace: bool = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., policy: Optional[Any] = ..., md5: Optional[Any] = ..., reduced_redundancy: bool = ..., query_args: Optional[Any] = ..., encrypt_key: bool = ..., size: Optional[Any] = ..., rewind: bool = ...): ...
+    def set_contents_from_filename(self, filename, headers: Optional[Dict[Text, Text]] = ..., replace: bool = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., policy: Optional[Any] = ..., md5: Optional[Any] = ..., reduced_redundancy: bool = ..., encrypt_key: bool = ...): ...
+    def set_contents_from_string(self, string_data: Text, headers: Optional[Dict[Text, Text]] = ..., replace: bool = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., policy: Optional[Any] = ..., md5: Optional[Any] = ..., reduced_redundancy: bool = ..., encrypt_key: bool = ...) -> None: ...
+    def get_file(self, fp, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., torrent: bool = ..., version_id: Optional[Any] = ..., override_num_retries: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_torrent_file(self, fp, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ...): ...
+    def get_contents_to_file(self, fp, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., torrent: bool = ..., version_id: Optional[Any] = ..., res_download_handler: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_contents_to_filename(self, filename, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., torrent: bool = ..., version_id: Optional[Any] = ..., res_download_handler: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ...): ...
+    def get_contents_as_string(self, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., torrent: bool = ..., version_id: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ..., encoding: Optional[Any] = ...) -> str: ...
+    def add_email_grant(self, permission, email_address, headers: Optional[Dict[Text, Text]] = ...): ...
+    def add_user_grant(self, permission, user_id, headers: Optional[Dict[Text, Text]] = ..., display_name: Optional[Any] = ...): ...
+    def set_remote_metadata(self, metadata_plus, metadata_minus, preserve_acl, headers: Optional[Dict[Text, Text]] = ...): ...
+    def restore(self, days, headers: Optional[Dict[Text, Text]] = ...): ...
diff --git a/typeshed/third_party/2and3/boto/s3/keyfile.pyi b/typeshed/third_party/2and3/boto/s3/keyfile.pyi
new file mode 100644
index 0000000..2fe5faa
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/keyfile.pyi
@@ -0,0 +1,33 @@
+# Stubs for boto.s3.keyfile (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class KeyFile:
+    key = ...  # type: Any
+    location = ...  # type: int
+    closed = ...  # type: bool
+    softspace = ...  # type: int
+    mode = ...  # type: str
+    encoding = ...  # type: str
+    errors = ...  # type: str
+    newlines = ...  # type: str
+    name = ...  # type: Any
+    def __init__(self, key) -> None: ...
+    def tell(self): ...
+    def seek(self, pos, whence: Any = ...): ...
+    def read(self, size): ...
+    def close(self): ...
+    def isatty(self): ...
+    def getkey(self): ...
+    def write(self, buf): ...
+    def fileno(self): ...
+    def flush(self): ...
+    def next(self): ...
+    def readinto(self): ...
+    def readline(self): ...
+    def readlines(self): ...
+    def truncate(self): ...
+    def writelines(self): ...
+    def xreadlines(self): ...
diff --git a/typeshed/third_party/2and3/boto/s3/lifecycle.pyi b/typeshed/third_party/2and3/boto/s3/lifecycle.pyi
new file mode 100644
index 0000000..c15048e
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/lifecycle.pyi
@@ -0,0 +1,55 @@
+# Stubs for boto.s3.lifecycle (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Rule:
+    id = ...  # type: Any
+    prefix = ...  # type: Any
+    status = ...  # type: Any
+    expiration = ...  # type: Any
+    transition = ...  # type: Any
+    def __init__(self, id: Optional[Any] = ..., prefix: Optional[Any] = ..., status: Optional[Any] = ..., expiration: Optional[Any] = ..., transition: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
+
+class Expiration:
+    days = ...  # type: Any
+    date = ...  # type: Any
+    def __init__(self, days: Optional[Any] = ..., date: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
+
+class Transition:
+    days = ...  # type: Any
+    date = ...  # type: Any
+    storage_class = ...  # type: Any
+    def __init__(self, days: Optional[Any] = ..., date: Optional[Any] = ..., storage_class: Optional[Any] = ...) -> None: ...
+    def to_xml(self): ...
+
+class Transitions(list):
+    transition_properties = ...  # type: int
+    current_transition_property = ...  # type: int
+    temp_days = ...  # type: Any
+    temp_date = ...  # type: Any
+    temp_storage_class = ...  # type: Any
+    def __init__(self) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
+    def add_transition(self, days: Optional[Any] = ..., date: Optional[Any] = ..., storage_class: Optional[Any] = ...): ...
+    @property
+    def days(self): ...
+    @property
+    def date(self): ...
+    @property
+    def storage_class(self): ...
+
+class Lifecycle(list):
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
+    def add_rule(self, id: Optional[Any] = ..., prefix: str = ..., status: str = ..., expiration: Optional[Any] = ..., transition: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/boto/s3/multidelete.pyi b/typeshed/third_party/2and3/boto/s3/multidelete.pyi
new file mode 100644
index 0000000..46449c4
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/multidelete.pyi
@@ -0,0 +1,31 @@
+# Stubs for boto.s3.multidelete (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Deleted:
+    key = ...  # type: Any
+    version_id = ...  # type: Any
+    delete_marker = ...  # type: Any
+    delete_marker_version_id = ...  # type: Any
+    def __init__(self, key: Optional[Any] = ..., version_id: Optional[Any] = ..., delete_marker: bool = ..., delete_marker_version_id: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+
+class Error:
+    key = ...  # type: Any
+    version_id = ...  # type: Any
+    code = ...  # type: Any
+    message = ...  # type: Any
+    def __init__(self, key: Optional[Any] = ..., version_id: Optional[Any] = ..., code: Optional[Any] = ..., message: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+
+class MultiDeleteResult:
+    bucket = ...  # type: Any
+    deleted = ...  # type: Any
+    errors = ...  # type: Any
+    def __init__(self, bucket: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
diff --git a/typeshed/third_party/2and3/boto/s3/multipart.pyi b/typeshed/third_party/2and3/boto/s3/multipart.pyi
new file mode 100644
index 0000000..2bc738f
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/multipart.pyi
@@ -0,0 +1,53 @@
+# Stubs for boto.s3.multipart (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class CompleteMultiPartUpload:
+    bucket = ...  # type: Any
+    location = ...  # type: Any
+    bucket_name = ...  # type: Any
+    key_name = ...  # type: Any
+    etag = ...  # type: Any
+    version_id = ...  # type: Any
+    encrypted = ...  # type: Any
+    def __init__(self, bucket: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+
+class Part:
+    bucket = ...  # type: Any
+    part_number = ...  # type: Any
+    last_modified = ...  # type: Any
+    etag = ...  # type: Any
+    size = ...  # type: Any
+    def __init__(self, bucket: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+
+def part_lister(mpupload, part_number_marker: Optional[Any] = ...): ...
+
+class MultiPartUpload:
+    bucket = ...  # type: Any
+    bucket_name = ...  # type: Any
+    key_name = ...  # type: Any
+    id = ...  # type: Any
+    initiator = ...  # type: Any
+    owner = ...  # type: Any
+    storage_class = ...  # type: Any
+    initiated = ...  # type: Any
+    part_number_marker = ...  # type: Any
+    next_part_number_marker = ...  # type: Any
+    max_parts = ...  # type: Any
+    is_truncated = ...  # type: bool
+    def __init__(self, bucket: Optional[Any] = ...) -> None: ...
+    def __iter__(self): ...
+    def to_xml(self): ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def get_all_parts(self, max_parts: Optional[Any] = ..., part_number_marker: Optional[Any] = ..., encoding_type: Optional[Any] = ...): ...
+    def upload_part_from_file(self, fp, part_num, headers: Optional[Any] = ..., replace: bool = ..., cb: Optional[Any] = ..., num_cb: int = ..., md5: Optional[Any] = ..., size: Optional[Any] = ...): ...
+    def copy_part_from_key(self, src_bucket_name, src_key_name, part_num, start: Optional[Any] = ..., end: Optional[Any] = ..., src_version_id: Optional[Any] = ..., headers: Optional[Any] = ...): ...
+    def complete_upload(self): ...
+    def cancel_upload(self): ...
diff --git a/typeshed/third_party/2and3/boto/s3/prefix.pyi b/typeshed/third_party/2and3/boto/s3/prefix.pyi
new file mode 100644
index 0000000..12501b2
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/prefix.pyi
@@ -0,0 +1,14 @@
+# Stubs for boto.s3.prefix (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Prefix:
+    bucket = ...  # type: Any
+    name = ...  # type: Any
+    def __init__(self, bucket: Optional[Any] = ..., name: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    @property
+    def provider(self): ...
diff --git a/typeshed/third_party/2and3/boto/s3/tagging.pyi b/typeshed/third_party/2and3/boto/s3/tagging.pyi
new file mode 100644
index 0000000..07c1fca
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/tagging.pyi
@@ -0,0 +1,26 @@
+# Stubs for boto.s3.tagging (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Tag:
+    key = ...  # type: Any
+    value = ...  # type: Any
+    def __init__(self, key: Optional[Any] = ..., value: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
+    def __eq__(self, other): ...
+
+class TagSet(list):
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def add_tag(self, key, value): ...
+    def to_xml(self): ...
+
+class Tags(list):
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
+    def add_tag_set(self, tag_set): ...
diff --git a/typeshed/third_party/2and3/boto/s3/user.pyi b/typeshed/third_party/2and3/boto/s3/user.pyi
new file mode 100644
index 0000000..21832e9
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/user.pyi
@@ -0,0 +1,14 @@
+# Stubs for boto.s3.user (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class User:
+    type = ...  # type: Any
+    id = ...  # type: Any
+    display_name = ...  # type: Any
+    def __init__(self, parent: Optional[Any] = ..., id: str = ..., display_name: str = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self, element_name: str = ...): ...
diff --git a/typeshed/third_party/2and3/boto/s3/website.pyi b/typeshed/third_party/2and3/boto/s3/website.pyi
new file mode 100644
index 0000000..f832077
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/website.pyi
@@ -0,0 +1,66 @@
+# Stubs for boto.s3.website (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+def tag(key, value): ...
+
+class WebsiteConfiguration:
+    suffix = ...  # type: Any
+    error_key = ...  # type: Any
+    redirect_all_requests_to = ...  # type: Any
+    routing_rules = ...  # type: Any
+    def __init__(self, suffix: Optional[Any] = ..., error_key: Optional[Any] = ..., redirect_all_requests_to: Optional[Any] = ..., routing_rules: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
+
+class _XMLKeyValue:
+    translator = ...  # type: Any
+    container = ...  # type: Any
+    def __init__(self, translator, container: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
+
+class RedirectLocation(_XMLKeyValue):
+    TRANSLATOR = ...  # type: Any
+    hostname = ...  # type: Any
+    protocol = ...  # type: Any
+    def __init__(self, hostname: Optional[Any] = ..., protocol: Optional[Any] = ...) -> None: ...
+    def to_xml(self): ...
+
+class RoutingRules(list):
+    def add_rule(self, rule): ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
+
+class RoutingRule:
+    condition = ...  # type: Any
+    redirect = ...  # type: Any
+    def __init__(self, condition: Optional[Any] = ..., redirect: Optional[Any] = ...) -> None: ...
+    def startElement(self, name, attrs, connection): ...
+    def endElement(self, name, value, connection): ...
+    def to_xml(self): ...
+    @classmethod
+    def when(cls, key_prefix: Optional[Any] = ..., http_error_code: Optional[Any] = ...): ...
+    def then_redirect(self, hostname: Optional[Any] = ..., protocol: Optional[Any] = ..., replace_key: Optional[Any] = ..., replace_key_prefix: Optional[Any] = ..., http_redirect_code: Optional[Any] = ...): ...
+
+class Condition(_XMLKeyValue):
+    TRANSLATOR = ...  # type: Any
+    key_prefix = ...  # type: Any
+    http_error_code = ...  # type: Any
+    def __init__(self, key_prefix: Optional[Any] = ..., http_error_code: Optional[Any] = ...) -> None: ...
+    def to_xml(self): ...
+
+class Redirect(_XMLKeyValue):
+    TRANSLATOR = ...  # type: Any
+    hostname = ...  # type: Any
+    protocol = ...  # type: Any
+    replace_key = ...  # type: Any
+    replace_key_prefix = ...  # type: Any
+    http_redirect_code = ...  # type: Any
+    def __init__(self, hostname: Optional[Any] = ..., protocol: Optional[Any] = ..., replace_key: Optional[Any] = ..., replace_key_prefix: Optional[Any] = ..., http_redirect_code: Optional[Any] = ...) -> None: ...
+    def to_xml(self): ...
diff --git a/typeshed/third_party/2and3/certifi.pyi b/typeshed/third_party/2and3/certifi.pyi
new file mode 100644
index 0000000..c809e6d
--- /dev/null
+++ b/typeshed/third_party/2and3/certifi.pyi
@@ -0,0 +1,2 @@
+def where() -> str: ...
+def old_where() -> str: ...
diff --git a/typeshed/third_party/2and3/characteristic/__init__.pyi b/typeshed/third_party/2and3/characteristic/__init__.pyi
new file mode 100644
index 0000000..07e0f60
--- /dev/null
+++ b/typeshed/third_party/2and3/characteristic/__init__.pyi
@@ -0,0 +1,34 @@
+from typing import Sequence, Callable, Union, Any, Optional, AnyStr, TypeVar, Type
+
+def with_repr(attrs: Sequence[Union[AnyStr, Attribute]]) -> Callable[..., Any]: ...
+def with_cmp(attrs: Sequence[Union[AnyStr, Attribute]]) -> Callable[..., Any]: ...
+def with_init(attrs: Sequence[Union[AnyStr, Attribute]]) -> Callable[..., Any]: ...
+def immutable(attrs: Sequence[Union[AnyStr, Attribute]]) -> Callable[..., Any]: ...
+
+def strip_leading_underscores(attribute_name: AnyStr) -> AnyStr: ...
+
+NOTHING = Any
+
+T = TypeVar('T')
+
+def attributes(
+    attrs: Sequence[Union[AnyStr, Attribute]],
+    apply_with_cmp: bool = True,
+    apply_with_init: bool = True,
+    apply_with_repr: bool = True,
+    apply_immutable: bool = False,
+    store_attributes: Optional[Callable[[type, Attribute], Any]] = None,
+    **kw: Optional[dict]) -> Callable[[Type[T]], Type[T]]: ...
+
+class Attribute:
+    def __init__(
+        self,
+        name: AnyStr,
+        exclude_from_cmp: bool = False,
+        exclude_from_init: bool = False,
+        exclude_from_repr: bool = False,
+        exclude_from_immutable: bool = False,
+        default_value: Any = NOTHING,
+        default_factory: Optional[Callable[[None], Any]] = None,
+        instance_of: Optional[Any] = None,
+        init_aliaser: Optional[Callable[[AnyStr], AnyStr]] = strip_leading_underscores) -> None: ...
diff --git a/typeshed/third_party/2and3/jinja2/__init__.pyi b/typeshed/third_party/2and3/jinja2/__init__.pyi
new file mode 100644
index 0000000..e77f4fd
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/__init__.pyi
@@ -0,0 +1,11 @@
+# Stubs for jinja2 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from jinja2.environment import Environment as Environment, Template as Template
+from jinja2.loaders import BaseLoader as BaseLoader, FileSystemLoader as FileSystemLoader, PackageLoader as PackageLoader, DictLoader as DictLoader, FunctionLoader as FunctionLoader, PrefixLoader as PrefixLoader, ChoiceLoader as ChoiceLoader, ModuleLoader as ModuleLoader
+from jinja2.bccache import BytecodeCache as BytecodeCache, FileSystemBytecodeCache as FileSystemBytecodeCache, MemcachedBytecodeCache as MemcachedBytecodeCache
+from jinja2.runtime import Undefined as Undefined, DebugUndefined as DebugUndefined, StrictUndefined as StrictUndefined, make_logging_undefined as make_logging_undefined
+from jinja2.exceptions import TemplateError as TemplateError, UndefinedError as UndefinedError, TemplateNotFound as TemplateNotFound, TemplatesNotFound as TemplatesNotFound, TemplateSyntaxError as TemplateSyntaxError, TemplateAssertionError as TemplateAssertionError
+from jinja2.filters import environmentfilter as environmentfilter, contextfilter as contextfilter, evalcontextfilter as evalcontextfilter
+from jinja2.utils import Markup as Markup, escape as escape, clear_caches as clear_caches, environmentfunction as environmentfunction, evalcontextfunction as evalcontextfunction, contextfunction as contextfunction, is_undefined as is_undefined
diff --git a/typeshed/third_party/2and3/jinja2/_compat.pyi b/typeshed/third_party/2and3/jinja2/_compat.pyi
new file mode 100644
index 0000000..1c83f44
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/_compat.pyi
@@ -0,0 +1,38 @@
+# Stubs for jinja2._compat (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+import sys
+
+if sys.version_info[0] >= 3:
+    from io import BytesIO
+    from urllib.parse import quote_from_bytes as url_quote
+else:
+    from cStringIO import StringIO as BytesIO
+    from urllib import quote as url_quote
+
+PY2 = ...  # type: Any
+PYPY = ...  # type: Any
+unichr = ...  # type: Any
+range_type = ...  # type: Any
+text_type = ...  # type: Any
+string_types = ...  # type: Any
+integer_types = ...  # type: Any
+iterkeys = ...  # type: Any
+itervalues = ...  # type: Any
+iteritems = ...  # type: Any
+NativeStringIO = ...  # type: Any
+
+def reraise(tp, value, tb: Optional[Any] = ...): ...
+
+ifilter = ...  # type: Any
+imap = ...  # type: Any
+izip = ...  # type: Any
+intern = ...  # type: Any
+implements_iterator = ...  # type: Any
+implements_to_string = ...  # type: Any
+encode_filename = ...  # type: Any
+get_next = ...  # type: Any
+
+def with_metaclass(meta, *bases): ...
diff --git a/typeshed/third_party/2and3/jinja2/_stringdefs.pyi b/typeshed/third_party/2and3/jinja2/_stringdefs.pyi
new file mode 100644
index 0000000..d09bdbc
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/_stringdefs.pyi
@@ -0,0 +1,44 @@
+# Stubs for jinja2._stringdefs (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+Cc = ...  # type: str
+Cf = ...  # type: str
+Cn = ...  # type: str
+Co = ...  # type: str
+Cs = ...  # type: Any
+Ll = ...  # type: str
+Lm = ...  # type: str
+Lo = ...  # type: str
+Lt = ...  # type: str
+Lu = ...  # type: str
+Mc = ...  # type: str
+Me = ...  # type: str
+Mn = ...  # type: str
+Nd = ...  # type: str
+Nl = ...  # type: str
+No = ...  # type: str
+Pc = ...  # type: str
+Pd = ...  # type: str
+Pe = ...  # type: str
+Pf = ...  # type: str
+Pi = ...  # type: str
+Po = ...  # type: str
+Ps = ...  # type: str
+Sc = ...  # type: str
+Sk = ...  # type: str
+Sm = ...  # type: str
+So = ...  # type: str
+Zl = ...  # type: str
+Zp = ...  # type: str
+Zs = ...  # type: str
+cats = ...  # type: Any
+
+def combine(*args): ...
+
+xid_start = ...  # type: str
+xid_continue = ...  # type: str
+
+def allexcept(*args): ...
diff --git a/typeshed/third_party/2and3/jinja2/bccache.pyi b/typeshed/third_party/2and3/jinja2/bccache.pyi
new file mode 100644
index 0000000..ef03701
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/bccache.pyi
@@ -0,0 +1,48 @@
+# Stubs for jinja2.bccache (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+marshal_dump = ...  # type: Any
+marshal_load = ...  # type: Any
+bc_version = ...  # type: int
+bc_magic = ...  # type: Any
+
+class Bucket:
+    environment = ...  # type: Any
+    key = ...  # type: Any
+    checksum = ...  # type: Any
+    def __init__(self, environment, key, checksum) -> None: ...
+    code = ...  # type: Any
+    def reset(self): ...
+    def load_bytecode(self, f): ...
+    def write_bytecode(self, f): ...
+    def bytecode_from_string(self, string): ...
+    def bytecode_to_string(self): ...
+
+class BytecodeCache:
+    def load_bytecode(self, bucket): ...
+    def dump_bytecode(self, bucket): ...
+    def clear(self): ...
+    def get_cache_key(self, name, filename: Optional[Any] = ...): ...
+    def get_source_checksum(self, source): ...
+    def get_bucket(self, environment, name, filename, source): ...
+    def set_bucket(self, bucket): ...
+
+class FileSystemBytecodeCache(BytecodeCache):
+    directory = ...  # type: Any
+    pattern = ...  # type: Any
+    def __init__(self, directory: Optional[Any] = ..., pattern: str = ...) -> None: ...
+    def load_bytecode(self, bucket): ...
+    def dump_bytecode(self, bucket): ...
+    def clear(self): ...
+
+class MemcachedBytecodeCache(BytecodeCache):
+    client = ...  # type: Any
+    prefix = ...  # type: Any
+    timeout = ...  # type: Any
+    ignore_memcache_errors = ...  # type: Any
+    def __init__(self, client, prefix: str = ..., timeout: Optional[Any] = ..., ignore_memcache_errors: bool = ...) -> None: ...
+    def load_bytecode(self, bucket): ...
+    def dump_bytecode(self, bucket): ...
diff --git a/typeshed/third_party/2and3/jinja2/compiler.pyi b/typeshed/third_party/2and3/jinja2/compiler.pyi
new file mode 100644
index 0000000..44e001c
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/compiler.pyi
@@ -0,0 +1,180 @@
+# Stubs for jinja2.compiler (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from keyword import iskeyword as is_python_keyword
+from jinja2.visitor import NodeVisitor
+
+operators = ...  # type: Any
+dict_item_iter = ...  # type: str
+
+unoptimize_before_dead_code = ...  # type: bool
+
+def generate(node, environment, name, filename, stream: Optional[Any] = ..., defer_init: bool = ...): ...
+def has_safe_repr(value): ...
+def find_undeclared(nodes, names): ...
+
+class Identifiers:
+    declared = ...  # type: Any
+    outer_undeclared = ...  # type: Any
+    undeclared = ...  # type: Any
+    declared_locally = ...  # type: Any
+    declared_parameter = ...  # type: Any
+    def __init__(self) -> None: ...
+    def add_special(self, name): ...
+    def is_declared(self, name): ...
+    def copy(self): ...
+
+class Frame:
+    eval_ctx = ...  # type: Any
+    identifiers = ...  # type: Any
+    toplevel = ...  # type: bool
+    rootlevel = ...  # type: bool
+    require_output_check = ...  # type: Any
+    buffer = ...  # type: Any
+    block = ...  # type: Any
+    assigned_names = ...  # type: Any
+    parent = ...  # type: Any
+    def __init__(self, eval_ctx, parent: Optional[Any] = ...) -> None: ...
+    def copy(self): ...
+    def inspect(self, nodes): ...
+    def find_shadowed(self, extra: Any = ...): ...
+    def inner(self): ...
+    def soft(self): ...
+    __copy__ = ...  # type: Any
+
+class VisitorExit(RuntimeError): ...
+
+class DependencyFinderVisitor(NodeVisitor):
+    filters = ...  # type: Any
+    tests = ...  # type: Any
+    def __init__(self) -> None: ...
+    def visit_Filter(self, node): ...
+    def visit_Test(self, node): ...
+    def visit_Block(self, node): ...
+
+class UndeclaredNameVisitor(NodeVisitor):
+    names = ...  # type: Any
+    undeclared = ...  # type: Any
+    def __init__(self, names) -> None: ...
+    def visit_Name(self, node): ...
+    def visit_Block(self, node): ...
+
+class FrameIdentifierVisitor(NodeVisitor):
+    identifiers = ...  # type: Any
+    def __init__(self, identifiers) -> None: ...
+    def visit_Name(self, node): ...
+    def visit_If(self, node): ...
+    def visit_Macro(self, node): ...
+    def visit_Import(self, node): ...
+    def visit_FromImport(self, node): ...
+    def visit_Assign(self, node): ...
+    def visit_For(self, node): ...
+    def visit_CallBlock(self, node): ...
+    def visit_FilterBlock(self, node): ...
+    def visit_AssignBlock(self, node): ...
+    def visit_Scope(self, node): ...
+    def visit_Block(self, node): ...
+
+class CompilerExit(Exception): ...
+
+class CodeGenerator(NodeVisitor):
+    environment = ...  # type: Any
+    name = ...  # type: Any
+    filename = ...  # type: Any
+    stream = ...  # type: Any
+    created_block_context = ...  # type: bool
+    defer_init = ...  # type: Any
+    import_aliases = ...  # type: Any
+    blocks = ...  # type: Any
+    extends_so_far = ...  # type: int
+    has_known_extends = ...  # type: bool
+    code_lineno = ...  # type: int
+    tests = ...  # type: Any
+    filters = ...  # type: Any
+    debug_info = ...  # type: Any
+    def __init__(self, environment, name, filename, stream: Optional[Any] = ..., defer_init: bool = ...) -> None: ...
+    def fail(self, msg, lineno): ...
+    def temporary_identifier(self): ...
+    def buffer(self, frame): ...
+    def return_buffer_contents(self, frame): ...
+    def indent(self): ...
+    def outdent(self, step: int = ...): ...
+    def start_write(self, frame, node: Optional[Any] = ...): ...
+    def end_write(self, frame): ...
+    def simple_write(self, s, frame, node: Optional[Any] = ...): ...
+    def blockvisit(self, nodes, frame): ...
+    def write(self, x): ...
+    def writeline(self, x, node: Optional[Any] = ..., extra: int = ...): ...
+    def newline(self, node: Optional[Any] = ..., extra: int = ...): ...
+    def signature(self, node, frame, extra_kwargs: Optional[Any] = ...): ...
+    def pull_locals(self, frame): ...
+    def pull_dependencies(self, nodes): ...
+    def unoptimize_scope(self, frame): ...
+    def push_scope(self, frame, extra_vars: Any = ...): ...
+    def pop_scope(self, aliases, frame): ...
+    def function_scoping(self, node, frame, children: Optional[Any] = ..., find_special: bool = ...): ...
+    def macro_body(self, node, frame, children: Optional[Any] = ...): ...
+    def macro_def(self, node, frame): ...
+    def position(self, node): ...
+    def visit_Template(self, node, frame: Optional[Any] = ...): ...
+    def visit_Block(self, node, frame): ...
+    def visit_Extends(self, node, frame): ...
+    def visit_Include(self, node, frame): ...
+    def visit_Import(self, node, frame): ...
+    def visit_FromImport(self, node, frame): ...
+    def visit_For(self, node, frame): ...
+    def visit_If(self, node, frame): ...
+    def visit_Macro(self, node, frame): ...
+    def visit_CallBlock(self, node, frame): ...
+    def visit_FilterBlock(self, node, frame): ...
+    def visit_ExprStmt(self, node, frame): ...
+    def visit_Output(self, node, frame): ...
+    def make_assignment_frame(self, frame): ...
+    def export_assigned_vars(self, frame, assignment_frame): ...
+    def visit_Assign(self, node, frame): ...
+    def visit_AssignBlock(self, node, frame): ...
+    def visit_Name(self, node, frame): ...
+    def visit_Const(self, node, frame): ...
+    def visit_TemplateData(self, node, frame): ...
+    def visit_Tuple(self, node, frame): ...
+    def visit_List(self, node, frame): ...
+    def visit_Dict(self, node, frame): ...
+    def binop(operator, interceptable: bool = ...): ...
+    def uaop(operator, interceptable: bool = ...): ...
+    visit_Add = ...  # type: Any
+    visit_Sub = ...  # type: Any
+    visit_Mul = ...  # type: Any
+    visit_Div = ...  # type: Any
+    visit_FloorDiv = ...  # type: Any
+    visit_Pow = ...  # type: Any
+    visit_Mod = ...  # type: Any
+    visit_And = ...  # type: Any
+    visit_Or = ...  # type: Any
+    visit_Pos = ...  # type: Any
+    visit_Neg = ...  # type: Any
+    visit_Not = ...  # type: Any
+    def visit_Concat(self, node, frame): ...
+    def visit_Compare(self, node, frame): ...
+    def visit_Operand(self, node, frame): ...
+    def visit_Getattr(self, node, frame): ...
+    def visit_Getitem(self, node, frame): ...
+    def visit_Slice(self, node, frame): ...
+    def visit_Filter(self, node, frame): ...
+    def visit_Test(self, node, frame): ...
+    def visit_CondExpr(self, node, frame): ...
+    def visit_Call(self, node, frame, forward_caller: bool = ...): ...
+    def visit_Keyword(self, node, frame): ...
+    def visit_MarkSafe(self, node, frame): ...
+    def visit_MarkSafeIfAutoescape(self, node, frame): ...
+    def visit_EnvironmentAttribute(self, node, frame): ...
+    def visit_ExtensionAttribute(self, node, frame): ...
+    def visit_ImportedName(self, node, frame): ...
+    def visit_InternalName(self, node, frame): ...
+    def visit_ContextReference(self, node, frame): ...
+    def visit_Continue(self, node, frame): ...
+    def visit_Break(self, node, frame): ...
+    def visit_Scope(self, node, frame): ...
+    def visit_EvalContextModifier(self, node, frame): ...
+    def visit_ScopedEvalContextModifier(self, node, frame): ...
diff --git a/typeshed/third_party/2and3/jinja2/constants.pyi b/typeshed/third_party/2and3/jinja2/constants.pyi
new file mode 100644
index 0000000..ca47cb0
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/constants.pyi
@@ -0,0 +1,5 @@
+# Stubs for jinja2.constants (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+LOREM_IPSUM_WORDS = ...  # type: str
diff --git a/typeshed/third_party/2and3/jinja2/debug.pyi b/typeshed/third_party/2and3/jinja2/debug.pyi
new file mode 100644
index 0000000..270acf5
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/debug.pyi
@@ -0,0 +1,41 @@
+# Stubs for jinja2.debug (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+tproxy = ...  # type: Any
+raise_helper = ...  # type: str
+
+class TracebackFrameProxy:
+    tb = ...  # type: Any
+    def __init__(self, tb) -> None: ...
+    @property
+    def tb_next(self): ...
+    def set_next(self, next): ...
+    @property
+    def is_jinja_frame(self): ...
+    def __getattr__(self, name): ...
+
+def make_frame_proxy(frame): ...
+
+class ProcessedTraceback:
+    exc_type = ...  # type: Any
+    exc_value = ...  # type: Any
+    frames = ...  # type: Any
+    def __init__(self, exc_type, exc_value, frames) -> None: ...
+    def render_as_text(self, limit: Optional[Any] = ...): ...
+    def render_as_html(self, full: bool = ...): ...
+    @property
+    def is_template_syntax_error(self): ...
+    @property
+    def exc_info(self): ...
+    @property
+    def standard_exc_info(self): ...
+
+def make_traceback(exc_info, source_hint: Optional[Any] = ...): ...
+def translate_syntax_error(error, source: Optional[Any] = ...): ...
+def translate_exception(exc_info, initial_skip: int = ...): ...
+def fake_exc_info(exc_info, filename, lineno): ...
+
+tb_set_next = ...  # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/defaults.pyi b/typeshed/third_party/2and3/jinja2/defaults.pyi
new file mode 100644
index 0000000..0788c7c
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/defaults.pyi
@@ -0,0 +1,25 @@
+# Stubs for jinja2.defaults (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from jinja2.filters import FILTERS as DEFAULT_FILTERS
+from jinja2.tests import TESTS as DEFAULT_TESTS
+
+BLOCK_START_STRING = ...  # type: str
+BLOCK_END_STRING = ...  # type: str
+VARIABLE_START_STRING = ...  # type: str
+VARIABLE_END_STRING = ...  # type: str
+COMMENT_START_STRING = ...  # type: str
+COMMENT_END_STRING = ...  # type: str
+LINE_STATEMENT_PREFIX = ...  # type: Any
+LINE_COMMENT_PREFIX = ...  # type: Any
+TRIM_BLOCKS = ...  # type: bool
+LSTRIP_BLOCKS = ...  # type: bool
+NEWLINE_SEQUENCE = ...  # type: str
+KEEP_TRAILING_NEWLINE = ...  # type: bool
+DEFAULT_NAMESPACE = ...  # type: Any
+
+# Names in __all__ with no definition:
+#   DEFAULT_FILTERS
+#   DEFAULT_TESTS
diff --git a/typeshed/third_party/2and3/jinja2/environment.pyi b/typeshed/third_party/2and3/jinja2/environment.pyi
new file mode 100644
index 0000000..559369a
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/environment.pyi
@@ -0,0 +1,109 @@
+# Stubs for jinja2.environment (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Callable, Dict, Iterator, List, Optional, Text, Type, Union
+
+from .bccache import BytecodeCache
+from .loaders import BaseLoader
+from .runtime import Context, Undefined
+
+def get_spontaneous_environment(*args): ...
+def create_cache(size): ...
+def copy_cache(cache): ...
+def load_extensions(environment, extensions): ...
+
+class Environment:
+    sandboxed = ...  # type: bool
+    overlayed = ...  # type: bool
+    linked_to = ...  # type: Any
+    shared = ...  # type: bool
+    exception_handler = ...  # type: Any
+    exception_formatter = ...  # type: Any
+    code_generator_class = ...  # type: Any
+    context_class = ...  # type: Any
+    block_start_string = ...  # type: Text
+    block_end_string = ...  # type: Text
+    variable_start_string = ...  # type: Text
+    variable_end_string = ...  # type: Text
+    comment_start_string = ...  # type: Text
+    comment_end_string = ...  # type: Text
+    line_statement_prefix = ...  # type: Text
+    line_comment_prefix = ...  # type: Text
+    trim_blocks = ...  # type: bool
+    lstrip_blocks = ...  # type: Any
+    newline_sequence = ...  # type: Text
+    keep_trailing_newline = ...  # type: bool
+    undefined = ...  # type: Type[Undefined]
+    optimized = ...  # type: bool
+    finalize = ...  # type: Callable
+    autoescape = ...  # type: Any
+    filters = ...  # type: Any
+    tests = ...  # type: Any
+    globals = ...  # type: Dict[str, Any]
+    loader = ...  # type: BaseLoader
+    cache = ...  # type: Any
+    bytecode_cache = ...  # type: BytecodeCache
+    auto_reload = ...  # type: bool
+    extensions = ...  # type: List
+    def __init__(self, block_start_string: Text = ..., block_end_string: Text = ..., variable_start_string: Text = ..., variable_end_string: Text = ..., comment_start_string: Any = ..., comment_end_string: Text = ..., line_statement_prefix: Text = ..., line_comment_prefix: Text = ..., trim_blocks: bool = ..., lstrip_blocks: bool = ..., newline_sequence: Text = ..., keep_trailing_newline: bool = ..., extensions: List = ..., optimized: bool = ..., undefined: Type[Undefined] = ..., finalize [...]
+    def add_extension(self, extension): ...
+    def extend(self, **attributes): ...
+    def overlay(self, block_start_string: Text = ..., block_end_string: Text = ..., variable_start_string: Text = ..., variable_end_string: Text = ..., comment_start_string: Any = ..., comment_end_string: Text = ..., line_statement_prefix: Text = ..., line_comment_prefix: Text = ..., trim_blocks: bool = ..., lstrip_blocks: bool = ..., extensions: List = ..., optimized: bool = ..., undefined: Type[Undefined] = ..., finalize: Callable = ..., autoescape: bool = ..., loader: Optional[BaseLoa [...]
+    lexer = ...  # type: Any
+    def iter_extensions(self): ...
+    def getitem(self, obj, argument): ...
+    def getattr(self, obj, attribute): ...
+    def call_filter(self, name, value, args: Optional[Any] = ..., kwargs: Optional[Any] = ..., context: Optional[Any] = ..., eval_ctx: Optional[Any] = ...): ...
+    def call_test(self, name, value, args: Optional[Any] = ..., kwargs: Optional[Any] = ...): ...
+    def parse(self, source, name: Optional[Any] = ..., filename: Optional[Any] = ...): ...
+    def lex(self, source, name: Optional[Any] = ..., filename: Optional[Any] = ...): ...
+    def preprocess(self, source: Text, name: Optional[Any] = ..., filename: Optional[Any] = ...): ...
+    def compile(self, source, name: Optional[Any] = ..., filename: Optional[Any] = ..., raw: bool = ..., defer_init: bool = ...): ...
+    def compile_expression(self, source: Text, undefined_to_none: bool = ...): ...
+    def compile_templates(self, target, extensions: Optional[Any] = ..., filter_func: Optional[Any] = ..., zip: str = ..., log_function: Optional[Any] = ..., ignore_errors: bool = ..., py_compile: bool = ...): ...
+    def list_templates(self, extensions: Optional[Any] = ..., filter_func: Optional[Any] = ...): ...
+    def handle_exception(self, exc_info: Optional[Any] = ..., rendered: bool = ..., source_hint: Optional[Any] = ...): ...
+    def join_path(self, template: Union[Template, Text], parent: Text) -> Text: ...
+    def get_template(self, name: Union[Template, Text], parent: Optional[Text] = ..., globals: Optional[Any] = ...) -> Template: ...
+    def select_template(self, names: List[Union[Template, Text]], parent: Optional[Text] = ..., globals: Optional[Dict[str, Any]] = ...) -> Template: ...
+    def get_or_select_template(self, template_name_or_list: Union[Union[Template, Text], List[Union[Template, Text]]], parent: Optional[Text] = ..., globals: Optional[Dict[str, Any]] = ...) -> Template: ...
+    def from_string(self, source: Text, globals: Optional[Dict[str, Any]] = ..., template_class: Optional[Type[Template]] = ...) -> Template: ...
+    def make_globals(self, d: Optional[Dict[str, Any]]) -> Dict[str, Any]: ...
+
+class Template:
+    def __new__(cls, source, block_start_string: Any = ..., block_end_string: Any = ..., variable_start_string: Any = ..., variable_end_string: Any = ..., comment_start_string: Any = ..., comment_end_string: Any = ..., line_statement_prefix: Any = ..., line_comment_prefix: Any = ..., trim_blocks: Any = ..., lstrip_blocks: Any = ..., newline_sequence: Any = ..., keep_trailing_newline: Any = ..., extensions: Any = ..., optimized: bool = ..., undefined: Any = ..., finalize: Optional[Any] =  [...]
+    @classmethod
+    def from_code(cls, environment, code, globals, uptodate: Optional[Any] = ...): ...
+    @classmethod
+    def from_module_dict(cls, environment, module_dict, globals): ...
+    def render(self, *args, **kwargs) -> Text: ...
+    def stream(self, *args, **kwargs) -> TemplateStream: ...
+    def generate(self, *args, **kwargs) -> Iterator[Text]: ...
+    def new_context(self, vars: Optional[Dict[str, Any]] = ..., shared: bool = ..., locals: Optional[Dict[str, Any]] = ...) -> Context: ...
+    def make_module(self, vars: Optional[Dict[str, Any]] = ..., shared: bool = ..., locals: Optional[Dict[str, Any]] = ...) -> Context: ...
+    @property
+    def module(self) -> Any: ...
+    def get_corresponding_lineno(self, lineno): ...
+    @property
+    def is_up_to_date(self) -> bool: ...
+    @property
+    def debug_info(self): ...
+
+class TemplateModule:
+    __name__ = ...  # type: Any
+    def __init__(self, template, context) -> None: ...
+    def __html__(self): ...
+
+class TemplateExpression:
+    def __init__(self, template, undefined_to_none) -> None: ...
+    def __call__(self, *args, **kwargs): ...
+
+class TemplateStream:
+    def __init__(self, gen) -> None: ...
+    def dump(self, fp, encoding: Optional[Text] = ..., errors: Text = ...): ...
+    buffered = ...  # type: bool
+    def disable_buffering(self) -> None: ...
+    def enable_buffering(self, size: int = ...) -> None: ...
+    def __iter__(self): ...
+    def __next__(self): ...
diff --git a/typeshed/third_party/2and3/jinja2/exceptions.pyi b/typeshed/third_party/2and3/jinja2/exceptions.pyi
new file mode 100644
index 0000000..1008167
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/exceptions.pyi
@@ -0,0 +1,37 @@
+# Stubs for jinja2.exceptions (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional, Text
+
+class TemplateError(Exception):
+    def __init__(self, message: Optional[Text] = ...) -> None: ...
+    @property
+    def message(self): ...
+    def __unicode__(self): ...
+    @property
+    def message(self): ...
+
+class TemplateNotFound(IOError, LookupError, TemplateError):
+    message = ...  # type: Any
+    name = ...  # type: Any
+    templates = ...  # type: Any
+    def __init__(self, name, message: Optional[Text] = ...) -> None: ...
+
+class TemplatesNotFound(TemplateNotFound):
+    templates = ...  # type: Any
+    def __init__(self, names: Any = ..., message: Optional[Text] = ...) -> None: ...
+
+class TemplateSyntaxError(TemplateError):
+    lineno = ...  # type: int
+    name = ...  # type: Text
+    filename = ...  # type: Text
+    source = ...  # type: Text
+    translated = ...  # type: bool
+    def __init__(self, message: Text, lineno: int, name: Optional[Text] = ..., filename: Optional[Text] = ...) -> None: ...
+
+class TemplateAssertionError(TemplateSyntaxError): ...
+class TemplateRuntimeError(TemplateError): ...
+class UndefinedError(TemplateRuntimeError): ...
+class SecurityError(TemplateRuntimeError): ...
+class FilterArgumentError(TemplateRuntimeError): ...
diff --git a/typeshed/third_party/2and3/jinja2/ext.pyi b/typeshed/third_party/2and3/jinja2/ext.pyi
new file mode 100644
index 0000000..5159242
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/ext.pyi
@@ -0,0 +1,62 @@
+# Stubs for jinja2.ext (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+GETTEXT_FUNCTIONS = ...  # type: Any
+
+class ExtensionRegistry(type):
+    def __new__(cls, name, bases, d): ...
+
+class Extension:
+    tags = ...  # type: Any
+    priority = ...  # type: int
+    environment = ...  # type: Any
+    def __init__(self, environment) -> None: ...
+    def bind(self, environment): ...
+    def preprocess(self, source, name, filename: Optional[Any] = ...): ...
+    def filter_stream(self, stream): ...
+    def parse(self, parser): ...
+    def attr(self, name, lineno: Optional[Any] = ...): ...
+    def call_method(self, name, args: Optional[Any] = ..., kwargs: Optional[Any] = ..., dyn_args: Optional[Any] = ..., dyn_kwargs: Optional[Any] = ..., lineno: Optional[Any] = ...): ...
+
+class InternationalizationExtension(Extension):
+    tags = ...  # type: Any
+    def __init__(self, environment) -> None: ...
+    def parse(self, parser): ...
+
+class ExprStmtExtension(Extension):
+    tags = ...  # type: Any
+    def parse(self, parser): ...
+
+class LoopControlExtension(Extension):
+    tags = ...  # type: Any
+    def parse(self, parser): ...
+
+class WithExtension(Extension):
+    tags = ...  # type: Any
+    def parse(self, parser): ...
+
+class AutoEscapeExtension(Extension):
+    tags = ...  # type: Any
+    def parse(self, parser): ...
+
+def extract_from_ast(node, gettext_functions: Any = ..., babel_style: bool = ...): ...
+
+class _CommentFinder:
+    tokens = ...  # type: Any
+    comment_tags = ...  # type: Any
+    offset = ...  # type: int
+    last_lineno = ...  # type: int
+    def __init__(self, tokens, comment_tags) -> None: ...
+    def find_backwards(self, offset): ...
+    def find_comments(self, lineno): ...
+
+def babel_extract(fileobj, keywords, comment_tags, options): ...
+
+i18n = ...  # type: Any
+do = ...  # type: Any
+loopcontrols = ...  # type: Any
+with_ = ...  # type: Any
+autoescape = ...  # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/filters.pyi b/typeshed/third_party/2and3/jinja2/filters.pyi
new file mode 100644
index 0000000..7da165f
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/filters.pyi
@@ -0,0 +1,61 @@
+# Stubs for jinja2.filters (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+def contextfilter(f): ...
+def evalcontextfilter(f): ...
+def environmentfilter(f): ...
+def make_attrgetter(environment, attribute): ...
+def do_forceescape(value): ...
+def do_urlencode(value): ...
+def do_replace(eval_ctx, s, old, new, count: Optional[Any] = ...): ...
+def do_upper(s): ...
+def do_lower(s): ...
+def do_xmlattr(_eval_ctx, d, autospace: bool = ...): ...
+def do_capitalize(s): ...
+def do_title(s): ...
+def do_dictsort(value, case_sensitive: bool = ..., by: str = ...): ...
+def do_sort(environment, value, reverse: bool = ..., case_sensitive: bool = ..., attribute: Optional[Any] = ...): ...
+def do_default(value, default_value: str = ..., boolean: bool = ...): ...
+def do_join(eval_ctx, value, d: str = ..., attribute: Optional[Any] = ...): ...
+def do_center(value, width: int = ...): ...
+def do_first(environment, seq): ...
+def do_last(environment, seq): ...
+def do_random(environment, seq): ...
+def do_filesizeformat(value, binary: bool = ...): ...
+def do_pprint(value, verbose: bool = ...): ...
+def do_urlize(eval_ctx, value, trim_url_limit: Optional[Any] = ..., nofollow: bool = ..., target: Optional[Any] = ...): ...
+def do_indent(s, width: int = ..., indentfirst: bool = ...): ...
+def do_truncate(s, length: int = ..., killwords: bool = ..., end: str = ...): ...
+def do_wordwrap(environment, s, width: int = ..., break_long_words: bool = ..., wrapstring: Optional[Any] = ...): ...
+def do_wordcount(s): ...
+def do_int(value, default: int = ..., base: int = ...): ...
+def do_float(value, default: float = ...): ...
+def do_format(value, *args, **kwargs): ...
+def do_trim(value): ...
+def do_striptags(value): ...
+def do_slice(value, slices, fill_with: Optional[Any] = ...): ...
+def do_batch(value, linecount, fill_with: Optional[Any] = ...): ...
+def do_round(value, precision: int = ..., method: str = ...): ...
+def do_groupby(environment, value, attribute): ...
+
+class _GroupTuple(tuple):
+    grouper = ...  # type: Any
+    list = ...  # type: Any
+    def __new__(cls, xxx_todo_changeme): ...
+
+def do_sum(environment, iterable, attribute: Optional[Any] = ..., start: int = ...): ...
+def do_list(value): ...
+def do_mark_safe(value): ...
+def do_mark_unsafe(value): ...
+def do_reverse(value): ...
+def do_attr(environment, obj, name): ...
+def do_map(*args, **kwargs): ...
+def do_select(*args, **kwargs): ...
+def do_reject(*args, **kwargs): ...
+def do_selectattr(*args, **kwargs): ...
+def do_rejectattr(*args, **kwargs): ...
+
+FILTERS = ...  # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/lexer.pyi b/typeshed/third_party/2and3/jinja2/lexer.pyi
new file mode 100644
index 0000000..b571a48
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/lexer.pyi
@@ -0,0 +1,121 @@
+# Stubs for jinja2.lexer (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+whitespace_re = ...  # type: Any
+string_re = ...  # type: Any
+integer_re = ...  # type: Any
+name_re = ...  # type: Any
+float_re = ...  # type: Any
+newline_re = ...  # type: Any
+TOKEN_ADD = ...  # type: Any
+TOKEN_ASSIGN = ...  # type: Any
+TOKEN_COLON = ...  # type: Any
+TOKEN_COMMA = ...  # type: Any
+TOKEN_DIV = ...  # type: Any
+TOKEN_DOT = ...  # type: Any
+TOKEN_EQ = ...  # type: Any
+TOKEN_FLOORDIV = ...  # type: Any
+TOKEN_GT = ...  # type: Any
+TOKEN_GTEQ = ...  # type: Any
+TOKEN_LBRACE = ...  # type: Any
+TOKEN_LBRACKET = ...  # type: Any
+TOKEN_LPAREN = ...  # type: Any
+TOKEN_LT = ...  # type: Any
+TOKEN_LTEQ = ...  # type: Any
+TOKEN_MOD = ...  # type: Any
+TOKEN_MUL = ...  # type: Any
+TOKEN_NE = ...  # type: Any
+TOKEN_PIPE = ...  # type: Any
+TOKEN_POW = ...  # type: Any
+TOKEN_RBRACE = ...  # type: Any
+TOKEN_RBRACKET = ...  # type: Any
+TOKEN_RPAREN = ...  # type: Any
+TOKEN_SEMICOLON = ...  # type: Any
+TOKEN_SUB = ...  # type: Any
+TOKEN_TILDE = ...  # type: Any
+TOKEN_WHITESPACE = ...  # type: Any
+TOKEN_FLOAT = ...  # type: Any
+TOKEN_INTEGER = ...  # type: Any
+TOKEN_NAME = ...  # type: Any
+TOKEN_STRING = ...  # type: Any
+TOKEN_OPERATOR = ...  # type: Any
+TOKEN_BLOCK_BEGIN = ...  # type: Any
+TOKEN_BLOCK_END = ...  # type: Any
+TOKEN_VARIABLE_BEGIN = ...  # type: Any
+TOKEN_VARIABLE_END = ...  # type: Any
+TOKEN_RAW_BEGIN = ...  # type: Any
+TOKEN_RAW_END = ...  # type: Any
+TOKEN_COMMENT_BEGIN = ...  # type: Any
+TOKEN_COMMENT_END = ...  # type: Any
+TOKEN_COMMENT = ...  # type: Any
+TOKEN_LINESTATEMENT_BEGIN = ...  # type: Any
+TOKEN_LINESTATEMENT_END = ...  # type: Any
+TOKEN_LINECOMMENT_BEGIN = ...  # type: Any
+TOKEN_LINECOMMENT_END = ...  # type: Any
+TOKEN_LINECOMMENT = ...  # type: Any
+TOKEN_DATA = ...  # type: Any
+TOKEN_INITIAL = ...  # type: Any
+TOKEN_EOF = ...  # type: Any
+operators = ...  # type: Any
+reverse_operators = ...  # type: Any
+operator_re = ...  # type: Any
+ignored_tokens = ...  # type: Any
+ignore_if_empty = ...  # type: Any
+
+def describe_token(token): ...
+def describe_token_expr(expr): ...
+def count_newlines(value): ...
+def compile_rules(environment): ...
+
+class Failure:
+    message = ...  # type: Any
+    error_class = ...  # type: Any
+    def __init__(self, message, cls: Any = ...) -> None: ...
+    def __call__(self, lineno, filename): ...
+
+class Token(tuple):
+    lineno = ...  # type: Any
+    type = ...  # type: Any
+    value = ...  # type: Any
+    def __new__(cls, lineno, type, value): ...
+    def test(self, expr): ...
+    def test_any(self, *iterable): ...
+
+class TokenStreamIterator:
+    stream = ...  # type: Any
+    def __init__(self, stream) -> None: ...
+    def __iter__(self): ...
+    def __next__(self): ...
+
+class TokenStream:
+    name = ...  # type: Any
+    filename = ...  # type: Any
+    closed = ...  # type: bool
+    current = ...  # type: Any
+    def __init__(self, generator, name, filename) -> None: ...
+    def __iter__(self): ...
+    def __bool__(self): ...
+    __nonzero__ = ...  # type: Any
+    eos = ...  # type: Any
+    def push(self, token): ...
+    def look(self): ...
+    def skip(self, n: int = ...): ...
+    def next_if(self, expr): ...
+    def skip_if(self, expr): ...
+    def __next__(self): ...
+    def close(self): ...
+    def expect(self, expr): ...
+
+def get_lexer(environment): ...
+
+class Lexer:
+    newline_sequence = ...  # type: Any
+    keep_trailing_newline = ...  # type: Any
+    rules = ...  # type: Any
+    def __init__(self, environment) -> None: ...
+    def tokenize(self, source, name: Optional[Any] = ..., filename: Optional[Any] = ..., state: Optional[Any] = ...): ...
+    def wrap(self, stream, name: Optional[Any] = ..., filename: Optional[Any] = ...): ...
+    def tokeniter(self, source, name, filename: Optional[Any] = ..., state: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/jinja2/loaders.pyi b/typeshed/third_party/2and3/jinja2/loaders.pyi
new file mode 100644
index 0000000..7de950e
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/loaders.pyi
@@ -0,0 +1,74 @@
+# Stubs for jinja2.loaders (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Callable, List, Optional, Text, Tuple
+from types import ModuleType
+
+from .environment import Environment
+
+def split_template_path(template: Text) -> List[Text]: ...
+
+class BaseLoader:
+    has_source_access = ...  # type: bool
+    def get_source(self, environment, template): ...
+    def list_templates(self): ...
+    def load(self, environment, name, globals: Optional[Any] = ...): ...
+
+class FileSystemLoader(BaseLoader):
+    searchpath = ...  # type: Text
+    encoding = ...  # type: Any
+    followlinks = ...  # type: Any
+    def __init__(self, searchpath: Text, encoding: Text = ..., followlinks: bool = ...) -> None: ...
+    def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+    def list_templates(self): ...
+
+class PackageLoader(BaseLoader):
+    encoding = ...  # type: Text
+    manager = ...  # type: Any
+    filesystem_bound = ...  # type: Any
+    provider = ...  # type: Any
+    package_path = ...  # type: Any
+    def __init__(self, package_name: Text, package_path: Text = ..., encoding: Text = ...) -> None: ...
+    def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+    def list_templates(self): ...
+
+class DictLoader(BaseLoader):
+    mapping = ...  # type: Any
+    def __init__(self, mapping) -> None: ...
+    def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+    def list_templates(self): ...
+
+class FunctionLoader(BaseLoader):
+    load_func = ...  # type: Any
+    def __init__(self, load_func) -> None: ...
+    def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+
+class PrefixLoader(BaseLoader):
+    mapping = ...  # type: Any
+    delimiter = ...  # type: Any
+    def __init__(self, mapping, delimiter: str = ...) -> None: ...
+    def get_loader(self, template): ...
+    def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+    def load(self, environment, name, globals: Optional[Any] = ...): ...
+    def list_templates(self): ...
+
+class ChoiceLoader(BaseLoader):
+    loaders = ...  # type: Any
+    def __init__(self, loaders) -> None: ...
+    def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+    def load(self, environment, name, globals: Optional[Any] = ...): ...
+    def list_templates(self): ...
+
+class _TemplateModule(ModuleType): ...
+
+class ModuleLoader(BaseLoader):
+    has_source_access = ...  # type: bool
+    module = ...  # type: Any
+    package_name = ...  # type: Any
+    def __init__(self, path) -> None: ...
+    @staticmethod
+    def get_template_key(name): ...
+    @staticmethod
+    def get_module_filename(name): ...
+    def load(self, environment, name, globals: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/jinja2/meta.pyi b/typeshed/third_party/2and3/jinja2/meta.pyi
new file mode 100644
index 0000000..998cc80
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/meta.pyi
@@ -0,0 +1,15 @@
+# Stubs for jinja2.meta (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from jinja2.compiler import CodeGenerator
+
+class TrackingCodeGenerator(CodeGenerator):
+    undeclared_identifiers = ...  # type: Any
+    def __init__(self, environment) -> None: ...
+    def write(self, x): ...
+    def pull_locals(self, frame): ...
+
+def find_undeclared_variables(ast): ...
+def find_referenced_templates(ast): ...
diff --git a/typeshed/third_party/2and3/jinja2/nodes.pyi b/typeshed/third_party/2and3/jinja2/nodes.pyi
new file mode 100644
index 0000000..ce43bb3
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/nodes.pyi
@@ -0,0 +1,254 @@
+# Stubs for jinja2.nodes (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Impossible(Exception): ...
+
+class NodeType(type):
+    def __new__(cls, name, bases, d): ...
+
+class EvalContext:
+    environment = ...  # type: Any
+    autoescape = ...  # type: Any
+    volatile = ...  # type: bool
+    def __init__(self, environment, template_name: Optional[Any] = ...) -> None: ...
+    def save(self): ...
+    def revert(self, old): ...
+
+def get_eval_context(node, ctx): ...
+
+class Node:
+    fields = ...  # type: Any
+    attributes = ...  # type: Any
+    abstract = ...  # type: bool
+    def __init__(self, *fields, **attributes) -> None: ...
+    def iter_fields(self, exclude: Optional[Any] = ..., only: Optional[Any] = ...): ...
+    def iter_child_nodes(self, exclude: Optional[Any] = ..., only: Optional[Any] = ...): ...
+    def find(self, node_type): ...
+    def find_all(self, node_type): ...
+    def set_ctx(self, ctx): ...
+    def set_lineno(self, lineno, override: bool = ...): ...
+    def set_environment(self, environment): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    __hash__ = ...  # type: Any
+
+class Stmt(Node):
+    abstract = ...  # type: bool
+
+class Helper(Node):
+    abstract = ...  # type: bool
+
+class Template(Node):
+    fields = ...  # type: Any
+
+class Output(Stmt):
+    fields = ...  # type: Any
+
+class Extends(Stmt):
+    fields = ...  # type: Any
+
+class For(Stmt):
+    fields = ...  # type: Any
+
+class If(Stmt):
+    fields = ...  # type: Any
+
+class Macro(Stmt):
+    fields = ...  # type: Any
+
+class CallBlock(Stmt):
+    fields = ...  # type: Any
+
+class FilterBlock(Stmt):
+    fields = ...  # type: Any
+
+class Block(Stmt):
+    fields = ...  # type: Any
+
+class Include(Stmt):
+    fields = ...  # type: Any
+
+class Import(Stmt):
+    fields = ...  # type: Any
+
+class FromImport(Stmt):
+    fields = ...  # type: Any
+
+class ExprStmt(Stmt):
+    fields = ...  # type: Any
+
+class Assign(Stmt):
+    fields = ...  # type: Any
+
+class AssignBlock(Stmt):
+    fields = ...  # type: Any
+
+class Expr(Node):
+    abstract = ...  # type: bool
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+    def can_assign(self): ...
+
+class BinExpr(Expr):
+    fields = ...  # type: Any
+    operator = ...  # type: Any
+    abstract = ...  # type: bool
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class UnaryExpr(Expr):
+    fields = ...  # type: Any
+    operator = ...  # type: Any
+    abstract = ...  # type: bool
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Name(Expr):
+    fields = ...  # type: Any
+    def can_assign(self): ...
+
+class Literal(Expr):
+    abstract = ...  # type: bool
+
+class Const(Literal):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+    @classmethod
+    def from_untrusted(cls, value, lineno: Optional[Any] = ..., environment: Optional[Any] = ...): ...
+
+class TemplateData(Literal):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Tuple(Literal):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+    def can_assign(self): ...
+
+class List(Literal):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Dict(Literal):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Pair(Helper):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Keyword(Helper):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class CondExpr(Expr):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Filter(Expr):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Test(Expr):
+    fields = ...  # type: Any
+
+class Call(Expr):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Getitem(Expr):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+    def can_assign(self): ...
+
+class Getattr(Expr):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+    def can_assign(self): ...
+
+class Slice(Expr):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Concat(Expr):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Compare(Expr):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Operand(Helper):
+    fields = ...  # type: Any
+
+class Mul(BinExpr):
+    operator = ...  # type: str
+
+class Div(BinExpr):
+    operator = ...  # type: str
+
+class FloorDiv(BinExpr):
+    operator = ...  # type: str
+
+class Add(BinExpr):
+    operator = ...  # type: str
+
+class Sub(BinExpr):
+    operator = ...  # type: str
+
+class Mod(BinExpr):
+    operator = ...  # type: str
+
+class Pow(BinExpr):
+    operator = ...  # type: str
+
+class And(BinExpr):
+    operator = ...  # type: str
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Or(BinExpr):
+    operator = ...  # type: str
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Not(UnaryExpr):
+    operator = ...  # type: str
+
+class Neg(UnaryExpr):
+    operator = ...  # type: str
+
+class Pos(UnaryExpr):
+    operator = ...  # type: str
+
+class EnvironmentAttribute(Expr):
+    fields = ...  # type: Any
+
+class ExtensionAttribute(Expr):
+    fields = ...  # type: Any
+
+class ImportedName(Expr):
+    fields = ...  # type: Any
+
+class InternalName(Expr):
+    fields = ...  # type: Any
+    def __init__(self) -> None: ...
+
+class MarkSafe(Expr):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class MarkSafeIfAutoescape(Expr):
+    fields = ...  # type: Any
+    def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class ContextReference(Expr): ...
+class Continue(Stmt): ...
+class Break(Stmt): ...
+
+class Scope(Stmt):
+    fields = ...  # type: Any
+
+class EvalContextModifier(Stmt):
+    fields = ...  # type: Any
+
+class ScopedEvalContextModifier(EvalContextModifier):
+    fields = ...  # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/optimizer.pyi b/typeshed/third_party/2and3/jinja2/optimizer.pyi
new file mode 100644
index 0000000..2c30671
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/optimizer.pyi
@@ -0,0 +1,33 @@
+# Stubs for jinja2.optimizer (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from jinja2.visitor import NodeTransformer
+
+def optimize(node, environment): ...
+
+class Optimizer(NodeTransformer):
+    environment = ...  # type: Any
+    def __init__(self, environment) -> None: ...
+    def visit_If(self, node): ...
+    def fold(self, node): ...
+    visit_Add = ...  # type: Any
+    visit_Sub = ...  # type: Any
+    visit_Mul = ...  # type: Any
+    visit_Div = ...  # type: Any
+    visit_FloorDiv = ...  # type: Any
+    visit_Pow = ...  # type: Any
+    visit_Mod = ...  # type: Any
+    visit_And = ...  # type: Any
+    visit_Or = ...  # type: Any
+    visit_Pos = ...  # type: Any
+    visit_Neg = ...  # type: Any
+    visit_Not = ...  # type: Any
+    visit_Compare = ...  # type: Any
+    visit_Getitem = ...  # type: Any
+    visit_Getattr = ...  # type: Any
+    visit_Call = ...  # type: Any
+    visit_Filter = ...  # type: Any
+    visit_Test = ...  # type: Any
+    visit_CondExpr = ...  # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/parser.pyi b/typeshed/third_party/2and3/jinja2/parser.pyi
new file mode 100644
index 0000000..20d19fc
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/parser.pyi
@@ -0,0 +1,64 @@
+# Stubs for jinja2.parser (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Parser:
+    environment = ...  # type: Any
+    stream = ...  # type: Any
+    name = ...  # type: Any
+    filename = ...  # type: Any
+    closed = ...  # type: bool
+    extensions = ...  # type: Any
+    def __init__(self, environment, source, name: Optional[Any] = ..., filename: Optional[Any] = ..., state: Optional[Any] = ...) -> None: ...
+    def fail(self, msg, lineno: Optional[Any] = ..., exc: Any = ...): ...
+    def fail_unknown_tag(self, name, lineno: Optional[Any] = ...): ...
+    def fail_eof(self, end_tokens: Optional[Any] = ..., lineno: Optional[Any] = ...): ...
+    def is_tuple_end(self, extra_end_rules: Optional[Any] = ...): ...
+    def free_identifier(self, lineno: Optional[Any] = ...): ...
+    def parse_statement(self): ...
+    def parse_statements(self, end_tokens, drop_needle: bool = ...): ...
+    def parse_set(self): ...
+    def parse_for(self): ...
+    def parse_if(self): ...
+    def parse_block(self): ...
+    def parse_extends(self): ...
+    def parse_import_context(self, node, default): ...
+    def parse_include(self): ...
+    def parse_import(self): ...
+    def parse_from(self): ...
+    def parse_signature(self, node): ...
+    def parse_call_block(self): ...
+    def parse_filter_block(self): ...
+    def parse_macro(self): ...
+    def parse_print(self): ...
+    def parse_assign_target(self, with_tuple: bool = ..., name_only: bool = ..., extra_end_rules: Optional[Any] = ...): ...
+    def parse_expression(self, with_condexpr: bool = ...): ...
+    def parse_condexpr(self): ...
+    def parse_or(self): ...
+    def parse_and(self): ...
+    def parse_not(self): ...
+    def parse_compare(self): ...
+    def parse_add(self): ...
+    def parse_sub(self): ...
+    def parse_concat(self): ...
+    def parse_mul(self): ...
+    def parse_div(self): ...
+    def parse_floordiv(self): ...
+    def parse_mod(self): ...
+    def parse_pow(self): ...
+    def parse_unary(self, with_filter: bool = ...): ...
+    def parse_primary(self): ...
+    def parse_tuple(self, simplified: bool = ..., with_condexpr: bool = ..., extra_end_rules: Optional[Any] = ..., explicit_parentheses: bool = ...): ...
+    def parse_list(self): ...
+    def parse_dict(self): ...
+    def parse_postfix(self, node): ...
+    def parse_filter_expr(self, node): ...
+    def parse_subscript(self, node): ...
+    def parse_subscribed(self): ...
+    def parse_call(self, node): ...
+    def parse_filter(self, node, start_inline: bool = ...): ...
+    def parse_test(self, node): ...
+    def subparse(self, end_tokens: Optional[Any] = ...): ...
+    def parse(self): ...
diff --git a/typeshed/third_party/2and3/jinja2/runtime.pyi b/typeshed/third_party/2and3/jinja2/runtime.pyi
new file mode 100644
index 0000000..cfef911
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/runtime.pyi
@@ -0,0 +1,134 @@
+# Stubs for jinja2.runtime (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Dict, Optional, Text, Union
+from jinja2.utils import Markup as Markup, escape as escape, missing as missing, concat as concat
+from jinja2.exceptions import TemplateRuntimeError as TemplateRuntimeError, TemplateNotFound as TemplateNotFound
+
+from jinja2.environment import Environment
+
+to_string = ...  # type: Any
+identity = ...  # type: Any
+
+def markup_join(seq): ...
+def unicode_join(seq): ...
+
+class TemplateReference:
+    def __init__(self, context) -> None: ...
+    def __getitem__(self, name): ...
+
+class Context:
+    parent = ...  # type: Union[Context, Dict[str, Any]]
+    vars = ...  # type: Dict[str, Any]
+    environment = ...  # type: Environment
+    eval_ctx = ...  # type: Any
+    exported_vars = ...  # type: Any
+    name = ...  # type: Text
+    blocks = ...  # type: Dict[str, Any]
+    def __init__(self, environment: Environment, parent: Union[Context, Dict[str, Any]], name: Text, blocks: Dict[str, Any]) -> None: ...
+    def super(self, name, current): ...
+    def get(self, key, default: Optional[Any] = ...): ...
+    def resolve(self, key): ...
+    def get_exported(self): ...
+    def get_all(self): ...
+    def call(__self, __obj, *args, **kwargs): ...
+    def derived(self, locals: Optional[Any] = ...): ...
+    keys = ...  # type: Any
+    values = ...  # type: Any
+    items = ...  # type: Any
+    iterkeys = ...  # type: Any
+    itervalues = ...  # type: Any
+    iteritems = ...  # type: Any
+    def __contains__(self, name): ...
+    def __getitem__(self, key): ...
+
+class BlockReference:
+    name = ...  # type: Any
+    def __init__(self, name, context, stack, depth) -> None: ...
+    @property
+    def super(self): ...
+    def __call__(self): ...
+
+class LoopContext:
+    index0 = ...  # type: int
+    depth0 = ...  # type: Any
+    def __init__(self, iterable, recurse: Optional[Any] = ..., depth0: int = ...) -> None: ...
+    def cycle(self, *args): ...
+    first = ...  # type: Any
+    last = ...  # type: Any
+    index = ...  # type: Any
+    revindex = ...  # type: Any
+    revindex0 = ...  # type: Any
+    depth = ...  # type: Any
+    def __len__(self): ...
+    def __iter__(self): ...
+    def loop(self, iterable): ...
+    __call__ = ...  # type: Any
+    @property
+    def length(self): ...
+
+class LoopContextIterator:
+    context = ...  # type: Any
+    def __init__(self, context) -> None: ...
+    def __iter__(self): ...
+    def __next__(self): ...
+
+class Macro:
+    name = ...  # type: Any
+    arguments = ...  # type: Any
+    defaults = ...  # type: Any
+    catch_kwargs = ...  # type: Any
+    catch_varargs = ...  # type: Any
+    caller = ...  # type: Any
+    def __init__(self, environment, func, name, arguments, defaults, catch_kwargs, catch_varargs, caller) -> None: ...
+    def __call__(self, *args, **kwargs): ...
+
+class Undefined:
+    def __init__(self, hint: Optional[Any] = ..., obj: Any = ..., name: Optional[Any] = ..., exc: Any = ...) -> None: ...
+    def __getattr__(self, name): ...
+    __add__ = ...  # type: Any
+    __radd__ = ...  # type: Any
+    __mul__ = ...  # type: Any
+    __rmul__ = ...  # type: Any
+    __div__ = ...  # type: Any
+    __rdiv__ = ...  # type: Any
+    __truediv__ = ...  # type: Any
+    __rtruediv__ = ...  # type: Any
+    __floordiv__ = ...  # type: Any
+    __rfloordiv__ = ...  # type: Any
+    __mod__ = ...  # type: Any
+    __rmod__ = ...  # type: Any
+    __pos__ = ...  # type: Any
+    __neg__ = ...  # type: Any
+    __call__ = ...  # type: Any
+    __getitem__ = ...  # type: Any
+    __lt__ = ...  # type: Any
+    __le__ = ...  # type: Any
+    __gt__ = ...  # type: Any
+    __ge__ = ...  # type: Any
+    __int__ = ...  # type: Any
+    __float__ = ...  # type: Any
+    __complex__ = ...  # type: Any
+    __pow__ = ...  # type: Any
+    __rpow__ = ...  # type: Any
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    def __hash__(self): ...
+    def __len__(self): ...
+    def __iter__(self): ...
+    def __nonzero__(self): ...
+    __bool__ = ...  # type: Any
+
+def make_logging_undefined(logger: Optional[Any] = ..., base: Optional[Any] = ...): ...
+
+class DebugUndefined(Undefined): ...
+
+class StrictUndefined(Undefined):
+    __iter__ = ...  # type: Any
+    __len__ = ...  # type: Any
+    __nonzero__ = ...  # type: Any
+    __eq__ = ...  # type: Any
+    __ne__ = ...  # type: Any
+    __bool__ = ...  # type: Any
+    __hash__ = ...  # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/sandbox.pyi b/typeshed/third_party/2and3/jinja2/sandbox.pyi
new file mode 100644
index 0000000..f611420
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/sandbox.pyi
@@ -0,0 +1,38 @@
+# Stubs for jinja2.sandbox (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from jinja2.environment import Environment
+
+MAX_RANGE = ...  # type: int
+UNSAFE_FUNCTION_ATTRIBUTES = ...  # type: Any
+UNSAFE_METHOD_ATTRIBUTES = ...  # type: Any
+UNSAFE_GENERATOR_ATTRIBUTES = ...  # type: Any
+
+def safe_range(*args): ...
+def unsafe(f): ...
+def is_internal_attribute(obj, attr): ...
+def modifies_known_mutable(obj, attr): ...
+
+class SandboxedEnvironment(Environment):
+    sandboxed = ...  # type: bool
+    default_binop_table = ...  # type: Any
+    default_unop_table = ...  # type: Any
+    intercepted_binops = ...  # type: Any
+    intercepted_unops = ...  # type: Any
+    def intercept_unop(self, operator): ...
+    binop_table = ...  # type: Any
+    unop_table = ...  # type: Any
+    def __init__(self, *args, **kwargs) -> None: ...
+    def is_safe_attribute(self, obj, attr, value): ...
+    def is_safe_callable(self, obj): ...
+    def call_binop(self, context, operator, left, right): ...
+    def call_unop(self, context, operator, arg): ...
+    def getitem(self, obj, argument): ...
+    def getattr(self, obj, attribute): ...
+    def unsafe_undefined(self, obj, attribute): ...
+    def call(__self, __context, __obj, *args, **kwargs): ...
+
+class ImmutableSandboxedEnvironment(SandboxedEnvironment):
+    def is_safe_attribute(self, obj, attr, value): ...
diff --git a/typeshed/third_party/2and3/jinja2/tests.pyi b/typeshed/third_party/2and3/jinja2/tests.pyi
new file mode 100644
index 0000000..fb31db7
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/tests.pyi
@@ -0,0 +1,28 @@
+# Stubs for jinja2.tests (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+number_re = ...  # type: Any
+regex_type = ...  # type: Any
+test_callable = ...  # type: Any
+
+def test_odd(value): ...
+def test_even(value): ...
+def test_divisibleby(value, num): ...
+def test_defined(value): ...
+def test_undefined(value): ...
+def test_none(value): ...
+def test_lower(value): ...
+def test_upper(value): ...
+def test_string(value): ...
+def test_mapping(value): ...
+def test_number(value): ...
+def test_sequence(value): ...
+def test_equalto(value, other): ...
+def test_sameas(value, other): ...
+def test_iterable(value): ...
+def test_escaped(value): ...
+
+TESTS = ...  # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/utils.pyi b/typeshed/third_party/2and3/jinja2/utils.pyi
new file mode 100644
index 0000000..1368299
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/utils.pyi
@@ -0,0 +1,64 @@
+# Stubs for jinja2.utils (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+from markupsafe import Markup, escape, soft_unicode
+
+missing = ...  # type: Any
+internal_code = ...  # type: Any
+concat = ...  # type: Any
+
+def contextfunction(f): ...
+def evalcontextfunction(f): ...
+def environmentfunction(f): ...
+def internalcode(f): ...
+def is_undefined(obj): ...
+def consume(iterable): ...
+def clear_caches(): ...
+def import_string(import_name, silent: bool = ...): ...
+def open_if_exists(filename, mode: str = ...): ...
+def object_type_repr(obj): ...
+def pformat(obj, verbose: bool = ...): ...
+def urlize(text, trim_url_limit: Optional[Any] = ..., nofollow: bool = ..., target: Optional[Any] = ...): ...
+def generate_lorem_ipsum(n: int = ..., html: bool = ..., min: int = ..., max: int = ...): ...
+def unicode_urlencode(obj, charset: str = ..., for_qs: bool = ...): ...
+
+class LRUCache:
+    capacity = ...  # type: Any
+    def __init__(self, capacity) -> None: ...
+    def __getnewargs__(self): ...
+    def copy(self): ...
+    def get(self, key, default: Optional[Any] = ...): ...
+    def setdefault(self, key, default: Optional[Any] = ...): ...
+    def clear(self): ...
+    def __contains__(self, key): ...
+    def __len__(self): ...
+    def __getitem__(self, key): ...
+    def __setitem__(self, key, value): ...
+    def __delitem__(self, key): ...
+    def items(self): ...
+    def iteritems(self): ...
+    def values(self): ...
+    def itervalue(self): ...
+    def keys(self): ...
+    def iterkeys(self): ...
+    __iter__ = ...  # type: Any
+    def __reversed__(self): ...
+    __copy__ = ...  # type: Any
+
+class Cycler:
+    items = ...  # type: Any
+    def __init__(self, *items) -> None: ...
+    pos = ...  # type: int
+    def reset(self): ...
+    @property
+    def current(self): ...
+    def __next__(self): ...
+
+class Joiner:
+    sep = ...  # type: Any
+    used = ...  # type: bool
+    def __init__(self, sep: str = ...) -> None: ...
+    def __call__(self): ...
diff --git a/typeshed/third_party/2and3/jinja2/visitor.pyi b/typeshed/third_party/2and3/jinja2/visitor.pyi
new file mode 100644
index 0000000..201750c
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/visitor.pyi
@@ -0,0 +1,12 @@
+# Stubs for jinja2.visitor (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class NodeVisitor:
+    def get_visitor(self, node): ...
+    def visit(self, node, *args, **kwargs): ...
+    def generic_visit(self, node, *args, **kwargs): ...
+
+class NodeTransformer(NodeVisitor):
+    def generic_visit(self, node, *args, **kwargs): ...
+    def visit_list(self, node, *args, **kwargs): ...
diff --git a/typeshed/third_party/2and3/markupsafe/__init__.pyi b/typeshed/third_party/2and3/markupsafe/__init__.pyi
new file mode 100644
index 0000000..723d329
--- /dev/null
+++ b/typeshed/third_party/2and3/markupsafe/__init__.pyi
@@ -0,0 +1,58 @@
+# Stubs for markupsafe (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+import sys
+
+from typing import Any, Callable, Dict, Iterable, List, Optional, Text, Tuple, Union
+from collections import Mapping
+from markupsafe._compat import text_type
+import string
+from markupsafe._speedups import escape as escape, escape_silent as escape_silent, soft_unicode as soft_unicode
+from markupsafe._native import escape as escape, escape_silent as escape_silent, soft_unicode as soft_unicode
+
+class Markup(text_type):
+    def __new__(cls, base: Text = ..., encoding: Optional[Text] = ..., errors: Text = ...) -> Markup: ...
+    def __html__(self) -> Markup: ...
+    def __add__(self, other: text_type) -> Markup: ...
+    def __radd__(self, other: text_type) -> Markup: ...
+    def __mul__(self, num: int) -> Markup: ...
+    def __rmul__(self, num: int) -> Markup: ...
+    def __mod__(self, *args: Any) -> Markup: ...
+    def join(self, seq: Iterable[text_type]): ...
+    def split(self, sep: text_type = None, maxsplit: int = -1) -> List[text_type]: ...
+    def rsplit(self, sep: text_type = None, maxsplit: int = -1) -> List[text_type]: ...
+    def splitlines(self, keepends: bool = ...) -> List[text_type]: ...
+    def unescape(self) -> Text: ...
+    def striptags(self) -> Text: ...
+    @classmethod
+    def escape(cls, s: text_type) -> Markup: ...
+    def partition(self, sep: text_type) -> Tuple[Markup, Markup, Markup]: ...
+    def rpartition(self, sep: text_type) -> Tuple[Markup, Markup, Markup]: ...
+    def format(*args, **kwargs) -> Markup: ...
+    def __html_format__(self, format_spec) -> Markup: ...
+    def __getslice__(self, start: int, stop: int) -> Markup: ...
+    def __getitem__(self, i: Union[int, slice]) -> Markup: ...
+    def capitalize(self) -> Markup: ...
+    def title(self) -> Markup: ...
+    def lower(self) -> Markup: ...
+    def upper(self) -> Markup: ...
+    def swapcase(self) -> Markup: ...
+    def replace(self, old: text_type, new: text_type, count: int = -1) -> Markup: ...
+    def ljust(self, width: int, fillchar: text_type = ...) -> Markup: ...
+    def rjust(self, width: int, fillchar: text_type = ...) -> Markup: ...
+    def lstrip(self, chars: text_type = None) -> Markup: ...
+    def rstrip(self, chars: text_type = None) -> Markup: ...
+    def strip(self, chars: text_type = None) -> Markup: ...
+    def center(self, width: int, fillchar: text_type = ...) -> Markup: ...
+    def zfill(self, width: int) -> Markup: ...
+    def translate(self, table: Union[Dict[int, Any], text_type]) -> Markup: ...
+    def expandtabs(self, tabsize: int = 8) -> Markup: ...
+
+class EscapeFormatter(string.Formatter):
+    escape = ...  # type: Callable[[text_type], Markup]
+    def __init__(self, escape: Callable[[text_type], Markup]) -> None: ...
+    def format_field(self, value: text_type, format_spec: text_type) -> Markup: ...
+
+if sys.version_info[0] >= 3:
+    soft_str = soft_unicode
diff --git a/typeshed/third_party/2and3/markupsafe/_compat.pyi b/typeshed/third_party/2and3/markupsafe/_compat.pyi
new file mode 100644
index 0000000..72b6f60
--- /dev/null
+++ b/typeshed/third_party/2and3/markupsafe/_compat.pyi
@@ -0,0 +1,23 @@
+# Stubs for markupsafe._compat (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+import sys
+
+from typing import Any, Iterator, Mapping, Text, Tuple, TypeVar
+
+_K = TypeVar('_K')
+_V = TypeVar('_V')
+
+PY2 = ...  # type: bool
+def iteritems(d: Mapping[_K, _V]) -> Iterator[Tuple[_K, _V]]: ...
+if sys.version_info[0] >= 3:
+    text_type = str
+    string_types = str,
+    unichr = chr
+    int_types = int,
+else:
+    text_type = unicode
+    string_types = (str, unicode)
+    unichr = __builtins__.unichr
+    int_types = (int, long)
diff --git a/typeshed/third_party/2and3/markupsafe/_constants.pyi b/typeshed/third_party/2and3/markupsafe/_constants.pyi
new file mode 100644
index 0000000..677b46c
--- /dev/null
+++ b/typeshed/third_party/2and3/markupsafe/_constants.pyi
@@ -0,0 +1,7 @@
+# Stubs for markupsafe._constants (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Dict, Text
+
+HTML_ENTITIES = ...  # type: Dict[Text, int]
diff --git a/typeshed/third_party/2and3/markupsafe/_native.pyi b/typeshed/third_party/2and3/markupsafe/_native.pyi
new file mode 100644
index 0000000..13d6fec
--- /dev/null
+++ b/typeshed/third_party/2and3/markupsafe/_native.pyi
@@ -0,0 +1,11 @@
+# Stubs for markupsafe._native (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import Markup
+from ._compat import text_type, string_types
+from typing import Union, Text
+
+def escape(s: Union[Markup, Text]) -> Markup: ...
+def escape_silent(s: Union[None, Markup, Text]) -> Markup: ...
+def soft_unicode(s: Text) -> text_type: ...
diff --git a/typeshed/third_party/2and3/markupsafe/_speedups.pyi b/typeshed/third_party/2and3/markupsafe/_speedups.pyi
new file mode 100644
index 0000000..379e11e
--- /dev/null
+++ b/typeshed/third_party/2and3/markupsafe/_speedups.pyi
@@ -0,0 +1,11 @@
+# Stubs for markupsafe._speedups (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import Markup
+from ._compat import text_type, string_types
+from typing import Union, Text
+
+def escape(s: Union[Markup, Text]) -> Markup: ...
+def escape_silent(s: Union[None, Markup, Text]) -> Markup: ...
+def soft_unicode(s: Text) -> text_type: ...
diff --git a/typeshed/third_party/2and3/mypy_extensions.pyi b/typeshed/third_party/2and3/mypy_extensions.pyi
new file mode 100644
index 0000000..8b2ef3f
--- /dev/null
+++ b/typeshed/third_party/2and3/mypy_extensions.pyi
@@ -0,0 +1,11 @@
+from typing import Dict, Type, TypeVar, Union
+
+T = TypeVar('T')
+
+
+def TypedDict(typename: str, fields: Dict[str, Type[T]]) -> Type[dict]: ...
+
+# Return type that indicates a function does not return.
+# This type is equivalent to the None type, but the no-op Union is necessary to
+# distinguish the None type from the None value.
+NoReturn = Union[None]
diff --git a/typeshed/third_party/2and3/pytz/__init__.pyi b/typeshed/third_party/2and3/pytz/__init__.pyi
new file mode 100644
index 0000000..6bc917e
--- /dev/null
+++ b/typeshed/third_party/2and3/pytz/__init__.pyi
@@ -0,0 +1,26 @@
+# Stubs for pytz (Python 3.5)
+
+import datetime as dt
+from typing import Optional, List, Set, Dict  # NOQA
+
+all_timezones = ...  # type: List
+all_timezones_set = ...  # type: Set
+common_timezones = ...  # type: List
+common_timezones_set = ...  # type: Set
+country_timezones = ...  # type: Dict
+country_names = ...  # type: Dict
+
+
+class _UTCclass(dt.tzinfo):
+    zone = ...  # type: str
+    def fromutc(self, dt: dt.datetime) -> dt.datetime: ...
+    def utcoffset(self, dt: Optional[dt.datetime]) -> dt.timedelta: ...  # type: ignore
+    def tzname(self, dt: Optional[dt.datetime]) -> str: ...
+    def dst(self, dt: Optional[dt.datetime]) -> dt.timedelta: ...  # type: ignore
+    def localize(self, dt: dt.datetime, is_dst: bool=...) -> dt.datetime: ...
+    def normalize(self, dt: dt.datetime, is_dst: bool=...) -> dt.datetime: ...
+
+utc = ...  # type: _UTCclass
+UTC = ...  # type: _UTCclass
+
+def timezone(zone: str) -> dt.tzinfo: ...
diff --git a/typeshed/third_party/2and3/pytz/lazy.pyi b/typeshed/third_party/2and3/pytz/lazy.pyi
new file mode 100644
index 0000000..3618333
--- /dev/null
+++ b/typeshed/third_party/2and3/pytz/lazy.pyi
@@ -0,0 +1,13 @@
+# Stubs for pytz.lazy (Python 3.5)
+
+from typing import Any, Iterable, List, Set, Dict  # NOQA
+from collections import Mapping
+
+class LazyDict(Mapping):
+    pass
+
+class LazyList(List):
+    pass
+
+class LazySet(Set):
+    pass
diff --git a/typeshed/third_party/2and3/singledispatch.pyi b/typeshed/third_party/2and3/singledispatch.pyi
new file mode 100644
index 0000000..ed24b7f
--- /dev/null
+++ b/typeshed/third_party/2and3/singledispatch.pyi
@@ -0,0 +1,17 @@
+from typing import Any, Callable, Generic, Mapping, Optional, TypeVar, overload
+
+
+_T = TypeVar("_T")
+
+
+class _SingleDispatchCallable(Generic[_T]):
+    registry = ...  # type: Mapping[Any, Callable[..., _T]]
+    def dispatch(self, cls: Any) -> Callable[..., _T]: ...
+    @overload
+    def register(self, cls: Any) -> Callable[[Callable[..., _T]], Callable[..., _T]]: ...
+    @overload
+    def register(self, cls: Any, func: Callable[..., _T]) -> Callable[..., _T]: ...
+    def _clear_cache(self) -> None: ...
+    def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
+
+def singledispatch(func: Callable[..., _T]) -> _SingleDispatchCallable[_T]: ...
diff --git a/typeshed/third_party/2and3/ujson.pyi b/typeshed/third_party/2and3/ujson.pyi
new file mode 100644
index 0000000..a982c8b
--- /dev/null
+++ b/typeshed/third_party/2and3/ujson.pyi
@@ -0,0 +1,51 @@
+# Stubs for ujson
+# See: https://pypi.python.org/pypi/ujson
+from typing import Any, AnyStr, IO, Optional
+
+__version__ = ...  # type: str
+
+def encode(
+    obj: Any,
+    ensure_ascii: bool = ...,
+    double_precision: bool = ...,
+    encode_html_chars: bool = ...,
+    escape_forward_slashes: bool = ...,
+    sort_keys: bool = ...,
+    indent: int = ...,
+) -> str: ...
+
+def dumps(
+    obj: Any,
+    ensure_ascii: bool = ...,
+    double_precision: bool = ...,
+    encode_html_chars: bool = ...,
+    escape_forward_slashes: bool = ...,
+    sort_keys: bool = ...,
+    indent: int = ...,
+) -> str: ...
+
+def dump(
+    obj: Any,
+    fp: IO[str],
+    ensure_ascii: bool = ...,
+    double_precision: bool = ...,
+    encode_html_chars: bool = ...,
+    escape_forward_slashes: bool = ...,
+    sort_keys: bool = ...,
+    indent: int = ...,
+) -> None: ...
+
+def decode(
+    s: AnyStr,
+    precise_float: bool = ...,
+) -> Any: ...
+
+def loads(
+    s: AnyStr,
+    precise_float: bool = ...,
+) -> Any: ...
+
+def load(
+    fp: IO[AnyStr],
+    precise_float: bool = ...,
+) -> Any: ...
diff --git a/typeshed/third_party/3.6/click/__init__.pyi b/typeshed/third_party/3.6/click/__init__.pyi
new file mode 100644
index 0000000..c4228fc
--- /dev/null
+++ b/typeshed/third_party/3.6/click/__init__.pyi
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+"""
+    click
+    ~~~~~
+
+    Click is a simple Python module that wraps the stdlib's optparse to make
+    writing command line scripts fun.  Unlike other modules, it's based around
+    a simple API that does not come with too much magic and is composable.
+
+    In case optparse ever gets removed from the stdlib, it will be shipped by
+    this module.
+
+    :copyright: (c) 2014 by Armin Ronacher.
+    :license: BSD, see LICENSE for more details.
+"""
+
+# Core classes
+from .core import Context, BaseCommand, Command, MultiCommand, Group, \
+    CommandCollection, Parameter, Option, Argument
+
+# Globals
+from .globals import get_current_context
+
+# Decorators
+from .decorators import pass_context, pass_obj, make_pass_decorator, \
+    command, group, argument, option, confirmation_option, \
+    password_option, version_option, help_option
+
+# Types
+from .types import ParamType, File, Path, Choice, IntRange, Tuple, \
+    STRING, INT, FLOAT, BOOL, UUID, UNPROCESSED
+
+# Utilities
+from .utils import echo, get_binary_stream, get_text_stream, open_file, \
+    format_filename, get_app_dir, get_os_args
+
+# Terminal functions
+from .termui import prompt, confirm, get_terminal_size, echo_via_pager, \
+    progressbar, clear, style, unstyle, secho, edit, launch, getchar, \
+    pause
+
+# Exceptions
+from .exceptions import ClickException, UsageError, BadParameter, \
+    FileError, Abort, NoSuchOption, BadOptionUsage, BadArgumentUsage, \
+    MissingParameter
+
+# Formatting
+from .formatting import HelpFormatter, wrap_text
+
+# Parsing
+from .parser import OptionParser
+
+
+__all__ = [
+    # Core classes
+    'Context', 'BaseCommand', 'Command', 'MultiCommand', 'Group',
+    'CommandCollection', 'Parameter', 'Option', 'Argument',
+
+    # Globals
+    'get_current_context',
+
+    # Decorators
+    'pass_context', 'pass_obj', 'make_pass_decorator', 'command', 'group',
+    'argument', 'option', 'confirmation_option', 'password_option',
+    'version_option', 'help_option',
+
+    # Types
+    'ParamType', 'File', 'Path', 'Choice', 'IntRange', 'Tuple', 'STRING',
+    'INT', 'FLOAT', 'BOOL', 'UUID', 'UNPROCESSED',
+
+    # Utilities
+    'echo', 'get_binary_stream', 'get_text_stream', 'open_file',
+    'format_filename', 'get_app_dir', 'get_os_args',
+
+    # Terminal functions
+    'prompt', 'confirm', 'get_terminal_size', 'echo_via_pager',
+    'progressbar', 'clear', 'style', 'unstyle', 'secho', 'edit', 'launch',
+    'getchar', 'pause',
+
+    # Exceptions
+    'ClickException', 'UsageError', 'BadParameter', 'FileError',
+    'Abort', 'NoSuchOption', 'BadOptionUsage', 'BadArgumentUsage',
+    'MissingParameter',
+
+    # Formatting
+    'HelpFormatter', 'wrap_text',
+
+    # Parsing
+    'OptionParser',
+]
+
+
+# Controls if click should emit the warning about the use of unicode
+# literals.
+disable_unicode_literals_warning = False
+
+
+__version__ = '6.6'
diff --git a/typeshed/third_party/3.6/click/core.pyi b/typeshed/third_party/3.6/click/core.pyi
new file mode 100644
index 0000000..fe44668
--- /dev/null
+++ b/typeshed/third_party/3.6/click/core.pyi
@@ -0,0 +1,435 @@
+from contextlib import contextmanager
+from typing import (
+    Any,
+    Callable,
+    Dict,
+    Generator,
+    Iterable,
+    List,
+    Mapping,
+    Optional,
+    Sequence,
+    Set,
+    Tuple,
+    TypeVar,
+    Union,
+)
+
+from click.formatting import HelpFormatter
+from click.parser import OptionParser
+
+
+def invoke_param_callback(
+    callback: Callable[['Context', 'Parameter', Optional[str]], Any],
+    ctx: 'Context',
+    param: 'Parameter',
+    value: Optional[str]
+) -> Any:
+    ...
+
+
+ at contextmanager
+def augment_usage_errors(
+    ctx: 'Context', param: 'Parameter' = None
+) -> Generator[None, None, None]:
+    ...
+
+
+def iter_params_for_processing(
+    invocation_order: Sequence['Parameter'],
+    declaration_order: Iterable['Parameter'],
+) -> Iterable['Parameter']:
+    ...
+
+
+class Context:
+    parent: Optional['Context']
+    command: 'Command'
+    info_name: Optional[str]
+    params: Dict
+    args: List[str]
+    protected_args: List[str]
+    obj: Any
+    default_map: Mapping[str, Any]
+    invoked_subcommand: Optional[str]
+    terminal_width: Optional[int]
+    max_content_width: Optional[int]
+    allow_extra_args: bool
+    allow_interspersed_args: bool
+    ignore_unknown_options: bool
+    help_option_names: List[str]
+    token_normalize_func: Optional[Callable[[str], str]]
+    resilient_parsing: bool
+    auto_envvar_prefix: Optional[str]
+    color: Optional[bool]
+    _meta: Dict[str, Any]
+    _close_callbacks: List
+    _depth: int
+
+    # properties
+    meta: Dict[str, Any]
+    command_path: str
+
+    def __init__(
+        self,
+        command: 'Command',
+        parent: 'Context' = None,
+        info_name: str = None,
+        obj: Any = None,
+        auto_envvar_prefix: str = None,
+        default_map: Mapping[str, Any] = None,
+        terminal_width: int = None,
+        max_content_width: int = None,
+        resilient_parsing: bool = False,
+        allow_extra_args: bool = None,
+        allow_interspersed_args: bool = None,
+        ignore_unknown_options: bool = None,
+        help_option_names: List[str] = None,
+        token_normalize_func: Callable[[str], str] = None,
+        color: bool = None
+    ) -> None:
+        ...
+
+    @contextmanager
+    def scope(self, cleanup: bool = True) -> Generator['Context', None, None]:
+        ...
+
+    def make_formatter(self) -> HelpFormatter:
+        ...
+
+    def call_on_close(self, f: Callable) -> Callable:
+        ...
+
+    def close(self) -> None:
+        ...
+
+    def find_root(self) -> 'Context':
+        ...
+
+    def find_object(self, object_type: type) -> Any:
+        ...
+
+    def ensure_object(self, object_type: type) -> Any:
+        ...
+
+    def lookup_default(self, name: str) -> Any:
+        ...
+
+    def fail(self, message: str) -> None:
+        ...
+
+    def abort(self) -> None:
+        ...
+
+    def exit(self, code: Union[int, str] = 0) -> None:
+        ...
+
+    def get_usage(self) -> str:
+        ...
+
+    def get_help(self) -> str:
+        ...
+
+    def invoke(
+        self, callback: Union['Command', Callable], *args, **kwargs
+    ) -> Any:
+        ...
+
+    def forward(
+        self, callback: Union['Command', Callable], *args, **kwargs
+    ) -> Any:
+        ...
+
+class BaseCommand:
+    allow_extra_args: bool
+    allow_interspersed_args: bool
+    ignore_unknown_options: bool
+    name: str
+    context_settings: Dict
+
+    def __init__(self, name: str, context_settings: Dict = None) -> None:
+        ...
+
+    def get_usage(self, ctx: Context) -> str:
+        ...
+
+    def get_help(self, ctx: Context) -> str:
+        ...
+
+    def make_context(
+        self, info_name: str, args: List[str], parent: Context = None, **extra
+    ) -> Context:
+        ...
+
+    def parse_args(self, ctx: Context, args: List[str]) -> List[str]:
+        ...
+
+    def invoke(self, ctx: Context) -> Any:
+        ...
+
+    def main(
+        self,
+        args: List[str] = None,
+        prog_name: str = None,
+        complete_var: str = None,
+        standalone_mode: bool = True,
+        **extra
+    ) -> Any:
+        ...
+
+    def __call__(self, *args, **kwargs) -> Any:
+        ...
+
+
+class Command(BaseCommand):
+    callback: Optional[Callable]
+    params: List['Parameter']
+    help: Optional[str]
+    epilog: Optional[str]
+    short_help: Optional[str]
+    options_metavar: str
+    add_help_option: bool
+
+    def __init__(
+        self,
+        name: str,
+        context_settings: Dict = None,
+        callback: Callable = None,
+        params: List['Parameter'] = None,
+        help: str = None,
+        epilog: str = None,
+        short_help: str = None,
+        options_metavar: str = '[OPTIONS]',
+        add_help_option: bool = True
+    ) -> None:
+        ...
+
+    def get_params(self, ctx: Context) -> List['Parameter']:
+        ...
+
+    def format_usage(
+        self,
+        ctx: Context,
+        formatter: HelpFormatter
+    ) -> None:
+        ...
+
+    def collect_usage_pieces(self, ctx: Context) -> List[str]:
+        ...
+
+    def get_help_option_names(self, ctx: Context) -> Set[str]:
+        ...
+
+    def get_help_option(self, ctx: Context) -> Optional['Option']:
+        ...
+
+    def make_parser(self, ctx: Context) -> OptionParser:
+        ...
+
+    def format_help(self, ctx: Context, formatter: HelpFormatter) -> None:
+        ...
+
+    def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None:
+        ...
+
+    def format_options(self, ctx: Context, formatter: HelpFormatter) -> None:
+        ...
+
+    def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None:
+        ...
+
+
+T = TypeVar('T')
+Decorator = Callable[[T], T]
+
+
+class MultiCommand(Command):
+    no_args_is_help: bool
+    invoke_without_command: bool
+    subcommand_metavar: str
+    chain: bool
+    result_callback: Callable
+
+    def __init__(
+        self,
+        name: str = None,
+        invoke_without_command: bool = False,
+        no_args_is_help: bool = None,
+        subcommand_metavar: str = None,
+        chain: bool = False,
+        result_callback: Callable = None,
+        **attrs
+    ) -> None:
+        ...
+
+    def resultcallback(
+        self, replace: bool = False
+    ) -> Decorator:
+        ...
+
+    def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None:
+        ...
+
+    def resolve_command(
+        self, ctx: Context, args: List[str]
+    ) -> Tuple[str, Command, List[str]]:
+        ...
+
+    def get_command(self, ctx: Context, cmd_name: str) -> Optional[Command]:
+        ...
+
+    def list_commands(self, ctx: Context) -> Iterable[Command]:
+        ...
+
+
+class Group(MultiCommand):
+    commands: Dict[str, Command]
+
+    def __init__(
+        self, name: str = None, commands: Dict[str, Command] = None, **attrs
+    ) -> None:
+        ...
+
+    def add_command(self, cmd: Command, name: str = None):
+        ...
+
+    def command(self, *args, **kwargs) -> Decorator:
+        ...
+
+    def group(self, *args, **kwargs) -> Decorator:
+        ...
+
+
+class CommandCollection(MultiCommand):
+    sources: List[MultiCommand]
+
+    def __init__(
+        self, name: str = None, sources: List[MultiCommand] = None, **attrs
+    ) -> None:
+        ...
+
+    def add_source(self, multi_cmd: MultiCommand) -> None:
+        ...
+
+
+class Parameter:
+    param_type_name: str
+    name: str
+    opts: List[str]
+    secondary_opts: List[str]
+    type: 'ParamType'
+    required: bool
+    callback: Optional[Callable[[Context, 'Parameter', str], Any]]
+    nargs: int
+    multiple: bool
+    expose_value: bool
+    default: Any
+    is_eager: bool
+    metavar: Optional[str]
+    envvar: Union[str, List[str], None]
+    # properties
+    human_readable_name: str
+
+    def __init__(
+        self,
+        param_decls: List[str] = None,
+        type: Union[type, 'ParamType'] = None,
+        required: bool = False,
+        default: Any = None,
+        callback: Callable[[Context, 'Parameter', str], Any] = None,
+        nargs: int = None,
+        metavar: str = None,
+        expose_value: bool = True,
+        is_eager: bool = False,
+        envvar: Union[str, List[str]] = None
+    ) -> None:
+        ...
+
+    def make_metavar(self) -> str:
+        ...
+
+    def get_default(self, ctx: Context) -> Any:
+        ...
+
+    def add_to_parser(self, parser: OptionParser, ctx: Context) -> None:
+        ...
+
+    def consume_value(self, ctx: Context, opts: Dict[str, Any]) -> Any:
+        ...
+
+    def type_cast_value(self, ctx: Context, value: Any) -> Any:
+        ...
+
+    def process_value(self, ctx: Context, value: Any) -> Any:
+        ...
+
+    def value_is_missing(self, value: Any) -> bool:
+        ...
+
+    def full_process_value(self, ctx: Context, value: Any) -> Any:
+        ...
+
+    def resolve_envvar_value(self, ctx: Context) -> str:
+        ...
+
+    def value_from_envvar(self, ctx: Context) -> Union[str, List[str]]:
+        ...
+
+    def handle_parse_result(
+        self, ctx: Context, opts: Dict[str, Any], args: List[str]
+    ) -> Tuple[Any, List[str]]:
+        ...
+
+    def get_help_record(self, ctx: Context) -> Tuple[str, str]:
+        ...
+
+    def get_usage_pieces(self, ctx: Context) -> List[str]:
+        ...
+
+
+class Option(Parameter):
+    prompt: str  # sic
+    confirmation_prompt: bool
+    hide_input: bool
+    is_flag: bool
+    flag_value: Any
+    is_bool_flag: bool
+    count: bool
+    multiple: bool
+    allow_from_autoenv: bool
+    help: Optional[str]
+    show_default: bool
+
+    def __init__(
+        self,
+        param_decls: List[str] = None,
+        show_default: bool = False,
+        prompt: Union[bool, str] = False,
+        confirmation_prompt: bool = False,
+        hide_input: bool = False,
+        is_flag: bool = None,
+        flag_value: Any = None,
+        multiple: bool = False,
+        count: bool = False,
+        allow_from_autoenv: bool = True,
+        type: Union[type, 'ParamType'] = None,
+        help: str = None,
+        **attrs
+    ) -> None:
+        ...
+
+    def prompt_for_value(self, ctx: Context) -> Any:
+        ...
+
+
+class Argument(Parameter):
+    def __init__(
+        self,
+        param_decls: List[str] = None,
+        required: bool = None,
+        **attrs
+    ) -> None:
+        ...
+
+# cyclic dependency
+from click.types import ParamType  # noqa: E402
diff --git a/typeshed/third_party/3.6/click/decorators.pyi b/typeshed/third_party/3.6/click/decorators.pyi
new file mode 100644
index 0000000..a3dcddd
--- /dev/null
+++ b/typeshed/third_party/3.6/click/decorators.pyi
@@ -0,0 +1,218 @@
+from typing import Any, Callable, Dict, List, TypeVar, Union
+
+from click.core import Command, Group, Argument, Option, Parameter, Context
+from click.types import ParamType
+
+T = TypeVar('T')
+Decorator = Callable[[T], T]
+
+
+def pass_context(T) -> T:
+    ...
+
+
+def pass_obj(T) -> T:
+    ...
+
+
+def make_pass_decorator(
+    object_type: type, ensure: bool = False
+) -> Callable[[T], T]:
+    ...
+
+
+# NOTE: Decorators below have **attrs converted to concrete constructor
+# arguments from core.pyi to help with type checking.
+
+def command(
+    name: str = None,
+    cls: type = Command,
+    # Command
+    help: str = None,
+    epilog: str = None,
+    short_help: str = None,
+    options_metavar: str = '[OPTIONS]',
+    add_help_option: bool = True,
+) -> Decorator:
+    ...
+
+
+# This inherits attrs from Group, MultiCommand and Command.
+
+def group(
+    name: str = None,
+    cls: type = Group,
+    # Group
+    commands: Dict[str, Command] = None,
+    # MultiCommand
+    invoke_without_command: bool = False,
+    no_args_is_help: bool = None,
+    subcommand_metavar: str = None,
+    chain: bool = False,
+    result_callback: Callable = None,
+    # Command
+    help: str = None,
+    epilog: str = None,
+    short_help: str = None,
+    options_metavar: str = '[OPTIONS]',
+    add_help_option: bool = True,
+) -> Decorator:
+    ...
+
+
+def argument(
+    *param_decls: str,
+    cls: type = Argument,
+    # Argument
+    required: bool = None,
+    # Parameter
+    type: Union[type, ParamType] = None,
+    default: Any = None,
+    callback: Callable[[Context, Parameter, str], Any] = None,
+    nargs: int = None,
+    metavar: str = None,
+    expose_value: bool = True,
+    is_eager: bool = False,
+    envvar: Union[str, List[str]] = None
+) -> Decorator:
+    ...
+
+
+def option(
+    *param_decls: str,
+    cls: type = Option,
+    # Option
+    show_default: bool = False,
+    prompt: bool = False,
+    confirmation_prompt: bool = False,
+    hide_input: bool = False,
+    is_flag: bool = None,
+    flag_value: Any = None,
+    multiple: bool = False,
+    count: bool = False,
+    allow_from_autoenv: bool = True,
+    type: Union[type, ParamType] = None,
+    help: str = None,
+    # Parameter
+    default: Any = None,
+    callback: Callable[[Context, Parameter, str], Any] = None,
+    nargs: int = None,
+    metavar: str = None,
+    expose_value: bool = True,
+    is_eager: bool = False,
+    envvar: Union[str, List[str]] = None
+) -> Decorator:
+    ...
+
+
+# Defaults copied from the decorator body.
+def confirmation_option(
+    *param_decls: str,
+    cls: type = Option,
+    # Option
+    show_default: bool = False,
+    prompt: str = 'Do you want to continue?',
+    confirmation_prompt: bool = False,
+    hide_input: bool = False,
+    is_flag: bool = True,
+    flag_value: Any = None,
+    multiple: bool = False,
+    count: bool = False,
+    allow_from_autoenv: bool = True,
+    type: Union[type, ParamType] = None,
+    help: str = 'Confirm the action without prompting.',
+    # Parameter
+    default: Any = None,
+    callback: Callable[[Context, Parameter, str], Any] = None,
+    nargs: int = None,
+    metavar: str = None,
+    expose_value: bool = False,
+    is_eager: bool = False,
+    envvar: Union[str, List[str]] = None
+) -> Decorator:
+    ...
+
+
+# Defaults copied from the decorator body.
+def password_option(
+    *param_decls: str,
+    cls: type = Option,
+    # Option
+    show_default: bool = False,
+    prompt: bool = True,
+    confirmation_prompt: bool = True,
+    hide_input: bool = True,
+    is_flag: bool = None,
+    flag_value: Any = None,
+    multiple: bool = False,
+    count: bool = False,
+    allow_from_autoenv: bool = True,
+    type: Union[type, ParamType] = None,
+    help: str = None,
+    # Parameter
+    default: Any = None,
+    callback: Callable[[Context, Parameter, str], Any] = None,
+    nargs: int = None,
+    metavar: str = None,
+    expose_value: bool = True,
+    is_eager: bool = False,
+    envvar: Union[str, List[str]] = None
+) -> Decorator:
+    ...
+
+
+# Defaults copied from the decorator body.
+def version_option(
+    version: str = None,
+    *param_decls: str,
+    cls: type = Option,
+    # Option
+    show_default: bool = False,
+    prompt: bool = False,
+    confirmation_prompt: bool = False,
+    hide_input: bool = False,
+    is_flag: bool = True,
+    flag_value: Any = None,
+    multiple: bool = False,
+    count: bool = False,
+    allow_from_autoenv: bool = True,
+    type: Union[type, ParamType] = None,
+    help: str = 'Show the version and exit.',
+    # Parameter
+    default: Any = None,
+    callback: Callable[[Context, Parameter, str], Any] = None,
+    nargs: int = None,
+    metavar: str = None,
+    expose_value: bool = False,
+    is_eager: bool = True,
+    envvar: Union[str, List[str]] = None
+) -> Decorator:
+    ...
+
+
+# Defaults copied from the decorator body.
+def help_option(
+    *param_decls: str,
+    cls: type = Option,
+    # Option
+    show_default: bool = False,
+    prompt: bool = False,
+    confirmation_prompt: bool = False,
+    hide_input: bool = False,
+    is_flag: bool = True,
+    flag_value: Any = None,
+    multiple: bool = False,
+    count: bool = False,
+    allow_from_autoenv: bool = True,
+    type: Union[type, ParamType] = None,
+    help: str = 'Show this message and exit.',
+    # Parameter
+    default: Any = None,
+    callback: Callable[[Context, Parameter, str], Any] = None,
+    nargs: int = None,
+    metavar: str = None,
+    expose_value: bool = False,
+    is_eager: bool = True,
+    envvar: Union[str, List[str]] = None
+) -> Decorator:
+    ...
diff --git a/typeshed/third_party/3.6/click/exceptions.pyi b/typeshed/third_party/3.6/click/exceptions.pyi
new file mode 100644
index 0000000..7d49ae6
--- /dev/null
+++ b/typeshed/third_party/3.6/click/exceptions.pyi
@@ -0,0 +1,91 @@
+from typing import IO, List, Optional
+
+from click.core import Context, Parameter
+
+
+class ClickException(Exception):
+    exit_code: int
+    message: str
+
+    def __init__(self, message: str) -> None:
+        ...
+
+    def format_message(self) -> str:
+        ...
+
+    def show(self, file=None) -> None:
+        ...
+
+
+class UsageError(ClickException):
+    ctx: Optional[Context]
+
+    def __init__(self, message: str, ctx: Context = None) -> None:
+        ...
+
+    def show(self, file: IO = None) -> None:
+        ...
+
+
+class BadParameter(UsageError):
+    param: Optional[Parameter]
+    param_hint: Optional[str]
+
+    def __init__(
+        self,
+        message: str,
+        ctx: Context = None,
+        param: Parameter = None,
+        param_hint: str = None
+    ) -> None:
+        ...
+
+
+class MissingParameter(BadParameter):
+    param_type: str  # valid values: 'parameter', 'option', 'argument'
+
+    def __init__(
+        self,
+        message: str = None,
+        ctx: Context = None,
+        param: Parameter = None,
+        param_hint: str = None,
+        param_type: str = None
+    ) -> None:
+        ...
+
+
+class NoSuchOption(UsageError):
+    option_name: str
+    possibilities: Optional[List[str]]
+
+    def __init__(
+        self,
+        option_name: str,
+        message: str = None,
+        possibilities: List[str] = None,
+        ctx: Context = None
+    ) -> None:
+        ...
+
+
+class BadOptionUsage(UsageError):
+    def __init__(self, message: str, ctx: Context = None) -> None:
+        ...
+
+
+class BadArgumentUsage(UsageError):
+    def __init__(self, message: str, ctx: Context = None) -> None:
+        ...
+
+
+class FileError(ClickException):
+    ui_filename: str
+    filename: str
+
+    def __init__(self, filename: str, hint: str = None) -> None:
+        ...
+
+
+class Abort(RuntimeError):
+    ...
diff --git a/typeshed/third_party/3.6/click/formatting.pyi b/typeshed/third_party/3.6/click/formatting.pyi
new file mode 100644
index 0000000..5ff1349
--- /dev/null
+++ b/typeshed/third_party/3.6/click/formatting.pyi
@@ -0,0 +1,89 @@
+from contextlib import contextmanager
+from typing import Generator, Iterable, List, Optional, Tuple
+
+
+FORCED_WIDTH: Optional[int]
+
+
+def measure_table(rows: Iterable[Iterable[str]]) -> Tuple[int, ...]:
+    ...
+
+
+def iter_rows(
+    rows: Iterable[Iterable[str]], col_count: int
+) -> Generator[Tuple[str, ...], None, None]:
+    ...
+
+
+def wrap_text(
+    text: str,
+    width: int = 78,
+    initial_indent: str = '',
+    subsequent_indent: str = '',
+    preserve_paragraphs: bool = False
+) -> str:
+    ...
+
+
+class HelpFormatter:
+    indent_increment: int
+    width: Optional[int]
+    current_indent: int
+    buffer: List[str]
+
+    def __init__(
+        self,
+        indent_increment: int = 2,
+        width: int = None,
+        max_width: int = None,
+    ) -> None:
+        ...
+
+    def write(self, string: str) -> None:
+        ...
+
+    def indent(self) -> None:
+        ...
+
+    def dedent(self) -> None:
+        ...
+
+    def write_usage(
+        self,
+        prog: str,
+        args: str = '',
+        prefix: str = 'Usage: ',
+    ):
+        ...
+
+    def write_heading(self, heading: str) -> None:
+        ...
+
+    def write_paragraph(self) -> None:
+        ...
+
+    def write_text(self, text: str) -> None:
+        ...
+
+    def write_dl(
+        self,
+        rows: Iterable[Iterable[str]],
+        col_max: int = 30,
+        col_spacing: int = 2,
+    ) -> None:
+        ...
+
+    @contextmanager
+    def section(self, name) -> Generator[None, None, None]:
+        ...
+
+    @contextmanager
+    def indentation(self) -> Generator[None, None, None]:
+        ...
+
+    def getvalue(self) -> str:
+        ...
+
+
+def join_options(options: List[str]) -> Tuple[str, bool]:
+    ...
diff --git a/typeshed/third_party/3.6/click/globals.pyi b/typeshed/third_party/3.6/click/globals.pyi
new file mode 100644
index 0000000..934ca7d
--- /dev/null
+++ b/typeshed/third_party/3.6/click/globals.pyi
@@ -0,0 +1,17 @@
+from click.core import Optional, Context
+
+
+def get_current_context(silent: bool = False) -> Context:
+    ...
+
+
+def push_context(ctx: Context) -> None:
+    ...
+
+
+def pop_context() -> None:
+    ...
+
+
+def resolve_color_default(color: bool = None) -> Optional[bool]:
+    ...
diff --git a/typeshed/third_party/3.6/click/parser.pyi b/typeshed/third_party/3.6/click/parser.pyi
new file mode 100644
index 0000000..3919966
--- /dev/null
+++ b/typeshed/third_party/3.6/click/parser.pyi
@@ -0,0 +1,102 @@
+from typing import Any, Dict, Iterable, List, Optional, Set, Tuple
+
+from click.core import Context
+
+
+def _unpack_args(
+    args: Iterable[str], nargs_spec: Iterable[int]
+) -> Tuple[Tuple[Optional[Tuple[str, ...]], ...], List[str]]:
+    ...
+
+
+def split_opt(opt: str) -> Tuple[str, str]:
+    ...
+
+
+def normalize_opt(opt: str, ctx: Context) -> str:
+    ...
+
+
+def split_arg_string(string: str) -> List[str]:
+    ...
+
+
+class Option:
+    dest: str
+    action: str
+    nargs: int
+    const: Any
+    obj: Any
+    prefixes: Set[str]
+    _short_opts: List[str]
+    _long_opts: List[str]
+    # properties
+    takes_value: bool
+
+    def __init__(
+        self,
+        opts: Iterable[str],
+        dest: str,
+        action: str = None,
+        nargs: int = 1,
+        const: Any = None,
+        obj: Any = None
+    ) -> None:
+        ...
+
+    def process(self, value: Any, state: 'ParsingState') -> None:
+        ...
+
+
+class Argument:
+    dest: str
+    nargs: int
+    obj: Any
+
+    def __init__(self, dest: str, nargs: int = 1, obj: Any = None) -> None:
+        ...
+
+    def process(self, value: Any, state: 'ParsingState') -> None:
+        ...
+
+
+class ParsingState:
+    opts: Dict[str, Any]
+    largs: List[str]
+    rargs: List[str]
+    order: List[Any]
+
+    def __init__(self, rargs: List[str]) -> None:
+        ...
+
+
+class OptionParser:
+    ctx: Optional[Context]
+    allow_interspersed_args: bool
+    ignore_unknown_options: bool
+    _short_opt: Dict[str, Option]
+    _long_opt: Dict[str, Option]
+    _opt_prefixes: Set[str]
+    _args: List[Argument]
+
+    def __init__(self, ctx: Context = None) -> None:
+        ...
+
+    def add_option(
+        self,
+        opts: Iterable[str],
+        dest: str,
+        action: str = None,
+        nargs: int = 1,
+        const: Any = None,
+        obj: Any = None
+    ) -> None:
+        ...
+
+    def add_argument(self, dest: str, nargs: int = 1, obj: Any = None) -> None:
+        ...
+
+    def parse_args(
+        self, args: List[str]
+    ) -> Tuple[Dict[str, Any], List[str], List[Any]]:
+        ...
diff --git a/typeshed/third_party/3.6/click/termui.pyi b/typeshed/third_party/3.6/click/termui.pyi
new file mode 100644
index 0000000..33ea7f4
--- /dev/null
+++ b/typeshed/third_party/3.6/click/termui.pyi
@@ -0,0 +1,147 @@
+from contextlib import contextmanager
+from typing import (
+    Any,
+    Callable,
+    Generator,
+    Iterable,
+    IO,
+    List,
+    Optional,
+    Tuple,
+    TypeVar,
+)
+
+
+def hidden_prompt_func(prompt: str) -> str:
+    ...
+
+
+def _build_prompt(
+    text: str,
+    suffix: str,
+    show_default: bool = False,
+    default: str = None,
+) -> str:
+    ...
+
+
+def prompt(
+    text: str,
+    default: str = None,
+    hide_input: bool = False,
+    confirmation_prompt: bool = False,
+    type: Any = None,
+    value_proc: Callable[[Optional[str]], Any] = None,
+    prompt_suffix: str = ': ',
+    show_default: bool = True,
+    err: bool = False,
+) -> Any:
+    ...
+
+
+def confirm(
+    text: str,
+    default: bool = False,
+    abort: bool = False,
+    prompt_suffix: str = ': ',
+    show_default: bool = True,
+    err: bool = False,
+) -> bool:
+    ...
+
+
+def get_terminal_size() -> Tuple[int, int]:
+    ...
+
+
+def echo_via_pager(text: str, color: bool = None) -> None:
+    ...
+
+
+T = TypeVar('T')
+
+
+ at contextmanager
+def progressbar(
+    iterable=Iterable[T],
+    length: int = None,
+    label: str = None,
+    show_eta: bool = True,
+    show_percent: bool = None,
+    show_pos: bool = False,
+    item_show_func: Callable[[T], str] = None,
+    fill_char: str = '#',
+    empty_char: str = '-',
+    bar_template: str = '%(label)s  [%(bar)s]  %(info)s',
+    info_sep: str = '  ',
+    width: int = 36,
+    file: IO = None,
+    color: bool = None,
+) -> Generator[T, None, None]:
+    ...
+
+
+def clear() -> None:
+    ...
+
+
+def style(
+    text: str,
+    fg: str = None,
+    bg: str = None,
+    bold: bool = None,
+    dim: bool = None,
+    underline: bool = None,
+    blink: bool = None,
+    reverse: bool = None,
+    reset: bool = True,
+):
+    ...
+
+
+def unstyle(text: str) -> str:
+    ...
+
+
+# Styling options copied from style() for nicer type checking.
+def secho(
+    text: str,
+    file: IO = None,
+    nl: bool =True,
+    err: bool = False,
+    color: bool = None,
+    fg: str = None,
+    bg: str = None,
+    bold: bool = None,
+    dim: bool = None,
+    underline: bool = None,
+    blink: bool = None,
+    reverse: bool = None,
+    reset: bool = True,
+):
+    ...
+
+
+def edit(
+    text: str = None,
+    editor: str = None,
+    env: str = None,
+    require_save: bool = True,
+    extension: str = '.txt',
+    filename: str = None,
+) -> str:
+    ...
+
+
+def launch(url: str, wait: bool = False, locate: bool = False) -> int:
+    ...
+
+
+def getchar(echo: bool = False) -> str:
+    ...
+
+
+def pause(
+    info: str ='Press any key to continue ...', err: bool = False
+) -> None:
+    ...
diff --git a/typeshed/third_party/3.6/click/types.pyi b/typeshed/third_party/3.6/click/types.pyi
new file mode 100644
index 0000000..9d06a6f
--- /dev/null
+++ b/typeshed/third_party/3.6/click/types.pyi
@@ -0,0 +1,283 @@
+from typing import Any, Callable, IO, Iterable, List, Optional, TypeVar, Union
+import uuid
+
+from click.core import Context, Parameter
+
+
+class ParamType:
+    name: str
+    is_composite: bool
+    envvar_list_splitter: Optional[str]
+
+    def __call__(
+        self,
+        value: Optional[str],
+        param: Parameter = None,
+        ctx: Context = None,
+    ) -> Any:
+        ...
+
+    def get_metavar(self, param: Parameter) -> str:
+        ...
+
+    def get_missing_message(self, param: Parameter) -> str:
+        ...
+
+    def convert(
+        self,
+        value: str,
+        param: Optional[Parameter],
+        ctx: Optional[Context],
+    ) -> Any:
+        ...
+
+    def split_envvar_value(self, rv: str) -> List[str]:
+        ...
+
+    def fail(self, message: str, param: Parameter = None, ctx: Context = None) -> None:
+        ...
+
+
+class BoolParamType(ParamType):
+    def __call__(
+        self,
+        value: Optional[str],
+        param: Parameter = None,
+        ctx: Context = None,
+    ) -> bool:
+        ...
+
+    def convert(
+        self,
+        value: str,
+        param: Optional[Parameter],
+        ctx: Optional[Context],
+    ) -> bool:
+        ...
+
+
+class CompositeParamType(ParamType):
+    arity: int
+
+
+class Choice(ParamType):
+    choices: Iterable[str]
+    def __init__(self, choices: Iterable[str]) -> None:
+        ...
+
+
+class FloatParamType(ParamType):
+    def __call__(
+        self,
+        value: Optional[str],
+        param: Parameter = None,
+        ctx: Context = None,
+    ) -> float:
+        ...
+
+    def convert(
+        self,
+        value: str,
+        param: Optional[Parameter],
+        ctx: Optional[Context],
+    ) -> float:
+        ...
+
+
+class FloatRange(FloatParamType):
+    ...
+
+
+class File(ParamType):
+    def __init__(
+        self,
+        mode: str = 'r',
+        encoding: str = None,
+        errors: str = None,
+        lazy: bool = None,
+        atomic: bool = None,
+    ) -> None:
+        ...
+
+    def __call__(
+        self,
+        value: Optional[str],
+        param: Parameter = None,
+        ctx: Context = None,
+    ) -> IO:
+        ...
+
+    def convert(
+        self,
+        value: str,
+        param: Optional[Parameter],
+        ctx: Optional[Context],
+    ) -> IO:
+        ...
+
+    def resolve_lazy_flag(self, value: str) -> bool:
+        ...
+
+
+F = TypeVar('F')  # result of the function
+Func = Callable[[Optional[str]], F]
+
+
+class FuncParamType(ParamType):
+    func: Func
+
+    def __init__(self, func: Func) -> None:
+        ...
+
+    def __call__(
+        self,
+        value: Optional[str],
+        param: Parameter = None,
+        ctx: Context = None,
+    ) -> F:
+        ...
+
+    def convert(
+        self,
+        value: str,
+        param: Optional[Parameter],
+        ctx: Optional[Context],
+    ) -> F:
+        ...
+
+
+class IntParamType(ParamType):
+    def __call__(
+        self,
+        value: Optional[str],
+        param: Parameter = None,
+        ctx: Context = None,
+    ) -> int:
+        ...
+
+    def convert(
+        self,
+        value: str,
+        param: Optional[Parameter],
+        ctx: Optional[Context],
+    ) -> int:
+        ...
+
+
+class IntRange(IntParamType):
+    def __init__(
+        self, min: int = None, max: int = None, clamp: bool = False
+    ) -> None:
+        ...
+
+
+PathType = TypeVar('PathType', str, bytes)
+
+
+class Path(ParamType):
+    def __init__(
+        self,
+        exists: bool = False,
+        file_okay: bool = True,
+        dir_okay: bool = True,
+        writable: bool = False,
+        readable: bool = True,
+        resolve_path: bool = False,
+        allow_dash: bool = False,
+        path_type: PathType = None,
+    ) -> None:
+        ...
+
+    def coerce_path_result(self, rv: Union[str, bytes]) -> PathType:
+        ...
+
+    def __call__(
+        self,
+        value: Optional[str],
+        param: Parameter = None,
+        ctx: Context = None,
+    ) -> PathType:
+        ...
+
+    def convert(
+        self,
+        value: str,
+        param: Optional[Parameter],
+        ctx: Optional[Context],
+    ) -> PathType:
+        ...
+
+class StringParamType(ParamType):
+    def __call__(
+        self,
+        value: Optional[str],
+        param: Parameter = None,
+        ctx: Context = None,
+    ) -> str:
+        ...
+
+    def convert(
+        self,
+        value: str,
+        param: Optional[Parameter],
+        ctx: Optional[Context],
+    ) -> str:
+        ...
+
+
+class Tuple(CompositeParamType):
+    types: List[ParamType]
+
+    def __init__(self, types: Iterable[Any]) -> None:
+        ...
+
+    def __call__(
+        self,
+        value: Optional[str],
+        param: Parameter = None,
+        ctx: Context = None,
+    ) -> Tuple:
+        ...
+
+    def convert(
+        self,
+        value: str,
+        param: Optional[Parameter],
+        ctx: Optional[Context],
+    ) -> Tuple:
+        ...
+
+
+class UnprocessedParamType(ParamType):
+    ...
+
+
+class UUIDParameterType(ParamType):
+    def __call__(
+        self,
+        value: Optional[str],
+        param: Parameter = None,
+        ctx: Context = None,
+    ) -> uuid.UUID:
+        ...
+
+    def convert(
+        self,
+        value: str,
+        param: Optional[Parameter],
+        ctx: Optional[Context],
+    ) -> uuid.UUID:
+        ...
+
+
+def convert_type(ty: Any, default: Any = None) -> ParamType:
+    ...
+
+# parameter type shortcuts
+
+BOOL = BoolParamType()
+FLOAT = FloatParamType()
+INT = IntParamType()
+STRING = StringParamType()
+UNPROCESSED = UnprocessedParamType()
+UUID = UUIDParameterType()
diff --git a/typeshed/third_party/3.6/click/utils.pyi b/typeshed/third_party/3.6/click/utils.pyi
new file mode 100644
index 0000000..389659f
--- /dev/null
+++ b/typeshed/third_party/3.6/click/utils.pyi
@@ -0,0 +1,118 @@
+from typing import Any, Callable, Iterator, IO, List, Optional, TypeVar, Union
+
+
+T = TypeVar('T')
+Decorator = Callable[[T], T]
+
+
+def _posixify(name: str) -> str:
+    ...
+
+
+def safecall(func: T) -> T:
+    ...
+
+
+def make_str(value: Any) -> str:
+    ...
+
+
+def make_default_short_help(help: str, max_length: int = 45):
+    ...
+
+
+class LazyFile:
+    name: str
+    mode: str
+    encoding: Optional[str]
+    errors: str
+    atomic: bool
+
+    def __init__(
+        self,
+        filename: str,
+        mode: str = 'r',
+        encoding: str = None,
+        errors: str = 'strict',
+        atomic: bool = False
+    ) -> None:
+        ...
+
+    def open(self) -> IO:
+        ...
+
+    def close(self) -> None:
+        ...
+
+    def close_intelligently(self) -> None:
+        ...
+
+    def __enter__(self) -> 'LazyFile':
+        ...
+
+    def __exit__(self, exc_type, exc_value, tb):
+        ...
+
+    def __iter__(self) -> Iterator:
+        ...
+
+
+class KeepOpenFile(object):
+    _file: IO
+
+    def __init__(self, file: IO) -> None:
+        ...
+
+    def __enter__(self) -> 'KeepOpenFile':
+        ...
+
+    def __exit__(self, exc_type, exc_value, tb):
+        ...
+
+    def __iter__(self) -> Iterator:
+        ...
+
+
+def echo(
+    message: str = None,
+    file: IO = None,
+    nl: bool = True,
+    err: bool = False,
+    color: bool = None,
+) -> None:
+    ...
+
+
+def get_binary_stream(name: str) -> IO[bytes]:
+    ...
+
+
+def get_text_stream(
+    name: str, encoding: str = None, errors: str = 'strict'
+) -> IO[str]:
+    ...
+
+
+def open_file(
+    filename: str,
+    mode: str = 'r',
+    encoding: str = None,
+    errors: str = 'strict',
+    lazy: bool = False,
+    atomic: bool = False
+) -> Union[IO, LazyFile, KeepOpenFile]:
+    ...
+
+
+def get_os_args() -> List[str]:
+    ...
+
+
+def format_filename(filename: str, shorten: bool = False) -> str:
+    ...
+
+
+def get_app_dir(
+    app_name: str, roaming: bool = True, force_posix: bool = False
+) -> str:
+    ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/3/dateutil/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/3/dateutil/__init__.pyi
diff --git a/typeshed/third_party/3/dateutil/parser.pyi b/typeshed/third_party/3/dateutil/parser.pyi
new file mode 100644
index 0000000..32df996
--- /dev/null
+++ b/typeshed/third_party/3/dateutil/parser.pyi
@@ -0,0 +1,52 @@
+from typing import List, Tuple, Optional, Callable, Union, IO, Any
+from datetime import datetime
+
+__all__ = ...  # type: List[str]
+
+
+class parserinfo(object):
+    JUMP = ...  # type: List[str]
+    WEEKDAYS = ...  # type: List[Tuple[str, str]]
+    MONTHS = ...  # type: List[Tuple[str, str]]
+    HMS = ...  # type: List[Tuple[str, str, str]]
+    AMPM = ...  # type: List[Tuple[str, str, str]]
+    UTCZONE = ...  # type: List[str]
+    PERTAIN = ...  # type: List[str]
+    TZOFFSET = ...  # type: Dict[str, int]
+
+    def __init__(self, dayfirst: bool=..., yearfirst: bool=...) -> None: ...
+    def jump(self, name: str) -> bool: ...
+    def weekday(self, name: str) -> str: ...
+    def month(self, name: str) -> str: ...
+    def hms(self, name: str) -> str: ...
+    def ampm(self, name: str) -> str: ...
+    def pertain(self, name: str) -> bool: ...
+    def utczone(self, name: str) -> bool: ...
+    def tzoffset(self, name: str) -> int: ...
+    def convertyear(self, year: int) -> int: ...
+    def validate(self, year: datetime) -> bool: ...
+
+
+class parser(object):
+    def __init__(self, info: parserinfo=...) -> None: ...
+
+    def parse(
+        self,
+        timestr: Union[str, bytes, IO[Any]],
+        default: Optional[datetime],
+        ignoretz: bool=...,
+        tzinfos: Any =...,
+    ) -> datetime: ...
+
+DEFAULTPARSER = ...  # type: parser
+
+
+def parse(timestr, parserinfo: parserinfo=..., **kwargs) -> datetime:
+    ...
+
+
+class _tzparser(object):
+    ...
+
+
+DEFAULTTZPARSER = ...  # type: _tzparser
diff --git a/typeshed/third_party/3/dateutil/relativedelta.pyi b/typeshed/third_party/3/dateutil/relativedelta.pyi
new file mode 100644
index 0000000..35e6d07
--- /dev/null
+++ b/typeshed/third_party/3/dateutil/relativedelta.pyi
@@ -0,0 +1,112 @@
+from typing import Optional, overload, Union
+from datetime import date, datetime, timedelta
+
+__all__ = ...  # type: List[str]
+
+
+class weekday(object):
+    def __init__(self, weekday: int, n: Optional[int]=...) -> None: ...
+
+    def __call__(self, n: int) -> 'weekday': ...
+
+    def __eq__(self, other) -> bool: ...
+
+    def __repr__(self) -> str: ...
+
+    weekday = ...  # type: int
+    n = ...  # type: int
+
+MO = ...  # type: weekday
+TU = ...  # type: weekday
+WE = ...  # type: weekday
+TH = ...  # type: weekday
+FR = ...  # type: weekday
+SA = ...  # type: weekday
+SU = ...  # type: weekday
+
+
+class relativedelta(object):
+    def __init__(self,
+                 dt1: Optional[date]=...,
+                 dt2: Optional[date]=...,
+                 years: Optional[int]=..., months: Optional[int]=...,
+                 days: Optional[int]=..., leapdays: Optional[int]=...,
+                 weeks: Optional[int]=...,
+                 hours: Optional[int]=..., minutes: Optional[int]=...,
+                 seconds: Optional[int]=..., microseconds: Optional[int]=...,
+                 year: Optional[int]=..., month: Optional[int]=...,
+                 day: Optional[int]=...,
+                 weekday: Optional[Union[int, weekday]]=...,
+                 yearday: Optional[int]=...,
+                 nlyearday: Optional[int]=...,
+                 hour: Optional[int]=..., minute: Optional[int]=...,
+                 second: Optional[int]=...,
+                 microsecond: Optional[int]=...) -> None: ...
+
+    @property
+    def weeks(self) -> int: ...
+
+    @weeks.setter
+    def weeks(self, value: int) -> None: ...
+
+    def normalized(self) -> 'relativedelta': ...
+
+    # TODO: use Union when mypy will handle it properly in overloaded operator
+    # methods (#2129, #1442, #1264 in mypy)
+    @overload
+    def __add__(self, other: 'relativedelta') -> 'relativedelta': ...
+
+    @overload
+    def __add__(self, other: timedelta) -> 'relativedelta': ...
+
+    @overload
+    def __add__(self, other: date) -> date: ...
+
+    @overload
+    def __add__(self, other: datetime) -> datetime: ...
+
+    @overload
+    def __radd__(self, other: 'relativedelta') -> 'relativedelta': ...
+
+    @overload
+    def __radd__(self, other: timedelta) -> 'relativedelta': ...
+
+    @overload
+    def __radd__(self, other: date) -> date: ...
+
+    @overload
+    def __radd__(self, other: datetime) -> datetime: ...
+
+    @overload
+    def __rsub__(self, other: 'relativedelta') -> 'relativedelta': ...
+
+    @overload
+    def __rsub__(self, other: timedelta) -> 'relativedelta': ...
+
+    @overload
+    def __rsub__(self, other: date) -> date: ...
+
+    @overload
+    def __rsub__(self, other: datetime) -> datetime: ...
+
+    def __sub__(self, other: 'relativedelta') -> 'relativedelta': ...
+
+    def __neg__(self) -> 'relativedelta': ...
+
+    def __bool__(self) -> bool: ...
+
+    def __nonzero__(self) -> bool: ...
+
+    def __mul__(self, other: float) -> 'relativedelta': ...
+
+    def __rmul__(self, other: float) -> 'relativedelta': ...
+
+    def __eq__(self, other) -> bool: ...
+
+    def __ne__(self, other: object) -> bool: ...
+
+    def __div__(self, other: float) -> 'relativedelta': ...
+
+    def __truediv__(self, other: float) -> 'relativedelta': ...
+
+    def __repr__(self) -> str: ...
diff --git a/typeshed/third_party/3/docutils/__init__.pyi b/typeshed/third_party/3/docutils/__init__.pyi
new file mode 100644
index 0000000..eb1ae45
--- /dev/null
+++ b/typeshed/third_party/3/docutils/__init__.pyi
@@ -0,0 +1 @@
+...
diff --git a/typeshed/third_party/3/docutils/examples.pyi b/typeshed/third_party/3/docutils/examples.pyi
new file mode 100644
index 0000000..0abfc7b
--- /dev/null
+++ b/typeshed/third_party/3/docutils/examples.pyi
@@ -0,0 +1,3 @@
+from typing import Any
+
+html_parts = ...  # type: Any
diff --git a/typeshed/third_party/3/docutils/nodes.pyi b/typeshed/third_party/3/docutils/nodes.pyi
new file mode 100644
index 0000000..f747fb1
--- /dev/null
+++ b/typeshed/third_party/3/docutils/nodes.pyi
@@ -0,0 +1,8 @@
+from typing import Any, List
+
+class reference:
+    def __init__(self,
+                 rawsource: str = ...,
+                 text: str = ...,
+                 *children: List[Any],
+                 **attributes) -> None: ...
diff --git a/typeshed/third_party/3/docutils/parsers/__init__.pyi b/typeshed/third_party/3/docutils/parsers/__init__.pyi
new file mode 100644
index 0000000..eb1ae45
--- /dev/null
+++ b/typeshed/third_party/3/docutils/parsers/__init__.pyi
@@ -0,0 +1 @@
+...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/3/docutils/parsers/rst/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/3/docutils/parsers/rst/__init__.pyi
diff --git a/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi b/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi
new file mode 100644
index 0000000..eb1ae45
--- /dev/null
+++ b/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi
@@ -0,0 +1 @@
+...
diff --git a/typeshed/third_party/3/docutils/parsers/rst/roles.pyi b/typeshed/third_party/3/docutils/parsers/rst/roles.pyi
new file mode 100644
index 0000000..7307e58
--- /dev/null
+++ b/typeshed/third_party/3/docutils/parsers/rst/roles.pyi
@@ -0,0 +1,10 @@
+import docutils.nodes
+import docutils.parsers.rst.states
+
+from typing import Callable, Any, List, Dict, Tuple
+
+def register_local_role(name: str,
+                        role_fn: Callable[[str, str, str, int, docutils.parsers.rst.states.Inliner, Dict, List],
+                                          Tuple[List[docutils.nodes.reference], List[docutils.nodes.reference]]]
+                        ) -> None:
+    ...
diff --git a/typeshed/third_party/3/docutils/parsers/rst/states.pyi b/typeshed/third_party/3/docutils/parsers/rst/states.pyi
new file mode 100644
index 0000000..e39d2bc
--- /dev/null
+++ b/typeshed/third_party/3/docutils/parsers/rst/states.pyi
@@ -0,0 +1,5 @@
+import typing
+
+class Inliner:
+    def __init__(self) -> None:
+        ...
diff --git a/typeshed/third_party/3/enum.pyi b/typeshed/third_party/3/enum.pyi
new file mode 100644
index 0000000..3b97e1b
--- /dev/null
+++ b/typeshed/third_party/3/enum.pyi
@@ -0,0 +1,50 @@
+# FIXME: Stub incomplete, ommissions include:
+# * the metaclass
+# * _sunder_ methods with their transformations
+
+import sys
+from typing import List, Any, TypeVar, Union
+
+class Enum:
+    def __new__(cls, value: Any) -> None: ...
+    def __repr__(self) -> str: ...
+    def __str__(self) -> str: ...
+    def __dir__(self) -> List[str]: ...
+    def __format__(self, format_spec: str) -> str: ...
+    def __hash__(self) -> Any: ...
+    def __reduce_ex__(self, proto: Any) -> Any: ...
+
+    name = ...  # type: str
+    value = ...  # type: Any
+
+class IntEnum(int, Enum):
+    value = ...  # type: int
+
+_T = TypeVar('_T')
+
+def unique(enumeration: _T) -> _T: ...
+
+if sys.version_info >= (3, 6):
+    _auto_null = ...  # type: Any
+
+    class auto:
+        value = ...  # type: Any
+
+    class Flag(Enum):
+        def __contains__(self: _T, other: _T) -> bool: ...
+        def __repr__(self) -> str: ...
+        def __str__(self) -> str: ...
+        def __bool__(self) -> bool: ...
+        def __or__(self: _T, other: _T) -> _T: ...
+        def __and__(self: _T, other: _T) -> _T: ...
+        def __xor__(self: _T, other: _T) -> _T: ...
+        def __invert__(self: _T) -> _T: ...
+
+    # All `type: ignore` comments below due to IntFlag making the function signatures more permissive.
+    class IntFlag(int, Flag):  # type: ignore
+        def __or__(self: _T, other: Union[int, _T]) -> _T: ...  # type: ignore
+        def __and__(self: _T, other: Union[int, _T]) -> _T: ...  # type: ignore
+        def __xor__(self: _T, other: Union[int, _T]) -> _T: ...  # type: ignore
+        __ror__ = __or__
+        __rand__ = __and__
+        __rxor__ = __xor__
diff --git a/typeshed/third_party/3/itsdangerous.pyi b/typeshed/third_party/3/itsdangerous.pyi
new file mode 100644
index 0000000..efa51df
--- /dev/null
+++ b/typeshed/third_party/3/itsdangerous.pyi
@@ -0,0 +1,156 @@
+# Stubs for itsdangerous (Python 3)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from datetime import datetime
+from typing import Any, Callable, IO, MutableMapping, Optional, Text, Tuple, TypeVar, Union
+
+PY2 = ...  # type: bool
+text_type = str
+int_to_byte = Callable[[int], bytes]
+number_types = (int, float)
+izip = zip
+
+bytes_like = Union[bytearray, bytes]
+str_like = Union[str, bytes]
+can_become_bytes = Union[str, bytes, bytearray]
+comparable_bytes = TypeVar('comparable_bytes', str, Union[bytes, bytearray])
+
+class _CompactJSON:
+    def loads(self, payload: Text) -> Any: ...
+    def dumps(self, obj: Any) -> Text: ...
+
+compact_json = _CompactJSON
+EPOCH = ...  # type: int
+
+def want_bytes(s: can_become_bytes, encoding='', errors='') -> bytes: ...
+def is_text_serializer(serializer: Any) -> bool: ...
+def constant_time_compare(val1: comparable_bytes, val2: comparable_bytes) -> bool: ...
+
+class BadData(Exception):
+    message = ...  # type: str
+    def __init__(self, message: str) -> None: ...
+
+class BadPayload(BadData):
+    original_error = ...  # type: Optional[Exception]
+    def __init__(self, message: str, original_error: Optional[Exception]=None) -> None: ...
+
+class BadSignature(BadData):
+    payload = ...  # type: Optional[Any]
+    def __init__(self, message: str, payload: Optional[Any]=None) -> None: ...
+
+class BadTimeSignature(BadSignature):
+    date_signed = ...  # type: Optional[int]
+    def __init__(self, message, payload: Optional[Any]=None, date_signed: Optional[int]=None) -> None: ...
+
+class BadHeader(BadSignature):
+    header = ...  # type: Any
+    original_error = ...  # type: Any
+    def __init__(self, message, payload=None, header=None, original_error=None) -> None: ...
+
+class SignatureExpired(BadTimeSignature): ...
+
+def base64_encode(string: can_become_bytes) -> bytes: ...
+def base64_decode(string: can_become_bytes) -> bytes: ...
+def int_to_bytes(num: int) -> bytes: ...
+def bytes_to_int(bytestr: can_become_bytes) -> bytes: ...
+
+class SigningAlgorithm:
+    def get_signature(self, key: bytes_like, value: bytes_like) -> bytes: ...
+    def verify_signature(self, key: bytes_like, value: bytes_like, sig: can_become_bytes) -> bool: ...
+
+class NoneAlgorithm(SigningAlgorithm):
+    def get_signature(self, key: bytes_like, value: bytes_like) -> bytes: ...
+
+class HMACAlgorithm(SigningAlgorithm):
+    default_digest_method = ...  # type: Callable
+    digest_method = ...  # type: Callable
+    def __init__(self, digest_method: Optional[Callable]=None) -> None: ...
+    def get_signature(self, key: bytes_like, value: bytes_like) -> bytes: ...
+
+class Signer:
+    default_digest_method = ...  # type: Callable
+    default_key_derivation = ...  # type: str
+    secret_key = ...  # type: can_become_bytes
+    sep = ...  # type: can_become_bytes
+    salt = ...  # type: can_become_bytes
+    key_derivation = ...  # type: str
+    digest_method = ...  # type: Callable
+    algorithm = ...  # type: SigningAlgorithm
+    def __init__(self, secret_key: can_become_bytes, salt: Optional[can_become_bytes]=None, sep: Optional[can_become_bytes]='',
+                 key_derivation: Optional[str]=None,
+                 digest_method: Optional[Callable]=None,
+                 algorithm: Optional[SigningAlgorithm]=None) -> None: ...
+    def derive_key(self) -> bytes: ...
+    def get_signature(self, value: bytes_like) -> bytes: ...
+    def sign(self, value: bytes_like) -> bytes: ...
+    def verify_signature(self, value: bytes_like, sig: can_become_bytes) -> bool: ...
+    def unsign(self, signed_value: can_become_bytes) -> str: ...
+    def validate(self, signed_value: can_become_bytes) -> bool: ...
+
+class TimestampSigner(Signer):
+    def get_timestamp(self) -> int: ...
+    def timestamp_to_datetime(self, ts: int) -> datetime: ...
+    def sign(self, value: bytes_like) -> bytes: ...
+    def unsign(self, value: can_become_bytes, max_age: Optional[int]=None, return_timestamp=False) -> Any: ...
+    def validate(self, signed_value: can_become_bytes, max_age: Optional[int]=None) -> bool: ...
+
+class Serializer:
+    default_serializer = ...  # type: Any
+    default_signer = ...  # type: Callable[..., Signer]
+    secret_key = ...  # type: Any
+    salt = ...  # type: can_become_bytes
+    serializer = ...  # type: Any
+    is_text_serializer = ...  # type: bool
+    signer = ...  # type: Signer
+    signer_kwargs = ...  # type: MutableMapping
+    def __init__(self, secret_key: can_become_bytes, salt: Optional[can_become_bytes]=b'', serializer=None, signer: Optional[Callable[..., Signer]]=None, signer_kwargs: Optional[MutableMapping]=None) -> None: ...
+    def load_payload(self, payload: Any, serializer=None) -> Any: ...
+    def dump_payload(self, *args, **kwargs) -> bytes: ...
+    def make_signer(self, salt: Optional[can_become_bytes]=None) -> Signer: ...
+    def dumps(self, obj: Any, salt: Optional[can_become_bytes]=None) -> str_like: ...
+    def dump(self, obj: Any, f: IO, salt: Optional[can_become_bytes]=None) -> None: ...
+    def loads(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None) -> Any: ...
+    def load(self, f: IO, salt: Optional[can_become_bytes]=None): ...
+    def loads_unsafe(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None) -> Tuple[bool, Any]: ...
+    def load_unsafe(self, f: IO, *args, **kwargs) -> Tuple[bool, Any]: ...
+
+class TimedSerializer(Serializer):
+    default_signer = ...  # type: Callable[..., TimestampSigner]
+    def loads(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None, max_age: Optional[int]=None, return_timestamp=False) -> Any: ...
+    def loads_unsafe(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None, max_age: Optional[int]=None) -> Tuple[bool, Any]: ...
+
+class JSONWebSignatureSerializer(Serializer):
+    jws_algorithms = ...  # type: MutableMapping[str, SigningAlgorithm]
+    default_algorithm = ...  # type: str
+    default_serializer = ...  # type: Any
+    algorithm_name = ...  # type: str
+    algorithm = ...  # type: Any
+    def __init__(self, secret_key: can_become_bytes, salt: Optional[can_become_bytes]=None, serializer=None, signer: Optional[Callable[..., Signer]]=None, signer_kwargs: Optional[MutableMapping]=None, algorithm_name: Optional[str]=None) -> None: ...
+    def load_payload(self, payload: Any, return_header=False) -> Any: ...
+    def dump_payload(self, *args, **kwargs) -> bytes: ...
+    def make_algorithm(self, algorithm_name: str) -> SigningAlgorithm: ...
+    def make_signer(self, salt: Optional[can_become_bytes]=None, algorithm_name: Optional[str]=None) -> Signer: ...
+    def make_header(self, header_fields=Optional[MutableMapping]) -> MutableMapping: ...
+    def dumps(self, obj: Any, salt: Optional[can_become_bytes]=None, header_fields=Optional[MutableMapping]) -> str: ...
+    def loads(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None, return_header=False) -> Any: ...
+    def loads_unsafe(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None, return_header=False) -> Tuple[bool, Any]: ...
+
+class TimedJSONWebSignatureSerializer(JSONWebSignatureSerializer):
+    DEFAULT_EXPIRES_IN = ...  # type: int
+    expires_in = ...  # type: int
+    def __init__(self, secret_key: can_become_bytes, expires_in: Optional[int]=None, **kwargs) -> None: ...
+    def make_header(self, header_fields=Optional[MutableMapping]) -> MutableMapping: ...
+    def loads(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None, return_header=False) -> Any: ...
+    def get_issue_date(self, header: MutableMapping) -> Optional[datetime]: ...
+    def now(self) -> int: ...
+
+class URLSafeSerializerMixin:
+    def load_payload(self, payload: Any, serializer: Any = ..., **kwargs) -> Any: ...
+    def dump_payload(self, *args, **kwargs) -> bytes: ...
+
+class URLSafeSerializer(URLSafeSerializerMixin, Serializer):
+    default_serializer = ...  # type: Any
+
+class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer):
+    default_serializer = ...  # type: Any
diff --git a/mypy/test/__init__.py b/typeshed/third_party/3/lxml/__init__.pyi
similarity index 100%
rename from mypy/test/__init__.py
rename to typeshed/third_party/3/lxml/__init__.pyi
diff --git a/typeshed/third_party/3/lxml/etree.pyi b/typeshed/third_party/3/lxml/etree.pyi
new file mode 100644
index 0000000..39e5077
--- /dev/null
+++ b/typeshed/third_party/3/lxml/etree.pyi
@@ -0,0 +1,169 @@
+# Hand-written stub for lxml.etree as used by mypy.report.
+# This is *far* from complete, and the stubgen-generated ones crash mypy.
+# Any use of `Any` below means I couldn't figure out the type.
+
+import typing
+from typing import Any, Dict, List, MutableMapping, Tuple, Union
+from typing import Iterable, Iterator, SupportsBytes
+
+
+# We do *not* want `typing.AnyStr` because it is a `TypeVar`, which is an
+# unnecessary constraint. It seems reasonable to constrain each
+# List/Dict argument to use one type consistently, though, and it is
+# necessary in order to keep these brief.
+AnyStr = Union[str, bytes]
+ListAnyStr = Union[List[str], List[bytes]]
+DictAnyStr = Union[Dict[str, str], Dict[bytes, bytes]]
+Dict_Tuple2AnyStr_Any = Union[Dict[Tuple[str, str], Any], Tuple[bytes, bytes], Any]
+
+
+class ElementChildIterator(Iterator['_Element;']):
+    def __iter__(self) -> 'ElementChildIterator': ...
+    def __next__(self) -> '_Element': ...
+
+class _Element(Iterable['_Element']):
+    def addprevious(self, element: '_Element') -> None:
+        pass
+
+    attrib = ...  # type: MutableMapping[str, str]
+    text = ...  # type: AnyStr
+    tag = ...  # type: str
+    def append(self, element: '_Element') -> '_Element': ...
+    def __iter__(self) -> ElementChildIterator: ...
+
+class ElementBase(_Element):
+    pass
+
+class _ElementTree:
+    def write(self,
+              file: Union[AnyStr, typing.IO],
+              encoding: AnyStr = ...,
+              method: AnyStr = ...,
+              pretty_print: bool = ...,
+              xml_declaration: Any = ...,
+              with_tail: Any = ...,
+              standalone: bool = ...,
+              compression: int = ...,
+              exclusive: bool = ...,
+              with_comments: bool = ...,
+              inclusive_ns_prefixes: ListAnyStr = ...) -> None:
+        pass
+
+class _XSLTResultTree(SupportsBytes):
+    pass
+
+class _XSLTQuotedStringParam:
+    pass
+
+class XMLParser:
+    pass
+
+class XMLSchema:
+    def __init__(self,
+                 etree: Union[_Element, _ElementTree] = ...,
+                 file: Union[AnyStr, typing.IO] = ...) -> None:
+        pass
+
+    def assertValid(self,
+                    etree: Union[_Element, _ElementTree]) -> None:
+        pass
+
+class XSLTAccessControl:
+    pass
+
+class XSLT:
+    def __init__(self,
+                 xslt_input: Union[_Element, _ElementTree],
+                 extensions: Dict_Tuple2AnyStr_Any = ...,
+                 regexp: bool = ...,
+                 access_control: XSLTAccessControl = ...) -> None:
+        pass
+
+    def __call__(self,
+                 _input: Union[_Element, _ElementTree],
+                 profile_run: bool = ...,
+                 **kwargs: Union[AnyStr, _XSLTQuotedStringParam]) -> _XSLTResultTree:
+        pass
+
+    @staticmethod
+    def strparam(s: AnyStr) -> _XSLTQuotedStringParam:
+        pass
+
+def Element(_tag: AnyStr,
+            attrib: DictAnyStr = ...,
+            nsmap: DictAnyStr = ...,
+            **extra: AnyStr) -> _Element:
+    pass
+
+def SubElement(_parent: _Element, _tag: AnyStr,
+               attrib: DictAnyStr = ...,
+               nsmap: DictAnyStr = ...,
+               **extra: AnyStr) -> _Element:
+    pass
+
+def ElementTree(element: _Element = ...,
+                file: Union[AnyStr, typing.IO] = ...,
+                parser: XMLParser = ...) -> _ElementTree:
+    pass
+
+def ProcessingInstruction(target: AnyStr, text: AnyStr = ...) -> _Element:
+    pass
+
+def parse(source: Union[AnyStr, typing.IO],
+          parser: XMLParser = ...,
+          base_url: AnyStr = ...) -> _ElementTree:
+    pass
+
+
+def fromstring(text: AnyStr,
+               parser: XMLParser = ...,
+               *,
+               base_url: AnyStr = ...) -> _Element: ...
+
+def tostring(element_or_tree: Union[_Element, _ElementTree],
+             encoding: Union[str, type] = ...,
+             method: str = ...,
+             xml_declaration: bool = ...,
+             pretty_print: bool = ...,
+             with_tail: bool = ...,
+             standalone: bool = ...,
+             doctype: str = ...,
+             exclusive: bool = ...,
+             with_comments: bool = ...,
+             inclusive_ns_prefixes: Any = ...) -> AnyStr: ...
+
+
+class _ErrorLog:
+    pass
+
+
+class Error(Exception):
+    pass
+
+class LxmlError(Error):
+    def __init__(self, message: Any, error_log: _ErrorLog = ...) -> None: ...
+    error_log = ...  # type: _ErrorLog
+
+class DocumentInvalid(LxmlError):
+    pass
+
+class LxmlSyntaxError(LxmlError, SyntaxError):
+    pass
+
+class ParseError(LxmlSyntaxError):
+    pass
+
+class XMLSyntaxError(ParseError):
+    pass
+
+
+class _Validator:
+    pass
+
+class DTD(_Validator):
+    def __init__(self,
+                 file: Union[AnyStr, typing.IO] = ...,
+                 *,
+                 external_id: Any = ...) -> None: ...
+
+    def assertValid(self, etree: _Element) -> None: ...
diff --git a/typeshed/third_party/3/lxml/objectify.pyi b/typeshed/third_party/3/lxml/objectify.pyi
new file mode 100644
index 0000000..74293c4
--- /dev/null
+++ b/typeshed/third_party/3/lxml/objectify.pyi
@@ -0,0 +1,13 @@
+# Hand-written stub, incomplete
+
+from typing import Union
+
+from lxml.etree import ElementBase, XMLParser
+
+class ObjectifiedElement(ElementBase):
+    pass
+
+def fromstring(text: Union[bytes, str],
+               parser: XMLParser = ...,
+               *,
+               base_url: Union[bytes, str] = ...) -> ObjectifiedElement: ...
diff --git a/typeshed/third_party/3/pkg_resources.pyi b/typeshed/third_party/3/pkg_resources.pyi
new file mode 100644
index 0000000..b31ea6d
--- /dev/null
+++ b/typeshed/third_party/3/pkg_resources.pyi
@@ -0,0 +1,313 @@
+# Stubs for pkg_resources (Python 3.4)
+
+from typing import (
+    Any, Callable, Dict, IO, Iterable, Generator, Optional, Sequence, Tuple,
+    List, Union,
+    TypeVar, overload,
+)
+import importlib.abc
+import sys
+import types
+import zipimport
+
+_T = TypeVar('_T')
+_NestedStr = Union[str, Iterable[Union[str, Iterable[Any]]]]
+_InstallerType = Callable[[Requirement], Optional[Distribution]]
+_EPDistType = Union[Distribution, Requirement, str]
+_MetadataType = Optional[IResourceProvider]
+_PkgReqType = Union[str, Requirement]
+_DistFinderType = Callable[[str, _Importer, bool],
+                           Generator[Distribution, None, None]]
+_NSHandlerType = Callable[[_Importer, str, str, types.ModuleType], str]
+
+def declare_namespace(name: str) -> None: ...
+def fixup_namespace_packages(path_item: str) -> None: ...
+
+
+class WorkingSet:
+    entries = ...  # type: List[str]
+    def __init__(self, entries: Optional[Iterable[str]] = ...) -> None: ...
+    def require(self, *requirements: _NestedStr) -> Sequence[Distribution]: ...
+    def run_script(self, requires: str, script_name: str) -> None: ...
+    def iter_entry_points(self, group: str, name: Optional[str] = ...) \
+                          -> Generator[EntryPoint, None, None]: ...
+    def add_entry(self, entry: str) -> None: ...
+    def __contains__(self, dist: Distribution) -> bool: ...
+    def __iter__(self) -> Generator[Distribution, None, None]: ...
+    def find(self, req: Requirement) -> Optional[Distribution]: ...
+    def resolve(self, requirements: Sequence[Requirement],
+                env: Optional[Environment] = ...,
+                installer: Optional[_InstallerType] = ...) \
+                -> List[Distribution]: ...
+    def add(self, dist: Distribution, entry: Optional[str] = ...,
+            insert: bool = ..., replace: bool = ...) -> None: ...
+    def subscribe(self, callback: Callable[[Distribution], None]) -> None: ...
+    def find_plugins(self, plugin_env: Environment,
+                     full_env: Optional[Environment] = ...,
+                     fallback: bool = ...) \
+                     -> Tuple[List[Distribution],
+                              Dict[Distribution, Exception]]: ...
+
+working_set = ...  # type: WorkingSet
+
+def require(
+    *requirements: Union[str, Sequence[str]]
+) -> Sequence[Distribution]: ...
+def run_script(requires: str, script_name: str) -> None: ...
+def iter_entry_points(
+    group: str, name: Optional[str] = ...
+) -> Generator[EntryPoint, None, None]: ...
+def add_activation_listener(
+    callback: Callable[[Distribution], None]
+) -> None: ...
+
+
+class Environment:
+    def __init__(self, search_path: Optional[Sequence[str]] = ...,
+                 platform: Optional[str] = ...,
+                 python: Optional[str] = ...) -> None: ...
+    def __getitem__(self, project_name: str) -> List[Distribution]: ...
+    def __iter__(self) -> Generator[str, None, None]: ...
+    def add(self, dist: Distribution) -> None: ...
+    def remove(self, dist: Distribution) -> None: ...
+    def can_add(self, dist: Distribution) -> bool: ...
+    def __add__(self,
+                other: Union[Distribution, Environment]) -> Environment: ...
+    def __iadd__(self,
+                 other: Union[Distribution, Environment]) -> Environment: ...
+    @overload
+    def best_match(self, req: Requirement, working_set: WorkingSet) -> Distribution: ...
+    @overload
+    def best_match(self, req: Requirement, working_set: WorkingSet,
+                   installer: Callable[[Requirement], _T] = ...) -> _T: ...
+    @overload
+    def obtain(self, requirement: Requirement) -> None: ...
+    @overload
+    def obtain(self, requirement: Requirement,
+               installer: Callable[[Requirement], _T] = ...) -> _T: ...
+    def scan(self, search_path: Optional[Sequence[str]] = ...) -> None: ...
+
+
+def parse_requirements(strs: Union[str, Iterable[str]]) -> Generator[Requirement, None, None]: ...
+
+class Requirement:
+    project_name = ...  # type: str
+    key = ...  # type: str
+    extras = ...  # type: Tuple[str, ...]
+    specs = ...  # type: List[Tuple[str, str]]
+    @staticmethod
+    def parse(s: Union[str, Iterable[str]]) -> Requirement: ...
+    def __contains__(self,
+                     item: Union[Distribution, str, Tuple[str, ...]]) \
+                     -> bool: ...
+    def __eq__(self, other_requirement: Any) -> bool: ...
+
+def load_entry_point(dist: _EPDistType, group: str, name: str) -> None: ...
+def get_entry_info(dist: _EPDistType, group: str,
+                   name: str) -> Optional[EntryPoint]: ...
+ at overload
+def get_entry_map(dist: _EPDistType) -> Dict[str, Dict[str, EntryPoint]]: ...
+ at overload
+def get_entry_map(dist: _EPDistType, group: str = ...) -> Dict[str, EntryPoint]: ...
+
+class EntryPoint:
+    name = ...  # type: str
+    module_name = ...  # type: str
+    attrs = ...  # type: Tuple[str, ...]
+    extras = ...  # type: Tuple[str, ...]
+    dist = ...  # type: Optional[Distribution]
+    def __init__(self, name: str, module_name: str,
+                 attrs: Tuple[str, ...] = ..., extras: Tuple[str, ...] = ...,
+                 dist: Optional[Distribution] = ...) -> None: ...
+    @classmethod
+    def parse(cls, src: str, dist: Optional[Distribution] = ...) -> EntryPoint: ...
+    @classmethod
+    def parse_group(cls, group: str, lines: Union[str, Sequence[str]],
+                    dist: Optional[Distribution] = ...) -> Dict[str, EntryPoint]: ...
+    @classmethod
+    def parse_map(cls, data: Union[Dict[str, Union[str, Sequence[str]]],
+                                   str, Sequence[str]],
+                  dist: Optional[Distribution] = ...) -> Dict[str, EntryPoint]: ...
+    def load(self, require: bool = ..., env: Optional[Environment] = ...,
+             installer: Optional[_InstallerType] = ...) -> Any: ...
+    def require(self, env: Optional[Environment] = ...,
+                installer: Optional[_InstallerType] = ...) -> None: ...
+
+
+def find_distributions(
+    path_item: str, only: bool = ...
+) -> Generator[Distribution, None, None]: ...
+def get_distribution(dist: Union[Requirement, str, Distribution]) -> Distribution: ...
+
+class Distribution(IResourceProvider, IMetadataProvider):
+    location = ...  # type: str
+    project_name = ...  # type: str
+    key = ...  # type: str
+    extras = ...  # type: List[str]
+    version = ...  # type: str
+    parsed_version = ...  # type: Tuple[str, ...]
+    py_version = ...  # type: str
+    platform = ...  # type: Optional[str]
+    precedence = ...  # type: int
+    def __init__(self, location: Optional[str] = ...,
+                 metadata: Optional[str] = ...,
+                 project_name: Optional[str] = ...,
+                 version: Optional[str] = ..., py_version: str = ...,
+                 platform: Optional[str] = ...,
+                 precedence: int = ...) -> None: ...
+    @classmethod
+    def from_location(cls, location: str, basename: str,
+                      metadata: Optional[str] = ...,
+                      **kw: Union[str, None, int]) -> Distribution: ...
+    @classmethod
+    def from_filename(cls, filename: str, metadata: Optional[str] = ...,
+                      **kw: Union[str, None, int]) -> Distribution: ...
+    def activate(self, path: Optional[List[str]] = ...) -> None: ...
+    def as_requirement(self) -> Requirement: ...
+    def requires(self, extras: Tuple[str, ...] = ...) -> List[Requirement]: ...
+    def clone(self, **kw: Union[str, int, None]) -> Requirement: ...
+    def egg_name(self) -> str: ...
+    def __cmp__(self, other: Any) -> bool: ...
+    def get_entry_info(dist: _EPDistType, group: str,
+                       name: str) -> Optional[EntryPoint]: ...
+    @overload
+    def get_entry_map(dist: _EPDistType) \
+                      -> Dict[str, Dict[str, EntryPoint]]: ...
+    @overload
+    def get_entry_map(dist: _EPDistType, group: str = ...) \
+                      -> Dict[str, EntryPoint]: ...
+    def load_entry_point(dist: _EPDistType, group: str, name: str) -> None: ...
+
+EGG_DIST = ...  # type: int
+BINARY_DIST = ...  # type: int
+SOURCE_DIST = ...  # type: int
+CHECKOUT_DIST = ...  # type: int
+DEVELOP_DIST = ...  # type: int
+
+
+def resource_exists(package_or_requirement: _PkgReqType,
+                    resource_name: str) -> bool: ...
+def resource_stream(package_or_requirement: _PkgReqType,
+                    resource_name: str) -> IO[bytes]: ...
+def resource_string(package_or_requirement: _PkgReqType,
+                    resource_name: str) -> bytes: ...
+def resource_isdir(package_or_requirement: _PkgReqType,
+                   resource_name: str) -> bool: ...
+def resource_listdir(package_or_requirement: _PkgReqType,
+                     resource_name: str) -> List[str]: ...
+
+def resource_filename(package_or_requirement: _PkgReqType,
+                      resource_name: str) -> str: ...
+def set_extraction_path(path: str) -> None: ...
+def cleanup_resources(force: bool = ...) -> List[str]: ...
+
+class IResourceManager:
+    def resource_exists(self, package_or_requirement: _PkgReqType,
+                        resource_name: str) -> bool: ...
+    def resource_stream(self, package_or_requirement: _PkgReqType,
+                        resource_name: str) -> IO[bytes]: ...
+    def resource_string(self, package_or_requirement: _PkgReqType,
+                        resource_name: str) -> bytes: ...
+    def resource_isdir(self, package_or_requirement: _PkgReqType,
+                       resource_name: str) -> bool: ...
+    def resource_listdir(self, package_or_requirement: _PkgReqType,
+                         resource_name: str) -> List[str]: ...
+    def resource_filename(self, package_or_requirement: _PkgReqType,
+                          resource_name: str) -> str: ...
+    def set_extraction_path(self, path: str) -> None: ...
+    def cleanup_resources(self, force: bool = ...) -> List[str]: ...
+    def get_cache_path(self, archive_name: str,
+                       names: Tuple[str, ...] = ...) -> str: ...
+    def extraction_error(self) -> None: ...
+    def postprocess(self, tempname: str, filename: str) -> None: ...
+
+
+ at overload
+def get_provider(package_or_requirement: str) -> IResourceProvider: ...
+ at overload
+def get_provider(package_or_requirement: Requirement) -> Distribution: ...
+
+class IMetadataProvider:
+    def has_metadata(self, name: str) -> bool: ...
+    def metadata_isdir(self, name: str) -> bool: ...
+    def metadata_listdir(self, name: str) -> List[str]: ...
+    def get_metadata(self, name: str) -> str: ...
+    def get_metadata_lines(self, name: str) -> Generator[List[str], None, None]: ...
+    def run_script(self, script_name: str, namespace: Dict[str, Any]) -> None: ...
+
+
+class ResolutionError(Exception): ...
+class DistributionNotFound(ResolutionError): ...
+class VersionConflict(ResolutionError): ...
+class UnknownExtra(ResolutionError): ...
+
+class ExtractionError(Exception):
+    manager = ...  # type: IResourceManager
+    cache_path = ...  # type: str
+    original_error = ...  # type: Exception
+
+
+if sys.version_info >= (3, 3):
+    class _Importer(importlib.abc.MetaPathFinder, importlib.abc.InspectLoader): ...
+else:
+    class _Importer(importlib.abc.InspectLoader): ...
+
+def register_finder(importer_type: type,
+                    distribution_finder: _DistFinderType) -> None: ...
+def register_loader_type(
+    loader_type: type,
+    provider_factory: Callable[[types.ModuleType], IResourceProvider]
+) -> None: ...
+def register_namespace_handler(importer_type: type,
+                               namespace_handler: _NSHandlerType) -> None: ...
+
+
+class IResourceProvider(IMetadataProvider): ...
+
+
+class NullProvider: ...
+
+class EggProvider(NullProvider): ...
+
+class DefaultProvider(EggProvider): ...
+
+class PathMetadata(DefaultProvider, IResourceProvider):
+    def __init__(self, path: str, egg_info: str) -> None: ...
+
+class ZipProvider(EggProvider): ...
+
+class EggMetadata(ZipProvider, IResourceProvider):
+    def __init__(self, zipimporter: zipimport.zipimporter) -> None: ...
+
+class EmptyProvider(NullProvider): ...
+
+empty_provider = ...  # type: EmptyProvider
+
+class FileMetadata(EmptyProvider, IResourceProvider):
+    def __init__(self, path_to_pkg_info: str) -> None: ...
+
+
+def parse_version(v: str) -> Tuple[str, ...]: ...
+def yield_lines(strs: _NestedStr) -> Generator[str, None, None]: ...
+def split_sections(
+    strs: _NestedStr
+) -> Generator[Tuple[Optional[str], str], None, None]: ...
+def safe_name(name: str) -> str: ...
+def safe_version(version: str) -> str: ...
+def safe_extra(extra: str) -> str: ...
+def to_filename(name_or_version: str) -> str: ...
+
+
+def get_build_platform() -> str: ...
+def get_platform() -> str: ...
+def get_supported_platform() -> str: ...
+def compatible_platforms(provided: Optional[str],
+                         required: Optional[str]) -> bool: ...
+def get_default_cache() -> str: ...
+
+
+def get_importer(path_item: str) -> _Importer: ...
+
+
+def ensure_directory(path: str) -> None: ...
+def normalize_path(filename: str) -> str: ...
diff --git a/typeshed/third_party/3/requests/__init__.pyi b/typeshed/third_party/3/requests/__init__.pyi
new file mode 100644
index 0000000..a89d4a0
--- /dev/null
+++ b/typeshed/third_party/3/requests/__init__.pyi
@@ -0,0 +1,39 @@
+# Stubs for requests (based on version 2.6.0, Python 3)
+
+from typing import Any
+from . import models
+from . import api
+from . import sessions
+from . import status_codes
+from . import exceptions
+import logging
+
+__title__ = ...  # type: Any
+__build__ = ...  # type: Any
+__license__ = ...  # type: Any
+__copyright__ = ...  # type: Any
+__version__ = ...  # type: Any
+
+Request = models.Request
+Response = models.Response
+PreparedRequest = models.PreparedRequest
+request = api.request
+get = api.get
+head = api.head
+post = api.post
+patch = api.patch
+put = api.put
+delete = api.delete
+options = api.options
+session = sessions.session
+Session = sessions.Session
+codes = status_codes.codes
+RequestException = exceptions.RequestException
+Timeout = exceptions.Timeout
+URLRequired = exceptions.URLRequired
+TooManyRedirects = exceptions.TooManyRedirects
+HTTPError = exceptions.HTTPError
+ConnectionError = exceptions.ConnectionError
+
+class NullHandler(logging.Handler):
+    def emit(self, record): ...
diff --git a/typeshed/third_party/3/requests/adapters.pyi b/typeshed/third_party/3/requests/adapters.pyi
new file mode 100644
index 0000000..d896f1a
--- /dev/null
+++ b/typeshed/third_party/3/requests/adapters.pyi
@@ -0,0 +1,72 @@
+# Stubs for requests.adapters (Python 3)
+
+from typing import Any, Container, Union, Tuple
+from . import models
+from .packages.urllib3 import poolmanager
+from .packages.urllib3 import response
+from .packages.urllib3.util import retry
+from . import compat
+from . import utils
+from . import structures
+from .packages.urllib3 import exceptions as urllib3_exceptions
+from . import cookies
+from . import exceptions
+from . import auth
+
+PreparedRequest = models.PreparedRequest
+Response = models.Response
+PoolManager = poolmanager.PoolManager
+proxy_from_url = poolmanager.proxy_from_url
+HTTPResponse = response.HTTPResponse
+Retry = retry.Retry
+DEFAULT_CA_BUNDLE_PATH = utils.DEFAULT_CA_BUNDLE_PATH
+get_encoding_from_headers = utils.get_encoding_from_headers
+prepend_scheme_if_needed = utils.prepend_scheme_if_needed
+get_auth_from_url = utils.get_auth_from_url
+urldefragauth = utils.urldefragauth
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+ConnectTimeoutError = urllib3_exceptions.ConnectTimeoutError
+MaxRetryError = urllib3_exceptions.MaxRetryError
+ProtocolError = urllib3_exceptions.ProtocolError
+ReadTimeoutError = urllib3_exceptions.ReadTimeoutError
+ResponseError = urllib3_exceptions.ResponseError
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+ConnectionError = exceptions.ConnectionError
+ConnectTimeout = exceptions.ConnectTimeout
+ReadTimeout = exceptions.ReadTimeout
+SSLError = exceptions.SSLError
+ProxyError = exceptions.ProxyError
+RetryError = exceptions.RetryError
+
+DEFAULT_POOLBLOCK = ...  # type: Any
+DEFAULT_POOLSIZE = ...  # type: Any
+DEFAULT_RETRIES = ...  # type: Any
+
+class BaseAdapter:
+    def __init__(self) -> None: ...
+    def send(self, request: PreparedRequest, stream=False,
+             timeout: Union[None, float, Tuple[float, float]]=None,
+             verify=False,
+             cert: Union[None, Union[str, bytes], Container[Union[str, bytes]]]=None
+             ) -> Response: ...
+    def close(self) -> None: ...
+class HTTPAdapter(BaseAdapter):
+    __attrs__ = ...  # type: Any
+    max_retries = ...  # type: Any
+    config = ...  # type: Any
+    proxy_manager = ...  # type: Any
+    def __init__(self, pool_connections=..., pool_maxsize=..., max_retries=...,
+                 pool_block=...): ...
+    poolmanager = ...  # type: Any
+    def init_poolmanager(self, connections, maxsize, block=..., **pool_kwargs): ...
+    def proxy_manager_for(self, proxy, **proxy_kwargs): ...
+    def cert_verify(self, conn, url, verify, cert): ...
+    def build_response(self, req, resp): ...
+    def get_connection(self, url, proxies=...): ...
+    def close(self): ...
+    def request_url(self, request, proxies): ...
+    def add_headers(self, request, **kwargs): ...
+    def proxy_headers(self, proxy): ...
+    # TODO: "request" is not actually optional, modified to please mypy.
+    def send(self, request=..., stream=..., timeout=..., verify=..., cert=...,
+             proxies=...): ...
diff --git a/typeshed/third_party/3/requests/api.pyi b/typeshed/third_party/3/requests/api.pyi
new file mode 100644
index 0000000..f5f1ec3
--- /dev/null
+++ b/typeshed/third_party/3/requests/api.pyi
@@ -0,0 +1,18 @@
+# Stubs for requests.api (Python 3)
+
+from typing import Optional, Union, Any
+
+from .models import Response
+
+def request(method: str, url: str, **kwargs) -> Response: ...
+def get(url: Union[str, bytes],
+        params: Optional[Union[str,
+                               bytes,
+                               dict[Union[str, bytes], Union[str, bytes]]]]=None,
+        **kwargs) -> Response: ...
+def options(url: str, **kwargs) -> Response: ...
+def head(url: str, **kwargs) -> Response: ...
+def post(url: str, data=..., json=..., **kwargs) -> Response: ...
+def put(url: str, data=..., **kwargs) -> Response: ...
+def patch(url: str, data=..., **kwargs) -> Response: ...
+def delete(url: str, **kwargs) -> Response: ...
diff --git a/typeshed/third_party/3/requests/auth.pyi b/typeshed/third_party/3/requests/auth.pyi
new file mode 100644
index 0000000..8eea2b0
--- /dev/null
+++ b/typeshed/third_party/3/requests/auth.pyi
@@ -0,0 +1,41 @@
+# Stubs for requests.auth (Python 3)
+
+from typing import Any
+from . import compat
+from . import cookies
+from . import utils
+from . import status_codes
+
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+parse_dict_header = utils.parse_dict_header
+to_native_string = utils.to_native_string
+codes = status_codes.codes
+
+CONTENT_TYPE_FORM_URLENCODED = ...  # type: Any
+CONTENT_TYPE_MULTI_PART = ...  # type: Any
+
+class AuthBase:
+    def __call__(self, r): ...
+
+class HTTPBasicAuth(AuthBase):
+    username = ...  # type: Any
+    password = ...  # type: Any
+    def __init__(self, username, password) -> None: ...
+    def __call__(self, r): ...
+
+class HTTPProxyAuth(HTTPBasicAuth):
+    def __call__(self, r): ...
+
+class HTTPDigestAuth(AuthBase):
+    username = ...  # type: Any
+    password = ...  # type: Any
+    last_nonce = ...  # type: Any
+    nonce_count = ...  # type: Any
+    chal = ...  # type: Any
+    pos = ...  # type: Any
+    num_401_calls = ...  # type: Any
+    def __init__(self, username, password) -> None: ...
+    def build_digest_header(self, method, url): ...
+    def handle_redirect(self, r, **kwargs): ...
+    def handle_401(self, r, **kwargs): ...
+    def __call__(self, r): ...
diff --git a/typeshed/third_party/3/requests/compat.pyi b/typeshed/third_party/3/requests/compat.pyi
new file mode 100644
index 0000000..63b92f6
--- /dev/null
+++ b/typeshed/third_party/3/requests/compat.pyi
@@ -0,0 +1,6 @@
+# Stubs for requests.compat (Python 3.4)
+
+from typing import Any
+import collections
+
+OrderedDict = collections.OrderedDict
diff --git a/typeshed/third_party/3/requests/cookies.pyi b/typeshed/third_party/3/requests/cookies.pyi
new file mode 100644
index 0000000..f3bd57e
--- /dev/null
+++ b/typeshed/third_party/3/requests/cookies.pyi
@@ -0,0 +1,65 @@
+# Stubs for requests.cookies (Python 3)
+
+from typing import Any, MutableMapping
+# import cookielib
+from http import cookiejar as cookielib
+import collections
+from . import compat
+
+# cookielib = compat.cookielib
+
+class MockRequest:
+    type = ...  # type: Any
+    def __init__(self, request) -> None: ...
+    def get_type(self): ...
+    def get_host(self): ...
+    def get_origin_req_host(self): ...
+    def get_full_url(self): ...
+    def is_unverifiable(self): ...
+    def has_header(self, name): ...
+    def get_header(self, name, default=...): ...
+    def add_header(self, key, val): ...
+    def add_unredirected_header(self, name, value): ...
+    def get_new_headers(self): ...
+    @property
+    def unverifiable(self): ...
+    @property
+    def origin_req_host(self): ...
+    @property
+    def host(self): ...
+
+class MockResponse:
+    def __init__(self, headers) -> None: ...
+    def info(self): ...
+    def getheaders(self, name): ...
+
+def extract_cookies_to_jar(jar, request, response): ...
+def get_cookie_header(jar, request): ...
+def remove_cookie_by_name(cookiejar, name, domain=..., path=...): ...
+
+class CookieConflictError(RuntimeError): ...
+
+class RequestsCookieJar(cookielib.CookieJar, MutableMapping):
+    def get(self, name, default=..., domain=..., path=...): ...
+    def set(self, name, value, **kwargs): ...
+    def iterkeys(self): ...
+    def keys(self): ...
+    def itervalues(self): ...
+    def values(self): ...
+    def iteritems(self): ...
+    def items(self): ...
+    def list_domains(self): ...
+    def list_paths(self): ...
+    def multiple_domains(self): ...
+    def get_dict(self, domain=..., path=...): ...
+    def __getitem__(self, name): ...
+    def __setitem__(self, name, value): ...
+    def __delitem__(self, name): ...
+    def set_cookie(self, cookie, *args, **kwargs): ...
+    def update(self, other): ...
+    def copy(self): ...
+
+def create_cookie(name, value, **kwargs): ...
+def morsel_to_cookie(morsel): ...
+def cookiejar_from_dict(cookie_dict, cookiejar=..., overwrite=...): ...
+def merge_cookies(cookiejar, cookies): ...
diff --git a/typeshed/third_party/3/requests/exceptions.pyi b/typeshed/third_party/3/requests/exceptions.pyi
new file mode 100644
index 0000000..ff0c328
--- /dev/null
+++ b/typeshed/third_party/3/requests/exceptions.pyi
@@ -0,0 +1,26 @@
+# Stubs for requests.exceptions (Python 3)
+
+from typing import Any
+from .packages.urllib3.exceptions import HTTPError as BaseHTTPError
+
+class RequestException(IOError):
+    response = ...  # type: Any
+    request = ...  # type: Any
+    def __init__(self, *args, **kwargs) -> None: ...
+
+class HTTPError(RequestException): ...
+class ConnectionError(RequestException): ...
+class ProxyError(ConnectionError): ...
+class SSLError(ConnectionError): ...
+class Timeout(RequestException): ...
+class ConnectTimeout(ConnectionError, Timeout): ...
+class ReadTimeout(Timeout): ...
+class URLRequired(RequestException): ...
+class TooManyRedirects(RequestException): ...
+class MissingSchema(RequestException, ValueError): ...
+class InvalidSchema(RequestException, ValueError): ...
+class InvalidURL(RequestException, ValueError): ...
+class ChunkedEncodingError(RequestException): ...
+class ContentDecodingError(RequestException, BaseHTTPError): ...
+class StreamConsumedError(RequestException, TypeError): ...
+class RetryError(RequestException): ...
diff --git a/typeshed/third_party/3/requests/hooks.pyi b/typeshed/third_party/3/requests/hooks.pyi
new file mode 100644
index 0000000..3367d9a
--- /dev/null
+++ b/typeshed/third_party/3/requests/hooks.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.hooks (Python 3)
+
+from typing import Any
+
+HOOKS = ...  # type: Any
+
+def default_hooks(): ...
+def dispatch_hook(key, hooks, hook_data, **kwargs): ...
diff --git a/typeshed/third_party/3/requests/models.pyi b/typeshed/third_party/3/requests/models.pyi
new file mode 100644
index 0000000..7789899
--- /dev/null
+++ b/typeshed/third_party/3/requests/models.pyi
@@ -0,0 +1,136 @@
+# Stubs for requests.models (Python 3)
+
+from typing import Any, List, MutableMapping, Iterator, Dict
+import datetime
+
+from . import hooks
+from . import structures
+from . import auth
+from . import cookies
+from .cookies import RequestsCookieJar
+from .packages.urllib3 import fields
+from .packages.urllib3 import filepost
+from .packages.urllib3 import util
+from .packages.urllib3 import exceptions as urllib3_exceptions
+from . import exceptions
+from . import utils
+from . import compat
+from . import status_codes
+
+from typing import Optional, Union
+
+default_hooks = hooks.default_hooks
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+HTTPBasicAuth = auth.HTTPBasicAuth
+cookiejar_from_dict = cookies.cookiejar_from_dict
+get_cookie_header = cookies.get_cookie_header
+RequestField = fields.RequestField
+encode_multipart_formdata = filepost.encode_multipart_formdata
+parse_url = util.parse_url
+DecodeError = urllib3_exceptions.DecodeError
+ReadTimeoutError = urllib3_exceptions.ReadTimeoutError
+ProtocolError = urllib3_exceptions.ProtocolError
+LocationParseError = urllib3_exceptions.LocationParseError
+HTTPError = exceptions.HTTPError
+MissingSchema = exceptions.MissingSchema
+InvalidURL = exceptions.InvalidURL
+ChunkedEncodingError = exceptions.ChunkedEncodingError
+ContentDecodingError = exceptions.ContentDecodingError
+ConnectionError = exceptions.ConnectionError
+StreamConsumedError = exceptions.StreamConsumedError
+guess_filename = utils.guess_filename
+get_auth_from_url = utils.get_auth_from_url
+requote_uri = utils.requote_uri
+stream_decode_response_unicode = utils.stream_decode_response_unicode
+to_key_val_list = utils.to_key_val_list
+parse_header_links = utils.parse_header_links
+iter_slices = utils.iter_slices
+guess_json_utf = utils.guess_json_utf
+super_len = utils.super_len
+to_native_string = utils.to_native_string
+codes = status_codes.codes
+
+REDIRECT_STATI = ...  # type: Any
+DEFAULT_REDIRECT_LIMIT = ...  # type: Any
+CONTENT_CHUNK_SIZE = ...  # type: Any
+ITER_CHUNK_SIZE = ...  # type: Any
+json_dumps = ...  # type: Any
+
+class RequestEncodingMixin:
+    @property
+    def path_url(self): ...
+
+class RequestHooksMixin:
+    def register_hook(self, event, hook): ...
+    def deregister_hook(self, event, hook): ...
+
+class Request(RequestHooksMixin):
+    hooks = ...  # type: Any
+    method = ...  # type: Any
+    url = ...  # type: Any
+    headers = ...  # type: Any
+    files = ...  # type: Any
+    data = ...  # type: Any
+    json = ...  # type: Any
+    params = ...  # type: Any
+    auth = ...  # type: Any
+    cookies = ...  # type: Any
+    def __init__(self, method=..., url=..., headers=..., files=..., data=..., params=...,
+                 auth=..., cookies=..., hooks=..., json=...): ...
+    def prepare(self): ...
+
+class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
+    method = ...  # type: Optional[str]
+    url = ...  # type: Optional[str]
+    headers = ...  # type: CaseInsensitiveDict
+    body = ...  # type: Optional[Union[str, bytes]]
+    hooks = ...  # type: Any
+    def __init__(self) -> None: ...
+    def prepare(self, method=..., url=..., headers=..., files=..., data=..., params=...,
+                auth=..., cookies=..., hooks=..., json=...): ...
+    def copy(self): ...
+    def prepare_method(self, method): ...
+    def prepare_url(self, url, params): ...
+    def prepare_headers(self, headers): ...
+    def prepare_body(self, data, files, json=...): ...
+    def prepare_content_length(self, body): ...
+    def prepare_auth(self, auth, url=...): ...
+    def prepare_cookies(self, cookies): ...
+    def prepare_hooks(self, hooks): ...
+
+class Response:
+    __attrs__ = ...  # type: Any
+    status_code = ...  # type: int
+    headers = ...  # type: MutableMapping[str, str]
+    raw = ...  # type: Any
+    url = ...  # type: str
+    encoding = ...  # type: str
+    history = ...  # type: List[Response]
+    reason = ...  # type: str
+    cookies = ...  # type: RequestsCookieJar
+    elapsed = ...  # type: datetime.timedelta
+    request = ...  # type: PreparedRequest
+    def __init__(self) -> None: ...
+    def __bool__(self) -> bool: ...
+    def __nonzero__(self) -> bool: ...
+    def __iter__(self) -> Iterator[bytes]: ...
+    @property
+    def ok(self) -> bool: ...
+    @property
+    def is_redirect(self) -> bool: ...
+    @property
+    def is_permanent_redirect(self) -> bool: ...
+    @property
+    def apparent_encoding(self) -> str: ...
+    def iter_content(self, chunk_size: int = ...,
+                     decode_unicode: bool = ...) -> Iterator[Any]: ...
+    def iter_lines(self, chunk_size=..., decode_unicode=..., delimiter=...): ...
+    @property
+    def content(self) -> bytes: ...
+    @property
+    def text(self) -> str: ...
+    def json(self, **kwargs) -> Any: ...
+    @property
+    def links(self) -> Dict[Any, Any]: ...
+    def raise_for_status(self) -> None: ...
+    def close(self) -> None: ...
diff --git a/typeshed/third_party/3/requests/packages/__init__.pyi b/typeshed/third_party/3/requests/packages/__init__.pyi
new file mode 100644
index 0000000..2b1bff8
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/__init__.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.packages (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class VendorAlias:
+    def __init__(self, package_names) -> None: ...
+    def find_module(self, fullname, path=...): ...
+    def load_module(self, name): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/__init__.pyi b/typeshed/third_party/3/requests/packages/urllib3/__init__.pyi
new file mode 100644
index 0000000..61a1c5f
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/__init__.pyi
@@ -0,0 +1,35 @@
+# Stubs for requests.packages.urllib3 (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import connectionpool
+from . import filepost
+from . import poolmanager
+from . import response
+from .util import request as _request
+from .util import url
+from .util import timeout
+from .util import retry
+import logging
+
+__license__ = ...  # type: Any
+
+HTTPConnectionPool = connectionpool.HTTPConnectionPool
+HTTPSConnectionPool = connectionpool.HTTPSConnectionPool
+connection_from_url = connectionpool.connection_from_url
+encode_multipart_formdata = filepost.encode_multipart_formdata
+PoolManager = poolmanager.PoolManager
+ProxyManager = poolmanager.ProxyManager
+proxy_from_url = poolmanager.proxy_from_url
+HTTPResponse = response.HTTPResponse
+make_headers = _request.make_headers
+get_host = url.get_host
+Timeout = timeout.Timeout
+Retry = retry.Retry
+
+class NullHandler(logging.Handler):
+    def emit(self, record): ...
+
+def add_stderr_logger(level=...): ...
+def disable_warnings(category=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/_collections.pyi b/typeshed/third_party/3/requests/packages/urllib3/_collections.pyi
new file mode 100644
index 0000000..58aa944
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/_collections.pyi
@@ -0,0 +1,51 @@
+# Stubs for requests.packages.urllib3._collections (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from collections import MutableMapping
+
+class RLock:
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_value, traceback): ...
+
+class RecentlyUsedContainer(MutableMapping):
+    ContainerCls = ...  # type: Any
+    dispose_func = ...  # type: Any
+    lock = ...  # type: Any
+    def __init__(self, maxsize=..., dispose_func=...) -> None: ...
+    def __getitem__(self, key): ...
+    def __setitem__(self, key, value): ...
+    def __delitem__(self, key): ...
+    def __len__(self): ...
+    def __iter__(self): ...
+    def clear(self): ...
+    def keys(self): ...
+
+class HTTPHeaderDict(dict):
+    def __init__(self, headers=..., **kwargs) -> None: ...
+    def __setitem__(self, key, val): ...
+    def __getitem__(self, key): ...
+    def __delitem__(self, key): ...
+    def __contains__(self, key): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    values = ...  # type: Any
+    get = ...  # type: Any
+    update = ...  # type: Any
+    iterkeys = ...  # type: Any
+    itervalues = ...  # type: Any
+    def pop(self, key, default=...): ...
+    def discard(self, key): ...
+    def add(self, key, val): ...
+    def extend(*args, **kwargs): ...
+    def getlist(self, key): ...
+    getheaders = ...  # type: Any
+    getallmatchingheaders = ...  # type: Any
+    iget = ...  # type: Any
+    def copy(self): ...
+    def iteritems(self): ...
+    def itermerged(self): ...
+    def items(self): ...
+    @classmethod
+    def from_httplib(cls, message, duplicates=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/connection.pyi b/typeshed/third_party/3/requests/packages/urllib3/connection.pyi
new file mode 100644
index 0000000..77e4c42
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/connection.pyi
@@ -0,0 +1,64 @@
+# Stubs for requests.packages.urllib3.connection (Python 3.4)
+
+from typing import Any
+from . import packages
+from http.client import HTTPConnection as _HTTPConnection
+import ssl
+# from httplib import HTTPConnection as _HTTPConnection # python 2
+from . import exceptions
+from .packages import ssl_match_hostname
+from .util import ssl_
+from . import util
+import http.client
+
+class DummyConnection: ...
+
+BaseSSLError = ssl.SSLError
+ConnectionError = __builtins__.ConnectionError
+HTTPException = http.client.HTTPException
+
+ConnectTimeoutError = exceptions.ConnectTimeoutError
+SystemTimeWarning = exceptions.SystemTimeWarning
+SecurityWarning = exceptions.SecurityWarning
+match_hostname = ssl_match_hostname.match_hostname
+resolve_cert_reqs = ssl_.resolve_cert_reqs
+resolve_ssl_version = ssl_.resolve_ssl_version
+ssl_wrap_socket = ssl_.ssl_wrap_socket
+assert_fingerprint = ssl_.assert_fingerprint
+connection = util.connection
+
+port_by_scheme = ...  # type: Any
+RECENT_DATE = ...  # type: Any
+
+class HTTPConnection(_HTTPConnection):
+    default_port = ...  # type: Any
+    default_socket_options = ...  # type: Any
+    is_verified = ...  # type: Any
+    source_address = ...  # type: Any
+    socket_options = ...  # type: Any
+    def __init__(self, *args, **kw) -> None: ...
+    def connect(self): ...
+
+class HTTPSConnection(HTTPConnection):
+    default_port = ...  # type: Any
+    key_file = ...  # type: Any
+    cert_file = ...  # type: Any
+    def __init__(self, host, port=..., key_file=..., cert_file=..., strict=..., timeout=..., **kw) -> None: ...
+    sock = ...  # type: Any
+    def connect(self): ...
+
+class VerifiedHTTPSConnection(HTTPSConnection):
+    cert_reqs = ...  # type: Any
+    ca_certs = ...  # type: Any
+    ssl_version = ...  # type: Any
+    assert_fingerprint = ...  # type: Any
+    key_file = ...  # type: Any
+    cert_file = ...  # type: Any
+    assert_hostname = ...  # type: Any
+    def set_cert(self, key_file=..., cert_file=..., cert_reqs=..., ca_certs=..., assert_hostname=..., assert_fingerprint=...): ...
+    sock = ...  # type: Any
+    auto_open = ...  # type: Any
+    is_verified = ...  # type: Any
+    def connect(self): ...
+
+UnverifiedHTTPSConnection = ...  # type: Any
diff --git a/typeshed/third_party/3/requests/packages/urllib3/connectionpool.pyi b/typeshed/third_party/3/requests/packages/urllib3/connectionpool.pyi
new file mode 100644
index 0000000..778bb7c
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/connectionpool.pyi
@@ -0,0 +1,89 @@
+# Stubs for requests.packages.urllib3.connectionpool (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import exceptions
+from .packages import ssl_match_hostname
+from . import packages
+from .connection import (
+    HTTPException as HTTPException,
+    BaseSSLError as BaseSSLError,
+    ConnectionError as ConnectionError,
+)
+from . import request
+from . import response
+from . import connection
+from .util import connection as _connection
+from .util import retry
+from .util import timeout
+from .util import url
+
+ClosedPoolError = exceptions.ClosedPoolError
+ProtocolError = exceptions.ProtocolError
+EmptyPoolError = exceptions.EmptyPoolError
+HostChangedError = exceptions.HostChangedError
+LocationValueError = exceptions.LocationValueError
+MaxRetryError = exceptions.MaxRetryError
+ProxyError = exceptions.ProxyError
+ReadTimeoutError = exceptions.ReadTimeoutError
+SSLError = exceptions.SSLError
+TimeoutError = exceptions.TimeoutError
+InsecureRequestWarning = exceptions.InsecureRequestWarning
+CertificateError = ssl_match_hostname.CertificateError
+port_by_scheme = connection.port_by_scheme
+DummyConnection = connection.DummyConnection
+HTTPConnection = connection.HTTPConnection
+HTTPSConnection = connection.HTTPSConnection
+VerifiedHTTPSConnection = connection.VerifiedHTTPSConnection
+RequestMethods = request.RequestMethods
+HTTPResponse = response.HTTPResponse
+is_connection_dropped = _connection.is_connection_dropped
+Retry = retry.Retry
+Timeout = timeout.Timeout
+get_host = url.get_host
+
+xrange = ...  # type: Any
+log = ...  # type: Any
+
+class ConnectionPool:
+    scheme = ...  # type: Any
+    QueueCls = ...  # type: Any
+    host = ...  # type: Any
+    port = ...  # type: Any
+    def __init__(self, host, port=...) -> None: ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_val, exc_tb): ...
+    def close(self): ...
+
+class HTTPConnectionPool(ConnectionPool, RequestMethods):
+    scheme = ...  # type: Any
+    ConnectionCls = ...  # type: Any
+    strict = ...  # type: Any
+    timeout = ...  # type: Any
+    retries = ...  # type: Any
+    pool = ...  # type: Any
+    block = ...  # type: Any
+    proxy = ...  # type: Any
+    proxy_headers = ...  # type: Any
+    num_connections = ...  # type: Any
+    num_requests = ...  # type: Any
+    conn_kw = ...  # type: Any
+    def __init__(self, host, port=..., strict=..., timeout=..., maxsize=..., block=..., headers=..., retries=..., _proxy=..., _proxy_headers=..., **conn_kw) -> None: ...
+    def close(self): ...
+    def is_same_host(self, url): ...
+    def urlopen(self, method, url, body=..., headers=..., retries=..., redirect=..., assert_same_host=..., timeout=..., pool_timeout=..., release_conn=..., **response_kw): ...
+
+class HTTPSConnectionPool(HTTPConnectionPool):
+    scheme = ...  # type: Any
+    ConnectionCls = ...  # type: Any
+    key_file = ...  # type: Any
+    cert_file = ...  # type: Any
+    cert_reqs = ...  # type: Any
+    ca_certs = ...  # type: Any
+    ssl_version = ...  # type: Any
+    assert_hostname = ...  # type: Any
+    assert_fingerprint = ...  # type: Any
+    def __init__(self, host, port=..., strict=..., timeout=..., maxsize=..., block=..., headers=..., retries=..., _proxy=..., _proxy_headers=..., key_file=..., cert_file=..., cert_reqs=..., ca_certs=..., ssl_version=..., assert_hostname=..., assert_fingerprint=..., **conn_kw) -> None: ...
+
+def connection_from_url(url, **kw): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/contrib/__init__.pyi b/typeshed/third_party/3/requests/packages/urllib3/contrib/__init__.pyi
new file mode 100644
index 0000000..69e47f7
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/contrib/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for requests.packages.urllib3.contrib (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/3/requests/packages/urllib3/exceptions.pyi b/typeshed/third_party/3/requests/packages/urllib3/exceptions.pyi
new file mode 100644
index 0000000..3e7d0f6
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/exceptions.pyi
@@ -0,0 +1,54 @@
+# Stubs for requests.packages.urllib3.exceptions (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class HTTPError(Exception): ...
+class HTTPWarning(Warning): ...
+
+class PoolError(HTTPError):
+    pool = ...  # type: Any
+    def __init__(self, pool, message) -> None: ...
+    def __reduce__(self): ...
+
+class RequestError(PoolError):
+    url = ...  # type: Any
+    def __init__(self, pool, url, message) -> None: ...
+    def __reduce__(self): ...
+
+class SSLError(HTTPError): ...
+class ProxyError(HTTPError): ...
+class DecodeError(HTTPError): ...
+class ProtocolError(HTTPError): ...
+
+ConnectionError = ...  # type: Any
+
+class MaxRetryError(RequestError):
+    reason = ...  # type: Any
+    def __init__(self, pool, url, reason=...) -> None: ...
+
+class HostChangedError(RequestError):
+    retries = ...  # type: Any
+    def __init__(self, pool, url, retries=...) -> None: ...
+
+class TimeoutStateError(HTTPError): ...
+class TimeoutError(HTTPError): ...
+class ReadTimeoutError(TimeoutError, RequestError): ...
+class ConnectTimeoutError(TimeoutError): ...
+class EmptyPoolError(PoolError): ...
+class ClosedPoolError(PoolError): ...
+class LocationValueError(ValueError, HTTPError): ...
+
+class LocationParseError(LocationValueError):
+    location = ...  # type: Any
+    def __init__(self, location) -> None: ...
+
+class ResponseError(HTTPError):
+    GENERIC_ERROR = ...  # type: Any
+    SPECIFIC_ERROR = ...  # type: Any
+
+class SecurityWarning(HTTPWarning): ...
+class InsecureRequestWarning(SecurityWarning): ...
+class SystemTimeWarning(SecurityWarning): ...
+class InsecurePlatformWarning(SecurityWarning): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/fields.pyi b/typeshed/third_party/3/requests/packages/urllib3/fields.pyi
new file mode 100644
index 0000000..cdc7734
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/fields.pyi
@@ -0,0 +1,16 @@
+# Stubs for requests.packages.urllib3.fields (Python 3.4)
+
+from typing import Any
+from . import packages
+
+def guess_content_type(filename, default=...): ...
+def format_header_param(name, value): ...
+
+class RequestField:
+    data = ...  # type: Any
+    headers = ...  # type: Any
+    def __init__(self, name, data, filename=..., headers=...) -> None: ...
+    @classmethod
+    def from_tuples(cls, fieldname, value): ...
+    def render_headers(self): ...
+    def make_multipart(self, content_disposition=..., content_type=..., content_location=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/filepost.pyi b/typeshed/third_party/3/requests/packages/urllib3/filepost.pyi
new file mode 100644
index 0000000..f1ce517
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/filepost.pyi
@@ -0,0 +1,19 @@
+# Stubs for requests.packages.urllib3.filepost (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import packages
+# from .packages import six
+from . import fields
+
+# six = packages.six
+# b = six.b
+RequestField = fields.RequestField
+
+writer = ...  # type: Any
+
+def choose_boundary(): ...
+def iter_field_objects(fields): ...
+def iter_fields(fields): ...
+def encode_multipart_formdata(fields, boundary=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/packages/__init__.pyi b/typeshed/third_party/3/requests/packages/urllib3/packages/__init__.pyi
new file mode 100644
index 0000000..67507f9
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/packages/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for requests.packages.urllib3.packages (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi b/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
new file mode 100644
index 0000000..9efeac0
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.packages.urllib3.packages.ssl_match_hostname (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+import ssl
+
+CertificateError = ssl.CertificateError
+match_hostname = ssl.match_hostname
diff --git a/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi b/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
new file mode 100644
index 0000000..5abbc9d
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
@@ -0,0 +1,7 @@
+# Stubs for requests.packages.urllib3.packages.ssl_match_hostname._implementation (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class CertificateError(ValueError): ...
+
+def match_hostname(cert, hostname): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/poolmanager.pyi b/typeshed/third_party/3/requests/packages/urllib3/poolmanager.pyi
new file mode 100644
index 0000000..a65f664
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/poolmanager.pyi
@@ -0,0 +1,31 @@
+# Stubs for requests.packages.urllib3.poolmanager (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .request import RequestMethods
+
+class PoolManager(RequestMethods):
+    proxy = ...  # type: Any
+    connection_pool_kw = ...  # type: Any
+    pools = ...  # type: Any
+    def __init__(self, num_pools=..., headers=..., **connection_pool_kw) -> None: ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_val, exc_tb): ...
+    def clear(self): ...
+    def connection_from_host(self, host, port=..., scheme=...): ...
+    def connection_from_url(self, url): ...
+    # TODO: This was the original signature -- copied another one from base class to fix complaint.
+    # def urlopen(self, method, url, redirect=True, **kw): ...
+    def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+
+class ProxyManager(PoolManager):
+    proxy = ...  # type: Any
+    proxy_headers = ...  # type: Any
+    def __init__(self, proxy_url, num_pools=..., headers=..., proxy_headers=..., **connection_pool_kw) -> None: ...
+    def connection_from_host(self, host, port=..., scheme=...): ...
+    # TODO: This was the original signature -- copied another one from base class to fix complaint.
+    # def urlopen(self, method, url, redirect=True, **kw): ...
+    def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+
+def proxy_from_url(url, **kw): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/request.pyi b/typeshed/third_party/3/requests/packages/urllib3/request.pyi
new file mode 100644
index 0000000..788c759
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/request.pyi
@@ -0,0 +1,13 @@
+# Stubs for requests.packages.urllib3.request (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class RequestMethods:
+    headers = ...  # type: Any
+    def __init__(self, headers=...) -> None: ...
+    def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+    def request(self, method, url, fields=..., headers=..., **urlopen_kw): ...
+    def request_encode_url(self, method, url, fields=..., **urlopen_kw): ...
+    def request_encode_body(self, method, url, fields=..., headers=..., encode_multipart=..., multipart_boundary=..., **urlopen_kw): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/response.pyi b/typeshed/third_party/3/requests/packages/urllib3/response.pyi
new file mode 100644
index 0000000..ba2a801
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/response.pyi
@@ -0,0 +1,58 @@
+# Stubs for requests.packages.urllib3.response (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import io
+from . import _collections
+from . import exceptions
+# from .packages import six
+from .connection import HTTPException as HTTPException, BaseSSLError as BaseSSLError
+from .util import response
+
+HTTPHeaderDict = _collections.HTTPHeaderDict
+ProtocolError = exceptions.ProtocolError
+DecodeError = exceptions.DecodeError
+ReadTimeoutError = exceptions.ReadTimeoutError
+binary_type = bytes  # six.binary_type
+PY3 = True  # six.PY3
+is_fp_closed = response.is_fp_closed
+
+class DeflateDecoder:
+    def __init__(self) -> None: ...
+    def __getattr__(self, name): ...
+    def decompress(self, data): ...
+
+class GzipDecoder:
+    def __init__(self) -> None: ...
+    def __getattr__(self, name): ...
+    def decompress(self, data): ...
+
+class HTTPResponse(io.IOBase):
+    CONTENT_DECODERS = ...  # type: Any
+    REDIRECT_STATUSES = ...  # type: Any
+    headers = ...  # type: Any
+    status = ...  # type: Any
+    version = ...  # type: Any
+    reason = ...  # type: Any
+    strict = ...  # type: Any
+    decode_content = ...  # type: Any
+    def __init__(self, body=..., headers=..., status=..., version=..., reason=..., strict=..., preload_content=..., decode_content=..., original_response=..., pool=..., connection=...) -> None: ...
+    def get_redirect_location(self): ...
+    def release_conn(self): ...
+    @property
+    def data(self): ...
+    def tell(self): ...
+    def read(self, amt=..., decode_content=..., cache_content=...): ...
+    def stream(self, amt=..., decode_content=...): ...
+    @classmethod
+    def from_httplib(ResponseCls, r, **response_kw): ...
+    def getheaders(self): ...
+    def getheader(self, name, default=...): ...
+    def close(self): ...
+    @property
+    def closed(self): ...
+    def fileno(self): ...
+    def flush(self): ...
+    def readable(self): ...
+    def readinto(self, b): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/__init__.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/__init__.pyi
new file mode 100644
index 0000000..e4a0e13
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/__init__.pyi
@@ -0,0 +1,29 @@
+# Stubs for requests.packages.urllib3.util (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import connection
+from . import request
+from . import response
+from . import ssl_
+from . import timeout
+from . import retry
+from . import url
+import ssl
+
+is_connection_dropped = connection.is_connection_dropped
+make_headers = request.make_headers
+is_fp_closed = response.is_fp_closed
+SSLContext = ssl.SSLContext
+HAS_SNI = ssl_.HAS_SNI
+assert_fingerprint = ssl_.assert_fingerprint
+resolve_cert_reqs = ssl_.resolve_cert_reqs
+resolve_ssl_version = ssl_.resolve_ssl_version
+ssl_wrap_socket = ssl_.ssl_wrap_socket
+current_time = timeout.current_time
+Timeout = timeout.Timeout
+Retry = retry.Retry
+get_host = url.get_host
+parse_url = url.parse_url
+split_first = url.split_first
+Url = url.Url
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/connection.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/connection.pyi
new file mode 100644
index 0000000..cd67309
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/connection.pyi
@@ -0,0 +1,11 @@
+# Stubs for requests.packages.urllib3.util.connection (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+poll = ...  # type: Any
+select = ...  # type: Any
+
+def is_connection_dropped(conn): ...
+def create_connection(address, timeout=..., source_address=..., socket_options=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/request.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/request.pyi
new file mode 100644
index 0000000..0be64df
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/request.pyi
@@ -0,0 +1,12 @@
+# Stubs for requests.packages.urllib3.util.request (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+# from ..packages import six
+
+# b = six.b
+
+ACCEPT_ENCODING = ...  # type: Any
+
+def make_headers(keep_alive=..., accept_encoding=..., user_agent=..., basic_auth=..., proxy_basic_auth=..., disable_cache=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/response.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/response.pyi
new file mode 100644
index 0000000..761a006
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/response.pyi
@@ -0,0 +1,5 @@
+# Stubs for requests.packages.urllib3.util.response (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def is_fp_closed(obj): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/retry.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/retry.pyi
new file mode 100644
index 0000000..e958d90
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/retry.pyi
@@ -0,0 +1,36 @@
+# Stubs for requests.packages.urllib3.util.retry (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+from .. import packages
+
+ConnectTimeoutError = exceptions.ConnectTimeoutError
+MaxRetryError = exceptions.MaxRetryError
+ProtocolError = exceptions.ProtocolError
+ReadTimeoutError = exceptions.ReadTimeoutError
+ResponseError = exceptions.ResponseError
+
+log = ...  # type: Any
+
+class Retry:
+    DEFAULT_METHOD_WHITELIST = ...  # type: Any
+    BACKOFF_MAX = ...  # type: Any
+    total = ...  # type: Any
+    connect = ...  # type: Any
+    read = ...  # type: Any
+    redirect = ...  # type: Any
+    status_forcelist = ...  # type: Any
+    method_whitelist = ...  # type: Any
+    backoff_factor = ...  # type: Any
+    raise_on_redirect = ...  # type: Any
+    def __init__(self, total=..., connect=..., read=..., redirect=..., method_whitelist=..., status_forcelist=..., backoff_factor=..., raise_on_redirect=..., _observed_errors=...) -> None: ...
+    def new(self, **kw): ...
+    @classmethod
+    def from_int(cls, retries, redirect=..., default=...): ...
+    def get_backoff_time(self): ...
+    def sleep(self): ...
+    def is_forced_retry(self, method, status_code): ...
+    def is_exhausted(self): ...
+    def increment(self, method=..., url=..., response=..., error=..., _pool=..., _stacktrace=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/ssl_.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/ssl_.pyi
new file mode 100644
index 0000000..c7db0ac
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/ssl_.pyi
@@ -0,0 +1,24 @@
+# Stubs for requests.packages.urllib3.util.ssl_ (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+import ssl
+
+SSLError = exceptions.SSLError
+InsecurePlatformWarning = exceptions.InsecurePlatformWarning
+SSLContext = ssl.SSLContext
+
+HAS_SNI = ...  # type: Any
+create_default_context = ...  # type: Any
+OP_NO_SSLv2 = ...  # type: Any
+OP_NO_SSLv3 = ...  # type: Any
+OP_NO_COMPRESSION = ...  # type: Any
+
+def assert_fingerprint(cert, fingerprint): ...
+def resolve_cert_reqs(candidate): ...
+def resolve_ssl_version(candidate): ...
+def create_urllib3_context(ssl_version=..., cert_reqs=..., options=..., ciphers=...): ...
+def ssl_wrap_socket(sock, keyfile=..., certfile=..., cert_reqs=..., ca_certs=...,
+                    server_hostname=..., ssl_version=..., ciphers=..., ssl_context=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/timeout.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/timeout.pyi
new file mode 100644
index 0000000..0a7653c
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/timeout.pyi
@@ -0,0 +1,24 @@
+# Stubs for requests.packages.urllib3.util.timeout (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+
+TimeoutStateError = exceptions.TimeoutStateError
+
+def current_time(): ...
+
+class Timeout:
+    DEFAULT_TIMEOUT = ...  # type: Any
+    total = ...  # type: Any
+    def __init__(self, total=..., connect=..., read=...) -> None: ...
+    @classmethod
+    def from_float(cls, timeout): ...
+    def clone(self): ...
+    def start_connect(self): ...
+    def get_connect_duration(self): ...
+    @property
+    def connect_timeout(self): ...
+    @property
+    def read_timeout(self): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/url.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/url.pyi
new file mode 100644
index 0000000..9877b4a
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/url.pyi
@@ -0,0 +1,26 @@
+# Stubs for requests.packages.urllib3.util.url (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+
+LocationParseError = exceptions.LocationParseError
+
+url_attrs = ...  # type: Any
+
+class Url:
+    slots = ...  # type: Any
+    def __new__(cls, scheme=..., auth=..., host=..., port=..., path=..., query=..., fragment=...): ...
+    @property
+    def hostname(self): ...
+    @property
+    def request_uri(self): ...
+    @property
+    def netloc(self): ...
+    @property
+    def url(self): ...
+
+def split_first(s, delims): ...
+def parse_url(url): ...
+def get_host(url): ...
diff --git a/typeshed/third_party/3/requests/sessions.pyi b/typeshed/third_party/3/requests/sessions.pyi
new file mode 100644
index 0000000..d1b79fc
--- /dev/null
+++ b/typeshed/third_party/3/requests/sessions.pyi
@@ -0,0 +1,108 @@
+# Stubs for requests.sessions (Python 3)
+
+from typing import Any, Union, MutableMapping, Text, Optional, IO, Tuple, Callable
+from . import adapters
+from . import auth
+from . import compat
+from . import cookies
+from . import models
+from .models import Response
+from . import hooks
+from . import utils
+from . import exceptions
+from .packages.urllib3 import _collections
+from . import structures
+from . import adapters
+from . import status_codes
+
+BaseAdapter = adapters.BaseAdapter
+OrderedDict = compat.OrderedDict
+cookiejar_from_dict = cookies.cookiejar_from_dict
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+RequestsCookieJar = cookies.RequestsCookieJar
+merge_cookies = cookies.merge_cookies
+Request = models.Request
+PreparedRequest = models.PreparedRequest
+DEFAULT_REDIRECT_LIMIT = models.DEFAULT_REDIRECT_LIMIT
+default_hooks = hooks.default_hooks
+dispatch_hook = hooks.dispatch_hook
+to_key_val_list = utils.to_key_val_list
+default_headers = utils.default_headers
+to_native_string = utils.to_native_string
+TooManyRedirects = exceptions.TooManyRedirects
+InvalidSchema = exceptions.InvalidSchema
+ChunkedEncodingError = exceptions.ChunkedEncodingError
+ContentDecodingError = exceptions.ContentDecodingError
+RecentlyUsedContainer = _collections.RecentlyUsedContainer
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+HTTPAdapter = adapters.HTTPAdapter
+requote_uri = utils.requote_uri
+get_environ_proxies = utils.get_environ_proxies
+get_netrc_auth = utils.get_netrc_auth
+should_bypass_proxies = utils.should_bypass_proxies
+get_auth_from_url = utils.get_auth_from_url
+codes = status_codes.codes
+REDIRECT_STATI = models.REDIRECT_STATI
+
+REDIRECT_CACHE_SIZE = ...  # type: Any
+
+def merge_setting(request_setting, session_setting, dict_class=...): ...
+def merge_hooks(request_hooks, session_hooks, dict_class=...): ...
+
+class SessionRedirectMixin:
+    def resolve_redirects(self, resp, req, stream=..., timeout=..., verify=..., cert=...,
+                          proxies=...): ...
+    def rebuild_auth(self, prepared_request, response): ...
+    def rebuild_proxies(self, prepared_request, proxies): ...
+
+class Session(SessionRedirectMixin):
+    __attrs__ = ...  # type: Any
+    headers = ...  # type: Optional[MutableMapping[Text, Text]]
+    auth = ...  # type: Union[None, Tuple[Text, Text], Callable[[Request], Request]]
+    proxies = ...  # type: Optional[MutableMapping[Text, Text]]
+    hooks = ...  # type: Optional[MutableMapping[Text, Callable[[Request], Any]]]
+    params = ...  # type: Union[None, bytes, MutableMapping[Text, Text]]
+    stream = ...  # type: bool
+    verify = ...  # type: bool
+    cert = ...  # type: Union[None, Text, Tuple[Text, Text]]
+    max_redirects = ...  # type: int
+    trust_env = ...  # type: bool
+    cookies = ...  # type: Union[None, RequestsCookieJar, MutableMapping[Text, Text]]
+    adapters = ...  # type: MutableMapping
+    redirect_cache = ...  # type: RecentlyUsedContainer
+    def __init__(self) -> None: ...
+    def __enter__(self) -> 'Session': ...
+    def __exit__(self, *args) -> None: ...
+    def prepare_request(self, request): ...
+    def request(self, method: str, url: str,
+                params,  # type: Union[None, bytes, MutableMapping[Text, Text]]
+                data,  # type: Union[None, bytes, MutableMapping[Text, Text], IO]
+                headers,  # type: Optional[MutableMapping[Text, Text]]
+                cookies,  # type: Union[None, RequestsCookieJar, MutableMapping[Text, Text]]
+                files,  # type: Optional[MutableMapping[Text, IO]]
+                auth,  # type: Union[None, Tuple[Text, Text], Callable[[Request], Request]]
+                timeout,  # type: Union[None, float, Tuple[float, float]]
+                allow_redirects,  # type: Optional[bool]
+                proxies,  # type: Optional[MutableMapping[Text, Text]]
+                hooks,  # type: Optional[MutableMapping[Text, Callable[[Request], Any]]]
+                stream,  # type: Optional[bool]
+                verify,  # type: Optional[bool]
+                cert,  # type: Union[Text, Tuple[Text, Text], None]
+                json  # type: Optional[MutableMapping]
+                ) -> Response: ...
+    def get(self, url: Union[str, bytes], **kwargs) -> Response: ...
+    def options(self, url: Union[str, bytes], **kwargs) -> Response: ...
+    def head(self, url: Union[str, bytes], **kwargs) -> Response: ...
+    def post(self, url: Union[str, bytes], data=..., json=..., **kwargs) -> Response: ...
+    def put(self, url: Union[str, bytes], data=..., **kwargs) -> Response: ...
+    def patch(self, url: Union[str, bytes], data=..., **kwargs) -> Response: ...
+    def delete(self, url: Union[str, bytes], **kwargs) -> Response: ...
+    def send(self, request, **kwargs): ...
+    def merge_environment_settings(self, url, proxies, stream, verify, cert): ...
+    def get_adapter(self, url): ...
+    def close(self) -> None: ...
+    def mount(self, prefix:
+              Union[str, bytes],
+              adapter: BaseAdapter) -> None: ...
+
+def session() -> Session: ...
diff --git a/typeshed/third_party/3/requests/status_codes.pyi b/typeshed/third_party/3/requests/status_codes.pyi
new file mode 100644
index 0000000..e3035eb
--- /dev/null
+++ b/typeshed/third_party/3/requests/status_codes.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.status_codes (Python 3)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .structures import LookupDict
+
+codes = ...  # type: Any
diff --git a/typeshed/third_party/3/requests/structures.pyi b/typeshed/third_party/3/requests/structures.pyi
new file mode 100644
index 0000000..af4273b
--- /dev/null
+++ b/typeshed/third_party/3/requests/structures.pyi
@@ -0,0 +1,12 @@
+# Stubs for requests.structures (Python 3)
+
+from typing import Any, Iterator, MutableMapping, Tuple, Union
+
+class CaseInsensitiveDict(MutableMapping[str, Union[str, bytes]]):
+    def lower_items(self) -> Iterator[Tuple[str, Union[str, bytes]]]: ...
+
+class LookupDict(dict):
+    name = ...  # type: Any
+    def __init__(self, name=...) -> None: ...
+    def __getitem__(self, key): ...
+    def get(self, key, default=...): ...
diff --git a/typeshed/third_party/3/requests/utils.pyi b/typeshed/third_party/3/requests/utils.pyi
new file mode 100644
index 0000000..945277a
--- /dev/null
+++ b/typeshed/third_party/3/requests/utils.pyi
@@ -0,0 +1,52 @@
+# Stubs for requests.utils (Python 3)
+
+from typing import Any
+from . import compat
+from . import cookies
+from . import structures
+from . import exceptions
+
+OrderedDict = compat.OrderedDict
+RequestsCookieJar = cookies.RequestsCookieJar
+cookiejar_from_dict = cookies.cookiejar_from_dict
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+InvalidURL = exceptions.InvalidURL
+
+NETRC_FILES = ...  # type: Any
+DEFAULT_CA_BUNDLE_PATH = ...  # type: Any
+
+def dict_to_sequence(d): ...
+def super_len(o): ...
+def get_netrc_auth(url): ...
+def guess_filename(obj): ...
+def from_key_val_list(value): ...
+def to_key_val_list(value): ...
+def parse_list_header(value): ...
+def parse_dict_header(value): ...
+def unquote_header_value(value, is_filename=...): ...
+def dict_from_cookiejar(cj): ...
+def add_dict_to_cookiejar(cj, cookie_dict): ...
+def get_encodings_from_content(content): ...
+def get_encoding_from_headers(headers): ...
+def stream_decode_response_unicode(iterator, r): ...
+def iter_slices(string, slice_length): ...
+def get_unicode_from_response(r): ...
+
+UNRESERVED_SET = ...  # type: Any
+
+def unquote_unreserved(uri): ...
+def requote_uri(uri): ...
+def address_in_network(ip, net): ...
+def dotted_netmask(mask): ...
+def is_ipv4_address(string_ip): ...
+def is_valid_cidr(string_network): ...
+def should_bypass_proxies(url): ...
+def get_environ_proxies(url): ...
+def default_user_agent(name=...): ...
+def default_headers(): ...
+def parse_header_links(value): ...
+def guess_json_utf(data): ...
+def prepend_scheme_if_needed(url, new_scheme): ...
+def get_auth_from_url(url): ...
+def to_native_string(string, encoding=...): ...
+def urldefragauth(url): ...
diff --git a/typeshed/third_party/3/six/__init__.pyi b/typeshed/third_party/3/six/__init__.pyi
new file mode 100644
index 0000000..333bd27
--- /dev/null
+++ b/typeshed/third_party/3/six/__init__.pyi
@@ -0,0 +1,103 @@
+# Stubs for six (Python 3.5)
+
+from __future__ import print_function
+
+from typing import (
+    Any,
+    AnyStr,
+    Callable,
+    Dict,
+    ItemsView,
+    Iterable,
+    KeysView,
+    Mapping,
+    Optional,
+    Pattern,
+    Tuple,
+    Type,
+    TypeVar,
+    Union,
+    ValuesView,
+    overload,
+)
+import types
+import typing
+import unittest
+from mypy_extensions import NoReturn
+
+# Exports
+from io import StringIO as StringIO, BytesIO as BytesIO
+from builtins import next as next
+from functools import wraps as wraps
+
+_T = TypeVar('_T')
+_K = TypeVar('_K')
+_V = TypeVar('_V')
+
+# TODO make constant, then move this stub to 2and3
+# https://github.com/python/typeshed/issues/17
+PY2 = False
+PY3 = True
+PY34 = ...  # type: bool
+
+string_types = str,
+integer_types = int,
+class_types = type,
+text_type = str
+binary_type = bytes
+
+MAXSIZE = ...  # type: int
+
+# def add_move
+# def remove_move
+
+def callable(obj: object) -> bool: ...
+
+def get_unbound_function(unbound: types.FunctionType) -> types.FunctionType: ...
+def create_bound_method(func: types.FunctionType, obj: object) -> types.MethodType: ...
+def create_unbound_method(func: types.FunctionType, cls: type) -> types.FunctionType: ...
+
+Iterator = object
+
+def get_method_function(meth: types.MethodType) -> types.FunctionType: ...
+def get_method_self(meth: types.MethodType) -> Optional[object]: ...
+def get_function_closure(fun: types.FunctionType) -> Optional[Tuple[types._Cell, ...]]: ...
+def get_function_code(fun: types.FunctionType) -> types.CodeType: ...
+def get_function_defaults(fun: types.FunctionType) -> Optional[Tuple[Any, ...]]: ...
+def get_function_globals(fun: types.FunctionType) -> Dict[str, Any]: ...
+
+def iterkeys(d: Mapping[_K, _V]) -> typing.Iterator[_K]: ...
+def itervalues(d: Mapping[_K, _V]) -> typing.Iterator[_V]: ...
+def iteritems(d: Mapping[_K, _V]) -> typing.Iterator[Tuple[_K, _V]]: ...
+# def iterlists
+
+def viewkeys(d: Mapping[_K, _V]) -> KeysView[_K]: ...
+def viewvalues(d: Mapping[_K, _V]) -> ValuesView[_V]: ...
+def viewitems(d: Mapping[_K, _V]) -> ItemsView[_K, _V]: ...
+
+def b(s: str) -> binary_type: ...
+def u(s: str) -> text_type: ...
+
+unichr = chr
+def int2byte(i: int) -> bytes: ...
+def byte2int(bs: binary_type) -> int: ...
+def indexbytes(buf: binary_type, i: int) -> int: ...
+def iterbytes(buf: binary_type) -> typing.Iterator[int]: ...
+
+def assertCountEqual(self: unittest.TestCase, first: Iterable[_T], second: Iterable[_T], msg: str = None) -> None: ...
+ at overload
+def assertRaisesRegex(self: unittest.TestCase, msg: str = None) -> Any: ...
+ at overload
+def assertRaisesRegex(self: unittest.TestCase, callable_obj: Callable[..., Any], *args: Any, **kwargs: Any) -> Any: ...
+def assertRegex(self: unittest.TestCase, text: AnyStr, expected_regex: Union[AnyStr, Pattern[AnyStr]], msg: str = None) -> None: ...
+
+exec_ = exec
+
+def reraise(tp: Optional[Type[BaseException]], value: Optional[BaseException], tb: Optional[types.TracebackType] = None) -> NoReturn: ...
+def raise_from(value: BaseException, from_value: BaseException) -> None: ...
+
+print_ = print
+
+def with_metaclass(meta: type, *bases: type) -> type: ...
+def add_metaclass(metaclass: type) -> Callable[[_T], _T]: ...
+def python_2_unicode_compatible(klass: _T) -> _T: ...
diff --git a/typeshed/third_party/3/six/moves/__init__.pyi b/typeshed/third_party/3/six/moves/__init__.pyi
new file mode 100644
index 0000000..859a7eb
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/__init__.pyi
@@ -0,0 +1,34 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves (Python 3.2)
+
+from http import cookies as http_cookies
+from io import StringIO as cStringIO
+from builtins import filter as filter
+from itertools import filterfalse as filterfalse
+from builtins import input as input
+from sys import intern as intern
+from builtins import map as map
+from os import getcwd as getcwd
+from os import getcwdb as getcwdb
+from builtins import range as range
+from imp import reload as reload_module
+from functools import reduce as reduce
+from shlex import quote as shlex_quote
+from io import StringIO as StringIO
+from collections import UserDict as UserDict
+from collections import UserList as UserList
+from collections import UserString as UserString
+from builtins import range as xrange
+from builtins import zip as zip
+from itertools import zip_longest as zip_longest
+import six.moves.cPickle as cPickle
+import html.parser as html_parser
+import html.entities as html_entities
+import http.client as http_client
+
+import six.moves.urllib_parse as urllib_parse
+import six.moves.urllib_error as urllib_error
+import six.moves.urllib as urllib
+import six.moves.urllib_robotparser as urllib_robotparser
diff --git a/typeshed/third_party/3/six/moves/cPickle.pyi b/typeshed/third_party/3/six/moves/cPickle.pyi
new file mode 100644
index 0000000..f2e2e12
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/cPickle.pyi
@@ -0,0 +1,6 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.cPickle (Python 3.2)
+
+from pickle import *  # noqa: F403
diff --git a/typeshed/third_party/3/six/moves/urllib/__init__.pyi b/typeshed/third_party/3/six/moves/urllib/__init__.pyi
new file mode 100644
index 0000000..298b049
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/__init__.pyi
@@ -0,0 +1,10 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib (Python 3.2)
+
+import six.moves.urllib.error as error
+import six.moves.urllib.parse as parse
+import six.moves.urllib.request as request
+import six.moves.urllib.response as response
+import six.moves.urllib.robotparser as robotparser
diff --git a/typeshed/third_party/3/six/moves/urllib/error.pyi b/typeshed/third_party/3/six/moves/urllib/error.pyi
new file mode 100644
index 0000000..a45b0f7
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/error.pyi
@@ -0,0 +1,8 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.error (Python 3.2)
+
+from urllib.error import URLError as URLError
+from urllib.error import HTTPError as HTTPError
+from urllib.error import ContentTooShortError as ContentTooShortError
diff --git a/typeshed/third_party/3/six/moves/urllib/parse.pyi b/typeshed/third_party/3/six/moves/urllib/parse.pyi
new file mode 100644
index 0000000..c640af2
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/parse.pyi
@@ -0,0 +1,22 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.parse (Python 3.2)
+
+from six.moves.urllib_parse import (
+    ParseResult as ParseResult,
+    SplitResult as SplitResult,
+    parse_qs as parse_qs,
+    parse_qsl as parse_qsl,
+    urldefrag as urldefrag,
+    urljoin as urljoin,
+    urlparse as urlparse,
+    urlsplit as urlsplit,
+    urlunparse as urlunparse,
+    urlunsplit as urlunsplit,
+    quote as quote,
+    quote_plus as quote_plus,
+    unquote as unquote,
+    unquote_plus as unquote_plus,
+    urlencode as urlencode,
+)
diff --git a/typeshed/third_party/3/six/moves/urllib/request.pyi b/typeshed/third_party/3/six/moves/urllib/request.pyi
new file mode 100644
index 0000000..b15ced7
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/request.pyi
@@ -0,0 +1,40 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.request (Python 3.2)
+
+from urllib.request import BaseHandler as BaseHandler
+from urllib.request import HTTPRedirectHandler as HTTPRedirectHandler
+from urllib.request import OpenerDirector as OpenerDirector
+
+from urllib.request import install_opener as install_opener
+from urllib.request import build_opener as build_opener
+
+# from urllib.request import urlopen as urlopen
+# from urllib.request import pathname2url as pathname2url
+# from urllib.request import url2pathname as url2pathname
+# from urllib.request import getproxies as getproxies
+# from urllib.request import Request as Request
+# from urllib.request import HTTPDefaultErrorHandler as HTTPDefaultErrorHandler
+# from urllib.request import HTTPCookieProcessor as HTTPCookieProcessor
+# from urllib.request import ProxyHandler as ProxyHandler
+# from urllib.request import HTTPPasswordMgr as HTTPPasswordMgr
+# from urllib.request import HTTPPasswordMgrWithDefaultRealm as HTTPPasswordMgrWithDefaultRealm
+# from urllib.request import AbstractBasicAuthHandler as AbstractBasicAuthHandler
+# from urllib.request import HTTPBasicAuthHandler as HTTPBasicAuthHandler
+# from urllib.request import ProxyBasicAuthHandler as ProxyBasicAuthHandler
+# from urllib.request import AbstractDigestAuthHandler as AbstractDigestAuthHandler
+# from urllib.request import HTTPDigestAuthHandler as HTTPDigestAuthHandler
+# from urllib.request import ProxyDigestAuthHandler as ProxyDigestAuthHandler
+# from urllib.request import HTTPHandler as HTTPHandler
+# from urllib.request import HTTPSHandler as HTTPSHandler
+# from urllib.request import FileHandler as FileHandler
+# from urllib.request import FTPHandler as FTPHandler
+# from urllib.request import CacheFTPHandler as CacheFTPHandler
+# from urllib.request import UnknownHandler as UnknownHandler
+# from urllib.request import HTTPErrorProcessor as HTTPErrorProcessor
+# from urllib.request import urlretrieve as urlretrieve
+# from urllib.request import urlcleanup as urlcleanup
+# from urllib.request import URLopener as URLopener
+# from urllib.request import FancyURLopener as FancyURLopener
+# from urllib.request import proxy_bypass as proxy_bypass
diff --git a/typeshed/third_party/3/six/moves/urllib/response.pyi b/typeshed/third_party/3/six/moves/urllib/response.pyi
new file mode 100644
index 0000000..c3b34a8
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/response.pyi
@@ -0,0 +1 @@
+from urllib.response import addinfourl as addinfourl
diff --git a/typeshed/third_party/3/six/moves/urllib/robotparser.pyi b/typeshed/third_party/3/six/moves/urllib/robotparser.pyi
new file mode 100644
index 0000000..6690355
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/robotparser.pyi
@@ -0,0 +1,6 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.robotparser (Python 3.2)
+
+from urllib.robotparser import RobotFileParser as RobotFileParser
diff --git a/typeshed/third_party/3/six/moves/urllib_error.pyi b/typeshed/third_party/3/six/moves/urllib_error.pyi
new file mode 100644
index 0000000..1368664
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib_error.pyi
@@ -0,0 +1,10 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_error (Python 3.2)
+
+from six.moves.urllib.error import (
+    URLError as URLError,
+    HTTPError as HTTPError,
+    ContentTooShortError as ContentTooShortError,
+)
diff --git a/typeshed/third_party/3/six/moves/urllib_parse.pyi b/typeshed/third_party/3/six/moves/urllib_parse.pyi
new file mode 100644
index 0000000..96f6207
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib_parse.pyi
@@ -0,0 +1,20 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_parse (Python 3.2)
+
+from urllib.parse import ParseResult as ParseResult
+from urllib.parse import SplitResult as SplitResult
+from urllib.parse import parse_qs as parse_qs
+from urllib.parse import parse_qsl as parse_qsl
+from urllib.parse import urldefrag as urldefrag
+from urllib.parse import urljoin as urljoin
+from urllib.parse import urlparse as urlparse
+from urllib.parse import urlsplit as urlsplit
+from urllib.parse import urlunparse as urlunparse
+from urllib.parse import urlunsplit as urlunsplit
+from urllib.parse import quote as quote
+from urllib.parse import quote_plus as quote_plus
+from urllib.parse import unquote as unquote
+from urllib.parse import unquote_plus as unquote_plus
+from urllib.parse import urlencode as urlencode
diff --git a/typeshed/third_party/3/six/moves/urllib_request.pyi b/typeshed/third_party/3/six/moves/urllib_request.pyi
new file mode 100644
index 0000000..168f635
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib_request.pyi
@@ -0,0 +1,41 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_request (Python 3.2)
+
+from six.moves.urllib.request import (
+    install_opener as install_opener,
+    build_opener as build_opener,
+    BaseHandler as BaseHandler,
+    OpenerDirector as OpenerDirector,
+    HTTPRedirectHandler as HTTPRedirectHandler,
+
+    # urlopen as urlopen,
+    # pathname2url as pathname2url,
+    # url2pathname as url2pathname,
+    # getproxies as getproxies,
+    # Request as Request,
+    # HTTPDefaultErrorHandler as HTTPDefaultErrorHandler,
+    # HTTPCookieProcessor as HTTPCookieProcessor,
+    # ProxyHandler as ProxyHandler,
+    # HTTPPasswordMgr as HTTPPasswordMgr,
+    # HTTPPasswordMgrWithDefaultRealm as HTTPPasswordMgrWithDefaultRealm,
+    # AbstractBasicAuthHandler as AbstractBasicAuthHandler,
+    # HTTPBasicAuthHandler as HTTPBasicAuthHandler,
+    # ProxyBasicAuthHandler as ProxyBasicAuthHandler,
+    # AbstractDigestAuthHandler as AbstractDigestAuthHandler,
+    # HTTPDigestAuthHandler as HTTPDigestAuthHandler,
+    # ProxyDigestAuthHandler as ProxyDigestAuthHandler,
+    # HTTPHandler as HTTPHandler,
+    # HTTPSHandler as HTTPSHandler,
+    # FileHandler as FileHandler,
+    # FTPHandler as FTPHandler,
+    # CacheFTPHandler as CacheFTPHandler,
+    # UnknownHandler as UnknownHandler,
+    # HTTPErrorProcessor as HTTPErrorProcessor,
+    # urlretrieve as urlretrieve,
+    # urlcleanup as urlcleanup,
+    # URLopener as URLopener,
+    # FancyURLopener as FancyURLopener,
+    # proxy_bypass as proxy_bypass,
+)
diff --git a/typeshed/third_party/3/six/moves/urllib_response.pyi b/typeshed/third_party/3/six/moves/urllib_response.pyi
new file mode 100644
index 0000000..1574d7d
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib_response.pyi
@@ -0,0 +1 @@
+from six.moves.urllib.response import addinfourl as addinfourl
diff --git a/typeshed/third_party/3/six/moves/urllib_robotparser.pyi b/typeshed/third_party/3/six/moves/urllib_robotparser.pyi
new file mode 100644
index 0000000..8b4ca73
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib_robotparser.pyi
@@ -0,0 +1,8 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_robotparser (Python 3.2)
+
+from six.moves.urllib.robotparser import (
+    RobotFileParser as RobotFileParser,
+)
diff --git a/typeshed/third_party/3/typed_ast/__init__.pyi b/typeshed/third_party/3/typed_ast/__init__.pyi
new file mode 100644
index 0000000..92e1216
--- /dev/null
+++ b/typeshed/third_party/3/typed_ast/__init__.pyi
@@ -0,0 +1,2 @@
+# This module is a fork of the CPython 2.7 and 3.5  ast modules with PEP 484 support.
+# See: https://github.com/dropbox/typed_ast
diff --git a/typeshed/third_party/3/typed_ast/ast27.pyi b/typeshed/third_party/3/typed_ast/ast27.pyi
new file mode 100644
index 0000000..28e0dfe
--- /dev/null
+++ b/typeshed/third_party/3/typed_ast/ast27.pyi
@@ -0,0 +1,360 @@
+import typing
+from typing import Any, Optional, Union, Generic, Iterator
+
+class NodeVisitor():
+    def visit(self, node: AST) -> Any: ...
+    def generic_visit(self, node: AST) -> None: ...
+
+class NodeTransformer(NodeVisitor):
+    def generic_visit(self, node: AST) -> None: ...
+
+def parse(source: Union[str, bytes], filename: Union[str, bytes] = ..., mode: str = ...) -> AST: ...
+def copy_location(new_node: AST, old_node: AST) -> AST: ...
+def dump(node: AST, annotate_fields: bool = ..., include_attributes: bool = ...) -> str: ...
+def fix_missing_locations(node: AST) -> AST: ...
+def get_docstring(node: AST, clean: bool = ...) -> Optional[bytes]: ...
+def increment_lineno(node: AST, n: int = ...) -> AST: ...
+def iter_child_nodes(node: AST) -> Iterator[AST]: ...
+def iter_fields(node: AST) -> Iterator[typing.Tuple[str, Any]]: ...
+def literal_eval(node_or_string: Union[str, AST]) -> Any: ...
+def walk(node: AST) -> Iterator[AST]: ...
+
+PyCF_ONLY_AST = ...  # type: int
+
+# ast classes
+
+identifier = str
+
+class AST:
+    _attributes = ...  # type: typing.Tuple[str, ...]
+    _fields = ...  # type: typing.Tuple[str, ...]
+    def __init__(self, *args, **kwargs) -> None: ...
+
+class mod(AST):
+    ...
+
+class Module(mod):
+    body = ...  # type: typing.List[stmt]
+    type_ignores = ...  # type: typing.List[TypeIgnore]
+
+class Interactive(mod):
+    body = ...  # type: typing.List[stmt]
+
+class Expression(mod):
+    body = ...  # type: expr
+
+class FunctionType(mod):
+    argtypes = ...  # type: typing.List[expr]
+    returns = ...  # type: expr
+
+class Suite(mod):
+    body = ...  # type: typing.List[stmt]
+
+
+class stmt(AST):
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+class FunctionDef(stmt):
+    name = ...  # type: identifier
+    args = ...  # type: arguments
+    body = ...  # type: typing.List[stmt]
+    decorator_list = ...  # type: typing.List[expr]
+    type_comment = ...  # type: Optional[str]
+
+class ClassDef(stmt):
+    name = ...  # type: identifier
+    bases = ...  # type: typing.List[expr]
+    body = ...  # type: typing.List[stmt]
+    decorator_list = ...  # type: typing.List[expr]
+
+class Return(stmt):
+    value = ...  # type: Optional[expr]
+
+class Delete(stmt):
+    targets = ...  # type: typing.List[expr]
+
+class Assign(stmt):
+    targets = ...  # type: typing.List[expr]
+    value = ...  # type: expr
+    type_comment = ...  # type: Optional[str]
+
+class AugAssign(stmt):
+    target = ...  # type: expr
+    op = ...  # type: operator
+    value = ...  # type: expr
+
+class Print(stmt):
+    dest = ...  # type: Optional[expr]
+    values = ...  # type: typing.List[expr]
+    nl = ...  # type: bool
+
+class For(stmt):
+    target = ...  # type: expr
+    iter = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+    type_comment = ...  # type: Optional[str]
+
+class While(stmt):
+    test = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class If(stmt):
+    test = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class With(stmt):
+    context_expr = ...  # type: expr
+    optional_vars = ...  # type: Optional[expr]
+    body = ...  # type: typing.List[stmt]
+    type_comment = ...  # type: Optional[str]
+
+class Raise(stmt):
+    type = ...  # type: Optional[expr]
+    inst = ...  # type: Optional[expr]
+    tback = ...  # type: Optional[expr]
+
+class TryExcept(stmt):
+    body = ...  # type: typing.List[stmt]
+    handlers = ...  # type: typing.List[ExceptHandler]
+    orelse = ...  # type: typing.List[stmt]
+
+class TryFinally(stmt):
+    body = ...  # type: typing.List[stmt]
+    finalbody = ...  # type: typing.List[stmt]
+
+class Assert(stmt):
+    test = ...  # type: expr
+    msg = ...  # type: Optional[expr]
+
+class Import(stmt):
+    names = ...  # type: typing.List[alias]
+
+class ImportFrom(stmt):
+    module = ...  # type: Optional[identifier]
+    names = ...  # type: typing.List[alias]
+    level = ...  # type: Optional[int]
+
+class Exec(stmt):
+    body = ...  # type: expr
+    globals = ...  # type: Optional[expr]
+    locals = ...  # type: Optional[expr]
+
+class Global(stmt):
+    names = ...  # type: typing.List[identifier]
+
+class Expr(stmt):
+    value = ...  # type: expr
+
+class Pass(stmt): ...
+class Break(stmt): ...
+class Continue(stmt): ...
+
+
+class slice(AST):
+    ...
+
+_slice = slice  # this lets us type the variable named 'slice' below
+
+class Slice(slice):
+    lower = ...  # type: Optional[expr]
+    upper = ...  # type: Optional[expr]
+    step = ...  # type: Optional[expr]
+
+class ExtSlice(slice):
+    dims = ...  # type: typing.List[slice]
+
+class Index(slice):
+    value = ...  # type: expr
+
+class Ellipsis(slice): ...
+
+
+class expr(AST):
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+class BoolOp(expr):
+    op = ...  # type: boolop
+    values = ...  # type: typing.List[expr]
+
+class BinOp(expr):
+    left = ...  # type: expr
+    op = ...  # type: operator
+    right = ...  # type: expr
+
+class UnaryOp(expr):
+    op = ...  # type: unaryop
+    operand = ...  # type: expr
+
+class Lambda(expr):
+    args = ...  # type: arguments
+    body = ...  # type: expr
+
+class IfExp(expr):
+    test = ...  # type: expr
+    body = ...  # type: expr
+    orelse = ...  # type: expr
+
+class Dict(expr):
+    keys = ...  # type: typing.List[expr]
+    values = ...  # type: typing.List[expr]
+
+class Set(expr):
+    elts = ...  # type: typing.List[expr]
+
+class ListComp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class SetComp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class DictComp(expr):
+    key = ...  # type: expr
+    value = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class GeneratorExp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class Yield(expr):
+    value = ...  # type: Optional[expr]
+
+class Compare(expr):
+    left = ...  # type: expr
+    ops = ...  # type: typing.List[cmpop]
+    comparators = ...  # type: typing.List[expr]
+
+class Call(expr):
+    func = ...  # type: expr
+    args = ...  # type: typing.List[expr]
+    keywords = ...  # type: typing.List[keyword]
+    starargs = ...  # type: Optional[expr]
+    kwargs = ...  # type: Optional[expr]
+
+class Repr(expr):
+    value = ...  # type: expr
+
+class Num(expr):
+    n = ...  # type: Union[int, float]
+
+class Str(expr):
+    s = ...  # type: bytes
+
+class Attribute(expr):
+    value = ...  # type: expr
+    attr = ...  # type: identifier
+    ctx = ...  # type: expr_context
+
+class Subscript(expr):
+    value = ...  # type: expr
+    slice = ...  # type: _slice
+    ctx = ...  # type: expr_context
+
+class Name(expr):
+    id = ...  # type: identifier
+    ctx = ...  # type: expr_context
+
+class List(expr):
+    elts = ...  # type: typing.List[expr]
+    ctx = ...  # type: expr_context
+
+class Tuple(expr):
+    elts = ...  # type: typing.List[expr]
+    ctx = ...  # type: expr_context
+
+
+class expr_context(AST):
+    ...
+
+class AugLoad(expr_context): ...
+class AugStore(expr_context): ...
+class Del(expr_context): ...
+class Load(expr_context): ...
+class Param(expr_context): ...
+class Store(expr_context): ...
+
+
+class boolop(AST):
+    ...
+
+class And(boolop): ...
+class Or(boolop): ...
+
+class operator(AST):
+    ...
+
+class Add(operator): ...
+class BitAnd(operator): ...
+class BitOr(operator): ...
+class BitXor(operator): ...
+class Div(operator): ...
+class FloorDiv(operator): ...
+class LShift(operator): ...
+class Mod(operator): ...
+class Mult(operator): ...
+class Pow(operator): ...
+class RShift(operator): ...
+class Sub(operator): ...
+
+class unaryop(AST):
+    ...
+
+class Invert(unaryop): ...
+class Not(unaryop): ...
+class UAdd(unaryop): ...
+class USub(unaryop): ...
+
+class cmpop(AST):
+    ...
+
+class Eq(cmpop): ...
+class Gt(cmpop): ...
+class GtE(cmpop): ...
+class In(cmpop): ...
+class Is(cmpop): ...
+class IsNot(cmpop): ...
+class Lt(cmpop): ...
+class LtE(cmpop): ...
+class NotEq(cmpop): ...
+class NotIn(cmpop): ...
+
+
+class comprehension(AST):
+    target = ...  # type: expr
+    iter = ...  # type: expr
+    ifs = ...  # type: typing.List[expr]
+
+
+class ExceptHandler(AST):
+    type = ...  # type: Optional[expr]
+    name = ...  # type: Optional[expr]
+    body = ...  # type: typing.List[stmt]
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+
+class arguments(AST):
+    args = ...  # type: typing.List[expr]
+    vararg = ...  # type: Optional[identifier]
+    kwarg = ...  # type: Optional[identifier]
+    defaults = ...  # type: typing.List[expr]
+    type_comments = ...  # type: typing.List[str]
+
+class keyword(AST):
+    arg = ...  # type: identifier
+    value = ...  # type: expr
+
+class alias(AST):
+    name = ...  # type: identifier
+    asname = ...  # type: Optional[identifier]
+
+
+class TypeIgnore(AST):
+    lineno = ...  # type: int
diff --git a/typeshed/third_party/3/typed_ast/ast35.pyi b/typeshed/third_party/3/typed_ast/ast35.pyi
new file mode 100644
index 0000000..71ac1ba
--- /dev/null
+++ b/typeshed/third_party/3/typed_ast/ast35.pyi
@@ -0,0 +1,392 @@
+import typing
+from typing import Any, Optional, Union, Generic, Iterator
+
+class NodeVisitor():
+    def visit(self, node: AST) -> Any: ...
+    def generic_visit(self, node: AST) -> None: ...
+
+class NodeTransformer(NodeVisitor):
+    def generic_visit(self, node: AST) -> None: ...
+
+def parse(source: Union[str, bytes], filename: Union[str, bytes] = ..., mode: str = ...) -> AST: ...
+def copy_location(new_node: AST, old_node: AST) -> AST: ...
+def dump(node: AST, annotate_fields: bool = ..., include_attributes: bool = ...) -> str: ...
+def fix_missing_locations(node: AST) -> AST: ...
+def get_docstring(node: AST, clean: bool = ...) -> str: ...
+def increment_lineno(node: AST, n: int = ...) -> AST: ...
+def iter_child_nodes(node: AST) -> Iterator[AST]: ...
+def iter_fields(node: AST) -> Iterator[typing.Tuple[str, Any]]: ...
+def literal_eval(node_or_string: Union[str, AST]) -> Any: ...
+def walk(node: AST) -> Iterator[AST]: ...
+
+PyCF_ONLY_AST = ...  # type: int
+
+# ast classes
+
+identifier = str
+
+class AST:
+    _attributes = ...  # type: typing.Tuple[str, ...]
+    _fields = ...  # type: typing.Tuple[str, ...]
+    def __init__(self, *args, **kwargs) -> None: ...
+
+class mod(AST):
+    ...
+
+class Module(mod):
+    body = ...  # type: typing.List[stmt]
+    type_ignores = ...  # type: typing.List[TypeIgnore]
+
+class Interactive(mod):
+    body = ...  # type: typing.List[stmt]
+
+class Expression(mod):
+    body = ...  # type: expr
+
+class FunctionType(mod):
+    argtypes = ...  # type: typing.List[expr]
+    returns = ...  # type: expr
+
+class Suite(mod):
+    body = ...  # type: typing.List[stmt]
+
+
+class stmt(AST):
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+class FunctionDef(stmt):
+    name = ...  # type: identifier
+    args = ...  # type: arguments
+    body = ...  # type: typing.List[stmt]
+    decorator_list = ...  # type: typing.List[expr]
+    returns = ...  # type: Optional[expr]
+    type_comment = ...  # type: Optional[str]
+
+class AsyncFunctionDef(stmt):
+    name = ...  # type: identifier
+    args = ...  # type: arguments
+    body = ...  # type: typing.List[stmt]
+    decorator_list = ...  # type: typing.List[expr]
+    returns = ...  # type: Optional[expr]
+    type_comment = ...  # type: Optional[str]
+
+class ClassDef(stmt):
+    name = ...  # type: identifier
+    bases = ...  # type: typing.List[expr]
+    keywords = ...  # type: typing.List[keyword]
+    body = ...  # type: typing.List[stmt]
+    decorator_list = ...  # type: typing.List[expr]
+
+class Return(stmt):
+    value = ...  # type: Optional[expr]
+
+class Delete(stmt):
+    targets = ...  # type: typing.List[expr]
+
+class Assign(stmt):
+    targets = ...  # type: typing.List[expr]
+    value = ...  # type: Optional[expr]
+    type_comment = ...  # type: Optional[str]
+    annotation = ...  # type: Optional[expr]
+
+class AugAssign(stmt):
+    target = ...  # type: expr
+    op = ...  # type: operator
+    value = ...  # type: expr
+
+class For(stmt):
+    target = ...  # type: expr
+    iter = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+    type_comment = ...  # type: Optional[str]
+
+class AsyncFor(stmt):
+    target = ...  # type: expr
+    iter = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class While(stmt):
+    test = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class If(stmt):
+    test = ...  # type: expr
+    body = ...  # type: typing.List[stmt]
+    orelse = ...  # type: typing.List[stmt]
+
+class With(stmt):
+    items = ...  # type: typing.List[withitem]
+    body = ...  # type: typing.List[stmt]
+    type_comment = ...  # type: Optional[str]
+
+class AsyncWith(stmt):
+    items = ...  # type: typing.List[withitem]
+    body = ...  # type: typing.List[stmt]
+
+class Raise(stmt):
+    exc = ...  # type: Optional[expr]
+    cause = ...  # type: Optional[expr]
+
+class Try(stmt):
+    body = ...  # type: typing.List[stmt]
+    handlers = ...  # type: typing.List[ExceptHandler]
+    orelse = ...  # type: typing.List[stmt]
+    finalbody = ...  # type: typing.List[stmt]
+
+class Assert(stmt):
+    test = ...  # type: expr
+    msg = ...  # type: Optional[expr]
+
+class Import(stmt):
+    names = ...  # type: typing.List[alias]
+
+class ImportFrom(stmt):
+    module = ...  # type: Optional[identifier]
+    names = ...  # type: typing.List[alias]
+    level = ...  # type: Optional[int]
+
+class Global(stmt):
+    names = ...  # type: typing.List[identifier]
+
+class Nonlocal(stmt):
+    names = ...  # type: typing.List[identifier]
+
+class Expr(stmt):
+    value = ...  # type: expr
+
+class Pass(stmt): ...
+class Break(stmt): ...
+class Continue(stmt): ...
+
+
+class slice(AST):
+    ...
+
+_slice = slice  # this lets us type the variable named 'slice' below
+
+class Slice(slice):
+    lower = ...  # type: Optional[expr]
+    upper = ...  # type: Optional[expr]
+    step = ...  # type: Optional[expr]
+
+class ExtSlice(slice):
+    dims = ...  # type: typing.List[slice]
+
+class Index(slice):
+    value = ...  # type: expr
+
+
+class expr(AST):
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+class BoolOp(expr):
+    op = ...  # type: boolop
+    values = ...  # type: typing.List[expr]
+
+class BinOp(expr):
+    left = ...  # type: expr
+    op = ...  # type: operator
+    right = ...  # type: expr
+
+class UnaryOp(expr):
+    op = ...  # type: unaryop
+    operand = ...  # type: expr
+
+class Lambda(expr):
+    args = ...  # type: arguments
+    body = ...  # type: expr
+
+class IfExp(expr):
+    test = ...  # type: expr
+    body = ...  # type: expr
+    orelse = ...  # type: expr
+
+class Dict(expr):
+    keys = ...  # type: typing.List[expr]
+    values = ...  # type: typing.List[expr]
+
+class Set(expr):
+    elts = ...  # type: typing.List[expr]
+
+class ListComp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class SetComp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class DictComp(expr):
+    key = ...  # type: expr
+    value = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class GeneratorExp(expr):
+    elt = ...  # type: expr
+    generators = ...  # type: typing.List[comprehension]
+
+class Await(expr):
+    value = ...  # type: expr
+
+class Yield(expr):
+    value = ...  # type: Optional[expr]
+
+class YieldFrom(expr):
+    value = ...  # type: expr
+
+class Compare(expr):
+    left = ...  # type: expr
+    ops = ...  # type: typing.List[cmpop]
+    comparators = ...  # type: typing.List[expr]
+
+class Call(expr):
+    func = ...  # type: expr
+    args = ...  # type: typing.List[expr]
+    keywords = ...  # type: typing.List[keyword]
+
+class Num(expr):
+    n = ...  # type: Union[int, float]
+
+class Str(expr):
+    s = ...  # type: str
+
+class Bytes(expr):
+    s = ...  # type: bytes
+
+class NameConstant(expr):
+    value = ...  # type: Any
+
+class Ellipsis(expr): ...
+
+class Attribute(expr):
+    value = ...  # type: expr
+    attr = ...  # type: identifier
+    ctx = ...  # type: expr_context
+
+class Subscript(expr):
+    value = ...  # type: expr
+    slice = ...  # type: _slice
+    ctx = ...  # type: expr_context
+
+class Starred(expr):
+    value = ...  # type: expr
+    ctx = ...  # type: expr_context
+
+class Name(expr):
+    id = ...  # type: identifier
+    ctx = ...  # type: expr_context
+
+class List(expr):
+    elts = ...  # type: typing.List[expr]
+    ctx = ...  # type: expr_context
+
+class Tuple(expr):
+    elts = ...  # type: typing.List[expr]
+    ctx = ...  # type: expr_context
+
+
+class expr_context(AST):
+    ...
+
+class AugLoad(expr_context): ...
+class AugStore(expr_context): ...
+class Del(expr_context): ...
+class Load(expr_context): ...
+class Param(expr_context): ...
+class Store(expr_context): ...
+
+
+class boolop(AST):
+    ...
+
+class And(boolop): ...
+class Or(boolop): ...
+
+class operator(AST):
+    ...
+
+class Add(operator): ...
+class BitAnd(operator): ...
+class BitOr(operator): ...
+class BitXor(operator): ...
+class Div(operator): ...
+class FloorDiv(operator): ...
+class LShift(operator): ...
+class Mod(operator): ...
+class Mult(operator): ...
+class MatMult(operator): ...
+class Pow(operator): ...
+class RShift(operator): ...
+class Sub(operator): ...
+
+class unaryop(AST):
+    ...
+
+class Invert(unaryop): ...
+class Not(unaryop): ...
+class UAdd(unaryop): ...
+class USub(unaryop): ...
+
+class cmpop(AST):
+    ...
+
+class Eq(cmpop): ...
+class Gt(cmpop): ...
+class GtE(cmpop): ...
+class In(cmpop): ...
+class Is(cmpop): ...
+class IsNot(cmpop): ...
+class Lt(cmpop): ...
+class LtE(cmpop): ...
+class NotEq(cmpop): ...
+class NotIn(cmpop): ...
+
+
+class comprehension(AST):
+    target = ...  # type: expr
+    iter = ...  # type: expr
+    ifs = ...  # type: typing.List[expr]
+
+
+class ExceptHandler(AST):
+    type = ...  # type: Optional[expr]
+    name = ...  # type: Optional[identifier]
+    body = ...  # type: typing.List[stmt]
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+
+class arguments(AST):
+    args = ...  # type: typing.List[arg]
+    vararg = ...  # type: Optional[arg]
+    kwonlyargs = ...  # type: typing.List[arg]
+    kw_defaults = ...  # type: typing.List[expr]
+    kwarg = ...  # type: Optional[arg]
+    defaults = ...  # type: typing.List[expr]
+
+class arg(AST):
+    arg = ...  # type: identifier
+    annotation = ...  # type: Optional[expr]
+    lineno = ...  # type: int
+    col_offset = ...  # type: int
+
+class keyword(AST):
+    arg = ...  # type: Optional[identifier]
+    value = ...  # type: expr
+
+class alias(AST):
+    name = ...  # type: identifier
+    asname = ...  # type: Optional[identifier]
+
+class withitem(AST):
+    context_expr = ...  # type: expr
+    optional_vars = ...  # type: Optional[expr]
+
+
+class TypeIgnore(AST):
+    lineno = ...  # type: int
diff --git a/typeshed/third_party/3/typed_ast/conversions.pyi b/typeshed/third_party/3/typed_ast/conversions.pyi
new file mode 100644
index 0000000..53fcc32
--- /dev/null
+++ b/typeshed/third_party/3/typed_ast/conversions.pyi
@@ -0,0 +1,4 @@
+from . import ast27
+from . import ast35
+
+def py2to3(ast: ast27.AST) -> ast35.AST: ...
diff --git a/typeshed/third_party/3/werkzeug/__init__.pyi b/typeshed/third_party/3/werkzeug/__init__.pyi
new file mode 100644
index 0000000..806f964
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/__init__.pyi
@@ -0,0 +1,154 @@
+# Stubs for werkzeug (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from types import ModuleType
+from typing import Any
+
+from werkzeug import _internal
+from werkzeug import datastructures
+from werkzeug import debug
+from werkzeug import exceptions
+from werkzeug import formparser
+from werkzeug import http
+from werkzeug import local
+from werkzeug import security
+from werkzeug import serving
+from werkzeug import test
+from werkzeug import testapp
+from werkzeug import urls
+from werkzeug import useragents
+from werkzeug import utils
+from werkzeug import wrappers
+from werkzeug import wsgi
+
+class module(ModuleType):
+    def __getattr__(self, name): ...
+    def __dir__(self): ...
+
+
+__version__ = ...  # type: Any
+
+run_simple = serving.run_simple
+test_app = testapp.test_app
+UserAgent = useragents.UserAgent
+_easteregg = _internal._easteregg
+DebuggedApplication = debug.DebuggedApplication
+MultiDict = datastructures.MultiDict
+CombinedMultiDict = datastructures.CombinedMultiDict
+Headers = datastructures.Headers
+EnvironHeaders = datastructures.EnvironHeaders
+ImmutableList = datastructures.ImmutableList
+ImmutableDict = datastructures.ImmutableDict
+ImmutableMultiDict = datastructures.ImmutableMultiDict
+TypeConversionDict = datastructures.TypeConversionDict
+ImmutableTypeConversionDict = datastructures.ImmutableTypeConversionDict
+Accept = datastructures.Accept
+MIMEAccept = datastructures.MIMEAccept
+CharsetAccept = datastructures.CharsetAccept
+LanguageAccept = datastructures.LanguageAccept
+RequestCacheControl = datastructures.RequestCacheControl
+ResponseCacheControl = datastructures.ResponseCacheControl
+ETags = datastructures.ETags
+HeaderSet = datastructures.HeaderSet
+WWWAuthenticate = datastructures.WWWAuthenticate
+Authorization = datastructures.Authorization
+FileMultiDict = datastructures.FileMultiDict
+CallbackDict = datastructures.CallbackDict
+FileStorage = datastructures.FileStorage
+OrderedMultiDict = datastructures.OrderedMultiDict
+ImmutableOrderedMultiDict = datastructures.ImmutableOrderedMultiDict
+escape = utils.escape
+environ_property = utils.environ_property
+append_slash_redirect = utils.append_slash_redirect
+redirect = utils.redirect
+cached_property = utils.cached_property
+import_string = utils.import_string
+dump_cookie = http.dump_cookie
+parse_cookie = http.parse_cookie
+unescape = utils.unescape
+format_string = utils.format_string
+find_modules = utils.find_modules
+header_property = utils.header_property
+html = utils.html
+xhtml = utils.xhtml
+HTMLBuilder = utils.HTMLBuilder
+validate_arguments = utils.validate_arguments
+ArgumentValidationError = utils.ArgumentValidationError
+bind_arguments = utils.bind_arguments
+secure_filename = utils.secure_filename
+BaseResponse = wrappers.BaseResponse
+BaseRequest = wrappers.BaseRequest
+Request = wrappers.Request
+Response = wrappers.Response
+AcceptMixin = wrappers.AcceptMixin
+ETagRequestMixin = wrappers.ETagRequestMixin
+ETagResponseMixin = wrappers.ETagResponseMixin
+ResponseStreamMixin = wrappers.ResponseStreamMixin
+CommonResponseDescriptorsMixin = wrappers.CommonResponseDescriptorsMixin
+UserAgentMixin = wrappers.UserAgentMixin
+AuthorizationMixin = wrappers.AuthorizationMixin
+WWWAuthenticateMixin = wrappers.WWWAuthenticateMixin
+CommonRequestDescriptorsMixin = wrappers.CommonRequestDescriptorsMixin
+Local = local.Local
+LocalManager = local.LocalManager
+LocalProxy = local.LocalProxy
+LocalStack = local.LocalStack
+release_local = local.release_local
+generate_password_hash = security.generate_password_hash
+check_password_hash = security.check_password_hash
+Client = test.Client
+EnvironBuilder = test.EnvironBuilder
+create_environ = test.create_environ
+run_wsgi_app = test.run_wsgi_app
+get_current_url = wsgi.get_current_url
+get_host = wsgi.get_host
+pop_path_info = wsgi.pop_path_info
+peek_path_info = wsgi.peek_path_info
+SharedDataMiddleware = wsgi.SharedDataMiddleware
+DispatcherMiddleware = wsgi.DispatcherMiddleware
+ClosingIterator = wsgi.ClosingIterator
+FileWrapper = wsgi.FileWrapper
+make_line_iter = wsgi.make_line_iter
+LimitedStream = wsgi.LimitedStream
+responder = wsgi.responder
+wrap_file = wsgi.wrap_file
+extract_path_info = wsgi.extract_path_info
+parse_etags = http.parse_etags
+parse_date = http.parse_date
+http_date = http.http_date
+cookie_date = http.cookie_date
+parse_cache_control_header = http.parse_cache_control_header
+is_resource_modified = http.is_resource_modified
+parse_accept_header = http.parse_accept_header
+parse_set_header = http.parse_set_header
+quote_etag = http.quote_etag
+unquote_etag = http.unquote_etag
+generate_etag = http.generate_etag
+dump_header = http.dump_header
+parse_list_header = http.parse_list_header
+parse_dict_header = http.parse_dict_header
+parse_authorization_header = http.parse_authorization_header
+parse_www_authenticate_header = http.parse_www_authenticate_header
+remove_entity_headers = http.remove_entity_headers
+is_entity_header = http.is_entity_header
+remove_hop_by_hop_headers = http.remove_hop_by_hop_headers
+parse_options_header = http.parse_options_header
+dump_options_header = http.dump_options_header
+is_hop_by_hop_header = http.is_hop_by_hop_header
+unquote_header_value = http.unquote_header_value
+quote_header_value = http.quote_header_value
+HTTP_STATUS_CODES = http.HTTP_STATUS_CODES
+url_decode = urls.url_decode
+url_encode = urls.url_encode
+url_quote = urls.url_quote
+url_quote_plus = urls.url_quote_plus
+url_unquote = urls.url_unquote
+url_unquote_plus = urls.url_unquote_plus
+url_fix = urls.url_fix
+Href = urls.Href
+iri_to_uri = urls.iri_to_uri
+uri_to_iri = urls.uri_to_iri
+parse_form_data = formparser.parse_form_data
+abort = exceptions.Aborter
+Aborter = exceptions.Aborter
diff --git a/typeshed/third_party/3/werkzeug/_compat.pyi b/typeshed/third_party/3/werkzeug/_compat.pyi
new file mode 100644
index 0000000..1b0f55b
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/_compat.pyi
@@ -0,0 +1,47 @@
+# Stubs for werkzeug._compat (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from io import StringIO as BytesIO
+
+PY2 = ...  # type: Any
+WIN = ...  # type: Any
+unichr = ...  # type: Any
+text_type = ...  # type: Any
+string_types = ...  # type: Any
+integer_types = ...  # type: Any
+iterkeys = ...  # type: Any
+itervalues = ...  # type: Any
+iteritems = ...  # type: Any
+iterlists = ...  # type: Any
+iterlistvalues = ...  # type: Any
+int_to_byte = ...  # type: Any
+iter_bytes = ...  # type: Any
+
+def fix_tuple_repr(obj): ...
+def implements_iterator(cls): ...
+def implements_to_string(cls): ...
+def native_string_result(func): ...
+def implements_bool(cls): ...
+
+range_type = ...  # type: Any
+NativeStringIO = ...  # type: Any
+
+def make_literal_wrapper(reference): ...
+def normalize_string_tuple(tup): ...
+def try_coerce_native(s): ...
+
+wsgi_get_bytes = ...  # type: Any
+
+def wsgi_decoding_dance(s, charset='', errors=''): ...
+def wsgi_encoding_dance(s, charset='', errors=''): ...
+def to_bytes(x, charset=..., errors=''): ...
+def to_native(x, charset=..., errors=''): ...
+def reraise(tp, value, tb=None): ...
+
+imap = ...  # type: Any
+izip = ...  # type: Any
+ifilter = ...  # type: Any
+
+def to_unicode(x, charset=..., errors='', allow_none_charset=False): ...
diff --git a/typeshed/third_party/3/werkzeug/_internal.pyi b/typeshed/third_party/3/werkzeug/_internal.pyi
new file mode 100644
index 0000000..d16a33d
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/_internal.pyi
@@ -0,0 +1,22 @@
+# Stubs for werkzeug._internal (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _Missing:
+    def __reduce__(self): ...
+
+class _DictAccessorProperty:
+    read_only = ...  # type: Any
+    name = ...  # type: Any
+    default = ...  # type: Any
+    load_func = ...  # type: Any
+    dump_func = ...  # type: Any
+    __doc__ = ...  # type: Any
+    def __init__(self, name, default=None, load_func=None, dump_func=None, read_only=None, doc=None): ...
+    def __get__(self, obj, type=None): ...
+    def __set__(self, obj, value): ...
+    def __delete__(self, obj): ...
+
+def _easteregg(app=None): ...
diff --git a/typeshed/third_party/3/werkzeug/_reloader.pyi b/typeshed/third_party/3/werkzeug/_reloader.pyi
new file mode 100644
index 0000000..669065e
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/_reloader.pyi
@@ -0,0 +1,33 @@
+# Stubs for werkzeug._reloader (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class ReloaderLoop:
+    name = ...  # type: Any
+    extra_files = ...  # type: Any
+    interval = ...  # type: Any
+    def __init__(self, extra_files=None, interval=1): ...
+    def run(self): ...
+    def restart_with_reloader(self): ...
+    def trigger_reload(self, filename): ...
+    def log_reload(self, filename): ...
+
+class StatReloaderLoop(ReloaderLoop):
+    name = ...  # type: Any
+    def run(self): ...
+
+class WatchdogReloaderLoop(ReloaderLoop):
+    observable_paths = ...  # type: Any
+    name = ...  # type: Any
+    observer_class = ...  # type: Any
+    event_handler = ...  # type: Any
+    should_reload = ...  # type: Any
+    def __init__(self, *args, **kwargs): ...
+    def trigger_reload(self, filename): ...
+    def run(self): ...
+
+reloader_loops = ...  # type: Any
+
+def run_with_reloader(main_func, extra_files=None, interval=1, reloader_type=''): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/__init__.pyi b/typeshed/third_party/3/werkzeug/contrib/__init__.pyi
new file mode 100644
index 0000000..3fb4116
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for werkzeug.contrib (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/3/werkzeug/contrib/atom.pyi b/typeshed/third_party/3/werkzeug/contrib/atom.pyi
new file mode 100644
index 0000000..cfb535d
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/atom.pyi
@@ -0,0 +1,54 @@
+# Stubs for werkzeug.contrib.atom (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+XHTML_NAMESPACE = ...  # type: Any
+
+def format_iso8601(obj): ...
+
+class AtomFeed:
+    default_generator = ...  # type: Any
+    title = ...  # type: Any
+    title_type = ...  # type: Any
+    url = ...  # type: Any
+    feed_url = ...  # type: Any
+    id = ...  # type: Any
+    updated = ...  # type: Any
+    author = ...  # type: Any
+    icon = ...  # type: Any
+    logo = ...  # type: Any
+    rights = ...  # type: Any
+    rights_type = ...  # type: Any
+    subtitle = ...  # type: Any
+    subtitle_type = ...  # type: Any
+    generator = ...  # type: Any
+    links = ...  # type: Any
+    entries = ...  # type: Any
+    def __init__(self, title=None, entries=None, **kwargs): ...
+    def add(self, *args, **kwargs): ...
+    def generate(self): ...
+    def to_string(self): ...
+    def get_response(self): ...
+    def __call__(self, environ, start_response): ...
+
+class FeedEntry:
+    title = ...  # type: Any
+    title_type = ...  # type: Any
+    content = ...  # type: Any
+    content_type = ...  # type: Any
+    url = ...  # type: Any
+    id = ...  # type: Any
+    updated = ...  # type: Any
+    summary = ...  # type: Any
+    summary_type = ...  # type: Any
+    author = ...  # type: Any
+    published = ...  # type: Any
+    rights = ...  # type: Any
+    links = ...  # type: Any
+    categories = ...  # type: Any
+    xml_base = ...  # type: Any
+    def __init__(self, title=None, content=None, feed_url=None, **kwargs): ...
+    def generate(self): ...
+    def to_string(self): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/cache.pyi b/typeshed/third_party/3/werkzeug/contrib/cache.pyi
new file mode 100644
index 0000000..7b071ea
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/cache.pyi
@@ -0,0 +1,87 @@
+# Stubs for werkzeug.contrib.cache (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class BaseCache:
+    default_timeout = ...  # type: Any
+    def __init__(self, default_timeout=300): ...
+    def get(self, key): ...
+    def delete(self, key): ...
+    def get_many(self, *keys): ...
+    def get_dict(self, *keys): ...
+    def set(self, key, value, timeout=None): ...
+    def add(self, key, value, timeout=None): ...
+    def set_many(self, mapping, timeout=None): ...
+    def delete_many(self, *keys): ...
+    def has(self, key): ...
+    def clear(self): ...
+    def inc(self, key, delta=1): ...
+    def dec(self, key, delta=1): ...
+
+class NullCache(BaseCache): ...
+
+class SimpleCache(BaseCache):
+    clear = ...  # type: Any
+    def __init__(self, threshold=500, default_timeout=300): ...
+    def get(self, key): ...
+    def set(self, key, value, timeout=None): ...
+    def add(self, key, value, timeout=None): ...
+    def delete(self, key): ...
+    def has(self, key): ...
+
+class MemcachedCache(BaseCache):
+    key_prefix = ...  # type: Any
+    def __init__(self, servers=None, default_timeout=300, key_prefix=None): ...
+    def get(self, key): ...
+    def get_dict(self, *keys): ...
+    def add(self, key, value, timeout=None): ...
+    def set(self, key, value, timeout=None): ...
+    def get_many(self, *keys): ...
+    def set_many(self, mapping, timeout=None): ...
+    def delete(self, key): ...
+    def delete_many(self, *keys): ...
+    def has(self, key): ...
+    def clear(self): ...
+    def inc(self, key, delta=1): ...
+    def dec(self, key, delta=1): ...
+    def import_preferred_memcache_lib(self, servers): ...
+
+GAEMemcachedCache = ...  # type: Any
+
+class RedisCache(BaseCache):
+    key_prefix = ...  # type: Any
+    def __init__(self, host='', port=6379, password=None, db=0, default_timeout=300, key_prefix=None, **kwargs): ...
+    def dump_object(self, value): ...
+    def load_object(self, value): ...
+    def get(self, key): ...
+    def get_many(self, *keys): ...
+    def set(self, key, value, timeout=None): ...
+    def add(self, key, value, timeout=None): ...
+    def set_many(self, mapping, timeout=None): ...
+    def delete(self, key): ...
+    def delete_many(self, *keys): ...
+    def has(self, key): ...
+    def clear(self): ...
+    def inc(self, key, delta=1): ...
+    def dec(self, key, delta=1): ...
+
+class FileSystemCache(BaseCache):
+    def __init__(self, cache_dir, threshold=500, default_timeout=300, mode=384): ...
+    def clear(self): ...
+    def get(self, key): ...
+    def add(self, key, value, timeout=None): ...
+    def set(self, key, value, timeout=None): ...
+    def delete(self, key): ...
+    def has(self, key): ...
+
+class UWSGICache(BaseCache):
+    cache = ...  # type: Any
+    def __init__(self, default_timeout=300, cache=''): ...
+    def get(self, key): ...
+    def delete(self, key): ...
+    def set(self, key, value, timeout=None): ...
+    def add(self, key, value, timeout=None): ...
+    def clear(self): ...
+    def has(self, key): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/fixers.pyi b/typeshed/third_party/3/werkzeug/contrib/fixers.pyi
new file mode 100644
index 0000000..d660263
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/fixers.pyi
@@ -0,0 +1,41 @@
+# Stubs for werkzeug.contrib.fixers (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class CGIRootFix:
+    app = ...  # type: Any
+    app_root = ...  # type: Any
+    def __init__(self, app, app_root=''): ...
+    def __call__(self, environ, start_response): ...
+
+LighttpdCGIRootFix = ...  # type: Any
+
+class PathInfoFromRequestUriFix:
+    app = ...  # type: Any
+    def __init__(self, app): ...
+    def __call__(self, environ, start_response): ...
+
+class ProxyFix:
+    app = ...  # type: Any
+    num_proxies = ...  # type: Any
+    def __init__(self, app, num_proxies=1): ...
+    def get_remote_addr(self, forwarded_for): ...
+    def __call__(self, environ, start_response): ...
+
+class HeaderRewriterFix:
+    app = ...  # type: Any
+    remove_headers = ...  # type: Any
+    add_headers = ...  # type: Any
+    def __init__(self, app, remove_headers=None, add_headers=None): ...
+    def __call__(self, environ, start_response): ...
+
+class InternetExplorerFix:
+    app = ...  # type: Any
+    fix_vary = ...  # type: Any
+    fix_attach = ...  # type: Any
+    def __init__(self, app, fix_vary=True, fix_attach=True): ...
+    def fix_headers(self, environ, headers, status=None): ...
+    def run_fixed(self, environ, start_response): ...
+    def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/iterio.pyi b/typeshed/third_party/3/werkzeug/contrib/iterio.pyi
new file mode 100644
index 0000000..b65323a
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/iterio.pyi
@@ -0,0 +1,42 @@
+# Stubs for werkzeug.contrib.iterio (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+greenlet = ...  # type: Any
+
+class IterIO:
+    def __new__(cls, obj, sentinel=''): ...
+    def __iter__(self): ...
+    def tell(self): ...
+    def isatty(self): ...
+    def seek(self, pos, mode=0): ...
+    def truncate(self, size=None): ...
+    def write(self, s): ...
+    def writelines(self, list): ...
+    def read(self, n=-1): ...
+    def readlines(self, sizehint=0): ...
+    def readline(self, length=None): ...
+    def flush(self): ...
+    def __next__(self): ...
+
+class IterI(IterIO):
+    def __new__(cls, func, sentinel=''): ...
+    closed = ...  # type: Any
+    def close(self): ...
+    def write(self, s): ...
+    def writelines(self, list): ...
+    def flush(self): ...
+
+class IterO(IterIO):
+    sentinel = ...  # type: Any
+    closed = ...  # type: Any
+    pos = ...  # type: Any
+    def __new__(cls, gen, sentinel=''): ...
+    def __iter__(self): ...
+    def close(self): ...
+    def seek(self, pos, mode=0): ...
+    def read(self, n=-1): ...
+    def readline(self, length=None): ...
+    def readlines(self, sizehint=0): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/jsrouting.pyi b/typeshed/third_party/3/werkzeug/contrib/jsrouting.pyi
new file mode 100644
index 0000000..9ba5cff
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/jsrouting.pyi
@@ -0,0 +1,14 @@
+# Stubs for werkzeug.contrib.jsrouting (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def dumps(*args): ...
+def render_template(name_parts, rules, converters): ...
+def generate_map(map, name=''): ...
+def generate_adapter(adapter, name='', map_name=''): ...
+def js_to_url_function(converter): ...
+def NumberConverter_js_to_url(conv): ...
+
+js_to_url_functions = ...  # type: Any
diff --git a/typeshed/third_party/3/werkzeug/contrib/limiter.pyi b/typeshed/third_party/3/werkzeug/contrib/limiter.pyi
new file mode 100644
index 0000000..d27776f
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/limiter.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.contrib.limiter (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class StreamLimitMiddleware:
+    app = ...  # type: Any
+    maximum_size = ...  # type: Any
+    def __init__(self, app, maximum_size=...): ...
+    def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/lint.pyi b/typeshed/third_party/3/werkzeug/contrib/lint.pyi
new file mode 100644
index 0000000..ccaecf5
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/lint.pyi
@@ -0,0 +1,47 @@
+# Stubs for werkzeug.contrib.lint (Python 3)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class WSGIWarning(Warning): ...
+class HTTPWarning(Warning): ...
+
+def check_string(context, obj, stacklevel=3): ...
+
+class InputStream:
+    def __init__(self, stream): ...
+    def read(self, *args): ...
+    def readline(self, *args): ...
+    def __iter__(self): ...
+    def close(self): ...
+
+class ErrorStream:
+    def __init__(self, stream): ...
+    def write(self, s): ...
+    def flush(self): ...
+    def writelines(self, seq): ...
+    def close(self): ...
+
+class GuardedWrite:
+    def __init__(self, write, chunks): ...
+    def __call__(self, s): ...
+
+class GuardedIterator:
+    closed = ...  # type: Any
+    headers_set = ...  # type: Any
+    chunks = ...  # type: Any
+    def __init__(self, iterator, headers_set, chunks): ...
+    def __iter__(self): ...
+    def next(self): ...
+    def close(self): ...
+    def __del__(self): ...
+
+class LintMiddleware:
+    app = ...  # type: Any
+    def __init__(self, app): ...
+    def check_environ(self, environ): ...
+    def check_start_response(self, status, headers, exc_info): ...
+    def check_headers(self, headers): ...
+    def check_iterator(self, app_iter): ...
+    def __call__(self, *args, **kwargs): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/profiler.pyi b/typeshed/third_party/3/werkzeug/contrib/profiler.pyi
new file mode 100644
index 0000000..d3daf6d
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/profiler.pyi
@@ -0,0 +1,18 @@
+# Stubs for werkzeug.contrib.profiler (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+available = ...  # type: Any
+
+class MergeStream:
+    streams = ...  # type: Any
+    def __init__(self, *streams): ...
+    def write(self, data): ...
+
+class ProfilerMiddleware:
+    def __init__(self, app, stream=None, sort_by=..., restrictions=..., profile_dir=None): ...
+    def __call__(self, environ, start_response): ...
+
+def make_action(app_factory, hostname='', port=5000, threaded=False, processes=1, stream=None, sort_by=..., restrictions=...): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/securecookie.pyi b/typeshed/third_party/3/werkzeug/contrib/securecookie.pyi
new file mode 100644
index 0000000..36ed6b7
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/securecookie.pyi
@@ -0,0 +1,30 @@
+# Stubs for werkzeug.contrib.securecookie (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from hmac import new as hmac
+from hashlib import sha1 as _default_hash
+from werkzeug.contrib.sessions import ModificationTrackingDict
+
+class UnquoteError(Exception): ...
+
+class SecureCookie(ModificationTrackingDict):
+    hash_method = ...  # type: Any
+    serialization_method = ...  # type: Any
+    quote_base64 = ...  # type: Any
+    secret_key = ...  # type: Any
+    new = ...  # type: Any
+    def __init__(self, data=None, secret_key=None, new=True): ...
+    @property
+    def should_save(self): ...
+    @classmethod
+    def quote(cls, value): ...
+    @classmethod
+    def unquote(cls, value): ...
+    def serialize(self, expires=None): ...
+    @classmethod
+    def unserialize(cls, string, secret_key): ...
+    @classmethod
+    def load_cookie(cls, request, key='', secret_key=None): ...
+    def save_cookie(self, response, key='', expires=None, session_expires=None, max_age=None, path='', domain=None, secure=None, httponly=False, force=False): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/sessions.pyi b/typeshed/third_party/3/werkzeug/contrib/sessions.pyi
new file mode 100644
index 0000000..69cb4f5
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/sessions.pyi
@@ -0,0 +1,58 @@
+# Stubs for werkzeug.contrib.sessions (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.datastructures import CallbackDict
+
+def generate_key(salt=None): ...
+
+class ModificationTrackingDict(CallbackDict):
+    modified = ...  # type: Any
+    def __init__(self, *args, **kwargs): ...
+    def copy(self): ...
+    def __copy__(self): ...
+
+class Session(ModificationTrackingDict):
+    sid = ...  # type: Any
+    new = ...  # type: Any
+    def __init__(self, data, sid, new=False): ...
+    @property
+    def should_save(self): ...
+
+class SessionStore:
+    session_class = ...  # type: Any
+    def __init__(self, session_class=None): ...
+    def is_valid_key(self, key): ...
+    def generate_key(self, salt=None): ...
+    def new(self): ...
+    def save(self, session): ...
+    def save_if_modified(self, session): ...
+    def delete(self, session): ...
+    def get(self, sid): ...
+
+class FilesystemSessionStore(SessionStore):
+    path = ...  # type: Any
+    filename_template = ...  # type: Any
+    renew_missing = ...  # type: Any
+    mode = ...  # type: Any
+    def __init__(self, path=None, filename_template='', session_class=None, renew_missing=False, mode=420): ...
+    def get_session_filename(self, sid): ...
+    def save(self, session): ...
+    def delete(self, session): ...
+    def get(self, sid): ...
+    def list(self): ...
+
+class SessionMiddleware:
+    app = ...  # type: Any
+    store = ...  # type: Any
+    cookie_name = ...  # type: Any
+    cookie_age = ...  # type: Any
+    cookie_expires = ...  # type: Any
+    cookie_path = ...  # type: Any
+    cookie_domain = ...  # type: Any
+    cookie_secure = ...  # type: Any
+    cookie_httponly = ...  # type: Any
+    environ_key = ...  # type: Any
+    def __init__(self, app, store, cookie_name='', cookie_age=None, cookie_expires=None, cookie_path='', cookie_domain=None, cookie_secure=None, cookie_httponly=False, environ_key=''): ...
+    def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/testtools.pyi b/typeshed/third_party/3/werkzeug/contrib/testtools.pyi
new file mode 100644
index 0000000..3c21524
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/testtools.pyi
@@ -0,0 +1,13 @@
+# Stubs for werkzeug.contrib.testtools (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import Response
+
+class ContentAccessors:
+    def xml(self): ...
+    def lxml(self): ...
+    def json(self): ...
+
+class TestResponse(Response, ContentAccessors): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/wrappers.pyi b/typeshed/third_party/3/werkzeug/contrib/wrappers.pyi
new file mode 100644
index 0000000..2e43f6a
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/wrappers.pyi
@@ -0,0 +1,31 @@
+# Stubs for werkzeug.contrib.wrappers (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def is_known_charset(charset): ...
+
+class JSONRequestMixin:
+    def json(self): ...
+
+class ProtobufRequestMixin:
+    protobuf_check_initialization = ...  # type: Any
+    def parse_protobuf(self, proto_type): ...
+
+class RoutingArgsRequestMixin:
+    routing_args = ...  # type: Any
+    routing_vars = ...  # type: Any
+
+class ReverseSlashBehaviorRequestMixin:
+    def path(self): ...
+    def script_root(self): ...
+
+class DynamicCharsetRequestMixin:
+    default_charset = ...  # type: Any
+    def unknown_charset(self, charset): ...
+    def charset(self): ...
+
+class DynamicCharsetResponseMixin:
+    default_charset = ...  # type: Any
+    charset = ...  # type: Any
diff --git a/typeshed/third_party/3/werkzeug/datastructures.pyi b/typeshed/third_party/3/werkzeug/datastructures.pyi
new file mode 100644
index 0000000..0204b34
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/datastructures.pyi
@@ -0,0 +1,389 @@
+# Stubs for werkzeug.datastructures (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from collections import Container, Iterable, Mapping, MutableSet
+
+def is_immutable(self): ...
+def iter_multi_items(mapping): ...
+def native_itermethods(names): ...
+
+class ImmutableListMixin:
+    def __hash__(self): ...
+    def __reduce_ex__(self, protocol): ...
+    def __delitem__(self, key): ...
+    def __delslice__(self, i, j): ...
+    def __iadd__(self, other): ...
+    __imul__ = ...  # type: Any
+    def __setitem__(self, key, value): ...
+    def __setslice__(self, i, j, value): ...
+    def append(self, item): ...
+    remove = ...  # type: Any
+    def extend(self, iterable): ...
+    def insert(self, pos, value): ...
+    def pop(self, index=-1): ...
+    def reverse(self): ...
+    def sort(self, cmp=None, key=None, reverse=None): ...
+
+class ImmutableList(ImmutableListMixin, list): ...
+
+class ImmutableDictMixin:
+    @classmethod
+    def fromkeys(cls, *args, **kwargs): ...
+    def __reduce_ex__(self, protocol): ...
+    def __hash__(self): ...
+    def setdefault(self, key, default=None): ...
+    def update(self, *args, **kwargs): ...
+    def pop(self, key, default=None): ...
+    def popitem(self): ...
+    def __setitem__(self, key, value): ...
+    def __delitem__(self, key): ...
+    def clear(self): ...
+
+class ImmutableMultiDictMixin(ImmutableDictMixin):
+    def __reduce_ex__(self, protocol): ...
+    def add(self, key, value): ...
+    def popitemlist(self): ...
+    def poplist(self, key): ...
+    def setlist(self, key, new_list): ...
+    def setlistdefault(self, key, default_list=None): ...
+
+class UpdateDictMixin:
+    on_update = ...  # type: Any
+    def calls_update(name): ...
+    def setdefault(self, key, default=None): ...
+    def pop(self, key, default=...): ...
+    __setitem__ = ...  # type: Any
+    __delitem__ = ...  # type: Any
+    clear = ...  # type: Any
+    popitem = ...  # type: Any
+    update = ...  # type: Any
+
+class TypeConversionDict(dict):
+    def get(self, key, default=None, type=None): ...
+
+class ImmutableTypeConversionDict(ImmutableDictMixin, TypeConversionDict):
+    def copy(self): ...
+    def __copy__(self): ...
+
+class ViewItems:
+    def __init__(self, multi_dict, method, repr_name, *a, **kw): ...
+    def __iter__(self): ...
+
+class MultiDict(TypeConversionDict):
+    def __init__(self, mapping=None): ...
+    def __getitem__(self, key): ...
+    def __setitem__(self, key, value): ...
+    def add(self, key, value): ...
+    def getlist(self, key, type=None): ...
+    def setlist(self, key, new_list): ...
+    def setdefault(self, key, default=None): ...
+    def setlistdefault(self, key, default_list=None): ...
+    def items(self, multi=False): ...
+    def lists(self): ...
+    def keys(self): ...
+    __iter__ = ...  # type: Any
+    def values(self): ...
+    def listvalues(self): ...
+    def copy(self): ...
+    def deepcopy(self, memo=None): ...
+    def to_dict(self, flat=True): ...
+    def update(self, other_dict): ...
+    def pop(self, key, default=...): ...
+    def popitem(self): ...
+    def poplist(self, key): ...
+    def popitemlist(self): ...
+    def __copy__(self): ...
+    def __deepcopy__(self, memo): ...
+
+class _omd_bucket:
+    prev = ...  # type: Any
+    key = ...  # type: Any
+    value = ...  # type: Any
+    next = ...  # type: Any
+    def __init__(self, omd, key, value): ...
+    def unlink(self, omd): ...
+
+class OrderedMultiDict(MultiDict):
+    def __init__(self, mapping=None): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    def __reduce_ex__(self, protocol): ...
+    def __getitem__(self, key): ...
+    def __setitem__(self, key, value): ...
+    def __delitem__(self, key): ...
+    def keys(self): ...
+    __iter__ = ...  # type: Any
+    def values(self): ...
+    def items(self, multi=False): ...
+    def lists(self): ...
+    def listvalues(self): ...
+    def add(self, key, value): ...
+    def getlist(self, key, type=None): ...
+    def setlist(self, key, new_list): ...
+    def setlistdefault(self, key, default_list=None): ...
+    def update(self, mapping): ...
+    def poplist(self, key): ...
+    def pop(self, key, default=...): ...
+    def popitem(self): ...
+    def popitemlist(self): ...
+
+class Headers(Mapping):
+    def __init__(self, defaults=None): ...
+    def __getitem__(self, key, _get_mode=False): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+    def get(self, key, default=None, type=None, as_bytes=False): ...
+    def getlist(self, key, type=None, as_bytes=False): ...
+    def get_all(self, name): ...
+    def items(self, lower=False): ...
+    def keys(self, lower=False): ...
+    def values(self): ...
+    def extend(self, iterable): ...
+    def __delitem__(self, key): ...
+    def remove(self, key): ...
+    def pop(self, **kwargs): ...
+    def popitem(self): ...
+    def __contains__(self, key): ...
+    has_key = ...  # type: Any
+    def __iter__(self): ...
+    def __len__(self): ...
+    def add(self, _key, _value, **kw): ...
+    def add_header(self, _key, _value, **_kw): ...
+    def clear(self): ...
+    def set(self, _key, _value, **kw): ...
+    def setdefault(self, key, value): ...
+    def __setitem__(self, key, value): ...
+    def to_list(self, charset=''): ...
+    def to_wsgi_list(self): ...
+    def copy(self): ...
+    def __copy__(self): ...
+
+class ImmutableHeadersMixin:
+    def __delitem__(self, key): ...
+    def __setitem__(self, key, value): ...
+    set = ...  # type: Any
+    def add(self, *args, **kwargs): ...
+    remove = ...  # type: Any
+    add_header = ...  # type: Any
+    def extend(self, iterable): ...
+    def insert(self, pos, value): ...
+    def pop(self, **kwargs): ...
+    def popitem(self): ...
+    def setdefault(self, key, default): ...
+
+class EnvironHeaders(ImmutableHeadersMixin, Headers):
+    environ = ...  # type: Any
+    def __init__(self, environ): ...
+    def __eq__(self, other): ...
+    def __getitem__(self, key, _get_mode=False): ...
+    def __len__(self): ...
+    def __iter__(self): ...
+    def copy(self): ...
+
+class CombinedMultiDict(ImmutableMultiDictMixin, MultiDict):
+    def __reduce_ex__(self, protocol): ...
+    dicts = ...  # type: Any
+    def __init__(self, dicts=None): ...
+    @classmethod
+    def fromkeys(cls): ...
+    def __getitem__(self, key): ...
+    def get(self, key, default=None, type=None): ...
+    def getlist(self, key, type=None): ...
+    def keys(self): ...
+    __iter__ = ...  # type: Any
+    def items(self, multi=False): ...
+    def values(self): ...
+    def lists(self): ...
+    def listvalues(self): ...
+    def copy(self): ...
+    def to_dict(self, flat=True): ...
+    def __len__(self): ...
+    def __contains__(self, key): ...
+    has_key = ...  # type: Any
+
+class FileMultiDict(MultiDict):
+    def add_file(self, name, file, filename=None, content_type=None): ...
+
+class ImmutableDict(ImmutableDictMixin, dict):
+    def copy(self): ...
+    def __copy__(self): ...
+
+class ImmutableMultiDict(ImmutableMultiDictMixin, MultiDict):
+    def copy(self): ...
+    def __copy__(self): ...
+
+class ImmutableOrderedMultiDict(ImmutableMultiDictMixin, OrderedMultiDict):
+    def copy(self): ...
+    def __copy__(self): ...
+
+class Accept(ImmutableList):
+    provided = ...  # type: Any
+    def __init__(self, values=...): ...
+    def __getitem__(self, key): ...
+    def quality(self, key): ...
+    def __contains__(self, value): ...
+    def index(self, key): ...
+    def find(self, key): ...
+    def values(self): ...
+    def to_header(self): ...
+    def best_match(self, matches, default=None): ...
+    @property
+    def best(self): ...
+
+class MIMEAccept(Accept):
+    @property
+    def accept_html(self): ...
+    @property
+    def accept_xhtml(self): ...
+    @property
+    def accept_json(self): ...
+
+class LanguageAccept(Accept): ...
+class CharsetAccept(Accept): ...
+
+def cache_property(key, empty, type): ...
+
+class _CacheControl(UpdateDictMixin, dict):
+    no_cache = ...  # type: Any
+    no_store = ...  # type: Any
+    max_age = ...  # type: Any
+    no_transform = ...  # type: Any
+    on_update = ...  # type: Any
+    provided = ...  # type: Any
+    def __init__(self, values=..., on_update=None): ...
+    def to_header(self): ...
+
+class RequestCacheControl(ImmutableDictMixin, _CacheControl):
+    max_stale = ...  # type: Any
+    min_fresh = ...  # type: Any
+    no_transform = ...  # type: Any
+    only_if_cached = ...  # type: Any
+
+class ResponseCacheControl(_CacheControl):
+    public = ...  # type: Any
+    private = ...  # type: Any
+    must_revalidate = ...  # type: Any
+    proxy_revalidate = ...  # type: Any
+    s_maxage = ...  # type: Any
+
+class CallbackDict(UpdateDictMixin, dict):
+    on_update = ...  # type: Any
+    def __init__(self, initial=None, on_update=None): ...
+
+class HeaderSet(MutableSet):
+    on_update = ...  # type: Any
+    def __init__(self, headers=None, on_update=None): ...
+    def add(self, header): ...
+    def remove(self, header): ...
+    def update(self, iterable): ...
+    def discard(self, header): ...
+    def find(self, header): ...
+    def index(self, header): ...
+    def clear(self): ...
+    def as_set(self, preserve_casing=False): ...
+    def to_header(self): ...
+    def __getitem__(self, idx): ...
+    def __delitem__(self, idx): ...
+    def __setitem__(self, idx, value): ...
+    def __contains__(self, header): ...
+    def __len__(self): ...
+    def __iter__(self): ...
+    def __nonzero__(self): ...
+
+class ETags(Container, Iterable):
+    star_tag = ...  # type: Any
+    def __init__(self, strong_etags=None, weak_etags=None, star_tag=False): ...
+    def as_set(self, include_weak=False): ...
+    def is_weak(self, etag): ...
+    def contains_weak(self, etag): ...
+    def contains(self, etag): ...
+    def contains_raw(self, etag): ...
+    def to_header(self): ...
+    def __call__(self, etag=None, data=None, include_weak=False): ...
+    def __bool__(self): ...
+    __nonzero__ = ...  # type: Any
+    def __iter__(self): ...
+    def __contains__(self, etag): ...
+
+class IfRange:
+    etag = ...  # type: Any
+    date = ...  # type: Any
+    def __init__(self, etag=None, date=None): ...
+    def to_header(self): ...
+
+class Range:
+    units = ...  # type: Any
+    ranges = ...  # type: Any
+    def __init__(self, units, ranges): ...
+    def range_for_length(self, length): ...
+    def make_content_range(self, length): ...
+    def to_header(self): ...
+    def to_content_range_header(self, length): ...
+
+class ContentRange:
+    on_update = ...  # type: Any
+    def __init__(self, units, start, stop, length=None, on_update=None): ...
+    units = ...  # type: Any
+    start = ...  # type: Any
+    stop = ...  # type: Any
+    length = ...  # type: Any
+    def set(self, start, stop, length=None, units=''): ...
+    def unset(self): ...
+    def to_header(self): ...
+    def __nonzero__(self): ...
+    __bool__ = ...  # type: Any
+
+class Authorization(ImmutableDictMixin, dict):
+    type = ...  # type: Any
+    def __init__(self, auth_type, data=None): ...
+    username = ...  # type: Any
+    password = ...  # type: Any
+    realm = ...  # type: Any
+    nonce = ...  # type: Any
+    uri = ...  # type: Any
+    nc = ...  # type: Any
+    cnonce = ...  # type: Any
+    response = ...  # type: Any
+    opaque = ...  # type: Any
+    @property
+    def qop(self): ...
+
+class WWWAuthenticate(UpdateDictMixin, dict):
+    on_update = ...  # type: Any
+    def __init__(self, auth_type=None, values=None, on_update=None): ...
+    def set_basic(self, realm=''): ...
+    def set_digest(self, realm, nonce, qop=..., opaque=None, algorithm=None, stale=False): ...
+    def to_header(self): ...
+    @staticmethod
+    def auth_property(name, doc=None): ...
+    type = ...  # type: Any
+    realm = ...  # type: Any
+    domain = ...  # type: Any
+    nonce = ...  # type: Any
+    opaque = ...  # type: Any
+    algorithm = ...  # type: Any
+    qop = ...  # type: Any
+    stale = ...  # type: Any
+
+class FileStorage:
+    name = ...  # type: Any
+    stream = ...  # type: Any
+    filename = ...  # type: Any
+    headers = ...  # type: Any
+    def __init__(self, stream=None, filename=None, name=None, content_type=None, content_length=None, headers=None): ...
+    @property
+    def content_type(self): ...
+    @property
+    def content_length(self): ...
+    @property
+    def mimetype(self): ...
+    @property
+    def mimetype_params(self): ...
+    def save(self, dst, buffer_size=16384): ...
+    def close(self): ...
+    def __nonzero__(self): ...
+    __bool__ = ...  # type: Any
+    def __getattr__(self, name): ...
+    def __iter__(self): ...
diff --git a/typeshed/third_party/3/werkzeug/debug/__init__.pyi b/typeshed/third_party/3/werkzeug/debug/__init__.pyi
new file mode 100644
index 0000000..e02bc3c
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/debug/__init__.pyi
@@ -0,0 +1,43 @@
+# Stubs for werkzeug.debug (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response
+
+PIN_TIME = ...  # type: Any
+
+def hash_pin(pin): ...
+def get_machine_id(): ...
+
+class _ConsoleFrame:
+    console = ...  # type: Any
+    id = ...  # type: Any
+    def __init__(self, namespace): ...
+
+def get_pin_and_cookie_name(app): ...
+
+class DebuggedApplication:
+    app = ...  # type: Any
+    evalex = ...  # type: Any
+    frames = ...  # type: Any
+    tracebacks = ...  # type: Any
+    request_key = ...  # type: Any
+    console_path = ...  # type: Any
+    console_init_func = ...  # type: Any
+    show_hidden_frames = ...  # type: Any
+    secret = ...  # type: Any
+    pin_logging = ...  # type: Any
+    pin = ...  # type: Any
+    def __init__(self, app, evalex=False, request_key='', console_path='', console_init_func=None, show_hidden_frames=False, lodgeit_url=None, pin_security=True, pin_logging=True): ...
+    @property
+    def pin_cookie_name(self): ...
+    def debug_application(self, environ, start_response): ...
+    def execute_command(self, request, command, frame): ...
+    def display_console(self, request): ...
+    def paste_traceback(self, request, traceback): ...
+    def get_resource(self, request, filename): ...
+    def check_pin_trust(self, environ): ...
+    def pin_auth(self, request): ...
+    def log_pin_request(self): ...
+    def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/3/werkzeug/debug/console.pyi b/typeshed/third_party/3/werkzeug/debug/console.pyi
new file mode 100644
index 0000000..9fdf0b5
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/debug/console.pyi
@@ -0,0 +1,48 @@
+# Stubs for werkzeug.debug.console (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import code
+
+class HTMLStringO:
+    def __init__(self): ...
+    def isatty(self): ...
+    def close(self): ...
+    def flush(self): ...
+    def seek(self, n, mode=0): ...
+    def readline(self): ...
+    def reset(self): ...
+    def write(self, x): ...
+    def writelines(self, x): ...
+
+class ThreadedStream:
+    @staticmethod
+    def push(): ...
+    @staticmethod
+    def fetch(): ...
+    @staticmethod
+    def displayhook(obj): ...
+    def __setattr__(self, name, value): ...
+    def __dir__(self): ...
+    def __getattribute__(self, name): ...
+
+class _ConsoleLoader:
+    def __init__(self): ...
+    def register(self, code, source): ...
+    def get_source_by_code(self, code): ...
+
+class _InteractiveConsole(code.InteractiveInterpreter):
+    globals = ...  # type: Any
+    more = ...  # type: Any
+    buffer = ...  # type: Any
+    def __init__(self, globals, locals): ...
+    def runsource(self, source): ...
+    def runcode(self, code): ...
+    def showtraceback(self): ...
+    def showsyntaxerror(self, filename=None): ...
+    def write(self, data): ...
+
+class Console:
+    def __init__(self, globals=None, locals=None): ...
+    def eval(self, code): ...
diff --git a/typeshed/third_party/3/werkzeug/debug/repr.pyi b/typeshed/third_party/3/werkzeug/debug/repr.pyi
new file mode 100644
index 0000000..063c421
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/debug/repr.pyi
@@ -0,0 +1,37 @@
+# Stubs for werkzeug.debug.repr (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+deque = ...  # type: Any
+missing = ...  # type: Any
+RegexType = ...  # type: Any
+HELP_HTML = ...  # type: Any
+OBJECT_DUMP_HTML = ...  # type: Any
+
+def debug_repr(obj): ...
+def dump(obj=...): ...
+
+class _Helper:
+    def __call__(self, topic=None): ...
+
+helper = ...  # type: Any
+
+class DebugReprGenerator:
+    def __init__(self): ...
+    list_repr = ...  # type: Any
+    tuple_repr = ...  # type: Any
+    set_repr = ...  # type: Any
+    frozenset_repr = ...  # type: Any
+    deque_repr = ...  # type: Any
+    def regex_repr(self, obj): ...
+    def string_repr(self, obj, limit=70): ...
+    def dict_repr(self, d, recursive, limit=5): ...
+    def object_repr(self, obj): ...
+    def dispatch_repr(self, obj, recursive): ...
+    def fallback_repr(self): ...
+    def repr(self, obj): ...
+    def dump_object(self, obj): ...
+    def dump_locals(self, d): ...
+    def render_object_dump(self, items, title, repr=None): ...
diff --git a/typeshed/third_party/3/werkzeug/debug/tbtools.pyi b/typeshed/third_party/3/werkzeug/debug/tbtools.pyi
new file mode 100644
index 0000000..1107c62
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/debug/tbtools.pyi
@@ -0,0 +1,67 @@
+# Stubs for werkzeug.debug.tbtools (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+UTF8_COOKIE = ...  # type: Any
+system_exceptions = ...  # type: Any
+HEADER = ...  # type: Any
+FOOTER = ...  # type: Any
+PAGE_HTML = ...  # type: Any
+CONSOLE_HTML = ...  # type: Any
+SUMMARY_HTML = ...  # type: Any
+FRAME_HTML = ...  # type: Any
+SOURCE_LINE_HTML = ...  # type: Any
+
+def render_console_html(secret, evalex_trusted=True): ...
+def get_current_traceback(ignore_system_exceptions=False, show_hidden_frames=False, skip=0): ...
+
+class Line:
+    lineno = ...  # type: Any
+    code = ...  # type: Any
+    in_frame = ...  # type: Any
+    current = ...  # type: Any
+    def __init__(self, lineno, code): ...
+    def classes(self): ...
+    def render(self): ...
+
+class Traceback:
+    exc_type = ...  # type: Any
+    exc_value = ...  # type: Any
+    exception_type = ...  # type: Any
+    frames = ...  # type: Any
+    def __init__(self, exc_type, exc_value, tb): ...
+    def filter_hidden_frames(self): ...
+    def is_syntax_error(self): ...
+    def exception(self): ...
+    def log(self, logfile=None): ...
+    def paste(self): ...
+    def render_summary(self, include_title=True): ...
+    def render_full(self, evalex=False, secret=None, evalex_trusted=True): ...
+    def generate_plaintext_traceback(self): ...
+    def plaintext(self): ...
+    id = ...  # type: Any
+
+class Frame:
+    lineno = ...  # type: Any
+    function_name = ...  # type: Any
+    locals = ...  # type: Any
+    globals = ...  # type: Any
+    filename = ...  # type: Any
+    module = ...  # type: Any
+    loader = ...  # type: Any
+    code = ...  # type: Any
+    hide = ...  # type: Any
+    info = ...  # type: Any
+    def __init__(self, exc_type, exc_value, tb): ...
+    def render(self): ...
+    def render_line_context(self): ...
+    def get_annotated_lines(self): ...
+    def eval(self, code, mode=''): ...
+    def sourcelines(self): ...
+    def get_context_lines(self, context=5): ...
+    @property
+    def current_line(self): ...
+    def console(self): ...
+    id = ...  # type: Any
diff --git a/typeshed/third_party/3/werkzeug/exceptions.pyi b/typeshed/third_party/3/werkzeug/exceptions.pyi
new file mode 100644
index 0000000..7e71597
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/exceptions.pyi
@@ -0,0 +1,152 @@
+# Stubs for werkzeug.exceptions (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class HTTPException(Exception):
+    code = ...  # type: Any
+    description = ...  # type: Any
+    response = ...  # type: Any
+    def __init__(self, description=None, response=None): ...
+    @classmethod
+    def wrap(cls, exception, name=None): ...
+    @property
+    def name(self): ...
+    def get_description(self, environ=None): ...
+    def get_body(self, environ=None): ...
+    def get_headers(self, environ=None): ...
+    def get_response(self, environ=None): ...
+    def __call__(self, environ, start_response): ...
+
+class BadRequest(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class ClientDisconnected(BadRequest): ...
+class SecurityError(BadRequest): ...
+class BadHost(BadRequest): ...
+
+class Unauthorized(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class Forbidden(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class NotFound(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class MethodNotAllowed(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+    valid_methods = ...  # type: Any
+    def __init__(self, valid_methods=None, description=None): ...
+    def get_headers(self, environ): ...
+
+class NotAcceptable(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class RequestTimeout(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class Conflict(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class Gone(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class LengthRequired(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class PreconditionFailed(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class RequestEntityTooLarge(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class RequestURITooLarge(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class UnsupportedMediaType(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class RequestedRangeNotSatisfiable(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+    length = ...  # type: Any
+    units = ...  # type: Any
+    def __init__(self, length=None, units='', description=None): ...
+    def get_headers(self, environ): ...
+
+class ExpectationFailed(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class ImATeapot(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class UnprocessableEntity(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class Locked(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class PreconditionRequired(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class TooManyRequests(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class RequestHeaderFieldsTooLarge(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class UnavailableForLegalReasons(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class InternalServerError(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class NotImplemented(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class BadGateway(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class ServiceUnavailable(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class GatewayTimeout(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class HTTPVersionNotSupported(HTTPException):
+    code = ...  # type: Any
+    description = ...  # type: Any
+
+class Aborter:
+    mapping = ...  # type: Any
+    def __init__(self, mapping=None, extra=None): ...
+    def __call__(self, code, *args, **kwargs): ...
diff --git a/typeshed/third_party/3/werkzeug/filesystem.pyi b/typeshed/third_party/3/werkzeug/filesystem.pyi
new file mode 100644
index 0000000..5ebc566
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/filesystem.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.filesystem (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+has_likely_buggy_unicode_filesystem = ...  # type: Any
+
+class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning): ...
+
+def get_filesystem_encoding(): ...
diff --git a/typeshed/third_party/3/werkzeug/formparser.pyi b/typeshed/third_party/3/werkzeug/formparser.pyi
new file mode 100644
index 0000000..1b63dca
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/formparser.pyi
@@ -0,0 +1,44 @@
+# Stubs for werkzeug.formparser (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def default_stream_factory(total_content_length, filename, content_type, content_length=None): ...
+def parse_form_data(environ, stream_factory=None, charset='', errors='', max_form_memory_size=None, max_content_length=None, cls=None, silent=True): ...
+def exhaust_stream(f): ...
+
+class FormDataParser:
+    stream_factory = ...  # type: Any
+    charset = ...  # type: Any
+    errors = ...  # type: Any
+    max_form_memory_size = ...  # type: Any
+    max_content_length = ...  # type: Any
+    cls = ...  # type: Any
+    silent = ...  # type: Any
+    def __init__(self, stream_factory=None, charset='', errors='', max_form_memory_size=None, max_content_length=None, cls=None, silent=True): ...
+    def get_parse_func(self, mimetype, options): ...
+    def parse_from_environ(self, environ): ...
+    def parse(self, stream, mimetype, content_length, options=None): ...
+    parse_functions = ...  # type: Any
+
+def is_valid_multipart_boundary(boundary): ...
+def parse_multipart_headers(iterable): ...
+
+class MultiPartParser:
+    charset = ...  # type: Any
+    errors = ...  # type: Any
+    max_form_memory_size = ...  # type: Any
+    stream_factory = ...  # type: Any
+    cls = ...  # type: Any
+    buffer_size = ...  # type: Any
+    def __init__(self, stream_factory=None, charset='', errors='', max_form_memory_size=None, cls=None, buffer_size=...): ...
+    def fail(self, message): ...
+    def get_part_encoding(self, headers): ...
+    def get_part_charset(self, headers): ...
+    def start_file_streaming(self, filename, headers, total_content_length): ...
+    def in_memory_threshold_reached(self, bytes): ...
+    def validate_boundary(self, boundary): ...
+    def parse_lines(self, file, boundary, content_length, cap_at_buffer=True): ...
+    def parse_parts(self, file, boundary, content_length): ...
+    def parse(self, file, boundary, content_length): ...
diff --git a/typeshed/third_party/3/werkzeug/http.pyi b/typeshed/third_party/3/werkzeug/http.pyi
new file mode 100644
index 0000000..61202ea
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/http.pyi
@@ -0,0 +1,42 @@
+# Stubs for werkzeug.http (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from urllib.request import parse_http_list as _parse_list_header
+from urllib.parse import unquote_to_bytes as _unquote
+
+HTTP_STATUS_CODES = ...  # type: Any
+
+def wsgi_to_bytes(data): ...
+def bytes_to_wsgi(data): ...
+def quote_header_value(value, extra_chars='', allow_token=True): ...
+def unquote_header_value(value, is_filename=False): ...
+def dump_options_header(header, options): ...
+def dump_header(iterable, allow_token=True): ...
+def parse_list_header(value): ...
+def parse_dict_header(value, cls=...): ...
+def parse_options_header(value, multiple=False): ...
+def parse_accept_header(value, cls=None): ...
+def parse_cache_control_header(value, on_update=None, cls=None): ...
+def parse_set_header(value, on_update=None): ...
+def parse_authorization_header(value): ...
+def parse_www_authenticate_header(value, on_update=None): ...
+def parse_if_range_header(value): ...
+def parse_range_header(value, make_inclusive=True): ...
+def parse_content_range_header(value, on_update=None): ...
+def quote_etag(etag, weak=False): ...
+def unquote_etag(etag): ...
+def parse_etags(value): ...
+def generate_etag(data): ...
+def parse_date(value): ...
+def cookie_date(expires=None): ...
+def http_date(timestamp=None): ...
+def is_resource_modified(environ, etag=None, data=None, last_modified=None, ignore_if_range=True): ...
+def remove_entity_headers(headers, allowed=...): ...
+def remove_hop_by_hop_headers(headers): ...
+def is_entity_header(header): ...
+def is_hop_by_hop_header(header): ...
+def parse_cookie(header, charset='', errors='', cls=None): ...
+def dump_cookie(key, value='', max_age=None, expires=None, path='', domain=None, secure=False, httponly=False, charset='', sync_expires=True): ...
+def is_byte_range_valid(start, stop, length): ...
diff --git a/typeshed/third_party/3/werkzeug/local.pyi b/typeshed/third_party/3/werkzeug/local.pyi
new file mode 100644
index 0000000..1ed3102
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/local.pyi
@@ -0,0 +1,104 @@
+# Stubs for werkzeug.local (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def release_local(local): ...
+
+class Local:
+    def __init__(self): ...
+    def __iter__(self): ...
+    def __call__(self, proxy): ...
+    def __release_local__(self): ...
+    def __getattr__(self, name): ...
+    def __setattr__(self, name, value): ...
+    def __delattr__(self, name): ...
+
+class LocalStack:
+    def __init__(self): ...
+    def __release_local__(self): ...
+    def _get__ident_func__(self): ...
+    def _set__ident_func__(self, value): ...
+    __ident_func__ = ...  # type: Any
+    def __call__(self): ...
+    def push(self, obj): ...
+    def pop(self): ...
+    @property
+    def top(self): ...
+
+class LocalManager:
+    locals = ...  # type: Any
+    ident_func = ...  # type: Any
+    def __init__(self, locals=None, ident_func=None): ...
+    def get_ident(self): ...
+    def cleanup(self): ...
+    def make_middleware(self, app): ...
+    def middleware(self, func): ...
+
+class LocalProxy:
+    def __init__(self, local, name=None): ...
+    @property
+    def __dict__(self): ...
+    def __bool__(self): ...
+    def __unicode__(self): ...
+    def __dir__(self): ...
+    def __getattr__(self, name): ...
+    def __setitem__(self, key, value): ...
+    def __delitem__(self, key): ...
+    __getslice__ = ...  # type: Any
+    def __setslice__(self, i, j, seq): ...
+    def __delslice__(self, i, j): ...
+    __setattr__ = ...  # type: Any
+    __delattr__ = ...  # type: Any
+    __lt__ = ...  # type: Any
+    __le__ = ...  # type: Any
+    __eq__ = ...  # type: Any
+    __ne__ = ...  # type: Any
+    __gt__ = ...  # type: Any
+    __ge__ = ...  # type: Any
+    __cmp__ = ...  # type: Any
+    __hash__ = ...  # type: Any
+    __call__ = ...  # type: Any
+    __len__ = ...  # type: Any
+    __getitem__ = ...  # type: Any
+    __iter__ = ...  # type: Any
+    __contains__ = ...  # type: Any
+    __add__ = ...  # type: Any
+    __sub__ = ...  # type: Any
+    __mul__ = ...  # type: Any
+    __floordiv__ = ...  # type: Any
+    __mod__ = ...  # type: Any
+    __divmod__ = ...  # type: Any
+    __pow__ = ...  # type: Any
+    __lshift__ = ...  # type: Any
+    __rshift__ = ...  # type: Any
+    __and__ = ...  # type: Any
+    __xor__ = ...  # type: Any
+    __or__ = ...  # type: Any
+    __div__ = ...  # type: Any
+    __truediv__ = ...  # type: Any
+    __neg__ = ...  # type: Any
+    __pos__ = ...  # type: Any
+    __abs__ = ...  # type: Any
+    __invert__ = ...  # type: Any
+    __complex__ = ...  # type: Any
+    __int__ = ...  # type: Any
+    __long__ = ...  # type: Any
+    __float__ = ...  # type: Any
+    __oct__ = ...  # type: Any
+    __hex__ = ...  # type: Any
+    __index__ = ...  # type: Any
+    __coerce__ = ...  # type: Any
+    __enter__ = ...  # type: Any
+    __exit__ = ...  # type: Any
+    __radd__ = ...  # type: Any
+    __rsub__ = ...  # type: Any
+    __rmul__ = ...  # type: Any
+    __rdiv__ = ...  # type: Any
+    __rtruediv__ = ...  # type: Any
+    __rfloordiv__ = ...  # type: Any
+    __rmod__ = ...  # type: Any
+    __rdivmod__ = ...  # type: Any
+    __copy__ = ...  # type: Any
+    __deepcopy__ = ...  # type: Any
diff --git a/typeshed/third_party/3/werkzeug/posixemulation.pyi b/typeshed/third_party/3/werkzeug/posixemulation.pyi
new file mode 100644
index 0000000..a2838fc
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/posixemulation.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.posixemulation (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from ._compat import to_unicode as to_unicode
+from .filesystem import get_filesystem_encoding as get_filesystem_encoding
+
+can_rename_open_file = ...  # type: Any
+
+def rename(src, dst): ...
diff --git a/typeshed/third_party/3/werkzeug/routing.pyi b/typeshed/third_party/3/werkzeug/routing.pyi
new file mode 100644
index 0000000..ff0bbda
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/routing.pyi
@@ -0,0 +1,182 @@
+# Stubs for werkzeug.routing (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.exceptions import HTTPException
+
+def parse_converter_args(argstr): ...
+def parse_rule(rule): ...
+
+class RoutingException(Exception): ...
+
+class RequestRedirect(HTTPException, RoutingException):
+    code = ...  # type: Any
+    new_url = ...  # type: Any
+    def __init__(self, new_url): ...
+    def get_response(self, environ): ...
+
+class RequestSlash(RoutingException): ...
+
+class RequestAliasRedirect(RoutingException):
+    matched_values = ...  # type: Any
+    def __init__(self, matched_values): ...
+
+class BuildError(RoutingException, LookupError):
+    endpoint = ...  # type: Any
+    values = ...  # type: Any
+    method = ...  # type: Any
+    adapter = ...  # type: Any
+    def __init__(self, endpoint, values, method, adapter=None): ...
+    def suggested(self): ...
+    def closest_rule(self, adapter): ...
+
+class ValidationError(ValueError): ...
+
+class RuleFactory:
+    def get_rules(self, map): ...
+
+class Subdomain(RuleFactory):
+    subdomain = ...  # type: Any
+    rules = ...  # type: Any
+    def __init__(self, subdomain, rules): ...
+    def get_rules(self, map): ...
+
+class Submount(RuleFactory):
+    path = ...  # type: Any
+    rules = ...  # type: Any
+    def __init__(self, path, rules): ...
+    def get_rules(self, map): ...
+
+class EndpointPrefix(RuleFactory):
+    prefix = ...  # type: Any
+    rules = ...  # type: Any
+    def __init__(self, prefix, rules): ...
+    def get_rules(self, map): ...
+
+class RuleTemplate:
+    rules = ...  # type: Any
+    def __init__(self, rules): ...
+    def __call__(self, *args, **kwargs): ...
+
+class RuleTemplateFactory(RuleFactory):
+    rules = ...  # type: Any
+    context = ...  # type: Any
+    def __init__(self, rules, context): ...
+    def get_rules(self, map): ...
+
+class Rule(RuleFactory):
+    rule = ...  # type: Any
+    is_leaf = ...  # type: Any
+    map = ...  # type: Any
+    strict_slashes = ...  # type: Any
+    subdomain = ...  # type: Any
+    host = ...  # type: Any
+    defaults = ...  # type: Any
+    build_only = ...  # type: Any
+    alias = ...  # type: Any
+    methods = ...  # type: Any
+    endpoint = ...  # type: Any
+    redirect_to = ...  # type: Any
+    arguments = ...  # type: Any
+    def __init__(self, string, defaults=None, subdomain=None, methods=None, build_only=False, endpoint=None, strict_slashes=None, redirect_to=None, alias=False, host=None): ...
+    def empty(self): ...
+    def get_empty_kwargs(self): ...
+    def get_rules(self, map): ...
+    def refresh(self): ...
+    def bind(self, map, rebind=False): ...
+    def get_converter(self, variable_name, converter_name, args, kwargs): ...
+    def compile(self): ...
+    def match(self, path, method=None): ...
+    def build(self, values, append_unknown=True): ...
+    def provides_defaults_for(self, rule): ...
+    def suitable_for(self, values, method=None): ...
+    def match_compare_key(self): ...
+    def build_compare_key(self): ...
+    def __eq__(self, other): ...
+    def __ne__(self, other): ...
+
+class BaseConverter:
+    regex = ...  # type: Any
+    weight = ...  # type: Any
+    map = ...  # type: Any
+    def __init__(self, map): ...
+    def to_python(self, value): ...
+    def to_url(self, value): ...
+
+class UnicodeConverter(BaseConverter):
+    regex = ...  # type: Any
+    def __init__(self, map, minlength=1, maxlength=None, length=None): ...
+
+class AnyConverter(BaseConverter):
+    regex = ...  # type: Any
+    def __init__(self, map, *items): ...
+
+class PathConverter(BaseConverter):
+    regex = ...  # type: Any
+    weight = ...  # type: Any
+
+class NumberConverter(BaseConverter):
+    weight = ...  # type: Any
+    fixed_digits = ...  # type: Any
+    min = ...  # type: Any
+    max = ...  # type: Any
+    def __init__(self, map, fixed_digits=0, min=None, max=None): ...
+    def to_python(self, value): ...
+    def to_url(self, value): ...
+
+class IntegerConverter(NumberConverter):
+    regex = ...  # type: Any
+    num_convert = ...  # type: Any
+
+class FloatConverter(NumberConverter):
+    regex = ...  # type: Any
+    num_convert = ...  # type: Any
+    def __init__(self, map, min=None, max=None): ...
+
+class UUIDConverter(BaseConverter):
+    regex = ...  # type: Any
+    def to_python(self, value): ...
+    def to_url(self, value): ...
+
+DEFAULT_CONVERTERS = ...  # type: Any
+
+class Map:
+    default_converters = ...  # type: Any
+    default_subdomain = ...  # type: Any
+    charset = ...  # type: Any
+    encoding_errors = ...  # type: Any
+    strict_slashes = ...  # type: Any
+    redirect_defaults = ...  # type: Any
+    host_matching = ...  # type: Any
+    converters = ...  # type: Any
+    sort_parameters = ...  # type: Any
+    sort_key = ...  # type: Any
+    def __init__(self, rules=None, default_subdomain='', charset='', strict_slashes=True, redirect_defaults=True, converters=None, sort_parameters=False, sort_key=None, encoding_errors='', host_matching=False): ...
+    def is_endpoint_expecting(self, endpoint, *arguments): ...
+    def iter_rules(self, endpoint=None): ...
+    def add(self, rulefactory): ...
+    def bind(self, server_name, script_name=None, subdomain=None, url_scheme='', default_method='', path_info=None, query_args=None): ...
+    def bind_to_environ(self, environ, server_name=None, subdomain=None): ...
+    def update(self): ...
+
+class MapAdapter:
+    map = ...  # type: Any
+    server_name = ...  # type: Any
+    script_name = ...  # type: Any
+    subdomain = ...  # type: Any
+    url_scheme = ...  # type: Any
+    path_info = ...  # type: Any
+    default_method = ...  # type: Any
+    query_args = ...  # type: Any
+    def __init__(self, map, server_name, script_name, subdomain, url_scheme, path_info, default_method, query_args=None): ...
+    def dispatch(self, view_func, path_info=None, method=None, catch_http_exceptions=False): ...
+    def match(self, path_info=None, method=None, return_rule=False, query_args=None): ...
+    def test(self, path_info=None, method=None): ...
+    def allowed_methods(self, path_info=None): ...
+    def get_host(self, domain_part): ...
+    def get_default_redirect(self, rule, method, values, query_args): ...
+    def encode_query_args(self, query_args): ...
+    def make_redirect_url(self, path_info, query_args=None, domain_part=None): ...
+    def make_alias_redirect_url(self, path, endpoint, values, method, query_args): ...
+    def build(self, endpoint, values=None, method=None, force_external=False, append_unknown=True): ...
diff --git a/typeshed/third_party/3/werkzeug/script.pyi b/typeshed/third_party/3/werkzeug/script.pyi
new file mode 100644
index 0000000..a01ffde
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/script.pyi
@@ -0,0 +1,16 @@
+# Stubs for werkzeug.script (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+argument_types = ...  # type: Any
+converters = ...  # type: Any
+
+def run(namespace=None, action_prefix='', args=None): ...
+def fail(message, code=-1): ...
+def find_actions(namespace, action_prefix): ...
+def print_usage(actions): ...
+def analyse_action(func): ...
+def make_shell(init_func=None, banner=None, use_ipython=True): ...
+def make_runserver(app_factory, hostname='', port=5000, use_reloader=False, use_debugger=False, use_evalex=True, threaded=False, processes=1, static_files=None, extra_files=None, ssl_context=None): ...
diff --git a/typeshed/third_party/3/werkzeug/security.pyi b/typeshed/third_party/3/werkzeug/security.pyi
new file mode 100644
index 0000000..b28d68a
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/security.pyi
@@ -0,0 +1,16 @@
+# Stubs for werkzeug.security (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+SALT_CHARS = ...  # type: Any
+DEFAULT_PBKDF2_ITERATIONS = ...  # type: Any
+
+def pbkdf2_hex(data, salt, iterations=..., keylen=None, hashfunc=None): ...
+def pbkdf2_bin(data, salt, iterations=..., keylen=None, hashfunc=None): ...
+def safe_str_cmp(a, b): ...
+def gen_salt(length): ...
+def generate_password_hash(password, method='', salt_length=8): ...
+def check_password_hash(pwhash, password): ...
+def safe_join(directory, filename): ...
diff --git a/typeshed/third_party/3/werkzeug/serving.pyi b/typeshed/third_party/3/werkzeug/serving.pyi
new file mode 100644
index 0000000..db347d2
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/serving.pyi
@@ -0,0 +1,84 @@
+# Stubs for werkzeug.serving (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from socketserver import ThreadingMixIn, ForkingMixIn
+from http.server import HTTPServer, BaseHTTPRequestHandler
+
+class _SslDummy:
+    def __getattr__(self, name): ...
+
+ssl = ...  # type: Any
+LISTEN_QUEUE = ...  # type: Any
+can_open_by_fd = ...  # type: Any
+
+class WSGIRequestHandler(BaseHTTPRequestHandler):
+    @property
+    def server_version(self): ...
+    def make_environ(self): ...
+    environ = ...  # type: Any
+    close_connection = ...  # type: Any
+    def run_wsgi(self): ...
+    def handle(self): ...
+    def initiate_shutdown(self): ...
+    def connection_dropped(self, error, environ=None): ...
+    raw_requestline = ...  # type: Any
+    def handle_one_request(self): ...
+    def send_response(self, code, message=None): ...
+    def version_string(self): ...
+    def address_string(self): ...
+    def port_integer(self): ...
+    def log_request(self, code='', size=''): ...
+    def log_error(self, *args): ...
+    def log_message(self, format, *args): ...
+    def log(self, type, message, *args): ...
+
+BaseRequestHandler = ...  # type: Any
+
+def generate_adhoc_ssl_pair(cn=None): ...
+def make_ssl_devcert(base_path, host=None, cn=None): ...
+def generate_adhoc_ssl_context(): ...
+def load_ssl_context(cert_file, pkey_file=None, protocol=None): ...
+
+class _SSLContext:
+    def __init__(self, protocol): ...
+    def load_cert_chain(self, certfile, keyfile=None, password=None): ...
+    def wrap_socket(self, sock, **kwargs): ...
+
+def is_ssl_error(error=None): ...
+def select_ip_version(host, port): ...
+
+class BaseWSGIServer(HTTPServer):
+    multithread = ...  # type: Any
+    multiprocess = ...  # type: Any
+    request_queue_size = ...  # type: Any
+    address_family = ...  # type: Any
+    app = ...  # type: Any
+    passthrough_errors = ...  # type: Any
+    shutdown_signal = ...  # type: Any
+    host = ...  # type: Any
+    port = ...  # type: Any
+    socket = ...  # type: Any
+    server_address = ...  # type: Any
+    ssl_context = ...  # type: Any
+    def __init__(self, host, port, app, handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+    def log(self, type, message, *args): ...
+    def serve_forever(self): ...
+    def handle_error(self, request, client_address): ...
+    def get_request(self): ...
+
+class ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer):
+    multithread = ...  # type: Any
+    daemon_threads = ...  # type: Any
+
+class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer):
+    multiprocess = ...  # type: Any
+    max_children = ...  # type: Any
+    def __init__(self, host, port, app, processes=40, handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+
+def make_server(host=None, port=None, app=None, threaded=False, processes=1, request_handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+def is_running_from_reloader(): ...
+def run_simple(hostname, port, application, use_reloader=False, use_debugger=False, use_evalex=True, extra_files=None, reloader_interval=1, reloader_type='', threaded=False, processes=1, request_handler=None, static_files=None, passthrough_errors=False, ssl_context=None): ...
+def run_with_reloader(*args, **kwargs): ...
+def main(): ...
diff --git a/typeshed/third_party/3/werkzeug/test.pyi b/typeshed/third_party/3/werkzeug/test.pyi
new file mode 100644
index 0000000..1def658
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/test.pyi
@@ -0,0 +1,85 @@
+# Stubs for werkzeug.test (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from urllib.request import Request as U2Request
+from http.cookiejar import CookieJar
+
+def stream_encode_multipart(values, use_tempfile=True, threshold=..., boundary=None, charset=''): ...
+def encode_multipart(values, boundary=None, charset=''): ...
+def File(fd, filename=None, mimetype=None): ...
+
+class _TestCookieHeaders:
+    headers = ...  # type: Any
+    def __init__(self, headers): ...
+    def getheaders(self, name): ...
+    def get_all(self, name, default=None): ...
+
+class _TestCookieResponse:
+    headers = ...  # type: Any
+    def __init__(self, headers): ...
+    def info(self): ...
+
+class _TestCookieJar(CookieJar):
+    def inject_wsgi(self, environ): ...
+    def extract_wsgi(self, environ, headers): ...
+
+class EnvironBuilder:
+    server_protocol = ...  # type: Any
+    wsgi_version = ...  # type: Any
+    request_class = ...  # type: Any
+    charset = ...  # type: Any
+    path = ...  # type: Any
+    base_url = ...  # type: Any
+    query_string = ...  # type: Any
+    args = ...  # type: Any
+    method = ...  # type: Any
+    headers = ...  # type: Any
+    content_type = ...  # type: Any
+    errors_stream = ...  # type: Any
+    multithread = ...  # type: Any
+    multiprocess = ...  # type: Any
+    run_once = ...  # type: Any
+    environ_base = ...  # type: Any
+    environ_overrides = ...  # type: Any
+    input_stream = ...  # type: Any
+    content_length = ...  # type: Any
+    closed = ...  # type: Any
+    def __init__(self, path='', base_url=None, query_string=None, method='', input_stream=None, content_type=None, content_length=None, errors_stream=None, multithread=False, multiprocess=False, run_once=False, headers=None, data=None, environ_base=None, environ_overrides=None, charset=''): ...
+    def form_property(name, storage, doc): ...
+    form = ...  # type: Any
+    files = ...  # type: Any
+    @property
+    def server_name(self): ...
+    @property
+    def server_port(self): ...
+    def __del__(self): ...
+    def close(self): ...
+    def get_environ(self): ...
+    def get_request(self, cls=None): ...
+
+class ClientRedirectError(Exception): ...
+
+class Client:
+    application = ...  # type: Any
+    response_wrapper = ...  # type: Any
+    cookie_jar = ...  # type: Any
+    allow_subdomain_redirects = ...  # type: Any
+    def __init__(self, application, response_wrapper=None, use_cookies=True, allow_subdomain_redirects=False): ...
+    def set_cookie(self, server_name, key, value='', max_age=None, expires=None, path='', domain=None, secure=None, httponly=False, charset=''): ...
+    def delete_cookie(self, server_name, key, path='', domain=None): ...
+    def run_wsgi_app(self, environ, buffered=False): ...
+    def resolve_redirect(self, response, new_location, environ, buffered=False): ...
+    def open(self, *args, **kwargs): ...
+    def get(self, *args, **kw): ...
+    def patch(self, *args, **kw): ...
+    def post(self, *args, **kw): ...
+    def head(self, *args, **kw): ...
+    def put(self, *args, **kw): ...
+    def delete(self, *args, **kw): ...
+    def options(self, *args, **kw): ...
+    def trace(self, *args, **kw): ...
+
+def create_environ(*args, **kwargs): ...
+def run_wsgi_app(app, environ, buffered=False): ...
diff --git a/typeshed/third_party/3/werkzeug/testapp.pyi b/typeshed/third_party/3/werkzeug/testapp.pyi
new file mode 100644
index 0000000..cee939b
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/testapp.pyi
@@ -0,0 +1,13 @@
+# Stubs for werkzeug.testapp (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response
+
+logo = ...  # type: Any
+TEMPLATE = ...  # type: Any
+
+def iter_sys_path(): ...
+def render_testapp(req): ...
+def test_app(environ, start_response): ...
diff --git a/typeshed/third_party/3/werkzeug/urls.pyi b/typeshed/third_party/3/werkzeug/urls.pyi
new file mode 100644
index 0000000..be248d2
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/urls.pyi
@@ -0,0 +1,71 @@
+# Stubs for werkzeug.urls (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from collections import namedtuple
+from typing import Any
+
+
+_URLTuple = namedtuple(
+    '_URLTuple',
+    ['scheme', 'netloc', 'path', 'query', 'fragment']
+)
+
+
+class BaseURL(_URLTuple):
+    def replace(self, **kwargs): ...
+    @property
+    def host(self): ...
+    @property
+    def ascii_host(self): ...
+    @property
+    def port(self): ...
+    @property
+    def auth(self): ...
+    @property
+    def username(self): ...
+    @property
+    def raw_username(self): ...
+    @property
+    def password(self): ...
+    @property
+    def raw_password(self): ...
+    def decode_query(self, *args, **kwargs): ...
+    def join(self, *args, **kwargs): ...
+    def to_url(self): ...
+    def decode_netloc(self): ...
+    def to_uri_tuple(self): ...
+    def to_iri_tuple(self): ...
+    def get_file_location(self, pathformat=None): ...
+
+class URL(BaseURL):
+    def encode_netloc(self): ...
+    def encode(self, charset='', errors=''): ...
+
+class BytesURL(BaseURL):
+    def encode_netloc(self): ...
+    def decode(self, charset='', errors=''): ...
+
+def url_parse(url, scheme=None, allow_fragments=True): ...
+def url_quote(string, charset='', errors='', safe='', unsafe=''): ...
+def url_quote_plus(string, charset='', errors='', safe=''): ...
+def url_unparse(components): ...
+def url_unquote(string, charset='', errors='', unsafe=''): ...
+def url_unquote_plus(s, charset='', errors=''): ...
+def url_fix(s, charset=''): ...
+def uri_to_iri(uri, charset='', errors=''): ...
+def iri_to_uri(iri, charset='', errors='', safe_conversion=False): ...
+def url_decode(s, charset='', decode_keys=False, include_empty=True, errors='', separator='', cls=None): ...
+def url_decode_stream(stream, charset='', decode_keys=False, include_empty=True, errors='', separator='', cls=None, limit=None, return_iterator=False): ...
+def url_encode(obj, charset='', encode_keys=False, sort=False, key=None, separator=b''): ...
+def url_encode_stream(obj, stream=None, charset='', encode_keys=False, sort=False, key=None, separator=b''): ...
+def url_join(base, url, allow_fragments=True): ...
+
+class Href:
+    base = ...  # type: Any
+    charset = ...  # type: Any
+    sort = ...  # type: Any
+    key = ...  # type: Any
+    def __init__(self, base='', charset='', sort=False, key=None): ...
+    def __getattr__(self, name): ...
+    def __call__(self, *path, **query): ...
diff --git a/typeshed/third_party/3/werkzeug/useragents.pyi b/typeshed/third_party/3/werkzeug/useragents.pyi
new file mode 100644
index 0000000..2471a24
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/useragents.pyi
@@ -0,0 +1,18 @@
+# Stubs for werkzeug.useragents (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class UserAgentParser:
+    platforms = ...  # type: Any
+    browsers = ...  # type: Any
+    def __init__(self): ...
+    def __call__(self, user_agent): ...
+
+class UserAgent:
+    string = ...  # type: Any
+    def __init__(self, environ_or_string): ...
+    def to_header(self): ...
+    def __nonzero__(self): ...
+    __bool__ = ...  # type: Any
diff --git a/typeshed/third_party/3/werkzeug/utils.pyi b/typeshed/third_party/3/werkzeug/utils.pyi
new file mode 100644
index 0000000..b26f316
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/utils.pyi
@@ -0,0 +1,53 @@
+# Stubs for werkzeug.utils (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug._internal import _DictAccessorProperty
+
+class cached_property(property):
+    __name__ = ...  # type: Any
+    __module__ = ...  # type: Any
+    __doc__ = ...  # type: Any
+    func = ...  # type: Any
+    def __init__(self, func, name=None, doc=None): ...
+    def __set__(self, obj, value): ...
+    def __get__(self, obj, type=None): ...
+
+class environ_property(_DictAccessorProperty):
+    read_only = ...  # type: Any
+    def lookup(self, obj): ...
+
+class header_property(_DictAccessorProperty):
+    def lookup(self, obj): ...
+
+class HTMLBuilder:
+    def __init__(self, dialect): ...
+    def __call__(self, s): ...
+    def __getattr__(self, tag): ...
+
+html = ...  # type: Any
+xhtml = ...  # type: Any
+
+def get_content_type(mimetype, charset): ...
+def format_string(string, context): ...
+def secure_filename(filename): ...
+def escape(s, quote=None): ...
+def unescape(s): ...
+def redirect(location, code=302, Response=None): ...
+def append_slash_redirect(environ, code=301): ...
+def import_string(import_name, silent=False): ...
+def find_modules(import_path, include_packages=False, recursive=False): ...
+def validate_arguments(func, args, kwargs, drop_extra=True): ...
+def bind_arguments(func, args, kwargs): ...
+
+class ArgumentValidationError(ValueError):
+    missing = ...  # type: Any
+    extra = ...  # type: Any
+    extra_positional = ...  # type: Any
+    def __init__(self, missing=None, extra=None, extra_positional=None): ...
+
+class ImportStringError(ImportError):
+    import_name = ...  # type: Any
+    exception = ...  # type: Any
+    def __init__(self, import_name, exception): ...
diff --git a/typeshed/third_party/3/werkzeug/wrappers.pyi b/typeshed/third_party/3/werkzeug/wrappers.pyi
new file mode 100644
index 0000000..9bc5151
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/wrappers.pyi
@@ -0,0 +1,194 @@
+# Stubs for werkzeug.wrappers (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class BaseRequest:
+    charset = ...  # type: Any
+    encoding_errors = ...  # type: Any
+    max_content_length = ...  # type: Any
+    max_form_memory_size = ...  # type: Any
+    parameter_storage_class = ...  # type: Any
+    list_storage_class = ...  # type: Any
+    dict_storage_class = ...  # type: Any
+    form_data_parser_class = ...  # type: Any
+    trusted_hosts = ...  # type: Any
+    disable_data_descriptor = ...  # type: Any
+    environ = ...  # type: Any
+    shallow = ...  # type: Any
+    def __init__(self, environ, populate_request=True, shallow=False): ...
+    @property
+    def url_charset(self): ...
+    @classmethod
+    def from_values(cls, *args, **kwargs): ...
+    @classmethod
+    def application(cls, f): ...
+    @property
+    def want_form_data_parsed(self): ...
+    def make_form_data_parser(self): ...
+    def close(self): ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_value, tb): ...
+    def stream(self): ...
+    input_stream = ...  # type: Any
+    def args(self): ...
+    def data(self): ...
+    def get_data(self, cache=True, as_text=False, parse_form_data=False): ...
+    def form(self): ...
+    def values(self): ...
+    def files(self): ...
+    def cookies(self): ...
+    def headers(self): ...
+    def path(self): ...
+    def full_path(self): ...
+    def script_root(self): ...
+    def url(self): ...
+    def base_url(self): ...
+    def url_root(self): ...
+    def host_url(self): ...
+    def host(self): ...
+    query_string = ...  # type: Any
+    method = ...  # type: Any
+    def access_route(self): ...
+    @property
+    def remote_addr(self): ...
+    remote_user = ...  # type: Any
+    scheme = ...  # type: Any
+    is_xhr = ...  # type: Any
+    is_secure = ...  # type: Any
+    is_multithread = ...  # type: Any
+    is_multiprocess = ...  # type: Any
+    is_run_once = ...  # type: Any
+
+class BaseResponse:
+    charset = ...  # type: Any
+    default_status = ...  # type: Any
+    default_mimetype = ...  # type: Any
+    implicit_sequence_conversion = ...  # type: Any
+    autocorrect_location_header = ...  # type: Any
+    automatically_set_content_length = ...  # type: Any
+    headers = ...  # type: Any
+    status_code = ...  # type: Any
+    status = ...  # type: Any
+    direct_passthrough = ...  # type: Any
+    response = ...  # type: Any
+    def __init__(self, response=None, status=None, headers=None, mimetype=None, content_type=None, direct_passthrough=False): ...
+    def call_on_close(self, func): ...
+    @classmethod
+    def force_type(cls, response, environ=None): ...
+    @classmethod
+    def from_app(cls, app, environ, buffered=False): ...
+    def get_data(self, as_text=False): ...
+    def set_data(self, value): ...
+    data = ...  # type: Any
+    def calculate_content_length(self): ...
+    def make_sequence(self): ...
+    def iter_encoded(self): ...
+    def set_cookie(self, key, value='', max_age=None, expires=None, path='', domain=None, secure=False, httponly=False): ...
+    def delete_cookie(self, key, path='', domain=None): ...
+    @property
+    def is_streamed(self): ...
+    @property
+    def is_sequence(self): ...
+    def close(self): ...
+    def __enter__(self): ...
+    def __exit__(self, exc_type, exc_value, tb): ...
+    def freeze(self, **kwargs): ...
+    def get_wsgi_headers(self, environ): ...
+    def get_app_iter(self, environ): ...
+    def get_wsgi_response(self, environ): ...
+    def __call__(self, environ, start_response): ...
+
+class AcceptMixin:
+    def accept_mimetypes(self): ...
+    def accept_charsets(self): ...
+    def accept_encodings(self): ...
+    def accept_languages(self): ...
+
+class ETagRequestMixin:
+    def cache_control(self): ...
+    def if_match(self): ...
+    def if_none_match(self): ...
+    def if_modified_since(self): ...
+    def if_unmodified_since(self): ...
+    def if_range(self): ...
+    def range(self): ...
+
+class UserAgentMixin:
+    def user_agent(self): ...
+
+class AuthorizationMixin:
+    def authorization(self): ...
+
+class StreamOnlyMixin:
+    disable_data_descriptor = ...  # type: Any
+    want_form_data_parsed = ...  # type: Any
+
+class ETagResponseMixin:
+    @property
+    def cache_control(self): ...
+    status_code = ...  # type: Any
+    def make_conditional(self, request_or_environ, accept_ranges=False, complete_length=None): ...
+    def add_etag(self, overwrite=False, weak=False): ...
+    def set_etag(self, etag, weak=False): ...
+    def get_etag(self): ...
+    def freeze(self, *, no_etag=False): ...
+    accept_ranges = ...  # type: Any
+    content_range = ...  # type: Any
+
+class ResponseStream:
+    mode = ...  # type: Any
+    response = ...  # type: Any
+    closed = ...  # type: Any
+    def __init__(self, response): ...
+    def write(self, value): ...
+    def writelines(self, seq): ...
+    def close(self): ...
+    def flush(self): ...
+    def isatty(self): ...
+    @property
+    def encoding(self): ...
+
+class ResponseStreamMixin:
+    def stream(self): ...
+
+class CommonRequestDescriptorsMixin:
+    content_type = ...  # type: Any
+    def content_length(self): ...
+    content_encoding = ...  # type: Any
+    content_md5 = ...  # type: Any
+    referrer = ...  # type: Any
+    date = ...  # type: Any
+    max_forwards = ...  # type: Any
+    @property
+    def mimetype(self): ...
+    @property
+    def mimetype_params(self): ...
+    def pragma(self): ...
+
+class CommonResponseDescriptorsMixin:
+    mimetype = ...  # type: Any
+    mimetype_params = ...  # type: Any
+    location = ...  # type: Any
+    age = ...  # type: Any
+    content_type = ...  # type: Any
+    content_length = ...  # type: Any
+    content_location = ...  # type: Any
+    content_encoding = ...  # type: Any
+    content_md5 = ...  # type: Any
+    date = ...  # type: Any
+    expires = ...  # type: Any
+    last_modified = ...  # type: Any
+    retry_after = ...  # type: Any
+    vary = ...  # type: Any
+    content_language = ...  # type: Any
+    allow = ...  # type: Any
+
+class WWWAuthenticateMixin:
+    @property
+    def www_authenticate(self): ...
+
+class Request(BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthorizationMixin, CommonRequestDescriptorsMixin): ...
+class PlainRequest(StreamOnlyMixin, Request): ...
+class Response(BaseResponse, ETagResponseMixin, ResponseStreamMixin, CommonResponseDescriptorsMixin, WWWAuthenticateMixin): ...
diff --git a/typeshed/third_party/3/werkzeug/wsgi.pyi b/typeshed/third_party/3/werkzeug/wsgi.pyi
new file mode 100644
index 0000000..4a0e681
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/wsgi.pyi
@@ -0,0 +1,88 @@
+# Stubs for werkzeug.wsgi (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def responder(f): ...
+def get_current_url(environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None): ...
+def host_is_trusted(hostname, trusted_list): ...
+def get_host(environ, trusted_hosts=None): ...
+def get_content_length(environ): ...
+def get_input_stream(environ, safe_fallback=True): ...
+def get_query_string(environ): ...
+def get_path_info(environ, charset='', errors=''): ...
+def get_script_name(environ, charset='', errors=''): ...
+def pop_path_info(environ, charset='', errors=''): ...
+def peek_path_info(environ, charset='', errors=''): ...
+def extract_path_info(environ_or_baseurl, path_or_url, charset='', errors='', collapse_http_schemes=True): ...
+
+class SharedDataMiddleware:
+    app = ...  # type: Any
+    exports = ...  # type: Any
+    cache = ...  # type: Any
+    cache_timeout = ...  # type: Any
+    fallback_mimetype = ...  # type: Any
+    def __init__(self, app, exports, disallow=None, cache=True, cache_timeout=..., fallback_mimetype=''): ...
+    def is_allowed(self, filename): ...
+    def get_file_loader(self, filename): ...
+    def get_package_loader(self, package, package_path): ...
+    def get_directory_loader(self, directory): ...
+    def generate_etag(self, mtime, file_size, real_filename): ...
+    def __call__(self, environ, start_response): ...
+
+class DispatcherMiddleware:
+    app = ...  # type: Any
+    mounts = ...  # type: Any
+    def __init__(self, app, mounts=None): ...
+    def __call__(self, environ, start_response): ...
+
+class ClosingIterator:
+    def __init__(self, iterable, callbacks=None): ...
+    def __iter__(self): ...
+    def __next__(self): ...
+    def close(self): ...
+
+def wrap_file(environ, file, buffer_size=8192): ...
+
+class FileWrapper:
+    file = ...  # type: Any
+    buffer_size = ...  # type: Any
+    def __init__(self, file, buffer_size=8192): ...
+    def close(self): ...
+    def seekable(self): ...
+    def seek(self, *args): ...
+    def tell(self): ...
+    def __iter__(self): ...
+    def __next__(self): ...
+
+class _RangeWrapper:
+    iterable = ...  # type: Any
+    byte_range = ...  # type: Any
+    start_byte = ...  # type: Any
+    end_byte = ...  # type: Any
+    read_length = ...  # type: Any
+    seekable = ...  # type: Any
+    end_reached = ...  # type: Any
+    def __init__(self, iterable, start_byte=0, byte_range=None): ...
+    def __iter__(self): ...
+    def __next__(self): ...
+    def close(self): ...
+
+def make_line_iter(stream, limit=None, buffer_size=..., cap_at_buffer=False): ...
+def make_chunk_iter(stream, separator, limit=None, buffer_size=..., cap_at_buffer=False): ...
+
+class LimitedStream:
+    limit = ...  # type: Any
+    def __init__(self, stream, limit): ...
+    def __iter__(self): ...
+    @property
+    def is_exhausted(self): ...
+    def on_exhausted(self): ...
+    def on_disconnect(self): ...
+    def exhaust(self, chunk_size=...): ...
+    def read(self, size=None): ...
+    def readline(self, size=None): ...
+    def readlines(self, size=None): ...
+    def tell(self): ...
+    def __next__(self): ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/mypy.git



More information about the debian-med-commit mailing list