Backed out 2 changesets (bug 1680802, bug 1680630) for linting failure. CLOSED TREE
authorNarcis Beleuzu <nbeleuzu@mozilla.com>
Tue, 15 Dec 2020 22:39:07 +0200
changeset 560842 3d3dde90bdbd6bbdddcc635d06967d9298388660
parent 560841 31535d214c0b6bf99a7dc92401f65cc2be9e05b4
child 560843 3e02ec4a421ed62dff16f5b69d64fd408d9a9149
push id132876
push usernbeleuzu@mozilla.com
push dateTue, 15 Dec 2020 20:42:46 +0000
treeherderautoland@3d3dde90bdbd [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1680802, 1680630
milestone86.0a1
backs out14747923c401f3a717a6bd5675c2561508d4822b
3fbd3ae18e3fb25f11f0add79947ba3417dcdc3a
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 2 changesets (bug 1680802, bug 1680630) for linting failure. CLOSED TREE Backed out changeset 14747923c401 (bug 1680630) Backed out changeset 3fbd3ae18e3f (bug 1680802)
python/mozboot/mozboot/osx.py
third_party/python/virtualenv/__main__.py
third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py2.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py3.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/abc.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/py.typed
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/readers.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/trees.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_common.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py2.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py3.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/abc.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/py.typed
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/readers.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/trees.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_common.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py2.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py3.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/abc.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/py.typed
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/readers.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/trees.py
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/LICENSE.txt
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir.py
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/LICENSE.txt
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir.py
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp.py
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp.py
third_party/python/virtualenv/distributions.json
third_party/python/virtualenv/modules.json
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/LICENSE
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/METADATA
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/RECORD
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/WHEEL
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/entry_points.txt
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/top_level.txt
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/zip-safe
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/LICENSE
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/METADATA
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/RECORD
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/WHEEL
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/entry_points.txt
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/top_level.txt
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/zip-safe
third_party/python/virtualenv/virtualenv/activation/bash/activate.sh
third_party/python/virtualenv/virtualenv/activation/powershell/activate.ps1
third_party/python/virtualenv/virtualenv/activation/via_template.py
third_party/python/virtualenv/virtualenv/app_data/__init__.py
third_party/python/virtualenv/virtualenv/app_data/base.py
third_party/python/virtualenv/virtualenv/app_data/na.py
third_party/python/virtualenv/virtualenv/app_data/read_only.py
third_party/python/virtualenv/virtualenv/app_data/via_disk_folder.py
third_party/python/virtualenv/virtualenv/app_data/via_tempdir.py
third_party/python/virtualenv/virtualenv/config/convert.py
third_party/python/virtualenv/virtualenv/create/creator.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/api.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/common.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/mac_os.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/pypy/common.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/python2/site.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/ref.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/via_global_self_do.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/venv.py
third_party/python/virtualenv/virtualenv/discovery/builtin.py
third_party/python/virtualenv/virtualenv/discovery/cached_py_info.py
third_party/python/virtualenv/virtualenv/discovery/py_info.py
third_party/python/virtualenv/virtualenv/run/__init__.py
third_party/python/virtualenv/virtualenv/run/plugin/creators.py
third_party/python/virtualenv/virtualenv/run/plugin/discovery.py
third_party/python/virtualenv/virtualenv/run/plugin/seeders.py
third_party/python/virtualenv/virtualenv/run/session.py
third_party/python/virtualenv/virtualenv/seed/embed/base_embed.py
third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/via_app_data.py
third_party/python/virtualenv/virtualenv/seed/wheels/acquire.py
third_party/python/virtualenv/virtualenv/seed/wheels/bundle.py
third_party/python/virtualenv/virtualenv/seed/wheels/embed/__init__.py
third_party/python/virtualenv/virtualenv/seed/wheels/embed/pip-20.2.2-py2.py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/pip-20.3.1-py2.py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/setuptools-49.6.0-py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/setuptools-50.3.2-py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/setuptools-51.0.0-py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/wheel-0.35.1-py2.py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/wheel-0.36.1-py2.py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/periodic_update.py
third_party/python/virtualenv/virtualenv/util/lock.py
third_party/python/virtualenv/virtualenv/util/path/_pathlib/__init__.py
third_party/python/virtualenv/virtualenv/util/path/_pathlib/via_os_path.py
third_party/python/virtualenv/virtualenv/util/path/_sync.py
third_party/python/virtualenv/virtualenv/util/subprocess/__init__.py
third_party/python/virtualenv/virtualenv/util/subprocess/_win_subprocess.py
third_party/python/virtualenv/virtualenv/version.py
--- a/python/mozboot/mozboot/osx.py
+++ b/python/mozboot/mozboot/osx.py
@@ -225,24 +225,24 @@ class OSXBootstrapper(BaseBootstrapper):
         )
 
     def install_mobile_android_artifact_mode_packages(self, mozconfig_builder):
         getattr(self, "ensure_%s_mobile_android_packages" % self.package_manager)(
             mozconfig_builder, artifact_mode=True
         )
 
     def generate_mobile_android_mozconfig(self):
-        return self._generate_mobile_android_mozconfig()
+        return getattr(
+            self, "generate_%s_mobile_android_mozconfig" % self.package_manager
+        )()
 
     def generate_mobile_android_artifact_mode_mozconfig(self):
-        return self._generate_mobile_android_mozconfig(artifact_mode=True)
-
-    def _generate_mobile_android_mozconfig(self, artifact_mode=False):
-        from mozboot import android
-        return android.generate_mozconfig("macosx", artifact_mode=artifact_mode)
+        return getattr(
+            self, "generate_%s_mobile_android_mozconfig" % self.package_manager
+        )(artifact_mode=True)
 
     def ensure_xcode(self):
         if self.os_version < StrictVersion("10.7"):
             if not os.path.exists("/Developer/Applications/Xcode.app"):
                 print(XCODE_REQUIRED_LEGACY)
 
                 subprocess.check_call(["open", XCODE_LEGACY])
                 sys.exit(1)
@@ -421,16 +421,21 @@ class OSXBootstrapper(BaseBootstrapper):
         # Prefer our validated java binary by putting it on the path first.
         os.environ["PATH"] = "{}{}{}".format(java_path, os.pathsep, os.environ["PATH"])
         from mozboot import android
 
         android.ensure_android(
             "macosx", artifact_mode=artifact_mode, no_interactive=self.no_interactive
         )
 
+    def generate_homebrew_mobile_android_mozconfig(self, artifact_mode=False):
+        from mozboot import android
+
+        return android.generate_mozconfig("macosx", artifact_mode=artifact_mode)
+
     def _ensure_macports_packages(self, packages):
         self.port = which("port")
         assert self.port is not None
 
         installed = set(
             subprocess.check_output(
                 [self.port, "installed"], universal_newlines=True
             ).split()
@@ -493,16 +498,21 @@ class OSXBootstrapper(BaseBootstrapper):
         # 2. Android pieces.
         self.ensure_java(mozconfig_builder)
         from mozboot import android
 
         android.ensure_android(
             "macosx", artifact_mode=artifact_mode, no_interactive=self.no_interactive
         )
 
+    def generate_macports_mobile_android_mozconfig(self, artifact_mode=False):
+        from mozboot import android
+
+        return android.generate_mozconfig("macosx", artifact_mode=artifact_mode)
+
     def ensure_package_manager(self):
         """
         Search package mgr in sys.path, if none is found, prompt the user to install one.
         If only one is found, use that one. If both are found, prompt the user to choose
         one.
         """
         installed = []
         for name, cmd in PACKAGE_MANAGER.items():
--- a/third_party/python/virtualenv/__main__.py
+++ b/third_party/python/virtualenv/__main__.py
@@ -1,15 +1,15 @@
 import json
 import os
 import sys
 import zipfile
 
 ABS_HERE = os.path.abspath(os.path.dirname(__file__))
-NEW_IMPORT_SYSTEM = sys.version_info[0] == 3
+NEW_IMPORT_SYSTEM = sys.version_info[0:2] > (3, 4)
 
 
 class VersionPlatformSelect(object):
     def __init__(self):
         self.archive = ABS_HERE
         self._zip_file = zipfile.ZipFile(ABS_HERE, "r")
         self.modules = self._load("modules.json")
         self.distributions = self._load("distributions.json")
--- a/third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/RECORD
+++ b/third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/RECORD
@@ -1,6 +1,6 @@
 filelock.py,sha256=5DQTtOaQq7-vgLkZzvOhqhVMh_umfydWgSA8Vuzmf8M,13229
 filelock-3.0.12.dist-info/LICENSE,sha256=iNm062BXnBkew5HKBMFhMFctfu3EqG2qWL8oxuFMm80,1210
 filelock-3.0.12.dist-info/METADATA,sha256=gjzbv9nxtD-Rj2ysjUuG7SLZCHUQl5hMy68Jij8soPw,4343
-filelock-3.0.12.dist-info/WHEEL,sha256=EVRjI69F5qVjm_YgqcTXPnTAv3BfSUr0WVAHuSP3Xoo,92
+filelock-3.0.12.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
 filelock-3.0.12.dist-info/top_level.txt,sha256=NDrf9i5BNogz4hEdsr6Hi7Ws3TlSSKY4Q2Y9_-i2GwU,9
 filelock-3.0.12.dist-info/RECORD,,
--- a/third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/WHEEL
+++ b/third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/WHEEL
@@ -1,5 +1,5 @@
 Wheel-Version: 1.0
-Generator: bdist_wheel (0.35.1)
+Generator: bdist_wheel (0.34.2)
 Root-Is-Purelib: true
 Tag: py3-none-any
 
rename from third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/LICENSE
rename to third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/LICENSE
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/METADATA
@@ -0,0 +1,66 @@
+Metadata-Version: 2.1
+Name: importlib-metadata
+Version: 1.7.0
+Summary: Read metadata from Python packages
+Home-page: http://importlib-metadata.readthedocs.io/
+Author: Barry Warsaw
+Author-email: barry@python.org
+License: Apache Software License
+Platform: UNKNOWN
+Classifier: Development Status :: 3 - Alpha
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 2
+Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
+Requires-Dist: zipp (>=0.5)
+Requires-Dist: pathlib2 ; python_version < "3"
+Requires-Dist: contextlib2 ; python_version < "3"
+Requires-Dist: configparser (>=3.5) ; python_version < "3"
+Provides-Extra: docs
+Requires-Dist: sphinx ; extra == 'docs'
+Requires-Dist: rst.linker ; extra == 'docs'
+Provides-Extra: testing
+Requires-Dist: packaging ; extra == 'testing'
+Requires-Dist: pep517 ; extra == 'testing'
+Requires-Dist: importlib-resources (>=1.3) ; (python_version < "3.9") and extra == 'testing'
+
+=========================
+ ``importlib_metadata``
+=========================
+
+``importlib_metadata`` is a library to access the metadata for a Python
+package.  It is intended to be ported to Python 3.8.
+
+
+Usage
+=====
+
+See the `online documentation <https://importlib_metadata.readthedocs.io/>`_
+for usage details.
+
+`Finder authors
+<https://docs.python.org/3/reference/import.html#finders-and-loaders>`_ can
+also add support for custom package installers.  See the above documentation
+for details.
+
+
+Caveats
+=======
+
+This project primarily supports third-party packages installed by PyPA
+tools (or other conforming packages). It does not support:
+
+- Packages in the stdlib.
+- Packages installed without metadata.
+
+Project details
+===============
+
+ * Project home: https://gitlab.com/python-devs/importlib_metadata
+ * Report bugs at: https://gitlab.com/python-devs/importlib_metadata/issues
+ * Code hosting: https://gitlab.com/python-devs/importlib_metadata.git
+ * Documentation: http://importlib_metadata.readthedocs.io/
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/RECORD
@@ -0,0 +1,21 @@
+importlib_metadata/__init__.py,sha256=phnrEcGP-8cF-_ZZ5peJL4cUVAANOK0CpSWC-0-IVAs,18961
+importlib_metadata/_compat.py,sha256=DnM55BbJKFCcZmJOkArmyO76-0g7pA6HEfzSYWXN88k,4417
+importlib_metadata/docs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_metadata/docs/changelog.rst,sha256=6EZfl84T0SQHzAXNlTiTegG0cBTa9wiMt0od0ht2n_8,8739
+importlib_metadata/docs/conf.py,sha256=m-b6Mju5gFkpSHh-lyJ4iwqf_8t4LjYYFRumtutQSZc,5578
+importlib_metadata/docs/index.rst,sha256=rbXrDkLAKLIDccqME5u9CCMEfMKprqzQOkIOuwOnfz4,1907
+importlib_metadata/docs/using.rst,sha256=k_L4Hwwsf10ap9xWejyC-_gLz_WtvRfDOzuJA3o7Zw0,9504
+importlib_metadata/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_metadata/tests/fixtures.py,sha256=Ua_PqyqBhFqkkNGFsXtgMah6vXKQjeqKo1KhhzYdn-w,5752
+importlib_metadata/tests/test_api.py,sha256=YMAGTsRENrtvpw2CSLmRndJMBeT4q_M0GSe-QsnnMZ4,5544
+importlib_metadata/tests/test_integration.py,sha256=ykJpwjSkVwvWHG4gUw4RUrZzU_7JKX8vZyPf_kFIrLE,1579
+importlib_metadata/tests/test_main.py,sha256=dcsDqyxTRtard2j5ysDDvVwfK6vvXdRtZCaQ0QljSR8,9026
+importlib_metadata/tests/test_zip.py,sha256=lOCNPyfJSm9nz0-2RQndM7OQV-_gRjJzyRnvMqXqRSI,2675
+importlib_metadata/tests/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_metadata/tests/data/example-21.12-py3-none-any.whl,sha256=I-kYufETid-tDYyR8f1OFJ3t5u_Io23k0cbQxJTUN4I,1455
+importlib_metadata/tests/data/example-21.12-py3.6.egg,sha256=-EeugFAijkdUO9xyQHTZkQwZoFXK0_QxICBj6R5AAJo,1497
+importlib_metadata-1.7.0.dist-info/LICENSE,sha256=wNe6dAchmJ1VvVB8D9oTc-gHHadCuaSBAev36sYEM6U,571
+importlib_metadata-1.7.0.dist-info/METADATA,sha256=AvM2AcUhNbF_2Yyo8ttyVBCh_qGbRHaRE3MVgrHYDVw,2144
+importlib_metadata-1.7.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
+importlib_metadata-1.7.0.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19
+importlib_metadata-1.7.0.dist-info/RECORD,,
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/WHEEL
@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.34.2)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+
rename from third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/top_level.txt
rename to third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/top_level.txt
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py
@@ -0,0 +1,623 @@
+from __future__ import unicode_literals, absolute_import
+
+import io
+import os
+import re
+import abc
+import csv
+import sys
+import zipp
+import operator
+import functools
+import itertools
+import posixpath
+import collections
+
+from ._compat import (
+    install,
+    NullFinder,
+    ConfigParser,
+    suppress,
+    map,
+    FileNotFoundError,
+    IsADirectoryError,
+    NotADirectoryError,
+    PermissionError,
+    pathlib,
+    ModuleNotFoundError,
+    MetaPathFinder,
+    email_message_from_string,
+    PyPy_repr,
+    unique_ordered,
+    str,
+    )
+from importlib import import_module
+from itertools import starmap
+
+
+__metaclass__ = type
+
+
+__all__ = [
+    'Distribution',
+    'DistributionFinder',
+    'PackageNotFoundError',
+    'distribution',
+    'distributions',
+    'entry_points',
+    'files',
+    'metadata',
+    'requires',
+    'version',
+    ]
+
+
+class PackageNotFoundError(ModuleNotFoundError):
+    """The package was not found."""
+
+    def __str__(self):
+        tmpl = "No package metadata was found for {self.name}"
+        return tmpl.format(**locals())
+
+    @property
+    def name(self):
+        name, = self.args
+        return name
+
+
+class EntryPoint(
+        PyPy_repr,
+        collections.namedtuple('EntryPointBase', 'name value group')):
+    """An entry point as defined by Python packaging conventions.
+
+    See `the packaging docs on entry points
+    <https://packaging.python.org/specifications/entry-points/>`_
+    for more information.
+    """
+
+    pattern = re.compile(
+        r'(?P<module>[\w.]+)\s*'
+        r'(:\s*(?P<attr>[\w.]+))?\s*'
+        r'(?P<extras>\[.*\])?\s*$'
+        )
+    """
+    A regular expression describing the syntax for an entry point,
+    which might look like:
+
+        - module
+        - package.module
+        - package.module:attribute
+        - package.module:object.attribute
+        - package.module:attr [extra1, extra2]
+
+    Other combinations are possible as well.
+
+    The expression is lenient about whitespace around the ':',
+    following the attr, and following any extras.
+    """
+
+    def load(self):
+        """Load the entry point from its definition. If only a module
+        is indicated by the value, return that module. Otherwise,
+        return the named object.
+        """
+        match = self.pattern.match(self.value)
+        module = import_module(match.group('module'))
+        attrs = filter(None, (match.group('attr') or '').split('.'))
+        return functools.reduce(getattr, attrs, module)
+
+    @property
+    def module(self):
+        match = self.pattern.match(self.value)
+        return match.group('module')
+
+    @property
+    def attr(self):
+        match = self.pattern.match(self.value)
+        return match.group('attr')
+
+    @property
+    def extras(self):
+        match = self.pattern.match(self.value)
+        return list(re.finditer(r'\w+', match.group('extras') or ''))
+
+    @classmethod
+    def _from_config(cls, config):
+        return [
+            cls(name, value, group)
+            for group in config.sections()
+            for name, value in config.items(group)
+            ]
+
+    @classmethod
+    def _from_text(cls, text):
+        config = ConfigParser(delimiters='=')
+        # case sensitive: https://stackoverflow.com/q/1611799/812183
+        config.optionxform = str
+        try:
+            config.read_string(text)
+        except AttributeError:  # pragma: nocover
+            # Python 2 has no read_string
+            config.readfp(io.StringIO(text))
+        return EntryPoint._from_config(config)
+
+    def __iter__(self):
+        """
+        Supply iter so one may construct dicts of EntryPoints easily.
+        """
+        return iter((self.name, self))
+
+    def __reduce__(self):
+        return (
+            self.__class__,
+            (self.name, self.value, self.group),
+            )
+
+
+class PackagePath(pathlib.PurePosixPath):
+    """A reference to a path in a package"""
+
+    def read_text(self, encoding='utf-8'):
+        with self.locate().open(encoding=encoding) as stream:
+            return stream.read()
+
+    def read_binary(self):
+        with self.locate().open('rb') as stream:
+            return stream.read()
+
+    def locate(self):
+        """Return a path-like object for this path"""
+        return self.dist.locate_file(self)
+
+
+class FileHash:
+    def __init__(self, spec):
+        self.mode, _, self.value = spec.partition('=')
+
+    def __repr__(self):
+        return '<FileHash mode: {} value: {}>'.format(self.mode, self.value)
+
+
+class Distribution:
+    """A Python distribution package."""
+
+    @abc.abstractmethod
+    def read_text(self, filename):
+        """Attempt to load metadata file given by the name.
+
+        :param filename: The name of the file in the distribution info.
+        :return: The text if found, otherwise None.
+        """
+
+    @abc.abstractmethod
+    def locate_file(self, path):
+        """
+        Given a path to a file in this distribution, return a path
+        to it.
+        """
+
+    @classmethod
+    def from_name(cls, name):
+        """Return the Distribution for the given package name.
+
+        :param name: The name of the distribution package to search for.
+        :return: The Distribution instance (or subclass thereof) for the named
+            package, if found.
+        :raises PackageNotFoundError: When the named package's distribution
+            metadata cannot be found.
+        """
+        for resolver in cls._discover_resolvers():
+            dists = resolver(DistributionFinder.Context(name=name))
+            dist = next(iter(dists), None)
+            if dist is not None:
+                return dist
+        else:
+            raise PackageNotFoundError(name)
+
+    @classmethod
+    def discover(cls, **kwargs):
+        """Return an iterable of Distribution objects for all packages.
+
+        Pass a ``context`` or pass keyword arguments for constructing
+        a context.
+
+        :context: A ``DistributionFinder.Context`` object.
+        :return: Iterable of Distribution objects for all packages.
+        """
+        context = kwargs.pop('context', None)
+        if context and kwargs:
+            raise ValueError("cannot accept context and kwargs")
+        context = context or DistributionFinder.Context(**kwargs)
+        return itertools.chain.from_iterable(
+            resolver(context)
+            for resolver in cls._discover_resolvers()
+            )
+
+    @staticmethod
+    def at(path):
+        """Return a Distribution for the indicated metadata path
+
+        :param path: a string or path-like object
+        :return: a concrete Distribution instance for the path
+        """
+        return PathDistribution(pathlib.Path(path))
+
+    @staticmethod
+    def _discover_resolvers():
+        """Search the meta_path for resolvers."""
+        declared = (
+            getattr(finder, 'find_distributions', None)
+            for finder in sys.meta_path
+            )
+        return filter(None, declared)
+
+    @classmethod
+    def _local(cls, root='.'):
+        from pep517 import build, meta
+        system = build.compat_system(root)
+        builder = functools.partial(
+            meta.build,
+            source_dir=root,
+            system=system,
+            )
+        return PathDistribution(zipp.Path(meta.build_as_zip(builder)))
+
+    @property
+    def metadata(self):
+        """Return the parsed metadata for this Distribution.
+
+        The returned object will have keys that name the various bits of
+        metadata.  See PEP 566 for details.
+        """
+        text = (
+            self.read_text('METADATA')
+            or self.read_text('PKG-INFO')
+            # This last clause is here to support old egg-info files.  Its
+            # effect is to just end up using the PathDistribution's self._path
+            # (which points to the egg-info file) attribute unchanged.
+            or self.read_text('')
+            )
+        return email_message_from_string(text)
+
+    @property
+    def version(self):
+        """Return the 'Version' metadata for the distribution package."""
+        return self.metadata['Version']
+
+    @property
+    def entry_points(self):
+        return EntryPoint._from_text(self.read_text('entry_points.txt'))
+
+    @property
+    def files(self):
+        """Files in this distribution.
+
+        :return: List of PackagePath for this distribution or None
+
+        Result is `None` if the metadata file that enumerates files
+        (i.e. RECORD for dist-info or SOURCES.txt for egg-info) is
+        missing.
+        Result may be empty if the metadata exists but is empty.
+        """
+        file_lines = self._read_files_distinfo() or self._read_files_egginfo()
+
+        def make_file(name, hash=None, size_str=None):
+            result = PackagePath(name)
+            result.hash = FileHash(hash) if hash else None
+            result.size = int(size_str) if size_str else None
+            result.dist = self
+            return result
+
+        return file_lines and list(starmap(make_file, csv.reader(file_lines)))
+
+    def _read_files_distinfo(self):
+        """
+        Read the lines of RECORD
+        """
+        text = self.read_text('RECORD')
+        return text and text.splitlines()
+
+    def _read_files_egginfo(self):
+        """
+        SOURCES.txt might contain literal commas, so wrap each line
+        in quotes.
+        """
+        text = self.read_text('SOURCES.txt')
+        return text and map('"{}"'.format, text.splitlines())
+
+    @property
+    def requires(self):
+        """Generated requirements specified for this Distribution"""
+        reqs = self._read_dist_info_reqs() or self._read_egg_info_reqs()
+        return reqs and list(reqs)
+
+    def _read_dist_info_reqs(self):
+        return self.metadata.get_all('Requires-Dist')
+
+    def _read_egg_info_reqs(self):
+        source = self.read_text('requires.txt')
+        return source and self._deps_from_requires_text(source)
+
+    @classmethod
+    def _deps_from_requires_text(cls, source):
+        section_pairs = cls._read_sections(source.splitlines())
+        sections = {
+            section: list(map(operator.itemgetter('line'), results))
+            for section, results in
+            itertools.groupby(section_pairs, operator.itemgetter('section'))
+            }
+        return cls._convert_egg_info_reqs_to_simple_reqs(sections)
+
+    @staticmethod
+    def _read_sections(lines):
+        section = None
+        for line in filter(None, lines):
+            section_match = re.match(r'\[(.*)\]$', line)
+            if section_match:
+                section = section_match.group(1)
+                continue
+            yield locals()
+
+    @staticmethod
+    def _convert_egg_info_reqs_to_simple_reqs(sections):
+        """
+        Historically, setuptools would solicit and store 'extra'
+        requirements, including those with environment markers,
+        in separate sections. More modern tools expect each
+        dependency to be defined separately, with any relevant
+        extras and environment markers attached directly to that
+        requirement. This method converts the former to the
+        latter. See _test_deps_from_requires_text for an example.
+        """
+        def make_condition(name):
+            return name and 'extra == "{name}"'.format(name=name)
+
+        def parse_condition(section):
+            section = section or ''
+            extra, sep, markers = section.partition(':')
+            if extra and markers:
+                markers = '({markers})'.format(markers=markers)
+            conditions = list(filter(None, [markers, make_condition(extra)]))
+            return '; ' + ' and '.join(conditions) if conditions else ''
+
+        for section, deps in sections.items():
+            for dep in deps:
+                yield dep + parse_condition(section)
+
+
+class DistributionFinder(MetaPathFinder):
+    """
+    A MetaPathFinder capable of discovering installed distributions.
+    """
+
+    class Context:
+        """
+        Keyword arguments presented by the caller to
+        ``distributions()`` or ``Distribution.discover()``
+        to narrow the scope of a search for distributions
+        in all DistributionFinders.
+
+        Each DistributionFinder may expect any parameters
+        and should attempt to honor the canonical
+        parameters defined below when appropriate.
+        """
+
+        name = None
+        """
+        Specific name for which a distribution finder should match.
+        A name of ``None`` matches all distributions.
+        """
+
+        def __init__(self, **kwargs):
+            vars(self).update(kwargs)
+
+        @property
+        def path(self):
+            """
+            The path that a distribution finder should search.
+
+            Typically refers to Python package paths and defaults
+            to ``sys.path``.
+            """
+            return vars(self).get('path', sys.path)
+
+    @abc.abstractmethod
+    def find_distributions(self, context=Context()):
+        """
+        Find distributions.
+
+        Return an iterable of all Distribution instances capable of
+        loading the metadata for packages matching the ``context``,
+        a DistributionFinder.Context instance.
+        """
+
+
+class FastPath:
+    """
+    Micro-optimized class for searching a path for
+    children.
+    """
+
+    def __init__(self, root):
+        self.root = str(root)
+        self.base = os.path.basename(self.root).lower()
+
+    def joinpath(self, child):
+        return pathlib.Path(self.root, child)
+
+    def children(self):
+        with suppress(Exception):
+            return os.listdir(self.root or '')
+        with suppress(Exception):
+            return self.zip_children()
+        return []
+
+    def zip_children(self):
+        zip_path = zipp.Path(self.root)
+        names = zip_path.root.namelist()
+        self.joinpath = zip_path.joinpath
+
+        return unique_ordered(
+            child.split(posixpath.sep, 1)[0]
+            for child in names
+            )
+
+    def is_egg(self, search):
+        base = self.base
+        return (
+            base == search.versionless_egg_name
+            or base.startswith(search.prefix)
+            and base.endswith('.egg'))
+
+    def search(self, name):
+        for child in self.children():
+            n_low = child.lower()
+            if (n_low in name.exact_matches
+                    or n_low.startswith(name.prefix)
+                    and n_low.endswith(name.suffixes)
+                    # legacy case:
+                    or self.is_egg(name) and n_low == 'egg-info'):
+                yield self.joinpath(child)
+
+
+class Prepared:
+    """
+    A prepared search for metadata on a possibly-named package.
+    """
+    normalized = ''
+    prefix = ''
+    suffixes = '.dist-info', '.egg-info'
+    exact_matches = [''][:0]
+    versionless_egg_name = ''
+
+    def __init__(self, name):
+        self.name = name
+        if name is None:
+            return
+        self.normalized = name.lower().replace('-', '_')
+        self.prefix = self.normalized + '-'
+        self.exact_matches = [
+            self.normalized + suffix for suffix in self.suffixes]
+        self.versionless_egg_name = self.normalized + '.egg'
+
+
+@install
+class MetadataPathFinder(NullFinder, DistributionFinder):
+    """A degenerate finder for distribution packages on the file system.
+
+    This finder supplies only a find_distributions() method for versions
+    of Python that do not have a PathFinder find_distributions().
+    """
+
+    def find_distributions(self, context=DistributionFinder.Context()):
+        """
+        Find distributions.
+
+        Return an iterable of all Distribution instances capable of
+        loading the metadata for packages matching ``context.name``
+        (or all names if ``None`` indicated) along the paths in the list
+        of directories ``context.path``.
+        """
+        found = self._search_paths(context.name, context.path)
+        return map(PathDistribution, found)
+
+    @classmethod
+    def _search_paths(cls, name, paths):
+        """Find metadata directories in paths heuristically."""
+        return itertools.chain.from_iterable(
+            path.search(Prepared(name))
+            for path in map(FastPath, paths)
+            )
+
+
+class PathDistribution(Distribution):
+    def __init__(self, path):
+        """Construct a distribution from a path to the metadata directory.
+
+        :param path: A pathlib.Path or similar object supporting
+                     .joinpath(), __div__, .parent, and .read_text().
+        """
+        self._path = path
+
+    def read_text(self, filename):
+        with suppress(FileNotFoundError, IsADirectoryError, KeyError,
+                      NotADirectoryError, PermissionError):
+            return self._path.joinpath(filename).read_text(encoding='utf-8')
+    read_text.__doc__ = Distribution.read_text.__doc__
+
+    def locate_file(self, path):
+        return self._path.parent / path
+
+
+def distribution(distribution_name):
+    """Get the ``Distribution`` instance for the named package.
+
+    :param distribution_name: The name of the distribution package as a string.
+    :return: A ``Distribution`` instance (or subclass thereof).
+    """
+    return Distribution.from_name(distribution_name)
+
+
+def distributions(**kwargs):
+    """Get all ``Distribution`` instances in the current environment.
+
+    :return: An iterable of ``Distribution`` instances.
+    """
+    return Distribution.discover(**kwargs)
+
+
+def metadata(distribution_name):
+    """Get the metadata for the named package.
+
+    :param distribution_name: The name of the distribution package to query.
+    :return: An email.Message containing the parsed metadata.
+    """
+    return Distribution.from_name(distribution_name).metadata
+
+
+def version(distribution_name):
+    """Get the version string for the named package.
+
+    :param distribution_name: The name of the distribution package to query.
+    :return: The version string for the package as defined in the package's
+        "Version" metadata key.
+    """
+    return distribution(distribution_name).version
+
+
+def entry_points():
+    """Return EntryPoint objects for all installed packages.
+
+    :return: EntryPoint objects for all installed packages.
+    """
+    eps = itertools.chain.from_iterable(
+        dist.entry_points for dist in distributions())
+    by_group = operator.attrgetter('group')
+    ordered = sorted(eps, key=by_group)
+    grouped = itertools.groupby(ordered, by_group)
+    return {
+        group: tuple(eps)
+        for group, eps in grouped
+        }
+
+
+def files(distribution_name):
+    """Return a list of files for the named package.
+
+    :param distribution_name: The name of the distribution package to query.
+    :return: List of files composing the distribution.
+    """
+    return distribution(distribution_name).files
+
+
+def requires(distribution_name):
+    """
+    Return a list of requirements for the named package.
+
+    :return: An iterator of requirements, suitable for
+    packaging.requirement.Requirement.
+    """
+    return distribution(distribution_name).requires
+
+
+__version__ = version(__name__)
rename from third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/_compat.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright 2017-2019 Jason R. Coombs, Barry Warsaw
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/METADATA
+++ /dev/null
@@ -1,73 +0,0 @@
-Metadata-Version: 2.1
-Name: importlib-metadata
-Version: 2.1.1
-Summary: Read metadata from Python packages
-Home-page: http://importlib-metadata.readthedocs.io/
-Author: Jason R. Coombs
-Author-email: jaraco@jaraco.com
-License: Apache Software License
-Platform: UNKNOWN
-Classifier: Development Status :: 3 - Alpha
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 2
-Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
-Requires-Dist: zipp (>=0.5)
-Requires-Dist: pathlib2 ; python_version < "3"
-Requires-Dist: contextlib2 ; python_version < "3"
-Requires-Dist: configparser (>=3.5) ; python_version < "3"
-Provides-Extra: docs
-Requires-Dist: sphinx ; extra == 'docs'
-Requires-Dist: rst.linker ; extra == 'docs'
-Provides-Extra: testing
-Requires-Dist: packaging ; extra == 'testing'
-Requires-Dist: pep517 ; extra == 'testing'
-Requires-Dist: unittest2 ; (python_version < "3") and extra == 'testing'
-Requires-Dist: importlib-resources (>=1.3) ; (python_version < "3.9") and extra == 'testing'
-
-=========================
- ``importlib_metadata``
-=========================
-
-``importlib_metadata`` is a library to access the metadata for a
-Python package.
-
-As of Python 3.8, this functionality has been added to the
-`Python standard library
-<https://docs.python.org/3/library/importlib.metadata.html>`_.
-This package supplies backports of that functionality including
-improvements added to subsequent Python versions.
-
-
-Usage
-=====
-
-See the `online documentation <https://importlib_metadata.readthedocs.io/>`_
-for usage details.
-
-`Finder authors
-<https://docs.python.org/3/reference/import.html#finders-and-loaders>`_ can
-also add support for custom package installers.  See the above documentation
-for details.
-
-
-Caveats
-=======
-
-This project primarily supports third-party packages installed by PyPA
-tools (or other conforming packages). It does not support:
-
-- Packages in the stdlib.
-- Packages installed without metadata.
-
-Project details
-===============
-
- * Project home: https://github.com/python/importlib_metadata
- * Report bugs at: https://github.com/python/importlib_metadata/issues
- * Code hosting: https://github.com/python/importlib_metadata
- * Documentation: https://importlib_metadata.readthedocs.io/
-
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/RECORD
+++ /dev/null
@@ -1,7 +0,0 @@
-importlib_metadata/__init__.py,sha256=uaN7KDLs3-irvgwsxg4VZIuY3ZEo3jhu1dShjE7fR88,19587
-importlib_metadata/_compat.py,sha256=DnM55BbJKFCcZmJOkArmyO76-0g7pA6HEfzSYWXN88k,4417
-importlib_metadata-2.1.1.dist-info/LICENSE,sha256=wNe6dAchmJ1VvVB8D9oTc-gHHadCuaSBAev36sYEM6U,571
-importlib_metadata-2.1.1.dist-info/METADATA,sha256=gBf5nX-Ff6_Ue9dSH4dkWg2FCNHHtQrs6mhunTAac8k,2421
-importlib_metadata-2.1.1.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
-importlib_metadata-2.1.1.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19
-importlib_metadata-2.1.1.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.35.1)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/top_level.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-importlib_metadata
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/__init__.py
+++ /dev/null
@@ -1,644 +0,0 @@
-from __future__ import unicode_literals, absolute_import
-
-import io
-import os
-import re
-import abc
-import csv
-import sys
-import zipp
-import operator
-import functools
-import itertools
-import posixpath
-import collections
-
-from ._compat import (
-    install,
-    NullFinder,
-    ConfigParser,
-    suppress,
-    map,
-    FileNotFoundError,
-    IsADirectoryError,
-    NotADirectoryError,
-    PermissionError,
-    pathlib,
-    ModuleNotFoundError,
-    MetaPathFinder,
-    email_message_from_string,
-    PyPy_repr,
-    unique_ordered,
-    str,
-    )
-from importlib import import_module
-from itertools import starmap
-
-
-__metaclass__ = type
-
-
-__all__ = [
-    'Distribution',
-    'DistributionFinder',
-    'PackageNotFoundError',
-    'distribution',
-    'distributions',
-    'entry_points',
-    'files',
-    'metadata',
-    'requires',
-    'version',
-    ]
-
-
-class PackageNotFoundError(ModuleNotFoundError):
-    """The package was not found."""
-
-    def __str__(self):
-        tmpl = "No package metadata was found for {self.name}"
-        return tmpl.format(**locals())
-
-    @property
-    def name(self):
-        name, = self.args
-        return name
-
-
-class EntryPoint(
-        PyPy_repr,
-        collections.namedtuple('EntryPointBase', 'name value group')):
-    """An entry point as defined by Python packaging conventions.
-
-    See `the packaging docs on entry points
-    <https://packaging.python.org/specifications/entry-points/>`_
-    for more information.
-    """
-
-    pattern = re.compile(
-        r'(?P<module>[\w.]+)\s*'
-        r'(:\s*(?P<attr>[\w.]+))?\s*'
-        r'(?P<extras>\[.*\])?\s*$'
-        )
-    """
-    A regular expression describing the syntax for an entry point,
-    which might look like:
-
-        - module
-        - package.module
-        - package.module:attribute
-        - package.module:object.attribute
-        - package.module:attr [extra1, extra2]
-
-    Other combinations are possible as well.
-
-    The expression is lenient about whitespace around the ':',
-    following the attr, and following any extras.
-    """
-
-    def load(self):
-        """Load the entry point from its definition. If only a module
-        is indicated by the value, return that module. Otherwise,
-        return the named object.
-        """
-        match = self.pattern.match(self.value)
-        module = import_module(match.group('module'))
-        attrs = filter(None, (match.group('attr') or '').split('.'))
-        return functools.reduce(getattr, attrs, module)
-
-    @property
-    def module(self):
-        match = self.pattern.match(self.value)
-        return match.group('module')
-
-    @property
-    def attr(self):
-        match = self.pattern.match(self.value)
-        return match.group('attr')
-
-    @property
-    def extras(self):
-        match = self.pattern.match(self.value)
-        return list(re.finditer(r'\w+', match.group('extras') or ''))
-
-    @classmethod
-    def _from_config(cls, config):
-        return [
-            cls(name, value, group)
-            for group in config.sections()
-            for name, value in config.items(group)
-            ]
-
-    @classmethod
-    def _from_text(cls, text):
-        config = ConfigParser(delimiters='=')
-        # case sensitive: https://stackoverflow.com/q/1611799/812183
-        config.optionxform = str
-        try:
-            config.read_string(text)
-        except AttributeError:  # pragma: nocover
-            # Python 2 has no read_string
-            config.readfp(io.StringIO(text))
-        return EntryPoint._from_config(config)
-
-    def __iter__(self):
-        """
-        Supply iter so one may construct dicts of EntryPoints easily.
-        """
-        return iter((self.name, self))
-
-    def __reduce__(self):
-        return (
-            self.__class__,
-            (self.name, self.value, self.group),
-            )
-
-
-class PackagePath(pathlib.PurePosixPath):
-    """A reference to a path in a package"""
-
-    def read_text(self, encoding='utf-8'):
-        with self.locate().open(encoding=encoding) as stream:
-            return stream.read()
-
-    def read_binary(self):
-        with self.locate().open('rb') as stream:
-            return stream.read()
-
-    def locate(self):
-        """Return a path-like object for this path"""
-        return self.dist.locate_file(self)
-
-
-class FileHash:
-    def __init__(self, spec):
-        self.mode, _, self.value = spec.partition('=')
-
-    def __repr__(self):
-        return '<FileHash mode: {} value: {}>'.format(self.mode, self.value)
-
-
-class Distribution:
-    """A Python distribution package."""
-
-    @abc.abstractmethod
-    def read_text(self, filename):
-        """Attempt to load metadata file given by the name.
-
-        :param filename: The name of the file in the distribution info.
-        :return: The text if found, otherwise None.
-        """
-
-    @abc.abstractmethod
-    def locate_file(self, path):
-        """
-        Given a path to a file in this distribution, return a path
-        to it.
-        """
-
-    @classmethod
-    def from_name(cls, name):
-        """Return the Distribution for the given package name.
-
-        :param name: The name of the distribution package to search for.
-        :return: The Distribution instance (or subclass thereof) for the named
-            package, if found.
-        :raises PackageNotFoundError: When the named package's distribution
-            metadata cannot be found.
-        """
-        for resolver in cls._discover_resolvers():
-            dists = resolver(DistributionFinder.Context(name=name))
-            dist = next(iter(dists), None)
-            if dist is not None:
-                return dist
-        else:
-            raise PackageNotFoundError(name)
-
-    @classmethod
-    def discover(cls, **kwargs):
-        """Return an iterable of Distribution objects for all packages.
-
-        Pass a ``context`` or pass keyword arguments for constructing
-        a context.
-
-        :context: A ``DistributionFinder.Context`` object.
-        :return: Iterable of Distribution objects for all packages.
-        """
-        context = kwargs.pop('context', None)
-        if context and kwargs:
-            raise ValueError("cannot accept context and kwargs")
-        context = context or DistributionFinder.Context(**kwargs)
-        return itertools.chain.from_iterable(
-            resolver(context)
-            for resolver in cls._discover_resolvers()
-            )
-
-    @staticmethod
-    def at(path):
-        """Return a Distribution for the indicated metadata path
-
-        :param path: a string or path-like object
-        :return: a concrete Distribution instance for the path
-        """
-        return PathDistribution(pathlib.Path(path))
-
-    @staticmethod
-    def _discover_resolvers():
-        """Search the meta_path for resolvers."""
-        declared = (
-            getattr(finder, 'find_distributions', None)
-            for finder in sys.meta_path
-            )
-        return filter(None, declared)
-
-    @classmethod
-    def _local(cls, root='.'):
-        from pep517 import build, meta
-        system = build.compat_system(root)
-        builder = functools.partial(
-            meta.build,
-            source_dir=root,
-            system=system,
-            )
-        return PathDistribution(zipp.Path(meta.build_as_zip(builder)))
-
-    @property
-    def metadata(self):
-        """Return the parsed metadata for this Distribution.
-
-        The returned object will have keys that name the various bits of
-        metadata.  See PEP 566 for details.
-        """
-        text = (
-            self.read_text('METADATA')
-            or self.read_text('PKG-INFO')
-            # This last clause is here to support old egg-info files.  Its
-            # effect is to just end up using the PathDistribution's self._path
-            # (which points to the egg-info file) attribute unchanged.
-            or self.read_text('')
-            )
-        return email_message_from_string(text)
-
-    @property
-    def version(self):
-        """Return the 'Version' metadata for the distribution package."""
-        return self.metadata['Version']
-
-    @property
-    def entry_points(self):
-        return EntryPoint._from_text(self.read_text('entry_points.txt'))
-
-    @property
-    def files(self):
-        """Files in this distribution.
-
-        :return: List of PackagePath for this distribution or None
-
-        Result is `None` if the metadata file that enumerates files
-        (i.e. RECORD for dist-info or SOURCES.txt for egg-info) is
-        missing.
-        Result may be empty if the metadata exists but is empty.
-        """
-        file_lines = self._read_files_distinfo() or self._read_files_egginfo()
-
-        def make_file(name, hash=None, size_str=None):
-            result = PackagePath(name)
-            result.hash = FileHash(hash) if hash else None
-            result.size = int(size_str) if size_str else None
-            result.dist = self
-            return result
-
-        return file_lines and list(starmap(make_file, csv.reader(file_lines)))
-
-    def _read_files_distinfo(self):
-        """
-        Read the lines of RECORD
-        """
-        text = self.read_text('RECORD')
-        return text and text.splitlines()
-
-    def _read_files_egginfo(self):
-        """
-        SOURCES.txt might contain literal commas, so wrap each line
-        in quotes.
-        """
-        text = self.read_text('SOURCES.txt')
-        return text and map('"{}"'.format, text.splitlines())
-
-    @property
-    def requires(self):
-        """Generated requirements specified for this Distribution"""
-        reqs = self._read_dist_info_reqs() or self._read_egg_info_reqs()
-        return reqs and list(reqs)
-
-    def _read_dist_info_reqs(self):
-        return self.metadata.get_all('Requires-Dist')
-
-    def _read_egg_info_reqs(self):
-        source = self.read_text('requires.txt')
-        return source and self._deps_from_requires_text(source)
-
-    @classmethod
-    def _deps_from_requires_text(cls, source):
-        section_pairs = cls._read_sections(source.splitlines())
-        sections = {
-            section: list(map(operator.itemgetter('line'), results))
-            for section, results in
-            itertools.groupby(section_pairs, operator.itemgetter('section'))
-            }
-        return cls._convert_egg_info_reqs_to_simple_reqs(sections)
-
-    @staticmethod
-    def _read_sections(lines):
-        section = None
-        for line in filter(None, lines):
-            section_match = re.match(r'\[(.*)\]$', line)
-            if section_match:
-                section = section_match.group(1)
-                continue
-            yield locals()
-
-    @staticmethod
-    def _convert_egg_info_reqs_to_simple_reqs(sections):
-        """
-        Historically, setuptools would solicit and store 'extra'
-        requirements, including those with environment markers,
-        in separate sections. More modern tools expect each
-        dependency to be defined separately, with any relevant
-        extras and environment markers attached directly to that
-        requirement. This method converts the former to the
-        latter. See _test_deps_from_requires_text for an example.
-        """
-        def make_condition(name):
-            return name and 'extra == "{name}"'.format(name=name)
-
-        def parse_condition(section):
-            section = section or ''
-            extra, sep, markers = section.partition(':')
-            if extra and markers:
-                markers = '({markers})'.format(markers=markers)
-            conditions = list(filter(None, [markers, make_condition(extra)]))
-            return '; ' + ' and '.join(conditions) if conditions else ''
-
-        for section, deps in sections.items():
-            for dep in deps:
-                yield dep + parse_condition(section)
-
-
-class DistributionFinder(MetaPathFinder):
-    """
-    A MetaPathFinder capable of discovering installed distributions.
-    """
-
-    class Context:
-        """
-        Keyword arguments presented by the caller to
-        ``distributions()`` or ``Distribution.discover()``
-        to narrow the scope of a search for distributions
-        in all DistributionFinders.
-
-        Each DistributionFinder may expect any parameters
-        and should attempt to honor the canonical
-        parameters defined below when appropriate.
-        """
-
-        name = None
-        """
-        Specific name for which a distribution finder should match.
-        A name of ``None`` matches all distributions.
-        """
-
-        def __init__(self, **kwargs):
-            vars(self).update(kwargs)
-
-        @property
-        def path(self):
-            """
-            The path that a distribution finder should search.
-
-            Typically refers to Python package paths and defaults
-            to ``sys.path``.
-            """
-            return vars(self).get('path', sys.path)
-
-    @abc.abstractmethod
-    def find_distributions(self, context=Context()):
-        """
-        Find distributions.
-
-        Return an iterable of all Distribution instances capable of
-        loading the metadata for packages matching the ``context``,
-        a DistributionFinder.Context instance.
-        """
-
-
-class FastPath:
-    """
-    Micro-optimized class for searching a path for
-    children.
-    """
-
-    def __init__(self, root):
-        self.root = str(root)
-        self.base = os.path.basename(self.root).lower()
-
-    def joinpath(self, child):
-        return pathlib.Path(self.root, child)
-
-    def children(self):
-        with suppress(Exception):
-            return os.listdir(self.root or '')
-        with suppress(Exception):
-            return self.zip_children()
-        return []
-
-    def zip_children(self):
-        zip_path = zipp.Path(self.root)
-        names = zip_path.root.namelist()
-        self.joinpath = zip_path.joinpath
-
-        return unique_ordered(
-            child.split(posixpath.sep, 1)[0]
-            for child in names
-            )
-
-    def search(self, name):
-        return (
-            self.joinpath(child)
-            for child in self.children()
-            if name.matches(child, self.base)
-            )
-
-
-class Prepared:
-    """
-    A prepared search for metadata on a possibly-named package.
-    """
-    normalized = None
-    suffixes = '.dist-info', '.egg-info'
-    exact_matches = [''][:0]
-
-    def __init__(self, name):
-        self.name = name
-        if name is None:
-            return
-        self.normalized = self.normalize(name)
-        self.exact_matches = [
-            self.normalized + suffix for suffix in self.suffixes]
-
-    @staticmethod
-    def normalize(name):
-        """
-        PEP 503 normalization plus dashes as underscores.
-        """
-        return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_')
-
-    @staticmethod
-    def legacy_normalize(name):
-        """
-        Normalize the package name as found in the convention in
-        older packaging tools versions and specs.
-        """
-        return name.lower().replace('-', '_')
-
-    def matches(self, cand, base):
-        low = cand.lower()
-        pre, ext = os.path.splitext(low)
-        name, sep, rest = pre.partition('-')
-        return (
-            low in self.exact_matches
-            or ext in self.suffixes and (
-                not self.normalized or
-                name.replace('.', '_') == self.normalized
-                )
-            # legacy case:
-            or self.is_egg(base) and low == 'egg-info'
-            )
-
-    def is_egg(self, base):
-        normalized = self.legacy_normalize(self.name or '')
-        prefix = normalized + '-' if normalized else ''
-        versionless_egg_name = normalized + '.egg' if self.name else ''
-        return (
-            base == versionless_egg_name
-            or base.startswith(prefix)
-            and base.endswith('.egg'))
-
-
-@install
-class MetadataPathFinder(NullFinder, DistributionFinder):
-    """A degenerate finder for distribution packages on the file system.
-
-    This finder supplies only a find_distributions() method for versions
-    of Python that do not have a PathFinder find_distributions().
-    """
-
-    def find_distributions(self, context=DistributionFinder.Context()):
-        """
-        Find distributions.
-
-        Return an iterable of all Distribution instances capable of
-        loading the metadata for packages matching ``context.name``
-        (or all names if ``None`` indicated) along the paths in the list
-        of directories ``context.path``.
-        """
-        found = self._search_paths(context.name, context.path)
-        return map(PathDistribution, found)
-
-    @classmethod
-    def _search_paths(cls, name, paths):
-        """Find metadata directories in paths heuristically."""
-        return itertools.chain.from_iterable(
-            path.search(Prepared(name))
-            for path in map(FastPath, paths)
-            )
-
-
-class PathDistribution(Distribution):
-    def __init__(self, path):
-        """Construct a distribution from a path to the metadata directory.
-
-        :param path: A pathlib.Path or similar object supporting
-                     .joinpath(), __div__, .parent, and .read_text().
-        """
-        self._path = path
-
-    def read_text(self, filename):
-        with suppress(FileNotFoundError, IsADirectoryError, KeyError,
-                      NotADirectoryError, PermissionError):
-            return self._path.joinpath(filename).read_text(encoding='utf-8')
-    read_text.__doc__ = Distribution.read_text.__doc__
-
-    def locate_file(self, path):
-        return self._path.parent / path
-
-
-def distribution(distribution_name):
-    """Get the ``Distribution`` instance for the named package.
-
-    :param distribution_name: The name of the distribution package as a string.
-    :return: A ``Distribution`` instance (or subclass thereof).
-    """
-    return Distribution.from_name(distribution_name)
-
-
-def distributions(**kwargs):
-    """Get all ``Distribution`` instances in the current environment.
-
-    :return: An iterable of ``Distribution`` instances.
-    """
-    return Distribution.discover(**kwargs)
-
-
-def metadata(distribution_name):
-    """Get the metadata for the named package.
-
-    :param distribution_name: The name of the distribution package to query.
-    :return: An email.Message containing the parsed metadata.
-    """
-    return Distribution.from_name(distribution_name).metadata
-
-
-def version(distribution_name):
-    """Get the version string for the named package.
-
-    :param distribution_name: The name of the distribution package to query.
-    :return: The version string for the package as defined in the package's
-        "Version" metadata key.
-    """
-    return distribution(distribution_name).version
-
-
-def entry_points():
-    """Return EntryPoint objects for all installed packages.
-
-    :return: EntryPoint objects for all installed packages.
-    """
-    eps = itertools.chain.from_iterable(
-        dist.entry_points for dist in distributions())
-    by_group = operator.attrgetter('group')
-    ordered = sorted(eps, key=by_group)
-    grouped = itertools.groupby(ordered, by_group)
-    return {
-        group: tuple(eps)
-        for group, eps in grouped
-        }
-
-
-def files(distribution_name):
-    """Return a list of files for the named package.
-
-    :param distribution_name: The name of the distribution package to query.
-    :return: List of files composing the distribution.
-    """
-    return distribution(distribution_name).files
-
-
-def requires(distribution_name):
-    """
-    Return a list of requirements for the named package.
-
-    :return: An iterator of requirements, suitable for
-    packaging.requirement.Requirement.
-    """
-    return distribution(distribution_name).requires
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/METADATA
+++ /dev/null
@@ -1,94 +0,0 @@
-Metadata-Version: 2.1
-Name: importlib-metadata
-Version: 3.1.1
-Summary: Read metadata from Python packages
-Home-page: https://github.com/python/importlib_metadata
-Author: Jason R. Coombs
-Author-email: jaraco@jaraco.com
-License: UNKNOWN
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3 :: Only
-Requires-Python: >=3.6
-Requires-Dist: zipp (>=0.5)
-Provides-Extra: docs
-Requires-Dist: sphinx ; extra == 'docs'
-Requires-Dist: jaraco.packaging (>=3.2) ; extra == 'docs'
-Requires-Dist: rst.linker (>=1.9) ; extra == 'docs'
-Provides-Extra: testing
-Requires-Dist: pytest (!=3.7.3,>=3.5) ; extra == 'testing'
-Requires-Dist: pytest-checkdocs (>=1.2.3) ; extra == 'testing'
-Requires-Dist: pytest-flake8 ; extra == 'testing'
-Requires-Dist: pytest-cov ; extra == 'testing'
-Requires-Dist: jaraco.test (>=3.2.0) ; extra == 'testing'
-Requires-Dist: packaging ; extra == 'testing'
-Requires-Dist: pep517 ; extra == 'testing'
-Requires-Dist: pyfakefs ; extra == 'testing'
-Requires-Dist: flufl.flake8 ; extra == 'testing'
-Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing'
-Requires-Dist: pytest-mypy ; (platform_python_implementation != "PyPy") and extra == 'testing'
-Requires-Dist: importlib-resources (>=1.3) ; (python_version < "3.9") and extra == 'testing'
-
-.. image:: https://img.shields.io/pypi/v/importlib_metadata.svg
-   :target: `PyPI link`_
-
-.. image:: https://img.shields.io/pypi/pyversions/importlib_metadata.svg
-   :target: `PyPI link`_
-
-.. _PyPI link: https://pypi.org/project/importlib_metadata
-
-.. image:: https://github.com/python/importlib_metadata/workflows/Automated%20Tests/badge.svg
-   :target: https://github.com/python/importlib_metadata/actions?query=workflow%3A%22Automated+Tests%22
-   :alt: Automated Tests
-
-.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
-   :target: https://github.com/psf/black
-   :alt: Code style: Black
-
-.. image:: https://readthedocs.org/projects/importlib-metadata/badge/?version=latest
-   :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest
-
-
-``importlib_metadata`` is a library to access the metadata for a
-Python package.
-
-As of Python 3.8, this functionality has been added to the
-`Python standard library
-<https://docs.python.org/3/library/importlib.metadata.html>`_.
-This package supplies backports of that functionality including
-improvements added to subsequent Python versions.
-
-
-Usage
-=====
-
-See the `online documentation <https://importlib_metadata.readthedocs.io/>`_
-for usage details.
-
-`Finder authors
-<https://docs.python.org/3/reference/import.html#finders-and-loaders>`_ can
-also add support for custom package installers.  See the above documentation
-for details.
-
-
-Caveats
-=======
-
-This project primarily supports third-party packages installed by PyPA
-tools (or other conforming packages). It does not support:
-
-- Packages in the stdlib.
-- Packages installed without metadata.
-
-Project details
-===============
-
- * Project home: https://github.com/python/importlib_metadata
- * Report bugs at: https://github.com/python/importlib_metadata/issues
- * Code hosting: https://github.com/python/importlib_metadata
- * Documentation: https://importlib_metadata.readthedocs.io/
-
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/RECORD
+++ /dev/null
@@ -1,7 +0,0 @@
-importlib_metadata/__init__.py,sha256=QM4Oo096u6JYeokkDUwHgazI_h3o0w9tISPjHtVko_U,19266
-importlib_metadata/_compat.py,sha256=OS4joET_vaQClxhumw0NWYdS5N3FX1Ii895aZXLpQaA,2028
-importlib_metadata-3.1.1.dist-info/LICENSE,sha256=wNe6dAchmJ1VvVB8D9oTc-gHHadCuaSBAev36sYEM6U,571
-importlib_metadata-3.1.1.dist-info/METADATA,sha256=rdblRVlpAdjDcYkqWhn2yVNwrpBqpamdKvxrgA6EWE0,3442
-importlib_metadata-3.1.1.dist-info/WHEEL,sha256=gm79cMopkncyn0iSnI0vQNiDJ8t9on0H4_iz-CrpXMk,92
-importlib_metadata-3.1.1.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19
-importlib_metadata-3.1.1.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.36.0)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/__init__.py
+++ /dev/null
@@ -1,631 +0,0 @@
-import io
-import os
-import re
-import abc
-import csv
-import sys
-import zipp
-import email
-import pathlib
-import operator
-import functools
-import itertools
-import posixpath
-import collections
-
-from ._compat import (
-    NullFinder,
-    PyPy_repr,
-    install,
-)
-
-from configparser import ConfigParser
-from contextlib import suppress
-from importlib import import_module
-from importlib.abc import MetaPathFinder
-from itertools import starmap
-
-
-__all__ = [
-    'Distribution',
-    'DistributionFinder',
-    'PackageNotFoundError',
-    'distribution',
-    'distributions',
-    'entry_points',
-    'files',
-    'metadata',
-    'requires',
-    'version',
-]
-
-
-class PackageNotFoundError(ModuleNotFoundError):
-    """The package was not found."""
-
-    def __str__(self):
-        tmpl = "No package metadata was found for {self.name}"
-        return tmpl.format(**locals())
-
-    @property
-    def name(self):
-        (name,) = self.args
-        return name
-
-
-class EntryPoint(
-    PyPy_repr, collections.namedtuple('EntryPointBase', 'name value group')
-):
-    """An entry point as defined by Python packaging conventions.
-
-    See `the packaging docs on entry points
-    <https://packaging.python.org/specifications/entry-points/>`_
-    for more information.
-    """
-
-    pattern = re.compile(
-        r'(?P<module>[\w.]+)\s*'
-        r'(:\s*(?P<attr>[\w.]+))?\s*'
-        r'(?P<extras>\[.*\])?\s*$'
-    )
-    """
-    A regular expression describing the syntax for an entry point,
-    which might look like:
-
-        - module
-        - package.module
-        - package.module:attribute
-        - package.module:object.attribute
-        - package.module:attr [extra1, extra2]
-
-    Other combinations are possible as well.
-
-    The expression is lenient about whitespace around the ':',
-    following the attr, and following any extras.
-    """
-
-    def load(self):
-        """Load the entry point from its definition. If only a module
-        is indicated by the value, return that module. Otherwise,
-        return the named object.
-        """
-        match = self.pattern.match(self.value)
-        module = import_module(match.group('module'))
-        attrs = filter(None, (match.group('attr') or '').split('.'))
-        return functools.reduce(getattr, attrs, module)
-
-    @property
-    def module(self):
-        match = self.pattern.match(self.value)
-        return match.group('module')
-
-    @property
-    def attr(self):
-        match = self.pattern.match(self.value)
-        return match.group('attr')
-
-    @property
-    def extras(self):
-        match = self.pattern.match(self.value)
-        return list(re.finditer(r'\w+', match.group('extras') or ''))
-
-    @classmethod
-    def _from_config(cls, config):
-        return [
-            cls(name, value, group)
-            for group in config.sections()
-            for name, value in config.items(group)
-        ]
-
-    @classmethod
-    def _from_text(cls, text):
-        config = ConfigParser(delimiters='=')
-        # case sensitive: https://stackoverflow.com/q/1611799/812183
-        config.optionxform = str
-        try:
-            config.read_string(text)
-        except AttributeError:  # pragma: nocover
-            # Python 2 has no read_string
-            config.readfp(io.StringIO(text))
-        return EntryPoint._from_config(config)
-
-    def __iter__(self):
-        """
-        Supply iter so one may construct dicts of EntryPoints easily.
-        """
-        return iter((self.name, self))
-
-    def __reduce__(self):
-        return (
-            self.__class__,
-            (self.name, self.value, self.group),
-        )
-
-
-class PackagePath(pathlib.PurePosixPath):
-    """A reference to a path in a package"""
-
-    def read_text(self, encoding='utf-8'):
-        with self.locate().open(encoding=encoding) as stream:
-            return stream.read()
-
-    def read_binary(self):
-        with self.locate().open('rb') as stream:
-            return stream.read()
-
-    def locate(self):
-        """Return a path-like object for this path"""
-        return self.dist.locate_file(self)
-
-
-class FileHash:
-    def __init__(self, spec):
-        self.mode, _, self.value = spec.partition('=')
-
-    def __repr__(self):
-        return '<FileHash mode: {} value: {}>'.format(self.mode, self.value)
-
-
-class Distribution:
-    """A Python distribution package."""
-
-    @abc.abstractmethod
-    def read_text(self, filename):
-        """Attempt to load metadata file given by the name.
-
-        :param filename: The name of the file in the distribution info.
-        :return: The text if found, otherwise None.
-        """
-
-    @abc.abstractmethod
-    def locate_file(self, path):
-        """
-        Given a path to a file in this distribution, return a path
-        to it.
-        """
-
-    @classmethod
-    def from_name(cls, name):
-        """Return the Distribution for the given package name.
-
-        :param name: The name of the distribution package to search for.
-        :return: The Distribution instance (or subclass thereof) for the named
-            package, if found.
-        :raises PackageNotFoundError: When the named package's distribution
-            metadata cannot be found.
-        """
-        for resolver in cls._discover_resolvers():
-            dists = resolver(DistributionFinder.Context(name=name))
-            dist = next(iter(dists), None)
-            if dist is not None:
-                return dist
-        else:
-            raise PackageNotFoundError(name)
-
-    @classmethod
-    def discover(cls, **kwargs):
-        """Return an iterable of Distribution objects for all packages.
-
-        Pass a ``context`` or pass keyword arguments for constructing
-        a context.
-
-        :context: A ``DistributionFinder.Context`` object.
-        :return: Iterable of Distribution objects for all packages.
-        """
-        context = kwargs.pop('context', None)
-        if context and kwargs:
-            raise ValueError("cannot accept context and kwargs")
-        context = context or DistributionFinder.Context(**kwargs)
-        return itertools.chain.from_iterable(
-            resolver(context) for resolver in cls._discover_resolvers()
-        )
-
-    @staticmethod
-    def at(path):
-        """Return a Distribution for the indicated metadata path
-
-        :param path: a string or path-like object
-        :return: a concrete Distribution instance for the path
-        """
-        return PathDistribution(pathlib.Path(path))
-
-    @staticmethod
-    def _discover_resolvers():
-        """Search the meta_path for resolvers."""
-        declared = (
-            getattr(finder, 'find_distributions', None) for finder in sys.meta_path
-        )
-        return filter(None, declared)
-
-    @classmethod
-    def _local(cls, root='.'):
-        from pep517 import build, meta
-
-        system = build.compat_system(root)
-        builder = functools.partial(
-            meta.build,
-            source_dir=root,
-            system=system,
-        )
-        return PathDistribution(zipp.Path(meta.build_as_zip(builder)))
-
-    @property
-    def metadata(self):
-        """Return the parsed metadata for this Distribution.
-
-        The returned object will have keys that name the various bits of
-        metadata.  See PEP 566 for details.
-        """
-        text = (
-            self.read_text('METADATA')
-            or self.read_text('PKG-INFO')
-            # This last clause is here to support old egg-info files.  Its
-            # effect is to just end up using the PathDistribution's self._path
-            # (which points to the egg-info file) attribute unchanged.
-            or self.read_text('')
-        )
-        return email.message_from_string(text)
-
-    @property
-    def version(self):
-        """Return the 'Version' metadata for the distribution package."""
-        return self.metadata['Version']
-
-    @property
-    def entry_points(self):
-        return EntryPoint._from_text(self.read_text('entry_points.txt'))
-
-    @property
-    def files(self):
-        """Files in this distribution.
-
-        :return: List of PackagePath for this distribution or None
-
-        Result is `None` if the metadata file that enumerates files
-        (i.e. RECORD for dist-info or SOURCES.txt for egg-info) is
-        missing.
-        Result may be empty if the metadata exists but is empty.
-        """
-        file_lines = self._read_files_distinfo() or self._read_files_egginfo()
-
-        def make_file(name, hash=None, size_str=None):
-            result = PackagePath(name)
-            result.hash = FileHash(hash) if hash else None
-            result.size = int(size_str) if size_str else None
-            result.dist = self
-            return result
-
-        return file_lines and list(starmap(make_file, csv.reader(file_lines)))
-
-    def _read_files_distinfo(self):
-        """
-        Read the lines of RECORD
-        """
-        text = self.read_text('RECORD')
-        return text and text.splitlines()
-
-    def _read_files_egginfo(self):
-        """
-        SOURCES.txt might contain literal commas, so wrap each line
-        in quotes.
-        """
-        text = self.read_text('SOURCES.txt')
-        return text and map('"{}"'.format, text.splitlines())
-
-    @property
-    def requires(self):
-        """Generated requirements specified for this Distribution"""
-        reqs = self._read_dist_info_reqs() or self._read_egg_info_reqs()
-        return reqs and list(reqs)
-
-    def _read_dist_info_reqs(self):
-        return self.metadata.get_all('Requires-Dist')
-
-    def _read_egg_info_reqs(self):
-        source = self.read_text('requires.txt')
-        return source and self._deps_from_requires_text(source)
-
-    @classmethod
-    def _deps_from_requires_text(cls, source):
-        section_pairs = cls._read_sections(source.splitlines())
-        sections = {
-            section: list(map(operator.itemgetter('line'), results))
-            for section, results in itertools.groupby(
-                section_pairs, operator.itemgetter('section')
-            )
-        }
-        return cls._convert_egg_info_reqs_to_simple_reqs(sections)
-
-    @staticmethod
-    def _read_sections(lines):
-        section = None
-        for line in filter(None, lines):
-            section_match = re.match(r'\[(.*)\]$', line)
-            if section_match:
-                section = section_match.group(1)
-                continue
-            yield locals()
-
-    @staticmethod
-    def _convert_egg_info_reqs_to_simple_reqs(sections):
-        """
-        Historically, setuptools would solicit and store 'extra'
-        requirements, including those with environment markers,
-        in separate sections. More modern tools expect each
-        dependency to be defined separately, with any relevant
-        extras and environment markers attached directly to that
-        requirement. This method converts the former to the
-        latter. See _test_deps_from_requires_text for an example.
-        """
-
-        def make_condition(name):
-            return name and 'extra == "{name}"'.format(name=name)
-
-        def parse_condition(section):
-            section = section or ''
-            extra, sep, markers = section.partition(':')
-            if extra and markers:
-                markers = '({markers})'.format(markers=markers)
-            conditions = list(filter(None, [markers, make_condition(extra)]))
-            return '; ' + ' and '.join(conditions) if conditions else ''
-
-        for section, deps in sections.items():
-            for dep in deps:
-                yield dep + parse_condition(section)
-
-
-class DistributionFinder(MetaPathFinder):
-    """
-    A MetaPathFinder capable of discovering installed distributions.
-    """
-
-    class Context:
-        """
-        Keyword arguments presented by the caller to
-        ``distributions()`` or ``Distribution.discover()``
-        to narrow the scope of a search for distributions
-        in all DistributionFinders.
-
-        Each DistributionFinder may expect any parameters
-        and should attempt to honor the canonical
-        parameters defined below when appropriate.
-        """
-
-        name = None
-        """
-        Specific name for which a distribution finder should match.
-        A name of ``None`` matches all distributions.
-        """
-
-        def __init__(self, **kwargs):
-            vars(self).update(kwargs)
-
-        @property
-        def path(self):
-            """
-            The path that a distribution finder should search.
-
-            Typically refers to Python package paths and defaults
-            to ``sys.path``.
-            """
-            return vars(self).get('path', sys.path)
-
-    @abc.abstractmethod
-    def find_distributions(self, context=Context()):
-        """
-        Find distributions.
-
-        Return an iterable of all Distribution instances capable of
-        loading the metadata for packages matching the ``context``,
-        a DistributionFinder.Context instance.
-        """
-
-
-class FastPath:
-    """
-    Micro-optimized class for searching a path for
-    children.
-    """
-
-    def __init__(self, root):
-        self.root = str(root)
-        self.base = os.path.basename(self.root).lower()
-
-    def joinpath(self, child):
-        return pathlib.Path(self.root, child)
-
-    def children(self):
-        with suppress(Exception):
-            return os.listdir(self.root or '')
-        with suppress(Exception):
-            return self.zip_children()
-        return []
-
-    def zip_children(self):
-        zip_path = zipp.Path(self.root)
-        names = zip_path.root.namelist()
-        self.joinpath = zip_path.joinpath
-
-        return dict.fromkeys(child.split(posixpath.sep, 1)[0] for child in names)
-
-    def search(self, name):
-        return (
-            self.joinpath(child)
-            for child in self.children()
-            if name.matches(child, self.base)
-        )
-
-
-class Prepared:
-    """
-    A prepared search for metadata on a possibly-named package.
-    """
-
-    normalized = None
-    suffixes = '.dist-info', '.egg-info'
-    exact_matches = [''][:0]
-
-    def __init__(self, name):
-        self.name = name
-        if name is None:
-            return
-        self.normalized = self.normalize(name)
-        self.exact_matches = [self.normalized + suffix for suffix in self.suffixes]
-
-    @staticmethod
-    def normalize(name):
-        """
-        PEP 503 normalization plus dashes as underscores.
-        """
-        return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_')
-
-    @staticmethod
-    def legacy_normalize(name):
-        """
-        Normalize the package name as found in the convention in
-        older packaging tools versions and specs.
-        """
-        return name.lower().replace('-', '_')
-
-    def matches(self, cand, base):
-        low = cand.lower()
-        pre, ext = os.path.splitext(low)
-        name, sep, rest = pre.partition('-')
-        return (
-            low in self.exact_matches
-            or ext in self.suffixes
-            and (not self.normalized or name.replace('.', '_') == self.normalized)
-            # legacy case:
-            or self.is_egg(base)
-            and low == 'egg-info'
-        )
-
-    def is_egg(self, base):
-        normalized = self.legacy_normalize(self.name or '')
-        prefix = normalized + '-' if normalized else ''
-        versionless_egg_name = normalized + '.egg' if self.name else ''
-        return (
-            base == versionless_egg_name
-            or base.startswith(prefix)
-            and base.endswith('.egg')
-        )
-
-
-@install
-class MetadataPathFinder(NullFinder, DistributionFinder):
-    """A degenerate finder for distribution packages on the file system.
-
-    This finder supplies only a find_distributions() method for versions
-    of Python that do not have a PathFinder find_distributions().
-    """
-
-    def find_distributions(self, context=DistributionFinder.Context()):
-        """
-        Find distributions.
-
-        Return an iterable of all Distribution instances capable of
-        loading the metadata for packages matching ``context.name``
-        (or all names if ``None`` indicated) along the paths in the list
-        of directories ``context.path``.
-        """
-        found = self._search_paths(context.name, context.path)
-        return map(PathDistribution, found)
-
-    @classmethod
-    def _search_paths(cls, name, paths):
-        """Find metadata directories in paths heuristically."""
-        return itertools.chain.from_iterable(
-            path.search(Prepared(name)) for path in map(FastPath, paths)
-        )
-
-
-class PathDistribution(Distribution):
-    def __init__(self, path):
-        """Construct a distribution from a path to the metadata directory.
-
-        :param path: A pathlib.Path or similar object supporting
-                     .joinpath(), __div__, .parent, and .read_text().
-        """
-        self._path = path
-
-    def read_text(self, filename):
-        with suppress(
-            FileNotFoundError,
-            IsADirectoryError,
-            KeyError,
-            NotADirectoryError,
-            PermissionError,
-        ):
-            return self._path.joinpath(filename).read_text(encoding='utf-8')
-
-    read_text.__doc__ = Distribution.read_text.__doc__
-
-    def locate_file(self, path):
-        return self._path.parent / path
-
-
-def distribution(distribution_name):
-    """Get the ``Distribution`` instance for the named package.
-
-    :param distribution_name: The name of the distribution package as a string.
-    :return: A ``Distribution`` instance (or subclass thereof).
-    """
-    return Distribution.from_name(distribution_name)
-
-
-def distributions(**kwargs):
-    """Get all ``Distribution`` instances in the current environment.
-
-    :return: An iterable of ``Distribution`` instances.
-    """
-    return Distribution.discover(**kwargs)
-
-
-def metadata(distribution_name):
-    """Get the metadata for the named package.
-
-    :param distribution_name: The name of the distribution package to query.
-    :return: An email.Message containing the parsed metadata.
-    """
-    return Distribution.from_name(distribution_name).metadata
-
-
-def version(distribution_name):
-    """Get the version string for the named package.
-
-    :param distribution_name: The name of the distribution package to query.
-    :return: The version string for the package as defined in the package's
-        "Version" metadata key.
-    """
-    return distribution(distribution_name).version
-
-
-def entry_points():
-    """Return EntryPoint objects for all installed packages.
-
-    :return: EntryPoint objects for all installed packages.
-    """
-    eps = itertools.chain.from_iterable(dist.entry_points for dist in distributions())
-    by_group = operator.attrgetter('group')
-    ordered = sorted(eps, key=by_group)
-    grouped = itertools.groupby(ordered, by_group)
-    return {group: tuple(eps) for group, eps in grouped}
-
-
-def files(distribution_name):
-    """Return a list of files for the named package.
-
-    :param distribution_name: The name of the distribution package to query.
-    :return: List of files composing the distribution.
-    """
-    return distribution(distribution_name).files
-
-
-def requires(distribution_name):
-    """
-    Return a list of requirements for the named package.
-
-    :return: An iterator of requirements, suitable for
-    packaging.requirement.Requirement.
-    """
-    return distribution(distribution_name).requires
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/_compat.py
+++ /dev/null
@@ -1,75 +0,0 @@
-import sys
-
-
-__all__ = ['install', 'NullFinder', 'PyPy_repr']
-
-
-def install(cls):
-    """
-    Class decorator for installation on sys.meta_path.
-
-    Adds the backport DistributionFinder to sys.meta_path and
-    attempts to disable the finder functionality of the stdlib
-    DistributionFinder.
-    """
-    sys.meta_path.append(cls())
-    disable_stdlib_finder()
-    return cls
-
-
-def disable_stdlib_finder():
-    """
-    Give the backport primacy for discovering path-based distributions
-    by monkey-patching the stdlib O_O.
-
-    See #91 for more background for rationale on this sketchy
-    behavior.
-    """
-
-    def matches(finder):
-        return getattr(
-            finder, '__module__', None
-        ) == '_frozen_importlib_external' and hasattr(finder, 'find_distributions')
-
-    for finder in filter(matches, sys.meta_path):  # pragma: nocover
-        del finder.find_distributions
-
-
-class NullFinder:
-    """
-    A "Finder" (aka "MetaClassFinder") that never finds any modules,
-    but may find distributions.
-    """
-
-    @staticmethod
-    def find_spec(*args, **kwargs):
-        return None
-
-    # In Python 2, the import system requires finders
-    # to have a find_module() method, but this usage
-    # is deprecated in Python 3 in favor of find_spec().
-    # For the purposes of this finder (i.e. being present
-    # on sys.meta_path but having no other import
-    # system functionality), the two methods are identical.
-    find_module = find_spec
-
-
-class PyPy_repr:
-    """
-    Override repr for EntryPoint objects on PyPy to avoid __iter__ access.
-    Ref #97, #102.
-    """
-
-    affected = hasattr(sys, 'pypy_version_info')
-
-    def __compat_repr__(self):  # pragma: nocover
-        def make_param(name):
-            value = getattr(self, name)
-            return '{name}={value!r}'.format(**locals())
-
-        params = ', '.join(map(make_param, self._fields))
-        return 'EntryPoint({params})'.format(**locals())
-
-    if affected:  # pragma: nocover
-        __repr__ = __compat_repr__
-    del affected
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/LICENSE
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/LICENSE
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/METADATA
@@ -0,0 +1,53 @@
+Metadata-Version: 2.1
+Name: importlib-resources
+Version: 3.0.0
+Summary: Read resources from Python packages
+Home-page: http://importlib-resources.readthedocs.io/
+Author: Barry Warsaw
+Author-email: barry@python.org
+License: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
+Requires-Dist: pathlib2 ; python_version < "3"
+Requires-Dist: contextlib2 ; python_version < "3"
+Requires-Dist: singledispatch ; python_version < "3.4"
+Requires-Dist: typing ; python_version < "3.5"
+Requires-Dist: zipp (>=0.4) ; python_version < "3.8"
+Provides-Extra: docs
+Requires-Dist: sphinx ; extra == 'docs'
+Requires-Dist: rst.linker ; extra == 'docs'
+Requires-Dist: jaraco.packaging ; extra == 'docs'
+
+=========================
+ ``importlib_resources``
+=========================
+
+``importlib_resources`` is a backport of Python standard library
+`importlib.resources
+<https://docs.python.org/3.9/library/importlib.html#module-importlib.resources>`_
+module for Python 2.7, and 3.4 through 3.8.  Users of Python 3.9 and beyond
+should use the standard library module, since for these versions,
+``importlib_resources`` just delegates to that module.
+
+The key goal of this module is to replace parts of `pkg_resources
+<https://setuptools.readthedocs.io/en/latest/pkg_resources.html>`_ with a
+solution in Python's stdlib that relies on well-defined APIs.  This makes
+reading resources included in packages easier, with more stable and consistent
+semantics.
+
+
+Project details
+===============
+
+ * Project home: https://gitlab.com/python-devs/importlib_resources
+ * Report bugs at: https://gitlab.com/python-devs/importlib_resources/issues
+ * Code hosting: https://gitlab.com/python-devs/importlib_resources.git
+ * Documentation: https://importlib-resources.readthedocs.io/
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/RECORD
@@ -0,0 +1,40 @@
+importlib_resources/__init__.py,sha256=hswDmLAH0IUlLWwmdHXPN2mgus2bk5IwDP-BFzg7VKo,977
+importlib_resources/_common.py,sha256=jXVqgKZ1bt8IbZiErvjIeb69BjqsMSCSt9AwV4bHnE8,3157
+importlib_resources/_compat.py,sha256=5nvS1tAZIl_6VqrFSScNVW2wtBGaRXGxcpDXMskruoA,3233
+importlib_resources/_py2.py,sha256=G9M5mv1ILl8NARGdNX0v9_F_Hb4HUKCS-FCNK63Ajvw,4146
+importlib_resources/_py3.py,sha256=2wJYfjLG8nd9mT1HLBtX96m6zlu9-Tocte9wFl9q_bY,5474
+importlib_resources/abc.py,sha256=6PX4Nprv39YnAht3NymhHIuSso0ocAKqDJZf-A6BgIw,3894
+importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/readers.py,sha256=S0DsGQB1li6w5USiZQtiy-5HXe4UAxt-zmKo8QlAxsI,1155
+importlib_resources/trees.py,sha256=U3FlQSI5--eF4AdzOjBvW4xnjL21OFX8ivk82Quwv_M,117
+importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/test_files.py,sha256=91rf4C74_aJsKNSt-a-03slVpY9QSAuCbogFWnsaPjE,1017
+importlib_resources/tests/test_open.py,sha256=yDXmTGXQspByj6WU0prnoVwab1yWWEA3fwz_XIx7TQU,2288
+importlib_resources/tests/test_path.py,sha256=GnUOu-338o9offnC8xwbXjH9JIQJpD7JujgQkGB106Q,1548
+importlib_resources/tests/test_read.py,sha256=DpA7tzxSQlU0_YQuWibB3E5PDL9fQUdzeKoEUGnAx78,2046
+importlib_resources/tests/test_resource.py,sha256=X77DzU2BRoM6d59iEh74zDHHw3pKOBGLCg3lP3dH4BI,6467
+importlib_resources/tests/util.py,sha256=f0RZU-RkEkybJjXRd7C5HcWMsoLFRWJL4FIUF1CJ2wo,6980
+importlib_resources/tests/data01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
+importlib_resources/tests/data01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
+importlib_resources/tests/data01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
+importlib_resources/tests/data01/subdirectory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data01/subdirectory/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
+importlib_resources/tests/data02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data02/one/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data02/one/resource1.txt,sha256=10flKac7c-XXFzJ3t-AB5MJjlBy__dSZvPE_dOm2q6U,13
+importlib_resources/tests/data02/two/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data02/two/resource2.txt,sha256=lt2jbN3TMn9QiFKM832X39bU_62UptDdUkoYzkvEbl0,13
+importlib_resources/tests/data03/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data03/namespace/resource1.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data03/namespace/portion1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data03/namespace/portion2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/zipdata01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/zipdata01/ziptestdata.zip,sha256=AYf51fj80OKCRis93v2DlZjt5rM-VQOPptSHJbFtkXw,1131
+importlib_resources/tests/zipdata02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/zipdata02/ziptestdata.zip,sha256=e6HXvTEObXvJcNxyX5I8tu5M8_6mSN8ALahHfqE7ADA,698
+importlib_resources-3.0.0.dist-info/LICENSE,sha256=uWRjFdYGataJX2ziXk048ItUglQmjng3GWBALaWA36U,568
+importlib_resources-3.0.0.dist-info/METADATA,sha256=BIalQpWJG-Av5ZUNQXdFsv6M8s8EdYiymu6GaoEL1Rk,2100
+importlib_resources-3.0.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
+importlib_resources-3.0.0.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20
+importlib_resources-3.0.0.dist-info/RECORD,,
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/WHEEL
@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.34.2)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/top_level.txt
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/top_level.txt
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/__init__.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/__init__.py
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_common.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_common.py
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py
@@ -88,32 +88,33 @@ def from_package(package):
 def _tempfile(reader, suffix=''):
     # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try'
     # blocks due to the need to close the temporary file to work on Windows
     # properly.
     fd, raw_path = tempfile.mkstemp(suffix=suffix)
     try:
         os.write(fd, reader())
         os.close(fd)
-        del reader
         yield Path(raw_path)
     finally:
         try:
             os.remove(raw_path)
         except FileNotFoundError:
             pass
 
 
 @singledispatch
+@contextlib.contextmanager
 def as_file(path):
     """
     Given a Traversable object, return that object as a
     path on the local file system in a context manager.
     """
-    return _tempfile(path.read_bytes, suffix=path.name)
+    with _tempfile(path.read_bytes, suffix=path.name) as local:
+        yield local
 
 
 @as_file.register(Path)
 @contextlib.contextmanager
 def _(path):
     """
     Degenerate behavior for pathlib.Path objects.
     """
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_compat.py
@@ -0,0 +1,127 @@
+from __future__ import absolute_import
+import sys
+
+# flake8: noqa
+
+if sys.version_info > (3,5):
+    from pathlib import Path, PurePath
+else:
+    from pathlib2 import Path, PurePath                         # type: ignore
+
+
+if sys.version_info > (3,):
+    from contextlib import suppress
+else:
+    from contextlib2 import suppress                         # type: ignore
+
+
+try:
+    from functools import singledispatch
+except ImportError:
+    from singledispatch import singledispatch                   # type: ignore
+
+
+try:
+    from abc import ABC                                         # type: ignore
+except ImportError:
+    from abc import ABCMeta
+
+    class ABC(object):                                          # type: ignore
+        __metaclass__ = ABCMeta
+
+
+try:
+    FileNotFoundError = FileNotFoundError                       # type: ignore
+except NameError:
+    FileNotFoundError = OSError                                 # type: ignore
+
+
+try:
+    from zipfile import Path as ZipPath  # type: ignore
+except ImportError:
+    from zipp import Path as ZipPath  # type: ignore
+
+
+try:
+    from typing import runtime_checkable  # type: ignore
+except ImportError:
+    def runtime_checkable(cls):  # type: ignore
+        return cls
+
+
+try:
+    from typing import Protocol  # type: ignore
+except ImportError:
+    Protocol = ABC  # type: ignore
+
+
+__metaclass__ = type
+
+
+class PackageSpec:
+    def __init__(self, **kwargs):
+        vars(self).update(kwargs)
+
+
+class TraversableResourcesAdapter:
+    def __init__(self, spec):
+        self.spec = spec
+        self.loader = LoaderAdapter(spec)
+
+    def __getattr__(self, name):
+        return getattr(self.spec, name)
+
+
+class LoaderAdapter:
+    """
+    Adapt loaders to provide TraversableResources and other
+    compatibility.
+    """
+    def __init__(self, spec):
+        self.spec = spec
+
+    @property
+    def path(self):
+        # Python < 3
+        return self.spec.origin
+
+    def get_resource_reader(self, name):
+        # Python < 3.9
+        from . import readers
+
+        def _zip_reader(spec):
+            with suppress(AttributeError):
+                return readers.ZipReader(spec.loader, spec.name)
+
+        def _available_reader(spec):
+            with suppress(AttributeError):
+                return spec.loader.get_resource_reader(spec.name)
+
+        def _native_reader(spec):
+            reader = _available_reader(spec)
+            return reader if hasattr(reader, 'files') else None
+
+        return (
+            # native reader if it supplies 'files'
+            _native_reader(self.spec) or
+            # local ZipReader if a zip module
+            _zip_reader(self.spec) or
+            # local FileReader
+            readers.FileReader(self)
+            )
+
+
+def package_spec(package):
+    """
+    Construct a minimal package spec suitable for
+    matching the interfaces this library relies upon
+    in later Python versions.
+    """
+    spec = getattr(package, '__spec__', None) or \
+        PackageSpec(
+            origin=package.__file__,
+            loader=getattr(package, '__loader__', None),
+            name=package.__name__,
+            submodule_search_locations=getattr(package, '__path__', None),
+        )
+    return TraversableResourcesAdapter(spec)
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py2.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py2.py
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py3.py
@@ -0,0 +1,150 @@
+import os
+import sys
+
+from . import _common
+from contextlib import contextmanager, suppress
+from importlib.abc import ResourceLoader
+from io import BytesIO, TextIOWrapper
+from pathlib import Path
+from types import ModuleType
+from typing import Iterable, Iterator, Optional, Set, Union   # noqa: F401
+from typing import cast
+from typing.io import BinaryIO, TextIO
+
+if False:  # TYPE_CHECKING
+    from typing import ContextManager
+
+Package = Union[ModuleType, str]
+if sys.version_info >= (3, 6):
+    Resource = Union[str, os.PathLike]              # pragma: <=35
+else:
+    Resource = str                                  # pragma: >=36
+
+
+def open_binary(package: Package, resource: Resource) -> BinaryIO:
+    """Return a file-like object opened for binary reading of the resource."""
+    resource = _common.normalize_path(resource)
+    package = _common.get_package(package)
+    reader = _common.get_resource_reader(package)
+    if reader is not None:
+        return reader.open_resource(resource)
+    # Using pathlib doesn't work well here due to the lack of 'strict'
+    # argument for pathlib.Path.resolve() prior to Python 3.6.
+    absolute_package_path = os.path.abspath(
+        package.__spec__.origin or 'non-existent file')
+    package_path = os.path.dirname(absolute_package_path)
+    full_path = os.path.join(package_path, resource)
+    try:
+        return open(full_path, mode='rb')
+    except OSError:
+        # Just assume the loader is a resource loader; all the relevant
+        # importlib.machinery loaders are and an AttributeError for
+        # get_data() will make it clear what is needed from the loader.
+        loader = cast(ResourceLoader, package.__spec__.loader)
+        data = None
+        if hasattr(package.__spec__.loader, 'get_data'):
+            with suppress(OSError):
+                data = loader.get_data(full_path)
+        if data is None:
+            package_name = package.__spec__.name
+            message = '{!r} resource not found in {!r}'.format(
+                resource, package_name)
+            raise FileNotFoundError(message)
+        return BytesIO(data)
+
+
+def open_text(package: Package,
+              resource: Resource,
+              encoding: str = 'utf-8',
+              errors: str = 'strict') -> TextIO:
+    """Return a file-like object opened for text reading of the resource."""
+    return TextIOWrapper(
+        open_binary(package, resource), encoding=encoding, errors=errors)
+
+
+def read_binary(package: Package, resource: Resource) -> bytes:
+    """Return the binary contents of the resource."""
+    with open_binary(package, resource) as fp:
+        return fp.read()
+
+
+def read_text(package: Package,
+              resource: Resource,
+              encoding: str = 'utf-8',
+              errors: str = 'strict') -> str:
+    """Return the decoded string of the resource.
+
+    The decoding-related arguments have the same semantics as those of
+    bytes.decode().
+    """
+    with open_text(package, resource, encoding, errors) as fp:
+        return fp.read()
+
+
+def path(
+        package: Package, resource: Resource,
+        ) -> 'ContextManager[Path]':
+    """A context manager providing a file path object to the resource.
+
+    If the resource does not already exist on its own on the file system,
+    a temporary file will be created. If the file was created, the file
+    will be deleted upon exiting the context manager (no exception is
+    raised if the file was deleted prior to the context manager
+    exiting).
+    """
+    reader = _common.get_resource_reader(_common.get_package(package))
+    return (
+        _path_from_reader(reader, resource)
+        if reader else
+        _common.as_file(
+            _common.files(package).joinpath(_common.normalize_path(resource)))
+        )
+
+
+@contextmanager
+def _path_from_reader(reader, resource):
+    norm_resource = _common.normalize_path(resource)
+    with suppress(FileNotFoundError):
+        yield Path(reader.resource_path(norm_resource))
+        return
+    opener_reader = reader.open_resource(norm_resource)
+    with _common._tempfile(opener_reader.read, suffix=norm_resource) as res:
+        yield res
+
+
+def is_resource(package: Package, name: str) -> bool:
+    """True if `name` is a resource inside `package`.
+
+    Directories are *not* resources.
+    """
+    package = _common.get_package(package)
+    _common.normalize_path(name)
+    reader = _common.get_resource_reader(package)
+    if reader is not None:
+        return reader.is_resource(name)
+    package_contents = set(contents(package))
+    if name not in package_contents:
+        return False
+    return (_common.from_package(package) / name).is_file()
+
+
+def contents(package: Package) -> Iterable[str]:
+    """Return an iterable of entries in `package`.
+
+    Note that not all entries are resources.  Specifically, directories are
+    not considered resources.  Use `is_resource()` on each entry returned here
+    to check if it is a resource or not.
+    """
+    package = _common.get_package(package)
+    reader = _common.get_resource_reader(package)
+    if reader is not None:
+        return reader.contents()
+    # Is the package a namespace package?  By definition, namespace packages
+    # cannot have resources.
+    namespace = (
+        package.__spec__.origin is None or
+        package.__spec__.origin == 'namespace'
+        )
+    if namespace or not package.__spec__.has_location:
+        return ()
+    return list(item.name for item in _common.from_package(package).iterdir())
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/abc.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/abc.py
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/readers.py
@@ -0,0 +1,41 @@
+from . import abc
+
+from ._compat import Path, ZipPath
+
+
+class FileReader(abc.TraversableResources):
+    def __init__(self, loader):
+        self.path = Path(loader.path).parent
+
+    def resource_path(self, resource):
+        """
+        Return the file system path to prevent
+        `resources.path()` from creating a temporary
+        copy.
+        """
+        return str(self.path.joinpath(resource))
+
+    def files(self):
+        return self.path
+
+
+class ZipReader(abc.TraversableResources):
+    def __init__(self, loader, module):
+        _, _, name = module.rpartition('.')
+        prefix = loader.prefix.replace('\\', '/') + name + '/'
+        self.path = ZipPath(loader.archive, prefix)
+
+    def open_resource(self, resource):
+        try:
+            return super().open_resource(resource)
+        except KeyError as exc:
+            raise FileNotFoundError(exc.args[0])
+
+    def is_resource(self, path):
+        # workaround for `zipfile.Path.is_file` returning true
+        # for non-existent paths.
+        target = self.files().joinpath(path)
+        return target.is_file() and target.exists()
+
+    def files(self):
+        return self.path
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/trees.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/trees.py
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright 2017-2019 Brett Cannon, Barry Warsaw
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/METADATA
+++ /dev/null
@@ -1,41 +0,0 @@
-Metadata-Version: 2.1
-Name: importlib-resources
-Version: 3.2.1
-Summary: Read resources from Python packages
-Home-page: https://github.com/python/importlib_resources
-Author: Barry Warsaw
-Author-email: barry@python.org
-License: UNKNOWN
-Project-URL: Documentation, https://importlib-resources.readthedocs.io/
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
-Requires-Dist: pathlib2 ; python_version < "3"
-Requires-Dist: contextlib2 ; python_version < "3"
-Requires-Dist: singledispatch ; python_version < "3.4"
-Requires-Dist: typing ; python_version < "3.5"
-Requires-Dist: zipp (>=0.4) ; python_version < "3.8"
-Provides-Extra: docs
-Requires-Dist: sphinx ; extra == 'docs'
-Requires-Dist: rst.linker ; extra == 'docs'
-Requires-Dist: jaraco.packaging ; extra == 'docs'
-
-``importlib_resources`` is a backport of Python standard library
-`importlib.resources
-<https://docs.python.org/3.9/library/importlib.html#module-importlib.resources>`_
-module for Python 2.7, and 3.4 through 3.8.  Users of Python 3.9 and beyond
-should use the standard library module, since for these versions,
-``importlib_resources`` just delegates to that module.
-
-The key goal of this module is to replace parts of `pkg_resources
-<https://setuptools.readthedocs.io/en/latest/pkg_resources.html>`_ with a
-solution in Python's stdlib that relies on well-defined APIs.  This makes
-reading resources included in packages easier, with more stable and consistent
-semantics.
-
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/RECORD
+++ /dev/null
@@ -1,42 +0,0 @@
-importlib_resources/__init__.py,sha256=hswDmLAH0IUlLWwmdHXPN2mgus2bk5IwDP-BFzg7VKo,977
-importlib_resources/_common.py,sha256=RN8cXOZtlygvlbyTewd-ni9wC1hwXpfbZnrl7kbx0nI,3121
-importlib_resources/_compat.py,sha256=NDCXOf1097aDJJx-_pQ0UIktzVx2G1aPIQTRFGx0FHI,3694
-importlib_resources/_py2.py,sha256=G9M5mv1ILl8NARGdNX0v9_F_Hb4HUKCS-FCNK63Ajvw,4146
-importlib_resources/_py3.py,sha256=5_FhUUHWFG1c3HcLrmDy65ZFB7EYxmHfOV3ybv4uTHM,5710
-importlib_resources/abc.py,sha256=6PX4Nprv39YnAht3NymhHIuSso0ocAKqDJZf-A6BgIw,3894
-importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/readers.py,sha256=fGuSBoMeeERUVrscN9Grhp0s-wKMy7nMVbCx92vIlGs,3674
-importlib_resources/trees.py,sha256=U3FlQSI5--eF4AdzOjBvW4xnjL21OFX8ivk82Quwv_M,117
-importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/_compat.py,sha256=geKWJe8UGXjC181JxmtxR3A_o5VrR4yxolS0xbnxMlw,801
-importlib_resources/tests/py27compat.py,sha256=9lDJkGV2swPVQJg6isOorRNFWuP6KeoWd4D2bFNmzLI,965
-importlib_resources/tests/test_files.py,sha256=91rf4C74_aJsKNSt-a-03slVpY9QSAuCbogFWnsaPjE,1017
-importlib_resources/tests/test_open.py,sha256=pIYWvuTDpQOJKX0SEuOKGotssZcEeY_xNPDqLGCvP_U,2565
-importlib_resources/tests/test_path.py,sha256=GnUOu-338o9offnC8xwbXjH9JIQJpD7JujgQkGB106Q,1548
-importlib_resources/tests/test_read.py,sha256=DpA7tzxSQlU0_YQuWibB3E5PDL9fQUdzeKoEUGnAx78,2046
-importlib_resources/tests/test_reader.py,sha256=yEO0xyrYDcGRmsBC6A1n99GXiTZpVvp-uGA313s6aao,4638
-importlib_resources/tests/test_resource.py,sha256=GbrMeHJ74N6KJG38TDodCp--nsRnFHXJc7NrAEqUPaU,8766
-importlib_resources/tests/util.py,sha256=8hBFwqIZRJFNvkboEB7aWsCqTtgUjlWI_iQ0KV158Yk,5914
-importlib_resources/tests/data01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/data01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
-importlib_resources/tests/data01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
-importlib_resources/tests/data01/subdirectory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data01/subdirectory/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/data02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/one/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/one/resource1.txt,sha256=10flKac7c-XXFzJ3t-AB5MJjlBy__dSZvPE_dOm2q6U,13
-importlib_resources/tests/data02/two/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/two/resource2.txt,sha256=lt2jbN3TMn9QiFKM832X39bU_62UptDdUkoYzkvEbl0,13
-importlib_resources/tests/namespacedata01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/namespacedata01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
-importlib_resources/tests/namespacedata01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
-importlib_resources/tests/zipdata01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/zipdata01/ziptestdata.zip,sha256=AYf51fj80OKCRis93v2DlZjt5rM-VQOPptSHJbFtkXw,1131
-importlib_resources/tests/zipdata02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/zipdata02/ziptestdata.zip,sha256=e6HXvTEObXvJcNxyX5I8tu5M8_6mSN8ALahHfqE7ADA,698
-importlib_resources-3.2.1.dist-info/LICENSE,sha256=uWRjFdYGataJX2ziXk048ItUglQmjng3GWBALaWA36U,568
-importlib_resources-3.2.1.dist-info/METADATA,sha256=d_tMNLHsZ_lPU-wq04MWr0yEfpwbNFKgfO_CU5GCC9g,1783
-importlib_resources-3.2.1.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
-importlib_resources-3.2.1.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20
-importlib_resources-3.2.1.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.35.1)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/top_level.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-importlib_resources
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/__init__.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""Read resources contained within a package."""
-
-import sys
-
-from ._common import (
-    as_file, files,
-    )
-
-# For compatibility. Ref #88.
-# Also requires hook-importlib_resources.py (Ref #101).
-__import__('importlib_resources.trees')
-
-
-__all__ = [
-    'Package',
-    'Resource',
-    'ResourceReader',
-    'as_file',
-    'contents',
-    'files',
-    'is_resource',
-    'open_binary',
-    'open_text',
-    'path',
-    'read_binary',
-    'read_text',
-    ]
-
-
-if sys.version_info >= (3,):
-    from importlib_resources._py3 import (
-        Package,
-        Resource,
-        contents,
-        is_resource,
-        open_binary,
-        open_text,
-        path,
-        read_binary,
-        read_text,
-        )
-    from importlib_resources.abc import ResourceReader
-else:
-    from importlib_resources._py2 import (
-        contents,
-        is_resource,
-        open_binary,
-        open_text,
-        path,
-        read_binary,
-        read_text,
-        )
-    del __all__[:3]
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_common.py
+++ /dev/null
@@ -1,120 +0,0 @@
-from __future__ import absolute_import
-
-import os
-import tempfile
-import contextlib
-import types
-import importlib
-
-from ._compat import (
-    Path, FileNotFoundError,
-    singledispatch, package_spec,
-    )
-
-if False:  # TYPE_CHECKING
-    from typing import Union, Any, Optional
-    from .abc import ResourceReader
-    Package = Union[types.ModuleType, str]
-
-
-def files(package):
-    """
-    Get a Traversable resource from a package
-    """
-    return from_package(get_package(package))
-
-
-def normalize_path(path):
-    # type: (Any) -> str
-    """Normalize a path by ensuring it is a string.
-
-    If the resulting string contains path separators, an exception is raised.
-    """
-    str_path = str(path)
-    parent, file_name = os.path.split(str_path)
-    if parent:
-        raise ValueError('{!r} must be only a file name'.format(path))
-    return file_name
-
-
-def get_resource_reader(package):
-    # type: (types.ModuleType) -> Optional[ResourceReader]
-    """
-    Return the package's loader if it's a ResourceReader.
-    """
-    # We can't use
-    # a issubclass() check here because apparently abc.'s __subclasscheck__()
-    # hook wants to create a weak reference to the object, but
-    # zipimport.zipimporter does not support weak references, resulting in a
-    # TypeError.  That seems terrible.
-    spec = package.__spec__
-    reader = getattr(spec.loader, 'get_resource_reader', None)
-    if reader is None:
-        return None
-    return reader(spec.name)
-
-
-def resolve(cand):
-    # type: (Package) -> types.ModuleType
-    return (
-        cand if isinstance(cand, types.ModuleType)
-        else importlib.import_module(cand)
-        )
-
-
-def get_package(package):
-    # type: (Package) -> types.ModuleType
-    """Take a package name or module object and return the module.
-
-    Raise an exception if the resolved module is not a package.
-    """
-    resolved = resolve(package)
-    if package_spec(resolved).submodule_search_locations is None:
-        raise TypeError('{!r} is not a package'.format(package))
-    return resolved
-
-
-def from_package(package):
-    """
-    Return a Traversable object for the given package.
-
-    """
-    spec = package_spec(package)
-    reader = spec.loader.get_resource_reader(spec.name)
-    return reader.files()
-
-
-@contextlib.contextmanager
-def _tempfile(reader, suffix=''):
-    # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try'
-    # blocks due to the need to close the temporary file to work on Windows
-    # properly.
-    fd, raw_path = tempfile.mkstemp(suffix=suffix)
-    try:
-        os.write(fd, reader())
-        os.close(fd)
-        del reader
-        yield Path(raw_path)
-    finally:
-        try:
-            os.remove(raw_path)
-        except FileNotFoundError:
-            pass
-
-
-@singledispatch
-def as_file(path):
-    """
-    Given a Traversable object, return that object as a
-    path on the local file system in a context manager.
-    """
-    return _tempfile(path.read_bytes, suffix=path.name)
-
-
-@as_file.register(Path)
-@contextlib.contextmanager
-def _(path):
-    """
-    Degenerate behavior for pathlib.Path objects.
-    """
-    yield path
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_compat.py
+++ /dev/null
@@ -1,139 +0,0 @@
-from __future__ import absolute_import
-import sys
-
-# flake8: noqa
-
-if sys.version_info > (3,5):
-    from pathlib import Path, PurePath
-else:
-    from pathlib2 import Path, PurePath                         # type: ignore
-
-
-if sys.version_info > (3,):
-    from contextlib import suppress
-else:
-    from contextlib2 import suppress                         # type: ignore
-
-
-try:
-    from functools import singledispatch
-except ImportError:
-    from singledispatch import singledispatch                   # type: ignore
-
-
-try:
-    from abc import ABC                                         # type: ignore
-except ImportError:
-    from abc import ABCMeta
-
-    class ABC(object):                                          # type: ignore
-        __metaclass__ = ABCMeta
-
-
-try:
-    FileNotFoundError = FileNotFoundError                       # type: ignore
-except NameError:
-    FileNotFoundError = OSError                                 # type: ignore
-
-
-try:
-    NotADirectoryError = NotADirectoryError                       # type: ignore
-except NameError:
-    NotADirectoryError = OSError                                 # type: ignore
-
-
-try:
-    from zipfile import Path as ZipPath  # type: ignore
-except ImportError:
-    from zipp import Path as ZipPath  # type: ignore
-
-
-try:
-    from typing import runtime_checkable  # type: ignore
-except ImportError:
-    def runtime_checkable(cls):  # type: ignore
-        return cls
-
-
-try:
-    from typing import Protocol  # type: ignore
-except ImportError:
-    Protocol = ABC  # type: ignore
-
-
-__metaclass__ = type
-
-
-class PackageSpec:
-    def __init__(self, **kwargs):
-        vars(self).update(kwargs)
-
-
-class TraversableResourcesAdapter:
-    def __init__(self, spec):
-        self.spec = spec
-        self.loader = LoaderAdapter(spec)
-
-    def __getattr__(self, name):
-        return getattr(self.spec, name)
-
-
-class LoaderAdapter:
-    """
-    Adapt loaders to provide TraversableResources and other
-    compatibility.
-    """
-    def __init__(self, spec):
-        self.spec = spec
-
-    @property
-    def path(self):
-        # Python < 3
-        return self.spec.origin
-
-    def get_resource_reader(self, name):
-        # Python < 3.9
-        from . import readers
-
-        def _zip_reader(spec):
-            with suppress(AttributeError):
-                return readers.ZipReader(spec.loader, spec.name)
-
-        def _namespace_reader(spec):
-            with suppress(AttributeError, ValueError):
-                return readers.NamespaceReader(spec.submodule_search_locations)
-
-        def _available_reader(spec):
-            with suppress(AttributeError):
-                return spec.loader.get_resource_reader(spec.name)
-
-        def _native_reader(spec):
-            reader = _available_reader(spec)
-            return reader if hasattr(reader, 'files') else None
-
-        return (
-            # native reader if it supplies 'files'
-            _native_reader(self.spec) or
-            # local ZipReader if a zip module
-            _zip_reader(self.spec) or
-            # local NamespaceReader if a namespace module
-            _namespace_reader(self.spec) or
-            # local FileReader
-            readers.FileReader(self)
-            )
-
-
-def package_spec(package):
-    """
-    Construct a minimal package spec suitable for
-    matching the interfaces this library relies upon
-    in later Python versions.
-    """
-    spec = getattr(package, '__spec__', None) or \
-        PackageSpec(
-            origin=package.__file__,
-            loader=getattr(package, '__loader__', None),
-            name=package.__name__,
-            submodule_search_locations=getattr(package, '__path__', None),
-        )
-    return TraversableResourcesAdapter(spec)
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py2.py
+++ /dev/null
@@ -1,107 +0,0 @@
-import os
-import errno
-
-from . import _common
-from ._compat import FileNotFoundError
-from io import BytesIO, TextIOWrapper, open as io_open
-
-
-def open_binary(package, resource):
-    """Return a file-like object opened for binary reading of the resource."""
-    resource = _common.normalize_path(resource)
-    package = _common.get_package(package)
-    # Using pathlib doesn't work well here due to the lack of 'strict' argument
-    # for pathlib.Path.resolve() prior to Python 3.6.
-    package_path = os.path.dirname(package.__file__)
-    relative_path = os.path.join(package_path, resource)
-    full_path = os.path.abspath(relative_path)
-    try:
-        return io_open(full_path, 'rb')
-    except IOError:
-        # This might be a package in a zip file.  zipimport provides a loader
-        # with a functioning get_data() method, however we have to strip the
-        # archive (i.e. the .zip file's name) off the front of the path.  This
-        # is because the zipimport loader in Python 2 doesn't actually follow
-        # PEP 302.  It should allow the full path, but actually requires that
-        # the path be relative to the zip file.
-        try:
-            loader = package.__loader__
-            full_path = relative_path[len(loader.archive)+1:]
-            data = loader.get_data(full_path)
-        except (IOError, AttributeError):
-            package_name = package.__name__
-            message = '{!r} resource not found in {!r}'.format(
-                resource, package_name)
-            raise FileNotFoundError(message)
-        return BytesIO(data)
-
-
-def open_text(package, resource, encoding='utf-8', errors='strict'):
-    """Return a file-like object opened for text reading of the resource."""
-    return TextIOWrapper(
-        open_binary(package, resource), encoding=encoding, errors=errors)
-
-
-def read_binary(package, resource):
-    """Return the binary contents of the resource."""
-    with open_binary(package, resource) as fp:
-        return fp.read()
-
-
-def read_text(package, resource, encoding='utf-8', errors='strict'):
-    """Return the decoded string of the resource.
-
-    The decoding-related arguments have the same semantics as those of
-    bytes.decode().
-    """
-    with open_text(package, resource, encoding, errors) as fp:
-        return fp.read()
-
-
-def path(package, resource):
-    """A context manager providing a file path object to the resource.
-
-    If the resource does not already exist on its own on the file system,
-    a temporary file will be created. If the file was created, the file
-    will be deleted upon exiting the context manager (no exception is
-    raised if the file was deleted prior to the context manager
-    exiting).
-    """
-    path = _common.files(package).joinpath(_common.normalize_path(resource))
-    if not path.is_file():
-        raise FileNotFoundError(path)
-    return _common.as_file(path)
-
-
-def is_resource(package, name):
-    """True if name is a resource inside package.
-
-    Directories are *not* resources.
-    """
-    package = _common.get_package(package)
-    _common.normalize_path(name)
-    try:
-        package_contents = set(contents(package))
-    except OSError as error:
-        if error.errno not in (errno.ENOENT, errno.ENOTDIR):
-            # We won't hit this in the Python 2 tests, so it'll appear
-            # uncovered.  We could mock os.listdir() to return a non-ENOENT or
-            # ENOTDIR, but then we'd have to depend on another external
-            # library since Python 2 doesn't have unittest.mock.  It's not
-            # worth it.
-            raise                     # pragma: nocover
-        return False
-    if name not in package_contents:
-        return False
-    return (_common.from_package(package) / name).is_file()
-
-
-def contents(package):
-    """Return an iterable of entries in `package`.
-
-    Note that not all entries are resources.  Specifically, directories are
-    not considered resources.  Use `is_resource()` on each entry returned here
-    to check if it is a resource or not.
-    """
-    package = _common.get_package(package)
-    return list(item.name for item in _common.from_package(package).iterdir())
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py3.py
+++ /dev/null
@@ -1,164 +0,0 @@
-import os
-import sys
-import io
-
-from . import _common
-from contextlib import suppress
-from importlib.abc import ResourceLoader
-from io import BytesIO, TextIOWrapper
-from pathlib import Path
-from types import ModuleType
-from typing import Iterable, Iterator, Optional, Set, Union   # noqa: F401
-from typing import cast
-from typing.io import BinaryIO, TextIO
-from collections.abc import Sequence
-from ._compat import singledispatch
-
-if False:  # TYPE_CHECKING
-    from typing import ContextManager
-
-Package = Union[ModuleType, str]
-if sys.version_info >= (3, 6):
-    Resource = Union[str, os.PathLike]              # pragma: <=35
-else:
-    Resource = str                                  # pragma: >=36
-
-
-def open_binary(package: Package, resource: Resource) -> BinaryIO:
-    """Return a file-like object opened for binary reading of the resource."""
-    resource = _common.normalize_path(resource)
-    package = _common.get_package(package)
-    reader = _common.get_resource_reader(package)
-    if reader is not None:
-        return reader.open_resource(resource)
-    # Using pathlib doesn't work well here due to the lack of 'strict'
-    # argument for pathlib.Path.resolve() prior to Python 3.6.
-    if package.__spec__.submodule_search_locations is not None:
-        paths = package.__spec__.submodule_search_locations
-    elif package.__spec__.origin is not None:
-        paths = [os.path.dirname(os.path.abspath(package.__spec__.origin))]
-
-    for package_path in paths:
-        full_path = os.path.join(package_path, resource)
-        try:
-            return open(full_path, mode='rb')
-        except OSError:
-            # Just assume the loader is a resource loader; all the relevant
-            # importlib.machinery loaders are and an AttributeError for
-            # get_data() will make it clear what is needed from the loader.
-            loader = cast(ResourceLoader, package.__spec__.loader)
-            data = None
-            if hasattr(package.__spec__.loader, 'get_data'):
-                with suppress(OSError):
-                    data = loader.get_data(full_path)
-            if data is not None:
-                return BytesIO(data)
-
-    raise FileNotFoundError('{!r} resource not found in {!r}'.format(
-        resource, package.__spec__.name))
-
-
-def open_text(package: Package,
-              resource: Resource,
-              encoding: str = 'utf-8',
-              errors: str = 'strict') -> TextIO:
-    """Return a file-like object opened for text reading of the resource."""
-    return TextIOWrapper(
-        open_binary(package, resource), encoding=encoding, errors=errors)
-
-
-def read_binary(package: Package, resource: Resource) -> bytes:
-    """Return the binary contents of the resource."""
-    with open_binary(package, resource) as fp:
-        return fp.read()
-
-
-def read_text(package: Package,
-              resource: Resource,
-              encoding: str = 'utf-8',
-              errors: str = 'strict') -> str:
-    """Return the decoded string of the resource.
-
-    The decoding-related arguments have the same semantics as those of
-    bytes.decode().
-    """
-    with open_text(package, resource, encoding, errors) as fp:
-        return fp.read()
-
-
-def path(
-        package: Package, resource: Resource,
-        ) -> 'ContextManager[Path]':
-    """A context manager providing a file path object to the resource.
-
-    If the resource does not already exist on its own on the file system,
-    a temporary file will be created. If the file was created, the file
-    will be deleted upon exiting the context manager (no exception is
-    raised if the file was deleted prior to the context manager
-    exiting).
-    """
-    reader = _common.get_resource_reader(_common.get_package(package))
-    return (
-        _path_from_reader(reader, _common.normalize_path(resource))
-        if reader else
-        _common.as_file(
-            _common.files(package).joinpath(_common.normalize_path(resource)))
-        )
-
-
-def _path_from_reader(reader, resource):
-    return _path_from_resource_path(reader, resource) or \
-        _path_from_open_resource(reader, resource)
-
-
-def _path_from_resource_path(reader, resource):
-    with suppress(FileNotFoundError):
-        return Path(reader.resource_path(resource))
-
-
-def _path_from_open_resource(reader, resource):
-    saved = io.BytesIO(reader.open_resource(resource).read())
-    return _common._tempfile(saved.read, suffix=resource)
-
-
-def is_resource(package: Package, name: str) -> bool:
-    """True if `name` is a resource inside `package`.
-
-    Directories are *not* resources.
-    """
-    package = _common.get_package(package)
-    _common.normalize_path(name)
-    reader = _common.get_resource_reader(package)
-    if reader is not None:
-        return reader.is_resource(name)
-    package_contents = set(contents(package))
-    if name not in package_contents:
-        return False
-    return (_common.from_package(package) / name).is_file()
-
-
-def contents(package: Package) -> Iterable[str]:
-    """Return an iterable of entries in `package`.
-
-    Note that not all entries are resources.  Specifically, directories are
-    not considered resources.  Use `is_resource()` on each entry returned here
-    to check if it is a resource or not.
-    """
-    package = _common.get_package(package)
-    reader = _common.get_resource_reader(package)
-    if reader is not None:
-        return _ensure_sequence(reader.contents())
-    transversable = _common.from_package(package)
-    if transversable.is_dir():
-        return list(item.name for item in transversable.iterdir())
-    return []
-
-
-@singledispatch
-def _ensure_sequence(iterable):
-    return list(iterable)
-
-
-@_ensure_sequence.register(Sequence)
-def _(iterable):
-    return iterable
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/abc.py
+++ /dev/null
@@ -1,142 +0,0 @@
-from __future__ import absolute_import
-
-import abc
-
-from ._compat import ABC, FileNotFoundError, runtime_checkable, Protocol
-
-# Use mypy's comment syntax for Python 2 compatibility
-try:
-    from typing import BinaryIO, Iterable, Text
-except ImportError:
-    pass
-
-
-class ResourceReader(ABC):
-    """Abstract base class for loaders to provide resource reading support."""
-
-    @abc.abstractmethod
-    def open_resource(self, resource):
-        # type: (Text) -> BinaryIO
-        """Return an opened, file-like object for binary reading.
-
-        The 'resource' argument is expected to represent only a file name.
-        If the resource cannot be found, FileNotFoundError is raised.
-        """
-        # This deliberately raises FileNotFoundError instead of
-        # NotImplementedError so that if this method is accidentally called,
-        # it'll still do the right thing.
-        raise FileNotFoundError
-
-    @abc.abstractmethod
-    def resource_path(self, resource):
-        # type: (Text) -> Text
-        """Return the file system path to the specified resource.
-
-        The 'resource' argument is expected to represent only a file name.
-        If the resource does not exist on the file system, raise
-        FileNotFoundError.
-        """
-        # This deliberately raises FileNotFoundError instead of
-        # NotImplementedError so that if this method is accidentally called,
-        # it'll still do the right thing.
-        raise FileNotFoundError
-
-    @abc.abstractmethod
-    def is_resource(self, path):
-        # type: (Text) -> bool
-        """Return True if the named 'path' is a resource.
-
-        Files are resources, directories are not.
-        """
-        raise FileNotFoundError
-
-    @abc.abstractmethod
-    def contents(self):
-        # type: () -> Iterable[str]
-        """Return an iterable of entries in `package`."""
-        raise FileNotFoundError
-
-
-@runtime_checkable
-class Traversable(Protocol):
-    """
-    An object with a subset of pathlib.Path methods suitable for
-    traversing directories and opening files.
-    """
-
-    @abc.abstractmethod
-    def iterdir(self):
-        """
-        Yield Traversable objects in self
-        """
-
-    @abc.abstractmethod
-    def read_bytes(self):
-        """
-        Read contents of self as bytes
-        """
-
-    @abc.abstractmethod
-    def read_text(self, encoding=None):
-        """
-        Read contents of self as bytes
-        """
-
-    @abc.abstractmethod
-    def is_dir(self):
-        """
-        Return True if self is a dir
-        """
-
-    @abc.abstractmethod
-    def is_file(self):
-        """
-        Return True if self is a file
-        """
-
-    @abc.abstractmethod
-    def joinpath(self, child):
-        """
-        Return Traversable child in self
-        """
-
-    @abc.abstractmethod
-    def __truediv__(self, child):
-        """
-        Return Traversable child in self
-        """
-
-    @abc.abstractmethod
-    def open(self, mode='r', *args, **kwargs):
-        """
-        mode may be 'r' or 'rb' to open as text or binary. Return a handle
-        suitable for reading (same as pathlib.Path.open).
-
-        When opening as text, accepts encoding parameters such as those
-        accepted by io.TextIOWrapper.
-        """
-
-    @abc.abstractproperty
-    def name(self):
-        # type: () -> str
-        """
-        The base name of this object without any parent references.
-        """
-
-
-class TraversableResources(ResourceReader):
-    @abc.abstractmethod
-    def files(self):
-        """Return a Traversable object for the loaded package."""
-
-    def open_resource(self, resource):
-        return self.files().joinpath(resource).open('rb')
-
-    def resource_path(self, resource):
-        raise FileNotFoundError(resource)
-
-    def is_resource(self, path):
-        return self.files().joinpath(path).is_file()
-
-    def contents(self):
-        return (item.name for item in self.files().iterdir())
deleted file mode 100644
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/readers.py
+++ /dev/null
@@ -1,123 +0,0 @@
-import os.path
-
-from collections import OrderedDict
-
-from . import abc
-
-from ._compat import Path, ZipPath
-from ._compat import FileNotFoundError, NotADirectoryError
-
-
-class FileReader(abc.TraversableResources):
-    def __init__(self, loader):
-        self.path = Path(loader.path).parent
-
-    def resource_path(self, resource):
-        """
-        Return the file system path to prevent
-        `resources.path()` from creating a temporary
-        copy.
-        """
-        return str(self.path.joinpath(resource))
-
-    def files(self):
-        return self.path
-
-
-class ZipReader(abc.TraversableResources):
-    def __init__(self, loader, module):
-        _, _, name = module.rpartition('.')
-        self.prefix = loader.prefix.replace('\\', '/') + name + '/'
-        self.archive = loader.archive
-
-    def open_resource(self, resource):
-        try:
-            return super().open_resource(resource)
-        except KeyError as exc:
-            raise FileNotFoundError(exc.args[0])
-
-    def is_resource(self, path):
-        # workaround for `zipfile.Path.is_file` returning true
-        # for non-existent paths.
-        target = self.files().joinpath(path)
-        return target.is_file() and target.exists()
-
-    def files(self):
-        return ZipPath(self.archive, self.prefix)
-
-
-class MultiplexedPath(abc.Traversable):
-    """
-    Given a series of Traversable objects, implement a merged
-    version of the interface across all objects. Useful for
-    namespace packages which may be multihomed at a single
-    name.
-    """
-    def __init__(self, *paths):
-        paths = list(OrderedDict.fromkeys(paths))  # remove duplicates
-        self._paths = list(map(Path, paths))
-        if not self._paths:
-            message = 'MultiplexedPath must contain at least one path'
-            raise FileNotFoundError(message)
-        if any(not path.is_dir() for path in self._paths):
-            raise NotADirectoryError(
-                'MultiplexedPath only supports directories')
-
-    def iterdir(self):
-        visited = []
-        for path in self._paths:
-            for file in path.iterdir():
-                if file.name in visited:
-                    continue
-                visited.append(file.name)
-                yield file
-
-    def read_bytes(self):
-        raise FileNotFoundError('{} is not a file'.format(self))
-
-    def read_text(self, *args, **kwargs):
-        raise FileNotFoundError('{} is not a file'.format(self))
-
-    def is_dir(self):
-        return True
-
-    def is_file(self):
-        return False
-
-    def joinpath(self, child):
-        # first try to find child in current paths
-        for file in self.iterdir():
-            if file.name == child:
-                return file
-        # if it does not exist, construct it with the first path
-        return self._paths[0] / child
-
-    __truediv__ = joinpath
-
-    def open(self, *args, **kwargs):
-        raise FileNotFoundError('{} is not a file'.format(self))
-
-    def name(self):
-        return os.path.basename(self._paths[0])
-
-    def __repr__(self):
-        return 'MultiplexedPath({})'.format(
-            ', '.join("'{}'".format(path) for path in self._paths))
-
-
-class NamespaceReader(abc.TraversableResources):
-    def __init__(self, namespace_path):
-        if 'NamespacePath' not in str(namespace_path):
-            raise ValueError('Invalid path')
-        self.path = MultiplexedPath(*list(namespace_path))
-
-    def resource_path(self, resource):
-        """
-        Return the file system path to prevent
-        `resources.path()` from creating a temporary
-        copy.
-        """
-        return str(self.path.joinpath(resource))
-
-    def files(self):
-        return self.path
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/trees.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# for compatibility with 1.1, continue to expose as_file here.
-
-from ._common import as_file
-
-
-__all__ = ['as_file']
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/METADATA
+++ /dev/null
@@ -1,41 +0,0 @@
-Metadata-Version: 2.1
-Name: importlib-resources
-Version: 3.3.0
-Summary: Read resources from Python packages
-Home-page: https://github.com/python/importlib_resources
-Author: Barry Warsaw
-Author-email: barry@python.org
-License: UNKNOWN
-Project-URL: Documentation, https://importlib-resources.readthedocs.io/
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7
-Requires-Dist: pathlib2 ; python_version < "3"
-Requires-Dist: contextlib2 ; python_version < "3"
-Requires-Dist: singledispatch ; python_version < "3.4"
-Requires-Dist: typing ; python_version < "3.5"
-Requires-Dist: zipp (>=0.4) ; python_version < "3.8"
-Provides-Extra: docs
-Requires-Dist: sphinx ; extra == 'docs'
-Requires-Dist: rst.linker ; extra == 'docs'
-Requires-Dist: jaraco.packaging ; extra == 'docs'
-
-``importlib_resources`` is a backport of Python standard library
-`importlib.resources
-<https://docs.python.org/3.9/library/importlib.html#module-importlib.resources>`_
-module for Python 2.7, and 3.4 through 3.8.  Users of Python 3.9 and beyond
-should use the standard library module, since for these versions,
-``importlib_resources`` just delegates to that module.
-
-The key goal of this module is to replace parts of `pkg_resources
-<https://setuptools.readthedocs.io/en/latest/pkg_resources.html>`_ with a
-solution in Python's stdlib that relies on well-defined APIs.  This makes
-reading resources included in packages easier, with more stable and consistent
-semantics.
-
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/RECORD
+++ /dev/null
@@ -1,42 +0,0 @@
-importlib_resources/__init__.py,sha256=hswDmLAH0IUlLWwmdHXPN2mgus2bk5IwDP-BFzg7VKo,977
-importlib_resources/_common.py,sha256=RN8cXOZtlygvlbyTewd-ni9wC1hwXpfbZnrl7kbx0nI,3121
-importlib_resources/_compat.py,sha256=NDCXOf1097aDJJx-_pQ0UIktzVx2G1aPIQTRFGx0FHI,3694
-importlib_resources/_py2.py,sha256=G9M5mv1ILl8NARGdNX0v9_F_Hb4HUKCS-FCNK63Ajvw,4146
-importlib_resources/_py3.py,sha256=Bc-p0UYfPVWXFJ21HLNfVvbVrPJFXBA0g80rqPInkq8,5564
-importlib_resources/abc.py,sha256=6PX4Nprv39YnAht3NymhHIuSso0ocAKqDJZf-A6BgIw,3894
-importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/readers.py,sha256=fGuSBoMeeERUVrscN9Grhp0s-wKMy7nMVbCx92vIlGs,3674
-importlib_resources/trees.py,sha256=U3FlQSI5--eF4AdzOjBvW4xnjL21OFX8ivk82Quwv_M,117
-importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/_compat.py,sha256=geKWJe8UGXjC181JxmtxR3A_o5VrR4yxolS0xbnxMlw,801
-importlib_resources/tests/py27compat.py,sha256=9lDJkGV2swPVQJg6isOorRNFWuP6KeoWd4D2bFNmzLI,965
-importlib_resources/tests/test_files.py,sha256=91rf4C74_aJsKNSt-a-03slVpY9QSAuCbogFWnsaPjE,1017
-importlib_resources/tests/test_open.py,sha256=pIYWvuTDpQOJKX0SEuOKGotssZcEeY_xNPDqLGCvP_U,2565
-importlib_resources/tests/test_path.py,sha256=GnUOu-338o9offnC8xwbXjH9JIQJpD7JujgQkGB106Q,1548
-importlib_resources/tests/test_read.py,sha256=DpA7tzxSQlU0_YQuWibB3E5PDL9fQUdzeKoEUGnAx78,2046
-importlib_resources/tests/test_reader.py,sha256=yEO0xyrYDcGRmsBC6A1n99GXiTZpVvp-uGA313s6aao,4638
-importlib_resources/tests/test_resource.py,sha256=GbrMeHJ74N6KJG38TDodCp--nsRnFHXJc7NrAEqUPaU,8766
-importlib_resources/tests/util.py,sha256=8hBFwqIZRJFNvkboEB7aWsCqTtgUjlWI_iQ0KV158Yk,5914
-importlib_resources/tests/data01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/data01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
-importlib_resources/tests/data01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
-importlib_resources/tests/data01/subdirectory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data01/subdirectory/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/data02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/one/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/one/resource1.txt,sha256=10flKac7c-XXFzJ3t-AB5MJjlBy__dSZvPE_dOm2q6U,13
-importlib_resources/tests/data02/two/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/two/resource2.txt,sha256=lt2jbN3TMn9QiFKM832X39bU_62UptDdUkoYzkvEbl0,13
-importlib_resources/tests/namespacedata01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/namespacedata01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
-importlib_resources/tests/namespacedata01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
-importlib_resources/tests/zipdata01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/zipdata01/ziptestdata.zip,sha256=AYf51fj80OKCRis93v2DlZjt5rM-VQOPptSHJbFtkXw,1131
-importlib_resources/tests/zipdata02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/zipdata02/ziptestdata.zip,sha256=e6HXvTEObXvJcNxyX5I8tu5M8_6mSN8ALahHfqE7ADA,698
-importlib_resources-3.3.0.dist-info/LICENSE,sha256=uWRjFdYGataJX2ziXk048ItUglQmjng3GWBALaWA36U,568
-importlib_resources-3.3.0.dist-info/METADATA,sha256=GxPMbCwUwlCuHNCiPJvP4IC_mTKqP4b_W7UqqNidcF4,1791
-importlib_resources-3.3.0.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
-importlib_resources-3.3.0.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20
-importlib_resources-3.3.0.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_compat.py
+++ /dev/null
@@ -1,139 +0,0 @@
-from __future__ import absolute_import
-import sys
-
-# flake8: noqa
-
-if sys.version_info > (3,5):
-    from pathlib import Path, PurePath
-else:
-    from pathlib2 import Path, PurePath                         # type: ignore
-
-
-if sys.version_info > (3,):
-    from contextlib import suppress
-else:
-    from contextlib2 import suppress                         # type: ignore
-
-
-try:
-    from functools import singledispatch
-except ImportError:
-    from singledispatch import singledispatch                   # type: ignore
-
-
-try:
-    from abc import ABC                                         # type: ignore
-except ImportError:
-    from abc import ABCMeta
-
-    class ABC(object):                                          # type: ignore
-        __metaclass__ = ABCMeta
-
-
-try:
-    FileNotFoundError = FileNotFoundError                       # type: ignore
-except NameError:
-    FileNotFoundError = OSError                                 # type: ignore
-
-
-try:
-    NotADirectoryError = NotADirectoryError                       # type: ignore
-except NameError:
-    NotADirectoryError = OSError                                 # type: ignore
-
-
-try:
-    from zipfile import Path as ZipPath  # type: ignore
-except ImportError:
-    from zipp import Path as ZipPath  # type: ignore
-
-
-try:
-    from typing import runtime_checkable  # type: ignore
-except ImportError:
-    def runtime_checkable(cls):  # type: ignore
-        return cls
-
-
-try:
-    from typing import Protocol  # type: ignore
-except ImportError:
-    Protocol = ABC  # type: ignore
-
-
-__metaclass__ = type
-
-
-class PackageSpec:
-    def __init__(self, **kwargs):
-        vars(self).update(kwargs)
-
-
-class TraversableResourcesAdapter:
-    def __init__(self, spec):
-        self.spec = spec
-        self.loader = LoaderAdapter(spec)
-
-    def __getattr__(self, name):
-        return getattr(self.spec, name)
-
-
-class LoaderAdapter:
-    """
-    Adapt loaders to provide TraversableResources and other
-    compatibility.
-    """
-    def __init__(self, spec):
-        self.spec = spec
-
-    @property
-    def path(self):
-        # Python < 3
-        return self.spec.origin
-
-    def get_resource_reader(self, name):
-        # Python < 3.9
-        from . import readers
-
-        def _zip_reader(spec):
-            with suppress(AttributeError):
-                return readers.ZipReader(spec.loader, spec.name)
-
-        def _namespace_reader(spec):
-            with suppress(AttributeError, ValueError):
-                return readers.NamespaceReader(spec.submodule_search_locations)
-
-        def _available_reader(spec):
-            with suppress(AttributeError):
-                return spec.loader.get_resource_reader(spec.name)
-
-        def _native_reader(spec):
-            reader = _available_reader(spec)
-            return reader if hasattr(reader, 'files') else None
-
-        return (
-            # native reader if it supplies 'files'
-            _native_reader(self.spec) or
-            # local ZipReader if a zip module
-            _zip_reader(self.spec) or
-            # local NamespaceReader if a namespace module
-            _namespace_reader(self.spec) or
-            # local FileReader
-            readers.FileReader(self)
-            )
-
-
-def package_spec(package):
-    """
-    Construct a minimal package spec suitable for
-    matching the interfaces this library relies upon
-    in later Python versions.
-    """
-    spec = getattr(package, '__spec__', None) or \
-        PackageSpec(
-            origin=package.__file__,
-            loader=getattr(package, '__loader__', None),
-            name=package.__name__,
-            submodule_search_locations=getattr(package, '__path__', None),
-        )
-    return TraversableResourcesAdapter(spec)
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py3.py
+++ /dev/null
@@ -1,160 +0,0 @@
-import os
-import io
-
-from . import _common
-from contextlib import suppress
-from importlib.abc import ResourceLoader
-from io import BytesIO, TextIOWrapper
-from pathlib import Path
-from types import ModuleType
-from typing import Iterable, Iterator, Optional, Set, Union   # noqa: F401
-from typing import cast
-from typing.io import BinaryIO, TextIO
-from collections.abc import Sequence
-from functools import singledispatch
-
-if False:  # TYPE_CHECKING
-    from typing import ContextManager
-
-Package = Union[ModuleType, str]
-Resource = Union[str, os.PathLike]
-
-
-def open_binary(package: Package, resource: Resource) -> BinaryIO:
-    """Return a file-like object opened for binary reading of the resource."""
-    resource = _common.normalize_path(resource)
-    package = _common.get_package(package)
-    reader = _common.get_resource_reader(package)
-    if reader is not None:
-        return reader.open_resource(resource)
-    # Using pathlib doesn't work well here due to the lack of 'strict'
-    # argument for pathlib.Path.resolve() prior to Python 3.6.
-    if package.__spec__.submodule_search_locations is not None:
-        paths = package.__spec__.submodule_search_locations
-    elif package.__spec__.origin is not None:
-        paths = [os.path.dirname(os.path.abspath(package.__spec__.origin))]
-
-    for package_path in paths:
-        full_path = os.path.join(package_path, resource)
-        try:
-            return open(full_path, mode='rb')
-        except OSError:
-            # Just assume the loader is a resource loader; all the relevant
-            # importlib.machinery loaders are and an AttributeError for
-            # get_data() will make it clear what is needed from the loader.
-            loader = cast(ResourceLoader, package.__spec__.loader)
-            data = None
-            if hasattr(package.__spec__.loader, 'get_data'):
-                with suppress(OSError):
-                    data = loader.get_data(full_path)
-            if data is not None:
-                return BytesIO(data)
-
-    raise FileNotFoundError('{!r} resource not found in {!r}'.format(
-        resource, package.__spec__.name))
-
-
-def open_text(package: Package,
-              resource: Resource,
-              encoding: str = 'utf-8',
-              errors: str = 'strict') -> TextIO:
-    """Return a file-like object opened for text reading of the resource."""
-    return TextIOWrapper(
-        open_binary(package, resource), encoding=encoding, errors=errors)
-
-
-def read_binary(package: Package, resource: Resource) -> bytes:
-    """Return the binary contents of the resource."""
-    with open_binary(package, resource) as fp:
-        return fp.read()
-
-
-def read_text(package: Package,
-              resource: Resource,
-              encoding: str = 'utf-8',
-              errors: str = 'strict') -> str:
-    """Return the decoded string of the resource.
-
-    The decoding-related arguments have the same semantics as those of
-    bytes.decode().
-    """
-    with open_text(package, resource, encoding, errors) as fp:
-        return fp.read()
-
-
-def path(
-        package: Package, resource: Resource,
-        ) -> 'ContextManager[Path]':
-    """A context manager providing a file path object to the resource.
-
-    If the resource does not already exist on its own on the file system,
-    a temporary file will be created. If the file was created, the file
-    will be deleted upon exiting the context manager (no exception is
-    raised if the file was deleted prior to the context manager
-    exiting).
-    """
-    reader = _common.get_resource_reader(_common.get_package(package))
-    return (
-        _path_from_reader(reader, _common.normalize_path(resource))
-        if reader else
-        _common.as_file(
-            _common.files(package).joinpath(_common.normalize_path(resource)))
-        )
-
-
-def _path_from_reader(reader, resource):
-    return _path_from_resource_path(reader, resource) or \
-        _path_from_open_resource(reader, resource)
-
-
-def _path_from_resource_path(reader, resource):
-    with suppress(FileNotFoundError):
-        return Path(reader.resource_path(resource))
-
-
-def _path_from_open_resource(reader, resource):
-    saved = io.BytesIO(reader.open_resource(resource).read())
-    return _common._tempfile(saved.read, suffix=resource)
-
-
-def is_resource(package: Package, name: str) -> bool:
-    """True if `name` is a resource inside `package`.
-
-    Directories are *not* resources.
-    """
-    package = _common.get_package(package)
-    _common.normalize_path(name)
-    reader = _common.get_resource_reader(package)
-    if reader is not None:
-        return reader.is_resource(name)
-    package_contents = set(contents(package))
-    if name not in package_contents:
-        return False
-    return (_common.from_package(package) / name).is_file()
-
-
-def contents(package: Package) -> Iterable[str]:
-    """Return an iterable of entries in `package`.
-
-    Note that not all entries are resources.  Specifically, directories are
-    not considered resources.  Use `is_resource()` on each entry returned here
-    to check if it is a resource or not.
-    """
-    package = _common.get_package(package)
-    reader = _common.get_resource_reader(package)
-    if reader is not None:
-        return _ensure_sequence(reader.contents())
-    transversable = _common.from_package(package)
-    if transversable.is_dir():
-        return list(item.name for item in transversable.iterdir())
-    return []
-
-
-@singledispatch
-def _ensure_sequence(iterable):
-    return list(iterable)
-
-
-@_ensure_sequence.register(Sequence)
-def _(iterable):
-    return iterable
deleted file mode 100644
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/readers.py
+++ /dev/null
@@ -1,123 +0,0 @@
-import os.path
-
-from collections import OrderedDict
-
-from . import abc
-
-from ._compat import Path, ZipPath
-from ._compat import FileNotFoundError, NotADirectoryError
-
-
-class FileReader(abc.TraversableResources):
-    def __init__(self, loader):
-        self.path = Path(loader.path).parent
-
-    def resource_path(self, resource):
-        """
-        Return the file system path to prevent
-        `resources.path()` from creating a temporary
-        copy.
-        """
-        return str(self.path.joinpath(resource))
-
-    def files(self):
-        return self.path
-
-
-class ZipReader(abc.TraversableResources):
-    def __init__(self, loader, module):
-        _, _, name = module.rpartition('.')
-        self.prefix = loader.prefix.replace('\\', '/') + name + '/'
-        self.archive = loader.archive
-
-    def open_resource(self, resource):
-        try:
-            return super().open_resource(resource)
-        except KeyError as exc:
-            raise FileNotFoundError(exc.args[0])
-
-    def is_resource(self, path):
-        # workaround for `zipfile.Path.is_file` returning true
-        # for non-existent paths.
-        target = self.files().joinpath(path)
-        return target.is_file() and target.exists()
-
-    def files(self):
-        return ZipPath(self.archive, self.prefix)
-
-
-class MultiplexedPath(abc.Traversable):
-    """
-    Given a series of Traversable objects, implement a merged
-    version of the interface across all objects. Useful for
-    namespace packages which may be multihomed at a single
-    name.
-    """
-    def __init__(self, *paths):
-        paths = list(OrderedDict.fromkeys(paths))  # remove duplicates
-        self._paths = list(map(Path, paths))
-        if not self._paths:
-            message = 'MultiplexedPath must contain at least one path'
-            raise FileNotFoundError(message)
-        if any(not path.is_dir() for path in self._paths):
-            raise NotADirectoryError(
-                'MultiplexedPath only supports directories')
-
-    def iterdir(self):
-        visited = []
-        for path in self._paths:
-            for file in path.iterdir():
-                if file.name in visited:
-                    continue
-                visited.append(file.name)
-                yield file
-
-    def read_bytes(self):
-        raise FileNotFoundError('{} is not a file'.format(self))
-
-    def read_text(self, *args, **kwargs):
-        raise FileNotFoundError('{} is not a file'.format(self))
-
-    def is_dir(self):
-        return True
-
-    def is_file(self):
-        return False
-
-    def joinpath(self, child):
-        # first try to find child in current paths
-        for file in self.iterdir():
-            if file.name == child:
-                return file
-        # if it does not exist, construct it with the first path
-        return self._paths[0] / child
-
-    __truediv__ = joinpath
-
-    def open(self, *args, **kwargs):
-        raise FileNotFoundError('{} is not a file'.format(self))
-
-    def name(self):
-        return os.path.basename(self._paths[0])
-
-    def __repr__(self):
-        return 'MultiplexedPath({})'.format(
-            ', '.join("'{}'".format(path) for path in self._paths))
-
-
-class NamespaceReader(abc.TraversableResources):
-    def __init__(self, namespace_path):
-        if 'NamespacePath' not in str(namespace_path):
-            raise ValueError('Invalid path')
-        self.path = MultiplexedPath(*list(namespace_path))
-
-    def resource_path(self, resource):
-        """
-        Return the file system path to prevent
-        `resources.path()` from creating a temporary
-        copy.
-        """
-        return str(self.path.joinpath(resource))
-
-    def files(self):
-        return self.path
rename from third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/LICENSE.txt
rename to third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/LICENSE.txt
rename from third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/METADATA
rename to third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/METADATA
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/RECORD
@@ -0,0 +1,7 @@
+_scandir.cpython-38-darwin.so,sha256=3a2UitVjb1MS0I7WSOp7jPGHsKf-ctNYTrBvDmPupOg,27780
+scandir.py,sha256=97C2AQInuKk-Phb3aXM7fJomhc-00pZMcBur23NUmrE,24827
+scandir-1.10.0.dist-info/LICENSE.txt,sha256=peL73COXREGdKUB828knk8TZwdlWwXT3y3-W-m0FjIY,1464
+scandir-1.10.0.dist-info/METADATA,sha256=cv1fZ5DeC3DJqnMByWGiprvGhLpQCkWOZiJduweakGk,9559
+scandir-1.10.0.dist-info/WHEEL,sha256=NqgkTkAaRJaCuArPZklUp2tBwn6obHN9aMIfdfLfNkU,110
+scandir-1.10.0.dist-info/top_level.txt,sha256=Ixze5mNjmis99ql7JEtAYc9-djJMbfRx-FFw3R_zZf8,17
+scandir-1.10.0.dist-info/RECORD,,
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.34.2)
+Root-Is-Purelib: false
+Tag: cp38-cp38-macosx_10_15_x86_64
+
rename from third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/top_level.txt
rename to third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/top_level.txt
rename from third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir.py
rename to third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir.py
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/RECORD
+++ /dev/null
@@ -1,6 +0,0 @@
-scandir.py,sha256=97C2AQInuKk-Phb3aXM7fJomhc-00pZMcBur23NUmrE,24827
-scandir-1.10.0.dist-info/LICENSE.txt,sha256=peL73COXREGdKUB828knk8TZwdlWwXT3y3-W-m0FjIY,1464
-scandir-1.10.0.dist-info/METADATA,sha256=cv1fZ5DeC3DJqnMByWGiprvGhLpQCkWOZiJduweakGk,9559
-scandir-1.10.0.dist-info/WHEEL,sha256=WO4o60shExe_A5pkiO6Yb-8OHLGhlAGcs2oJ7aUuE5Q,110
-scandir-1.10.0.dist-info/top_level.txt,sha256=Ixze5mNjmis99ql7JEtAYc9-djJMbfRx-FFw3R_zZf8,17
-scandir-1.10.0.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.35.1)
-Root-Is-Purelib: false
-Tag: cp39-cp39-macosx_10_15_x86_64
-
rename from third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/LICENSE
rename to third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/LICENSE
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/METADATA
@@ -0,0 +1,52 @@
+Metadata-Version: 2.1
+Name: zipp
+Version: 3.1.0
+Summary: Backport of pathlib-compatible object wrapper for zip files
+Home-page: https://github.com/jaraco/zipp
+Author: Jason R. Coombs
+Author-email: jaraco@jaraco.com
+License: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3 :: Only
+Requires-Python: >=3.6
+Provides-Extra: docs
+Requires-Dist: sphinx ; extra == 'docs'
+Requires-Dist: jaraco.packaging (>=3.2) ; extra == 'docs'
+Requires-Dist: rst.linker (>=1.9) ; extra == 'docs'
+Provides-Extra: testing
+Requires-Dist: jaraco.itertools ; extra == 'testing'
+Requires-Dist: func-timeout ; extra == 'testing'
+
+.. image:: https://img.shields.io/pypi/v/zipp.svg
+   :target: `PyPI link`_
+
+.. image:: https://img.shields.io/pypi/pyversions/zipp.svg
+   :target: `PyPI link`_
+
+.. _PyPI link: https://pypi.org/project/zipp
+
+.. image:: https://dev.azure.com/jaraco/zipp/_apis/build/status/jaraco.zipp?branchName=master
+   :target: https://dev.azure.com/jaraco/zipp/_build/latest?definitionId=1&branchName=master
+
+.. image:: https://img.shields.io/travis/jaraco/zipp/master.svg
+   :target: https://travis-ci.org/jaraco/zipp
+
+.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
+   :target: https://github.com/psf/black
+   :alt: Code style: Black
+
+.. image:: https://img.shields.io/appveyor/ci/jaraco/zipp/master.svg
+   :target: https://ci.appveyor.com/project/jaraco/zipp/branch/master
+
+.. .. image:: https://readthedocs.org/projects/zipp/badge/?version=latest
+..    :target: https://zipp.readthedocs.io/en/latest/?badge=latest
+
+
+A pathlib-compatible Zipfile object wrapper. A backport of the
+`Path object <https://docs.python.org/3.8/library/zipfile.html#path-objects>`_.
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/RECORD
@@ -0,0 +1,6 @@
+zipp.py,sha256=o8W25XfoR5DD_krEQLbYrNMmK-x26JvaqeKuboC91YY,7121
+zipp-3.1.0.dist-info/LICENSE,sha256=2z8CRrH5J48VhFuZ_sR4uLUG63ZIeZNyL4xuJUKF-vg,1050
+zipp-3.1.0.dist-info/METADATA,sha256=EbCdCb8ZzwzYDA7RF8R830VeruipjOKnj32zpMxPsFM,1899
+zipp-3.1.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
+zipp-3.1.0.dist-info/top_level.txt,sha256=iAbdoSHfaGqBfVb2XuR9JqSQHCoOsOtG6y9C_LSpqFw,5
+zipp-3.1.0.dist-info/RECORD,,
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.34.2)
+Root-Is-Purelib: true
+Tag: py3-none-any
+
rename from third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/top_level.txt
rename to third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/top_level.txt
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp.py
@@ -0,0 +1,285 @@
+import io
+import posixpath
+import zipfile
+import itertools
+import contextlib
+import sys
+
+if sys.version_info < (3, 7):
+    from collections import OrderedDict
+else:
+    OrderedDict = dict
+
+
+def _parents(path):
+    """
+    Given a path with elements separated by
+    posixpath.sep, generate all parents of that path.
+
+    >>> list(_parents('b/d'))
+    ['b']
+    >>> list(_parents('/b/d/'))
+    ['/b']
+    >>> list(_parents('b/d/f/'))
+    ['b/d', 'b']
+    >>> list(_parents('b'))
+    []
+    >>> list(_parents(''))
+    []
+    """
+    return itertools.islice(_ancestry(path), 1, None)
+
+
+def _ancestry(path):
+    """
+    Given a path with elements separated by
+    posixpath.sep, generate all elements of that path
+
+    >>> list(_ancestry('b/d'))
+    ['b/d', 'b']
+    >>> list(_ancestry('/b/d/'))
+    ['/b/d', '/b']
+    >>> list(_ancestry('b/d/f/'))
+    ['b/d/f', 'b/d', 'b']
+    >>> list(_ancestry('b'))
+    ['b']
+    >>> list(_ancestry(''))
+    []
+    """
+    path = path.rstrip(posixpath.sep)
+    while path and path != posixpath.sep:
+        yield path
+        path, tail = posixpath.split(path)
+
+
+_dedupe = OrderedDict.fromkeys
+"""Deduplicate an iterable in original order"""
+
+
+def _difference(minuend, subtrahend):
+    """
+    Return items in minuend not in subtrahend, retaining order
+    with O(1) lookup.
+    """
+    return itertools.filterfalse(set(subtrahend).__contains__, minuend)
+
+
+class CompleteDirs(zipfile.ZipFile):
+    """
+    A ZipFile subclass that ensures that implied directories
+    are always included in the namelist.
+    """
+
+    @staticmethod
+    def _implied_dirs(names):
+        parents = itertools.chain.from_iterable(map(_parents, names))
+        as_dirs = (p + posixpath.sep for p in parents)
+        return _dedupe(_difference(as_dirs, names))
+
+    def namelist(self):
+        names = super(CompleteDirs, self).namelist()
+        return names + list(self._implied_dirs(names))
+
+    def _name_set(self):
+        return set(self.namelist())
+
+    def resolve_dir(self, name):
+        """
+        If the name represents a directory, return that name
+        as a directory (with the trailing slash).
+        """
+        names = self._name_set()
+        dirname = name + '/'
+        dir_match = name not in names and dirname in names
+        return dirname if dir_match else name
+
+    @classmethod
+    def make(cls, source):
+        """
+        Given a source (filename or zipfile), return an
+        appropriate CompleteDirs subclass.
+        """
+        if isinstance(source, CompleteDirs):
+            return source
+
+        if not isinstance(source, zipfile.ZipFile):
+            return cls(_pathlib_compat(source))
+
+        # Only allow for FastPath when supplied zipfile is read-only
+        if 'r' not in source.mode:
+            cls = CompleteDirs
+
+        res = cls.__new__(cls)
+        vars(res).update(vars(source))
+        return res
+
+
+class FastLookup(CompleteDirs):
+    """
+    ZipFile subclass to ensure implicit
+    dirs exist and are resolved rapidly.
+    """
+    def namelist(self):
+        with contextlib.suppress(AttributeError):
+            return self.__names
+        self.__names = super(FastLookup, self).namelist()
+        return self.__names
+
+    def _name_set(self):
+        with contextlib.suppress(AttributeError):
+            return self.__lookup
+        self.__lookup = super(FastLookup, self)._name_set()
+        return self.__lookup
+
+
+def _pathlib_compat(path):
+    """
+    For path-like objects, convert to a filename for compatibility
+    on Python 3.6.1 and earlier.
+    """
+    try:
+        return path.__fspath__()
+    except AttributeError:
+        return str(path)
+
+
+class Path:
+    """
+    A pathlib-compatible interface for zip files.
+
+    Consider a zip file with this structure::
+
+        .
+        ├── a.txt
+        └── b
+            ├── c.txt
+            └── d
+                └── e.txt
+
+    >>> data = io.BytesIO()
+    >>> zf = zipfile.ZipFile(data, 'w')
+    >>> zf.writestr('a.txt', 'content of a')
+    >>> zf.writestr('b/c.txt', 'content of c')
+    >>> zf.writestr('b/d/e.txt', 'content of e')
+    >>> zf.filename = 'abcde.zip'
+
+    Path accepts the zipfile object itself or a filename
+
+    >>> root = Path(zf)
+
+    From there, several path operations are available.
+
+    Directory iteration (including the zip file itself):
+
+    >>> a, b = root.iterdir()
+    >>> a
+    Path('abcde.zip', 'a.txt')
+    >>> b
+    Path('abcde.zip', 'b/')
+
+    name property:
+
+    >>> b.name
+    'b'
+
+    join with divide operator:
+
+    >>> c = b / 'c.txt'
+    >>> c
+    Path('abcde.zip', 'b/c.txt')
+    >>> c.name
+    'c.txt'
+
+    Read text:
+
+    >>> c.read_text()
+    'content of c'
+
+    existence:
+
+    >>> c.exists()
+    True
+    >>> (b / 'missing.txt').exists()
+    False
+
+    Coercion to string:
+
+    >>> str(c)
+    'abcde.zip/b/c.txt'
+    """
+
+    __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})"
+
+    def __init__(self, root, at=""):
+        self.root = FastLookup.make(root)
+        self.at = at
+
+    def open(self, mode='r', *args, pwd=None, **kwargs):
+        """
+        Open this entry as text or binary following the semantics
+        of ``pathlib.Path.open()`` by passing arguments through
+        to io.TextIOWrapper().
+        """
+        if self.is_dir():
+            raise IsADirectoryError(self)
+        zip_mode = mode[0]
+        if not self.exists() and zip_mode == 'r':
+            raise FileNotFoundError(self)
+        stream = self.root.open(self.at, zip_mode, pwd=pwd)
+        if 'b' in mode:
+            if args or kwargs:
+                raise ValueError("encoding args invalid for binary operation")
+            return stream
+        return io.TextIOWrapper(stream, *args, **kwargs)
+
+    @property
+    def name(self):
+        return posixpath.basename(self.at.rstrip("/"))
+
+    def read_text(self, *args, **kwargs):
+        with self.open('r', *args, **kwargs) as strm:
+            return strm.read()
+
+    def read_bytes(self):
+        with self.open('rb') as strm:
+            return strm.read()
+
+    def _is_child(self, path):
+        return posixpath.dirname(path.at.rstrip("/")) == self.at.rstrip("/")
+
+    def _next(self, at):
+        return Path(self.root, at)
+
+    def is_dir(self):
+        return not self.at or self.at.endswith("/")
+
+    def is_file(self):
+        return not self.is_dir()
+
+    def exists(self):
+        return self.at in self.root._name_set()
+
+    def iterdir(self):
+        if not self.is_dir():
+            raise ValueError("Can't listdir a file")
+        subs = map(self._next, self.root.namelist())
+        return filter(self._is_child, subs)
+
+    def __str__(self):
+        return posixpath.join(self.root.filename, self.at)
+
+    def __repr__(self):
+        return self.__repr.format(self=self)
+
+    def joinpath(self, add):
+        next = posixpath.join(self.at, _pathlib_compat(add))
+        return self._next(self.root.resolve_dir(next))
+
+    __truediv__ = joinpath
+
+    @property
+    def parent(self):
+        parent_at = posixpath.dirname(self.at.rstrip('/'))
+        if parent_at:
+            parent_at += '/'
+        return self._next(parent_at)
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/METADATA
+++ /dev/null
@@ -1,54 +0,0 @@
-Metadata-Version: 2.1
-Name: zipp
-Version: 3.4.0
-Summary: Backport of pathlib-compatible object wrapper for zip files
-Home-page: https://github.com/jaraco/zipp
-Author: Jason R. Coombs
-Author-email: jaraco@jaraco.com
-License: UNKNOWN
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3 :: Only
-Requires-Python: >=3.6
-Provides-Extra: docs
-Requires-Dist: sphinx ; extra == 'docs'
-Requires-Dist: jaraco.packaging (>=3.2) ; extra == 'docs'
-Requires-Dist: rst.linker (>=1.9) ; extra == 'docs'
-Provides-Extra: testing
-Requires-Dist: pytest (!=3.7.3,>=3.5) ; extra == 'testing'
-Requires-Dist: pytest-checkdocs (>=1.2.3) ; extra == 'testing'
-Requires-Dist: pytest-flake8 ; extra == 'testing'
-Requires-Dist: pytest-cov ; extra == 'testing'
-Requires-Dist: jaraco.test (>=3.2.0) ; extra == 'testing'
-Requires-Dist: jaraco.itertools ; extra == 'testing'
-Requires-Dist: func-timeout ; extra == 'testing'
-Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing'
-Requires-Dist: pytest-mypy ; (platform_python_implementation != "PyPy") and extra == 'testing'
-
-.. image:: https://img.shields.io/pypi/v/zipp.svg
-   :target: `PyPI link`_
-
-.. image:: https://img.shields.io/pypi/pyversions/zipp.svg
-   :target: `PyPI link`_
-
-.. _PyPI link: https://pypi.org/project/zipp
-
-.. image:: https://github.com/jaraco/zipp/workflows/Automated%20Tests/badge.svg
-   :target: https://github.com/jaraco/zipp/actions?query=workflow%3A%22Automated+Tests%22
-   :alt: Automated Tests
-
-.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
-   :target: https://github.com/psf/black
-   :alt: Code style: Black
-
-.. .. image:: https://readthedocs.org/projects/zipp/badge/?version=latest
-..    :target: https://zipp.readthedocs.io/en/latest/?badge=latest
-
-
-A pathlib-compatible Zipfile object wrapper. A backport of the
-`Path object <https://docs.python.org/3.8/library/zipfile.html#path-objects>`_.
-
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/RECORD
+++ /dev/null
@@ -1,6 +0,0 @@
-zipp.py,sha256=wMSoYxAIPgYnqJAW0JcAl5sWaIcFc5xk3dNjf6ElGgU,8089
-zipp-3.4.0.dist-info/LICENSE,sha256=2z8CRrH5J48VhFuZ_sR4uLUG63ZIeZNyL4xuJUKF-vg,1050
-zipp-3.4.0.dist-info/METADATA,sha256=noSfks-ReGCmOSTxll7TELBJy0P_yAvVLa0FCFyhMeM,2134
-zipp-3.4.0.dist-info/WHEEL,sha256=EVRjI69F5qVjm_YgqcTXPnTAv3BfSUr0WVAHuSP3Xoo,92
-zipp-3.4.0.dist-info/top_level.txt,sha256=iAbdoSHfaGqBfVb2XuR9JqSQHCoOsOtG6y9C_LSpqFw,5
-zipp-3.4.0.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.35.1)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp.py
+++ /dev/null
@@ -1,314 +0,0 @@
-import io
-import posixpath
-import zipfile
-import itertools
-import contextlib
-import sys
-import pathlib
-
-if sys.version_info < (3, 7):
-    from collections import OrderedDict
-else:
-    OrderedDict = dict
-
-
-def _parents(path):
-    """
-    Given a path with elements separated by
-    posixpath.sep, generate all parents of that path.
-
-    >>> list(_parents('b/d'))
-    ['b']
-    >>> list(_parents('/b/d/'))
-    ['/b']
-    >>> list(_parents('b/d/f/'))
-    ['b/d', 'b']
-    >>> list(_parents('b'))
-    []
-    >>> list(_parents(''))
-    []
-    """
-    return itertools.islice(_ancestry(path), 1, None)
-
-
-def _ancestry(path):
-    """
-    Given a path with elements separated by
-    posixpath.sep, generate all elements of that path
-
-    >>> list(_ancestry('b/d'))
-    ['b/d', 'b']
-    >>> list(_ancestry('/b/d/'))
-    ['/b/d', '/b']
-    >>> list(_ancestry('b/d/f/'))
-    ['b/d/f', 'b/d', 'b']
-    >>> list(_ancestry('b'))
-    ['b']
-    >>> list(_ancestry(''))
-    []
-    """
-    path = path.rstrip(posixpath.sep)
-    while path and path != posixpath.sep:
-        yield path
-        path, tail = posixpath.split(path)
-
-
-_dedupe = OrderedDict.fromkeys
-"""Deduplicate an iterable in original order"""
-
-
-def _difference(minuend, subtrahend):
-    """
-    Return items in minuend not in subtrahend, retaining order
-    with O(1) lookup.
-    """
-    return itertools.filterfalse(set(subtrahend).__contains__, minuend)
-
-
-class CompleteDirs(zipfile.ZipFile):
-    """
-    A ZipFile subclass that ensures that implied directories
-    are always included in the namelist.
-    """
-
-    @staticmethod
-    def _implied_dirs(names):
-        parents = itertools.chain.from_iterable(map(_parents, names))
-        as_dirs = (p + posixpath.sep for p in parents)
-        return _dedupe(_difference(as_dirs, names))
-
-    def namelist(self):
-        names = super(CompleteDirs, self).namelist()
-        return names + list(self._implied_dirs(names))
-
-    def _name_set(self):
-        return set(self.namelist())
-
-    def resolve_dir(self, name):
-        """
-        If the name represents a directory, return that name
-        as a directory (with the trailing slash).
-        """
-        names = self._name_set()
-        dirname = name + '/'
-        dir_match = name not in names and dirname in names
-        return dirname if dir_match else name
-
-    @classmethod
-    def make(cls, source):
-        """
-        Given a source (filename or zipfile), return an
-        appropriate CompleteDirs subclass.
-        """
-        if isinstance(source, CompleteDirs):
-            return source
-
-        if not isinstance(source, zipfile.ZipFile):
-            return cls(_pathlib_compat(source))
-
-        # Only allow for FastLookup when supplied zipfile is read-only
-        if 'r' not in source.mode:
-            cls = CompleteDirs
-
-        source.__class__ = cls
-        return source
-
-
-class FastLookup(CompleteDirs):
-    """
-    ZipFile subclass to ensure implicit
-    dirs exist and are resolved rapidly.
-    """
-
-    def namelist(self):
-        with contextlib.suppress(AttributeError):
-            return self.__names
-        self.__names = super(FastLookup, self).namelist()
-        return self.__names
-
-    def _name_set(self):
-        with contextlib.suppress(AttributeError):
-            return self.__lookup
-        self.__lookup = super(FastLookup, self)._name_set()
-        return self.__lookup
-
-
-def _pathlib_compat(path):
-    """
-    For path-like objects, convert to a filename for compatibility
-    on Python 3.6.1 and earlier.
-    """
-    try:
-        return path.__fspath__()
-    except AttributeError:
-        return str(path)
-
-
-class Path:
-    """
-    A pathlib-compatible interface for zip files.
-
-    Consider a zip file with this structure::
-
-        .
-        ├── a.txt
-        └── b
-            ├── c.txt
-            └── d
-                └── e.txt
-
-    >>> data = io.BytesIO()
-    >>> zf = zipfile.ZipFile(data, 'w')
-    >>> zf.writestr('a.txt', 'content of a')
-    >>> zf.writestr('b/c.txt', 'content of c')
-    >>> zf.writestr('b/d/e.txt', 'content of e')
-    >>> zf.filename = 'mem/abcde.zip'
-
-    Path accepts the zipfile object itself or a filename
-
-    >>> root = Path(zf)
-
-    From there, several path operations are available.
-
-    Directory iteration (including the zip file itself):
-
-    >>> a, b = root.iterdir()
-    >>> a
-    Path('mem/abcde.zip', 'a.txt')
-    >>> b
-    Path('mem/abcde.zip', 'b/')
-
-    name property:
-
-    >>> b.name
-    'b'
-
-    join with divide operator:
-
-    >>> c = b / 'c.txt'
-    >>> c
-    Path('mem/abcde.zip', 'b/c.txt')
-    >>> c.name
-    'c.txt'
-
-    Read text:
-
-    >>> c.read_text()
-    'content of c'
-
-    existence:
-
-    >>> c.exists()
-    True
-    >>> (b / 'missing.txt').exists()
-    False
-
-    Coercion to string:
-
-    >>> import os
-    >>> str(c).replace(os.sep, posixpath.sep)
-    'mem/abcde.zip/b/c.txt'
-
-    At the root, ``name``, ``filename``, and ``parent``
-    resolve to the zipfile. Note these attributes are not
-    valid and will raise a ``ValueError`` if the zipfile
-    has no filename.
-
-    >>> root.name
-    'abcde.zip'
-    >>> str(root.filename).replace(os.sep, posixpath.sep)
-    'mem/abcde.zip'
-    >>> str(root.parent)
-    'mem'
-    """
-
-    __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})"
-
-    def __init__(self, root, at=""):
-        """
-        Construct a Path from a ZipFile or filename.
-
-        Note: When the source is an existing ZipFile object,
-        its type (__class__) will be mutated to a
-        specialized type. If the caller wishes to retain the
-        original type, the caller should either create a
-        separate ZipFile object or pass a filename.
-        """
-        self.root = FastLookup.make(root)
-        self.at = at
-
-    def open(self, mode='r', *args, pwd=None, **kwargs):
-        """
-        Open this entry as text or binary following the semantics
-        of ``pathlib.Path.open()`` by passing arguments through
-        to io.TextIOWrapper().
-        """
-        if self.is_dir():
-            raise IsADirectoryError(self)
-        zip_mode = mode[0]
-        if not self.exists() and zip_mode == 'r':
-            raise FileNotFoundError(self)
-        stream = self.root.open(self.at, zip_mode, pwd=pwd)
-        if 'b' in mode:
-            if args or kwargs:
-                raise ValueError("encoding args invalid for binary operation")
-            return stream
-        return io.TextIOWrapper(stream, *args, **kwargs)
-
-    @property
-    def name(self):
-        return pathlib.Path(self.at).name or self.filename.name
-
-    @property
-    def filename(self):
-        return pathlib.Path(self.root.filename).joinpath(self.at)
-
-    def read_text(self, *args, **kwargs):
-        with self.open('r', *args, **kwargs) as strm:
-            return strm.read()
-
-    def read_bytes(self):
-        with self.open('rb') as strm:
-            return strm.read()
-
-    def _is_child(self, path):
-        return posixpath.dirname(path.at.rstrip("/")) == self.at.rstrip("/")
-
-    def _next(self, at):
-        return self.__class__(self.root, at)
-
-    def is_dir(self):
-        return not self.at or self.at.endswith("/")
-
-    def is_file(self):
-        return self.exists() and not self.is_dir()
-
-    def exists(self):
-        return self.at in self.root._name_set()
-
-    def iterdir(self):
-        if not self.is_dir():
-            raise ValueError("Can't listdir a file")
-        subs = map(self._next, self.root.namelist())
-        return filter(self._is_child, subs)
-
-    def __str__(self):
-        return posixpath.join(self.root.filename, self.at)
-
-    def __repr__(self):
-        return self.__repr.format(self=self)
-
-    def joinpath(self, *other):
-        next = posixpath.join(self.at, *map(_pathlib_compat, other))
-        return self._next(self.root.resolve_dir(next))
-
-    __truediv__ = joinpath
-
-    @property
-    def parent(self):
-        if not self.at:
-            return self.filename.parent
-        parent_at = posixpath.dirname(self.at.rstrip('/'))
-        if parent_at:
-            parent_at += '/'
-        return self._next(parent_at)
--- a/third_party/python/virtualenv/distributions.json
+++ b/third_party/python/virtualenv/distributions.json
@@ -16,68 +16,68 @@
     }
   },
   "3.7": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info",
-      "zipp": "__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info"
+      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info",
+      "zipp": "__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info"
     }
   },
   "3.6": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info",
-      "zipp": "__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info",
-      "importlib_resources": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info"
+      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info",
+      "zipp": "__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info",
+      "importlib_resources": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info"
     }
   },
   "3.5": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info",
+      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info",
       "zipp": "__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info",
-      "importlib_resources": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info"
+      "importlib_resources": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info"
     }
   },
   "3.4": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info",
       "importlib_metadata": "__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata-1.1.3.dist-info",
       "zipp": "__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info",
       "importlib_resources": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources-1.0.2.dist-info",
       "typing": "__virtualenv__/typing-3.7.4.1-py3-none-any/typing-3.7.4.1.dist-info",
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info",
-      "scandir": "__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info"
+      "scandir": "__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info"
     }
   },
   "2.7": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info",
       "importlib_metadata": "__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata-1.1.3.dist-info",
       "zipp": "__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info",
       "importlib_resources": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources-1.0.2.dist-info",
       "typing": "__virtualenv__/typing-3.7.4.3-py2-none-any/typing-3.7.4.3.dist-info",
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info",
-      "scandir": "__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info",
+      "scandir": "__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info",
       "contextlib2": "__virtualenv__/contextlib2-0.6.0.post1-py2.py3-none-any/contextlib2-0.6.0.post1.dist-info",
       "configparser": "__virtualenv__/configparser-4.0.2-py2.py3-none-any/configparser-4.0.2.dist-info"
     },
     "!=win32": {
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info"
     }
   }
 }
\ No newline at end of file
--- a/third_party/python/virtualenv/modules.json
+++ b/third_party/python/virtualenv/modules.json
@@ -67,19 +67,28 @@
       "distlib.wheel": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/wheel.py",
       "distlib._backport": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/__init__.py",
       "distlib._backport.misc": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/misc.py",
       "distlib._backport.shutil": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/shutil.py",
       "distlib._backport.sysconfig": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/sysconfig.py",
       "distlib._backport.tarfile": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/tarfile.py",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock.py",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six.py",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/__init__.py",
-      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/_compat.py",
-      "zipp": "__virtualenv__/zipp-3.4.0-py3-none-any/zipp.py"
+      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py",
+      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py",
+      "importlib_metadata.docs": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/__init__.py",
+      "importlib_metadata.docs.conf": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/conf.py",
+      "importlib_metadata.tests": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/__init__.py",
+      "importlib_metadata.tests.fixtures": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/fixtures.py",
+      "importlib_metadata.tests.test_api": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_api.py",
+      "importlib_metadata.tests.test_integration": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_integration.py",
+      "importlib_metadata.tests.test_main": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_main.py",
+      "importlib_metadata.tests.test_zip": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_zip.py",
+      "importlib_metadata.tests.data": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/data/__init__.py",
+      "zipp": "__virtualenv__/zipp-3.1.0-py3-none-any/zipp.py"
     }
   },
   "3.6": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/__init__.py",
       "distlib.compat": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/compat.py",
       "distlib.database": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/database.py",
@@ -95,44 +104,53 @@
       "distlib.wheel": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/wheel.py",
       "distlib._backport": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/__init__.py",
       "distlib._backport.misc": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/misc.py",
       "distlib._backport.shutil": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/shutil.py",
       "distlib._backport.sysconfig": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/sysconfig.py",
       "distlib._backport.tarfile": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/tarfile.py",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock.py",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six.py",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/__init__.py",
-      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/_compat.py",
-      "zipp": "__virtualenv__/zipp-3.4.0-py3-none-any/zipp.py",
-      "importlib_resources": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/__init__.py",
-      "importlib_resources._common": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_common.py",
-      "importlib_resources._compat": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_compat.py",
-      "importlib_resources._py2": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py2.py",
-      "importlib_resources._py3": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py3.py",
-      "importlib_resources.abc": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/abc.py",
-      "importlib_resources.readers": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/readers.py",
-      "importlib_resources.trees": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/trees.py",
-      "importlib_resources.tests": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/__init__.py",
-      "importlib_resources.tests._compat": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/_compat.py",
-      "importlib_resources.tests.py27compat": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/py27compat.py",
-      "importlib_resources.tests.test_files": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_files.py",
-      "importlib_resources.tests.test_open": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_open.py",
-      "importlib_resources.tests.test_path": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_path.py",
-      "importlib_resources.tests.test_read": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_read.py",
-      "importlib_resources.tests.test_reader": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_reader.py",
-      "importlib_resources.tests.test_resource": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_resource.py",
-      "importlib_resources.tests.util": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/util.py",
-      "importlib_resources.tests.data01": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/data01/__init__.py",
-      "importlib_resources.tests.data01.subdirectory": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/data01/subdirectory/__init__.py",
-      "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
-      "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
-      "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
-      "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
-      "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py"
+      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py",
+      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py",
+      "importlib_metadata.docs": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/__init__.py",
+      "importlib_metadata.docs.conf": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/conf.py",
+      "importlib_metadata.tests": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/__init__.py",
+      "importlib_metadata.tests.fixtures": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/fixtures.py",
+      "importlib_metadata.tests.test_api": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_api.py",
+      "importlib_metadata.tests.test_integration": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_integration.py",
+      "importlib_metadata.tests.test_main": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_main.py",
+      "importlib_metadata.tests.test_zip": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_zip.py",
+      "importlib_metadata.tests.data": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/data/__init__.py",
+      "zipp": "__virtualenv__/zipp-3.1.0-py3-none-any/zipp.py",
+      "importlib_resources": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/__init__.py",
+      "importlib_resources._common": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py",
+      "importlib_resources._compat": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_compat.py",
+      "importlib_resources._py2": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py2.py",
+      "importlib_resources._py3": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py3.py",
+      "importlib_resources.abc": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/abc.py",
+      "importlib_resources.readers": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/readers.py",
+      "importlib_resources.trees": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/trees.py",
+      "importlib_resources.tests": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/__init__.py",
+      "importlib_resources.tests.test_files": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_files.py",
+      "importlib_resources.tests.test_open": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_open.py",
+      "importlib_resources.tests.test_path": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_path.py",
+      "importlib_resources.tests.test_read": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_read.py",
+      "importlib_resources.tests.test_resource": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_resource.py",
+      "importlib_resources.tests.util": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/util.py",
+      "importlib_resources.tests.data01": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data01/__init__.py",
+      "importlib_resources.tests.data01.subdirectory": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data01/subdirectory/__init__.py",
+      "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
+      "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
+      "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
+      "importlib_resources.tests.data03": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/__init__.py",
+      "importlib_resources.tests.data03.namespace.portion1": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/namespace/portion1/__init__.py",
+      "importlib_resources.tests.data03.namespace.portion2": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/namespace/portion2/__init__.py",
+      "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
+      "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py"
     }
   },
   "3.5": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/__init__.py",
       "distlib.compat": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/compat.py",
       "distlib.database": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/database.py",
@@ -148,44 +166,53 @@
       "distlib.wheel": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/wheel.py",
       "distlib._backport": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/__init__.py",
       "distlib._backport.misc": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/misc.py",
       "distlib._backport.shutil": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/shutil.py",
       "distlib._backport.sysconfig": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/sysconfig.py",
       "distlib._backport.tarfile": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/tarfile.py",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock.py",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six.py",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/__init__.py",
-      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/_compat.py",
+      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py",
+      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py",
+      "importlib_metadata.docs": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/__init__.py",
+      "importlib_metadata.docs.conf": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/conf.py",
+      "importlib_metadata.tests": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/__init__.py",
+      "importlib_metadata.tests.fixtures": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/fixtures.py",
+      "importlib_metadata.tests.test_api": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_api.py",
+      "importlib_metadata.tests.test_integration": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_integration.py",
+      "importlib_metadata.tests.test_main": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_main.py",
+      "importlib_metadata.tests.test_zip": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_zip.py",
+      "importlib_metadata.tests.data": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/data/__init__.py",
       "zipp": "__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp.py",
-      "importlib_resources": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/__init__.py",
-      "importlib_resources._common": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_common.py",
-      "importlib_resources._compat": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_compat.py",
-      "importlib_resources._py2": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py2.py",
-      "importlib_resources._py3": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py3.py",
-      "importlib_resources.abc": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/abc.py",
-      "importlib_resources.readers": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/readers.py",
-      "importlib_resources.trees": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/trees.py",
-      "importlib_resources.tests": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/__init__.py",
-      "importlib_resources.tests._compat": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/_compat.py",
-      "importlib_resources.tests.py27compat": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/py27compat.py",
-      "importlib_resources.tests.test_files": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_files.py",
-      "importlib_resources.tests.test_open": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_open.py",
-      "importlib_resources.tests.test_path": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_path.py",
-      "importlib_resources.tests.test_read": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_read.py",
-      "importlib_resources.tests.test_reader": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_reader.py",
-      "importlib_resources.tests.test_resource": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_resource.py",
-      "importlib_resources.tests.util": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/util.py",
-      "importlib_resources.tests.data01": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/data01/__init__.py",
-      "importlib_resources.tests.data01.subdirectory": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/data01/subdirectory/__init__.py",
-      "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
-      "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
-      "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
-      "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
-      "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py"
+      "importlib_resources": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/__init__.py",
+      "importlib_resources._common": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py",
+      "importlib_resources._compat": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_compat.py",
+      "importlib_resources._py2": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py2.py",
+      "importlib_resources._py3": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py3.py",
+      "importlib_resources.abc": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/abc.py",
+      "importlib_resources.readers": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/readers.py",
+      "importlib_resources.trees": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/trees.py",
+      "importlib_resources.tests": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/__init__.py",
+      "importlib_resources.tests.test_files": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_files.py",
+      "importlib_resources.tests.test_open": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_open.py",
+      "importlib_resources.tests.test_path": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_path.py",
+      "importlib_resources.tests.test_read": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_read.py",
+      "importlib_resources.tests.test_resource": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_resource.py",
+      "importlib_resources.tests.util": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/util.py",
+      "importlib_resources.tests.data01": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data01/__init__.py",
+      "importlib_resources.tests.data01.subdirectory": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data01/subdirectory/__init__.py",
+      "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
+      "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
+      "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
+      "importlib_resources.tests.data03": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/__init__.py",
+      "importlib_resources.tests.data03.namespace.portion1": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/namespace/portion1/__init__.py",
+      "importlib_resources.tests.data03.namespace.portion2": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/namespace/portion2/__init__.py",
+      "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
+      "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py"
     }
   },
   "3.4": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/__init__.py",
       "distlib.compat": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/compat.py",
       "distlib.database": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/database.py",
@@ -235,17 +262,17 @@
       "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
       "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
       "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
       "importlib_resources.tests.data03": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data03/__init__.py",
       "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
       "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py",
       "typing": "__virtualenv__/typing-3.7.4.1-py3-none-any/typing.py",
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2/__init__.py",
-      "scandir": "__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir.py"
+      "scandir": "__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir.py"
     }
   },
   "2.7": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/__init__.py",
       "distlib.compat": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/compat.py",
       "distlib.database": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/database.py",
@@ -295,17 +322,17 @@
       "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
       "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
       "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
       "importlib_resources.tests.data03": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data03/__init__.py",
       "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
       "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py",
       "typing": "__virtualenv__/typing-3.7.4.3-py2-none-any/typing.py",
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2/__init__.py",
-      "scandir": "__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir.py",
+      "scandir": "__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir.py",
       "contextlib2": "__virtualenv__/contextlib2-0.6.0.post1-py2.py3-none-any/contextlib2.py",
       "configparser": "__virtualenv__/configparser-4.0.2-py2.py3-none-any/configparser.py",
       "backports": "__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/__init__.py",
       "backports.configparser": "__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/configparser/__init__.py",
       "backports.configparser.helpers": "__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/configparser/helpers.py"
     },
     "!=win32": {
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2/__init__.py"
rename from third_party/python/virtualenv/virtualenv-20.2.2.dist-info/LICENSE
rename to third_party/python/virtualenv/virtualenv-20.0.31.dist-info/LICENSE
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/virtualenv-20.0.31.dist-info/METADATA
@@ -0,0 +1,91 @@
+Metadata-Version: 2.1
+Name: virtualenv
+Version: 20.0.31
+Summary: Virtual Python Environment builder
+Home-page: https://virtualenv.pypa.io/
+Author: Bernat Gabor
+Author-email: gaborjbernat@gmail.com
+Maintainer: Bernat Gabor
+Maintainer-email: gaborjbernat@gmail.com
+License: MIT
+Project-URL: Source, https://github.com/pypa/virtualenv
+Project-URL: Tracker, https://github.com/pypa/virtualenv/issues
+Keywords: virtual,environments,isolated
+Platform: any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Software Development :: Testing
+Classifier: Topic :: Utilities
+Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7
+Description-Content-Type: text/markdown
+Requires-Dist: appdirs (<2,>=1.4.3)
+Requires-Dist: distlib (<1,>=0.3.1)
+Requires-Dist: filelock (<4,>=3.0.0)
+Requires-Dist: six (<2,>=1.9.0)
+Requires-Dist: pathlib2 (<3,>=2.3.3) ; python_version < "3.4" and sys_platform != "win32"
+Requires-Dist: importlib-resources (>=1.0) ; python_version < "3.7"
+Requires-Dist: importlib-metadata (<2,>=0.12) ; python_version < "3.8"
+Provides-Extra: docs
+Requires-Dist: proselint (>=0.10.2) ; extra == 'docs'
+Requires-Dist: sphinx (>=3) ; extra == 'docs'
+Requires-Dist: sphinx-argparse (>=0.2.5) ; extra == 'docs'
+Requires-Dist: sphinx-rtd-theme (>=0.4.3) ; extra == 'docs'
+Requires-Dist: towncrier (>=19.9.0rc1) ; extra == 'docs'
+Provides-Extra: testing
+Requires-Dist: coverage (>=5) ; extra == 'testing'
+Requires-Dist: coverage-enable-subprocess (>=1) ; extra == 'testing'
+Requires-Dist: flaky (>=3) ; extra == 'testing'
+Requires-Dist: pytest (>=4) ; extra == 'testing'
+Requires-Dist: pytest-env (>=0.6.2) ; extra == 'testing'
+Requires-Dist: pytest-freezegun (>=0.4.1) ; extra == 'testing'
+Requires-Dist: pytest-mock (>=2) ; extra == 'testing'
+Requires-Dist: pytest-randomly (>=1) ; extra == 'testing'
+Requires-Dist: pytest-timeout (>=1) ; extra == 'testing'
+Requires-Dist: pytest-xdist (>=1.31.0) ; extra == 'testing'
+Requires-Dist: packaging (>=20.0) ; (python_version > "3.4") and extra == 'testing'
+Requires-Dist: xonsh (>=0.9.16) ; (python_version > "3.4" and python_version != "3.9") and extra == 'testing'
+
+# virtualenv
+
+[![PyPI](https://img.shields.io/pypi/v/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
+[![PyPI - Implementation](https://img.shields.io/pypi/implementation/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
+[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
+[![Documentation](https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square)](http://virtualenv.pypa.io)
+[![Gitter Chat](https://img.shields.io/gitter/room/pypa/virtualenv?color=FF004F&style=flat-square)](https://gitter.im/pypa/virtualenv)
+[![PyPI - Downloads](https://img.shields.io/pypi/dm/virtualenv?style=flat-square)](https://pypistats.org/packages/virtualenv)
+[![PyPI - License](https://img.shields.io/pypi/l/virtualenv?style=flat-square)](https://opensource.org/licenses/MIT)
+[![Build Status](https://github.com/pypa/virtualenv/workflows/check/badge.svg?branch=master&event=push)](https://github.com/pypa/virtualenv/actions?query=workflow%3Acheck)
+[![codecov](https://codecov.io/gh/pypa/virtualenv/branch/master/graph/badge.svg)](https://codecov.io/gh/pypa/virtualenv)
+[![Code style:
+black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square)](https://github.com/psf/black)
+
+A tool for creating isolated `virtual` python environments.
+
+- [Installation](https://virtualenv.pypa.io/en/latest/installation.html)
+- [Documentation](https://virtualenv.pypa.io)
+- [Changelog](https://virtualenv.pypa.io/en/latest/changelog.html)
+- [Issues](https://github.com/pypa/virtualenv/issues)
+- [PyPI](https://pypi.org/project/virtualenv)
+- [Github](https://github.com/pypa/virtualenv)
+
+## Code of Conduct
+
+Everyone interacting in the virtualenv project's codebases, issue trackers, chat rooms, and mailing lists is expected to
+follow the [PSF Code of Conduct](https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md).
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/virtualenv-20.0.31.dist-info/RECORD
@@ -0,0 +1,120 @@
+virtualenv/__init__.py,sha256=SMvpjz4VJ3vJ_yfDDPzJAdi2GJOYd_UBXXuvImO07gk,205
+virtualenv/__main__.py,sha256=QMwDqrR4QbhEivl8yoRmAr6G1BY92gr4n1ConcDIxc4,2770
+virtualenv/info.py,sha256=-2pI_kyC9fNj5OR8AQWkKjlpOk4_96Lmbco3atYYBdY,1921
+virtualenv/report.py,sha256=M2OHHCWdOHZsn74tj1MYYKmaI3QRJF8VA1FZIdkQTMQ,1594
+virtualenv/version.py,sha256=3ieAw0XY11zpShwBdavzQZAO60AeVi5FVy0KWrcxwUY,66
+virtualenv/activation/__init__.py,sha256=jLIERxJXMnHq2fH49RdWqBoaiASres4CTKMdUJOeos0,480
+virtualenv/activation/activator.py,sha256=CXomkRvhzcAeygYlDwQdDjfPyZQG85aBab5GIVQPv2M,1341
+virtualenv/activation/via_template.py,sha256=B88RGc0qoGc46DmKJmLJuzcCJU_iXWhdD93r6KLuYHQ,2204
+virtualenv/activation/bash/__init__.py,sha256=7aC1WfvyzgFrIQs13jOuESuAbuiAnTsKkOe0iReRoaE,312
+virtualenv/activation/bash/activate.sh,sha256=xkIDykLyI5CO3K7eeAujgPiBP2eleYDTFsqhaXsOUG4,2249
+virtualenv/activation/batch/__init__.py,sha256=K0gVfwuXV7uoaMDL7moWGCq7uTDzI64giZzQQ8s2qnU,733
+virtualenv/activation/batch/activate.bat,sha256=PeQnWWsjvHT-jIWhYI7hbdzkDBZx5UOstnsCmq5PYtw,1031
+virtualenv/activation/batch/deactivate.bat,sha256=6OznnO-HC2wnWUN7YAT-bj815zeKMXEPC0keyBYwKUU,510
+virtualenv/activation/batch/pydoc.bat,sha256=pVuxn8mn9P_Rd0349fiBEiwIuMvfJQSfgJ2dljUT2fA,24
+virtualenv/activation/cshell/__init__.py,sha256=pw4s5idqQhaEccPxadETEvilBcoxW-UkVQ-RNqPyVCQ,344
+virtualenv/activation/cshell/activate.csh,sha256=jYwms8OTiVu9MJwXltuEm43HU09BJUqkrVqyj4sjpDA,1468
+virtualenv/activation/fish/__init__.py,sha256=hDkJq1P1wK2qm6BXydXWA9GMkBpj-TaejbKSceFnGZU,251
+virtualenv/activation/fish/activate.fish,sha256=V7nVwSI_nsFEMlJjSQxCayNWkjubXi1KSgSw1bEakh8,3099
+virtualenv/activation/powershell/__init__.py,sha256=EA-73s5TUMkgxAhLwucFg3gsBwW5huNh7qB4I7uEU-U,256
+virtualenv/activation/powershell/activate.ps1,sha256=qXTD2IZIPXIr3HZbNahnym8l3FFwa1o_pyB8cSmxeg0,1867
+virtualenv/activation/python/__init__.py,sha256=Uv53LqOrIT_2dO1FXcUYAnwH1eypG8CJ2InhSx1GRI4,1323
+virtualenv/activation/python/activate_this.py,sha256=Xpz7exdGSjmWk0KfwHLofIpDPUtazNSNGrxT0-5ZG_s,1208
+virtualenv/activation/xonsh/__init__.py,sha256=7NUevd5EpHRMZdSyR1KgFTe9QQBO94zZOwFH6MR6zjo,355
+virtualenv/activation/xonsh/activate.xsh,sha256=qkKgWfrUjYKrgrmhf45VuBz99EMadtiNU8GMfHZZ7AU,1172
+virtualenv/app_data/__init__.py,sha256=mOgHrNxZ320NcDvl2EU9Uhaq9XSwnJwkldKAWtrMCKo,1882
+virtualenv/app_data/base.py,sha256=wtoduyV2lc020XNdOwt5gu1lkUJd0n_LMrgT8nifAwo,2054
+virtualenv/app_data/na.py,sha256=fCISMfJt3opkAqCmJBZTW9tody6ECfVPXtSrY5ZJueY,1321
+virtualenv/app_data/via_disk_folder.py,sha256=bJxZIXTAqQekwRZuoYgAE1fvwQ6w1dBR2IJFe09OIjE,5404
+virtualenv/app_data/via_tempdir.py,sha256=vt4I1wAaNouOeFSTFX5DPbA3zPZ1ikVGzXBDsNLNHRM,771
+virtualenv/config/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/config/convert.py,sha256=msrkiG2Vq9gYQXf1C5W4n3b0ZTv6weFANV-mLUq6uMo,2091
+virtualenv/config/env_var.py,sha256=48XpOurSLLjMX-kXjvOpZuAoOUP-LvnbotTlmebhhFk,844
+virtualenv/config/ini.py,sha256=neMqXrA6IOkLF_M_MCQWQSeqNm4CT8tj_h3GdbJv1Cg,2783
+virtualenv/config/cli/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/config/cli/parser.py,sha256=y5IqHccLBqFpocpE75X611nVrP8v394VW94a9GAojvE,4524
+virtualenv/create/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/create/creator.py,sha256=D2YsK817anGhHxjh_ew7MlRCGjPPzW95lroRPlzblGk,8437
+virtualenv/create/debug.py,sha256=ETOke8w4Ib8fiufAHVeOkH3v0zrztljw3WjGvZyE0Mk,3342
+virtualenv/create/describe.py,sha256=bm0V2wpFOjdN_MkzZuJAEBSttmi5YGPVwxtwGYU5zQU,3561
+virtualenv/create/pyenv_cfg.py,sha256=VsOGfzUpaVCO3J29zrhIeip4jZ4b7llbe45iOQAIRGg,1717
+virtualenv/create/via_global_ref/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/create/via_global_ref/_virtualenv.py,sha256=aEuMB5MrpKhKwuWumv5J7wTpK6w9jUGR1FXPCdCT5fw,5662
+virtualenv/create/via_global_ref/api.py,sha256=uAQjwBRJ-u4d6A24QuxeB-khIrSGiP7-W_SQxNdE-Sk,4277
+virtualenv/create/via_global_ref/store.py,sha256=cqLBEhQ979xHnlidqmxlDjsvj2Wr-mBo7shvGQSEBxU,685
+virtualenv/create/via_global_ref/venv.py,sha256=A6XrGu3oco_ZIHv0s-TybW7lErAomgLOYDMtgpdACc0,2919
+virtualenv/create/via_global_ref/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/create/via_global_ref/builtin/builtin_way.py,sha256=hO22nT-itVoYiy8wXrXXYzHw86toCp_Uq-cURR7w6ck,546
+virtualenv/create/via_global_ref/builtin/ref.py,sha256=-r9sJSW9X9rHxThk2yyJJRA5KkmJPW_axuffYBsFDIU,5501
+virtualenv/create/via_global_ref/builtin/via_global_self_do.py,sha256=9aH07lmA6SMvtynv7ZTO6Gh2aDDFdUiDQrlbtT9xze4,4057
+virtualenv/create/via_global_ref/builtin/cpython/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/create/via_global_ref/builtin/cpython/common.py,sha256=_ycHGl1I4Pr7RfsXlUP0otJw9VQ0L744lTpPTTxPo6w,1909
+virtualenv/create/via_global_ref/builtin/cpython/cpython2.py,sha256=p41H2g6wAqhJzeUU48nH3u05-yWEbwCzhyj4pn8rnm4,3757
+virtualenv/create/via_global_ref/builtin/cpython/cpython3.py,sha256=9sY098at5Wp1Fhu1Aux1y06wH2ecbGj3bRucl4CGSQY,2473
+virtualenv/create/via_global_ref/builtin/cpython/mac_os.py,sha256=Hc9FVoQPuf8IV5j17LVj49lH7nyCep2nh_lWlZm49YI,12318
+virtualenv/create/via_global_ref/builtin/pypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/create/via_global_ref/builtin/pypy/common.py,sha256=KagqBNEuysqqO-n-VCCpuMvBK8MiZFMJQRWbWW12c6g,1696
+virtualenv/create/via_global_ref/builtin/pypy/pypy2.py,sha256=bmMY_KJZ1iD_ifq-X9ZBOlOpJ1aN7839qigBgnWRIdA,3535
+virtualenv/create/via_global_ref/builtin/pypy/pypy3.py,sha256=ti6hmOIC4HiTBnEYKytO-d9wH-eLeMoQxQ0kZRhnNrw,1751
+virtualenv/create/via_global_ref/builtin/python2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/create/via_global_ref/builtin/python2/python2.py,sha256=jkJwmkeJVTzwzo95eMIptTfdBA-qmyIqZcpt48iOitU,4276
+virtualenv/create/via_global_ref/builtin/python2/site.py,sha256=mp-Y1VLSXqhIeOojQefy8ffIylWqfq20jEfc2UwMTYU,6120
+virtualenv/discovery/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/discovery/builtin.py,sha256=1c4Py9DnkiCLrbHp7bffvQtJI9HkxfVyFedt6IFMKEs,5079
+virtualenv/discovery/cached_py_info.py,sha256=vQiAFDoBjR13zrdmc5q97z4upBxWzUG6H6IHJZjqjeU,5007
+virtualenv/discovery/discover.py,sha256=evJYn4APkwjNmdolNeIBSHiOudkvN59c5oVYI2Zsjlg,1209
+virtualenv/discovery/py_info.py,sha256=PMbQIitL6ELOJpAZF3rrMxPxM8oOmTK9aDvb4YHTDEw,21783
+virtualenv/discovery/py_spec.py,sha256=wQhLzCfXoSPsAAO9nm5-I2lNolVDux4W2vPSUfJGjlc,4790
+virtualenv/discovery/windows/__init__.py,sha256=TPbnzCtRyw47pRVHTO8ikwljNcczxmSLDdWtwasxvQU,1036
+virtualenv/discovery/windows/pep514.py,sha256=YYiaJzo-XuMtO78BMFMAudqkeJiLQkFnUTOuQZ5lJz8,5451
+virtualenv/run/__init__.py,sha256=REhXScKzirtvWjFpTZdepZCKIxcjsRHZtt3q5mDsrMQ,5771
+virtualenv/run/session.py,sha256=mzXJyVQlXXgj_kO9IJDor44Co7WKiyFGnZ0mCTIy5x0,2547
+virtualenv/run/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/run/plugin/activators.py,sha256=kmHShj36eHfbnsiAJzX0U5LYvGhe0WkRYjbuKDz6gVM,2117
+virtualenv/run/plugin/base.py,sha256=-2185C01PaxOG7gnMbWWyZlo24n_FYo5J5_naeNZw8s,1934
+virtualenv/run/plugin/creators.py,sha256=5L7G5mk2GIOIaZVvDZszd2VVBSUM3jkAR4aBO0OkOXY,3517
+virtualenv/run/plugin/discovery.py,sha256=ba9szD21er0-AkuMXrdFOjFEDsIekRWljXdXkj_-8EM,994
+virtualenv/run/plugin/seeders.py,sha256=XVKaikuOC4JUO4lirHzowEJ6d0pI1pFfywCx3heE70g,1026
+virtualenv/seed/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/seed/seeder.py,sha256=DSGE_8Ycj01vj8mkppUBA9h7JG76XsVBMt-5MWlMF6k,1178
+virtualenv/seed/embed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/seed/embed/base_embed.py,sha256=j4qcALcc-ylU0bKjVxiELPqk4MJ8f0pmbe_lVYVH_5Q,4166
+virtualenv/seed/embed/pip_invoke.py,sha256=EMVwIeoW15SuorJ8z_-vBxPXwQJLS0ILA0Va9zNoOLI,2127
+virtualenv/seed/embed/via_app_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/seed/embed/via_app_data/via_app_data.py,sha256=quofMFCWc-OxvxdAJwZTWS5mOugnYB7wRqSJZxmkl-E,6053
+virtualenv/seed/embed/via_app_data/pip_install/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/seed/embed/via_app_data/pip_install/base.py,sha256=rnR60JzM7G04cPDo2eH-aR8-iQuFXBgHJ2lQnSf0Gfs,6355
+virtualenv/seed/embed/via_app_data/pip_install/copy.py,sha256=gG2NePFHOYh-bsCf6TpsaQ_qrYhdBy67k0RWuwHSAwo,1307
+virtualenv/seed/embed/via_app_data/pip_install/symlink.py,sha256=wHCpfKobvjjaZLUSwM3FSCblZfiBFw4IQYsxwlfEEu0,2362
+virtualenv/seed/wheels/__init__.py,sha256=1J7el7lNjAwGxM4dmricrbVhSbYxs5sPzv9PTx2A6qA,226
+virtualenv/seed/wheels/acquire.py,sha256=Iq_QPJgUPCyHfrS3t2EUUj8fieymfcKNve1JbJQ5Uyc,4420
+virtualenv/seed/wheels/bundle.py,sha256=xYbhh5nQEwec2vnqNJWNVtDL3VyjGkgDWVXSuXzXB-Y,1961
+virtualenv/seed/wheels/periodic_update.py,sha256=A9l7ZpjtWzGrq2nh39y8g5OppUryHb7_W3bCR7TAnPc,12756
+virtualenv/seed/wheels/util.py,sha256=Zdo76KEDqbNmM5u9JTuyu5uzEN_fQ4oj6qHOt0h0o1M,3960
+virtualenv/seed/wheels/embed/__init__.py,sha256=qc4QGDYH6J4ikiW1GPSkgjpapQDB7TpPd6TTr21jvbU,1995
+virtualenv/seed/wheels/embed/pip-19.1.1-py2.py3-none-any.whl,sha256=mTE08EdUcbkUUsoCnUOQ3I8pisY6cSgU8QHNG220ZnY,1360957
+virtualenv/seed/wheels/embed/pip-20.2.2-py2.py3-none-any.whl,sha256=UkTlFJT10d-7idpJLUJQywf5JGZEc20Q7WxF3rGkhQA,1503623
+virtualenv/seed/wheels/embed/setuptools-43.0.0-py2.py3-none-any.whl,sha256=pn-qUVGe8ozYJhr_DiIbbkw3D4-4utqKo-etiUUZmWM,583228
+virtualenv/seed/wheels/embed/setuptools-44.1.1-py2.py3-none-any.whl,sha256=J6cUwJJTE05gpvpoEw94xwN-VWLE8h-PMY8q6QDRUtU,583493
+virtualenv/seed/wheels/embed/setuptools-49.6.0-py3-none-any.whl,sha256=TdW7CgoM_3e0bKXdOoSFfuSMg-giOIa1VmE8ckmUBz8,803275
+virtualenv/seed/wheels/embed/wheel-0.33.6-py2.py3-none-any.whl,sha256=9NoXY9O-zy4s2SoUp8kg8PAOyjD93p6pksg2aFufryg,21556
+virtualenv/seed/wheels/embed/wheel-0.35.1-py2.py3-none-any.whl,sha256=SXrdU1JdFsFzwsHHM7j2VVEOkJ6njMDinTdCQ1RLd6I,33174
+virtualenv/util/__init__.py,sha256=om6Hs2lH5igf5lkcSmQFiU7iMZ0Wx4dmSlMc6XW_Llg,199
+virtualenv/util/error.py,sha256=SRSZlXvMYQuJwxoUfNhlAyo3VwrAnIsZemSwPOxpjns,352
+virtualenv/util/lock.py,sha256=AyYqRMsz5YnLNDLNTrutjLqS8m0lkLqNNDpxW565b44,3550
+virtualenv/util/six.py,sha256=_8KWXUWi3-AaFmz4LkdyNra-uNuf70vlxwjN7oeRo8g,1463
+virtualenv/util/zipapp.py,sha256=jtf4Vn7XBnjPs_B_ObIQv_x4pFlIlPKAWHYLFV59h6U,1054
+virtualenv/util/path/__init__.py,sha256=YaBAxtzGBdMu0uUtppe0ZeCHw5HhO-5zjeb3-fzyMoI,336
+virtualenv/util/path/_permission.py,sha256=XpO2vGAk_92_biD4MEQcAQq2Zc8_rpm3M3n_hMUA1rw,745
+virtualenv/util/path/_sync.py,sha256=7oEmxJB5fc7NIsVgPJTJ4mpVPjNaNHAdhqlgIFSDfm0,2370
+virtualenv/util/path/_pathlib/__init__.py,sha256=evaey395zOuDc3FlukUeJ8SzRqLx1xWOKmg-TEPsRd4,1446
+virtualenv/util/path/_pathlib/via_os_path.py,sha256=wlnf0MIktEP01kG9z8iKOI86levXmkX7UX1LMLK7A-E,3701
+virtualenv/util/subprocess/__init__.py,sha256=2H-ZQ74OKq60eSpxfRWD-8gVUydczkrKSexl18DzOXI,753
+virtualenv/util/subprocess/_win_subprocess.py,sha256=0-eJVcxBs1Fe76OVTQnUVLaLzB4tlJxEZ-vZECQ4xL4,5576
+virtualenv-20.0.31.dist-info/LICENSE,sha256=XBWRk3jFsqqrexnOpw2M3HX3aHnjJFTkwDmfi3HRcek,1074
+virtualenv-20.0.31.dist-info/METADATA,sha256=Pwhk7KR7q09ZjMUtWXYwzvuWD1mY4hxS1e9eqpsjRs8,4923
+virtualenv-20.0.31.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
+virtualenv-20.0.31.dist-info/entry_points.txt,sha256=1DALKzYOcffJa7Q15TQlMQu0yeFXEy5W124y0aJEfYU,1615
+virtualenv-20.0.31.dist-info/top_level.txt,sha256=JV-LVlC8YeIw1DgiYI0hEot7tgFy5IWdKVcSG7NyzaI,11
+virtualenv-20.0.31.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
+virtualenv-20.0.31.dist-info/RECORD,,
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/WHEEL
rename to third_party/python/virtualenv/virtualenv-20.0.31.dist-info/WHEEL
rename from third_party/python/virtualenv/virtualenv-20.2.2.dist-info/entry_points.txt
rename to third_party/python/virtualenv/virtualenv-20.0.31.dist-info/entry_points.txt
rename from third_party/python/virtualenv/virtualenv-20.2.2.dist-info/top_level.txt
rename to third_party/python/virtualenv/virtualenv-20.0.31.dist-info/top_level.txt
rename from third_party/python/virtualenv/virtualenv-20.2.2.dist-info/zip-safe
rename to third_party/python/virtualenv/virtualenv-20.0.31.dist-info/zip-safe
deleted file mode 100644
--- a/third_party/python/virtualenv/virtualenv-20.2.2.dist-info/METADATA
+++ /dev/null
@@ -1,92 +0,0 @@
-Metadata-Version: 2.1
-Name: virtualenv
-Version: 20.2.2
-Summary: Virtual Python Environment builder
-Home-page: https://virtualenv.pypa.io/
-Author: Bernat Gabor
-Author-email: gaborjbernat@gmail.com
-Maintainer: Bernat Gabor
-Maintainer-email: gaborjbernat@gmail.com
-License: MIT
-Project-URL: Source, https://github.com/pypa/virtualenv
-Project-URL: Tracker, https://github.com/pypa/virtualenv/issues
-Keywords: virtual,environments,isolated
-Platform: any
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: POSIX
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Software Development :: Testing
-Classifier: Topic :: Utilities
-Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7
-Description-Content-Type: text/markdown
-Requires-Dist: appdirs (<2,>=1.4.3)
-Requires-Dist: distlib (<1,>=0.3.1)
-Requires-Dist: filelock (<4,>=3.0.0)
-Requires-Dist: six (<2,>=1.9.0)
-Requires-Dist: pathlib2 (<3,>=2.3.3) ; python_version < "3.4" and sys_platform != "win32"
-Requires-Dist: importlib-resources (>=1.0) ; python_version < "3.7"
-Requires-Dist: importlib-metadata (>=0.12) ; python_version < "3.8"
-Provides-Extra: docs
-Requires-Dist: proselint (>=0.10.2) ; extra == 'docs'
-Requires-Dist: sphinx (>=3) ; extra == 'docs'
-Requires-Dist: sphinx-argparse (>=0.2.5) ; extra == 'docs'
-Requires-Dist: sphinx-rtd-theme (>=0.4.3) ; extra == 'docs'
-Requires-Dist: towncrier (>=19.9.0rc1) ; extra == 'docs'
-Provides-Extra: testing
-Requires-Dist: coverage (>=4) ; extra == 'testing'
-Requires-Dist: coverage-enable-subprocess (>=1) ; extra == 'testing'
-Requires-Dist: flaky (>=3) ; extra == 'testing'
-Requires-Dist: pytest (>=4) ; extra == 'testing'
-Requires-Dist: pytest-env (>=0.6.2) ; extra == 'testing'
-Requires-Dist: pytest-freezegun (>=0.4.1) ; extra == 'testing'
-Requires-Dist: pytest-mock (>=2) ; extra == 'testing'
-Requires-Dist: pytest-randomly (>=1) ; extra == 'testing'
-Requires-Dist: pytest-timeout (>=1) ; extra == 'testing'
-Requires-Dist: pytest-xdist (>=1.31.0) ; extra == 'testing'
-Requires-Dist: packaging (>=20.0) ; (python_version > "3.4") and extra == 'testing'
-Requires-Dist: xonsh (>=0.9.16) ; (python_version > "3.4" and python_version != "3.9") and extra == 'testing'
-
-# virtualenv
-
-[![PyPI](https://img.shields.io/pypi/v/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
-[![PyPI - Implementation](https://img.shields.io/pypi/implementation/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
-[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
-[![Documentation](https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square)](http://virtualenv.pypa.io)
-[![Gitter Chat](https://img.shields.io/gitter/room/pypa/virtualenv?color=FF004F&style=flat-square)](https://gitter.im/pypa/virtualenv)
-[![PyPI - Downloads](https://img.shields.io/pypi/dm/virtualenv?style=flat-square)](https://pypistats.org/packages/virtualenv)
-[![PyPI - License](https://img.shields.io/pypi/l/virtualenv?style=flat-square)](https://opensource.org/licenses/MIT)
-[![Build Status](https://github.com/pypa/virtualenv/workflows/check/badge.svg?branch=main&event=push)](https://github.com/pypa/virtualenv/actions?query=workflow%3Acheck)
-[![codecov](https://codecov.io/gh/pypa/virtualenv/branch/main/graph/badge.svg)](https://codecov.io/gh/pypa/virtualenv)
-[![Code style:
-black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square)](https://github.com/psf/black)
-
-A tool for creating isolated `virtual` python environments.
-
-- [Installation](https://virtualenv.pypa.io/en/latest/installation.html)
-- [Documentation](https://virtualenv.pypa.io)
-- [Changelog](https://virtualenv.pypa.io/en/latest/changelog.html)
-- [Issues](https://github.com/pypa/virtualenv/issues)
-- [PyPI](https://pypi.org/project/virtualenv)
-- [Github](https://github.com/pypa/virtualenv)
-
-## Code of Conduct
-
-Everyone interacting in the virtualenv project's codebases, issue trackers, chat rooms, and mailing lists is expected to
-follow the [PSF Code of Conduct](https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md).
-
-
deleted file mode 100644
--- a/third_party/python/virtualenv/virtualenv-20.2.2.dist-info/RECORD
+++ /dev/null
@@ -1,122 +0,0 @@
-virtualenv/__init__.py,sha256=SMvpjz4VJ3vJ_yfDDPzJAdi2GJOYd_UBXXuvImO07gk,205
-virtualenv/__main__.py,sha256=QMwDqrR4QbhEivl8yoRmAr6G1BY92gr4n1ConcDIxc4,2770
-virtualenv/info.py,sha256=-2pI_kyC9fNj5OR8AQWkKjlpOk4_96Lmbco3atYYBdY,1921
-virtualenv/report.py,sha256=M2OHHCWdOHZsn74tj1MYYKmaI3QRJF8VA1FZIdkQTMQ,1594
-virtualenv/version.py,sha256=T9L0FIrWWe1IEvi_PNtZQcEIf_WbHAtFeLA1_hwZ07I,65
-virtualenv/activation/__init__.py,sha256=jLIERxJXMnHq2fH49RdWqBoaiASres4CTKMdUJOeos0,480
-virtualenv/activation/activator.py,sha256=CXomkRvhzcAeygYlDwQdDjfPyZQG85aBab5GIVQPv2M,1341
-virtualenv/activation/via_template.py,sha256=U8LgH-lyTjXIQBUdbd0xOZpXNICpiKhsfpiZwzQg7tU,2372
-virtualenv/activation/bash/__init__.py,sha256=7aC1WfvyzgFrIQs13jOuESuAbuiAnTsKkOe0iReRoaE,312
-virtualenv/activation/bash/activate.sh,sha256=aHia5vyXg2JwymkvRXCp29Aswcg88Mz5UrssXbX9Jjc,2398
-virtualenv/activation/batch/__init__.py,sha256=K0gVfwuXV7uoaMDL7moWGCq7uTDzI64giZzQQ8s2qnU,733
-virtualenv/activation/batch/activate.bat,sha256=PeQnWWsjvHT-jIWhYI7hbdzkDBZx5UOstnsCmq5PYtw,1031
-virtualenv/activation/batch/deactivate.bat,sha256=6OznnO-HC2wnWUN7YAT-bj815zeKMXEPC0keyBYwKUU,510
-virtualenv/activation/batch/pydoc.bat,sha256=pVuxn8mn9P_Rd0349fiBEiwIuMvfJQSfgJ2dljUT2fA,24
-virtualenv/activation/cshell/__init__.py,sha256=pw4s5idqQhaEccPxadETEvilBcoxW-UkVQ-RNqPyVCQ,344
-virtualenv/activation/cshell/activate.csh,sha256=jYwms8OTiVu9MJwXltuEm43HU09BJUqkrVqyj4sjpDA,1468
-virtualenv/activation/fish/__init__.py,sha256=hDkJq1P1wK2qm6BXydXWA9GMkBpj-TaejbKSceFnGZU,251
-virtualenv/activation/fish/activate.fish,sha256=V7nVwSI_nsFEMlJjSQxCayNWkjubXi1KSgSw1bEakh8,3099
-virtualenv/activation/powershell/__init__.py,sha256=EA-73s5TUMkgxAhLwucFg3gsBwW5huNh7qB4I7uEU-U,256
-virtualenv/activation/powershell/activate.ps1,sha256=jVw_FwfVJzcByQ3Sku-wlnOo_a0-OSpAQ8R17kXVgIM,1807
-virtualenv/activation/python/__init__.py,sha256=Uv53LqOrIT_2dO1FXcUYAnwH1eypG8CJ2InhSx1GRI4,1323
-virtualenv/activation/python/activate_this.py,sha256=Xpz7exdGSjmWk0KfwHLofIpDPUtazNSNGrxT0-5ZG_s,1208
-virtualenv/activation/xonsh/__init__.py,sha256=7NUevd5EpHRMZdSyR1KgFTe9QQBO94zZOwFH6MR6zjo,355
-virtualenv/activation/xonsh/activate.xsh,sha256=qkKgWfrUjYKrgrmhf45VuBz99EMadtiNU8GMfHZZ7AU,1172
-virtualenv/app_data/__init__.py,sha256=nwgqY-Our_SYcDisLfRLmWrTSPytDkjck9-lzg-pOI8,1462
-virtualenv/app_data/base.py,sha256=dbS5Maob1-Cqs6EVqTmmbjAGeNYA1iw3pmdgYPWCJak,2129
-virtualenv/app_data/na.py,sha256=iMRVpCe4m5Q5WM5bC3ee1wYyfkfHvkcQ-8tgIw4druc,1306
-virtualenv/app_data/read_only.py,sha256=MD-4Bl2SZZiGw0g8qZy0YLBGZGCuFYXnAEvWboF1PSc,1006
-virtualenv/app_data/via_disk_folder.py,sha256=CdNXQkenyH178MtSs2Ve6uDUs30-oZpkOz_1guTtTz0,5597
-virtualenv/app_data/via_tempdir.py,sha256=Z_-PoU7qeZe-idzi3nqys4FX0rfsRgOQ9_7XwX3hxSA,770
-virtualenv/config/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/config/convert.py,sha256=WYGjMRKVriZkfTH3z1fI0sDQRZxCxAedqWbOGsaquyg,2693
-virtualenv/config/env_var.py,sha256=48XpOurSLLjMX-kXjvOpZuAoOUP-LvnbotTlmebhhFk,844
-virtualenv/config/ini.py,sha256=neMqXrA6IOkLF_M_MCQWQSeqNm4CT8tj_h3GdbJv1Cg,2783
-virtualenv/config/cli/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/config/cli/parser.py,sha256=y5IqHccLBqFpocpE75X611nVrP8v394VW94a9GAojvE,4524
-virtualenv/create/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/create/creator.py,sha256=4jxxEGXCWd6tInT37QNt-13_yDtcIJdPB6EkoYzDkbM,8889
-virtualenv/create/debug.py,sha256=ETOke8w4Ib8fiufAHVeOkH3v0zrztljw3WjGvZyE0Mk,3342
-virtualenv/create/describe.py,sha256=bm0V2wpFOjdN_MkzZuJAEBSttmi5YGPVwxtwGYU5zQU,3561
-virtualenv/create/pyenv_cfg.py,sha256=VsOGfzUpaVCO3J29zrhIeip4jZ4b7llbe45iOQAIRGg,1717
-virtualenv/create/via_global_ref/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/create/via_global_ref/_virtualenv.py,sha256=aEuMB5MrpKhKwuWumv5J7wTpK6w9jUGR1FXPCdCT5fw,5662
-virtualenv/create/via_global_ref/api.py,sha256=5MPq3XJBuUOBj53oIigeWWPm68M-J_E644WWbz37qOU,4357
-virtualenv/create/via_global_ref/store.py,sha256=cqLBEhQ979xHnlidqmxlDjsvj2Wr-mBo7shvGQSEBxU,685
-virtualenv/create/via_global_ref/venv.py,sha256=p5RkDcXhr1pmOwnl1dpS06UYHmfNVy2ld4sTwsYjYWU,2955
-virtualenv/create/via_global_ref/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/create/via_global_ref/builtin/builtin_way.py,sha256=hO22nT-itVoYiy8wXrXXYzHw86toCp_Uq-cURR7w6ck,546
-virtualenv/create/via_global_ref/builtin/ref.py,sha256=xCTICJhE-OiopBxl6ymo1P1NqgK3KEF8ZUOtQDtDTVA,5477
-virtualenv/create/via_global_ref/builtin/via_global_self_do.py,sha256=d569fX7fjq5vHvGGXDjo-1Xi__HhqU2xjDJOuYrmGjw,4552
-virtualenv/create/via_global_ref/builtin/cpython/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/create/via_global_ref/builtin/cpython/common.py,sha256=U7EvB9-2DlOQTGrTyPrEcItEbJ1sFBzo1EAOcAIjQ5Q,2392
-virtualenv/create/via_global_ref/builtin/cpython/cpython2.py,sha256=p41H2g6wAqhJzeUU48nH3u05-yWEbwCzhyj4pn8rnm4,3757
-virtualenv/create/via_global_ref/builtin/cpython/cpython3.py,sha256=gguQAhTQb0PH7Xg-G-mgQm5LlhyyW0V0piV3LwI-PeM,3111
-virtualenv/create/via_global_ref/builtin/cpython/mac_os.py,sha256=B0Lqgo8geZBSKSpHWUB46lDYRggW4Kg2AZUp3Z7xn9M,12382
-virtualenv/create/via_global_ref/builtin/pypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/create/via_global_ref/builtin/pypy/common.py,sha256=-t-TZxCTJwpIh_oRsDyv5IilH19jKqJrZa27zWN_8Ws,1816
-virtualenv/create/via_global_ref/builtin/pypy/pypy2.py,sha256=bmMY_KJZ1iD_ifq-X9ZBOlOpJ1aN7839qigBgnWRIdA,3535
-virtualenv/create/via_global_ref/builtin/pypy/pypy3.py,sha256=ti6hmOIC4HiTBnEYKytO-d9wH-eLeMoQxQ0kZRhnNrw,1751
-virtualenv/create/via_global_ref/builtin/python2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/create/via_global_ref/builtin/python2/python2.py,sha256=jkJwmkeJVTzwzo95eMIptTfdBA-qmyIqZcpt48iOitU,4276
-virtualenv/create/via_global_ref/builtin/python2/site.py,sha256=4uguJDuWPmB25yBmpsMYKLOnIVXkerck0UO8CP8F2c4,6078
-virtualenv/discovery/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/discovery/builtin.py,sha256=rB6XaQwuK1HfvJsrla3BoSQUH9QkJnwKHGWBdbK4QGM,5432
-virtualenv/discovery/cached_py_info.py,sha256=l2lELE8YkwKXCNopImY2VjmpHPTawh1d3qmdsXMtkRs,5043
-virtualenv/discovery/discover.py,sha256=evJYn4APkwjNmdolNeIBSHiOudkvN59c5oVYI2Zsjlg,1209
-virtualenv/discovery/py_info.py,sha256=QtZFq0xav1tEpKI5seEJaEOkc_FXer21Gzgl_Ccqy98,21793
-virtualenv/discovery/py_spec.py,sha256=wQhLzCfXoSPsAAO9nm5-I2lNolVDux4W2vPSUfJGjlc,4790
-virtualenv/discovery/windows/__init__.py,sha256=TPbnzCtRyw47pRVHTO8ikwljNcczxmSLDdWtwasxvQU,1036
-virtualenv/discovery/windows/pep514.py,sha256=YYiaJzo-XuMtO78BMFMAudqkeJiLQkFnUTOuQZ5lJz8,5451
-virtualenv/run/__init__.py,sha256=lVIiIq_LoMHUGYkrTSx0tpFG_aYywy_u6GWUReHRcUA,5777
-virtualenv/run/session.py,sha256=S4NZiHzij1vp895mN9s9ZwYobJjjdP37QOHCb1o-Ufo,2563
-virtualenv/run/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/run/plugin/activators.py,sha256=kmHShj36eHfbnsiAJzX0U5LYvGhe0WkRYjbuKDz6gVM,2117
-virtualenv/run/plugin/base.py,sha256=-2185C01PaxOG7gnMbWWyZlo24n_FYo5J5_naeNZw8s,1934
-virtualenv/run/plugin/creators.py,sha256=PIxJ85KmrQU7lUO-r8Znxbb4lTEzwHggc9lcDqmt2tc,3494
-virtualenv/run/plugin/discovery.py,sha256=3ykxRvPA1FJMkqsbr2TV0LBRPT5UCFeJdzEHfuEjxRM,1002
-virtualenv/run/plugin/seeders.py,sha256=c1mhzu0HNzKdif6YUV35fuAOS0XHFJz3TtccLW5fWG0,1074
-virtualenv/seed/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/seed/seeder.py,sha256=DSGE_8Ycj01vj8mkppUBA9h7JG76XsVBMt-5MWlMF6k,1178
-virtualenv/seed/embed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/seed/embed/base_embed.py,sha256=46mWtqWj_MjOQEqMJyosL0RWGL6HwrHAL2r1Jxc9DuI,4182
-virtualenv/seed/embed/pip_invoke.py,sha256=EMVwIeoW15SuorJ8z_-vBxPXwQJLS0ILA0Va9zNoOLI,2127
-virtualenv/seed/embed/via_app_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/seed/embed/via_app_data/via_app_data.py,sha256=NkVhEFv4iuKG0qvEg4AAmucMwmQgNaPLB-Syepzgps0,5994
-virtualenv/seed/embed/via_app_data/pip_install/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/seed/embed/via_app_data/pip_install/base.py,sha256=rnR60JzM7G04cPDo2eH-aR8-iQuFXBgHJ2lQnSf0Gfs,6355
-virtualenv/seed/embed/via_app_data/pip_install/copy.py,sha256=gG2NePFHOYh-bsCf6TpsaQ_qrYhdBy67k0RWuwHSAwo,1307
-virtualenv/seed/embed/via_app_data/pip_install/symlink.py,sha256=wHCpfKobvjjaZLUSwM3FSCblZfiBFw4IQYsxwlfEEu0,2362
-virtualenv/seed/wheels/__init__.py,sha256=1J7el7lNjAwGxM4dmricrbVhSbYxs5sPzv9PTx2A6qA,226
-virtualenv/seed/wheels/acquire.py,sha256=qchqlIynLi2VP2VtdAfVfZJHbUPcLY2Ui5r7Eh-aZz8,4426
-virtualenv/seed/wheels/bundle.py,sha256=W0uVjClv9IBa50jRvPKm0jMwWnrYTEfDny2Z6bw2W7c,1835
-virtualenv/seed/wheels/periodic_update.py,sha256=HNVEuU2OYdWHW7lVO0h3NkpLkC8bu-5R7igJRXBnGDc,12792
-virtualenv/seed/wheels/util.py,sha256=Zdo76KEDqbNmM5u9JTuyu5uzEN_fQ4oj6qHOt0h0o1M,3960
-virtualenv/seed/wheels/embed/__init__.py,sha256=CLMKoeveDRyiNAdZjEtD38cepgNXkg65xzFu5OSHEus,1995
-virtualenv/seed/wheels/embed/pip-19.1.1-py2.py3-none-any.whl,sha256=mTE08EdUcbkUUsoCnUOQ3I8pisY6cSgU8QHNG220ZnY,1360957
-virtualenv/seed/wheels/embed/pip-20.3.1-py2.py3-none-any.whl,sha256=Ql55sgk5q7_6djOpEVGogq7cd1ZNkxPjWE6wQWwoxVg,1518513
-virtualenv/seed/wheels/embed/setuptools-43.0.0-py2.py3-none-any.whl,sha256=pn-qUVGe8ozYJhr_DiIbbkw3D4-4utqKo-etiUUZmWM,583228
-virtualenv/seed/wheels/embed/setuptools-44.1.1-py2.py3-none-any.whl,sha256=J6cUwJJTE05gpvpoEw94xwN-VWLE8h-PMY8q6QDRUtU,583493
-virtualenv/seed/wheels/embed/setuptools-50.3.2-py3-none-any.whl,sha256=LCQqCFb7rX775WDfSnrdkyTzQM9I30NlHpYEkkRmeUo,785194
-virtualenv/seed/wheels/embed/setuptools-51.0.0-py3-none-any.whl,sha256=jBd5NiFZRcmjfvgJraD6s2UZGVL3oSNhhDK7-sNTxSk,785164
-virtualenv/seed/wheels/embed/wheel-0.33.6-py2.py3-none-any.whl,sha256=9NoXY9O-zy4s2SoUp8kg8PAOyjD93p6pksg2aFufryg,21556
-virtualenv/seed/wheels/embed/wheel-0.36.1-py2.py3-none-any.whl,sha256=kGhk-3IsCrXy-cNbLGXjrzwAlALBCKcJwKyie8LJGHs,34788
-virtualenv/util/__init__.py,sha256=om6Hs2lH5igf5lkcSmQFiU7iMZ0Wx4dmSlMc6XW_Llg,199
-virtualenv/util/error.py,sha256=SRSZlXvMYQuJwxoUfNhlAyo3VwrAnIsZemSwPOxpjns,352
-virtualenv/util/lock.py,sha256=oFa0FcbE_TVDHOol44Mgtfa4D3ZjnVy-HSQx-y7ERKQ,4727
-virtualenv/util/six.py,sha256=_8KWXUWi3-AaFmz4LkdyNra-uNuf70vlxwjN7oeRo8g,1463
-virtualenv/util/zipapp.py,sha256=jtf4Vn7XBnjPs_B_ObIQv_x4pFlIlPKAWHYLFV59h6U,1054
-virtualenv/util/path/__init__.py,sha256=YaBAxtzGBdMu0uUtppe0ZeCHw5HhO-5zjeb3-fzyMoI,336
-virtualenv/util/path/_permission.py,sha256=XpO2vGAk_92_biD4MEQcAQq2Zc8_rpm3M3n_hMUA1rw,745
-virtualenv/util/path/_sync.py,sha256=rheUrGsCqmhMwNs-uc5rDthNSUlsOrBJPoK8KZj3O1o,2393
-virtualenv/util/path/_pathlib/__init__.py,sha256=FjKCi8scB5MnHg2fLX5REoE0bOPkMXqpBEILVTeJZGQ,2130
-virtualenv/util/path/_pathlib/via_os_path.py,sha256=fYDFAX483zVvC9hAOAC9FYtrGdZethS0vtYtKsL5r-s,3772
-virtualenv/util/subprocess/__init__.py,sha256=1UmFrdBv2sVeUfZbDcO2yZpe28AE0ULOu9dRKlpJaa0,801
-virtualenv/util/subprocess/_win_subprocess.py,sha256=SChkXAKVbpehyrHod1ld76RSdTIalrgME1rtz5jUfm0,5655
-virtualenv-20.2.2.dist-info/LICENSE,sha256=XBWRk3jFsqqrexnOpw2M3HX3aHnjJFTkwDmfi3HRcek,1074
-virtualenv-20.2.2.dist-info/METADATA,sha256=OWyC_GXU3AvST-YiGhmI2iE4ntdcBm-6Q1yCaU9Bx_U,4965
-virtualenv-20.2.2.dist-info/WHEEL,sha256=oh0NKYrTcu1i1-wgrI1cnhkjYIi8WJ-8qd9Jrr5_y4E,110
-virtualenv-20.2.2.dist-info/entry_points.txt,sha256=1DALKzYOcffJa7Q15TQlMQu0yeFXEy5W124y0aJEfYU,1615
-virtualenv-20.2.2.dist-info/top_level.txt,sha256=JV-LVlC8YeIw1DgiYI0hEot7tgFy5IWdKVcSG7NyzaI,11
-virtualenv-20.2.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
-virtualenv-20.2.2.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/virtualenv-20.2.2.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.36.1)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
--- a/third_party/python/virtualenv/virtualenv/activation/bash/activate.sh
+++ b/third_party/python/virtualenv/virtualenv/activation/bash/activate.sh
@@ -42,19 +42,16 @@ deactivate () {
         unset -f deactivate
     fi
 }
 
 # unset irrelevant variables
 deactivate nondestructive
 
 VIRTUAL_ENV='__VIRTUAL_ENV__'
-if ([ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ]) && $(command -v cygpath &> /dev/null) ; then
-    VIRTUAL_ENV=$(cygpath -u "$VIRTUAL_ENV")
-fi
 export VIRTUAL_ENV
 
 _OLD_VIRTUAL_PATH="$PATH"
 PATH="$VIRTUAL_ENV/__BIN_NAME__:$PATH"
 export PATH
 
 # unset PYTHONHOME if set
 if ! [ -z "${PYTHONHOME+_}" ] ; then
--- a/third_party/python/virtualenv/virtualenv/activation/powershell/activate.ps1
+++ b/third_party/python/virtualenv/virtualenv/activation/powershell/activate.ps1
@@ -1,60 +1,60 @@
-$script:THIS_PATH = $myinvocation.mycommand.path
-$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent
-
-function global:deactivate([switch] $NonDestructive) {
-    if (Test-Path variable:_OLD_VIRTUAL_PATH) {
-        $env:PATH = $variable:_OLD_VIRTUAL_PATH
-        Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global
-    }
-
-    if (Test-Path function:_old_virtual_prompt) {
-        $function:prompt = $function:_old_virtual_prompt
-        Remove-Item function:\_old_virtual_prompt
-    }
-
-    if ($env:VIRTUAL_ENV) {
-        Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue
-    }
-
-    if (!$NonDestructive) {
-        # Self destruct!
-        Remove-Item function:deactivate
-        Remove-Item function:pydoc
-    }
-}
-
-function global:pydoc {
-    python -m pydoc $args
-}
-
-# unset irrelevant variables
-deactivate -nondestructive
-
-$VIRTUAL_ENV = $BASE_DIR
-$env:VIRTUAL_ENV = $VIRTUAL_ENV
-
-New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH
-
-$env:PATH = "$env:VIRTUAL_ENV/__BIN_NAME____PATH_SEP__" + $env:PATH
-if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) {
-    function global:_old_virtual_prompt {
-        ""
-    }
-    $function:_old_virtual_prompt = $function:prompt
-
-    if ("__VIRTUAL_PROMPT__" -ne "") {
-        function global:prompt {
-            # Add the custom prefix to the existing prompt
-            $previous_prompt_value = & $function:_old_virtual_prompt
-            ("__VIRTUAL_PROMPT__" + $previous_prompt_value)
-        }
-    }
-    else {
-        function global:prompt {
-            # Add a prefix to the current prompt, but don't discard it.
-            $previous_prompt_value = & $function:_old_virtual_prompt
-            $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) "
-            ($new_prompt_value + $previous_prompt_value)
-        }
-    }
-}
+$script:THIS_PATH = $myinvocation.mycommand.path
+$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent
+
+function global:deactivate([switch] $NonDestructive) {
+    if (Test-Path variable:_OLD_VIRTUAL_PATH) {
+        $env:PATH = $variable:_OLD_VIRTUAL_PATH
+        Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global
+    }
+
+    if (Test-Path function:_old_virtual_prompt) {
+        $function:prompt = $function:_old_virtual_prompt
+        Remove-Item function:\_old_virtual_prompt
+    }
+
+    if ($env:VIRTUAL_ENV) {
+        Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue
+    }
+
+    if (!$NonDestructive) {
+        # Self destruct!
+        Remove-Item function:deactivate
+        Remove-Item function:pydoc
+    }
+}
+
+function global:pydoc {
+    python -m pydoc $args
+}
+
+# unset irrelevant variables
+deactivate -nondestructive
+
+$VIRTUAL_ENV = $BASE_DIR
+$env:VIRTUAL_ENV = $VIRTUAL_ENV
+
+New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH
+
+$env:PATH = "$env:VIRTUAL_ENV/__BIN_NAME____PATH_SEP__" + $env:PATH
+if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) {
+    function global:_old_virtual_prompt {
+        ""
+    }
+    $function:_old_virtual_prompt = $function:prompt
+
+    if ("__VIRTUAL_PROMPT__" -ne "") {
+        function global:prompt {
+            # Add the custom prefix to the existing prompt
+            $previous_prompt_value = & $function:_old_virtual_prompt
+            ("__VIRTUAL_PROMPT__" + $previous_prompt_value)
+        }
+    }
+    else {
+        function global:prompt {
+            # Add a prefix to the current prompt, but don't discard it.
+            $previous_prompt_value = & $function:_old_virtual_prompt
+            $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) "
+            ($new_prompt_value + $previous_prompt_value)
+        }
+    }
+}
--- a/third_party/python/virtualenv/virtualenv/activation/via_template.py
+++ b/third_party/python/virtualenv/virtualenv/activation/via_template.py
@@ -6,19 +6,19 @@ from abc import ABCMeta, abstractmethod
 
 from six import add_metaclass
 
 from virtualenv.util.six import ensure_text
 
 from .activator import Activator
 
 if sys.version_info >= (3, 7):
-    from importlib.resources import read_binary
+    from importlib.resources import read_text
 else:
-    from importlib_resources import read_binary
+    from importlib_resources import read_text
 
 
 @add_metaclass(ABCMeta)
 class ViaTemplateActivator(Activator):
     @abstractmethod
     def templates(self):
         raise NotImplementedError
 
@@ -39,28 +39,26 @@ class ViaTemplateActivator(Activator):
             "__PATH_SEP__": ensure_text(os.pathsep),
         }
 
     def _generate(self, replacements, templates, to_folder, creator):
         generated = []
         for template in templates:
             text = self.instantiate_template(replacements, template, creator)
             dest = to_folder / self.as_name(template)
-            # use write_bytes to avoid platform specific line normalization (\n -> \r\n)
-            dest.write_bytes(text.encode("utf-8"))
+            dest.write_text(text, encoding="utf-8")
             generated.append(dest)
         return generated
 
     def as_name(self, template):
         return template.name
 
     def instantiate_template(self, replacements, template, creator):
-        # read content as binary to avoid platform specific line normalization (\n -> \r\n)
-        binary = read_binary(self.__module__, str(template))
-        text = binary.decode("utf-8", errors="strict")
+        # read text and do replacements
+        text = read_text(self.__module__, str(template), encoding="utf-8", errors="strict")
         for key, value in replacements.items():
             value = self._repr_unicode(creator, value)
             text = text.replace(key, value)
         return text
 
     @staticmethod
     def _repr_unicode(creator, value):
         # by default we just let it be unicode
--- a/third_party/python/virtualenv/virtualenv/app_data/__init__.py
+++ b/third_party/python/virtualenv/virtualenv/app_data/__init__.py
@@ -1,57 +1,62 @@
 """
 Application data stored by virtualenv.
 """
 from __future__ import absolute_import, unicode_literals
 
 import logging
 import os
+from argparse import Action, ArgumentError
 
 from appdirs import user_data_dir
 
 from .na import AppDataDisabled
-from .read_only import ReadOnlyAppData
 from .via_disk_folder import AppDataDiskFolder
 from .via_tempdir import TempAppData
 
 
-def _default_app_data_dir():  # type: () -> str
-    key = str("VIRTUALENV_OVERRIDE_APP_DATA")
-    if key in os.environ:
-        return os.environ[key]
-    else:
-        return user_data_dir(appname="virtualenv", appauthor="pypa")
-
-
-def make_app_data(folder, **kwargs):
-    read_only = kwargs.pop("read_only")
-    if kwargs:  # py3+ kwonly
-        raise TypeError("unexpected keywords: {}")
+class AppDataAction(Action):
+    def __call__(self, parser, namespace, values, option_string=None):
+        folder = self._check_folder(values)
+        if folder is None:
+            raise ArgumentError("app data path {} is not valid".format(values))
+        setattr(namespace, self.dest, AppDataDiskFolder(folder))
 
-    if folder is None:
-        folder = _default_app_data_dir()
-    folder = os.path.abspath(folder)
-
-    if read_only:
-        return ReadOnlyAppData(folder)
+    @staticmethod
+    def _check_folder(folder):
+        folder = os.path.abspath(folder)
+        if not os.path.exists(folder):
+            try:
+                os.makedirs(folder)
+                logging.debug("created app data folder %s", folder)
+            except OSError as exception:
+                logging.info("could not create app data folder %s due to %r", folder, exception)
+                return None
+        write_enabled = os.access(folder, os.W_OK)
+        if write_enabled:
+            return folder
+        logging.debug("app data folder %s has no write access", folder)
+        return None
 
-    if not os.path.isdir(folder):
-        try:
-            os.makedirs(folder)
-            logging.debug("created app data folder %s", folder)
-        except OSError as exception:
-            logging.info("could not create app data folder %s due to %r", folder, exception)
+    @staticmethod
+    def default():
+        for folder in AppDataAction._app_data_candidates():
+            folder = AppDataAction._check_folder(folder)
+            if folder is not None:
+                return AppDataDiskFolder(folder)
+        return AppDataDisabled()
 
-    if os.access(folder, os.W_OK):
-        return AppDataDiskFolder(folder)
-    else:
-        logging.debug("app data folder %s has no write access", folder)
-        return TempAppData()
+    @staticmethod
+    def _app_data_candidates():
+        key = str("VIRTUALENV_OVERRIDE_APP_DATA")
+        if key in os.environ:
+            yield os.environ[key]
+        else:
+            yield user_data_dir(appname="virtualenv", appauthor="pypa")
 
 
 __all__ = (
+    "AppDataDiskFolder",
+    "TempAppData",
+    "AppDataAction",
     "AppDataDisabled",
-    "AppDataDiskFolder",
-    "ReadOnlyAppData",
-    "TempAppData",
-    "make_app_data",
 )
--- a/third_party/python/virtualenv/virtualenv/app_data/base.py
+++ b/third_party/python/virtualenv/virtualenv/app_data/base.py
@@ -26,20 +26,16 @@ class AppData(object):
     @abstractmethod
     def py_info(self, path):
         raise NotImplementedError
 
     @abstractmethod
     def py_info_clear(self):
         raise NotImplementedError
 
-    @property
-    def can_update(self):
-        raise NotImplementedError
-
     @abstractmethod
     def embed_update_log(self, distribution, for_py_version):
         raise NotImplementedError
 
     @property
     def house(self):
         raise NotImplementedError
 
--- a/third_party/python/virtualenv/virtualenv/app_data/na.py
+++ b/third_party/python/virtualenv/virtualenv/app_data/na.py
@@ -3,19 +3,16 @@ from __future__ import absolute_import, 
 from contextlib import contextmanager
 
 from .base import AppData, ContentStore
 
 
 class AppDataDisabled(AppData):
     """No application cache available (most likely as we don't have write permissions)"""
 
-    transient = True
-    can_update = False
-
     def __init__(self):
         pass
 
     error = RuntimeError("no app data folder available, probably no write access to the folder")
 
     def close(self):
         """do nothing"""
 
@@ -38,16 +35,20 @@ class AppDataDisabled(AppData):
 
     @property
     def house(self):
         raise self.error
 
     def wheel_image(self, for_py_version, name):
         raise self.error
 
+    @property
+    def transient(self):
+        return True
+
     def py_info_clear(self):
         """"""
 
 
 class ContentStoreNA(ContentStore):
     def exists(self):
         return False
 
deleted file mode 100644
--- a/third_party/python/virtualenv/virtualenv/app_data/read_only.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import os.path
-
-from virtualenv.util.lock import NoOpFileLock
-
-from .via_disk_folder import AppDataDiskFolder, PyInfoStoreDisk
-
-
-class ReadOnlyAppData(AppDataDiskFolder):
-    can_update = False
-
-    def __init__(self, folder):  # type: (str) -> None
-        if not os.path.isdir(folder):
-            raise RuntimeError("read-only app data directory {} does not exist".format(folder))
-        self.lock = NoOpFileLock(folder)
-
-    def reset(self):  # type: () -> None
-        raise RuntimeError("read-only app data does not support reset")
-
-    def py_info_clear(self):  # type: () -> None
-        raise NotImplementedError
-
-    def py_info(self, path):
-        return _PyInfoStoreDiskReadOnly(self.py_info_at, path)
-
-    def embed_update_log(self, distribution, for_py_version):
-        raise NotImplementedError
-
-
-class _PyInfoStoreDiskReadOnly(PyInfoStoreDisk):
-    def write(self, content):
-        raise RuntimeError("read-only app data python info cannot be updated")
-
-
-__all__ = ("ReadOnlyAppData",)
--- a/third_party/python/virtualenv/virtualenv/app_data/via_disk_folder.py
+++ b/third_party/python/virtualenv/virtualenv/app_data/via_disk_folder.py
@@ -41,27 +41,25 @@ from virtualenv.version import __version
 from .base import AppData, ContentStore
 
 
 class AppDataDiskFolder(AppData):
     """
     Store the application data on the disk within a folder layout.
     """
 
-    transient = False
-    can_update = True
-
     def __init__(self, folder):
         self.lock = ReentrantFileLock(folder)
 
     def __repr__(self):
-        return "{}({})".format(type(self).__name__, self.lock.path)
+        return "{}".format(self.lock.path)
 
-    def __str__(self):
-        return str(self.lock.path)
+    @property
+    def transient(self):
+        return False
 
     def reset(self):
         logging.debug("reset app data folder %s", self.lock.path)
         safe_delete(self.lock.path)
 
     def close(self):
         """do nothing"""
 
@@ -134,44 +132,41 @@ class JSONStoreDisk(ContentStore):
             data = json.loads(self.file.read_text())
             logging.debug("got {} from %s".format(self.msg), *self.msg_args)
             return data
         except ValueError:
             bad_format = True
         except Exception:  # noqa
             pass
         if bad_format:
-            try:
-                self.remove()
-            except OSError:  # reading and writing on the same file may cause race on multiple processes
-                pass
+            self.remove()
         return None
 
     def remove(self):
         self.file.unlink()
         logging.debug("removed {} at %s".format(self.msg), *self.msg_args)
 
     @contextmanager
     def locked(self):
         with self.in_folder.lock_for_key(self.key):
             yield
 
     def write(self, content):
         folder = self.file.parent
-        folder.mkdir(parents=True, exist_ok=True)
+        try:
+            folder.mkdir(parents=True, exist_ok=True)
+        except OSError:
+            pass
         self.file.write_text(ensure_text(json.dumps(content, sort_keys=True, indent=2)))
         logging.debug("wrote {} at %s".format(self.msg), *self.msg_args)
 
 
 class PyInfoStoreDisk(JSONStoreDisk):
     def __init__(self, in_folder, path):
         key = sha256(str(path).encode("utf-8") if six.PY3 else str(path)).hexdigest()
         super(PyInfoStoreDisk, self).__init__(in_folder, key, "python info of %s", (path,))
 
 
 class EmbedDistributionUpdateStoreDisk(JSONStoreDisk):
     def __init__(self, in_folder, distribution):
         super(EmbedDistributionUpdateStoreDisk, self).__init__(
-            in_folder,
-            distribution,
-            "embed update of distribution %s",
-            (distribution,),
+            in_folder, distribution, "embed update of distribution %s", (distribution,),
         )
--- a/third_party/python/virtualenv/virtualenv/app_data/via_tempdir.py
+++ b/third_party/python/virtualenv/virtualenv/app_data/via_tempdir.py
@@ -4,24 +4,25 @@ import logging
 from tempfile import mkdtemp
 
 from virtualenv.util.path import safe_delete
 
 from .via_disk_folder import AppDataDiskFolder
 
 
 class TempAppData(AppDataDiskFolder):
-    transient = True
-    can_update = False
-
     def __init__(self):
         super(TempAppData, self).__init__(folder=mkdtemp())
         logging.debug("created temporary app data folder %s", self.lock.path)
 
     def reset(self):
         """this is a temporary folder, is already empty to start with"""
 
     def close(self):
         logging.debug("remove temporary app data folder %s", self.lock.path)
         safe_delete(self.lock.path)
 
     def embed_update_log(self, distribution, for_py_version):
-        raise NotImplementedError
+        return None
+
+    @property
+    def transient(self):
+        return True
--- a/third_party/python/virtualenv/virtualenv/config/convert.py
+++ b/third_party/python/virtualenv/virtualenv/config/convert.py
@@ -41,43 +41,26 @@ class NoneType(TypeData):
         return str(value)
 
 
 class ListType(TypeData):
     def _validate(self):
         """"""
 
     def convert(self, value, flatten=True):
-        values = self.split_values(value)
+        if isinstance(value, (str, bytes)):
+            value = filter(None, [x.strip() for x in value.splitlines()])
+        values = list(value)
         result = []
         for value in values:
             sub_values = value.split(os.pathsep)
             result.extend(sub_values)
         converted = [self.as_type(i) for i in result]
         return converted
 
-    def split_values(self, value):
-        """Split the provided value into a list.
-
-        First this is done by newlines. If there were no newlines in the text,
-        then we next try to split by comma.
-        """
-        if isinstance(value, (str, bytes)):
-            # Use `splitlines` rather than a custom check for whether there is
-            # more than one line. This ensures that the full `splitlines()`
-            # logic is supported here.
-            values = value.splitlines()
-            if len(values) <= 1:
-                values = value.split(",")
-            values = filter(None, [x.strip() for x in values])
-        else:
-            values = list(value)
-
-        return values
-
 
 def convert(value, as_type, source):
     """Convert the value as a given type where the value comes from the given source"""
     try:
         return as_type.convert(value)
     except Exception as exception:
         logging.warning("%s failed to convert %r as %r because %r", source, value, as_type, exception)
         raise
--- a/third_party/python/virtualenv/virtualenv/create/creator.py
+++ b/third_party/python/virtualenv/virtualenv/create/creator.py
@@ -39,31 +39,29 @@ class Creator(object):
 
         :param options: the CLI option as parsed from :meth:`add_parser_arguments`
         :param interpreter: the interpreter to create virtual environment from
         """
         self.interpreter = interpreter
         self._debug = None
         self.dest = Path(options.dest)
         self.clear = options.clear
-        self.no_vcs_ignore = options.no_vcs_ignore
         self.pyenv_cfg = PyEnvCfg.from_folder(self.dest)
         self.app_data = options.app_data
 
     def __repr__(self):
         return ensure_str(self.__unicode__())
 
     def __unicode__(self):
         return "{}({})".format(self.__class__.__name__, ", ".join("{}={}".format(k, v) for k, v in self._args()))
 
     def _args(self):
         return [
             ("dest", ensure_text(str(self.dest))),
             ("clear", self.clear),
-            ("no_vcs_ignore", self.no_vcs_ignore),
         ]
 
     @classmethod
     def can_create(cls, interpreter):
         """Determine if we can create a virtual environment.
 
         :param interpreter: the interpreter in question
         :return: ``None`` if we can't create, any other object otherwise that will be forwarded to \
@@ -76,34 +74,25 @@ class Creator(object):
         """Add CLI arguments for the creator.
 
         :param parser: the CLI parser
         :param app_data: the application data folder
         :param interpreter: the interpreter we're asked to create virtual environment for
         :param meta: value as returned by :meth:`can_create`
         """
         parser.add_argument(
-            "dest",
-            help="directory to create virtualenv at",
-            type=cls.validate_dest,
+            "dest", help="directory to create virtualenv at", type=cls.validate_dest,
         )
         parser.add_argument(
             "--clear",
             dest="clear",
             action="store_true",
             help="remove the destination directory if exist before starting (will overwrite files otherwise)",
             default=False,
         )
-        parser.add_argument(
-            "--no-vcs-ignore",
-            dest="no_vcs_ignore",
-            action="store_true",
-            help="don't create VCS ignore directive in the destination directory",
-            default=False,
-        )
 
     @abstractmethod
     def create(self):
         """Perform the virtual environment creation."""
         raise NotImplementedError
 
     @classmethod
     def validate_dest(cls, raw_value):
@@ -126,19 +115,17 @@ class Creator(object):
                 if trip == char:
                     continue
                 raise ValueError(trip)
             except ValueError:
                 refused[char] = None
         if refused:
             raise ArgumentTypeError(
                 "the file system codec ({}) cannot handle characters {!r} within {!r}".format(
-                    encoding,
-                    "".join(refused.keys()),
-                    raw_value,
+                    encoding, "".join(refused.keys()), raw_value,
                 ),
             )
         if os.pathsep in raw_value:
             raise ArgumentTypeError(
                 "destination {!r} must not contain the path separator ({}) as this would break "
                 "the activation scripts".format(raw_value, os.pathsep),
             )
 
@@ -164,18 +151,17 @@ class Creator(object):
         return str(value)
 
     def run(self):
         if self.dest.exists() and self.clear:
             logging.debug("delete %s", self.dest)
             safe_delete(self.dest)
         self.create()
         self.set_pyenv_cfg()
-        if not self.no_vcs_ignore:
-            self.setup_ignore_vcs()
+        self.setup_ignore_vcs()
 
     def set_pyenv_cfg(self):
         self.pyenv_cfg.content = OrderedDict()
         self.pyenv_cfg["home"] = self.interpreter.system_exec_prefix
         self.pyenv_cfg["implementation"] = self.interpreter.implementation
         self.pyenv_cfg["version_info"] = ".".join(str(i) for i in self.interpreter.version_info)
         self.pyenv_cfg["virtualenv"] = __version__
 
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/api.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/api.py
@@ -3,17 +3,16 @@ from __future__ import absolute_import, 
 import logging
 import os
 from abc import ABCMeta
 
 from six import add_metaclass
 
 from virtualenv.info import fs_supports_symlink
 from virtualenv.util.path import Path
-from virtualenv.util.six import ensure_text
 
 from ..creator import Creator, CreatorMeta
 
 
 class ViaGlobalRefMeta(CreatorMeta):
     def __init__(self):
         super(ViaGlobalRefMeta, self).__init__()
         self.copy_error = None
@@ -87,20 +86,20 @@ class ViaGlobalRefApi(Creator):
 
     def create(self):
         self.install_patch()
 
     def install_patch(self):
         text = self.env_patch_text()
         if text:
             pth = self.purelib / "_virtualenv.pth"
-            logging.debug("create virtualenv import hook file %s", ensure_text(str(pth)))
+            logging.debug("create virtualenv import hook file %s", pth)
             pth.write_text("import _virtualenv")
             dest_path = self.purelib / "_virtualenv.py"
-            logging.debug("create %s", ensure_text(str(dest_path)))
+            logging.debug("create %s", dest_path)
             dest_path.write_text(text)
 
     def env_patch_text(self):
         """Patch the distutils package to not be derailed by its configuration files"""
         with self.app_data.ensure_extracted(Path(__file__).parent / "_virtualenv.py") as resolved_path:
             text = resolved_path.read_text()
             return text.replace('"__SCRIPT_DIR__"', repr(os.path.relpath(str(self.script_dir), str(self.purelib))))
 
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/common.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/common.py
@@ -1,17 +1,16 @@
 from __future__ import absolute_import, unicode_literals
 
 from abc import ABCMeta
 from collections import OrderedDict
 
 from six import add_metaclass
 
 from virtualenv.create.describe import PosixSupports, WindowsSupports
-from virtualenv.create.via_global_ref.builtin.ref import RefMust, RefWhen
 from virtualenv.util.path import Path
 
 from ..via_global_self_do import ViaGlobalRefVirtualenvBuiltin
 
 
 @add_metaclass(ABCMeta)
 class CPython(ViaGlobalRefVirtualenvBuiltin):
     @classmethod
@@ -29,37 +28,29 @@ class CPythonPosix(CPython, PosixSupport
 
     @classmethod
     def _executables(cls, interpreter):
         host_exe = Path(interpreter.system_executable)
         major, minor = interpreter.version_info.major, interpreter.version_info.minor
         targets = OrderedDict(
             (i, None) for i in ["python", "python{}".format(major), "python{}.{}".format(major, minor), host_exe.name]
         )
-        must = RefMust.COPY if interpreter.version_info.major == 2 else RefMust.NA
-        yield host_exe, list(targets.keys()), must, RefWhen.ANY
+        yield host_exe, list(targets.keys())
 
 
 @add_metaclass(ABCMeta)
 class CPythonWindows(CPython, WindowsSupports):
     @classmethod
     def _executables(cls, interpreter):
-        # symlink of the python executables does not work reliably, copy always instead
-        # - https://bugs.python.org/issue42013
-        # - venv
-        host = cls.host_python(interpreter)
+        host = Path(interpreter.system_executable)
         for path in (host.parent / n for n in {"python.exe", host.name}):
-            yield host, [path.name], RefMust.COPY, RefWhen.ANY
+            yield host, [path.name]
         # for more info on pythonw.exe see https://stackoverflow.com/a/30313091
         python_w = host.parent / "pythonw.exe"
-        yield python_w, [python_w.name], RefMust.COPY, RefWhen.ANY
-
-    @classmethod
-    def host_python(cls, interpreter):
-        return Path(interpreter.system_executable)
+        yield python_w, [python_w.name]
 
 
 def is_mac_os_framework(interpreter):
     if interpreter.platform == "darwin":
         framework_var = interpreter.sysconfig_vars.get("PYTHONFRAMEWORK")
         value = "Python3" if interpreter.version_info.major == 3 else "Python"
         return framework_var == value
     return False
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py
@@ -50,31 +50,18 @@ class CPython3Windows(CPythonWindows, CP
         if is_store_python(interpreter):  # store python is not supported here
             return None
         return super(CPython3Windows, cls).setup_meta(interpreter)
 
     @classmethod
     def sources(cls, interpreter):
         for src in super(CPython3Windows, cls).sources(interpreter):
             yield src
-        if not cls.venv_37p(interpreter):
-            for src in cls.include_dll_and_pyd(interpreter):
-                yield src
-
-    @staticmethod
-    def venv_37p(interpreter):
-        return interpreter.version_info.minor >= 7
-
-    @classmethod
-    def host_python(cls, interpreter):
-        if cls.venv_37p(interpreter):
-            # starting with CPython 3.7 Windows ships with a venvlauncher.exe that avoids the need for dll/pyd copies
-            # it also means the wrapper must be copied to avoid bugs such as https://bugs.python.org/issue42013
-            return Path(interpreter.system_stdlib) / "venv" / "scripts" / "nt" / "python.exe"
-        return super(CPython3Windows, cls).host_python(interpreter)
+        for src in cls.include_dll_and_pyd(interpreter):
+            yield src
 
     @classmethod
     def include_dll_and_pyd(cls, interpreter):
         dll_folder = Path(interpreter.system_prefix) / "DLLs"
         host_exe_folder = Path(interpreter.system_executable).parent
         for folder in [host_exe_folder, dll_folder]:
             for file in folder.iterdir():
                 if file.suffix in (".pyd", ".dll"):
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/mac_os.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/mac_os.py
@@ -4,17 +4,17 @@ import logging
 import os
 import struct
 import subprocess
 from abc import ABCMeta, abstractmethod
 from textwrap import dedent
 
 from six import add_metaclass
 
-from virtualenv.create.via_global_ref.builtin.ref import ExePathRefToDest, PathRefToDest, RefMust
+from virtualenv.create.via_global_ref.builtin.ref import ExePathRefToDest, PathRefToDest
 from virtualenv.util.path import Path
 from virtualenv.util.six import ensure_text
 
 from .common import CPython, CPythonPosix, is_mac_os_framework
 from .cpython2 import CPython2PosixBase
 from .cpython3 import CPython3
 
 
@@ -24,43 +24,42 @@ class CPythonmacOsFramework(CPython):
     def can_describe(cls, interpreter):
         return is_mac_os_framework(interpreter) and super(CPythonmacOsFramework, cls).can_describe(interpreter)
 
     @classmethod
     def sources(cls, interpreter):
         for src in super(CPythonmacOsFramework, cls).sources(interpreter):
             yield src
         # add a symlink to the host python image
-        exe = cls.image_ref(interpreter)
-        ref = PathRefToDest(exe, dest=lambda self, _: self.dest / ".Python", must=RefMust.SYMLINK)
+        ref = PathRefToDest(cls.image_ref(interpreter), dest=lambda self, _: self.dest / ".Python", must_symlink=True)
         yield ref
 
     def create(self):
         super(CPythonmacOsFramework, self).create()
 
         # change the install_name of the copied python executables
         target = "@executable_path/../.Python"
         current = self.current_mach_o_image_path()
         for src in self._sources:
             if isinstance(src, ExePathRefToDest):
-                if src.must == RefMust.COPY or not self.symlinks:
+                if src.must_copy or not self.symlinks:
                     exes = [self.bin_dir / src.base]
                     if not self.symlinks:
                         exes.extend(self.bin_dir / a for a in src.aliases)
                     for exe in exes:
                         fix_mach_o(str(exe), current, target, self.interpreter.max_size)
 
     @classmethod
     def _executables(cls, interpreter):
-        for _, targets, must, when in super(CPythonmacOsFramework, cls)._executables(interpreter):
+        for _, targets in super(CPythonmacOsFramework, cls)._executables(interpreter):
             # Make sure we use the embedded interpreter inside the framework, even if sys.executable points to the
             # stub executable in ${sys.prefix}/bin.
             # See http://groups.google.com/group/python-virtualenv/browse_thread/thread/17cab2f85da75951
             fixed_host_exe = Path(interpreter.prefix) / "Resources" / "Python.app" / "Contents" / "MacOS" / "Python"
-            yield fixed_host_exe, targets, must, when
+            yield fixed_host_exe, targets
 
     @abstractmethod
     def current_mach_o_image_path(self):
         raise NotImplementedError
 
     @classmethod
     def image_ref(cls, interpreter):
         raise NotImplementedError
@@ -237,17 +236,17 @@ def _builtin_change_mach_o(maxint):
         """Read a given number of 32-bits unsigned integers from the given file with the given endianness."""
         res = struct.unpack(endian + "L" * num, file.read(num * 4))
         if len(res) == 1:
             return res[0]
         return res
 
     def mach_o_change(at_path, what, value):
         """Replace a given name (what) in any LC_LOAD_DYLIB command found in the given binary with a new name (value),
-        provided it's shorter."""
+         provided it's shorter."""
 
         def do_macho(file, bits, endian):
             # Read Mach-O header (the magic number is assumed read by the caller)
             cpu_type, cpu_sub_type, file_type, n_commands, size_of_commands, flags = read_data(file, endian, 6)
             # 64-bits header has one more field.
             if bits == 64:
                 read_data(file, endian)
             # The header is followed by n commands
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/pypy/common.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/pypy/common.py
@@ -1,32 +1,31 @@
 from __future__ import absolute_import, unicode_literals
 
 import abc
 
 from six import add_metaclass
 
-from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest, RefMust, RefWhen
+from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest
 from virtualenv.util.path import Path
 
 from ..via_global_self_do import ViaGlobalRefVirtualenvBuiltin
 
 
 @add_metaclass(abc.ABCMeta)
 class PyPy(ViaGlobalRefVirtualenvBuiltin):
     @classmethod
     def can_describe(cls, interpreter):
         return interpreter.implementation == "PyPy" and super(PyPy, cls).can_describe(interpreter)
 
     @classmethod
     def _executables(cls, interpreter):
         host = Path(interpreter.system_executable)
         targets = sorted("{}{}".format(name, PyPy.suffix) for name in cls.exe_names(interpreter))
-        must = RefMust.COPY if interpreter.version_info.major == 2 else RefMust.NA
-        yield host, targets, must, RefWhen.ANY
+        yield host, targets
 
     @classmethod
     def exe_names(cls, interpreter):
         return {
             cls.exe_stem(),
             "python",
             "python{}".format(interpreter.version_info.major),
             "python{}.{}".format(*interpreter.version_info),
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/python2/site.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/python2/site.py
@@ -47,17 +47,18 @@ def load_host_site():
     site_packages = r"""
     ___EXPECTED_SITE_PACKAGES___
     """
     import json
 
     add_site_dir = sys.modules["site"].addsitedir
     for path in json.loads(site_packages):
         full_path = os.path.abspath(os.path.join(here, path.encode("utf-8")))
-        add_site_dir(full_path)
+        if full_path not in sys.path:
+            add_site_dir(full_path)
 
 
 sep = "\\" if sys.platform == "win32" else "/"  # no os module here yet - poor mans version
 
 
 def read_pyvenv():
     """read pyvenv.cfg"""
     config_file = "{}{}pyvenv.cfg".format(sys.prefix, sep)
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/ref.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/ref.py
@@ -12,46 +12,36 @@ from stat import S_IXGRP, S_IXOTH, S_IXU
 
 from six import add_metaclass
 
 from virtualenv.info import fs_is_case_sensitive, fs_supports_symlink
 from virtualenv.util.path import copy, make_exe, symlink
 from virtualenv.util.six import ensure_text
 
 
-class RefMust(object):
-    NA = "NA"
-    COPY = "copy"
-    SYMLINK = "symlink"
-
-
-class RefWhen(object):
-    ANY = "ANY"
-    COPY = "copy"
-    SYMLINK = "symlink"
-
-
 @add_metaclass(ABCMeta)
 class PathRef(object):
     """Base class that checks if a file reference can be symlink/copied"""
 
     FS_SUPPORTS_SYMLINK = fs_supports_symlink()
     FS_CASE_SENSITIVE = fs_is_case_sensitive()
 
-    def __init__(self, src, must=RefMust.NA, when=RefWhen.ANY):
-        self.must = must
-        self.when = when
+    def __init__(self, src, must_symlink, must_copy):
+        self.must_symlink = must_symlink
+        self.must_copy = must_copy
         self.src = src
         try:
             self.exists = src.exists()
         except OSError:
             self.exists = False
         self._can_read = None if self.exists else False
         self._can_copy = None if self.exists else False
         self._can_symlink = None if self.exists else False
+        if self.must_copy is True and self.must_symlink is True:
+            raise ValueError("can copy and symlink at the same time")
 
     def __repr__(self):
         return "{}(src={})".format(self.__class__.__name__, self.src)
 
     @property
     def can_read(self):
         if self._can_read is None:
             if self.src.is_file():
@@ -62,49 +52,49 @@ class PathRef(object):
                     self._can_read = False
             else:
                 self._can_read = os.access(ensure_text(str(self.src)), os.R_OK)
         return self._can_read
 
     @property
     def can_copy(self):
         if self._can_copy is None:
-            if self.must == RefMust.SYMLINK:
+            if self.must_symlink:
                 self._can_copy = self.can_symlink
             else:
                 self._can_copy = self.can_read
         return self._can_copy
 
     @property
     def can_symlink(self):
         if self._can_symlink is None:
-            if self.must == RefMust.COPY:
+            if self.must_copy:
                 self._can_symlink = self.can_copy
             else:
                 self._can_symlink = self.FS_SUPPORTS_SYMLINK and self.can_read
         return self._can_symlink
 
     @abstractmethod
     def run(self, creator, symlinks):
         raise NotImplementedError
 
     def method(self, symlinks):
-        if self.must == RefMust.SYMLINK:
+        if self.must_symlink:
             return symlink
-        if self.must == RefMust.COPY:
+        if self.must_copy:
             return copy
         return symlink if symlinks else copy
 
 
 @add_metaclass(ABCMeta)
 class ExePathRef(PathRef):
     """Base class that checks if a executable can be references via symlink/copy"""
 
-    def __init__(self, src, must=RefMust.NA, when=RefWhen.ANY):
-        super(ExePathRef, self).__init__(src, must, when)
+    def __init__(self, src, must_symlink, must_copy):
+        super(ExePathRef, self).__init__(src, must_symlink, must_copy)
         self._can_run = None
 
     @property
     def can_symlink(self):
         if self.FS_SUPPORTS_SYMLINK:
             return self.can_run
         return False
 
@@ -119,41 +109,42 @@ class ExePathRef(PathRef):
             else:
                 self._can_run = False
         return self._can_run
 
 
 class PathRefToDest(PathRef):
     """Link a path on the file system"""
 
-    def __init__(self, src, dest, must=RefMust.NA, when=RefWhen.ANY):
-        super(PathRefToDest, self).__init__(src, must, when)
+    def __init__(self, src, dest, must_symlink=False, must_copy=False):
+        super(PathRefToDest, self).__init__(src, must_symlink, must_copy)
         self.dest = dest
 
     def run(self, creator, symlinks):
         dest = self.dest(creator, self.src)
         method = self.method(symlinks)
         dest_iterable = dest if isinstance(dest, list) else (dest,)
         if not dest.parent.exists():
             dest.parent.mkdir(parents=True, exist_ok=True)
         for dst in dest_iterable:
             method(self.src, dst)
 
 
 class ExePathRefToDest(PathRefToDest, ExePathRef):
     """Link a exe path on the file system"""
 
-    def __init__(self, src, targets, dest, must=RefMust.NA, when=RefWhen.ANY):
-        ExePathRef.__init__(self, src, must, when)
-        PathRefToDest.__init__(self, src, dest, must, when)
+    def __init__(self, src, targets, dest, must_symlink=False, must_copy=False):
+        ExePathRef.__init__(self, src, must_symlink, must_copy)
+        PathRefToDest.__init__(self, src, dest, must_symlink, must_copy)
         if not self.FS_CASE_SENSITIVE:
             targets = list(OrderedDict((i.lower(), None) for i in targets).keys())
         self.base = targets[0]
         self.aliases = targets[1:]
         self.dest = dest
+        self.must_copy = must_copy
 
     def run(self, creator, symlinks):
         bin_dir = self.dest(creator, self.src).parent
         dest = bin_dir / self.base
         method = self.method(symlinks)
         method(self.src, dest)
         if not symlinks:
             make_exe(dest)
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/via_global_self_do.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/via_global_self_do.py
@@ -1,15 +1,15 @@
 from __future__ import absolute_import, unicode_literals
 
 from abc import ABCMeta
 
 from six import add_metaclass
 
-from virtualenv.create.via_global_ref.builtin.ref import ExePathRefToDest, RefMust, RefWhen
+from virtualenv.create.via_global_ref.builtin.ref import ExePathRefToDest
 from virtualenv.util.path import ensure_dir
 
 from ..api import ViaGlobalRefApi, ViaGlobalRefMeta
 from .builtin_way import VirtualenvBuiltin
 
 
 class BuiltinViaGlobalRefMeta(ViaGlobalRefMeta):
     def __init__(self):
@@ -22,56 +22,46 @@ class ViaGlobalRefVirtualenvBuiltin(ViaG
     def __init__(self, options, interpreter):
         super(ViaGlobalRefVirtualenvBuiltin, self).__init__(options, interpreter)
         self._sources = getattr(options.meta, "sources", None)  # if we're created as a describer this might be missing
 
     @classmethod
     def can_create(cls, interpreter):
         """By default all built-in methods assume that if we can describe it we can create it"""
         # first we must be able to describe it
-        if not cls.can_describe(interpreter):
-            return None
-        meta = cls.setup_meta(interpreter)
-        if meta is not None and meta:
-            cls._sources_can_be_applied(interpreter, meta)
-        return meta
-
-    @classmethod
-    def _sources_can_be_applied(cls, interpreter, meta):
-        for src in cls.sources(interpreter):
-            if src.exists:
-                if meta.can_copy and not src.can_copy:
-                    meta.copy_error = "cannot copy {}".format(src)
-                if meta.can_symlink and not src.can_symlink:
-                    meta.symlink_error = "cannot symlink {}".format(src)
-            else:
-                msg = "missing required file {}".format(src)
-                if src.when == RefMust.NA:
-                    meta.error = msg
-                elif src.when == RefMust.COPY:
-                    meta.copy_error = msg
-                elif src.when == RefMust.SYMLINK:
-                    meta.symlink_error = msg
-            if not meta.can_copy and not meta.can_symlink:
-                meta.error = "neither copy or symlink supported, copy: {} symlink: {}".format(
-                    meta.copy_error,
-                    meta.symlink_error,
-                )
-            if meta.error:
-                break
-            meta.sources.append(src)
+        if cls.can_describe(interpreter):
+            meta = cls.setup_meta(interpreter)
+            if meta is not None and meta:
+                for src in cls.sources(interpreter):
+                    if src.exists:
+                        if meta.can_copy and not src.can_copy:
+                            meta.copy_error = "cannot copy {}".format(src)
+                        if meta.can_symlink and not src.can_symlink:
+                            meta.symlink_error = "cannot symlink {}".format(src)
+                        if not meta.can_copy and not meta.can_symlink:
+                            meta.error = "neither copy or symlink supported, copy: {} symlink: {}".format(
+                                meta.copy_error, meta.symlink_error,
+                            )
+                    else:
+                        meta.error = "missing required file {}".format(src)
+                    if meta.error:
+                        break
+                    meta.sources.append(src)
+            return meta
+        return None
 
     @classmethod
     def setup_meta(cls, interpreter):
         return BuiltinViaGlobalRefMeta()
 
     @classmethod
     def sources(cls, interpreter):
-        for host_exe, targets, must, when in cls._executables(interpreter):
-            yield ExePathRefToDest(host_exe, dest=cls.to_bin, targets=targets, must=must, when=when)
+        is_py2 = interpreter.version_info.major == 2
+        for host_exe, targets in cls._executables(interpreter):
+            yield ExePathRefToDest(host_exe, dest=cls.to_bin, targets=targets, must_copy=is_py2)
 
     def to_bin(self, src):
         return self.bin_dir / src.name
 
     @classmethod
     def _executables(cls, interpreter):
         raise NotImplementedError
 
@@ -84,31 +74,26 @@ class ViaGlobalRefVirtualenvBuiltin(ViaG
             ensure_dir(directory)
 
         self.set_pyenv_cfg()
         self.pyenv_cfg.write()
         true_system_site = self.enable_system_site_package
         try:
             self.enable_system_site_package = False
             for src in self._sources:
-                if (
-                    src.when == RefWhen.ANY
-                    or (src.when == RefWhen.SYMLINK and self.symlinks is True)
-                    or (src.when == RefWhen.COPY and self.symlinks is False)
-                ):
-                    src.run(self, self.symlinks)
+                src.run(self, self.symlinks)
         finally:
             if true_system_site != self.enable_system_site_package:
                 self.enable_system_site_package = true_system_site
         super(ViaGlobalRefVirtualenvBuiltin, self).create()
 
     def ensure_directories(self):
         return {self.dest, self.bin_dir, self.script_dir, self.stdlib} | set(self.libs)
 
     def set_pyenv_cfg(self):
         """
         We directly inject the base prefix and base exec prefix to avoid site.py needing to discover these
         from home (which usually is done within the interpreter itself)
-        """
+         """
         super(ViaGlobalRefVirtualenvBuiltin, self).set_pyenv_cfg()
         self.pyenv_cfg["base-prefix"] = self.interpreter.system_prefix
         self.pyenv_cfg["base-exec-prefix"] = self.interpreter.system_exec_prefix
         self.pyenv_cfg["base-executable"] = self.interpreter.system_executable
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/venv.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/venv.py
@@ -41,20 +41,17 @@ class Venv(ViaGlobalRefApi):
         for lib in self.libs:
             ensure_dir(lib)
         super(Venv, self).create()
 
     def create_inline(self):
         from venv import EnvBuilder
 
         builder = EnvBuilder(
-            system_site_packages=self.enable_system_site_package,
-            clear=False,
-            symlinks=self.symlinks,
-            with_pip=False,
+            system_site_packages=self.enable_system_site_package, clear=False, symlinks=self.symlinks, with_pip=False,
         )
         builder.create(str(self.dest))
 
     def create_via_sub_process(self):
         cmd = self.get_host_create_cmd()
         logging.info("using host built-in venv to create via %s", " ".join(cmd))
         code, out, err = run_cmd(cmd)
         if code != 0:
--- a/third_party/python/virtualenv/virtualenv/discovery/builtin.py
+++ b/third_party/python/virtualenv/virtualenv/discovery/builtin.py
@@ -10,46 +10,38 @@ from virtualenv.util.six import ensure_s
 from .discover import Discover
 from .py_info import PythonInfo
 from .py_spec import PythonSpec
 
 
 class Builtin(Discover):
     def __init__(self, options):
         super(Builtin, self).__init__(options)
-        self.python_spec = options.python if options.python else [sys.executable]
+        self.python_spec = options.python
         self.app_data = options.app_data
 
     @classmethod
     def add_parser_arguments(cls, parser):
         parser.add_argument(
             "-p",
             "--python",
             dest="python",
             metavar="py",
-            type=str,
-            action="append",
-            default=[],
-            help="interpreter based on what to create environment (path/identifier) "
-            "- by default use the interpreter where the tool is installed - first found wins",
+            help="target interpreter for which to create a virtual (either absolute path or identifier string)",
+            default=sys.executable,
         )
 
     def run(self):
-        for python_spec in self.python_spec:
-            result = get_interpreter(python_spec, self.app_data)
-            if result is not None:
-                return result
-        return None
+        return get_interpreter(self.python_spec, self.app_data)
 
     def __repr__(self):
         return ensure_str(self.__unicode__())
 
     def __unicode__(self):
-        spec = self.python_spec[0] if len(self.python_spec) == 1 else self.python_spec
-        return "{} discover of python_spec={!r}".format(self.__class__.__name__, spec)
+        return "{} discover of python_spec={!r}".format(self.__class__.__name__, self.python_spec)
 
 
 def get_interpreter(key, app_data=None):
     spec = PythonSpec.from_string_spec(key)
     logging.info("find interpreter for spec %r", spec)
     proposed_paths = set()
     for interpreter, impl_must_match in propose_interpreters(spec, app_data):
         key = interpreter.system_executable, impl_must_match
--- a/third_party/python/virtualenv/virtualenv/discovery/cached_py_info.py
+++ b/third_party/python/virtualenv/virtualenv/discovery/cached_py_info.py
@@ -99,20 +99,17 @@ def _run_subprocess(cls, exe, app_data):
         except OSError as os_error:
             out, err, code = "", os_error.strerror, os_error.errno
     result, failure = None, None
     if code == 0:
         result = cls._from_json(out)
         result.executable = exe  # keep original executable as this may contain initialization code
     else:
         msg = "failed to query {} with code {}{}{}".format(
-            exe,
-            code,
-            " out: {!r}".format(out) if out else "",
-            " err: {!r}".format(err) if err else "",
+            exe, code, " out: {!r}".format(out) if out else "", " err: {!r}".format(err) if err else "",
         )
         failure = RuntimeError(msg)
     return failure, result
 
 
 class LogCmd(object):
     def __init__(self, cmd, env=None):
         self.cmd = cmd
--- a/third_party/python/virtualenv/virtualenv/discovery/py_info.py
+++ b/third_party/python/virtualenv/virtualenv/discovery/py_info.py
@@ -115,17 +115,17 @@ class PythonInfo(object):
                         return base_executable
             return None  # in this case we just can't tell easily without poking around FS and calling them, bail
         # if we're not in a virtual environment, this is already a system python, so return the original executable
         # note we must choose the original and not the pure executable as shim scripts might throw us off
         return self.original_executable
 
     @staticmethod
     def _distutils_install():
-        # follow https://github.com/pypa/pip/blob/main/src/pip/_internal/locations.py#L95
+        # follow https://github.com/pypa/pip/blob/master/src/pip/_internal/locations.py#L95
         # note here we don't import Distribution directly to allow setuptools to patch it
         d = dist.Distribution({"script_args": "--no-user-cfg"})  # conf files not parsed so they do not hijack paths
         if hasattr(sys, "_framework"):
             sys._framework = None  # disable macOS static paths for framework
         i = d.get_command_obj("install", create=True)
         i.prefix = os.sep  # paths generated are relative to prefix that contains the path sep, this makes it relative
         i.finalize_options()
         result = {key: (getattr(i, "install_{}".format(key))[1:]).lstrip(os.sep) for key in SCHEME_KEYS}
@@ -193,18 +193,17 @@ class PythonInfo(object):
     def __unicode__(self):
         content = repr(self)
         if sys.version_info == 2:
             content = content.decode("utf-8")
         return content
 
     def __repr__(self):
         return "{}({!r})".format(
-            self.__class__.__name__,
-            {k: v for k, v in self.__dict__.items() if not k.startswith("_")},
+            self.__class__.__name__, {k: v for k, v in self.__dict__.items() if not k.startswith("_")},
         )
 
     def __str__(self):
         content = "{}({})".format(
             self.__class__.__name__,
             ", ".join(
                 "{}={}".format(k, v)
                 for k, v in (
--- a/third_party/python/virtualenv/virtualenv/run/__init__.py
+++ b/third_party/python/virtualenv/virtualenv/run/__init__.py
@@ -1,14 +1,13 @@
 from __future__ import absolute_import, unicode_literals
 
 import logging
-from functools import partial
 
-from ..app_data import make_app_data
+from ..app_data import AppDataAction, AppDataDisabled, TempAppData
 from ..config.cli.parser import VirtualEnvConfigParser
 from ..report import LEVELS, setup_report
 from ..run.session import Session
 from ..seed.wheels.periodic_update import manual_upgrade
 from ..version import __version__
 from .plugin.activators import ActivationSelector
 from .plugin.creators import CreatorSelector
 from .plugin.discovery import get_discover
@@ -84,41 +83,42 @@ def build_parser_only(args=None):
 
 def handle_extra_commands(options):
     if options.upgrade_embed_wheels:
         result = manual_upgrade(options.app_data)
         raise SystemExit(result)
 
 
 def load_app_data(args, parser, options):
-    parser.add_argument(
-        "--read-only-app-data",
-        action="store_true",
-        help="use app data folder in read-only mode (write operations will fail with error)",
-    )
-    options, _ = parser.parse_known_args(args, namespace=options)
-
     # here we need a write-able application data (e.g. the zipapp might need this for discovery cache)
+    default_app_data = AppDataAction.default()
     parser.add_argument(
         "--app-data",
+        dest="app_data",
+        action=AppDataAction,
+        default="<temp folder>" if isinstance(default_app_data, AppDataDisabled) else default_app_data,
         help="a data folder used as cache by the virtualenv",
-        type=partial(make_app_data, read_only=options.read_only_app_data),
-        default=make_app_data(None, read_only=options.read_only_app_data),
     )
     parser.add_argument(
         "--reset-app-data",
+        dest="reset_app_data",
         action="store_true",
         help="start with empty app data folder",
+        default=False,
     )
     parser.add_argument(
         "--upgrade-embed-wheels",
+        dest="upgrade_embed_wheels",
         action="store_true",
         help="trigger a manual update of the embedded wheels",
+        default=False,
     )
     options, _ = parser.parse_known_args(args, namespace=options)
+    if options.app_data == "<temp folder>":
+        options.app_data = TempAppData()
     if options.reset_app_data:
         options.app_data.reset()
     return options
 
 
 def add_version_flag(parser):
     import virtualenv
 
@@ -129,18 +129,17 @@ def add_version_flag(parser):
         help="display the version of the virtualenv package and its location, then exit",
     )
 
 
 def _do_report_setup(parser, args, setup_logging):
     level_map = ", ".join("{}={}".format(logging.getLevelName(l), c) for c, l in sorted(list(LEVELS.items())))
     msg = "verbosity = verbose - quiet, default {}, mapping => {}"
     verbosity_group = parser.add_argument_group(
-        title="verbosity",
-        description=msg.format(logging.getLevelName(LEVELS[3]), level_map),
+        title="verbosity", description=msg.format(logging.getLevelName(LEVELS[3]), level_map),
     )
     verbosity = verbosity_group.add_mutually_exclusive_group()
     verbosity.add_argument("-v", "--verbose", action="count", dest="verbose", help="increase verbosity", default=2)
     verbosity.add_argument("-q", "--quiet", action="count", dest="quiet", help="decrease verbosity", default=0)
     option, _ = parser.parse_known_args(args)
     if setup_logging:
         setup_report(option.verbosity)
 
--- a/third_party/python/virtualenv/virtualenv/run/plugin/creators.py
+++ b/third_party/python/virtualenv/virtualenv/run/plugin/creators.py
@@ -13,44 +13,44 @@ CreatorInfo = namedtuple("CreatorInfo", 
 class CreatorSelector(ComponentBuilder):
     def __init__(self, interpreter, parser):
         creators, self.key_to_meta, self.describe, self.builtin_key = self.for_interpreter(interpreter)
         super(CreatorSelector, self).__init__(interpreter, parser, "creator", creators)
 
     @classmethod
     def for_interpreter(cls, interpreter):
         key_to_class, key_to_meta, builtin_key, describe = OrderedDict(), {}, None, None
-        errors = defaultdict(list)
+        errored = defaultdict(list)
         for key, creator_class in cls.options("virtualenv.create").items():
             if key == "builtin":
                 raise RuntimeError("builtin creator is a reserved name")
             meta = creator_class.can_create(interpreter)
             if meta:
                 if meta.error:
-                    errors[meta.error].append(creator_class)
+                    errored[meta.error].append(creator_class)
                 else:
                     if "builtin" not in key_to_class and issubclass(creator_class, VirtualenvBuiltin):
                         builtin_key = key
                         key_to_class["builtin"] = creator_class
                         key_to_meta["builtin"] = meta
                     key_to_class[key] = creator_class
                     key_to_meta[key] = meta
             if describe is None and issubclass(creator_class, Describe) and creator_class.can_describe(interpreter):
                 describe = creator_class
         if not key_to_meta:
-            if errors:
-                rows = ["{} for creators {}".format(k, ", ".join(i.__name__ for i in v)) for k, v in errors.items()]
-                raise RuntimeError("\n".join(rows))
+            if errored:
+                raise RuntimeError(
+                    "\n".join(
+                        "{} for creators {}".format(k, ", ".join(i.__name__ for i in v)) for k, v in errored.items()
+                    ),
+                )
             else:
                 raise RuntimeError("No virtualenv implementation for {}".format(interpreter))
         return CreatorInfo(
-            key_to_class=key_to_class,
-            key_to_meta=key_to_meta,
-            describe=describe,
-            builtin_key=builtin_key,
+            key_to_class=key_to_class, key_to_meta=key_to_meta, describe=describe, builtin_key=builtin_key,
         )
 
     def add_selector_arg_parse(self, name, choices):
         # prefer the built-in venv if present, otherwise fallback to first defined type
         choices = sorted(choices, key=lambda a: 0 if a == "builtin" else 1)
         default_value = self._get_default(choices)
         self.parser.add_argument(
             "--{}".format(name),
--- a/third_party/python/virtualenv/virtualenv/run/plugin/discovery.py
+++ b/third_party/python/virtualenv/virtualenv/run/plugin/discovery.py
@@ -5,18 +5,17 @@ from .base import PluginLoader
 
 class Discovery(PluginLoader):
     """"""
 
 
 def get_discover(parser, args):
     discover_types = Discovery.entry_points_for("virtualenv.discovery")
     discovery_parser = parser.add_argument_group(
-        title="discovery",
-        description="discover and provide a target interpreter",
+        title="discovery", description="discover and provide a target interpreter",
     )
     discovery_parser.add_argument(
         "--discovery",
         choices=_get_default_discovery(discover_types),
         default=next(i for i in discover_types.keys()),
         required=False,
         help="interpreter discovery method",
     )
--- a/third_party/python/virtualenv/virtualenv/run/plugin/seeders.py
+++ b/third_party/python/virtualenv/virtualenv/run/plugin/seeders.py
@@ -12,21 +12,17 @@ class SeederSelector(ComponentBuilder):
         self.parser.add_argument(
             "--{}".format(name),
             choices=choices,
             default=self._get_default(),
             required=False,
             help="seed packages install method",
         )
         self.parser.add_argument(
-            "--no-seed",
-            "--without-pip",
-            help="do not install seed packages",
-            action="store_true",
-            dest="no_seed",
+            "--no-seed", "--without-pip", help="do not install seed packages", action="store_true", dest="no_seed",
         )
 
     @staticmethod
     def _get_default():
         return "app-data"
 
     def handle_selected_arg_parse(self, options):
         return super(SeederSelector, self).handle_selected_arg_parse(options)
--- a/third_party/python/virtualenv/virtualenv/run/session.py
+++ b/third_party/python/virtualenv/virtualenv/run/session.py
@@ -57,18 +57,17 @@ class Session(object):
     def _seed(self):
         if self.seeder is not None and self.seeder.enabled:
             logging.info("add seed packages via %s", self.seeder)
             self.seeder.run(self.creator)
 
     def _activate(self):
         if self.activators:
             logging.info(
-                "add activators for %s",
-                ", ".join(type(i).__name__.replace("Activator", "") for i in self.activators),
+                "add activators for %s", ", ".join(type(i).__name__.replace("Activator", "") for i in self.activators),
             )
             for activator in self.activators:
                 activator.generate(self.creator)
 
     def __enter__(self):
         return self
 
     def __exit__(self, exc_type, exc_val, exc_tb):
--- a/third_party/python/virtualenv/virtualenv/seed/embed/base_embed.py
+++ b/third_party/python/virtualenv/virtualenv/seed/embed/base_embed.py
@@ -104,15 +104,14 @@ class BaseEmbed(Seeder):
         result += "("
         if self.extra_search_dir:
             result += "extra_search_dir={},".format(", ".join(ensure_text(str(i)) for i in self.extra_search_dir))
         result += "download={},".format(self.download)
         for distribution in self.distributions():
             if getattr(self, "no_{}".format(distribution)):
                 continue
             result += " {}{},".format(
-                distribution,
-                "={}".format(getattr(self, "{}_version".format(distribution), None) or "latest"),
+                distribution, "={}".format(getattr(self, "{}_version".format(distribution), None) or "latest"),
             )
         return result[:-1] + ")"
 
     def __repr__(self):
         return ensure_str(self.__unicode__())
--- a/third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/via_app_data.py
+++ b/third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/via_app_data.py
@@ -3,20 +3,24 @@ from __future__ import absolute_import, 
 
 import logging
 import sys
 import traceback
 from contextlib import contextmanager
 from subprocess import CalledProcessError
 from threading import Lock, Thread
 
+import six
+
 from virtualenv.info import fs_supports_symlink
 from virtualenv.seed.embed.base_embed import BaseEmbed
 from virtualenv.seed.wheels import get_wheel
+from virtualenv.util.lock import _CountedFileLock
 from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_text
 
 from .pip_install.copy import CopyPipInstall
 from .pip_install.symlink import SymlinkPipInstall
 
 
 class FromAppData(BaseEmbed):
     def __init__(self, options):
         super(FromAppData, self).__init__(options)
@@ -45,18 +49,17 @@ class FromAppData(BaseEmbed):
             exceptions = {}
 
             def _install(name, wheel):
                 try:
                     logging.debug("install %s from wheel %s via %s", name, wheel, installer_class.__name__)
                     key = Path(installer_class.__name__) / wheel.path.stem
                     wheel_img = self.app_data.wheel_image(creator.interpreter.version_release_str, key)
                     installer = installer_class(wheel.path, creator, wheel_img)
-                    parent = self.app_data.lock / wheel_img.parent
-                    with parent.non_reentrant_lock_for_key(wheel_img.name):
+                    with _CountedFileLock(ensure_text(str(wheel_img.parent / "{}.lock".format(wheel_img.name)))):
                         if not installer.has_image():
                             installer.build_image()
                     installer.install(creator.interpreter.version_info)
                 except Exception:  # noqa
                     exceptions[name] = sys.exc_info()
 
             threads = list(Thread(target=_install, args=(n, w)) for n, w in name_to_whl.items())
             for thread in threads:
@@ -96,17 +99,17 @@ class FromAppData(BaseEmbed):
                     logging.exception("fail")
                     failure = exception
             if failure:
                 if isinstance(failure, CalledProcessError):
                     msg = "failed to download {}".format(distribution)
                     if version is not None:
                         msg += " version {}".format(version)
                     msg += ", pip download exit code {}".format(failure.returncode)
-                    output = failure.output if sys.version_info < (3, 5) else (failure.output + failure.stderr)
+                    output = failure.output if six.PY2 else (failure.output + failure.stderr)
                     if output:
                         msg += "\n"
                         msg += output
                 else:
                     msg = repr(failure)
                 logging.error(msg)
                 with lock:
                     fail[distribution] = version
--- a/third_party/python/virtualenv/virtualenv/seed/wheels/acquire.py
+++ b/third_party/python/virtualenv/virtualenv/seed/wheels/acquire.py
@@ -1,16 +1,18 @@
 """Bootstrap"""
 from __future__ import absolute_import, unicode_literals
 
 import logging
 import os
 import sys
 from operator import eq, lt
 
+import six
+
 from virtualenv.util.path import Path
 from virtualenv.util.six import ensure_str
 from virtualenv.util.subprocess import Popen, subprocess
 
 from .bundle import from_bundle
 from .util import Version, Wheel, discover_wheels
 
 
@@ -55,17 +57,17 @@ def download_wheel(distribution, version
         to_download,
     ]
     # pip has no interface in python - must be a new sub-process
     env = pip_wheel_env_run(search_dirs, app_data)
     process = Popen(cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
     out, err = process.communicate()
     if process.returncode != 0:
         kwargs = {"output": out}
-        if sys.version_info < (3, 5):
+        if six.PY2:
             kwargs["output"] += err
         else:
             kwargs["stderr"] = err
         raise subprocess.CalledProcessError(process.returncode, cmd, **kwargs)
     result = _find_downloaded_wheel(distribution, version_spec, for_py_version, to_folder, out)
     logging.debug("downloaded wheel %s", result.name)
     return result
 
--- a/third_party/python/virtualenv/virtualenv/seed/wheels/bundle.py
+++ b/third_party/python/virtualenv/virtualenv/seed/wheels/bundle.py
@@ -1,25 +1,27 @@
 from __future__ import absolute_import, unicode_literals
 
+from virtualenv.app_data import AppDataDiskFolder, TempAppData
+
 from ..wheels.embed import get_embed_wheel
 from .periodic_update import periodic_update
 from .util import Version, Wheel, discover_wheels
 
 
 def from_bundle(distribution, version, for_py_version, search_dirs, app_data, do_periodic_update):
     """
     Load the bundled wheel to a cache directory.
     """