From a5d72d03fe61a4dae2e21d48d081db7db70295dc Mon Sep 17 00:00:00 2001 From: Dan Ryan Date: Sat, 21 Apr 2018 18:15:07 -0400 Subject: [PATCH] Update vendoring tasks Signed-off-by: Dan Ryan --- tasks/vendoring/__init__.py | 7 +- .../patches/pip-update-imports.patch | 268 + .../patches/piptools-delete-vendored.patch | 103066 +++++++++++++++ 3 files changed, 103339 insertions(+), 2 deletions(-) create mode 100644 tasks/vendoring/patches/pip-update-imports.patch create mode 100644 tasks/vendoring/patches/piptools-delete-vendored.patch diff --git a/tasks/vendoring/__init__.py b/tasks/vendoring/__init__.py index 0bdef6ba..71fcb122 100644 --- a/tasks/vendoring/__init__.py +++ b/tasks/vendoring/__init__.py @@ -3,8 +3,7 @@ # Taken from pip # see https://github.com/pypa/pip/blob/95bcf8c5f6394298035a7332c441868f3b0169f4/tasks/vendoring/__init__.py from pathlib import Path -from tempfile import TemporaryDirectory -# from pipenv.utils import TemporaryDirectory, mkdir_p +from pipenv.utils import TemporaryDirectory, mkdir_p import tarfile import zipfile import os @@ -330,6 +329,10 @@ def vendor(ctx, vendor_dir): backport_init.write_text('\n'.join(init_content) + '\n') elif item.name not in FILE_WHITE_LIST: rewrite_file_imports(item, vendored_libs, vendor_dir) + log('Applying patches...') + patch_dir = Path(__file__).parent / 'patches' / 'vendor' + for patch in patch_dir.glob('*.patch'): + apply_patch(ctx, patch) @invoke.task diff --git a/tasks/vendoring/patches/pip-update-imports.patch b/tasks/vendoring/patches/pip-update-imports.patch new file mode 100644 index 00000000..fa32eb58 --- /dev/null +++ b/tasks/vendoring/patches/pip-update-imports.patch @@ -0,0 +1,268 @@ +diff --git a/pipenv/patched/notpip/__init__.py b/pipenv/patched/notpip/__init__.py +index 6e580da..5957d31 100644 +--- a/pipenv/patched/notpip/__init__.py ++++ b/pipenv/patched/notpip/__init__.py +@@ -17,7 +17,7 @@ import re + # the stderr output) and is just plain annoying in normal usage. I don't want + # to add socks as yet another dependency for pip, nor do I want to allow-stder + # in the DEP-8 tests, so just suppress the warning. pdb tells me this has to +-# be done before the import of pip.vcs. ++# be done before the import of pip9.vcs. + from pip9._vendor.urllib3.exceptions import DependencyWarning + warnings.filterwarnings("ignore", category=DependencyWarning) # noqa + +diff --git a/pipenv/patched/notpip/_vendor/requests/__init__.py b/pipenv/patched/notpip/_vendor/requests/__init__.py +index d679f2f..33667fd 100644 +--- a/pipenv/patched/notpip/_vendor/requests/__init__.py ++++ b/pipenv/patched/notpip/_vendor/requests/__init__.py +@@ -40,8 +40,8 @@ is at . + :license: Apache 2.0, see LICENSE for more details. + """ + +-from pip._vendor import urllib3 +-from pip._vendor import chardet ++from pip9._vendor import urllib3 ++from pip9._vendor import chardet + import warnings + from .exceptions import RequestsDependencyWarning + +@@ -81,13 +81,13 @@ except (AssertionError, ValueError): + + # Attempt to enable urllib3's SNI support, if possible + # try: +-# from pip._vendor.urllib3.contrib import pyopenssl ++# from pip9._vendor.urllib3.contrib import pyopenssl + # pyopenssl.inject_into_urllib3() + # except ImportError: + # pass + + # urllib3's DependencyWarnings should be silenced. +-from pip._vendor.urllib3.exceptions import DependencyWarning ++from pip9._vendor.urllib3.exceptions import DependencyWarning + warnings.simplefilter('ignore', DependencyWarning) + + from .__version__ import __title__, __description__, __url__, __version__ +diff --git a/pipenv/patched/notpip/_vendor/requests/adapters.py b/pipenv/patched/notpip/_vendor/requests/adapters.py +index 5787638..4cdbf7e 100644 +--- a/pipenv/patched/notpip/_vendor/requests/adapters.py ++++ b/pipenv/patched/notpip/_vendor/requests/adapters.py +@@ -11,20 +11,20 @@ and maintain connections. + import os.path + import socket + +-from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url +-from pip._vendor.urllib3.response import HTTPResponse +-from pip._vendor.urllib3.util import Timeout as TimeoutSauce +-from pip._vendor.urllib3.util.retry import Retry +-from pip._vendor.urllib3.exceptions import ClosedPoolError +-from pip._vendor.urllib3.exceptions import ConnectTimeoutError +-from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError +-from pip._vendor.urllib3.exceptions import MaxRetryError +-from pip._vendor.urllib3.exceptions import NewConnectionError +-from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError +-from pip._vendor.urllib3.exceptions import ProtocolError +-from pip._vendor.urllib3.exceptions import ReadTimeoutError +-from pip._vendor.urllib3.exceptions import SSLError as _SSLError +-from pip._vendor.urllib3.exceptions import ResponseError ++from pip9._vendor.urllib3.poolmanager import PoolManager, proxy_from_url ++from pip9._vendor.urllib3.response import HTTPResponse ++from pip9._vendor.urllib3.util import Timeout as TimeoutSauce ++from pip9._vendor.urllib3.util.retry import Retry ++from pip9._vendor.urllib3.exceptions import ClosedPoolError ++from pip9._vendor.urllib3.exceptions import ConnectTimeoutError ++from pip9._vendor.urllib3.exceptions import HTTPError as _HTTPError ++from pip9._vendor.urllib3.exceptions import MaxRetryError ++from pip9._vendor.urllib3.exceptions import NewConnectionError ++from pip9._vendor.urllib3.exceptions import ProxyError as _ProxyError ++from pip9._vendor.urllib3.exceptions import ProtocolError ++from pip9._vendor.urllib3.exceptions import ReadTimeoutError ++from pip9._vendor.urllib3.exceptions import SSLError as _SSLError ++from pip9._vendor.urllib3.exceptions import ResponseError + + from .models import Response + from .compat import urlparse, basestring +@@ -38,7 +38,7 @@ from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + from .auth import _basic_auth_str + + try: +- from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager ++ from pip9._vendor.urllib3.contrib.socks import SOCKSProxyManager + except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") +diff --git a/pipenv/patched/notpip/_vendor/requests/certs.py b/pipenv/patched/notpip/_vendor/requests/certs.py +index 06a594e..2439625 100644 +--- a/pipenv/patched/notpip/_vendor/requests/certs.py ++++ b/pipenv/patched/notpip/_vendor/requests/certs.py +@@ -12,7 +12,7 @@ If you are packaging Requests, e.g., for a Linux distribution or a managed + environment, you can change the definition of where() to return a separately + packaged CA bundle. + """ +-from pip._vendor.certifi import where ++from pip9._vendor.certifi import where + + if __name__ == '__main__': + print(where()) +diff --git a/pipenv/patched/notpip/_vendor/requests/compat.py b/pipenv/patched/notpip/_vendor/requests/compat.py +index 9c7d6d8..7a9ba56 100644 +--- a/pipenv/patched/notpip/_vendor/requests/compat.py ++++ b/pipenv/patched/notpip/_vendor/requests/compat.py +@@ -8,7 +8,7 @@ This module handles import compatibility issues between Python 2 and + Python 3. + """ + +-from pip._vendor import chardet ++from pip9._vendor import chardet + + import sys + +@@ -44,7 +44,7 @@ if is_py2: + from Cookie import Morsel + from StringIO import StringIO + +- from pip._vendor.urllib3.packages.ordered_dict import OrderedDict ++ from pip9._vendor.urllib3.packages.ordered_dict import OrderedDict + + builtin_str = str + bytes = str +diff --git a/pipenv/patched/notpip/_vendor/requests/exceptions.py b/pipenv/patched/notpip/_vendor/requests/exceptions.py +index 3e5d0b2..c116f8e 100644 +--- a/pipenv/patched/notpip/_vendor/requests/exceptions.py ++++ b/pipenv/patched/notpip/_vendor/requests/exceptions.py +@@ -6,7 +6,7 @@ requests.exceptions + + This module contains the set of Requests' exceptions. + """ +-from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError ++from pip9._vendor.urllib3.exceptions import HTTPError as BaseHTTPError + + + class RequestException(IOError): +diff --git a/pipenv/patched/notpip/_vendor/requests/help.py b/pipenv/patched/notpip/_vendor/requests/help.py +index 7c4b193..96f656f 100644 +--- a/pipenv/patched/notpip/_vendor/requests/help.py ++++ b/pipenv/patched/notpip/_vendor/requests/help.py +@@ -6,9 +6,9 @@ import platform + import sys + import ssl + +-from pip._vendor import idna +-from pip._vendor import urllib3 +-from pip._vendor import chardet ++from pip9._vendor import idna ++from pip9._vendor import urllib3 ++from pip9._vendor import chardet + + from . import __version__ as requests_version + +diff --git a/pipenv/patched/notpip/_vendor/requests/models.py b/pipenv/patched/notpip/_vendor/requests/models.py +index 4254fbd..a7efaa0 100644 +--- a/pipenv/patched/notpip/_vendor/requests/models.py ++++ b/pipenv/patched/notpip/_vendor/requests/models.py +@@ -16,10 +16,10 @@ import sys + # such as in Embedded Python. See https://github.com/requests/requests/issues/3578. + import encodings.idna + +-from pip._vendor.urllib3.fields import RequestField +-from pip._vendor.urllib3.filepost import encode_multipart_formdata +-from pip._vendor.urllib3.util import parse_url +-from pip._vendor.urllib3.exceptions import ( ++from pip9._vendor.urllib3.fields import RequestField ++from pip9._vendor.urllib3.filepost import encode_multipart_formdata ++from pip9._vendor.urllib3.util import parse_url ++from pip9._vendor.urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + + from io import UnsupportedOperation +diff --git a/pipenv/patched/piptools/cache.py b/pipenv/patched/piptools/cache.py +index 7595b96..5a44953 100644 +--- a/pipenv/patched/piptools/cache.py ++++ b/pipenv/patched/piptools/cache.py +@@ -6,7 +6,7 @@ import json + import os + import sys + +-from pip._vendor.packaging.requirements import Requirement ++from pip9._vendor.packaging.requirements import Requirement + + from .exceptions import PipToolsError + from .locations import CACHE_DIR +diff --git a/pipenv/patched/piptools/repositories/base.py b/pipenv/patched/piptools/repositories/base.py +index 57e85fd..69835c0 100644 +--- a/pipenv/patched/piptools/repositories/base.py ++++ b/pipenv/patched/piptools/repositories/base.py +@@ -44,5 +44,5 @@ class BaseRepository(object): + @contextmanager + def allow_all_wheels(self): + """ +- Monkey patches pip.Wheel to allow wheels from all platforms and Python versions. ++ Monkey patches pip9.Wheel to allow wheels from all platforms and Python versions. + """ +diff --git a/pipenv/patched/piptools/repositories/local.py b/pipenv/patched/piptools/repositories/local.py +index 8f6f028..3c6182b 100644 +--- a/pipenv/patched/piptools/repositories/local.py ++++ b/pipenv/patched/piptools/repositories/local.py +@@ -6,7 +6,7 @@ from contextlib import contextmanager + + from piptools.utils import as_tuple, key_from_req, make_install_requirement + from .base import BaseRepository +-from pip.utils.hashes import FAVORITE_HASH ++from pip9.utils.hashes import FAVORITE_HASH + + + def ireq_satisfied_by_existing_pin(ireq, existing_pin): +diff --git a/pipenv/patched/piptools/repositories/pypi.py b/pipenv/patched/piptools/repositories/pypi.py +index e1f63d2..03833a4 100644 +--- a/pipenv/patched/piptools/repositories/pypi.py ++++ b/pipenv/patched/piptools/repositories/pypi.py +@@ -317,7 +317,7 @@ class PyPIRepository(BaseRepository): + @contextmanager + def allow_all_wheels(self): + """ +- Monkey patches pip.Wheel to allow wheels from all platforms and Python versions. ++ Monkey patches pip9.Wheel to allow wheels from all platforms and Python versions. + + This also saves the candidate cache and set a new one, or else the results from the + previous non-patched calls will interfere. +diff --git a/pipenv/patched/piptools/resolver.py b/pipenv/patched/piptools/resolver.py +index 862be14..64b1199 100644 +--- a/pipenv/patched/piptools/resolver.py ++++ b/pipenv/patched/piptools/resolver.py +@@ -8,7 +8,7 @@ from itertools import chain, count + import os + + from first import first +-from pip.req import InstallRequirement ++from pip9.req import InstallRequirement + + from . import click + from .cache import DependencyCache +diff --git a/pipenv/patched/piptools/scripts/compile.py b/pipenv/patched/piptools/scripts/compile.py +index 0e83bfc..8194fcf 100644 +--- a/pipenv/patched/piptools/scripts/compile.py ++++ b/pipenv/patched/piptools/scripts/compile.py +@@ -247,9 +247,9 @@ def cli(verbose, dry_run, pre, rebuild, find_links, index_url, extra_index_url, + + + def get_pip_command(): +- # Use pip's parser for pip.conf management and defaults. ++ # Use pip's parser for pip9.conf management and defaults. + # General options (find_links, index_url, extra_index_url, trusted_host, +- # and pre) are defered to pip. ++ # and pre) are defered to pip9. + pip_command = PipCommand() + index_opts = pip9.cmdoptions.make_option_group( + pip9.cmdoptions.index_group, +diff --git a/pipenv/patched/safety/cli.py b/pipenv/patched/safety/cli.py +index 37ae3ac..fc543ef 100644 +--- a/pipenv/patched/safety/cli.py ++++ b/pipenv/patched/safety/cli.py +@@ -15,7 +15,7 @@ try: + from pip import get_installed_distributions + except ImportError: + # pip 10 +- from pip._internal.utils.misc import get_installed_distributions ++ from pip9._internal.utils.misc import get_installed_distributions + + + @click.group() diff --git a/tasks/vendoring/patches/piptools-delete-vendored.patch b/tasks/vendoring/patches/piptools-delete-vendored.patch new file mode 100644 index 00000000..06b2a119 --- /dev/null +++ b/tasks/vendoring/patches/piptools-delete-vendored.patch @@ -0,0 +1,103066 @@ +diff --git a/pipenv/patched/piptools/_vendored/__init__.py b/pipenv/patched/piptools/_vendored/__init__.py +deleted file mode 100644 +index e69de29..0000000 +diff --git a/pipenv/patched/piptools/_vendored/pip/__init__.py b/pipenv/patched/piptools/_vendored/pip/__init__.py +deleted file mode 100644 +index c00b284..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/__init__.py ++++ /dev/null +@@ -1,346 +0,0 @@ +-#!/usr/bin/env python +-from __future__ import absolute_import +- +-import locale +-import logging +-import os +-import optparse +-import warnings +- +-import sys +-import re +- +-# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks, +-# but if invoked (i.e. imported), it will issue a warning to stderr if socks +-# isn't available. requests unconditionally imports urllib3's socks contrib +-# module, triggering this warning. The warning breaks DEP-8 tests (because of +-# the stderr output) and is just plain annoying in normal usage. I don't want +-# to add socks as yet another dependency for pip, nor do I want to allow-stder +-# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to +-# be done before the import of pip.vcs. +-from pip._vendor.urllib3.exceptions import DependencyWarning +-warnings.filterwarnings("ignore", category=DependencyWarning) # noqa +- +-# We want to inject the use of SecureTransport as early as possible so that any +-# references or sessions or what have you are ensured to have it, however we +-# only want to do this in the case that we're running on macOS and the linked +-# OpenSSL is too old to handle TLSv1.2 +-try: +- import ssl +-except ImportError: +- pass +-else: +- if (sys.platform == "darwin" and +- getattr(ssl, "OPENSSL_VERSION_NUMBER", 0) < 0x1000100f): # OpenSSL 1.0.1 +- try: +- from pip._vendor.urllib3.contrib import securetransport +- except (ImportError, OSError): +- pass +- else: +- securetransport.inject_into_urllib3() +- +-from pip.exceptions import InstallationError, CommandError, PipError +-from pip.utils import get_installed_distributions, get_prog +-from pip.utils import deprecation, dist_is_editable +-from pip.vcs import git, mercurial, subversion, bazaar # noqa +-from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +-from pip.commands import get_summaries, get_similar_commands +-from pip.commands import commands_dict +-from pip._vendor.urllib3.exceptions import InsecureRequestWarning +- +- +-# assignment for flake8 to be happy +- +-# This fixes a peculiarity when importing via __import__ - as we are +-# initialising the pip module, "from pip import cmdoptions" is recursive +-# and appears not to work properly in that situation. +-import pip.cmdoptions +-cmdoptions = pip.cmdoptions +- +-# The version as used in the setup.py and the docs conf.py +-__version__ = "9.0.3" +- +- +-logger = logging.getLogger(__name__) +- +-# Hide the InsecureRequestWarning from urllib3 +-warnings.filterwarnings("ignore", category=InsecureRequestWarning) +- +- +-def autocomplete(): +- """Command and option completion for the main option parser (and options) +- and its subcommands (and options). +- +- Enable by sourcing one of the completion shell scripts (bash, zsh or fish). +- """ +- # Don't complete if user hasn't sourced bash_completion file. +- if 'PIP_AUTO_COMPLETE' not in os.environ: +- return +- cwords = os.environ['COMP_WORDS'].split()[1:] +- cword = int(os.environ['COMP_CWORD']) +- try: +- current = cwords[cword - 1] +- except IndexError: +- current = '' +- +- subcommands = [cmd for cmd, summary in get_summaries()] +- options = [] +- # subcommand +- try: +- subcommand_name = [w for w in cwords if w in subcommands][0] +- except IndexError: +- subcommand_name = None +- +- parser = create_main_parser() +- # subcommand options +- if subcommand_name: +- # special case: 'help' subcommand has no options +- if subcommand_name == 'help': +- sys.exit(1) +- # special case: list locally installed dists for uninstall command +- if subcommand_name == 'uninstall' and not current.startswith('-'): +- installed = [] +- lc = current.lower() +- for dist in get_installed_distributions(local_only=True): +- if dist.key.startswith(lc) and dist.key not in cwords[1:]: +- installed.append(dist.key) +- # if there are no dists installed, fall back to option completion +- if installed: +- for dist in installed: +- print(dist) +- sys.exit(1) +- +- subcommand = commands_dict[subcommand_name]() +- options += [(opt.get_opt_string(), opt.nargs) +- for opt in subcommand.parser.option_list_all +- if opt.help != optparse.SUPPRESS_HELP] +- +- # filter out previously specified options from available options +- prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] +- options = [(x, v) for (x, v) in options if x not in prev_opts] +- # filter options by current input +- options = [(k, v) for k, v in options if k.startswith(current)] +- for option in options: +- opt_label = option[0] +- # append '=' to options which require args +- if option[1]: +- opt_label += '=' +- print(opt_label) +- else: +- # show main parser options only when necessary +- if current.startswith('-') or current.startswith('--'): +- opts = [i.option_list for i in parser.option_groups] +- opts.append(parser.option_list) +- opts = (o for it in opts for o in it) +- +- subcommands += [i.get_opt_string() for i in opts +- if i.help != optparse.SUPPRESS_HELP] +- +- print(' '.join([x for x in subcommands if x.startswith(current)])) +- sys.exit(1) +- +- +-def create_main_parser(): +- parser_kw = { +- 'usage': '\n%prog [options]', +- 'add_help_option': False, +- 'formatter': UpdatingDefaultsHelpFormatter(), +- 'name': 'global', +- 'prog': get_prog(), +- } +- +- parser = ConfigOptionParser(**parser_kw) +- parser.disable_interspersed_args() +- +- pip_pkg_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +- parser.version = 'pip %s from %s (python %s)' % ( +- __version__, pip_pkg_dir, sys.version[:3]) +- +- # add the general options +- gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) +- parser.add_option_group(gen_opts) +- +- parser.main = True # so the help formatter knows +- +- # create command listing for description +- command_summaries = get_summaries() +- description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] +- parser.description = '\n'.join(description) +- +- return parser +- +- +-def parseopts(args): +- parser = create_main_parser() +- +- # Note: parser calls disable_interspersed_args(), so the result of this +- # call is to split the initial args into the general options before the +- # subcommand and everything else. +- # For example: +- # args: ['--timeout=5', 'install', '--user', 'INITools'] +- # general_options: ['--timeout==5'] +- # args_else: ['install', '--user', 'INITools'] +- general_options, args_else = parser.parse_args(args) +- +- # --version +- if general_options.version: +- sys.stdout.write(parser.version) +- sys.stdout.write(os.linesep) +- sys.exit() +- +- # pip || pip help -> print_help() +- if not args_else or (args_else[0] == 'help' and len(args_else) == 1): +- parser.print_help() +- sys.exit() +- +- # the subcommand name +- cmd_name = args_else[0] +- +- if cmd_name not in commands_dict: +- guess = get_similar_commands(cmd_name) +- +- msg = ['unknown command "%s"' % cmd_name] +- if guess: +- msg.append('maybe you meant "%s"' % guess) +- +- raise CommandError(' - '.join(msg)) +- +- # all the args without the subcommand +- cmd_args = args[:] +- cmd_args.remove(cmd_name) +- +- return cmd_name, cmd_args +- +- +-def check_isolated(args): +- isolated = False +- +- if "--isolated" in args: +- isolated = True +- +- return isolated +- +- +-def main(args=None): +- if args is None: +- args = sys.argv[1:] +- +- # Configure our deprecation warnings to be sent through loggers +- deprecation.install_warning_logger() +- +- autocomplete() +- +- try: +- cmd_name, cmd_args = parseopts(args) +- except PipError as exc: +- sys.stderr.write("ERROR: %s" % exc) +- sys.stderr.write(os.linesep) +- sys.exit(1) +- +- # Needed for locale.getpreferredencoding(False) to work +- # in pip.utils.encoding.auto_decode +- try: +- locale.setlocale(locale.LC_ALL, '') +- except locale.Error as e: +- # setlocale can apparently crash if locale are uninitialized +- logger.debug("Ignoring error %s when setting locale", e) +- command = commands_dict[cmd_name](isolated=check_isolated(cmd_args)) +- return command.main(cmd_args) +- +- +-# ########################################################### +-# # Writing freeze files +- +-class FrozenRequirement(object): +- +- def __init__(self, name, req, editable, comments=()): +- self.name = name +- self.req = req +- self.editable = editable +- self.comments = comments +- +- _rev_re = re.compile(r'-r(\d+)$') +- _date_re = re.compile(r'-(20\d\d\d\d\d\d)$') +- +- @classmethod +- def from_dist(cls, dist, dependency_links): +- location = os.path.normcase(os.path.abspath(dist.location)) +- comments = [] +- from pip.vcs import vcs, get_src_requirement +- if dist_is_editable(dist) and vcs.get_backend_name(location): +- editable = True +- try: +- req = get_src_requirement(dist, location) +- except InstallationError as exc: +- logger.warning( +- "Error when trying to get requirement for VCS system %s, " +- "falling back to uneditable format", exc +- ) +- req = None +- if req is None: +- logger.warning( +- 'Could not determine repository location of %s', location +- ) +- comments.append( +- '## !! Could not determine repository location' +- ) +- req = dist.as_requirement() +- editable = False +- else: +- editable = False +- req = dist.as_requirement() +- specs = req.specs +- assert len(specs) == 1 and specs[0][0] in ["==", "==="], \ +- 'Expected 1 spec with == or ===; specs = %r; dist = %r' % \ +- (specs, dist) +- version = specs[0][1] +- ver_match = cls._rev_re.search(version) +- date_match = cls._date_re.search(version) +- if ver_match or date_match: +- svn_backend = vcs.get_backend('svn') +- if svn_backend: +- svn_location = svn_backend().get_location( +- dist, +- dependency_links, +- ) +- if not svn_location: +- logger.warning( +- 'Warning: cannot find svn location for %s', req) +- comments.append( +- '## FIXME: could not find svn URL in dependency_links ' +- 'for this package:' +- ) +- else: +- comments.append( +- '# Installing as editable to satisfy requirement %s:' % +- req +- ) +- if ver_match: +- rev = ver_match.group(1) +- else: +- rev = '{%s}' % date_match.group(1) +- editable = True +- req = '%s@%s#egg=%s' % ( +- svn_location, +- rev, +- cls.egg_name(dist) +- ) +- return cls(dist.project_name, req, editable, comments) +- +- @staticmethod +- def egg_name(dist): +- name = dist.egg_name() +- match = re.search(r'-py\d\.\d$', name) +- if match: +- name = name[:match.start()] +- return name +- +- def __str__(self): +- req = self.req +- if self.editable: +- req = '-e %s' % req +- return '\n'.join(list(self.comments) + [str(req)]) + '\n' +- +- +-if __name__ == '__main__': +- sys.exit(main()) +diff --git a/pipenv/patched/piptools/_vendored/pip/__main__.py b/pipenv/patched/piptools/_vendored/pip/__main__.py +deleted file mode 100644 +index 5556539..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/__main__.py ++++ /dev/null +@@ -1,19 +0,0 @@ +-from __future__ import absolute_import +- +-import os +-import sys +- +-# If we are running from a wheel, add the wheel to sys.path +-# This allows the usage python pip-*.whl/pip install pip-*.whl +-if __package__ == '': +- # __file__ is pip-*.whl/pip/__main__.py +- # first dirname call strips of '/__main__.py', second strips off '/pip' +- # Resulting path is the name of the wheel itself +- # Add that to sys.path so we can import pip +- path = os.path.dirname(os.path.dirname(__file__)) +- sys.path.insert(0, path) +- +-import pip # noqa +- +-if __name__ == '__main__': +- sys.exit(pip.main()) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/__init__.py +deleted file mode 100644 +index bee5f5e..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/__init__.py ++++ /dev/null +@@ -1,107 +0,0 @@ +-""" +-pip._vendor is for vendoring dependencies of pip to prevent needing pip to +-depend on something external. +- +-Files inside of pip._vendor should be considered immutable and should only be +-updated to versions from upstream. +-""" +-from __future__ import absolute_import +- +-import glob +-import os.path +-import sys +- +-# Downstream redistributors which have debundled our dependencies should also +-# patch this value to be true. This will trigger the additional patching +-# to cause things like "six" to be available as pip. +-DEBUNDLED = False +- +-# By default, look in this directory for a bunch of .whl files which we will +-# add to the beginning of sys.path before attempting to import anything. This +-# is done to support downstream re-distributors like Debian and Fedora who +-# wish to create their own Wheels for our dependencies to aid in debundling. +-WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) +- +- +-# Define a small helper function to alias our vendored modules to the real ones +-# if the vendored ones do not exist. This idea of this was taken from +-# https://github.com/kennethreitz/requests/pull/2567. +-def vendored(modulename): +- vendored_name = "{0}.{1}".format(__name__, modulename) +- +- try: +- __import__(vendored_name, globals(), locals(), level=0) +- except ImportError: +- try: +- __import__(modulename, globals(), locals(), level=0) +- except ImportError: +- # We can just silently allow import failures to pass here. If we +- # got to this point it means that ``import pip._vendor.whatever`` +- # failed and so did ``import whatever``. Since we're importing this +- # upfront in an attempt to alias imports, not erroring here will +- # just mean we get a regular import error whenever pip *actually* +- # tries to import one of these modules to use it, which actually +- # gives us a better error message than we would have otherwise +- # gotten. +- pass +- else: +- sys.modules[vendored_name] = sys.modules[modulename] +- base, head = vendored_name.rsplit(".", 1) +- setattr(sys.modules[base], head, sys.modules[modulename]) +- +- +-# If we're operating in a debundled setup, then we want to go ahead and trigger +-# the aliasing of our vendored libraries as well as looking for wheels to add +-# to our sys.path. This will cause all of this code to be a no-op typically +-# however downstream redistributors can enable it in a consistent way across +-# all platforms. +-if DEBUNDLED: +- # Actually look inside of WHEEL_DIR to find .whl files and add them to the +- # front of our sys.path. +- sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path +- +- # Actually alias all of our vendored dependencies. +- vendored("cachecontrol") +- vendored("colorama") +- vendored("distlib") +- vendored("distro") +- vendored("html5lib") +- vendored("lockfile") +- vendored("six") +- vendored("six.moves") +- vendored("six.moves.urllib") +- vendored("packaging") +- vendored("packaging.version") +- vendored("packaging.specifiers") +- vendored("pkg_resources") +- vendored("progress") +- vendored("retrying") +- vendored("requests") +- vendored("requests.packages") +- vendored("requests.packages.urllib3") +- vendored("requests.packages.urllib3._collections") +- vendored("requests.packages.urllib3.connection") +- vendored("requests.packages.urllib3.connectionpool") +- vendored("requests.packages.urllib3.contrib") +- vendored("requests.packages.urllib3.contrib.ntlmpool") +- vendored("requests.packages.urllib3.contrib.pyopenssl") +- vendored("requests.packages.urllib3.exceptions") +- vendored("requests.packages.urllib3.fields") +- vendored("requests.packages.urllib3.filepost") +- vendored("requests.packages.urllib3.packages") +- vendored("requests.packages.urllib3.packages.ordered_dict") +- vendored("requests.packages.urllib3.packages.six") +- vendored("requests.packages.urllib3.packages.ssl_match_hostname") +- vendored("requests.packages.urllib3.packages.ssl_match_hostname." +- "_implementation") +- vendored("requests.packages.urllib3.poolmanager") +- vendored("requests.packages.urllib3.request") +- vendored("requests.packages.urllib3.response") +- vendored("requests.packages.urllib3.util") +- vendored("requests.packages.urllib3.util.connection") +- vendored("requests.packages.urllib3.util.request") +- vendored("requests.packages.urllib3.util.response") +- vendored("requests.packages.urllib3.util.retry") +- vendored("requests.packages.urllib3.util.ssl_") +- vendored("requests.packages.urllib3.util.timeout") +- vendored("requests.packages.urllib3.util.url") +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/appdirs.py b/pipenv/patched/piptools/_vendored/pip/_vendor/appdirs.py +deleted file mode 100644 +index 4b5c38b..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/appdirs.py ++++ /dev/null +@@ -1,552 +0,0 @@ +-#!/usr/bin/env python +-# -*- coding: utf-8 -*- +-# Copyright (c) 2005-2010 ActiveState Software Inc. +-# Copyright (c) 2013 Eddy Petrișor +- +-"""Utilities for determining application-specific dirs. +- +-See for details and usage. +-""" +-# Dev Notes: +-# - MSDN on where to store app data files: +-# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +-# - macOS: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +-# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html +- +-__version_info__ = (1, 4, 0) +-__version__ = '.'.join(map(str, __version_info__)) +- +- +-import sys +-import os +- +-PY3 = sys.version_info[0] == 3 +- +-if PY3: +- unicode = str +- +-if sys.platform.startswith('java'): +- import platform +- os_name = platform.java_ver()[3][0] +- if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. +- system = 'win32' +- elif os_name.startswith('Mac'): # "macOS", etc. +- system = 'darwin' +- else: # "Linux", "SunOS", "FreeBSD", etc. +- # Setting this to "linux2" is not ideal, but only Windows or Mac +- # are actually checked for and the rest of the module expects +- # *sys.platform* style strings. +- system = 'linux2' +-else: +- system = sys.platform +- +- +- +-def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): +- r"""Return full path to the user-specific data dir for this application. +- +- "appname" is the name of application. +- If None, just the system directory is returned. +- "appauthor" (only used on Windows) is the name of the +- appauthor or distributing body for this application. Typically +- it is the owning company name. This falls back to appname. You may +- pass False to disable it. +- "version" is an optional version path element to append to the +- path. You might want to use this if you want multiple versions +- of your app to be able to run independently. If used, this +- would typically be ".". +- Only applied when appname is present. +- "roaming" (boolean, default False) can be set True to use the Windows +- roaming appdata directory. That means that for users on a Windows +- network setup for roaming profiles, this user data will be +- sync'd on login. See +- +- for a discussion of issues. +- +- Typical user data directories are: +- macOS: ~/Library/Application Support/ +- Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined +- Win XP (not roaming): C:\Documents and Settings\\Application Data\\ +- Win XP (roaming): C:\Documents and Settings\\Local Settings\Application Data\\ +- Win 7 (not roaming): C:\Users\\AppData\Local\\ +- Win 7 (roaming): C:\Users\\AppData\Roaming\\ +- +- For Unix, we follow the XDG spec and support $XDG_DATA_HOME. +- That means, by default "~/.local/share/". +- """ +- if system == "win32": +- if appauthor is None: +- appauthor = appname +- const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" +- path = os.path.normpath(_get_win_folder(const)) +- if appname: +- if appauthor is not False: +- path = os.path.join(path, appauthor, appname) +- else: +- path = os.path.join(path, appname) +- elif system == 'darwin': +- path = os.path.expanduser('~/Library/Application Support/') +- if appname: +- path = os.path.join(path, appname) +- else: +- path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) +- if appname: +- path = os.path.join(path, appname) +- if appname and version: +- path = os.path.join(path, version) +- return path +- +- +-def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): +- """Return full path to the user-shared data dir for this application. +- +- "appname" is the name of application. +- If None, just the system directory is returned. +- "appauthor" (only used on Windows) is the name of the +- appauthor or distributing body for this application. Typically +- it is the owning company name. This falls back to appname. You may +- pass False to disable it. +- "version" is an optional version path element to append to the +- path. You might want to use this if you want multiple versions +- of your app to be able to run independently. If used, this +- would typically be ".". +- Only applied when appname is present. +- "multipath" is an optional parameter only applicable to *nix +- which indicates that the entire list of data dirs should be +- returned. By default, the first item from XDG_DATA_DIRS is +- returned, or '/usr/local/share/', +- if XDG_DATA_DIRS is not set +- +- Typical user data directories are: +- macOS: /Library/Application Support/ +- Unix: /usr/local/share/ or /usr/share/ +- Win XP: C:\Documents and Settings\All Users\Application Data\\ +- Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) +- Win 7: C:\ProgramData\\ # Hidden, but writeable on Win 7. +- +- For Unix, this is using the $XDG_DATA_DIRS[0] default. +- +- WARNING: Do not use this on Windows. See the Vista-Fail note above for why. +- """ +- if system == "win32": +- if appauthor is None: +- appauthor = appname +- path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) +- if appname: +- if appauthor is not False: +- path = os.path.join(path, appauthor, appname) +- else: +- path = os.path.join(path, appname) +- elif system == 'darwin': +- path = os.path.expanduser('/Library/Application Support') +- if appname: +- path = os.path.join(path, appname) +- else: +- # XDG default for $XDG_DATA_DIRS +- # only first, if multipath is False +- path = os.getenv('XDG_DATA_DIRS', +- os.pathsep.join(['/usr/local/share', '/usr/share'])) +- pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] +- if appname: +- if version: +- appname = os.path.join(appname, version) +- pathlist = [os.sep.join([x, appname]) for x in pathlist] +- +- if multipath: +- path = os.pathsep.join(pathlist) +- else: +- path = pathlist[0] +- return path +- +- if appname and version: +- path = os.path.join(path, version) +- return path +- +- +-def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): +- r"""Return full path to the user-specific config dir for this application. +- +- "appname" is the name of application. +- If None, just the system directory is returned. +- "appauthor" (only used on Windows) is the name of the +- appauthor or distributing body for this application. Typically +- it is the owning company name. This falls back to appname. You may +- pass False to disable it. +- "version" is an optional version path element to append to the +- path. You might want to use this if you want multiple versions +- of your app to be able to run independently. If used, this +- would typically be ".". +- Only applied when appname is present. +- "roaming" (boolean, default False) can be set True to use the Windows +- roaming appdata directory. That means that for users on a Windows +- network setup for roaming profiles, this user data will be +- sync'd on login. See +- +- for a discussion of issues. +- +- Typical user data directories are: +- macOS: same as user_data_dir +- Unix: ~/.config/ # or in $XDG_CONFIG_HOME, if defined +- Win *: same as user_data_dir +- +- For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. +- That means, by deafult "~/.config/". +- """ +- if system in ["win32", "darwin"]: +- path = user_data_dir(appname, appauthor, None, roaming) +- else: +- path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) +- if appname: +- path = os.path.join(path, appname) +- if appname and version: +- path = os.path.join(path, version) +- return path +- +- +-def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): +- """Return full path to the user-shared data dir for this application. +- +- "appname" is the name of application. +- If None, just the system directory is returned. +- "appauthor" (only used on Windows) is the name of the +- appauthor or distributing body for this application. Typically +- it is the owning company name. This falls back to appname. You may +- pass False to disable it. +- "version" is an optional version path element to append to the +- path. You might want to use this if you want multiple versions +- of your app to be able to run independently. If used, this +- would typically be ".". +- Only applied when appname is present. +- "multipath" is an optional parameter only applicable to *nix +- which indicates that the entire list of config dirs should be +- returned. By default, the first item from XDG_CONFIG_DIRS is +- returned, or '/etc/xdg/', if XDG_CONFIG_DIRS is not set +- +- Typical user data directories are: +- macOS: same as site_data_dir +- Unix: /etc/xdg/ or $XDG_CONFIG_DIRS[i]/ for each value in +- $XDG_CONFIG_DIRS +- Win *: same as site_data_dir +- Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) +- +- For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False +- +- WARNING: Do not use this on Windows. See the Vista-Fail note above for why. +- """ +- if system in ["win32", "darwin"]: +- path = site_data_dir(appname, appauthor) +- if appname and version: +- path = os.path.join(path, version) +- else: +- # XDG default for $XDG_CONFIG_DIRS +- # only first, if multipath is False +- path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') +- pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] +- if appname: +- if version: +- appname = os.path.join(appname, version) +- pathlist = [os.sep.join([x, appname]) for x in pathlist] +- +- if multipath: +- path = os.pathsep.join(pathlist) +- else: +- path = pathlist[0] +- return path +- +- +-def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): +- r"""Return full path to the user-specific cache dir for this application. +- +- "appname" is the name of application. +- If None, just the system directory is returned. +- "appauthor" (only used on Windows) is the name of the +- appauthor or distributing body for this application. Typically +- it is the owning company name. This falls back to appname. You may +- pass False to disable it. +- "version" is an optional version path element to append to the +- path. You might want to use this if you want multiple versions +- of your app to be able to run independently. If used, this +- would typically be ".". +- Only applied when appname is present. +- "opinion" (boolean) can be False to disable the appending of +- "Cache" to the base app data dir for Windows. See +- discussion below. +- +- Typical user cache directories are: +- macOS: ~/Library/Caches/ +- Unix: ~/.cache/ (XDG default) +- Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Cache +- Vista: C:\Users\\AppData\Local\\\Cache +- +- On Windows the only suggestion in the MSDN docs is that local settings go in +- the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming +- app data dir (the default returned by `user_data_dir` above). Apps typically +- put cache data somewhere *under* the given dir here. Some examples: +- ...\Mozilla\Firefox\Profiles\\Cache +- ...\Acme\SuperApp\Cache\1.0 +- OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. +- This can be disabled with the `opinion=False` option. +- """ +- if system == "win32": +- if appauthor is None: +- appauthor = appname +- path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) +- if appname: +- if appauthor is not False: +- path = os.path.join(path, appauthor, appname) +- else: +- path = os.path.join(path, appname) +- if opinion: +- path = os.path.join(path, "Cache") +- elif system == 'darwin': +- path = os.path.expanduser('~/Library/Caches') +- if appname: +- path = os.path.join(path, appname) +- else: +- path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) +- if appname: +- path = os.path.join(path, appname) +- if appname and version: +- path = os.path.join(path, version) +- return path +- +- +-def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): +- r"""Return full path to the user-specific log dir for this application. +- +- "appname" is the name of application. +- If None, just the system directory is returned. +- "appauthor" (only used on Windows) is the name of the +- appauthor or distributing body for this application. Typically +- it is the owning company name. This falls back to appname. You may +- pass False to disable it. +- "version" is an optional version path element to append to the +- path. You might want to use this if you want multiple versions +- of your app to be able to run independently. If used, this +- would typically be ".". +- Only applied when appname is present. +- "opinion" (boolean) can be False to disable the appending of +- "Logs" to the base app data dir for Windows, and "log" to the +- base cache dir for Unix. See discussion below. +- +- Typical user cache directories are: +- macOS: ~/Library/Logs/ +- Unix: ~/.cache//log # or under $XDG_CACHE_HOME if defined +- Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Logs +- Vista: C:\Users\\AppData\Local\\\Logs +- +- On Windows the only suggestion in the MSDN docs is that local settings +- go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in +- examples of what some windows apps use for a logs dir.) +- +- OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` +- value for Windows and appends "log" to the user cache dir for Unix. +- This can be disabled with the `opinion=False` option. +- """ +- if system == "darwin": +- path = os.path.join( +- os.path.expanduser('~/Library/Logs'), +- appname) +- elif system == "win32": +- path = user_data_dir(appname, appauthor, version) +- version = False +- if opinion: +- path = os.path.join(path, "Logs") +- else: +- path = user_cache_dir(appname, appauthor, version) +- version = False +- if opinion: +- path = os.path.join(path, "log") +- if appname and version: +- path = os.path.join(path, version) +- return path +- +- +-class AppDirs(object): +- """Convenience wrapper for getting application dirs.""" +- def __init__(self, appname, appauthor=None, version=None, roaming=False, +- multipath=False): +- self.appname = appname +- self.appauthor = appauthor +- self.version = version +- self.roaming = roaming +- self.multipath = multipath +- +- @property +- def user_data_dir(self): +- return user_data_dir(self.appname, self.appauthor, +- version=self.version, roaming=self.roaming) +- +- @property +- def site_data_dir(self): +- return site_data_dir(self.appname, self.appauthor, +- version=self.version, multipath=self.multipath) +- +- @property +- def user_config_dir(self): +- return user_config_dir(self.appname, self.appauthor, +- version=self.version, roaming=self.roaming) +- +- @property +- def site_config_dir(self): +- return site_config_dir(self.appname, self.appauthor, +- version=self.version, multipath=self.multipath) +- +- @property +- def user_cache_dir(self): +- return user_cache_dir(self.appname, self.appauthor, +- version=self.version) +- +- @property +- def user_log_dir(self): +- return user_log_dir(self.appname, self.appauthor, +- version=self.version) +- +- +-#---- internal support stuff +- +-def _get_win_folder_from_registry(csidl_name): +- """This is a fallback technique at best. I'm not sure if using the +- registry for this guarantees us the correct answer for all CSIDL_* +- names. +- """ +- import _winreg +- +- shell_folder_name = { +- "CSIDL_APPDATA": "AppData", +- "CSIDL_COMMON_APPDATA": "Common AppData", +- "CSIDL_LOCAL_APPDATA": "Local AppData", +- }[csidl_name] +- +- key = _winreg.OpenKey( +- _winreg.HKEY_CURRENT_USER, +- r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" +- ) +- dir, type = _winreg.QueryValueEx(key, shell_folder_name) +- return dir +- +- +-def _get_win_folder_with_pywin32(csidl_name): +- from win32com.shell import shellcon, shell +- dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) +- # Try to make this a unicode path because SHGetFolderPath does +- # not return unicode strings when there is unicode data in the +- # path. +- try: +- dir = unicode(dir) +- +- # Downgrade to short path name if have highbit chars. See +- # . +- has_high_char = False +- for c in dir: +- if ord(c) > 255: +- has_high_char = True +- break +- if has_high_char: +- try: +- import win32api +- dir = win32api.GetShortPathName(dir) +- except ImportError: +- pass +- except UnicodeError: +- pass +- return dir +- +- +-def _get_win_folder_with_ctypes(csidl_name): +- import ctypes +- +- csidl_const = { +- "CSIDL_APPDATA": 26, +- "CSIDL_COMMON_APPDATA": 35, +- "CSIDL_LOCAL_APPDATA": 28, +- }[csidl_name] +- +- buf = ctypes.create_unicode_buffer(1024) +- ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) +- +- # Downgrade to short path name if have highbit chars. See +- # . +- has_high_char = False +- for c in buf: +- if ord(c) > 255: +- has_high_char = True +- break +- if has_high_char: +- buf2 = ctypes.create_unicode_buffer(1024) +- if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): +- buf = buf2 +- +- return buf.value +- +-def _get_win_folder_with_jna(csidl_name): +- import array +- from com.sun import jna +- from com.sun.jna.platform import win32 +- +- buf_size = win32.WinDef.MAX_PATH * 2 +- buf = array.zeros('c', buf_size) +- shell = win32.Shell32.INSTANCE +- shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) +- dir = jna.Native.toString(buf.tostring()).rstrip("\0") +- +- # Downgrade to short path name if have highbit chars. See +- # . +- has_high_char = False +- for c in dir: +- if ord(c) > 255: +- has_high_char = True +- break +- if has_high_char: +- buf = array.zeros('c', buf_size) +- kernel = win32.Kernel32.INSTANCE +- if kernal.GetShortPathName(dir, buf, buf_size): +- dir = jna.Native.toString(buf.tostring()).rstrip("\0") +- +- return dir +- +-if system == "win32": +- try: +- import win32com.shell +- _get_win_folder = _get_win_folder_with_pywin32 +- except ImportError: +- try: +- from ctypes import windll +- _get_win_folder = _get_win_folder_with_ctypes +- except ImportError: +- try: +- import com.sun.jna +- _get_win_folder = _get_win_folder_with_jna +- except ImportError: +- _get_win_folder = _get_win_folder_from_registry +- +- +-#---- self test code +- +-if __name__ == "__main__": +- appname = "MyApp" +- appauthor = "MyCompany" +- +- props = ("user_data_dir", "site_data_dir", +- "user_config_dir", "site_config_dir", +- "user_cache_dir", "user_log_dir") +- +- print("-- app dirs (with optional 'version')") +- dirs = AppDirs(appname, appauthor, version="1.0") +- for prop in props: +- print("%s: %s" % (prop, getattr(dirs, prop))) +- +- print("\n-- app dirs (without optional 'version')") +- dirs = AppDirs(appname, appauthor) +- for prop in props: +- print("%s: %s" % (prop, getattr(dirs, prop))) +- +- print("\n-- app dirs (without optional 'appauthor')") +- dirs = AppDirs(appname) +- for prop in props: +- print("%s: %s" % (prop, getattr(dirs, prop))) +- +- print("\n-- app dirs (with disabled 'appauthor')") +- dirs = AppDirs(appname, appauthor=False) +- for prop in props: +- print("%s: %s" % (prop, getattr(dirs, prop))) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/__init__.py +deleted file mode 100644 +index ec9da2e..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/__init__.py ++++ /dev/null +@@ -1,11 +0,0 @@ +-"""CacheControl import Interface. +- +-Make it easy to import from cachecontrol without long namespaces. +-""" +-__author__ = 'Eric Larson' +-__email__ = 'eric@ionrock.org' +-__version__ = '0.11.7' +- +-from .wrapper import CacheControl +-from .adapter import CacheControlAdapter +-from .controller import CacheController +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/_cmd.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/_cmd.py +deleted file mode 100644 +index afdcc88..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/_cmd.py ++++ /dev/null +@@ -1,60 +0,0 @@ +-import logging +- +-from pip._vendor import requests +- +-from pip._vendor.cachecontrol.adapter import CacheControlAdapter +-from pip._vendor.cachecontrol.cache import DictCache +-from pip._vendor.cachecontrol.controller import logger +- +-from argparse import ArgumentParser +- +- +-def setup_logging(): +- logger.setLevel(logging.DEBUG) +- handler = logging.StreamHandler() +- logger.addHandler(handler) +- +- +-def get_session(): +- adapter = CacheControlAdapter( +- DictCache(), +- cache_etags=True, +- serializer=None, +- heuristic=None, +- ) +- sess = requests.Session() +- sess.mount('http://', adapter) +- sess.mount('https://', adapter) +- +- sess.cache_controller = adapter.controller +- return sess +- +- +-def get_args(): +- parser = ArgumentParser() +- parser.add_argument('url', help='The URL to try and cache') +- return parser.parse_args() +- +- +-def main(args=None): +- args = get_args() +- sess = get_session() +- +- # Make a request to get a response +- resp = sess.get(args.url) +- +- # Turn on logging +- setup_logging() +- +- # try setting the cache +- sess.cache_controller.cache_response(resp.request, resp.raw) +- +- # Now try to get it +- if sess.cache_controller.cached_request(resp.request): +- print('Cached!') +- else: +- print('Not cached :(') +- +- +-if __name__ == '__main__': +- main() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/adapter.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/adapter.py +deleted file mode 100644 +index 2348856..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/adapter.py ++++ /dev/null +@@ -1,125 +0,0 @@ +-import types +-import functools +- +-from pip._vendor.requests.adapters import HTTPAdapter +- +-from .controller import CacheController +-from .cache import DictCache +-from .filewrapper import CallbackFileWrapper +- +- +-class CacheControlAdapter(HTTPAdapter): +- invalidating_methods = set(['PUT', 'DELETE']) +- +- def __init__(self, cache=None, +- cache_etags=True, +- controller_class=None, +- serializer=None, +- heuristic=None, +- *args, **kw): +- super(CacheControlAdapter, self).__init__(*args, **kw) +- self.cache = cache or DictCache() +- self.heuristic = heuristic +- +- controller_factory = controller_class or CacheController +- self.controller = controller_factory( +- self.cache, +- cache_etags=cache_etags, +- serializer=serializer, +- ) +- +- def send(self, request, **kw): +- """ +- Send a request. Use the request information to see if it +- exists in the cache and cache the response if we need to and can. +- """ +- if request.method == 'GET': +- cached_response = self.controller.cached_request(request) +- if cached_response: +- return self.build_response(request, cached_response, +- from_cache=True) +- +- # check for etags and add headers if appropriate +- request.headers.update( +- self.controller.conditional_headers(request) +- ) +- +- resp = super(CacheControlAdapter, self).send(request, **kw) +- +- return resp +- +- def build_response(self, request, response, from_cache=False): +- """ +- Build a response by making a request or using the cache. +- +- This will end up calling send and returning a potentially +- cached response +- """ +- if not from_cache and request.method == 'GET': +- # Check for any heuristics that might update headers +- # before trying to cache. +- if self.heuristic: +- response = self.heuristic.apply(response) +- +- # apply any expiration heuristics +- if response.status == 304: +- # We must have sent an ETag request. This could mean +- # that we've been expired already or that we simply +- # have an etag. In either case, we want to try and +- # update the cache if that is the case. +- cached_response = self.controller.update_cached_response( +- request, response +- ) +- +- if cached_response is not response: +- from_cache = True +- +- # We are done with the server response, read a +- # possible response body (compliant servers will +- # not return one, but we cannot be 100% sure) and +- # release the connection back to the pool. +- response.read(decode_content=False) +- response.release_conn() +- +- response = cached_response +- +- # We always cache the 301 responses +- elif response.status == 301: +- self.controller.cache_response(request, response) +- else: +- # Wrap the response file with a wrapper that will cache the +- # response when the stream has been consumed. +- response._fp = CallbackFileWrapper( +- response._fp, +- functools.partial( +- self.controller.cache_response, +- request, +- response, +- ) +- ) +- if response.chunked: +- super_update_chunk_length = response._update_chunk_length +- +- def _update_chunk_length(self): +- super_update_chunk_length() +- if self.chunk_left == 0: +- self._fp._close() +- response._update_chunk_length = types.MethodType(_update_chunk_length, response) +- +- resp = super(CacheControlAdapter, self).build_response( +- request, response +- ) +- +- # See if we should invalidate the cache. +- if request.method in self.invalidating_methods and resp.ok: +- cache_url = self.controller.cache_url(request.url) +- self.cache.delete(cache_url) +- +- # Give the request a from_cache attr to let people use it +- resp.from_cache = from_cache +- +- return resp +- +- def close(self): +- self.cache.close() +- super(CacheControlAdapter, self).close() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/cache.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/cache.py +deleted file mode 100644 +index 7389a73..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/cache.py ++++ /dev/null +@@ -1,39 +0,0 @@ +-""" +-The cache object API for implementing caches. The default is a thread +-safe in-memory dictionary. +-""" +-from threading import Lock +- +- +-class BaseCache(object): +- +- def get(self, key): +- raise NotImplemented() +- +- def set(self, key, value): +- raise NotImplemented() +- +- def delete(self, key): +- raise NotImplemented() +- +- def close(self): +- pass +- +- +-class DictCache(BaseCache): +- +- def __init__(self, init_dict=None): +- self.lock = Lock() +- self.data = init_dict or {} +- +- def get(self, key): +- return self.data.get(key, None) +- +- def set(self, key, value): +- with self.lock: +- self.data.update({key: value}) +- +- def delete(self, key): +- with self.lock: +- if key in self.data: +- self.data.pop(key) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/caches/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/caches/__init__.py +deleted file mode 100644 +index f9e66a1..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/caches/__init__.py ++++ /dev/null +@@ -1,18 +0,0 @@ +-from textwrap import dedent +- +-try: +- from .file_cache import FileCache +-except ImportError: +- notice = dedent(''' +- NOTE: In order to use the FileCache you must have +- lockfile installed. You can install it via pip: +- pip install lockfile +- ''') +- print(notice) +- +- +-try: +- import redis +- from .redis_cache import RedisCache +-except ImportError: +- pass +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/caches/file_cache.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/caches/file_cache.py +deleted file mode 100644 +index b77728f..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/caches/file_cache.py ++++ /dev/null +@@ -1,116 +0,0 @@ +-import hashlib +-import os +- +-from pip._vendor.lockfile import LockFile +-from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile +- +-from ..cache import BaseCache +-from ..controller import CacheController +- +- +-def _secure_open_write(filename, fmode): +- # We only want to write to this file, so open it in write only mode +- flags = os.O_WRONLY +- +- # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only +- # will open *new* files. +- # We specify this because we want to ensure that the mode we pass is the +- # mode of the file. +- flags |= os.O_CREAT | os.O_EXCL +- +- # Do not follow symlinks to prevent someone from making a symlink that +- # we follow and insecurely open a cache file. +- if hasattr(os, "O_NOFOLLOW"): +- flags |= os.O_NOFOLLOW +- +- # On Windows we'll mark this file as binary +- if hasattr(os, "O_BINARY"): +- flags |= os.O_BINARY +- +- # Before we open our file, we want to delete any existing file that is +- # there +- try: +- os.remove(filename) +- except (IOError, OSError): +- # The file must not exist already, so we can just skip ahead to opening +- pass +- +- # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a +- # race condition happens between the os.remove and this line, that an +- # error will be raised. Because we utilize a lockfile this should only +- # happen if someone is attempting to attack us. +- fd = os.open(filename, flags, fmode) +- try: +- return os.fdopen(fd, "wb") +- except: +- # An error occurred wrapping our FD in a file object +- os.close(fd) +- raise +- +- +-class FileCache(BaseCache): +- def __init__(self, directory, forever=False, filemode=0o0600, +- dirmode=0o0700, use_dir_lock=None, lock_class=None): +- +- if use_dir_lock is not None and lock_class is not None: +- raise ValueError("Cannot use use_dir_lock and lock_class together") +- +- if use_dir_lock: +- lock_class = MkdirLockFile +- +- if lock_class is None: +- lock_class = LockFile +- +- self.directory = directory +- self.forever = forever +- self.filemode = filemode +- self.dirmode = dirmode +- self.lock_class = lock_class +- +- +- @staticmethod +- def encode(x): +- return hashlib.sha224(x.encode()).hexdigest() +- +- def _fn(self, name): +- # NOTE: This method should not change as some may depend on it. +- # See: https://github.com/ionrock/cachecontrol/issues/63 +- hashed = self.encode(name) +- parts = list(hashed[:5]) + [hashed] +- return os.path.join(self.directory, *parts) +- +- def get(self, key): +- name = self._fn(key) +- if not os.path.exists(name): +- return None +- +- with open(name, 'rb') as fh: +- return fh.read() +- +- def set(self, key, value): +- name = self._fn(key) +- +- # Make sure the directory exists +- try: +- os.makedirs(os.path.dirname(name), self.dirmode) +- except (IOError, OSError): +- pass +- +- with self.lock_class(name) as lock: +- # Write our actual file +- with _secure_open_write(lock.path, self.filemode) as fh: +- fh.write(value) +- +- def delete(self, key): +- name = self._fn(key) +- if not self.forever: +- os.remove(name) +- +- +-def url_to_file_path(url, filecache): +- """Return the file cache path based on the URL. +- +- This does not ensure the file exists! +- """ +- key = CacheController.cache_url(url) +- return filecache._fn(key) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/caches/redis_cache.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/caches/redis_cache.py +deleted file mode 100644 +index 9f5d55f..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/caches/redis_cache.py ++++ /dev/null +@@ -1,41 +0,0 @@ +-from __future__ import division +- +-from datetime import datetime +- +- +-def total_seconds(td): +- """Python 2.6 compatability""" +- if hasattr(td, 'total_seconds'): +- return td.total_seconds() +- +- ms = td.microseconds +- secs = (td.seconds + td.days * 24 * 3600) +- return (ms + secs * 10**6) / 10**6 +- +- +-class RedisCache(object): +- +- def __init__(self, conn): +- self.conn = conn +- +- def get(self, key): +- return self.conn.get(key) +- +- def set(self, key, value, expires=None): +- if not expires: +- self.conn.set(key, value) +- else: +- expires = expires - datetime.now() +- self.conn.setex(key, total_seconds(expires), value) +- +- def delete(self, key): +- self.conn.delete(key) +- +- def clear(self): +- """Helper for clearing all the keys in a database. Use with +- caution!""" +- for key in self.conn.keys(): +- self.conn.delete(key) +- +- def close(self): +- self.conn.disconnect() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/compat.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/compat.py +deleted file mode 100644 +index b59f112..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/compat.py ++++ /dev/null +@@ -1,20 +0,0 @@ +-try: +- from urllib.parse import urljoin +-except ImportError: +- from urlparse import urljoin +- +- +-try: +- import cPickle as pickle +-except ImportError: +- import pickle +- +- +-from pip._vendor.urllib3.response import HTTPResponse +-from pip._vendor.urllib3.util import is_fp_closed +- +-# Replicate some six behaviour +-try: +- text_type = (unicode,) +-except NameError: +- text_type = (str,) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/controller.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/controller.py +deleted file mode 100644 +index 5eb961f..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/controller.py ++++ /dev/null +@@ -1,353 +0,0 @@ +-""" +-The httplib2 algorithms ported for use with requests. +-""" +-import logging +-import re +-import calendar +-import time +-from email.utils import parsedate_tz +- +-from pip._vendor.requests.structures import CaseInsensitiveDict +- +-from .cache import DictCache +-from .serialize import Serializer +- +- +-logger = logging.getLogger(__name__) +- +-URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") +- +- +-def parse_uri(uri): +- """Parses a URI using the regex given in Appendix B of RFC 3986. +- +- (scheme, authority, path, query, fragment) = parse_uri(uri) +- """ +- groups = URI.match(uri).groups() +- return (groups[1], groups[3], groups[4], groups[6], groups[8]) +- +- +-class CacheController(object): +- """An interface to see if request should cached or not. +- """ +- def __init__(self, cache=None, cache_etags=True, serializer=None): +- self.cache = cache or DictCache() +- self.cache_etags = cache_etags +- self.serializer = serializer or Serializer() +- +- @classmethod +- def _urlnorm(cls, uri): +- """Normalize the URL to create a safe key for the cache""" +- (scheme, authority, path, query, fragment) = parse_uri(uri) +- if not scheme or not authority: +- raise Exception("Only absolute URIs are allowed. uri = %s" % uri) +- +- scheme = scheme.lower() +- authority = authority.lower() +- +- if not path: +- path = "/" +- +- # Could do syntax based normalization of the URI before +- # computing the digest. See Section 6.2.2 of Std 66. +- request_uri = query and "?".join([path, query]) or path +- defrag_uri = scheme + "://" + authority + request_uri +- +- return defrag_uri +- +- @classmethod +- def cache_url(cls, uri): +- return cls._urlnorm(uri) +- +- def parse_cache_control(self, headers): +- """ +- Parse the cache control headers returning a dictionary with values +- for the different directives. +- """ +- retval = {} +- +- cc_header = 'cache-control' +- if 'Cache-Control' in headers: +- cc_header = 'Cache-Control' +- +- if cc_header in headers: +- parts = headers[cc_header].split(',') +- parts_with_args = [ +- tuple([x.strip().lower() for x in part.split("=", 1)]) +- for part in parts if -1 != part.find("=") +- ] +- parts_wo_args = [ +- (name.strip().lower(), 1) +- for name in parts if -1 == name.find("=") +- ] +- retval = dict(parts_with_args + parts_wo_args) +- return retval +- +- def cached_request(self, request): +- """ +- Return a cached response if it exists in the cache, otherwise +- return False. +- """ +- cache_url = self.cache_url(request.url) +- logger.debug('Looking up "%s" in the cache', cache_url) +- cc = self.parse_cache_control(request.headers) +- +- # Bail out if the request insists on fresh data +- if 'no-cache' in cc: +- logger.debug('Request header has "no-cache", cache bypassed') +- return False +- +- if 'max-age' in cc and cc['max-age'] == 0: +- logger.debug('Request header has "max_age" as 0, cache bypassed') +- return False +- +- # Request allows serving from the cache, let's see if we find something +- cache_data = self.cache.get(cache_url) +- if cache_data is None: +- logger.debug('No cache entry available') +- return False +- +- # Check whether it can be deserialized +- resp = self.serializer.loads(request, cache_data) +- if not resp: +- logger.warning('Cache entry deserialization failed, entry ignored') +- return False +- +- # If we have a cached 301, return it immediately. We don't +- # need to test our response for other headers b/c it is +- # intrinsically "cacheable" as it is Permanent. +- # See: +- # https://tools.ietf.org/html/rfc7231#section-6.4.2 +- # +- # Client can try to refresh the value by repeating the request +- # with cache busting headers as usual (ie no-cache). +- if resp.status == 301: +- msg = ('Returning cached "301 Moved Permanently" response ' +- '(ignoring date and etag information)') +- logger.debug(msg) +- return resp +- +- headers = CaseInsensitiveDict(resp.headers) +- if not headers or 'date' not in headers: +- if 'etag' not in headers: +- # Without date or etag, the cached response can never be used +- # and should be deleted. +- logger.debug('Purging cached response: no date or etag') +- self.cache.delete(cache_url) +- logger.debug('Ignoring cached response: no date') +- return False +- +- now = time.time() +- date = calendar.timegm( +- parsedate_tz(headers['date']) +- ) +- current_age = max(0, now - date) +- logger.debug('Current age based on date: %i', current_age) +- +- # TODO: There is an assumption that the result will be a +- # urllib3 response object. This may not be best since we +- # could probably avoid instantiating or constructing the +- # response until we know we need it. +- resp_cc = self.parse_cache_control(headers) +- +- # determine freshness +- freshness_lifetime = 0 +- +- # Check the max-age pragma in the cache control header +- if 'max-age' in resp_cc and resp_cc['max-age'].isdigit(): +- freshness_lifetime = int(resp_cc['max-age']) +- logger.debug('Freshness lifetime from max-age: %i', +- freshness_lifetime) +- +- # If there isn't a max-age, check for an expires header +- elif 'expires' in headers: +- expires = parsedate_tz(headers['expires']) +- if expires is not None: +- expire_time = calendar.timegm(expires) - date +- freshness_lifetime = max(0, expire_time) +- logger.debug("Freshness lifetime from expires: %i", +- freshness_lifetime) +- +- # Determine if we are setting freshness limit in the +- # request. Note, this overrides what was in the response. +- if 'max-age' in cc: +- try: +- freshness_lifetime = int(cc['max-age']) +- logger.debug('Freshness lifetime from request max-age: %i', +- freshness_lifetime) +- except ValueError: +- freshness_lifetime = 0 +- +- if 'min-fresh' in cc: +- try: +- min_fresh = int(cc['min-fresh']) +- except ValueError: +- min_fresh = 0 +- # adjust our current age by our min fresh +- current_age += min_fresh +- logger.debug('Adjusted current age from min-fresh: %i', +- current_age) +- +- # Return entry if it is fresh enough +- if freshness_lifetime > current_age: +- logger.debug('The response is "fresh", returning cached response') +- logger.debug('%i > %i', freshness_lifetime, current_age) +- return resp +- +- # we're not fresh. If we don't have an Etag, clear it out +- if 'etag' not in headers: +- logger.debug( +- 'The cached response is "stale" with no etag, purging' +- ) +- self.cache.delete(cache_url) +- +- # return the original handler +- return False +- +- def conditional_headers(self, request): +- cache_url = self.cache_url(request.url) +- resp = self.serializer.loads(request, self.cache.get(cache_url)) +- new_headers = {} +- +- if resp: +- headers = CaseInsensitiveDict(resp.headers) +- +- if 'etag' in headers: +- new_headers['If-None-Match'] = headers['ETag'] +- +- if 'last-modified' in headers: +- new_headers['If-Modified-Since'] = headers['Last-Modified'] +- +- return new_headers +- +- def cache_response(self, request, response, body=None): +- """ +- Algorithm for caching requests. +- +- This assumes a requests Response object. +- """ +- # From httplib2: Don't cache 206's since we aren't going to +- # handle byte range requests +- cacheable_status_codes = [200, 203, 300, 301] +- if response.status not in cacheable_status_codes: +- logger.debug( +- 'Status code %s not in %s', +- response.status, +- cacheable_status_codes +- ) +- return +- +- response_headers = CaseInsensitiveDict(response.headers) +- +- # If we've been given a body, our response has a Content-Length, that +- # Content-Length is valid then we can check to see if the body we've +- # been given matches the expected size, and if it doesn't we'll just +- # skip trying to cache it. +- if (body is not None and +- "content-length" in response_headers and +- response_headers["content-length"].isdigit() and +- int(response_headers["content-length"]) != len(body)): +- return +- +- cc_req = self.parse_cache_control(request.headers) +- cc = self.parse_cache_control(response_headers) +- +- cache_url = self.cache_url(request.url) +- logger.debug('Updating cache with response from "%s"', cache_url) +- +- # Delete it from the cache if we happen to have it stored there +- no_store = False +- if cc.get('no-store'): +- no_store = True +- logger.debug('Response header has "no-store"') +- if cc_req.get('no-store'): +- no_store = True +- logger.debug('Request header has "no-store"') +- if no_store and self.cache.get(cache_url): +- logger.debug('Purging existing cache entry to honor "no-store"') +- self.cache.delete(cache_url) +- +- # If we've been given an etag, then keep the response +- if self.cache_etags and 'etag' in response_headers: +- logger.debug('Caching due to etag') +- self.cache.set( +- cache_url, +- self.serializer.dumps(request, response, body=body), +- ) +- +- # Add to the cache any 301s. We do this before looking that +- # the Date headers. +- elif response.status == 301: +- logger.debug('Caching permanant redirect') +- self.cache.set( +- cache_url, +- self.serializer.dumps(request, response) +- ) +- +- # Add to the cache if the response headers demand it. If there +- # is no date header then we can't do anything about expiring +- # the cache. +- elif 'date' in response_headers: +- # cache when there is a max-age > 0 +- if cc and cc.get('max-age'): +- if cc['max-age'].isdigit() and int(cc['max-age']) > 0: +- logger.debug('Caching b/c date exists and max-age > 0') +- self.cache.set( +- cache_url, +- self.serializer.dumps(request, response, body=body), +- ) +- +- # If the request can expire, it means we should cache it +- # in the meantime. +- elif 'expires' in response_headers: +- if response_headers['expires']: +- logger.debug('Caching b/c of expires header') +- self.cache.set( +- cache_url, +- self.serializer.dumps(request, response, body=body), +- ) +- +- def update_cached_response(self, request, response): +- """On a 304 we will get a new set of headers that we want to +- update our cached value with, assuming we have one. +- +- This should only ever be called when we've sent an ETag and +- gotten a 304 as the response. +- """ +- cache_url = self.cache_url(request.url) +- +- cached_response = self.serializer.loads( +- request, +- self.cache.get(cache_url) +- ) +- +- if not cached_response: +- # we didn't have a cached response +- return response +- +- # Lets update our headers with the headers from the new request: +- # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 +- # +- # The server isn't supposed to send headers that would make +- # the cached body invalid. But... just in case, we'll be sure +- # to strip out ones we know that might be problmatic due to +- # typical assumptions. +- excluded_headers = [ +- "content-length", +- ] +- +- cached_response.headers.update( +- dict((k, v) for k, v in response.headers.items() +- if k.lower() not in excluded_headers) +- ) +- +- # we want a 200 b/c we have content via the cache +- cached_response.status = 200 +- +- # update our cache +- self.cache.set( +- cache_url, +- self.serializer.dumps(request, cached_response), +- ) +- +- return cached_response +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/filewrapper.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/filewrapper.py +deleted file mode 100644 +index f1e1ce0..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/filewrapper.py ++++ /dev/null +@@ -1,78 +0,0 @@ +-from io import BytesIO +- +- +-class CallbackFileWrapper(object): +- """ +- Small wrapper around a fp object which will tee everything read into a +- buffer, and when that file is closed it will execute a callback with the +- contents of that buffer. +- +- All attributes are proxied to the underlying file object. +- +- This class uses members with a double underscore (__) leading prefix so as +- not to accidentally shadow an attribute. +- """ +- +- def __init__(self, fp, callback): +- self.__buf = BytesIO() +- self.__fp = fp +- self.__callback = callback +- +- def __getattr__(self, name): +- # The vaguaries of garbage collection means that self.__fp is +- # not always set. By using __getattribute__ and the private +- # name[0] allows looking up the attribute value and raising an +- # AttributeError when it doesn't exist. This stop thigns from +- # infinitely recursing calls to getattr in the case where +- # self.__fp hasn't been set. +- # +- # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers +- fp = self.__getattribute__('_CallbackFileWrapper__fp') +- return getattr(fp, name) +- +- def __is_fp_closed(self): +- try: +- return self.__fp.fp is None +- except AttributeError: +- pass +- +- try: +- return self.__fp.closed +- except AttributeError: +- pass +- +- # We just don't cache it then. +- # TODO: Add some logging here... +- return False +- +- def _close(self): +- if self.__callback: +- self.__callback(self.__buf.getvalue()) +- +- # We assign this to None here, because otherwise we can get into +- # really tricky problems where the CPython interpreter dead locks +- # because the callback is holding a reference to something which +- # has a __del__ method. Setting this to None breaks the cycle +- # and allows the garbage collector to do it's thing normally. +- self.__callback = None +- +- def read(self, amt=None): +- data = self.__fp.read(amt) +- self.__buf.write(data) +- if self.__is_fp_closed(): +- self._close() +- +- return data +- +- def _safe_read(self, amt): +- data = self.__fp._safe_read(amt) +- if amt == 2 and data == b'\r\n': +- # urllib executes this read to toss the CRLF at the end +- # of the chunk. +- return data +- +- self.__buf.write(data) +- if self.__is_fp_closed(): +- self._close() +- +- return data +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/heuristics.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/heuristics.py +deleted file mode 100644 +index 94715a4..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/heuristics.py ++++ /dev/null +@@ -1,138 +0,0 @@ +-import calendar +-import time +- +-from email.utils import formatdate, parsedate, parsedate_tz +- +-from datetime import datetime, timedelta +- +-TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" +- +- +-def expire_after(delta, date=None): +- date = date or datetime.now() +- return date + delta +- +- +-def datetime_to_header(dt): +- return formatdate(calendar.timegm(dt.timetuple())) +- +- +-class BaseHeuristic(object): +- +- def warning(self, response): +- """ +- Return a valid 1xx warning header value describing the cache +- adjustments. +- +- The response is provided too allow warnings like 113 +- http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need +- to explicitly say response is over 24 hours old. +- """ +- return '110 - "Response is Stale"' +- +- def update_headers(self, response): +- """Update the response headers with any new headers. +- +- NOTE: This SHOULD always include some Warning header to +- signify that the response was cached by the client, not +- by way of the provided headers. +- """ +- return {} +- +- def apply(self, response): +- updated_headers = self.update_headers(response) +- +- if updated_headers: +- response.headers.update(updated_headers) +- warning_header_value = self.warning(response) +- if warning_header_value is not None: +- response.headers.update({'Warning': warning_header_value}) +- +- return response +- +- +-class OneDayCache(BaseHeuristic): +- """ +- Cache the response by providing an expires 1 day in the +- future. +- """ +- def update_headers(self, response): +- headers = {} +- +- if 'expires' not in response.headers: +- date = parsedate(response.headers['date']) +- expires = expire_after(timedelta(days=1), +- date=datetime(*date[:6])) +- headers['expires'] = datetime_to_header(expires) +- headers['cache-control'] = 'public' +- return headers +- +- +-class ExpiresAfter(BaseHeuristic): +- """ +- Cache **all** requests for a defined time period. +- """ +- +- def __init__(self, **kw): +- self.delta = timedelta(**kw) +- +- def update_headers(self, response): +- expires = expire_after(self.delta) +- return { +- 'expires': datetime_to_header(expires), +- 'cache-control': 'public', +- } +- +- def warning(self, response): +- tmpl = '110 - Automatically cached for %s. Response might be stale' +- return tmpl % self.delta +- +- +-class LastModified(BaseHeuristic): +- """ +- If there is no Expires header already, fall back on Last-Modified +- using the heuristic from +- http://tools.ietf.org/html/rfc7234#section-4.2.2 +- to calculate a reasonable value. +- +- Firefox also does something like this per +- https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ +- http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 +- Unlike mozilla we limit this to 24-hr. +- """ +- cacheable_by_default_statuses = set([ +- 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 +- ]) +- +- def update_headers(self, resp): +- headers = resp.headers +- +- if 'expires' in headers: +- return {} +- +- if 'cache-control' in headers and headers['cache-control'] != 'public': +- return {} +- +- if resp.status not in self.cacheable_by_default_statuses: +- return {} +- +- if 'date' not in headers or 'last-modified' not in headers: +- return {} +- +- date = calendar.timegm(parsedate_tz(headers['date'])) +- last_modified = parsedate(headers['last-modified']) +- if date is None or last_modified is None: +- return {} +- +- now = time.time() +- current_age = max(0, now - date) +- delta = date - calendar.timegm(last_modified) +- freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) +- if freshness_lifetime <= current_age: +- return {} +- +- expires = date + freshness_lifetime +- return {'expires': time.strftime(TIME_FMT, time.gmtime(expires))} +- +- def warning(self, resp): +- return None +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/serialize.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/serialize.py +deleted file mode 100644 +index 8f9c589..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/serialize.py ++++ /dev/null +@@ -1,196 +0,0 @@ +-import base64 +-import io +-import json +-import zlib +- +-from pip._vendor.requests.structures import CaseInsensitiveDict +- +-from .compat import HTTPResponse, pickle, text_type +- +- +-def _b64_encode_bytes(b): +- return base64.b64encode(b).decode("ascii") +- +- +-def _b64_encode_str(s): +- return _b64_encode_bytes(s.encode("utf8")) +- +- +-def _b64_encode(s): +- if isinstance(s, text_type): +- return _b64_encode_str(s) +- return _b64_encode_bytes(s) +- +- +-def _b64_decode_bytes(b): +- return base64.b64decode(b.encode("ascii")) +- +- +-def _b64_decode_str(s): +- return _b64_decode_bytes(s).decode("utf8") +- +- +-class Serializer(object): +- +- def dumps(self, request, response, body=None): +- response_headers = CaseInsensitiveDict(response.headers) +- +- if body is None: +- body = response.read(decode_content=False) +- +- # NOTE: 99% sure this is dead code. I'm only leaving it +- # here b/c I don't have a test yet to prove +- # it. Basically, before using +- # `cachecontrol.filewrapper.CallbackFileWrapper`, +- # this made an effort to reset the file handle. The +- # `CallbackFileWrapper` short circuits this code by +- # setting the body as the content is consumed, the +- # result being a `body` argument is *always* passed +- # into cache_response, and in turn, +- # `Serializer.dump`. +- response._fp = io.BytesIO(body) +- +- data = { +- "response": { +- "body": _b64_encode_bytes(body), +- "headers": dict( +- (_b64_encode(k), _b64_encode(v)) +- for k, v in response.headers.items() +- ), +- "status": response.status, +- "version": response.version, +- "reason": _b64_encode_str(response.reason), +- "strict": response.strict, +- "decode_content": response.decode_content, +- }, +- } +- +- # Construct our vary headers +- data["vary"] = {} +- if "vary" in response_headers: +- varied_headers = response_headers['vary'].split(',') +- for header in varied_headers: +- header = header.strip() +- data["vary"][header] = request.headers.get(header, None) +- +- # Encode our Vary headers to ensure they can be serialized as JSON +- data["vary"] = dict( +- (_b64_encode(k), _b64_encode(v) if v is not None else v) +- for k, v in data["vary"].items() +- ) +- +- return b",".join([ +- b"cc=2", +- zlib.compress( +- json.dumps( +- data, separators=(",", ":"), sort_keys=True, +- ).encode("utf8"), +- ), +- ]) +- +- def loads(self, request, data): +- # Short circuit if we've been given an empty set of data +- if not data: +- return +- +- # Determine what version of the serializer the data was serialized +- # with +- try: +- ver, data = data.split(b",", 1) +- except ValueError: +- ver = b"cc=0" +- +- # Make sure that our "ver" is actually a version and isn't a false +- # positive from a , being in the data stream. +- if ver[:3] != b"cc=": +- data = ver + data +- ver = b"cc=0" +- +- # Get the version number out of the cc=N +- ver = ver.split(b"=", 1)[-1].decode("ascii") +- +- # Dispatch to the actual load method for the given version +- try: +- return getattr(self, "_loads_v{0}".format(ver))(request, data) +- except AttributeError: +- # This is a version we don't have a loads function for, so we'll +- # just treat it as a miss and return None +- return +- +- def prepare_response(self, request, cached): +- """Verify our vary headers match and construct a real urllib3 +- HTTPResponse object. +- """ +- # Special case the '*' Vary value as it means we cannot actually +- # determine if the cached response is suitable for this request. +- if "*" in cached.get("vary", {}): +- return +- +- # Ensure that the Vary headers for the cached response match our +- # request +- for header, value in cached.get("vary", {}).items(): +- if request.headers.get(header, None) != value: +- return +- +- body_raw = cached["response"].pop("body") +- +- headers = CaseInsensitiveDict(data=cached['response']['headers']) +- if headers.get('transfer-encoding', '') == 'chunked': +- headers.pop('transfer-encoding') +- +- cached['response']['headers'] = headers +- +- try: +- body = io.BytesIO(body_raw) +- except TypeError: +- # This can happen if cachecontrol serialized to v1 format (pickle) +- # using Python 2. A Python 2 str(byte string) will be unpickled as +- # a Python 3 str (unicode string), which will cause the above to +- # fail with: +- # +- # TypeError: 'str' does not support the buffer interface +- body = io.BytesIO(body_raw.encode('utf8')) +- +- return HTTPResponse( +- body=body, +- preload_content=False, +- **cached["response"] +- ) +- +- def _loads_v0(self, request, data): +- # The original legacy cache data. This doesn't contain enough +- # information to construct everything we need, so we'll treat this as +- # a miss. +- return +- +- def _loads_v1(self, request, data): +- try: +- cached = pickle.loads(data) +- except ValueError: +- return +- +- return self.prepare_response(request, cached) +- +- def _loads_v2(self, request, data): +- try: +- cached = json.loads(zlib.decompress(data).decode("utf8")) +- except ValueError: +- return +- +- # We need to decode the items that we've base64 encoded +- cached["response"]["body"] = _b64_decode_bytes( +- cached["response"]["body"] +- ) +- cached["response"]["headers"] = dict( +- (_b64_decode_str(k), _b64_decode_str(v)) +- for k, v in cached["response"]["headers"].items() +- ) +- cached["response"]["reason"] = _b64_decode_str( +- cached["response"]["reason"], +- ) +- cached["vary"] = dict( +- (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) +- for k, v in cached["vary"].items() +- ) +- +- return self.prepare_response(request, cached) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/wrapper.py b/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/wrapper.py +deleted file mode 100644 +index ea421aa..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/cachecontrol/wrapper.py ++++ /dev/null +@@ -1,21 +0,0 @@ +-from .adapter import CacheControlAdapter +-from .cache import DictCache +- +- +-def CacheControl(sess, +- cache=None, +- cache_etags=True, +- serializer=None, +- heuristic=None): +- +- cache = cache or DictCache() +- adapter = CacheControlAdapter( +- cache, +- cache_etags=cache_etags, +- serializer=serializer, +- heuristic=heuristic, +- ) +- sess.mount('http://', adapter) +- sess.mount('https://', adapter) +- +- return sess +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/__init__.py +deleted file mode 100644 +index 556193c..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/__init__.py ++++ /dev/null +@@ -1,3 +0,0 @@ +-from .core import where, old_where +- +-__version__ = "2018.01.18" +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/__main__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/__main__.py +deleted file mode 100644 +index 5f1da0d..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/__main__.py ++++ /dev/null +@@ -1,2 +0,0 @@ +-from certifi import where +-print(where()) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/cacert.pem b/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/cacert.pem +deleted file mode 100644 +index 101ac98..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/cacert.pem ++++ /dev/null +@@ -1,4433 +0,0 @@ +- +-# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +-# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +-# Label: "GlobalSign Root CA" +-# Serial: 4835703278459707669005204 +-# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +-# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +-# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +------BEGIN CERTIFICATE----- +-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +-MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +-YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +-aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +-jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +-xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +-1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +-snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +-U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +-9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +-BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +-AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +-yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +-38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +-AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +-DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +-HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +------END CERTIFICATE----- +- +-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +-# Label: "GlobalSign Root CA - R2" +-# Serial: 4835703278459682885658125 +-# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +-# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +-# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +------BEGIN CERTIFICATE----- +-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +-MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +-hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +-v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +-eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +-tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +-C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +-zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +-mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +-V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +-bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +-3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +-J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +-291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +-ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +-AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +------END CERTIFICATE----- +- +-# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +-# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +-# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +-# Serial: 206684696279472310254277870180966723415 +-# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +-# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +-# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +------BEGIN CERTIFICATE----- +-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +-cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +-LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +-aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +-dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +-VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +-aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +-IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +-N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +-KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +-kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +-CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +-Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +-imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +-2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +-DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +-F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +-TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +------END CERTIFICATE----- +- +-# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +-# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +-# Label: "Entrust.net Premium 2048 Secure Server CA" +-# Serial: 946069240 +-# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +-# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +-# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +------BEGIN CERTIFICATE----- +-MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +-RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +-IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +-ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +-MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +-LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +-YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +-A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +-K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +-sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +-MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +-XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +-HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +-4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +-HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +-j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +-U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +-zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +-u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +-bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +-fF6adulZkMV8gzURZVE= +------END CERTIFICATE----- +- +-# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +-# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +-# Label: "Baltimore CyberTrust Root" +-# Serial: 33554617 +-# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +-# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +-# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +------BEGIN CERTIFICATE----- +-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +-RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +-VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +-DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +-ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +-VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +-mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +-IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +-mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +-XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +-dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +-jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +-BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +-DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +-9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +-jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +-Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +-ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +-R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +------END CERTIFICATE----- +- +-# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +-# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +-# Label: "AddTrust External Root" +-# Serial: 1 +-# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +-# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +-# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +------BEGIN CERTIFICATE----- +-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +-MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +-IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +-MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +-FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +-bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +-dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +-H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +-uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +-mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +-a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +-E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +-WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +-VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +-Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +-cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +-IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +-AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +-YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +-Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +-c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +-mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +------END CERTIFICATE----- +- +-# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +-# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +-# Label: "Entrust Root Certification Authority" +-# Serial: 1164660820 +-# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +-# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +-# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +------BEGIN CERTIFICATE----- +-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +-Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +-KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +-cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +-NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +-NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +-ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +-BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +-KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +-Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +-4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +-KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +-rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +-94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +-sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +-gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +-kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +-vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +-O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +-AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +-9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +-eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +-0vdXcDazv/wor3ElhVsT/h5/WrQ8 +------END CERTIFICATE----- +- +-# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +-# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +-# Label: "GeoTrust Global CA" +-# Serial: 144470 +-# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +-# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +-# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +------BEGIN CERTIFICATE----- +-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +-MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +-YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +-R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +-9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +-fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +-iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +-1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +-bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +-MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +-ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +-uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +-Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +-tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +-PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +-hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +-5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +------END CERTIFICATE----- +- +-# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +-# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +-# Label: "GeoTrust Universal CA" +-# Serial: 1 +-# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +-# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +-# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +------BEGIN CERTIFICATE----- +-MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +-MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +-c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +-BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +-IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +-VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +-cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +-QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +-F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +-c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +-mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +-VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +-teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +-f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +-Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +-nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +-/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +-MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +-9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +-aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +-IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +-ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +-uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +-Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +-QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +-koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +-ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +-DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +-bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +------END CERTIFICATE----- +- +-# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +-# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +-# Label: "GeoTrust Universal CA 2" +-# Serial: 1 +-# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +-# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +-# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +------BEGIN CERTIFICATE----- +-MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +-MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +-c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +-VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +-c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +-AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +-WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +-FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +-XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +-se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +-KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +-IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +-y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +-hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +-QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +-Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +-HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +-KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +-dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +-L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +-Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +-ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +-T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +-GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +-1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +-OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +-6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +-QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +------END CERTIFICATE----- +- +-# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +-# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +-# Label: "Visa eCommerce Root" +-# Serial: 25952180776285836048024890241505565794 +-# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +-# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +-# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +------BEGIN CERTIFICATE----- +-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +-MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +-cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +-bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +-CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +-dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +-cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +-2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +-lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +-ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +-299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +-vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +-dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +-AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +-AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +-zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +-LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +-7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +-++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +-398znM/jra6O1I7mT1GvFpLgXPYHDw== +------END CERTIFICATE----- +- +-# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +-# Subject: CN=AAA Certificate Services O=Comodo CA Limited +-# Label: "Comodo AAA Services root" +-# Serial: 1 +-# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +-# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +-# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +------BEGIN CERTIFICATE----- +-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +-MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +-GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +-YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +-MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +-BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +-GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +-ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +-BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +-3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +-YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +-rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +-ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +-oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +-MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +-QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +-b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +-AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +-GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +-G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +-l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +-smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +------END CERTIFICATE----- +- +-# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +-# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +-# Label: "QuoVadis Root CA" +-# Serial: 985026699 +-# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +-# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +-# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +------BEGIN CERTIFICATE----- +-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +-aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +-aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +-MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +-IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +-dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +-li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +-rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +-WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +-F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +-xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +-Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +-dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +-ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +-IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +-c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +-ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +-KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +-KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +-y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +-dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +-VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +-MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +-fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +-7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +-cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +-mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +-xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +-SnQ2+Q== +------END CERTIFICATE----- +- +-# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +-# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +-# Label: "QuoVadis Root CA 2" +-# Serial: 1289 +-# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +-# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +-# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +------BEGIN CERTIFICATE----- +-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +-b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +-YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +-GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +-Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +-WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +-rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp +-+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +-ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +-Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +-PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +-/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +-oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +-yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +-EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +-A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +-MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +-BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +-g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +-fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +-WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +-B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +-hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +-TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +-mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +-ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +-4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +-8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +------END CERTIFICATE----- +- +-# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +-# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +-# Label: "QuoVadis Root CA 3" +-# Serial: 1478 +-# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +-# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +-# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +------BEGIN CERTIFICATE----- +-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +-b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +-YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +-V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +-4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +-H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +-8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +-vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +-mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +-btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +-T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +-WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +-c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +-4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +-VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +-CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +-aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +-dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +-czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +-A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +-Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +-7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +-d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd +-+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +-4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +-t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +-DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +-k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +-zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +-Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +-mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +-4SVhM7JZG+Ju1zdXtg2pEto= +------END CERTIFICATE----- +- +-# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +-# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +-# Label: "Security Communication Root CA" +-# Serial: 0 +-# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +-# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +-# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +------BEGIN CERTIFICATE----- +-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +-MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +-dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +-WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +-VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +-DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +-9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +-DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +-Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +-QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +-xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +-A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +-AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +-kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +-Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +-Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +-JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +-RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +------END CERTIFICATE----- +- +-# Issuer: CN=Sonera Class2 CA O=Sonera +-# Subject: CN=Sonera Class2 CA O=Sonera +-# Label: "Sonera Class 2 Root CA" +-# Serial: 29 +-# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +-# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +-# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +------BEGIN CERTIFICATE----- +-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +-MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +-MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +-BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +-hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +-Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +-5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +-3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +-vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +-8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +-DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +-MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +-zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +-3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +-FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +-Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +-ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +------END CERTIFICATE----- +- +-# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +-# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +-# Label: "XRamp Global CA Root" +-# Serial: 107108908803651509692980124233745014957 +-# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +-# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +-# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +------BEGIN CERTIFICATE----- +-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +-gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +-MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +-UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +-NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +-dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +-dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +-dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +-38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +-KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +-DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +-qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +-JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +-PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +-BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +-jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +-eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +-ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +-vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +-IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +-i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +-O+7ETPTsJ3xCwnR8gooJybQDJbw= +------END CERTIFICATE----- +- +-# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +-# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +-# Label: "Go Daddy Class 2 CA" +-# Serial: 0 +-# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +-# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +-# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +------BEGIN CERTIFICATE----- +-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +-MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +-YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +-MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +-ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +-MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +-ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +-PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +-wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +-EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +-avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +-YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +-sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +-/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +-IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +-YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +-ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +-OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +-TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +-dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +-ReYNnyicsbkqWletNw+vHX/bvZ8= +------END CERTIFICATE----- +- +-# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +-# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +-# Label: "Starfield Class 2 CA" +-# Serial: 0 +-# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +-# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +-# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +------BEGIN CERTIFICATE----- +-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +-MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +-U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +-NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +-ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +-ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +-DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +-8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN +-+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +-X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +-K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +-1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +-A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +-zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +-YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +-bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +-DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +-L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +-eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +-VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +-WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +------END CERTIFICATE----- +- +-# Issuer: O=Government Root Certification Authority +-# Subject: O=Government Root Certification Authority +-# Label: "Taiwan GRCA" +-# Serial: 42023070807708724159991140556527066870 +-# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +-# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +-# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +------BEGIN CERTIFICATE----- +-MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +-MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +-YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +-PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +-Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +-AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +-IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +-gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +-yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +-F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +-jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +-ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +-VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +-YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +-EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +-Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +-DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +-MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +-UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +-TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +-qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +-ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +-JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +-hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +-EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +-nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +-udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +-ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +-LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +-pYYsfPQS +------END CERTIFICATE----- +- +-# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +-# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +-# Label: "DigiCert Assured ID Root CA" +-# Serial: 17154717934120587862167794914071425081 +-# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +-# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +-# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +------BEGIN CERTIFICATE----- +-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +-b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +-JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +-mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +-wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +-VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +-AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +-AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +-BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +-pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +-dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +-fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +-NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +-H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +------END CERTIFICATE----- +- +-# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +-# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +-# Label: "DigiCert Global Root CA" +-# Serial: 10944719598952040374951832963794454346 +-# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +-# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +-# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +------BEGIN CERTIFICATE----- +-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +-QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +-CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +-nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +-43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +-T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +-gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +-BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +-TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +-DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +-hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +-06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +-PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +-YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +------END CERTIFICATE----- +- +-# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +-# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +-# Label: "DigiCert High Assurance EV Root CA" +-# Serial: 3553400076410547919724730734378100087 +-# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +-# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +-# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +------BEGIN CERTIFICATE----- +-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +-d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +-ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +-MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +-LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +-RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm +-+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +-PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +-xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +-Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +-hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +-EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +-MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +-FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +-nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +-eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +-hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +-Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +-+OkuE6N36B9K +------END CERTIFICATE----- +- +-# Issuer: CN=Class 2 Primary CA O=Certplus +-# Subject: CN=Class 2 Primary CA O=Certplus +-# Label: "Certplus Class 2 Primary CA" +-# Serial: 177770208045934040241468760488327595043 +-# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +-# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +-# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +------BEGIN CERTIFICATE----- +-MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +-PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +-cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +-MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +-IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +-ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +-VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +-kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +-EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +-H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +-HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +-DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +-QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +-Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +-AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +-yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +-FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +-ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +-kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +-l7+ijrRU +------END CERTIFICATE----- +- +-# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +-# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +-# Label: "DST Root CA X3" +-# Serial: 91299735575339953335919266965803778155 +-# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +-# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +-# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +------BEGIN CERTIFICATE----- +-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +-MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +-DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +-PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +-Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +-AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +-rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +-OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +-xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +-7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +-aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +-SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +-ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +-AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +-R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +-JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +-Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +------END CERTIFICATE----- +- +-# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +-# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +-# Label: "SwissSign Gold CA - G2" +-# Serial: 13492815561806991280 +-# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +-# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +-# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +------BEGIN CERTIFICATE----- +-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +-BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +-biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +-MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +-d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +-CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +-76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +-bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +-6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +-emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +-MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +-MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +-MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +-FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +-aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +-gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +-qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +-lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +-8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +-45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +-UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +-O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +-bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +-GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +-77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +-hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +-92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +-Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +-ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +-Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +------END CERTIFICATE----- +- +-# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +-# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +-# Label: "SwissSign Silver CA - G2" +-# Serial: 5700383053117599563 +-# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +-# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +-# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +------BEGIN CERTIFICATE----- +-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +-BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +-IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +-RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +-U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +-MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +-Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +-YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +-nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +-6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +-eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +-c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +-MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +-HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +-jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +-5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +-rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +-F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +-wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +-cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +-AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +-WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +-xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +-2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +-IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +-aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +-em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +-dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +-OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +-hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +-tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +------END CERTIFICATE----- +- +-# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +-# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +-# Label: "GeoTrust Primary Certification Authority" +-# Serial: 32798226551256963324313806436981982369 +-# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +-# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +-# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +------BEGIN CERTIFICATE----- +-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +-MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +-R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +-MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +-Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +-ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +-AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +-AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +-ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +-7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +-kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +-mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +-A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +-KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +-6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +-4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +-oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +-UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +-AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +------END CERTIFICATE----- +- +-# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +-# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +-# Label: "thawte Primary Root CA" +-# Serial: 69529181992039203566298953787712940909 +-# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +-# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +-# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +------BEGIN CERTIFICATE----- +-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +-qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +-Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +-MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +-BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +-NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +-LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +-A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +-IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +-W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +-3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +-6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +-Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +-NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +-r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +-DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +-YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +-/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +-LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +-jVaMaA== +------END CERTIFICATE----- +- +-# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +-# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +-# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +-# Serial: 33037644167568058970164719475676101450 +-# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +-# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +-# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +------BEGIN CERTIFICATE----- +-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +-ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +-aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +-aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +-nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +-t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +-SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +-BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +-rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +-NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +-BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +-BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +-MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +-p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +-5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +-WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +-4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +-hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +------END CERTIFICATE----- +- +-# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +-# Subject: CN=SecureTrust CA O=SecureTrust Corporation +-# Label: "SecureTrust CA" +-# Serial: 17199774589125277788362757014266862032 +-# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +-# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +-# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +------BEGIN CERTIFICATE----- +-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +-FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +-MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +-cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +-AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +-Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +-0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +-wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +-7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +-8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +-BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +-/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +-JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +-NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +-6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +-3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +-D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +-CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +------END CERTIFICATE----- +- +-# Issuer: CN=Secure Global CA O=SecureTrust Corporation +-# Subject: CN=Secure Global CA O=SecureTrust Corporation +-# Label: "Secure Global CA" +-# Serial: 9751836167731051554232119481456978597 +-# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +-# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +-# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +------BEGIN CERTIFICATE----- +-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +-GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +-MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +-Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +-iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +-/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +-jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +-HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +-sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +-gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +-MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +-KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +-AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +-URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +-H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +-I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +-iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +------END CERTIFICATE----- +- +-# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +-# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +-# Label: "COMODO Certification Authority" +-# Serial: 104350513648249232941998508985834464573 +-# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +-# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +-# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +------BEGIN CERTIFICATE----- +-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +-gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +-MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +-YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +-RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +-UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +-2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +-Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp +-+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +-DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +-nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +-/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +-PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +-QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +-SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +-IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +-zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +-BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +-ZQ== +------END CERTIFICATE----- +- +-# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +-# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +-# Label: "Network Solutions Certificate Authority" +-# Serial: 116697915152937497490437556386812487904 +-# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +-# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +-# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +------BEGIN CERTIFICATE----- +-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +-MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +-dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +-UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +-ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +-c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +-OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +-mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +-BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +-qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +-gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +-BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +-bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +-dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +-6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +-h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +-/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +-pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +------END CERTIFICATE----- +- +-# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +-# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +-# Label: "COMODO ECC Certification Authority" +-# Serial: 41578283867086692638256921589707938090 +-# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +-# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +-# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +------BEGIN CERTIFICATE----- +-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +-MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +-BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +-IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +-MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +-ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +-T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +-biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +-FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +-cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +-BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +-BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +-fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +-GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +------END CERTIFICATE----- +- +-# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +-# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +-# Label: "OISTE WISeKey Global Root GA CA" +-# Serial: 86718877871133159090080555911823548314 +-# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +-# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +-# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +------BEGIN CERTIFICATE----- +-MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +-ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +-aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +-ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +-NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +-A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +-VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +-SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +-MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +-VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +-w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +-mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +-4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +-4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +-EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +-SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +-ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +-vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +-hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +-Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +-/L7fCg0= +------END CERTIFICATE----- +- +-# Issuer: CN=Certigna O=Dhimyotis +-# Subject: CN=Certigna O=Dhimyotis +-# Label: "Certigna" +-# Serial: 18364802974209362175 +-# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +-# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +-# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +------BEGIN CERTIFICATE----- +-MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +-BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +-DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +-BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +-DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +-QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +-gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +-zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +-130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +-JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +-ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +-AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +-AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +-9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +-bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +-fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +-HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +-t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +-WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +------END CERTIFICATE----- +- +-# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +-# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +-# Label: "Deutsche Telekom Root CA 2" +-# Serial: 38 +-# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +-# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +-# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +------BEGIN CERTIFICATE----- +-MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +-MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +-IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +-IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +-RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +-U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +-IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +-ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +-QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +-rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +-NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +-QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +-txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +-BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +-AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +-tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +-IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +-6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +-xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +-Cm26OWMohpLzGITY+9HPBVZkVw== +------END CERTIFICATE----- +- +-# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +-# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +-# Label: "Cybertrust Global Root" +-# Serial: 4835703278459682877484360 +-# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +-# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +-# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +------BEGIN CERTIFICATE----- +-MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +-A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +-bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +-ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +-b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +-7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +-J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +-HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +-t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +-FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +-XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +-MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +-hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +-MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +-A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +-Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +-XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +-omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +-A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +-WL1WMRJOEcgh4LMRkWXbtKaIOM5V +------END CERTIFICATE----- +- +-# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +-# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +-# Label: "ePKI Root Certification Authority" +-# Serial: 28956088682735189655030529057352760477 +-# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +-# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +-# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +------BEGIN CERTIFICATE----- +-MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +-MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +-ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +-Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +-IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +-SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +-AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +-SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +-ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +-DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +-TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +-fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +-sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +-WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +-nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +-dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +-NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +-AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +-MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +-ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +-uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +-PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +-JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +-gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +-j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +-5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +-o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +-/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +-Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +-W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +-hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +------END CERTIFICATE----- +- +-# Issuer: O=certSIGN OU=certSIGN ROOT CA +-# Subject: O=certSIGN OU=certSIGN ROOT CA +-# Label: "certSIGN ROOT CA" +-# Serial: 35210227249154 +-# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +-# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +-# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +------BEGIN CERTIFICATE----- +-MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +-AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +-QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +-MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +-0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +-UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +-RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +-OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +-JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +-AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +-BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +-LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +-MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +-44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +-Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +-i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +-9u6wWk5JRFRYX0KD +------END CERTIFICATE----- +- +-# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +-# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +-# Label: "GeoTrust Primary Certification Authority - G3" +-# Serial: 28809105769928564313984085209975885599 +-# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +-# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +-# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +------BEGIN CERTIFICATE----- +-MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +-mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +-MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +-eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +-cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +-BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +-MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +-BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz +-+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +-hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +-5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +-JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +-DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +-huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +-HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +-AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +-zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +-kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +-AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +-SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +-spki4cErx5z481+oghLrGREt +------END CERTIFICATE----- +- +-# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +-# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +-# Label: "thawte Primary Root CA - G2" +-# Serial: 71758320672825410020661621085256472406 +-# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +-# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +-# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +------BEGIN CERTIFICATE----- +-MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +-MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +-IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +-BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +-MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +-d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +-YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +-dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +-BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +-papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +-DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +-KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +-XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +------END CERTIFICATE----- +- +-# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +-# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +-# Label: "thawte Primary Root CA - G3" +-# Serial: 127614157056681299805556476275995414779 +-# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +-# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +-# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +------BEGIN CERTIFICATE----- +-MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +-rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +-Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +-MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +-BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +-Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +-LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +-MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +-ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +-gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +-YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +-b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +-9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +-zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +-OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +-HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +-2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +-oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +-t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +-KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +-m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +-MdRAGmI0Nj81Aa6sY6A= +------END CERTIFICATE----- +- +-# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +-# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +-# Label: "GeoTrust Primary Certification Authority - G2" +-# Serial: 80682863203381065782177908751794619243 +-# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +-# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +-# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +------BEGIN CERTIFICATE----- +-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +-MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +-KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +-MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +-eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +-BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +-NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +-BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +-MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +-So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +-tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +-CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +-qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +-rD6ogRLQy7rQkgu2npaqBA+K +------END CERTIFICATE----- +- +-# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +-# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +-# Label: "VeriSign Universal Root Certification Authority" +-# Serial: 85209574734084581917763752644031726877 +-# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +-# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +-# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +------BEGIN CERTIFICATE----- +-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +-vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +-ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +-Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +-MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +-IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +-IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +-bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +-AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +-9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +-H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +-LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +-/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +-rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +-WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +-exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +-sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +-seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +-4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +-BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +-lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +-7M2CYfE45k+XmCpajQ== +------END CERTIFICATE----- +- +-# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +-# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +-# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +-# Serial: 63143484348153506665311985501458640051 +-# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +-# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +-# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +------BEGIN CERTIFICATE----- +-MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +-aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +-U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +-SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +-biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +-IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +-GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +-fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +-aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +-aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +-kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +-4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +-FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +------END CERTIFICATE----- +- +-# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +-# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +-# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +-# Serial: 80544274841616 +-# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +-# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +-# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +------BEGIN CERTIFICATE----- +-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +-EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +-MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +-cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +-dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +-pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +-b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +-aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +-IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +-MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +-lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +-AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +-VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +-ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +-BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +-AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +-U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +-bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C +-+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +-uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +-XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +------END CERTIFICATE----- +- +-# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +-# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +-# Label: "Staat der Nederlanden Root CA - G2" +-# Serial: 10000012 +-# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +-# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +-# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +------BEGIN CERTIFICATE----- +-MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +-dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +-DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +-ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +-b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +-qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +-uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +-Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +-pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +-5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +-UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +-GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +-5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +-6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +-eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +-B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +-BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +-L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +-SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +-CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +-5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +-IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +-gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL +-+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +-vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +-bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +-N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +-Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +-ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +------END CERTIFICATE----- +- +-# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +-# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +-# Label: "Hongkong Post Root CA 1" +-# Serial: 1000 +-# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +-# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +-# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +------BEGIN CERTIFICATE----- +-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +-FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +-Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +-A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +-b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +-AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +-jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +-PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +-ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +-nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +-q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +-MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +-mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +-7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +-oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +-EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +-fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +-AmvZWg== +------END CERTIFICATE----- +- +-# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +-# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +-# Label: "SecureSign RootCA11" +-# Serial: 1 +-# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +-# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +-# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +------BEGIN CERTIFICATE----- +-MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +-MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +-A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +-MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +-Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +-QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +-i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +-h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +-MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +-UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +-8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +-h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +-VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +-AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +-KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +-X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +-QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +-pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +-QSdJQO7e5iNEOdyhIta6A/I= +------END CERTIFICATE----- +- +-# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +-# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +-# Label: "Microsec e-Szigno Root CA 2009" +-# Serial: 14014712776195784473 +-# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +-# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +-# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +------BEGIN CERTIFICATE----- +-MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +-VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +-ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +-CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +-OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +-FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +-Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +-dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +-kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +-cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +-fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +-N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +-xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 +-+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +-A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +-Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +-SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +-mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +-ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +-tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +-2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +-HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +------END CERTIFICATE----- +- +-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +-# Label: "GlobalSign Root CA - R3" +-# Serial: 4835703278459759426209954 +-# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +-# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +-# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +------BEGIN CERTIFICATE----- +-MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +-MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +-hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +-RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +-gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +-KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +-QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +-XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +-LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +-RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +-jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +-6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +-mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +-Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +-WD9f +------END CERTIFICATE----- +- +-# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +-# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +-# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +-# Serial: 6047274297262753887 +-# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +-# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +-# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +------BEGIN CERTIFICATE----- +-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +-BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +-cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +-MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +-Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +-thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +-cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +-L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +-NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +-X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +-m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +-Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +-EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +-KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +-6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +-OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +-VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +-ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +-AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +-661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +-am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +-ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +-PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +-3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +-SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +-3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +-ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +-StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +-Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +-jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +------END CERTIFICATE----- +- +-# Issuer: CN=Izenpe.com O=IZENPE S.A. +-# Subject: CN=Izenpe.com O=IZENPE S.A. +-# Label: "Izenpe.com" +-# Serial: 917563065490389241595536686991402621 +-# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +-# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +-# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +------BEGIN CERTIFICATE----- +-MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +-MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +-ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +-VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +-b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +-scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +-xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +-LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +-uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +-yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +-JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +-rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +-BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +-hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +-QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +-HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +-Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +-QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +-BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +-MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +-AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +-A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +-laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +-awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +-JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +-LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +-VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +-LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +-UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +-QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +-naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +-QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +------END CERTIFICATE----- +- +-# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +-# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +-# Label: "Chambers of Commerce Root - 2008" +-# Serial: 11806822484801597146 +-# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +-# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +-# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +------BEGIN CERTIFICATE----- +-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +-VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +-IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +-MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +-IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +-MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +-dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +-EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +-MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +-CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +-28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +-VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +-DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +-5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +-ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +-Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +-UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s +-+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +-Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +-hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +-HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 +-+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +-YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +-L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +-ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +-IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +-HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +-DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +-PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +-5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +-glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +-FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +-pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +-xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +-tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +-jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +-fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +-d0jQ +------END CERTIFICATE----- +- +-# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +-# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +-# Label: "Global Chambersign Root - 2008" +-# Serial: 14541511773111788494 +-# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +-# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +-# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +------BEGIN CERTIFICATE----- +-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +-VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +-IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +-MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +-aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +-MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +-cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +-A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +-BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +-hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +-KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +-G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +-zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +-ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +-HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +-Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +-yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +-beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +-6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +-zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +-BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +-ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +-ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +-cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +-YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +-CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +-KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +-hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +-UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +-X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +-fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +-a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +-Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +-SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +-AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +-M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +-v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +------END CERTIFICATE----- +- +-# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +-# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +-# Label: "Go Daddy Root Certificate Authority - G2" +-# Serial: 0 +-# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +-# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +-# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +------BEGIN CERTIFICATE----- +-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +-EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +-ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +-NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +-EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +-AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +-E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +-/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +-DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +-GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +-tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +-AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +-FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +-WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +-9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +-gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +-2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +-4uJEvlz36hz1 +------END CERTIFICATE----- +- +-# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +-# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +-# Label: "Starfield Root Certificate Authority - G2" +-# Serial: 0 +-# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +-# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +-# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +------BEGIN CERTIFICATE----- +-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +-ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +-MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +-aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +-Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +-ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +-nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +-HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +-Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +-dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +-HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +-CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +-sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +-4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +-8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +-mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +------END CERTIFICATE----- +- +-# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +-# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +-# Label: "Starfield Services Root Certificate Authority - G2" +-# Serial: 0 +-# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +-# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +-# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +------BEGIN CERTIFICATE----- +-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +-ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +-VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +-ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +-dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +-hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +-OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +-8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +-Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +-hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +-6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +-AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +-bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +-ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +-qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +-0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +-sSi6 +------END CERTIFICATE----- +- +-# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +-# Subject: CN=AffirmTrust Commercial O=AffirmTrust +-# Label: "AffirmTrust Commercial" +-# Serial: 8608355977964138876 +-# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +-# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +-# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +------BEGIN CERTIFICATE----- +-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +-dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +-cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +-AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +-Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +-ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +-MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +-yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +-VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +-nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +-KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +-XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +-vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +-Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +-N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +-nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +------END CERTIFICATE----- +- +-# Issuer: CN=AffirmTrust Networking O=AffirmTrust +-# Subject: CN=AffirmTrust Networking O=AffirmTrust +-# Label: "AffirmTrust Networking" +-# Serial: 8957382827206547757 +-# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +-# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +-# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +------BEGIN CERTIFICATE----- +-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +-dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +-cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +-AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +-YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +-kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +-QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +-6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +-yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +-QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +-KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +-tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +-QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +-Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +-olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +-x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +------END CERTIFICATE----- +- +-# Issuer: CN=AffirmTrust Premium O=AffirmTrust +-# Subject: CN=AffirmTrust Premium O=AffirmTrust +-# Label: "AffirmTrust Premium" +-# Serial: 7893706540734352110 +-# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +-# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +-# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +------BEGIN CERTIFICATE----- +-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +-dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +-A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +-cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +-qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +-JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ +-+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +-s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +-HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +-70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +-V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +-qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +-5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +-C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +-OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +-FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +-BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +-KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +-8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +-MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +-0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +-u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +-u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +-YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +-GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +-RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +-KeC2uAloGRwYQw== +------END CERTIFICATE----- +- +-# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +-# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +-# Label: "AffirmTrust Premium ECC" +-# Serial: 8401224907861490260 +-# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +-# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +-# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +------BEGIN CERTIFICATE----- +-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +-VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +-cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +-BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +-VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +-0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +-ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +-A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +-A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +-aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +-flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +------END CERTIFICATE----- +- +-# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +-# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +-# Label: "Certum Trusted Network CA" +-# Serial: 279744 +-# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +-# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +-# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +------BEGIN CERTIFICATE----- +-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +-MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +-ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +-cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +-WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +-Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +-IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +-AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +-UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +-TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +-BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +-kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +-AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +-sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +-I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +-J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +-VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +------END CERTIFICATE----- +- +-# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +-# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +-# Label: "TWCA Root Certification Authority" +-# Serial: 1 +-# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +-# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +-# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +------BEGIN CERTIFICATE----- +-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +-MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +-V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +-WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +-LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +-aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +-AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +-AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +-K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +-RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +-rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +-3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +-hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +-MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +-XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +-lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +-aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +-YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +------END CERTIFICATE----- +- +-# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +-# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +-# Label: "Security Communication RootCA2" +-# Serial: 0 +-# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +-# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +-# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +------BEGIN CERTIFICATE----- +-MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +-MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +-U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +-DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +-dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +-YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +-OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +-zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +-VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +-hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +-ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +-awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +-OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +-DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +-coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +-okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +-t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +-1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +-SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +------END CERTIFICATE----- +- +-# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +-# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +-# Label: "Hellenic Academic and Research Institutions RootCA 2011" +-# Serial: 0 +-# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +-# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +-# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +------BEGIN CERTIFICATE----- +-MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +-RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +-dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +-YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +-NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +-EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +-cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +-c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +-BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +-dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +-fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +-bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +-75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +-FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +-HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +-5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +-b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +-A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +-6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +-TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +-dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +-Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +-l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +------END CERTIFICATE----- +- +-# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +-# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +-# Label: "Actalis Authentication Root CA" +-# Serial: 6271844772424770508 +-# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +-# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +-# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +------BEGIN CERTIFICATE----- +-MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +-BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +-MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +-IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +-SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +-ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +-UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +-4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +-KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +-gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +-rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +-51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +-be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +-KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +-v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +-fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +-jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +-ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +-ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +-e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +-jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +-WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +-SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +-pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +-X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +-fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +-K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +-ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +-LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +-LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +------END CERTIFICATE----- +- +-# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +-# Subject: O=Trustis Limited OU=Trustis FPS Root CA +-# Label: "Trustis FPS Root CA" +-# Serial: 36053640375399034304724988975563710553 +-# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +-# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +-# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +------BEGIN CERTIFICATE----- +-MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +-MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +-ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +-MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +-MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +-ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +-AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +-iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +-vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +-0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +-OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +-BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +-FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +-GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +-zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +-1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +-f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +-jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +-ZetX2fNXlrtIzYE= +------END CERTIFICATE----- +- +-# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +-# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +-# Label: "Buypass Class 2 Root CA" +-# Serial: 2 +-# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +-# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +-# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +------BEGIN CERTIFICATE----- +-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +-Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +-BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +-6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +-L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +-1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +-MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +-QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +-arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +-Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +-FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +-P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +-9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +-uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +-9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +-A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +-OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo +-+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +-KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +-DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +-H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +-I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +-5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +-3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +-Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +------END CERTIFICATE----- +- +-# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +-# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +-# Label: "Buypass Class 3 Root CA" +-# Serial: 2 +-# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +-# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +-# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +------BEGIN CERTIFICATE----- +-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +-Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +-BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +-ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +-N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +-tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +-0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +-/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +-KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +-zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +-O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +-34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +-K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +-Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +-QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +-cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +-IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +-HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +-O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +-033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +-dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +-kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +-3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +-u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +-4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +------END CERTIFICATE----- +- +-# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +-# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +-# Label: "T-TeleSec GlobalRoot Class 3" +-# Serial: 1 +-# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +-# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +-# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +------BEGIN CERTIFICATE----- +-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +-YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +-8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +-RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +-hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +-ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +-EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +-A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +-WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +-1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +-6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +-91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +-e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +-TpPDpFQUWw== +------END CERTIFICATE----- +- +-# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +-# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +-# Label: "EE Certification Centre Root CA" +-# Serial: 112324828676200291871926431888494945866 +-# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +-# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +-# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +------BEGIN CERTIFICATE----- +-MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +-MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +-czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +-CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +-MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +-ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +-b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +-AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +-euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +-bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +-WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +-MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +-1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +-zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +-BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +-BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +-v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +-E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +-uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +-iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +-GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +------END CERTIFICATE----- +- +-# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +-# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +-# Label: "D-TRUST Root Class 3 CA 2 2009" +-# Serial: 623603 +-# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +-# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +-# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +------BEGIN CERTIFICATE----- +-MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +-bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +-ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +-HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +-BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +-UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +-tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +-ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +-lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +-/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +-A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +-A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +-dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +-MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +-cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +-L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +-BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +-acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +-o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +-zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +-PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +-Johw1+qRzT65ysCQblrGXnRl11z+o+I= +------END CERTIFICATE----- +- +-# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +-# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +-# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +-# Serial: 623604 +-# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +-# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +-# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +------BEGIN CERTIFICATE----- +-MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +-bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +-NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +-BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +-hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +-ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +-3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +-qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +-p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +-HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +-ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +-HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +-Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +-c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +-RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +-dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +-Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +-3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +-nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +-CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +-xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +-KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +------END CERTIFICATE----- +- +-# Issuer: CN=CA Disig Root R2 O=Disig a.s. +-# Subject: CN=CA Disig Root R2 O=Disig a.s. +-# Label: "CA Disig Root R2" +-# Serial: 10572350602393338211 +-# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +-# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +-# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +------BEGIN CERTIFICATE----- +-MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +-BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +-MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +-MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +-EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +-ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +-NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +-PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +-x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +-QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +-yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +-QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +-H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +-QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +-i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +-nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +-rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +-hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +-tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +-GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +-lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka +-+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +-TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +-nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +-gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +-G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +-zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +-L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +------END CERTIFICATE----- +- +-# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +-# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +-# Label: "ACCVRAIZ1" +-# Serial: 6828503384748696800 +-# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +-# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +-# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +------BEGIN CERTIFICATE----- +-MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +-AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +-CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +-BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +-VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +-qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +-HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +-G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +-lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +-IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +-0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +-k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +-4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +-m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +-cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +-uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +-KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +-ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +-AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +-VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +-VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +-CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +-cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +-QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +-7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +-cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +-QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +-czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +-aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +-aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +-DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +-BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +-D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +-JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +-AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +-vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +-tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +-7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +-I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +-h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +-d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +-pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +------END CERTIFICATE----- +- +-# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +-# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +-# Label: "TWCA Global Root CA" +-# Serial: 3262 +-# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +-# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +-# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +------BEGIN CERTIFICATE----- +-MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +-EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +-VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +-NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +-B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +-10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +-0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +-MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +-zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +-46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +-yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +-laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +-oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +-BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +-qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +-4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +-/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +-1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +-LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +-H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +-RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +-nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +-15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +-6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +-nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +-wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +-aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +-KwbQBM0= +------END CERTIFICATE----- +- +-# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +-# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +-# Label: "TeliaSonera Root CA v1" +-# Serial: 199041966741090107964904287217786801558 +-# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +-# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +-# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +------BEGIN CERTIFICATE----- +-MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +-NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +-b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +-VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +-VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +-7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +-Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +-/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +-81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +-dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +-Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +-sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +-pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +-slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +-arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +-VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +-9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +-dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +-0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +-TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +-Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +-Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +-OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +-vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +-t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +-HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +-SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +------END CERTIFICATE----- +- +-# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +-# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +-# Label: "E-Tugra Certification Authority" +-# Serial: 7667447206703254355 +-# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +-# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +-# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +------BEGIN CERTIFICATE----- +-MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +-BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +-aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +-BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +-Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +-MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +-BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +-em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +-ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +-B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +-D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +-Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +-q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +-k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +-fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +-dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +-ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +-zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +-rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +-U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +-Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +-XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +-Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +-HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +-GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +-77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 +-+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +-vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +-FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +-yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +-AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +-y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +-NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +------END CERTIFICATE----- +- +-# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +-# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +-# Label: "T-TeleSec GlobalRoot Class 2" +-# Serial: 1 +-# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +-# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +-# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +------BEGIN CERTIFICATE----- +-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +-YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +-AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +-FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +-1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +-jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +-wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +-WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +-NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +-uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +-IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +-g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +-9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +-BSeOE6Fuwg== +------END CERTIFICATE----- +- +-# Issuer: CN=Atos TrustedRoot 2011 O=Atos +-# Subject: CN=Atos TrustedRoot 2011 O=Atos +-# Label: "Atos TrustedRoot 2011" +-# Serial: 6643877497813316402 +-# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +-# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +-# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +------BEGIN CERTIFICATE----- +-MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +-AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +-EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +-FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +-REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +-Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +-VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +-SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +-4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +-cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +-eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +-HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +-A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +-DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +-vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +-DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +-maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +-lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +-KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +------END CERTIFICATE----- +- +-# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +-# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +-# Label: "QuoVadis Root CA 1 G3" +-# Serial: 687049649626669250736271037606554624078720034195 +-# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +-# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +-# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +------BEGIN CERTIFICATE----- +-MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +-MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +-wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +-rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +-68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +-4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +-UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +-abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +-3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +-KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +-hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +-Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +-zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +-BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +-ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +-MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +-cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +-qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +-YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +-b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +-8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +-NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +-ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +-q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +-nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +------END CERTIFICATE----- +- +-# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +-# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +-# Label: "QuoVadis Root CA 2 G3" +-# Serial: 390156079458959257446133169266079962026824725800 +-# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +-# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +-# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +------BEGIN CERTIFICATE----- +-MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +-MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +-SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +-qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +-n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +-c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +-O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +-o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +-IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +-IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +-8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +-vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +-7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +-cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +-BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +-ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +-AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +-roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +-W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +-lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE +-+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +-csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +-dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +-KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +-HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +-WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +------END CERTIFICATE----- +- +-# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +-# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +-# Label: "QuoVadis Root CA 3 G3" +-# Serial: 268090761170461462463995952157327242137089239581 +-# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +-# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +-# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +------BEGIN CERTIFICATE----- +-MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +-MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +-/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +-FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +-U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +-ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +-FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +-A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +-eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +-sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +-VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +-A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +-ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +-BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +-ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +-KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +-FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +-oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +-u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +-0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +-3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +-8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +-DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +-PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +-ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +------END CERTIFICATE----- +- +-# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +-# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +-# Label: "DigiCert Assured ID Root G2" +-# Serial: 15385348160840213938643033620894905419 +-# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +-# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +-# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +------BEGIN CERTIFICATE----- +-MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +-b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +-n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +-biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +-EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +-bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +-YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +-AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +-BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +-QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +-0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +-lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +-B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +-ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +-IhNzbM8m9Yop5w== +------END CERTIFICATE----- +- +-# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +-# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +-# Label: "DigiCert Assured ID Root G3" +-# Serial: 15459312981008553731928384953135426796 +-# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +-# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +-# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +------BEGIN CERTIFICATE----- +-MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +-ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +-RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +-Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +-hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +-Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +-RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +-BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +-AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +-JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +-6pZjamVFkpUBtA== +------END CERTIFICATE----- +- +-# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +-# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +-# Label: "DigiCert Global Root G2" +-# Serial: 4293743540046975378534879503202253541 +-# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +-# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +-# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +------BEGIN CERTIFICATE----- +-MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +-MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +-2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +-1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +-q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +-tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +-vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +-BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +-5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +-1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +-NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +-Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +-8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +-pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +-MrY= +------END CERTIFICATE----- +- +-# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +-# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +-# Label: "DigiCert Global Root G3" +-# Serial: 7089244469030293291760083333884364146 +-# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +-# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +-# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +------BEGIN CERTIFICATE----- +-MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +-ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +-Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +-EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +-IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +-K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +-fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +-Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +-BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +-AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +-oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +-sycX +------END CERTIFICATE----- +- +-# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +-# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +-# Label: "DigiCert Trusted Root G4" +-# Serial: 7451500558977370777930084869016614236 +-# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +-# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +-# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +------BEGIN CERTIFICATE----- +-MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +-d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +-RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +-Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +-SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +-ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +-xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +-ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +-DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +-jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +-CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +-EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +-fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +-uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +-chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +-9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +-hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +-ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +-SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd +-+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +-fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +-sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +-cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +-0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +-4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +-r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +-/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +-gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +------END CERTIFICATE----- +- +-# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +-# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +-# Label: "COMODO RSA Certification Authority" +-# Serial: 101909084537582093308941363524873193117 +-# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +-# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +-# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +------BEGIN CERTIFICATE----- +-MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +-hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +-BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +-MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +-EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +-Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +-dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +-6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +-pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +-9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +-/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +-Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z +-+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +-qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +-SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +-u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +-Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +-crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +-FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +-/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +-wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +-4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +-2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +-FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +-CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +-boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +-jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +-S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +-QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +-0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +-NVOFBkpdn627G190 +------END CERTIFICATE----- +- +-# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +-# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +-# Label: "USERTrust RSA Certification Authority" +-# Serial: 2645093764781058787591871645665788717 +-# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +-# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +-# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +------BEGIN CERTIFICATE----- +-MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +-iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +-cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +-BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +-MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +-BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +-aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +-dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +-AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +-3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +-tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +-Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +-VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +-79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +-c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +-Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +-c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +-UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +-Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +-BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +-Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +-VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +-ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +-8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +-iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +-Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +-XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +-qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +-VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +-L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +-jjxDah2nGN59PRbxYvnKkKj9 +------END CERTIFICATE----- +- +-# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +-# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +-# Label: "USERTrust ECC Certification Authority" +-# Serial: 123013823720199481456569720443997572134 +-# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +-# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +-# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +------BEGIN CERTIFICATE----- +-MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +-MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +-eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +-JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +-MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +-Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +-VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +-aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +-I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +-o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +-A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +-VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +-zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +-RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +------END CERTIFICATE----- +- +-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +-# Label: "GlobalSign ECC Root CA - R4" +-# Serial: 14367148294922964480859022125800977897474 +-# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +-# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +-# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +------BEGIN CERTIFICATE----- +-MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +-MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +-bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +-DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +-QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +-MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +-FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +-uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +-kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +-ewv4n4Q= +------END CERTIFICATE----- +- +-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +-# Label: "GlobalSign ECC Root CA - R5" +-# Serial: 32785792099990507226680698011560947931244 +-# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +-# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +-# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +------BEGIN CERTIFICATE----- +-MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +-MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +-bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +-DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +-QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +-MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +-8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +-hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +-VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +-KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +-515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +-xwy8p2Fp8fc74SrL+SvzZpA3 +------END CERTIFICATE----- +- +-# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +-# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +-# Label: "Staat der Nederlanden Root CA - G3" +-# Serial: 10003001 +-# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +-# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +-# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +------BEGIN CERTIFICATE----- +-MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +-dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +-DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +-ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +-b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +-cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +-IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +-xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +-KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +-9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +-5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +-6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +-Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +-bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +-BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +-XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +-MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +-INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +-U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +-LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +-Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +-gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +-/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +-0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +-fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +-4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +-1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +-QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +-94B7IWcnMFk= +------END CERTIFICATE----- +- +-# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +-# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +-# Label: "Staat der Nederlanden EV Root CA" +-# Serial: 10000013 +-# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +-# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +-# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +------BEGIN CERTIFICATE----- +-MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +-dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +-MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +-TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +-b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +-M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +-UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +-Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +-rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +-pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +-j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +-KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +-/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +-cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +-1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +-px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +-/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +-MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +-eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +-2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +-v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +-wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +-CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +-vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +-Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +-Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +-eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +-FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +-7uzXLg== +------END CERTIFICATE----- +- +-# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +-# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +-# Label: "IdenTrust Commercial Root CA 1" +-# Serial: 13298821034946342390520003877796839426 +-# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +-# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +-# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +------BEGIN CERTIFICATE----- +-MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +-MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +-VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +-MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +-JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +-3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU +-+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +-S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +-bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +-T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +-vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +-Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +-dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +-c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +-l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +-iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +-/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +-ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +-6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +-LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +-nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 +-+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +-W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +-AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +-l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +-4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +-mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +-7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +------END CERTIFICATE----- +- +-# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +-# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +-# Label: "IdenTrust Public Sector Root CA 1" +-# Serial: 13298821034946342390521976156843933698 +-# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +-# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +-# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +------BEGIN CERTIFICATE----- +-MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +-MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +-VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +-MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +-MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +-ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +-RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +-bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +-/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +-3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +-EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +-9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +-GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +-2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +-WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +-W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +-BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +-AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +-t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +-DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +-TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +-lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +-mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +-WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 +-+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +-tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +-GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +-8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +------END CERTIFICATE----- +- +-# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +-# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +-# Label: "Entrust Root Certification Authority - G2" +-# Serial: 1246989352 +-# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +-# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +-# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +------BEGIN CERTIFICATE----- +-MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +-cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +-IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +-dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +-NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +-dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +-dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +-aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +-YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +-AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +-RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +-cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +-wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +-U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +-jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +-BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +-jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +-Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +-1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +-nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +-VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +------END CERTIFICATE----- +- +-# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +-# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +-# Label: "Entrust Root Certification Authority - EC1" +-# Serial: 51543124481930649114116133369 +-# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +-# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +-# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +------BEGIN CERTIFICATE----- +-MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +-A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +-d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +-dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +-RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +-MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +-VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +-L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +-Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +-A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +-ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +-Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +-BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +-R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +-hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +------END CERTIFICATE----- +- +-# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +-# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +-# Label: "CFCA EV ROOT" +-# Serial: 407555286 +-# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +-# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +-# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +------BEGIN CERTIFICATE----- +-MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +-TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +-aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +-MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +-aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +-T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +-sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +-TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +-/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +-7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +-EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +-hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +-a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +-aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +-TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +-PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +-cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +-tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +-BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +-ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +-ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +-jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +-ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +-P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +-xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +-Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +-5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +-/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +-AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +-5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +------END CERTIFICATE----- +- +-# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +-# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +-# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" +-# Serial: 156233699172481 +-# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e +-# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb +-# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 +------BEGIN CERTIFICATE----- +-MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE +-BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn +-aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg +-QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg +-SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 +-MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD +-VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +-dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB +-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom +-/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR +-Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 +-4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z +-5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 +-hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID +-AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ +-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX +-SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l +-VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +-URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf +-peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF +-Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW +-+qtB4Uu2NQvAmxU= +------END CERTIFICATE----- +- +-# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +-# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +-# Label: "Certinomis - Root CA" +-# Serial: 1 +-# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +-# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +-# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +------BEGIN CERTIFICATE----- +-MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +-MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +-BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +-MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +-FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +-Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +-fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +-LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +-WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +-TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +-5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +-CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +-wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +-wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +-m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +-F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +-WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +-BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +-2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +-AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +-0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +-F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +-g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +-qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +-h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +-ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +-btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +-Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +-8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +-gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +------END CERTIFICATE----- +- +-# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +-# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +-# Label: "OISTE WISeKey Global Root GB CA" +-# Serial: 157768595616588414422159278966750757568 +-# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +-# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +-# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +------BEGIN CERTIFICATE----- +-MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +-MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +-Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +-YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +-CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +-b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +-bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +-HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +-WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +-1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +-u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +-99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +-M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +-AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +-BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +-cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +-gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +-ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +-aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +-Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +------END CERTIFICATE----- +- +-# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +-# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +-# Label: "SZAFIR ROOT CA2" +-# Serial: 357043034767186914217277344587386743377558296292 +-# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +-# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +-# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +------BEGIN CERTIFICATE----- +-MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +-BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +-ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +-NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +-cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +-Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +-QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +-3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +-3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +-3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +-BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +-XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +-AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +-AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +-8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +-nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +-oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +-d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +-LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +------END CERTIFICATE----- +- +-# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +-# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +-# Label: "Certum Trusted Network CA 2" +-# Serial: 44979900017204383099463764357512596969 +-# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +-# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +-# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +------BEGIN CERTIFICATE----- +-MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +-gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +-QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +-A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +-OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +-VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +-ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +-b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +-DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +-0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +-OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +-fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +-Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +-o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +-sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +-OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +-Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +-adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +-3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +-AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +-AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +-F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +-CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +-XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +-djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +-WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +-AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +-P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +-b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +-XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +-5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +-DrW5viSP +------END CERTIFICATE----- +- +-# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +-# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +-# Label: "Hellenic Academic and Research Institutions RootCA 2015" +-# Serial: 0 +-# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +-# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +-# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +------BEGIN CERTIFICATE----- +-MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +-DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +-IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +-N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +-dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +-A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +-ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +-QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +-dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +-AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +-4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +-AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +-4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +-ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +-9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +-gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +-Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +-NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +-LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +-Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +-HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +-ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +-XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +-M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +-9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +-Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +-j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +-X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +-l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +-bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +-pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +-e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +-vm9qp/UsQu0yrbYhnr68 +------END CERTIFICATE----- +- +-# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +-# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +-# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +-# Serial: 0 +-# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +-# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +-# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +------BEGIN CERTIFICATE----- +-MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +-BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +-c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +-bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +-b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +-BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +-YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +-MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +-dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +-QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +-jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +-C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +-lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +-TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +------END CERTIFICATE----- +- +-# Issuer: CN=Certplus Root CA G1 O=Certplus +-# Subject: CN=Certplus Root CA G1 O=Certplus +-# Label: "Certplus Root CA G1" +-# Serial: 1491911565779898356709731176965615564637713 +-# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 +-# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 +-# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e +------BEGIN CERTIFICATE----- +-MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA +-MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +-dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa +-MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +-dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +-ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a +-iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt +-6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP +-0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f +-6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE +-EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN +-1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc +-h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT +-mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV +-4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO +-WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud +-DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd +-Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq +-hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +-66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 +-/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS +-S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j +-2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R +-Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr +-RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy +-6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV +-V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 +-g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl +-++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +------END CERTIFICATE----- +- +-# Issuer: CN=Certplus Root CA G2 O=Certplus +-# Subject: CN=Certplus Root CA G2 O=Certplus +-# Label: "Certplus Root CA G2" +-# Serial: 1492087096131536844209563509228951875861589 +-# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 +-# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a +-# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 +------BEGIN CERTIFICATE----- +-MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x +-CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +-dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x +-CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +-dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat +-93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x +-Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P +-AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj +-FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG +-SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch +-p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal +-U5ORGpOucGpnutee5WEaXw== +------END CERTIFICATE----- +- +-# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust +-# Subject: CN=OpenTrust Root CA G1 O=OpenTrust +-# Label: "OpenTrust Root CA G1" +-# Serial: 1492036577811947013770400127034825178844775 +-# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da +-# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e +-# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 +------BEGIN CERTIFICATE----- +-MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA +-MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +-ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw +-MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +-T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +-AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b +-wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX +-/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 +-77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP +-uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx +-p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx +-Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 +-TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W +-G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw +-vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY +-EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO +-BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 +-2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw +-DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +-PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf +-gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS +-FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 +-V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P +-XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I +-i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t +-TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 +-09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky +-Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ +-AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj +-1oxx +------END CERTIFICATE----- +- +-# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust +-# Subject: CN=OpenTrust Root CA G2 O=OpenTrust +-# Label: "OpenTrust Root CA G2" +-# Serial: 1492012448042702096986875987676935573415441 +-# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb +-# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b +-# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 +------BEGIN CERTIFICATE----- +-MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA +-MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +-ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw +-MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +-T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +-AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh +-/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e +-CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 +-1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE +-FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS +-gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X +-G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy +-YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH +-vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 +-t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ +-gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO +-BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 +-5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w +-DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +-Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 +-nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT +-RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT +-wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 +-t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa +-TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 +-o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU +-3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA +-iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f +-WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM +-S1IK +------END CERTIFICATE----- +- +-# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust +-# Subject: CN=OpenTrust Root CA G3 O=OpenTrust +-# Label: "OpenTrust Root CA G3" +-# Serial: 1492104908271485653071219941864171170455615 +-# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 +-# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 +-# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 +------BEGIN CERTIFICATE----- +-MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx +-CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U +-cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow +-QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl +-blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm +-3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d +-oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G +-A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 +-DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK +-BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q +-j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx +-4nxp5V2a+EEfOzmTk51V6s2N8fvB +------END CERTIFICATE----- +- +-# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +-# Subject: CN=ISRG Root X1 O=Internet Security Research Group +-# Label: "ISRG Root X1" +-# Serial: 172886928669790476064670243504169061120 +-# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +-# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +-# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +------BEGIN CERTIFICATE----- +-MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +-TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +-cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +-WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +-ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +-h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +-0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +-A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +-T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +-B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +-B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +-KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +-OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +-jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +-qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +-rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +-hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +-ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +-3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +-NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +-ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +-TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +-jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +-oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +-4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +-mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +-emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +------END CERTIFICATE----- +- +-# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +-# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +-# Label: "AC RAIZ FNMT-RCM" +-# Serial: 485876308206448804701554682760554759 +-# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +-# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +-# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +------BEGIN CERTIFICATE----- +-MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +-CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +-WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +-BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +-Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +-yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +-BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +-WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +-tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +-374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +-IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +-mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +-wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +-MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +-ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +-UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +-YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +-LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +-nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +-RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +-LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +-77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +-JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +-fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +-6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +-1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +-9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +-RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +-uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +------END CERTIFICATE----- +- +-# Issuer: CN=Amazon Root CA 1 O=Amazon +-# Subject: CN=Amazon Root CA 1 O=Amazon +-# Label: "Amazon Root CA 1" +-# Serial: 143266978916655856878034712317230054538369994 +-# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +-# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +-# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +------BEGIN CERTIFICATE----- +-MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +-ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +-b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +-MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +-b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +-ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +-9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +-IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +-VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +-93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +-jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +-AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +-A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +-U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +-N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +-o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +-5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +-rqXRfboQnoZsG4q5WTP468SQvvG5 +------END CERTIFICATE----- +- +-# Issuer: CN=Amazon Root CA 2 O=Amazon +-# Subject: CN=Amazon Root CA 2 O=Amazon +-# Label: "Amazon Root CA 2" +-# Serial: 143266982885963551818349160658925006970653239 +-# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +-# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +-# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +------BEGIN CERTIFICATE----- +-MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +-ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +-b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +-MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +-b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +-gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +-W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +-1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +-8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +-2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +-z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +-8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +-mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +-7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 +-+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +-0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +-Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +-UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +-LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +-+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +-k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +-7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +-btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +-urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +-fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +-n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +-76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +-9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +-4PsJYGw= +------END CERTIFICATE----- +- +-# Issuer: CN=Amazon Root CA 3 O=Amazon +-# Subject: CN=Amazon Root CA 3 O=Amazon +-# Label: "Amazon Root CA 3" +-# Serial: 143266986699090766294700635381230934788665930 +-# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +-# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +-# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +------BEGIN CERTIFICATE----- +-MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +-MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +-Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +-A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +-Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +-ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +-ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +-BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +-YyRIHN8wfdVoOw== +------END CERTIFICATE----- +- +-# Issuer: CN=Amazon Root CA 4 O=Amazon +-# Subject: CN=Amazon Root CA 4 O=Amazon +-# Label: "Amazon Root CA 4" +-# Serial: 143266989758080763974105200630763877849284878 +-# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +-# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +-# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +------BEGIN CERTIFICATE----- +-MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +-MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +-Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +-A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +-Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +-9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +-M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +-/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +-MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +-CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +-1KyLa2tJElMzrdfkviT8tQp21KW8EA== +------END CERTIFICATE----- +- +-# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +-# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +-# Label: "LuxTrust Global Root 2" +-# Serial: 59914338225734147123941058376788110305822489521 +-# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +-# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +-# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +------BEGIN CERTIFICATE----- +-MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL +-BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV +-BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw +-MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B +-LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN +-AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F +-ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem +-hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 +-EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn +-Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 +-zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ +-96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m +-j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g +-DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ +-8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j +-X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH +-hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB +-KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 +-Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT +-+Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL +-BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 +-BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO +-jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 +-loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c +-qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ +-2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ +-JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre +-zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf +-LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ +-x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 +-oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +------END CERTIFICATE----- +- +-# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +-# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +-# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +-# Serial: 1 +-# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +-# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +-# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +------BEGIN CERTIFICATE----- +-MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +-GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +-bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +-KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +-BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +-dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +-EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +-IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +-QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +-TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +-LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +-a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +-LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +-N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +-YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +-iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +-AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +-V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +-BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +-AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +-IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +-lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +-8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +-lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +------END CERTIFICATE----- +- +-# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +-# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +-# Label: "GDCA TrustAUTH R5 ROOT" +-# Serial: 9009899650740120186 +-# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +-# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +-# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +------BEGIN CERTIFICATE----- +-MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +-BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +-IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +-MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +-BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +-HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +-AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +-Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +-TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +-KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +-qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +-MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +-ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +-zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +-L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +-jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +-HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +-AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +-p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +-DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +-COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +-L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +-JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +-IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +-2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +-09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +-XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +-T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +-MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +------END CERTIFICATE----- +- +-# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +-# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +-# Label: "TrustCor RootCert CA-1" +-# Serial: 15752444095811006489 +-# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +-# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +-# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +------BEGIN CERTIFICATE----- +-MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +-VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +-MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +-cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +-IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +-pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +-IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +-A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +-cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +-CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +-RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +-seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +-9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +-EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +-hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +-DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +-ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +-/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +-ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +-yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +-L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +-zl/HHk484IkzlQsPpTLWPFp5LBk= +------END CERTIFICATE----- +- +-# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +-# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +-# Label: "TrustCor RootCert CA-2" +-# Serial: 2711694510199101698 +-# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +-# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +-# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +------BEGIN CERTIFICATE----- +-MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +-BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +-IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +-dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +-Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +-MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +-Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +-VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +-dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +-AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +-QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +-1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +-2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +-DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +-az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +-3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +-oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +-g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +-mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +-8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +-BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +-nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +-DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +-dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +-MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +-/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +-CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +-ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +-2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +-N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +-Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +-As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +-5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +-1uwJ +------END CERTIFICATE----- +- +-# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +-# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +-# Label: "TrustCor ECA-1" +-# Serial: 9548242946988625984 +-# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +-# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +-# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +------BEGIN CERTIFICATE----- +-MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +-VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +-MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +-cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +-IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +-BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +-IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +-dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +-RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +-3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +-BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +-3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +-owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +-wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +-ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +-BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +-MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +-civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +-AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +-hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +-soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +-WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +-tJ/X5g== +------END CERTIFICATE----- +- +-# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +-# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +-# Label: "SSL.com Root Certification Authority RSA" +-# Serial: 8875640296558310041 +-# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +-# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +-# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +------BEGIN CERTIFICATE----- +-MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +-BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +-DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +-Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +-OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +-dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +-bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +-AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +-xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +-qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +-C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +-6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +-/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +-YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +-JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +-US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +-ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm +-+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +-M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +-HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +-A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +-cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +-Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +-PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +-q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +-cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +-a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +-H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +-K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +-nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +-oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +-Ic2wBlX7Jz9TkHCpBB5XJ7k= +------END CERTIFICATE----- +- +-# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +-# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +-# Label: "SSL.com Root Certification Authority ECC" +-# Serial: 8495723813297216424 +-# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +-# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +-# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +------BEGIN CERTIFICATE----- +-MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +-VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +-U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +-aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +-WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +-b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +-b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +-BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +-7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +-CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +-EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +-VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +-kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +-gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +------END CERTIFICATE----- +- +-# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +-# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +-# Label: "SSL.com EV Root Certification Authority RSA R2" +-# Serial: 6248227494352943350 +-# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +-# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +-# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +------BEGIN CERTIFICATE----- +-MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +-BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +-CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +-dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +-MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +-A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +-DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +-M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +-OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +-4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +-HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +-aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +-b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +-Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +-PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +-pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +-UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +-MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +-HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +-9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +-s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +-Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +-cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +-79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +-/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +-ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +-Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +-QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +-w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +-S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +-mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +------END CERTIFICATE----- +- +-# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +-# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +-# Label: "SSL.com EV Root Certification Authority ECC" +-# Serial: 3182246526754555285 +-# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +-# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +-# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +------BEGIN CERTIFICATE----- +-MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +-VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +-U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +-Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +-NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +-dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +-bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +-AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +-VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +-WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +-MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +-5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +-ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +-h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +------END CERTIFICATE----- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/core.py b/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/core.py +deleted file mode 100644 +index eab9d1d..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/certifi/core.py ++++ /dev/null +@@ -1,37 +0,0 @@ +-#!/usr/bin/env python +-# -*- coding: utf-8 -*- +- +-""" +-certifi.py +-~~~~~~~~~~ +- +-This module returns the installation location of cacert.pem. +-""" +-import os +-import warnings +- +- +-class DeprecatedBundleWarning(DeprecationWarning): +- """ +- The weak security bundle is being deprecated. Please bother your service +- provider to get them to stop using cross-signed roots. +- """ +- +- +-def where(): +- f = os.path.dirname(__file__) +- +- return os.path.join(f, 'cacert.pem') +- +- +-def old_where(): +- warnings.warn( +- "The weak security bundle has been removed. certifi.old_where() is now an alias " +- "of certifi.where(). Please update your code to use certifi.where() instead. " +- "certifi.old_where() will be removed in 2018.", +- DeprecatedBundleWarning +- ) +- return where() +- +-if __name__ == '__main__': +- print(where()) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/__init__.py +deleted file mode 100644 +index 0f9f820..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/__init__.py ++++ /dev/null +@@ -1,39 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +- +-from .compat import PY2, PY3 +-from .universaldetector import UniversalDetector +-from .version import __version__, VERSION +- +- +-def detect(byte_str): +- """ +- Detect the encoding of the given byte string. +- +- :param byte_str: The byte sequence to examine. +- :type byte_str: ``bytes`` or ``bytearray`` +- """ +- if not isinstance(byte_str, bytearray): +- if not isinstance(byte_str, bytes): +- raise TypeError('Expected object of type bytes or bytearray, got: ' +- '{0}'.format(type(byte_str))) +- else: +- byte_str = bytearray(byte_str) +- detector = UniversalDetector() +- detector.feed(byte_str) +- return detector.close() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/big5freq.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/big5freq.py +deleted file mode 100644 +index 38f3251..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/big5freq.py ++++ /dev/null +@@ -1,386 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# Big5 frequency table +-# by Taiwan's Mandarin Promotion Council +-# +-# +-# 128 --> 0.42261 +-# 256 --> 0.57851 +-# 512 --> 0.74851 +-# 1024 --> 0.89384 +-# 2048 --> 0.97583 +-# +-# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +-# Random Distribution Ration = 512/(5401-512)=0.105 +-# +-# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR +- +-BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 +- +-#Char to FreqOrder table +-BIG5_TABLE_SIZE = 5376 +- +-BIG5_CHAR_TO_FREQ_ORDER = ( +- 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +-3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +-1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 +- 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +-3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +-4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +-5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 +- 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 +- 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 +- 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +-2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +-1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +-3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 +- 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +-1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +-3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +-2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 +- 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +-3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +-1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +-5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 +- 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +-5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +-1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 +- 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 +- 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +-3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +-3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 +- 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +-2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +-2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 +- 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 +- 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +-3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +-1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +-1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +-1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +-2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 +- 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +-4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +-1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +-5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +-2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 +- 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 +- 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 +- 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 +- 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +-5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 +- 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +-1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 +- 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 +- 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +-5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +-1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 +- 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +-3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +-4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +-3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 +- 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 +- 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +-1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +-4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +-3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +-3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +-2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +-5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +-3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +-5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +-1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +-2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +-1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 +- 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +-1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +-4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +-3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 +- 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 +- 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 +- 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +-2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +-5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +-1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +-2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +-1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +-1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +-5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +-5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +-5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +-3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +-4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +-4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +-2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +-5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +-3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 +- 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +-5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +-5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +-1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +-2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +-3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +-4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +-5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +-3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +-4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +-1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +-1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +-4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +-1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 +- 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +-1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +-1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +-3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 +- 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +-5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +-2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +-1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +-1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +-5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 +- 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +-4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 +- 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +-2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 +- 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +-1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +-1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 +- 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +-4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +-4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +-1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +-3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +-5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +-5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +-1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +-2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +-1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +-3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +-2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +-3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +-2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +-4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +-4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +-3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 +- 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +-3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 +- 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +-3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +-4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +-3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +-1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +-5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 +- 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +-5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +-1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 +- 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +-4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +-4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 +- 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +-2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +-2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +-3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +-1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +-4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +-2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +-1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +-1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +-2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +-3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +-1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +-5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +-1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +-4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +-1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 +- 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +-1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +-4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +-4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +-2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +-1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +-4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 +- 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +-5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +-2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +-3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +-4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 +- 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +-5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +-5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +-1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +-4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +-4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +-2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +-3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +-3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +-2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +-1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +-4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +-3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +-3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +-2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +-4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +-5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +-3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +-2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +-3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +-1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +-2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +-3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +-4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +-2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +-2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +-5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +-1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +-2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +-1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +-3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +-4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +-2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +-3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +-3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +-2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +-4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +-2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +-3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +-4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +-5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +-3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 +- 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +-1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +-4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +-1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +-4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +-5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 +- 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +-5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +-5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +-2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +-3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +-2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +-2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 +- 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +-1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +-4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +-3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +-3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 +- 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +-2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 +- 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +-2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +-4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +-1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +-4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +-1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +-3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 +- 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +-3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +-5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +-5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +-3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +-3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +-1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +-2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +-5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +-1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +-1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +-3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 +- 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +-1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +-4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +-5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +-2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +-3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 +- 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +-1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +-2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +-2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +-5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +-5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +-5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +-2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +-2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +-1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +-4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +-3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +-3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +-4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +-4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +-2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +-2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +-5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +-4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +-5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +-4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 +- 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 +- 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +-1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +-3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +-4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +-1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +-5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +-2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +-2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +-3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +-5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +-1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +-3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +-5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +-1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +-5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +-2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +-3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +-2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +-3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +-3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +-3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +-4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 +- 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +-2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +-4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +-3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +-5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +-1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +-5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 +- 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +-1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 +- 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +-4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +-1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +-4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +-1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 +- 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +-3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +-4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +-5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 +- 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +-3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 +- 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +-2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +-) +- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/big5prober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/big5prober.py +deleted file mode 100644 +index 98f9970..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/big5prober.py ++++ /dev/null +@@ -1,47 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .mbcharsetprober import MultiByteCharSetProber +-from .codingstatemachine import CodingStateMachine +-from .chardistribution import Big5DistributionAnalysis +-from .mbcssm import BIG5_SM_MODEL +- +- +-class Big5Prober(MultiByteCharSetProber): +- def __init__(self): +- super(Big5Prober, self).__init__() +- self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) +- self.distribution_analyzer = Big5DistributionAnalysis() +- self.reset() +- +- @property +- def charset_name(self): +- return "Big5" +- +- @property +- def language(self): +- return "Chinese" +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/chardistribution.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/chardistribution.py +deleted file mode 100644 +index c0395f4..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/chardistribution.py ++++ /dev/null +@@ -1,233 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, +- EUCTW_TYPICAL_DISTRIBUTION_RATIO) +-from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, +- EUCKR_TYPICAL_DISTRIBUTION_RATIO) +-from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, +- GB2312_TYPICAL_DISTRIBUTION_RATIO) +-from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, +- BIG5_TYPICAL_DISTRIBUTION_RATIO) +-from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, +- JIS_TYPICAL_DISTRIBUTION_RATIO) +- +- +-class CharDistributionAnalysis(object): +- ENOUGH_DATA_THRESHOLD = 1024 +- SURE_YES = 0.99 +- SURE_NO = 0.01 +- MINIMUM_DATA_THRESHOLD = 3 +- +- def __init__(self): +- # Mapping table to get frequency order from char order (get from +- # GetOrder()) +- self._char_to_freq_order = None +- self._table_size = None # Size of above table +- # This is a constant value which varies from language to language, +- # used in calculating confidence. See +- # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html +- # for further detail. +- self.typical_distribution_ratio = None +- self._done = None +- self._total_chars = None +- self._freq_chars = None +- self.reset() +- +- def reset(self): +- """reset analyser, clear any state""" +- # If this flag is set to True, detection is done and conclusion has +- # been made +- self._done = False +- self._total_chars = 0 # Total characters encountered +- # The number of characters whose frequency order is less than 512 +- self._freq_chars = 0 +- +- def feed(self, char, char_len): +- """feed a character with known length""" +- if char_len == 2: +- # we only care about 2-bytes character in our distribution analysis +- order = self.get_order(char) +- else: +- order = -1 +- if order >= 0: +- self._total_chars += 1 +- # order is valid +- if order < self._table_size: +- if 512 > self._char_to_freq_order[order]: +- self._freq_chars += 1 +- +- def get_confidence(self): +- """return confidence based on existing data""" +- # if we didn't receive any character in our consideration range, +- # return negative answer +- if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: +- return self.SURE_NO +- +- if self._total_chars != self._freq_chars: +- r = (self._freq_chars / ((self._total_chars - self._freq_chars) +- * self.typical_distribution_ratio)) +- if r < self.SURE_YES: +- return r +- +- # normalize confidence (we don't want to be 100% sure) +- return self.SURE_YES +- +- def got_enough_data(self): +- # It is not necessary to receive all data to draw conclusion. +- # For charset detection, certain amount of data is enough +- return self._total_chars > self.ENOUGH_DATA_THRESHOLD +- +- def get_order(self, byte_str): +- # We do not handle characters based on the original encoding string, +- # but convert this encoding string to a number, here called order. +- # This allows multiple encodings of a language to share one frequency +- # table. +- return -1 +- +- +-class EUCTWDistributionAnalysis(CharDistributionAnalysis): +- def __init__(self): +- super(EUCTWDistributionAnalysis, self).__init__() +- self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER +- self._table_size = EUCTW_TABLE_SIZE +- self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO +- +- def get_order(self, byte_str): +- # for euc-TW encoding, we are interested +- # first byte range: 0xc4 -- 0xfe +- # second byte range: 0xa1 -- 0xfe +- # no validation needed here. State machine has done that +- first_char = byte_str[0] +- if first_char >= 0xC4: +- return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 +- else: +- return -1 +- +- +-class EUCKRDistributionAnalysis(CharDistributionAnalysis): +- def __init__(self): +- super(EUCKRDistributionAnalysis, self).__init__() +- self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER +- self._table_size = EUCKR_TABLE_SIZE +- self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO +- +- def get_order(self, byte_str): +- # for euc-KR encoding, we are interested +- # first byte range: 0xb0 -- 0xfe +- # second byte range: 0xa1 -- 0xfe +- # no validation needed here. State machine has done that +- first_char = byte_str[0] +- if first_char >= 0xB0: +- return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 +- else: +- return -1 +- +- +-class GB2312DistributionAnalysis(CharDistributionAnalysis): +- def __init__(self): +- super(GB2312DistributionAnalysis, self).__init__() +- self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER +- self._table_size = GB2312_TABLE_SIZE +- self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO +- +- def get_order(self, byte_str): +- # for GB2312 encoding, we are interested +- # first byte range: 0xb0 -- 0xfe +- # second byte range: 0xa1 -- 0xfe +- # no validation needed here. State machine has done that +- first_char, second_char = byte_str[0], byte_str[1] +- if (first_char >= 0xB0) and (second_char >= 0xA1): +- return 94 * (first_char - 0xB0) + second_char - 0xA1 +- else: +- return -1 +- +- +-class Big5DistributionAnalysis(CharDistributionAnalysis): +- def __init__(self): +- super(Big5DistributionAnalysis, self).__init__() +- self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER +- self._table_size = BIG5_TABLE_SIZE +- self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO +- +- def get_order(self, byte_str): +- # for big5 encoding, we are interested +- # first byte range: 0xa4 -- 0xfe +- # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe +- # no validation needed here. State machine has done that +- first_char, second_char = byte_str[0], byte_str[1] +- if first_char >= 0xA4: +- if second_char >= 0xA1: +- return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 +- else: +- return 157 * (first_char - 0xA4) + second_char - 0x40 +- else: +- return -1 +- +- +-class SJISDistributionAnalysis(CharDistributionAnalysis): +- def __init__(self): +- super(SJISDistributionAnalysis, self).__init__() +- self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER +- self._table_size = JIS_TABLE_SIZE +- self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO +- +- def get_order(self, byte_str): +- # for sjis encoding, we are interested +- # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe +- # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe +- # no validation needed here. State machine has done that +- first_char, second_char = byte_str[0], byte_str[1] +- if (first_char >= 0x81) and (first_char <= 0x9F): +- order = 188 * (first_char - 0x81) +- elif (first_char >= 0xE0) and (first_char <= 0xEF): +- order = 188 * (first_char - 0xE0 + 31) +- else: +- return -1 +- order = order + second_char - 0x40 +- if second_char > 0x7F: +- order = -1 +- return order +- +- +-class EUCJPDistributionAnalysis(CharDistributionAnalysis): +- def __init__(self): +- super(EUCJPDistributionAnalysis, self).__init__() +- self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER +- self._table_size = JIS_TABLE_SIZE +- self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO +- +- def get_order(self, byte_str): +- # for euc-JP encoding, we are interested +- # first byte range: 0xa0 -- 0xfe +- # second byte range: 0xa1 -- 0xfe +- # no validation needed here. State machine has done that +- char = byte_str[0] +- if char >= 0xA0: +- return 94 * (char - 0xA1) + byte_str[1] - 0xa1 +- else: +- return -1 +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/charsetgroupprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/charsetgroupprober.py +deleted file mode 100644 +index 8b3738e..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/charsetgroupprober.py ++++ /dev/null +@@ -1,106 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .enums import ProbingState +-from .charsetprober import CharSetProber +- +- +-class CharSetGroupProber(CharSetProber): +- def __init__(self, lang_filter=None): +- super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) +- self._active_num = 0 +- self.probers = [] +- self._best_guess_prober = None +- +- def reset(self): +- super(CharSetGroupProber, self).reset() +- self._active_num = 0 +- for prober in self.probers: +- if prober: +- prober.reset() +- prober.active = True +- self._active_num += 1 +- self._best_guess_prober = None +- +- @property +- def charset_name(self): +- if not self._best_guess_prober: +- self.get_confidence() +- if not self._best_guess_prober: +- return None +- return self._best_guess_prober.charset_name +- +- @property +- def language(self): +- if not self._best_guess_prober: +- self.get_confidence() +- if not self._best_guess_prober: +- return None +- return self._best_guess_prober.language +- +- def feed(self, byte_str): +- for prober in self.probers: +- if not prober: +- continue +- if not prober.active: +- continue +- state = prober.feed(byte_str) +- if not state: +- continue +- if state == ProbingState.FOUND_IT: +- self._best_guess_prober = prober +- return self.state +- elif state == ProbingState.NOT_ME: +- prober.active = False +- self._active_num -= 1 +- if self._active_num <= 0: +- self._state = ProbingState.NOT_ME +- return self.state +- return self.state +- +- def get_confidence(self): +- state = self.state +- if state == ProbingState.FOUND_IT: +- return 0.99 +- elif state == ProbingState.NOT_ME: +- return 0.01 +- best_conf = 0.0 +- self._best_guess_prober = None +- for prober in self.probers: +- if not prober: +- continue +- if not prober.active: +- self.logger.debug('%s not active', prober.charset_name) +- continue +- conf = prober.get_confidence() +- self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) +- if best_conf < conf: +- best_conf = conf +- self._best_guess_prober = prober +- if not self._best_guess_prober: +- return 0.0 +- return best_conf +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/charsetprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/charsetprober.py +deleted file mode 100644 +index eac4e59..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/charsetprober.py ++++ /dev/null +@@ -1,145 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Universal charset detector code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 2001 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# Shy Shalom - original C code +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-import logging +-import re +- +-from .enums import ProbingState +- +- +-class CharSetProber(object): +- +- SHORTCUT_THRESHOLD = 0.95 +- +- def __init__(self, lang_filter=None): +- self._state = None +- self.lang_filter = lang_filter +- self.logger = logging.getLogger(__name__) +- +- def reset(self): +- self._state = ProbingState.DETECTING +- +- @property +- def charset_name(self): +- return None +- +- def feed(self, buf): +- pass +- +- @property +- def state(self): +- return self._state +- +- def get_confidence(self): +- return 0.0 +- +- @staticmethod +- def filter_high_byte_only(buf): +- buf = re.sub(b'([\x00-\x7F])+', b' ', buf) +- return buf +- +- @staticmethod +- def filter_international_words(buf): +- """ +- We define three types of bytes: +- alphabet: english alphabets [a-zA-Z] +- international: international characters [\x80-\xFF] +- marker: everything else [^a-zA-Z\x80-\xFF] +- +- The input buffer can be thought to contain a series of words delimited +- by markers. This function works to filter all words that contain at +- least one international character. All contiguous sequences of markers +- are replaced by a single space ascii character. +- +- This filter applies to all scripts which do not use English characters. +- """ +- filtered = bytearray() +- +- # This regex expression filters out only words that have at-least one +- # international character. The word may include one marker character at +- # the end. +- words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', +- buf) +- +- for word in words: +- filtered.extend(word[:-1]) +- +- # If the last character in the word is a marker, replace it with a +- # space as markers shouldn't affect our analysis (they are used +- # similarly across all languages and may thus have similar +- # frequencies). +- last_char = word[-1:] +- if not last_char.isalpha() and last_char < b'\x80': +- last_char = b' ' +- filtered.extend(last_char) +- +- return filtered +- +- @staticmethod +- def filter_with_english_letters(buf): +- """ +- Returns a copy of ``buf`` that retains only the sequences of English +- alphabet and high byte characters that are not between <> characters. +- Also retains English alphabet and high byte characters immediately +- before occurrences of >. +- +- This filter can be applied to all scripts which contain both English +- characters and extended ASCII characters, but is currently only used by +- ``Latin1Prober``. +- """ +- filtered = bytearray() +- in_tag = False +- prev = 0 +- +- for curr in range(len(buf)): +- # Slice here to get bytes instead of an int with Python 3 +- buf_char = buf[curr:curr + 1] +- # Check if we're coming out of or entering an HTML tag +- if buf_char == b'>': +- in_tag = False +- elif buf_char == b'<': +- in_tag = True +- +- # If current character is not extended-ASCII and not alphabetic... +- if buf_char < b'\x80' and not buf_char.isalpha(): +- # ...and we're not in a tag +- if curr > prev and not in_tag: +- # Keep everything after last non-extended-ASCII, +- # non-alphabetic character +- filtered.extend(buf[prev:curr]) +- # Output a space to delimit stretch we kept +- filtered.extend(b' ') +- prev = curr + 1 +- +- # If we're not in a tag... +- if not in_tag: +- # Keep everything after last non-extended-ASCII, non-alphabetic +- # character +- filtered.extend(buf[prev:]) +- +- return filtered +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/cli/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/cli/__init__.py +deleted file mode 100644 +index 8b13789..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/cli/__init__.py ++++ /dev/null +@@ -1 +0,0 @@ +- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/cli/chardetect.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/cli/chardetect.py +deleted file mode 100644 +index f0a4cc5..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/cli/chardetect.py ++++ /dev/null +@@ -1,85 +0,0 @@ +-#!/usr/bin/env python +-""" +-Script which takes one or more file paths and reports on their detected +-encodings +- +-Example:: +- +- % chardetect somefile someotherfile +- somefile: windows-1252 with confidence 0.5 +- someotherfile: ascii with confidence 1.0 +- +-If no paths are provided, it takes its input from stdin. +- +-""" +- +-from __future__ import absolute_import, print_function, unicode_literals +- +-import argparse +-import sys +- +-from chardet import __version__ +-from chardet.compat import PY2 +-from chardet.universaldetector import UniversalDetector +- +- +-def description_of(lines, name='stdin'): +- """ +- Return a string describing the probable encoding of a file or +- list of strings. +- +- :param lines: The lines to get the encoding of. +- :type lines: Iterable of bytes +- :param name: Name of file or collection of lines +- :type name: str +- """ +- u = UniversalDetector() +- for line in lines: +- line = bytearray(line) +- u.feed(line) +- # shortcut out of the loop to save reading further - particularly useful if we read a BOM. +- if u.done: +- break +- u.close() +- result = u.result +- if PY2: +- name = name.decode(sys.getfilesystemencoding(), 'ignore') +- if result['encoding']: +- return '{0}: {1} with confidence {2}'.format(name, result['encoding'], +- result['confidence']) +- else: +- return '{0}: no result'.format(name) +- +- +-def main(argv=None): +- """ +- Handles command line arguments and gets things started. +- +- :param argv: List of arguments, as if specified on the command-line. +- If None, ``sys.argv[1:]`` is used instead. +- :type argv: list of str +- """ +- # Get command line arguments +- parser = argparse.ArgumentParser( +- description="Takes one or more file paths and reports their detected \ +- encodings") +- parser.add_argument('input', +- help='File whose encoding we would like to determine. \ +- (default: stdin)', +- type=argparse.FileType('rb'), nargs='*', +- default=[sys.stdin if PY2 else sys.stdin.buffer]) +- parser.add_argument('--version', action='version', +- version='%(prog)s {0}'.format(__version__)) +- args = parser.parse_args(argv) +- +- for f in args.input: +- if f.isatty(): +- print("You are running chardetect interactively. Press " + +- "CTRL-D twice at the start of a blank line to signal the " + +- "end of your input. If you want help, run chardetect " + +- "--help\n", file=sys.stderr) +- print(description_of(f, f.name)) +- +- +-if __name__ == '__main__': +- main() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/codingstatemachine.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/codingstatemachine.py +deleted file mode 100644 +index 68fba44..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/codingstatemachine.py ++++ /dev/null +@@ -1,88 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-import logging +- +-from .enums import MachineState +- +- +-class CodingStateMachine(object): +- """ +- A state machine to verify a byte sequence for a particular encoding. For +- each byte the detector receives, it will feed that byte to every active +- state machine available, one byte at a time. The state machine changes its +- state based on its previous state and the byte it receives. There are 3 +- states in a state machine that are of interest to an auto-detector: +- +- START state: This is the state to start with, or a legal byte sequence +- (i.e. a valid code point) for character has been identified. +- +- ME state: This indicates that the state machine identified a byte sequence +- that is specific to the charset it is designed for and that +- there is no other possible encoding which can contain this byte +- sequence. This will to lead to an immediate positive answer for +- the detector. +- +- ERROR state: This indicates the state machine identified an illegal byte +- sequence for that encoding. This will lead to an immediate +- negative answer for this encoding. Detector will exclude this +- encoding from consideration from here on. +- """ +- def __init__(self, sm): +- self._model = sm +- self._curr_byte_pos = 0 +- self._curr_char_len = 0 +- self._curr_state = None +- self.logger = logging.getLogger(__name__) +- self.reset() +- +- def reset(self): +- self._curr_state = MachineState.START +- +- def next_state(self, c): +- # for each byte we get its class +- # if it is first byte, we also get byte length +- byte_class = self._model['class_table'][c] +- if self._curr_state == MachineState.START: +- self._curr_byte_pos = 0 +- self._curr_char_len = self._model['char_len_table'][byte_class] +- # from byte's class and state_table, we get its next state +- curr_state = (self._curr_state * self._model['class_factor'] +- + byte_class) +- self._curr_state = self._model['state_table'][curr_state] +- self._curr_byte_pos += 1 +- return self._curr_state +- +- def get_current_charlen(self): +- return self._curr_char_len +- +- def get_coding_state_machine(self): +- return self._model['name'] +- +- @property +- def language(self): +- return self._model['language'] +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/compat.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/compat.py +deleted file mode 100644 +index ddd7468..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/compat.py ++++ /dev/null +@@ -1,34 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# Contributor(s): +-# Dan Blanchard +-# Ian Cordasco +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-import sys +- +- +-if sys.version_info < (3, 0): +- PY2 = True +- PY3 = False +- base_str = (str, unicode) +- text_type = unicode +-else: +- PY2 = False +- PY3 = True +- base_str = (bytes, str) +- text_type = str +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/cp949prober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/cp949prober.py +deleted file mode 100644 +index efd793a..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/cp949prober.py ++++ /dev/null +@@ -1,49 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .chardistribution import EUCKRDistributionAnalysis +-from .codingstatemachine import CodingStateMachine +-from .mbcharsetprober import MultiByteCharSetProber +-from .mbcssm import CP949_SM_MODEL +- +- +-class CP949Prober(MultiByteCharSetProber): +- def __init__(self): +- super(CP949Prober, self).__init__() +- self.coding_sm = CodingStateMachine(CP949_SM_MODEL) +- # NOTE: CP949 is a superset of EUC-KR, so the distribution should be +- # not different. +- self.distribution_analyzer = EUCKRDistributionAnalysis() +- self.reset() +- +- @property +- def charset_name(self): +- return "CP949" +- +- @property +- def language(self): +- return "Korean" +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/enums.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/enums.py +deleted file mode 100644 +index 0451207..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/enums.py ++++ /dev/null +@@ -1,76 +0,0 @@ +-""" +-All of the Enums that are used throughout the chardet package. +- +-:author: Dan Blanchard (dan.blanchard@gmail.com) +-""" +- +- +-class InputState(object): +- """ +- This enum represents the different states a universal detector can be in. +- """ +- PURE_ASCII = 0 +- ESC_ASCII = 1 +- HIGH_BYTE = 2 +- +- +-class LanguageFilter(object): +- """ +- This enum represents the different language filters we can apply to a +- ``UniversalDetector``. +- """ +- CHINESE_SIMPLIFIED = 0x01 +- CHINESE_TRADITIONAL = 0x02 +- JAPANESE = 0x04 +- KOREAN = 0x08 +- NON_CJK = 0x10 +- ALL = 0x1F +- CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL +- CJK = CHINESE | JAPANESE | KOREAN +- +- +-class ProbingState(object): +- """ +- This enum represents the different states a prober can be in. +- """ +- DETECTING = 0 +- FOUND_IT = 1 +- NOT_ME = 2 +- +- +-class MachineState(object): +- """ +- This enum represents the different states a state machine can be in. +- """ +- START = 0 +- ERROR = 1 +- ITS_ME = 2 +- +- +-class SequenceLikelihood(object): +- """ +- This enum represents the likelihood of a character following the previous one. +- """ +- NEGATIVE = 0 +- UNLIKELY = 1 +- LIKELY = 2 +- POSITIVE = 3 +- +- @classmethod +- def get_num_categories(cls): +- """:returns: The number of likelihood categories in the enum.""" +- return 4 +- +- +-class CharacterCategory(object): +- """ +- This enum represents the different categories language models for +- ``SingleByteCharsetProber`` put characters into. +- +- Anything less than CONTROL is considered a letter. +- """ +- UNDEFINED = 255 +- LINE_BREAK = 254 +- SYMBOL = 253 +- DIGIT = 252 +- CONTROL = 251 +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/escprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/escprober.py +deleted file mode 100644 +index c70493f..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/escprober.py ++++ /dev/null +@@ -1,101 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .charsetprober import CharSetProber +-from .codingstatemachine import CodingStateMachine +-from .enums import LanguageFilter, ProbingState, MachineState +-from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, +- ISO2022KR_SM_MODEL) +- +- +-class EscCharSetProber(CharSetProber): +- """ +- This CharSetProber uses a "code scheme" approach for detecting encodings, +- whereby easily recognizable escape or shift sequences are relied on to +- identify these encodings. +- """ +- +- def __init__(self, lang_filter=None): +- super(EscCharSetProber, self).__init__(lang_filter=lang_filter) +- self.coding_sm = [] +- if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: +- self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) +- self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) +- if self.lang_filter & LanguageFilter.JAPANESE: +- self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) +- if self.lang_filter & LanguageFilter.KOREAN: +- self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) +- self.active_sm_count = None +- self._detected_charset = None +- self._detected_language = None +- self._state = None +- self.reset() +- +- def reset(self): +- super(EscCharSetProber, self).reset() +- for coding_sm in self.coding_sm: +- if not coding_sm: +- continue +- coding_sm.active = True +- coding_sm.reset() +- self.active_sm_count = len(self.coding_sm) +- self._detected_charset = None +- self._detected_language = None +- +- @property +- def charset_name(self): +- return self._detected_charset +- +- @property +- def language(self): +- return self._detected_language +- +- def get_confidence(self): +- if self._detected_charset: +- return 0.99 +- else: +- return 0.00 +- +- def feed(self, byte_str): +- for c in byte_str: +- for coding_sm in self.coding_sm: +- if not coding_sm or not coding_sm.active: +- continue +- coding_state = coding_sm.next_state(c) +- if coding_state == MachineState.ERROR: +- coding_sm.active = False +- self.active_sm_count -= 1 +- if self.active_sm_count <= 0: +- self._state = ProbingState.NOT_ME +- return self.state +- elif coding_state == MachineState.ITS_ME: +- self._state = ProbingState.FOUND_IT +- self._detected_charset = coding_sm.get_coding_state_machine() +- self._detected_language = coding_sm.language +- return self.state +- +- return self.state +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/escsm.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/escsm.py +deleted file mode 100644 +index 0069523..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/escsm.py ++++ /dev/null +@@ -1,246 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .enums import MachineState +- +-HZ_CLS = ( +-1,0,0,0,0,0,0,0, # 00 - 07 +-0,0,0,0,0,0,0,0, # 08 - 0f +-0,0,0,0,0,0,0,0, # 10 - 17 +-0,0,0,1,0,0,0,0, # 18 - 1f +-0,0,0,0,0,0,0,0, # 20 - 27 +-0,0,0,0,0,0,0,0, # 28 - 2f +-0,0,0,0,0,0,0,0, # 30 - 37 +-0,0,0,0,0,0,0,0, # 38 - 3f +-0,0,0,0,0,0,0,0, # 40 - 47 +-0,0,0,0,0,0,0,0, # 48 - 4f +-0,0,0,0,0,0,0,0, # 50 - 57 +-0,0,0,0,0,0,0,0, # 58 - 5f +-0,0,0,0,0,0,0,0, # 60 - 67 +-0,0,0,0,0,0,0,0, # 68 - 6f +-0,0,0,0,0,0,0,0, # 70 - 77 +-0,0,0,4,0,5,2,0, # 78 - 7f +-1,1,1,1,1,1,1,1, # 80 - 87 +-1,1,1,1,1,1,1,1, # 88 - 8f +-1,1,1,1,1,1,1,1, # 90 - 97 +-1,1,1,1,1,1,1,1, # 98 - 9f +-1,1,1,1,1,1,1,1, # a0 - a7 +-1,1,1,1,1,1,1,1, # a8 - af +-1,1,1,1,1,1,1,1, # b0 - b7 +-1,1,1,1,1,1,1,1, # b8 - bf +-1,1,1,1,1,1,1,1, # c0 - c7 +-1,1,1,1,1,1,1,1, # c8 - cf +-1,1,1,1,1,1,1,1, # d0 - d7 +-1,1,1,1,1,1,1,1, # d8 - df +-1,1,1,1,1,1,1,1, # e0 - e7 +-1,1,1,1,1,1,1,1, # e8 - ef +-1,1,1,1,1,1,1,1, # f0 - f7 +-1,1,1,1,1,1,1,1, # f8 - ff +-) +- +-HZ_ST = ( +-MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 +- 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f +- 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 +- 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +-) +- +-HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) +- +-HZ_SM_MODEL = {'class_table': HZ_CLS, +- 'class_factor': 6, +- 'state_table': HZ_ST, +- 'char_len_table': HZ_CHAR_LEN_TABLE, +- 'name': "HZ-GB-2312", +- 'language': 'Chinese'} +- +-ISO2022CN_CLS = ( +-2,0,0,0,0,0,0,0, # 00 - 07 +-0,0,0,0,0,0,0,0, # 08 - 0f +-0,0,0,0,0,0,0,0, # 10 - 17 +-0,0,0,1,0,0,0,0, # 18 - 1f +-0,0,0,0,0,0,0,0, # 20 - 27 +-0,3,0,0,0,0,0,0, # 28 - 2f +-0,0,0,0,0,0,0,0, # 30 - 37 +-0,0,0,0,0,0,0,0, # 38 - 3f +-0,0,0,4,0,0,0,0, # 40 - 47 +-0,0,0,0,0,0,0,0, # 48 - 4f +-0,0,0,0,0,0,0,0, # 50 - 57 +-0,0,0,0,0,0,0,0, # 58 - 5f +-0,0,0,0,0,0,0,0, # 60 - 67 +-0,0,0,0,0,0,0,0, # 68 - 6f +-0,0,0,0,0,0,0,0, # 70 - 77 +-0,0,0,0,0,0,0,0, # 78 - 7f +-2,2,2,2,2,2,2,2, # 80 - 87 +-2,2,2,2,2,2,2,2, # 88 - 8f +-2,2,2,2,2,2,2,2, # 90 - 97 +-2,2,2,2,2,2,2,2, # 98 - 9f +-2,2,2,2,2,2,2,2, # a0 - a7 +-2,2,2,2,2,2,2,2, # a8 - af +-2,2,2,2,2,2,2,2, # b0 - b7 +-2,2,2,2,2,2,2,2, # b8 - bf +-2,2,2,2,2,2,2,2, # c0 - c7 +-2,2,2,2,2,2,2,2, # c8 - cf +-2,2,2,2,2,2,2,2, # d0 - d7 +-2,2,2,2,2,2,2,2, # d8 - df +-2,2,2,2,2,2,2,2, # e0 - e7 +-2,2,2,2,2,2,2,2, # e8 - ef +-2,2,2,2,2,2,2,2, # f0 - f7 +-2,2,2,2,2,2,2,2, # f8 - ff +-) +- +-ISO2022CN_ST = ( +-MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +-MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +-MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 +- 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +-) +- +-ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) +- +-ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, +- 'class_factor': 9, +- 'state_table': ISO2022CN_ST, +- 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, +- 'name': "ISO-2022-CN", +- 'language': 'Chinese'} +- +-ISO2022JP_CLS = ( +-2,0,0,0,0,0,0,0, # 00 - 07 +-0,0,0,0,0,0,2,2, # 08 - 0f +-0,0,0,0,0,0,0,0, # 10 - 17 +-0,0,0,1,0,0,0,0, # 18 - 1f +-0,0,0,0,7,0,0,0, # 20 - 27 +-3,0,0,0,0,0,0,0, # 28 - 2f +-0,0,0,0,0,0,0,0, # 30 - 37 +-0,0,0,0,0,0,0,0, # 38 - 3f +-6,0,4,0,8,0,0,0, # 40 - 47 +-0,9,5,0,0,0,0,0, # 48 - 4f +-0,0,0,0,0,0,0,0, # 50 - 57 +-0,0,0,0,0,0,0,0, # 58 - 5f +-0,0,0,0,0,0,0,0, # 60 - 67 +-0,0,0,0,0,0,0,0, # 68 - 6f +-0,0,0,0,0,0,0,0, # 70 - 77 +-0,0,0,0,0,0,0,0, # 78 - 7f +-2,2,2,2,2,2,2,2, # 80 - 87 +-2,2,2,2,2,2,2,2, # 88 - 8f +-2,2,2,2,2,2,2,2, # 90 - 97 +-2,2,2,2,2,2,2,2, # 98 - 9f +-2,2,2,2,2,2,2,2, # a0 - a7 +-2,2,2,2,2,2,2,2, # a8 - af +-2,2,2,2,2,2,2,2, # b0 - b7 +-2,2,2,2,2,2,2,2, # b8 - bf +-2,2,2,2,2,2,2,2, # c0 - c7 +-2,2,2,2,2,2,2,2, # c8 - cf +-2,2,2,2,2,2,2,2, # d0 - d7 +-2,2,2,2,2,2,2,2, # d8 - df +-2,2,2,2,2,2,2,2, # e0 - e7 +-2,2,2,2,2,2,2,2, # e8 - ef +-2,2,2,2,2,2,2,2, # f0 - f7 +-2,2,2,2,2,2,2,2, # f8 - ff +-) +- +-ISO2022JP_ST = ( +-MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +-MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +-MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +-) +- +-ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) +- +-ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, +- 'class_factor': 10, +- 'state_table': ISO2022JP_ST, +- 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, +- 'name': "ISO-2022-JP", +- 'language': 'Japanese'} +- +-ISO2022KR_CLS = ( +-2,0,0,0,0,0,0,0, # 00 - 07 +-0,0,0,0,0,0,0,0, # 08 - 0f +-0,0,0,0,0,0,0,0, # 10 - 17 +-0,0,0,1,0,0,0,0, # 18 - 1f +-0,0,0,0,3,0,0,0, # 20 - 27 +-0,4,0,0,0,0,0,0, # 28 - 2f +-0,0,0,0,0,0,0,0, # 30 - 37 +-0,0,0,0,0,0,0,0, # 38 - 3f +-0,0,0,5,0,0,0,0, # 40 - 47 +-0,0,0,0,0,0,0,0, # 48 - 4f +-0,0,0,0,0,0,0,0, # 50 - 57 +-0,0,0,0,0,0,0,0, # 58 - 5f +-0,0,0,0,0,0,0,0, # 60 - 67 +-0,0,0,0,0,0,0,0, # 68 - 6f +-0,0,0,0,0,0,0,0, # 70 - 77 +-0,0,0,0,0,0,0,0, # 78 - 7f +-2,2,2,2,2,2,2,2, # 80 - 87 +-2,2,2,2,2,2,2,2, # 88 - 8f +-2,2,2,2,2,2,2,2, # 90 - 97 +-2,2,2,2,2,2,2,2, # 98 - 9f +-2,2,2,2,2,2,2,2, # a0 - a7 +-2,2,2,2,2,2,2,2, # a8 - af +-2,2,2,2,2,2,2,2, # b0 - b7 +-2,2,2,2,2,2,2,2, # b8 - bf +-2,2,2,2,2,2,2,2, # c0 - c7 +-2,2,2,2,2,2,2,2, # c8 - cf +-2,2,2,2,2,2,2,2, # d0 - d7 +-2,2,2,2,2,2,2,2, # d8 - df +-2,2,2,2,2,2,2,2, # e0 - e7 +-2,2,2,2,2,2,2,2, # e8 - ef +-2,2,2,2,2,2,2,2, # f0 - f7 +-2,2,2,2,2,2,2,2, # f8 - ff +-) +- +-ISO2022KR_ST = ( +-MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +-) +- +-ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) +- +-ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, +- 'class_factor': 6, +- 'state_table': ISO2022KR_ST, +- 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, +- 'name': "ISO-2022-KR", +- 'language': 'Korean'} +- +- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/eucjpprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/eucjpprober.py +deleted file mode 100644 +index 20ce8f7..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/eucjpprober.py ++++ /dev/null +@@ -1,92 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .enums import ProbingState, MachineState +-from .mbcharsetprober import MultiByteCharSetProber +-from .codingstatemachine import CodingStateMachine +-from .chardistribution import EUCJPDistributionAnalysis +-from .jpcntx import EUCJPContextAnalysis +-from .mbcssm import EUCJP_SM_MODEL +- +- +-class EUCJPProber(MultiByteCharSetProber): +- def __init__(self): +- super(EUCJPProber, self).__init__() +- self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) +- self.distribution_analyzer = EUCJPDistributionAnalysis() +- self.context_analyzer = EUCJPContextAnalysis() +- self.reset() +- +- def reset(self): +- super(EUCJPProber, self).reset() +- self.context_analyzer.reset() +- +- @property +- def charset_name(self): +- return "EUC-JP" +- +- @property +- def language(self): +- return "Japanese" +- +- def feed(self, byte_str): +- for i in range(len(byte_str)): +- # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte +- coding_state = self.coding_sm.next_state(byte_str[i]) +- if coding_state == MachineState.ERROR: +- self.logger.debug('%s %s prober hit error at byte %s', +- self.charset_name, self.language, i) +- self._state = ProbingState.NOT_ME +- break +- elif coding_state == MachineState.ITS_ME: +- self._state = ProbingState.FOUND_IT +- break +- elif coding_state == MachineState.START: +- char_len = self.coding_sm.get_current_charlen() +- if i == 0: +- self._last_char[1] = byte_str[0] +- self.context_analyzer.feed(self._last_char, char_len) +- self.distribution_analyzer.feed(self._last_char, char_len) +- else: +- self.context_analyzer.feed(byte_str[i - 1:i + 1], +- char_len) +- self.distribution_analyzer.feed(byte_str[i - 1:i + 1], +- char_len) +- +- self._last_char[0] = byte_str[-1] +- +- if self.state == ProbingState.DETECTING: +- if (self.context_analyzer.got_enough_data() and +- (self.get_confidence() > self.SHORTCUT_THRESHOLD)): +- self._state = ProbingState.FOUND_IT +- +- return self.state +- +- def get_confidence(self): +- context_conf = self.context_analyzer.get_confidence() +- distrib_conf = self.distribution_analyzer.get_confidence() +- return max(context_conf, distrib_conf) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euckrfreq.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euckrfreq.py +deleted file mode 100644 +index b68078c..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euckrfreq.py ++++ /dev/null +@@ -1,195 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# Sampling from about 20M text materials include literature and computer technology +- +-# 128 --> 0.79 +-# 256 --> 0.92 +-# 512 --> 0.986 +-# 1024 --> 0.99944 +-# 2048 --> 0.99999 +-# +-# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +-# Random Distribution Ration = 512 / (2350-512) = 0.279. +-# +-# Typical Distribution Ratio +- +-EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 +- +-EUCKR_TABLE_SIZE = 2352 +- +-# Char to FreqOrder table , +-EUCKR_CHAR_TO_FREQ_ORDER = ( +- 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +-1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +-1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, +- 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, +- 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, +- 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +-1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, +- 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, +- 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +-1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +-1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +-1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +-1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +-1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, +- 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +-1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +-1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +-1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +-1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, +- 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +-1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, +- 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, +- 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +-1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, +- 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +-1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, +- 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, +- 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +-1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +-1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +-1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +-1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, +- 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +-1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, +- 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, +- 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +-1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +-1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +-1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +-1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +-1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +-1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, +- 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, +- 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, +- 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +-1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, +- 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +-1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, +- 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, +- 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +-2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, +- 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, +- 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +-2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +-2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +-2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, +- 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, +- 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +-2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, +- 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +-1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +-2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +-1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +-2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +-2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +-1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, +- 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +-2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +-2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, +- 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, +- 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +-2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +-1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +-2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +-2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +-2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +-2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +-2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +-2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +-1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +-2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +-2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +-2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +-2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +-2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +-1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +-1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +-2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +-1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +-2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +-1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, +- 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +-2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, +- 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +-2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, +- 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +-2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +-2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, +- 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +-2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +-1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, +- 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +-1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +-2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +-1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +-2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, +- 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +-2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +-1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +-2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +-1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +-2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +-1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, +- 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +-2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +-2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, +- 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, +- 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +-1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +-1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, +- 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +-2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +-2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, +- 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, +- 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, +- 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +-2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, +- 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, +- 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +-2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +-2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, +- 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +-2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +-1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, +- 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +-2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +-2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +-2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, +- 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, +- 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, +- 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +-2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +-2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +-2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +-1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +-2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, +- 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +-) +- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euckrprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euckrprober.py +deleted file mode 100644 +index 345a060..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euckrprober.py ++++ /dev/null +@@ -1,47 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .mbcharsetprober import MultiByteCharSetProber +-from .codingstatemachine import CodingStateMachine +-from .chardistribution import EUCKRDistributionAnalysis +-from .mbcssm import EUCKR_SM_MODEL +- +- +-class EUCKRProber(MultiByteCharSetProber): +- def __init__(self): +- super(EUCKRProber, self).__init__() +- self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) +- self.distribution_analyzer = EUCKRDistributionAnalysis() +- self.reset() +- +- @property +- def charset_name(self): +- return "EUC-KR" +- +- @property +- def language(self): +- return "Korean" +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euctwfreq.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euctwfreq.py +deleted file mode 100644 +index ed7a995..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euctwfreq.py ++++ /dev/null +@@ -1,387 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# EUCTW frequency table +-# Converted from big5 work +-# by Taiwan's Mandarin Promotion Council +-# +- +-# 128 --> 0.42261 +-# 256 --> 0.57851 +-# 512 --> 0.74851 +-# 1024 --> 0.89384 +-# 2048 --> 0.97583 +-# +-# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +-# Random Distribution Ration = 512/(5401-512)=0.105 +-# +-# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR +- +-EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 +- +-# Char to FreqOrder table , +-EUCTW_TABLE_SIZE = 5376 +- +-EUCTW_CHAR_TO_FREQ_ORDER = ( +- 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +-3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +-1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 +- 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +-3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +-4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +-7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 +- 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 +- 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 +- 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +-2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +-1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +-3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 +- 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +-1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +-3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +-2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 +- 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +-3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +-1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +-7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 +- 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +-7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +-1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 +- 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 +- 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +-3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +-3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 +- 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +-2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +-2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 +- 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 +- 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +-3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +-1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +-1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +-1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +-2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 +- 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +-4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +-1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +-7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +-2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 +- 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 +- 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 +- 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 +- 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +-7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 +- 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +-1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 +- 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 +- 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +-7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +-1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 +- 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +-3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +-4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +-3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 +- 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 +- 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +-1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +-4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +-3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +-3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +-2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +-7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +-3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +-7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +-1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +-2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +-1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 +- 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +-1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +-4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +-3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 +- 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 +- 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 +- 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +-2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +-7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +-1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +-2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +-1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +-1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +-7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +-7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +-7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +-3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +-4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +-1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +-7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +-2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +-7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +-3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +-3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +-7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +-2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +-7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 +- 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +-4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +-2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +-7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +-3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +-2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +-2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 +- 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +-2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +-1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +-1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +-2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +-1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +-7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +-7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +-2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +-4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +-1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +-7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 +- 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +-4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 +- 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +-2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 +- 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +-1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +-1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 +- 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +-3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +-3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +-1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +-3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +-7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +-7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +-1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +-2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +-1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +-3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +-2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +-3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +-2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +-4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +-4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +-3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 +- 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +-3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 +- 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +-3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +-3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +-3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +-1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +-7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 +- 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +-7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +-1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 +- 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +-4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +-3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 +- 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +-2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +-2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +-3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +-1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +-4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +-2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +-1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +-1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +-2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +-3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +-1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +-7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +-1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +-4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +-1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 +- 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +-1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +-3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +-3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +-2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +-1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +-4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 +- 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +-7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +-2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +-3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +-4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 +- 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +-7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +-7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +-1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +-4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +-3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +-2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +-3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +-3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +-2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +-1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +-4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +-3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +-3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +-2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +-4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +-7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +-3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +-2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +-3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +-1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +-2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +-3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +-4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +-2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +-2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +-7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +-1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +-2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +-1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +-3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +-4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +-2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +-3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +-3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +-2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +-4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +-2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +-3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +-4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +-7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +-3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 +- 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +-1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +-4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +-1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +-4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +-7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 +- 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +-7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +-2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +-1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +-1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +-3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 +- 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 +- 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 +- 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +-3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +-2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 +- 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +-7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +-1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +-3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +-7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +-1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +-7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +-4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +-1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +-2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +-2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +-4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 +- 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 +- 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +-3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +-3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +-1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +-2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +-7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +-1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +-1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +-3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 +- 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +-1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +-4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +-7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +-2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +-3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 +- 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +-1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +-2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +-2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +-7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +-7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +-7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +-2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +-2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +-1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +-4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +-3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +-3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +-4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +-4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +-2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +-2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +-7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +-4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +-7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +-2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +-1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +-3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +-4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +-2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 +- 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +-2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +-1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +-2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +-2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +-4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +-7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +-1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +-3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +-7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +-1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +-8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +-2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +-8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +-2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +-2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +-8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +-8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +-8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 +- 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +-8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +-4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +-3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +-8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +-1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +-8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 +- 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +-1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 +- 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +-4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +-1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +-4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +-1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 +- 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +-3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +-4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +-8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 +- 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +-3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 +- 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +-2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +-) +- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euctwprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euctwprober.py +deleted file mode 100644 +index 35669cc..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/euctwprober.py ++++ /dev/null +@@ -1,46 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .mbcharsetprober import MultiByteCharSetProber +-from .codingstatemachine import CodingStateMachine +-from .chardistribution import EUCTWDistributionAnalysis +-from .mbcssm import EUCTW_SM_MODEL +- +-class EUCTWProber(MultiByteCharSetProber): +- def __init__(self): +- super(EUCTWProber, self).__init__() +- self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) +- self.distribution_analyzer = EUCTWDistributionAnalysis() +- self.reset() +- +- @property +- def charset_name(self): +- return "EUC-TW" +- +- @property +- def language(self): +- return "Taiwan" +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/gb2312freq.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/gb2312freq.py +deleted file mode 100644 +index 697837b..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/gb2312freq.py ++++ /dev/null +@@ -1,283 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# GB2312 most frequently used character table +-# +-# Char to FreqOrder table , from hz6763 +- +-# 512 --> 0.79 -- 0.79 +-# 1024 --> 0.92 -- 0.13 +-# 2048 --> 0.98 -- 0.06 +-# 6768 --> 1.00 -- 0.02 +-# +-# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +-# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +-# +-# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR +- +-GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 +- +-GB2312_TABLE_SIZE = 3760 +- +-GB2312_CHAR_TO_FREQ_ORDER = ( +-1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +-2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +-2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, +- 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +-1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +-1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, +- 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +-1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +-2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +-3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, +- 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +-1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, +- 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +-2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, +- 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +-2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +-1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +-3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, +- 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +-1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, +- 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +-2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +-1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +-3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +-1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +-2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +-1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, +- 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +-3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +-3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, +- 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +-3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, +- 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +-1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +-3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +-2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +-1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, +- 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +-1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +-4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, +- 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +-3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +-3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, +- 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +-1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +-2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +-1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +-1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, +- 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +-3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +-3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +-4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, +- 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +-3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +-1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +-1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +-4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, +- 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, +- 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +-3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +-1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, +- 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +-1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +-2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, +- 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, +- 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, +- 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +-3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +-4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +-3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, +- 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +-2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +-2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +-2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, +- 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +-2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, +- 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, +- 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, +- 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +-3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +-2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +-2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +-1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, +- 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +-2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, +- 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, +- 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +-1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +-1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, +- 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, +- 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +-1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +-2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +-3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +-2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +-2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +-2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +-3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +-1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +-1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +-2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +-1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +-3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +-1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +-1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +-3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, +- 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +-2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +-1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +-4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +-1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +-1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +-3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +-1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, +- 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, +- 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +-1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, +- 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +-1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +-1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, +- 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +-3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +-4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +-3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +-2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +-2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +-1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +-3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +-2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +-1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +-1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, +- 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +-2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +-2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +-3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +-4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +-3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, +- 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +-3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +-2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +-1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, +- 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, +- 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +-3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +-4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +-2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +-1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +-1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, +- 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +-1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +-3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, +- 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, +- 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +-1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, +- 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +-1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, +- 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +-2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, +- 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +-2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +-2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +-1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +-1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +-2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, +- 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +-1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +-1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +-2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +-2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +-3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +-1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +-4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, +- 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, +- 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +-3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +-1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, +- 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +-3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +-1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +-4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +-1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +-2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +-1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, +- 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +-1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +-3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, +- 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +-2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, +- 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +-1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +-1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +-1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +-3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +-2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +-3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +-3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +-3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, +- 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +-2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, +- 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +-2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, +- 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +-1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, +- 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, +- 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +-1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +-3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +-3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +-1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +-1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +-3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +-2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +-2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +-1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +-3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, +- 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +-4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +-1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +-2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +-3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +-3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +-1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, +- 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, +- 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +-2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, +- 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +-1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, +- 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +-1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +-1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +-1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +-1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +-1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, +- 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, +- 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +-) +- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/gb2312prober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/gb2312prober.py +deleted file mode 100644 +index 8446d2d..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/gb2312prober.py ++++ /dev/null +@@ -1,46 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .mbcharsetprober import MultiByteCharSetProber +-from .codingstatemachine import CodingStateMachine +-from .chardistribution import GB2312DistributionAnalysis +-from .mbcssm import GB2312_SM_MODEL +- +-class GB2312Prober(MultiByteCharSetProber): +- def __init__(self): +- super(GB2312Prober, self).__init__() +- self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) +- self.distribution_analyzer = GB2312DistributionAnalysis() +- self.reset() +- +- @property +- def charset_name(self): +- return "GB2312" +- +- @property +- def language(self): +- return "Chinese" +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/hebrewprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/hebrewprober.py +deleted file mode 100644 +index b0e1bf4..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/hebrewprober.py ++++ /dev/null +@@ -1,292 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Universal charset detector code. +-# +-# The Initial Developer of the Original Code is +-# Shy Shalom +-# Portions created by the Initial Developer are Copyright (C) 2005 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .charsetprober import CharSetProber +-from .enums import ProbingState +- +-# This prober doesn't actually recognize a language or a charset. +-# It is a helper prober for the use of the Hebrew model probers +- +-### General ideas of the Hebrew charset recognition ### +-# +-# Four main charsets exist in Hebrew: +-# "ISO-8859-8" - Visual Hebrew +-# "windows-1255" - Logical Hebrew +-# "ISO-8859-8-I" - Logical Hebrew +-# "x-mac-hebrew" - ?? Logical Hebrew ?? +-# +-# Both "ISO" charsets use a completely identical set of code points, whereas +-# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +-# these code points. windows-1255 defines additional characters in the range +-# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +-# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +-# x-mac-hebrew defines similar additional code points but with a different +-# mapping. +-# +-# As far as an average Hebrew text with no diacritics is concerned, all four +-# charsets are identical with respect to code points. Meaning that for the +-# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +-# (including final letters). +-# +-# The dominant difference between these charsets is their directionality. +-# "Visual" directionality means that the text is ordered as if the renderer is +-# not aware of a BIDI rendering algorithm. The renderer sees the text and +-# draws it from left to right. The text itself when ordered naturally is read +-# backwards. A buffer of Visual Hebrew generally looks like so: +-# "[last word of first line spelled backwards] [whole line ordered backwards +-# and spelled backwards] [first word of first line spelled backwards] +-# [end of line] [last word of second line] ... etc' " +-# adding punctuation marks, numbers and English text to visual text is +-# naturally also "visual" and from left to right. +-# +-# "Logical" directionality means the text is ordered "naturally" according to +-# the order it is read. It is the responsibility of the renderer to display +-# the text from right to left. A BIDI algorithm is used to place general +-# punctuation marks, numbers and English text in the text. +-# +-# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +-# what little evidence I could find, it seems that its general directionality +-# is Logical. +-# +-# To sum up all of the above, the Hebrew probing mechanism knows about two +-# charsets: +-# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +-# backwards while line order is natural. For charset recognition purposes +-# the line order is unimportant (In fact, for this implementation, even +-# word order is unimportant). +-# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +-# +-# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +-# specifically identified. +-# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +-# that contain special punctuation marks or diacritics is displayed with +-# some unconverted characters showing as question marks. This problem might +-# be corrected using another model prober for x-mac-hebrew. Due to the fact +-# that x-mac-hebrew texts are so rare, writing another model prober isn't +-# worth the effort and performance hit. +-# +-#### The Prober #### +-# +-# The prober is divided between two SBCharSetProbers and a HebrewProber, +-# all of which are managed, created, fed data, inquired and deleted by the +-# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +-# fact some kind of Hebrew, Logical or Visual. The final decision about which +-# one is it is made by the HebrewProber by combining final-letter scores +-# with the scores of the two SBCharSetProbers to produce a final answer. +-# +-# The SBCSGroupProber is responsible for stripping the original text of HTML +-# tags, English characters, numbers, low-ASCII punctuation characters, spaces +-# and new lines. It reduces any sequence of such characters to a single space. +-# The buffer fed to each prober in the SBCS group prober is pure text in +-# high-ASCII. +-# The two SBCharSetProbers (model probers) share the same language model: +-# Win1255Model. +-# The first SBCharSetProber uses the model normally as any other +-# SBCharSetProber does, to recognize windows-1255, upon which this model was +-# built. The second SBCharSetProber is told to make the pair-of-letter +-# lookup in the language model backwards. This in practice exactly simulates +-# a visual Hebrew model using the windows-1255 logical Hebrew model. +-# +-# The HebrewProber is not using any language model. All it does is look for +-# final-letter evidence suggesting the text is either logical Hebrew or visual +-# Hebrew. Disjointed from the model probers, the results of the HebrewProber +-# alone are meaningless. HebrewProber always returns 0.00 as confidence +-# since it never identifies a charset by itself. Instead, the pointer to the +-# HebrewProber is passed to the model probers as a helper "Name Prober". +-# When the Group prober receives a positive identification from any prober, +-# it asks for the name of the charset identified. If the prober queried is a +-# Hebrew model prober, the model prober forwards the call to the +-# HebrewProber to make the final decision. In the HebrewProber, the +-# decision is made according to the final-letters scores maintained and Both +-# model probers scores. The answer is returned in the form of the name of the +-# charset identified, either "windows-1255" or "ISO-8859-8". +- +-class HebrewProber(CharSetProber): +- # windows-1255 / ISO-8859-8 code points of interest +- FINAL_KAF = 0xea +- NORMAL_KAF = 0xeb +- FINAL_MEM = 0xed +- NORMAL_MEM = 0xee +- FINAL_NUN = 0xef +- NORMAL_NUN = 0xf0 +- FINAL_PE = 0xf3 +- NORMAL_PE = 0xf4 +- FINAL_TSADI = 0xf5 +- NORMAL_TSADI = 0xf6 +- +- # Minimum Visual vs Logical final letter score difference. +- # If the difference is below this, don't rely solely on the final letter score +- # distance. +- MIN_FINAL_CHAR_DISTANCE = 5 +- +- # Minimum Visual vs Logical model score difference. +- # If the difference is below this, don't rely at all on the model score +- # distance. +- MIN_MODEL_DISTANCE = 0.01 +- +- VISUAL_HEBREW_NAME = "ISO-8859-8" +- LOGICAL_HEBREW_NAME = "windows-1255" +- +- def __init__(self): +- super(HebrewProber, self).__init__() +- self._final_char_logical_score = None +- self._final_char_visual_score = None +- self._prev = None +- self._before_prev = None +- self._logical_prober = None +- self._visual_prober = None +- self.reset() +- +- def reset(self): +- self._final_char_logical_score = 0 +- self._final_char_visual_score = 0 +- # The two last characters seen in the previous buffer, +- # mPrev and mBeforePrev are initialized to space in order to simulate +- # a word delimiter at the beginning of the data +- self._prev = ' ' +- self._before_prev = ' ' +- # These probers are owned by the group prober. +- +- def set_model_probers(self, logicalProber, visualProber): +- self._logical_prober = logicalProber +- self._visual_prober = visualProber +- +- def is_final(self, c): +- return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, +- self.FINAL_PE, self.FINAL_TSADI] +- +- def is_non_final(self, c): +- # The normal Tsadi is not a good Non-Final letter due to words like +- # 'lechotet' (to chat) containing an apostrophe after the tsadi. This +- # apostrophe is converted to a space in FilterWithoutEnglishLetters +- # causing the Non-Final tsadi to appear at an end of a word even +- # though this is not the case in the original text. +- # The letters Pe and Kaf rarely display a related behavior of not being +- # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' +- # for example legally end with a Non-Final Pe or Kaf. However, the +- # benefit of these letters as Non-Final letters outweighs the damage +- # since these words are quite rare. +- return c in [self.NORMAL_KAF, self.NORMAL_MEM, +- self.NORMAL_NUN, self.NORMAL_PE] +- +- def feed(self, byte_str): +- # Final letter analysis for logical-visual decision. +- # Look for evidence that the received buffer is either logical Hebrew +- # or visual Hebrew. +- # The following cases are checked: +- # 1) A word longer than 1 letter, ending with a final letter. This is +- # an indication that the text is laid out "naturally" since the +- # final letter really appears at the end. +1 for logical score. +- # 2) A word longer than 1 letter, ending with a Non-Final letter. In +- # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, +- # should not end with the Non-Final form of that letter. Exceptions +- # to this rule are mentioned above in isNonFinal(). This is an +- # indication that the text is laid out backwards. +1 for visual +- # score +- # 3) A word longer than 1 letter, starting with a final letter. Final +- # letters should not appear at the beginning of a word. This is an +- # indication that the text is laid out backwards. +1 for visual +- # score. +- # +- # The visual score and logical score are accumulated throughout the +- # text and are finally checked against each other in GetCharSetName(). +- # No checking for final letters in the middle of words is done since +- # that case is not an indication for either Logical or Visual text. +- # +- # We automatically filter out all 7-bit characters (replace them with +- # spaces) so the word boundary detection works properly. [MAP] +- +- if self.state == ProbingState.NOT_ME: +- # Both model probers say it's not them. No reason to continue. +- return ProbingState.NOT_ME +- +- byte_str = self.filter_high_byte_only(byte_str) +- +- for cur in byte_str: +- if cur == ' ': +- # We stand on a space - a word just ended +- if self._before_prev != ' ': +- # next-to-last char was not a space so self._prev is not a +- # 1 letter word +- if self.is_final(self._prev): +- # case (1) [-2:not space][-1:final letter][cur:space] +- self._final_char_logical_score += 1 +- elif self.is_non_final(self._prev): +- # case (2) [-2:not space][-1:Non-Final letter][ +- # cur:space] +- self._final_char_visual_score += 1 +- else: +- # Not standing on a space +- if ((self._before_prev == ' ') and +- (self.is_final(self._prev)) and (cur != ' ')): +- # case (3) [-2:space][-1:final letter][cur:not space] +- self._final_char_visual_score += 1 +- self._before_prev = self._prev +- self._prev = cur +- +- # Forever detecting, till the end or until both model probers return +- # ProbingState.NOT_ME (handled above) +- return ProbingState.DETECTING +- +- @property +- def charset_name(self): +- # Make the decision: is it Logical or Visual? +- # If the final letter score distance is dominant enough, rely on it. +- finalsub = self._final_char_logical_score - self._final_char_visual_score +- if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: +- return self.LOGICAL_HEBREW_NAME +- if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: +- return self.VISUAL_HEBREW_NAME +- +- # It's not dominant enough, try to rely on the model scores instead. +- modelsub = (self._logical_prober.get_confidence() +- - self._visual_prober.get_confidence()) +- if modelsub > self.MIN_MODEL_DISTANCE: +- return self.LOGICAL_HEBREW_NAME +- if modelsub < -self.MIN_MODEL_DISTANCE: +- return self.VISUAL_HEBREW_NAME +- +- # Still no good, back to final letter distance, maybe it'll save the +- # day. +- if finalsub < 0.0: +- return self.VISUAL_HEBREW_NAME +- +- # (finalsub > 0 - Logical) or (don't know what to do) default to +- # Logical. +- return self.LOGICAL_HEBREW_NAME +- +- @property +- def language(self): +- return 'Hebrew' +- +- @property +- def state(self): +- # Remain active as long as any of the model probers are active. +- if (self._logical_prober.state == ProbingState.NOT_ME) and \ +- (self._visual_prober.state == ProbingState.NOT_ME): +- return ProbingState.NOT_ME +- return ProbingState.DETECTING +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/jisfreq.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/jisfreq.py +deleted file mode 100644 +index 83fc082..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/jisfreq.py ++++ /dev/null +@@ -1,325 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# Sampling from about 20M text materials include literature and computer technology +-# +-# Japanese frequency table, applied to both S-JIS and EUC-JP +-# They are sorted in order. +- +-# 128 --> 0.77094 +-# 256 --> 0.85710 +-# 512 --> 0.92635 +-# 1024 --> 0.97130 +-# 2048 --> 0.99431 +-# +-# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +-# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +-# +-# Typical Distribution Ratio, 25% of IDR +- +-JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 +- +-# Char to FreqOrder table , +-JIS_TABLE_SIZE = 4368 +- +-JIS_CHAR_TO_FREQ_ORDER = ( +- 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +-3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +-1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +-2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +-2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +-5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +-1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +-5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +-5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +-5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +-5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +-5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +-5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +-1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +-1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +-1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +-2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +-3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +-3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 +- 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 +- 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +-1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 +- 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +-5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 +- 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 +- 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 +- 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 +- 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 +- 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +-5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +-5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +-5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +-4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +-5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +-5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +-5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +-5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +-5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +-5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +-5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +-5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +-5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +-3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +-5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +-5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +-5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +-5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +-5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +-5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +-5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +-5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +-5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +-5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +-5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +-5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +-5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +-5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +-5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +-5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +-5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +-5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +-5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +-5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +-5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +-5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +-5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +-5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +-5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +-5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +-5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +-5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +-5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +-5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +-5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +-5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +-5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +-5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +-5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +-5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +-5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +-5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +-6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +-6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +-6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +-6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +-6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +-6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +-6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +-6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +-4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 +- 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 +- 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +-1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +-1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 +- 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +-3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +-3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 +- 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +-3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +-3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 +- 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +-2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 +- 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +-3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +-1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 +- 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +-1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 +- 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +-2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +-2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +-2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +-2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +-1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +-1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +-1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +-1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +-2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +-1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +-2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +-1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +-1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +-1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +-1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +-1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +-1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 +- 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 +- 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +-1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +-2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +-2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +-2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +-3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +-3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 +- 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +-3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +-1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 +- 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +-2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +-1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 +- 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +-3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +-4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +-2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +-1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +-2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +-1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 +- 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 +- 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +-1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +-2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +-2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +-2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +-3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +-1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +-2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 +- 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 +- 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 +- 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +-1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +-2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 +- 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +-1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +-1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 +- 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +-1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +-1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +-1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 +- 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +-2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 +- 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +-2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +-3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +-2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +-1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +-6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +-1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +-2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +-1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 +- 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 +- 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +-3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +-3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +-1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +-1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +-1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +-1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 +- 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 +- 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +-2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 +- 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +-3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +-2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 +- 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +-1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +-2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 +- 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +-1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 +- 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +-4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +-2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +-1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 +- 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +-1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +-2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 +- 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +-6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +-1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +-1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +-2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +-3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 +- 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +-3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +-1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 +- 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +-1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 +- 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +-3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 +- 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +-2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 +- 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +-4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +-2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +-1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +-1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +-1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 +- 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +-1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +-3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +-1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +-3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 +- 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 +- 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 +- 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +-2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +-1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 +- 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +-1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 +- 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +-1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 +- 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 +- 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 +- 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +-1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +-1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +-2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +-4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 +- 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +-1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 +- 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +-1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +-3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +-1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +-2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +-2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +-1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +-1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +-2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 +- 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +-2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +-1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +-1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +-1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +-1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +-3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +-2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +-2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 +- 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +-3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +-3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +-1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +-2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +-1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +-2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +-) +- +- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/jpcntx.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/jpcntx.py +deleted file mode 100644 +index 20044e4..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/jpcntx.py ++++ /dev/null +@@ -1,233 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +- +-# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +-jp2CharContext = ( +-(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +-(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +-(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +-(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +-(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +-(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +-(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +-(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +-(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +-(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +-(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +-(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +-(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +-(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +-(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +-(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +-(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +-(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +-(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +-(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +-(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +-(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +-(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +-(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +-(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +-(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +-(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +-(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +-(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +-(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +-(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +-(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +-(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +-(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +-(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +-(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +-(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +-(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +-(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +-(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +-(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +-(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +-(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +-(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +-(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +-(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +-(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +-(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +-(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +-(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +-(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +-(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +-(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +-(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +-(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +-(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +-(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +-(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +-(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +-(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +-(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +-(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +-(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +-(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +-(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +-(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +-(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +-(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +-(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +-(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +-(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +-(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +-(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +-(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +-(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +-(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +-(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +-(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +-) +- +-class JapaneseContextAnalysis(object): +- NUM_OF_CATEGORY = 6 +- DONT_KNOW = -1 +- ENOUGH_REL_THRESHOLD = 100 +- MAX_REL_THRESHOLD = 1000 +- MINIMUM_DATA_THRESHOLD = 4 +- +- def __init__(self): +- self._total_rel = None +- self._rel_sample = None +- self._need_to_skip_char_num = None +- self._last_char_order = None +- self._done = None +- self.reset() +- +- def reset(self): +- self._total_rel = 0 # total sequence received +- # category counters, each integer counts sequence in its category +- self._rel_sample = [0] * self.NUM_OF_CATEGORY +- # if last byte in current buffer is not the last byte of a character, +- # we need to know how many bytes to skip in next buffer +- self._need_to_skip_char_num = 0 +- self._last_char_order = -1 # The order of previous char +- # If this flag is set to True, detection is done and conclusion has +- # been made +- self._done = False +- +- def feed(self, byte_str, num_bytes): +- if self._done: +- return +- +- # The buffer we got is byte oriented, and a character may span in more than one +- # buffers. In case the last one or two byte in last buffer is not +- # complete, we record how many byte needed to complete that character +- # and skip these bytes here. We can choose to record those bytes as +- # well and analyse the character once it is complete, but since a +- # character will not make much difference, by simply skipping +- # this character will simply our logic and improve performance. +- i = self._need_to_skip_char_num +- while i < num_bytes: +- order, char_len = self.get_order(byte_str[i:i + 2]) +- i += char_len +- if i > num_bytes: +- self._need_to_skip_char_num = i - num_bytes +- self._last_char_order = -1 +- else: +- if (order != -1) and (self._last_char_order != -1): +- self._total_rel += 1 +- if self._total_rel > self.MAX_REL_THRESHOLD: +- self._done = True +- break +- self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 +- self._last_char_order = order +- +- def got_enough_data(self): +- return self._total_rel > self.ENOUGH_REL_THRESHOLD +- +- def get_confidence(self): +- # This is just one way to calculate confidence. It works well for me. +- if self._total_rel > self.MINIMUM_DATA_THRESHOLD: +- return (self._total_rel - self._rel_sample[0]) / self._total_rel +- else: +- return self.DONT_KNOW +- +- def get_order(self, byte_str): +- return -1, 1 +- +-class SJISContextAnalysis(JapaneseContextAnalysis): +- def __init__(self): +- super(SJISContextAnalysis, self).__init__() +- self._charset_name = "SHIFT_JIS" +- +- @property +- def charset_name(self): +- return self._charset_name +- +- def get_order(self, byte_str): +- if not byte_str: +- return -1, 1 +- # find out current char's byte length +- first_char = byte_str[0] +- if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): +- char_len = 2 +- if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): +- self._charset_name = "CP932" +- else: +- char_len = 1 +- +- # return its order if it is hiragana +- if len(byte_str) > 1: +- second_char = byte_str[1] +- if (first_char == 202) and (0x9F <= second_char <= 0xF1): +- return second_char - 0x9F, char_len +- +- return -1, char_len +- +-class EUCJPContextAnalysis(JapaneseContextAnalysis): +- def get_order(self, byte_str): +- if not byte_str: +- return -1, 1 +- # find out current char's byte length +- first_char = byte_str[0] +- if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): +- char_len = 2 +- elif first_char == 0x8F: +- char_len = 3 +- else: +- char_len = 1 +- +- # return its order if it is hiragana +- if len(byte_str) > 1: +- second_char = byte_str[1] +- if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): +- return second_char - 0xA1, char_len +- +- return -1, char_len +- +- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langbulgarianmodel.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langbulgarianmodel.py +deleted file mode 100644 +index 2aa4fb2..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langbulgarianmodel.py ++++ /dev/null +@@ -1,228 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# 255: Control characters that usually does not exist in any text +-# 254: Carriage/Return +-# 253: symbol (punctuation) that does not belong to word +-# 252: 0 - 9 +- +-# Character Mapping Table: +-# this table is modified base on win1251BulgarianCharToOrderMap, so +-# only number <64 is sure valid +- +-Latin5_BulgarianCharToOrderMap = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +-110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +-253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +-116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +-194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +-210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 +- 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 +- 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 +- 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 +- 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 +- 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 +- 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +-) +- +-win1251BulgarianCharToOrderMap = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +-110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +-253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +-116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +-206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +-221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 +- 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 +- 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 +- 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 +- 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 +- 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 +- 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +-) +- +-# Model Table: +-# total sequences: 100% +-# first 512 sequences: 96.9392% +-# first 1024 sequences:3.0618% +-# rest sequences: 0.2992% +-# negative sequences: 0.0020% +-BulgarianLangModel = ( +-0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +-3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +-0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +-0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +-0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +-1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +-0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +-0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +-3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +-3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +-2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +-3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +-3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +-1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +-3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +-1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +-2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +-2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +-3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +-1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +-2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +-2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +-3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +-1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +-2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +-2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +-2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +-1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +-2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +-1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +-3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +-1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +-3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +-1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +-2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +-1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +-2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +-1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +-2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +-1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +-1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +-1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +-2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +-1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +-2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +-1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +-1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +-0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +-1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +-1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +-2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +-1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +-1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +-0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +-1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +-0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +-2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +-0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +-2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +-1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +-0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +-0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +-1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +-1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +-1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-) +- +-Latin5BulgarianModel = { +- 'char_to_order_map': Latin5_BulgarianCharToOrderMap, +- 'precedence_matrix': BulgarianLangModel, +- 'typical_positive_ratio': 0.969392, +- 'keep_english_letter': False, +- 'charset_name': "ISO-8859-5", +- 'language': 'Bulgairan', +-} +- +-Win1251BulgarianModel = { +- 'char_to_order_map': win1251BulgarianCharToOrderMap, +- 'precedence_matrix': BulgarianLangModel, +- 'typical_positive_ratio': 0.969392, +- 'keep_english_letter': False, +- 'charset_name': "windows-1251", +- 'language': 'Bulgarian', +-} +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langcyrillicmodel.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langcyrillicmodel.py +deleted file mode 100644 +index e5f9a1f..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langcyrillicmodel.py ++++ /dev/null +@@ -1,333 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# KOI8-R language model +-# Character Mapping Table: +-KOI8R_char_to_order_map = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +-155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +-253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 +- 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +-191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +-207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +-223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +-238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 +- 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 +- 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 +- 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 +- 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +-) +- +-win1251_char_to_order_map = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +-155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +-253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 +- 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +-191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +-207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +-223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +-239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, +- 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, +- 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +- 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +- 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +-) +- +-latin5_char_to_order_map = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +-155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +-253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 +- 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +-191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +-207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +-223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +- 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, +- 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +- 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +- 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +-239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +-) +- +-macCyrillic_char_to_order_map = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +-155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +-253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 +- 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +- 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, +- 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +-191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +-207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +-223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +-239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, +- 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +- 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +-) +- +-IBM855_char_to_order_map = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +-155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +-253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 +- 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +-191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +-206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, +- 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +-220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +-230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, +- 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, +- 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +-250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +-) +- +-IBM866_char_to_order_map = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +-155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +-253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 +- 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +- 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, +- 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +- 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +-191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +-207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +-223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +- 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +-239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +-) +- +-# Model Table: +-# total sequences: 100% +-# first 512 sequences: 97.6601% +-# first 1024 sequences: 2.3389% +-# rest sequences: 0.1237% +-# negative sequences: 0.0009% +-RussianLangModel = ( +-0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +-3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +-0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +-0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +-0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +-0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +-0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +-3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +-0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +-0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +-0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +-0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +-2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +-0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +-0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +-0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +-3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +-0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +-1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +-2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +-1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +-2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +-1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +-3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +-1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +-2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +-1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +-1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +-1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +-2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +-1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +-3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +-1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +-2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +-1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +-2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +-0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +-1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +-1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +-1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +-3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +-2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +-3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +-1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +-1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +-0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +-2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +-1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +-1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +-0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +-1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +-1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +-2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +-2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +-1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +-1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +-2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +-1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +-0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +-2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +-1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +-1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +-0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +-0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +-0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +-0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +-1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +-0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +-1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +-0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +-1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +-0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +-2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +-0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +-) +- +-Koi8rModel = { +- 'char_to_order_map': KOI8R_char_to_order_map, +- 'precedence_matrix': RussianLangModel, +- 'typical_positive_ratio': 0.976601, +- 'keep_english_letter': False, +- 'charset_name': "KOI8-R", +- 'language': 'Russian', +-} +- +-Win1251CyrillicModel = { +- 'char_to_order_map': win1251_char_to_order_map, +- 'precedence_matrix': RussianLangModel, +- 'typical_positive_ratio': 0.976601, +- 'keep_english_letter': False, +- 'charset_name': "windows-1251", +- 'language': 'Russian', +-} +- +-Latin5CyrillicModel = { +- 'char_to_order_map': latin5_char_to_order_map, +- 'precedence_matrix': RussianLangModel, +- 'typical_positive_ratio': 0.976601, +- 'keep_english_letter': False, +- 'charset_name': "ISO-8859-5", +- 'language': 'Russian', +-} +- +-MacCyrillicModel = { +- 'char_to_order_map': macCyrillic_char_to_order_map, +- 'precedence_matrix': RussianLangModel, +- 'typical_positive_ratio': 0.976601, +- 'keep_english_letter': False, +- 'charset_name': "MacCyrillic", +- 'language': 'Russian', +-} +- +-Ibm866Model = { +- 'char_to_order_map': IBM866_char_to_order_map, +- 'precedence_matrix': RussianLangModel, +- 'typical_positive_ratio': 0.976601, +- 'keep_english_letter': False, +- 'charset_name': "IBM866", +- 'language': 'Russian', +-} +- +-Ibm855Model = { +- 'char_to_order_map': IBM855_char_to_order_map, +- 'precedence_matrix': RussianLangModel, +- 'typical_positive_ratio': 0.976601, +- 'keep_english_letter': False, +- 'charset_name': "IBM855", +- 'language': 'Russian', +-} +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langgreekmodel.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langgreekmodel.py +deleted file mode 100644 +index 5332221..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langgreekmodel.py ++++ /dev/null +@@ -1,225 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# 255: Control characters that usually does not exist in any text +-# 254: Carriage/Return +-# 253: symbol (punctuation) that does not belong to word +-# 252: 0 - 9 +- +-# Character Mapping Table: +-Latin7_char_to_order_map = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 +- 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +-253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 +- 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +-253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +-253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +-110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 +- 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +-124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 +- 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +-) +- +-win1253_char_to_order_map = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 +- 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +-253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 +- 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +-253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +-253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +-110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 +- 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +-124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 +- 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +-) +- +-# Model Table: +-# total sequences: 100% +-# first 512 sequences: 98.2851% +-# first 1024 sequences:1.7001% +-# rest sequences: 0.0359% +-# negative sequences: 0.0148% +-GreekLangModel = ( +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +-3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +-0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +-2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +-0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +-2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +-0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +-2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +-0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +-2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +-0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +-3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +-3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +-2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +-2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +-0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +-0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +-0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +-0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +-0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +-0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +-0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +-0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +-0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +-0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +-0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +-0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +-0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +-0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +-0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +-0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +-0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +-0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +-0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +-0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +-0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +-0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +-0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +-0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +-0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +-0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +-0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +-0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +-0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +-0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +-0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +-0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +-0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +-0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +-0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +-0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +-0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-) +- +-Latin7GreekModel = { +- 'char_to_order_map': Latin7_char_to_order_map, +- 'precedence_matrix': GreekLangModel, +- 'typical_positive_ratio': 0.982851, +- 'keep_english_letter': False, +- 'charset_name': "ISO-8859-7", +- 'language': 'Greek', +-} +- +-Win1253GreekModel = { +- 'char_to_order_map': win1253_char_to_order_map, +- 'precedence_matrix': GreekLangModel, +- 'typical_positive_ratio': 0.982851, +- 'keep_english_letter': False, +- 'charset_name': "windows-1253", +- 'language': 'Greek', +-} +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langhebrewmodel.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langhebrewmodel.py +deleted file mode 100644 +index 58f4c87..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langhebrewmodel.py ++++ /dev/null +@@ -1,200 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Universal charset detector code. +-# +-# The Initial Developer of the Original Code is +-# Simon Montagu +-# Portions created by the Initial Developer are Copyright (C) 2005 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# Shy Shalom - original C code +-# Shoshannah Forbes - original C code (?) +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# 255: Control characters that usually does not exist in any text +-# 254: Carriage/Return +-# 253: symbol (punctuation) that does not belong to word +-# 252: 0 - 9 +- +-# Windows-1255 language model +-# Character Mapping Table: +-WIN1255_CHAR_TO_ORDER_MAP = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 +- 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +-253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 +- 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +-124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +-215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, +- 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +-106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, +- 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +-238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, +- 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, +- 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +-) +- +-# Model Table: +-# total sequences: 100% +-# first 512 sequences: 98.4004% +-# first 1024 sequences: 1.5981% +-# rest sequences: 0.087% +-# negative sequences: 0.0015% +-HEBREW_LANG_MODEL = ( +-0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +-3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +-1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +-1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +-1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +-1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +-1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +-0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +-0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +-1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +-3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +-0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +-0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +-3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +-0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +-0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +-0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +-3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +-0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +-0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +-0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +-0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +-0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +-0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +-3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +-0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +-0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +-0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +-3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +-1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +-0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +-3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +-0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +-0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +-3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +-0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +-2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +-0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +-0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +-0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +-0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +-0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +-2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +-0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +-0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +-0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +-0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +-3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +-0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +-1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +-0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +-2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +-1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +-2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +-1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +-2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +-0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +-1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +-0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +-) +- +-Win1255HebrewModel = { +- 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, +- 'precedence_matrix': HEBREW_LANG_MODEL, +- 'typical_positive_ratio': 0.984004, +- 'keep_english_letter': False, +- 'charset_name': "windows-1255", +- 'language': 'Hebrew', +-} +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langhungarianmodel.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langhungarianmodel.py +deleted file mode 100644 +index bb7c095..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langhungarianmodel.py ++++ /dev/null +@@ -1,225 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# 255: Control characters that usually does not exist in any text +-# 254: Carriage/Return +-# 253: symbol (punctuation) that does not belong to word +-# 252: 0 - 9 +- +-# Character Mapping Table: +-Latin2_HungarianCharToOrderMap = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, +- 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +-253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, +- 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +-159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +-175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +-191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, +- 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +-221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +-232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, +- 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +-245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +-) +- +-win1250HungarianCharToOrderMap = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, +- 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +-253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, +- 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +-161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +-177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +-191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, +- 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +-221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +-232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, +- 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +-245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +-) +- +-# Model Table: +-# total sequences: 100% +-# first 512 sequences: 94.7368% +-# first 1024 sequences:5.2623% +-# rest sequences: 0.8894% +-# negative sequences: 0.0009% +-HungarianLangModel = ( +-0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +-3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +-3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +-3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +-0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +-3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +-3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +-0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +-3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +-3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +-3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +-3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +-2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +-0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +-3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +-1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +-1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +-1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +-3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +-2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +-2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +-2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +-2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +-2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +-3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +-2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +-2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +-2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +-1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +-1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +-3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +-1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +-1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +-2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +-2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +-2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +-3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +-2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +-1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +-1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +-2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +-2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +-1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +-1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +-2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +-1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +-1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +-2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +-2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +-2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +-1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +-1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +-1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +-0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +-2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +-2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +-1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +-2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +-1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +-1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +-2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +-2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +-2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +-1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +-2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +-0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +-1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +-0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +-1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +-0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +-0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +-2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +-0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +-) +- +-Latin2HungarianModel = { +- 'char_to_order_map': Latin2_HungarianCharToOrderMap, +- 'precedence_matrix': HungarianLangModel, +- 'typical_positive_ratio': 0.947368, +- 'keep_english_letter': True, +- 'charset_name': "ISO-8859-2", +- 'language': 'Hungarian', +-} +- +-Win1250HungarianModel = { +- 'char_to_order_map': win1250HungarianCharToOrderMap, +- 'precedence_matrix': HungarianLangModel, +- 'typical_positive_ratio': 0.947368, +- 'keep_english_letter': True, +- 'charset_name': "windows-1250", +- 'language': 'Hungarian', +-} +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langthaimodel.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langthaimodel.py +deleted file mode 100644 +index 15f94c2..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langthaimodel.py ++++ /dev/null +@@ -1,199 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# 255: Control characters that usually does not exist in any text +-# 254: Carriage/Return +-# 253: symbol (punctuation) that does not belong to word +-# 252: 0 - 9 +- +-# The following result for thai was collected from a limited sample (1M). +- +-# Character Mapping Table: +-TIS620CharToOrderMap = ( +-255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +-252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +-253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +-188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +-253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 +- 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +-209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +-223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +-236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, +- 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, +- 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, +- 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, +- 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, +- 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +-) +- +-# Model Table: +-# total sequences: 100% +-# first 512 sequences: 92.6386% +-# first 1024 sequences:7.3177% +-# rest sequences: 1.0230% +-# negative sequences: 0.0436% +-ThaiLangModel = ( +-0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +-0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +-3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +-0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +-3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +-3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +-3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +-3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +-3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +-3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +-3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +-2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +-3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +-0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +-3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +-0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +-3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +-1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +-3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +-3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +-1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +-0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +-2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +-0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +-3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +-2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +-3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +-0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +-3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +-3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +-2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +-3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +-2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +-3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +-3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +-3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +-3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +-3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +-1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +-0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +-0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +-3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +-3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +-1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +-3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +-3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +-0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +-0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +-0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +-0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +-1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +-1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +-3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +-0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +-0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +-0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +-3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +-3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +-0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +-0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +-0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +-0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +-0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +-0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +-0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +-3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +-0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +-0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +-3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +-2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +-0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +-3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +-0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +-2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +-1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +-2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +-1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-) +- +-TIS620ThaiModel = { +- 'char_to_order_map': TIS620CharToOrderMap, +- 'precedence_matrix': ThaiLangModel, +- 'typical_positive_ratio': 0.926386, +- 'keep_english_letter': False, +- 'charset_name': "TIS-620", +- 'language': 'Thai', +-} +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langturkishmodel.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langturkishmodel.py +deleted file mode 100644 +index a427a45..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/langturkishmodel.py ++++ /dev/null +@@ -1,193 +0,0 @@ +-# -*- coding: utf-8 -*- +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Communicator client code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# Özgür Baskın - Turkish Language Model +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-# 255: Control characters that usually does not exist in any text +-# 254: Carriage/Return +-# 253: symbol (punctuation) that does not belong to word +-# 252: 0 - 9 +- +-# Character Mapping Table: +-Latin5_TurkishCharToOrderMap = ( +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +-255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, +- 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +-255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, +- 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +-180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +-164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +-150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, +- 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +-124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, +- 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, +- 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, +- 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +-) +- +-TurkishLangModel = ( +-3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +-3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +-3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +-3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +-3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +-3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +-3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +-2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +-3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +-2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +-1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +-2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +-3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +-3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +-2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +-3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +-2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +-3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +-3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +-3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +-0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +-3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +-0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +-3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +-1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +-3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +-2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +-2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +-2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +-3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +-0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +-1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +-3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +-3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +-2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +-0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +-3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +-0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +-3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +-1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +-1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +-2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +-2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +-0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +-2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +-3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +-3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +-0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +-3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +-1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +-0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +-3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +-0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +-3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +-3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +-1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +-2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +-0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +-3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +-0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +-3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +-0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +-3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +-0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +-0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +-3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +-0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +-0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +-3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +-0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +-0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +-3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +-0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +-3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +-0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +-3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +-0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +-0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +-3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +-0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +-3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +-0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +-3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +-0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +-0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +-0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +-2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +-1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +-3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +-0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +-0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +-0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +-3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +-0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +-0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +-2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +-2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +-0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +-2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +-1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +-0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +-2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +-0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-) +- +-Latin5TurkishModel = { +- 'char_to_order_map': Latin5_TurkishCharToOrderMap, +- 'precedence_matrix': TurkishLangModel, +- 'typical_positive_ratio': 0.970290, +- 'keep_english_letter': True, +- 'charset_name': "ISO-8859-9", +- 'language': 'Turkish', +-} +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/latin1prober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/latin1prober.py +deleted file mode 100644 +index 7d1e8c2..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/latin1prober.py ++++ /dev/null +@@ -1,145 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Universal charset detector code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 2001 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# Shy Shalom - original C code +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .charsetprober import CharSetProber +-from .enums import ProbingState +- +-FREQ_CAT_NUM = 4 +- +-UDF = 0 # undefined +-OTH = 1 # other +-ASC = 2 # ascii capital letter +-ASS = 3 # ascii small letter +-ACV = 4 # accent capital vowel +-ACO = 5 # accent capital other +-ASV = 6 # accent small vowel +-ASO = 7 # accent small other +-CLASS_NUM = 8 # total classes +- +-Latin1_CharToClass = ( +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F +- OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 +- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F +- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 +- ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F +- OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 +- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F +- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 +- ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F +- OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 +- OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F +- UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 +- OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 +- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF +- ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 +- ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF +- ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 +- ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF +- ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 +- ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF +- ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 +- ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +-) +- +-# 0 : illegal +-# 1 : very unlikely +-# 2 : normal +-# 3 : very likely +-Latin1ClassModel = ( +-# UDF OTH ASC ASS ACV ACO ASV ASO +- 0, 0, 0, 0, 0, 0, 0, 0, # UDF +- 0, 3, 3, 3, 3, 3, 3, 3, # OTH +- 0, 3, 3, 3, 3, 3, 3, 3, # ASC +- 0, 3, 3, 3, 1, 1, 3, 3, # ASS +- 0, 3, 3, 3, 1, 2, 1, 2, # ACV +- 0, 3, 3, 3, 3, 3, 3, 3, # ACO +- 0, 3, 1, 3, 1, 1, 1, 3, # ASV +- 0, 3, 1, 3, 1, 1, 3, 3, # ASO +-) +- +- +-class Latin1Prober(CharSetProber): +- def __init__(self): +- super(Latin1Prober, self).__init__() +- self._last_char_class = None +- self._freq_counter = None +- self.reset() +- +- def reset(self): +- self._last_char_class = OTH +- self._freq_counter = [0] * FREQ_CAT_NUM +- CharSetProber.reset(self) +- +- @property +- def charset_name(self): +- return "ISO-8859-1" +- +- @property +- def language(self): +- return "" +- +- def feed(self, byte_str): +- byte_str = self.filter_with_english_letters(byte_str) +- for c in byte_str: +- char_class = Latin1_CharToClass[c] +- freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) +- + char_class] +- if freq == 0: +- self._state = ProbingState.NOT_ME +- break +- self._freq_counter[freq] += 1 +- self._last_char_class = char_class +- +- return self.state +- +- def get_confidence(self): +- if self.state == ProbingState.NOT_ME: +- return 0.01 +- +- total = sum(self._freq_counter) +- if total < 0.01: +- confidence = 0.0 +- else: +- confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) +- / total) +- if confidence < 0.0: +- confidence = 0.0 +- # lower the confidence of latin1 so that other more accurate +- # detector can take priority. +- confidence = confidence * 0.73 +- return confidence +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/mbcharsetprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/mbcharsetprober.py +deleted file mode 100644 +index 6256ecf..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/mbcharsetprober.py ++++ /dev/null +@@ -1,91 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Universal charset detector code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 2001 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# Shy Shalom - original C code +-# Proofpoint, Inc. +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .charsetprober import CharSetProber +-from .enums import ProbingState, MachineState +- +- +-class MultiByteCharSetProber(CharSetProber): +- """ +- MultiByteCharSetProber +- """ +- +- def __init__(self, lang_filter=None): +- super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) +- self.distribution_analyzer = None +- self.coding_sm = None +- self._last_char = [0, 0] +- +- def reset(self): +- super(MultiByteCharSetProber, self).reset() +- if self.coding_sm: +- self.coding_sm.reset() +- if self.distribution_analyzer: +- self.distribution_analyzer.reset() +- self._last_char = [0, 0] +- +- @property +- def charset_name(self): +- raise NotImplementedError +- +- @property +- def language(self): +- raise NotImplementedError +- +- def feed(self, byte_str): +- for i in range(len(byte_str)): +- coding_state = self.coding_sm.next_state(byte_str[i]) +- if coding_state == MachineState.ERROR: +- self.logger.debug('%s %s prober hit error at byte %s', +- self.charset_name, self.language, i) +- self._state = ProbingState.NOT_ME +- break +- elif coding_state == MachineState.ITS_ME: +- self._state = ProbingState.FOUND_IT +- break +- elif coding_state == MachineState.START: +- char_len = self.coding_sm.get_current_charlen() +- if i == 0: +- self._last_char[1] = byte_str[0] +- self.distribution_analyzer.feed(self._last_char, char_len) +- else: +- self.distribution_analyzer.feed(byte_str[i - 1:i + 1], +- char_len) +- +- self._last_char[0] = byte_str[-1] +- +- if self.state == ProbingState.DETECTING: +- if (self.distribution_analyzer.got_enough_data() and +- (self.get_confidence() > self.SHORTCUT_THRESHOLD)): +- self._state = ProbingState.FOUND_IT +- +- return self.state +- +- def get_confidence(self): +- return self.distribution_analyzer.get_confidence() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/mbcsgroupprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/mbcsgroupprober.py +deleted file mode 100644 +index 530abe7..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/mbcsgroupprober.py ++++ /dev/null +@@ -1,54 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Universal charset detector code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 2001 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# Shy Shalom - original C code +-# Proofpoint, Inc. +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .charsetgroupprober import CharSetGroupProber +-from .utf8prober import UTF8Prober +-from .sjisprober import SJISProber +-from .eucjpprober import EUCJPProber +-from .gb2312prober import GB2312Prober +-from .euckrprober import EUCKRProber +-from .cp949prober import CP949Prober +-from .big5prober import Big5Prober +-from .euctwprober import EUCTWProber +- +- +-class MBCSGroupProber(CharSetGroupProber): +- def __init__(self, lang_filter=None): +- super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) +- self.probers = [ +- UTF8Prober(), +- SJISProber(), +- EUCJPProber(), +- GB2312Prober(), +- EUCKRProber(), +- CP949Prober(), +- Big5Prober(), +- EUCTWProber() +- ] +- self.reset() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/mbcssm.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/mbcssm.py +deleted file mode 100644 +index 8360d0f..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/mbcssm.py ++++ /dev/null +@@ -1,572 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .enums import MachineState +- +-# BIG5 +- +-BIG5_CLS = ( +- 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value +- 1,1,1,1,1,1,0,0, # 08 - 0f +- 1,1,1,1,1,1,1,1, # 10 - 17 +- 1,1,1,0,1,1,1,1, # 18 - 1f +- 1,1,1,1,1,1,1,1, # 20 - 27 +- 1,1,1,1,1,1,1,1, # 28 - 2f +- 1,1,1,1,1,1,1,1, # 30 - 37 +- 1,1,1,1,1,1,1,1, # 38 - 3f +- 2,2,2,2,2,2,2,2, # 40 - 47 +- 2,2,2,2,2,2,2,2, # 48 - 4f +- 2,2,2,2,2,2,2,2, # 50 - 57 +- 2,2,2,2,2,2,2,2, # 58 - 5f +- 2,2,2,2,2,2,2,2, # 60 - 67 +- 2,2,2,2,2,2,2,2, # 68 - 6f +- 2,2,2,2,2,2,2,2, # 70 - 77 +- 2,2,2,2,2,2,2,1, # 78 - 7f +- 4,4,4,4,4,4,4,4, # 80 - 87 +- 4,4,4,4,4,4,4,4, # 88 - 8f +- 4,4,4,4,4,4,4,4, # 90 - 97 +- 4,4,4,4,4,4,4,4, # 98 - 9f +- 4,3,3,3,3,3,3,3, # a0 - a7 +- 3,3,3,3,3,3,3,3, # a8 - af +- 3,3,3,3,3,3,3,3, # b0 - b7 +- 3,3,3,3,3,3,3,3, # b8 - bf +- 3,3,3,3,3,3,3,3, # c0 - c7 +- 3,3,3,3,3,3,3,3, # c8 - cf +- 3,3,3,3,3,3,3,3, # d0 - d7 +- 3,3,3,3,3,3,3,3, # d8 - df +- 3,3,3,3,3,3,3,3, # e0 - e7 +- 3,3,3,3,3,3,3,3, # e8 - ef +- 3,3,3,3,3,3,3,3, # f0 - f7 +- 3,3,3,3,3,3,3,0 # f8 - ff +-) +- +-BIG5_ST = ( +- MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 +- MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f +- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +-) +- +-BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) +- +-BIG5_SM_MODEL = {'class_table': BIG5_CLS, +- 'class_factor': 5, +- 'state_table': BIG5_ST, +- 'char_len_table': BIG5_CHAR_LEN_TABLE, +- 'name': 'Big5'} +- +-# CP949 +- +-CP949_CLS = ( +- 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f +- 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f +- 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f +- 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f +- 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f +- 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f +- 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f +- 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f +- 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f +- 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f +- 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af +- 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf +- 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf +- 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df +- 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef +- 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +-) +- +-CP949_ST = ( +-#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = +- MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR +- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME +- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 +- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 +- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 +- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +-) +- +-CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) +- +-CP949_SM_MODEL = {'class_table': CP949_CLS, +- 'class_factor': 10, +- 'state_table': CP949_ST, +- 'char_len_table': CP949_CHAR_LEN_TABLE, +- 'name': 'CP949'} +- +-# EUC-JP +- +-EUCJP_CLS = ( +- 4,4,4,4,4,4,4,4, # 00 - 07 +- 4,4,4,4,4,4,5,5, # 08 - 0f +- 4,4,4,4,4,4,4,4, # 10 - 17 +- 4,4,4,5,4,4,4,4, # 18 - 1f +- 4,4,4,4,4,4,4,4, # 20 - 27 +- 4,4,4,4,4,4,4,4, # 28 - 2f +- 4,4,4,4,4,4,4,4, # 30 - 37 +- 4,4,4,4,4,4,4,4, # 38 - 3f +- 4,4,4,4,4,4,4,4, # 40 - 47 +- 4,4,4,4,4,4,4,4, # 48 - 4f +- 4,4,4,4,4,4,4,4, # 50 - 57 +- 4,4,4,4,4,4,4,4, # 58 - 5f +- 4,4,4,4,4,4,4,4, # 60 - 67 +- 4,4,4,4,4,4,4,4, # 68 - 6f +- 4,4,4,4,4,4,4,4, # 70 - 77 +- 4,4,4,4,4,4,4,4, # 78 - 7f +- 5,5,5,5,5,5,5,5, # 80 - 87 +- 5,5,5,5,5,5,1,3, # 88 - 8f +- 5,5,5,5,5,5,5,5, # 90 - 97 +- 5,5,5,5,5,5,5,5, # 98 - 9f +- 5,2,2,2,2,2,2,2, # a0 - a7 +- 2,2,2,2,2,2,2,2, # a8 - af +- 2,2,2,2,2,2,2,2, # b0 - b7 +- 2,2,2,2,2,2,2,2, # b8 - bf +- 2,2,2,2,2,2,2,2, # c0 - c7 +- 2,2,2,2,2,2,2,2, # c8 - cf +- 2,2,2,2,2,2,2,2, # d0 - d7 +- 2,2,2,2,2,2,2,2, # d8 - df +- 0,0,0,0,0,0,0,0, # e0 - e7 +- 0,0,0,0,0,0,0,0, # e8 - ef +- 0,0,0,0,0,0,0,0, # f0 - f7 +- 0,0,0,0,0,0,0,5 # f8 - ff +-) +- +-EUCJP_ST = ( +- 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f +- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 +- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f +- 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +-) +- +-EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) +- +-EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, +- 'class_factor': 6, +- 'state_table': EUCJP_ST, +- 'char_len_table': EUCJP_CHAR_LEN_TABLE, +- 'name': 'EUC-JP'} +- +-# EUC-KR +- +-EUCKR_CLS = ( +- 1,1,1,1,1,1,1,1, # 00 - 07 +- 1,1,1,1,1,1,0,0, # 08 - 0f +- 1,1,1,1,1,1,1,1, # 10 - 17 +- 1,1,1,0,1,1,1,1, # 18 - 1f +- 1,1,1,1,1,1,1,1, # 20 - 27 +- 1,1,1,1,1,1,1,1, # 28 - 2f +- 1,1,1,1,1,1,1,1, # 30 - 37 +- 1,1,1,1,1,1,1,1, # 38 - 3f +- 1,1,1,1,1,1,1,1, # 40 - 47 +- 1,1,1,1,1,1,1,1, # 48 - 4f +- 1,1,1,1,1,1,1,1, # 50 - 57 +- 1,1,1,1,1,1,1,1, # 58 - 5f +- 1,1,1,1,1,1,1,1, # 60 - 67 +- 1,1,1,1,1,1,1,1, # 68 - 6f +- 1,1,1,1,1,1,1,1, # 70 - 77 +- 1,1,1,1,1,1,1,1, # 78 - 7f +- 0,0,0,0,0,0,0,0, # 80 - 87 +- 0,0,0,0,0,0,0,0, # 88 - 8f +- 0,0,0,0,0,0,0,0, # 90 - 97 +- 0,0,0,0,0,0,0,0, # 98 - 9f +- 0,2,2,2,2,2,2,2, # a0 - a7 +- 2,2,2,2,2,3,3,3, # a8 - af +- 2,2,2,2,2,2,2,2, # b0 - b7 +- 2,2,2,2,2,2,2,2, # b8 - bf +- 2,2,2,2,2,2,2,2, # c0 - c7 +- 2,3,2,2,2,2,2,2, # c8 - cf +- 2,2,2,2,2,2,2,2, # d0 - d7 +- 2,2,2,2,2,2,2,2, # d8 - df +- 2,2,2,2,2,2,2,2, # e0 - e7 +- 2,2,2,2,2,2,2,2, # e8 - ef +- 2,2,2,2,2,2,2,2, # f0 - f7 +- 2,2,2,2,2,2,2,0 # f8 - ff +-) +- +-EUCKR_ST = ( +- MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 +- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +-) +- +-EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) +- +-EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, +- 'class_factor': 4, +- 'state_table': EUCKR_ST, +- 'char_len_table': EUCKR_CHAR_LEN_TABLE, +- 'name': 'EUC-KR'} +- +-# EUC-TW +- +-EUCTW_CLS = ( +- 2,2,2,2,2,2,2,2, # 00 - 07 +- 2,2,2,2,2,2,0,0, # 08 - 0f +- 2,2,2,2,2,2,2,2, # 10 - 17 +- 2,2,2,0,2,2,2,2, # 18 - 1f +- 2,2,2,2,2,2,2,2, # 20 - 27 +- 2,2,2,2,2,2,2,2, # 28 - 2f +- 2,2,2,2,2,2,2,2, # 30 - 37 +- 2,2,2,2,2,2,2,2, # 38 - 3f +- 2,2,2,2,2,2,2,2, # 40 - 47 +- 2,2,2,2,2,2,2,2, # 48 - 4f +- 2,2,2,2,2,2,2,2, # 50 - 57 +- 2,2,2,2,2,2,2,2, # 58 - 5f +- 2,2,2,2,2,2,2,2, # 60 - 67 +- 2,2,2,2,2,2,2,2, # 68 - 6f +- 2,2,2,2,2,2,2,2, # 70 - 77 +- 2,2,2,2,2,2,2,2, # 78 - 7f +- 0,0,0,0,0,0,0,0, # 80 - 87 +- 0,0,0,0,0,0,6,0, # 88 - 8f +- 0,0,0,0,0,0,0,0, # 90 - 97 +- 0,0,0,0,0,0,0,0, # 98 - 9f +- 0,3,4,4,4,4,4,4, # a0 - a7 +- 5,5,1,1,1,1,1,1, # a8 - af +- 1,1,1,1,1,1,1,1, # b0 - b7 +- 1,1,1,1,1,1,1,1, # b8 - bf +- 1,1,3,1,3,3,3,3, # c0 - c7 +- 3,3,3,3,3,3,3,3, # c8 - cf +- 3,3,3,3,3,3,3,3, # d0 - d7 +- 3,3,3,3,3,3,3,3, # d8 - df +- 3,3,3,3,3,3,3,3, # e0 - e7 +- 3,3,3,3,3,3,3,3, # e8 - ef +- 3,3,3,3,3,3,3,3, # f0 - f7 +- 3,3,3,3,3,3,3,0 # f8 - ff +-) +- +-EUCTW_ST = ( +- MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f +- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 +- MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f +- 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 +- MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +-) +- +-EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) +- +-EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, +- 'class_factor': 7, +- 'state_table': EUCTW_ST, +- 'char_len_table': EUCTW_CHAR_LEN_TABLE, +- 'name': 'x-euc-tw'} +- +-# GB2312 +- +-GB2312_CLS = ( +- 1,1,1,1,1,1,1,1, # 00 - 07 +- 1,1,1,1,1,1,0,0, # 08 - 0f +- 1,1,1,1,1,1,1,1, # 10 - 17 +- 1,1,1,0,1,1,1,1, # 18 - 1f +- 1,1,1,1,1,1,1,1, # 20 - 27 +- 1,1,1,1,1,1,1,1, # 28 - 2f +- 3,3,3,3,3,3,3,3, # 30 - 37 +- 3,3,1,1,1,1,1,1, # 38 - 3f +- 2,2,2,2,2,2,2,2, # 40 - 47 +- 2,2,2,2,2,2,2,2, # 48 - 4f +- 2,2,2,2,2,2,2,2, # 50 - 57 +- 2,2,2,2,2,2,2,2, # 58 - 5f +- 2,2,2,2,2,2,2,2, # 60 - 67 +- 2,2,2,2,2,2,2,2, # 68 - 6f +- 2,2,2,2,2,2,2,2, # 70 - 77 +- 2,2,2,2,2,2,2,4, # 78 - 7f +- 5,6,6,6,6,6,6,6, # 80 - 87 +- 6,6,6,6,6,6,6,6, # 88 - 8f +- 6,6,6,6,6,6,6,6, # 90 - 97 +- 6,6,6,6,6,6,6,6, # 98 - 9f +- 6,6,6,6,6,6,6,6, # a0 - a7 +- 6,6,6,6,6,6,6,6, # a8 - af +- 6,6,6,6,6,6,6,6, # b0 - b7 +- 6,6,6,6,6,6,6,6, # b8 - bf +- 6,6,6,6,6,6,6,6, # c0 - c7 +- 6,6,6,6,6,6,6,6, # c8 - cf +- 6,6,6,6,6,6,6,6, # d0 - d7 +- 6,6,6,6,6,6,6,6, # d8 - df +- 6,6,6,6,6,6,6,6, # e0 - e7 +- 6,6,6,6,6,6,6,6, # e8 - ef +- 6,6,6,6,6,6,6,6, # f0 - f7 +- 6,6,6,6,6,6,6,0 # f8 - ff +-) +- +-GB2312_ST = ( +- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f +- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 +- 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f +- MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 +- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +-) +- +-# To be accurate, the length of class 6 can be either 2 or 4. +-# But it is not necessary to discriminate between the two since +-# it is used for frequency analysis only, and we are validating +-# each code range there as well. So it is safe to set it to be +-# 2 here. +-GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) +- +-GB2312_SM_MODEL = {'class_table': GB2312_CLS, +- 'class_factor': 7, +- 'state_table': GB2312_ST, +- 'char_len_table': GB2312_CHAR_LEN_TABLE, +- 'name': 'GB2312'} +- +-# Shift_JIS +- +-SJIS_CLS = ( +- 1,1,1,1,1,1,1,1, # 00 - 07 +- 1,1,1,1,1,1,0,0, # 08 - 0f +- 1,1,1,1,1,1,1,1, # 10 - 17 +- 1,1,1,0,1,1,1,1, # 18 - 1f +- 1,1,1,1,1,1,1,1, # 20 - 27 +- 1,1,1,1,1,1,1,1, # 28 - 2f +- 1,1,1,1,1,1,1,1, # 30 - 37 +- 1,1,1,1,1,1,1,1, # 38 - 3f +- 2,2,2,2,2,2,2,2, # 40 - 47 +- 2,2,2,2,2,2,2,2, # 48 - 4f +- 2,2,2,2,2,2,2,2, # 50 - 57 +- 2,2,2,2,2,2,2,2, # 58 - 5f +- 2,2,2,2,2,2,2,2, # 60 - 67 +- 2,2,2,2,2,2,2,2, # 68 - 6f +- 2,2,2,2,2,2,2,2, # 70 - 77 +- 2,2,2,2,2,2,2,1, # 78 - 7f +- 3,3,3,3,3,2,2,3, # 80 - 87 +- 3,3,3,3,3,3,3,3, # 88 - 8f +- 3,3,3,3,3,3,3,3, # 90 - 97 +- 3,3,3,3,3,3,3,3, # 98 - 9f +- #0xa0 is illegal in sjis encoding, but some pages does +- #contain such byte. We need to be more error forgiven. +- 2,2,2,2,2,2,2,2, # a0 - a7 +- 2,2,2,2,2,2,2,2, # a8 - af +- 2,2,2,2,2,2,2,2, # b0 - b7 +- 2,2,2,2,2,2,2,2, # b8 - bf +- 2,2,2,2,2,2,2,2, # c0 - c7 +- 2,2,2,2,2,2,2,2, # c8 - cf +- 2,2,2,2,2,2,2,2, # d0 - d7 +- 2,2,2,2,2,2,2,2, # d8 - df +- 3,3,3,3,3,3,3,3, # e0 - e7 +- 3,3,3,3,3,4,4,4, # e8 - ef +- 3,3,3,3,3,3,3,3, # f0 - f7 +- 3,3,3,3,3,0,0,0) # f8 - ff +- +- +-SJIS_ST = ( +- MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f +- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +-) +- +-SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) +- +-SJIS_SM_MODEL = {'class_table': SJIS_CLS, +- 'class_factor': 6, +- 'state_table': SJIS_ST, +- 'char_len_table': SJIS_CHAR_LEN_TABLE, +- 'name': 'Shift_JIS'} +- +-# UCS2-BE +- +-UCS2BE_CLS = ( +- 0,0,0,0,0,0,0,0, # 00 - 07 +- 0,0,1,0,0,2,0,0, # 08 - 0f +- 0,0,0,0,0,0,0,0, # 10 - 17 +- 0,0,0,3,0,0,0,0, # 18 - 1f +- 0,0,0,0,0,0,0,0, # 20 - 27 +- 0,3,3,3,3,3,0,0, # 28 - 2f +- 0,0,0,0,0,0,0,0, # 30 - 37 +- 0,0,0,0,0,0,0,0, # 38 - 3f +- 0,0,0,0,0,0,0,0, # 40 - 47 +- 0,0,0,0,0,0,0,0, # 48 - 4f +- 0,0,0,0,0,0,0,0, # 50 - 57 +- 0,0,0,0,0,0,0,0, # 58 - 5f +- 0,0,0,0,0,0,0,0, # 60 - 67 +- 0,0,0,0,0,0,0,0, # 68 - 6f +- 0,0,0,0,0,0,0,0, # 70 - 77 +- 0,0,0,0,0,0,0,0, # 78 - 7f +- 0,0,0,0,0,0,0,0, # 80 - 87 +- 0,0,0,0,0,0,0,0, # 88 - 8f +- 0,0,0,0,0,0,0,0, # 90 - 97 +- 0,0,0,0,0,0,0,0, # 98 - 9f +- 0,0,0,0,0,0,0,0, # a0 - a7 +- 0,0,0,0,0,0,0,0, # a8 - af +- 0,0,0,0,0,0,0,0, # b0 - b7 +- 0,0,0,0,0,0,0,0, # b8 - bf +- 0,0,0,0,0,0,0,0, # c0 - c7 +- 0,0,0,0,0,0,0,0, # c8 - cf +- 0,0,0,0,0,0,0,0, # d0 - d7 +- 0,0,0,0,0,0,0,0, # d8 - df +- 0,0,0,0,0,0,0,0, # e0 - e7 +- 0,0,0,0,0,0,0,0, # e8 - ef +- 0,0,0,0,0,0,0,0, # f0 - f7 +- 0,0,0,0,0,0,4,5 # f8 - ff +-) +- +-UCS2BE_ST = ( +- 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f +- MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 +- 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f +- 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 +- 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f +- 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +-) +- +-UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) +- +-UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, +- 'class_factor': 6, +- 'state_table': UCS2BE_ST, +- 'char_len_table': UCS2BE_CHAR_LEN_TABLE, +- 'name': 'UTF-16BE'} +- +-# UCS2-LE +- +-UCS2LE_CLS = ( +- 0,0,0,0,0,0,0,0, # 00 - 07 +- 0,0,1,0,0,2,0,0, # 08 - 0f +- 0,0,0,0,0,0,0,0, # 10 - 17 +- 0,0,0,3,0,0,0,0, # 18 - 1f +- 0,0,0,0,0,0,0,0, # 20 - 27 +- 0,3,3,3,3,3,0,0, # 28 - 2f +- 0,0,0,0,0,0,0,0, # 30 - 37 +- 0,0,0,0,0,0,0,0, # 38 - 3f +- 0,0,0,0,0,0,0,0, # 40 - 47 +- 0,0,0,0,0,0,0,0, # 48 - 4f +- 0,0,0,0,0,0,0,0, # 50 - 57 +- 0,0,0,0,0,0,0,0, # 58 - 5f +- 0,0,0,0,0,0,0,0, # 60 - 67 +- 0,0,0,0,0,0,0,0, # 68 - 6f +- 0,0,0,0,0,0,0,0, # 70 - 77 +- 0,0,0,0,0,0,0,0, # 78 - 7f +- 0,0,0,0,0,0,0,0, # 80 - 87 +- 0,0,0,0,0,0,0,0, # 88 - 8f +- 0,0,0,0,0,0,0,0, # 90 - 97 +- 0,0,0,0,0,0,0,0, # 98 - 9f +- 0,0,0,0,0,0,0,0, # a0 - a7 +- 0,0,0,0,0,0,0,0, # a8 - af +- 0,0,0,0,0,0,0,0, # b0 - b7 +- 0,0,0,0,0,0,0,0, # b8 - bf +- 0,0,0,0,0,0,0,0, # c0 - c7 +- 0,0,0,0,0,0,0,0, # c8 - cf +- 0,0,0,0,0,0,0,0, # d0 - d7 +- 0,0,0,0,0,0,0,0, # d8 - df +- 0,0,0,0,0,0,0,0, # e0 - e7 +- 0,0,0,0,0,0,0,0, # e8 - ef +- 0,0,0,0,0,0,0,0, # f0 - f7 +- 0,0,0,0,0,0,4,5 # f8 - ff +-) +- +-UCS2LE_ST = ( +- 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f +- MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 +- 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f +- 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 +- 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f +- 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +-) +- +-UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) +- +-UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, +- 'class_factor': 6, +- 'state_table': UCS2LE_ST, +- 'char_len_table': UCS2LE_CHAR_LEN_TABLE, +- 'name': 'UTF-16LE'} +- +-# UTF-8 +- +-UTF8_CLS = ( +- 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value +- 1,1,1,1,1,1,0,0, # 08 - 0f +- 1,1,1,1,1,1,1,1, # 10 - 17 +- 1,1,1,0,1,1,1,1, # 18 - 1f +- 1,1,1,1,1,1,1,1, # 20 - 27 +- 1,1,1,1,1,1,1,1, # 28 - 2f +- 1,1,1,1,1,1,1,1, # 30 - 37 +- 1,1,1,1,1,1,1,1, # 38 - 3f +- 1,1,1,1,1,1,1,1, # 40 - 47 +- 1,1,1,1,1,1,1,1, # 48 - 4f +- 1,1,1,1,1,1,1,1, # 50 - 57 +- 1,1,1,1,1,1,1,1, # 58 - 5f +- 1,1,1,1,1,1,1,1, # 60 - 67 +- 1,1,1,1,1,1,1,1, # 68 - 6f +- 1,1,1,1,1,1,1,1, # 70 - 77 +- 1,1,1,1,1,1,1,1, # 78 - 7f +- 2,2,2,2,3,3,3,3, # 80 - 87 +- 4,4,4,4,4,4,4,4, # 88 - 8f +- 4,4,4,4,4,4,4,4, # 90 - 97 +- 4,4,4,4,4,4,4,4, # 98 - 9f +- 5,5,5,5,5,5,5,5, # a0 - a7 +- 5,5,5,5,5,5,5,5, # a8 - af +- 5,5,5,5,5,5,5,5, # b0 - b7 +- 5,5,5,5,5,5,5,5, # b8 - bf +- 0,0,6,6,6,6,6,6, # c0 - c7 +- 6,6,6,6,6,6,6,6, # c8 - cf +- 6,6,6,6,6,6,6,6, # d0 - d7 +- 6,6,6,6,6,6,6,6, # d8 - df +- 7,8,8,8,8,8,8,8, # e0 - e7 +- 8,8,8,8,8,9,8,8, # e8 - ef +- 10,11,11,11,11,11,11,11, # f0 - f7 +- 12,13,13,13,14,15,0,0 # f8 - ff +-) +- +-UTF8_ST = ( +- MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 +- 9, 11, 8, 7, 6, 5, 4, 3,#08-0f +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f +- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 +- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f +- MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f +- MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f +- MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f +- MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af +- MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf +- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 +- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +-) +- +-UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) +- +-UTF8_SM_MODEL = {'class_table': UTF8_CLS, +- 'class_factor': 16, +- 'state_table': UTF8_ST, +- 'char_len_table': UTF8_CHAR_LEN_TABLE, +- 'name': 'UTF-8'} +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/sbcharsetprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/sbcharsetprober.py +deleted file mode 100644 +index 0adb51d..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/sbcharsetprober.py ++++ /dev/null +@@ -1,132 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Universal charset detector code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 2001 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# Shy Shalom - original C code +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .charsetprober import CharSetProber +-from .enums import CharacterCategory, ProbingState, SequenceLikelihood +- +- +-class SingleByteCharSetProber(CharSetProber): +- SAMPLE_SIZE = 64 +- SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 +- POSITIVE_SHORTCUT_THRESHOLD = 0.95 +- NEGATIVE_SHORTCUT_THRESHOLD = 0.05 +- +- def __init__(self, model, reversed=False, name_prober=None): +- super(SingleByteCharSetProber, self).__init__() +- self._model = model +- # TRUE if we need to reverse every pair in the model lookup +- self._reversed = reversed +- # Optional auxiliary prober for name decision +- self._name_prober = name_prober +- self._last_order = None +- self._seq_counters = None +- self._total_seqs = None +- self._total_char = None +- self._freq_char = None +- self.reset() +- +- def reset(self): +- super(SingleByteCharSetProber, self).reset() +- # char order of last character +- self._last_order = 255 +- self._seq_counters = [0] * SequenceLikelihood.get_num_categories() +- self._total_seqs = 0 +- self._total_char = 0 +- # characters that fall in our sampling range +- self._freq_char = 0 +- +- @property +- def charset_name(self): +- if self._name_prober: +- return self._name_prober.charset_name +- else: +- return self._model['charset_name'] +- +- @property +- def language(self): +- if self._name_prober: +- return self._name_prober.language +- else: +- return self._model.get('language') +- +- def feed(self, byte_str): +- if not self._model['keep_english_letter']: +- byte_str = self.filter_international_words(byte_str) +- if not byte_str: +- return self.state +- char_to_order_map = self._model['char_to_order_map'] +- for i, c in enumerate(byte_str): +- # XXX: Order is in range 1-64, so one would think we want 0-63 here, +- # but that leads to 27 more test failures than before. +- order = char_to_order_map[c] +- # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but +- # CharacterCategory.SYMBOL is actually 253, so we use CONTROL +- # to make it closer to the original intent. The only difference +- # is whether or not we count digits and control characters for +- # _total_char purposes. +- if order < CharacterCategory.CONTROL: +- self._total_char += 1 +- if order < self.SAMPLE_SIZE: +- self._freq_char += 1 +- if self._last_order < self.SAMPLE_SIZE: +- self._total_seqs += 1 +- if not self._reversed: +- i = (self._last_order * self.SAMPLE_SIZE) + order +- model = self._model['precedence_matrix'][i] +- else: # reverse the order of the letters in the lookup +- i = (order * self.SAMPLE_SIZE) + self._last_order +- model = self._model['precedence_matrix'][i] +- self._seq_counters[model] += 1 +- self._last_order = order +- +- charset_name = self._model['charset_name'] +- if self.state == ProbingState.DETECTING: +- if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: +- confidence = self.get_confidence() +- if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: +- self.logger.debug('%s confidence = %s, we have a winner', +- charset_name, confidence) +- self._state = ProbingState.FOUND_IT +- elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: +- self.logger.debug('%s confidence = %s, below negative ' +- 'shortcut threshhold %s', charset_name, +- confidence, +- self.NEGATIVE_SHORTCUT_THRESHOLD) +- self._state = ProbingState.NOT_ME +- +- return self.state +- +- def get_confidence(self): +- r = 0.01 +- if self._total_seqs > 0: +- r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / +- self._total_seqs / self._model['typical_positive_ratio']) +- r = r * self._freq_char / self._total_char +- if r >= 1.0: +- r = 0.99 +- return r +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/sbcsgroupprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/sbcsgroupprober.py +deleted file mode 100644 +index 98e95dc..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/sbcsgroupprober.py ++++ /dev/null +@@ -1,73 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Universal charset detector code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 2001 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# Shy Shalom - original C code +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .charsetgroupprober import CharSetGroupProber +-from .sbcharsetprober import SingleByteCharSetProber +-from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, +- Latin5CyrillicModel, MacCyrillicModel, +- Ibm866Model, Ibm855Model) +-from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +-from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +-# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +-from .langthaimodel import TIS620ThaiModel +-from .langhebrewmodel import Win1255HebrewModel +-from .hebrewprober import HebrewProber +-from .langturkishmodel import Latin5TurkishModel +- +- +-class SBCSGroupProber(CharSetGroupProber): +- def __init__(self): +- super(SBCSGroupProber, self).__init__() +- self.probers = [ +- SingleByteCharSetProber(Win1251CyrillicModel), +- SingleByteCharSetProber(Koi8rModel), +- SingleByteCharSetProber(Latin5CyrillicModel), +- SingleByteCharSetProber(MacCyrillicModel), +- SingleByteCharSetProber(Ibm866Model), +- SingleByteCharSetProber(Ibm855Model), +- SingleByteCharSetProber(Latin7GreekModel), +- SingleByteCharSetProber(Win1253GreekModel), +- SingleByteCharSetProber(Latin5BulgarianModel), +- SingleByteCharSetProber(Win1251BulgarianModel), +- # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) +- # after we retrain model. +- # SingleByteCharSetProber(Latin2HungarianModel), +- # SingleByteCharSetProber(Win1250HungarianModel), +- SingleByteCharSetProber(TIS620ThaiModel), +- SingleByteCharSetProber(Latin5TurkishModel), +- ] +- hebrew_prober = HebrewProber() +- logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, +- False, hebrew_prober) +- visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, +- hebrew_prober) +- hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) +- self.probers.extend([hebrew_prober, logical_hebrew_prober, +- visual_hebrew_prober]) +- +- self.reset() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/sjisprober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/sjisprober.py +deleted file mode 100644 +index 9e29623..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/sjisprober.py ++++ /dev/null +@@ -1,92 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .mbcharsetprober import MultiByteCharSetProber +-from .codingstatemachine import CodingStateMachine +-from .chardistribution import SJISDistributionAnalysis +-from .jpcntx import SJISContextAnalysis +-from .mbcssm import SJIS_SM_MODEL +-from .enums import ProbingState, MachineState +- +- +-class SJISProber(MultiByteCharSetProber): +- def __init__(self): +- super(SJISProber, self).__init__() +- self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) +- self.distribution_analyzer = SJISDistributionAnalysis() +- self.context_analyzer = SJISContextAnalysis() +- self.reset() +- +- def reset(self): +- super(SJISProber, self).reset() +- self.context_analyzer.reset() +- +- @property +- def charset_name(self): +- return self.context_analyzer.charset_name +- +- @property +- def language(self): +- return "Japanese" +- +- def feed(self, byte_str): +- for i in range(len(byte_str)): +- coding_state = self.coding_sm.next_state(byte_str[i]) +- if coding_state == MachineState.ERROR: +- self.logger.debug('%s %s prober hit error at byte %s', +- self.charset_name, self.language, i) +- self._state = ProbingState.NOT_ME +- break +- elif coding_state == MachineState.ITS_ME: +- self._state = ProbingState.FOUND_IT +- break +- elif coding_state == MachineState.START: +- char_len = self.coding_sm.get_current_charlen() +- if i == 0: +- self._last_char[1] = byte_str[0] +- self.context_analyzer.feed(self._last_char[2 - char_len:], +- char_len) +- self.distribution_analyzer.feed(self._last_char, char_len) +- else: +- self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 +- - char_len], char_len) +- self.distribution_analyzer.feed(byte_str[i - 1:i + 1], +- char_len) +- +- self._last_char[0] = byte_str[-1] +- +- if self.state == ProbingState.DETECTING: +- if (self.context_analyzer.got_enough_data() and +- (self.get_confidence() > self.SHORTCUT_THRESHOLD)): +- self._state = ProbingState.FOUND_IT +- +- return self.state +- +- def get_confidence(self): +- context_conf = self.context_analyzer.get_confidence() +- distrib_conf = self.distribution_analyzer.get_confidence() +- return max(context_conf, distrib_conf) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/universaldetector.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/universaldetector.py +deleted file mode 100644 +index 7b4e92d..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/universaldetector.py ++++ /dev/null +@@ -1,286 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is Mozilla Universal charset detector code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 2001 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# Shy Shalom - original C code +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +-""" +-Module containing the UniversalDetector detector class, which is the primary +-class a user of ``chardet`` should use. +- +-:author: Mark Pilgrim (initial port to Python) +-:author: Shy Shalom (original C code) +-:author: Dan Blanchard (major refactoring for 3.0) +-:author: Ian Cordasco +-""" +- +- +-import codecs +-import logging +-import re +- +-from .charsetgroupprober import CharSetGroupProber +-from .enums import InputState, LanguageFilter, ProbingState +-from .escprober import EscCharSetProber +-from .latin1prober import Latin1Prober +-from .mbcsgroupprober import MBCSGroupProber +-from .sbcsgroupprober import SBCSGroupProber +- +- +-class UniversalDetector(object): +- """ +- The ``UniversalDetector`` class underlies the ``chardet.detect`` function +- and coordinates all of the different charset probers. +- +- To get a ``dict`` containing an encoding and its confidence, you can simply +- run: +- +- .. code:: +- +- u = UniversalDetector() +- u.feed(some_bytes) +- u.close() +- detected = u.result +- +- """ +- +- MINIMUM_THRESHOLD = 0.20 +- HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') +- ESC_DETECTOR = re.compile(b'(\033|~{)') +- WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') +- ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', +- 'iso-8859-2': 'Windows-1250', +- 'iso-8859-5': 'Windows-1251', +- 'iso-8859-6': 'Windows-1256', +- 'iso-8859-7': 'Windows-1253', +- 'iso-8859-8': 'Windows-1255', +- 'iso-8859-9': 'Windows-1254', +- 'iso-8859-13': 'Windows-1257'} +- +- def __init__(self, lang_filter=LanguageFilter.ALL): +- self._esc_charset_prober = None +- self._charset_probers = [] +- self.result = None +- self.done = None +- self._got_data = None +- self._input_state = None +- self._last_char = None +- self.lang_filter = lang_filter +- self.logger = logging.getLogger(__name__) +- self._has_win_bytes = None +- self.reset() +- +- def reset(self): +- """ +- Reset the UniversalDetector and all of its probers back to their +- initial states. This is called by ``__init__``, so you only need to +- call this directly in between analyses of different documents. +- """ +- self.result = {'encoding': None, 'confidence': 0.0, 'language': None} +- self.done = False +- self._got_data = False +- self._has_win_bytes = False +- self._input_state = InputState.PURE_ASCII +- self._last_char = b'' +- if self._esc_charset_prober: +- self._esc_charset_prober.reset() +- for prober in self._charset_probers: +- prober.reset() +- +- def feed(self, byte_str): +- """ +- Takes a chunk of a document and feeds it through all of the relevant +- charset probers. +- +- After calling ``feed``, you can check the value of the ``done`` +- attribute to see if you need to continue feeding the +- ``UniversalDetector`` more data, or if it has made a prediction +- (in the ``result`` attribute). +- +- .. note:: +- You should always call ``close`` when you're done feeding in your +- document if ``done`` is not already ``True``. +- """ +- if self.done: +- return +- +- if not len(byte_str): +- return +- +- if not isinstance(byte_str, bytearray): +- byte_str = bytearray(byte_str) +- +- # First check for known BOMs, since these are guaranteed to be correct +- if not self._got_data: +- # If the data starts with BOM, we know it is UTF +- if byte_str.startswith(codecs.BOM_UTF8): +- # EF BB BF UTF-8 with BOM +- self.result = {'encoding': "UTF-8-SIG", +- 'confidence': 1.0, +- 'language': ''} +- elif byte_str.startswith((codecs.BOM_UTF32_LE, +- codecs.BOM_UTF32_BE)): +- # FF FE 00 00 UTF-32, little-endian BOM +- # 00 00 FE FF UTF-32, big-endian BOM +- self.result = {'encoding': "UTF-32", +- 'confidence': 1.0, +- 'language': ''} +- elif byte_str.startswith(b'\xFE\xFF\x00\x00'): +- # FE FF 00 00 UCS-4, unusual octet order BOM (3412) +- self.result = {'encoding': "X-ISO-10646-UCS-4-3412", +- 'confidence': 1.0, +- 'language': ''} +- elif byte_str.startswith(b'\x00\x00\xFF\xFE'): +- # 00 00 FF FE UCS-4, unusual octet order BOM (2143) +- self.result = {'encoding': "X-ISO-10646-UCS-4-2143", +- 'confidence': 1.0, +- 'language': ''} +- elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): +- # FF FE UTF-16, little endian BOM +- # FE FF UTF-16, big endian BOM +- self.result = {'encoding': "UTF-16", +- 'confidence': 1.0, +- 'language': ''} +- +- self._got_data = True +- if self.result['encoding'] is not None: +- self.done = True +- return +- +- # If none of those matched and we've only see ASCII so far, check +- # for high bytes and escape sequences +- if self._input_state == InputState.PURE_ASCII: +- if self.HIGH_BYTE_DETECTOR.search(byte_str): +- self._input_state = InputState.HIGH_BYTE +- elif self._input_state == InputState.PURE_ASCII and \ +- self.ESC_DETECTOR.search(self._last_char + byte_str): +- self._input_state = InputState.ESC_ASCII +- +- self._last_char = byte_str[-1:] +- +- # If we've seen escape sequences, use the EscCharSetProber, which +- # uses a simple state machine to check for known escape sequences in +- # HZ and ISO-2022 encodings, since those are the only encodings that +- # use such sequences. +- if self._input_state == InputState.ESC_ASCII: +- if not self._esc_charset_prober: +- self._esc_charset_prober = EscCharSetProber(self.lang_filter) +- if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: +- self.result = {'encoding': +- self._esc_charset_prober.charset_name, +- 'confidence': +- self._esc_charset_prober.get_confidence(), +- 'language': +- self._esc_charset_prober.language} +- self.done = True +- # If we've seen high bytes (i.e., those with values greater than 127), +- # we need to do more complicated checks using all our multi-byte and +- # single-byte probers that are left. The single-byte probers +- # use character bigram distributions to determine the encoding, whereas +- # the multi-byte probers use a combination of character unigram and +- # bigram distributions. +- elif self._input_state == InputState.HIGH_BYTE: +- if not self._charset_probers: +- self._charset_probers = [MBCSGroupProber(self.lang_filter)] +- # If we're checking non-CJK encodings, use single-byte prober +- if self.lang_filter & LanguageFilter.NON_CJK: +- self._charset_probers.append(SBCSGroupProber()) +- self._charset_probers.append(Latin1Prober()) +- for prober in self._charset_probers: +- if prober.feed(byte_str) == ProbingState.FOUND_IT: +- self.result = {'encoding': prober.charset_name, +- 'confidence': prober.get_confidence(), +- 'language': prober.language} +- self.done = True +- break +- if self.WIN_BYTE_DETECTOR.search(byte_str): +- self._has_win_bytes = True +- +- def close(self): +- """ +- Stop analyzing the current document and come up with a final +- prediction. +- +- :returns: The ``result`` attribute, a ``dict`` with the keys +- `encoding`, `confidence`, and `language`. +- """ +- # Don't bother with checks if we're already done +- if self.done: +- return self.result +- self.done = True +- +- if not self._got_data: +- self.logger.debug('no data received!') +- +- # Default to ASCII if it is all we've seen so far +- elif self._input_state == InputState.PURE_ASCII: +- self.result = {'encoding': 'ascii', +- 'confidence': 1.0, +- 'language': ''} +- +- # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD +- elif self._input_state == InputState.HIGH_BYTE: +- prober_confidence = None +- max_prober_confidence = 0.0 +- max_prober = None +- for prober in self._charset_probers: +- if not prober: +- continue +- prober_confidence = prober.get_confidence() +- if prober_confidence > max_prober_confidence: +- max_prober_confidence = prober_confidence +- max_prober = prober +- if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): +- charset_name = max_prober.charset_name +- lower_charset_name = max_prober.charset_name.lower() +- confidence = max_prober.get_confidence() +- # Use Windows encoding name instead of ISO-8859 if we saw any +- # extra Windows-specific bytes +- if lower_charset_name.startswith('iso-8859'): +- if self._has_win_bytes: +- charset_name = self.ISO_WIN_MAP.get(lower_charset_name, +- charset_name) +- self.result = {'encoding': charset_name, +- 'confidence': confidence, +- 'language': max_prober.language} +- +- # Log all prober confidences if none met MINIMUM_THRESHOLD +- if self.logger.getEffectiveLevel() == logging.DEBUG: +- if self.result['encoding'] is None: +- self.logger.debug('no probers hit minimum threshold') +- for group_prober in self._charset_probers: +- if not group_prober: +- continue +- if isinstance(group_prober, CharSetGroupProber): +- for prober in group_prober.probers: +- self.logger.debug('%s %s confidence = %s', +- prober.charset_name, +- prober.language, +- prober.get_confidence()) +- else: +- self.logger.debug('%s %s confidence = %s', +- prober.charset_name, +- prober.language, +- prober.get_confidence()) +- return self.result +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/utf8prober.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/utf8prober.py +deleted file mode 100644 +index 6c3196c..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/utf8prober.py ++++ /dev/null +@@ -1,82 +0,0 @@ +-######################## BEGIN LICENSE BLOCK ######################## +-# The Original Code is mozilla.org code. +-# +-# The Initial Developer of the Original Code is +-# Netscape Communications Corporation. +-# Portions created by the Initial Developer are Copyright (C) 1998 +-# the Initial Developer. All Rights Reserved. +-# +-# Contributor(s): +-# Mark Pilgrim - port to Python +-# +-# This library is free software; you can redistribute it and/or +-# modify it under the terms of the GNU Lesser General Public +-# License as published by the Free Software Foundation; either +-# version 2.1 of the License, or (at your option) any later version. +-# +-# This library is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# Lesser General Public License for more details. +-# +-# You should have received a copy of the GNU Lesser General Public +-# License along with this library; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +-# 02110-1301 USA +-######################### END LICENSE BLOCK ######################### +- +-from .charsetprober import CharSetProber +-from .enums import ProbingState, MachineState +-from .codingstatemachine import CodingStateMachine +-from .mbcssm import UTF8_SM_MODEL +- +- +- +-class UTF8Prober(CharSetProber): +- ONE_CHAR_PROB = 0.5 +- +- def __init__(self): +- super(UTF8Prober, self).__init__() +- self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) +- self._num_mb_chars = None +- self.reset() +- +- def reset(self): +- super(UTF8Prober, self).reset() +- self.coding_sm.reset() +- self._num_mb_chars = 0 +- +- @property +- def charset_name(self): +- return "utf-8" +- +- @property +- def language(self): +- return "" +- +- def feed(self, byte_str): +- for c in byte_str: +- coding_state = self.coding_sm.next_state(c) +- if coding_state == MachineState.ERROR: +- self._state = ProbingState.NOT_ME +- break +- elif coding_state == MachineState.ITS_ME: +- self._state = ProbingState.FOUND_IT +- break +- elif coding_state == MachineState.START: +- if self.coding_sm.get_current_charlen() >= 2: +- self._num_mb_chars += 1 +- +- if self.state == ProbingState.DETECTING: +- if self.get_confidence() > self.SHORTCUT_THRESHOLD: +- self._state = ProbingState.FOUND_IT +- +- return self.state +- +- def get_confidence(self): +- unlike = 0.99 +- if self._num_mb_chars < 6: +- unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars +- return 1.0 - unlike +- else: +- return unlike +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/version.py b/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/version.py +deleted file mode 100644 +index bb2a34a..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/chardet/version.py ++++ /dev/null +@@ -1,9 +0,0 @@ +-""" +-This module exists only to simplify retrieving the version number of chardet +-from within setup.py and from chardet subpackages. +- +-:author: Dan Blanchard (dan.blanchard@gmail.com) +-""" +- +-__version__ = "3.0.4" +-VERSION = __version__.split('.') +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/__init__.py +deleted file mode 100644 +index 670e6b3..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/__init__.py ++++ /dev/null +@@ -1,7 +0,0 @@ +-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +-from .initialise import init, deinit, reinit, colorama_text +-from .ansi import Fore, Back, Style, Cursor +-from .ansitowin32 import AnsiToWin32 +- +-__version__ = '0.3.7' +- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/ansi.py b/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/ansi.py +deleted file mode 100644 +index 7877658..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/ansi.py ++++ /dev/null +@@ -1,102 +0,0 @@ +-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +-''' +-This module generates ANSI character codes to printing colors to terminals. +-See: http://en.wikipedia.org/wiki/ANSI_escape_code +-''' +- +-CSI = '\033[' +-OSC = '\033]' +-BEL = '\007' +- +- +-def code_to_chars(code): +- return CSI + str(code) + 'm' +- +-def set_title(title): +- return OSC + '2;' + title + BEL +- +-def clear_screen(mode=2): +- return CSI + str(mode) + 'J' +- +-def clear_line(mode=2): +- return CSI + str(mode) + 'K' +- +- +-class AnsiCodes(object): +- def __init__(self): +- # the subclasses declare class attributes which are numbers. +- # Upon instantiation we define instance attributes, which are the same +- # as the class attributes but wrapped with the ANSI escape sequence +- for name in dir(self): +- if not name.startswith('_'): +- value = getattr(self, name) +- setattr(self, name, code_to_chars(value)) +- +- +-class AnsiCursor(object): +- def UP(self, n=1): +- return CSI + str(n) + 'A' +- def DOWN(self, n=1): +- return CSI + str(n) + 'B' +- def FORWARD(self, n=1): +- return CSI + str(n) + 'C' +- def BACK(self, n=1): +- return CSI + str(n) + 'D' +- def POS(self, x=1, y=1): +- return CSI + str(y) + ';' + str(x) + 'H' +- +- +-class AnsiFore(AnsiCodes): +- BLACK = 30 +- RED = 31 +- GREEN = 32 +- YELLOW = 33 +- BLUE = 34 +- MAGENTA = 35 +- CYAN = 36 +- WHITE = 37 +- RESET = 39 +- +- # These are fairly well supported, but not part of the standard. +- LIGHTBLACK_EX = 90 +- LIGHTRED_EX = 91 +- LIGHTGREEN_EX = 92 +- LIGHTYELLOW_EX = 93 +- LIGHTBLUE_EX = 94 +- LIGHTMAGENTA_EX = 95 +- LIGHTCYAN_EX = 96 +- LIGHTWHITE_EX = 97 +- +- +-class AnsiBack(AnsiCodes): +- BLACK = 40 +- RED = 41 +- GREEN = 42 +- YELLOW = 43 +- BLUE = 44 +- MAGENTA = 45 +- CYAN = 46 +- WHITE = 47 +- RESET = 49 +- +- # These are fairly well supported, but not part of the standard. +- LIGHTBLACK_EX = 100 +- LIGHTRED_EX = 101 +- LIGHTGREEN_EX = 102 +- LIGHTYELLOW_EX = 103 +- LIGHTBLUE_EX = 104 +- LIGHTMAGENTA_EX = 105 +- LIGHTCYAN_EX = 106 +- LIGHTWHITE_EX = 107 +- +- +-class AnsiStyle(AnsiCodes): +- BRIGHT = 1 +- DIM = 2 +- NORMAL = 22 +- RESET_ALL = 0 +- +-Fore = AnsiFore() +-Back = AnsiBack() +-Style = AnsiStyle() +-Cursor = AnsiCursor() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/ansitowin32.py b/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/ansitowin32.py +deleted file mode 100644 +index b7ff6f2..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/ansitowin32.py ++++ /dev/null +@@ -1,236 +0,0 @@ +-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +-import re +-import sys +-import os +- +-from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +-from .winterm import WinTerm, WinColor, WinStyle +-from .win32 import windll, winapi_test +- +- +-winterm = None +-if windll is not None: +- winterm = WinTerm() +- +- +-def is_stream_closed(stream): +- return not hasattr(stream, 'closed') or stream.closed +- +- +-def is_a_tty(stream): +- return hasattr(stream, 'isatty') and stream.isatty() +- +- +-class StreamWrapper(object): +- ''' +- Wraps a stream (such as stdout), acting as a transparent proxy for all +- attribute access apart from method 'write()', which is delegated to our +- Converter instance. +- ''' +- def __init__(self, wrapped, converter): +- # double-underscore everything to prevent clashes with names of +- # attributes on the wrapped stream object. +- self.__wrapped = wrapped +- self.__convertor = converter +- +- def __getattr__(self, name): +- return getattr(self.__wrapped, name) +- +- def write(self, text): +- self.__convertor.write(text) +- +- +-class AnsiToWin32(object): +- ''' +- Implements a 'write()' method which, on Windows, will strip ANSI character +- sequences from the text, and if outputting to a tty, will convert them into +- win32 function calls. +- ''' +- ANSI_CSI_RE = re.compile('\001?\033\[((?:\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer +- ANSI_OSC_RE = re.compile('\001?\033\]((?:.|;)*?)(\x07)\002?') # Operating System Command +- +- def __init__(self, wrapped, convert=None, strip=None, autoreset=False): +- # The wrapped stream (normally sys.stdout or sys.stderr) +- self.wrapped = wrapped +- +- # should we reset colors to defaults after every .write() +- self.autoreset = autoreset +- +- # create the proxy wrapping our output stream +- self.stream = StreamWrapper(wrapped, self) +- +- on_windows = os.name == 'nt' +- # We test if the WinAPI works, because even if we are on Windows +- # we may be using a terminal that doesn't support the WinAPI +- # (e.g. Cygwin Terminal). In this case it's up to the terminal +- # to support the ANSI codes. +- conversion_supported = on_windows and winapi_test() +- +- # should we strip ANSI sequences from our output? +- if strip is None: +- strip = conversion_supported or (not is_stream_closed(wrapped) and not is_a_tty(wrapped)) +- self.strip = strip +- +- # should we should convert ANSI sequences into win32 calls? +- if convert is None: +- convert = conversion_supported and not is_stream_closed(wrapped) and is_a_tty(wrapped) +- self.convert = convert +- +- # dict of ansi codes to win32 functions and parameters +- self.win32_calls = self.get_win32_calls() +- +- # are we wrapping stderr? +- self.on_stderr = self.wrapped is sys.stderr +- +- def should_wrap(self): +- ''' +- True if this class is actually needed. If false, then the output +- stream will not be affected, nor will win32 calls be issued, so +- wrapping stdout is not actually required. This will generally be +- False on non-Windows platforms, unless optional functionality like +- autoreset has been requested using kwargs to init() +- ''' +- return self.convert or self.strip or self.autoreset +- +- def get_win32_calls(self): +- if self.convert and winterm: +- return { +- AnsiStyle.RESET_ALL: (winterm.reset_all, ), +- AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), +- AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), +- AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), +- AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), +- AnsiFore.RED: (winterm.fore, WinColor.RED), +- AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), +- AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), +- AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), +- AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), +- AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), +- AnsiFore.WHITE: (winterm.fore, WinColor.GREY), +- AnsiFore.RESET: (winterm.fore, ), +- AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), +- AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), +- AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), +- AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), +- AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), +- AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), +- AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), +- AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), +- AnsiBack.BLACK: (winterm.back, WinColor.BLACK), +- AnsiBack.RED: (winterm.back, WinColor.RED), +- AnsiBack.GREEN: (winterm.back, WinColor.GREEN), +- AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), +- AnsiBack.BLUE: (winterm.back, WinColor.BLUE), +- AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), +- AnsiBack.CYAN: (winterm.back, WinColor.CYAN), +- AnsiBack.WHITE: (winterm.back, WinColor.GREY), +- AnsiBack.RESET: (winterm.back, ), +- AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), +- AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), +- AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), +- AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), +- AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), +- AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), +- AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), +- AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), +- } +- return dict() +- +- def write(self, text): +- if self.strip or self.convert: +- self.write_and_convert(text) +- else: +- self.wrapped.write(text) +- self.wrapped.flush() +- if self.autoreset: +- self.reset_all() +- +- +- def reset_all(self): +- if self.convert: +- self.call_win32('m', (0,)) +- elif not self.strip and not is_stream_closed(self.wrapped): +- self.wrapped.write(Style.RESET_ALL) +- +- +- def write_and_convert(self, text): +- ''' +- Write the given text to our wrapped stream, stripping any ANSI +- sequences from the text, and optionally converting them into win32 +- calls. +- ''' +- cursor = 0 +- text = self.convert_osc(text) +- for match in self.ANSI_CSI_RE.finditer(text): +- start, end = match.span() +- self.write_plain_text(text, cursor, start) +- self.convert_ansi(*match.groups()) +- cursor = end +- self.write_plain_text(text, cursor, len(text)) +- +- +- def write_plain_text(self, text, start, end): +- if start < end: +- self.wrapped.write(text[start:end]) +- self.wrapped.flush() +- +- +- def convert_ansi(self, paramstring, command): +- if self.convert: +- params = self.extract_params(command, paramstring) +- self.call_win32(command, params) +- +- +- def extract_params(self, command, paramstring): +- if command in 'Hf': +- params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) +- while len(params) < 2: +- # defaults: +- params = params + (1,) +- else: +- params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) +- if len(params) == 0: +- # defaults: +- if command in 'JKm': +- params = (0,) +- elif command in 'ABCD': +- params = (1,) +- +- return params +- +- +- def call_win32(self, command, params): +- if command == 'm': +- for param in params: +- if param in self.win32_calls: +- func_args = self.win32_calls[param] +- func = func_args[0] +- args = func_args[1:] +- kwargs = dict(on_stderr=self.on_stderr) +- func(*args, **kwargs) +- elif command in 'J': +- winterm.erase_screen(params[0], on_stderr=self.on_stderr) +- elif command in 'K': +- winterm.erase_line(params[0], on_stderr=self.on_stderr) +- elif command in 'Hf': # cursor position - absolute +- winterm.set_cursor_position(params, on_stderr=self.on_stderr) +- elif command in 'ABCD': # cursor position - relative +- n = params[0] +- # A - up, B - down, C - forward, D - back +- x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] +- winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) +- +- +- def convert_osc(self, text): +- for match in self.ANSI_OSC_RE.finditer(text): +- start, end = match.span() +- text = text[:start] + text[end:] +- paramstring, command = match.groups() +- if command in '\x07': # \x07 = BEL +- params = paramstring.split(";") +- # 0 - change title and icon (we will only change title) +- # 1 - change icon (we don't support this) +- # 2 - change title +- if params[0] in '02': +- winterm.set_title(params[1]) +- return text +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/initialise.py b/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/initialise.py +deleted file mode 100644 +index 834962a..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/initialise.py ++++ /dev/null +@@ -1,82 +0,0 @@ +-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +-import atexit +-import contextlib +-import sys +- +-from .ansitowin32 import AnsiToWin32 +- +- +-orig_stdout = None +-orig_stderr = None +- +-wrapped_stdout = None +-wrapped_stderr = None +- +-atexit_done = False +- +- +-def reset_all(): +- if AnsiToWin32 is not None: # Issue #74: objects might become None at exit +- AnsiToWin32(orig_stdout).reset_all() +- +- +-def init(autoreset=False, convert=None, strip=None, wrap=True): +- +- if not wrap and any([autoreset, convert, strip]): +- raise ValueError('wrap=False conflicts with any other arg=True') +- +- global wrapped_stdout, wrapped_stderr +- global orig_stdout, orig_stderr +- +- orig_stdout = sys.stdout +- orig_stderr = sys.stderr +- +- if sys.stdout is None: +- wrapped_stdout = None +- else: +- sys.stdout = wrapped_stdout = \ +- wrap_stream(orig_stdout, convert, strip, autoreset, wrap) +- if sys.stderr is None: +- wrapped_stderr = None +- else: +- sys.stderr = wrapped_stderr = \ +- wrap_stream(orig_stderr, convert, strip, autoreset, wrap) +- +- global atexit_done +- if not atexit_done: +- atexit.register(reset_all) +- atexit_done = True +- +- +-def deinit(): +- if orig_stdout is not None: +- sys.stdout = orig_stdout +- if orig_stderr is not None: +- sys.stderr = orig_stderr +- +- +-@contextlib.contextmanager +-def colorama_text(*args, **kwargs): +- init(*args, **kwargs) +- try: +- yield +- finally: +- deinit() +- +- +-def reinit(): +- if wrapped_stdout is not None: +- sys.stdout = wrapped_stdout +- if wrapped_stderr is not None: +- sys.stderr = wrapped_stderr +- +- +-def wrap_stream(stream, convert, strip, autoreset, wrap): +- if wrap: +- wrapper = AnsiToWin32(stream, +- convert=convert, strip=strip, autoreset=autoreset) +- if wrapper.should_wrap(): +- stream = wrapper.stream +- return stream +- +- +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/win32.py b/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/win32.py +deleted file mode 100644 +index 3d1d2f2..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/win32.py ++++ /dev/null +@@ -1,154 +0,0 @@ +-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +- +-# from winbase.h +-STDOUT = -11 +-STDERR = -12 +- +-try: +- import ctypes +- from ctypes import LibraryLoader +- windll = LibraryLoader(ctypes.WinDLL) +- from ctypes import wintypes +-except (AttributeError, ImportError): +- windll = None +- SetConsoleTextAttribute = lambda *_: None +- winapi_test = lambda *_: None +-else: +- from ctypes import byref, Structure, c_char, POINTER +- +- COORD = wintypes._COORD +- +- class CONSOLE_SCREEN_BUFFER_INFO(Structure): +- """struct in wincon.h.""" +- _fields_ = [ +- ("dwSize", COORD), +- ("dwCursorPosition", COORD), +- ("wAttributes", wintypes.WORD), +- ("srWindow", wintypes.SMALL_RECT), +- ("dwMaximumWindowSize", COORD), +- ] +- def __str__(self): +- return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( +- self.dwSize.Y, self.dwSize.X +- , self.dwCursorPosition.Y, self.dwCursorPosition.X +- , self.wAttributes +- , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right +- , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X +- ) +- +- _GetStdHandle = windll.kernel32.GetStdHandle +- _GetStdHandle.argtypes = [ +- wintypes.DWORD, +- ] +- _GetStdHandle.restype = wintypes.HANDLE +- +- _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo +- _GetConsoleScreenBufferInfo.argtypes = [ +- wintypes.HANDLE, +- POINTER(CONSOLE_SCREEN_BUFFER_INFO), +- ] +- _GetConsoleScreenBufferInfo.restype = wintypes.BOOL +- +- _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute +- _SetConsoleTextAttribute.argtypes = [ +- wintypes.HANDLE, +- wintypes.WORD, +- ] +- _SetConsoleTextAttribute.restype = wintypes.BOOL +- +- _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition +- _SetConsoleCursorPosition.argtypes = [ +- wintypes.HANDLE, +- COORD, +- ] +- _SetConsoleCursorPosition.restype = wintypes.BOOL +- +- _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA +- _FillConsoleOutputCharacterA.argtypes = [ +- wintypes.HANDLE, +- c_char, +- wintypes.DWORD, +- COORD, +- POINTER(wintypes.DWORD), +- ] +- _FillConsoleOutputCharacterA.restype = wintypes.BOOL +- +- _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute +- _FillConsoleOutputAttribute.argtypes = [ +- wintypes.HANDLE, +- wintypes.WORD, +- wintypes.DWORD, +- COORD, +- POINTER(wintypes.DWORD), +- ] +- _FillConsoleOutputAttribute.restype = wintypes.BOOL +- +- _SetConsoleTitleW = windll.kernel32.SetConsoleTitleA +- _SetConsoleTitleW.argtypes = [ +- wintypes.LPCSTR +- ] +- _SetConsoleTitleW.restype = wintypes.BOOL +- +- handles = { +- STDOUT: _GetStdHandle(STDOUT), +- STDERR: _GetStdHandle(STDERR), +- } +- +- def winapi_test(): +- handle = handles[STDOUT] +- csbi = CONSOLE_SCREEN_BUFFER_INFO() +- success = _GetConsoleScreenBufferInfo( +- handle, byref(csbi)) +- return bool(success) +- +- def GetConsoleScreenBufferInfo(stream_id=STDOUT): +- handle = handles[stream_id] +- csbi = CONSOLE_SCREEN_BUFFER_INFO() +- success = _GetConsoleScreenBufferInfo( +- handle, byref(csbi)) +- return csbi +- +- def SetConsoleTextAttribute(stream_id, attrs): +- handle = handles[stream_id] +- return _SetConsoleTextAttribute(handle, attrs) +- +- def SetConsoleCursorPosition(stream_id, position, adjust=True): +- position = COORD(*position) +- # If the position is out of range, do nothing. +- if position.Y <= 0 or position.X <= 0: +- return +- # Adjust for Windows' SetConsoleCursorPosition: +- # 1. being 0-based, while ANSI is 1-based. +- # 2. expecting (x,y), while ANSI uses (y,x). +- adjusted_position = COORD(position.Y - 1, position.X - 1) +- if adjust: +- # Adjust for viewport's scroll position +- sr = GetConsoleScreenBufferInfo(STDOUT).srWindow +- adjusted_position.Y += sr.Top +- adjusted_position.X += sr.Left +- # Resume normal processing +- handle = handles[stream_id] +- return _SetConsoleCursorPosition(handle, adjusted_position) +- +- def FillConsoleOutputCharacter(stream_id, char, length, start): +- handle = handles[stream_id] +- char = c_char(char.encode()) +- length = wintypes.DWORD(length) +- num_written = wintypes.DWORD(0) +- # Note that this is hard-coded for ANSI (vs wide) bytes. +- success = _FillConsoleOutputCharacterA( +- handle, char, length, start, byref(num_written)) +- return num_written.value +- +- def FillConsoleOutputAttribute(stream_id, attr, length, start): +- ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' +- handle = handles[stream_id] +- attribute = wintypes.WORD(attr) +- length = wintypes.DWORD(length) +- num_written = wintypes.DWORD(0) +- # Note that this is hard-coded for ANSI (vs wide) bytes. +- return _FillConsoleOutputAttribute( +- handle, attribute, length, start, byref(num_written)) +- +- def SetConsoleTitle(title): +- return _SetConsoleTitleW(title) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/winterm.py b/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/winterm.py +deleted file mode 100644 +index 60309d3..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/colorama/winterm.py ++++ /dev/null +@@ -1,162 +0,0 @@ +-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +-from . import win32 +- +- +-# from wincon.h +-class WinColor(object): +- BLACK = 0 +- BLUE = 1 +- GREEN = 2 +- CYAN = 3 +- RED = 4 +- MAGENTA = 5 +- YELLOW = 6 +- GREY = 7 +- +-# from wincon.h +-class WinStyle(object): +- NORMAL = 0x00 # dim text, dim background +- BRIGHT = 0x08 # bright text, dim background +- BRIGHT_BACKGROUND = 0x80 # dim text, bright background +- +-class WinTerm(object): +- +- def __init__(self): +- self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes +- self.set_attrs(self._default) +- self._default_fore = self._fore +- self._default_back = self._back +- self._default_style = self._style +- # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. +- # So that LIGHT_EX colors and BRIGHT style do not clobber each other, +- # we track them separately, since LIGHT_EX is overwritten by Fore/Back +- # and BRIGHT is overwritten by Style codes. +- self._light = 0 +- +- def get_attrs(self): +- return self._fore + self._back * 16 + (self._style | self._light) +- +- def set_attrs(self, value): +- self._fore = value & 7 +- self._back = (value >> 4) & 7 +- self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) +- +- def reset_all(self, on_stderr=None): +- self.set_attrs(self._default) +- self.set_console(attrs=self._default) +- +- def fore(self, fore=None, light=False, on_stderr=False): +- if fore is None: +- fore = self._default_fore +- self._fore = fore +- # Emulate LIGHT_EX with BRIGHT Style +- if light: +- self._light |= WinStyle.BRIGHT +- else: +- self._light &= ~WinStyle.BRIGHT +- self.set_console(on_stderr=on_stderr) +- +- def back(self, back=None, light=False, on_stderr=False): +- if back is None: +- back = self._default_back +- self._back = back +- # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style +- if light: +- self._light |= WinStyle.BRIGHT_BACKGROUND +- else: +- self._light &= ~WinStyle.BRIGHT_BACKGROUND +- self.set_console(on_stderr=on_stderr) +- +- def style(self, style=None, on_stderr=False): +- if style is None: +- style = self._default_style +- self._style = style +- self.set_console(on_stderr=on_stderr) +- +- def set_console(self, attrs=None, on_stderr=False): +- if attrs is None: +- attrs = self.get_attrs() +- handle = win32.STDOUT +- if on_stderr: +- handle = win32.STDERR +- win32.SetConsoleTextAttribute(handle, attrs) +- +- def get_position(self, handle): +- position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition +- # Because Windows coordinates are 0-based, +- # and win32.SetConsoleCursorPosition expects 1-based. +- position.X += 1 +- position.Y += 1 +- return position +- +- def set_cursor_position(self, position=None, on_stderr=False): +- if position is None: +- # I'm not currently tracking the position, so there is no default. +- # position = self.get_position() +- return +- handle = win32.STDOUT +- if on_stderr: +- handle = win32.STDERR +- win32.SetConsoleCursorPosition(handle, position) +- +- def cursor_adjust(self, x, y, on_stderr=False): +- handle = win32.STDOUT +- if on_stderr: +- handle = win32.STDERR +- position = self.get_position(handle) +- adjusted_position = (position.Y + y, position.X + x) +- win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) +- +- def erase_screen(self, mode=0, on_stderr=False): +- # 0 should clear from the cursor to the end of the screen. +- # 1 should clear from the cursor to the beginning of the screen. +- # 2 should clear the entire screen, and move cursor to (1,1) +- handle = win32.STDOUT +- if on_stderr: +- handle = win32.STDERR +- csbi = win32.GetConsoleScreenBufferInfo(handle) +- # get the number of character cells in the current buffer +- cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y +- # get number of character cells before current cursor position +- cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X +- if mode == 0: +- from_coord = csbi.dwCursorPosition +- cells_to_erase = cells_in_screen - cells_before_cursor +- if mode == 1: +- from_coord = win32.COORD(0, 0) +- cells_to_erase = cells_before_cursor +- elif mode == 2: +- from_coord = win32.COORD(0, 0) +- cells_to_erase = cells_in_screen +- # fill the entire screen with blanks +- win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) +- # now set the buffer's attributes accordingly +- win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) +- if mode == 2: +- # put the cursor where needed +- win32.SetConsoleCursorPosition(handle, (1, 1)) +- +- def erase_line(self, mode=0, on_stderr=False): +- # 0 should clear from the cursor to the end of the line. +- # 1 should clear from the cursor to the beginning of the line. +- # 2 should clear the entire line. +- handle = win32.STDOUT +- if on_stderr: +- handle = win32.STDERR +- csbi = win32.GetConsoleScreenBufferInfo(handle) +- if mode == 0: +- from_coord = csbi.dwCursorPosition +- cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X +- if mode == 1: +- from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) +- cells_to_erase = csbi.dwCursorPosition.X +- elif mode == 2: +- from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) +- cells_to_erase = csbi.dwSize.X +- # fill the entire screen with blanks +- win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) +- # now set the buffer's attributes accordingly +- win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) +- +- def set_title(self, title): +- win32.SetConsoleTitle(title) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/__init__.py +deleted file mode 100644 +index d186b0a..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/__init__.py ++++ /dev/null +@@ -1,23 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2012-2016 Vinay Sajip. +-# Licensed to the Python Software Foundation under a contributor agreement. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-import logging +- +-__version__ = '0.2.4' +- +-class DistlibException(Exception): +- pass +- +-try: +- from logging import NullHandler +-except ImportError: # pragma: no cover +- class NullHandler(logging.Handler): +- def handle(self, record): pass +- def emit(self, record): pass +- def createLock(self): self.lock = None +- +-logger = logging.getLogger(__name__) +-logger.addHandler(NullHandler()) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/__init__.py +deleted file mode 100644 +index f7dbf4c..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/__init__.py ++++ /dev/null +@@ -1,6 +0,0 @@ +-"""Modules copied from Python 3 standard libraries, for internal use only. +- +-Individual classes and functions are found in d2._backport.misc. Intended +-usage is to always import things missing from 3.1 from that module: the +-built-in/stdlib objects will be used if found. +-""" +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/misc.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/misc.py +deleted file mode 100644 +index cfb318d..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/misc.py ++++ /dev/null +@@ -1,41 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2012 The Python Software Foundation. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-"""Backports for individual classes and functions.""" +- +-import os +-import sys +- +-__all__ = ['cache_from_source', 'callable', 'fsencode'] +- +- +-try: +- from imp import cache_from_source +-except ImportError: +- def cache_from_source(py_file, debug=__debug__): +- ext = debug and 'c' or 'o' +- return py_file + ext +- +- +-try: +- callable = callable +-except NameError: +- from collections import Callable +- +- def callable(obj): +- return isinstance(obj, Callable) +- +- +-try: +- fsencode = os.fsencode +-except AttributeError: +- def fsencode(filename): +- if isinstance(filename, bytes): +- return filename +- elif isinstance(filename, str): +- return filename.encode(sys.getfilesystemencoding()) +- else: +- raise TypeError("expect bytes or str, not %s" % +- type(filename).__name__) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/shutil.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/shutil.py +deleted file mode 100644 +index 159e49e..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/shutil.py ++++ /dev/null +@@ -1,761 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2012 The Python Software Foundation. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-"""Utility functions for copying and archiving files and directory trees. +- +-XXX The functions here don't copy the resource fork or other metadata on Mac. +- +-""" +- +-import os +-import sys +-import stat +-from os.path import abspath +-import fnmatch +-import collections +-import errno +-from . import tarfile +- +-try: +- import bz2 +- _BZ2_SUPPORTED = True +-except ImportError: +- _BZ2_SUPPORTED = False +- +-try: +- from pwd import getpwnam +-except ImportError: +- getpwnam = None +- +-try: +- from grp import getgrnam +-except ImportError: +- getgrnam = None +- +-__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", +- "copytree", "move", "rmtree", "Error", "SpecialFileError", +- "ExecError", "make_archive", "get_archive_formats", +- "register_archive_format", "unregister_archive_format", +- "get_unpack_formats", "register_unpack_format", +- "unregister_unpack_format", "unpack_archive", "ignore_patterns"] +- +-class Error(EnvironmentError): +- pass +- +-class SpecialFileError(EnvironmentError): +- """Raised when trying to do a kind of operation (e.g. copying) which is +- not supported on a special file (e.g. a named pipe)""" +- +-class ExecError(EnvironmentError): +- """Raised when a command could not be executed""" +- +-class ReadError(EnvironmentError): +- """Raised when an archive cannot be read""" +- +-class RegistryError(Exception): +- """Raised when a registry operation with the archiving +- and unpacking registries fails""" +- +- +-try: +- WindowsError +-except NameError: +- WindowsError = None +- +-def copyfileobj(fsrc, fdst, length=16*1024): +- """copy data from file-like object fsrc to file-like object fdst""" +- while 1: +- buf = fsrc.read(length) +- if not buf: +- break +- fdst.write(buf) +- +-def _samefile(src, dst): +- # Macintosh, Unix. +- if hasattr(os.path, 'samefile'): +- try: +- return os.path.samefile(src, dst) +- except OSError: +- return False +- +- # All other platforms: check for same pathname. +- return (os.path.normcase(os.path.abspath(src)) == +- os.path.normcase(os.path.abspath(dst))) +- +-def copyfile(src, dst): +- """Copy data from src to dst""" +- if _samefile(src, dst): +- raise Error("`%s` and `%s` are the same file" % (src, dst)) +- +- for fn in [src, dst]: +- try: +- st = os.stat(fn) +- except OSError: +- # File most likely does not exist +- pass +- else: +- # XXX What about other special files? (sockets, devices...) +- if stat.S_ISFIFO(st.st_mode): +- raise SpecialFileError("`%s` is a named pipe" % fn) +- +- with open(src, 'rb') as fsrc: +- with open(dst, 'wb') as fdst: +- copyfileobj(fsrc, fdst) +- +-def copymode(src, dst): +- """Copy mode bits from src to dst""" +- if hasattr(os, 'chmod'): +- st = os.stat(src) +- mode = stat.S_IMODE(st.st_mode) +- os.chmod(dst, mode) +- +-def copystat(src, dst): +- """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" +- st = os.stat(src) +- mode = stat.S_IMODE(st.st_mode) +- if hasattr(os, 'utime'): +- os.utime(dst, (st.st_atime, st.st_mtime)) +- if hasattr(os, 'chmod'): +- os.chmod(dst, mode) +- if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): +- try: +- os.chflags(dst, st.st_flags) +- except OSError as why: +- if (not hasattr(errno, 'EOPNOTSUPP') or +- why.errno != errno.EOPNOTSUPP): +- raise +- +-def copy(src, dst): +- """Copy data and mode bits ("cp src dst"). +- +- The destination may be a directory. +- +- """ +- if os.path.isdir(dst): +- dst = os.path.join(dst, os.path.basename(src)) +- copyfile(src, dst) +- copymode(src, dst) +- +-def copy2(src, dst): +- """Copy data and all stat info ("cp -p src dst"). +- +- The destination may be a directory. +- +- """ +- if os.path.isdir(dst): +- dst = os.path.join(dst, os.path.basename(src)) +- copyfile(src, dst) +- copystat(src, dst) +- +-def ignore_patterns(*patterns): +- """Function that can be used as copytree() ignore parameter. +- +- Patterns is a sequence of glob-style patterns +- that are used to exclude files""" +- def _ignore_patterns(path, names): +- ignored_names = [] +- for pattern in patterns: +- ignored_names.extend(fnmatch.filter(names, pattern)) +- return set(ignored_names) +- return _ignore_patterns +- +-def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, +- ignore_dangling_symlinks=False): +- """Recursively copy a directory tree. +- +- The destination directory must not already exist. +- If exception(s) occur, an Error is raised with a list of reasons. +- +- If the optional symlinks flag is true, symbolic links in the +- source tree result in symbolic links in the destination tree; if +- it is false, the contents of the files pointed to by symbolic +- links are copied. If the file pointed by the symlink doesn't +- exist, an exception will be added in the list of errors raised in +- an Error exception at the end of the copy process. +- +- You can set the optional ignore_dangling_symlinks flag to true if you +- want to silence this exception. Notice that this has no effect on +- platforms that don't support os.symlink. +- +- The optional ignore argument is a callable. If given, it +- is called with the `src` parameter, which is the directory +- being visited by copytree(), and `names` which is the list of +- `src` contents, as returned by os.listdir(): +- +- callable(src, names) -> ignored_names +- +- Since copytree() is called recursively, the callable will be +- called once for each directory that is copied. It returns a +- list of names relative to the `src` directory that should +- not be copied. +- +- The optional copy_function argument is a callable that will be used +- to copy each file. It will be called with the source path and the +- destination path as arguments. By default, copy2() is used, but any +- function that supports the same signature (like copy()) can be used. +- +- """ +- names = os.listdir(src) +- if ignore is not None: +- ignored_names = ignore(src, names) +- else: +- ignored_names = set() +- +- os.makedirs(dst) +- errors = [] +- for name in names: +- if name in ignored_names: +- continue +- srcname = os.path.join(src, name) +- dstname = os.path.join(dst, name) +- try: +- if os.path.islink(srcname): +- linkto = os.readlink(srcname) +- if symlinks: +- os.symlink(linkto, dstname) +- else: +- # ignore dangling symlink if the flag is on +- if not os.path.exists(linkto) and ignore_dangling_symlinks: +- continue +- # otherwise let the copy occurs. copy2 will raise an error +- copy_function(srcname, dstname) +- elif os.path.isdir(srcname): +- copytree(srcname, dstname, symlinks, ignore, copy_function) +- else: +- # Will raise a SpecialFileError for unsupported file types +- copy_function(srcname, dstname) +- # catch the Error from the recursive copytree so that we can +- # continue with other files +- except Error as err: +- errors.extend(err.args[0]) +- except EnvironmentError as why: +- errors.append((srcname, dstname, str(why))) +- try: +- copystat(src, dst) +- except OSError as why: +- if WindowsError is not None and isinstance(why, WindowsError): +- # Copying file access times may fail on Windows +- pass +- else: +- errors.extend((src, dst, str(why))) +- if errors: +- raise Error(errors) +- +-def rmtree(path, ignore_errors=False, onerror=None): +- """Recursively delete a directory tree. +- +- If ignore_errors is set, errors are ignored; otherwise, if onerror +- is set, it is called to handle the error with arguments (func, +- path, exc_info) where func is os.listdir, os.remove, or os.rmdir; +- path is the argument to that function that caused it to fail; and +- exc_info is a tuple returned by sys.exc_info(). If ignore_errors +- is false and onerror is None, an exception is raised. +- +- """ +- if ignore_errors: +- def onerror(*args): +- pass +- elif onerror is None: +- def onerror(*args): +- raise +- try: +- if os.path.islink(path): +- # symlinks to directories are forbidden, see bug #1669 +- raise OSError("Cannot call rmtree on a symbolic link") +- except OSError: +- onerror(os.path.islink, path, sys.exc_info()) +- # can't continue even if onerror hook returns +- return +- names = [] +- try: +- names = os.listdir(path) +- except os.error: +- onerror(os.listdir, path, sys.exc_info()) +- for name in names: +- fullname = os.path.join(path, name) +- try: +- mode = os.lstat(fullname).st_mode +- except os.error: +- mode = 0 +- if stat.S_ISDIR(mode): +- rmtree(fullname, ignore_errors, onerror) +- else: +- try: +- os.remove(fullname) +- except os.error: +- onerror(os.remove, fullname, sys.exc_info()) +- try: +- os.rmdir(path) +- except os.error: +- onerror(os.rmdir, path, sys.exc_info()) +- +- +-def _basename(path): +- # A basename() variant which first strips the trailing slash, if present. +- # Thus we always get the last component of the path, even for directories. +- return os.path.basename(path.rstrip(os.path.sep)) +- +-def move(src, dst): +- """Recursively move a file or directory to another location. This is +- similar to the Unix "mv" command. +- +- If the destination is a directory or a symlink to a directory, the source +- is moved inside the directory. The destination path must not already +- exist. +- +- If the destination already exists but is not a directory, it may be +- overwritten depending on os.rename() semantics. +- +- If the destination is on our current filesystem, then rename() is used. +- Otherwise, src is copied to the destination and then removed. +- A lot more could be done here... A look at a mv.c shows a lot of +- the issues this implementation glosses over. +- +- """ +- real_dst = dst +- if os.path.isdir(dst): +- if _samefile(src, dst): +- # We might be on a case insensitive filesystem, +- # perform the rename anyway. +- os.rename(src, dst) +- return +- +- real_dst = os.path.join(dst, _basename(src)) +- if os.path.exists(real_dst): +- raise Error("Destination path '%s' already exists" % real_dst) +- try: +- os.rename(src, real_dst) +- except OSError: +- if os.path.isdir(src): +- if _destinsrc(src, dst): +- raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) +- copytree(src, real_dst, symlinks=True) +- rmtree(src) +- else: +- copy2(src, real_dst) +- os.unlink(src) +- +-def _destinsrc(src, dst): +- src = abspath(src) +- dst = abspath(dst) +- if not src.endswith(os.path.sep): +- src += os.path.sep +- if not dst.endswith(os.path.sep): +- dst += os.path.sep +- return dst.startswith(src) +- +-def _get_gid(name): +- """Returns a gid, given a group name.""" +- if getgrnam is None or name is None: +- return None +- try: +- result = getgrnam(name) +- except KeyError: +- result = None +- if result is not None: +- return result[2] +- return None +- +-def _get_uid(name): +- """Returns an uid, given a user name.""" +- if getpwnam is None or name is None: +- return None +- try: +- result = getpwnam(name) +- except KeyError: +- result = None +- if result is not None: +- return result[2] +- return None +- +-def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, +- owner=None, group=None, logger=None): +- """Create a (possibly compressed) tar file from all the files under +- 'base_dir'. +- +- 'compress' must be "gzip" (the default), "bzip2", or None. +- +- 'owner' and 'group' can be used to define an owner and a group for the +- archive that is being built. If not provided, the current owner and group +- will be used. +- +- The output tar file will be named 'base_name' + ".tar", possibly plus +- the appropriate compression extension (".gz", or ".bz2"). +- +- Returns the output filename. +- """ +- tar_compression = {'gzip': 'gz', None: ''} +- compress_ext = {'gzip': '.gz'} +- +- if _BZ2_SUPPORTED: +- tar_compression['bzip2'] = 'bz2' +- compress_ext['bzip2'] = '.bz2' +- +- # flags for compression program, each element of list will be an argument +- if compress is not None and compress not in compress_ext: +- raise ValueError("bad value for 'compress', or compression format not " +- "supported : {0}".format(compress)) +- +- archive_name = base_name + '.tar' + compress_ext.get(compress, '') +- archive_dir = os.path.dirname(archive_name) +- +- if not os.path.exists(archive_dir): +- if logger is not None: +- logger.info("creating %s", archive_dir) +- if not dry_run: +- os.makedirs(archive_dir) +- +- # creating the tarball +- if logger is not None: +- logger.info('Creating tar archive') +- +- uid = _get_uid(owner) +- gid = _get_gid(group) +- +- def _set_uid_gid(tarinfo): +- if gid is not None: +- tarinfo.gid = gid +- tarinfo.gname = group +- if uid is not None: +- tarinfo.uid = uid +- tarinfo.uname = owner +- return tarinfo +- +- if not dry_run: +- tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) +- try: +- tar.add(base_dir, filter=_set_uid_gid) +- finally: +- tar.close() +- +- return archive_name +- +-def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): +- # XXX see if we want to keep an external call here +- if verbose: +- zipoptions = "-r" +- else: +- zipoptions = "-rq" +- from distutils.errors import DistutilsExecError +- from distutils.spawn import spawn +- try: +- spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) +- except DistutilsExecError: +- # XXX really should distinguish between "couldn't find +- # external 'zip' command" and "zip failed". +- raise ExecError("unable to create zip file '%s': " +- "could neither import the 'zipfile' module nor " +- "find a standalone zip utility") % zip_filename +- +-def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): +- """Create a zip file from all the files under 'base_dir'. +- +- The output zip file will be named 'base_name' + ".zip". Uses either the +- "zipfile" Python module (if available) or the InfoZIP "zip" utility +- (if installed and found on the default search path). If neither tool is +- available, raises ExecError. Returns the name of the output zip +- file. +- """ +- zip_filename = base_name + ".zip" +- archive_dir = os.path.dirname(base_name) +- +- if not os.path.exists(archive_dir): +- if logger is not None: +- logger.info("creating %s", archive_dir) +- if not dry_run: +- os.makedirs(archive_dir) +- +- # If zipfile module is not available, try spawning an external 'zip' +- # command. +- try: +- import zipfile +- except ImportError: +- zipfile = None +- +- if zipfile is None: +- _call_external_zip(base_dir, zip_filename, verbose, dry_run) +- else: +- if logger is not None: +- logger.info("creating '%s' and adding '%s' to it", +- zip_filename, base_dir) +- +- if not dry_run: +- zip = zipfile.ZipFile(zip_filename, "w", +- compression=zipfile.ZIP_DEFLATED) +- +- for dirpath, dirnames, filenames in os.walk(base_dir): +- for name in filenames: +- path = os.path.normpath(os.path.join(dirpath, name)) +- if os.path.isfile(path): +- zip.write(path, path) +- if logger is not None: +- logger.info("adding '%s'", path) +- zip.close() +- +- return zip_filename +- +-_ARCHIVE_FORMATS = { +- 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), +- 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), +- 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), +- 'zip': (_make_zipfile, [], "ZIP file"), +- } +- +-if _BZ2_SUPPORTED: +- _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], +- "bzip2'ed tar-file") +- +-def get_archive_formats(): +- """Returns a list of supported formats for archiving and unarchiving. +- +- Each element of the returned sequence is a tuple (name, description) +- """ +- formats = [(name, registry[2]) for name, registry in +- _ARCHIVE_FORMATS.items()] +- formats.sort() +- return formats +- +-def register_archive_format(name, function, extra_args=None, description=''): +- """Registers an archive format. +- +- name is the name of the format. function is the callable that will be +- used to create archives. If provided, extra_args is a sequence of +- (name, value) tuples that will be passed as arguments to the callable. +- description can be provided to describe the format, and will be returned +- by the get_archive_formats() function. +- """ +- if extra_args is None: +- extra_args = [] +- if not isinstance(function, collections.Callable): +- raise TypeError('The %s object is not callable' % function) +- if not isinstance(extra_args, (tuple, list)): +- raise TypeError('extra_args needs to be a sequence') +- for element in extra_args: +- if not isinstance(element, (tuple, list)) or len(element) !=2: +- raise TypeError('extra_args elements are : (arg_name, value)') +- +- _ARCHIVE_FORMATS[name] = (function, extra_args, description) +- +-def unregister_archive_format(name): +- del _ARCHIVE_FORMATS[name] +- +-def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, +- dry_run=0, owner=None, group=None, logger=None): +- """Create an archive file (eg. zip or tar). +- +- 'base_name' is the name of the file to create, minus any format-specific +- extension; 'format' is the archive format: one of "zip", "tar", "bztar" +- or "gztar". +- +- 'root_dir' is a directory that will be the root directory of the +- archive; ie. we typically chdir into 'root_dir' before creating the +- archive. 'base_dir' is the directory where we start archiving from; +- ie. 'base_dir' will be the common prefix of all files and +- directories in the archive. 'root_dir' and 'base_dir' both default +- to the current directory. Returns the name of the archive file. +- +- 'owner' and 'group' are used when creating a tar archive. By default, +- uses the current owner and group. +- """ +- save_cwd = os.getcwd() +- if root_dir is not None: +- if logger is not None: +- logger.debug("changing into '%s'", root_dir) +- base_name = os.path.abspath(base_name) +- if not dry_run: +- os.chdir(root_dir) +- +- if base_dir is None: +- base_dir = os.curdir +- +- kwargs = {'dry_run': dry_run, 'logger': logger} +- +- try: +- format_info = _ARCHIVE_FORMATS[format] +- except KeyError: +- raise ValueError("unknown archive format '%s'" % format) +- +- func = format_info[0] +- for arg, val in format_info[1]: +- kwargs[arg] = val +- +- if format != 'zip': +- kwargs['owner'] = owner +- kwargs['group'] = group +- +- try: +- filename = func(base_name, base_dir, **kwargs) +- finally: +- if root_dir is not None: +- if logger is not None: +- logger.debug("changing back to '%s'", save_cwd) +- os.chdir(save_cwd) +- +- return filename +- +- +-def get_unpack_formats(): +- """Returns a list of supported formats for unpacking. +- +- Each element of the returned sequence is a tuple +- (name, extensions, description) +- """ +- formats = [(name, info[0], info[3]) for name, info in +- _UNPACK_FORMATS.items()] +- formats.sort() +- return formats +- +-def _check_unpack_options(extensions, function, extra_args): +- """Checks what gets registered as an unpacker.""" +- # first make sure no other unpacker is registered for this extension +- existing_extensions = {} +- for name, info in _UNPACK_FORMATS.items(): +- for ext in info[0]: +- existing_extensions[ext] = name +- +- for extension in extensions: +- if extension in existing_extensions: +- msg = '%s is already registered for "%s"' +- raise RegistryError(msg % (extension, +- existing_extensions[extension])) +- +- if not isinstance(function, collections.Callable): +- raise TypeError('The registered function must be a callable') +- +- +-def register_unpack_format(name, extensions, function, extra_args=None, +- description=''): +- """Registers an unpack format. +- +- `name` is the name of the format. `extensions` is a list of extensions +- corresponding to the format. +- +- `function` is the callable that will be +- used to unpack archives. The callable will receive archives to unpack. +- If it's unable to handle an archive, it needs to raise a ReadError +- exception. +- +- If provided, `extra_args` is a sequence of +- (name, value) tuples that will be passed as arguments to the callable. +- description can be provided to describe the format, and will be returned +- by the get_unpack_formats() function. +- """ +- if extra_args is None: +- extra_args = [] +- _check_unpack_options(extensions, function, extra_args) +- _UNPACK_FORMATS[name] = extensions, function, extra_args, description +- +-def unregister_unpack_format(name): +- """Removes the pack format from the registry.""" +- del _UNPACK_FORMATS[name] +- +-def _ensure_directory(path): +- """Ensure that the parent directory of `path` exists""" +- dirname = os.path.dirname(path) +- if not os.path.isdir(dirname): +- os.makedirs(dirname) +- +-def _unpack_zipfile(filename, extract_dir): +- """Unpack zip `filename` to `extract_dir` +- """ +- try: +- import zipfile +- except ImportError: +- raise ReadError('zlib not supported, cannot unpack this archive.') +- +- if not zipfile.is_zipfile(filename): +- raise ReadError("%s is not a zip file" % filename) +- +- zip = zipfile.ZipFile(filename) +- try: +- for info in zip.infolist(): +- name = info.filename +- +- # don't extract absolute paths or ones with .. in them +- if name.startswith('/') or '..' in name: +- continue +- +- target = os.path.join(extract_dir, *name.split('/')) +- if not target: +- continue +- +- _ensure_directory(target) +- if not name.endswith('/'): +- # file +- data = zip.read(info.filename) +- f = open(target, 'wb') +- try: +- f.write(data) +- finally: +- f.close() +- del data +- finally: +- zip.close() +- +-def _unpack_tarfile(filename, extract_dir): +- """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` +- """ +- try: +- tarobj = tarfile.open(filename) +- except tarfile.TarError: +- raise ReadError( +- "%s is not a compressed or uncompressed tar file" % filename) +- try: +- tarobj.extractall(extract_dir) +- finally: +- tarobj.close() +- +-_UNPACK_FORMATS = { +- 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), +- 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), +- 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") +- } +- +-if _BZ2_SUPPORTED: +- _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], +- "bzip2'ed tar-file") +- +-def _find_unpack_format(filename): +- for name, info in _UNPACK_FORMATS.items(): +- for extension in info[0]: +- if filename.endswith(extension): +- return name +- return None +- +-def unpack_archive(filename, extract_dir=None, format=None): +- """Unpack an archive. +- +- `filename` is the name of the archive. +- +- `extract_dir` is the name of the target directory, where the archive +- is unpacked. If not provided, the current working directory is used. +- +- `format` is the archive format: one of "zip", "tar", or "gztar". Or any +- other registered format. If not provided, unpack_archive will use the +- filename extension and see if an unpacker was registered for that +- extension. +- +- In case none is found, a ValueError is raised. +- """ +- if extract_dir is None: +- extract_dir = os.getcwd() +- +- if format is not None: +- try: +- format_info = _UNPACK_FORMATS[format] +- except KeyError: +- raise ValueError("Unknown unpack format '{0}'".format(format)) +- +- func = format_info[1] +- func(filename, extract_dir, **dict(format_info[2])) +- else: +- # we need to look at the registered unpackers supported extensions +- format = _find_unpack_format(filename) +- if format is None: +- raise ReadError("Unknown archive format '{0}'".format(filename)) +- +- func = _UNPACK_FORMATS[format][1] +- kwargs = dict(_UNPACK_FORMATS[format][2]) +- func(filename, extract_dir, **kwargs) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/sysconfig.cfg b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/sysconfig.cfg +deleted file mode 100644 +index 1746bd0..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/sysconfig.cfg ++++ /dev/null +@@ -1,84 +0,0 @@ +-[posix_prefix] +-# Configuration directories. Some of these come straight out of the +-# configure script. They are for implementing the other variables, not to +-# be used directly in [resource_locations]. +-confdir = /etc +-datadir = /usr/share +-libdir = /usr/lib +-statedir = /var +-# User resource directory +-local = ~/.local/{distribution.name} +- +-stdlib = {base}/lib/python{py_version_short} +-platstdlib = {platbase}/lib/python{py_version_short} +-purelib = {base}/lib/python{py_version_short}/site-packages +-platlib = {platbase}/lib/python{py_version_short}/site-packages +-include = {base}/include/python{py_version_short}{abiflags} +-platinclude = {platbase}/include/python{py_version_short}{abiflags} +-data = {base} +- +-[posix_home] +-stdlib = {base}/lib/python +-platstdlib = {base}/lib/python +-purelib = {base}/lib/python +-platlib = {base}/lib/python +-include = {base}/include/python +-platinclude = {base}/include/python +-scripts = {base}/bin +-data = {base} +- +-[nt] +-stdlib = {base}/Lib +-platstdlib = {base}/Lib +-purelib = {base}/Lib/site-packages +-platlib = {base}/Lib/site-packages +-include = {base}/Include +-platinclude = {base}/Include +-scripts = {base}/Scripts +-data = {base} +- +-[os2] +-stdlib = {base}/Lib +-platstdlib = {base}/Lib +-purelib = {base}/Lib/site-packages +-platlib = {base}/Lib/site-packages +-include = {base}/Include +-platinclude = {base}/Include +-scripts = {base}/Scripts +-data = {base} +- +-[os2_home] +-stdlib = {userbase}/lib/python{py_version_short} +-platstdlib = {userbase}/lib/python{py_version_short} +-purelib = {userbase}/lib/python{py_version_short}/site-packages +-platlib = {userbase}/lib/python{py_version_short}/site-packages +-include = {userbase}/include/python{py_version_short} +-scripts = {userbase}/bin +-data = {userbase} +- +-[nt_user] +-stdlib = {userbase}/Python{py_version_nodot} +-platstdlib = {userbase}/Python{py_version_nodot} +-purelib = {userbase}/Python{py_version_nodot}/site-packages +-platlib = {userbase}/Python{py_version_nodot}/site-packages +-include = {userbase}/Python{py_version_nodot}/Include +-scripts = {userbase}/Scripts +-data = {userbase} +- +-[posix_user] +-stdlib = {userbase}/lib/python{py_version_short} +-platstdlib = {userbase}/lib/python{py_version_short} +-purelib = {userbase}/lib/python{py_version_short}/site-packages +-platlib = {userbase}/lib/python{py_version_short}/site-packages +-include = {userbase}/include/python{py_version_short} +-scripts = {userbase}/bin +-data = {userbase} +- +-[osx_framework_user] +-stdlib = {userbase}/lib/python +-platstdlib = {userbase}/lib/python +-purelib = {userbase}/lib/python/site-packages +-platlib = {userbase}/lib/python/site-packages +-include = {userbase}/include +-scripts = {userbase}/bin +-data = {userbase} +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/sysconfig.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/sysconfig.py +deleted file mode 100644 +index ec28480..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/sysconfig.py ++++ /dev/null +@@ -1,788 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2012 The Python Software Foundation. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-"""Access to Python's configuration information.""" +- +-import codecs +-import os +-import re +-import sys +-from os.path import pardir, realpath +-try: +- import configparser +-except ImportError: +- import ConfigParser as configparser +- +- +-__all__ = [ +- 'get_config_h_filename', +- 'get_config_var', +- 'get_config_vars', +- 'get_makefile_filename', +- 'get_path', +- 'get_path_names', +- 'get_paths', +- 'get_platform', +- 'get_python_version', +- 'get_scheme_names', +- 'parse_config_h', +-] +- +- +-def _safe_realpath(path): +- try: +- return realpath(path) +- except OSError: +- return path +- +- +-if sys.executable: +- _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) +-else: +- # sys.executable can be empty if argv[0] has been changed and Python is +- # unable to retrieve the real program name +- _PROJECT_BASE = _safe_realpath(os.getcwd()) +- +-if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): +- _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) +-# PC/VS7.1 +-if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): +- _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +-# PC/AMD64 +-if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): +- _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +- +- +-def is_python_build(): +- for fn in ("Setup.dist", "Setup.local"): +- if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): +- return True +- return False +- +-_PYTHON_BUILD = is_python_build() +- +-_cfg_read = False +- +-def _ensure_cfg_read(): +- global _cfg_read +- if not _cfg_read: +- from ..resources import finder +- backport_package = __name__.rsplit('.', 1)[0] +- _finder = finder(backport_package) +- _cfgfile = _finder.find('sysconfig.cfg') +- assert _cfgfile, 'sysconfig.cfg exists' +- with _cfgfile.as_stream() as s: +- _SCHEMES.readfp(s) +- if _PYTHON_BUILD: +- for scheme in ('posix_prefix', 'posix_home'): +- _SCHEMES.set(scheme, 'include', '{srcdir}/Include') +- _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') +- +- _cfg_read = True +- +- +-_SCHEMES = configparser.RawConfigParser() +-_VAR_REPL = re.compile(r'\{([^{]*?)\}') +- +-def _expand_globals(config): +- _ensure_cfg_read() +- if config.has_section('globals'): +- globals = config.items('globals') +- else: +- globals = tuple() +- +- sections = config.sections() +- for section in sections: +- if section == 'globals': +- continue +- for option, value in globals: +- if config.has_option(section, option): +- continue +- config.set(section, option, value) +- config.remove_section('globals') +- +- # now expanding local variables defined in the cfg file +- # +- for section in config.sections(): +- variables = dict(config.items(section)) +- +- def _replacer(matchobj): +- name = matchobj.group(1) +- if name in variables: +- return variables[name] +- return matchobj.group(0) +- +- for option, value in config.items(section): +- config.set(section, option, _VAR_REPL.sub(_replacer, value)) +- +-#_expand_globals(_SCHEMES) +- +- # FIXME don't rely on sys.version here, its format is an implementation detail +- # of CPython, use sys.version_info or sys.hexversion +-_PY_VERSION = sys.version.split()[0] +-_PY_VERSION_SHORT = sys.version[:3] +-_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2] +-_PREFIX = os.path.normpath(sys.prefix) +-_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) +-_CONFIG_VARS = None +-_USER_BASE = None +- +- +-def _subst_vars(path, local_vars): +- """In the string `path`, replace tokens like {some.thing} with the +- corresponding value from the map `local_vars`. +- +- If there is no corresponding value, leave the token unchanged. +- """ +- def _replacer(matchobj): +- name = matchobj.group(1) +- if name in local_vars: +- return local_vars[name] +- elif name in os.environ: +- return os.environ[name] +- return matchobj.group(0) +- return _VAR_REPL.sub(_replacer, path) +- +- +-def _extend_dict(target_dict, other_dict): +- target_keys = target_dict.keys() +- for key, value in other_dict.items(): +- if key in target_keys: +- continue +- target_dict[key] = value +- +- +-def _expand_vars(scheme, vars): +- res = {} +- if vars is None: +- vars = {} +- _extend_dict(vars, get_config_vars()) +- +- for key, value in _SCHEMES.items(scheme): +- if os.name in ('posix', 'nt'): +- value = os.path.expanduser(value) +- res[key] = os.path.normpath(_subst_vars(value, vars)) +- return res +- +- +-def format_value(value, vars): +- def _replacer(matchobj): +- name = matchobj.group(1) +- if name in vars: +- return vars[name] +- return matchobj.group(0) +- return _VAR_REPL.sub(_replacer, value) +- +- +-def _get_default_scheme(): +- if os.name == 'posix': +- # the default scheme for posix is posix_prefix +- return 'posix_prefix' +- return os.name +- +- +-def _getuserbase(): +- env_base = os.environ.get("PYTHONUSERBASE", None) +- +- def joinuser(*args): +- return os.path.expanduser(os.path.join(*args)) +- +- # what about 'os2emx', 'riscos' ? +- if os.name == "nt": +- base = os.environ.get("APPDATA") or "~" +- if env_base: +- return env_base +- else: +- return joinuser(base, "Python") +- +- if sys.platform == "darwin": +- framework = get_config_var("PYTHONFRAMEWORK") +- if framework: +- if env_base: +- return env_base +- else: +- return joinuser("~", "Library", framework, "%d.%d" % +- sys.version_info[:2]) +- +- if env_base: +- return env_base +- else: +- return joinuser("~", ".local") +- +- +-def _parse_makefile(filename, vars=None): +- """Parse a Makefile-style file. +- +- A dictionary containing name/value pairs is returned. If an +- optional dictionary is passed in as the second argument, it is +- used instead of a new dictionary. +- """ +- # Regexes needed for parsing Makefile (and similar syntaxes, +- # like old-style Setup files). +- _variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") +- _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") +- _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") +- +- if vars is None: +- vars = {} +- done = {} +- notdone = {} +- +- with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: +- lines = f.readlines() +- +- for line in lines: +- if line.startswith('#') or line.strip() == '': +- continue +- m = _variable_rx.match(line) +- if m: +- n, v = m.group(1, 2) +- v = v.strip() +- # `$$' is a literal `$' in make +- tmpv = v.replace('$$', '') +- +- if "$" in tmpv: +- notdone[n] = v +- else: +- try: +- v = int(v) +- except ValueError: +- # insert literal `$' +- done[n] = v.replace('$$', '$') +- else: +- done[n] = v +- +- # do variable interpolation here +- variables = list(notdone.keys()) +- +- # Variables with a 'PY_' prefix in the makefile. These need to +- # be made available without that prefix through sysconfig. +- # Special care is needed to ensure that variable expansion works, even +- # if the expansion uses the name without a prefix. +- renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') +- +- while len(variables) > 0: +- for name in tuple(variables): +- value = notdone[name] +- m = _findvar1_rx.search(value) or _findvar2_rx.search(value) +- if m is not None: +- n = m.group(1) +- found = True +- if n in done: +- item = str(done[n]) +- elif n in notdone: +- # get it on a subsequent round +- found = False +- elif n in os.environ: +- # do it like make: fall back to environment +- item = os.environ[n] +- +- elif n in renamed_variables: +- if (name.startswith('PY_') and +- name[3:] in renamed_variables): +- item = "" +- +- elif 'PY_' + n in notdone: +- found = False +- +- else: +- item = str(done['PY_' + n]) +- +- else: +- done[n] = item = "" +- +- if found: +- after = value[m.end():] +- value = value[:m.start()] + item + after +- if "$" in after: +- notdone[name] = value +- else: +- try: +- value = int(value) +- except ValueError: +- done[name] = value.strip() +- else: +- done[name] = value +- variables.remove(name) +- +- if (name.startswith('PY_') and +- name[3:] in renamed_variables): +- +- name = name[3:] +- if name not in done: +- done[name] = value +- +- else: +- # bogus variable reference (e.g. "prefix=$/opt/python"); +- # just drop it since we can't deal +- done[name] = value +- variables.remove(name) +- +- # strip spurious spaces +- for k, v in done.items(): +- if isinstance(v, str): +- done[k] = v.strip() +- +- # save the results in the global dictionary +- vars.update(done) +- return vars +- +- +-def get_makefile_filename(): +- """Return the path of the Makefile.""" +- if _PYTHON_BUILD: +- return os.path.join(_PROJECT_BASE, "Makefile") +- if hasattr(sys, 'abiflags'): +- config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) +- else: +- config_dir_name = 'config' +- return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') +- +- +-def _init_posix(vars): +- """Initialize the module as appropriate for POSIX systems.""" +- # load the installed Makefile: +- makefile = get_makefile_filename() +- try: +- _parse_makefile(makefile, vars) +- except IOError as e: +- msg = "invalid Python installation: unable to open %s" % makefile +- if hasattr(e, "strerror"): +- msg = msg + " (%s)" % e.strerror +- raise IOError(msg) +- # load the installed pyconfig.h: +- config_h = get_config_h_filename() +- try: +- with open(config_h) as f: +- parse_config_h(f, vars) +- except IOError as e: +- msg = "invalid Python installation: unable to open %s" % config_h +- if hasattr(e, "strerror"): +- msg = msg + " (%s)" % e.strerror +- raise IOError(msg) +- # On AIX, there are wrong paths to the linker scripts in the Makefile +- # -- these paths are relative to the Python source, but when installed +- # the scripts are in another directory. +- if _PYTHON_BUILD: +- vars['LDSHARED'] = vars['BLDSHARED'] +- +- +-def _init_non_posix(vars): +- """Initialize the module as appropriate for NT""" +- # set basic install directories +- vars['LIBDEST'] = get_path('stdlib') +- vars['BINLIBDEST'] = get_path('platstdlib') +- vars['INCLUDEPY'] = get_path('include') +- vars['SO'] = '.pyd' +- vars['EXE'] = '.exe' +- vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT +- vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) +- +-# +-# public APIs +-# +- +- +-def parse_config_h(fp, vars=None): +- """Parse a config.h-style file. +- +- A dictionary containing name/value pairs is returned. If an +- optional dictionary is passed in as the second argument, it is +- used instead of a new dictionary. +- """ +- if vars is None: +- vars = {} +- define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") +- undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") +- +- while True: +- line = fp.readline() +- if not line: +- break +- m = define_rx.match(line) +- if m: +- n, v = m.group(1, 2) +- try: +- v = int(v) +- except ValueError: +- pass +- vars[n] = v +- else: +- m = undef_rx.match(line) +- if m: +- vars[m.group(1)] = 0 +- return vars +- +- +-def get_config_h_filename(): +- """Return the path of pyconfig.h.""" +- if _PYTHON_BUILD: +- if os.name == "nt": +- inc_dir = os.path.join(_PROJECT_BASE, "PC") +- else: +- inc_dir = _PROJECT_BASE +- else: +- inc_dir = get_path('platinclude') +- return os.path.join(inc_dir, 'pyconfig.h') +- +- +-def get_scheme_names(): +- """Return a tuple containing the schemes names.""" +- return tuple(sorted(_SCHEMES.sections())) +- +- +-def get_path_names(): +- """Return a tuple containing the paths names.""" +- # xxx see if we want a static list +- return _SCHEMES.options('posix_prefix') +- +- +-def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): +- """Return a mapping containing an install scheme. +- +- ``scheme`` is the install scheme name. If not provided, it will +- return the default scheme for the current platform. +- """ +- _ensure_cfg_read() +- if expand: +- return _expand_vars(scheme, vars) +- else: +- return dict(_SCHEMES.items(scheme)) +- +- +-def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): +- """Return a path corresponding to the scheme. +- +- ``scheme`` is the install scheme name. +- """ +- return get_paths(scheme, vars, expand)[name] +- +- +-def get_config_vars(*args): +- """With no arguments, return a dictionary of all configuration +- variables relevant for the current platform. +- +- On Unix, this means every variable defined in Python's installed Makefile; +- On Windows and Mac OS it's a much smaller set. +- +- With arguments, return a list of values that result from looking up +- each argument in the configuration variable dictionary. +- """ +- global _CONFIG_VARS +- if _CONFIG_VARS is None: +- _CONFIG_VARS = {} +- # Normalized versions of prefix and exec_prefix are handy to have; +- # in fact, these are the standard versions used most places in the +- # distutils2 module. +- _CONFIG_VARS['prefix'] = _PREFIX +- _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX +- _CONFIG_VARS['py_version'] = _PY_VERSION +- _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT +- _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] +- _CONFIG_VARS['base'] = _PREFIX +- _CONFIG_VARS['platbase'] = _EXEC_PREFIX +- _CONFIG_VARS['projectbase'] = _PROJECT_BASE +- try: +- _CONFIG_VARS['abiflags'] = sys.abiflags +- except AttributeError: +- # sys.abiflags may not be defined on all platforms. +- _CONFIG_VARS['abiflags'] = '' +- +- if os.name in ('nt', 'os2'): +- _init_non_posix(_CONFIG_VARS) +- if os.name == 'posix': +- _init_posix(_CONFIG_VARS) +- # Setting 'userbase' is done below the call to the +- # init function to enable using 'get_config_var' in +- # the init-function. +- if sys.version >= '2.6': +- _CONFIG_VARS['userbase'] = _getuserbase() +- +- if 'srcdir' not in _CONFIG_VARS: +- _CONFIG_VARS['srcdir'] = _PROJECT_BASE +- else: +- _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) +- +- # Convert srcdir into an absolute path if it appears necessary. +- # Normally it is relative to the build directory. However, during +- # testing, for example, we might be running a non-installed python +- # from a different directory. +- if _PYTHON_BUILD and os.name == "posix": +- base = _PROJECT_BASE +- try: +- cwd = os.getcwd() +- except OSError: +- cwd = None +- if (not os.path.isabs(_CONFIG_VARS['srcdir']) and +- base != cwd): +- # srcdir is relative and we are not in the same directory +- # as the executable. Assume executable is in the build +- # directory and make srcdir absolute. +- srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) +- _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) +- +- if sys.platform == 'darwin': +- kernel_version = os.uname()[2] # Kernel version (8.4.3) +- major_version = int(kernel_version.split('.')[0]) +- +- if major_version < 8: +- # On macOS before 10.4, check if -arch and -isysroot +- # are in CFLAGS or LDFLAGS and remove them if they are. +- # This is needed when building extensions on a 10.3 system +- # using a universal build of python. +- for key in ('LDFLAGS', 'BASECFLAGS', +- # a number of derived variables. These need to be +- # patched up as well. +- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): +- flags = _CONFIG_VARS[key] +- flags = re.sub('-arch\s+\w+\s', ' ', flags) +- flags = re.sub('-isysroot [^ \t]*', ' ', flags) +- _CONFIG_VARS[key] = flags +- else: +- # Allow the user to override the architecture flags using +- # an environment variable. +- # NOTE: This name was introduced by Apple in OSX 10.5 and +- # is used by several scripting languages distributed with +- # that OS release. +- if 'ARCHFLAGS' in os.environ: +- arch = os.environ['ARCHFLAGS'] +- for key in ('LDFLAGS', 'BASECFLAGS', +- # a number of derived variables. These need to be +- # patched up as well. +- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): +- +- flags = _CONFIG_VARS[key] +- flags = re.sub('-arch\s+\w+\s', ' ', flags) +- flags = flags + ' ' + arch +- _CONFIG_VARS[key] = flags +- +- # If we're on OSX 10.5 or later and the user tries to +- # compiles an extension using an SDK that is not present +- # on the current machine it is better to not use an SDK +- # than to fail. +- # +- # The major usecase for this is users using a Python.org +- # binary installer on OSX 10.6: that installer uses +- # the 10.4u SDK, but that SDK is not installed by default +- # when you install Xcode. +- # +- CFLAGS = _CONFIG_VARS.get('CFLAGS', '') +- m = re.search('-isysroot\s+(\S+)', CFLAGS) +- if m is not None: +- sdk = m.group(1) +- if not os.path.exists(sdk): +- for key in ('LDFLAGS', 'BASECFLAGS', +- # a number of derived variables. These need to be +- # patched up as well. +- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): +- +- flags = _CONFIG_VARS[key] +- flags = re.sub('-isysroot\s+\S+(\s|$)', ' ', flags) +- _CONFIG_VARS[key] = flags +- +- if args: +- vals = [] +- for name in args: +- vals.append(_CONFIG_VARS.get(name)) +- return vals +- else: +- return _CONFIG_VARS +- +- +-def get_config_var(name): +- """Return the value of a single variable using the dictionary returned by +- 'get_config_vars()'. +- +- Equivalent to get_config_vars().get(name) +- """ +- return get_config_vars().get(name) +- +- +-def get_platform(): +- """Return a string that identifies the current platform. +- +- This is used mainly to distinguish platform-specific build directories and +- platform-specific built distributions. Typically includes the OS name +- and version and the architecture (as supplied by 'os.uname()'), +- although the exact information included depends on the OS; eg. for IRIX +- the architecture isn't particularly important (IRIX only runs on SGI +- hardware), but for Linux the kernel version isn't particularly +- important. +- +- Examples of returned values: +- linux-i586 +- linux-alpha (?) +- solaris-2.6-sun4u +- irix-5.3 +- irix64-6.2 +- +- Windows will return one of: +- win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) +- win-ia64 (64bit Windows on Itanium) +- win32 (all others - specifically, sys.platform is returned) +- +- For other non-POSIX platforms, currently just returns 'sys.platform'. +- """ +- if os.name == 'nt': +- # sniff sys.version for architecture. +- prefix = " bit (" +- i = sys.version.find(prefix) +- if i == -1: +- return sys.platform +- j = sys.version.find(")", i) +- look = sys.version[i+len(prefix):j].lower() +- if look == 'amd64': +- return 'win-amd64' +- if look == 'itanium': +- return 'win-ia64' +- return sys.platform +- +- if os.name != "posix" or not hasattr(os, 'uname'): +- # XXX what about the architecture? NT is Intel or Alpha, +- # Mac OS is M68k or PPC, etc. +- return sys.platform +- +- # Try to distinguish various flavours of Unix +- osname, host, release, version, machine = os.uname() +- +- # Convert the OS name to lowercase, remove '/' characters +- # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") +- osname = osname.lower().replace('/', '') +- machine = machine.replace(' ', '_') +- machine = machine.replace('/', '-') +- +- if osname[:5] == "linux": +- # At least on Linux/Intel, 'machine' is the processor -- +- # i386, etc. +- # XXX what about Alpha, SPARC, etc? +- return "%s-%s" % (osname, machine) +- elif osname[:5] == "sunos": +- if release[0] >= "5": # SunOS 5 == Solaris 2 +- osname = "solaris" +- release = "%d.%s" % (int(release[0]) - 3, release[2:]) +- # fall through to standard osname-release-machine representation +- elif osname[:4] == "irix": # could be "irix64"! +- return "%s-%s" % (osname, release) +- elif osname[:3] == "aix": +- return "%s-%s.%s" % (osname, version, release) +- elif osname[:6] == "cygwin": +- osname = "cygwin" +- rel_re = re.compile(r'[\d.]+') +- m = rel_re.match(release) +- if m: +- release = m.group() +- elif osname[:6] == "darwin": +- # +- # For our purposes, we'll assume that the system version from +- # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set +- # to. This makes the compatibility story a bit more sane because the +- # machine is going to compile and link as if it were +- # MACOSX_DEPLOYMENT_TARGET. +- cfgvars = get_config_vars() +- macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') +- +- if True: +- # Always calculate the release of the running machine, +- # needed to determine if we can build fat binaries or not. +- +- macrelease = macver +- # Get the system version. Reading this plist is a documented +- # way to get the system version (see the documentation for +- # the Gestalt Manager) +- try: +- f = open('/System/Library/CoreServices/SystemVersion.plist') +- except IOError: +- # We're on a plain darwin box, fall back to the default +- # behaviour. +- pass +- else: +- try: +- m = re.search(r'ProductUserVisibleVersion\s*' +- r'(.*?)', f.read()) +- finally: +- f.close() +- if m is not None: +- macrelease = '.'.join(m.group(1).split('.')[:2]) +- # else: fall back to the default behaviour +- +- if not macver: +- macver = macrelease +- +- if macver: +- release = macver +- osname = "macosx" +- +- if ((macrelease + '.') >= '10.4.' and +- '-arch' in get_config_vars().get('CFLAGS', '').strip()): +- # The universal build will build fat binaries, but not on +- # systems before 10.4 +- # +- # Try to detect 4-way universal builds, those have machine-type +- # 'universal' instead of 'fat'. +- +- machine = 'fat' +- cflags = get_config_vars().get('CFLAGS') +- +- archs = re.findall('-arch\s+(\S+)', cflags) +- archs = tuple(sorted(set(archs))) +- +- if len(archs) == 1: +- machine = archs[0] +- elif archs == ('i386', 'ppc'): +- machine = 'fat' +- elif archs == ('i386', 'x86_64'): +- machine = 'intel' +- elif archs == ('i386', 'ppc', 'x86_64'): +- machine = 'fat3' +- elif archs == ('ppc64', 'x86_64'): +- machine = 'fat64' +- elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): +- machine = 'universal' +- else: +- raise ValueError( +- "Don't know machine value for archs=%r" % (archs,)) +- +- elif machine == 'i386': +- # On OSX the machine type returned by uname is always the +- # 32-bit variant, even if the executable architecture is +- # the 64-bit variant +- if sys.maxsize >= 2**32: +- machine = 'x86_64' +- +- elif machine in ('PowerPC', 'Power_Macintosh'): +- # Pick a sane name for the PPC architecture. +- # See 'i386' case +- if sys.maxsize >= 2**32: +- machine = 'ppc64' +- else: +- machine = 'ppc' +- +- return "%s-%s-%s" % (osname, release, machine) +- +- +-def get_python_version(): +- return _PY_VERSION_SHORT +- +- +-def _print_dict(title, data): +- for index, (key, value) in enumerate(sorted(data.items())): +- if index == 0: +- print('%s: ' % (title)) +- print('\t%s = "%s"' % (key, value)) +- +- +-def _main(): +- """Display all information sysconfig detains.""" +- print('Platform: "%s"' % get_platform()) +- print('Python version: "%s"' % get_python_version()) +- print('Current installation scheme: "%s"' % _get_default_scheme()) +- print() +- _print_dict('Paths', get_paths()) +- print() +- _print_dict('Variables', get_config_vars()) +- +- +-if __name__ == '__main__': +- _main() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/tarfile.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/tarfile.py +deleted file mode 100644 +index d66d856..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/_backport/tarfile.py ++++ /dev/null +@@ -1,2607 +0,0 @@ +-#------------------------------------------------------------------- +-# tarfile.py +-#------------------------------------------------------------------- +-# Copyright (C) 2002 Lars Gustaebel +-# All rights reserved. +-# +-# Permission is hereby granted, free of charge, to any person +-# obtaining a copy of this software and associated documentation +-# files (the "Software"), to deal in the Software without +-# restriction, including without limitation the rights to use, +-# copy, modify, merge, publish, distribute, sublicense, and/or sell +-# copies of the Software, and to permit persons to whom the +-# Software is furnished to do so, subject to the following +-# conditions: +-# +-# The above copyright notice and this permission notice shall be +-# included in all copies or substantial portions of the Software. +-# +-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +-# OTHER DEALINGS IN THE SOFTWARE. +-# +-from __future__ import print_function +- +-"""Read from and write to tar format archives. +-""" +- +-__version__ = "$Revision$" +- +-version = "0.9.0" +-__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +-__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +-__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +-__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." +- +-#--------- +-# Imports +-#--------- +-import sys +-import os +-import stat +-import errno +-import time +-import struct +-import copy +-import re +- +-try: +- import grp, pwd +-except ImportError: +- grp = pwd = None +- +-# os.symlink on Windows prior to 6.0 raises NotImplementedError +-symlink_exception = (AttributeError, NotImplementedError) +-try: +- # WindowsError (1314) will be raised if the caller does not hold the +- # SeCreateSymbolicLinkPrivilege privilege +- symlink_exception += (WindowsError,) +-except NameError: +- pass +- +-# from tarfile import * +-__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] +- +-if sys.version_info[0] < 3: +- import __builtin__ as builtins +-else: +- import builtins +- +-_open = builtins.open # Since 'open' is TarFile.open +- +-#--------------------------------------------------------- +-# tar constants +-#--------------------------------------------------------- +-NUL = b"\0" # the null character +-BLOCKSIZE = 512 # length of processing blocks +-RECORDSIZE = BLOCKSIZE * 20 # length of records +-GNU_MAGIC = b"ustar \0" # magic gnu tar string +-POSIX_MAGIC = b"ustar\x0000" # magic posix tar string +- +-LENGTH_NAME = 100 # maximum length of a filename +-LENGTH_LINK = 100 # maximum length of a linkname +-LENGTH_PREFIX = 155 # maximum length of the prefix field +- +-REGTYPE = b"0" # regular file +-AREGTYPE = b"\0" # regular file +-LNKTYPE = b"1" # link (inside tarfile) +-SYMTYPE = b"2" # symbolic link +-CHRTYPE = b"3" # character special device +-BLKTYPE = b"4" # block special device +-DIRTYPE = b"5" # directory +-FIFOTYPE = b"6" # fifo special device +-CONTTYPE = b"7" # contiguous file +- +-GNUTYPE_LONGNAME = b"L" # GNU tar longname +-GNUTYPE_LONGLINK = b"K" # GNU tar longlink +-GNUTYPE_SPARSE = b"S" # GNU tar sparse file +- +-XHDTYPE = b"x" # POSIX.1-2001 extended header +-XGLTYPE = b"g" # POSIX.1-2001 global header +-SOLARIS_XHDTYPE = b"X" # Solaris extended header +- +-USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +-GNU_FORMAT = 1 # GNU tar format +-PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +-DEFAULT_FORMAT = GNU_FORMAT +- +-#--------------------------------------------------------- +-# tarfile constants +-#--------------------------------------------------------- +-# File types that tarfile supports: +-SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, +- SYMTYPE, DIRTYPE, FIFOTYPE, +- CONTTYPE, CHRTYPE, BLKTYPE, +- GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, +- GNUTYPE_SPARSE) +- +-# File types that will be treated as a regular file. +-REGULAR_TYPES = (REGTYPE, AREGTYPE, +- CONTTYPE, GNUTYPE_SPARSE) +- +-# File types that are part of the GNU tar format. +-GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, +- GNUTYPE_SPARSE) +- +-# Fields from a pax header that override a TarInfo attribute. +-PAX_FIELDS = ("path", "linkpath", "size", "mtime", +- "uid", "gid", "uname", "gname") +- +-# Fields from a pax header that are affected by hdrcharset. +-PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) +- +-# Fields in a pax header that are numbers, all other fields +-# are treated as strings. +-PAX_NUMBER_FIELDS = { +- "atime": float, +- "ctime": float, +- "mtime": float, +- "uid": int, +- "gid": int, +- "size": int +-} +- +-#--------------------------------------------------------- +-# Bits used in the mode field, values in octal. +-#--------------------------------------------------------- +-S_IFLNK = 0o120000 # symbolic link +-S_IFREG = 0o100000 # regular file +-S_IFBLK = 0o060000 # block device +-S_IFDIR = 0o040000 # directory +-S_IFCHR = 0o020000 # character device +-S_IFIFO = 0o010000 # fifo +- +-TSUID = 0o4000 # set UID on execution +-TSGID = 0o2000 # set GID on execution +-TSVTX = 0o1000 # reserved +- +-TUREAD = 0o400 # read by owner +-TUWRITE = 0o200 # write by owner +-TUEXEC = 0o100 # execute/search by owner +-TGREAD = 0o040 # read by group +-TGWRITE = 0o020 # write by group +-TGEXEC = 0o010 # execute/search by group +-TOREAD = 0o004 # read by other +-TOWRITE = 0o002 # write by other +-TOEXEC = 0o001 # execute/search by other +- +-#--------------------------------------------------------- +-# initialization +-#--------------------------------------------------------- +-if os.name in ("nt", "ce"): +- ENCODING = "utf-8" +-else: +- ENCODING = sys.getfilesystemencoding() +- +-#--------------------------------------------------------- +-# Some useful functions +-#--------------------------------------------------------- +- +-def stn(s, length, encoding, errors): +- """Convert a string to a null-terminated bytes object. +- """ +- s = s.encode(encoding, errors) +- return s[:length] + (length - len(s)) * NUL +- +-def nts(s, encoding, errors): +- """Convert a null-terminated bytes object to a string. +- """ +- p = s.find(b"\0") +- if p != -1: +- s = s[:p] +- return s.decode(encoding, errors) +- +-def nti(s): +- """Convert a number field to a python number. +- """ +- # There are two possible encodings for a number field, see +- # itn() below. +- if s[0] != chr(0o200): +- try: +- n = int(nts(s, "ascii", "strict") or "0", 8) +- except ValueError: +- raise InvalidHeaderError("invalid header") +- else: +- n = 0 +- for i in range(len(s) - 1): +- n <<= 8 +- n += ord(s[i + 1]) +- return n +- +-def itn(n, digits=8, format=DEFAULT_FORMAT): +- """Convert a python number to a number field. +- """ +- # POSIX 1003.1-1988 requires numbers to be encoded as a string of +- # octal digits followed by a null-byte, this allows values up to +- # (8**(digits-1))-1. GNU tar allows storing numbers greater than +- # that if necessary. A leading 0o200 byte indicates this particular +- # encoding, the following digits-1 bytes are a big-endian +- # representation. This allows values up to (256**(digits-1))-1. +- if 0 <= n < 8 ** (digits - 1): +- s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL +- else: +- if format != GNU_FORMAT or n >= 256 ** (digits - 1): +- raise ValueError("overflow in number field") +- +- if n < 0: +- # XXX We mimic GNU tar's behaviour with negative numbers, +- # this could raise OverflowError. +- n = struct.unpack("L", struct.pack("l", n))[0] +- +- s = bytearray() +- for i in range(digits - 1): +- s.insert(0, n & 0o377) +- n >>= 8 +- s.insert(0, 0o200) +- return s +- +-def calc_chksums(buf): +- """Calculate the checksum for a member's header by summing up all +- characters except for the chksum field which is treated as if +- it was filled with spaces. According to the GNU tar sources, +- some tars (Sun and NeXT) calculate chksum with signed char, +- which will be different if there are chars in the buffer with +- the high bit set. So we calculate two checksums, unsigned and +- signed. +- """ +- unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) +- signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) +- return unsigned_chksum, signed_chksum +- +-def copyfileobj(src, dst, length=None): +- """Copy length bytes from fileobj src to fileobj dst. +- If length is None, copy the entire content. +- """ +- if length == 0: +- return +- if length is None: +- while True: +- buf = src.read(16*1024) +- if not buf: +- break +- dst.write(buf) +- return +- +- BUFSIZE = 16 * 1024 +- blocks, remainder = divmod(length, BUFSIZE) +- for b in range(blocks): +- buf = src.read(BUFSIZE) +- if len(buf) < BUFSIZE: +- raise IOError("end of file reached") +- dst.write(buf) +- +- if remainder != 0: +- buf = src.read(remainder) +- if len(buf) < remainder: +- raise IOError("end of file reached") +- dst.write(buf) +- return +- +-filemode_table = ( +- ((S_IFLNK, "l"), +- (S_IFREG, "-"), +- (S_IFBLK, "b"), +- (S_IFDIR, "d"), +- (S_IFCHR, "c"), +- (S_IFIFO, "p")), +- +- ((TUREAD, "r"),), +- ((TUWRITE, "w"),), +- ((TUEXEC|TSUID, "s"), +- (TSUID, "S"), +- (TUEXEC, "x")), +- +- ((TGREAD, "r"),), +- ((TGWRITE, "w"),), +- ((TGEXEC|TSGID, "s"), +- (TSGID, "S"), +- (TGEXEC, "x")), +- +- ((TOREAD, "r"),), +- ((TOWRITE, "w"),), +- ((TOEXEC|TSVTX, "t"), +- (TSVTX, "T"), +- (TOEXEC, "x")) +-) +- +-def filemode(mode): +- """Convert a file's mode to a string of the form +- -rwxrwxrwx. +- Used by TarFile.list() +- """ +- perm = [] +- for table in filemode_table: +- for bit, char in table: +- if mode & bit == bit: +- perm.append(char) +- break +- else: +- perm.append("-") +- return "".join(perm) +- +-class TarError(Exception): +- """Base exception.""" +- pass +-class ExtractError(TarError): +- """General exception for extract errors.""" +- pass +-class ReadError(TarError): +- """Exception for unreadable tar archives.""" +- pass +-class CompressionError(TarError): +- """Exception for unavailable compression methods.""" +- pass +-class StreamError(TarError): +- """Exception for unsupported operations on stream-like TarFiles.""" +- pass +-class HeaderError(TarError): +- """Base exception for header errors.""" +- pass +-class EmptyHeaderError(HeaderError): +- """Exception for empty headers.""" +- pass +-class TruncatedHeaderError(HeaderError): +- """Exception for truncated headers.""" +- pass +-class EOFHeaderError(HeaderError): +- """Exception for end of file headers.""" +- pass +-class InvalidHeaderError(HeaderError): +- """Exception for invalid headers.""" +- pass +-class SubsequentHeaderError(HeaderError): +- """Exception for missing and invalid extended headers.""" +- pass +- +-#--------------------------- +-# internal stream interface +-#--------------------------- +-class _LowLevelFile(object): +- """Low-level file object. Supports reading and writing. +- It is used instead of a regular file object for streaming +- access. +- """ +- +- def __init__(self, name, mode): +- mode = { +- "r": os.O_RDONLY, +- "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, +- }[mode] +- if hasattr(os, "O_BINARY"): +- mode |= os.O_BINARY +- self.fd = os.open(name, mode, 0o666) +- +- def close(self): +- os.close(self.fd) +- +- def read(self, size): +- return os.read(self.fd, size) +- +- def write(self, s): +- os.write(self.fd, s) +- +-class _Stream(object): +- """Class that serves as an adapter between TarFile and +- a stream-like object. The stream-like object only +- needs to have a read() or write() method and is accessed +- blockwise. Use of gzip or bzip2 compression is possible. +- A stream-like object could be for example: sys.stdin, +- sys.stdout, a socket, a tape device etc. +- +- _Stream is intended to be used only internally. +- """ +- +- def __init__(self, name, mode, comptype, fileobj, bufsize): +- """Construct a _Stream object. +- """ +- self._extfileobj = True +- if fileobj is None: +- fileobj = _LowLevelFile(name, mode) +- self._extfileobj = False +- +- if comptype == '*': +- # Enable transparent compression detection for the +- # stream interface +- fileobj = _StreamProxy(fileobj) +- comptype = fileobj.getcomptype() +- +- self.name = name or "" +- self.mode = mode +- self.comptype = comptype +- self.fileobj = fileobj +- self.bufsize = bufsize +- self.buf = b"" +- self.pos = 0 +- self.closed = False +- +- try: +- if comptype == "gz": +- try: +- import zlib +- except ImportError: +- raise CompressionError("zlib module is not available") +- self.zlib = zlib +- self.crc = zlib.crc32(b"") +- if mode == "r": +- self._init_read_gz() +- else: +- self._init_write_gz() +- +- if comptype == "bz2": +- try: +- import bz2 +- except ImportError: +- raise CompressionError("bz2 module is not available") +- if mode == "r": +- self.dbuf = b"" +- self.cmp = bz2.BZ2Decompressor() +- else: +- self.cmp = bz2.BZ2Compressor() +- except: +- if not self._extfileobj: +- self.fileobj.close() +- self.closed = True +- raise +- +- def __del__(self): +- if hasattr(self, "closed") and not self.closed: +- self.close() +- +- def _init_write_gz(self): +- """Initialize for writing with gzip compression. +- """ +- self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, +- -self.zlib.MAX_WBITS, +- self.zlib.DEF_MEM_LEVEL, +- 0) +- timestamp = struct.pack(" self.bufsize: +- self.fileobj.write(self.buf[:self.bufsize]) +- self.buf = self.buf[self.bufsize:] +- +- def close(self): +- """Close the _Stream object. No operation should be +- done on it afterwards. +- """ +- if self.closed: +- return +- +- if self.mode == "w" and self.comptype != "tar": +- self.buf += self.cmp.flush() +- +- if self.mode == "w" and self.buf: +- self.fileobj.write(self.buf) +- self.buf = b"" +- if self.comptype == "gz": +- # The native zlib crc is an unsigned 32-bit integer, but +- # the Python wrapper implicitly casts that to a signed C +- # long. So, on a 32-bit box self.crc may "look negative", +- # while the same crc on a 64-bit box may "look positive". +- # To avoid irksome warnings from the `struct` module, force +- # it to look positive on all boxes. +- self.fileobj.write(struct.pack("= 0: +- blocks, remainder = divmod(pos - self.pos, self.bufsize) +- for i in range(blocks): +- self.read(self.bufsize) +- self.read(remainder) +- else: +- raise StreamError("seeking backwards is not allowed") +- return self.pos +- +- def read(self, size=None): +- """Return the next size number of bytes from the stream. +- If size is not defined, return all bytes of the stream +- up to EOF. +- """ +- if size is None: +- t = [] +- while True: +- buf = self._read(self.bufsize) +- if not buf: +- break +- t.append(buf) +- buf = "".join(t) +- else: +- buf = self._read(size) +- self.pos += len(buf) +- return buf +- +- def _read(self, size): +- """Return size bytes from the stream. +- """ +- if self.comptype == "tar": +- return self.__read(size) +- +- c = len(self.dbuf) +- while c < size: +- buf = self.__read(self.bufsize) +- if not buf: +- break +- try: +- buf = self.cmp.decompress(buf) +- except IOError: +- raise ReadError("invalid compressed data") +- self.dbuf += buf +- c += len(buf) +- buf = self.dbuf[:size] +- self.dbuf = self.dbuf[size:] +- return buf +- +- def __read(self, size): +- """Return size bytes from stream. If internal buffer is empty, +- read another block from the stream. +- """ +- c = len(self.buf) +- while c < size: +- buf = self.fileobj.read(self.bufsize) +- if not buf: +- break +- self.buf += buf +- c += len(buf) +- buf = self.buf[:size] +- self.buf = self.buf[size:] +- return buf +-# class _Stream +- +-class _StreamProxy(object): +- """Small proxy class that enables transparent compression +- detection for the Stream interface (mode 'r|*'). +- """ +- +- def __init__(self, fileobj): +- self.fileobj = fileobj +- self.buf = self.fileobj.read(BLOCKSIZE) +- +- def read(self, size): +- self.read = self.fileobj.read +- return self.buf +- +- def getcomptype(self): +- if self.buf.startswith(b"\037\213\010"): +- return "gz" +- if self.buf.startswith(b"BZh91"): +- return "bz2" +- return "tar" +- +- def close(self): +- self.fileobj.close() +-# class StreamProxy +- +-class _BZ2Proxy(object): +- """Small proxy class that enables external file object +- support for "r:bz2" and "w:bz2" modes. This is actually +- a workaround for a limitation in bz2 module's BZ2File +- class which (unlike gzip.GzipFile) has no support for +- a file object argument. +- """ +- +- blocksize = 16 * 1024 +- +- def __init__(self, fileobj, mode): +- self.fileobj = fileobj +- self.mode = mode +- self.name = getattr(self.fileobj, "name", None) +- self.init() +- +- def init(self): +- import bz2 +- self.pos = 0 +- if self.mode == "r": +- self.bz2obj = bz2.BZ2Decompressor() +- self.fileobj.seek(0) +- self.buf = b"" +- else: +- self.bz2obj = bz2.BZ2Compressor() +- +- def read(self, size): +- x = len(self.buf) +- while x < size: +- raw = self.fileobj.read(self.blocksize) +- if not raw: +- break +- data = self.bz2obj.decompress(raw) +- self.buf += data +- x += len(data) +- +- buf = self.buf[:size] +- self.buf = self.buf[size:] +- self.pos += len(buf) +- return buf +- +- def seek(self, pos): +- if pos < self.pos: +- self.init() +- self.read(pos - self.pos) +- +- def tell(self): +- return self.pos +- +- def write(self, data): +- self.pos += len(data) +- raw = self.bz2obj.compress(data) +- self.fileobj.write(raw) +- +- def close(self): +- if self.mode == "w": +- raw = self.bz2obj.flush() +- self.fileobj.write(raw) +-# class _BZ2Proxy +- +-#------------------------ +-# Extraction file object +-#------------------------ +-class _FileInFile(object): +- """A thin wrapper around an existing file object that +- provides a part of its data as an individual file +- object. +- """ +- +- def __init__(self, fileobj, offset, size, blockinfo=None): +- self.fileobj = fileobj +- self.offset = offset +- self.size = size +- self.position = 0 +- +- if blockinfo is None: +- blockinfo = [(0, size)] +- +- # Construct a map with data and zero blocks. +- self.map_index = 0 +- self.map = [] +- lastpos = 0 +- realpos = self.offset +- for offset, size in blockinfo: +- if offset > lastpos: +- self.map.append((False, lastpos, offset, None)) +- self.map.append((True, offset, offset + size, realpos)) +- realpos += size +- lastpos = offset + size +- if lastpos < self.size: +- self.map.append((False, lastpos, self.size, None)) +- +- def seekable(self): +- if not hasattr(self.fileobj, "seekable"): +- # XXX gzip.GzipFile and bz2.BZ2File +- return True +- return self.fileobj.seekable() +- +- def tell(self): +- """Return the current file position. +- """ +- return self.position +- +- def seek(self, position): +- """Seek to a position in the file. +- """ +- self.position = position +- +- def read(self, size=None): +- """Read data from the file. +- """ +- if size is None: +- size = self.size - self.position +- else: +- size = min(size, self.size - self.position) +- +- buf = b"" +- while size > 0: +- while True: +- data, start, stop, offset = self.map[self.map_index] +- if start <= self.position < stop: +- break +- else: +- self.map_index += 1 +- if self.map_index == len(self.map): +- self.map_index = 0 +- length = min(size, stop - self.position) +- if data: +- self.fileobj.seek(offset + (self.position - start)) +- buf += self.fileobj.read(length) +- else: +- buf += NUL * length +- size -= length +- self.position += length +- return buf +-#class _FileInFile +- +- +-class ExFileObject(object): +- """File-like object for reading an archive member. +- Is returned by TarFile.extractfile(). +- """ +- blocksize = 1024 +- +- def __init__(self, tarfile, tarinfo): +- self.fileobj = _FileInFile(tarfile.fileobj, +- tarinfo.offset_data, +- tarinfo.size, +- tarinfo.sparse) +- self.name = tarinfo.name +- self.mode = "r" +- self.closed = False +- self.size = tarinfo.size +- +- self.position = 0 +- self.buffer = b"" +- +- def readable(self): +- return True +- +- def writable(self): +- return False +- +- def seekable(self): +- return self.fileobj.seekable() +- +- def read(self, size=None): +- """Read at most size bytes from the file. If size is not +- present or None, read all data until EOF is reached. +- """ +- if self.closed: +- raise ValueError("I/O operation on closed file") +- +- buf = b"" +- if self.buffer: +- if size is None: +- buf = self.buffer +- self.buffer = b"" +- else: +- buf = self.buffer[:size] +- self.buffer = self.buffer[size:] +- +- if size is None: +- buf += self.fileobj.read() +- else: +- buf += self.fileobj.read(size - len(buf)) +- +- self.position += len(buf) +- return buf +- +- # XXX TextIOWrapper uses the read1() method. +- read1 = read +- +- def readline(self, size=-1): +- """Read one entire line from the file. If size is present +- and non-negative, return a string with at most that +- size, which may be an incomplete line. +- """ +- if self.closed: +- raise ValueError("I/O operation on closed file") +- +- pos = self.buffer.find(b"\n") + 1 +- if pos == 0: +- # no newline found. +- while True: +- buf = self.fileobj.read(self.blocksize) +- self.buffer += buf +- if not buf or b"\n" in buf: +- pos = self.buffer.find(b"\n") + 1 +- if pos == 0: +- # no newline found. +- pos = len(self.buffer) +- break +- +- if size != -1: +- pos = min(size, pos) +- +- buf = self.buffer[:pos] +- self.buffer = self.buffer[pos:] +- self.position += len(buf) +- return buf +- +- def readlines(self): +- """Return a list with all remaining lines. +- """ +- result = [] +- while True: +- line = self.readline() +- if not line: break +- result.append(line) +- return result +- +- def tell(self): +- """Return the current file position. +- """ +- if self.closed: +- raise ValueError("I/O operation on closed file") +- +- return self.position +- +- def seek(self, pos, whence=os.SEEK_SET): +- """Seek to a position in the file. +- """ +- if self.closed: +- raise ValueError("I/O operation on closed file") +- +- if whence == os.SEEK_SET: +- self.position = min(max(pos, 0), self.size) +- elif whence == os.SEEK_CUR: +- if pos < 0: +- self.position = max(self.position + pos, 0) +- else: +- self.position = min(self.position + pos, self.size) +- elif whence == os.SEEK_END: +- self.position = max(min(self.size + pos, self.size), 0) +- else: +- raise ValueError("Invalid argument") +- +- self.buffer = b"" +- self.fileobj.seek(self.position) +- +- def close(self): +- """Close the file object. +- """ +- self.closed = True +- +- def __iter__(self): +- """Get an iterator over the file's lines. +- """ +- while True: +- line = self.readline() +- if not line: +- break +- yield line +-#class ExFileObject +- +-#------------------ +-# Exported Classes +-#------------------ +-class TarInfo(object): +- """Informational class which holds the details about an +- archive member given by a tar header block. +- TarInfo objects are returned by TarFile.getmember(), +- TarFile.getmembers() and TarFile.gettarinfo() and are +- usually created internally. +- """ +- +- __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", +- "chksum", "type", "linkname", "uname", "gname", +- "devmajor", "devminor", +- "offset", "offset_data", "pax_headers", "sparse", +- "tarfile", "_sparse_structs", "_link_target") +- +- def __init__(self, name=""): +- """Construct a TarInfo object. name is the optional name +- of the member. +- """ +- self.name = name # member name +- self.mode = 0o644 # file permissions +- self.uid = 0 # user id +- self.gid = 0 # group id +- self.size = 0 # file size +- self.mtime = 0 # modification time +- self.chksum = 0 # header checksum +- self.type = REGTYPE # member type +- self.linkname = "" # link name +- self.uname = "" # user name +- self.gname = "" # group name +- self.devmajor = 0 # device major number +- self.devminor = 0 # device minor number +- +- self.offset = 0 # the tar header starts here +- self.offset_data = 0 # the file's data starts here +- +- self.sparse = None # sparse member information +- self.pax_headers = {} # pax header information +- +- # In pax headers the "name" and "linkname" field are called +- # "path" and "linkpath". +- def _getpath(self): +- return self.name +- def _setpath(self, name): +- self.name = name +- path = property(_getpath, _setpath) +- +- def _getlinkpath(self): +- return self.linkname +- def _setlinkpath(self, linkname): +- self.linkname = linkname +- linkpath = property(_getlinkpath, _setlinkpath) +- +- def __repr__(self): +- return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) +- +- def get_info(self): +- """Return the TarInfo's attributes as a dictionary. +- """ +- info = { +- "name": self.name, +- "mode": self.mode & 0o7777, +- "uid": self.uid, +- "gid": self.gid, +- "size": self.size, +- "mtime": self.mtime, +- "chksum": self.chksum, +- "type": self.type, +- "linkname": self.linkname, +- "uname": self.uname, +- "gname": self.gname, +- "devmajor": self.devmajor, +- "devminor": self.devminor +- } +- +- if info["type"] == DIRTYPE and not info["name"].endswith("/"): +- info["name"] += "/" +- +- return info +- +- def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): +- """Return a tar header as a string of 512 byte blocks. +- """ +- info = self.get_info() +- +- if format == USTAR_FORMAT: +- return self.create_ustar_header(info, encoding, errors) +- elif format == GNU_FORMAT: +- return self.create_gnu_header(info, encoding, errors) +- elif format == PAX_FORMAT: +- return self.create_pax_header(info, encoding) +- else: +- raise ValueError("invalid format") +- +- def create_ustar_header(self, info, encoding, errors): +- """Return the object as a ustar header block. +- """ +- info["magic"] = POSIX_MAGIC +- +- if len(info["linkname"]) > LENGTH_LINK: +- raise ValueError("linkname is too long") +- +- if len(info["name"]) > LENGTH_NAME: +- info["prefix"], info["name"] = self._posix_split_name(info["name"]) +- +- return self._create_header(info, USTAR_FORMAT, encoding, errors) +- +- def create_gnu_header(self, info, encoding, errors): +- """Return the object as a GNU header block sequence. +- """ +- info["magic"] = GNU_MAGIC +- +- buf = b"" +- if len(info["linkname"]) > LENGTH_LINK: +- buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) +- +- if len(info["name"]) > LENGTH_NAME: +- buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) +- +- return buf + self._create_header(info, GNU_FORMAT, encoding, errors) +- +- def create_pax_header(self, info, encoding): +- """Return the object as a ustar header block. If it cannot be +- represented this way, prepend a pax extended header sequence +- with supplement information. +- """ +- info["magic"] = POSIX_MAGIC +- pax_headers = self.pax_headers.copy() +- +- # Test string fields for values that exceed the field length or cannot +- # be represented in ASCII encoding. +- for name, hname, length in ( +- ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), +- ("uname", "uname", 32), ("gname", "gname", 32)): +- +- if hname in pax_headers: +- # The pax header has priority. +- continue +- +- # Try to encode the string as ASCII. +- try: +- info[name].encode("ascii", "strict") +- except UnicodeEncodeError: +- pax_headers[hname] = info[name] +- continue +- +- if len(info[name]) > length: +- pax_headers[hname] = info[name] +- +- # Test number fields for values that exceed the field limit or values +- # that like to be stored as float. +- for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): +- if name in pax_headers: +- # The pax header has priority. Avoid overflow. +- info[name] = 0 +- continue +- +- val = info[name] +- if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): +- pax_headers[name] = str(val) +- info[name] = 0 +- +- # Create a pax extended header if necessary. +- if pax_headers: +- buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) +- else: +- buf = b"" +- +- return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") +- +- @classmethod +- def create_pax_global_header(cls, pax_headers): +- """Return the object as a pax global header block sequence. +- """ +- return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") +- +- def _posix_split_name(self, name): +- """Split a name longer than 100 chars into a prefix +- and a name part. +- """ +- prefix = name[:LENGTH_PREFIX + 1] +- while prefix and prefix[-1] != "/": +- prefix = prefix[:-1] +- +- name = name[len(prefix):] +- prefix = prefix[:-1] +- +- if not prefix or len(name) > LENGTH_NAME: +- raise ValueError("name is too long") +- return prefix, name +- +- @staticmethod +- def _create_header(info, format, encoding, errors): +- """Return a header block. info is a dictionary with file +- information, format must be one of the *_FORMAT constants. +- """ +- parts = [ +- stn(info.get("name", ""), 100, encoding, errors), +- itn(info.get("mode", 0) & 0o7777, 8, format), +- itn(info.get("uid", 0), 8, format), +- itn(info.get("gid", 0), 8, format), +- itn(info.get("size", 0), 12, format), +- itn(info.get("mtime", 0), 12, format), +- b" ", # checksum field +- info.get("type", REGTYPE), +- stn(info.get("linkname", ""), 100, encoding, errors), +- info.get("magic", POSIX_MAGIC), +- stn(info.get("uname", ""), 32, encoding, errors), +- stn(info.get("gname", ""), 32, encoding, errors), +- itn(info.get("devmajor", 0), 8, format), +- itn(info.get("devminor", 0), 8, format), +- stn(info.get("prefix", ""), 155, encoding, errors) +- ] +- +- buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) +- chksum = calc_chksums(buf[-BLOCKSIZE:])[0] +- buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] +- return buf +- +- @staticmethod +- def _create_payload(payload): +- """Return the string payload filled with zero bytes +- up to the next 512 byte border. +- """ +- blocks, remainder = divmod(len(payload), BLOCKSIZE) +- if remainder > 0: +- payload += (BLOCKSIZE - remainder) * NUL +- return payload +- +- @classmethod +- def _create_gnu_long_header(cls, name, type, encoding, errors): +- """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence +- for name. +- """ +- name = name.encode(encoding, errors) + NUL +- +- info = {} +- info["name"] = "././@LongLink" +- info["type"] = type +- info["size"] = len(name) +- info["magic"] = GNU_MAGIC +- +- # create extended header + name blocks. +- return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ +- cls._create_payload(name) +- +- @classmethod +- def _create_pax_generic_header(cls, pax_headers, type, encoding): +- """Return a POSIX.1-2008 extended or global header sequence +- that contains a list of keyword, value pairs. The values +- must be strings. +- """ +- # Check if one of the fields contains surrogate characters and thereby +- # forces hdrcharset=BINARY, see _proc_pax() for more information. +- binary = False +- for keyword, value in pax_headers.items(): +- try: +- value.encode("utf8", "strict") +- except UnicodeEncodeError: +- binary = True +- break +- +- records = b"" +- if binary: +- # Put the hdrcharset field at the beginning of the header. +- records += b"21 hdrcharset=BINARY\n" +- +- for keyword, value in pax_headers.items(): +- keyword = keyword.encode("utf8") +- if binary: +- # Try to restore the original byte representation of `value'. +- # Needless to say, that the encoding must match the string. +- value = value.encode(encoding, "surrogateescape") +- else: +- value = value.encode("utf8") +- +- l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' +- n = p = 0 +- while True: +- n = l + len(str(p)) +- if n == p: +- break +- p = n +- records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" +- +- # We use a hardcoded "././@PaxHeader" name like star does +- # instead of the one that POSIX recommends. +- info = {} +- info["name"] = "././@PaxHeader" +- info["type"] = type +- info["size"] = len(records) +- info["magic"] = POSIX_MAGIC +- +- # Create pax header + record blocks. +- return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ +- cls._create_payload(records) +- +- @classmethod +- def frombuf(cls, buf, encoding, errors): +- """Construct a TarInfo object from a 512 byte bytes object. +- """ +- if len(buf) == 0: +- raise EmptyHeaderError("empty header") +- if len(buf) != BLOCKSIZE: +- raise TruncatedHeaderError("truncated header") +- if buf.count(NUL) == BLOCKSIZE: +- raise EOFHeaderError("end of file header") +- +- chksum = nti(buf[148:156]) +- if chksum not in calc_chksums(buf): +- raise InvalidHeaderError("bad checksum") +- +- obj = cls() +- obj.name = nts(buf[0:100], encoding, errors) +- obj.mode = nti(buf[100:108]) +- obj.uid = nti(buf[108:116]) +- obj.gid = nti(buf[116:124]) +- obj.size = nti(buf[124:136]) +- obj.mtime = nti(buf[136:148]) +- obj.chksum = chksum +- obj.type = buf[156:157] +- obj.linkname = nts(buf[157:257], encoding, errors) +- obj.uname = nts(buf[265:297], encoding, errors) +- obj.gname = nts(buf[297:329], encoding, errors) +- obj.devmajor = nti(buf[329:337]) +- obj.devminor = nti(buf[337:345]) +- prefix = nts(buf[345:500], encoding, errors) +- +- # Old V7 tar format represents a directory as a regular +- # file with a trailing slash. +- if obj.type == AREGTYPE and obj.name.endswith("/"): +- obj.type = DIRTYPE +- +- # The old GNU sparse format occupies some of the unused +- # space in the buffer for up to 4 sparse structures. +- # Save the them for later processing in _proc_sparse(). +- if obj.type == GNUTYPE_SPARSE: +- pos = 386 +- structs = [] +- for i in range(4): +- try: +- offset = nti(buf[pos:pos + 12]) +- numbytes = nti(buf[pos + 12:pos + 24]) +- except ValueError: +- break +- structs.append((offset, numbytes)) +- pos += 24 +- isextended = bool(buf[482]) +- origsize = nti(buf[483:495]) +- obj._sparse_structs = (structs, isextended, origsize) +- +- # Remove redundant slashes from directories. +- if obj.isdir(): +- obj.name = obj.name.rstrip("/") +- +- # Reconstruct a ustar longname. +- if prefix and obj.type not in GNU_TYPES: +- obj.name = prefix + "/" + obj.name +- return obj +- +- @classmethod +- def fromtarfile(cls, tarfile): +- """Return the next TarInfo object from TarFile object +- tarfile. +- """ +- buf = tarfile.fileobj.read(BLOCKSIZE) +- obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) +- obj.offset = tarfile.fileobj.tell() - BLOCKSIZE +- return obj._proc_member(tarfile) +- +- #-------------------------------------------------------------------------- +- # The following are methods that are called depending on the type of a +- # member. The entry point is _proc_member() which can be overridden in a +- # subclass to add custom _proc_*() methods. A _proc_*() method MUST +- # implement the following +- # operations: +- # 1. Set self.offset_data to the position where the data blocks begin, +- # if there is data that follows. +- # 2. Set tarfile.offset to the position where the next member's header will +- # begin. +- # 3. Return self or another valid TarInfo object. +- def _proc_member(self, tarfile): +- """Choose the right processing method depending on +- the type and call it. +- """ +- if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): +- return self._proc_gnulong(tarfile) +- elif self.type == GNUTYPE_SPARSE: +- return self._proc_sparse(tarfile) +- elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): +- return self._proc_pax(tarfile) +- else: +- return self._proc_builtin(tarfile) +- +- def _proc_builtin(self, tarfile): +- """Process a builtin type or an unknown type which +- will be treated as a regular file. +- """ +- self.offset_data = tarfile.fileobj.tell() +- offset = self.offset_data +- if self.isreg() or self.type not in SUPPORTED_TYPES: +- # Skip the following data blocks. +- offset += self._block(self.size) +- tarfile.offset = offset +- +- # Patch the TarInfo object with saved global +- # header information. +- self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) +- +- return self +- +- def _proc_gnulong(self, tarfile): +- """Process the blocks that hold a GNU longname +- or longlink member. +- """ +- buf = tarfile.fileobj.read(self._block(self.size)) +- +- # Fetch the next header and process it. +- try: +- next = self.fromtarfile(tarfile) +- except HeaderError: +- raise SubsequentHeaderError("missing or bad subsequent header") +- +- # Patch the TarInfo object from the next header with +- # the longname information. +- next.offset = self.offset +- if self.type == GNUTYPE_LONGNAME: +- next.name = nts(buf, tarfile.encoding, tarfile.errors) +- elif self.type == GNUTYPE_LONGLINK: +- next.linkname = nts(buf, tarfile.encoding, tarfile.errors) +- +- return next +- +- def _proc_sparse(self, tarfile): +- """Process a GNU sparse header plus extra headers. +- """ +- # We already collected some sparse structures in frombuf(). +- structs, isextended, origsize = self._sparse_structs +- del self._sparse_structs +- +- # Collect sparse structures from extended header blocks. +- while isextended: +- buf = tarfile.fileobj.read(BLOCKSIZE) +- pos = 0 +- for i in range(21): +- try: +- offset = nti(buf[pos:pos + 12]) +- numbytes = nti(buf[pos + 12:pos + 24]) +- except ValueError: +- break +- if offset and numbytes: +- structs.append((offset, numbytes)) +- pos += 24 +- isextended = bool(buf[504]) +- self.sparse = structs +- +- self.offset_data = tarfile.fileobj.tell() +- tarfile.offset = self.offset_data + self._block(self.size) +- self.size = origsize +- return self +- +- def _proc_pax(self, tarfile): +- """Process an extended or global header as described in +- POSIX.1-2008. +- """ +- # Read the header information. +- buf = tarfile.fileobj.read(self._block(self.size)) +- +- # A pax header stores supplemental information for either +- # the following file (extended) or all following files +- # (global). +- if self.type == XGLTYPE: +- pax_headers = tarfile.pax_headers +- else: +- pax_headers = tarfile.pax_headers.copy() +- +- # Check if the pax header contains a hdrcharset field. This tells us +- # the encoding of the path, linkpath, uname and gname fields. Normally, +- # these fields are UTF-8 encoded but since POSIX.1-2008 tar +- # implementations are allowed to store them as raw binary strings if +- # the translation to UTF-8 fails. +- match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) +- if match is not None: +- pax_headers["hdrcharset"] = match.group(1).decode("utf8") +- +- # For the time being, we don't care about anything other than "BINARY". +- # The only other value that is currently allowed by the standard is +- # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. +- hdrcharset = pax_headers.get("hdrcharset") +- if hdrcharset == "BINARY": +- encoding = tarfile.encoding +- else: +- encoding = "utf8" +- +- # Parse pax header information. A record looks like that: +- # "%d %s=%s\n" % (length, keyword, value). length is the size +- # of the complete record including the length field itself and +- # the newline. keyword and value are both UTF-8 encoded strings. +- regex = re.compile(br"(\d+) ([^=]+)=") +- pos = 0 +- while True: +- match = regex.match(buf, pos) +- if not match: +- break +- +- length, keyword = match.groups() +- length = int(length) +- value = buf[match.end(2) + 1:match.start(1) + length - 1] +- +- # Normally, we could just use "utf8" as the encoding and "strict" +- # as the error handler, but we better not take the risk. For +- # example, GNU tar <= 1.23 is known to store filenames it cannot +- # translate to UTF-8 as raw strings (unfortunately without a +- # hdrcharset=BINARY header). +- # We first try the strict standard encoding, and if that fails we +- # fall back on the user's encoding and error handler. +- keyword = self._decode_pax_field(keyword, "utf8", "utf8", +- tarfile.errors) +- if keyword in PAX_NAME_FIELDS: +- value = self._decode_pax_field(value, encoding, tarfile.encoding, +- tarfile.errors) +- else: +- value = self._decode_pax_field(value, "utf8", "utf8", +- tarfile.errors) +- +- pax_headers[keyword] = value +- pos += length +- +- # Fetch the next header. +- try: +- next = self.fromtarfile(tarfile) +- except HeaderError: +- raise SubsequentHeaderError("missing or bad subsequent header") +- +- # Process GNU sparse information. +- if "GNU.sparse.map" in pax_headers: +- # GNU extended sparse format version 0.1. +- self._proc_gnusparse_01(next, pax_headers) +- +- elif "GNU.sparse.size" in pax_headers: +- # GNU extended sparse format version 0.0. +- self._proc_gnusparse_00(next, pax_headers, buf) +- +- elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": +- # GNU extended sparse format version 1.0. +- self._proc_gnusparse_10(next, pax_headers, tarfile) +- +- if self.type in (XHDTYPE, SOLARIS_XHDTYPE): +- # Patch the TarInfo object with the extended header info. +- next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) +- next.offset = self.offset +- +- if "size" in pax_headers: +- # If the extended header replaces the size field, +- # we need to recalculate the offset where the next +- # header starts. +- offset = next.offset_data +- if next.isreg() or next.type not in SUPPORTED_TYPES: +- offset += next._block(next.size) +- tarfile.offset = offset +- +- return next +- +- def _proc_gnusparse_00(self, next, pax_headers, buf): +- """Process a GNU tar extended sparse header, version 0.0. +- """ +- offsets = [] +- for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): +- offsets.append(int(match.group(1))) +- numbytes = [] +- for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): +- numbytes.append(int(match.group(1))) +- next.sparse = list(zip(offsets, numbytes)) +- +- def _proc_gnusparse_01(self, next, pax_headers): +- """Process a GNU tar extended sparse header, version 0.1. +- """ +- sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] +- next.sparse = list(zip(sparse[::2], sparse[1::2])) +- +- def _proc_gnusparse_10(self, next, pax_headers, tarfile): +- """Process a GNU tar extended sparse header, version 1.0. +- """ +- fields = None +- sparse = [] +- buf = tarfile.fileobj.read(BLOCKSIZE) +- fields, buf = buf.split(b"\n", 1) +- fields = int(fields) +- while len(sparse) < fields * 2: +- if b"\n" not in buf: +- buf += tarfile.fileobj.read(BLOCKSIZE) +- number, buf = buf.split(b"\n", 1) +- sparse.append(int(number)) +- next.offset_data = tarfile.fileobj.tell() +- next.sparse = list(zip(sparse[::2], sparse[1::2])) +- +- def _apply_pax_info(self, pax_headers, encoding, errors): +- """Replace fields with supplemental information from a previous +- pax extended or global header. +- """ +- for keyword, value in pax_headers.items(): +- if keyword == "GNU.sparse.name": +- setattr(self, "path", value) +- elif keyword == "GNU.sparse.size": +- setattr(self, "size", int(value)) +- elif keyword == "GNU.sparse.realsize": +- setattr(self, "size", int(value)) +- elif keyword in PAX_FIELDS: +- if keyword in PAX_NUMBER_FIELDS: +- try: +- value = PAX_NUMBER_FIELDS[keyword](value) +- except ValueError: +- value = 0 +- if keyword == "path": +- value = value.rstrip("/") +- setattr(self, keyword, value) +- +- self.pax_headers = pax_headers.copy() +- +- def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): +- """Decode a single field from a pax record. +- """ +- try: +- return value.decode(encoding, "strict") +- except UnicodeDecodeError: +- return value.decode(fallback_encoding, fallback_errors) +- +- def _block(self, count): +- """Round up a byte count by BLOCKSIZE and return it, +- e.g. _block(834) => 1024. +- """ +- blocks, remainder = divmod(count, BLOCKSIZE) +- if remainder: +- blocks += 1 +- return blocks * BLOCKSIZE +- +- def isreg(self): +- return self.type in REGULAR_TYPES +- def isfile(self): +- return self.isreg() +- def isdir(self): +- return self.type == DIRTYPE +- def issym(self): +- return self.type == SYMTYPE +- def islnk(self): +- return self.type == LNKTYPE +- def ischr(self): +- return self.type == CHRTYPE +- def isblk(self): +- return self.type == BLKTYPE +- def isfifo(self): +- return self.type == FIFOTYPE +- def issparse(self): +- return self.sparse is not None +- def isdev(self): +- return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +-# class TarInfo +- +-class TarFile(object): +- """The TarFile Class provides an interface to tar archives. +- """ +- +- debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) +- +- dereference = False # If true, add content of linked file to the +- # tar file, else the link. +- +- ignore_zeros = False # If true, skips empty or invalid blocks and +- # continues processing. +- +- errorlevel = 1 # If 0, fatal errors only appear in debug +- # messages (if debug >= 0). If > 0, errors +- # are passed to the caller as exceptions. +- +- format = DEFAULT_FORMAT # The format to use when creating an archive. +- +- encoding = ENCODING # Encoding for 8-bit character strings. +- +- errors = None # Error handler for unicode conversion. +- +- tarinfo = TarInfo # The default TarInfo class to use. +- +- fileobject = ExFileObject # The default ExFileObject class to use. +- +- def __init__(self, name=None, mode="r", fileobj=None, format=None, +- tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, +- errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): +- """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to +- read from an existing archive, 'a' to append data to an existing +- file or 'w' to create a new file overwriting an existing one. `mode' +- defaults to 'r'. +- If `fileobj' is given, it is used for reading or writing data. If it +- can be determined, `mode' is overridden by `fileobj's mode. +- `fileobj' is not closed, when TarFile is closed. +- """ +- if len(mode) > 1 or mode not in "raw": +- raise ValueError("mode must be 'r', 'a' or 'w'") +- self.mode = mode +- self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] +- +- if not fileobj: +- if self.mode == "a" and not os.path.exists(name): +- # Create nonexistent files in append mode. +- self.mode = "w" +- self._mode = "wb" +- fileobj = bltn_open(name, self._mode) +- self._extfileobj = False +- else: +- if name is None and hasattr(fileobj, "name"): +- name = fileobj.name +- if hasattr(fileobj, "mode"): +- self._mode = fileobj.mode +- self._extfileobj = True +- self.name = os.path.abspath(name) if name else None +- self.fileobj = fileobj +- +- # Init attributes. +- if format is not None: +- self.format = format +- if tarinfo is not None: +- self.tarinfo = tarinfo +- if dereference is not None: +- self.dereference = dereference +- if ignore_zeros is not None: +- self.ignore_zeros = ignore_zeros +- if encoding is not None: +- self.encoding = encoding +- self.errors = errors +- +- if pax_headers is not None and self.format == PAX_FORMAT: +- self.pax_headers = pax_headers +- else: +- self.pax_headers = {} +- +- if debug is not None: +- self.debug = debug +- if errorlevel is not None: +- self.errorlevel = errorlevel +- +- # Init datastructures. +- self.closed = False +- self.members = [] # list of members as TarInfo objects +- self._loaded = False # flag if all members have been read +- self.offset = self.fileobj.tell() +- # current position in the archive file +- self.inodes = {} # dictionary caching the inodes of +- # archive members already added +- +- try: +- if self.mode == "r": +- self.firstmember = None +- self.firstmember = self.next() +- +- if self.mode == "a": +- # Move to the end of the archive, +- # before the first empty block. +- while True: +- self.fileobj.seek(self.offset) +- try: +- tarinfo = self.tarinfo.fromtarfile(self) +- self.members.append(tarinfo) +- except EOFHeaderError: +- self.fileobj.seek(self.offset) +- break +- except HeaderError as e: +- raise ReadError(str(e)) +- +- if self.mode in "aw": +- self._loaded = True +- +- if self.pax_headers: +- buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) +- self.fileobj.write(buf) +- self.offset += len(buf) +- except: +- if not self._extfileobj: +- self.fileobj.close() +- self.closed = True +- raise +- +- #-------------------------------------------------------------------------- +- # Below are the classmethods which act as alternate constructors to the +- # TarFile class. The open() method is the only one that is needed for +- # public use; it is the "super"-constructor and is able to select an +- # adequate "sub"-constructor for a particular compression using the mapping +- # from OPEN_METH. +- # +- # This concept allows one to subclass TarFile without losing the comfort of +- # the super-constructor. A sub-constructor is registered and made available +- # by adding it to the mapping in OPEN_METH. +- +- @classmethod +- def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): +- """Open a tar archive for reading, writing or appending. Return +- an appropriate TarFile class. +- +- mode: +- 'r' or 'r:*' open for reading with transparent compression +- 'r:' open for reading exclusively uncompressed +- 'r:gz' open for reading with gzip compression +- 'r:bz2' open for reading with bzip2 compression +- 'a' or 'a:' open for appending, creating the file if necessary +- 'w' or 'w:' open for writing without compression +- 'w:gz' open for writing with gzip compression +- 'w:bz2' open for writing with bzip2 compression +- +- 'r|*' open a stream of tar blocks with transparent compression +- 'r|' open an uncompressed stream of tar blocks for reading +- 'r|gz' open a gzip compressed stream of tar blocks +- 'r|bz2' open a bzip2 compressed stream of tar blocks +- 'w|' open an uncompressed stream for writing +- 'w|gz' open a gzip compressed stream for writing +- 'w|bz2' open a bzip2 compressed stream for writing +- """ +- +- if not name and not fileobj: +- raise ValueError("nothing to open") +- +- if mode in ("r", "r:*"): +- # Find out which *open() is appropriate for opening the file. +- for comptype in cls.OPEN_METH: +- func = getattr(cls, cls.OPEN_METH[comptype]) +- if fileobj is not None: +- saved_pos = fileobj.tell() +- try: +- return func(name, "r", fileobj, **kwargs) +- except (ReadError, CompressionError) as e: +- if fileobj is not None: +- fileobj.seek(saved_pos) +- continue +- raise ReadError("file could not be opened successfully") +- +- elif ":" in mode: +- filemode, comptype = mode.split(":", 1) +- filemode = filemode or "r" +- comptype = comptype or "tar" +- +- # Select the *open() function according to +- # given compression. +- if comptype in cls.OPEN_METH: +- func = getattr(cls, cls.OPEN_METH[comptype]) +- else: +- raise CompressionError("unknown compression type %r" % comptype) +- return func(name, filemode, fileobj, **kwargs) +- +- elif "|" in mode: +- filemode, comptype = mode.split("|", 1) +- filemode = filemode or "r" +- comptype = comptype or "tar" +- +- if filemode not in "rw": +- raise ValueError("mode must be 'r' or 'w'") +- +- stream = _Stream(name, filemode, comptype, fileobj, bufsize) +- try: +- t = cls(name, filemode, stream, **kwargs) +- except: +- stream.close() +- raise +- t._extfileobj = False +- return t +- +- elif mode in "aw": +- return cls.taropen(name, mode, fileobj, **kwargs) +- +- raise ValueError("undiscernible mode") +- +- @classmethod +- def taropen(cls, name, mode="r", fileobj=None, **kwargs): +- """Open uncompressed tar archive name for reading or writing. +- """ +- if len(mode) > 1 or mode not in "raw": +- raise ValueError("mode must be 'r', 'a' or 'w'") +- return cls(name, mode, fileobj, **kwargs) +- +- @classmethod +- def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): +- """Open gzip compressed tar archive name for reading or writing. +- Appending is not allowed. +- """ +- if len(mode) > 1 or mode not in "rw": +- raise ValueError("mode must be 'r' or 'w'") +- +- try: +- import gzip +- gzip.GzipFile +- except (ImportError, AttributeError): +- raise CompressionError("gzip module is not available") +- +- extfileobj = fileobj is not None +- try: +- fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) +- t = cls.taropen(name, mode, fileobj, **kwargs) +- except IOError: +- if not extfileobj and fileobj is not None: +- fileobj.close() +- if fileobj is None: +- raise +- raise ReadError("not a gzip file") +- except: +- if not extfileobj and fileobj is not None: +- fileobj.close() +- raise +- t._extfileobj = extfileobj +- return t +- +- @classmethod +- def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): +- """Open bzip2 compressed tar archive name for reading or writing. +- Appending is not allowed. +- """ +- if len(mode) > 1 or mode not in "rw": +- raise ValueError("mode must be 'r' or 'w'.") +- +- try: +- import bz2 +- except ImportError: +- raise CompressionError("bz2 module is not available") +- +- if fileobj is not None: +- fileobj = _BZ2Proxy(fileobj, mode) +- else: +- fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) +- +- try: +- t = cls.taropen(name, mode, fileobj, **kwargs) +- except (IOError, EOFError): +- fileobj.close() +- raise ReadError("not a bzip2 file") +- t._extfileobj = False +- return t +- +- # All *open() methods are registered here. +- OPEN_METH = { +- "tar": "taropen", # uncompressed tar +- "gz": "gzopen", # gzip compressed tar +- "bz2": "bz2open" # bzip2 compressed tar +- } +- +- #-------------------------------------------------------------------------- +- # The public methods which TarFile provides: +- +- def close(self): +- """Close the TarFile. In write-mode, two finishing zero blocks are +- appended to the archive. +- """ +- if self.closed: +- return +- +- if self.mode in "aw": +- self.fileobj.write(NUL * (BLOCKSIZE * 2)) +- self.offset += (BLOCKSIZE * 2) +- # fill up the end with zero-blocks +- # (like option -b20 for tar does) +- blocks, remainder = divmod(self.offset, RECORDSIZE) +- if remainder > 0: +- self.fileobj.write(NUL * (RECORDSIZE - remainder)) +- +- if not self._extfileobj: +- self.fileobj.close() +- self.closed = True +- +- def getmember(self, name): +- """Return a TarInfo object for member `name'. If `name' can not be +- found in the archive, KeyError is raised. If a member occurs more +- than once in the archive, its last occurrence is assumed to be the +- most up-to-date version. +- """ +- tarinfo = self._getmember(name) +- if tarinfo is None: +- raise KeyError("filename %r not found" % name) +- return tarinfo +- +- def getmembers(self): +- """Return the members of the archive as a list of TarInfo objects. The +- list has the same order as the members in the archive. +- """ +- self._check() +- if not self._loaded: # if we want to obtain a list of +- self._load() # all members, we first have to +- # scan the whole archive. +- return self.members +- +- def getnames(self): +- """Return the members of the archive as a list of their names. It has +- the same order as the list returned by getmembers(). +- """ +- return [tarinfo.name for tarinfo in self.getmembers()] +- +- def gettarinfo(self, name=None, arcname=None, fileobj=None): +- """Create a TarInfo object for either the file `name' or the file +- object `fileobj' (using os.fstat on its file descriptor). You can +- modify some of the TarInfo's attributes before you add it using +- addfile(). If given, `arcname' specifies an alternative name for the +- file in the archive. +- """ +- self._check("aw") +- +- # When fileobj is given, replace name by +- # fileobj's real name. +- if fileobj is not None: +- name = fileobj.name +- +- # Building the name of the member in the archive. +- # Backward slashes are converted to forward slashes, +- # Absolute paths are turned to relative paths. +- if arcname is None: +- arcname = name +- drv, arcname = os.path.splitdrive(arcname) +- arcname = arcname.replace(os.sep, "/") +- arcname = arcname.lstrip("/") +- +- # Now, fill the TarInfo object with +- # information specific for the file. +- tarinfo = self.tarinfo() +- tarinfo.tarfile = self +- +- # Use os.stat or os.lstat, depending on platform +- # and if symlinks shall be resolved. +- if fileobj is None: +- if hasattr(os, "lstat") and not self.dereference: +- statres = os.lstat(name) +- else: +- statres = os.stat(name) +- else: +- statres = os.fstat(fileobj.fileno()) +- linkname = "" +- +- stmd = statres.st_mode +- if stat.S_ISREG(stmd): +- inode = (statres.st_ino, statres.st_dev) +- if not self.dereference and statres.st_nlink > 1 and \ +- inode in self.inodes and arcname != self.inodes[inode]: +- # Is it a hardlink to an already +- # archived file? +- type = LNKTYPE +- linkname = self.inodes[inode] +- else: +- # The inode is added only if its valid. +- # For win32 it is always 0. +- type = REGTYPE +- if inode[0]: +- self.inodes[inode] = arcname +- elif stat.S_ISDIR(stmd): +- type = DIRTYPE +- elif stat.S_ISFIFO(stmd): +- type = FIFOTYPE +- elif stat.S_ISLNK(stmd): +- type = SYMTYPE +- linkname = os.readlink(name) +- elif stat.S_ISCHR(stmd): +- type = CHRTYPE +- elif stat.S_ISBLK(stmd): +- type = BLKTYPE +- else: +- return None +- +- # Fill the TarInfo object with all +- # information we can get. +- tarinfo.name = arcname +- tarinfo.mode = stmd +- tarinfo.uid = statres.st_uid +- tarinfo.gid = statres.st_gid +- if type == REGTYPE: +- tarinfo.size = statres.st_size +- else: +- tarinfo.size = 0 +- tarinfo.mtime = statres.st_mtime +- tarinfo.type = type +- tarinfo.linkname = linkname +- if pwd: +- try: +- tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] +- except KeyError: +- pass +- if grp: +- try: +- tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] +- except KeyError: +- pass +- +- if type in (CHRTYPE, BLKTYPE): +- if hasattr(os, "major") and hasattr(os, "minor"): +- tarinfo.devmajor = os.major(statres.st_rdev) +- tarinfo.devminor = os.minor(statres.st_rdev) +- return tarinfo +- +- def list(self, verbose=True): +- """Print a table of contents to sys.stdout. If `verbose' is False, only +- the names of the members are printed. If it is True, an `ls -l'-like +- output is produced. +- """ +- self._check() +- +- for tarinfo in self: +- if verbose: +- print(filemode(tarinfo.mode), end=' ') +- print("%s/%s" % (tarinfo.uname or tarinfo.uid, +- tarinfo.gname or tarinfo.gid), end=' ') +- if tarinfo.ischr() or tarinfo.isblk(): +- print("%10s" % ("%d,%d" \ +- % (tarinfo.devmajor, tarinfo.devminor)), end=' ') +- else: +- print("%10d" % tarinfo.size, end=' ') +- print("%d-%02d-%02d %02d:%02d:%02d" \ +- % time.localtime(tarinfo.mtime)[:6], end=' ') +- +- print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') +- +- if verbose: +- if tarinfo.issym(): +- print("->", tarinfo.linkname, end=' ') +- if tarinfo.islnk(): +- print("link to", tarinfo.linkname, end=' ') +- print() +- +- def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): +- """Add the file `name' to the archive. `name' may be any type of file +- (directory, fifo, symbolic link, etc.). If given, `arcname' +- specifies an alternative name for the file in the archive. +- Directories are added recursively by default. This can be avoided by +- setting `recursive' to False. `exclude' is a function that should +- return True for each filename to be excluded. `filter' is a function +- that expects a TarInfo object argument and returns the changed +- TarInfo object, if it returns None the TarInfo object will be +- excluded from the archive. +- """ +- self._check("aw") +- +- if arcname is None: +- arcname = name +- +- # Exclude pathnames. +- if exclude is not None: +- import warnings +- warnings.warn("use the filter argument instead", +- DeprecationWarning, 2) +- if exclude(name): +- self._dbg(2, "tarfile: Excluded %r" % name) +- return +- +- # Skip if somebody tries to archive the archive... +- if self.name is not None and os.path.abspath(name) == self.name: +- self._dbg(2, "tarfile: Skipped %r" % name) +- return +- +- self._dbg(1, name) +- +- # Create a TarInfo object from the file. +- tarinfo = self.gettarinfo(name, arcname) +- +- if tarinfo is None: +- self._dbg(1, "tarfile: Unsupported type %r" % name) +- return +- +- # Change or exclude the TarInfo object. +- if filter is not None: +- tarinfo = filter(tarinfo) +- if tarinfo is None: +- self._dbg(2, "tarfile: Excluded %r" % name) +- return +- +- # Append the tar header and data to the archive. +- if tarinfo.isreg(): +- f = bltn_open(name, "rb") +- self.addfile(tarinfo, f) +- f.close() +- +- elif tarinfo.isdir(): +- self.addfile(tarinfo) +- if recursive: +- for f in os.listdir(name): +- self.add(os.path.join(name, f), os.path.join(arcname, f), +- recursive, exclude, filter=filter) +- +- else: +- self.addfile(tarinfo) +- +- def addfile(self, tarinfo, fileobj=None): +- """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is +- given, tarinfo.size bytes are read from it and added to the archive. +- You can create TarInfo objects using gettarinfo(). +- On Windows platforms, `fileobj' should always be opened with mode +- 'rb' to avoid irritation about the file size. +- """ +- self._check("aw") +- +- tarinfo = copy.copy(tarinfo) +- +- buf = tarinfo.tobuf(self.format, self.encoding, self.errors) +- self.fileobj.write(buf) +- self.offset += len(buf) +- +- # If there's data to follow, append it. +- if fileobj is not None: +- copyfileobj(fileobj, self.fileobj, tarinfo.size) +- blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) +- if remainder > 0: +- self.fileobj.write(NUL * (BLOCKSIZE - remainder)) +- blocks += 1 +- self.offset += blocks * BLOCKSIZE +- +- self.members.append(tarinfo) +- +- def extractall(self, path=".", members=None): +- """Extract all members from the archive to the current working +- directory and set owner, modification time and permissions on +- directories afterwards. `path' specifies a different directory +- to extract to. `members' is optional and must be a subset of the +- list returned by getmembers(). +- """ +- directories = [] +- +- if members is None: +- members = self +- +- for tarinfo in members: +- if tarinfo.isdir(): +- # Extract directories with a safe mode. +- directories.append(tarinfo) +- tarinfo = copy.copy(tarinfo) +- tarinfo.mode = 0o700 +- # Do not set_attrs directories, as we will do that further down +- self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) +- +- # Reverse sort directories. +- directories.sort(key=lambda a: a.name) +- directories.reverse() +- +- # Set correct owner, mtime and filemode on directories. +- for tarinfo in directories: +- dirpath = os.path.join(path, tarinfo.name) +- try: +- self.chown(tarinfo, dirpath) +- self.utime(tarinfo, dirpath) +- self.chmod(tarinfo, dirpath) +- except ExtractError as e: +- if self.errorlevel > 1: +- raise +- else: +- self._dbg(1, "tarfile: %s" % e) +- +- def extract(self, member, path="", set_attrs=True): +- """Extract a member from the archive to the current working directory, +- using its full name. Its file information is extracted as accurately +- as possible. `member' may be a filename or a TarInfo object. You can +- specify a different directory using `path'. File attributes (owner, +- mtime, mode) are set unless `set_attrs' is False. +- """ +- self._check("r") +- +- if isinstance(member, str): +- tarinfo = self.getmember(member) +- else: +- tarinfo = member +- +- # Prepare the link target for makelink(). +- if tarinfo.islnk(): +- tarinfo._link_target = os.path.join(path, tarinfo.linkname) +- +- try: +- self._extract_member(tarinfo, os.path.join(path, tarinfo.name), +- set_attrs=set_attrs) +- except EnvironmentError as e: +- if self.errorlevel > 0: +- raise +- else: +- if e.filename is None: +- self._dbg(1, "tarfile: %s" % e.strerror) +- else: +- self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) +- except ExtractError as e: +- if self.errorlevel > 1: +- raise +- else: +- self._dbg(1, "tarfile: %s" % e) +- +- def extractfile(self, member): +- """Extract a member from the archive as a file object. `member' may be +- a filename or a TarInfo object. If `member' is a regular file, a +- file-like object is returned. If `member' is a link, a file-like +- object is constructed from the link's target. If `member' is none of +- the above, None is returned. +- The file-like object is read-only and provides the following +- methods: read(), readline(), readlines(), seek() and tell() +- """ +- self._check("r") +- +- if isinstance(member, str): +- tarinfo = self.getmember(member) +- else: +- tarinfo = member +- +- if tarinfo.isreg(): +- return self.fileobject(self, tarinfo) +- +- elif tarinfo.type not in SUPPORTED_TYPES: +- # If a member's type is unknown, it is treated as a +- # regular file. +- return self.fileobject(self, tarinfo) +- +- elif tarinfo.islnk() or tarinfo.issym(): +- if isinstance(self.fileobj, _Stream): +- # A small but ugly workaround for the case that someone tries +- # to extract a (sym)link as a file-object from a non-seekable +- # stream of tar blocks. +- raise StreamError("cannot extract (sym)link as file object") +- else: +- # A (sym)link's file object is its target's file object. +- return self.extractfile(self._find_link_target(tarinfo)) +- else: +- # If there's no data associated with the member (directory, chrdev, +- # blkdev, etc.), return None instead of a file object. +- return None +- +- def _extract_member(self, tarinfo, targetpath, set_attrs=True): +- """Extract the TarInfo object tarinfo to a physical +- file called targetpath. +- """ +- # Fetch the TarInfo object for the given name +- # and build the destination pathname, replacing +- # forward slashes to platform specific separators. +- targetpath = targetpath.rstrip("/") +- targetpath = targetpath.replace("/", os.sep) +- +- # Create all upper directories. +- upperdirs = os.path.dirname(targetpath) +- if upperdirs and not os.path.exists(upperdirs): +- # Create directories that are not part of the archive with +- # default permissions. +- os.makedirs(upperdirs) +- +- if tarinfo.islnk() or tarinfo.issym(): +- self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) +- else: +- self._dbg(1, tarinfo.name) +- +- if tarinfo.isreg(): +- self.makefile(tarinfo, targetpath) +- elif tarinfo.isdir(): +- self.makedir(tarinfo, targetpath) +- elif tarinfo.isfifo(): +- self.makefifo(tarinfo, targetpath) +- elif tarinfo.ischr() or tarinfo.isblk(): +- self.makedev(tarinfo, targetpath) +- elif tarinfo.islnk() or tarinfo.issym(): +- self.makelink(tarinfo, targetpath) +- elif tarinfo.type not in SUPPORTED_TYPES: +- self.makeunknown(tarinfo, targetpath) +- else: +- self.makefile(tarinfo, targetpath) +- +- if set_attrs: +- self.chown(tarinfo, targetpath) +- if not tarinfo.issym(): +- self.chmod(tarinfo, targetpath) +- self.utime(tarinfo, targetpath) +- +- #-------------------------------------------------------------------------- +- # Below are the different file methods. They are called via +- # _extract_member() when extract() is called. They can be replaced in a +- # subclass to implement other functionality. +- +- def makedir(self, tarinfo, targetpath): +- """Make a directory called targetpath. +- """ +- try: +- # Use a safe mode for the directory, the real mode is set +- # later in _extract_member(). +- os.mkdir(targetpath, 0o700) +- except EnvironmentError as e: +- if e.errno != errno.EEXIST: +- raise +- +- def makefile(self, tarinfo, targetpath): +- """Make a file called targetpath. +- """ +- source = self.fileobj +- source.seek(tarinfo.offset_data) +- target = bltn_open(targetpath, "wb") +- if tarinfo.sparse is not None: +- for offset, size in tarinfo.sparse: +- target.seek(offset) +- copyfileobj(source, target, size) +- else: +- copyfileobj(source, target, tarinfo.size) +- target.seek(tarinfo.size) +- target.truncate() +- target.close() +- +- def makeunknown(self, tarinfo, targetpath): +- """Make a file from a TarInfo object with an unknown type +- at targetpath. +- """ +- self.makefile(tarinfo, targetpath) +- self._dbg(1, "tarfile: Unknown file type %r, " \ +- "extracted as regular file." % tarinfo.type) +- +- def makefifo(self, tarinfo, targetpath): +- """Make a fifo called targetpath. +- """ +- if hasattr(os, "mkfifo"): +- os.mkfifo(targetpath) +- else: +- raise ExtractError("fifo not supported by system") +- +- def makedev(self, tarinfo, targetpath): +- """Make a character or block device called targetpath. +- """ +- if not hasattr(os, "mknod") or not hasattr(os, "makedev"): +- raise ExtractError("special devices not supported by system") +- +- mode = tarinfo.mode +- if tarinfo.isblk(): +- mode |= stat.S_IFBLK +- else: +- mode |= stat.S_IFCHR +- +- os.mknod(targetpath, mode, +- os.makedev(tarinfo.devmajor, tarinfo.devminor)) +- +- def makelink(self, tarinfo, targetpath): +- """Make a (symbolic) link called targetpath. If it cannot be created +- (platform limitation), we try to make a copy of the referenced file +- instead of a link. +- """ +- try: +- # For systems that support symbolic and hard links. +- if tarinfo.issym(): +- os.symlink(tarinfo.linkname, targetpath) +- else: +- # See extract(). +- if os.path.exists(tarinfo._link_target): +- os.link(tarinfo._link_target, targetpath) +- else: +- self._extract_member(self._find_link_target(tarinfo), +- targetpath) +- except symlink_exception: +- if tarinfo.issym(): +- linkpath = os.path.join(os.path.dirname(tarinfo.name), +- tarinfo.linkname) +- else: +- linkpath = tarinfo.linkname +- else: +- try: +- self._extract_member(self._find_link_target(tarinfo), +- targetpath) +- except KeyError: +- raise ExtractError("unable to resolve link inside archive") +- +- def chown(self, tarinfo, targetpath): +- """Set owner of targetpath according to tarinfo. +- """ +- if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: +- # We have to be root to do so. +- try: +- g = grp.getgrnam(tarinfo.gname)[2] +- except KeyError: +- g = tarinfo.gid +- try: +- u = pwd.getpwnam(tarinfo.uname)[2] +- except KeyError: +- u = tarinfo.uid +- try: +- if tarinfo.issym() and hasattr(os, "lchown"): +- os.lchown(targetpath, u, g) +- else: +- if sys.platform != "os2emx": +- os.chown(targetpath, u, g) +- except EnvironmentError as e: +- raise ExtractError("could not change owner") +- +- def chmod(self, tarinfo, targetpath): +- """Set file permissions of targetpath according to tarinfo. +- """ +- if hasattr(os, 'chmod'): +- try: +- os.chmod(targetpath, tarinfo.mode) +- except EnvironmentError as e: +- raise ExtractError("could not change mode") +- +- def utime(self, tarinfo, targetpath): +- """Set modification time of targetpath according to tarinfo. +- """ +- if not hasattr(os, 'utime'): +- return +- try: +- os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) +- except EnvironmentError as e: +- raise ExtractError("could not change modification time") +- +- #-------------------------------------------------------------------------- +- def next(self): +- """Return the next member of the archive as a TarInfo object, when +- TarFile is opened for reading. Return None if there is no more +- available. +- """ +- self._check("ra") +- if self.firstmember is not None: +- m = self.firstmember +- self.firstmember = None +- return m +- +- # Read the next block. +- self.fileobj.seek(self.offset) +- tarinfo = None +- while True: +- try: +- tarinfo = self.tarinfo.fromtarfile(self) +- except EOFHeaderError as e: +- if self.ignore_zeros: +- self._dbg(2, "0x%X: %s" % (self.offset, e)) +- self.offset += BLOCKSIZE +- continue +- except InvalidHeaderError as e: +- if self.ignore_zeros: +- self._dbg(2, "0x%X: %s" % (self.offset, e)) +- self.offset += BLOCKSIZE +- continue +- elif self.offset == 0: +- raise ReadError(str(e)) +- except EmptyHeaderError: +- if self.offset == 0: +- raise ReadError("empty file") +- except TruncatedHeaderError as e: +- if self.offset == 0: +- raise ReadError(str(e)) +- except SubsequentHeaderError as e: +- raise ReadError(str(e)) +- break +- +- if tarinfo is not None: +- self.members.append(tarinfo) +- else: +- self._loaded = True +- +- return tarinfo +- +- #-------------------------------------------------------------------------- +- # Little helper methods: +- +- def _getmember(self, name, tarinfo=None, normalize=False): +- """Find an archive member by name from bottom to top. +- If tarinfo is given, it is used as the starting point. +- """ +- # Ensure that all members have been loaded. +- members = self.getmembers() +- +- # Limit the member search list up to tarinfo. +- if tarinfo is not None: +- members = members[:members.index(tarinfo)] +- +- if normalize: +- name = os.path.normpath(name) +- +- for member in reversed(members): +- if normalize: +- member_name = os.path.normpath(member.name) +- else: +- member_name = member.name +- +- if name == member_name: +- return member +- +- def _load(self): +- """Read through the entire archive file and look for readable +- members. +- """ +- while True: +- tarinfo = self.next() +- if tarinfo is None: +- break +- self._loaded = True +- +- def _check(self, mode=None): +- """Check if TarFile is still open, and if the operation's mode +- corresponds to TarFile's mode. +- """ +- if self.closed: +- raise IOError("%s is closed" % self.__class__.__name__) +- if mode is not None and self.mode not in mode: +- raise IOError("bad operation for mode %r" % self.mode) +- +- def _find_link_target(self, tarinfo): +- """Find the target member of a symlink or hardlink member in the +- archive. +- """ +- if tarinfo.issym(): +- # Always search the entire archive. +- linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname +- limit = None +- else: +- # Search the archive before the link, because a hard link is +- # just a reference to an already archived file. +- linkname = tarinfo.linkname +- limit = tarinfo +- +- member = self._getmember(linkname, tarinfo=limit, normalize=True) +- if member is None: +- raise KeyError("linkname %r not found" % linkname) +- return member +- +- def __iter__(self): +- """Provide an iterator object. +- """ +- if self._loaded: +- return iter(self.members) +- else: +- return TarIter(self) +- +- def _dbg(self, level, msg): +- """Write debugging output to sys.stderr. +- """ +- if level <= self.debug: +- print(msg, file=sys.stderr) +- +- def __enter__(self): +- self._check() +- return self +- +- def __exit__(self, type, value, traceback): +- if type is None: +- self.close() +- else: +- # An exception occurred. We must not call close() because +- # it would try to write end-of-archive blocks and padding. +- if not self._extfileobj: +- self.fileobj.close() +- self.closed = True +-# class TarFile +- +-class TarIter(object): +- """Iterator Class. +- +- for tarinfo in TarFile(...): +- suite... +- """ +- +- def __init__(self, tarfile): +- """Construct a TarIter object. +- """ +- self.tarfile = tarfile +- self.index = 0 +- def __iter__(self): +- """Return iterator object. +- """ +- return self +- +- def __next__(self): +- """Return the next item using TarFile's next() method. +- When all members have been read, set TarFile as _loaded. +- """ +- # Fix for SF #1100429: Under rare circumstances it can +- # happen that getmembers() is called during iteration, +- # which will cause TarIter to stop prematurely. +- if not self.tarfile._loaded: +- tarinfo = self.tarfile.next() +- if not tarinfo: +- self.tarfile._loaded = True +- raise StopIteration +- else: +- try: +- tarinfo = self.tarfile.members[self.index] +- except IndexError: +- raise StopIteration +- self.index += 1 +- return tarinfo +- +- next = __next__ # for Python 2.x +- +-#-------------------- +-# exported functions +-#-------------------- +-def is_tarfile(name): +- """Return True if name points to a tar archive that we +- are able to handle, else return False. +- """ +- try: +- t = open(name) +- t.close() +- return True +- except TarError: +- return False +- +-bltn_open = open +-open = TarFile.open +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/compat.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/compat.py +deleted file mode 100644 +index 2b198dd..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/compat.py ++++ /dev/null +@@ -1,1111 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2013-2016 Vinay Sajip. +-# Licensed to the Python Software Foundation under a contributor agreement. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-from __future__ import absolute_import +- +-import os +-import re +-import sys +- +-try: +- import ssl +-except ImportError: +- ssl = None +- +-if sys.version_info[0] < 3: # pragma: no cover +- from StringIO import StringIO +- string_types = basestring, +- text_type = unicode +- from types import FileType as file_type +- import __builtin__ as builtins +- import ConfigParser as configparser +- from ._backport import shutil +- from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit +- from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, +- pathname2url, ContentTooShortError, splittype) +- +- def quote(s): +- if isinstance(s, unicode): +- s = s.encode('utf-8') +- return _quote(s) +- +- import urllib2 +- from urllib2 import (Request, urlopen, URLError, HTTPError, +- HTTPBasicAuthHandler, HTTPPasswordMgr, +- HTTPHandler, HTTPRedirectHandler, +- build_opener) +- if ssl: +- from urllib2 import HTTPSHandler +- import httplib +- import xmlrpclib +- import Queue as queue +- from HTMLParser import HTMLParser +- import htmlentitydefs +- raw_input = raw_input +- from itertools import ifilter as filter +- from itertools import ifilterfalse as filterfalse +- +- _userprog = None +- def splituser(host): +- """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" +- global _userprog +- if _userprog is None: +- import re +- _userprog = re.compile('^(.*)@(.*)$') +- +- match = _userprog.match(host) +- if match: return match.group(1, 2) +- return None, host +- +-else: # pragma: no cover +- from io import StringIO +- string_types = str, +- text_type = str +- from io import TextIOWrapper as file_type +- import builtins +- import configparser +- import shutil +- from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, +- unquote, urlsplit, urlunsplit, splittype) +- from urllib.request import (urlopen, urlretrieve, Request, url2pathname, +- pathname2url, +- HTTPBasicAuthHandler, HTTPPasswordMgr, +- HTTPHandler, HTTPRedirectHandler, +- build_opener) +- if ssl: +- from urllib.request import HTTPSHandler +- from urllib.error import HTTPError, URLError, ContentTooShortError +- import http.client as httplib +- import urllib.request as urllib2 +- import xmlrpc.client as xmlrpclib +- import queue +- from html.parser import HTMLParser +- import html.entities as htmlentitydefs +- raw_input = input +- from itertools import filterfalse +- filter = filter +- +-try: +- from ssl import match_hostname, CertificateError +-except ImportError: # pragma: no cover +- class CertificateError(ValueError): +- pass +- +- +- def _dnsname_match(dn, hostname, max_wildcards=1): +- """Matching according to RFC 6125, section 6.4.3 +- +- http://tools.ietf.org/html/rfc6125#section-6.4.3 +- """ +- pats = [] +- if not dn: +- return False +- +- parts = dn.split('.') +- leftmost, remainder = parts[0], parts[1:] +- +- wildcards = leftmost.count('*') +- if wildcards > max_wildcards: +- # Issue #17980: avoid denials of service by refusing more +- # than one wildcard per fragment. A survey of established +- # policy among SSL implementations showed it to be a +- # reasonable choice. +- raise CertificateError( +- "too many wildcards in certificate DNS name: " + repr(dn)) +- +- # speed up common case w/o wildcards +- if not wildcards: +- return dn.lower() == hostname.lower() +- +- # RFC 6125, section 6.4.3, subitem 1. +- # The client SHOULD NOT attempt to match a presented identifier in which +- # the wildcard character comprises a label other than the left-most label. +- if leftmost == '*': +- # When '*' is a fragment by itself, it matches a non-empty dotless +- # fragment. +- pats.append('[^.]+') +- elif leftmost.startswith('xn--') or hostname.startswith('xn--'): +- # RFC 6125, section 6.4.3, subitem 3. +- # The client SHOULD NOT attempt to match a presented identifier +- # where the wildcard character is embedded within an A-label or +- # U-label of an internationalized domain name. +- pats.append(re.escape(leftmost)) +- else: +- # Otherwise, '*' matches any dotless string, e.g. www* +- pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) +- +- # add the remaining fragments, ignore any wildcards +- for frag in remainder: +- pats.append(re.escape(frag)) +- +- pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) +- return pat.match(hostname) +- +- +- def match_hostname(cert, hostname): +- """Verify that *cert* (in decoded format as returned by +- SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 +- rules are followed, but IP addresses are not accepted for *hostname*. +- +- CertificateError is raised on failure. On success, the function +- returns nothing. +- """ +- if not cert: +- raise ValueError("empty or no certificate, match_hostname needs a " +- "SSL socket or SSL context with either " +- "CERT_OPTIONAL or CERT_REQUIRED") +- dnsnames = [] +- san = cert.get('subjectAltName', ()) +- for key, value in san: +- if key == 'DNS': +- if _dnsname_match(value, hostname): +- return +- dnsnames.append(value) +- if not dnsnames: +- # The subject is only checked when there is no dNSName entry +- # in subjectAltName +- for sub in cert.get('subject', ()): +- for key, value in sub: +- # XXX according to RFC 2818, the most specific Common Name +- # must be used. +- if key == 'commonName': +- if _dnsname_match(value, hostname): +- return +- dnsnames.append(value) +- if len(dnsnames) > 1: +- raise CertificateError("hostname %r " +- "doesn't match either of %s" +- % (hostname, ', '.join(map(repr, dnsnames)))) +- elif len(dnsnames) == 1: +- raise CertificateError("hostname %r " +- "doesn't match %r" +- % (hostname, dnsnames[0])) +- else: +- raise CertificateError("no appropriate commonName or " +- "subjectAltName fields were found") +- +- +-try: +- from types import SimpleNamespace as Container +-except ImportError: # pragma: no cover +- class Container(object): +- """ +- A generic container for when multiple values need to be returned +- """ +- def __init__(self, **kwargs): +- self.__dict__.update(kwargs) +- +- +-try: +- from shutil import which +-except ImportError: # pragma: no cover +- # Implementation from Python 3.3 +- def which(cmd, mode=os.F_OK | os.X_OK, path=None): +- """Given a command, mode, and a PATH string, return the path which +- conforms to the given mode on the PATH, or None if there is no such +- file. +- +- `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result +- of os.environ.get("PATH"), or can be overridden with a custom search +- path. +- +- """ +- # Check that a given file can be accessed with the correct mode. +- # Additionally check that `file` is not a directory, as on Windows +- # directories pass the os.access check. +- def _access_check(fn, mode): +- return (os.path.exists(fn) and os.access(fn, mode) +- and not os.path.isdir(fn)) +- +- # If we're given a path with a directory part, look it up directly rather +- # than referring to PATH directories. This includes checking relative to the +- # current directory, e.g. ./script +- if os.path.dirname(cmd): +- if _access_check(cmd, mode): +- return cmd +- return None +- +- if path is None: +- path = os.environ.get("PATH", os.defpath) +- if not path: +- return None +- path = path.split(os.pathsep) +- +- if sys.platform == "win32": +- # The current directory takes precedence on Windows. +- if not os.curdir in path: +- path.insert(0, os.curdir) +- +- # PATHEXT is necessary to check on Windows. +- pathext = os.environ.get("PATHEXT", "").split(os.pathsep) +- # See if the given file matches any of the expected path extensions. +- # This will allow us to short circuit when given "python.exe". +- # If it does match, only test that one, otherwise we have to try +- # others. +- if any(cmd.lower().endswith(ext.lower()) for ext in pathext): +- files = [cmd] +- else: +- files = [cmd + ext for ext in pathext] +- else: +- # On other platforms you don't have things like PATHEXT to tell you +- # what file suffixes are executable, so just pass on cmd as-is. +- files = [cmd] +- +- seen = set() +- for dir in path: +- normdir = os.path.normcase(dir) +- if not normdir in seen: +- seen.add(normdir) +- for thefile in files: +- name = os.path.join(dir, thefile) +- if _access_check(name, mode): +- return name +- return None +- +- +-# ZipFile is a context manager in 2.7, but not in 2.6 +- +-from zipfile import ZipFile as BaseZipFile +- +-if hasattr(BaseZipFile, '__enter__'): # pragma: no cover +- ZipFile = BaseZipFile +-else: +- from zipfile import ZipExtFile as BaseZipExtFile +- +- class ZipExtFile(BaseZipExtFile): +- def __init__(self, base): +- self.__dict__.update(base.__dict__) +- +- def __enter__(self): +- return self +- +- def __exit__(self, *exc_info): +- self.close() +- # return None, so if an exception occurred, it will propagate +- +- class ZipFile(BaseZipFile): +- def __enter__(self): +- return self +- +- def __exit__(self, *exc_info): +- self.close() +- # return None, so if an exception occurred, it will propagate +- +- def open(self, *args, **kwargs): +- base = BaseZipFile.open(self, *args, **kwargs) +- return ZipExtFile(base) +- +-try: +- from platform import python_implementation +-except ImportError: # pragma: no cover +- def python_implementation(): +- """Return a string identifying the Python implementation.""" +- if 'PyPy' in sys.version: +- return 'PyPy' +- if os.name == 'java': +- return 'Jython' +- if sys.version.startswith('IronPython'): +- return 'IronPython' +- return 'CPython' +- +-try: +- import sysconfig +-except ImportError: # pragma: no cover +- from ._backport import sysconfig +- +-try: +- callable = callable +-except NameError: # pragma: no cover +- from collections import Callable +- +- def callable(obj): +- return isinstance(obj, Callable) +- +- +-try: +- fsencode = os.fsencode +- fsdecode = os.fsdecode +-except AttributeError: # pragma: no cover +- _fsencoding = sys.getfilesystemencoding() +- if _fsencoding == 'mbcs': +- _fserrors = 'strict' +- else: +- _fserrors = 'surrogateescape' +- +- def fsencode(filename): +- if isinstance(filename, bytes): +- return filename +- elif isinstance(filename, text_type): +- return filename.encode(_fsencoding, _fserrors) +- else: +- raise TypeError("expect bytes or str, not %s" % +- type(filename).__name__) +- +- def fsdecode(filename): +- if isinstance(filename, text_type): +- return filename +- elif isinstance(filename, bytes): +- return filename.decode(_fsencoding, _fserrors) +- else: +- raise TypeError("expect bytes or str, not %s" % +- type(filename).__name__) +- +-try: +- from tokenize import detect_encoding +-except ImportError: # pragma: no cover +- from codecs import BOM_UTF8, lookup +- import re +- +- cookie_re = re.compile("coding[:=]\s*([-\w.]+)") +- +- def _get_normal_name(orig_enc): +- """Imitates get_normal_name in tokenizer.c.""" +- # Only care about the first 12 characters. +- enc = orig_enc[:12].lower().replace("_", "-") +- if enc == "utf-8" or enc.startswith("utf-8-"): +- return "utf-8" +- if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ +- enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): +- return "iso-8859-1" +- return orig_enc +- +- def detect_encoding(readline): +- """ +- The detect_encoding() function is used to detect the encoding that should +- be used to decode a Python source file. It requires one argument, readline, +- in the same way as the tokenize() generator. +- +- It will call readline a maximum of twice, and return the encoding used +- (as a string) and a list of any lines (left as bytes) it has read in. +- +- It detects the encoding from the presence of a utf-8 bom or an encoding +- cookie as specified in pep-0263. If both a bom and a cookie are present, +- but disagree, a SyntaxError will be raised. If the encoding cookie is an +- invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, +- 'utf-8-sig' is returned. +- +- If no encoding is specified, then the default of 'utf-8' will be returned. +- """ +- try: +- filename = readline.__self__.name +- except AttributeError: +- filename = None +- bom_found = False +- encoding = None +- default = 'utf-8' +- def read_or_stop(): +- try: +- return readline() +- except StopIteration: +- return b'' +- +- def find_cookie(line): +- try: +- # Decode as UTF-8. Either the line is an encoding declaration, +- # in which case it should be pure ASCII, or it must be UTF-8 +- # per default encoding. +- line_string = line.decode('utf-8') +- except UnicodeDecodeError: +- msg = "invalid or missing encoding declaration" +- if filename is not None: +- msg = '{} for {!r}'.format(msg, filename) +- raise SyntaxError(msg) +- +- matches = cookie_re.findall(line_string) +- if not matches: +- return None +- encoding = _get_normal_name(matches[0]) +- try: +- codec = lookup(encoding) +- except LookupError: +- # This behaviour mimics the Python interpreter +- if filename is None: +- msg = "unknown encoding: " + encoding +- else: +- msg = "unknown encoding for {!r}: {}".format(filename, +- encoding) +- raise SyntaxError(msg) +- +- if bom_found: +- if codec.name != 'utf-8': +- # This behaviour mimics the Python interpreter +- if filename is None: +- msg = 'encoding problem: utf-8' +- else: +- msg = 'encoding problem for {!r}: utf-8'.format(filename) +- raise SyntaxError(msg) +- encoding += '-sig' +- return encoding +- +- first = read_or_stop() +- if first.startswith(BOM_UTF8): +- bom_found = True +- first = first[3:] +- default = 'utf-8-sig' +- if not first: +- return default, [] +- +- encoding = find_cookie(first) +- if encoding: +- return encoding, [first] +- +- second = read_or_stop() +- if not second: +- return default, [first] +- +- encoding = find_cookie(second) +- if encoding: +- return encoding, [first, second] +- +- return default, [first, second] +- +-# For converting & <-> & etc. +-try: +- from html import escape +-except ImportError: +- from cgi import escape +-if sys.version_info[:2] < (3, 4): +- unescape = HTMLParser().unescape +-else: +- from html import unescape +- +-try: +- from collections import ChainMap +-except ImportError: # pragma: no cover +- from collections import MutableMapping +- +- try: +- from reprlib import recursive_repr as _recursive_repr +- except ImportError: +- def _recursive_repr(fillvalue='...'): +- ''' +- Decorator to make a repr function return fillvalue for a recursive +- call +- ''' +- +- def decorating_function(user_function): +- repr_running = set() +- +- def wrapper(self): +- key = id(self), get_ident() +- if key in repr_running: +- return fillvalue +- repr_running.add(key) +- try: +- result = user_function(self) +- finally: +- repr_running.discard(key) +- return result +- +- # Can't use functools.wraps() here because of bootstrap issues +- wrapper.__module__ = getattr(user_function, '__module__') +- wrapper.__doc__ = getattr(user_function, '__doc__') +- wrapper.__name__ = getattr(user_function, '__name__') +- wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) +- return wrapper +- +- return decorating_function +- +- class ChainMap(MutableMapping): +- ''' A ChainMap groups multiple dicts (or other mappings) together +- to create a single, updateable view. +- +- The underlying mappings are stored in a list. That list is public and can +- accessed or updated using the *maps* attribute. There is no other state. +- +- Lookups search the underlying mappings successively until a key is found. +- In contrast, writes, updates, and deletions only operate on the first +- mapping. +- +- ''' +- +- def __init__(self, *maps): +- '''Initialize a ChainMap by setting *maps* to the given mappings. +- If no mappings are provided, a single empty dictionary is used. +- +- ''' +- self.maps = list(maps) or [{}] # always at least one map +- +- def __missing__(self, key): +- raise KeyError(key) +- +- def __getitem__(self, key): +- for mapping in self.maps: +- try: +- return mapping[key] # can't use 'key in mapping' with defaultdict +- except KeyError: +- pass +- return self.__missing__(key) # support subclasses that define __missing__ +- +- def get(self, key, default=None): +- return self[key] if key in self else default +- +- def __len__(self): +- return len(set().union(*self.maps)) # reuses stored hash values if possible +- +- def __iter__(self): +- return iter(set().union(*self.maps)) +- +- def __contains__(self, key): +- return any(key in m for m in self.maps) +- +- def __bool__(self): +- return any(self.maps) +- +- @_recursive_repr() +- def __repr__(self): +- return '{0.__class__.__name__}({1})'.format( +- self, ', '.join(map(repr, self.maps))) +- +- @classmethod +- def fromkeys(cls, iterable, *args): +- 'Create a ChainMap with a single dict created from the iterable.' +- return cls(dict.fromkeys(iterable, *args)) +- +- def copy(self): +- 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' +- return self.__class__(self.maps[0].copy(), *self.maps[1:]) +- +- __copy__ = copy +- +- def new_child(self): # like Django's Context.push() +- 'New ChainMap with a new dict followed by all previous maps.' +- return self.__class__({}, *self.maps) +- +- @property +- def parents(self): # like Django's Context.pop() +- 'New ChainMap from maps[1:].' +- return self.__class__(*self.maps[1:]) +- +- def __setitem__(self, key, value): +- self.maps[0][key] = value +- +- def __delitem__(self, key): +- try: +- del self.maps[0][key] +- except KeyError: +- raise KeyError('Key not found in the first mapping: {!r}'.format(key)) +- +- def popitem(self): +- 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' +- try: +- return self.maps[0].popitem() +- except KeyError: +- raise KeyError('No keys found in the first mapping.') +- +- def pop(self, key, *args): +- 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' +- try: +- return self.maps[0].pop(key, *args) +- except KeyError: +- raise KeyError('Key not found in the first mapping: {!r}'.format(key)) +- +- def clear(self): +- 'Clear maps[0], leaving maps[1:] intact.' +- self.maps[0].clear() +- +-try: +- from imp import cache_from_source +-except ImportError: # pragma: no cover +- def cache_from_source(path, debug_override=None): +- assert path.endswith('.py') +- if debug_override is None: +- debug_override = __debug__ +- if debug_override: +- suffix = 'c' +- else: +- suffix = 'o' +- return path + suffix +- +-try: +- from collections import OrderedDict +-except ImportError: # pragma: no cover +-## {{{ http://code.activestate.com/recipes/576693/ (r9) +-# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +-# Passes Python2.7's test suite and incorporates all the latest updates. +- try: +- from thread import get_ident as _get_ident +- except ImportError: +- from dummy_thread import get_ident as _get_ident +- +- try: +- from _abcoll import KeysView, ValuesView, ItemsView +- except ImportError: +- pass +- +- +- class OrderedDict(dict): +- 'Dictionary that remembers insertion order' +- # An inherited dict maps keys to values. +- # The inherited dict provides __getitem__, __len__, __contains__, and get. +- # The remaining methods are order-aware. +- # Big-O running times for all methods are the same as for regular dictionaries. +- +- # The internal self.__map dictionary maps keys to links in a doubly linked list. +- # The circular doubly linked list starts and ends with a sentinel element. +- # The sentinel element never gets deleted (this simplifies the algorithm). +- # Each link is stored as a list of length three: [PREV, NEXT, KEY]. +- +- def __init__(self, *args, **kwds): +- '''Initialize an ordered dictionary. Signature is the same as for +- regular dictionaries, but keyword arguments are not recommended +- because their insertion order is arbitrary. +- +- ''' +- if len(args) > 1: +- raise TypeError('expected at most 1 arguments, got %d' % len(args)) +- try: +- self.__root +- except AttributeError: +- self.__root = root = [] # sentinel node +- root[:] = [root, root, None] +- self.__map = {} +- self.__update(*args, **kwds) +- +- def __setitem__(self, key, value, dict_setitem=dict.__setitem__): +- 'od.__setitem__(i, y) <==> od[i]=y' +- # Setting a new item creates a new link which goes at the end of the linked +- # list, and the inherited dictionary is updated with the new key/value pair. +- if key not in self: +- root = self.__root +- last = root[0] +- last[1] = root[0] = self.__map[key] = [last, root, key] +- dict_setitem(self, key, value) +- +- def __delitem__(self, key, dict_delitem=dict.__delitem__): +- 'od.__delitem__(y) <==> del od[y]' +- # Deleting an existing item uses self.__map to find the link which is +- # then removed by updating the links in the predecessor and successor nodes. +- dict_delitem(self, key) +- link_prev, link_next, key = self.__map.pop(key) +- link_prev[1] = link_next +- link_next[0] = link_prev +- +- def __iter__(self): +- 'od.__iter__() <==> iter(od)' +- root = self.__root +- curr = root[1] +- while curr is not root: +- yield curr[2] +- curr = curr[1] +- +- def __reversed__(self): +- 'od.__reversed__() <==> reversed(od)' +- root = self.__root +- curr = root[0] +- while curr is not root: +- yield curr[2] +- curr = curr[0] +- +- def clear(self): +- 'od.clear() -> None. Remove all items from od.' +- try: +- for node in self.__map.itervalues(): +- del node[:] +- root = self.__root +- root[:] = [root, root, None] +- self.__map.clear() +- except AttributeError: +- pass +- dict.clear(self) +- +- def popitem(self, last=True): +- '''od.popitem() -> (k, v), return and remove a (key, value) pair. +- Pairs are returned in LIFO order if last is true or FIFO order if false. +- +- ''' +- if not self: +- raise KeyError('dictionary is empty') +- root = self.__root +- if last: +- link = root[0] +- link_prev = link[0] +- link_prev[1] = root +- root[0] = link_prev +- else: +- link = root[1] +- link_next = link[1] +- root[1] = link_next +- link_next[0] = root +- key = link[2] +- del self.__map[key] +- value = dict.pop(self, key) +- return key, value +- +- # -- the following methods do not depend on the internal structure -- +- +- def keys(self): +- 'od.keys() -> list of keys in od' +- return list(self) +- +- def values(self): +- 'od.values() -> list of values in od' +- return [self[key] for key in self] +- +- def items(self): +- 'od.items() -> list of (key, value) pairs in od' +- return [(key, self[key]) for key in self] +- +- def iterkeys(self): +- 'od.iterkeys() -> an iterator over the keys in od' +- return iter(self) +- +- def itervalues(self): +- 'od.itervalues -> an iterator over the values in od' +- for k in self: +- yield self[k] +- +- def iteritems(self): +- 'od.iteritems -> an iterator over the (key, value) items in od' +- for k in self: +- yield (k, self[k]) +- +- def update(*args, **kwds): +- '''od.update(E, **F) -> None. Update od from dict/iterable E and F. +- +- If E is a dict instance, does: for k in E: od[k] = E[k] +- If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] +- Or if E is an iterable of items, does: for k, v in E: od[k] = v +- In either case, this is followed by: for k, v in F.items(): od[k] = v +- +- ''' +- if len(args) > 2: +- raise TypeError('update() takes at most 2 positional ' +- 'arguments (%d given)' % (len(args),)) +- elif not args: +- raise TypeError('update() takes at least 1 argument (0 given)') +- self = args[0] +- # Make progressively weaker assumptions about "other" +- other = () +- if len(args) == 2: +- other = args[1] +- if isinstance(other, dict): +- for key in other: +- self[key] = other[key] +- elif hasattr(other, 'keys'): +- for key in other.keys(): +- self[key] = other[key] +- else: +- for key, value in other: +- self[key] = value +- for key, value in kwds.items(): +- self[key] = value +- +- __update = update # let subclasses override update without breaking __init__ +- +- __marker = object() +- +- def pop(self, key, default=__marker): +- '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. +- If key is not found, d is returned if given, otherwise KeyError is raised. +- +- ''' +- if key in self: +- result = self[key] +- del self[key] +- return result +- if default is self.__marker: +- raise KeyError(key) +- return default +- +- def setdefault(self, key, default=None): +- 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' +- if key in self: +- return self[key] +- self[key] = default +- return default +- +- def __repr__(self, _repr_running=None): +- 'od.__repr__() <==> repr(od)' +- if not _repr_running: _repr_running = {} +- call_key = id(self), _get_ident() +- if call_key in _repr_running: +- return '...' +- _repr_running[call_key] = 1 +- try: +- if not self: +- return '%s()' % (self.__class__.__name__,) +- return '%s(%r)' % (self.__class__.__name__, self.items()) +- finally: +- del _repr_running[call_key] +- +- def __reduce__(self): +- 'Return state information for pickling' +- items = [[k, self[k]] for k in self] +- inst_dict = vars(self).copy() +- for k in vars(OrderedDict()): +- inst_dict.pop(k, None) +- if inst_dict: +- return (self.__class__, (items,), inst_dict) +- return self.__class__, (items,) +- +- def copy(self): +- 'od.copy() -> a shallow copy of od' +- return self.__class__(self) +- +- @classmethod +- def fromkeys(cls, iterable, value=None): +- '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S +- and values equal to v (which defaults to None). +- +- ''' +- d = cls() +- for key in iterable: +- d[key] = value +- return d +- +- def __eq__(self, other): +- '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive +- while comparison to a regular mapping is order-insensitive. +- +- ''' +- if isinstance(other, OrderedDict): +- return len(self)==len(other) and self.items() == other.items() +- return dict.__eq__(self, other) +- +- def __ne__(self, other): +- return not self == other +- +- # -- the following methods are only used in Python 2.7 -- +- +- def viewkeys(self): +- "od.viewkeys() -> a set-like object providing a view on od's keys" +- return KeysView(self) +- +- def viewvalues(self): +- "od.viewvalues() -> an object providing a view on od's values" +- return ValuesView(self) +- +- def viewitems(self): +- "od.viewitems() -> a set-like object providing a view on od's items" +- return ItemsView(self) +- +-try: +- from logging.config import BaseConfigurator, valid_ident +-except ImportError: # pragma: no cover +- IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) +- +- +- def valid_ident(s): +- m = IDENTIFIER.match(s) +- if not m: +- raise ValueError('Not a valid Python identifier: %r' % s) +- return True +- +- +- # The ConvertingXXX classes are wrappers around standard Python containers, +- # and they serve to convert any suitable values in the container. The +- # conversion converts base dicts, lists and tuples to their wrapped +- # equivalents, whereas strings which match a conversion format are converted +- # appropriately. +- # +- # Each wrapper should have a configurator attribute holding the actual +- # configurator to use for conversion. +- +- class ConvertingDict(dict): +- """A converting dictionary wrapper.""" +- +- def __getitem__(self, key): +- value = dict.__getitem__(self, key) +- result = self.configurator.convert(value) +- #If the converted value is different, save for next time +- if value is not result: +- self[key] = result +- if type(result) in (ConvertingDict, ConvertingList, +- ConvertingTuple): +- result.parent = self +- result.key = key +- return result +- +- def get(self, key, default=None): +- value = dict.get(self, key, default) +- result = self.configurator.convert(value) +- #If the converted value is different, save for next time +- if value is not result: +- self[key] = result +- if type(result) in (ConvertingDict, ConvertingList, +- ConvertingTuple): +- result.parent = self +- result.key = key +- return result +- +- def pop(self, key, default=None): +- value = dict.pop(self, key, default) +- result = self.configurator.convert(value) +- if value is not result: +- if type(result) in (ConvertingDict, ConvertingList, +- ConvertingTuple): +- result.parent = self +- result.key = key +- return result +- +- class ConvertingList(list): +- """A converting list wrapper.""" +- def __getitem__(self, key): +- value = list.__getitem__(self, key) +- result = self.configurator.convert(value) +- #If the converted value is different, save for next time +- if value is not result: +- self[key] = result +- if type(result) in (ConvertingDict, ConvertingList, +- ConvertingTuple): +- result.parent = self +- result.key = key +- return result +- +- def pop(self, idx=-1): +- value = list.pop(self, idx) +- result = self.configurator.convert(value) +- if value is not result: +- if type(result) in (ConvertingDict, ConvertingList, +- ConvertingTuple): +- result.parent = self +- return result +- +- class ConvertingTuple(tuple): +- """A converting tuple wrapper.""" +- def __getitem__(self, key): +- value = tuple.__getitem__(self, key) +- result = self.configurator.convert(value) +- if value is not result: +- if type(result) in (ConvertingDict, ConvertingList, +- ConvertingTuple): +- result.parent = self +- result.key = key +- return result +- +- class BaseConfigurator(object): +- """ +- The configurator base class which defines some useful defaults. +- """ +- +- CONVERT_PATTERN = re.compile(r'^(?P[a-z]+)://(?P.*)$') +- +- WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') +- DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') +- INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') +- DIGIT_PATTERN = re.compile(r'^\d+$') +- +- value_converters = { +- 'ext' : 'ext_convert', +- 'cfg' : 'cfg_convert', +- } +- +- # We might want to use a different one, e.g. importlib +- importer = staticmethod(__import__) +- +- def __init__(self, config): +- self.config = ConvertingDict(config) +- self.config.configurator = self +- +- def resolve(self, s): +- """ +- Resolve strings to objects using standard import and attribute +- syntax. +- """ +- name = s.split('.') +- used = name.pop(0) +- try: +- found = self.importer(used) +- for frag in name: +- used += '.' + frag +- try: +- found = getattr(found, frag) +- except AttributeError: +- self.importer(used) +- found = getattr(found, frag) +- return found +- except ImportError: +- e, tb = sys.exc_info()[1:] +- v = ValueError('Cannot resolve %r: %s' % (s, e)) +- v.__cause__, v.__traceback__ = e, tb +- raise v +- +- def ext_convert(self, value): +- """Default converter for the ext:// protocol.""" +- return self.resolve(value) +- +- def cfg_convert(self, value): +- """Default converter for the cfg:// protocol.""" +- rest = value +- m = self.WORD_PATTERN.match(rest) +- if m is None: +- raise ValueError("Unable to convert %r" % value) +- else: +- rest = rest[m.end():] +- d = self.config[m.groups()[0]] +- #print d, rest +- while rest: +- m = self.DOT_PATTERN.match(rest) +- if m: +- d = d[m.groups()[0]] +- else: +- m = self.INDEX_PATTERN.match(rest) +- if m: +- idx = m.groups()[0] +- if not self.DIGIT_PATTERN.match(idx): +- d = d[idx] +- else: +- try: +- n = int(idx) # try as number first (most likely) +- d = d[n] +- except TypeError: +- d = d[idx] +- if m: +- rest = rest[m.end():] +- else: +- raise ValueError('Unable to convert ' +- '%r at %r' % (value, rest)) +- #rest should be empty +- return d +- +- def convert(self, value): +- """ +- Convert values to an appropriate type. dicts, lists and tuples are +- replaced by their converting alternatives. Strings are checked to +- see if they have a conversion format and are converted if they do. +- """ +- if not isinstance(value, ConvertingDict) and isinstance(value, dict): +- value = ConvertingDict(value) +- value.configurator = self +- elif not isinstance(value, ConvertingList) and isinstance(value, list): +- value = ConvertingList(value) +- value.configurator = self +- elif not isinstance(value, ConvertingTuple) and\ +- isinstance(value, tuple): +- value = ConvertingTuple(value) +- value.configurator = self +- elif isinstance(value, string_types): +- m = self.CONVERT_PATTERN.match(value) +- if m: +- d = m.groupdict() +- prefix = d['prefix'] +- converter = self.value_converters.get(prefix, None) +- if converter: +- suffix = d['suffix'] +- converter = getattr(self, converter) +- value = converter(suffix) +- return value +- +- def configure_custom(self, config): +- """Configure an object with a user-supplied factory.""" +- c = config.pop('()') +- if not callable(c): +- c = self.resolve(c) +- props = config.pop('.', None) +- # Check for valid identifiers +- kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) +- result = c(**kwargs) +- if props: +- for name, value in props.items(): +- setattr(result, name, value) +- return result +- +- def as_tuple(self, value): +- """Utility function which converts lists to tuples.""" +- if isinstance(value, list): +- value = tuple(value) +- return value +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/database.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/database.py +deleted file mode 100644 +index c314426..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/database.py ++++ /dev/null +@@ -1,1312 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2012-2016 The Python Software Foundation. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-"""PEP 376 implementation.""" +- +-from __future__ import unicode_literals +- +-import base64 +-import codecs +-import contextlib +-import hashlib +-import logging +-import os +-import posixpath +-import sys +-import zipimport +- +-from . import DistlibException, resources +-from .compat import StringIO +-from .version import get_scheme, UnsupportedVersionError +-from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +-from .util import (parse_requirement, cached_property, parse_name_and_version, +- read_exports, write_exports, CSVReader, CSVWriter) +- +- +-__all__ = ['Distribution', 'BaseInstalledDistribution', +- 'InstalledDistribution', 'EggInfoDistribution', +- 'DistributionPath'] +- +- +-logger = logging.getLogger(__name__) +- +-EXPORTS_FILENAME = 'pydist-exports.json' +-COMMANDS_FILENAME = 'pydist-commands.json' +- +-DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', +- 'RESOURCES', EXPORTS_FILENAME, 'SHARED') +- +-DISTINFO_EXT = '.dist-info' +- +- +-class _Cache(object): +- """ +- A simple cache mapping names and .dist-info paths to distributions +- """ +- def __init__(self): +- """ +- Initialise an instance. There is normally one for each DistributionPath. +- """ +- self.name = {} +- self.path = {} +- self.generated = False +- +- def clear(self): +- """ +- Clear the cache, setting it to its initial state. +- """ +- self.name.clear() +- self.path.clear() +- self.generated = False +- +- def add(self, dist): +- """ +- Add a distribution to the cache. +- :param dist: The distribution to add. +- """ +- if dist.path not in self.path: +- self.path[dist.path] = dist +- self.name.setdefault(dist.key, []).append(dist) +- +- +-class DistributionPath(object): +- """ +- Represents a set of distributions installed on a path (typically sys.path). +- """ +- def __init__(self, path=None, include_egg=False): +- """ +- Create an instance from a path, optionally including legacy (distutils/ +- setuptools/distribute) distributions. +- :param path: The path to use, as a list of directories. If not specified, +- sys.path is used. +- :param include_egg: If True, this instance will look for and return legacy +- distributions as well as those based on PEP 376. +- """ +- if path is None: +- path = sys.path +- self.path = path +- self._include_dist = True +- self._include_egg = include_egg +- +- self._cache = _Cache() +- self._cache_egg = _Cache() +- self._cache_enabled = True +- self._scheme = get_scheme('default') +- +- def _get_cache_enabled(self): +- return self._cache_enabled +- +- def _set_cache_enabled(self, value): +- self._cache_enabled = value +- +- cache_enabled = property(_get_cache_enabled, _set_cache_enabled) +- +- def clear_cache(self): +- """ +- Clears the internal cache. +- """ +- self._cache.clear() +- self._cache_egg.clear() +- +- +- def _yield_distributions(self): +- """ +- Yield .dist-info and/or .egg(-info) distributions. +- """ +- # We need to check if we've seen some resources already, because on +- # some Linux systems (e.g. some Debian/Ubuntu variants) there are +- # symlinks which alias other files in the environment. +- seen = set() +- for path in self.path: +- finder = resources.finder_for_path(path) +- if finder is None: +- continue +- r = finder.find('') +- if not r or not r.is_container: +- continue +- rset = sorted(r.resources) +- for entry in rset: +- r = finder.find(entry) +- if not r or r.path in seen: +- continue +- if self._include_dist and entry.endswith(DISTINFO_EXT): +- possible_filenames = [METADATA_FILENAME, WHEEL_METADATA_FILENAME] +- for metadata_filename in possible_filenames: +- metadata_path = posixpath.join(entry, metadata_filename) +- pydist = finder.find(metadata_path) +- if pydist: +- break +- else: +- continue +- +- with contextlib.closing(pydist.as_stream()) as stream: +- metadata = Metadata(fileobj=stream, scheme='legacy') +- logger.debug('Found %s', r.path) +- seen.add(r.path) +- yield new_dist_class(r.path, metadata=metadata, +- env=self) +- elif self._include_egg and entry.endswith(('.egg-info', +- '.egg')): +- logger.debug('Found %s', r.path) +- seen.add(r.path) +- yield old_dist_class(r.path, self) +- +- def _generate_cache(self): +- """ +- Scan the path for distributions and populate the cache with +- those that are found. +- """ +- gen_dist = not self._cache.generated +- gen_egg = self._include_egg and not self._cache_egg.generated +- if gen_dist or gen_egg: +- for dist in self._yield_distributions(): +- if isinstance(dist, InstalledDistribution): +- self._cache.add(dist) +- else: +- self._cache_egg.add(dist) +- +- if gen_dist: +- self._cache.generated = True +- if gen_egg: +- self._cache_egg.generated = True +- +- @classmethod +- def distinfo_dirname(cls, name, version): +- """ +- The *name* and *version* parameters are converted into their +- filename-escaped form, i.e. any ``'-'`` characters are replaced +- with ``'_'`` other than the one in ``'dist-info'`` and the one +- separating the name from the version number. +- +- :parameter name: is converted to a standard distribution name by replacing +- any runs of non- alphanumeric characters with a single +- ``'-'``. +- :type name: string +- :parameter version: is converted to a standard version string. Spaces +- become dots, and all other non-alphanumeric characters +- (except dots) become dashes, with runs of multiple +- dashes condensed to a single dash. +- :type version: string +- :returns: directory name +- :rtype: string""" +- name = name.replace('-', '_') +- return '-'.join([name, version]) + DISTINFO_EXT +- +- def get_distributions(self): +- """ +- Provides an iterator that looks for distributions and returns +- :class:`InstalledDistribution` or +- :class:`EggInfoDistribution` instances for each one of them. +- +- :rtype: iterator of :class:`InstalledDistribution` and +- :class:`EggInfoDistribution` instances +- """ +- if not self._cache_enabled: +- for dist in self._yield_distributions(): +- yield dist +- else: +- self._generate_cache() +- +- for dist in self._cache.path.values(): +- yield dist +- +- if self._include_egg: +- for dist in self._cache_egg.path.values(): +- yield dist +- +- def get_distribution(self, name): +- """ +- Looks for a named distribution on the path. +- +- This function only returns the first result found, as no more than one +- value is expected. If nothing is found, ``None`` is returned. +- +- :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` +- or ``None`` +- """ +- result = None +- name = name.lower() +- if not self._cache_enabled: +- for dist in self._yield_distributions(): +- if dist.key == name: +- result = dist +- break +- else: +- self._generate_cache() +- +- if name in self._cache.name: +- result = self._cache.name[name][0] +- elif self._include_egg and name in self._cache_egg.name: +- result = self._cache_egg.name[name][0] +- return result +- +- def provides_distribution(self, name, version=None): +- """ +- Iterates over all distributions to find which distributions provide *name*. +- If a *version* is provided, it will be used to filter the results. +- +- This function only returns the first result found, since no more than +- one values are expected. If the directory is not found, returns ``None``. +- +- :parameter version: a version specifier that indicates the version +- required, conforming to the format in ``PEP-345`` +- +- :type name: string +- :type version: string +- """ +- matcher = None +- if not version is None: +- try: +- matcher = self._scheme.matcher('%s (%s)' % (name, version)) +- except ValueError: +- raise DistlibException('invalid name or version: %r, %r' % +- (name, version)) +- +- for dist in self.get_distributions(): +- provided = dist.provides +- +- for p in provided: +- p_name, p_ver = parse_name_and_version(p) +- if matcher is None: +- if p_name == name: +- yield dist +- break +- else: +- if p_name == name and matcher.match(p_ver): +- yield dist +- break +- +- def get_file_path(self, name, relative_path): +- """ +- Return the path to a resource file. +- """ +- dist = self.get_distribution(name) +- if dist is None: +- raise LookupError('no distribution named %r found' % name) +- return dist.get_resource_path(relative_path) +- +- def get_exported_entries(self, category, name=None): +- """ +- Return all of the exported entries in a particular category. +- +- :param category: The category to search for entries. +- :param name: If specified, only entries with that name are returned. +- """ +- for dist in self.get_distributions(): +- r = dist.exports +- if category in r: +- d = r[category] +- if name is not None: +- if name in d: +- yield d[name] +- else: +- for v in d.values(): +- yield v +- +- +-class Distribution(object): +- """ +- A base class for distributions, whether installed or from indexes. +- Either way, it must have some metadata, so that's all that's needed +- for construction. +- """ +- +- build_time_dependency = False +- """ +- Set to True if it's known to be only a build-time dependency (i.e. +- not needed after installation). +- """ +- +- requested = False +- """A boolean that indicates whether the ``REQUESTED`` metadata file is +- present (in other words, whether the package was installed by user +- request or it was installed as a dependency).""" +- +- def __init__(self, metadata): +- """ +- Initialise an instance. +- :param metadata: The instance of :class:`Metadata` describing this +- distribution. +- """ +- self.metadata = metadata +- self.name = metadata.name +- self.key = self.name.lower() # for case-insensitive comparisons +- self.version = metadata.version +- self.locator = None +- self.digest = None +- self.extras = None # additional features requested +- self.context = None # environment marker overrides +- self.download_urls = set() +- self.digests = {} +- +- @property +- def source_url(self): +- """ +- The source archive download URL for this distribution. +- """ +- return self.metadata.source_url +- +- download_url = source_url # Backward compatibility +- +- @property +- def name_and_version(self): +- """ +- A utility property which displays the name and version in parentheses. +- """ +- return '%s (%s)' % (self.name, self.version) +- +- @property +- def provides(self): +- """ +- A set of distribution names and versions provided by this distribution. +- :return: A set of "name (version)" strings. +- """ +- plist = self.metadata.provides +- s = '%s (%s)' % (self.name, self.version) +- if s not in plist: +- plist.append(s) +- return plist +- +- def _get_requirements(self, req_attr): +- md = self.metadata +- logger.debug('Getting requirements from metadata %r', md.todict()) +- reqts = getattr(md, req_attr) +- return set(md.get_requirements(reqts, extras=self.extras, +- env=self.context)) +- +- @property +- def run_requires(self): +- return self._get_requirements('run_requires') +- +- @property +- def meta_requires(self): +- return self._get_requirements('meta_requires') +- +- @property +- def build_requires(self): +- return self._get_requirements('build_requires') +- +- @property +- def test_requires(self): +- return self._get_requirements('test_requires') +- +- @property +- def dev_requires(self): +- return self._get_requirements('dev_requires') +- +- def matches_requirement(self, req): +- """ +- Say if this instance matches (fulfills) a requirement. +- :param req: The requirement to match. +- :rtype req: str +- :return: True if it matches, else False. +- """ +- # Requirement may contain extras - parse to lose those +- # from what's passed to the matcher +- r = parse_requirement(req) +- scheme = get_scheme(self.metadata.scheme) +- try: +- matcher = scheme.matcher(r.requirement) +- except UnsupportedVersionError: +- # XXX compat-mode if cannot read the version +- logger.warning('could not read version %r - using name only', +- req) +- name = req.split()[0] +- matcher = scheme.matcher(name) +- +- name = matcher.key # case-insensitive +- +- result = False +- for p in self.provides: +- p_name, p_ver = parse_name_and_version(p) +- if p_name != name: +- continue +- try: +- result = matcher.match(p_ver) +- break +- except UnsupportedVersionError: +- pass +- return result +- +- def __repr__(self): +- """ +- Return a textual representation of this instance, +- """ +- if self.source_url: +- suffix = ' [%s]' % self.source_url +- else: +- suffix = '' +- return '' % (self.name, self.version, suffix) +- +- def __eq__(self, other): +- """ +- See if this distribution is the same as another. +- :param other: The distribution to compare with. To be equal to one +- another. distributions must have the same type, name, +- version and source_url. +- :return: True if it is the same, else False. +- """ +- if type(other) is not type(self): +- result = False +- else: +- result = (self.name == other.name and +- self.version == other.version and +- self.source_url == other.source_url) +- return result +- +- def __hash__(self): +- """ +- Compute hash in a way which matches the equality test. +- """ +- return hash(self.name) + hash(self.version) + hash(self.source_url) +- +- +-class BaseInstalledDistribution(Distribution): +- """ +- This is the base class for installed distributions (whether PEP 376 or +- legacy). +- """ +- +- hasher = None +- +- def __init__(self, metadata, path, env=None): +- """ +- Initialise an instance. +- :param metadata: An instance of :class:`Metadata` which describes the +- distribution. This will normally have been initialised +- from a metadata file in the ``path``. +- :param path: The path of the ``.dist-info`` or ``.egg-info`` +- directory for the distribution. +- :param env: This is normally the :class:`DistributionPath` +- instance where this distribution was found. +- """ +- super(BaseInstalledDistribution, self).__init__(metadata) +- self.path = path +- self.dist_path = env +- +- def get_hash(self, data, hasher=None): +- """ +- Get the hash of some data, using a particular hash algorithm, if +- specified. +- +- :param data: The data to be hashed. +- :type data: bytes +- :param hasher: The name of a hash implementation, supported by hashlib, +- or ``None``. Examples of valid values are ``'sha1'``, +- ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and +- ``'sha512'``. If no hasher is specified, the ``hasher`` +- attribute of the :class:`InstalledDistribution` instance +- is used. If the hasher is determined to be ``None``, MD5 +- is used as the hashing algorithm. +- :returns: The hash of the data. If a hasher was explicitly specified, +- the returned hash will be prefixed with the specified hasher +- followed by '='. +- :rtype: str +- """ +- if hasher is None: +- hasher = self.hasher +- if hasher is None: +- hasher = hashlib.md5 +- prefix = '' +- else: +- hasher = getattr(hashlib, hasher) +- prefix = '%s=' % self.hasher +- digest = hasher(data).digest() +- digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') +- return '%s%s' % (prefix, digest) +- +- +-class InstalledDistribution(BaseInstalledDistribution): +- """ +- Created with the *path* of the ``.dist-info`` directory provided to the +- constructor. It reads the metadata contained in ``pydist.json`` when it is +- instantiated., or uses a passed in Metadata instance (useful for when +- dry-run mode is being used). +- """ +- +- hasher = 'sha256' +- +- def __init__(self, path, metadata=None, env=None): +- self.finder = finder = resources.finder_for_path(path) +- if finder is None: +- import pdb; pdb.set_trace () +- if env and env._cache_enabled and path in env._cache.path: +- metadata = env._cache.path[path].metadata +- elif metadata is None: +- r = finder.find(METADATA_FILENAME) +- # Temporary - for Wheel 0.23 support +- if r is None: +- r = finder.find(WHEEL_METADATA_FILENAME) +- # Temporary - for legacy support +- if r is None: +- r = finder.find('METADATA') +- if r is None: +- raise ValueError('no %s found in %s' % (METADATA_FILENAME, +- path)) +- with contextlib.closing(r.as_stream()) as stream: +- metadata = Metadata(fileobj=stream, scheme='legacy') +- +- super(InstalledDistribution, self).__init__(metadata, path, env) +- +- if env and env._cache_enabled: +- env._cache.add(self) +- +- try: +- r = finder.find('REQUESTED') +- except AttributeError: +- import pdb; pdb.set_trace () +- self.requested = r is not None +- +- def __repr__(self): +- return '' % ( +- self.name, self.version, self.path) +- +- def __str__(self): +- return "%s %s" % (self.name, self.version) +- +- def _get_records(self): +- """ +- Get the list of installed files for the distribution +- :return: A list of tuples of path, hash and size. Note that hash and +- size might be ``None`` for some entries. The path is exactly +- as stored in the file (which is as in PEP 376). +- """ +- results = [] +- r = self.get_distinfo_resource('RECORD') +- with contextlib.closing(r.as_stream()) as stream: +- with CSVReader(stream=stream) as record_reader: +- # Base location is parent dir of .dist-info dir +- #base_location = os.path.dirname(self.path) +- #base_location = os.path.abspath(base_location) +- for row in record_reader: +- missing = [None for i in range(len(row), 3)] +- path, checksum, size = row + missing +- #if not os.path.isabs(path): +- # path = path.replace('/', os.sep) +- # path = os.path.join(base_location, path) +- results.append((path, checksum, size)) +- return results +- +- @cached_property +- def exports(self): +- """ +- Return the information exported by this distribution. +- :return: A dictionary of exports, mapping an export category to a dict +- of :class:`ExportEntry` instances describing the individual +- export entries, and keyed by name. +- """ +- result = {} +- r = self.get_distinfo_resource(EXPORTS_FILENAME) +- if r: +- result = self.read_exports() +- return result +- +- def read_exports(self): +- """ +- Read exports data from a file in .ini format. +- +- :return: A dictionary of exports, mapping an export category to a list +- of :class:`ExportEntry` instances describing the individual +- export entries. +- """ +- result = {} +- r = self.get_distinfo_resource(EXPORTS_FILENAME) +- if r: +- with contextlib.closing(r.as_stream()) as stream: +- result = read_exports(stream) +- return result +- +- def write_exports(self, exports): +- """ +- Write a dictionary of exports to a file in .ini format. +- :param exports: A dictionary of exports, mapping an export category to +- a list of :class:`ExportEntry` instances describing the +- individual export entries. +- """ +- rf = self.get_distinfo_file(EXPORTS_FILENAME) +- with open(rf, 'w') as f: +- write_exports(exports, f) +- +- def get_resource_path(self, relative_path): +- """ +- NOTE: This API may change in the future. +- +- Return the absolute path to a resource file with the given relative +- path. +- +- :param relative_path: The path, relative to .dist-info, of the resource +- of interest. +- :return: The absolute path where the resource is to be found. +- """ +- r = self.get_distinfo_resource('RESOURCES') +- with contextlib.closing(r.as_stream()) as stream: +- with CSVReader(stream=stream) as resources_reader: +- for relative, destination in resources_reader: +- if relative == relative_path: +- return destination +- raise KeyError('no resource file with relative path %r ' +- 'is installed' % relative_path) +- +- def list_installed_files(self): +- """ +- Iterates over the ``RECORD`` entries and returns a tuple +- ``(path, hash, size)`` for each line. +- +- :returns: iterator of (path, hash, size) +- """ +- for result in self._get_records(): +- yield result +- +- def write_installed_files(self, paths, prefix, dry_run=False): +- """ +- Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any +- existing ``RECORD`` file is silently overwritten. +- +- prefix is used to determine when to write absolute paths. +- """ +- prefix = os.path.join(prefix, '') +- base = os.path.dirname(self.path) +- base_under_prefix = base.startswith(prefix) +- base = os.path.join(base, '') +- record_path = self.get_distinfo_file('RECORD') +- logger.info('creating %s', record_path) +- if dry_run: +- return None +- with CSVWriter(record_path) as writer: +- for path in paths: +- if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): +- # do not put size and hash, as in PEP-376 +- hash_value = size = '' +- else: +- size = '%d' % os.path.getsize(path) +- with open(path, 'rb') as fp: +- hash_value = self.get_hash(fp.read()) +- if path.startswith(base) or (base_under_prefix and +- path.startswith(prefix)): +- path = os.path.relpath(path, base) +- writer.writerow((path, hash_value, size)) +- +- # add the RECORD file itself +- if record_path.startswith(base): +- record_path = os.path.relpath(record_path, base) +- writer.writerow((record_path, '', '')) +- return record_path +- +- def check_installed_files(self): +- """ +- Checks that the hashes and sizes of the files in ``RECORD`` are +- matched by the files themselves. Returns a (possibly empty) list of +- mismatches. Each entry in the mismatch list will be a tuple consisting +- of the path, 'exists', 'size' or 'hash' according to what didn't match +- (existence is checked first, then size, then hash), the expected +- value and the actual value. +- """ +- mismatches = [] +- base = os.path.dirname(self.path) +- record_path = self.get_distinfo_file('RECORD') +- for path, hash_value, size in self.list_installed_files(): +- if not os.path.isabs(path): +- path = os.path.join(base, path) +- if path == record_path: +- continue +- if not os.path.exists(path): +- mismatches.append((path, 'exists', True, False)) +- elif os.path.isfile(path): +- actual_size = str(os.path.getsize(path)) +- if size and actual_size != size: +- mismatches.append((path, 'size', size, actual_size)) +- elif hash_value: +- if '=' in hash_value: +- hasher = hash_value.split('=', 1)[0] +- else: +- hasher = None +- +- with open(path, 'rb') as f: +- actual_hash = self.get_hash(f.read(), hasher) +- if actual_hash != hash_value: +- mismatches.append((path, 'hash', hash_value, actual_hash)) +- return mismatches +- +- @cached_property +- def shared_locations(self): +- """ +- A dictionary of shared locations whose keys are in the set 'prefix', +- 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. +- The corresponding value is the absolute path of that category for +- this distribution, and takes into account any paths selected by the +- user at installation time (e.g. via command-line arguments). In the +- case of the 'namespace' key, this would be a list of absolute paths +- for the roots of namespace packages in this distribution. +- +- The first time this property is accessed, the relevant information is +- read from the SHARED file in the .dist-info directory. +- """ +- result = {} +- shared_path = os.path.join(self.path, 'SHARED') +- if os.path.isfile(shared_path): +- with codecs.open(shared_path, 'r', encoding='utf-8') as f: +- lines = f.read().splitlines() +- for line in lines: +- key, value = line.split('=', 1) +- if key == 'namespace': +- result.setdefault(key, []).append(value) +- else: +- result[key] = value +- return result +- +- def write_shared_locations(self, paths, dry_run=False): +- """ +- Write shared location information to the SHARED file in .dist-info. +- :param paths: A dictionary as described in the documentation for +- :meth:`shared_locations`. +- :param dry_run: If True, the action is logged but no file is actually +- written. +- :return: The path of the file written to. +- """ +- shared_path = os.path.join(self.path, 'SHARED') +- logger.info('creating %s', shared_path) +- if dry_run: +- return None +- lines = [] +- for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): +- path = paths[key] +- if os.path.isdir(paths[key]): +- lines.append('%s=%s' % (key, path)) +- for ns in paths.get('namespace', ()): +- lines.append('namespace=%s' % ns) +- +- with codecs.open(shared_path, 'w', encoding='utf-8') as f: +- f.write('\n'.join(lines)) +- return shared_path +- +- def get_distinfo_resource(self, path): +- if path not in DIST_FILES: +- raise DistlibException('invalid path for a dist-info file: ' +- '%r at %r' % (path, self.path)) +- finder = resources.finder_for_path(self.path) +- if finder is None: +- raise DistlibException('Unable to get a finder for %s' % self.path) +- return finder.find(path) +- +- def get_distinfo_file(self, path): +- """ +- Returns a path located under the ``.dist-info`` directory. Returns a +- string representing the path. +- +- :parameter path: a ``'/'``-separated path relative to the +- ``.dist-info`` directory or an absolute path; +- If *path* is an absolute path and doesn't start +- with the ``.dist-info`` directory path, +- a :class:`DistlibException` is raised +- :type path: str +- :rtype: str +- """ +- # Check if it is an absolute path # XXX use relpath, add tests +- if path.find(os.sep) >= 0: +- # it's an absolute path? +- distinfo_dirname, path = path.split(os.sep)[-2:] +- if distinfo_dirname != self.path.split(os.sep)[-1]: +- raise DistlibException( +- 'dist-info file %r does not belong to the %r %s ' +- 'distribution' % (path, self.name, self.version)) +- +- # The file must be relative +- if path not in DIST_FILES: +- raise DistlibException('invalid path for a dist-info file: ' +- '%r at %r' % (path, self.path)) +- +- return os.path.join(self.path, path) +- +- def list_distinfo_files(self): +- """ +- Iterates over the ``RECORD`` entries and returns paths for each line if +- the path is pointing to a file located in the ``.dist-info`` directory +- or one of its subdirectories. +- +- :returns: iterator of paths +- """ +- base = os.path.dirname(self.path) +- for path, checksum, size in self._get_records(): +- # XXX add separator or use real relpath algo +- if not os.path.isabs(path): +- path = os.path.join(base, path) +- if path.startswith(self.path): +- yield path +- +- def __eq__(self, other): +- return (isinstance(other, InstalledDistribution) and +- self.path == other.path) +- +- # See http://docs.python.org/reference/datamodel#object.__hash__ +- __hash__ = object.__hash__ +- +- +-class EggInfoDistribution(BaseInstalledDistribution): +- """Created with the *path* of the ``.egg-info`` directory or file provided +- to the constructor. It reads the metadata contained in the file itself, or +- if the given path happens to be a directory, the metadata is read from the +- file ``PKG-INFO`` under that directory.""" +- +- requested = True # as we have no way of knowing, assume it was +- shared_locations = {} +- +- def __init__(self, path, env=None): +- def set_name_and_version(s, n, v): +- s.name = n +- s.key = n.lower() # for case-insensitive comparisons +- s.version = v +- +- self.path = path +- self.dist_path = env +- if env and env._cache_enabled and path in env._cache_egg.path: +- metadata = env._cache_egg.path[path].metadata +- set_name_and_version(self, metadata.name, metadata.version) +- else: +- metadata = self._get_metadata(path) +- +- # Need to be set before caching +- set_name_and_version(self, metadata.name, metadata.version) +- +- if env and env._cache_enabled: +- env._cache_egg.add(self) +- super(EggInfoDistribution, self).__init__(metadata, path, env) +- +- def _get_metadata(self, path): +- requires = None +- +- def parse_requires_data(data): +- """Create a list of dependencies from a requires.txt file. +- +- *data*: the contents of a setuptools-produced requires.txt file. +- """ +- reqs = [] +- lines = data.splitlines() +- for line in lines: +- line = line.strip() +- if line.startswith('['): +- logger.warning('Unexpected line: quitting requirement scan: %r', +- line) +- break +- r = parse_requirement(line) +- if not r: +- logger.warning('Not recognised as a requirement: %r', line) +- continue +- if r.extras: +- logger.warning('extra requirements in requires.txt are ' +- 'not supported') +- if not r.constraints: +- reqs.append(r.name) +- else: +- cons = ', '.join('%s%s' % c for c in r.constraints) +- reqs.append('%s (%s)' % (r.name, cons)) +- return reqs +- +- def parse_requires_path(req_path): +- """Create a list of dependencies from a requires.txt file. +- +- *req_path*: the path to a setuptools-produced requires.txt file. +- """ +- +- reqs = [] +- try: +- with codecs.open(req_path, 'r', 'utf-8') as fp: +- reqs = parse_requires_data(fp.read()) +- except IOError: +- pass +- return reqs +- +- if path.endswith('.egg'): +- if os.path.isdir(path): +- meta_path = os.path.join(path, 'EGG-INFO', 'PKG-INFO') +- metadata = Metadata(path=meta_path, scheme='legacy') +- req_path = os.path.join(path, 'EGG-INFO', 'requires.txt') +- requires = parse_requires_path(req_path) +- else: +- # FIXME handle the case where zipfile is not available +- zipf = zipimport.zipimporter(path) +- fileobj = StringIO( +- zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) +- metadata = Metadata(fileobj=fileobj, scheme='legacy') +- try: +- data = zipf.get_data('EGG-INFO/requires.txt') +- requires = parse_requires_data(data.decode('utf-8')) +- except IOError: +- requires = None +- elif path.endswith('.egg-info'): +- if os.path.isdir(path): +- req_path = os.path.join(path, 'requires.txt') +- requires = parse_requires_path(req_path) +- path = os.path.join(path, 'PKG-INFO') +- metadata = Metadata(path=path, scheme='legacy') +- else: +- raise DistlibException('path must end with .egg-info or .egg, ' +- 'got %r' % path) +- +- if requires: +- metadata.add_requirements(requires) +- return metadata +- +- def __repr__(self): +- return '' % ( +- self.name, self.version, self.path) +- +- def __str__(self): +- return "%s %s" % (self.name, self.version) +- +- def check_installed_files(self): +- """ +- Checks that the hashes and sizes of the files in ``RECORD`` are +- matched by the files themselves. Returns a (possibly empty) list of +- mismatches. Each entry in the mismatch list will be a tuple consisting +- of the path, 'exists', 'size' or 'hash' according to what didn't match +- (existence is checked first, then size, then hash), the expected +- value and the actual value. +- """ +- mismatches = [] +- record_path = os.path.join(self.path, 'installed-files.txt') +- if os.path.exists(record_path): +- for path, _, _ in self.list_installed_files(): +- if path == record_path: +- continue +- if not os.path.exists(path): +- mismatches.append((path, 'exists', True, False)) +- return mismatches +- +- def list_installed_files(self): +- """ +- Iterates over the ``installed-files.txt`` entries and returns a tuple +- ``(path, hash, size)`` for each line. +- +- :returns: a list of (path, hash, size) +- """ +- +- def _md5(path): +- f = open(path, 'rb') +- try: +- content = f.read() +- finally: +- f.close() +- return hashlib.md5(content).hexdigest() +- +- def _size(path): +- return os.stat(path).st_size +- +- record_path = os.path.join(self.path, 'installed-files.txt') +- result = [] +- if os.path.exists(record_path): +- with codecs.open(record_path, 'r', encoding='utf-8') as f: +- for line in f: +- line = line.strip() +- p = os.path.normpath(os.path.join(self.path, line)) +- # "./" is present as a marker between installed files +- # and installation metadata files +- if not os.path.exists(p): +- logger.warning('Non-existent file: %s', p) +- if p.endswith(('.pyc', '.pyo')): +- continue +- #otherwise fall through and fail +- if not os.path.isdir(p): +- result.append((p, _md5(p), _size(p))) +- result.append((record_path, None, None)) +- return result +- +- def list_distinfo_files(self, absolute=False): +- """ +- Iterates over the ``installed-files.txt`` entries and returns paths for +- each line if the path is pointing to a file located in the +- ``.egg-info`` directory or one of its subdirectories. +- +- :parameter absolute: If *absolute* is ``True``, each returned path is +- transformed into a local absolute path. Otherwise the +- raw value from ``installed-files.txt`` is returned. +- :type absolute: boolean +- :returns: iterator of paths +- """ +- record_path = os.path.join(self.path, 'installed-files.txt') +- skip = True +- with codecs.open(record_path, 'r', encoding='utf-8') as f: +- for line in f: +- line = line.strip() +- if line == './': +- skip = False +- continue +- if not skip: +- p = os.path.normpath(os.path.join(self.path, line)) +- if p.startswith(self.path): +- if absolute: +- yield p +- else: +- yield line +- +- def __eq__(self, other): +- return (isinstance(other, EggInfoDistribution) and +- self.path == other.path) +- +- # See http://docs.python.org/reference/datamodel#object.__hash__ +- __hash__ = object.__hash__ +- +-new_dist_class = InstalledDistribution +-old_dist_class = EggInfoDistribution +- +- +-class DependencyGraph(object): +- """ +- Represents a dependency graph between distributions. +- +- The dependency relationships are stored in an ``adjacency_list`` that maps +- distributions to a list of ``(other, label)`` tuples where ``other`` +- is a distribution and the edge is labeled with ``label`` (i.e. the version +- specifier, if such was provided). Also, for more efficient traversal, for +- every distribution ``x``, a list of predecessors is kept in +- ``reverse_list[x]``. An edge from distribution ``a`` to +- distribution ``b`` means that ``a`` depends on ``b``. If any missing +- dependencies are found, they are stored in ``missing``, which is a +- dictionary that maps distributions to a list of requirements that were not +- provided by any other distributions. +- """ +- +- def __init__(self): +- self.adjacency_list = {} +- self.reverse_list = {} +- self.missing = {} +- +- def add_distribution(self, distribution): +- """Add the *distribution* to the graph. +- +- :type distribution: :class:`distutils2.database.InstalledDistribution` +- or :class:`distutils2.database.EggInfoDistribution` +- """ +- self.adjacency_list[distribution] = [] +- self.reverse_list[distribution] = [] +- #self.missing[distribution] = [] +- +- def add_edge(self, x, y, label=None): +- """Add an edge from distribution *x* to distribution *y* with the given +- *label*. +- +- :type x: :class:`distutils2.database.InstalledDistribution` or +- :class:`distutils2.database.EggInfoDistribution` +- :type y: :class:`distutils2.database.InstalledDistribution` or +- :class:`distutils2.database.EggInfoDistribution` +- :type label: ``str`` or ``None`` +- """ +- self.adjacency_list[x].append((y, label)) +- # multiple edges are allowed, so be careful +- if x not in self.reverse_list[y]: +- self.reverse_list[y].append(x) +- +- def add_missing(self, distribution, requirement): +- """ +- Add a missing *requirement* for the given *distribution*. +- +- :type distribution: :class:`distutils2.database.InstalledDistribution` +- or :class:`distutils2.database.EggInfoDistribution` +- :type requirement: ``str`` +- """ +- logger.debug('%s missing %r', distribution, requirement) +- self.missing.setdefault(distribution, []).append(requirement) +- +- def _repr_dist(self, dist): +- return '%s %s' % (dist.name, dist.version) +- +- def repr_node(self, dist, level=1): +- """Prints only a subgraph""" +- output = [self._repr_dist(dist)] +- for other, label in self.adjacency_list[dist]: +- dist = self._repr_dist(other) +- if label is not None: +- dist = '%s [%s]' % (dist, label) +- output.append(' ' * level + str(dist)) +- suboutput = self.repr_node(other, level + 1) +- subs = suboutput.split('\n') +- output.extend(subs[1:]) +- return '\n'.join(output) +- +- def to_dot(self, f, skip_disconnected=True): +- """Writes a DOT output for the graph to the provided file *f*. +- +- If *skip_disconnected* is set to ``True``, then all distributions +- that are not dependent on any other distribution are skipped. +- +- :type f: has to support ``file``-like operations +- :type skip_disconnected: ``bool`` +- """ +- disconnected = [] +- +- f.write("digraph dependencies {\n") +- for dist, adjs in self.adjacency_list.items(): +- if len(adjs) == 0 and not skip_disconnected: +- disconnected.append(dist) +- for other, label in adjs: +- if not label is None: +- f.write('"%s" -> "%s" [label="%s"]\n' % +- (dist.name, other.name, label)) +- else: +- f.write('"%s" -> "%s"\n' % (dist.name, other.name)) +- if not skip_disconnected and len(disconnected) > 0: +- f.write('subgraph disconnected {\n') +- f.write('label = "Disconnected"\n') +- f.write('bgcolor = red\n') +- +- for dist in disconnected: +- f.write('"%s"' % dist.name) +- f.write('\n') +- f.write('}\n') +- f.write('}\n') +- +- def topological_sort(self): +- """ +- Perform a topological sort of the graph. +- :return: A tuple, the first element of which is a topologically sorted +- list of distributions, and the second element of which is a +- list of distributions that cannot be sorted because they have +- circular dependencies and so form a cycle. +- """ +- result = [] +- # Make a shallow copy of the adjacency list +- alist = {} +- for k, v in self.adjacency_list.items(): +- alist[k] = v[:] +- while True: +- # See what we can remove in this run +- to_remove = [] +- for k, v in list(alist.items())[:]: +- if not v: +- to_remove.append(k) +- del alist[k] +- if not to_remove: +- # What's left in alist (if anything) is a cycle. +- break +- # Remove from the adjacency list of others +- for k, v in alist.items(): +- alist[k] = [(d, r) for d, r in v if d not in to_remove] +- logger.debug('Moving to result: %s', +- ['%s (%s)' % (d.name, d.version) for d in to_remove]) +- result.extend(to_remove) +- return result, list(alist.keys()) +- +- def __repr__(self): +- """Representation of the graph""" +- output = [] +- for dist, adjs in self.adjacency_list.items(): +- output.append(self.repr_node(dist)) +- return '\n'.join(output) +- +- +-def make_graph(dists, scheme='default'): +- """Makes a dependency graph from the given distributions. +- +- :parameter dists: a list of distributions +- :type dists: list of :class:`distutils2.database.InstalledDistribution` and +- :class:`distutils2.database.EggInfoDistribution` instances +- :rtype: a :class:`DependencyGraph` instance +- """ +- scheme = get_scheme(scheme) +- graph = DependencyGraph() +- provided = {} # maps names to lists of (version, dist) tuples +- +- # first, build the graph and find out what's provided +- for dist in dists: +- graph.add_distribution(dist) +- +- for p in dist.provides: +- name, version = parse_name_and_version(p) +- logger.debug('Add to provided: %s, %s, %s', name, version, dist) +- provided.setdefault(name, []).append((version, dist)) +- +- # now make the edges +- for dist in dists: +- requires = (dist.run_requires | dist.meta_requires | +- dist.build_requires | dist.dev_requires) +- for req in requires: +- try: +- matcher = scheme.matcher(req) +- except UnsupportedVersionError: +- # XXX compat-mode if cannot read the version +- logger.warning('could not read version %r - using name only', +- req) +- name = req.split()[0] +- matcher = scheme.matcher(name) +- +- name = matcher.key # case-insensitive +- +- matched = False +- if name in provided: +- for version, provider in provided[name]: +- try: +- match = matcher.match(version) +- except UnsupportedVersionError: +- match = False +- +- if match: +- graph.add_edge(dist, provider, req) +- matched = True +- break +- if not matched: +- graph.add_missing(dist, req) +- return graph +- +- +-def get_dependent_dists(dists, dist): +- """Recursively generate a list of distributions from *dists* that are +- dependent on *dist*. +- +- :param dists: a list of distributions +- :param dist: a distribution, member of *dists* for which we are interested +- """ +- if dist not in dists: +- raise DistlibException('given distribution %r is not a member ' +- 'of the list' % dist.name) +- graph = make_graph(dists) +- +- dep = [dist] # dependent distributions +- todo = graph.reverse_list[dist] # list of nodes we should inspect +- +- while todo: +- d = todo.pop() +- dep.append(d) +- for succ in graph.reverse_list[d]: +- if succ not in dep: +- todo.append(succ) +- +- dep.pop(0) # remove dist from dep, was there to prevent infinite loops +- return dep +- +- +-def get_required_dists(dists, dist): +- """Recursively generate a list of distributions from *dists* that are +- required by *dist*. +- +- :param dists: a list of distributions +- :param dist: a distribution, member of *dists* for which we are interested +- """ +- if dist not in dists: +- raise DistlibException('given distribution %r is not a member ' +- 'of the list' % dist.name) +- graph = make_graph(dists) +- +- req = [] # required distributions +- todo = graph.adjacency_list[dist] # list of nodes we should inspect +- +- while todo: +- d = todo.pop()[0] +- req.append(d) +- for pred in graph.adjacency_list[d]: +- if pred not in req: +- todo.append(pred) +- +- return req +- +- +-def make_dist(name, version, **kwargs): +- """ +- A convenience method for making a dist given just a name and version. +- """ +- summary = kwargs.pop('summary', 'Placeholder for summary') +- md = Metadata(**kwargs) +- md.name = name +- md.version = version +- md.summary = summary or 'Placeholder for summary' +- return Distribution(md) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/index.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/index.py +deleted file mode 100644 +index 6803dd2..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/index.py ++++ /dev/null +@@ -1,515 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2013 Vinay Sajip. +-# Licensed to the Python Software Foundation under a contributor agreement. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-import hashlib +-import logging +-import os +-import shutil +-import subprocess +-import tempfile +-try: +- from threading import Thread +-except ImportError: +- from dummy_threading import Thread +- +-from . import DistlibException +-from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, +- urlparse, build_opener, string_types) +-from .util import cached_property, zip_dir, ServerProxy +- +-logger = logging.getLogger(__name__) +- +-DEFAULT_INDEX = 'https://pypi.python.org/pypi' +-DEFAULT_REALM = 'pypi' +- +-class PackageIndex(object): +- """ +- This class represents a package index compatible with PyPI, the Python +- Package Index. +- """ +- +- boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' +- +- def __init__(self, url=None): +- """ +- Initialise an instance. +- +- :param url: The URL of the index. If not specified, the URL for PyPI is +- used. +- """ +- self.url = url or DEFAULT_INDEX +- self.read_configuration() +- scheme, netloc, path, params, query, frag = urlparse(self.url) +- if params or query or frag or scheme not in ('http', 'https'): +- raise DistlibException('invalid repository: %s' % self.url) +- self.password_handler = None +- self.ssl_verifier = None +- self.gpg = None +- self.gpg_home = None +- self.rpc_proxy = None +- with open(os.devnull, 'w') as sink: +- # Use gpg by default rather than gpg2, as gpg2 insists on +- # prompting for passwords +- for s in ('gpg', 'gpg2'): +- try: +- rc = subprocess.check_call([s, '--version'], stdout=sink, +- stderr=sink) +- if rc == 0: +- self.gpg = s +- break +- except OSError: +- pass +- +- def _get_pypirc_command(self): +- """ +- Get the distutils command for interacting with PyPI configurations. +- :return: the command. +- """ +- from distutils.core import Distribution +- from distutils.config import PyPIRCCommand +- d = Distribution() +- return PyPIRCCommand(d) +- +- def read_configuration(self): +- """ +- Read the PyPI access configuration as supported by distutils, getting +- PyPI to do the actual work. This populates ``username``, ``password``, +- ``realm`` and ``url`` attributes from the configuration. +- """ +- # get distutils to do the work +- c = self._get_pypirc_command() +- c.repository = self.url +- cfg = c._read_pypirc() +- self.username = cfg.get('username') +- self.password = cfg.get('password') +- self.realm = cfg.get('realm', 'pypi') +- self.url = cfg.get('repository', self.url) +- +- def save_configuration(self): +- """ +- Save the PyPI access configuration. You must have set ``username`` and +- ``password`` attributes before calling this method. +- +- Again, distutils is used to do the actual work. +- """ +- self.check_credentials() +- # get distutils to do the work +- c = self._get_pypirc_command() +- c._store_pypirc(self.username, self.password) +- +- def check_credentials(self): +- """ +- Check that ``username`` and ``password`` have been set, and raise an +- exception if not. +- """ +- if self.username is None or self.password is None: +- raise DistlibException('username and password must be set') +- pm = HTTPPasswordMgr() +- _, netloc, _, _, _, _ = urlparse(self.url) +- pm.add_password(self.realm, netloc, self.username, self.password) +- self.password_handler = HTTPBasicAuthHandler(pm) +- +- def register(self, metadata): +- """ +- Register a distribution on PyPI, using the provided metadata. +- +- :param metadata: A :class:`Metadata` instance defining at least a name +- and version number for the distribution to be +- registered. +- :return: The HTTP response received from PyPI upon submission of the +- request. +- """ +- self.check_credentials() +- metadata.validate() +- d = metadata.todict() +- d[':action'] = 'verify' +- request = self.encode_request(d.items(), []) +- response = self.send_request(request) +- d[':action'] = 'submit' +- request = self.encode_request(d.items(), []) +- return self.send_request(request) +- +- def _reader(self, name, stream, outbuf): +- """ +- Thread runner for reading lines of from a subprocess into a buffer. +- +- :param name: The logical name of the stream (used for logging only). +- :param stream: The stream to read from. This will typically a pipe +- connected to the output stream of a subprocess. +- :param outbuf: The list to append the read lines to. +- """ +- while True: +- s = stream.readline() +- if not s: +- break +- s = s.decode('utf-8').rstrip() +- outbuf.append(s) +- logger.debug('%s: %s' % (name, s)) +- stream.close() +- +- def get_sign_command(self, filename, signer, sign_password, +- keystore=None): +- """ +- Return a suitable command for signing a file. +- +- :param filename: The pathname to the file to be signed. +- :param signer: The identifier of the signer of the file. +- :param sign_password: The passphrase for the signer's +- private key used for signing. +- :param keystore: The path to a directory which contains the keys +- used in verification. If not specified, the +- instance's ``gpg_home`` attribute is used instead. +- :return: The signing command as a list suitable to be +- passed to :class:`subprocess.Popen`. +- """ +- cmd = [self.gpg, '--status-fd', '2', '--no-tty'] +- if keystore is None: +- keystore = self.gpg_home +- if keystore: +- cmd.extend(['--homedir', keystore]) +- if sign_password is not None: +- cmd.extend(['--batch', '--passphrase-fd', '0']) +- td = tempfile.mkdtemp() +- sf = os.path.join(td, os.path.basename(filename) + '.asc') +- cmd.extend(['--detach-sign', '--armor', '--local-user', +- signer, '--output', sf, filename]) +- logger.debug('invoking: %s', ' '.join(cmd)) +- return cmd, sf +- +- def run_command(self, cmd, input_data=None): +- """ +- Run a command in a child process , passing it any input data specified. +- +- :param cmd: The command to run. +- :param input_data: If specified, this must be a byte string containing +- data to be sent to the child process. +- :return: A tuple consisting of the subprocess' exit code, a list of +- lines read from the subprocess' ``stdout``, and a list of +- lines read from the subprocess' ``stderr``. +- """ +- kwargs = { +- 'stdout': subprocess.PIPE, +- 'stderr': subprocess.PIPE, +- } +- if input_data is not None: +- kwargs['stdin'] = subprocess.PIPE +- stdout = [] +- stderr = [] +- p = subprocess.Popen(cmd, **kwargs) +- # We don't use communicate() here because we may need to +- # get clever with interacting with the command +- t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) +- t1.start() +- t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) +- t2.start() +- if input_data is not None: +- p.stdin.write(input_data) +- p.stdin.close() +- +- p.wait() +- t1.join() +- t2.join() +- return p.returncode, stdout, stderr +- +- def sign_file(self, filename, signer, sign_password, keystore=None): +- """ +- Sign a file. +- +- :param filename: The pathname to the file to be signed. +- :param signer: The identifier of the signer of the file. +- :param sign_password: The passphrase for the signer's +- private key used for signing. +- :param keystore: The path to a directory which contains the keys +- used in signing. If not specified, the instance's +- ``gpg_home`` attribute is used instead. +- :return: The absolute pathname of the file where the signature is +- stored. +- """ +- cmd, sig_file = self.get_sign_command(filename, signer, sign_password, +- keystore) +- rc, stdout, stderr = self.run_command(cmd, +- sign_password.encode('utf-8')) +- if rc != 0: +- raise DistlibException('sign command failed with error ' +- 'code %s' % rc) +- return sig_file +- +- def upload_file(self, metadata, filename, signer=None, sign_password=None, +- filetype='sdist', pyversion='source', keystore=None): +- """ +- Upload a release file to the index. +- +- :param metadata: A :class:`Metadata` instance defining at least a name +- and version number for the file to be uploaded. +- :param filename: The pathname of the file to be uploaded. +- :param signer: The identifier of the signer of the file. +- :param sign_password: The passphrase for the signer's +- private key used for signing. +- :param filetype: The type of the file being uploaded. This is the +- distutils command which produced that file, e.g. +- ``sdist`` or ``bdist_wheel``. +- :param pyversion: The version of Python which the release relates +- to. For code compatible with any Python, this would +- be ``source``, otherwise it would be e.g. ``3.2``. +- :param keystore: The path to a directory which contains the keys +- used in signing. If not specified, the instance's +- ``gpg_home`` attribute is used instead. +- :return: The HTTP response received from PyPI upon submission of the +- request. +- """ +- self.check_credentials() +- if not os.path.exists(filename): +- raise DistlibException('not found: %s' % filename) +- metadata.validate() +- d = metadata.todict() +- sig_file = None +- if signer: +- if not self.gpg: +- logger.warning('no signing program available - not signed') +- else: +- sig_file = self.sign_file(filename, signer, sign_password, +- keystore) +- with open(filename, 'rb') as f: +- file_data = f.read() +- md5_digest = hashlib.md5(file_data).hexdigest() +- sha256_digest = hashlib.sha256(file_data).hexdigest() +- d.update({ +- ':action': 'file_upload', +- 'protocol_version': '1', +- 'filetype': filetype, +- 'pyversion': pyversion, +- 'md5_digest': md5_digest, +- 'sha256_digest': sha256_digest, +- }) +- files = [('content', os.path.basename(filename), file_data)] +- if sig_file: +- with open(sig_file, 'rb') as f: +- sig_data = f.read() +- files.append(('gpg_signature', os.path.basename(sig_file), +- sig_data)) +- shutil.rmtree(os.path.dirname(sig_file)) +- request = self.encode_request(d.items(), files) +- return self.send_request(request) +- +- def upload_documentation(self, metadata, doc_dir): +- """ +- Upload documentation to the index. +- +- :param metadata: A :class:`Metadata` instance defining at least a name +- and version number for the documentation to be +- uploaded. +- :param doc_dir: The pathname of the directory which contains the +- documentation. This should be the directory that +- contains the ``index.html`` for the documentation. +- :return: The HTTP response received from PyPI upon submission of the +- request. +- """ +- self.check_credentials() +- if not os.path.isdir(doc_dir): +- raise DistlibException('not a directory: %r' % doc_dir) +- fn = os.path.join(doc_dir, 'index.html') +- if not os.path.exists(fn): +- raise DistlibException('not found: %r' % fn) +- metadata.validate() +- name, version = metadata.name, metadata.version +- zip_data = zip_dir(doc_dir).getvalue() +- fields = [(':action', 'doc_upload'), +- ('name', name), ('version', version)] +- files = [('content', name, zip_data)] +- request = self.encode_request(fields, files) +- return self.send_request(request) +- +- def get_verify_command(self, signature_filename, data_filename, +- keystore=None): +- """ +- Return a suitable command for verifying a file. +- +- :param signature_filename: The pathname to the file containing the +- signature. +- :param data_filename: The pathname to the file containing the +- signed data. +- :param keystore: The path to a directory which contains the keys +- used in verification. If not specified, the +- instance's ``gpg_home`` attribute is used instead. +- :return: The verifying command as a list suitable to be +- passed to :class:`subprocess.Popen`. +- """ +- cmd = [self.gpg, '--status-fd', '2', '--no-tty'] +- if keystore is None: +- keystore = self.gpg_home +- if keystore: +- cmd.extend(['--homedir', keystore]) +- cmd.extend(['--verify', signature_filename, data_filename]) +- logger.debug('invoking: %s', ' '.join(cmd)) +- return cmd +- +- def verify_signature(self, signature_filename, data_filename, +- keystore=None): +- """ +- Verify a signature for a file. +- +- :param signature_filename: The pathname to the file containing the +- signature. +- :param data_filename: The pathname to the file containing the +- signed data. +- :param keystore: The path to a directory which contains the keys +- used in verification. If not specified, the +- instance's ``gpg_home`` attribute is used instead. +- :return: True if the signature was verified, else False. +- """ +- if not self.gpg: +- raise DistlibException('verification unavailable because gpg ' +- 'unavailable') +- cmd = self.get_verify_command(signature_filename, data_filename, +- keystore) +- rc, stdout, stderr = self.run_command(cmd) +- if rc not in (0, 1): +- raise DistlibException('verify command failed with error ' +- 'code %s' % rc) +- return rc == 0 +- +- def download_file(self, url, destfile, digest=None, reporthook=None): +- """ +- This is a convenience method for downloading a file from an URL. +- Normally, this will be a file from the index, though currently +- no check is made for this (i.e. a file can be downloaded from +- anywhere). +- +- The method is just like the :func:`urlretrieve` function in the +- standard library, except that it allows digest computation to be +- done during download and checking that the downloaded data +- matched any expected value. +- +- :param url: The URL of the file to be downloaded (assumed to be +- available via an HTTP GET request). +- :param destfile: The pathname where the downloaded file is to be +- saved. +- :param digest: If specified, this must be a (hasher, value) +- tuple, where hasher is the algorithm used (e.g. +- ``'md5'``) and ``value`` is the expected value. +- :param reporthook: The same as for :func:`urlretrieve` in the +- standard library. +- """ +- if digest is None: +- digester = None +- logger.debug('No digest specified') +- else: +- if isinstance(digest, (list, tuple)): +- hasher, digest = digest +- else: +- hasher = 'md5' +- digester = getattr(hashlib, hasher)() +- logger.debug('Digest specified: %s' % digest) +- # The following code is equivalent to urlretrieve. +- # We need to do it this way so that we can compute the +- # digest of the file as we go. +- with open(destfile, 'wb') as dfp: +- # addinfourl is not a context manager on 2.x +- # so we have to use try/finally +- sfp = self.send_request(Request(url)) +- try: +- headers = sfp.info() +- blocksize = 8192 +- size = -1 +- read = 0 +- blocknum = 0 +- if "content-length" in headers: +- size = int(headers["Content-Length"]) +- if reporthook: +- reporthook(blocknum, blocksize, size) +- while True: +- block = sfp.read(blocksize) +- if not block: +- break +- read += len(block) +- dfp.write(block) +- if digester: +- digester.update(block) +- blocknum += 1 +- if reporthook: +- reporthook(blocknum, blocksize, size) +- finally: +- sfp.close() +- +- # check that we got the whole file, if we can +- if size >= 0 and read < size: +- raise DistlibException( +- 'retrieval incomplete: got only %d out of %d bytes' +- % (read, size)) +- # if we have a digest, it must match. +- if digester: +- actual = digester.hexdigest() +- if digest != actual: +- raise DistlibException('%s digest mismatch for %s: expected ' +- '%s, got %s' % (hasher, destfile, +- digest, actual)) +- logger.debug('Digest verified: %s', digest) +- +- def send_request(self, req): +- """ +- Send a standard library :class:`Request` to PyPI and return its +- response. +- +- :param req: The request to send. +- :return: The HTTP response from PyPI (a standard library HTTPResponse). +- """ +- handlers = [] +- if self.password_handler: +- handlers.append(self.password_handler) +- if self.ssl_verifier: +- handlers.append(self.ssl_verifier) +- opener = build_opener(*handlers) +- return opener.open(req) +- +- def encode_request(self, fields, files): +- """ +- Encode fields and files for posting to an HTTP server. +- +- :param fields: The fields to send as a list of (fieldname, value) +- tuples. +- :param files: The files to send as a list of (fieldname, filename, +- file_bytes) tuple. +- """ +- # Adapted from packaging, which in turn was adapted from +- # http://code.activestate.com/recipes/146306 +- +- parts = [] +- boundary = self.boundary +- for k, values in fields: +- if not isinstance(values, (list, tuple)): +- values = [values] +- +- for v in values: +- parts.extend(( +- b'--' + boundary, +- ('Content-Disposition: form-data; name="%s"' % +- k).encode('utf-8'), +- b'', +- v.encode('utf-8'))) +- for key, filename, value in files: +- parts.extend(( +- b'--' + boundary, +- ('Content-Disposition: form-data; name="%s"; filename="%s"' % +- (key, filename)).encode('utf-8'), +- b'', +- value)) +- +- parts.extend((b'--' + boundary + b'--', b'')) +- +- body = b'\r\n'.join(parts) +- ct = b'multipart/form-data; boundary=' + boundary +- headers = { +- 'Content-type': ct, +- 'Content-length': str(len(body)) +- } +- return Request(self.url, body, headers) +- +- def search(self, terms, operator=None): +- if isinstance(terms, string_types): +- terms = {'name': terms} +- if self.rpc_proxy is None: +- self.rpc_proxy = ServerProxy(self.url, timeout=3.0) +- return self.rpc_proxy.search(terms, operator or 'and') +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/locators.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/locators.py +deleted file mode 100644 +index 14789ef..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/locators.py ++++ /dev/null +@@ -1,1283 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2012-2015 Vinay Sajip. +-# Licensed to the Python Software Foundation under a contributor agreement. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +- +-import gzip +-from io import BytesIO +-import json +-import logging +-import os +-import posixpath +-import re +-try: +- import threading +-except ImportError: # pragma: no cover +- import dummy_threading as threading +-import zlib +- +-from . import DistlibException +-from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, +- queue, quote, unescape, string_types, build_opener, +- HTTPRedirectHandler as BaseRedirectHandler, text_type, +- Request, HTTPError, URLError) +-from .database import Distribution, DistributionPath, make_dist +-from .metadata import Metadata +-from .util import (cached_property, parse_credentials, ensure_slash, +- split_filename, get_project_data, parse_requirement, +- parse_name_and_version, ServerProxy, normalize_name) +-from .version import get_scheme, UnsupportedVersionError +-from .wheel import Wheel, is_compatible +- +-logger = logging.getLogger(__name__) +- +-HASHER_HASH = re.compile('^(\w+)=([a-f0-9]+)') +-CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +-HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +-DEFAULT_INDEX = 'https://pypi.python.org/pypi' +- +-def get_all_distribution_names(url=None): +- """ +- Return all distribution names known by an index. +- :param url: The URL of the index. +- :return: A list of all known distribution names. +- """ +- if url is None: +- url = DEFAULT_INDEX +- client = ServerProxy(url, timeout=3.0) +- return client.list_packages() +- +-class RedirectHandler(BaseRedirectHandler): +- """ +- A class to work around a bug in some Python 3.2.x releases. +- """ +- # There's a bug in the base version for some 3.2.x +- # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header +- # returns e.g. /abc, it bails because it says the scheme '' +- # is bogus, when actually it should use the request's +- # URL for the scheme. See Python issue #13696. +- def http_error_302(self, req, fp, code, msg, headers): +- # Some servers (incorrectly) return multiple Location headers +- # (so probably same goes for URI). Use first header. +- newurl = None +- for key in ('location', 'uri'): +- if key in headers: +- newurl = headers[key] +- break +- if newurl is None: +- return +- urlparts = urlparse(newurl) +- if urlparts.scheme == '': +- newurl = urljoin(req.get_full_url(), newurl) +- if hasattr(headers, 'replace_header'): +- headers.replace_header(key, newurl) +- else: +- headers[key] = newurl +- return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, +- headers) +- +- http_error_301 = http_error_303 = http_error_307 = http_error_302 +- +-class Locator(object): +- """ +- A base class for locators - things that locate distributions. +- """ +- source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') +- binary_extensions = ('.egg', '.exe', '.whl') +- excluded_extensions = ('.pdf',) +- +- # A list of tags indicating which wheels you want to match. The default +- # value of None matches against the tags compatible with the running +- # Python. If you want to match other values, set wheel_tags on a locator +- # instance to a list of tuples (pyver, abi, arch) which you want to match. +- wheel_tags = None +- +- downloadable_extensions = source_extensions + ('.whl',) +- +- def __init__(self, scheme='default'): +- """ +- Initialise an instance. +- :param scheme: Because locators look for most recent versions, they +- need to know the version scheme to use. This specifies +- the current PEP-recommended scheme - use ``'legacy'`` +- if you need to support existing distributions on PyPI. +- """ +- self._cache = {} +- self.scheme = scheme +- # Because of bugs in some of the handlers on some of the platforms, +- # we use our own opener rather than just using urlopen. +- self.opener = build_opener(RedirectHandler()) +- # If get_project() is called from locate(), the matcher instance +- # is set from the requirement passed to locate(). See issue #18 for +- # why this can be useful to know. +- self.matcher = None +- self.errors = queue.Queue() +- +- def get_errors(self): +- """ +- Return any errors which have occurred. +- """ +- result = [] +- while not self.errors.empty(): # pragma: no cover +- try: +- e = self.errors.get(False) +- result.append(e) +- except self.errors.Empty: +- continue +- self.errors.task_done() +- return result +- +- def clear_errors(self): +- """ +- Clear any errors which may have been logged. +- """ +- # Just get the errors and throw them away +- self.get_errors() +- +- def clear_cache(self): +- self._cache.clear() +- +- def _get_scheme(self): +- return self._scheme +- +- def _set_scheme(self, value): +- self._scheme = value +- +- scheme = property(_get_scheme, _set_scheme) +- +- def _get_project(self, name): +- """ +- For a given project, get a dictionary mapping available versions to Distribution +- instances. +- +- This should be implemented in subclasses. +- +- If called from a locate() request, self.matcher will be set to a +- matcher for the requirement to satisfy, otherwise it will be None. +- """ +- raise NotImplementedError('Please implement in the subclass') +- +- def get_distribution_names(self): +- """ +- Return all the distribution names known to this locator. +- """ +- raise NotImplementedError('Please implement in the subclass') +- +- def get_project(self, name): +- """ +- For a given project, get a dictionary mapping available versions to Distribution +- instances. +- +- This calls _get_project to do all the work, and just implements a caching layer on top. +- """ +- if self._cache is None: +- result = self._get_project(name) +- elif name in self._cache: +- result = self._cache[name] +- else: +- self.clear_errors() +- result = self._get_project(name) +- self._cache[name] = result +- return result +- +- def score_url(self, url): +- """ +- Give an url a score which can be used to choose preferred URLs +- for a given project release. +- """ +- t = urlparse(url) +- basename = posixpath.basename(t.path) +- compatible = True +- is_wheel = basename.endswith('.whl') +- if is_wheel: +- compatible = is_compatible(Wheel(basename), self.wheel_tags) +- return (t.scheme != 'https', 'pypi.python.org' in t.netloc, +- is_wheel, compatible, basename) +- +- def prefer_url(self, url1, url2): +- """ +- Choose one of two URLs where both are candidates for distribution +- archives for the same version of a distribution (for example, +- .tar.gz vs. zip). +- +- The current implementation favours https:// URLs over http://, archives +- from PyPI over those from other locations, wheel compatibility (if a +- wheel) and then the archive name. +- """ +- result = url2 +- if url1: +- s1 = self.score_url(url1) +- s2 = self.score_url(url2) +- if s1 > s2: +- result = url1 +- if result != url2: +- logger.debug('Not replacing %r with %r', url1, url2) +- else: +- logger.debug('Replacing %r with %r', url1, url2) +- return result +- +- def split_filename(self, filename, project_name): +- """ +- Attempt to split a filename in project name, version and Python version. +- """ +- return split_filename(filename, project_name) +- +- def convert_url_to_download_info(self, url, project_name): +- """ +- See if a URL is a candidate for a download URL for a project (the URL +- has typically been scraped from an HTML page). +- +- If it is, a dictionary is returned with keys "name", "version", +- "filename" and "url"; otherwise, None is returned. +- """ +- def same_project(name1, name2): +- return normalize_name(name1) == normalize_name(name2) +- +- result = None +- scheme, netloc, path, params, query, frag = urlparse(url) +- if frag.lower().startswith('egg='): +- logger.debug('%s: version hint in fragment: %r', +- project_name, frag) +- m = HASHER_HASH.match(frag) +- if m: +- algo, digest = m.groups() +- else: +- algo, digest = None, None +- origpath = path +- if path and path[-1] == '/': +- path = path[:-1] +- if path.endswith('.whl'): +- try: +- wheel = Wheel(path) +- if is_compatible(wheel, self.wheel_tags): +- if project_name is None: +- include = True +- else: +- include = same_project(wheel.name, project_name) +- if include: +- result = { +- 'name': wheel.name, +- 'version': wheel.version, +- 'filename': wheel.filename, +- 'url': urlunparse((scheme, netloc, origpath, +- params, query, '')), +- 'python-version': ', '.join( +- ['.'.join(list(v[2:])) for v in wheel.pyver]), +- } +- except Exception as e: # pragma: no cover +- logger.warning('invalid path for wheel: %s', path) +- elif path.endswith(self.downloadable_extensions): +- path = filename = posixpath.basename(path) +- for ext in self.downloadable_extensions: +- if path.endswith(ext): +- path = path[:-len(ext)] +- t = self.split_filename(path, project_name) +- if not t: +- logger.debug('No match for project/version: %s', path) +- else: +- name, version, pyver = t +- if not project_name or same_project(project_name, name): +- result = { +- 'name': name, +- 'version': version, +- 'filename': filename, +- 'url': urlunparse((scheme, netloc, origpath, +- params, query, '')), +- #'packagetype': 'sdist', +- } +- if pyver: +- result['python-version'] = pyver +- break +- if result and algo: +- result['%s_digest' % algo] = digest +- return result +- +- def _get_digest(self, info): +- """ +- Get a digest from a dictionary by looking at keys of the form +- 'algo_digest'. +- +- Returns a 2-tuple (algo, digest) if found, else None. Currently +- looks only for SHA256, then MD5. +- """ +- result = None +- for algo in ('sha256', 'md5'): +- key = '%s_digest' % algo +- if key in info: +- result = (algo, info[key]) +- break +- return result +- +- def _update_version_data(self, result, info): +- """ +- Update a result dictionary (the final result from _get_project) with a +- dictionary for a specific version, which typically holds information +- gleaned from a filename or URL for an archive for the distribution. +- """ +- name = info.pop('name') +- version = info.pop('version') +- if version in result: +- dist = result[version] +- md = dist.metadata +- else: +- dist = make_dist(name, version, scheme=self.scheme) +- md = dist.metadata +- dist.digest = digest = self._get_digest(info) +- url = info['url'] +- result['digests'][url] = digest +- if md.source_url != info['url']: +- md.source_url = self.prefer_url(md.source_url, url) +- result['urls'].setdefault(version, set()).add(url) +- dist.locator = self +- result[version] = dist +- +- def locate(self, requirement, prereleases=False): +- """ +- Find the most recent distribution which matches the given +- requirement. +- +- :param requirement: A requirement of the form 'foo (1.0)' or perhaps +- 'foo (>= 1.0, < 2.0, != 1.3)' +- :param prereleases: If ``True``, allow pre-release versions +- to be located. Otherwise, pre-release versions +- are not returned. +- :return: A :class:`Distribution` instance, or ``None`` if no such +- distribution could be located. +- """ +- result = None +- r = parse_requirement(requirement) +- if r is None: +- raise DistlibException('Not a valid requirement: %r' % requirement) +- scheme = get_scheme(self.scheme) +- self.matcher = matcher = scheme.matcher(r.requirement) +- logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) +- versions = self.get_project(r.name) +- if len(versions) > 2: # urls and digests keys are present +- # sometimes, versions are invalid +- slist = [] +- vcls = matcher.version_class +- for k in versions: +- if k in ('urls', 'digests'): +- continue +- try: +- if not matcher.match(k): +- logger.debug('%s did not match %r', matcher, k) +- else: +- if prereleases or not vcls(k).is_prerelease: +- slist.append(k) +- else: +- logger.debug('skipping pre-release ' +- 'version %s of %s', k, matcher.name) +- except Exception: # pragma: no cover +- logger.warning('error matching %s with %r', matcher, k) +- pass # slist.append(k) +- if len(slist) > 1: +- slist = sorted(slist, key=scheme.key) +- if slist: +- logger.debug('sorted list: %s', slist) +- version = slist[-1] +- result = versions[version] +- if result: +- if r.extras: +- result.extras = r.extras +- result.download_urls = versions.get('urls', {}).get(version, set()) +- d = {} +- sd = versions.get('digests', {}) +- for url in result.download_urls: +- if url in sd: +- d[url] = sd[url] +- result.digests = d +- self.matcher = None +- return result +- +- +-class PyPIRPCLocator(Locator): +- """ +- This locator uses XML-RPC to locate distributions. It therefore +- cannot be used with simple mirrors (that only mirror file content). +- """ +- def __init__(self, url, **kwargs): +- """ +- Initialise an instance. +- +- :param url: The URL to use for XML-RPC. +- :param kwargs: Passed to the superclass constructor. +- """ +- super(PyPIRPCLocator, self).__init__(**kwargs) +- self.base_url = url +- self.client = ServerProxy(url, timeout=3.0) +- +- def get_distribution_names(self): +- """ +- Return all the distribution names known to this locator. +- """ +- return set(self.client.list_packages()) +- +- def _get_project(self, name): +- result = {'urls': {}, 'digests': {}} +- versions = self.client.package_releases(name, True) +- for v in versions: +- urls = self.client.release_urls(name, v) +- data = self.client.release_data(name, v) +- metadata = Metadata(scheme=self.scheme) +- metadata.name = data['name'] +- metadata.version = data['version'] +- metadata.license = data.get('license') +- metadata.keywords = data.get('keywords', []) +- metadata.summary = data.get('summary') +- dist = Distribution(metadata) +- if urls: +- info = urls[0] +- metadata.source_url = info['url'] +- dist.digest = self._get_digest(info) +- dist.locator = self +- result[v] = dist +- for info in urls: +- url = info['url'] +- digest = self._get_digest(info) +- result['urls'].setdefault(v, set()).add(url) +- result['digests'][url] = digest +- return result +- +-class PyPIJSONLocator(Locator): +- """ +- This locator uses PyPI's JSON interface. It's very limited in functionality +- and probably not worth using. +- """ +- def __init__(self, url, **kwargs): +- super(PyPIJSONLocator, self).__init__(**kwargs) +- self.base_url = ensure_slash(url) +- +- def get_distribution_names(self): +- """ +- Return all the distribution names known to this locator. +- """ +- raise NotImplementedError('Not available from this locator') +- +- def _get_project(self, name): +- result = {'urls': {}, 'digests': {}} +- url = urljoin(self.base_url, '%s/json' % quote(name)) +- try: +- resp = self.opener.open(url) +- data = resp.read().decode() # for now +- d = json.loads(data) +- md = Metadata(scheme=self.scheme) +- data = d['info'] +- md.name = data['name'] +- md.version = data['version'] +- md.license = data.get('license') +- md.keywords = data.get('keywords', []) +- md.summary = data.get('summary') +- dist = Distribution(md) +- dist.locator = self +- urls = d['urls'] +- result[md.version] = dist +- for info in d['urls']: +- url = info['url'] +- dist.download_urls.add(url) +- dist.digests[url] = self._get_digest(info) +- result['urls'].setdefault(md.version, set()).add(url) +- result['digests'][url] = self._get_digest(info) +- # Now get other releases +- for version, infos in d['releases'].items(): +- if version == md.version: +- continue # already done +- omd = Metadata(scheme=self.scheme) +- omd.name = md.name +- omd.version = version +- odist = Distribution(omd) +- odist.locator = self +- result[version] = odist +- for info in infos: +- url = info['url'] +- odist.download_urls.add(url) +- odist.digests[url] = self._get_digest(info) +- result['urls'].setdefault(version, set()).add(url) +- result['digests'][url] = self._get_digest(info) +-# for info in urls: +-# md.source_url = info['url'] +-# dist.digest = self._get_digest(info) +-# dist.locator = self +-# for info in urls: +-# url = info['url'] +-# result['urls'].setdefault(md.version, set()).add(url) +-# result['digests'][url] = self._get_digest(info) +- except Exception as e: +- self.errors.put(text_type(e)) +- logger.exception('JSON fetch failed: %s', e) +- return result +- +- +-class Page(object): +- """ +- This class represents a scraped HTML page. +- """ +- # The following slightly hairy-looking regex just looks for the contents of +- # an anchor link, which has an attribute "href" either immediately preceded +- # or immediately followed by a "rel" attribute. The attribute values can be +- # declared with double quotes, single quotes or no quotes - which leads to +- # the length of the expression. +- _href = re.compile(""" +-(rel\s*=\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\s\n]*))\s+)? +-href\s*=\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\s\n]*)) +-(\s+rel\s*=\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\s\n]*)))? +-""", re.I | re.S | re.X) +- _base = re.compile(r"""]+)""", re.I | re.S) +- +- def __init__(self, data, url): +- """ +- Initialise an instance with the Unicode page contents and the URL they +- came from. +- """ +- self.data = data +- self.base_url = self.url = url +- m = self._base.search(self.data) +- if m: +- self.base_url = m.group(1) +- +- _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) +- +- @cached_property +- def links(self): +- """ +- Return the URLs of all the links on a page together with information +- about their "rel" attribute, for determining which ones to treat as +- downloads and which ones to queue for further scraping. +- """ +- def clean(url): +- "Tidy up an URL." +- scheme, netloc, path, params, query, frag = urlparse(url) +- return urlunparse((scheme, netloc, quote(path), +- params, query, frag)) +- +- result = set() +- for match in self._href.finditer(self.data): +- d = match.groupdict('') +- rel = (d['rel1'] or d['rel2'] or d['rel3'] or +- d['rel4'] or d['rel5'] or d['rel6']) +- url = d['url1'] or d['url2'] or d['url3'] +- url = urljoin(self.base_url, url) +- url = unescape(url) +- url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) +- result.add((url, rel)) +- # We sort the result, hoping to bring the most recent versions +- # to the front +- result = sorted(result, key=lambda t: t[0], reverse=True) +- return result +- +- +-class SimpleScrapingLocator(Locator): +- """ +- A locator which scrapes HTML pages to locate downloads for a distribution. +- This runs multiple threads to do the I/O; performance is at least as good +- as pip's PackageFinder, which works in an analogous fashion. +- """ +- +- # These are used to deal with various Content-Encoding schemes. +- decoders = { +- 'deflate': zlib.decompress, +- 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), +- 'none': lambda b: b, +- } +- +- def __init__(self, url, timeout=None, num_workers=10, **kwargs): +- """ +- Initialise an instance. +- :param url: The root URL to use for scraping. +- :param timeout: The timeout, in seconds, to be applied to requests. +- This defaults to ``None`` (no timeout specified). +- :param num_workers: The number of worker threads you want to do I/O, +- This defaults to 10. +- :param kwargs: Passed to the superclass. +- """ +- super(SimpleScrapingLocator, self).__init__(**kwargs) +- self.base_url = ensure_slash(url) +- self.timeout = timeout +- self._page_cache = {} +- self._seen = set() +- self._to_fetch = queue.Queue() +- self._bad_hosts = set() +- self.skip_externals = False +- self.num_workers = num_workers +- self._lock = threading.RLock() +- # See issue #45: we need to be resilient when the locator is used +- # in a thread, e.g. with concurrent.futures. We can't use self._lock +- # as it is for coordinating our internal threads - the ones created +- # in _prepare_threads. +- self._gplock = threading.RLock() +- +- def _prepare_threads(self): +- """ +- Threads are created only when get_project is called, and terminate +- before it returns. They are there primarily to parallelise I/O (i.e. +- fetching web pages). +- """ +- self._threads = [] +- for i in range(self.num_workers): +- t = threading.Thread(target=self._fetch) +- t.setDaemon(True) +- t.start() +- self._threads.append(t) +- +- def _wait_threads(self): +- """ +- Tell all the threads to terminate (by sending a sentinel value) and +- wait for them to do so. +- """ +- # Note that you need two loops, since you can't say which +- # thread will get each sentinel +- for t in self._threads: +- self._to_fetch.put(None) # sentinel +- for t in self._threads: +- t.join() +- self._threads = [] +- +- def _get_project(self, name): +- result = {'urls': {}, 'digests': {}} +- with self._gplock: +- self.result = result +- self.project_name = name +- url = urljoin(self.base_url, '%s/' % quote(name)) +- self._seen.clear() +- self._page_cache.clear() +- self._prepare_threads() +- try: +- logger.debug('Queueing %s', url) +- self._to_fetch.put(url) +- self._to_fetch.join() +- finally: +- self._wait_threads() +- del self.result +- return result +- +- platform_dependent = re.compile(r'\b(linux-(i\d86|x86_64|arm\w+)|' +- r'win(32|-amd64)|macosx-?\d+)\b', re.I) +- +- def _is_platform_dependent(self, url): +- """ +- Does an URL refer to a platform-specific download? +- """ +- return self.platform_dependent.search(url) +- +- def _process_download(self, url): +- """ +- See if an URL is a suitable download for a project. +- +- If it is, register information in the result dictionary (for +- _get_project) about the specific version it's for. +- +- Note that the return value isn't actually used other than as a boolean +- value. +- """ +- if self._is_platform_dependent(url): +- info = None +- else: +- info = self.convert_url_to_download_info(url, self.project_name) +- logger.debug('process_download: %s -> %s', url, info) +- if info: +- with self._lock: # needed because self.result is shared +- self._update_version_data(self.result, info) +- return info +- +- def _should_queue(self, link, referrer, rel): +- """ +- Determine whether a link URL from a referring page and with a +- particular "rel" attribute should be queued for scraping. +- """ +- scheme, netloc, path, _, _, _ = urlparse(link) +- if path.endswith(self.source_extensions + self.binary_extensions + +- self.excluded_extensions): +- result = False +- elif self.skip_externals and not link.startswith(self.base_url): +- result = False +- elif not referrer.startswith(self.base_url): +- result = False +- elif rel not in ('homepage', 'download'): +- result = False +- elif scheme not in ('http', 'https', 'ftp'): +- result = False +- elif self._is_platform_dependent(link): +- result = False +- else: +- host = netloc.split(':', 1)[0] +- if host.lower() == 'localhost': +- result = False +- else: +- result = True +- logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, +- referrer, result) +- return result +- +- def _fetch(self): +- """ +- Get a URL to fetch from the work queue, get the HTML page, examine its +- links for download candidates and candidates for further scraping. +- +- This is a handy method to run in a thread. +- """ +- while True: +- url = self._to_fetch.get() +- try: +- if url: +- page = self.get_page(url) +- if page is None: # e.g. after an error +- continue +- for link, rel in page.links: +- if link not in self._seen: +- self._seen.add(link) +- if (not self._process_download(link) and +- self._should_queue(link, url, rel)): +- logger.debug('Queueing %s from %s', link, url) +- self._to_fetch.put(link) +- except Exception as e: # pragma: no cover +- self.errors.put(text_type(e)) +- finally: +- # always do this, to avoid hangs :-) +- self._to_fetch.task_done() +- if not url: +- #logger.debug('Sentinel seen, quitting.') +- break +- +- def get_page(self, url): +- """ +- Get the HTML for an URL, possibly from an in-memory cache. +- +- XXX TODO Note: this cache is never actually cleared. It's assumed that +- the data won't get stale over the lifetime of a locator instance (not +- necessarily true for the default_locator). +- """ +- # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api +- scheme, netloc, path, _, _, _ = urlparse(url) +- if scheme == 'file' and os.path.isdir(url2pathname(path)): +- url = urljoin(ensure_slash(url), 'index.html') +- +- if url in self._page_cache: +- result = self._page_cache[url] +- logger.debug('Returning %s from cache: %s', url, result) +- else: +- host = netloc.split(':', 1)[0] +- result = None +- if host in self._bad_hosts: +- logger.debug('Skipping %s due to bad host %s', url, host) +- else: +- req = Request(url, headers={'Accept-encoding': 'identity'}) +- try: +- logger.debug('Fetching %s', url) +- resp = self.opener.open(req, timeout=self.timeout) +- logger.debug('Fetched %s', url) +- headers = resp.info() +- content_type = headers.get('Content-Type', '') +- if HTML_CONTENT_TYPE.match(content_type): +- final_url = resp.geturl() +- data = resp.read() +- encoding = headers.get('Content-Encoding') +- if encoding: +- decoder = self.decoders[encoding] # fail if not found +- data = decoder(data) +- encoding = 'utf-8' +- m = CHARSET.search(content_type) +- if m: +- encoding = m.group(1) +- try: +- data = data.decode(encoding) +- except UnicodeError: # pragma: no cover +- data = data.decode('latin-1') # fallback +- result = Page(data, final_url) +- self._page_cache[final_url] = result +- except HTTPError as e: +- if e.code != 404: +- logger.exception('Fetch failed: %s: %s', url, e) +- except URLError as e: # pragma: no cover +- logger.exception('Fetch failed: %s: %s', url, e) +- with self._lock: +- self._bad_hosts.add(host) +- except Exception as e: # pragma: no cover +- logger.exception('Fetch failed: %s: %s', url, e) +- finally: +- self._page_cache[url] = result # even if None (failure) +- return result +- +- _distname_re = re.compile(']*>([^<]+)<') +- +- def get_distribution_names(self): +- """ +- Return all the distribution names known to this locator. +- """ +- result = set() +- page = self.get_page(self.base_url) +- if not page: +- raise DistlibException('Unable to get %s' % self.base_url) +- for match in self._distname_re.finditer(page.data): +- result.add(match.group(1)) +- return result +- +-class DirectoryLocator(Locator): +- """ +- This class locates distributions in a directory tree. +- """ +- +- def __init__(self, path, **kwargs): +- """ +- Initialise an instance. +- :param path: The root of the directory tree to search. +- :param kwargs: Passed to the superclass constructor, +- except for: +- * recursive - if True (the default), subdirectories are +- recursed into. If False, only the top-level directory +- is searched, +- """ +- self.recursive = kwargs.pop('recursive', True) +- super(DirectoryLocator, self).__init__(**kwargs) +- path = os.path.abspath(path) +- if not os.path.isdir(path): # pragma: no cover +- raise DistlibException('Not a directory: %r' % path) +- self.base_dir = path +- +- def should_include(self, filename, parent): +- """ +- Should a filename be considered as a candidate for a distribution +- archive? As well as the filename, the directory which contains it +- is provided, though not used by the current implementation. +- """ +- return filename.endswith(self.downloadable_extensions) +- +- def _get_project(self, name): +- result = {'urls': {}, 'digests': {}} +- for root, dirs, files in os.walk(self.base_dir): +- for fn in files: +- if self.should_include(fn, root): +- fn = os.path.join(root, fn) +- url = urlunparse(('file', '', +- pathname2url(os.path.abspath(fn)), +- '', '', '')) +- info = self.convert_url_to_download_info(url, name) +- if info: +- self._update_version_data(result, info) +- if not self.recursive: +- break +- return result +- +- def get_distribution_names(self): +- """ +- Return all the distribution names known to this locator. +- """ +- result = set() +- for root, dirs, files in os.walk(self.base_dir): +- for fn in files: +- if self.should_include(fn, root): +- fn = os.path.join(root, fn) +- url = urlunparse(('file', '', +- pathname2url(os.path.abspath(fn)), +- '', '', '')) +- info = self.convert_url_to_download_info(url, None) +- if info: +- result.add(info['name']) +- if not self.recursive: +- break +- return result +- +-class JSONLocator(Locator): +- """ +- This locator uses special extended metadata (not available on PyPI) and is +- the basis of performant dependency resolution in distlib. Other locators +- require archive downloads before dependencies can be determined! As you +- might imagine, that can be slow. +- """ +- def get_distribution_names(self): +- """ +- Return all the distribution names known to this locator. +- """ +- raise NotImplementedError('Not available from this locator') +- +- def _get_project(self, name): +- result = {'urls': {}, 'digests': {}} +- data = get_project_data(name) +- if data: +- for info in data.get('files', []): +- if info['ptype'] != 'sdist' or info['pyversion'] != 'source': +- continue +- # We don't store summary in project metadata as it makes +- # the data bigger for no benefit during dependency +- # resolution +- dist = make_dist(data['name'], info['version'], +- summary=data.get('summary', +- 'Placeholder for summary'), +- scheme=self.scheme) +- md = dist.metadata +- md.source_url = info['url'] +- # TODO SHA256 digest +- if 'digest' in info and info['digest']: +- dist.digest = ('md5', info['digest']) +- md.dependencies = info.get('requirements', {}) +- dist.exports = info.get('exports', {}) +- result[dist.version] = dist +- result['urls'].setdefault(dist.version, set()).add(info['url']) +- return result +- +-class DistPathLocator(Locator): +- """ +- This locator finds installed distributions in a path. It can be useful for +- adding to an :class:`AggregatingLocator`. +- """ +- def __init__(self, distpath, **kwargs): +- """ +- Initialise an instance. +- +- :param distpath: A :class:`DistributionPath` instance to search. +- """ +- super(DistPathLocator, self).__init__(**kwargs) +- assert isinstance(distpath, DistributionPath) +- self.distpath = distpath +- +- def _get_project(self, name): +- dist = self.distpath.get_distribution(name) +- if dist is None: +- result = {'urls': {}, 'digests': {}} +- else: +- result = { +- dist.version: dist, +- 'urls': {dist.version: set([dist.source_url])}, +- 'digests': {dist.version: set([None])} +- } +- return result +- +- +-class AggregatingLocator(Locator): +- """ +- This class allows you to chain and/or merge a list of locators. +- """ +- def __init__(self, *locators, **kwargs): +- """ +- Initialise an instance. +- +- :param locators: The list of locators to search. +- :param kwargs: Passed to the superclass constructor, +- except for: +- * merge - if False (the default), the first successful +- search from any of the locators is returned. If True, +- the results from all locators are merged (this can be +- slow). +- """ +- self.merge = kwargs.pop('merge', False) +- self.locators = locators +- super(AggregatingLocator, self).__init__(**kwargs) +- +- def clear_cache(self): +- super(AggregatingLocator, self).clear_cache() +- for locator in self.locators: +- locator.clear_cache() +- +- def _set_scheme(self, value): +- self._scheme = value +- for locator in self.locators: +- locator.scheme = value +- +- scheme = property(Locator.scheme.fget, _set_scheme) +- +- def _get_project(self, name): +- result = {} +- for locator in self.locators: +- d = locator.get_project(name) +- if d: +- if self.merge: +- files = result.get('urls', {}) +- digests = result.get('digests', {}) +- # next line could overwrite result['urls'], result['digests'] +- result.update(d) +- df = result.get('urls') +- if files and df: +- for k, v in files.items(): +- if k in df: +- df[k] |= v +- else: +- df[k] = v +- dd = result.get('digests') +- if digests and dd: +- dd.update(digests) +- else: +- # See issue #18. If any dists are found and we're looking +- # for specific constraints, we only return something if +- # a match is found. For example, if a DirectoryLocator +- # returns just foo (1.0) while we're looking for +- # foo (>= 2.0), we'll pretend there was nothing there so +- # that subsequent locators can be queried. Otherwise we +- # would just return foo (1.0) which would then lead to a +- # failure to find foo (>= 2.0), because other locators +- # weren't searched. Note that this only matters when +- # merge=False. +- if self.matcher is None: +- found = True +- else: +- found = False +- for k in d: +- if self.matcher.match(k): +- found = True +- break +- if found: +- result = d +- break +- return result +- +- def get_distribution_names(self): +- """ +- Return all the distribution names known to this locator. +- """ +- result = set() +- for locator in self.locators: +- try: +- result |= locator.get_distribution_names() +- except NotImplementedError: +- pass +- return result +- +- +-# We use a legacy scheme simply because most of the dists on PyPI use legacy +-# versions which don't conform to PEP 426 / PEP 440. +-default_locator = AggregatingLocator( +- JSONLocator(), +- SimpleScrapingLocator('https://pypi.python.org/simple/', +- timeout=3.0), +- scheme='legacy') +- +-locate = default_locator.locate +- +-NAME_VERSION_RE = re.compile(r'(?P[\w-]+)\s*' +- r'\(\s*(==\s*)?(?P[^)]+)\)$') +- +-class DependencyFinder(object): +- """ +- Locate dependencies for distributions. +- """ +- +- def __init__(self, locator=None): +- """ +- Initialise an instance, using the specified locator +- to locate distributions. +- """ +- self.locator = locator or default_locator +- self.scheme = get_scheme(self.locator.scheme) +- +- def add_distribution(self, dist): +- """ +- Add a distribution to the finder. This will update internal information +- about who provides what. +- :param dist: The distribution to add. +- """ +- logger.debug('adding distribution %s', dist) +- name = dist.key +- self.dists_by_name[name] = dist +- self.dists[(name, dist.version)] = dist +- for p in dist.provides: +- name, version = parse_name_and_version(p) +- logger.debug('Add to provided: %s, %s, %s', name, version, dist) +- self.provided.setdefault(name, set()).add((version, dist)) +- +- def remove_distribution(self, dist): +- """ +- Remove a distribution from the finder. This will update internal +- information about who provides what. +- :param dist: The distribution to remove. +- """ +- logger.debug('removing distribution %s', dist) +- name = dist.key +- del self.dists_by_name[name] +- del self.dists[(name, dist.version)] +- for p in dist.provides: +- name, version = parse_name_and_version(p) +- logger.debug('Remove from provided: %s, %s, %s', name, version, dist) +- s = self.provided[name] +- s.remove((version, dist)) +- if not s: +- del self.provided[name] +- +- def get_matcher(self, reqt): +- """ +- Get a version matcher for a requirement. +- :param reqt: The requirement +- :type reqt: str +- :return: A version matcher (an instance of +- :class:`distlib.version.Matcher`). +- """ +- try: +- matcher = self.scheme.matcher(reqt) +- except UnsupportedVersionError: # pragma: no cover +- # XXX compat-mode if cannot read the version +- name = reqt.split()[0] +- matcher = self.scheme.matcher(name) +- return matcher +- +- def find_providers(self, reqt): +- """ +- Find the distributions which can fulfill a requirement. +- +- :param reqt: The requirement. +- :type reqt: str +- :return: A set of distribution which can fulfill the requirement. +- """ +- matcher = self.get_matcher(reqt) +- name = matcher.key # case-insensitive +- result = set() +- provided = self.provided +- if name in provided: +- for version, provider in provided[name]: +- try: +- match = matcher.match(version) +- except UnsupportedVersionError: +- match = False +- +- if match: +- result.add(provider) +- break +- return result +- +- def try_to_replace(self, provider, other, problems): +- """ +- Attempt to replace one provider with another. This is typically used +- when resolving dependencies from multiple sources, e.g. A requires +- (B >= 1.0) while C requires (B >= 1.1). +- +- For successful replacement, ``provider`` must meet all the requirements +- which ``other`` fulfills. +- +- :param provider: The provider we are trying to replace with. +- :param other: The provider we're trying to replace. +- :param problems: If False is returned, this will contain what +- problems prevented replacement. This is currently +- a tuple of the literal string 'cantreplace', +- ``provider``, ``other`` and the set of requirements +- that ``provider`` couldn't fulfill. +- :return: True if we can replace ``other`` with ``provider``, else +- False. +- """ +- rlist = self.reqts[other] +- unmatched = set() +- for s in rlist: +- matcher = self.get_matcher(s) +- if not matcher.match(provider.version): +- unmatched.add(s) +- if unmatched: +- # can't replace other with provider +- problems.add(('cantreplace', provider, other, +- frozenset(unmatched))) +- result = False +- else: +- # can replace other with provider +- self.remove_distribution(other) +- del self.reqts[other] +- for s in rlist: +- self.reqts.setdefault(provider, set()).add(s) +- self.add_distribution(provider) +- result = True +- return result +- +- def find(self, requirement, meta_extras=None, prereleases=False): +- """ +- Find a distribution and all distributions it depends on. +- +- :param requirement: The requirement specifying the distribution to +- find, or a Distribution instance. +- :param meta_extras: A list of meta extras such as :test:, :build: and +- so on. +- :param prereleases: If ``True``, allow pre-release versions to be +- returned - otherwise, don't return prereleases +- unless they're all that's available. +- +- Return a set of :class:`Distribution` instances and a set of +- problems. +- +- The distributions returned should be such that they have the +- :attr:`required` attribute set to ``True`` if they were +- from the ``requirement`` passed to ``find()``, and they have the +- :attr:`build_time_dependency` attribute set to ``True`` unless they +- are post-installation dependencies of the ``requirement``. +- +- The problems should be a tuple consisting of the string +- ``'unsatisfied'`` and the requirement which couldn't be satisfied +- by any distribution known to the locator. +- """ +- +- self.provided = {} +- self.dists = {} +- self.dists_by_name = {} +- self.reqts = {} +- +- meta_extras = set(meta_extras or []) +- if ':*:' in meta_extras: +- meta_extras.remove(':*:') +- # :meta: and :run: are implicitly included +- meta_extras |= set([':test:', ':build:', ':dev:']) +- +- if isinstance(requirement, Distribution): +- dist = odist = requirement +- logger.debug('passed %s as requirement', odist) +- else: +- dist = odist = self.locator.locate(requirement, +- prereleases=prereleases) +- if dist is None: +- raise DistlibException('Unable to locate %r' % requirement) +- logger.debug('located %s', odist) +- dist.requested = True +- problems = set() +- todo = set([dist]) +- install_dists = set([odist]) +- while todo: +- dist = todo.pop() +- name = dist.key # case-insensitive +- if name not in self.dists_by_name: +- self.add_distribution(dist) +- else: +- #import pdb; pdb.set_trace() +- other = self.dists_by_name[name] +- if other != dist: +- self.try_to_replace(dist, other, problems) +- +- ireqts = dist.run_requires | dist.meta_requires +- sreqts = dist.build_requires +- ereqts = set() +- if dist in install_dists: +- for key in ('test', 'build', 'dev'): +- e = ':%s:' % key +- if e in meta_extras: +- ereqts |= getattr(dist, '%s_requires' % key) +- all_reqts = ireqts | sreqts | ereqts +- for r in all_reqts: +- providers = self.find_providers(r) +- if not providers: +- logger.debug('No providers found for %r', r) +- provider = self.locator.locate(r, prereleases=prereleases) +- # If no provider is found and we didn't consider +- # prereleases, consider them now. +- if provider is None and not prereleases: +- provider = self.locator.locate(r, prereleases=True) +- if provider is None: +- logger.debug('Cannot satisfy %r', r) +- problems.add(('unsatisfied', r)) +- else: +- n, v = provider.key, provider.version +- if (n, v) not in self.dists: +- todo.add(provider) +- providers.add(provider) +- if r in ireqts and dist in install_dists: +- install_dists.add(provider) +- logger.debug('Adding %s to install_dists', +- provider.name_and_version) +- for p in providers: +- name = p.key +- if name not in self.dists_by_name: +- self.reqts.setdefault(p, set()).add(r) +- else: +- other = self.dists_by_name[name] +- if other != p: +- # see if other can be replaced by p +- self.try_to_replace(p, other, problems) +- +- dists = set(self.dists.values()) +- for dist in dists: +- dist.build_time_dependency = dist not in install_dists +- if dist.build_time_dependency: +- logger.debug('%s is a build-time dependency only.', +- dist.name_and_version) +- logger.debug('find done for %s', odist) +- return dists, problems +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/manifest.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/manifest.py +deleted file mode 100644 +index 9f03364..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/manifest.py ++++ /dev/null +@@ -1,393 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2012-2013 Python Software Foundation. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-""" +-Class representing the list of files in a distribution. +- +-Equivalent to distutils.filelist, but fixes some problems. +-""" +-import fnmatch +-import logging +-import os +-import re +-import sys +- +-from . import DistlibException +-from .compat import fsdecode +-from .util import convert_path +- +- +-__all__ = ['Manifest'] +- +-logger = logging.getLogger(__name__) +- +-# a \ followed by some spaces + EOL +-_COLLAPSE_PATTERN = re.compile('\\\w*\n', re.M) +-_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) +- +-# +-# Due to the different results returned by fnmatch.translate, we need +-# to do slightly different processing for Python 2.7 and 3.2 ... this needed +-# to be brought in for Python 3.6 onwards. +-# +-_PYTHON_VERSION = sys.version_info[:2] +- +-class Manifest(object): +- """A list of files built by on exploring the filesystem and filtered by +- applying various patterns to what we find there. +- """ +- +- def __init__(self, base=None): +- """ +- Initialise an instance. +- +- :param base: The base directory to explore under. +- """ +- self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) +- self.prefix = self.base + os.sep +- self.allfiles = None +- self.files = set() +- +- # +- # Public API +- # +- +- def findall(self): +- """Find all files under the base and set ``allfiles`` to the absolute +- pathnames of files found. +- """ +- from stat import S_ISREG, S_ISDIR, S_ISLNK +- +- self.allfiles = allfiles = [] +- root = self.base +- stack = [root] +- pop = stack.pop +- push = stack.append +- +- while stack: +- root = pop() +- names = os.listdir(root) +- +- for name in names: +- fullname = os.path.join(root, name) +- +- # Avoid excess stat calls -- just one will do, thank you! +- stat = os.stat(fullname) +- mode = stat.st_mode +- if S_ISREG(mode): +- allfiles.append(fsdecode(fullname)) +- elif S_ISDIR(mode) and not S_ISLNK(mode): +- push(fullname) +- +- def add(self, item): +- """ +- Add a file to the manifest. +- +- :param item: The pathname to add. This can be relative to the base. +- """ +- if not item.startswith(self.prefix): +- item = os.path.join(self.base, item) +- self.files.add(os.path.normpath(item)) +- +- def add_many(self, items): +- """ +- Add a list of files to the manifest. +- +- :param items: The pathnames to add. These can be relative to the base. +- """ +- for item in items: +- self.add(item) +- +- def sorted(self, wantdirs=False): +- """ +- Return sorted files in directory order +- """ +- +- def add_dir(dirs, d): +- dirs.add(d) +- logger.debug('add_dir added %s', d) +- if d != self.base: +- parent, _ = os.path.split(d) +- assert parent not in ('', '/') +- add_dir(dirs, parent) +- +- result = set(self.files) # make a copy! +- if wantdirs: +- dirs = set() +- for f in result: +- add_dir(dirs, os.path.dirname(f)) +- result |= dirs +- return [os.path.join(*path_tuple) for path_tuple in +- sorted(os.path.split(path) for path in result)] +- +- def clear(self): +- """Clear all collected files.""" +- self.files = set() +- self.allfiles = [] +- +- def process_directive(self, directive): +- """ +- Process a directive which either adds some files from ``allfiles`` to +- ``files``, or removes some files from ``files``. +- +- :param directive: The directive to process. This should be in a format +- compatible with distutils ``MANIFEST.in`` files: +- +- http://docs.python.org/distutils/sourcedist.html#commands +- """ +- # Parse the line: split it up, make sure the right number of words +- # is there, and return the relevant words. 'action' is always +- # defined: it's the first word of the line. Which of the other +- # three are defined depends on the action; it'll be either +- # patterns, (dir and patterns), or (dirpattern). +- action, patterns, thedir, dirpattern = self._parse_directive(directive) +- +- # OK, now we know that the action is valid and we have the +- # right number of words on the line for that action -- so we +- # can proceed with minimal error-checking. +- if action == 'include': +- for pattern in patterns: +- if not self._include_pattern(pattern, anchor=True): +- logger.warning('no files found matching %r', pattern) +- +- elif action == 'exclude': +- for pattern in patterns: +- found = self._exclude_pattern(pattern, anchor=True) +- #if not found: +- # logger.warning('no previously-included files ' +- # 'found matching %r', pattern) +- +- elif action == 'global-include': +- for pattern in patterns: +- if not self._include_pattern(pattern, anchor=False): +- logger.warning('no files found matching %r ' +- 'anywhere in distribution', pattern) +- +- elif action == 'global-exclude': +- for pattern in patterns: +- found = self._exclude_pattern(pattern, anchor=False) +- #if not found: +- # logger.warning('no previously-included files ' +- # 'matching %r found anywhere in ' +- # 'distribution', pattern) +- +- elif action == 'recursive-include': +- for pattern in patterns: +- if not self._include_pattern(pattern, prefix=thedir): +- logger.warning('no files found matching %r ' +- 'under directory %r', pattern, thedir) +- +- elif action == 'recursive-exclude': +- for pattern in patterns: +- found = self._exclude_pattern(pattern, prefix=thedir) +- #if not found: +- # logger.warning('no previously-included files ' +- # 'matching %r found under directory %r', +- # pattern, thedir) +- +- elif action == 'graft': +- if not self._include_pattern(None, prefix=dirpattern): +- logger.warning('no directories found matching %r', +- dirpattern) +- +- elif action == 'prune': +- if not self._exclude_pattern(None, prefix=dirpattern): +- logger.warning('no previously-included directories found ' +- 'matching %r', dirpattern) +- else: # pragma: no cover +- # This should never happen, as it should be caught in +- # _parse_template_line +- raise DistlibException( +- 'invalid action %r' % action) +- +- # +- # Private API +- # +- +- def _parse_directive(self, directive): +- """ +- Validate a directive. +- :param directive: The directive to validate. +- :return: A tuple of action, patterns, thedir, dir_patterns +- """ +- words = directive.split() +- if len(words) == 1 and words[0] not in ('include', 'exclude', +- 'global-include', +- 'global-exclude', +- 'recursive-include', +- 'recursive-exclude', +- 'graft', 'prune'): +- # no action given, let's use the default 'include' +- words.insert(0, 'include') +- +- action = words[0] +- patterns = thedir = dir_pattern = None +- +- if action in ('include', 'exclude', +- 'global-include', 'global-exclude'): +- if len(words) < 2: +- raise DistlibException( +- '%r expects ...' % action) +- +- patterns = [convert_path(word) for word in words[1:]] +- +- elif action in ('recursive-include', 'recursive-exclude'): +- if len(words) < 3: +- raise DistlibException( +- '%r expects ...' % action) +- +- thedir = convert_path(words[1]) +- patterns = [convert_path(word) for word in words[2:]] +- +- elif action in ('graft', 'prune'): +- if len(words) != 2: +- raise DistlibException( +- '%r expects a single ' % action) +- +- dir_pattern = convert_path(words[1]) +- +- else: +- raise DistlibException('unknown action %r' % action) +- +- return action, patterns, thedir, dir_pattern +- +- def _include_pattern(self, pattern, anchor=True, prefix=None, +- is_regex=False): +- """Select strings (presumably filenames) from 'self.files' that +- match 'pattern', a Unix-style wildcard (glob) pattern. +- +- Patterns are not quite the same as implemented by the 'fnmatch' +- module: '*' and '?' match non-special characters, where "special" +- is platform-dependent: slash on Unix; colon, slash, and backslash on +- DOS/Windows; and colon on Mac OS. +- +- If 'anchor' is true (the default), then the pattern match is more +- stringent: "*.py" will match "foo.py" but not "foo/bar.py". If +- 'anchor' is false, both of these will match. +- +- If 'prefix' is supplied, then only filenames starting with 'prefix' +- (itself a pattern) and ending with 'pattern', with anything in between +- them, will match. 'anchor' is ignored in this case. +- +- If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and +- 'pattern' is assumed to be either a string containing a regex or a +- regex object -- no translation is done, the regex is just compiled +- and used as-is. +- +- Selected strings will be added to self.files. +- +- Return True if files are found. +- """ +- # XXX docstring lying about what the special chars are? +- found = False +- pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) +- +- # delayed loading of allfiles list +- if self.allfiles is None: +- self.findall() +- +- for name in self.allfiles: +- if pattern_re.search(name): +- self.files.add(name) +- found = True +- return found +- +- def _exclude_pattern(self, pattern, anchor=True, prefix=None, +- is_regex=False): +- """Remove strings (presumably filenames) from 'files' that match +- 'pattern'. +- +- Other parameters are the same as for 'include_pattern()', above. +- The list 'self.files' is modified in place. Return True if files are +- found. +- +- This API is public to allow e.g. exclusion of SCM subdirs, e.g. when +- packaging source distributions +- """ +- found = False +- pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) +- for f in list(self.files): +- if pattern_re.search(f): +- self.files.remove(f) +- found = True +- return found +- +- def _translate_pattern(self, pattern, anchor=True, prefix=None, +- is_regex=False): +- """Translate a shell-like wildcard pattern to a compiled regular +- expression. +- +- Return the compiled regex. If 'is_regex' true, +- then 'pattern' is directly compiled to a regex (if it's a string) +- or just returned as-is (assumes it's a regex object). +- """ +- if is_regex: +- if isinstance(pattern, str): +- return re.compile(pattern) +- else: +- return pattern +- +- if _PYTHON_VERSION > (3, 2): +- # ditch start and end characters +- start, _, end = self._glob_to_re('_').partition('_') +- +- if pattern: +- pattern_re = self._glob_to_re(pattern) +- if _PYTHON_VERSION > (3, 2): +- assert pattern_re.startswith(start) and pattern_re.endswith(end) +- else: +- pattern_re = '' +- +- base = re.escape(os.path.join(self.base, '')) +- if prefix is not None: +- # ditch end of pattern character +- if _PYTHON_VERSION <= (3, 2): +- empty_pattern = self._glob_to_re('') +- prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] +- else: +- prefix_re = self._glob_to_re(prefix) +- assert prefix_re.startswith(start) and prefix_re.endswith(end) +- prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] +- sep = os.sep +- if os.sep == '\\': +- sep = r'\\' +- if _PYTHON_VERSION <= (3, 2): +- pattern_re = '^' + base + sep.join((prefix_re, +- '.*' + pattern_re)) +- else: +- pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] +- pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, +- pattern_re, end) +- else: # no prefix -- respect anchor flag +- if anchor: +- if _PYTHON_VERSION <= (3, 2): +- pattern_re = '^' + base + pattern_re +- else: +- pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) +- +- return re.compile(pattern_re) +- +- def _glob_to_re(self, pattern): +- """Translate a shell-like glob pattern to a regular expression. +- +- Return a string containing the regex. Differs from +- 'fnmatch.translate()' in that '*' does not match "special characters" +- (which are platform-specific). +- """ +- pattern_re = fnmatch.translate(pattern) +- +- # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which +- # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, +- # and by extension they shouldn't match such "special characters" under +- # any OS. So change all non-escaped dots in the RE to match any +- # character except the special characters (currently: just os.sep). +- sep = os.sep +- if os.sep == '\\': +- # we're using a regex to manipulate a regex, so we need +- # to escape the backslash twice +- sep = r'\\\\' +- escaped = r'\1[^%s]' % sep +- pattern_re = re.sub(r'((? y, +- 'gte': lambda x, y: x >= y, +- 'in': lambda x, y: x in y, +- 'lt': lambda x, y: x < y, +- 'lte': lambda x, y: x <= y, +- 'not': lambda x: not x, +- 'noteq': lambda x, y: x != y, +- 'notin': lambda x, y: x not in y, +- } +- +- allowed_values = { +- 'sys_platform': sys.platform, +- 'python_version': '%s.%s' % sys.version_info[:2], +- # parsing sys.platform is not reliable, but there is no other +- # way to get e.g. 2.7.2+, and the PEP is defined with sys.version +- 'python_full_version': sys.version.split(' ', 1)[0], +- 'os_name': os.name, +- 'platform_in_venv': str(in_venv()), +- 'platform_release': platform.release(), +- 'platform_version': platform.version(), +- 'platform_machine': platform.machine(), +- 'platform_python_implementation': python_implementation(), +- } +- +- def __init__(self, context=None): +- """ +- Initialise an instance. +- +- :param context: If specified, names are looked up in this mapping. +- """ +- self.context = context or {} +- self.source = None +- +- def get_fragment(self, offset): +- """ +- Get the part of the source which is causing a problem. +- """ +- fragment_len = 10 +- s = '%r' % (self.source[offset:offset + fragment_len]) +- if offset + fragment_len < len(self.source): +- s += '...' +- return s +- +- def get_handler(self, node_type): +- """ +- Get a handler for the specified AST node type. +- """ +- return getattr(self, 'do_%s' % node_type, None) +- +- def evaluate(self, node, filename=None): +- """ +- Evaluate a source string or node, using ``filename`` when +- displaying errors. +- """ +- if isinstance(node, string_types): +- self.source = node +- kwargs = {'mode': 'eval'} +- if filename: +- kwargs['filename'] = filename +- try: +- node = ast.parse(node, **kwargs) +- except SyntaxError as e: +- s = self.get_fragment(e.offset) +- raise SyntaxError('syntax error %s' % s) +- node_type = node.__class__.__name__.lower() +- handler = self.get_handler(node_type) +- if handler is None: +- if self.source is None: +- s = '(source not available)' +- else: +- s = self.get_fragment(node.col_offset) +- raise SyntaxError("don't know how to evaluate %r %s" % ( +- node_type, s)) +- return handler(node) +- +- def get_attr_key(self, node): +- assert isinstance(node, ast.Attribute), 'attribute node expected' +- return '%s.%s' % (node.value.id, node.attr) +- +- def do_attribute(self, node): +- if not isinstance(node.value, ast.Name): +- valid = False +- else: +- key = self.get_attr_key(node) +- valid = key in self.context or key in self.allowed_values +- if not valid: +- raise SyntaxError('invalid expression: %s' % key) +- if key in self.context: +- result = self.context[key] +- else: +- result = self.allowed_values[key] +- return result +- +- def do_boolop(self, node): +- result = self.evaluate(node.values[0]) +- is_or = node.op.__class__ is ast.Or +- is_and = node.op.__class__ is ast.And +- assert is_or or is_and +- if (is_and and result) or (is_or and not result): +- for n in node.values[1:]: +- result = self.evaluate(n) +- if (is_or and result) or (is_and and not result): +- break +- return result +- +- def do_compare(self, node): +- def sanity_check(lhsnode, rhsnode): +- valid = True +- if isinstance(lhsnode, ast.Str) and isinstance(rhsnode, ast.Str): +- valid = False +- #elif (isinstance(lhsnode, ast.Attribute) +- # and isinstance(rhsnode, ast.Attribute)): +- # klhs = self.get_attr_key(lhsnode) +- # krhs = self.get_attr_key(rhsnode) +- # valid = klhs != krhs +- if not valid: +- s = self.get_fragment(node.col_offset) +- raise SyntaxError('Invalid comparison: %s' % s) +- +- lhsnode = node.left +- lhs = self.evaluate(lhsnode) +- result = True +- for op, rhsnode in zip(node.ops, node.comparators): +- sanity_check(lhsnode, rhsnode) +- op = op.__class__.__name__.lower() +- if op not in self.operators: +- raise SyntaxError('unsupported operation: %r' % op) +- rhs = self.evaluate(rhsnode) +- result = self.operators[op](lhs, rhs) +- if not result: +- break +- lhs = rhs +- lhsnode = rhsnode +- return result +- +- def do_expression(self, node): +- return self.evaluate(node.body) +- +- def do_name(self, node): +- valid = False +- if node.id in self.context: +- valid = True +- result = self.context[node.id] +- elif node.id in self.allowed_values: +- valid = True +- result = self.allowed_values[node.id] +- if not valid: +- raise SyntaxError('invalid expression: %s' % node.id) +- return result +- +- def do_str(self, node): +- return node.s +- +- +-def interpret(marker, execution_context=None): +- """ +- Interpret a marker and return a result depending on environment. +- +- :param marker: The marker to interpret. +- :type marker: str +- :param execution_context: The context used for name lookup. +- :type execution_context: mapping +- """ +- return Evaluator(execution_context).evaluate(marker.strip()) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/metadata.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/metadata.py +deleted file mode 100644 +index 75bfd68..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/metadata.py ++++ /dev/null +@@ -1,1068 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2012 The Python Software Foundation. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-"""Implementation of the Metadata for Python packages PEPs. +- +-Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). +-""" +-from __future__ import unicode_literals +- +-import codecs +-from email import message_from_file +-import json +-import logging +-import re +- +- +-from . import DistlibException, __version__ +-from .compat import StringIO, string_types, text_type +-from .markers import interpret +-from .util import extract_by_key, get_extras +-from .version import get_scheme, PEP440_VERSION_RE +- +-logger = logging.getLogger(__name__) +- +- +-class MetadataMissingError(DistlibException): +- """A required metadata is missing""" +- +- +-class MetadataConflictError(DistlibException): +- """Attempt to read or write metadata fields that are conflictual.""" +- +- +-class MetadataUnrecognizedVersionError(DistlibException): +- """Unknown metadata version number.""" +- +- +-class MetadataInvalidError(DistlibException): +- """A metadata value is invalid""" +- +-# public API of this module +-__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] +- +-# Encoding used for the PKG-INFO files +-PKG_INFO_ENCODING = 'utf-8' +- +-# preferred version. Hopefully will be changed +-# to 1.2 once PEP 345 is supported everywhere +-PKG_INFO_PREFERRED_VERSION = '1.1' +- +-_LINE_PREFIX_1_2 = re.compile('\n \|') +-_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +-_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', +- 'Summary', 'Description', +- 'Keywords', 'Home-page', 'Author', 'Author-email', +- 'License') +- +-_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', +- 'Supported-Platform', 'Summary', 'Description', +- 'Keywords', 'Home-page', 'Author', 'Author-email', +- 'License', 'Classifier', 'Download-URL', 'Obsoletes', +- 'Provides', 'Requires') +- +-_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', +- 'Download-URL') +- +-_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', +- 'Supported-Platform', 'Summary', 'Description', +- 'Keywords', 'Home-page', 'Author', 'Author-email', +- 'Maintainer', 'Maintainer-email', 'License', +- 'Classifier', 'Download-URL', 'Obsoletes-Dist', +- 'Project-URL', 'Provides-Dist', 'Requires-Dist', +- 'Requires-Python', 'Requires-External') +- +-_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', +- 'Obsoletes-Dist', 'Requires-External', 'Maintainer', +- 'Maintainer-email', 'Project-URL') +- +-_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', +- 'Supported-Platform', 'Summary', 'Description', +- 'Keywords', 'Home-page', 'Author', 'Author-email', +- 'Maintainer', 'Maintainer-email', 'License', +- 'Classifier', 'Download-URL', 'Obsoletes-Dist', +- 'Project-URL', 'Provides-Dist', 'Requires-Dist', +- 'Requires-Python', 'Requires-External', 'Private-Version', +- 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', +- 'Provides-Extra') +- +-_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', +- 'Setup-Requires-Dist', 'Extension') +- +-_ALL_FIELDS = set() +-_ALL_FIELDS.update(_241_FIELDS) +-_ALL_FIELDS.update(_314_FIELDS) +-_ALL_FIELDS.update(_345_FIELDS) +-_ALL_FIELDS.update(_426_FIELDS) +- +-EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') +- +- +-def _version2fieldlist(version): +- if version == '1.0': +- return _241_FIELDS +- elif version == '1.1': +- return _314_FIELDS +- elif version == '1.2': +- return _345_FIELDS +- elif version == '2.0': +- return _426_FIELDS +- raise MetadataUnrecognizedVersionError(version) +- +- +-def _best_version(fields): +- """Detect the best version depending on the fields used.""" +- def _has_marker(keys, markers): +- for marker in markers: +- if marker in keys: +- return True +- return False +- +- keys = [] +- for key, value in fields.items(): +- if value in ([], 'UNKNOWN', None): +- continue +- keys.append(key) +- +- possible_versions = ['1.0', '1.1', '1.2', '2.0'] +- +- # first let's try to see if a field is not part of one of the version +- for key in keys: +- if key not in _241_FIELDS and '1.0' in possible_versions: +- possible_versions.remove('1.0') +- if key not in _314_FIELDS and '1.1' in possible_versions: +- possible_versions.remove('1.1') +- if key not in _345_FIELDS and '1.2' in possible_versions: +- possible_versions.remove('1.2') +- if key not in _426_FIELDS and '2.0' in possible_versions: +- possible_versions.remove('2.0') +- +- # possible_version contains qualified versions +- if len(possible_versions) == 1: +- return possible_versions[0] # found ! +- elif len(possible_versions) == 0: +- raise MetadataConflictError('Unknown metadata set') +- +- # let's see if one unique marker is found +- is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) +- is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) +- is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) +- if int(is_1_1) + int(is_1_2) + int(is_2_0) > 1: +- raise MetadataConflictError('You used incompatible 1.1/1.2/2.0 fields') +- +- # we have the choice, 1.0, or 1.2, or 2.0 +- # - 1.0 has a broken Summary field but works with all tools +- # - 1.1 is to avoid +- # - 1.2 fixes Summary but has little adoption +- # - 2.0 adds more features and is very new +- if not is_1_1 and not is_1_2 and not is_2_0: +- # we couldn't find any specific marker +- if PKG_INFO_PREFERRED_VERSION in possible_versions: +- return PKG_INFO_PREFERRED_VERSION +- if is_1_1: +- return '1.1' +- if is_1_2: +- return '1.2' +- +- return '2.0' +- +-_ATTR2FIELD = { +- 'metadata_version': 'Metadata-Version', +- 'name': 'Name', +- 'version': 'Version', +- 'platform': 'Platform', +- 'supported_platform': 'Supported-Platform', +- 'summary': 'Summary', +- 'description': 'Description', +- 'keywords': 'Keywords', +- 'home_page': 'Home-page', +- 'author': 'Author', +- 'author_email': 'Author-email', +- 'maintainer': 'Maintainer', +- 'maintainer_email': 'Maintainer-email', +- 'license': 'License', +- 'classifier': 'Classifier', +- 'download_url': 'Download-URL', +- 'obsoletes_dist': 'Obsoletes-Dist', +- 'provides_dist': 'Provides-Dist', +- 'requires_dist': 'Requires-Dist', +- 'setup_requires_dist': 'Setup-Requires-Dist', +- 'requires_python': 'Requires-Python', +- 'requires_external': 'Requires-External', +- 'requires': 'Requires', +- 'provides': 'Provides', +- 'obsoletes': 'Obsoletes', +- 'project_url': 'Project-URL', +- 'private_version': 'Private-Version', +- 'obsoleted_by': 'Obsoleted-By', +- 'extension': 'Extension', +- 'provides_extra': 'Provides-Extra', +-} +- +-_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +-_VERSIONS_FIELDS = ('Requires-Python',) +-_VERSION_FIELDS = ('Version',) +-_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', +- 'Requires', 'Provides', 'Obsoletes-Dist', +- 'Provides-Dist', 'Requires-Dist', 'Requires-External', +- 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', +- 'Provides-Extra', 'Extension') +-_LISTTUPLEFIELDS = ('Project-URL',) +- +-_ELEMENTSFIELD = ('Keywords',) +- +-_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') +- +-_MISSING = object() +- +-_FILESAFE = re.compile('[^A-Za-z0-9.]+') +- +- +-def _get_name_and_version(name, version, for_filename=False): +- """Return the distribution name with version. +- +- If for_filename is true, return a filename-escaped form.""" +- if for_filename: +- # For both name and version any runs of non-alphanumeric or '.' +- # characters are replaced with a single '-'. Additionally any +- # spaces in the version string become '.' +- name = _FILESAFE.sub('-', name) +- version = _FILESAFE.sub('-', version.replace(' ', '.')) +- return '%s-%s' % (name, version) +- +- +-class LegacyMetadata(object): +- """The legacy metadata of a release. +- +- Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can +- instantiate the class with one of these arguments (or none): +- - *path*, the path to a metadata file +- - *fileobj* give a file-like object with metadata as content +- - *mapping* is a dict-like object +- - *scheme* is a version scheme name +- """ +- # TODO document the mapping API and UNKNOWN default key +- +- def __init__(self, path=None, fileobj=None, mapping=None, +- scheme='default'): +- if [path, fileobj, mapping].count(None) < 2: +- raise TypeError('path, fileobj and mapping are exclusive') +- self._fields = {} +- self.requires_files = [] +- self._dependencies = None +- self.scheme = scheme +- if path is not None: +- self.read(path) +- elif fileobj is not None: +- self.read_file(fileobj) +- elif mapping is not None: +- self.update(mapping) +- self.set_metadata_version() +- +- def set_metadata_version(self): +- self._fields['Metadata-Version'] = _best_version(self._fields) +- +- def _write_field(self, fileobj, name, value): +- fileobj.write('%s: %s\n' % (name, value)) +- +- def __getitem__(self, name): +- return self.get(name) +- +- def __setitem__(self, name, value): +- return self.set(name, value) +- +- def __delitem__(self, name): +- field_name = self._convert_name(name) +- try: +- del self._fields[field_name] +- except KeyError: +- raise KeyError(name) +- +- def __contains__(self, name): +- return (name in self._fields or +- self._convert_name(name) in self._fields) +- +- def _convert_name(self, name): +- if name in _ALL_FIELDS: +- return name +- name = name.replace('-', '_').lower() +- return _ATTR2FIELD.get(name, name) +- +- def _default_value(self, name): +- if name in _LISTFIELDS or name in _ELEMENTSFIELD: +- return [] +- return 'UNKNOWN' +- +- def _remove_line_prefix(self, value): +- if self.metadata_version in ('1.0', '1.1'): +- return _LINE_PREFIX_PRE_1_2.sub('\n', value) +- else: +- return _LINE_PREFIX_1_2.sub('\n', value) +- +- def __getattr__(self, name): +- if name in _ATTR2FIELD: +- return self[name] +- raise AttributeError(name) +- +- # +- # Public API +- # +- +-# dependencies = property(_get_dependencies, _set_dependencies) +- +- def get_fullname(self, filesafe=False): +- """Return the distribution name with version. +- +- If filesafe is true, return a filename-escaped form.""" +- return _get_name_and_version(self['Name'], self['Version'], filesafe) +- +- def is_field(self, name): +- """return True if name is a valid metadata key""" +- name = self._convert_name(name) +- return name in _ALL_FIELDS +- +- def is_multi_field(self, name): +- name = self._convert_name(name) +- return name in _LISTFIELDS +- +- def read(self, filepath): +- """Read the metadata values from a file path.""" +- fp = codecs.open(filepath, 'r', encoding='utf-8') +- try: +- self.read_file(fp) +- finally: +- fp.close() +- +- def read_file(self, fileob): +- """Read the metadata values from a file object.""" +- msg = message_from_file(fileob) +- self._fields['Metadata-Version'] = msg['metadata-version'] +- +- # When reading, get all the fields we can +- for field in _ALL_FIELDS: +- if field not in msg: +- continue +- if field in _LISTFIELDS: +- # we can have multiple lines +- values = msg.get_all(field) +- if field in _LISTTUPLEFIELDS and values is not None: +- values = [tuple(value.split(',')) for value in values] +- self.set(field, values) +- else: +- # single line +- value = msg[field] +- if value is not None and value != 'UNKNOWN': +- self.set(field, value) +- self.set_metadata_version() +- +- def write(self, filepath, skip_unknown=False): +- """Write the metadata fields to filepath.""" +- fp = codecs.open(filepath, 'w', encoding='utf-8') +- try: +- self.write_file(fp, skip_unknown) +- finally: +- fp.close() +- +- def write_file(self, fileobject, skip_unknown=False): +- """Write the PKG-INFO format data to a file object.""" +- self.set_metadata_version() +- +- for field in _version2fieldlist(self['Metadata-Version']): +- values = self.get(field) +- if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): +- continue +- if field in _ELEMENTSFIELD: +- self._write_field(fileobject, field, ','.join(values)) +- continue +- if field not in _LISTFIELDS: +- if field == 'Description': +- if self.metadata_version in ('1.0', '1.1'): +- values = values.replace('\n', '\n ') +- else: +- values = values.replace('\n', '\n |') +- values = [values] +- +- if field in _LISTTUPLEFIELDS: +- values = [','.join(value) for value in values] +- +- for value in values: +- self._write_field(fileobject, field, value) +- +- def update(self, other=None, **kwargs): +- """Set metadata values from the given iterable `other` and kwargs. +- +- Behavior is like `dict.update`: If `other` has a ``keys`` method, +- they are looped over and ``self[key]`` is assigned ``other[key]``. +- Else, ``other`` is an iterable of ``(key, value)`` iterables. +- +- Keys that don't match a metadata field or that have an empty value are +- dropped. +- """ +- def _set(key, value): +- if key in _ATTR2FIELD and value: +- self.set(self._convert_name(key), value) +- +- if not other: +- # other is None or empty container +- pass +- elif hasattr(other, 'keys'): +- for k in other.keys(): +- _set(k, other[k]) +- else: +- for k, v in other: +- _set(k, v) +- +- if kwargs: +- for k, v in kwargs.items(): +- _set(k, v) +- +- def set(self, name, value): +- """Control then set a metadata field.""" +- name = self._convert_name(name) +- +- if ((name in _ELEMENTSFIELD or name == 'Platform') and +- not isinstance(value, (list, tuple))): +- if isinstance(value, string_types): +- value = [v.strip() for v in value.split(',')] +- else: +- value = [] +- elif (name in _LISTFIELDS and +- not isinstance(value, (list, tuple))): +- if isinstance(value, string_types): +- value = [value] +- else: +- value = [] +- +- if logger.isEnabledFor(logging.WARNING): +- project_name = self['Name'] +- +- scheme = get_scheme(self.scheme) +- if name in _PREDICATE_FIELDS and value is not None: +- for v in value: +- # check that the values are valid +- if not scheme.is_valid_matcher(v.split(';')[0]): +- logger.warning( +- "'%s': '%s' is not valid (field '%s')", +- project_name, v, name) +- # FIXME this rejects UNKNOWN, is that right? +- elif name in _VERSIONS_FIELDS and value is not None: +- if not scheme.is_valid_constraint_list(value): +- logger.warning("'%s': '%s' is not a valid version (field '%s')", +- project_name, value, name) +- elif name in _VERSION_FIELDS and value is not None: +- if not scheme.is_valid_version(value): +- logger.warning("'%s': '%s' is not a valid version (field '%s')", +- project_name, value, name) +- +- if name in _UNICODEFIELDS: +- if name == 'Description': +- value = self._remove_line_prefix(value) +- +- self._fields[name] = value +- +- def get(self, name, default=_MISSING): +- """Get a metadata field.""" +- name = self._convert_name(name) +- if name not in self._fields: +- if default is _MISSING: +- default = self._default_value(name) +- return default +- if name in _UNICODEFIELDS: +- value = self._fields[name] +- return value +- elif name in _LISTFIELDS: +- value = self._fields[name] +- if value is None: +- return [] +- res = [] +- for val in value: +- if name not in _LISTTUPLEFIELDS: +- res.append(val) +- else: +- # That's for Project-URL +- res.append((val[0], val[1])) +- return res +- +- elif name in _ELEMENTSFIELD: +- value = self._fields[name] +- if isinstance(value, string_types): +- return value.split(',') +- return self._fields[name] +- +- def check(self, strict=False): +- """Check if the metadata is compliant. If strict is True then raise if +- no Name or Version are provided""" +- self.set_metadata_version() +- +- # XXX should check the versions (if the file was loaded) +- missing, warnings = [], [] +- +- for attr in ('Name', 'Version'): # required by PEP 345 +- if attr not in self: +- missing.append(attr) +- +- if strict and missing != []: +- msg = 'missing required metadata: %s' % ', '.join(missing) +- raise MetadataMissingError(msg) +- +- for attr in ('Home-page', 'Author'): +- if attr not in self: +- missing.append(attr) +- +- # checking metadata 1.2 (XXX needs to check 1.1, 1.0) +- if self['Metadata-Version'] != '1.2': +- return missing, warnings +- +- scheme = get_scheme(self.scheme) +- +- def are_valid_constraints(value): +- for v in value: +- if not scheme.is_valid_matcher(v.split(';')[0]): +- return False +- return True +- +- for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), +- (_VERSIONS_FIELDS, +- scheme.is_valid_constraint_list), +- (_VERSION_FIELDS, +- scheme.is_valid_version)): +- for field in fields: +- value = self.get(field, None) +- if value is not None and not controller(value): +- warnings.append("Wrong value for '%s': %s" % (field, value)) +- +- return missing, warnings +- +- def todict(self, skip_missing=False): +- """Return fields as a dict. +- +- Field names will be converted to use the underscore-lowercase style +- instead of hyphen-mixed case (i.e. home_page instead of Home-page). +- """ +- self.set_metadata_version() +- +- mapping_1_0 = ( +- ('metadata_version', 'Metadata-Version'), +- ('name', 'Name'), +- ('version', 'Version'), +- ('summary', 'Summary'), +- ('home_page', 'Home-page'), +- ('author', 'Author'), +- ('author_email', 'Author-email'), +- ('license', 'License'), +- ('description', 'Description'), +- ('keywords', 'Keywords'), +- ('platform', 'Platform'), +- ('classifiers', 'Classifier'), +- ('download_url', 'Download-URL'), +- ) +- +- data = {} +- for key, field_name in mapping_1_0: +- if not skip_missing or field_name in self._fields: +- data[key] = self[field_name] +- +- if self['Metadata-Version'] == '1.2': +- mapping_1_2 = ( +- ('requires_dist', 'Requires-Dist'), +- ('requires_python', 'Requires-Python'), +- ('requires_external', 'Requires-External'), +- ('provides_dist', 'Provides-Dist'), +- ('obsoletes_dist', 'Obsoletes-Dist'), +- ('project_url', 'Project-URL'), +- ('maintainer', 'Maintainer'), +- ('maintainer_email', 'Maintainer-email'), +- ) +- for key, field_name in mapping_1_2: +- if not skip_missing or field_name in self._fields: +- if key != 'project_url': +- data[key] = self[field_name] +- else: +- data[key] = [','.join(u) for u in self[field_name]] +- +- elif self['Metadata-Version'] == '1.1': +- mapping_1_1 = ( +- ('provides', 'Provides'), +- ('requires', 'Requires'), +- ('obsoletes', 'Obsoletes'), +- ) +- for key, field_name in mapping_1_1: +- if not skip_missing or field_name in self._fields: +- data[key] = self[field_name] +- +- return data +- +- def add_requirements(self, requirements): +- if self['Metadata-Version'] == '1.1': +- # we can't have 1.1 metadata *and* Setuptools requires +- for field in ('Obsoletes', 'Requires', 'Provides'): +- if field in self: +- del self[field] +- self['Requires-Dist'] += requirements +- +- # Mapping API +- # TODO could add iter* variants +- +- def keys(self): +- return list(_version2fieldlist(self['Metadata-Version'])) +- +- def __iter__(self): +- for key in self.keys(): +- yield key +- +- def values(self): +- return [self[key] for key in self.keys()] +- +- def items(self): +- return [(key, self[key]) for key in self.keys()] +- +- def __repr__(self): +- return '<%s %s %s>' % (self.__class__.__name__, self.name, +- self.version) +- +- +-METADATA_FILENAME = 'pydist.json' +-WHEEL_METADATA_FILENAME = 'metadata.json' +- +- +-class Metadata(object): +- """ +- The metadata of a release. This implementation uses 2.0 (JSON) +- metadata where possible. If not possible, it wraps a LegacyMetadata +- instance which handles the key-value metadata format. +- """ +- +- METADATA_VERSION_MATCHER = re.compile('^\d+(\.\d+)*$') +- +- NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) +- +- VERSION_MATCHER = PEP440_VERSION_RE +- +- SUMMARY_MATCHER = re.compile('.{1,2047}') +- +- METADATA_VERSION = '2.0' +- +- GENERATOR = 'distlib (%s)' % __version__ +- +- MANDATORY_KEYS = { +- 'name': (), +- 'version': (), +- 'summary': ('legacy',), +- } +- +- INDEX_KEYS = ('name version license summary description author ' +- 'author_email keywords platform home_page classifiers ' +- 'download_url') +- +- DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' +- 'dev_requires provides meta_requires obsoleted_by ' +- 'supports_environments') +- +- SYNTAX_VALIDATORS = { +- 'metadata_version': (METADATA_VERSION_MATCHER, ()), +- 'name': (NAME_MATCHER, ('legacy',)), +- 'version': (VERSION_MATCHER, ('legacy',)), +- 'summary': (SUMMARY_MATCHER, ('legacy',)), +- } +- +- __slots__ = ('_legacy', '_data', 'scheme') +- +- def __init__(self, path=None, fileobj=None, mapping=None, +- scheme='default'): +- if [path, fileobj, mapping].count(None) < 2: +- raise TypeError('path, fileobj and mapping are exclusive') +- self._legacy = None +- self._data = None +- self.scheme = scheme +- #import pdb; pdb.set_trace() +- if mapping is not None: +- try: +- self._validate_mapping(mapping, scheme) +- self._data = mapping +- except MetadataUnrecognizedVersionError: +- self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) +- self.validate() +- else: +- data = None +- if path: +- with open(path, 'rb') as f: +- data = f.read() +- elif fileobj: +- data = fileobj.read() +- if data is None: +- # Initialised with no args - to be added +- self._data = { +- 'metadata_version': self.METADATA_VERSION, +- 'generator': self.GENERATOR, +- } +- else: +- if not isinstance(data, text_type): +- data = data.decode('utf-8') +- try: +- self._data = json.loads(data) +- self._validate_mapping(self._data, scheme) +- except ValueError: +- # Note: MetadataUnrecognizedVersionError does not +- # inherit from ValueError (it's a DistlibException, +- # which should not inherit from ValueError). +- # The ValueError comes from the json.load - if that +- # succeeds and we get a validation error, we want +- # that to propagate +- self._legacy = LegacyMetadata(fileobj=StringIO(data), +- scheme=scheme) +- self.validate() +- +- common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) +- +- none_list = (None, list) +- none_dict = (None, dict) +- +- mapped_keys = { +- 'run_requires': ('Requires-Dist', list), +- 'build_requires': ('Setup-Requires-Dist', list), +- 'dev_requires': none_list, +- 'test_requires': none_list, +- 'meta_requires': none_list, +- 'extras': ('Provides-Extra', list), +- 'modules': none_list, +- 'namespaces': none_list, +- 'exports': none_dict, +- 'commands': none_dict, +- 'classifiers': ('Classifier', list), +- 'source_url': ('Download-URL', None), +- 'metadata_version': ('Metadata-Version', None), +- } +- +- del none_list, none_dict +- +- def __getattribute__(self, key): +- common = object.__getattribute__(self, 'common_keys') +- mapped = object.__getattribute__(self, 'mapped_keys') +- if key in mapped: +- lk, maker = mapped[key] +- if self._legacy: +- if lk is None: +- result = None if maker is None else maker() +- else: +- result = self._legacy.get(lk) +- else: +- value = None if maker is None else maker() +- if key not in ('commands', 'exports', 'modules', 'namespaces', +- 'classifiers'): +- result = self._data.get(key, value) +- else: +- # special cases for PEP 459 +- sentinel = object() +- result = sentinel +- d = self._data.get('extensions') +- if d: +- if key == 'commands': +- result = d.get('python.commands', value) +- elif key == 'classifiers': +- d = d.get('python.details') +- if d: +- result = d.get(key, value) +- else: +- d = d.get('python.exports') +- if not d: +- d = self._data.get('python.exports') +- if d: +- result = d.get(key, value) +- if result is sentinel: +- result = value +- elif key not in common: +- result = object.__getattribute__(self, key) +- elif self._legacy: +- result = self._legacy.get(key) +- else: +- result = self._data.get(key) +- return result +- +- def _validate_value(self, key, value, scheme=None): +- if key in self.SYNTAX_VALIDATORS: +- pattern, exclusions = self.SYNTAX_VALIDATORS[key] +- if (scheme or self.scheme) not in exclusions: +- m = pattern.match(value) +- if not m: +- raise MetadataInvalidError("'%s' is an invalid value for " +- "the '%s' property" % (value, +- key)) +- +- def __setattr__(self, key, value): +- self._validate_value(key, value) +- common = object.__getattribute__(self, 'common_keys') +- mapped = object.__getattribute__(self, 'mapped_keys') +- if key in mapped: +- lk, _ = mapped[key] +- if self._legacy: +- if lk is None: +- raise NotImplementedError +- self._legacy[lk] = value +- elif key not in ('commands', 'exports', 'modules', 'namespaces', +- 'classifiers'): +- self._data[key] = value +- else: +- # special cases for PEP 459 +- d = self._data.setdefault('extensions', {}) +- if key == 'commands': +- d['python.commands'] = value +- elif key == 'classifiers': +- d = d.setdefault('python.details', {}) +- d[key] = value +- else: +- d = d.setdefault('python.exports', {}) +- d[key] = value +- elif key not in common: +- object.__setattr__(self, key, value) +- else: +- if key == 'keywords': +- if isinstance(value, string_types): +- value = value.strip() +- if value: +- value = value.split() +- else: +- value = [] +- if self._legacy: +- self._legacy[key] = value +- else: +- self._data[key] = value +- +- @property +- def name_and_version(self): +- return _get_name_and_version(self.name, self.version, True) +- +- @property +- def provides(self): +- if self._legacy: +- result = self._legacy['Provides-Dist'] +- else: +- result = self._data.setdefault('provides', []) +- s = '%s (%s)' % (self.name, self.version) +- if s not in result: +- result.append(s) +- return result +- +- @provides.setter +- def provides(self, value): +- if self._legacy: +- self._legacy['Provides-Dist'] = value +- else: +- self._data['provides'] = value +- +- def get_requirements(self, reqts, extras=None, env=None): +- """ +- Base method to get dependencies, given a set of extras +- to satisfy and an optional environment context. +- :param reqts: A list of sometimes-wanted dependencies, +- perhaps dependent on extras and environment. +- :param extras: A list of optional components being requested. +- :param env: An optional environment for marker evaluation. +- """ +- if self._legacy: +- result = reqts +- else: +- result = [] +- extras = get_extras(extras or [], self.extras) +- for d in reqts: +- if 'extra' not in d and 'environment' not in d: +- # unconditional +- include = True +- else: +- if 'extra' not in d: +- # Not extra-dependent - only environment-dependent +- include = True +- else: +- include = d.get('extra') in extras +- if include: +- # Not excluded because of extras, check environment +- marker = d.get('environment') +- if marker: +- include = interpret(marker, env) +- if include: +- result.extend(d['requires']) +- for key in ('build', 'dev', 'test'): +- e = ':%s:' % key +- if e in extras: +- extras.remove(e) +- # A recursive call, but it should terminate since 'test' +- # has been removed from the extras +- reqts = self._data.get('%s_requires' % key, []) +- result.extend(self.get_requirements(reqts, extras=extras, +- env=env)) +- return result +- +- @property +- def dictionary(self): +- if self._legacy: +- return self._from_legacy() +- return self._data +- +- @property +- def dependencies(self): +- if self._legacy: +- raise NotImplementedError +- else: +- return extract_by_key(self._data, self.DEPENDENCY_KEYS) +- +- @dependencies.setter +- def dependencies(self, value): +- if self._legacy: +- raise NotImplementedError +- else: +- self._data.update(value) +- +- def _validate_mapping(self, mapping, scheme): +- if mapping.get('metadata_version') != self.METADATA_VERSION: +- raise MetadataUnrecognizedVersionError() +- missing = [] +- for key, exclusions in self.MANDATORY_KEYS.items(): +- if key not in mapping: +- if scheme not in exclusions: +- missing.append(key) +- if missing: +- msg = 'Missing metadata items: %s' % ', '.join(missing) +- raise MetadataMissingError(msg) +- for k, v in mapping.items(): +- self._validate_value(k, v, scheme) +- +- def validate(self): +- if self._legacy: +- missing, warnings = self._legacy.check(True) +- if missing or warnings: +- logger.warning('Metadata: missing: %s, warnings: %s', +- missing, warnings) +- else: +- self._validate_mapping(self._data, self.scheme) +- +- def todict(self): +- if self._legacy: +- return self._legacy.todict(True) +- else: +- result = extract_by_key(self._data, self.INDEX_KEYS) +- return result +- +- def _from_legacy(self): +- assert self._legacy and not self._data +- result = { +- 'metadata_version': self.METADATA_VERSION, +- 'generator': self.GENERATOR, +- } +- lmd = self._legacy.todict(True) # skip missing ones +- for k in ('name', 'version', 'license', 'summary', 'description', +- 'classifier'): +- if k in lmd: +- if k == 'classifier': +- nk = 'classifiers' +- else: +- nk = k +- result[nk] = lmd[k] +- kw = lmd.get('Keywords', []) +- if kw == ['']: +- kw = [] +- result['keywords'] = kw +- keys = (('requires_dist', 'run_requires'), +- ('setup_requires_dist', 'build_requires')) +- for ok, nk in keys: +- if ok in lmd and lmd[ok]: +- result[nk] = [{'requires': lmd[ok]}] +- result['provides'] = self.provides +- author = {} +- maintainer = {} +- return result +- +- LEGACY_MAPPING = { +- 'name': 'Name', +- 'version': 'Version', +- 'license': 'License', +- 'summary': 'Summary', +- 'description': 'Description', +- 'classifiers': 'Classifier', +- } +- +- def _to_legacy(self): +- def process_entries(entries): +- reqts = set() +- for e in entries: +- extra = e.get('extra') +- env = e.get('environment') +- rlist = e['requires'] +- for r in rlist: +- if not env and not extra: +- reqts.add(r) +- else: +- marker = '' +- if extra: +- marker = 'extra == "%s"' % extra +- if env: +- if marker: +- marker = '(%s) and %s' % (env, marker) +- else: +- marker = env +- reqts.add(';'.join((r, marker))) +- return reqts +- +- assert self._data and not self._legacy +- result = LegacyMetadata() +- nmd = self._data +- for nk, ok in self.LEGACY_MAPPING.items(): +- if nk in nmd: +- result[ok] = nmd[nk] +- r1 = process_entries(self.run_requires + self.meta_requires) +- r2 = process_entries(self.build_requires + self.dev_requires) +- if self.extras: +- result['Provides-Extra'] = sorted(self.extras) +- result['Requires-Dist'] = sorted(r1) +- result['Setup-Requires-Dist'] = sorted(r2) +- # TODO: other fields such as contacts +- return result +- +- def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): +- if [path, fileobj].count(None) != 1: +- raise ValueError('Exactly one of path and fileobj is needed') +- self.validate() +- if legacy: +- if self._legacy: +- legacy_md = self._legacy +- else: +- legacy_md = self._to_legacy() +- if path: +- legacy_md.write(path, skip_unknown=skip_unknown) +- else: +- legacy_md.write_file(fileobj, skip_unknown=skip_unknown) +- else: +- if self._legacy: +- d = self._from_legacy() +- else: +- d = self._data +- if fileobj: +- json.dump(d, fileobj, ensure_ascii=True, indent=2, +- sort_keys=True) +- else: +- with codecs.open(path, 'w', 'utf-8') as f: +- json.dump(d, f, ensure_ascii=True, indent=2, +- sort_keys=True) +- +- def add_requirements(self, requirements): +- if self._legacy: +- self._legacy.add_requirements(requirements) +- else: +- run_requires = self._data.setdefault('run_requires', []) +- always = None +- for entry in run_requires: +- if 'environment' not in entry and 'extra' not in entry: +- always = entry +- break +- if always is None: +- always = { 'requires': requirements } +- run_requires.insert(0, always) +- else: +- rset = set(always['requires']) | set(requirements) +- always['requires'] = sorted(rset) +- +- def __repr__(self): +- name = self.name or '(no name)' +- version = self.version or 'no version' +- return '<%s %s %s (%s)>' % (self.__class__.__name__, +- self.metadata_version, name, version) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/resources.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/resources.py +deleted file mode 100644 +index f07cde2..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/resources.py ++++ /dev/null +@@ -1,355 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2013-2016 Vinay Sajip. +-# Licensed to the Python Software Foundation under a contributor agreement. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-from __future__ import unicode_literals +- +-import bisect +-import io +-import logging +-import os +-import pkgutil +-import shutil +-import sys +-import types +-import zipimport +- +-from . import DistlibException +-from .util import cached_property, get_cache_base, path_to_cache_dir, Cache +- +-logger = logging.getLogger(__name__) +- +- +-cache = None # created when needed +- +- +-class ResourceCache(Cache): +- def __init__(self, base=None): +- if base is None: +- # Use native string to avoid issues on 2.x: see Python #20140. +- base = os.path.join(get_cache_base(), str('resource-cache')) +- super(ResourceCache, self).__init__(base) +- +- def is_stale(self, resource, path): +- """ +- Is the cache stale for the given resource? +- +- :param resource: The :class:`Resource` being cached. +- :param path: The path of the resource in the cache. +- :return: True if the cache is stale. +- """ +- # Cache invalidation is a hard problem :-) +- return True +- +- def get(self, resource): +- """ +- Get a resource into the cache, +- +- :param resource: A :class:`Resource` instance. +- :return: The pathname of the resource in the cache. +- """ +- prefix, path = resource.finder.get_cache_info(resource) +- if prefix is None: +- result = path +- else: +- result = os.path.join(self.base, self.prefix_to_dir(prefix), path) +- dirname = os.path.dirname(result) +- if not os.path.isdir(dirname): +- os.makedirs(dirname) +- if not os.path.exists(result): +- stale = True +- else: +- stale = self.is_stale(resource, path) +- if stale: +- # write the bytes of the resource to the cache location +- with open(result, 'wb') as f: +- f.write(resource.bytes) +- return result +- +- +-class ResourceBase(object): +- def __init__(self, finder, name): +- self.finder = finder +- self.name = name +- +- +-class Resource(ResourceBase): +- """ +- A class representing an in-package resource, such as a data file. This is +- not normally instantiated by user code, but rather by a +- :class:`ResourceFinder` which manages the resource. +- """ +- is_container = False # Backwards compatibility +- +- def as_stream(self): +- """ +- Get the resource as a stream. +- +- This is not a property to make it obvious that it returns a new stream +- each time. +- """ +- return self.finder.get_stream(self) +- +- @cached_property +- def file_path(self): +- global cache +- if cache is None: +- cache = ResourceCache() +- return cache.get(self) +- +- @cached_property +- def bytes(self): +- return self.finder.get_bytes(self) +- +- @cached_property +- def size(self): +- return self.finder.get_size(self) +- +- +-class ResourceContainer(ResourceBase): +- is_container = True # Backwards compatibility +- +- @cached_property +- def resources(self): +- return self.finder.get_resources(self) +- +- +-class ResourceFinder(object): +- """ +- Resource finder for file system resources. +- """ +- +- if sys.platform.startswith('java'): +- skipped_extensions = ('.pyc', '.pyo', '.class') +- else: +- skipped_extensions = ('.pyc', '.pyo') +- +- def __init__(self, module): +- self.module = module +- self.loader = getattr(module, '__loader__', None) +- self.base = os.path.dirname(getattr(module, '__file__', '')) +- +- def _adjust_path(self, path): +- return os.path.realpath(path) +- +- def _make_path(self, resource_name): +- # Issue #50: need to preserve type of path on Python 2.x +- # like os.path._get_sep +- if isinstance(resource_name, bytes): # should only happen on 2.x +- sep = b'/' +- else: +- sep = '/' +- parts = resource_name.split(sep) +- parts.insert(0, self.base) +- result = os.path.join(*parts) +- return self._adjust_path(result) +- +- def _find(self, path): +- return os.path.exists(path) +- +- def get_cache_info(self, resource): +- return None, resource.path +- +- def find(self, resource_name): +- path = self._make_path(resource_name) +- if not self._find(path): +- result = None +- else: +- if self._is_directory(path): +- result = ResourceContainer(self, resource_name) +- else: +- result = Resource(self, resource_name) +- result.path = path +- return result +- +- def get_stream(self, resource): +- return open(resource.path, 'rb') +- +- def get_bytes(self, resource): +- with open(resource.path, 'rb') as f: +- return f.read() +- +- def get_size(self, resource): +- return os.path.getsize(resource.path) +- +- def get_resources(self, resource): +- def allowed(f): +- return (f != '__pycache__' and not +- f.endswith(self.skipped_extensions)) +- return set([f for f in os.listdir(resource.path) if allowed(f)]) +- +- def is_container(self, resource): +- return self._is_directory(resource.path) +- +- _is_directory = staticmethod(os.path.isdir) +- +- def iterator(self, resource_name): +- resource = self.find(resource_name) +- if resource is not None: +- todo = [resource] +- while todo: +- resource = todo.pop(0) +- yield resource +- if resource.is_container: +- rname = resource.name +- for name in resource.resources: +- if not rname: +- new_name = name +- else: +- new_name = '/'.join([rname, name]) +- child = self.find(new_name) +- if child.is_container: +- todo.append(child) +- else: +- yield child +- +- +-class ZipResourceFinder(ResourceFinder): +- """ +- Resource finder for resources in .zip files. +- """ +- def __init__(self, module): +- super(ZipResourceFinder, self).__init__(module) +- archive = self.loader.archive +- self.prefix_len = 1 + len(archive) +- # PyPy doesn't have a _files attr on zipimporter, and you can't set one +- if hasattr(self.loader, '_files'): +- self._files = self.loader._files +- else: +- self._files = zipimport._zip_directory_cache[archive] +- self.index = sorted(self._files) +- +- def _adjust_path(self, path): +- return path +- +- def _find(self, path): +- path = path[self.prefix_len:] +- if path in self._files: +- result = True +- else: +- if path and path[-1] != os.sep: +- path = path + os.sep +- i = bisect.bisect(self.index, path) +- try: +- result = self.index[i].startswith(path) +- except IndexError: +- result = False +- if not result: +- logger.debug('_find failed: %r %r', path, self.loader.prefix) +- else: +- logger.debug('_find worked: %r %r', path, self.loader.prefix) +- return result +- +- def get_cache_info(self, resource): +- prefix = self.loader.archive +- path = resource.path[1 + len(prefix):] +- return prefix, path +- +- def get_bytes(self, resource): +- return self.loader.get_data(resource.path) +- +- def get_stream(self, resource): +- return io.BytesIO(self.get_bytes(resource)) +- +- def get_size(self, resource): +- path = resource.path[self.prefix_len:] +- return self._files[path][3] +- +- def get_resources(self, resource): +- path = resource.path[self.prefix_len:] +- if path and path[-1] != os.sep: +- path += os.sep +- plen = len(path) +- result = set() +- i = bisect.bisect(self.index, path) +- while i < len(self.index): +- if not self.index[i].startswith(path): +- break +- s = self.index[i][plen:] +- result.add(s.split(os.sep, 1)[0]) # only immediate children +- i += 1 +- return result +- +- def _is_directory(self, path): +- path = path[self.prefix_len:] +- if path and path[-1] != os.sep: +- path += os.sep +- i = bisect.bisect(self.index, path) +- try: +- result = self.index[i].startswith(path) +- except IndexError: +- result = False +- return result +- +-_finder_registry = { +- type(None): ResourceFinder, +- zipimport.zipimporter: ZipResourceFinder +-} +- +-try: +- # In Python 3.6, _frozen_importlib -> _frozen_importlib_external +- try: +- import _frozen_importlib_external as _fi +- except ImportError: +- import _frozen_importlib as _fi +- _finder_registry[_fi.SourceFileLoader] = ResourceFinder +- _finder_registry[_fi.FileFinder] = ResourceFinder +- del _fi +-except (ImportError, AttributeError): +- pass +- +- +-def register_finder(loader, finder_maker): +- _finder_registry[type(loader)] = finder_maker +- +-_finder_cache = {} +- +- +-def finder(package): +- """ +- Return a resource finder for a package. +- :param package: The name of the package. +- :return: A :class:`ResourceFinder` instance for the package. +- """ +- if package in _finder_cache: +- result = _finder_cache[package] +- else: +- if package not in sys.modules: +- __import__(package) +- module = sys.modules[package] +- path = getattr(module, '__path__', None) +- if path is None: +- raise DistlibException('You cannot get a finder for a module, ' +- 'only for a package') +- loader = getattr(module, '__loader__', None) +- finder_maker = _finder_registry.get(type(loader)) +- if finder_maker is None: +- raise DistlibException('Unable to locate finder for %r' % package) +- result = finder_maker(module) +- _finder_cache[package] = result +- return result +- +- +-_dummy_module = types.ModuleType(str('__dummy__')) +- +- +-def finder_for_path(path): +- """ +- Return a resource finder for a path, which should represent a container. +- +- :param path: The path. +- :return: A :class:`ResourceFinder` instance for the path. +- """ +- result = None +- # calls any path hooks, gets importer into cache +- pkgutil.get_importer(path) +- loader = sys.path_importer_cache.get(path) +- finder = _finder_registry.get(type(loader)) +- if finder: +- module = _dummy_module +- module.__file__ = os.path.join(path, '') +- module.__loader__ = loader +- result = finder(module) +- return result +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/scripts.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/scripts.py +deleted file mode 100644 +index 792fc2e..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/scripts.py ++++ /dev/null +@@ -1,384 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2013-2015 Vinay Sajip. +-# Licensed to the Python Software Foundation under a contributor agreement. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-from io import BytesIO +-import logging +-import os +-import re +-import struct +-import sys +- +-from .compat import sysconfig, detect_encoding, ZipFile +-from .resources import finder +-from .util import (FileOperator, get_export_entry, convert_path, +- get_executable, in_venv) +- +-logger = logging.getLogger(__name__) +- +-_DEFAULT_MANIFEST = ''' +- +- +- +- +- +- +- +- +- +- +- +- +-'''.strip() +- +-# check if Python is called on the first line with this expression +-FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +-SCRIPT_TEMPLATE = '''# -*- coding: utf-8 -*- +-if __name__ == '__main__': +- import sys, re +- +- def _resolve(module, func): +- __import__(module) +- mod = sys.modules[module] +- parts = func.split('.') +- result = getattr(mod, parts.pop(0)) +- for p in parts: +- result = getattr(result, p) +- return result +- +- try: +- sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) +- +- func = _resolve('%(module)s', '%(func)s') +- rc = func() # None interpreted as 0 +- except Exception as e: # only supporting Python >= 2.6 +- sys.stderr.write('%%s\\n' %% e) +- rc = 1 +- sys.exit(rc) +-''' +- +- +-def _enquote_executable(executable): +- if ' ' in executable: +- # make sure we quote only the executable in case of env +- # for example /usr/bin/env "/dir with spaces/bin/jython" +- # instead of "/usr/bin/env /dir with spaces/bin/jython" +- # otherwise whole +- if executable.startswith('/usr/bin/env '): +- env, _executable = executable.split(' ', 1) +- if ' ' in _executable and not _executable.startswith('"'): +- executable = '%s "%s"' % (env, _executable) +- else: +- if not executable.startswith('"'): +- executable = '"%s"' % executable +- return executable +- +- +-class ScriptMaker(object): +- """ +- A class to copy or create scripts from source scripts or callable +- specifications. +- """ +- script_template = SCRIPT_TEMPLATE +- +- executable = None # for shebangs +- +- def __init__(self, source_dir, target_dir, add_launchers=True, +- dry_run=False, fileop=None): +- self.source_dir = source_dir +- self.target_dir = target_dir +- self.add_launchers = add_launchers +- self.force = False +- self.clobber = False +- # It only makes sense to set mode bits on POSIX. +- self.set_mode = (os.name == 'posix') or (os.name == 'java' and +- os._name == 'posix') +- self.variants = set(('', 'X.Y')) +- self._fileop = fileop or FileOperator(dry_run) +- +- self._is_nt = os.name == 'nt' or ( +- os.name == 'java' and os._name == 'nt') +- +- def _get_alternate_executable(self, executable, options): +- if options.get('gui', False) and self._is_nt: # pragma: no cover +- dn, fn = os.path.split(executable) +- fn = fn.replace('python', 'pythonw') +- executable = os.path.join(dn, fn) +- return executable +- +- if sys.platform.startswith('java'): # pragma: no cover +- def _is_shell(self, executable): +- """ +- Determine if the specified executable is a script +- (contains a #! line) +- """ +- try: +- with open(executable) as fp: +- return fp.read(2) == '#!' +- except (OSError, IOError): +- logger.warning('Failed to open %s', executable) +- return False +- +- def _fix_jython_executable(self, executable): +- if self._is_shell(executable): +- # Workaround for Jython is not needed on Linux systems. +- import java +- +- if java.lang.System.getProperty('os.name') == 'Linux': +- return executable +- elif executable.lower().endswith('jython.exe'): +- # Use wrapper exe for Jython on Windows +- return executable +- return '/usr/bin/env %s' % executable +- +- def _get_shebang(self, encoding, post_interp=b'', options=None): +- enquote = True +- if self.executable: +- executable = self.executable +- enquote = False # assume this will be taken care of +- elif not sysconfig.is_python_build(): +- executable = get_executable() +- elif in_venv(): # pragma: no cover +- executable = os.path.join(sysconfig.get_path('scripts'), +- 'python%s' % sysconfig.get_config_var('EXE')) +- else: # pragma: no cover +- executable = os.path.join( +- sysconfig.get_config_var('BINDIR'), +- 'python%s%s' % (sysconfig.get_config_var('VERSION'), +- sysconfig.get_config_var('EXE'))) +- if options: +- executable = self._get_alternate_executable(executable, options) +- +- if sys.platform.startswith('java'): # pragma: no cover +- executable = self._fix_jython_executable(executable) +- # Normalise case for Windows +- executable = os.path.normcase(executable) +- # If the user didn't specify an executable, it may be necessary to +- # cater for executable paths with spaces (not uncommon on Windows) +- if enquote: +- executable = _enquote_executable(executable) +- # Issue #51: don't use fsencode, since we later try to +- # check that the shebang is decodable using utf-8. +- executable = executable.encode('utf-8') +- # in case of IronPython, play safe and enable frames support +- if (sys.platform == 'cli' and '-X:Frames' not in post_interp +- and '-X:FullFrames' not in post_interp): # pragma: no cover +- post_interp += b' -X:Frames' +- shebang = b'#!' + executable + post_interp + b'\n' +- # Python parser starts to read a script using UTF-8 until +- # it gets a #coding:xxx cookie. The shebang has to be the +- # first line of a file, the #coding:xxx cookie cannot be +- # written before. So the shebang has to be decodable from +- # UTF-8. +- try: +- shebang.decode('utf-8') +- except UnicodeDecodeError: # pragma: no cover +- raise ValueError( +- 'The shebang (%r) is not decodable from utf-8' % shebang) +- # If the script is encoded to a custom encoding (use a +- # #coding:xxx cookie), the shebang has to be decodable from +- # the script encoding too. +- if encoding != 'utf-8': +- try: +- shebang.decode(encoding) +- except UnicodeDecodeError: # pragma: no cover +- raise ValueError( +- 'The shebang (%r) is not decodable ' +- 'from the script encoding (%r)' % (shebang, encoding)) +- return shebang +- +- def _get_script_text(self, entry): +- return self.script_template % dict(module=entry.prefix, +- func=entry.suffix) +- +- manifest = _DEFAULT_MANIFEST +- +- def get_manifest(self, exename): +- base = os.path.basename(exename) +- return self.manifest % base +- +- def _write_script(self, names, shebang, script_bytes, filenames, ext): +- use_launcher = self.add_launchers and self._is_nt +- linesep = os.linesep.encode('utf-8') +- if not use_launcher: +- script_bytes = shebang + linesep + script_bytes +- else: # pragma: no cover +- if ext == 'py': +- launcher = self._get_launcher('t') +- else: +- launcher = self._get_launcher('w') +- stream = BytesIO() +- with ZipFile(stream, 'w') as zf: +- zf.writestr('__main__.py', script_bytes) +- zip_data = stream.getvalue() +- script_bytes = launcher + shebang + linesep + zip_data +- for name in names: +- outname = os.path.join(self.target_dir, name) +- if use_launcher: # pragma: no cover +- n, e = os.path.splitext(outname) +- if e.startswith('.py'): +- outname = n +- outname = '%s.exe' % outname +- try: +- self._fileop.write_binary_file(outname, script_bytes) +- except Exception: +- # Failed writing an executable - it might be in use. +- logger.warning('Failed to write executable - trying to ' +- 'use .deleteme logic') +- dfname = '%s.deleteme' % outname +- if os.path.exists(dfname): +- os.remove(dfname) # Not allowed to fail here +- os.rename(outname, dfname) # nor here +- self._fileop.write_binary_file(outname, script_bytes) +- logger.debug('Able to replace executable using ' +- '.deleteme logic') +- try: +- os.remove(dfname) +- except Exception: +- pass # still in use - ignore error +- else: +- if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover +- outname = '%s.%s' % (outname, ext) +- if os.path.exists(outname) and not self.clobber: +- logger.warning('Skipping existing file %s', outname) +- continue +- self._fileop.write_binary_file(outname, script_bytes) +- if self.set_mode: +- self._fileop.set_executable_mode([outname]) +- filenames.append(outname) +- +- def _make_script(self, entry, filenames, options=None): +- post_interp = b'' +- if options: +- args = options.get('interpreter_args', []) +- if args: +- args = ' %s' % ' '.join(args) +- post_interp = args.encode('utf-8') +- shebang = self._get_shebang('utf-8', post_interp, options=options) +- script = self._get_script_text(entry).encode('utf-8') +- name = entry.name +- scriptnames = set() +- if '' in self.variants: +- scriptnames.add(name) +- if 'X' in self.variants: +- scriptnames.add('%s%s' % (name, sys.version[0])) +- if 'X.Y' in self.variants: +- scriptnames.add('%s-%s' % (name, sys.version[:3])) +- if options and options.get('gui', False): +- ext = 'pyw' +- else: +- ext = 'py' +- self._write_script(scriptnames, shebang, script, filenames, ext) +- +- def _copy_script(self, script, filenames): +- adjust = False +- script = os.path.join(self.source_dir, convert_path(script)) +- outname = os.path.join(self.target_dir, os.path.basename(script)) +- if not self.force and not self._fileop.newer(script, outname): +- logger.debug('not copying %s (up-to-date)', script) +- return +- +- # Always open the file, but ignore failures in dry-run mode -- +- # that way, we'll get accurate feedback if we can read the +- # script. +- try: +- f = open(script, 'rb') +- except IOError: # pragma: no cover +- if not self.dry_run: +- raise +- f = None +- else: +- first_line = f.readline() +- if not first_line: # pragma: no cover +- logger.warning('%s: %s is an empty file (skipping)', +- self.get_command_name(), script) +- return +- +- match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) +- if match: +- adjust = True +- post_interp = match.group(1) or b'' +- +- if not adjust: +- if f: +- f.close() +- self._fileop.copy_file(script, outname) +- if self.set_mode: +- self._fileop.set_executable_mode([outname]) +- filenames.append(outname) +- else: +- logger.info('copying and adjusting %s -> %s', script, +- self.target_dir) +- if not self._fileop.dry_run: +- encoding, lines = detect_encoding(f.readline) +- f.seek(0) +- shebang = self._get_shebang(encoding, post_interp) +- if b'pythonw' in first_line: # pragma: no cover +- ext = 'pyw' +- else: +- ext = 'py' +- n = os.path.basename(outname) +- self._write_script([n], shebang, f.read(), filenames, ext) +- if f: +- f.close() +- +- @property +- def dry_run(self): +- return self._fileop.dry_run +- +- @dry_run.setter +- def dry_run(self, value): +- self._fileop.dry_run = value +- +- if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover +- # Executable launcher support. +- # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ +- +- def _get_launcher(self, kind): +- if struct.calcsize('P') == 8: # 64-bit +- bits = '64' +- else: +- bits = '32' +- name = '%s%s.exe' % (kind, bits) +- # Issue 31: don't hardcode an absolute package name, but +- # determine it relative to the current package +- distlib_package = __name__.rsplit('.', 1)[0] +- result = finder(distlib_package).find(name).bytes +- return result +- +- # Public API follows +- +- def make(self, specification, options=None): +- """ +- Make a script. +- +- :param specification: The specification, which is either a valid export +- entry specification (to make a script from a +- callable) or a filename (to make a script by +- copying from a source location). +- :param options: A dictionary of options controlling script generation. +- :return: A list of all absolute pathnames written to. +- """ +- filenames = [] +- entry = get_export_entry(specification) +- if entry is None: +- self._copy_script(specification, filenames) +- else: +- self._make_script(entry, filenames, options=options) +- return filenames +- +- def make_multiple(self, specifications, options=None): +- """ +- Take a list of specifications and make scripts from them, +- :param specifications: A list of specifications. +- :return: A list of all absolute pathnames written to, +- """ +- filenames = [] +- for specification in specifications: +- filenames.extend(self.make(specification, options)) +- return filenames +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/t32.exe b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/t32.exe +deleted file mode 100644 +index 836211d..0000000 +Binary files a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/t32.exe and /dev/null differ +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/t64.exe b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/t64.exe +deleted file mode 100644 +index a401b59..0000000 +Binary files a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/t64.exe and /dev/null differ +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/util.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/util.py +deleted file mode 100644 +index aadc874..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/util.py ++++ /dev/null +@@ -1,1611 +0,0 @@ +-# +-# Copyright (C) 2012-2016 The Python Software Foundation. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-import codecs +-from collections import deque +-import contextlib +-import csv +-from glob import iglob as std_iglob +-import io +-import json +-import logging +-import os +-import py_compile +-import re +-import shutil +-import socket +-try: +- import ssl +-except ImportError: # pragma: no cover +- ssl = None +-import subprocess +-import sys +-import tarfile +-import tempfile +-import textwrap +- +-try: +- import threading +-except ImportError: # pragma: no cover +- import dummy_threading as threading +-import time +- +-from . import DistlibException +-from .compat import (string_types, text_type, shutil, raw_input, StringIO, +- cache_from_source, urlopen, urljoin, httplib, xmlrpclib, +- splittype, HTTPHandler, BaseConfigurator, valid_ident, +- Container, configparser, URLError, ZipFile, fsdecode, +- unquote) +- +-logger = logging.getLogger(__name__) +- +-# +-# Requirement parsing code for name + optional constraints + optional extras +-# +-# e.g. 'foo >= 1.2, < 2.0 [bar, baz]' +-# +-# The regex can seem a bit hairy, so we build it up out of smaller pieces +-# which are manageable. +-# +- +-COMMA = r'\s*,\s*' +-COMMA_RE = re.compile(COMMA) +- +-IDENT = r'(\w|[.-])+' +-EXTRA_IDENT = r'(\*|:(\*|\w+):|' + IDENT + ')' +-VERSPEC = IDENT + r'\*?' +- +-RELOP = '([<>=!~]=)|[<>]' +- +-# +-# The first relop is optional - if absent, will be taken as '~=' +-# +-BARE_CONSTRAINTS = ('(' + RELOP + r')?\s*(' + VERSPEC + ')(' + COMMA + '(' + +- RELOP + r')\s*(' + VERSPEC + '))*') +- +-DIRECT_REF = '(from\s+(?P.*))' +- +-# +-# Either the bare constraints or the bare constraints in parentheses +-# +-CONSTRAINTS = (r'\(\s*(?P' + BARE_CONSTRAINTS + '|' + DIRECT_REF + +- r')\s*\)|(?P' + BARE_CONSTRAINTS + '\s*)') +- +-EXTRA_LIST = EXTRA_IDENT + '(' + COMMA + EXTRA_IDENT + ')*' +-EXTRAS = r'\[\s*(?P' + EXTRA_LIST + r')?\s*\]' +-REQUIREMENT = ('(?P' + IDENT + r')\s*(' + EXTRAS + r'\s*)?(\s*' + +- CONSTRAINTS + ')?$') +-REQUIREMENT_RE = re.compile(REQUIREMENT) +- +-# +-# Used to scan through the constraints +-# +-RELOP_IDENT = '(?P' + RELOP + r')\s*(?P' + VERSPEC + ')' +-RELOP_IDENT_RE = re.compile(RELOP_IDENT) +- +-def parse_requirement(s): +- +- def get_constraint(m): +- d = m.groupdict() +- return d['op'], d['vn'] +- +- result = None +- m = REQUIREMENT_RE.match(s) +- if m: +- d = m.groupdict() +- name = d['dn'] +- cons = d['c1'] or d['c2'] +- if not d['diref']: +- url = None +- else: +- # direct reference +- cons = None +- url = d['diref'].strip() +- if not cons: +- cons = None +- constr = '' +- rs = d['dn'] +- else: +- if cons[0] not in '<>!=': +- cons = '~=' + cons +- iterator = RELOP_IDENT_RE.finditer(cons) +- cons = [get_constraint(m) for m in iterator] +- rs = '%s (%s)' % (name, ', '.join(['%s %s' % con for con in cons])) +- if not d['ex']: +- extras = None +- else: +- extras = COMMA_RE.split(d['ex']) +- result = Container(name=name, constraints=cons, extras=extras, +- requirement=rs, source=s, url=url) +- return result +- +- +-def get_resources_dests(resources_root, rules): +- """Find destinations for resources files""" +- +- def get_rel_path(base, path): +- # normalizes and returns a lstripped-/-separated path +- base = base.replace(os.path.sep, '/') +- path = path.replace(os.path.sep, '/') +- assert path.startswith(base) +- return path[len(base):].lstrip('/') +- +- +- destinations = {} +- for base, suffix, dest in rules: +- prefix = os.path.join(resources_root, base) +- for abs_base in iglob(prefix): +- abs_glob = os.path.join(abs_base, suffix) +- for abs_path in iglob(abs_glob): +- resource_file = get_rel_path(resources_root, abs_path) +- if dest is None: # remove the entry if it was here +- destinations.pop(resource_file, None) +- else: +- rel_path = get_rel_path(abs_base, abs_path) +- rel_dest = dest.replace(os.path.sep, '/').rstrip('/') +- destinations[resource_file] = rel_dest + '/' + rel_path +- return destinations +- +- +-def in_venv(): +- if hasattr(sys, 'real_prefix'): +- # virtualenv venvs +- result = True +- else: +- # PEP 405 venvs +- result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) +- return result +- +- +-def get_executable(): +-# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as +-# changes to the stub launcher mean that sys.executable always points +-# to the stub on macOS +-# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' +-# in os.environ): +-# result = os.environ['__PYVENV_LAUNCHER__'] +-# else: +-# result = sys.executable +-# return result +- result = os.path.normcase(sys.executable) +- if not isinstance(result, text_type): +- result = fsdecode(result) +- return result +- +- +-def proceed(prompt, allowed_chars, error_prompt=None, default=None): +- p = prompt +- while True: +- s = raw_input(p) +- p = prompt +- if not s and default: +- s = default +- if s: +- c = s[0].lower() +- if c in allowed_chars: +- break +- if error_prompt: +- p = '%c: %s\n%s' % (c, error_prompt, prompt) +- return c +- +- +-def extract_by_key(d, keys): +- if isinstance(keys, string_types): +- keys = keys.split() +- result = {} +- for key in keys: +- if key in d: +- result[key] = d[key] +- return result +- +-def read_exports(stream): +- if sys.version_info[0] >= 3: +- # needs to be a text stream +- stream = codecs.getreader('utf-8')(stream) +- # Try to load as JSON, falling back on legacy format +- data = stream.read() +- stream = StringIO(data) +- try: +- jdata = json.load(stream) +- result = jdata['extensions']['python.exports']['exports'] +- for group, entries in result.items(): +- for k, v in entries.items(): +- s = '%s = %s' % (k, v) +- entry = get_export_entry(s) +- assert entry is not None +- entries[k] = entry +- return result +- except Exception: +- stream.seek(0, 0) +- +- def read_stream(cp, stream): +- if hasattr(cp, 'read_file'): +- cp.read_file(stream) +- else: +- cp.readfp(stream) +- +- cp = configparser.ConfigParser() +- try: +- read_stream(cp, stream) +- except configparser.MissingSectionHeaderError: +- stream.close() +- data = textwrap.dedent(data) +- stream = StringIO(data) +- read_stream(cp, stream) +- +- result = {} +- for key in cp.sections(): +- result[key] = entries = {} +- for name, value in cp.items(key): +- s = '%s = %s' % (name, value) +- entry = get_export_entry(s) +- assert entry is not None +- #entry.dist = self +- entries[name] = entry +- return result +- +- +-def write_exports(exports, stream): +- if sys.version_info[0] >= 3: +- # needs to be a text stream +- stream = codecs.getwriter('utf-8')(stream) +- cp = configparser.ConfigParser() +- for k, v in exports.items(): +- # TODO check k, v for valid values +- cp.add_section(k) +- for entry in v.values(): +- if entry.suffix is None: +- s = entry.prefix +- else: +- s = '%s:%s' % (entry.prefix, entry.suffix) +- if entry.flags: +- s = '%s [%s]' % (s, ', '.join(entry.flags)) +- cp.set(k, entry.name, s) +- cp.write(stream) +- +- +-@contextlib.contextmanager +-def tempdir(): +- td = tempfile.mkdtemp() +- try: +- yield td +- finally: +- shutil.rmtree(td) +- +-@contextlib.contextmanager +-def chdir(d): +- cwd = os.getcwd() +- try: +- os.chdir(d) +- yield +- finally: +- os.chdir(cwd) +- +- +-@contextlib.contextmanager +-def socket_timeout(seconds=15): +- cto = socket.getdefaulttimeout() +- try: +- socket.setdefaulttimeout(seconds) +- yield +- finally: +- socket.setdefaulttimeout(cto) +- +- +-class cached_property(object): +- def __init__(self, func): +- self.func = func +- #for attr in ('__name__', '__module__', '__doc__'): +- # setattr(self, attr, getattr(func, attr, None)) +- +- def __get__(self, obj, cls=None): +- if obj is None: +- return self +- value = self.func(obj) +- object.__setattr__(obj, self.func.__name__, value) +- #obj.__dict__[self.func.__name__] = value = self.func(obj) +- return value +- +-def convert_path(pathname): +- """Return 'pathname' as a name that will work on the native filesystem. +- +- The path is split on '/' and put back together again using the current +- directory separator. Needed because filenames in the setup script are +- always supplied in Unix style, and have to be converted to the local +- convention before we can actually use them in the filesystem. Raises +- ValueError on non-Unix-ish systems if 'pathname' either starts or +- ends with a slash. +- """ +- if os.sep == '/': +- return pathname +- if not pathname: +- return pathname +- if pathname[0] == '/': +- raise ValueError("path '%s' cannot be absolute" % pathname) +- if pathname[-1] == '/': +- raise ValueError("path '%s' cannot end with '/'" % pathname) +- +- paths = pathname.split('/') +- while os.curdir in paths: +- paths.remove(os.curdir) +- if not paths: +- return os.curdir +- return os.path.join(*paths) +- +- +-class FileOperator(object): +- def __init__(self, dry_run=False): +- self.dry_run = dry_run +- self.ensured = set() +- self._init_record() +- +- def _init_record(self): +- self.record = False +- self.files_written = set() +- self.dirs_created = set() +- +- def record_as_written(self, path): +- if self.record: +- self.files_written.add(path) +- +- def newer(self, source, target): +- """Tell if the target is newer than the source. +- +- Returns true if 'source' exists and is more recently modified than +- 'target', or if 'source' exists and 'target' doesn't. +- +- Returns false if both exist and 'target' is the same age or younger +- than 'source'. Raise PackagingFileError if 'source' does not exist. +- +- Note that this test is not very accurate: files created in the same +- second will have the same "age". +- """ +- if not os.path.exists(source): +- raise DistlibException("file '%r' does not exist" % +- os.path.abspath(source)) +- if not os.path.exists(target): +- return True +- +- return os.stat(source).st_mtime > os.stat(target).st_mtime +- +- def copy_file(self, infile, outfile, check=True): +- """Copy a file respecting dry-run and force flags. +- """ +- self.ensure_dir(os.path.dirname(outfile)) +- logger.info('Copying %s to %s', infile, outfile) +- if not self.dry_run: +- msg = None +- if check: +- if os.path.islink(outfile): +- msg = '%s is a symlink' % outfile +- elif os.path.exists(outfile) and not os.path.isfile(outfile): +- msg = '%s is a non-regular file' % outfile +- if msg: +- raise ValueError(msg + ' which would be overwritten') +- shutil.copyfile(infile, outfile) +- self.record_as_written(outfile) +- +- def copy_stream(self, instream, outfile, encoding=None): +- assert not os.path.isdir(outfile) +- self.ensure_dir(os.path.dirname(outfile)) +- logger.info('Copying stream %s to %s', instream, outfile) +- if not self.dry_run: +- if encoding is None: +- outstream = open(outfile, 'wb') +- else: +- outstream = codecs.open(outfile, 'w', encoding=encoding) +- try: +- shutil.copyfileobj(instream, outstream) +- finally: +- outstream.close() +- self.record_as_written(outfile) +- +- def write_binary_file(self, path, data): +- self.ensure_dir(os.path.dirname(path)) +- if not self.dry_run: +- with open(path, 'wb') as f: +- f.write(data) +- self.record_as_written(path) +- +- def write_text_file(self, path, data, encoding): +- self.ensure_dir(os.path.dirname(path)) +- if not self.dry_run: +- with open(path, 'wb') as f: +- f.write(data.encode(encoding)) +- self.record_as_written(path) +- +- def set_mode(self, bits, mask, files): +- if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): +- # Set the executable bits (owner, group, and world) on +- # all the files specified. +- for f in files: +- if self.dry_run: +- logger.info("changing mode of %s", f) +- else: +- mode = (os.stat(f).st_mode | bits) & mask +- logger.info("changing mode of %s to %o", f, mode) +- os.chmod(f, mode) +- +- set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) +- +- def ensure_dir(self, path): +- path = os.path.abspath(path) +- if path not in self.ensured and not os.path.exists(path): +- self.ensured.add(path) +- d, f = os.path.split(path) +- self.ensure_dir(d) +- logger.info('Creating %s' % path) +- if not self.dry_run: +- os.mkdir(path) +- if self.record: +- self.dirs_created.add(path) +- +- def byte_compile(self, path, optimize=False, force=False, prefix=None): +- dpath = cache_from_source(path, not optimize) +- logger.info('Byte-compiling %s to %s', path, dpath) +- if not self.dry_run: +- if force or self.newer(path, dpath): +- if not prefix: +- diagpath = None +- else: +- assert path.startswith(prefix) +- diagpath = path[len(prefix):] +- py_compile.compile(path, dpath, diagpath, True) # raise error +- self.record_as_written(dpath) +- return dpath +- +- def ensure_removed(self, path): +- if os.path.exists(path): +- if os.path.isdir(path) and not os.path.islink(path): +- logger.debug('Removing directory tree at %s', path) +- if not self.dry_run: +- shutil.rmtree(path) +- if self.record: +- if path in self.dirs_created: +- self.dirs_created.remove(path) +- else: +- if os.path.islink(path): +- s = 'link' +- else: +- s = 'file' +- logger.debug('Removing %s %s', s, path) +- if not self.dry_run: +- os.remove(path) +- if self.record: +- if path in self.files_written: +- self.files_written.remove(path) +- +- def is_writable(self, path): +- result = False +- while not result: +- if os.path.exists(path): +- result = os.access(path, os.W_OK) +- break +- parent = os.path.dirname(path) +- if parent == path: +- break +- path = parent +- return result +- +- def commit(self): +- """ +- Commit recorded changes, turn off recording, return +- changes. +- """ +- assert self.record +- result = self.files_written, self.dirs_created +- self._init_record() +- return result +- +- def rollback(self): +- if not self.dry_run: +- for f in list(self.files_written): +- if os.path.exists(f): +- os.remove(f) +- # dirs should all be empty now, except perhaps for +- # __pycache__ subdirs +- # reverse so that subdirs appear before their parents +- dirs = sorted(self.dirs_created, reverse=True) +- for d in dirs: +- flist = os.listdir(d) +- if flist: +- assert flist == ['__pycache__'] +- sd = os.path.join(d, flist[0]) +- os.rmdir(sd) +- os.rmdir(d) # should fail if non-empty +- self._init_record() +- +-def resolve(module_name, dotted_path): +- if module_name in sys.modules: +- mod = sys.modules[module_name] +- else: +- mod = __import__(module_name) +- if dotted_path is None: +- result = mod +- else: +- parts = dotted_path.split('.') +- result = getattr(mod, parts.pop(0)) +- for p in parts: +- result = getattr(result, p) +- return result +- +- +-class ExportEntry(object): +- def __init__(self, name, prefix, suffix, flags): +- self.name = name +- self.prefix = prefix +- self.suffix = suffix +- self.flags = flags +- +- @cached_property +- def value(self): +- return resolve(self.prefix, self.suffix) +- +- def __repr__(self): # pragma: no cover +- return '' % (self.name, self.prefix, +- self.suffix, self.flags) +- +- def __eq__(self, other): +- if not isinstance(other, ExportEntry): +- result = False +- else: +- result = (self.name == other.name and +- self.prefix == other.prefix and +- self.suffix == other.suffix and +- self.flags == other.flags) +- return result +- +- __hash__ = object.__hash__ +- +- +-ENTRY_RE = re.compile(r'''(?P(\w|[-.+])+) +- \s*=\s*(?P(\w+)([:\.]\w+)*) +- \s*(\[\s*(?P\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? +- ''', re.VERBOSE) +- +-def get_export_entry(specification): +- m = ENTRY_RE.search(specification) +- if not m: +- result = None +- if '[' in specification or ']' in specification: +- raise DistlibException("Invalid specification " +- "'%s'" % specification) +- else: +- d = m.groupdict() +- name = d['name'] +- path = d['callable'] +- colons = path.count(':') +- if colons == 0: +- prefix, suffix = path, None +- else: +- if colons != 1: +- raise DistlibException("Invalid specification " +- "'%s'" % specification) +- prefix, suffix = path.split(':') +- flags = d['flags'] +- if flags is None: +- if '[' in specification or ']' in specification: +- raise DistlibException("Invalid specification " +- "'%s'" % specification) +- flags = [] +- else: +- flags = [f.strip() for f in flags.split(',')] +- result = ExportEntry(name, prefix, suffix, flags) +- return result +- +- +-def get_cache_base(suffix=None): +- """ +- Return the default base location for distlib caches. If the directory does +- not exist, it is created. Use the suffix provided for the base directory, +- and default to '.distlib' if it isn't provided. +- +- On Windows, if LOCALAPPDATA is defined in the environment, then it is +- assumed to be a directory, and will be the parent directory of the result. +- On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home +- directory - using os.expanduser('~') - will be the parent directory of +- the result. +- +- The result is just the directory '.distlib' in the parent directory as +- determined above, or with the name specified with ``suffix``. +- """ +- if suffix is None: +- suffix = '.distlib' +- if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: +- result = os.path.expandvars('$localappdata') +- else: +- # Assume posix, or old Windows +- result = os.path.expanduser('~') +- # we use 'isdir' instead of 'exists', because we want to +- # fail if there's a file with that name +- if os.path.isdir(result): +- usable = os.access(result, os.W_OK) +- if not usable: +- logger.warning('Directory exists but is not writable: %s', result) +- else: +- try: +- os.makedirs(result) +- usable = True +- except OSError: +- logger.warning('Unable to create %s', result, exc_info=True) +- usable = False +- if not usable: +- result = tempfile.mkdtemp() +- logger.warning('Default location unusable, using %s', result) +- return os.path.join(result, suffix) +- +- +-def path_to_cache_dir(path): +- """ +- Convert an absolute path to a directory name for use in a cache. +- +- The algorithm used is: +- +- #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. +- #. Any occurrence of ``os.sep`` is replaced with ``'--'``. +- #. ``'.cache'`` is appended. +- """ +- d, p = os.path.splitdrive(os.path.abspath(path)) +- if d: +- d = d.replace(':', '---') +- p = p.replace(os.sep, '--') +- return d + p + '.cache' +- +- +-def ensure_slash(s): +- if not s.endswith('/'): +- return s + '/' +- return s +- +- +-def parse_credentials(netloc): +- username = password = None +- if '@' in netloc: +- prefix, netloc = netloc.split('@', 1) +- if ':' not in prefix: +- username = prefix +- else: +- username, password = prefix.split(':', 1) +- return username, password, netloc +- +- +-def get_process_umask(): +- result = os.umask(0o22) +- os.umask(result) +- return result +- +-def is_string_sequence(seq): +- result = True +- i = None +- for i, s in enumerate(seq): +- if not isinstance(s, string_types): +- result = False +- break +- assert i is not None +- return result +- +-PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' +- '([a-z0-9_.+-]+)', re.I) +-PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') +- +- +-def split_filename(filename, project_name=None): +- """ +- Extract name, version, python version from a filename (no extension) +- +- Return name, version, pyver or None +- """ +- result = None +- pyver = None +- filename = unquote(filename).replace(' ', '-') +- m = PYTHON_VERSION.search(filename) +- if m: +- pyver = m.group(1) +- filename = filename[:m.start()] +- if project_name and len(filename) > len(project_name) + 1: +- m = re.match(re.escape(project_name) + r'\b', filename) +- if m: +- n = m.end() +- result = filename[:n], filename[n + 1:], pyver +- if result is None: +- m = PROJECT_NAME_AND_VERSION.match(filename) +- if m: +- result = m.group(1), m.group(3), pyver +- return result +- +-# Allow spaces in name because of legacy dists like "Twisted Core" +-NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*' +- r'\(\s*(?P[^\s)]+)\)$') +- +-def parse_name_and_version(p): +- """ +- A utility method used to get name and version from a string. +- +- From e.g. a Provides-Dist value. +- +- :param p: A value in a form 'foo (1.0)' +- :return: The name and version as a tuple. +- """ +- m = NAME_VERSION_RE.match(p) +- if not m: +- raise DistlibException('Ill-formed name/version string: \'%s\'' % p) +- d = m.groupdict() +- return d['name'].strip().lower(), d['ver'] +- +-def get_extras(requested, available): +- result = set() +- requested = set(requested or []) +- available = set(available or []) +- if '*' in requested: +- requested.remove('*') +- result |= available +- for r in requested: +- if r == '-': +- result.add(r) +- elif r.startswith('-'): +- unwanted = r[1:] +- if unwanted not in available: +- logger.warning('undeclared extra: %s' % unwanted) +- if unwanted in result: +- result.remove(unwanted) +- else: +- if r not in available: +- logger.warning('undeclared extra: %s' % r) +- result.add(r) +- return result +-# +-# Extended metadata functionality +-# +- +-def _get_external_data(url): +- result = {} +- try: +- # urlopen might fail if it runs into redirections, +- # because of Python issue #13696. Fixed in locators +- # using a custom redirect handler. +- resp = urlopen(url) +- headers = resp.info() +- ct = headers.get('Content-Type') +- if not ct.startswith('application/json'): +- logger.debug('Unexpected response for JSON request: %s', ct) +- else: +- reader = codecs.getreader('utf-8')(resp) +- #data = reader.read().decode('utf-8') +- #result = json.loads(data) +- result = json.load(reader) +- except Exception as e: +- logger.exception('Failed to get external data for %s: %s', url, e) +- return result +- +-_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' +- +-def get_project_data(name): +- url = '%s/%s/project.json' % (name[0].upper(), name) +- url = urljoin(_external_data_base_url, url) +- result = _get_external_data(url) +- return result +- +-def get_package_data(name, version): +- url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) +- url = urljoin(_external_data_base_url, url) +- return _get_external_data(url) +- +- +-class Cache(object): +- """ +- A class implementing a cache for resources that need to live in the file system +- e.g. shared libraries. This class was moved from resources to here because it +- could be used by other modules, e.g. the wheel module. +- """ +- +- def __init__(self, base): +- """ +- Initialise an instance. +- +- :param base: The base directory where the cache should be located. +- """ +- # we use 'isdir' instead of 'exists', because we want to +- # fail if there's a file with that name +- if not os.path.isdir(base): # pragma: no cover +- os.makedirs(base) +- if (os.stat(base).st_mode & 0o77) != 0: +- logger.warning('Directory \'%s\' is not private', base) +- self.base = os.path.abspath(os.path.normpath(base)) +- +- def prefix_to_dir(self, prefix): +- """ +- Converts a resource prefix to a directory name in the cache. +- """ +- return path_to_cache_dir(prefix) +- +- def clear(self): +- """ +- Clear the cache. +- """ +- not_removed = [] +- for fn in os.listdir(self.base): +- fn = os.path.join(self.base, fn) +- try: +- if os.path.islink(fn) or os.path.isfile(fn): +- os.remove(fn) +- elif os.path.isdir(fn): +- shutil.rmtree(fn) +- except Exception: +- not_removed.append(fn) +- return not_removed +- +- +-class EventMixin(object): +- """ +- A very simple publish/subscribe system. +- """ +- def __init__(self): +- self._subscribers = {} +- +- def add(self, event, subscriber, append=True): +- """ +- Add a subscriber for an event. +- +- :param event: The name of an event. +- :param subscriber: The subscriber to be added (and called when the +- event is published). +- :param append: Whether to append or prepend the subscriber to an +- existing subscriber list for the event. +- """ +- subs = self._subscribers +- if event not in subs: +- subs[event] = deque([subscriber]) +- else: +- sq = subs[event] +- if append: +- sq.append(subscriber) +- else: +- sq.appendleft(subscriber) +- +- def remove(self, event, subscriber): +- """ +- Remove a subscriber for an event. +- +- :param event: The name of an event. +- :param subscriber: The subscriber to be removed. +- """ +- subs = self._subscribers +- if event not in subs: +- raise ValueError('No subscribers: %r' % event) +- subs[event].remove(subscriber) +- +- def get_subscribers(self, event): +- """ +- Return an iterator for the subscribers for an event. +- :param event: The event to return subscribers for. +- """ +- return iter(self._subscribers.get(event, ())) +- +- def publish(self, event, *args, **kwargs): +- """ +- Publish a event and return a list of values returned by its +- subscribers. +- +- :param event: The event to publish. +- :param args: The positional arguments to pass to the event's +- subscribers. +- :param kwargs: The keyword arguments to pass to the event's +- subscribers. +- """ +- result = [] +- for subscriber in self.get_subscribers(event): +- try: +- value = subscriber(event, *args, **kwargs) +- except Exception: +- logger.exception('Exception during event publication') +- value = None +- result.append(value) +- logger.debug('publish %s: args = %s, kwargs = %s, result = %s', +- event, args, kwargs, result) +- return result +- +-# +-# Simple sequencing +-# +-class Sequencer(object): +- def __init__(self): +- self._preds = {} +- self._succs = {} +- self._nodes = set() # nodes with no preds/succs +- +- def add_node(self, node): +- self._nodes.add(node) +- +- def remove_node(self, node, edges=False): +- if node in self._nodes: +- self._nodes.remove(node) +- if edges: +- for p in set(self._preds.get(node, ())): +- self.remove(p, node) +- for s in set(self._succs.get(node, ())): +- self.remove(node, s) +- # Remove empties +- for k, v in list(self._preds.items()): +- if not v: +- del self._preds[k] +- for k, v in list(self._succs.items()): +- if not v: +- del self._succs[k] +- +- def add(self, pred, succ): +- assert pred != succ +- self._preds.setdefault(succ, set()).add(pred) +- self._succs.setdefault(pred, set()).add(succ) +- +- def remove(self, pred, succ): +- assert pred != succ +- try: +- preds = self._preds[succ] +- succs = self._succs[pred] +- except KeyError: # pragma: no cover +- raise ValueError('%r not a successor of anything' % succ) +- try: +- preds.remove(pred) +- succs.remove(succ) +- except KeyError: # pragma: no cover +- raise ValueError('%r not a successor of %r' % (succ, pred)) +- +- def is_step(self, step): +- return (step in self._preds or step in self._succs or +- step in self._nodes) +- +- def get_steps(self, final): +- if not self.is_step(final): +- raise ValueError('Unknown: %r' % final) +- result = [] +- todo = [] +- seen = set() +- todo.append(final) +- while todo: +- step = todo.pop(0) +- if step in seen: +- # if a step was already seen, +- # move it to the end (so it will appear earlier +- # when reversed on return) ... but not for the +- # final step, as that would be confusing for +- # users +- if step != final: +- result.remove(step) +- result.append(step) +- else: +- seen.add(step) +- result.append(step) +- preds = self._preds.get(step, ()) +- todo.extend(preds) +- return reversed(result) +- +- @property +- def strong_connections(self): +- #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm +- index_counter = [0] +- stack = [] +- lowlinks = {} +- index = {} +- result = [] +- +- graph = self._succs +- +- def strongconnect(node): +- # set the depth index for this node to the smallest unused index +- index[node] = index_counter[0] +- lowlinks[node] = index_counter[0] +- index_counter[0] += 1 +- stack.append(node) +- +- # Consider successors +- try: +- successors = graph[node] +- except Exception: +- successors = [] +- for successor in successors: +- if successor not in lowlinks: +- # Successor has not yet been visited +- strongconnect(successor) +- lowlinks[node] = min(lowlinks[node],lowlinks[successor]) +- elif successor in stack: +- # the successor is in the stack and hence in the current +- # strongly connected component (SCC) +- lowlinks[node] = min(lowlinks[node],index[successor]) +- +- # If `node` is a root node, pop the stack and generate an SCC +- if lowlinks[node] == index[node]: +- connected_component = [] +- +- while True: +- successor = stack.pop() +- connected_component.append(successor) +- if successor == node: break +- component = tuple(connected_component) +- # storing the result +- result.append(component) +- +- for node in graph: +- if node not in lowlinks: +- strongconnect(node) +- +- return result +- +- @property +- def dot(self): +- result = ['digraph G {'] +- for succ in self._preds: +- preds = self._preds[succ] +- for pred in preds: +- result.append(' %s -> %s;' % (pred, succ)) +- for node in self._nodes: +- result.append(' %s;' % node) +- result.append('}') +- return '\n'.join(result) +- +-# +-# Unarchiving functionality for zip, tar, tgz, tbz, whl +-# +- +-ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', +- '.tgz', '.tbz', '.whl') +- +-def unarchive(archive_filename, dest_dir, format=None, check=True): +- +- def check_path(path): +- if not isinstance(path, text_type): +- path = path.decode('utf-8') +- p = os.path.abspath(os.path.join(dest_dir, path)) +- if not p.startswith(dest_dir) or p[plen] != os.sep: +- raise ValueError('path outside destination: %r' % p) +- +- dest_dir = os.path.abspath(dest_dir) +- plen = len(dest_dir) +- archive = None +- if format is None: +- if archive_filename.endswith(('.zip', '.whl')): +- format = 'zip' +- elif archive_filename.endswith(('.tar.gz', '.tgz')): +- format = 'tgz' +- mode = 'r:gz' +- elif archive_filename.endswith(('.tar.bz2', '.tbz')): +- format = 'tbz' +- mode = 'r:bz2' +- elif archive_filename.endswith('.tar'): +- format = 'tar' +- mode = 'r' +- else: # pragma: no cover +- raise ValueError('Unknown format for %r' % archive_filename) +- try: +- if format == 'zip': +- archive = ZipFile(archive_filename, 'r') +- if check: +- names = archive.namelist() +- for name in names: +- check_path(name) +- else: +- archive = tarfile.open(archive_filename, mode) +- if check: +- names = archive.getnames() +- for name in names: +- check_path(name) +- if format != 'zip' and sys.version_info[0] < 3: +- # See Python issue 17153. If the dest path contains Unicode, +- # tarfile extraction fails on Python 2.x if a member path name +- # contains non-ASCII characters - it leads to an implicit +- # bytes -> unicode conversion using ASCII to decode. +- for tarinfo in archive.getmembers(): +- if not isinstance(tarinfo.name, text_type): +- tarinfo.name = tarinfo.name.decode('utf-8') +- archive.extractall(dest_dir) +- +- finally: +- if archive: +- archive.close() +- +- +-def zip_dir(directory): +- """zip a directory tree into a BytesIO object""" +- result = io.BytesIO() +- dlen = len(directory) +- with ZipFile(result, "w") as zf: +- for root, dirs, files in os.walk(directory): +- for name in files: +- full = os.path.join(root, name) +- rel = root[dlen:] +- dest = os.path.join(rel, name) +- zf.write(full, dest) +- return result +- +-# +-# Simple progress bar +-# +- +-UNITS = ('', 'K', 'M', 'G','T','P') +- +- +-class Progress(object): +- unknown = 'UNKNOWN' +- +- def __init__(self, minval=0, maxval=100): +- assert maxval is None or maxval >= minval +- self.min = self.cur = minval +- self.max = maxval +- self.started = None +- self.elapsed = 0 +- self.done = False +- +- def update(self, curval): +- assert self.min <= curval +- assert self.max is None or curval <= self.max +- self.cur = curval +- now = time.time() +- if self.started is None: +- self.started = now +- else: +- self.elapsed = now - self.started +- +- def increment(self, incr): +- assert incr >= 0 +- self.update(self.cur + incr) +- +- def start(self): +- self.update(self.min) +- return self +- +- def stop(self): +- if self.max is not None: +- self.update(self.max) +- self.done = True +- +- @property +- def maximum(self): +- return self.unknown if self.max is None else self.max +- +- @property +- def percentage(self): +- if self.done: +- result = '100 %' +- elif self.max is None: +- result = ' ?? %' +- else: +- v = 100.0 * (self.cur - self.min) / (self.max - self.min) +- result = '%3d %%' % v +- return result +- +- def format_duration(self, duration): +- if (duration <= 0) and self.max is None or self.cur == self.min: +- result = '??:??:??' +- #elif duration < 1: +- # result = '--:--:--' +- else: +- result = time.strftime('%H:%M:%S', time.gmtime(duration)) +- return result +- +- @property +- def ETA(self): +- if self.done: +- prefix = 'Done' +- t = self.elapsed +- #import pdb; pdb.set_trace() +- else: +- prefix = 'ETA ' +- if self.max is None: +- t = -1 +- elif self.elapsed == 0 or (self.cur == self.min): +- t = 0 +- else: +- #import pdb; pdb.set_trace() +- t = float(self.max - self.min) +- t /= self.cur - self.min +- t = (t - 1) * self.elapsed +- return '%s: %s' % (prefix, self.format_duration(t)) +- +- @property +- def speed(self): +- if self.elapsed == 0: +- result = 0.0 +- else: +- result = (self.cur - self.min) / self.elapsed +- for unit in UNITS: +- if result < 1000: +- break +- result /= 1000.0 +- return '%d %sB/s' % (result, unit) +- +-# +-# Glob functionality +-# +- +-RICH_GLOB = re.compile(r'\{([^}]*)\}') +-_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +-_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') +- +- +-def iglob(path_glob): +- """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" +- if _CHECK_RECURSIVE_GLOB.search(path_glob): +- msg = """invalid glob %r: recursive glob "**" must be used alone""" +- raise ValueError(msg % path_glob) +- if _CHECK_MISMATCH_SET.search(path_glob): +- msg = """invalid glob %r: mismatching set marker '{' or '}'""" +- raise ValueError(msg % path_glob) +- return _iglob(path_glob) +- +- +-def _iglob(path_glob): +- rich_path_glob = RICH_GLOB.split(path_glob, 1) +- if len(rich_path_glob) > 1: +- assert len(rich_path_glob) == 3, rich_path_glob +- prefix, set, suffix = rich_path_glob +- for item in set.split(','): +- for path in _iglob(''.join((prefix, item, suffix))): +- yield path +- else: +- if '**' not in path_glob: +- for item in std_iglob(path_glob): +- yield item +- else: +- prefix, radical = path_glob.split('**', 1) +- if prefix == '': +- prefix = '.' +- if radical == '': +- radical = '*' +- else: +- # we support both +- radical = radical.lstrip('/') +- radical = radical.lstrip('\\') +- for path, dir, files in os.walk(prefix): +- path = os.path.normpath(path) +- for fn in _iglob(os.path.join(path, radical)): +- yield fn +- +-if ssl: +- from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, +- CertificateError) +- +- +-# +-# HTTPSConnection which verifies certificates/matches domains +-# +- +- class HTTPSConnection(httplib.HTTPSConnection): +- ca_certs = None # set this to the path to the certs file (.pem) +- check_domain = True # only used if ca_certs is not None +- +- # noinspection PyPropertyAccess +- def connect(self): +- sock = socket.create_connection((self.host, self.port), self.timeout) +- if getattr(self, '_tunnel_host', False): +- self.sock = sock +- self._tunnel() +- +- if not hasattr(ssl, 'SSLContext'): +- # For 2.x +- if self.ca_certs: +- cert_reqs = ssl.CERT_REQUIRED +- else: +- cert_reqs = ssl.CERT_NONE +- self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, +- cert_reqs=cert_reqs, +- ssl_version=ssl.PROTOCOL_SSLv23, +- ca_certs=self.ca_certs) +- else: # pragma: no cover +- context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) +- context.options |= ssl.OP_NO_SSLv2 +- if self.cert_file: +- context.load_cert_chain(self.cert_file, self.key_file) +- kwargs = {} +- if self.ca_certs: +- context.verify_mode = ssl.CERT_REQUIRED +- context.load_verify_locations(cafile=self.ca_certs) +- if getattr(ssl, 'HAS_SNI', False): +- kwargs['server_hostname'] = self.host +- self.sock = context.wrap_socket(sock, **kwargs) +- if self.ca_certs and self.check_domain: +- try: +- match_hostname(self.sock.getpeercert(), self.host) +- logger.debug('Host verified: %s', self.host) +- except CertificateError: # pragma: no cover +- self.sock.shutdown(socket.SHUT_RDWR) +- self.sock.close() +- raise +- +- class HTTPSHandler(BaseHTTPSHandler): +- def __init__(self, ca_certs, check_domain=True): +- BaseHTTPSHandler.__init__(self) +- self.ca_certs = ca_certs +- self.check_domain = check_domain +- +- def _conn_maker(self, *args, **kwargs): +- """ +- This is called to create a connection instance. Normally you'd +- pass a connection class to do_open, but it doesn't actually check for +- a class, and just expects a callable. As long as we behave just as a +- constructor would have, we should be OK. If it ever changes so that +- we *must* pass a class, we'll create an UnsafeHTTPSConnection class +- which just sets check_domain to False in the class definition, and +- choose which one to pass to do_open. +- """ +- result = HTTPSConnection(*args, **kwargs) +- if self.ca_certs: +- result.ca_certs = self.ca_certs +- result.check_domain = self.check_domain +- return result +- +- def https_open(self, req): +- try: +- return self.do_open(self._conn_maker, req) +- except URLError as e: +- if 'certificate verify failed' in str(e.reason): +- raise CertificateError('Unable to verify server certificate ' +- 'for %s' % req.host) +- else: +- raise +- +- # +- # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- +- # Middle proxy using HTTP listens on port 443, or an index mistakenly serves +- # HTML containing a http://xyz link when it should be https://xyz), +- # you can use the following handler class, which does not allow HTTP traffic. +- # +- # It works by inheriting from HTTPHandler - so build_opener won't add a +- # handler for HTTP itself. +- # +- class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): +- def http_open(self, req): +- raise URLError('Unexpected HTTP request on what should be a secure ' +- 'connection: %s' % req) +- +-# +-# XML-RPC with timeouts +-# +- +-_ver_info = sys.version_info[:2] +- +-if _ver_info == (2, 6): +- class HTTP(httplib.HTTP): +- def __init__(self, host='', port=None, **kwargs): +- if port == 0: # 0 means use port 0, not the default port +- port = None +- self._setup(self._connection_class(host, port, **kwargs)) +- +- +- if ssl: +- class HTTPS(httplib.HTTPS): +- def __init__(self, host='', port=None, **kwargs): +- if port == 0: # 0 means use port 0, not the default port +- port = None +- self._setup(self._connection_class(host, port, **kwargs)) +- +- +-class Transport(xmlrpclib.Transport): +- def __init__(self, timeout, use_datetime=0): +- self.timeout = timeout +- xmlrpclib.Transport.__init__(self, use_datetime) +- +- def make_connection(self, host): +- h, eh, x509 = self.get_host_info(host) +- if _ver_info == (2, 6): +- result = HTTP(h, timeout=self.timeout) +- else: +- if not self._connection or host != self._connection[0]: +- self._extra_headers = eh +- self._connection = host, httplib.HTTPConnection(h) +- result = self._connection[1] +- return result +- +-if ssl: +- class SafeTransport(xmlrpclib.SafeTransport): +- def __init__(self, timeout, use_datetime=0): +- self.timeout = timeout +- xmlrpclib.SafeTransport.__init__(self, use_datetime) +- +- def make_connection(self, host): +- h, eh, kwargs = self.get_host_info(host) +- if not kwargs: +- kwargs = {} +- kwargs['timeout'] = self.timeout +- if _ver_info == (2, 6): +- result = HTTPS(host, None, **kwargs) +- else: +- if not self._connection or host != self._connection[0]: +- self._extra_headers = eh +- self._connection = host, httplib.HTTPSConnection(h, None, +- **kwargs) +- result = self._connection[1] +- return result +- +- +-class ServerProxy(xmlrpclib.ServerProxy): +- def __init__(self, uri, **kwargs): +- self.timeout = timeout = kwargs.pop('timeout', None) +- # The above classes only come into play if a timeout +- # is specified +- if timeout is not None: +- scheme, _ = splittype(uri) +- use_datetime = kwargs.get('use_datetime', 0) +- if scheme == 'https': +- tcls = SafeTransport +- else: +- tcls = Transport +- kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) +- self.transport = t +- xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) +- +-# +-# CSV functionality. This is provided because on 2.x, the csv module can't +-# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +-# +- +-def _csv_open(fn, mode, **kwargs): +- if sys.version_info[0] < 3: +- mode += 'b' +- else: +- kwargs['newline'] = '' +- return open(fn, mode, **kwargs) +- +- +-class CSVBase(object): +- defaults = { +- 'delimiter': str(','), # The strs are used because we need native +- 'quotechar': str('"'), # str in the csv API (2.x won't take +- 'lineterminator': str('\n') # Unicode) +- } +- +- def __enter__(self): +- return self +- +- def __exit__(self, *exc_info): +- self.stream.close() +- +- +-class CSVReader(CSVBase): +- def __init__(self, **kwargs): +- if 'stream' in kwargs: +- stream = kwargs['stream'] +- if sys.version_info[0] >= 3: +- # needs to be a text stream +- stream = codecs.getreader('utf-8')(stream) +- self.stream = stream +- else: +- self.stream = _csv_open(kwargs['path'], 'r') +- self.reader = csv.reader(self.stream, **self.defaults) +- +- def __iter__(self): +- return self +- +- def next(self): +- result = next(self.reader) +- if sys.version_info[0] < 3: +- for i, item in enumerate(result): +- if not isinstance(item, text_type): +- result[i] = item.decode('utf-8') +- return result +- +- __next__ = next +- +-class CSVWriter(CSVBase): +- def __init__(self, fn, **kwargs): +- self.stream = _csv_open(fn, 'w') +- self.writer = csv.writer(self.stream, **self.defaults) +- +- def writerow(self, row): +- if sys.version_info[0] < 3: +- r = [] +- for item in row: +- if isinstance(item, text_type): +- item = item.encode('utf-8') +- r.append(item) +- row = r +- self.writer.writerow(row) +- +-# +-# Configurator functionality +-# +- +-class Configurator(BaseConfigurator): +- +- value_converters = dict(BaseConfigurator.value_converters) +- value_converters['inc'] = 'inc_convert' +- +- def __init__(self, config, base=None): +- super(Configurator, self).__init__(config) +- self.base = base or os.getcwd() +- +- def configure_custom(self, config): +- def convert(o): +- if isinstance(o, (list, tuple)): +- result = type(o)([convert(i) for i in o]) +- elif isinstance(o, dict): +- if '()' in o: +- result = self.configure_custom(o) +- else: +- result = {} +- for k in o: +- result[k] = convert(o[k]) +- else: +- result = self.convert(o) +- return result +- +- c = config.pop('()') +- if not callable(c): +- c = self.resolve(c) +- props = config.pop('.', None) +- # Check for valid identifiers +- args = config.pop('[]', ()) +- if args: +- args = tuple([convert(o) for o in args]) +- items = [(k, convert(config[k])) for k in config if valid_ident(k)] +- kwargs = dict(items) +- result = c(*args, **kwargs) +- if props: +- for n, v in props.items(): +- setattr(result, n, convert(v)) +- return result +- +- def __getitem__(self, key): +- result = self.config[key] +- if isinstance(result, dict) and '()' in result: +- self.config[key] = result = self.configure_custom(result) +- return result +- +- def inc_convert(self, value): +- """Default converter for the inc:// protocol.""" +- if not os.path.isabs(value): +- value = os.path.join(self.base, value) +- with codecs.open(value, 'r', encoding='utf-8') as f: +- result = json.load(f) +- return result +- +-# +-# Mixin for running subprocesses and capturing their output +-# +- +-class SubprocessMixin(object): +- def __init__(self, verbose=False, progress=None): +- self.verbose = verbose +- self.progress = progress +- +- def reader(self, stream, context): +- """ +- Read lines from a subprocess' output stream and either pass to a progress +- callable (if specified) or write progress information to sys.stderr. +- """ +- progress = self.progress +- verbose = self.verbose +- while True: +- s = stream.readline() +- if not s: +- break +- if progress is not None: +- progress(s, context) +- else: +- if not verbose: +- sys.stderr.write('.') +- else: +- sys.stderr.write(s.decode('utf-8')) +- sys.stderr.flush() +- stream.close() +- +- def run_command(self, cmd, **kwargs): +- p = subprocess.Popen(cmd, stdout=subprocess.PIPE, +- stderr=subprocess.PIPE, **kwargs) +- t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) +- t1.start() +- t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) +- t2.start() +- p.wait() +- t1.join() +- t2.join() +- if self.progress is not None: +- self.progress('done.', 'main') +- elif self.verbose: +- sys.stderr.write('done.\n') +- return p +- +- +-def normalize_name(name): +- """Normalize a python package name a la PEP 503""" +- # https://www.python.org/dev/peps/pep-0503/#normalized-names +- return re.sub('[-_.]+', '-', name).lower() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/version.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/version.py +deleted file mode 100644 +index 48c17c0..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/version.py ++++ /dev/null +@@ -1,742 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2012-2016 The Python Software Foundation. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-""" +-Implementation of a flexible versioning scheme providing support for PEP-440, +-setuptools-compatible and semantic versioning. +-""" +- +-import logging +-import re +- +-from .compat import string_types +- +-__all__ = ['NormalizedVersion', 'NormalizedMatcher', +- 'LegacyVersion', 'LegacyMatcher', +- 'SemanticVersion', 'SemanticMatcher', +- 'UnsupportedVersionError', 'get_scheme'] +- +-logger = logging.getLogger(__name__) +- +- +-class UnsupportedVersionError(ValueError): +- """This is an unsupported version.""" +- pass +- +- +-class Version(object): +- def __init__(self, s): +- self._string = s = s.strip() +- self._parts = parts = self.parse(s) +- assert isinstance(parts, tuple) +- assert len(parts) > 0 +- +- def parse(self, s): +- raise NotImplementedError('please implement in a subclass') +- +- def _check_compatible(self, other): +- if type(self) != type(other): +- raise TypeError('cannot compare %r and %r' % (self, other)) +- +- def __eq__(self, other): +- self._check_compatible(other) +- return self._parts == other._parts +- +- def __ne__(self, other): +- return not self.__eq__(other) +- +- def __lt__(self, other): +- self._check_compatible(other) +- return self._parts < other._parts +- +- def __gt__(self, other): +- return not (self.__lt__(other) or self.__eq__(other)) +- +- def __le__(self, other): +- return self.__lt__(other) or self.__eq__(other) +- +- def __ge__(self, other): +- return self.__gt__(other) or self.__eq__(other) +- +- # See http://docs.python.org/reference/datamodel#object.__hash__ +- def __hash__(self): +- return hash(self._parts) +- +- def __repr__(self): +- return "%s('%s')" % (self.__class__.__name__, self._string) +- +- def __str__(self): +- return self._string +- +- @property +- def is_prerelease(self): +- raise NotImplementedError('Please implement in subclasses.') +- +- +-class Matcher(object): +- version_class = None +- +- dist_re = re.compile(r"^(\w[\s\w'.-]*)(\((.*)\))?") +- comp_re = re.compile(r'^(<=|>=|<|>|!=|={2,3}|~=)?\s*([^\s,]+)$') +- num_re = re.compile(r'^\d+(\.\d+)*$') +- +- # value is either a callable or the name of a method +- _operators = { +- '<': lambda v, c, p: v < c, +- '>': lambda v, c, p: v > c, +- '<=': lambda v, c, p: v == c or v < c, +- '>=': lambda v, c, p: v == c or v > c, +- '==': lambda v, c, p: v == c, +- '===': lambda v, c, p: v == c, +- # by default, compatible => >=. +- '~=': lambda v, c, p: v == c or v > c, +- '!=': lambda v, c, p: v != c, +- } +- +- def __init__(self, s): +- if self.version_class is None: +- raise ValueError('Please specify a version class') +- self._string = s = s.strip() +- m = self.dist_re.match(s) +- if not m: +- raise ValueError('Not valid: %r' % s) +- groups = m.groups('') +- self.name = groups[0].strip() +- self.key = self.name.lower() # for case-insensitive comparisons +- clist = [] +- if groups[2]: +- constraints = [c.strip() for c in groups[2].split(',')] +- for c in constraints: +- m = self.comp_re.match(c) +- if not m: +- raise ValueError('Invalid %r in %r' % (c, s)) +- groups = m.groups() +- op = groups[0] or '~=' +- s = groups[1] +- if s.endswith('.*'): +- if op not in ('==', '!='): +- raise ValueError('\'.*\' not allowed for ' +- '%r constraints' % op) +- # Could be a partial version (e.g. for '2.*') which +- # won't parse as a version, so keep it as a string +- vn, prefix = s[:-2], True +- if not self.num_re.match(vn): +- # Just to check that vn is a valid version +- self.version_class(vn) +- else: +- # Should parse as a version, so we can create an +- # instance for the comparison +- vn, prefix = self.version_class(s), False +- clist.append((op, vn, prefix)) +- self._parts = tuple(clist) +- +- def match(self, version): +- """ +- Check if the provided version matches the constraints. +- +- :param version: The version to match against this instance. +- :type version: String or :class:`Version` instance. +- """ +- if isinstance(version, string_types): +- version = self.version_class(version) +- for operator, constraint, prefix in self._parts: +- f = self._operators.get(operator) +- if isinstance(f, string_types): +- f = getattr(self, f) +- if not f: +- msg = ('%r not implemented ' +- 'for %s' % (operator, self.__class__.__name__)) +- raise NotImplementedError(msg) +- if not f(version, constraint, prefix): +- return False +- return True +- +- @property +- def exact_version(self): +- result = None +- if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): +- result = self._parts[0][1] +- return result +- +- def _check_compatible(self, other): +- if type(self) != type(other) or self.name != other.name: +- raise TypeError('cannot compare %s and %s' % (self, other)) +- +- def __eq__(self, other): +- self._check_compatible(other) +- return self.key == other.key and self._parts == other._parts +- +- def __ne__(self, other): +- return not self.__eq__(other) +- +- # See http://docs.python.org/reference/datamodel#object.__hash__ +- def __hash__(self): +- return hash(self.key) + hash(self._parts) +- +- def __repr__(self): +- return "%s(%r)" % (self.__class__.__name__, self._string) +- +- def __str__(self): +- return self._string +- +- +-PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' +- r'(\.(post)(\d+))?(\.(dev)(\d+))?' +- r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') +- +- +-def _pep_440_key(s): +- s = s.strip() +- m = PEP440_VERSION_RE.match(s) +- if not m: +- raise UnsupportedVersionError('Not a valid version: %s' % s) +- groups = m.groups() +- nums = tuple(int(v) for v in groups[1].split('.')) +- while len(nums) > 1 and nums[-1] == 0: +- nums = nums[:-1] +- +- if not groups[0]: +- epoch = 0 +- else: +- epoch = int(groups[0]) +- pre = groups[4:6] +- post = groups[7:9] +- dev = groups[10:12] +- local = groups[13] +- if pre == (None, None): +- pre = () +- else: +- pre = pre[0], int(pre[1]) +- if post == (None, None): +- post = () +- else: +- post = post[0], int(post[1]) +- if dev == (None, None): +- dev = () +- else: +- dev = dev[0], int(dev[1]) +- if local is None: +- local = () +- else: +- parts = [] +- for part in local.split('.'): +- # to ensure that numeric compares as > lexicographic, avoid +- # comparing them directly, but encode a tuple which ensures +- # correct sorting +- if part.isdigit(): +- part = (1, int(part)) +- else: +- part = (0, part) +- parts.append(part) +- local = tuple(parts) +- if not pre: +- # either before pre-release, or final release and after +- if not post and dev: +- # before pre-release +- pre = ('a', -1) # to sort before a0 +- else: +- pre = ('z',) # to sort after all pre-releases +- # now look at the state of post and dev. +- if not post: +- post = ('_',) # sort before 'a' +- if not dev: +- dev = ('final',) +- +- #print('%s -> %s' % (s, m.groups())) +- return epoch, nums, pre, post, dev, local +- +- +-_normalized_key = _pep_440_key +- +- +-class NormalizedVersion(Version): +- """A rational version. +- +- Good: +- 1.2 # equivalent to "1.2.0" +- 1.2.0 +- 1.2a1 +- 1.2.3a2 +- 1.2.3b1 +- 1.2.3c1 +- 1.2.3.4 +- TODO: fill this out +- +- Bad: +- 1 # minimum two numbers +- 1.2a # release level must have a release serial +- 1.2.3b +- """ +- def parse(self, s): +- result = _normalized_key(s) +- # _normalized_key loses trailing zeroes in the release +- # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 +- # However, PEP 440 prefix matching needs it: for example, +- # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). +- m = PEP440_VERSION_RE.match(s) # must succeed +- groups = m.groups() +- self._release_clause = tuple(int(v) for v in groups[1].split('.')) +- return result +- +- PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) +- +- @property +- def is_prerelease(self): +- return any(t[0] in self.PREREL_TAGS for t in self._parts if t) +- +- +-def _match_prefix(x, y): +- x = str(x) +- y = str(y) +- if x == y: +- return True +- if not x.startswith(y): +- return False +- n = len(y) +- return x[n] == '.' +- +- +-class NormalizedMatcher(Matcher): +- version_class = NormalizedVersion +- +- # value is either a callable or the name of a method +- _operators = { +- '~=': '_match_compatible', +- '<': '_match_lt', +- '>': '_match_gt', +- '<=': '_match_le', +- '>=': '_match_ge', +- '==': '_match_eq', +- '===': '_match_arbitrary', +- '!=': '_match_ne', +- } +- +- def _adjust_local(self, version, constraint, prefix): +- if prefix: +- strip_local = '+' not in constraint and version._parts[-1] +- else: +- # both constraint and version are +- # NormalizedVersion instances. +- # If constraint does not have a local component, +- # ensure the version doesn't, either. +- strip_local = not constraint._parts[-1] and version._parts[-1] +- if strip_local: +- s = version._string.split('+', 1)[0] +- version = self.version_class(s) +- return version, constraint +- +- def _match_lt(self, version, constraint, prefix): +- version, constraint = self._adjust_local(version, constraint, prefix) +- if version >= constraint: +- return False +- release_clause = constraint._release_clause +- pfx = '.'.join([str(i) for i in release_clause]) +- return not _match_prefix(version, pfx) +- +- def _match_gt(self, version, constraint, prefix): +- version, constraint = self._adjust_local(version, constraint, prefix) +- if version <= constraint: +- return False +- release_clause = constraint._release_clause +- pfx = '.'.join([str(i) for i in release_clause]) +- return not _match_prefix(version, pfx) +- +- def _match_le(self, version, constraint, prefix): +- version, constraint = self._adjust_local(version, constraint, prefix) +- return version <= constraint +- +- def _match_ge(self, version, constraint, prefix): +- version, constraint = self._adjust_local(version, constraint, prefix) +- return version >= constraint +- +- def _match_eq(self, version, constraint, prefix): +- version, constraint = self._adjust_local(version, constraint, prefix) +- if not prefix: +- result = (version == constraint) +- else: +- result = _match_prefix(version, constraint) +- return result +- +- def _match_arbitrary(self, version, constraint, prefix): +- return str(version) == str(constraint) +- +- def _match_ne(self, version, constraint, prefix): +- version, constraint = self._adjust_local(version, constraint, prefix) +- if not prefix: +- result = (version != constraint) +- else: +- result = not _match_prefix(version, constraint) +- return result +- +- def _match_compatible(self, version, constraint, prefix): +- version, constraint = self._adjust_local(version, constraint, prefix) +- if version == constraint: +- return True +- if version < constraint: +- return False +-# if not prefix: +-# return True +- release_clause = constraint._release_clause +- if len(release_clause) > 1: +- release_clause = release_clause[:-1] +- pfx = '.'.join([str(i) for i in release_clause]) +- return _match_prefix(version, pfx) +- +-_REPLACEMENTS = ( +- (re.compile('[.+-]$'), ''), # remove trailing puncts +- (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start +- (re.compile('^[.-]'), ''), # remove leading puncts +- (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses +- (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) +- (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) +- (re.compile('[.]{2,}'), '.'), # multiple runs of '.' +- (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha +- (re.compile(r'\b(pre-alpha|prealpha)\b'), +- 'pre.alpha'), # standardise +- (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +-) +- +-_SUFFIX_REPLACEMENTS = ( +- (re.compile('^[:~._+-]+'), ''), # remove leading puncts +- (re.compile('[,*")([\]]'), ''), # remove unwanted chars +- (re.compile('[~:+_ -]'), '.'), # replace illegal chars +- (re.compile('[.]{2,}'), '.'), # multiple runs of '.' +- (re.compile(r'\.$'), ''), # trailing '.' +-) +- +-_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') +- +- +-def _suggest_semantic_version(s): +- """ +- Try to suggest a semantic form for a version for which +- _suggest_normalized_version couldn't come up with anything. +- """ +- result = s.strip().lower() +- for pat, repl in _REPLACEMENTS: +- result = pat.sub(repl, result) +- if not result: +- result = '0.0.0' +- +- # Now look for numeric prefix, and separate it out from +- # the rest. +- #import pdb; pdb.set_trace() +- m = _NUMERIC_PREFIX.match(result) +- if not m: +- prefix = '0.0.0' +- suffix = result +- else: +- prefix = m.groups()[0].split('.') +- prefix = [int(i) for i in prefix] +- while len(prefix) < 3: +- prefix.append(0) +- if len(prefix) == 3: +- suffix = result[m.end():] +- else: +- suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] +- prefix = prefix[:3] +- prefix = '.'.join([str(i) for i in prefix]) +- suffix = suffix.strip() +- if suffix: +- #import pdb; pdb.set_trace() +- # massage the suffix. +- for pat, repl in _SUFFIX_REPLACEMENTS: +- suffix = pat.sub(repl, suffix) +- +- if not suffix: +- result = prefix +- else: +- sep = '-' if 'dev' in suffix else '+' +- result = prefix + sep + suffix +- if not is_semver(result): +- result = None +- return result +- +- +-def _suggest_normalized_version(s): +- """Suggest a normalized version close to the given version string. +- +- If you have a version string that isn't rational (i.e. NormalizedVersion +- doesn't like it) then you might be able to get an equivalent (or close) +- rational version from this function. +- +- This does a number of simple normalizations to the given string, based +- on observation of versions currently in use on PyPI. Given a dump of +- those version during PyCon 2009, 4287 of them: +- - 2312 (53.93%) match NormalizedVersion without change +- with the automatic suggestion +- - 3474 (81.04%) match when using this suggestion method +- +- @param s {str} An irrational version string. +- @returns A rational version string, or None, if couldn't determine one. +- """ +- try: +- _normalized_key(s) +- return s # already rational +- except UnsupportedVersionError: +- pass +- +- rs = s.lower() +- +- # part of this could use maketrans +- for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), +- ('beta', 'b'), ('rc', 'c'), ('-final', ''), +- ('-pre', 'c'), +- ('-release', ''), ('.release', ''), ('-stable', ''), +- ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), +- ('final', '')): +- rs = rs.replace(orig, repl) +- +- # if something ends with dev or pre, we add a 0 +- rs = re.sub(r"pre$", r"pre0", rs) +- rs = re.sub(r"dev$", r"dev0", rs) +- +- # if we have something like "b-2" or "a.2" at the end of the +- # version, that is probably beta, alpha, etc +- # let's remove the dash or dot +- rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) +- +- # 1.0-dev-r371 -> 1.0.dev371 +- # 0.1-dev-r79 -> 0.1.dev79 +- rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) +- +- # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 +- rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) +- +- # Clean: v0.3, v1.0 +- if rs.startswith('v'): +- rs = rs[1:] +- +- # Clean leading '0's on numbers. +- #TODO: unintended side-effect on, e.g., "2003.05.09" +- # PyPI stats: 77 (~2%) better +- rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) +- +- # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers +- # zero. +- # PyPI stats: 245 (7.56%) better +- rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) +- +- # the 'dev-rNNN' tag is a dev tag +- rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) +- +- # clean the - when used as a pre delimiter +- rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) +- +- # a terminal "dev" or "devel" can be changed into ".dev0" +- rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) +- +- # a terminal "dev" can be changed into ".dev0" +- rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) +- +- # a terminal "final" or "stable" can be removed +- rs = re.sub(r"(final|stable)$", "", rs) +- +- # The 'r' and the '-' tags are post release tags +- # 0.4a1.r10 -> 0.4a1.post10 +- # 0.9.33-17222 -> 0.9.33.post17222 +- # 0.9.33-r17222 -> 0.9.33.post17222 +- rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) +- +- # Clean 'r' instead of 'dev' usage: +- # 0.9.33+r17222 -> 0.9.33.dev17222 +- # 1.0dev123 -> 1.0.dev123 +- # 1.0.git123 -> 1.0.dev123 +- # 1.0.bzr123 -> 1.0.dev123 +- # 0.1a0dev.123 -> 0.1a0.dev123 +- # PyPI stats: ~150 (~4%) better +- rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) +- +- # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: +- # 0.2.pre1 -> 0.2c1 +- # 0.2-c1 -> 0.2c1 +- # 1.0preview123 -> 1.0c123 +- # PyPI stats: ~21 (0.62%) better +- rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) +- +- # Tcl/Tk uses "px" for their post release markers +- rs = re.sub(r"p(\d+)$", r".post\1", rs) +- +- try: +- _normalized_key(rs) +- except UnsupportedVersionError: +- rs = None +- return rs +- +-# +-# Legacy version processing (distribute-compatible) +-# +- +-_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +-_VERSION_REPLACE = { +- 'pre': 'c', +- 'preview': 'c', +- '-': 'final-', +- 'rc': 'c', +- 'dev': '@', +- '': None, +- '.': None, +-} +- +- +-def _legacy_key(s): +- def get_parts(s): +- result = [] +- for p in _VERSION_PART.split(s.lower()): +- p = _VERSION_REPLACE.get(p, p) +- if p: +- if '0' <= p[:1] <= '9': +- p = p.zfill(8) +- else: +- p = '*' + p +- result.append(p) +- result.append('*final') +- return result +- +- result = [] +- for p in get_parts(s): +- if p.startswith('*'): +- if p < '*final': +- while result and result[-1] == '*final-': +- result.pop() +- while result and result[-1] == '00000000': +- result.pop() +- result.append(p) +- return tuple(result) +- +- +-class LegacyVersion(Version): +- def parse(self, s): +- return _legacy_key(s) +- +- @property +- def is_prerelease(self): +- result = False +- for x in self._parts: +- if (isinstance(x, string_types) and x.startswith('*') and +- x < '*final'): +- result = True +- break +- return result +- +- +-class LegacyMatcher(Matcher): +- version_class = LegacyVersion +- +- _operators = dict(Matcher._operators) +- _operators['~='] = '_match_compatible' +- +- numeric_re = re.compile('^(\d+(\.\d+)*)') +- +- def _match_compatible(self, version, constraint, prefix): +- if version < constraint: +- return False +- m = self.numeric_re.match(str(constraint)) +- if not m: +- logger.warning('Cannot compute compatible match for version %s ' +- ' and constraint %s', version, constraint) +- return True +- s = m.groups()[0] +- if '.' in s: +- s = s.rsplit('.', 1)[0] +- return _match_prefix(version, s) +- +-# +-# Semantic versioning +-# +- +-_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' +- r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' +- r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) +- +- +-def is_semver(s): +- return _SEMVER_RE.match(s) +- +- +-def _semantic_key(s): +- def make_tuple(s, absent): +- if s is None: +- result = (absent,) +- else: +- parts = s[1:].split('.') +- # We can't compare ints and strings on Python 3, so fudge it +- # by zero-filling numeric values so simulate a numeric comparison +- result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) +- return result +- +- m = is_semver(s) +- if not m: +- raise UnsupportedVersionError(s) +- groups = m.groups() +- major, minor, patch = [int(i) for i in groups[:3]] +- # choose the '|' and '*' so that versions sort correctly +- pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') +- return (major, minor, patch), pre, build +- +- +-class SemanticVersion(Version): +- def parse(self, s): +- return _semantic_key(s) +- +- @property +- def is_prerelease(self): +- return self._parts[1][0] != '|' +- +- +-class SemanticMatcher(Matcher): +- version_class = SemanticVersion +- +- +-class VersionScheme(object): +- def __init__(self, key, matcher, suggester=None): +- self.key = key +- self.matcher = matcher +- self.suggester = suggester +- +- def is_valid_version(self, s): +- try: +- self.matcher.version_class(s) +- result = True +- except UnsupportedVersionError: +- result = False +- return result +- +- def is_valid_matcher(self, s): +- try: +- self.matcher(s) +- result = True +- except UnsupportedVersionError: +- result = False +- return result +- +- def is_valid_constraint_list(self, s): +- """ +- Used for processing some metadata fields +- """ +- return self.is_valid_matcher('dummy_name (%s)' % s) +- +- def suggest(self, s): +- if self.suggester is None: +- result = None +- else: +- result = self.suggester(s) +- return result +- +-_SCHEMES = { +- 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, +- _suggest_normalized_version), +- 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), +- 'semantic': VersionScheme(_semantic_key, SemanticMatcher, +- _suggest_semantic_version), +-} +- +-_SCHEMES['default'] = _SCHEMES['normalized'] +- +- +-def get_scheme(name): +- if name not in _SCHEMES: +- raise ValueError('unknown scheme name: %r' % name) +- return _SCHEMES[name] +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/w32.exe b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/w32.exe +deleted file mode 100644 +index 85a90a5..0000000 +Binary files a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/w32.exe and /dev/null differ +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/w64.exe b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/w64.exe +deleted file mode 100644 +index b3aea31..0000000 +Binary files a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/w64.exe and /dev/null differ +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/wheel.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/wheel.py +deleted file mode 100644 +index 2952b8e..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distlib/wheel.py ++++ /dev/null +@@ -1,978 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright (C) 2013-2016 Vinay Sajip. +-# Licensed to the Python Software Foundation under a contributor agreement. +-# See LICENSE.txt and CONTRIBUTORS.txt. +-# +-from __future__ import unicode_literals +- +-import base64 +-import codecs +-import datetime +-import distutils.util +-from email import message_from_file +-import hashlib +-import imp +-import json +-import logging +-import os +-import posixpath +-import re +-import shutil +-import sys +-import tempfile +-import zipfile +- +-from . import __version__, DistlibException +-from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +-from .database import InstalledDistribution +-from .metadata import Metadata, METADATA_FILENAME +-from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, +- cached_property, get_cache_base, read_exports, tempdir) +-from .version import NormalizedVersion, UnsupportedVersionError +- +-logger = logging.getLogger(__name__) +- +-cache = None # created when needed +- +-if hasattr(sys, 'pypy_version_info'): +- IMP_PREFIX = 'pp' +-elif sys.platform.startswith('java'): +- IMP_PREFIX = 'jy' +-elif sys.platform == 'cli': +- IMP_PREFIX = 'ip' +-else: +- IMP_PREFIX = 'cp' +- +-VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +-if not VER_SUFFIX: # pragma: no cover +- VER_SUFFIX = '%s%s' % sys.version_info[:2] +-PYVER = 'py' + VER_SUFFIX +-IMPVER = IMP_PREFIX + VER_SUFFIX +- +-ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') +- +-ABI = sysconfig.get_config_var('SOABI') +-if ABI and ABI.startswith('cpython-'): +- ABI = ABI.replace('cpython-', 'cp') +-else: +- def _derive_abi(): +- parts = ['cp', VER_SUFFIX] +- if sysconfig.get_config_var('Py_DEBUG'): +- parts.append('d') +- if sysconfig.get_config_var('WITH_PYMALLOC'): +- parts.append('m') +- if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: +- parts.append('u') +- return ''.join(parts) +- ABI = _derive_abi() +- del _derive_abi +- +-FILENAME_RE = re.compile(r''' +-(?P[^-]+) +--(?P\d+[^-]*) +-(-(?P\d+[^-]*))? +--(?P\w+\d+(\.\w+\d+)*) +--(?P\w+) +--(?P\w+(\.\w+)*) +-\.whl$ +-''', re.IGNORECASE | re.VERBOSE) +- +-NAME_VERSION_RE = re.compile(r''' +-(?P[^-]+) +--(?P\d+[^-]*) +-(-(?P\d+[^-]*))?$ +-''', re.IGNORECASE | re.VERBOSE) +- +-SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +-SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +-SHEBANG_PYTHON = b'#!python' +-SHEBANG_PYTHONW = b'#!pythonw' +- +-if os.sep == '/': +- to_posix = lambda o: o +-else: +- to_posix = lambda o: o.replace(os.sep, '/') +- +- +-class Mounter(object): +- def __init__(self): +- self.impure_wheels = {} +- self.libs = {} +- +- def add(self, pathname, extensions): +- self.impure_wheels[pathname] = extensions +- self.libs.update(extensions) +- +- def remove(self, pathname): +- extensions = self.impure_wheels.pop(pathname) +- for k, v in extensions: +- if k in self.libs: +- del self.libs[k] +- +- def find_module(self, fullname, path=None): +- if fullname in self.libs: +- result = self +- else: +- result = None +- return result +- +- def load_module(self, fullname): +- if fullname in sys.modules: +- result = sys.modules[fullname] +- else: +- if fullname not in self.libs: +- raise ImportError('unable to find extension for %s' % fullname) +- result = imp.load_dynamic(fullname, self.libs[fullname]) +- result.__loader__ = self +- parts = fullname.rsplit('.', 1) +- if len(parts) > 1: +- result.__package__ = parts[0] +- return result +- +-_hook = Mounter() +- +- +-class Wheel(object): +- """ +- Class to build and install from Wheel files (PEP 427). +- """ +- +- wheel_version = (1, 1) +- hash_kind = 'sha256' +- +- def __init__(self, filename=None, sign=False, verify=False): +- """ +- Initialise an instance using a (valid) filename. +- """ +- self.sign = sign +- self.should_verify = verify +- self.buildver = '' +- self.pyver = [PYVER] +- self.abi = ['none'] +- self.arch = ['any'] +- self.dirname = os.getcwd() +- if filename is None: +- self.name = 'dummy' +- self.version = '0.1' +- self._filename = self.filename +- else: +- m = NAME_VERSION_RE.match(filename) +- if m: +- info = m.groupdict('') +- self.name = info['nm'] +- # Reinstate the local version separator +- self.version = info['vn'].replace('_', '-') +- self.buildver = info['bn'] +- self._filename = self.filename +- else: +- dirname, filename = os.path.split(filename) +- m = FILENAME_RE.match(filename) +- if not m: +- raise DistlibException('Invalid name or ' +- 'filename: %r' % filename) +- if dirname: +- self.dirname = os.path.abspath(dirname) +- self._filename = filename +- info = m.groupdict('') +- self.name = info['nm'] +- self.version = info['vn'] +- self.buildver = info['bn'] +- self.pyver = info['py'].split('.') +- self.abi = info['bi'].split('.') +- self.arch = info['ar'].split('.') +- +- @property +- def filename(self): +- """ +- Build and return a filename from the various components. +- """ +- if self.buildver: +- buildver = '-' + self.buildver +- else: +- buildver = '' +- pyver = '.'.join(self.pyver) +- abi = '.'.join(self.abi) +- arch = '.'.join(self.arch) +- # replace - with _ as a local version separator +- version = self.version.replace('-', '_') +- return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, +- pyver, abi, arch) +- +- @property +- def exists(self): +- path = os.path.join(self.dirname, self.filename) +- return os.path.isfile(path) +- +- @property +- def tags(self): +- for pyver in self.pyver: +- for abi in self.abi: +- for arch in self.arch: +- yield pyver, abi, arch +- +- @cached_property +- def metadata(self): +- pathname = os.path.join(self.dirname, self.filename) +- name_ver = '%s-%s' % (self.name, self.version) +- info_dir = '%s.dist-info' % name_ver +- wrapper = codecs.getreader('utf-8') +- with ZipFile(pathname, 'r') as zf: +- wheel_metadata = self.get_wheel_metadata(zf) +- wv = wheel_metadata['Wheel-Version'].split('.', 1) +- file_version = tuple([int(i) for i in wv]) +- if file_version < (1, 1): +- fn = 'METADATA' +- else: +- fn = METADATA_FILENAME +- try: +- metadata_filename = posixpath.join(info_dir, fn) +- with zf.open(metadata_filename) as bf: +- wf = wrapper(bf) +- result = Metadata(fileobj=wf) +- except KeyError: +- raise ValueError('Invalid wheel, because %s is ' +- 'missing' % fn) +- return result +- +- def get_wheel_metadata(self, zf): +- name_ver = '%s-%s' % (self.name, self.version) +- info_dir = '%s.dist-info' % name_ver +- metadata_filename = posixpath.join(info_dir, 'WHEEL') +- with zf.open(metadata_filename) as bf: +- wf = codecs.getreader('utf-8')(bf) +- message = message_from_file(wf) +- return dict(message) +- +- @cached_property +- def info(self): +- pathname = os.path.join(self.dirname, self.filename) +- with ZipFile(pathname, 'r') as zf: +- result = self.get_wheel_metadata(zf) +- return result +- +- def process_shebang(self, data): +- m = SHEBANG_RE.match(data) +- if m: +- end = m.end() +- shebang, data_after_shebang = data[:end], data[end:] +- # Preserve any arguments after the interpreter +- if b'pythonw' in shebang.lower(): +- shebang_python = SHEBANG_PYTHONW +- else: +- shebang_python = SHEBANG_PYTHON +- m = SHEBANG_DETAIL_RE.match(shebang) +- if m: +- args = b' ' + m.groups()[-1] +- else: +- args = b'' +- shebang = shebang_python + args +- data = shebang + data_after_shebang +- else: +- cr = data.find(b'\r') +- lf = data.find(b'\n') +- if cr < 0 or cr > lf: +- term = b'\n' +- else: +- if data[cr:cr + 2] == b'\r\n': +- term = b'\r\n' +- else: +- term = b'\r' +- data = SHEBANG_PYTHON + term + data +- return data +- +- def get_hash(self, data, hash_kind=None): +- if hash_kind is None: +- hash_kind = self.hash_kind +- try: +- hasher = getattr(hashlib, hash_kind) +- except AttributeError: +- raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) +- result = hasher(data).digest() +- result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') +- return hash_kind, result +- +- def write_record(self, records, record_path, base): +- records = list(records) # make a copy for sorting +- p = to_posix(os.path.relpath(record_path, base)) +- records.append((p, '', '')) +- records.sort() +- with CSVWriter(record_path) as writer: +- for row in records: +- writer.writerow(row) +- +- def write_records(self, info, libdir, archive_paths): +- records = [] +- distinfo, info_dir = info +- hasher = getattr(hashlib, self.hash_kind) +- for ap, p in archive_paths: +- with open(p, 'rb') as f: +- data = f.read() +- digest = '%s=%s' % self.get_hash(data) +- size = os.path.getsize(p) +- records.append((ap, digest, size)) +- +- p = os.path.join(distinfo, 'RECORD') +- self.write_record(records, p, libdir) +- ap = to_posix(os.path.join(info_dir, 'RECORD')) +- archive_paths.append((ap, p)) +- +- def build_zip(self, pathname, archive_paths): +- with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: +- for ap, p in archive_paths: +- logger.debug('Wrote %s to %s in wheel', p, ap) +- zf.write(p, ap) +- +- def build(self, paths, tags=None, wheel_version=None): +- """ +- Build a wheel from files in specified paths, and use any specified tags +- when determining the name of the wheel. +- """ +- if tags is None: +- tags = {} +- +- libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] +- if libkey == 'platlib': +- is_pure = 'false' +- default_pyver = [IMPVER] +- default_abi = [ABI] +- default_arch = [ARCH] +- else: +- is_pure = 'true' +- default_pyver = [PYVER] +- default_abi = ['none'] +- default_arch = ['any'] +- +- self.pyver = tags.get('pyver', default_pyver) +- self.abi = tags.get('abi', default_abi) +- self.arch = tags.get('arch', default_arch) +- +- libdir = paths[libkey] +- +- name_ver = '%s-%s' % (self.name, self.version) +- data_dir = '%s.data' % name_ver +- info_dir = '%s.dist-info' % name_ver +- +- archive_paths = [] +- +- # First, stuff which is not in site-packages +- for key in ('data', 'headers', 'scripts'): +- if key not in paths: +- continue +- path = paths[key] +- if os.path.isdir(path): +- for root, dirs, files in os.walk(path): +- for fn in files: +- p = fsdecode(os.path.join(root, fn)) +- rp = os.path.relpath(p, path) +- ap = to_posix(os.path.join(data_dir, key, rp)) +- archive_paths.append((ap, p)) +- if key == 'scripts' and not p.endswith('.exe'): +- with open(p, 'rb') as f: +- data = f.read() +- data = self.process_shebang(data) +- with open(p, 'wb') as f: +- f.write(data) +- +- # Now, stuff which is in site-packages, other than the +- # distinfo stuff. +- path = libdir +- distinfo = None +- for root, dirs, files in os.walk(path): +- if root == path: +- # At the top level only, save distinfo for later +- # and skip it for now +- for i, dn in enumerate(dirs): +- dn = fsdecode(dn) +- if dn.endswith('.dist-info'): +- distinfo = os.path.join(root, dn) +- del dirs[i] +- break +- assert distinfo, '.dist-info directory expected, not found' +- +- for fn in files: +- # comment out next suite to leave .pyc files in +- if fsdecode(fn).endswith(('.pyc', '.pyo')): +- continue +- p = os.path.join(root, fn) +- rp = to_posix(os.path.relpath(p, path)) +- archive_paths.append((rp, p)) +- +- # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. +- files = os.listdir(distinfo) +- for fn in files: +- if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): +- p = fsdecode(os.path.join(distinfo, fn)) +- ap = to_posix(os.path.join(info_dir, fn)) +- archive_paths.append((ap, p)) +- +- wheel_metadata = [ +- 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), +- 'Generator: distlib %s' % __version__, +- 'Root-Is-Purelib: %s' % is_pure, +- ] +- for pyver, abi, arch in self.tags: +- wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) +- p = os.path.join(distinfo, 'WHEEL') +- with open(p, 'w') as f: +- f.write('\n'.join(wheel_metadata)) +- ap = to_posix(os.path.join(info_dir, 'WHEEL')) +- archive_paths.append((ap, p)) +- +- # Now, at last, RECORD. +- # Paths in here are archive paths - nothing else makes sense. +- self.write_records((distinfo, info_dir), libdir, archive_paths) +- # Now, ready to build the zip file +- pathname = os.path.join(self.dirname, self.filename) +- self.build_zip(pathname, archive_paths) +- return pathname +- +- def install(self, paths, maker, **kwargs): +- """ +- Install a wheel to the specified paths. If kwarg ``warner`` is +- specified, it should be a callable, which will be called with two +- tuples indicating the wheel version of this software and the wheel +- version in the file, if there is a discrepancy in the versions. +- This can be used to issue any warnings to raise any exceptions. +- If kwarg ``lib_only`` is True, only the purelib/platlib files are +- installed, and the headers, scripts, data and dist-info metadata are +- not written. +- +- The return value is a :class:`InstalledDistribution` instance unless +- ``options.lib_only`` is True, in which case the return value is ``None``. +- """ +- +- dry_run = maker.dry_run +- warner = kwargs.get('warner') +- lib_only = kwargs.get('lib_only', False) +- +- pathname = os.path.join(self.dirname, self.filename) +- name_ver = '%s-%s' % (self.name, self.version) +- data_dir = '%s.data' % name_ver +- info_dir = '%s.dist-info' % name_ver +- +- metadata_name = posixpath.join(info_dir, METADATA_FILENAME) +- wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') +- record_name = posixpath.join(info_dir, 'RECORD') +- +- wrapper = codecs.getreader('utf-8') +- +- with ZipFile(pathname, 'r') as zf: +- with zf.open(wheel_metadata_name) as bwf: +- wf = wrapper(bwf) +- message = message_from_file(wf) +- wv = message['Wheel-Version'].split('.', 1) +- file_version = tuple([int(i) for i in wv]) +- if (file_version != self.wheel_version) and warner: +- warner(self.wheel_version, file_version) +- +- if message['Root-Is-Purelib'] == 'true': +- libdir = paths['purelib'] +- else: +- libdir = paths['platlib'] +- +- records = {} +- with zf.open(record_name) as bf: +- with CSVReader(stream=bf) as reader: +- for row in reader: +- p = row[0] +- records[p] = row +- +- data_pfx = posixpath.join(data_dir, '') +- info_pfx = posixpath.join(info_dir, '') +- script_pfx = posixpath.join(data_dir, 'scripts', '') +- +- # make a new instance rather than a copy of maker's, +- # as we mutate it +- fileop = FileOperator(dry_run=dry_run) +- fileop.record = True # so we can rollback if needed +- +- bc = not sys.dont_write_bytecode # Double negatives. Lovely! +- +- outfiles = [] # for RECORD writing +- +- # for script copying/shebang processing +- workdir = tempfile.mkdtemp() +- # set target dir later +- # we default add_launchers to False, as the +- # Python Launcher should be used instead +- maker.source_dir = workdir +- maker.target_dir = None +- try: +- for zinfo in zf.infolist(): +- arcname = zinfo.filename +- if isinstance(arcname, text_type): +- u_arcname = arcname +- else: +- u_arcname = arcname.decode('utf-8') +- # The signature file won't be in RECORD, +- # and we don't currently don't do anything with it +- if u_arcname.endswith('/RECORD.jws'): +- continue +- row = records[u_arcname] +- if row[2] and str(zinfo.file_size) != row[2]: +- raise DistlibException('size mismatch for ' +- '%s' % u_arcname) +- if row[1]: +- kind, value = row[1].split('=', 1) +- with zf.open(arcname) as bf: +- data = bf.read() +- _, digest = self.get_hash(data, kind) +- if digest != value: +- raise DistlibException('digest mismatch for ' +- '%s' % arcname) +- +- if lib_only and u_arcname.startswith((info_pfx, data_pfx)): +- logger.debug('lib_only: skipping %s', u_arcname) +- continue +- is_script = (u_arcname.startswith(script_pfx) +- and not u_arcname.endswith('.exe')) +- +- if u_arcname.startswith(data_pfx): +- _, where, rp = u_arcname.split('/', 2) +- outfile = os.path.join(paths[where], convert_path(rp)) +- else: +- # meant for site-packages. +- if u_arcname in (wheel_metadata_name, record_name): +- continue +- outfile = os.path.join(libdir, convert_path(u_arcname)) +- if not is_script: +- with zf.open(arcname) as bf: +- fileop.copy_stream(bf, outfile) +- outfiles.append(outfile) +- # Double check the digest of the written file +- if not dry_run and row[1]: +- with open(outfile, 'rb') as bf: +- data = bf.read() +- _, newdigest = self.get_hash(data, kind) +- if newdigest != digest: +- raise DistlibException('digest mismatch ' +- 'on write for ' +- '%s' % outfile) +- if bc and outfile.endswith('.py'): +- try: +- pyc = fileop.byte_compile(outfile) +- outfiles.append(pyc) +- except Exception: +- # Don't give up if byte-compilation fails, +- # but log it and perhaps warn the user +- logger.warning('Byte-compilation failed', +- exc_info=True) +- else: +- fn = os.path.basename(convert_path(arcname)) +- workname = os.path.join(workdir, fn) +- with zf.open(arcname) as bf: +- fileop.copy_stream(bf, workname) +- +- dn, fn = os.path.split(outfile) +- maker.target_dir = dn +- filenames = maker.make(fn) +- fileop.set_executable_mode(filenames) +- outfiles.extend(filenames) +- +- if lib_only: +- logger.debug('lib_only: returning None') +- dist = None +- else: +- # Generate scripts +- +- # Try to get pydist.json so we can see if there are +- # any commands to generate. If this fails (e.g. because +- # of a legacy wheel), log a warning but don't give up. +- commands = None +- file_version = self.info['Wheel-Version'] +- if file_version == '1.0': +- # Use legacy info +- ep = posixpath.join(info_dir, 'entry_points.txt') +- try: +- with zf.open(ep) as bwf: +- epdata = read_exports(bwf) +- commands = {} +- for key in ('console', 'gui'): +- k = '%s_scripts' % key +- if k in epdata: +- commands['wrap_%s' % key] = d = {} +- for v in epdata[k].values(): +- s = '%s:%s' % (v.prefix, v.suffix) +- if v.flags: +- s += ' %s' % v.flags +- d[v.name] = s +- except Exception: +- logger.warning('Unable to read legacy script ' +- 'metadata, so cannot generate ' +- 'scripts') +- else: +- try: +- with zf.open(metadata_name) as bwf: +- wf = wrapper(bwf) +- commands = json.load(wf).get('extensions') +- if commands: +- commands = commands.get('python.commands') +- except Exception: +- logger.warning('Unable to read JSON metadata, so ' +- 'cannot generate scripts') +- if commands: +- console_scripts = commands.get('wrap_console', {}) +- gui_scripts = commands.get('wrap_gui', {}) +- if console_scripts or gui_scripts: +- script_dir = paths.get('scripts', '') +- if not os.path.isdir(script_dir): +- raise ValueError('Valid script path not ' +- 'specified') +- maker.target_dir = script_dir +- for k, v in console_scripts.items(): +- script = '%s = %s' % (k, v) +- filenames = maker.make(script) +- fileop.set_executable_mode(filenames) +- +- if gui_scripts: +- options = {'gui': True } +- for k, v in gui_scripts.items(): +- script = '%s = %s' % (k, v) +- filenames = maker.make(script, options) +- fileop.set_executable_mode(filenames) +- +- p = os.path.join(libdir, info_dir) +- dist = InstalledDistribution(p) +- +- # Write SHARED +- paths = dict(paths) # don't change passed in dict +- del paths['purelib'] +- del paths['platlib'] +- paths['lib'] = libdir +- p = dist.write_shared_locations(paths, dry_run) +- if p: +- outfiles.append(p) +- +- # Write RECORD +- dist.write_installed_files(outfiles, paths['prefix'], +- dry_run) +- return dist +- except Exception: # pragma: no cover +- logger.exception('installation failed.') +- fileop.rollback() +- raise +- finally: +- shutil.rmtree(workdir) +- +- def _get_dylib_cache(self): +- global cache +- if cache is None: +- # Use native string to avoid issues on 2.x: see Python #20140. +- base = os.path.join(get_cache_base(), str('dylib-cache'), +- sys.version[:3]) +- cache = Cache(base) +- return cache +- +- def _get_extensions(self): +- pathname = os.path.join(self.dirname, self.filename) +- name_ver = '%s-%s' % (self.name, self.version) +- info_dir = '%s.dist-info' % name_ver +- arcname = posixpath.join(info_dir, 'EXTENSIONS') +- wrapper = codecs.getreader('utf-8') +- result = [] +- with ZipFile(pathname, 'r') as zf: +- try: +- with zf.open(arcname) as bf: +- wf = wrapper(bf) +- extensions = json.load(wf) +- cache = self._get_dylib_cache() +- prefix = cache.prefix_to_dir(pathname) +- cache_base = os.path.join(cache.base, prefix) +- if not os.path.isdir(cache_base): +- os.makedirs(cache_base) +- for name, relpath in extensions.items(): +- dest = os.path.join(cache_base, convert_path(relpath)) +- if not os.path.exists(dest): +- extract = True +- else: +- file_time = os.stat(dest).st_mtime +- file_time = datetime.datetime.fromtimestamp(file_time) +- info = zf.getinfo(relpath) +- wheel_time = datetime.datetime(*info.date_time) +- extract = wheel_time > file_time +- if extract: +- zf.extract(relpath, cache_base) +- result.append((name, dest)) +- except KeyError: +- pass +- return result +- +- def is_compatible(self): +- """ +- Determine if a wheel is compatible with the running system. +- """ +- return is_compatible(self) +- +- def is_mountable(self): +- """ +- Determine if a wheel is asserted as mountable by its metadata. +- """ +- return True # for now - metadata details TBD +- +- def mount(self, append=False): +- pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) +- if not self.is_compatible(): +- msg = 'Wheel %s not compatible with this Python.' % pathname +- raise DistlibException(msg) +- if not self.is_mountable(): +- msg = 'Wheel %s is marked as not mountable.' % pathname +- raise DistlibException(msg) +- if pathname in sys.path: +- logger.debug('%s already in path', pathname) +- else: +- if append: +- sys.path.append(pathname) +- else: +- sys.path.insert(0, pathname) +- extensions = self._get_extensions() +- if extensions: +- if _hook not in sys.meta_path: +- sys.meta_path.append(_hook) +- _hook.add(pathname, extensions) +- +- def unmount(self): +- pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) +- if pathname not in sys.path: +- logger.debug('%s not in path', pathname) +- else: +- sys.path.remove(pathname) +- if pathname in _hook.impure_wheels: +- _hook.remove(pathname) +- if not _hook.impure_wheels: +- if _hook in sys.meta_path: +- sys.meta_path.remove(_hook) +- +- def verify(self): +- pathname = os.path.join(self.dirname, self.filename) +- name_ver = '%s-%s' % (self.name, self.version) +- data_dir = '%s.data' % name_ver +- info_dir = '%s.dist-info' % name_ver +- +- metadata_name = posixpath.join(info_dir, METADATA_FILENAME) +- wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') +- record_name = posixpath.join(info_dir, 'RECORD') +- +- wrapper = codecs.getreader('utf-8') +- +- with ZipFile(pathname, 'r') as zf: +- with zf.open(wheel_metadata_name) as bwf: +- wf = wrapper(bwf) +- message = message_from_file(wf) +- wv = message['Wheel-Version'].split('.', 1) +- file_version = tuple([int(i) for i in wv]) +- # TODO version verification +- +- records = {} +- with zf.open(record_name) as bf: +- with CSVReader(stream=bf) as reader: +- for row in reader: +- p = row[0] +- records[p] = row +- +- for zinfo in zf.infolist(): +- arcname = zinfo.filename +- if isinstance(arcname, text_type): +- u_arcname = arcname +- else: +- u_arcname = arcname.decode('utf-8') +- if '..' in u_arcname: +- raise DistlibException('invalid entry in ' +- 'wheel: %r' % u_arcname) +- +- # The signature file won't be in RECORD, +- # and we don't currently don't do anything with it +- if u_arcname.endswith('/RECORD.jws'): +- continue +- row = records[u_arcname] +- if row[2] and str(zinfo.file_size) != row[2]: +- raise DistlibException('size mismatch for ' +- '%s' % u_arcname) +- if row[1]: +- kind, value = row[1].split('=', 1) +- with zf.open(arcname) as bf: +- data = bf.read() +- _, digest = self.get_hash(data, kind) +- if digest != value: +- raise DistlibException('digest mismatch for ' +- '%s' % arcname) +- +- def update(self, modifier, dest_dir=None, **kwargs): +- """ +- Update the contents of a wheel in a generic way. The modifier should +- be a callable which expects a dictionary argument: its keys are +- archive-entry paths, and its values are absolute filesystem paths +- where the contents the corresponding archive entries can be found. The +- modifier is free to change the contents of the files pointed to, add +- new entries and remove entries, before returning. This method will +- extract the entire contents of the wheel to a temporary location, call +- the modifier, and then use the passed (and possibly updated) +- dictionary to write a new wheel. If ``dest_dir`` is specified, the new +- wheel is written there -- otherwise, the original wheel is overwritten. +- +- The modifier should return True if it updated the wheel, else False. +- This method returns the same value the modifier returns. +- """ +- +- def get_version(path_map, info_dir): +- version = path = None +- key = '%s/%s' % (info_dir, METADATA_FILENAME) +- if key not in path_map: +- key = '%s/PKG-INFO' % info_dir +- if key in path_map: +- path = path_map[key] +- version = Metadata(path=path).version +- return version, path +- +- def update_version(version, path): +- updated = None +- try: +- v = NormalizedVersion(version) +- i = version.find('-') +- if i < 0: +- updated = '%s+1' % version +- else: +- parts = [int(s) for s in version[i + 1:].split('.')] +- parts[-1] += 1 +- updated = '%s+%s' % (version[:i], +- '.'.join(str(i) for i in parts)) +- except UnsupportedVersionError: +- logger.debug('Cannot update non-compliant (PEP-440) ' +- 'version %r', version) +- if updated: +- md = Metadata(path=path) +- md.version = updated +- legacy = not path.endswith(METADATA_FILENAME) +- md.write(path=path, legacy=legacy) +- logger.debug('Version updated from %r to %r', version, +- updated) +- +- pathname = os.path.join(self.dirname, self.filename) +- name_ver = '%s-%s' % (self.name, self.version) +- info_dir = '%s.dist-info' % name_ver +- record_name = posixpath.join(info_dir, 'RECORD') +- with tempdir() as workdir: +- with ZipFile(pathname, 'r') as zf: +- path_map = {} +- for zinfo in zf.infolist(): +- arcname = zinfo.filename +- if isinstance(arcname, text_type): +- u_arcname = arcname +- else: +- u_arcname = arcname.decode('utf-8') +- if u_arcname == record_name: +- continue +- if '..' in u_arcname: +- raise DistlibException('invalid entry in ' +- 'wheel: %r' % u_arcname) +- zf.extract(zinfo, workdir) +- path = os.path.join(workdir, convert_path(u_arcname)) +- path_map[u_arcname] = path +- +- # Remember the version. +- original_version, _ = get_version(path_map, info_dir) +- # Files extracted. Call the modifier. +- modified = modifier(path_map, **kwargs) +- if modified: +- # Something changed - need to build a new wheel. +- current_version, path = get_version(path_map, info_dir) +- if current_version and (current_version == original_version): +- # Add or update local version to signify changes. +- update_version(current_version, path) +- # Decide where the new wheel goes. +- if dest_dir is None: +- fd, newpath = tempfile.mkstemp(suffix='.whl', +- prefix='wheel-update-', +- dir=workdir) +- os.close(fd) +- else: +- if not os.path.isdir(dest_dir): +- raise DistlibException('Not a directory: %r' % dest_dir) +- newpath = os.path.join(dest_dir, self.filename) +- archive_paths = list(path_map.items()) +- distinfo = os.path.join(workdir, info_dir) +- info = distinfo, info_dir +- self.write_records(info, workdir, archive_paths) +- self.build_zip(newpath, archive_paths) +- if dest_dir is None: +- shutil.copyfile(newpath, pathname) +- return modified +- +-def compatible_tags(): +- """ +- Return (pyver, abi, arch) tuples compatible with this Python. +- """ +- versions = [VER_SUFFIX] +- major = VER_SUFFIX[0] +- for minor in range(sys.version_info[1] - 1, - 1, -1): +- versions.append(''.join([major, str(minor)])) +- +- abis = [] +- for suffix, _, _ in imp.get_suffixes(): +- if suffix.startswith('.abi'): +- abis.append(suffix.split('.', 2)[1]) +- abis.sort() +- if ABI != 'none': +- abis.insert(0, ABI) +- abis.append('none') +- result = [] +- +- arches = [ARCH] +- if sys.platform == 'darwin': +- m = re.match('(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) +- if m: +- name, major, minor, arch = m.groups() +- minor = int(minor) +- matches = [arch] +- if arch in ('i386', 'ppc'): +- matches.append('fat') +- if arch in ('i386', 'ppc', 'x86_64'): +- matches.append('fat3') +- if arch in ('ppc64', 'x86_64'): +- matches.append('fat64') +- if arch in ('i386', 'x86_64'): +- matches.append('intel') +- if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): +- matches.append('universal') +- while minor >= 0: +- for match in matches: +- s = '%s_%s_%s_%s' % (name, major, minor, match) +- if s != ARCH: # already there +- arches.append(s) +- minor -= 1 +- +- # Most specific - our Python version, ABI and arch +- for abi in abis: +- for arch in arches: +- result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) +- +- # where no ABI / arch dependency, but IMP_PREFIX dependency +- for i, version in enumerate(versions): +- result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) +- if i == 0: +- result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) +- +- # no IMP_PREFIX, ABI or arch dependency +- for i, version in enumerate(versions): +- result.append((''.join(('py', version)), 'none', 'any')) +- if i == 0: +- result.append((''.join(('py', version[0])), 'none', 'any')) +- return set(result) +- +- +-COMPATIBLE_TAGS = compatible_tags() +- +-del compatible_tags +- +- +-def is_compatible(wheel, tags=None): +- if not isinstance(wheel, Wheel): +- wheel = Wheel(wheel) # assume it's a filename +- result = False +- if tags is None: +- tags = COMPATIBLE_TAGS +- for ver, abi, arch in tags: +- if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: +- result = True +- break +- return result +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/distro.py b/pipenv/patched/piptools/_vendored/pip/_vendor/distro.py +deleted file mode 100644 +index 9e7daad..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/distro.py ++++ /dev/null +@@ -1,1081 +0,0 @@ +-# Copyright 2015,2016 Nir Cohen +-# +-# 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. +- +-""" +-The ``distro`` package (``distro`` stands for Linux Distribution) provides +-information about the Linux distribution it runs on, such as a reliable +-machine-readable distro ID, or version information. +- +-It is a renewed alternative implementation for Python's original +-:py:func:`platform.linux_distribution` function, but it provides much more +-functionality. An alternative implementation became necessary because Python +-3.5 deprecated this function, and Python 3.7 is expected to remove it +-altogether. Its predecessor function :py:func:`platform.dist` was already +-deprecated since Python 2.6 and is also expected to be removed in Python 3.7. +-Still, there are many cases in which access to Linux distribution information +-is needed. See `Python issue 1322 `_ for +-more information. +-""" +- +-import os +-import re +-import sys +-import json +-import shlex +-import logging +-import subprocess +- +- +-if not sys.platform.startswith('linux'): +- raise ImportError('Unsupported platform: {0}'.format(sys.platform)) +- +-_UNIXCONFDIR = '/etc' +-_OS_RELEASE_BASENAME = 'os-release' +- +-#: Translation table for normalizing the "ID" attribute defined in os-release +-#: files, for use by the :func:`distro.id` method. +-#: +-#: * Key: Value as defined in the os-release file, translated to lower case, +-#: with blanks translated to underscores. +-#: +-#: * Value: Normalized value. +-NORMALIZED_OS_ID = {} +- +-#: Translation table for normalizing the "Distributor ID" attribute returned by +-#: the lsb_release command, for use by the :func:`distro.id` method. +-#: +-#: * Key: Value as returned by the lsb_release command, translated to lower +-#: case, with blanks translated to underscores. +-#: +-#: * Value: Normalized value. +-NORMALIZED_LSB_ID = { +- 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux +- 'redhatenterpriseworkstation': 'rhel', # RHEL 6.7 +-} +- +-#: Translation table for normalizing the distro ID derived from the file name +-#: of distro release files, for use by the :func:`distro.id` method. +-#: +-#: * Key: Value as derived from the file name of a distro release file, +-#: translated to lower case, with blanks translated to underscores. +-#: +-#: * Value: Normalized value. +-NORMALIZED_DISTRO_ID = { +- 'redhat': 'rhel', # RHEL 6.x, 7.x +-} +- +-# Pattern for content of distro release file (reversed) +-_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( +- r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') +- +-# Pattern for base file name of distro release file +-_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( +- r'(\w+)[-_](release|version)$') +- +-# Base file names to be ignored when searching for distro release file +-_DISTRO_RELEASE_IGNORE_BASENAMES = ( +- 'debian_version', +- 'lsb-release', +- 'oem-release', +- _OS_RELEASE_BASENAME, +- 'system-release' +-) +- +- +-def linux_distribution(full_distribution_name=True): +- """ +- Return information about the current Linux distribution as a tuple +- ``(id_name, version, codename)`` with items as follows: +- +- * ``id_name``: If *full_distribution_name* is false, the result of +- :func:`distro.id`. Otherwise, the result of :func:`distro.name`. +- +- * ``version``: The result of :func:`distro.version`. +- +- * ``codename``: The result of :func:`distro.codename`. +- +- The interface of this function is compatible with the original +- :py:func:`platform.linux_distribution` function, supporting a subset of +- its parameters. +- +- The data it returns may not exactly be the same, because it uses more data +- sources than the original function, and that may lead to different data if +- the Linux distribution is not consistent across multiple data sources it +- provides (there are indeed such distributions ...). +- +- Another reason for differences is the fact that the :func:`distro.id` +- method normalizes the distro ID string to a reliable machine-readable value +- for a number of popular Linux distributions. +- """ +- return _distro.linux_distribution(full_distribution_name) +- +- +-def id(): +- """ +- Return the distro ID of the current Linux distribution, as a +- machine-readable string. +- +- For a number of Linux distributions, the returned distro ID value is +- *reliable*, in the sense that it is documented and that it does not change +- across releases of the distribution. +- +- This package maintains the following reliable distro ID values: +- +- ============== ========================================= +- Distro ID Distribution +- ============== ========================================= +- "ubuntu" Ubuntu +- "debian" Debian +- "rhel" RedHat Enterprise Linux +- "centos" CentOS +- "fedora" Fedora +- "sles" SUSE Linux Enterprise Server +- "opensuse" openSUSE +- "amazon" Amazon Linux +- "arch" Arch Linux +- "cloudlinux" CloudLinux OS +- "exherbo" Exherbo Linux +- "gentoo" GenToo Linux +- "ibm_powerkvm" IBM PowerKVM +- "kvmibm" KVM for IBM z Systems +- "linuxmint" Linux Mint +- "mageia" Mageia +- "mandriva" Mandriva Linux +- "parallels" Parallels +- "pidora" Pidora +- "raspbian" Raspbian +- "oracle" Oracle Linux (and Oracle Enterprise Linux) +- "scientific" Scientific Linux +- "slackware" Slackware +- "xenserver" XenServer +- ============== ========================================= +- +- If you have a need to get distros for reliable IDs added into this set, +- or if you find that the :func:`distro.id` function returns a different +- distro ID for one of the listed distros, please create an issue in the +- `distro issue tracker`_. +- +- **Lookup hierarchy and transformations:** +- +- First, the ID is obtained from the following sources, in the specified +- order. The first available and non-empty value is used: +- +- * the value of the "ID" attribute of the os-release file, +- +- * the value of the "Distributor ID" attribute returned by the lsb_release +- command, +- +- * the first part of the file name of the distro release file, +- +- The so determined ID value then passes the following transformations, +- before it is returned by this method: +- +- * it is translated to lower case, +- +- * blanks (which should not be there anyway) are translated to underscores, +- +- * a normalization of the ID is performed, based upon +- `normalization tables`_. The purpose of this normalization is to ensure +- that the ID is as reliable as possible, even across incompatible changes +- in the Linux distributions. A common reason for an incompatible change is +- the addition of an os-release file, or the addition of the lsb_release +- command, with ID values that differ from what was previously determined +- from the distro release file name. +- """ +- return _distro.id() +- +- +-def name(pretty=False): +- """ +- Return the name of the current Linux distribution, as a human-readable +- string. +- +- If *pretty* is false, the name is returned without version or codename. +- (e.g. "CentOS Linux") +- +- If *pretty* is true, the version and codename are appended. +- (e.g. "CentOS Linux 7.1.1503 (Core)") +- +- **Lookup hierarchy:** +- +- The name is obtained from the following sources, in the specified order. +- The first available and non-empty value is used: +- +- * If *pretty* is false: +- +- - the value of the "NAME" attribute of the os-release file, +- +- - the value of the "Distributor ID" attribute returned by the lsb_release +- command, +- +- - the value of the "" field of the distro release file. +- +- * If *pretty* is true: +- +- - the value of the "PRETTY_NAME" attribute of the os-release file, +- +- - the value of the "Description" attribute returned by the lsb_release +- command, +- +- - the value of the "" field of the distro release file, appended +- with the value of the pretty version ("" and "" +- fields) of the distro release file, if available. +- """ +- return _distro.name(pretty) +- +- +-def version(pretty=False, best=False): +- """ +- Return the version of the current Linux distribution, as a human-readable +- string. +- +- If *pretty* is false, the version is returned without codename (e.g. +- "7.0"). +- +- If *pretty* is true, the codename in parenthesis is appended, if the +- codename is non-empty (e.g. "7.0 (Maipo)"). +- +- Some distributions provide version numbers with different precisions in +- the different sources of distribution information. Examining the different +- sources in a fixed priority order does not always yield the most precise +- version (e.g. for Debian 8.2, or CentOS 7.1). +- +- The *best* parameter can be used to control the approach for the returned +- version: +- +- If *best* is false, the first non-empty version number in priority order of +- the examined sources is returned. +- +- If *best* is true, the most precise version number out of all examined +- sources is returned. +- +- **Lookup hierarchy:** +- +- In all cases, the version number is obtained from the following sources. +- If *best* is false, this order represents the priority order: +- +- * the value of the "VERSION_ID" attribute of the os-release file, +- * the value of the "Release" attribute returned by the lsb_release +- command, +- * the version number parsed from the "" field of the first line +- of the distro release file, +- * the version number parsed from the "PRETTY_NAME" attribute of the +- os-release file, if it follows the format of the distro release files. +- * the version number parsed from the "Description" attribute returned by +- the lsb_release command, if it follows the format of the distro release +- files. +- """ +- return _distro.version(pretty, best) +- +- +-def version_parts(best=False): +- """ +- Return the version of the current Linux distribution as a tuple +- ``(major, minor, build_number)`` with items as follows: +- +- * ``major``: The result of :func:`distro.major_version`. +- +- * ``minor``: The result of :func:`distro.minor_version`. +- +- * ``build_number``: The result of :func:`distro.build_number`. +- +- For a description of the *best* parameter, see the :func:`distro.version` +- method. +- """ +- return _distro.version_parts(best) +- +- +-def major_version(best=False): +- """ +- Return the major version of the current Linux distribution, as a string, +- if provided. +- Otherwise, the empty string is returned. The major version is the first +- part of the dot-separated version string. +- +- For a description of the *best* parameter, see the :func:`distro.version` +- method. +- """ +- return _distro.major_version(best) +- +- +-def minor_version(best=False): +- """ +- Return the minor version of the current Linux distribution, as a string, +- if provided. +- Otherwise, the empty string is returned. The minor version is the second +- part of the dot-separated version string. +- +- For a description of the *best* parameter, see the :func:`distro.version` +- method. +- """ +- return _distro.minor_version(best) +- +- +-def build_number(best=False): +- """ +- Return the build number of the current Linux distribution, as a string, +- if provided. +- Otherwise, the empty string is returned. The build number is the third part +- of the dot-separated version string. +- +- For a description of the *best* parameter, see the :func:`distro.version` +- method. +- """ +- return _distro.build_number(best) +- +- +-def like(): +- """ +- Return a space-separated list of distro IDs of distributions that are +- closely related to the current Linux distribution in regards to packaging +- and programming interfaces, for example distributions the current +- distribution is a derivative from. +- +- **Lookup hierarchy:** +- +- This information item is only provided by the os-release file. +- For details, see the description of the "ID_LIKE" attribute in the +- `os-release man page +- `_. +- """ +- return _distro.like() +- +- +-def codename(): +- """ +- Return the codename for the release of the current Linux distribution, +- as a string. +- +- If the distribution does not have a codename, an empty string is returned. +- +- Note that the returned codename is not always really a codename. For +- example, openSUSE returns "x86_64". This function does not handle such +- cases in any special way and just returns the string it finds, if any. +- +- **Lookup hierarchy:** +- +- * the codename within the "VERSION" attribute of the os-release file, if +- provided, +- +- * the value of the "Codename" attribute returned by the lsb_release +- command, +- +- * the value of the "" field of the distro release file. +- """ +- return _distro.codename() +- +- +-def info(pretty=False, best=False): +- """ +- Return certain machine-readable information items about the current Linux +- distribution in a dictionary, as shown in the following example: +- +- .. sourcecode:: python +- +- { +- 'id': 'rhel', +- 'version': '7.0', +- 'version_parts': { +- 'major': '7', +- 'minor': '0', +- 'build_number': '' +- }, +- 'like': 'fedora', +- 'codename': 'Maipo' +- } +- +- The dictionary structure and keys are always the same, regardless of which +- information items are available in the underlying data sources. The values +- for the various keys are as follows: +- +- * ``id``: The result of :func:`distro.id`. +- +- * ``version``: The result of :func:`distro.version`. +- +- * ``version_parts -> major``: The result of :func:`distro.major_version`. +- +- * ``version_parts -> minor``: The result of :func:`distro.minor_version`. +- +- * ``version_parts -> build_number``: The result of +- :func:`distro.build_number`. +- +- * ``like``: The result of :func:`distro.like`. +- +- * ``codename``: The result of :func:`distro.codename`. +- +- For a description of the *pretty* and *best* parameters, see the +- :func:`distro.version` method. +- """ +- return _distro.info(pretty, best) +- +- +-def os_release_info(): +- """ +- Return a dictionary containing key-value pairs for the information items +- from the os-release file data source of the current Linux distribution. +- +- See `os-release file`_ for details about these information items. +- """ +- return _distro.os_release_info() +- +- +-def lsb_release_info(): +- """ +- Return a dictionary containing key-value pairs for the information items +- from the lsb_release command data source of the current Linux distribution. +- +- See `lsb_release command output`_ for details about these information +- items. +- """ +- return _distro.lsb_release_info() +- +- +-def distro_release_info(): +- """ +- Return a dictionary containing key-value pairs for the information items +- from the distro release file data source of the current Linux distribution. +- +- See `distro release file`_ for details about these information items. +- """ +- return _distro.distro_release_info() +- +- +-def os_release_attr(attribute): +- """ +- Return a single named information item from the os-release file data source +- of the current Linux distribution. +- +- Parameters: +- +- * ``attribute`` (string): Key of the information item. +- +- Returns: +- +- * (string): Value of the information item, if the item exists. +- The empty string, if the item does not exist. +- +- See `os-release file`_ for details about these information items. +- """ +- return _distro.os_release_attr(attribute) +- +- +-def lsb_release_attr(attribute): +- """ +- Return a single named information item from the lsb_release command output +- data source of the current Linux distribution. +- +- Parameters: +- +- * ``attribute`` (string): Key of the information item. +- +- Returns: +- +- * (string): Value of the information item, if the item exists. +- The empty string, if the item does not exist. +- +- See `lsb_release command output`_ for details about these information +- items. +- """ +- return _distro.lsb_release_attr(attribute) +- +- +-def distro_release_attr(attribute): +- """ +- Return a single named information item from the distro release file +- data source of the current Linux distribution. +- +- Parameters: +- +- * ``attribute`` (string): Key of the information item. +- +- Returns: +- +- * (string): Value of the information item, if the item exists. +- The empty string, if the item does not exist. +- +- See `distro release file`_ for details about these information items. +- """ +- return _distro.distro_release_attr(attribute) +- +- +-class LinuxDistribution(object): +- """ +- Provides information about a Linux distribution. +- +- This package creates a private module-global instance of this class with +- default initialization arguments, that is used by the +- `consolidated accessor functions`_ and `single source accessor functions`_. +- By using default initialization arguments, that module-global instance +- returns data about the current Linux distribution (i.e. the distro this +- package runs on). +- +- Normally, it is not necessary to create additional instances of this class. +- However, in situations where control is needed over the exact data sources +- that are used, instances of this class can be created with a specific +- distro release file, or a specific os-release file, or without invoking the +- lsb_release command. +- """ +- +- def __init__(self, +- include_lsb=True, +- os_release_file='', +- distro_release_file=''): +- """ +- The initialization method of this class gathers information from the +- available data sources, and stores that in private instance attributes. +- Subsequent access to the information items uses these private instance +- attributes, so that the data sources are read only once. +- +- Parameters: +- +- * ``include_lsb`` (bool): Controls whether the +- `lsb_release command output`_ is included as a data source. +- +- If the lsb_release command is not available in the program execution +- path, the data source for the lsb_release command will be empty. +- +- * ``os_release_file`` (string): The path name of the +- `os-release file`_ that is to be used as a data source. +- +- An empty string (the default) will cause the default path name to +- be used (see `os-release file`_ for details). +- +- If the specified or defaulted os-release file does not exist, the +- data source for the os-release file will be empty. +- +- * ``distro_release_file`` (string): The path name of the +- `distro release file`_ that is to be used as a data source. +- +- An empty string (the default) will cause a default search algorithm +- to be used (see `distro release file`_ for details). +- +- If the specified distro release file does not exist, or if no default +- distro release file can be found, the data source for the distro +- release file will be empty. +- +- Public instance attributes: +- +- * ``os_release_file`` (string): The path name of the +- `os-release file`_ that is actually used as a data source. The +- empty string if no distro release file is used as a data source. +- +- * ``distro_release_file`` (string): The path name of the +- `distro release file`_ that is actually used as a data source. The +- empty string if no distro release file is used as a data source. +- +- Raises: +- +- * :py:exc:`IOError`: Some I/O issue with an os-release file or distro +- release file. +- +- * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had +- some issue (other than not being available in the program execution +- path). +- +- * :py:exc:`UnicodeError`: A data source has unexpected characters or +- uses an unexpected encoding. +- """ +- self.os_release_file = os_release_file or \ +- os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) +- self.distro_release_file = distro_release_file or '' # updated later +- self._os_release_info = self._get_os_release_info() +- self._lsb_release_info = self._get_lsb_release_info() \ +- if include_lsb else {} +- self._distro_release_info = self._get_distro_release_info() +- +- def __repr__(self): +- """Return repr of all info +- """ +- return \ +- "LinuxDistribution(" \ +- "os_release_file={0!r}, " \ +- "distro_release_file={1!r}, " \ +- "_os_release_info={2!r}, " \ +- "_lsb_release_info={3!r}, " \ +- "_distro_release_info={4!r})".format( +- self.os_release_file, +- self.distro_release_file, +- self._os_release_info, +- self._lsb_release_info, +- self._distro_release_info) +- +- def linux_distribution(self, full_distribution_name=True): +- """ +- Return information about the Linux distribution that is compatible +- with Python's :func:`platform.linux_distribution`, supporting a subset +- of its parameters. +- +- For details, see :func:`distro.linux_distribution`. +- """ +- return ( +- self.name() if full_distribution_name else self.id(), +- self.version(), +- self.codename() +- ) +- +- def id(self): +- """Return the distro ID of the Linux distribution, as a string. +- +- For details, see :func:`distro.id`. +- """ +- def normalize(distro_id, table): +- distro_id = distro_id.lower().replace(' ', '_') +- return table.get(distro_id, distro_id) +- +- distro_id = self.os_release_attr('id') +- if distro_id: +- return normalize(distro_id, NORMALIZED_OS_ID) +- +- distro_id = self.lsb_release_attr('distributor_id') +- if distro_id: +- return normalize(distro_id, NORMALIZED_LSB_ID) +- +- distro_id = self.distro_release_attr('id') +- if distro_id: +- return normalize(distro_id, NORMALIZED_DISTRO_ID) +- +- return '' +- +- def name(self, pretty=False): +- """ +- Return the name of the Linux distribution, as a string. +- +- For details, see :func:`distro.name`. +- """ +- name = self.os_release_attr('name') \ +- or self.lsb_release_attr('distributor_id') \ +- or self.distro_release_attr('name') +- if pretty: +- name = self.os_release_attr('pretty_name') \ +- or self.lsb_release_attr('description') +- if not name: +- name = self.distro_release_attr('name') +- version = self.version(pretty=True) +- if version: +- name = name + ' ' + version +- return name or '' +- +- def version(self, pretty=False, best=False): +- """ +- Return the version of the Linux distribution, as a string. +- +- For details, see :func:`distro.version`. +- """ +- versions = [ +- self.os_release_attr('version_id'), +- self.lsb_release_attr('release'), +- self.distro_release_attr('version_id'), +- self._parse_distro_release_content( +- self.os_release_attr('pretty_name')).get('version_id', ''), +- self._parse_distro_release_content( +- self.lsb_release_attr('description')).get('version_id', '') +- ] +- version = '' +- if best: +- # This algorithm uses the last version in priority order that has +- # the best precision. If the versions are not in conflict, that +- # does not matter; otherwise, using the last one instead of the +- # first one might be considered a surprise. +- for v in versions: +- if v.count(".") > version.count(".") or version == '': +- version = v +- else: +- for v in versions: +- if v != '': +- version = v +- break +- if pretty and version and self.codename(): +- version = u'{0} ({1})'.format(version, self.codename()) +- return version +- +- def version_parts(self, best=False): +- """ +- Return the version of the Linux distribution, as a tuple of version +- numbers. +- +- For details, see :func:`distro.version_parts`. +- """ +- version_str = self.version(best=best) +- if version_str: +- version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') +- matches = version_regex.match(version_str) +- if matches: +- major, minor, build_number = matches.groups() +- return major, minor or '', build_number or '' +- return '', '', '' +- +- def major_version(self, best=False): +- """ +- Return the major version number of the current distribution. +- +- For details, see :func:`distro.major_version`. +- """ +- return self.version_parts(best)[0] +- +- def minor_version(self, best=False): +- """ +- Return the minor version number of the Linux distribution. +- +- For details, see :func:`distro.minor_version`. +- """ +- return self.version_parts(best)[1] +- +- def build_number(self, best=False): +- """ +- Return the build number of the Linux distribution. +- +- For details, see :func:`distro.build_number`. +- """ +- return self.version_parts(best)[2] +- +- def like(self): +- """ +- Return the IDs of distributions that are like the Linux distribution. +- +- For details, see :func:`distro.like`. +- """ +- return self.os_release_attr('id_like') or '' +- +- def codename(self): +- """ +- Return the codename of the Linux distribution. +- +- For details, see :func:`distro.codename`. +- """ +- return self.os_release_attr('codename') \ +- or self.lsb_release_attr('codename') \ +- or self.distro_release_attr('codename') \ +- or '' +- +- def info(self, pretty=False, best=False): +- """ +- Return certain machine-readable information about the Linux +- distribution. +- +- For details, see :func:`distro.info`. +- """ +- return dict( +- id=self.id(), +- version=self.version(pretty, best), +- version_parts=dict( +- major=self.major_version(best), +- minor=self.minor_version(best), +- build_number=self.build_number(best) +- ), +- like=self.like(), +- codename=self.codename(), +- ) +- +- def os_release_info(self): +- """ +- Return a dictionary containing key-value pairs for the information +- items from the os-release file data source of the Linux distribution. +- +- For details, see :func:`distro.os_release_info`. +- """ +- return self._os_release_info +- +- def lsb_release_info(self): +- """ +- Return a dictionary containing key-value pairs for the information +- items from the lsb_release command data source of the Linux +- distribution. +- +- For details, see :func:`distro.lsb_release_info`. +- """ +- return self._lsb_release_info +- +- def distro_release_info(self): +- """ +- Return a dictionary containing key-value pairs for the information +- items from the distro release file data source of the Linux +- distribution. +- +- For details, see :func:`distro.distro_release_info`. +- """ +- return self._distro_release_info +- +- def os_release_attr(self, attribute): +- """ +- Return a single named information item from the os-release file data +- source of the Linux distribution. +- +- For details, see :func:`distro.os_release_attr`. +- """ +- return self._os_release_info.get(attribute, '') +- +- def lsb_release_attr(self, attribute): +- """ +- Return a single named information item from the lsb_release command +- output data source of the Linux distribution. +- +- For details, see :func:`distro.lsb_release_attr`. +- """ +- return self._lsb_release_info.get(attribute, '') +- +- def distro_release_attr(self, attribute): +- """ +- Return a single named information item from the distro release file +- data source of the Linux distribution. +- +- For details, see :func:`distro.distro_release_attr`. +- """ +- return self._distro_release_info.get(attribute, '') +- +- def _get_os_release_info(self): +- """ +- Get the information items from the specified os-release file. +- +- Returns: +- A dictionary containing all information items. +- """ +- if os.path.isfile(self.os_release_file): +- with open(self.os_release_file) as release_file: +- return self._parse_os_release_content(release_file) +- return {} +- +- @staticmethod +- def _parse_os_release_content(lines): +- """ +- Parse the lines of an os-release file. +- +- Parameters: +- +- * lines: Iterable through the lines in the os-release file. +- Each line must be a unicode string or a UTF-8 encoded byte +- string. +- +- Returns: +- A dictionary containing all information items. +- """ +- props = {} +- lexer = shlex.shlex(lines, posix=True) +- lexer.whitespace_split = True +- +- # The shlex module defines its `wordchars` variable using literals, +- # making it dependent on the encoding of the Python source file. +- # In Python 2.6 and 2.7, the shlex source file is encoded in +- # 'iso-8859-1', and the `wordchars` variable is defined as a byte +- # string. This causes a UnicodeDecodeError to be raised when the +- # parsed content is a unicode object. The following fix resolves that +- # (... but it should be fixed in shlex...): +- if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): +- lexer.wordchars = lexer.wordchars.decode('iso-8859-1') +- +- tokens = list(lexer) +- for token in tokens: +- # At this point, all shell-like parsing has been done (i.e. +- # comments processed, quotes and backslash escape sequences +- # processed, multi-line values assembled, trailing newlines +- # stripped, etc.), so the tokens are now either: +- # * variable assignments: var=value +- # * commands or their arguments (not allowed in os-release) +- if '=' in token: +- k, v = token.split('=', 1) +- if isinstance(v, bytes): +- v = v.decode('utf-8') +- props[k.lower()] = v +- if k == 'VERSION': +- # this handles cases in which the codename is in +- # the `(CODENAME)` (rhel, centos, fedora) format +- # or in the `, CODENAME` format (Ubuntu). +- codename = re.search(r'(\(\D+\))|,(\s+)?\D+', v) +- if codename: +- codename = codename.group() +- codename = codename.strip('()') +- codename = codename.strip(',') +- codename = codename.strip() +- # codename appears within paranthese. +- props['codename'] = codename +- else: +- props['codename'] = '' +- else: +- # Ignore any tokens that are not variable assignments +- pass +- return props +- +- def _get_lsb_release_info(self): +- """ +- Get the information items from the lsb_release command output. +- +- Returns: +- A dictionary containing all information items. +- """ +- cmd = 'lsb_release -a' +- process = subprocess.Popen( +- cmd, +- shell=True, +- stdout=subprocess.PIPE, +- stderr=subprocess.PIPE) +- stdout, stderr = process.communicate() +- stdout, stderr = stdout.decode('utf-8'), stderr.decode('utf-8') +- code = process.returncode +- if code == 0: +- content = stdout.splitlines() +- return self._parse_lsb_release_content(content) +- elif code == 127: # Command not found +- return {} +- else: +- if sys.version_info[:2] >= (3, 5): +- raise subprocess.CalledProcessError(code, cmd, stdout, stderr) +- elif sys.version_info[:2] >= (2, 7): +- raise subprocess.CalledProcessError(code, cmd, stdout) +- elif sys.version_info[:2] == (2, 6): +- raise subprocess.CalledProcessError(code, cmd) +- +- @staticmethod +- def _parse_lsb_release_content(lines): +- """ +- Parse the output of the lsb_release command. +- +- Parameters: +- +- * lines: Iterable through the lines of the lsb_release output. +- Each line must be a unicode string or a UTF-8 encoded byte +- string. +- +- Returns: +- A dictionary containing all information items. +- """ +- props = {} +- for line in lines: +- line = line.decode('utf-8') if isinstance(line, bytes) else line +- kv = line.strip('\n').split(':', 1) +- if len(kv) != 2: +- # Ignore lines without colon. +- continue +- k, v = kv +- props.update({k.replace(' ', '_').lower(): v.strip()}) +- return props +- +- def _get_distro_release_info(self): +- """ +- Get the information items from the specified distro release file. +- +- Returns: +- A dictionary containing all information items. +- """ +- if self.distro_release_file: +- # If it was specified, we use it and parse what we can, even if +- # its file name or content does not match the expected pattern. +- distro_info = self._parse_distro_release_file( +- self.distro_release_file) +- basename = os.path.basename(self.distro_release_file) +- # The file name pattern for user-specified distro release files +- # is somewhat more tolerant (compared to when searching for the +- # file), because we want to use what was specified as best as +- # possible. +- match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) +- if match: +- distro_info['id'] = match.group(1) +- return distro_info +- else: +- basenames = os.listdir(_UNIXCONFDIR) +- # We sort for repeatability in cases where there are multiple +- # distro specific files; e.g. CentOS, Oracle, Enterprise all +- # containing `redhat-release` on top of their own. +- basenames.sort() +- for basename in basenames: +- if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: +- continue +- match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) +- if match: +- filepath = os.path.join(_UNIXCONFDIR, basename) +- distro_info = self._parse_distro_release_file(filepath) +- if 'name' in distro_info: +- # The name is always present if the pattern matches +- self.distro_release_file = filepath +- distro_info['id'] = match.group(1) +- return distro_info +- return {} +- +- def _parse_distro_release_file(self, filepath): +- """ +- Parse a distro release file. +- +- Parameters: +- +- * filepath: Path name of the distro release file. +- +- Returns: +- A dictionary containing all information items. +- """ +- if os.path.isfile(filepath): +- with open(filepath) as fp: +- # Only parse the first line. For instance, on SLES there +- # are multiple lines. We don't want them... +- return self._parse_distro_release_content(fp.readline()) +- return {} +- +- @staticmethod +- def _parse_distro_release_content(line): +- """ +- Parse a line from a distro release file. +- +- Parameters: +- * line: Line from the distro release file. Must be a unicode string +- or a UTF-8 encoded byte string. +- +- Returns: +- A dictionary containing all information items. +- """ +- if isinstance(line, bytes): +- line = line.decode('utf-8') +- matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( +- line.strip()[::-1]) +- distro_info = {} +- if matches: +- # regexp ensures non-None +- distro_info['name'] = matches.group(3)[::-1] +- if matches.group(2): +- distro_info['version_id'] = matches.group(2)[::-1] +- if matches.group(1): +- distro_info['codename'] = matches.group(1)[::-1] +- elif line: +- distro_info['name'] = line.strip() +- return distro_info +- +- +-_distro = LinuxDistribution() +- +- +-def main(): +- import argparse +- +- logger = logging.getLogger(__name__) +- logger.setLevel(logging.DEBUG) +- logger.addHandler(logging.StreamHandler(sys.stdout)) +- +- parser = argparse.ArgumentParser(description="Linux distro info tool") +- parser.add_argument( +- '--json', +- '-j', +- help="Output in machine readable format", +- action="store_true") +- args = parser.parse_args() +- +- if args.json: +- logger.info(json.dumps(info(), indent=4, sort_keys=True)) +- else: +- logger.info('Name: %s', name(pretty=True)) +- distribution_version = version(pretty=True) +- if distribution_version: +- logger.info('Version: %s', distribution_version) +- distribution_codename = codename() +- if distribution_codename: +- logger.info('Codename: %s', distribution_codename) +- +- +-if __name__ == '__main__': +- main() +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/__init__.py +deleted file mode 100644 +index 7427eb1..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/__init__.py ++++ /dev/null +@@ -1,25 +0,0 @@ +-""" +-HTML parsing library based on the WHATWG "HTML5" +-specification. The parser is designed to be compatible with existing +-HTML found in the wild and implements well-defined error recovery that +-is largely compatible with modern desktop web browsers. +- +-Example usage: +- +-import html5lib +-f = open("my_document.html") +-tree = html5lib.parse(f) +-""" +- +-from __future__ import absolute_import, division, unicode_literals +- +-from .html5parser import HTMLParser, parse, parseFragment +-from .treebuilders import getTreeBuilder +-from .treewalkers import getTreeWalker +-from .serializer import serialize +- +-__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", +- "getTreeWalker", "serialize"] +- +-# this has to be at the top level, see how setup.py parses this +-__version__ = "1.0b10" +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_ihatexml.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_ihatexml.py +deleted file mode 100644 +index d6d1d6f..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_ihatexml.py ++++ /dev/null +@@ -1,288 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-import re +-import warnings +- +-from .constants import DataLossWarning +- +-baseChar = """ +-[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +-[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +-[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +-[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +-[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +-[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +-[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +-[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +-[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +-[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +-[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +-[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +-[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +-[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +-[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +-[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +-[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +-[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +-[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +-[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +-[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +-[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +-[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +-[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +-[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +-[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +-[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +-[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +-[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +-[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +-#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +-#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +-#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +-[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +-[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +-#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +-[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +-[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +-[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +-[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +-[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +-#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +-[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +-[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +-[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +-[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" +- +-ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" +- +-combiningCharacter = """ +-[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +-[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +-[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +-[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +-#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +-[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +-[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +-#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +-[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +-[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +-#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +-[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +-[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +-[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +-[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +-[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +-#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +-[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +-#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +-[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +-[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +-#x3099 | #x309A""" +- +-digit = """ +-[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +-[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +-[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +-[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" +- +-extender = """ +-#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +-#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" +- +-letter = " | ".join([baseChar, ideographic]) +- +-# Without the +-name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, +- extender]) +-nameFirst = " | ".join([letter, "_"]) +- +-reChar = re.compile(r"#x([\d|A-F]{4,4})") +-reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") +- +- +-def charStringToList(chars): +- charRanges = [item.strip() for item in chars.split(" | ")] +- rv = [] +- for item in charRanges: +- foundMatch = False +- for regexp in (reChar, reCharRange): +- match = regexp.match(item) +- if match is not None: +- rv.append([hexToInt(item) for item in match.groups()]) +- if len(rv[-1]) == 1: +- rv[-1] = rv[-1] * 2 +- foundMatch = True +- break +- if not foundMatch: +- assert len(item) == 1 +- +- rv.append([ord(item)] * 2) +- rv = normaliseCharList(rv) +- return rv +- +- +-def normaliseCharList(charList): +- charList = sorted(charList) +- for item in charList: +- assert item[1] >= item[0] +- rv = [] +- i = 0 +- while i < len(charList): +- j = 1 +- rv.append(charList[i]) +- while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: +- rv[-1][1] = charList[i + j][1] +- j += 1 +- i += j +- return rv +- +-# We don't really support characters above the BMP :( +-max_unicode = int("FFFF", 16) +- +- +-def missingRanges(charList): +- rv = [] +- if charList[0] != 0: +- rv.append([0, charList[0][0] - 1]) +- for i, item in enumerate(charList[:-1]): +- rv.append([item[1] + 1, charList[i + 1][0] - 1]) +- if charList[-1][1] != max_unicode: +- rv.append([charList[-1][1] + 1, max_unicode]) +- return rv +- +- +-def listToRegexpStr(charList): +- rv = [] +- for item in charList: +- if item[0] == item[1]: +- rv.append(escapeRegexp(chr(item[0]))) +- else: +- rv.append(escapeRegexp(chr(item[0])) + "-" + +- escapeRegexp(chr(item[1]))) +- return "[%s]" % "".join(rv) +- +- +-def hexToInt(hex_str): +- return int(hex_str, 16) +- +- +-def escapeRegexp(string): +- specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", +- "[", "]", "|", "(", ")", "-") +- for char in specialCharacters: +- string = string.replace(char, "\\" + char) +- +- return string +- +-# output from the above +-nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa +- +-nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa +- +-# Simpler things +-nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\-\'()+,./:=?;!*#@$_%]") +- +- +-class InfosetFilter(object): +- replacementRegexp = re.compile(r"U[\dA-F]{5,5}") +- +- def __init__(self, +- dropXmlnsLocalName=False, +- dropXmlnsAttrNs=False, +- preventDoubleDashComments=False, +- preventDashAtCommentEnd=False, +- replaceFormFeedCharacters=True, +- preventSingleQuotePubid=False): +- +- self.dropXmlnsLocalName = dropXmlnsLocalName +- self.dropXmlnsAttrNs = dropXmlnsAttrNs +- +- self.preventDoubleDashComments = preventDoubleDashComments +- self.preventDashAtCommentEnd = preventDashAtCommentEnd +- +- self.replaceFormFeedCharacters = replaceFormFeedCharacters +- +- self.preventSingleQuotePubid = preventSingleQuotePubid +- +- self.replaceCache = {} +- +- def coerceAttribute(self, name, namespace=None): +- if self.dropXmlnsLocalName and name.startswith("xmlns:"): +- warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) +- return None +- elif (self.dropXmlnsAttrNs and +- namespace == "http://www.w3.org/2000/xmlns/"): +- warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) +- return None +- else: +- return self.toXmlName(name) +- +- def coerceElement(self, name): +- return self.toXmlName(name) +- +- def coerceComment(self, data): +- if self.preventDoubleDashComments: +- while "--" in data: +- warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) +- data = data.replace("--", "- -") +- if data.endswith("-"): +- warnings.warn("Comments cannot end in a dash", DataLossWarning) +- data += " " +- return data +- +- def coerceCharacters(self, data): +- if self.replaceFormFeedCharacters: +- for _ in range(data.count("\x0C")): +- warnings.warn("Text cannot contain U+000C", DataLossWarning) +- data = data.replace("\x0C", " ") +- # Other non-xml characters +- return data +- +- def coercePubid(self, data): +- dataOutput = data +- for char in nonPubidCharRegexp.findall(data): +- warnings.warn("Coercing non-XML pubid", DataLossWarning) +- replacement = self.getReplacementCharacter(char) +- dataOutput = dataOutput.replace(char, replacement) +- if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: +- warnings.warn("Pubid cannot contain single quote", DataLossWarning) +- dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) +- return dataOutput +- +- def toXmlName(self, name): +- nameFirst = name[0] +- nameRest = name[1:] +- m = nonXmlNameFirstBMPRegexp.match(nameFirst) +- if m: +- warnings.warn("Coercing non-XML name", DataLossWarning) +- nameFirstOutput = self.getReplacementCharacter(nameFirst) +- else: +- nameFirstOutput = nameFirst +- +- nameRestOutput = nameRest +- replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) +- for char in replaceChars: +- warnings.warn("Coercing non-XML name", DataLossWarning) +- replacement = self.getReplacementCharacter(char) +- nameRestOutput = nameRestOutput.replace(char, replacement) +- return nameFirstOutput + nameRestOutput +- +- def getReplacementCharacter(self, char): +- if char in self.replaceCache: +- replacement = self.replaceCache[char] +- else: +- replacement = self.escapeChar(char) +- return replacement +- +- def fromXmlName(self, name): +- for item in set(self.replacementRegexp.findall(name)): +- name = name.replace(item, self.unescapeChar(item)) +- return name +- +- def escapeChar(self, char): +- replacement = "U%05X" % ord(char) +- self.replaceCache[char] = replacement +- return replacement +- +- def unescapeChar(self, charcode): +- return chr(int(charcode[1:], 16)) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_inputstream.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_inputstream.py +deleted file mode 100644 +index 7c5639f..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_inputstream.py ++++ /dev/null +@@ -1,923 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-from pip._vendor.six import text_type, binary_type +-from pip._vendor.six.moves import http_client, urllib +- +-import codecs +-import re +- +-from pip._vendor import webencodings +- +-from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase +-from .constants import ReparseException +-from . import _utils +- +-from io import StringIO +- +-try: +- from io import BytesIO +-except ImportError: +- BytesIO = StringIO +- +-# Non-unicode versions of constants for use in the pre-parser +-spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) +-asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) +-asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) +-spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) +- +- +-invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa +- +-if _utils.supports_lone_surrogates: +- # Use one extra step of indirection and create surrogates with +- # eval. Not using this indirection would introduce an illegal +- # unicode literal on platforms not supporting such lone +- # surrogates. +- assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 +- invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + +- eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used +- "]") +-else: +- invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) +- +-non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, +- 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, +- 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, +- 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, +- 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, +- 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, +- 0x10FFFE, 0x10FFFF]) +- +-ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]") +- +-# Cache for charsUntil() +-charsUntilRegEx = {} +- +- +-class BufferedStream(object): +- """Buffering for streams that do not have buffering of their own +- +- The buffer is implemented as a list of chunks on the assumption that +- joining many strings will be slow since it is O(n**2) +- """ +- +- def __init__(self, stream): +- self.stream = stream +- self.buffer = [] +- self.position = [-1, 0] # chunk number, offset +- +- def tell(self): +- pos = 0 +- for chunk in self.buffer[:self.position[0]]: +- pos += len(chunk) +- pos += self.position[1] +- return pos +- +- def seek(self, pos): +- assert pos <= self._bufferedBytes() +- offset = pos +- i = 0 +- while len(self.buffer[i]) < offset: +- offset -= len(self.buffer[i]) +- i += 1 +- self.position = [i, offset] +- +- def read(self, bytes): +- if not self.buffer: +- return self._readStream(bytes) +- elif (self.position[0] == len(self.buffer) and +- self.position[1] == len(self.buffer[-1])): +- return self._readStream(bytes) +- else: +- return self._readFromBuffer(bytes) +- +- def _bufferedBytes(self): +- return sum([len(item) for item in self.buffer]) +- +- def _readStream(self, bytes): +- data = self.stream.read(bytes) +- self.buffer.append(data) +- self.position[0] += 1 +- self.position[1] = len(data) +- return data +- +- def _readFromBuffer(self, bytes): +- remainingBytes = bytes +- rv = [] +- bufferIndex = self.position[0] +- bufferOffset = self.position[1] +- while bufferIndex < len(self.buffer) and remainingBytes != 0: +- assert remainingBytes > 0 +- bufferedData = self.buffer[bufferIndex] +- +- if remainingBytes <= len(bufferedData) - bufferOffset: +- bytesToRead = remainingBytes +- self.position = [bufferIndex, bufferOffset + bytesToRead] +- else: +- bytesToRead = len(bufferedData) - bufferOffset +- self.position = [bufferIndex, len(bufferedData)] +- bufferIndex += 1 +- rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) +- remainingBytes -= bytesToRead +- +- bufferOffset = 0 +- +- if remainingBytes: +- rv.append(self._readStream(remainingBytes)) +- +- return b"".join(rv) +- +- +-def HTMLInputStream(source, **kwargs): +- # Work around Python bug #20007: read(0) closes the connection. +- # http://bugs.python.org/issue20007 +- if (isinstance(source, http_client.HTTPResponse) or +- # Also check for addinfourl wrapping HTTPResponse +- (isinstance(source, urllib.response.addbase) and +- isinstance(source.fp, http_client.HTTPResponse))): +- isUnicode = False +- elif hasattr(source, "read"): +- isUnicode = isinstance(source.read(0), text_type) +- else: +- isUnicode = isinstance(source, text_type) +- +- if isUnicode: +- encodings = [x for x in kwargs if x.endswith("_encoding")] +- if encodings: +- raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) +- +- return HTMLUnicodeInputStream(source, **kwargs) +- else: +- return HTMLBinaryInputStream(source, **kwargs) +- +- +-class HTMLUnicodeInputStream(object): +- """Provides a unicode stream of characters to the HTMLTokenizer. +- +- This class takes care of character encoding and removing or replacing +- incorrect byte-sequences and also provides column and line tracking. +- +- """ +- +- _defaultChunkSize = 10240 +- +- def __init__(self, source): +- """Initialises the HTMLInputStream. +- +- HTMLInputStream(source, [encoding]) -> Normalized stream from source +- for use by html5lib. +- +- source can be either a file-object, local filename or a string. +- +- The optional encoding parameter must be a string that indicates +- the encoding. If specified, that encoding will be used, +- regardless of any BOM or later declaration (such as in a meta +- element) +- +- """ +- +- if not _utils.supports_lone_surrogates: +- # Such platforms will have already checked for such +- # surrogate errors, so no need to do this checking. +- self.reportCharacterErrors = None +- elif len("\U0010FFFF") == 1: +- self.reportCharacterErrors = self.characterErrorsUCS4 +- else: +- self.reportCharacterErrors = self.characterErrorsUCS2 +- +- # List of where new lines occur +- self.newLines = [0] +- +- self.charEncoding = (lookupEncoding("utf-8"), "certain") +- self.dataStream = self.openStream(source) +- +- self.reset() +- +- def reset(self): +- self.chunk = "" +- self.chunkSize = 0 +- self.chunkOffset = 0 +- self.errors = [] +- +- # number of (complete) lines in previous chunks +- self.prevNumLines = 0 +- # number of columns in the last line of the previous chunk +- self.prevNumCols = 0 +- +- # Deal with CR LF and surrogates split over chunk boundaries +- self._bufferedCharacter = None +- +- def openStream(self, source): +- """Produces a file object from source. +- +- source can be either a file object, local filename or a string. +- +- """ +- # Already a file object +- if hasattr(source, 'read'): +- stream = source +- else: +- stream = StringIO(source) +- +- return stream +- +- def _position(self, offset): +- chunk = self.chunk +- nLines = chunk.count('\n', 0, offset) +- positionLine = self.prevNumLines + nLines +- lastLinePos = chunk.rfind('\n', 0, offset) +- if lastLinePos == -1: +- positionColumn = self.prevNumCols + offset +- else: +- positionColumn = offset - (lastLinePos + 1) +- return (positionLine, positionColumn) +- +- def position(self): +- """Returns (line, col) of the current position in the stream.""" +- line, col = self._position(self.chunkOffset) +- return (line + 1, col) +- +- def char(self): +- """ Read one character from the stream or queue if available. Return +- EOF when EOF is reached. +- """ +- # Read a new chunk from the input stream if necessary +- if self.chunkOffset >= self.chunkSize: +- if not self.readChunk(): +- return EOF +- +- chunkOffset = self.chunkOffset +- char = self.chunk[chunkOffset] +- self.chunkOffset = chunkOffset + 1 +- +- return char +- +- def readChunk(self, chunkSize=None): +- if chunkSize is None: +- chunkSize = self._defaultChunkSize +- +- self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) +- +- self.chunk = "" +- self.chunkSize = 0 +- self.chunkOffset = 0 +- +- data = self.dataStream.read(chunkSize) +- +- # Deal with CR LF and surrogates broken across chunks +- if self._bufferedCharacter: +- data = self._bufferedCharacter + data +- self._bufferedCharacter = None +- elif not data: +- # We have no more data, bye-bye stream +- return False +- +- if len(data) > 1: +- lastv = ord(data[-1]) +- if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: +- self._bufferedCharacter = data[-1] +- data = data[:-1] +- +- if self.reportCharacterErrors: +- self.reportCharacterErrors(data) +- +- # Replace invalid characters +- data = data.replace("\r\n", "\n") +- data = data.replace("\r", "\n") +- +- self.chunk = data +- self.chunkSize = len(data) +- +- return True +- +- def characterErrorsUCS4(self, data): +- for _ in range(len(invalid_unicode_re.findall(data))): +- self.errors.append("invalid-codepoint") +- +- def characterErrorsUCS2(self, data): +- # Someone picked the wrong compile option +- # You lose +- skip = False +- for match in invalid_unicode_re.finditer(data): +- if skip: +- continue +- codepoint = ord(match.group()) +- pos = match.start() +- # Pretty sure there should be endianness issues here +- if _utils.isSurrogatePair(data[pos:pos + 2]): +- # We have a surrogate pair! +- char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) +- if char_val in non_bmp_invalid_codepoints: +- self.errors.append("invalid-codepoint") +- skip = True +- elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and +- pos == len(data) - 1): +- self.errors.append("invalid-codepoint") +- else: +- skip = False +- self.errors.append("invalid-codepoint") +- +- def charsUntil(self, characters, opposite=False): +- """ Returns a string of characters from the stream up to but not +- including any character in 'characters' or EOF. 'characters' must be +- a container that supports the 'in' method and iteration over its +- characters. +- """ +- +- # Use a cache of regexps to find the required characters +- try: +- chars = charsUntilRegEx[(characters, opposite)] +- except KeyError: +- if __debug__: +- for c in characters: +- assert(ord(c) < 128) +- regex = "".join(["\\x%02x" % ord(c) for c in characters]) +- if not opposite: +- regex = "^%s" % regex +- chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) +- +- rv = [] +- +- while True: +- # Find the longest matching prefix +- m = chars.match(self.chunk, self.chunkOffset) +- if m is None: +- # If nothing matched, and it wasn't because we ran out of chunk, +- # then stop +- if self.chunkOffset != self.chunkSize: +- break +- else: +- end = m.end() +- # If not the whole chunk matched, return everything +- # up to the part that didn't match +- if end != self.chunkSize: +- rv.append(self.chunk[self.chunkOffset:end]) +- self.chunkOffset = end +- break +- # If the whole remainder of the chunk matched, +- # use it all and read the next chunk +- rv.append(self.chunk[self.chunkOffset:]) +- if not self.readChunk(): +- # Reached EOF +- break +- +- r = "".join(rv) +- return r +- +- def unget(self, char): +- # Only one character is allowed to be ungotten at once - it must +- # be consumed again before any further call to unget +- if char is not None: +- if self.chunkOffset == 0: +- # unget is called quite rarely, so it's a good idea to do +- # more work here if it saves a bit of work in the frequently +- # called char and charsUntil. +- # So, just prepend the ungotten character onto the current +- # chunk: +- self.chunk = char + self.chunk +- self.chunkSize += 1 +- else: +- self.chunkOffset -= 1 +- assert self.chunk[self.chunkOffset] == char +- +- +-class HTMLBinaryInputStream(HTMLUnicodeInputStream): +- """Provides a unicode stream of characters to the HTMLTokenizer. +- +- This class takes care of character encoding and removing or replacing +- incorrect byte-sequences and also provides column and line tracking. +- +- """ +- +- def __init__(self, source, override_encoding=None, transport_encoding=None, +- same_origin_parent_encoding=None, likely_encoding=None, +- default_encoding="windows-1252", useChardet=True): +- """Initialises the HTMLInputStream. +- +- HTMLInputStream(source, [encoding]) -> Normalized stream from source +- for use by html5lib. +- +- source can be either a file-object, local filename or a string. +- +- The optional encoding parameter must be a string that indicates +- the encoding. If specified, that encoding will be used, +- regardless of any BOM or later declaration (such as in a meta +- element) +- +- """ +- # Raw Stream - for unicode objects this will encode to utf-8 and set +- # self.charEncoding as appropriate +- self.rawStream = self.openStream(source) +- +- HTMLUnicodeInputStream.__init__(self, self.rawStream) +- +- # Encoding Information +- # Number of bytes to use when looking for a meta element with +- # encoding information +- self.numBytesMeta = 1024 +- # Number of bytes to use when using detecting encoding using chardet +- self.numBytesChardet = 100 +- # Things from args +- self.override_encoding = override_encoding +- self.transport_encoding = transport_encoding +- self.same_origin_parent_encoding = same_origin_parent_encoding +- self.likely_encoding = likely_encoding +- self.default_encoding = default_encoding +- +- # Determine encoding +- self.charEncoding = self.determineEncoding(useChardet) +- assert self.charEncoding[0] is not None +- +- # Call superclass +- self.reset() +- +- def reset(self): +- self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') +- HTMLUnicodeInputStream.reset(self) +- +- def openStream(self, source): +- """Produces a file object from source. +- +- source can be either a file object, local filename or a string. +- +- """ +- # Already a file object +- if hasattr(source, 'read'): +- stream = source +- else: +- stream = BytesIO(source) +- +- try: +- stream.seek(stream.tell()) +- except: # pylint:disable=bare-except +- stream = BufferedStream(stream) +- +- return stream +- +- def determineEncoding(self, chardet=True): +- # BOMs take precedence over everything +- # This will also read past the BOM if present +- charEncoding = self.detectBOM(), "certain" +- if charEncoding[0] is not None: +- return charEncoding +- +- # If we've been overriden, we've been overriden +- charEncoding = lookupEncoding(self.override_encoding), "certain" +- if charEncoding[0] is not None: +- return charEncoding +- +- # Now check the transport layer +- charEncoding = lookupEncoding(self.transport_encoding), "certain" +- if charEncoding[0] is not None: +- return charEncoding +- +- # Look for meta elements with encoding information +- charEncoding = self.detectEncodingMeta(), "tentative" +- if charEncoding[0] is not None: +- return charEncoding +- +- # Parent document encoding +- charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" +- if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): +- return charEncoding +- +- # "likely" encoding +- charEncoding = lookupEncoding(self.likely_encoding), "tentative" +- if charEncoding[0] is not None: +- return charEncoding +- +- # Guess with chardet, if available +- if chardet: +- try: +- from chardet.universaldetector import UniversalDetector +- except ImportError: +- pass +- else: +- buffers = [] +- detector = UniversalDetector() +- while not detector.done: +- buffer = self.rawStream.read(self.numBytesChardet) +- assert isinstance(buffer, bytes) +- if not buffer: +- break +- buffers.append(buffer) +- detector.feed(buffer) +- detector.close() +- encoding = lookupEncoding(detector.result['encoding']) +- self.rawStream.seek(0) +- if encoding is not None: +- return encoding, "tentative" +- +- # Try the default encoding +- charEncoding = lookupEncoding(self.default_encoding), "tentative" +- if charEncoding[0] is not None: +- return charEncoding +- +- # Fallback to html5lib's default if even that hasn't worked +- return lookupEncoding("windows-1252"), "tentative" +- +- def changeEncoding(self, newEncoding): +- assert self.charEncoding[1] != "certain" +- newEncoding = lookupEncoding(newEncoding) +- if newEncoding is None: +- return +- if newEncoding.name in ("utf-16be", "utf-16le"): +- newEncoding = lookupEncoding("utf-8") +- assert newEncoding is not None +- elif newEncoding == self.charEncoding[0]: +- self.charEncoding = (self.charEncoding[0], "certain") +- else: +- self.rawStream.seek(0) +- self.charEncoding = (newEncoding, "certain") +- self.reset() +- raise ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) +- +- def detectBOM(self): +- """Attempts to detect at BOM at the start of the stream. If +- an encoding can be determined from the BOM return the name of the +- encoding otherwise return None""" +- bomDict = { +- codecs.BOM_UTF8: 'utf-8', +- codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', +- codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' +- } +- +- # Go to beginning of file and read in 4 bytes +- string = self.rawStream.read(4) +- assert isinstance(string, bytes) +- +- # Try detecting the BOM using bytes from the string +- encoding = bomDict.get(string[:3]) # UTF-8 +- seek = 3 +- if not encoding: +- # Need to detect UTF-32 before UTF-16 +- encoding = bomDict.get(string) # UTF-32 +- seek = 4 +- if not encoding: +- encoding = bomDict.get(string[:2]) # UTF-16 +- seek = 2 +- +- # Set the read position past the BOM if one was found, otherwise +- # set it to the start of the stream +- if encoding: +- self.rawStream.seek(seek) +- return lookupEncoding(encoding) +- else: +- self.rawStream.seek(0) +- return None +- +- def detectEncodingMeta(self): +- """Report the encoding declared by the meta element +- """ +- buffer = self.rawStream.read(self.numBytesMeta) +- assert isinstance(buffer, bytes) +- parser = EncodingParser(buffer) +- self.rawStream.seek(0) +- encoding = parser.getEncoding() +- +- if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): +- encoding = lookupEncoding("utf-8") +- +- return encoding +- +- +-class EncodingBytes(bytes): +- """String-like object with an associated position and various extra methods +- If the position is ever greater than the string length then an exception is +- raised""" +- def __new__(self, value): +- assert isinstance(value, bytes) +- return bytes.__new__(self, value.lower()) +- +- def __init__(self, value): +- # pylint:disable=unused-argument +- self._position = -1 +- +- def __iter__(self): +- return self +- +- def __next__(self): +- p = self._position = self._position + 1 +- if p >= len(self): +- raise StopIteration +- elif p < 0: +- raise TypeError +- return self[p:p + 1] +- +- def next(self): +- # Py2 compat +- return self.__next__() +- +- def previous(self): +- p = self._position +- if p >= len(self): +- raise StopIteration +- elif p < 0: +- raise TypeError +- self._position = p = p - 1 +- return self[p:p + 1] +- +- def setPosition(self, position): +- if self._position >= len(self): +- raise StopIteration +- self._position = position +- +- def getPosition(self): +- if self._position >= len(self): +- raise StopIteration +- if self._position >= 0: +- return self._position +- else: +- return None +- +- position = property(getPosition, setPosition) +- +- def getCurrentByte(self): +- return self[self.position:self.position + 1] +- +- currentByte = property(getCurrentByte) +- +- def skip(self, chars=spaceCharactersBytes): +- """Skip past a list of characters""" +- p = self.position # use property for the error-checking +- while p < len(self): +- c = self[p:p + 1] +- if c not in chars: +- self._position = p +- return c +- p += 1 +- self._position = p +- return None +- +- def skipUntil(self, chars): +- p = self.position +- while p < len(self): +- c = self[p:p + 1] +- if c in chars: +- self._position = p +- return c +- p += 1 +- self._position = p +- return None +- +- def matchBytes(self, bytes): +- """Look for a sequence of bytes at the start of a string. If the bytes +- are found return True and advance the position to the byte after the +- match. Otherwise return False and leave the position alone""" +- p = self.position +- data = self[p:p + len(bytes)] +- rv = data.startswith(bytes) +- if rv: +- self.position += len(bytes) +- return rv +- +- def jumpTo(self, bytes): +- """Look for the next sequence of bytes matching a given sequence. If +- a match is found advance the position to the last byte of the match""" +- newPosition = self[self.position:].find(bytes) +- if newPosition > -1: +- # XXX: This is ugly, but I can't see a nicer way to fix this. +- if self._position == -1: +- self._position = 0 +- self._position += (newPosition + len(bytes) - 1) +- return True +- else: +- raise StopIteration +- +- +-class EncodingParser(object): +- """Mini parser for detecting character encoding from meta elements""" +- +- def __init__(self, data): +- """string - the data to work on for encoding detection""" +- self.data = EncodingBytes(data) +- self.encoding = None +- +- def getEncoding(self): +- methodDispatch = ( +- (b"") +- +- def handleMeta(self): +- if self.data.currentByte not in spaceCharactersBytes: +- # if we have ") +- +- def getAttribute(self): +- """Return a name,value pair for the next attribute in the stream, +- if one is found, or None""" +- data = self.data +- # Step 1 (skip chars) +- c = data.skip(spaceCharactersBytes | frozenset([b"/"])) +- assert c is None or len(c) == 1 +- # Step 2 +- if c in (b">", None): +- return None +- # Step 3 +- attrName = [] +- attrValue = [] +- # Step 4 attribute name +- while True: +- if c == b"=" and attrName: +- break +- elif c in spaceCharactersBytes: +- # Step 6! +- c = data.skip() +- break +- elif c in (b"/", b">"): +- return b"".join(attrName), b"" +- elif c in asciiUppercaseBytes: +- attrName.append(c.lower()) +- elif c is None: +- return None +- else: +- attrName.append(c) +- # Step 5 +- c = next(data) +- # Step 7 +- if c != b"=": +- data.previous() +- return b"".join(attrName), b"" +- # Step 8 +- next(data) +- # Step 9 +- c = data.skip() +- # Step 10 +- if c in (b"'", b'"'): +- # 10.1 +- quoteChar = c +- while True: +- # 10.2 +- c = next(data) +- # 10.3 +- if c == quoteChar: +- next(data) +- return b"".join(attrName), b"".join(attrValue) +- # 10.4 +- elif c in asciiUppercaseBytes: +- attrValue.append(c.lower()) +- # 10.5 +- else: +- attrValue.append(c) +- elif c == b">": +- return b"".join(attrName), b"" +- elif c in asciiUppercaseBytes: +- attrValue.append(c.lower()) +- elif c is None: +- return None +- else: +- attrValue.append(c) +- # Step 11 +- while True: +- c = next(data) +- if c in spacesAngleBrackets: +- return b"".join(attrName), b"".join(attrValue) +- elif c in asciiUppercaseBytes: +- attrValue.append(c.lower()) +- elif c is None: +- return None +- else: +- attrValue.append(c) +- +- +-class ContentAttrParser(object): +- def __init__(self, data): +- assert isinstance(data, bytes) +- self.data = data +- +- def parse(self): +- try: +- # Check if the attr name is charset +- # otherwise return +- self.data.jumpTo(b"charset") +- self.data.position += 1 +- self.data.skip() +- if not self.data.currentByte == b"=": +- # If there is no = sign keep looking for attrs +- return None +- self.data.position += 1 +- self.data.skip() +- # Look for an encoding between matching quote marks +- if self.data.currentByte in (b'"', b"'"): +- quoteMark = self.data.currentByte +- self.data.position += 1 +- oldPosition = self.data.position +- if self.data.jumpTo(quoteMark): +- return self.data[oldPosition:self.data.position] +- else: +- return None +- else: +- # Unquoted value +- oldPosition = self.data.position +- try: +- self.data.skipUntil(spaceCharactersBytes) +- return self.data[oldPosition:self.data.position] +- except StopIteration: +- # Return the whole remaining value +- return self.data[oldPosition:] +- except StopIteration: +- return None +- +- +-def lookupEncoding(encoding): +- """Return the python codec name corresponding to an encoding or None if the +- string doesn't correspond to a valid encoding.""" +- if isinstance(encoding, binary_type): +- try: +- encoding = encoding.decode("ascii") +- except UnicodeDecodeError: +- return None +- +- if encoding is not None: +- try: +- return webencodings.lookup(encoding) +- except AttributeError: +- return None +- else: +- return None +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_tokenizer.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_tokenizer.py +deleted file mode 100644 +index 178f6e7..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_tokenizer.py ++++ /dev/null +@@ -1,1721 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-from pip._vendor.six import unichr as chr +- +-from collections import deque +- +-from .constants import spaceCharacters +-from .constants import entities +-from .constants import asciiLetters, asciiUpper2Lower +-from .constants import digits, hexDigits, EOF +-from .constants import tokenTypes, tagTokenTypes +-from .constants import replacementCharacters +- +-from ._inputstream import HTMLInputStream +- +-from ._trie import Trie +- +-entitiesTrie = Trie(entities) +- +- +-class HTMLTokenizer(object): +- """ This class takes care of tokenizing HTML. +- +- * self.currentToken +- Holds the token that is currently being processed. +- +- * self.state +- Holds a reference to the method to be invoked... XXX +- +- * self.stream +- Points to HTMLInputStream object. +- """ +- +- def __init__(self, stream, parser=None, **kwargs): +- +- self.stream = HTMLInputStream(stream, **kwargs) +- self.parser = parser +- +- # Setup the initial tokenizer state +- self.escapeFlag = False +- self.lastFourChars = [] +- self.state = self.dataState +- self.escape = False +- +- # The current token being created +- self.currentToken = None +- super(HTMLTokenizer, self).__init__() +- +- def __iter__(self): +- """ This is where the magic happens. +- +- We do our usually processing through the states and when we have a token +- to return we yield the token which pauses processing until the next token +- is requested. +- """ +- self.tokenQueue = deque([]) +- # Start processing. When EOF is reached self.state will return False +- # instead of True and the loop will terminate. +- while self.state(): +- while self.stream.errors: +- yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} +- while self.tokenQueue: +- yield self.tokenQueue.popleft() +- +- def consumeNumberEntity(self, isHex): +- """This function returns either U+FFFD or the character based on the +- decimal or hexadecimal representation. It also discards ";" if present. +- If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. +- """ +- +- allowed = digits +- radix = 10 +- if isHex: +- allowed = hexDigits +- radix = 16 +- +- charStack = [] +- +- # Consume all the characters that are in range while making sure we +- # don't hit an EOF. +- c = self.stream.char() +- while c in allowed and c is not EOF: +- charStack.append(c) +- c = self.stream.char() +- +- # Convert the set of characters consumed to an int. +- charAsInt = int("".join(charStack), radix) +- +- # Certain characters get replaced with others +- if charAsInt in replacementCharacters: +- char = replacementCharacters[charAsInt] +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "illegal-codepoint-for-numeric-entity", +- "datavars": {"charAsInt": charAsInt}}) +- elif ((0xD800 <= charAsInt <= 0xDFFF) or +- (charAsInt > 0x10FFFF)): +- char = "\uFFFD" +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "illegal-codepoint-for-numeric-entity", +- "datavars": {"charAsInt": charAsInt}}) +- else: +- # Should speed up this check somehow (e.g. move the set to a constant) +- if ((0x0001 <= charAsInt <= 0x0008) or +- (0x000E <= charAsInt <= 0x001F) or +- (0x007F <= charAsInt <= 0x009F) or +- (0xFDD0 <= charAsInt <= 0xFDEF) or +- charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, +- 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, +- 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, +- 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, +- 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, +- 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, +- 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, +- 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, +- 0xFFFFF, 0x10FFFE, 0x10FFFF])): +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": +- "illegal-codepoint-for-numeric-entity", +- "datavars": {"charAsInt": charAsInt}}) +- try: +- # Try/except needed as UCS-2 Python builds' unichar only works +- # within the BMP. +- char = chr(charAsInt) +- except ValueError: +- v = charAsInt - 0x10000 +- char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) +- +- # Discard the ; if present. Otherwise, put it back on the queue and +- # invoke parseError on parser. +- if c != ";": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "numeric-entity-without-semicolon"}) +- self.stream.unget(c) +- +- return char +- +- def consumeEntity(self, allowedChar=None, fromAttribute=False): +- # Initialise to the default output for when no entity is matched +- output = "&" +- +- charStack = [self.stream.char()] +- if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or +- (allowedChar is not None and allowedChar == charStack[0])): +- self.stream.unget(charStack[0]) +- +- elif charStack[0] == "#": +- # Read the next character to see if it's hex or decimal +- hex = False +- charStack.append(self.stream.char()) +- if charStack[-1] in ("x", "X"): +- hex = True +- charStack.append(self.stream.char()) +- +- # charStack[-1] should be the first digit +- if (hex and charStack[-1] in hexDigits) \ +- or (not hex and charStack[-1] in digits): +- # At least one digit found, so consume the whole number +- self.stream.unget(charStack[-1]) +- output = self.consumeNumberEntity(hex) +- else: +- # No digits found +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "expected-numeric-entity"}) +- self.stream.unget(charStack.pop()) +- output = "&" + "".join(charStack) +- +- else: +- # At this point in the process might have named entity. Entities +- # are stored in the global variable "entities". +- # +- # Consume characters and compare to these to a substring of the +- # entity names in the list until the substring no longer matches. +- while (charStack[-1] is not EOF): +- if not entitiesTrie.has_keys_with_prefix("".join(charStack)): +- break +- charStack.append(self.stream.char()) +- +- # At this point we have a string that starts with some characters +- # that may match an entity +- # Try to find the longest entity the string will match to take care +- # of ¬i for instance. +- try: +- entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) +- entityLength = len(entityName) +- except KeyError: +- entityName = None +- +- if entityName is not None: +- if entityName[-1] != ";": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "named-entity-without-semicolon"}) +- if (entityName[-1] != ";" and fromAttribute and +- (charStack[entityLength] in asciiLetters or +- charStack[entityLength] in digits or +- charStack[entityLength] == "=")): +- self.stream.unget(charStack.pop()) +- output = "&" + "".join(charStack) +- else: +- output = entities[entityName] +- self.stream.unget(charStack.pop()) +- output += "".join(charStack[entityLength:]) +- else: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-named-entity"}) +- self.stream.unget(charStack.pop()) +- output = "&" + "".join(charStack) +- +- if fromAttribute: +- self.currentToken["data"][-1][1] += output +- else: +- if output in spaceCharacters: +- tokenType = "SpaceCharacters" +- else: +- tokenType = "Characters" +- self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) +- +- def processEntityInAttribute(self, allowedChar): +- """This method replaces the need for "entityInAttributeValueState". +- """ +- self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) +- +- def emitCurrentToken(self): +- """This method is a generic handler for emitting the tags. It also sets +- the state to "data" because that's what's needed after a token has been +- emitted. +- """ +- token = self.currentToken +- # Add token to the queue to be yielded +- if (token["type"] in tagTokenTypes): +- token["name"] = token["name"].translate(asciiUpper2Lower) +- if token["type"] == tokenTypes["EndTag"]: +- if token["data"]: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "attributes-in-end-tag"}) +- if token["selfClosing"]: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "self-closing-flag-on-end-tag"}) +- self.tokenQueue.append(token) +- self.state = self.dataState +- +- # Below are the various tokenizer states worked out. +- def dataState(self): +- data = self.stream.char() +- if data == "&": +- self.state = self.entityDataState +- elif data == "<": +- self.state = self.tagOpenState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "\u0000"}) +- elif data is EOF: +- # Tokenization ends. +- return False +- elif data in spaceCharacters: +- # Directly after emitting a token you switch back to the "data +- # state". At that point spaceCharacters are important so they are +- # emitted separately. +- self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": +- data + self.stream.charsUntil(spaceCharacters, True)}) +- # No need to update lastFourChars here, since the first space will +- # have already been appended to lastFourChars and will have broken +- # any sequences +- else: +- chars = self.stream.charsUntil(("&", "<", "\u0000")) +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": +- data + chars}) +- return True +- +- def entityDataState(self): +- self.consumeEntity() +- self.state = self.dataState +- return True +- +- def rcdataState(self): +- data = self.stream.char() +- if data == "&": +- self.state = self.characterReferenceInRcdata +- elif data == "<": +- self.state = self.rcdataLessThanSignState +- elif data == EOF: +- # Tokenization ends. +- return False +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "\uFFFD"}) +- elif data in spaceCharacters: +- # Directly after emitting a token you switch back to the "data +- # state". At that point spaceCharacters are important so they are +- # emitted separately. +- self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": +- data + self.stream.charsUntil(spaceCharacters, True)}) +- # No need to update lastFourChars here, since the first space will +- # have already been appended to lastFourChars and will have broken +- # any sequences +- else: +- chars = self.stream.charsUntil(("&", "<", "\u0000")) +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": +- data + chars}) +- return True +- +- def characterReferenceInRcdata(self): +- self.consumeEntity() +- self.state = self.rcdataState +- return True +- +- def rawtextState(self): +- data = self.stream.char() +- if data == "<": +- self.state = self.rawtextLessThanSignState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "\uFFFD"}) +- elif data == EOF: +- # Tokenization ends. +- return False +- else: +- chars = self.stream.charsUntil(("<", "\u0000")) +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": +- data + chars}) +- return True +- +- def scriptDataState(self): +- data = self.stream.char() +- if data == "<": +- self.state = self.scriptDataLessThanSignState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "\uFFFD"}) +- elif data == EOF: +- # Tokenization ends. +- return False +- else: +- chars = self.stream.charsUntil(("<", "\u0000")) +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": +- data + chars}) +- return True +- +- def plaintextState(self): +- data = self.stream.char() +- if data == EOF: +- # Tokenization ends. +- return False +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "\uFFFD"}) +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": +- data + self.stream.charsUntil("\u0000")}) +- return True +- +- def tagOpenState(self): +- data = self.stream.char() +- if data == "!": +- self.state = self.markupDeclarationOpenState +- elif data == "/": +- self.state = self.closeTagOpenState +- elif data in asciiLetters: +- self.currentToken = {"type": tokenTypes["StartTag"], +- "name": data, "data": [], +- "selfClosing": False, +- "selfClosingAcknowledged": False} +- self.state = self.tagNameState +- elif data == ">": +- # XXX In theory it could be something besides a tag name. But +- # do we really care? +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-tag-name-but-got-right-bracket"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) +- self.state = self.dataState +- elif data == "?": +- # XXX In theory it could be something besides a tag name. But +- # do we really care? +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-tag-name-but-got-question-mark"}) +- self.stream.unget(data) +- self.state = self.bogusCommentState +- else: +- # XXX +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-tag-name"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) +- self.stream.unget(data) +- self.state = self.dataState +- return True +- +- def closeTagOpenState(self): +- data = self.stream.char() +- if data in asciiLetters: +- self.currentToken = {"type": tokenTypes["EndTag"], "name": data, +- "data": [], "selfClosing": False} +- self.state = self.tagNameState +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-closing-tag-but-got-right-bracket"}) +- self.state = self.dataState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-closing-tag-but-got-eof"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "": +- self.emitCurrentToken() +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-tag-name"}) +- self.state = self.dataState +- elif data == "/": +- self.state = self.selfClosingStartTagState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["name"] += "\uFFFD" +- else: +- self.currentToken["name"] += data +- # (Don't use charsUntil here, because tag names are +- # very short and it's faster to not do anything fancy) +- return True +- +- def rcdataLessThanSignState(self): +- data = self.stream.char() +- if data == "/": +- self.temporaryBuffer = "" +- self.state = self.rcdataEndTagOpenState +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) +- self.stream.unget(data) +- self.state = self.rcdataState +- return True +- +- def rcdataEndTagOpenState(self): +- data = self.stream.char() +- if data in asciiLetters: +- self.temporaryBuffer += data +- self.state = self.rcdataEndTagNameState +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: +- self.currentToken = {"type": tokenTypes["EndTag"], +- "name": self.temporaryBuffer, +- "data": [], "selfClosing": False} +- self.emitCurrentToken() +- self.state = self.dataState +- elif data in asciiLetters: +- self.temporaryBuffer += data +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "" and appropriate: +- self.currentToken = {"type": tokenTypes["EndTag"], +- "name": self.temporaryBuffer, +- "data": [], "selfClosing": False} +- self.emitCurrentToken() +- self.state = self.dataState +- elif data in asciiLetters: +- self.temporaryBuffer += data +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "" and appropriate: +- self.currentToken = {"type": tokenTypes["EndTag"], +- "name": self.temporaryBuffer, +- "data": [], "selfClosing": False} +- self.emitCurrentToken() +- self.state = self.dataState +- elif data in asciiLetters: +- self.temporaryBuffer += data +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "": +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) +- self.state = self.scriptDataState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "\uFFFD"}) +- self.state = self.scriptDataEscapedState +- elif data == EOF: +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) +- self.state = self.scriptDataEscapedState +- return True +- +- def scriptDataEscapedLessThanSignState(self): +- data = self.stream.char() +- if data == "/": +- self.temporaryBuffer = "" +- self.state = self.scriptDataEscapedEndTagOpenState +- elif data in asciiLetters: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) +- self.temporaryBuffer = data +- self.state = self.scriptDataDoubleEscapeStartState +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) +- self.stream.unget(data) +- self.state = self.scriptDataEscapedState +- return True +- +- def scriptDataEscapedEndTagOpenState(self): +- data = self.stream.char() +- if data in asciiLetters: +- self.temporaryBuffer = data +- self.state = self.scriptDataEscapedEndTagNameState +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: +- self.currentToken = {"type": tokenTypes["EndTag"], +- "name": self.temporaryBuffer, +- "data": [], "selfClosing": False} +- self.emitCurrentToken() +- self.state = self.dataState +- elif data in asciiLetters: +- self.temporaryBuffer += data +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": ""))): +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) +- if self.temporaryBuffer.lower() == "script": +- self.state = self.scriptDataDoubleEscapedState +- else: +- self.state = self.scriptDataEscapedState +- elif data in asciiLetters: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) +- self.temporaryBuffer += data +- else: +- self.stream.unget(data) +- self.state = self.scriptDataEscapedState +- return True +- +- def scriptDataDoubleEscapedState(self): +- data = self.stream.char() +- if data == "-": +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) +- self.state = self.scriptDataDoubleEscapedDashState +- elif data == "<": +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) +- self.state = self.scriptDataDoubleEscapedLessThanSignState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "\uFFFD"}) +- elif data == EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-script-in-script"}) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) +- return True +- +- def scriptDataDoubleEscapedDashState(self): +- data = self.stream.char() +- if data == "-": +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) +- self.state = self.scriptDataDoubleEscapedDashDashState +- elif data == "<": +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) +- self.state = self.scriptDataDoubleEscapedLessThanSignState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "\uFFFD"}) +- self.state = self.scriptDataDoubleEscapedState +- elif data == EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-script-in-script"}) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) +- self.state = self.scriptDataDoubleEscapedState +- return True +- +- def scriptDataDoubleEscapedDashDashState(self): +- data = self.stream.char() +- if data == "-": +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) +- elif data == "<": +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) +- self.state = self.scriptDataDoubleEscapedLessThanSignState +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) +- self.state = self.scriptDataState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": "\uFFFD"}) +- self.state = self.scriptDataDoubleEscapedState +- elif data == EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-script-in-script"}) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) +- self.state = self.scriptDataDoubleEscapedState +- return True +- +- def scriptDataDoubleEscapedLessThanSignState(self): +- data = self.stream.char() +- if data == "/": +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) +- self.temporaryBuffer = "" +- self.state = self.scriptDataDoubleEscapeEndState +- else: +- self.stream.unget(data) +- self.state = self.scriptDataDoubleEscapedState +- return True +- +- def scriptDataDoubleEscapeEndState(self): +- data = self.stream.char() +- if data in (spaceCharacters | frozenset(("/", ">"))): +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) +- if self.temporaryBuffer.lower() == "script": +- self.state = self.scriptDataEscapedState +- else: +- self.state = self.scriptDataDoubleEscapedState +- elif data in asciiLetters: +- self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) +- self.temporaryBuffer += data +- else: +- self.stream.unget(data) +- self.state = self.scriptDataDoubleEscapedState +- return True +- +- def beforeAttributeNameState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- self.stream.charsUntil(spaceCharacters, True) +- elif data in asciiLetters: +- self.currentToken["data"].append([data, ""]) +- self.state = self.attributeNameState +- elif data == ">": +- self.emitCurrentToken() +- elif data == "/": +- self.state = self.selfClosingStartTagState +- elif data in ("'", '"', "=", "<"): +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "invalid-character-in-attribute-name"}) +- self.currentToken["data"].append([data, ""]) +- self.state = self.attributeNameState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"].append(["\uFFFD", ""]) +- self.state = self.attributeNameState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-attribute-name-but-got-eof"}) +- self.state = self.dataState +- else: +- self.currentToken["data"].append([data, ""]) +- self.state = self.attributeNameState +- return True +- +- def attributeNameState(self): +- data = self.stream.char() +- leavingThisState = True +- emitToken = False +- if data == "=": +- self.state = self.beforeAttributeValueState +- elif data in asciiLetters: +- self.currentToken["data"][-1][0] += data +\ +- self.stream.charsUntil(asciiLetters, True) +- leavingThisState = False +- elif data == ">": +- # XXX If we emit here the attributes are converted to a dict +- # without being checked and when the code below runs we error +- # because data is a dict not a list +- emitToken = True +- elif data in spaceCharacters: +- self.state = self.afterAttributeNameState +- elif data == "/": +- self.state = self.selfClosingStartTagState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"][-1][0] += "\uFFFD" +- leavingThisState = False +- elif data in ("'", '"', "<"): +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": +- "invalid-character-in-attribute-name"}) +- self.currentToken["data"][-1][0] += data +- leavingThisState = False +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "eof-in-attribute-name"}) +- self.state = self.dataState +- else: +- self.currentToken["data"][-1][0] += data +- leavingThisState = False +- +- if leavingThisState: +- # Attributes are not dropped at this stage. That happens when the +- # start tag token is emitted so values can still be safely appended +- # to attributes, but we do want to report the parse error in time. +- self.currentToken["data"][-1][0] = ( +- self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) +- for name, _ in self.currentToken["data"][:-1]: +- if self.currentToken["data"][-1][0] == name: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "duplicate-attribute"}) +- break +- # XXX Fix for above XXX +- if emitToken: +- self.emitCurrentToken() +- return True +- +- def afterAttributeNameState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- self.stream.charsUntil(spaceCharacters, True) +- elif data == "=": +- self.state = self.beforeAttributeValueState +- elif data == ">": +- self.emitCurrentToken() +- elif data in asciiLetters: +- self.currentToken["data"].append([data, ""]) +- self.state = self.attributeNameState +- elif data == "/": +- self.state = self.selfClosingStartTagState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"].append(["\uFFFD", ""]) +- self.state = self.attributeNameState +- elif data in ("'", '"', "<"): +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "invalid-character-after-attribute-name"}) +- self.currentToken["data"].append([data, ""]) +- self.state = self.attributeNameState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-end-of-tag-but-got-eof"}) +- self.state = self.dataState +- else: +- self.currentToken["data"].append([data, ""]) +- self.state = self.attributeNameState +- return True +- +- def beforeAttributeValueState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- self.stream.charsUntil(spaceCharacters, True) +- elif data == "\"": +- self.state = self.attributeValueDoubleQuotedState +- elif data == "&": +- self.state = self.attributeValueUnQuotedState +- self.stream.unget(data) +- elif data == "'": +- self.state = self.attributeValueSingleQuotedState +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-attribute-value-but-got-right-bracket"}) +- self.emitCurrentToken() +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"][-1][1] += "\uFFFD" +- self.state = self.attributeValueUnQuotedState +- elif data in ("=", "<", "`"): +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "equals-in-unquoted-attribute-value"}) +- self.currentToken["data"][-1][1] += data +- self.state = self.attributeValueUnQuotedState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-attribute-value-but-got-eof"}) +- self.state = self.dataState +- else: +- self.currentToken["data"][-1][1] += data +- self.state = self.attributeValueUnQuotedState +- return True +- +- def attributeValueDoubleQuotedState(self): +- data = self.stream.char() +- if data == "\"": +- self.state = self.afterAttributeValueState +- elif data == "&": +- self.processEntityInAttribute('"') +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"][-1][1] += "\uFFFD" +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-attribute-value-double-quote"}) +- self.state = self.dataState +- else: +- self.currentToken["data"][-1][1] += data +\ +- self.stream.charsUntil(("\"", "&", "\u0000")) +- return True +- +- def attributeValueSingleQuotedState(self): +- data = self.stream.char() +- if data == "'": +- self.state = self.afterAttributeValueState +- elif data == "&": +- self.processEntityInAttribute("'") +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"][-1][1] += "\uFFFD" +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-attribute-value-single-quote"}) +- self.state = self.dataState +- else: +- self.currentToken["data"][-1][1] += data +\ +- self.stream.charsUntil(("'", "&", "\u0000")) +- return True +- +- def attributeValueUnQuotedState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- self.state = self.beforeAttributeNameState +- elif data == "&": +- self.processEntityInAttribute(">") +- elif data == ">": +- self.emitCurrentToken() +- elif data in ('"', "'", "=", "<", "`"): +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-character-in-unquoted-attribute-value"}) +- self.currentToken["data"][-1][1] += data +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"][-1][1] += "\uFFFD" +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-attribute-value-no-quotes"}) +- self.state = self.dataState +- else: +- self.currentToken["data"][-1][1] += data + self.stream.charsUntil( +- frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) +- return True +- +- def afterAttributeValueState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- self.state = self.beforeAttributeNameState +- elif data == ">": +- self.emitCurrentToken() +- elif data == "/": +- self.state = self.selfClosingStartTagState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-EOF-after-attribute-value"}) +- self.stream.unget(data) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-character-after-attribute-value"}) +- self.stream.unget(data) +- self.state = self.beforeAttributeNameState +- return True +- +- def selfClosingStartTagState(self): +- data = self.stream.char() +- if data == ">": +- self.currentToken["selfClosing"] = True +- self.emitCurrentToken() +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": +- "unexpected-EOF-after-solidus-in-tag"}) +- self.stream.unget(data) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-character-after-solidus-in-tag"}) +- self.stream.unget(data) +- self.state = self.beforeAttributeNameState +- return True +- +- def bogusCommentState(self): +- # Make a new comment token and give it as value all the characters +- # until the first > or EOF (charsUntil checks for EOF automatically) +- # and emit it. +- data = self.stream.charsUntil(">") +- data = data.replace("\u0000", "\uFFFD") +- self.tokenQueue.append( +- {"type": tokenTypes["Comment"], "data": data}) +- +- # Eat the character directly after the bogus comment which is either a +- # ">" or an EOF. +- self.stream.char() +- self.state = self.dataState +- return True +- +- def markupDeclarationOpenState(self): +- charStack = [self.stream.char()] +- if charStack[-1] == "-": +- charStack.append(self.stream.char()) +- if charStack[-1] == "-": +- self.currentToken = {"type": tokenTypes["Comment"], "data": ""} +- self.state = self.commentStartState +- return True +- elif charStack[-1] in ('d', 'D'): +- matched = True +- for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), +- ('y', 'Y'), ('p', 'P'), ('e', 'E')): +- charStack.append(self.stream.char()) +- if charStack[-1] not in expected: +- matched = False +- break +- if matched: +- self.currentToken = {"type": tokenTypes["Doctype"], +- "name": "", +- "publicId": None, "systemId": None, +- "correct": True} +- self.state = self.doctypeState +- return True +- elif (charStack[-1] == "[" and +- self.parser is not None and +- self.parser.tree.openElements and +- self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): +- matched = True +- for expected in ["C", "D", "A", "T", "A", "["]: +- charStack.append(self.stream.char()) +- if charStack[-1] != expected: +- matched = False +- break +- if matched: +- self.state = self.cdataSectionState +- return True +- +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-dashes-or-doctype"}) +- +- while charStack: +- self.stream.unget(charStack.pop()) +- self.state = self.bogusCommentState +- return True +- +- def commentStartState(self): +- data = self.stream.char() +- if data == "-": +- self.state = self.commentStartDashState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"] += "\uFFFD" +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "incorrect-comment"}) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-comment"}) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["data"] += data +- self.state = self.commentState +- return True +- +- def commentStartDashState(self): +- data = self.stream.char() +- if data == "-": +- self.state = self.commentEndState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"] += "-\uFFFD" +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "incorrect-comment"}) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-comment"}) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["data"] += "-" + data +- self.state = self.commentState +- return True +- +- def commentState(self): +- data = self.stream.char() +- if data == "-": +- self.state = self.commentEndDashState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"] += "\uFFFD" +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "eof-in-comment"}) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["data"] += data + \ +- self.stream.charsUntil(("-", "\u0000")) +- return True +- +- def commentEndDashState(self): +- data = self.stream.char() +- if data == "-": +- self.state = self.commentEndState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"] += "-\uFFFD" +- self.state = self.commentState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-comment-end-dash"}) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["data"] += "-" + data +- self.state = self.commentState +- return True +- +- def commentEndState(self): +- data = self.stream.char() +- if data == ">": +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"] += "--\uFFFD" +- self.state = self.commentState +- elif data == "!": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-bang-after-double-dash-in-comment"}) +- self.state = self.commentEndBangState +- elif data == "-": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-dash-after-double-dash-in-comment"}) +- self.currentToken["data"] += data +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-comment-double-dash"}) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- # XXX +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-comment"}) +- self.currentToken["data"] += "--" + data +- self.state = self.commentState +- return True +- +- def commentEndBangState(self): +- data = self.stream.char() +- if data == ">": +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data == "-": +- self.currentToken["data"] += "--!" +- self.state = self.commentEndDashState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["data"] += "--!\uFFFD" +- self.state = self.commentState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-comment-end-bang-state"}) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["data"] += "--!" + data +- self.state = self.commentState +- return True +- +- def doctypeState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- self.state = self.beforeDoctypeNameState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-doctype-name-but-got-eof"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "need-space-after-doctype"}) +- self.stream.unget(data) +- self.state = self.beforeDoctypeNameState +- return True +- +- def beforeDoctypeNameState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- pass +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-doctype-name-but-got-right-bracket"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["name"] = "\uFFFD" +- self.state = self.doctypeNameState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-doctype-name-but-got-eof"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["name"] = data +- self.state = self.doctypeNameState +- return True +- +- def doctypeNameState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) +- self.state = self.afterDoctypeNameState +- elif data == ">": +- self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["name"] += "\uFFFD" +- self.state = self.doctypeNameState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype-name"}) +- self.currentToken["correct"] = False +- self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["name"] += data +- return True +- +- def afterDoctypeNameState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- pass +- elif data == ">": +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- self.currentToken["correct"] = False +- self.stream.unget(data) +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- if data in ("p", "P"): +- matched = True +- for expected in (("u", "U"), ("b", "B"), ("l", "L"), +- ("i", "I"), ("c", "C")): +- data = self.stream.char() +- if data not in expected: +- matched = False +- break +- if matched: +- self.state = self.afterDoctypePublicKeywordState +- return True +- elif data in ("s", "S"): +- matched = True +- for expected in (("y", "Y"), ("s", "S"), ("t", "T"), +- ("e", "E"), ("m", "M")): +- data = self.stream.char() +- if data not in expected: +- matched = False +- break +- if matched: +- self.state = self.afterDoctypeSystemKeywordState +- return True +- +- # All the characters read before the current 'data' will be +- # [a-zA-Z], so they're garbage in the bogus doctype and can be +- # discarded; only the latest character might be '>' or EOF +- # and needs to be ungetted +- self.stream.unget(data) +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "expected-space-or-right-bracket-in-doctype", "datavars": +- {"data": data}}) +- self.currentToken["correct"] = False +- self.state = self.bogusDoctypeState +- +- return True +- +- def afterDoctypePublicKeywordState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- self.state = self.beforeDoctypePublicIdentifierState +- elif data in ("'", '"'): +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-doctype"}) +- self.stream.unget(data) +- self.state = self.beforeDoctypePublicIdentifierState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.stream.unget(data) +- self.state = self.beforeDoctypePublicIdentifierState +- return True +- +- def beforeDoctypePublicIdentifierState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- pass +- elif data == "\"": +- self.currentToken["publicId"] = "" +- self.state = self.doctypePublicIdentifierDoubleQuotedState +- elif data == "'": +- self.currentToken["publicId"] = "" +- self.state = self.doctypePublicIdentifierSingleQuotedState +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-end-of-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-doctype"}) +- self.currentToken["correct"] = False +- self.state = self.bogusDoctypeState +- return True +- +- def doctypePublicIdentifierDoubleQuotedState(self): +- data = self.stream.char() +- if data == "\"": +- self.state = self.afterDoctypePublicIdentifierState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["publicId"] += "\uFFFD" +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-end-of-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["publicId"] += data +- return True +- +- def doctypePublicIdentifierSingleQuotedState(self): +- data = self.stream.char() +- if data == "'": +- self.state = self.afterDoctypePublicIdentifierState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["publicId"] += "\uFFFD" +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-end-of-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["publicId"] += data +- return True +- +- def afterDoctypePublicIdentifierState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- self.state = self.betweenDoctypePublicAndSystemIdentifiersState +- elif data == ">": +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data == '"': +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-doctype"}) +- self.currentToken["systemId"] = "" +- self.state = self.doctypeSystemIdentifierDoubleQuotedState +- elif data == "'": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-doctype"}) +- self.currentToken["systemId"] = "" +- self.state = self.doctypeSystemIdentifierSingleQuotedState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-doctype"}) +- self.currentToken["correct"] = False +- self.state = self.bogusDoctypeState +- return True +- +- def betweenDoctypePublicAndSystemIdentifiersState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- pass +- elif data == ">": +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data == '"': +- self.currentToken["systemId"] = "" +- self.state = self.doctypeSystemIdentifierDoubleQuotedState +- elif data == "'": +- self.currentToken["systemId"] = "" +- self.state = self.doctypeSystemIdentifierSingleQuotedState +- elif data == EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-doctype"}) +- self.currentToken["correct"] = False +- self.state = self.bogusDoctypeState +- return True +- +- def afterDoctypeSystemKeywordState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- self.state = self.beforeDoctypeSystemIdentifierState +- elif data in ("'", '"'): +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-doctype"}) +- self.stream.unget(data) +- self.state = self.beforeDoctypeSystemIdentifierState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.stream.unget(data) +- self.state = self.beforeDoctypeSystemIdentifierState +- return True +- +- def beforeDoctypeSystemIdentifierState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- pass +- elif data == "\"": +- self.currentToken["systemId"] = "" +- self.state = self.doctypeSystemIdentifierDoubleQuotedState +- elif data == "'": +- self.currentToken["systemId"] = "" +- self.state = self.doctypeSystemIdentifierSingleQuotedState +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-doctype"}) +- self.currentToken["correct"] = False +- self.state = self.bogusDoctypeState +- return True +- +- def doctypeSystemIdentifierDoubleQuotedState(self): +- data = self.stream.char() +- if data == "\"": +- self.state = self.afterDoctypeSystemIdentifierState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["systemId"] += "\uFFFD" +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-end-of-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["systemId"] += data +- return True +- +- def doctypeSystemIdentifierSingleQuotedState(self): +- data = self.stream.char() +- if data == "'": +- self.state = self.afterDoctypeSystemIdentifierState +- elif data == "\u0000": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- self.currentToken["systemId"] += "\uFFFD" +- elif data == ">": +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-end-of-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.currentToken["systemId"] += data +- return True +- +- def afterDoctypeSystemIdentifierState(self): +- data = self.stream.char() +- if data in spaceCharacters: +- pass +- elif data == ">": +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "eof-in-doctype"}) +- self.currentToken["correct"] = False +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": +- "unexpected-char-in-doctype"}) +- self.state = self.bogusDoctypeState +- return True +- +- def bogusDoctypeState(self): +- data = self.stream.char() +- if data == ">": +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- elif data is EOF: +- # XXX EMIT +- self.stream.unget(data) +- self.tokenQueue.append(self.currentToken) +- self.state = self.dataState +- else: +- pass +- return True +- +- def cdataSectionState(self): +- data = [] +- while True: +- data.append(self.stream.charsUntil("]")) +- data.append(self.stream.charsUntil(">")) +- char = self.stream.char() +- if char == EOF: +- break +- else: +- assert char == ">" +- if data[-1][-2:] == "]]": +- data[-1] = data[-1][:-2] +- break +- else: +- data.append(char) +- +- data = "".join(data) # pylint:disable=redefined-variable-type +- # Deal with null here rather than in the parser +- nullCount = data.count("\u0000") +- if nullCount > 0: +- for _ in range(nullCount): +- self.tokenQueue.append({"type": tokenTypes["ParseError"], +- "data": "invalid-codepoint"}) +- data = data.replace("\u0000", "\uFFFD") +- if data: +- self.tokenQueue.append({"type": tokenTypes["Characters"], +- "data": data}) +- self.state = self.dataState +- return True +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/__init__.py +deleted file mode 100644 +index a5ba4bf..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/__init__.py ++++ /dev/null +@@ -1,14 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-from .py import Trie as PyTrie +- +-Trie = PyTrie +- +-# pylint:disable=wrong-import-position +-try: +- from .datrie import Trie as DATrie +-except ImportError: +- pass +-else: +- Trie = DATrie +-# pylint:enable=wrong-import-position +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/_base.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/_base.py +deleted file mode 100644 +index 25eece4..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/_base.py ++++ /dev/null +@@ -1,38 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-from collections import Mapping +- +- +-class Trie(Mapping): +- """Abstract base class for tries""" +- +- def keys(self, prefix=None): +- # pylint:disable=arguments-differ +- keys = super(Trie, self).keys() +- +- if prefix is None: +- return set(keys) +- +- # Python 2.6: no set comprehensions +- return set([x for x in keys if x.startswith(prefix)]) +- +- def has_keys_with_prefix(self, prefix): +- for key in self.keys(): +- if key.startswith(prefix): +- return True +- +- return False +- +- def longest_prefix(self, prefix): +- if prefix in self: +- return prefix +- +- for i in range(1, len(prefix) + 1): +- if prefix[:-i] in self: +- return prefix[:-i] +- +- raise KeyError(prefix) +- +- def longest_prefix_item(self, prefix): +- lprefix = self.longest_prefix(prefix) +- return (lprefix, self[lprefix]) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/datrie.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/datrie.py +deleted file mode 100644 +index e2e5f86..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/datrie.py ++++ /dev/null +@@ -1,44 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-from datrie import Trie as DATrie +-from pip._vendor.six import text_type +- +-from ._base import Trie as ABCTrie +- +- +-class Trie(ABCTrie): +- def __init__(self, data): +- chars = set() +- for key in data.keys(): +- if not isinstance(key, text_type): +- raise TypeError("All keys must be strings") +- for char in key: +- chars.add(char) +- +- self._data = DATrie("".join(chars)) +- for key, value in data.items(): +- self._data[key] = value +- +- def __contains__(self, key): +- return key in self._data +- +- def __len__(self): +- return len(self._data) +- +- def __iter__(self): +- raise NotImplementedError() +- +- def __getitem__(self, key): +- return self._data[key] +- +- def keys(self, prefix=None): +- return self._data.keys(prefix) +- +- def has_keys_with_prefix(self, prefix): +- return self._data.has_keys_with_prefix(prefix) +- +- def longest_prefix(self, prefix): +- return self._data.longest_prefix(prefix) +- +- def longest_prefix_item(self, prefix): +- return self._data.longest_prefix_item(prefix) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/py.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/py.py +deleted file mode 100644 +index c178b21..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_trie/py.py ++++ /dev/null +@@ -1,67 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +-from pip._vendor.six import text_type +- +-from bisect import bisect_left +- +-from ._base import Trie as ABCTrie +- +- +-class Trie(ABCTrie): +- def __init__(self, data): +- if not all(isinstance(x, text_type) for x in data.keys()): +- raise TypeError("All keys must be strings") +- +- self._data = data +- self._keys = sorted(data.keys()) +- self._cachestr = "" +- self._cachepoints = (0, len(data)) +- +- def __contains__(self, key): +- return key in self._data +- +- def __len__(self): +- return len(self._data) +- +- def __iter__(self): +- return iter(self._data) +- +- def __getitem__(self, key): +- return self._data[key] +- +- def keys(self, prefix=None): +- if prefix is None or prefix == "" or not self._keys: +- return set(self._keys) +- +- if prefix.startswith(self._cachestr): +- lo, hi = self._cachepoints +- start = i = bisect_left(self._keys, prefix, lo, hi) +- else: +- start = i = bisect_left(self._keys, prefix) +- +- keys = set() +- if start == len(self._keys): +- return keys +- +- while self._keys[i].startswith(prefix): +- keys.add(self._keys[i]) +- i += 1 +- +- self._cachestr = prefix +- self._cachepoints = (start, i) +- +- return keys +- +- def has_keys_with_prefix(self, prefix): +- if prefix in self._data: +- return True +- +- if prefix.startswith(self._cachestr): +- lo, hi = self._cachepoints +- i = bisect_left(self._keys, prefix, lo, hi) +- else: +- i = bisect_left(self._keys, prefix) +- +- if i == len(self._keys): +- return False +- +- return self._keys[i].startswith(prefix) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_utils.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_utils.py +deleted file mode 100644 +index 55d6747..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/_utils.py ++++ /dev/null +@@ -1,127 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-import sys +-from types import ModuleType +- +-from pip._vendor.six import text_type +- +-try: +- import xml.etree.cElementTree as default_etree +-except ImportError: +- import xml.etree.ElementTree as default_etree +- +- +-__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", +- "surrogatePairToCodepoint", "moduleFactoryFactory", +- "supports_lone_surrogates", "PY27"] +- +- +-PY27 = sys.version_info[0] == 2 and sys.version_info[1] >= 7 +- +-# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be +-# caught by the below test. In general this would be any platform +-# using UTF-16 as its encoding of unicode strings, such as +-# Jython. This is because UTF-16 itself is based on the use of such +-# surrogates, and there is no mechanism to further escape such +-# escapes. +-try: +- _x = eval('"\\uD800"') # pylint:disable=eval-used +- if not isinstance(_x, text_type): +- # We need this with u"" because of http://bugs.jython.org/issue2039 +- _x = eval('u"\\uD800"') # pylint:disable=eval-used +- assert isinstance(_x, text_type) +-except: # pylint:disable=bare-except +- supports_lone_surrogates = False +-else: +- supports_lone_surrogates = True +- +- +-class MethodDispatcher(dict): +- """Dict with 2 special properties: +- +- On initiation, keys that are lists, sets or tuples are converted to +- multiple keys so accessing any one of the items in the original +- list-like object returns the matching value +- +- md = MethodDispatcher({("foo", "bar"):"baz"}) +- md["foo"] == "baz" +- +- A default value which can be set through the default attribute. +- """ +- +- def __init__(self, items=()): +- # Using _dictEntries instead of directly assigning to self is about +- # twice as fast. Please do careful performance testing before changing +- # anything here. +- _dictEntries = [] +- for name, value in items: +- if isinstance(name, (list, tuple, frozenset, set)): +- for item in name: +- _dictEntries.append((item, value)) +- else: +- _dictEntries.append((name, value)) +- dict.__init__(self, _dictEntries) +- assert len(self) == len(_dictEntries) +- self.default = None +- +- def __getitem__(self, key): +- return dict.get(self, key, self.default) +- +- +-# Some utility functions to deal with weirdness around UCS2 vs UCS4 +-# python builds +- +-def isSurrogatePair(data): +- return (len(data) == 2 and +- ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and +- ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) +- +- +-def surrogatePairToCodepoint(data): +- char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + +- (ord(data[1]) - 0xDC00)) +- return char_val +- +-# Module Factory Factory (no, this isn't Java, I know) +-# Here to stop this being duplicated all over the place. +- +- +-def moduleFactoryFactory(factory): +- moduleCache = {} +- +- def moduleFactory(baseModule, *args, **kwargs): +- if isinstance(ModuleType.__name__, type("")): +- name = "_%s_factory" % baseModule.__name__ +- else: +- name = b"_%s_factory" % baseModule.__name__ +- +- kwargs_tuple = tuple(kwargs.items()) +- +- try: +- return moduleCache[name][args][kwargs_tuple] +- except KeyError: +- mod = ModuleType(name) +- objs = factory(baseModule, *args, **kwargs) +- mod.__dict__.update(objs) +- if "name" not in moduleCache: +- moduleCache[name] = {} +- if "args" not in moduleCache[name]: +- moduleCache[name][args] = {} +- if "kwargs" not in moduleCache[name][args]: +- moduleCache[name][args][kwargs_tuple] = {} +- moduleCache[name][args][kwargs_tuple] = mod +- return mod +- +- return moduleFactory +- +- +-def memoize(func): +- cache = {} +- +- def wrapped(*args, **kwargs): +- key = (tuple(args), tuple(kwargs.items())) +- if key not in cache: +- cache[key] = func(*args, **kwargs) +- return cache[key] +- +- return wrapped +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/constants.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/constants.py +deleted file mode 100644 +index 9e7541d..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/constants.py ++++ /dev/null +@@ -1,2945 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-import string +- +-EOF = None +- +-E = { +- "null-character": +- "Null character in input stream, replaced with U+FFFD.", +- "invalid-codepoint": +- "Invalid codepoint in stream.", +- "incorrectly-placed-solidus": +- "Solidus (/) incorrectly placed in tag.", +- "incorrect-cr-newline-entity": +- "Incorrect CR newline entity, replaced with LF.", +- "illegal-windows-1252-entity": +- "Entity used with illegal number (windows-1252 reference).", +- "cant-convert-numeric-entity": +- "Numeric entity couldn't be converted to character " +- "(codepoint U+%(charAsInt)08x).", +- "illegal-codepoint-for-numeric-entity": +- "Numeric entity represents an illegal codepoint: " +- "U+%(charAsInt)08x.", +- "numeric-entity-without-semicolon": +- "Numeric entity didn't end with ';'.", +- "expected-numeric-entity-but-got-eof": +- "Numeric entity expected. Got end of file instead.", +- "expected-numeric-entity": +- "Numeric entity expected but none found.", +- "named-entity-without-semicolon": +- "Named entity didn't end with ';'.", +- "expected-named-entity": +- "Named entity expected. Got none.", +- "attributes-in-end-tag": +- "End tag contains unexpected attributes.", +- 'self-closing-flag-on-end-tag': +- "End tag contains unexpected self-closing flag.", +- "expected-tag-name-but-got-right-bracket": +- "Expected tag name. Got '>' instead.", +- "expected-tag-name-but-got-question-mark": +- "Expected tag name. Got '?' instead. (HTML doesn't " +- "support processing instructions.)", +- "expected-tag-name": +- "Expected tag name. Got something else instead", +- "expected-closing-tag-but-got-right-bracket": +- "Expected closing tag. Got '>' instead. Ignoring ''.", +- "expected-closing-tag-but-got-eof": +- "Expected closing tag. Unexpected end of file.", +- "expected-closing-tag-but-got-char": +- "Expected closing tag. Unexpected character '%(data)s' found.", +- "eof-in-tag-name": +- "Unexpected end of file in the tag name.", +- "expected-attribute-name-but-got-eof": +- "Unexpected end of file. Expected attribute name instead.", +- "eof-in-attribute-name": +- "Unexpected end of file in attribute name.", +- "invalid-character-in-attribute-name": +- "Invalid character in attribute name", +- "duplicate-attribute": +- "Dropped duplicate attribute on tag.", +- "expected-end-of-tag-name-but-got-eof": +- "Unexpected end of file. Expected = or end of tag.", +- "expected-attribute-value-but-got-eof": +- "Unexpected end of file. Expected attribute value.", +- "expected-attribute-value-but-got-right-bracket": +- "Expected attribute value. Got '>' instead.", +- 'equals-in-unquoted-attribute-value': +- "Unexpected = in unquoted attribute", +- 'unexpected-character-in-unquoted-attribute-value': +- "Unexpected character in unquoted attribute", +- "invalid-character-after-attribute-name": +- "Unexpected character after attribute name.", +- "unexpected-character-after-attribute-value": +- "Unexpected character after attribute value.", +- "eof-in-attribute-value-double-quote": +- "Unexpected end of file in attribute value (\").", +- "eof-in-attribute-value-single-quote": +- "Unexpected end of file in attribute value (').", +- "eof-in-attribute-value-no-quotes": +- "Unexpected end of file in attribute value.", +- "unexpected-EOF-after-solidus-in-tag": +- "Unexpected end of file in tag. Expected >", +- "unexpected-character-after-solidus-in-tag": +- "Unexpected character after / in tag. Expected >", +- "expected-dashes-or-doctype": +- "Expected '--' or 'DOCTYPE'. Not found.", +- "unexpected-bang-after-double-dash-in-comment": +- "Unexpected ! after -- in comment", +- "unexpected-space-after-double-dash-in-comment": +- "Unexpected space after -- in comment", +- "incorrect-comment": +- "Incorrect comment.", +- "eof-in-comment": +- "Unexpected end of file in comment.", +- "eof-in-comment-end-dash": +- "Unexpected end of file in comment (-)", +- "unexpected-dash-after-double-dash-in-comment": +- "Unexpected '-' after '--' found in comment.", +- "eof-in-comment-double-dash": +- "Unexpected end of file in comment (--).", +- "eof-in-comment-end-space-state": +- "Unexpected end of file in comment.", +- "eof-in-comment-end-bang-state": +- "Unexpected end of file in comment.", +- "unexpected-char-in-comment": +- "Unexpected character in comment found.", +- "need-space-after-doctype": +- "No space after literal string 'DOCTYPE'.", +- "expected-doctype-name-but-got-right-bracket": +- "Unexpected > character. Expected DOCTYPE name.", +- "expected-doctype-name-but-got-eof": +- "Unexpected end of file. Expected DOCTYPE name.", +- "eof-in-doctype-name": +- "Unexpected end of file in DOCTYPE name.", +- "eof-in-doctype": +- "Unexpected end of file in DOCTYPE.", +- "expected-space-or-right-bracket-in-doctype": +- "Expected space or '>'. Got '%(data)s'", +- "unexpected-end-of-doctype": +- "Unexpected end of DOCTYPE.", +- "unexpected-char-in-doctype": +- "Unexpected character in DOCTYPE.", +- "eof-in-innerhtml": +- "XXX innerHTML EOF", +- "unexpected-doctype": +- "Unexpected DOCTYPE. Ignored.", +- "non-html-root": +- "html needs to be the first start tag.", +- "expected-doctype-but-got-eof": +- "Unexpected End of file. Expected DOCTYPE.", +- "unknown-doctype": +- "Erroneous DOCTYPE.", +- "expected-doctype-but-got-chars": +- "Unexpected non-space characters. Expected DOCTYPE.", +- "expected-doctype-but-got-start-tag": +- "Unexpected start tag (%(name)s). Expected DOCTYPE.", +- "expected-doctype-but-got-end-tag": +- "Unexpected end tag (%(name)s). Expected DOCTYPE.", +- "end-tag-after-implied-root": +- "Unexpected end tag (%(name)s) after the (implied) root element.", +- "expected-named-closing-tag-but-got-eof": +- "Unexpected end of file. Expected end tag (%(name)s).", +- "two-heads-are-not-better-than-one": +- "Unexpected start tag head in existing head. Ignored.", +- "unexpected-end-tag": +- "Unexpected end tag (%(name)s). Ignored.", +- "unexpected-start-tag-out-of-my-head": +- "Unexpected start tag (%(name)s) that can be in head. Moved.", +- "unexpected-start-tag": +- "Unexpected start tag (%(name)s).", +- "missing-end-tag": +- "Missing end tag (%(name)s).", +- "missing-end-tags": +- "Missing end tags (%(name)s).", +- "unexpected-start-tag-implies-end-tag": +- "Unexpected start tag (%(startName)s) " +- "implies end tag (%(endName)s).", +- "unexpected-start-tag-treated-as": +- "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", +- "deprecated-tag": +- "Unexpected start tag %(name)s. Don't use it!", +- "unexpected-start-tag-ignored": +- "Unexpected start tag %(name)s. Ignored.", +- "expected-one-end-tag-but-got-another": +- "Unexpected end tag (%(gotName)s). " +- "Missing end tag (%(expectedName)s).", +- "end-tag-too-early": +- "End tag (%(name)s) seen too early. Expected other end tag.", +- "end-tag-too-early-named": +- "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", +- "end-tag-too-early-ignored": +- "End tag (%(name)s) seen too early. Ignored.", +- "adoption-agency-1.1": +- "End tag (%(name)s) violates step 1, " +- "paragraph 1 of the adoption agency algorithm.", +- "adoption-agency-1.2": +- "End tag (%(name)s) violates step 1, " +- "paragraph 2 of the adoption agency algorithm.", +- "adoption-agency-1.3": +- "End tag (%(name)s) violates step 1, " +- "paragraph 3 of the adoption agency algorithm.", +- "adoption-agency-4.4": +- "End tag (%(name)s) violates step 4, " +- "paragraph 4 of the adoption agency algorithm.", +- "unexpected-end-tag-treated-as": +- "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", +- "no-end-tag": +- "This element (%(name)s) has no end tag.", +- "unexpected-implied-end-tag-in-table": +- "Unexpected implied end tag (%(name)s) in the table phase.", +- "unexpected-implied-end-tag-in-table-body": +- "Unexpected implied end tag (%(name)s) in the table body phase.", +- "unexpected-char-implies-table-voodoo": +- "Unexpected non-space characters in " +- "table context caused voodoo mode.", +- "unexpected-hidden-input-in-table": +- "Unexpected input with type hidden in table context.", +- "unexpected-form-in-table": +- "Unexpected form in table context.", +- "unexpected-start-tag-implies-table-voodoo": +- "Unexpected start tag (%(name)s) in " +- "table context caused voodoo mode.", +- "unexpected-end-tag-implies-table-voodoo": +- "Unexpected end tag (%(name)s) in " +- "table context caused voodoo mode.", +- "unexpected-cell-in-table-body": +- "Unexpected table cell start tag (%(name)s) " +- "in the table body phase.", +- "unexpected-cell-end-tag": +- "Got table cell end tag (%(name)s) " +- "while required end tags are missing.", +- "unexpected-end-tag-in-table-body": +- "Unexpected end tag (%(name)s) in the table body phase. Ignored.", +- "unexpected-implied-end-tag-in-table-row": +- "Unexpected implied end tag (%(name)s) in the table row phase.", +- "unexpected-end-tag-in-table-row": +- "Unexpected end tag (%(name)s) in the table row phase. Ignored.", +- "unexpected-select-in-select": +- "Unexpected select start tag in the select phase " +- "treated as select end tag.", +- "unexpected-input-in-select": +- "Unexpected input start tag in the select phase.", +- "unexpected-start-tag-in-select": +- "Unexpected start tag token (%(name)s in the select phase. " +- "Ignored.", +- "unexpected-end-tag-in-select": +- "Unexpected end tag (%(name)s) in the select phase. Ignored.", +- "unexpected-table-element-start-tag-in-select-in-table": +- "Unexpected table element start tag (%(name)s) in the select in table phase.", +- "unexpected-table-element-end-tag-in-select-in-table": +- "Unexpected table element end tag (%(name)s) in the select in table phase.", +- "unexpected-char-after-body": +- "Unexpected non-space characters in the after body phase.", +- "unexpected-start-tag-after-body": +- "Unexpected start tag token (%(name)s)" +- " in the after body phase.", +- "unexpected-end-tag-after-body": +- "Unexpected end tag token (%(name)s)" +- " in the after body phase.", +- "unexpected-char-in-frameset": +- "Unexpected characters in the frameset phase. Characters ignored.", +- "unexpected-start-tag-in-frameset": +- "Unexpected start tag token (%(name)s)" +- " in the frameset phase. Ignored.", +- "unexpected-frameset-in-frameset-innerhtml": +- "Unexpected end tag token (frameset) " +- "in the frameset phase (innerHTML).", +- "unexpected-end-tag-in-frameset": +- "Unexpected end tag token (%(name)s)" +- " in the frameset phase. Ignored.", +- "unexpected-char-after-frameset": +- "Unexpected non-space characters in the " +- "after frameset phase. Ignored.", +- "unexpected-start-tag-after-frameset": +- "Unexpected start tag (%(name)s)" +- " in the after frameset phase. Ignored.", +- "unexpected-end-tag-after-frameset": +- "Unexpected end tag (%(name)s)" +- " in the after frameset phase. Ignored.", +- "unexpected-end-tag-after-body-innerhtml": +- "Unexpected end tag after body(innerHtml)", +- "expected-eof-but-got-char": +- "Unexpected non-space characters. Expected end of file.", +- "expected-eof-but-got-start-tag": +- "Unexpected start tag (%(name)s)" +- ". Expected end of file.", +- "expected-eof-but-got-end-tag": +- "Unexpected end tag (%(name)s)" +- ". Expected end of file.", +- "eof-in-table": +- "Unexpected end of file. Expected table content.", +- "eof-in-select": +- "Unexpected end of file. Expected select content.", +- "eof-in-frameset": +- "Unexpected end of file. Expected frameset content.", +- "eof-in-script-in-script": +- "Unexpected end of file. Expected script content.", +- "eof-in-foreign-lands": +- "Unexpected end of file. Expected foreign content", +- "non-void-element-with-trailing-solidus": +- "Trailing solidus not allowed on element %(name)s", +- "unexpected-html-element-in-foreign-content": +- "Element %(name)s not allowed in a non-html context", +- "unexpected-end-tag-before-html": +- "Unexpected end tag (%(name)s) before html.", +- "unexpected-inhead-noscript-tag": +- "Element %(name)s not allowed in a inhead-noscript context", +- "eof-in-head-noscript": +- "Unexpected end of file. Expected inhead-noscript content", +- "char-in-head-noscript": +- "Unexpected non-space character. Expected inhead-noscript content", +- "XXX-undefined-error": +- "Undefined error (this sucks and should be fixed)", +-} +- +-namespaces = { +- "html": "http://www.w3.org/1999/xhtml", +- "mathml": "http://www.w3.org/1998/Math/MathML", +- "svg": "http://www.w3.org/2000/svg", +- "xlink": "http://www.w3.org/1999/xlink", +- "xml": "http://www.w3.org/XML/1998/namespace", +- "xmlns": "http://www.w3.org/2000/xmlns/" +-} +- +-scopingElements = frozenset([ +- (namespaces["html"], "applet"), +- (namespaces["html"], "caption"), +- (namespaces["html"], "html"), +- (namespaces["html"], "marquee"), +- (namespaces["html"], "object"), +- (namespaces["html"], "table"), +- (namespaces["html"], "td"), +- (namespaces["html"], "th"), +- (namespaces["mathml"], "mi"), +- (namespaces["mathml"], "mo"), +- (namespaces["mathml"], "mn"), +- (namespaces["mathml"], "ms"), +- (namespaces["mathml"], "mtext"), +- (namespaces["mathml"], "annotation-xml"), +- (namespaces["svg"], "foreignObject"), +- (namespaces["svg"], "desc"), +- (namespaces["svg"], "title"), +-]) +- +-formattingElements = frozenset([ +- (namespaces["html"], "a"), +- (namespaces["html"], "b"), +- (namespaces["html"], "big"), +- (namespaces["html"], "code"), +- (namespaces["html"], "em"), +- (namespaces["html"], "font"), +- (namespaces["html"], "i"), +- (namespaces["html"], "nobr"), +- (namespaces["html"], "s"), +- (namespaces["html"], "small"), +- (namespaces["html"], "strike"), +- (namespaces["html"], "strong"), +- (namespaces["html"], "tt"), +- (namespaces["html"], "u") +-]) +- +-specialElements = frozenset([ +- (namespaces["html"], "address"), +- (namespaces["html"], "applet"), +- (namespaces["html"], "area"), +- (namespaces["html"], "article"), +- (namespaces["html"], "aside"), +- (namespaces["html"], "base"), +- (namespaces["html"], "basefont"), +- (namespaces["html"], "bgsound"), +- (namespaces["html"], "blockquote"), +- (namespaces["html"], "body"), +- (namespaces["html"], "br"), +- (namespaces["html"], "button"), +- (namespaces["html"], "caption"), +- (namespaces["html"], "center"), +- (namespaces["html"], "col"), +- (namespaces["html"], "colgroup"), +- (namespaces["html"], "command"), +- (namespaces["html"], "dd"), +- (namespaces["html"], "details"), +- (namespaces["html"], "dir"), +- (namespaces["html"], "div"), +- (namespaces["html"], "dl"), +- (namespaces["html"], "dt"), +- (namespaces["html"], "embed"), +- (namespaces["html"], "fieldset"), +- (namespaces["html"], "figure"), +- (namespaces["html"], "footer"), +- (namespaces["html"], "form"), +- (namespaces["html"], "frame"), +- (namespaces["html"], "frameset"), +- (namespaces["html"], "h1"), +- (namespaces["html"], "h2"), +- (namespaces["html"], "h3"), +- (namespaces["html"], "h4"), +- (namespaces["html"], "h5"), +- (namespaces["html"], "h6"), +- (namespaces["html"], "head"), +- (namespaces["html"], "header"), +- (namespaces["html"], "hr"), +- (namespaces["html"], "html"), +- (namespaces["html"], "iframe"), +- # Note that image is commented out in the spec as "this isn't an +- # element that can end up on the stack, so it doesn't matter," +- (namespaces["html"], "image"), +- (namespaces["html"], "img"), +- (namespaces["html"], "input"), +- (namespaces["html"], "isindex"), +- (namespaces["html"], "li"), +- (namespaces["html"], "link"), +- (namespaces["html"], "listing"), +- (namespaces["html"], "marquee"), +- (namespaces["html"], "menu"), +- (namespaces["html"], "meta"), +- (namespaces["html"], "nav"), +- (namespaces["html"], "noembed"), +- (namespaces["html"], "noframes"), +- (namespaces["html"], "noscript"), +- (namespaces["html"], "object"), +- (namespaces["html"], "ol"), +- (namespaces["html"], "p"), +- (namespaces["html"], "param"), +- (namespaces["html"], "plaintext"), +- (namespaces["html"], "pre"), +- (namespaces["html"], "script"), +- (namespaces["html"], "section"), +- (namespaces["html"], "select"), +- (namespaces["html"], "style"), +- (namespaces["html"], "table"), +- (namespaces["html"], "tbody"), +- (namespaces["html"], "td"), +- (namespaces["html"], "textarea"), +- (namespaces["html"], "tfoot"), +- (namespaces["html"], "th"), +- (namespaces["html"], "thead"), +- (namespaces["html"], "title"), +- (namespaces["html"], "tr"), +- (namespaces["html"], "ul"), +- (namespaces["html"], "wbr"), +- (namespaces["html"], "xmp"), +- (namespaces["svg"], "foreignObject") +-]) +- +-htmlIntegrationPointElements = frozenset([ +- (namespaces["mathml"], "annotaion-xml"), +- (namespaces["svg"], "foreignObject"), +- (namespaces["svg"], "desc"), +- (namespaces["svg"], "title") +-]) +- +-mathmlTextIntegrationPointElements = frozenset([ +- (namespaces["mathml"], "mi"), +- (namespaces["mathml"], "mo"), +- (namespaces["mathml"], "mn"), +- (namespaces["mathml"], "ms"), +- (namespaces["mathml"], "mtext") +-]) +- +-adjustSVGAttributes = { +- "attributename": "attributeName", +- "attributetype": "attributeType", +- "basefrequency": "baseFrequency", +- "baseprofile": "baseProfile", +- "calcmode": "calcMode", +- "clippathunits": "clipPathUnits", +- "contentscripttype": "contentScriptType", +- "contentstyletype": "contentStyleType", +- "diffuseconstant": "diffuseConstant", +- "edgemode": "edgeMode", +- "externalresourcesrequired": "externalResourcesRequired", +- "filterres": "filterRes", +- "filterunits": "filterUnits", +- "glyphref": "glyphRef", +- "gradienttransform": "gradientTransform", +- "gradientunits": "gradientUnits", +- "kernelmatrix": "kernelMatrix", +- "kernelunitlength": "kernelUnitLength", +- "keypoints": "keyPoints", +- "keysplines": "keySplines", +- "keytimes": "keyTimes", +- "lengthadjust": "lengthAdjust", +- "limitingconeangle": "limitingConeAngle", +- "markerheight": "markerHeight", +- "markerunits": "markerUnits", +- "markerwidth": "markerWidth", +- "maskcontentunits": "maskContentUnits", +- "maskunits": "maskUnits", +- "numoctaves": "numOctaves", +- "pathlength": "pathLength", +- "patterncontentunits": "patternContentUnits", +- "patterntransform": "patternTransform", +- "patternunits": "patternUnits", +- "pointsatx": "pointsAtX", +- "pointsaty": "pointsAtY", +- "pointsatz": "pointsAtZ", +- "preservealpha": "preserveAlpha", +- "preserveaspectratio": "preserveAspectRatio", +- "primitiveunits": "primitiveUnits", +- "refx": "refX", +- "refy": "refY", +- "repeatcount": "repeatCount", +- "repeatdur": "repeatDur", +- "requiredextensions": "requiredExtensions", +- "requiredfeatures": "requiredFeatures", +- "specularconstant": "specularConstant", +- "specularexponent": "specularExponent", +- "spreadmethod": "spreadMethod", +- "startoffset": "startOffset", +- "stddeviation": "stdDeviation", +- "stitchtiles": "stitchTiles", +- "surfacescale": "surfaceScale", +- "systemlanguage": "systemLanguage", +- "tablevalues": "tableValues", +- "targetx": "targetX", +- "targety": "targetY", +- "textlength": "textLength", +- "viewbox": "viewBox", +- "viewtarget": "viewTarget", +- "xchannelselector": "xChannelSelector", +- "ychannelselector": "yChannelSelector", +- "zoomandpan": "zoomAndPan" +-} +- +-adjustMathMLAttributes = {"definitionurl": "definitionURL"} +- +-adjustForeignAttributes = { +- "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), +- "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), +- "xlink:href": ("xlink", "href", namespaces["xlink"]), +- "xlink:role": ("xlink", "role", namespaces["xlink"]), +- "xlink:show": ("xlink", "show", namespaces["xlink"]), +- "xlink:title": ("xlink", "title", namespaces["xlink"]), +- "xlink:type": ("xlink", "type", namespaces["xlink"]), +- "xml:base": ("xml", "base", namespaces["xml"]), +- "xml:lang": ("xml", "lang", namespaces["xml"]), +- "xml:space": ("xml", "space", namespaces["xml"]), +- "xmlns": (None, "xmlns", namespaces["xmlns"]), +- "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +-} +- +-unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in +- adjustForeignAttributes.items()]) +- +-spaceCharacters = frozenset([ +- "\t", +- "\n", +- "\u000C", +- " ", +- "\r" +-]) +- +-tableInsertModeElements = frozenset([ +- "table", +- "tbody", +- "tfoot", +- "thead", +- "tr" +-]) +- +-asciiLowercase = frozenset(string.ascii_lowercase) +-asciiUppercase = frozenset(string.ascii_uppercase) +-asciiLetters = frozenset(string.ascii_letters) +-digits = frozenset(string.digits) +-hexDigits = frozenset(string.hexdigits) +- +-asciiUpper2Lower = dict([(ord(c), ord(c.lower())) +- for c in string.ascii_uppercase]) +- +-# Heading elements need to be ordered +-headingElements = ( +- "h1", +- "h2", +- "h3", +- "h4", +- "h5", +- "h6" +-) +- +-voidElements = frozenset([ +- "base", +- "command", +- "event-source", +- "link", +- "meta", +- "hr", +- "br", +- "img", +- "embed", +- "param", +- "area", +- "col", +- "input", +- "source", +- "track" +-]) +- +-cdataElements = frozenset(['title', 'textarea']) +- +-rcdataElements = frozenset([ +- 'style', +- 'script', +- 'xmp', +- 'iframe', +- 'noembed', +- 'noframes', +- 'noscript' +-]) +- +-booleanAttributes = { +- "": frozenset(["irrelevant"]), +- "style": frozenset(["scoped"]), +- "img": frozenset(["ismap"]), +- "audio": frozenset(["autoplay", "controls"]), +- "video": frozenset(["autoplay", "controls"]), +- "script": frozenset(["defer", "async"]), +- "details": frozenset(["open"]), +- "datagrid": frozenset(["multiple", "disabled"]), +- "command": frozenset(["hidden", "disabled", "checked", "default"]), +- "hr": frozenset(["noshade"]), +- "menu": frozenset(["autosubmit"]), +- "fieldset": frozenset(["disabled", "readonly"]), +- "option": frozenset(["disabled", "readonly", "selected"]), +- "optgroup": frozenset(["disabled", "readonly"]), +- "button": frozenset(["disabled", "autofocus"]), +- "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), +- "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), +- "output": frozenset(["disabled", "readonly"]), +-} +- +-# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +-# therefore can't be a frozenset. +-entitiesWindows1252 = ( +- 8364, # 0x80 0x20AC EURO SIGN +- 65533, # 0x81 UNDEFINED +- 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK +- 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK +- 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK +- 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS +- 8224, # 0x86 0x2020 DAGGER +- 8225, # 0x87 0x2021 DOUBLE DAGGER +- 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT +- 8240, # 0x89 0x2030 PER MILLE SIGN +- 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON +- 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK +- 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE +- 65533, # 0x8D UNDEFINED +- 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON +- 65533, # 0x8F UNDEFINED +- 65533, # 0x90 UNDEFINED +- 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK +- 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK +- 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK +- 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK +- 8226, # 0x95 0x2022 BULLET +- 8211, # 0x96 0x2013 EN DASH +- 8212, # 0x97 0x2014 EM DASH +- 732, # 0x98 0x02DC SMALL TILDE +- 8482, # 0x99 0x2122 TRADE MARK SIGN +- 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON +- 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +- 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE +- 65533, # 0x9D UNDEFINED +- 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON +- 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +-) +- +-xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) +- +-entities = { +- "AElig": "\xc6", +- "AElig;": "\xc6", +- "AMP": "&", +- "AMP;": "&", +- "Aacute": "\xc1", +- "Aacute;": "\xc1", +- "Abreve;": "\u0102", +- "Acirc": "\xc2", +- "Acirc;": "\xc2", +- "Acy;": "\u0410", +- "Afr;": "\U0001d504", +- "Agrave": "\xc0", +- "Agrave;": "\xc0", +- "Alpha;": "\u0391", +- "Amacr;": "\u0100", +- "And;": "\u2a53", +- "Aogon;": "\u0104", +- "Aopf;": "\U0001d538", +- "ApplyFunction;": "\u2061", +- "Aring": "\xc5", +- "Aring;": "\xc5", +- "Ascr;": "\U0001d49c", +- "Assign;": "\u2254", +- "Atilde": "\xc3", +- "Atilde;": "\xc3", +- "Auml": "\xc4", +- "Auml;": "\xc4", +- "Backslash;": "\u2216", +- "Barv;": "\u2ae7", +- "Barwed;": "\u2306", +- "Bcy;": "\u0411", +- "Because;": "\u2235", +- "Bernoullis;": "\u212c", +- "Beta;": "\u0392", +- "Bfr;": "\U0001d505", +- "Bopf;": "\U0001d539", +- "Breve;": "\u02d8", +- "Bscr;": "\u212c", +- "Bumpeq;": "\u224e", +- "CHcy;": "\u0427", +- "COPY": "\xa9", +- "COPY;": "\xa9", +- "Cacute;": "\u0106", +- "Cap;": "\u22d2", +- "CapitalDifferentialD;": "\u2145", +- "Cayleys;": "\u212d", +- "Ccaron;": "\u010c", +- "Ccedil": "\xc7", +- "Ccedil;": "\xc7", +- "Ccirc;": "\u0108", +- "Cconint;": "\u2230", +- "Cdot;": "\u010a", +- "Cedilla;": "\xb8", +- "CenterDot;": "\xb7", +- "Cfr;": "\u212d", +- "Chi;": "\u03a7", +- "CircleDot;": "\u2299", +- "CircleMinus;": "\u2296", +- "CirclePlus;": "\u2295", +- "CircleTimes;": "\u2297", +- "ClockwiseContourIntegral;": "\u2232", +- "CloseCurlyDoubleQuote;": "\u201d", +- "CloseCurlyQuote;": "\u2019", +- "Colon;": "\u2237", +- "Colone;": "\u2a74", +- "Congruent;": "\u2261", +- "Conint;": "\u222f", +- "ContourIntegral;": "\u222e", +- "Copf;": "\u2102", +- "Coproduct;": "\u2210", +- "CounterClockwiseContourIntegral;": "\u2233", +- "Cross;": "\u2a2f", +- "Cscr;": "\U0001d49e", +- "Cup;": "\u22d3", +- "CupCap;": "\u224d", +- "DD;": "\u2145", +- "DDotrahd;": "\u2911", +- "DJcy;": "\u0402", +- "DScy;": "\u0405", +- "DZcy;": "\u040f", +- "Dagger;": "\u2021", +- "Darr;": "\u21a1", +- "Dashv;": "\u2ae4", +- "Dcaron;": "\u010e", +- "Dcy;": "\u0414", +- "Del;": "\u2207", +- "Delta;": "\u0394", +- "Dfr;": "\U0001d507", +- "DiacriticalAcute;": "\xb4", +- "DiacriticalDot;": "\u02d9", +- "DiacriticalDoubleAcute;": "\u02dd", +- "DiacriticalGrave;": "`", +- "DiacriticalTilde;": "\u02dc", +- "Diamond;": "\u22c4", +- "DifferentialD;": "\u2146", +- "Dopf;": "\U0001d53b", +- "Dot;": "\xa8", +- "DotDot;": "\u20dc", +- "DotEqual;": "\u2250", +- "DoubleContourIntegral;": "\u222f", +- "DoubleDot;": "\xa8", +- "DoubleDownArrow;": "\u21d3", +- "DoubleLeftArrow;": "\u21d0", +- "DoubleLeftRightArrow;": "\u21d4", +- "DoubleLeftTee;": "\u2ae4", +- "DoubleLongLeftArrow;": "\u27f8", +- "DoubleLongLeftRightArrow;": "\u27fa", +- "DoubleLongRightArrow;": "\u27f9", +- "DoubleRightArrow;": "\u21d2", +- "DoubleRightTee;": "\u22a8", +- "DoubleUpArrow;": "\u21d1", +- "DoubleUpDownArrow;": "\u21d5", +- "DoubleVerticalBar;": "\u2225", +- "DownArrow;": "\u2193", +- "DownArrowBar;": "\u2913", +- "DownArrowUpArrow;": "\u21f5", +- "DownBreve;": "\u0311", +- "DownLeftRightVector;": "\u2950", +- "DownLeftTeeVector;": "\u295e", +- "DownLeftVector;": "\u21bd", +- "DownLeftVectorBar;": "\u2956", +- "DownRightTeeVector;": "\u295f", +- "DownRightVector;": "\u21c1", +- "DownRightVectorBar;": "\u2957", +- "DownTee;": "\u22a4", +- "DownTeeArrow;": "\u21a7", +- "Downarrow;": "\u21d3", +- "Dscr;": "\U0001d49f", +- "Dstrok;": "\u0110", +- "ENG;": "\u014a", +- "ETH": "\xd0", +- "ETH;": "\xd0", +- "Eacute": "\xc9", +- "Eacute;": "\xc9", +- "Ecaron;": "\u011a", +- "Ecirc": "\xca", +- "Ecirc;": "\xca", +- "Ecy;": "\u042d", +- "Edot;": "\u0116", +- "Efr;": "\U0001d508", +- "Egrave": "\xc8", +- "Egrave;": "\xc8", +- "Element;": "\u2208", +- "Emacr;": "\u0112", +- "EmptySmallSquare;": "\u25fb", +- "EmptyVerySmallSquare;": "\u25ab", +- "Eogon;": "\u0118", +- "Eopf;": "\U0001d53c", +- "Epsilon;": "\u0395", +- "Equal;": "\u2a75", +- "EqualTilde;": "\u2242", +- "Equilibrium;": "\u21cc", +- "Escr;": "\u2130", +- "Esim;": "\u2a73", +- "Eta;": "\u0397", +- "Euml": "\xcb", +- "Euml;": "\xcb", +- "Exists;": "\u2203", +- "ExponentialE;": "\u2147", +- "Fcy;": "\u0424", +- "Ffr;": "\U0001d509", +- "FilledSmallSquare;": "\u25fc", +- "FilledVerySmallSquare;": "\u25aa", +- "Fopf;": "\U0001d53d", +- "ForAll;": "\u2200", +- "Fouriertrf;": "\u2131", +- "Fscr;": "\u2131", +- "GJcy;": "\u0403", +- "GT": ">", +- "GT;": ">", +- "Gamma;": "\u0393", +- "Gammad;": "\u03dc", +- "Gbreve;": "\u011e", +- "Gcedil;": "\u0122", +- "Gcirc;": "\u011c", +- "Gcy;": "\u0413", +- "Gdot;": "\u0120", +- "Gfr;": "\U0001d50a", +- "Gg;": "\u22d9", +- "Gopf;": "\U0001d53e", +- "GreaterEqual;": "\u2265", +- "GreaterEqualLess;": "\u22db", +- "GreaterFullEqual;": "\u2267", +- "GreaterGreater;": "\u2aa2", +- "GreaterLess;": "\u2277", +- "GreaterSlantEqual;": "\u2a7e", +- "GreaterTilde;": "\u2273", +- "Gscr;": "\U0001d4a2", +- "Gt;": "\u226b", +- "HARDcy;": "\u042a", +- "Hacek;": "\u02c7", +- "Hat;": "^", +- "Hcirc;": "\u0124", +- "Hfr;": "\u210c", +- "HilbertSpace;": "\u210b", +- "Hopf;": "\u210d", +- "HorizontalLine;": "\u2500", +- "Hscr;": "\u210b", +- "Hstrok;": "\u0126", +- "HumpDownHump;": "\u224e", +- "HumpEqual;": "\u224f", +- "IEcy;": "\u0415", +- "IJlig;": "\u0132", +- "IOcy;": "\u0401", +- "Iacute": "\xcd", +- "Iacute;": "\xcd", +- "Icirc": "\xce", +- "Icirc;": "\xce", +- "Icy;": "\u0418", +- "Idot;": "\u0130", +- "Ifr;": "\u2111", +- "Igrave": "\xcc", +- "Igrave;": "\xcc", +- "Im;": "\u2111", +- "Imacr;": "\u012a", +- "ImaginaryI;": "\u2148", +- "Implies;": "\u21d2", +- "Int;": "\u222c", +- "Integral;": "\u222b", +- "Intersection;": "\u22c2", +- "InvisibleComma;": "\u2063", +- "InvisibleTimes;": "\u2062", +- "Iogon;": "\u012e", +- "Iopf;": "\U0001d540", +- "Iota;": "\u0399", +- "Iscr;": "\u2110", +- "Itilde;": "\u0128", +- "Iukcy;": "\u0406", +- "Iuml": "\xcf", +- "Iuml;": "\xcf", +- "Jcirc;": "\u0134", +- "Jcy;": "\u0419", +- "Jfr;": "\U0001d50d", +- "Jopf;": "\U0001d541", +- "Jscr;": "\U0001d4a5", +- "Jsercy;": "\u0408", +- "Jukcy;": "\u0404", +- "KHcy;": "\u0425", +- "KJcy;": "\u040c", +- "Kappa;": "\u039a", +- "Kcedil;": "\u0136", +- "Kcy;": "\u041a", +- "Kfr;": "\U0001d50e", +- "Kopf;": "\U0001d542", +- "Kscr;": "\U0001d4a6", +- "LJcy;": "\u0409", +- "LT": "<", +- "LT;": "<", +- "Lacute;": "\u0139", +- "Lambda;": "\u039b", +- "Lang;": "\u27ea", +- "Laplacetrf;": "\u2112", +- "Larr;": "\u219e", +- "Lcaron;": "\u013d", +- "Lcedil;": "\u013b", +- "Lcy;": "\u041b", +- "LeftAngleBracket;": "\u27e8", +- "LeftArrow;": "\u2190", +- "LeftArrowBar;": "\u21e4", +- "LeftArrowRightArrow;": "\u21c6", +- "LeftCeiling;": "\u2308", +- "LeftDoubleBracket;": "\u27e6", +- "LeftDownTeeVector;": "\u2961", +- "LeftDownVector;": "\u21c3", +- "LeftDownVectorBar;": "\u2959", +- "LeftFloor;": "\u230a", +- "LeftRightArrow;": "\u2194", +- "LeftRightVector;": "\u294e", +- "LeftTee;": "\u22a3", +- "LeftTeeArrow;": "\u21a4", +- "LeftTeeVector;": "\u295a", +- "LeftTriangle;": "\u22b2", +- "LeftTriangleBar;": "\u29cf", +- "LeftTriangleEqual;": "\u22b4", +- "LeftUpDownVector;": "\u2951", +- "LeftUpTeeVector;": "\u2960", +- "LeftUpVector;": "\u21bf", +- "LeftUpVectorBar;": "\u2958", +- "LeftVector;": "\u21bc", +- "LeftVectorBar;": "\u2952", +- "Leftarrow;": "\u21d0", +- "Leftrightarrow;": "\u21d4", +- "LessEqualGreater;": "\u22da", +- "LessFullEqual;": "\u2266", +- "LessGreater;": "\u2276", +- "LessLess;": "\u2aa1", +- "LessSlantEqual;": "\u2a7d", +- "LessTilde;": "\u2272", +- "Lfr;": "\U0001d50f", +- "Ll;": "\u22d8", +- "Lleftarrow;": "\u21da", +- "Lmidot;": "\u013f", +- "LongLeftArrow;": "\u27f5", +- "LongLeftRightArrow;": "\u27f7", +- "LongRightArrow;": "\u27f6", +- "Longleftarrow;": "\u27f8", +- "Longleftrightarrow;": "\u27fa", +- "Longrightarrow;": "\u27f9", +- "Lopf;": "\U0001d543", +- "LowerLeftArrow;": "\u2199", +- "LowerRightArrow;": "\u2198", +- "Lscr;": "\u2112", +- "Lsh;": "\u21b0", +- "Lstrok;": "\u0141", +- "Lt;": "\u226a", +- "Map;": "\u2905", +- "Mcy;": "\u041c", +- "MediumSpace;": "\u205f", +- "Mellintrf;": "\u2133", +- "Mfr;": "\U0001d510", +- "MinusPlus;": "\u2213", +- "Mopf;": "\U0001d544", +- "Mscr;": "\u2133", +- "Mu;": "\u039c", +- "NJcy;": "\u040a", +- "Nacute;": "\u0143", +- "Ncaron;": "\u0147", +- "Ncedil;": "\u0145", +- "Ncy;": "\u041d", +- "NegativeMediumSpace;": "\u200b", +- "NegativeThickSpace;": "\u200b", +- "NegativeThinSpace;": "\u200b", +- "NegativeVeryThinSpace;": "\u200b", +- "NestedGreaterGreater;": "\u226b", +- "NestedLessLess;": "\u226a", +- "NewLine;": "\n", +- "Nfr;": "\U0001d511", +- "NoBreak;": "\u2060", +- "NonBreakingSpace;": "\xa0", +- "Nopf;": "\u2115", +- "Not;": "\u2aec", +- "NotCongruent;": "\u2262", +- "NotCupCap;": "\u226d", +- "NotDoubleVerticalBar;": "\u2226", +- "NotElement;": "\u2209", +- "NotEqual;": "\u2260", +- "NotEqualTilde;": "\u2242\u0338", +- "NotExists;": "\u2204", +- "NotGreater;": "\u226f", +- "NotGreaterEqual;": "\u2271", +- "NotGreaterFullEqual;": "\u2267\u0338", +- "NotGreaterGreater;": "\u226b\u0338", +- "NotGreaterLess;": "\u2279", +- "NotGreaterSlantEqual;": "\u2a7e\u0338", +- "NotGreaterTilde;": "\u2275", +- "NotHumpDownHump;": "\u224e\u0338", +- "NotHumpEqual;": "\u224f\u0338", +- "NotLeftTriangle;": "\u22ea", +- "NotLeftTriangleBar;": "\u29cf\u0338", +- "NotLeftTriangleEqual;": "\u22ec", +- "NotLess;": "\u226e", +- "NotLessEqual;": "\u2270", +- "NotLessGreater;": "\u2278", +- "NotLessLess;": "\u226a\u0338", +- "NotLessSlantEqual;": "\u2a7d\u0338", +- "NotLessTilde;": "\u2274", +- "NotNestedGreaterGreater;": "\u2aa2\u0338", +- "NotNestedLessLess;": "\u2aa1\u0338", +- "NotPrecedes;": "\u2280", +- "NotPrecedesEqual;": "\u2aaf\u0338", +- "NotPrecedesSlantEqual;": "\u22e0", +- "NotReverseElement;": "\u220c", +- "NotRightTriangle;": "\u22eb", +- "NotRightTriangleBar;": "\u29d0\u0338", +- "NotRightTriangleEqual;": "\u22ed", +- "NotSquareSubset;": "\u228f\u0338", +- "NotSquareSubsetEqual;": "\u22e2", +- "NotSquareSuperset;": "\u2290\u0338", +- "NotSquareSupersetEqual;": "\u22e3", +- "NotSubset;": "\u2282\u20d2", +- "NotSubsetEqual;": "\u2288", +- "NotSucceeds;": "\u2281", +- "NotSucceedsEqual;": "\u2ab0\u0338", +- "NotSucceedsSlantEqual;": "\u22e1", +- "NotSucceedsTilde;": "\u227f\u0338", +- "NotSuperset;": "\u2283\u20d2", +- "NotSupersetEqual;": "\u2289", +- "NotTilde;": "\u2241", +- "NotTildeEqual;": "\u2244", +- "NotTildeFullEqual;": "\u2247", +- "NotTildeTilde;": "\u2249", +- "NotVerticalBar;": "\u2224", +- "Nscr;": "\U0001d4a9", +- "Ntilde": "\xd1", +- "Ntilde;": "\xd1", +- "Nu;": "\u039d", +- "OElig;": "\u0152", +- "Oacute": "\xd3", +- "Oacute;": "\xd3", +- "Ocirc": "\xd4", +- "Ocirc;": "\xd4", +- "Ocy;": "\u041e", +- "Odblac;": "\u0150", +- "Ofr;": "\U0001d512", +- "Ograve": "\xd2", +- "Ograve;": "\xd2", +- "Omacr;": "\u014c", +- "Omega;": "\u03a9", +- "Omicron;": "\u039f", +- "Oopf;": "\U0001d546", +- "OpenCurlyDoubleQuote;": "\u201c", +- "OpenCurlyQuote;": "\u2018", +- "Or;": "\u2a54", +- "Oscr;": "\U0001d4aa", +- "Oslash": "\xd8", +- "Oslash;": "\xd8", +- "Otilde": "\xd5", +- "Otilde;": "\xd5", +- "Otimes;": "\u2a37", +- "Ouml": "\xd6", +- "Ouml;": "\xd6", +- "OverBar;": "\u203e", +- "OverBrace;": "\u23de", +- "OverBracket;": "\u23b4", +- "OverParenthesis;": "\u23dc", +- "PartialD;": "\u2202", +- "Pcy;": "\u041f", +- "Pfr;": "\U0001d513", +- "Phi;": "\u03a6", +- "Pi;": "\u03a0", +- "PlusMinus;": "\xb1", +- "Poincareplane;": "\u210c", +- "Popf;": "\u2119", +- "Pr;": "\u2abb", +- "Precedes;": "\u227a", +- "PrecedesEqual;": "\u2aaf", +- "PrecedesSlantEqual;": "\u227c", +- "PrecedesTilde;": "\u227e", +- "Prime;": "\u2033", +- "Product;": "\u220f", +- "Proportion;": "\u2237", +- "Proportional;": "\u221d", +- "Pscr;": "\U0001d4ab", +- "Psi;": "\u03a8", +- "QUOT": "\"", +- "QUOT;": "\"", +- "Qfr;": "\U0001d514", +- "Qopf;": "\u211a", +- "Qscr;": "\U0001d4ac", +- "RBarr;": "\u2910", +- "REG": "\xae", +- "REG;": "\xae", +- "Racute;": "\u0154", +- "Rang;": "\u27eb", +- "Rarr;": "\u21a0", +- "Rarrtl;": "\u2916", +- "Rcaron;": "\u0158", +- "Rcedil;": "\u0156", +- "Rcy;": "\u0420", +- "Re;": "\u211c", +- "ReverseElement;": "\u220b", +- "ReverseEquilibrium;": "\u21cb", +- "ReverseUpEquilibrium;": "\u296f", +- "Rfr;": "\u211c", +- "Rho;": "\u03a1", +- "RightAngleBracket;": "\u27e9", +- "RightArrow;": "\u2192", +- "RightArrowBar;": "\u21e5", +- "RightArrowLeftArrow;": "\u21c4", +- "RightCeiling;": "\u2309", +- "RightDoubleBracket;": "\u27e7", +- "RightDownTeeVector;": "\u295d", +- "RightDownVector;": "\u21c2", +- "RightDownVectorBar;": "\u2955", +- "RightFloor;": "\u230b", +- "RightTee;": "\u22a2", +- "RightTeeArrow;": "\u21a6", +- "RightTeeVector;": "\u295b", +- "RightTriangle;": "\u22b3", +- "RightTriangleBar;": "\u29d0", +- "RightTriangleEqual;": "\u22b5", +- "RightUpDownVector;": "\u294f", +- "RightUpTeeVector;": "\u295c", +- "RightUpVector;": "\u21be", +- "RightUpVectorBar;": "\u2954", +- "RightVector;": "\u21c0", +- "RightVectorBar;": "\u2953", +- "Rightarrow;": "\u21d2", +- "Ropf;": "\u211d", +- "RoundImplies;": "\u2970", +- "Rrightarrow;": "\u21db", +- "Rscr;": "\u211b", +- "Rsh;": "\u21b1", +- "RuleDelayed;": "\u29f4", +- "SHCHcy;": "\u0429", +- "SHcy;": "\u0428", +- "SOFTcy;": "\u042c", +- "Sacute;": "\u015a", +- "Sc;": "\u2abc", +- "Scaron;": "\u0160", +- "Scedil;": "\u015e", +- "Scirc;": "\u015c", +- "Scy;": "\u0421", +- "Sfr;": "\U0001d516", +- "ShortDownArrow;": "\u2193", +- "ShortLeftArrow;": "\u2190", +- "ShortRightArrow;": "\u2192", +- "ShortUpArrow;": "\u2191", +- "Sigma;": "\u03a3", +- "SmallCircle;": "\u2218", +- "Sopf;": "\U0001d54a", +- "Sqrt;": "\u221a", +- "Square;": "\u25a1", +- "SquareIntersection;": "\u2293", +- "SquareSubset;": "\u228f", +- "SquareSubsetEqual;": "\u2291", +- "SquareSuperset;": "\u2290", +- "SquareSupersetEqual;": "\u2292", +- "SquareUnion;": "\u2294", +- "Sscr;": "\U0001d4ae", +- "Star;": "\u22c6", +- "Sub;": "\u22d0", +- "Subset;": "\u22d0", +- "SubsetEqual;": "\u2286", +- "Succeeds;": "\u227b", +- "SucceedsEqual;": "\u2ab0", +- "SucceedsSlantEqual;": "\u227d", +- "SucceedsTilde;": "\u227f", +- "SuchThat;": "\u220b", +- "Sum;": "\u2211", +- "Sup;": "\u22d1", +- "Superset;": "\u2283", +- "SupersetEqual;": "\u2287", +- "Supset;": "\u22d1", +- "THORN": "\xde", +- "THORN;": "\xde", +- "TRADE;": "\u2122", +- "TSHcy;": "\u040b", +- "TScy;": "\u0426", +- "Tab;": "\t", +- "Tau;": "\u03a4", +- "Tcaron;": "\u0164", +- "Tcedil;": "\u0162", +- "Tcy;": "\u0422", +- "Tfr;": "\U0001d517", +- "Therefore;": "\u2234", +- "Theta;": "\u0398", +- "ThickSpace;": "\u205f\u200a", +- "ThinSpace;": "\u2009", +- "Tilde;": "\u223c", +- "TildeEqual;": "\u2243", +- "TildeFullEqual;": "\u2245", +- "TildeTilde;": "\u2248", +- "Topf;": "\U0001d54b", +- "TripleDot;": "\u20db", +- "Tscr;": "\U0001d4af", +- "Tstrok;": "\u0166", +- "Uacute": "\xda", +- "Uacute;": "\xda", +- "Uarr;": "\u219f", +- "Uarrocir;": "\u2949", +- "Ubrcy;": "\u040e", +- "Ubreve;": "\u016c", +- "Ucirc": "\xdb", +- "Ucirc;": "\xdb", +- "Ucy;": "\u0423", +- "Udblac;": "\u0170", +- "Ufr;": "\U0001d518", +- "Ugrave": "\xd9", +- "Ugrave;": "\xd9", +- "Umacr;": "\u016a", +- "UnderBar;": "_", +- "UnderBrace;": "\u23df", +- "UnderBracket;": "\u23b5", +- "UnderParenthesis;": "\u23dd", +- "Union;": "\u22c3", +- "UnionPlus;": "\u228e", +- "Uogon;": "\u0172", +- "Uopf;": "\U0001d54c", +- "UpArrow;": "\u2191", +- "UpArrowBar;": "\u2912", +- "UpArrowDownArrow;": "\u21c5", +- "UpDownArrow;": "\u2195", +- "UpEquilibrium;": "\u296e", +- "UpTee;": "\u22a5", +- "UpTeeArrow;": "\u21a5", +- "Uparrow;": "\u21d1", +- "Updownarrow;": "\u21d5", +- "UpperLeftArrow;": "\u2196", +- "UpperRightArrow;": "\u2197", +- "Upsi;": "\u03d2", +- "Upsilon;": "\u03a5", +- "Uring;": "\u016e", +- "Uscr;": "\U0001d4b0", +- "Utilde;": "\u0168", +- "Uuml": "\xdc", +- "Uuml;": "\xdc", +- "VDash;": "\u22ab", +- "Vbar;": "\u2aeb", +- "Vcy;": "\u0412", +- "Vdash;": "\u22a9", +- "Vdashl;": "\u2ae6", +- "Vee;": "\u22c1", +- "Verbar;": "\u2016", +- "Vert;": "\u2016", +- "VerticalBar;": "\u2223", +- "VerticalLine;": "|", +- "VerticalSeparator;": "\u2758", +- "VerticalTilde;": "\u2240", +- "VeryThinSpace;": "\u200a", +- "Vfr;": "\U0001d519", +- "Vopf;": "\U0001d54d", +- "Vscr;": "\U0001d4b1", +- "Vvdash;": "\u22aa", +- "Wcirc;": "\u0174", +- "Wedge;": "\u22c0", +- "Wfr;": "\U0001d51a", +- "Wopf;": "\U0001d54e", +- "Wscr;": "\U0001d4b2", +- "Xfr;": "\U0001d51b", +- "Xi;": "\u039e", +- "Xopf;": "\U0001d54f", +- "Xscr;": "\U0001d4b3", +- "YAcy;": "\u042f", +- "YIcy;": "\u0407", +- "YUcy;": "\u042e", +- "Yacute": "\xdd", +- "Yacute;": "\xdd", +- "Ycirc;": "\u0176", +- "Ycy;": "\u042b", +- "Yfr;": "\U0001d51c", +- "Yopf;": "\U0001d550", +- "Yscr;": "\U0001d4b4", +- "Yuml;": "\u0178", +- "ZHcy;": "\u0416", +- "Zacute;": "\u0179", +- "Zcaron;": "\u017d", +- "Zcy;": "\u0417", +- "Zdot;": "\u017b", +- "ZeroWidthSpace;": "\u200b", +- "Zeta;": "\u0396", +- "Zfr;": "\u2128", +- "Zopf;": "\u2124", +- "Zscr;": "\U0001d4b5", +- "aacute": "\xe1", +- "aacute;": "\xe1", +- "abreve;": "\u0103", +- "ac;": "\u223e", +- "acE;": "\u223e\u0333", +- "acd;": "\u223f", +- "acirc": "\xe2", +- "acirc;": "\xe2", +- "acute": "\xb4", +- "acute;": "\xb4", +- "acy;": "\u0430", +- "aelig": "\xe6", +- "aelig;": "\xe6", +- "af;": "\u2061", +- "afr;": "\U0001d51e", +- "agrave": "\xe0", +- "agrave;": "\xe0", +- "alefsym;": "\u2135", +- "aleph;": "\u2135", +- "alpha;": "\u03b1", +- "amacr;": "\u0101", +- "amalg;": "\u2a3f", +- "amp": "&", +- "amp;": "&", +- "and;": "\u2227", +- "andand;": "\u2a55", +- "andd;": "\u2a5c", +- "andslope;": "\u2a58", +- "andv;": "\u2a5a", +- "ang;": "\u2220", +- "ange;": "\u29a4", +- "angle;": "\u2220", +- "angmsd;": "\u2221", +- "angmsdaa;": "\u29a8", +- "angmsdab;": "\u29a9", +- "angmsdac;": "\u29aa", +- "angmsdad;": "\u29ab", +- "angmsdae;": "\u29ac", +- "angmsdaf;": "\u29ad", +- "angmsdag;": "\u29ae", +- "angmsdah;": "\u29af", +- "angrt;": "\u221f", +- "angrtvb;": "\u22be", +- "angrtvbd;": "\u299d", +- "angsph;": "\u2222", +- "angst;": "\xc5", +- "angzarr;": "\u237c", +- "aogon;": "\u0105", +- "aopf;": "\U0001d552", +- "ap;": "\u2248", +- "apE;": "\u2a70", +- "apacir;": "\u2a6f", +- "ape;": "\u224a", +- "apid;": "\u224b", +- "apos;": "'", +- "approx;": "\u2248", +- "approxeq;": "\u224a", +- "aring": "\xe5", +- "aring;": "\xe5", +- "ascr;": "\U0001d4b6", +- "ast;": "*", +- "asymp;": "\u2248", +- "asympeq;": "\u224d", +- "atilde": "\xe3", +- "atilde;": "\xe3", +- "auml": "\xe4", +- "auml;": "\xe4", +- "awconint;": "\u2233", +- "awint;": "\u2a11", +- "bNot;": "\u2aed", +- "backcong;": "\u224c", +- "backepsilon;": "\u03f6", +- "backprime;": "\u2035", +- "backsim;": "\u223d", +- "backsimeq;": "\u22cd", +- "barvee;": "\u22bd", +- "barwed;": "\u2305", +- "barwedge;": "\u2305", +- "bbrk;": "\u23b5", +- "bbrktbrk;": "\u23b6", +- "bcong;": "\u224c", +- "bcy;": "\u0431", +- "bdquo;": "\u201e", +- "becaus;": "\u2235", +- "because;": "\u2235", +- "bemptyv;": "\u29b0", +- "bepsi;": "\u03f6", +- "bernou;": "\u212c", +- "beta;": "\u03b2", +- "beth;": "\u2136", +- "between;": "\u226c", +- "bfr;": "\U0001d51f", +- "bigcap;": "\u22c2", +- "bigcirc;": "\u25ef", +- "bigcup;": "\u22c3", +- "bigodot;": "\u2a00", +- "bigoplus;": "\u2a01", +- "bigotimes;": "\u2a02", +- "bigsqcup;": "\u2a06", +- "bigstar;": "\u2605", +- "bigtriangledown;": "\u25bd", +- "bigtriangleup;": "\u25b3", +- "biguplus;": "\u2a04", +- "bigvee;": "\u22c1", +- "bigwedge;": "\u22c0", +- "bkarow;": "\u290d", +- "blacklozenge;": "\u29eb", +- "blacksquare;": "\u25aa", +- "blacktriangle;": "\u25b4", +- "blacktriangledown;": "\u25be", +- "blacktriangleleft;": "\u25c2", +- "blacktriangleright;": "\u25b8", +- "blank;": "\u2423", +- "blk12;": "\u2592", +- "blk14;": "\u2591", +- "blk34;": "\u2593", +- "block;": "\u2588", +- "bne;": "=\u20e5", +- "bnequiv;": "\u2261\u20e5", +- "bnot;": "\u2310", +- "bopf;": "\U0001d553", +- "bot;": "\u22a5", +- "bottom;": "\u22a5", +- "bowtie;": "\u22c8", +- "boxDL;": "\u2557", +- "boxDR;": "\u2554", +- "boxDl;": "\u2556", +- "boxDr;": "\u2553", +- "boxH;": "\u2550", +- "boxHD;": "\u2566", +- "boxHU;": "\u2569", +- "boxHd;": "\u2564", +- "boxHu;": "\u2567", +- "boxUL;": "\u255d", +- "boxUR;": "\u255a", +- "boxUl;": "\u255c", +- "boxUr;": "\u2559", +- "boxV;": "\u2551", +- "boxVH;": "\u256c", +- "boxVL;": "\u2563", +- "boxVR;": "\u2560", +- "boxVh;": "\u256b", +- "boxVl;": "\u2562", +- "boxVr;": "\u255f", +- "boxbox;": "\u29c9", +- "boxdL;": "\u2555", +- "boxdR;": "\u2552", +- "boxdl;": "\u2510", +- "boxdr;": "\u250c", +- "boxh;": "\u2500", +- "boxhD;": "\u2565", +- "boxhU;": "\u2568", +- "boxhd;": "\u252c", +- "boxhu;": "\u2534", +- "boxminus;": "\u229f", +- "boxplus;": "\u229e", +- "boxtimes;": "\u22a0", +- "boxuL;": "\u255b", +- "boxuR;": "\u2558", +- "boxul;": "\u2518", +- "boxur;": "\u2514", +- "boxv;": "\u2502", +- "boxvH;": "\u256a", +- "boxvL;": "\u2561", +- "boxvR;": "\u255e", +- "boxvh;": "\u253c", +- "boxvl;": "\u2524", +- "boxvr;": "\u251c", +- "bprime;": "\u2035", +- "breve;": "\u02d8", +- "brvbar": "\xa6", +- "brvbar;": "\xa6", +- "bscr;": "\U0001d4b7", +- "bsemi;": "\u204f", +- "bsim;": "\u223d", +- "bsime;": "\u22cd", +- "bsol;": "\\", +- "bsolb;": "\u29c5", +- "bsolhsub;": "\u27c8", +- "bull;": "\u2022", +- "bullet;": "\u2022", +- "bump;": "\u224e", +- "bumpE;": "\u2aae", +- "bumpe;": "\u224f", +- "bumpeq;": "\u224f", +- "cacute;": "\u0107", +- "cap;": "\u2229", +- "capand;": "\u2a44", +- "capbrcup;": "\u2a49", +- "capcap;": "\u2a4b", +- "capcup;": "\u2a47", +- "capdot;": "\u2a40", +- "caps;": "\u2229\ufe00", +- "caret;": "\u2041", +- "caron;": "\u02c7", +- "ccaps;": "\u2a4d", +- "ccaron;": "\u010d", +- "ccedil": "\xe7", +- "ccedil;": "\xe7", +- "ccirc;": "\u0109", +- "ccups;": "\u2a4c", +- "ccupssm;": "\u2a50", +- "cdot;": "\u010b", +- "cedil": "\xb8", +- "cedil;": "\xb8", +- "cemptyv;": "\u29b2", +- "cent": "\xa2", +- "cent;": "\xa2", +- "centerdot;": "\xb7", +- "cfr;": "\U0001d520", +- "chcy;": "\u0447", +- "check;": "\u2713", +- "checkmark;": "\u2713", +- "chi;": "\u03c7", +- "cir;": "\u25cb", +- "cirE;": "\u29c3", +- "circ;": "\u02c6", +- "circeq;": "\u2257", +- "circlearrowleft;": "\u21ba", +- "circlearrowright;": "\u21bb", +- "circledR;": "\xae", +- "circledS;": "\u24c8", +- "circledast;": "\u229b", +- "circledcirc;": "\u229a", +- "circleddash;": "\u229d", +- "cire;": "\u2257", +- "cirfnint;": "\u2a10", +- "cirmid;": "\u2aef", +- "cirscir;": "\u29c2", +- "clubs;": "\u2663", +- "clubsuit;": "\u2663", +- "colon;": ":", +- "colone;": "\u2254", +- "coloneq;": "\u2254", +- "comma;": ",", +- "commat;": "@", +- "comp;": "\u2201", +- "compfn;": "\u2218", +- "complement;": "\u2201", +- "complexes;": "\u2102", +- "cong;": "\u2245", +- "congdot;": "\u2a6d", +- "conint;": "\u222e", +- "copf;": "\U0001d554", +- "coprod;": "\u2210", +- "copy": "\xa9", +- "copy;": "\xa9", +- "copysr;": "\u2117", +- "crarr;": "\u21b5", +- "cross;": "\u2717", +- "cscr;": "\U0001d4b8", +- "csub;": "\u2acf", +- "csube;": "\u2ad1", +- "csup;": "\u2ad0", +- "csupe;": "\u2ad2", +- "ctdot;": "\u22ef", +- "cudarrl;": "\u2938", +- "cudarrr;": "\u2935", +- "cuepr;": "\u22de", +- "cuesc;": "\u22df", +- "cularr;": "\u21b6", +- "cularrp;": "\u293d", +- "cup;": "\u222a", +- "cupbrcap;": "\u2a48", +- "cupcap;": "\u2a46", +- "cupcup;": "\u2a4a", +- "cupdot;": "\u228d", +- "cupor;": "\u2a45", +- "cups;": "\u222a\ufe00", +- "curarr;": "\u21b7", +- "curarrm;": "\u293c", +- "curlyeqprec;": "\u22de", +- "curlyeqsucc;": "\u22df", +- "curlyvee;": "\u22ce", +- "curlywedge;": "\u22cf", +- "curren": "\xa4", +- "curren;": "\xa4", +- "curvearrowleft;": "\u21b6", +- "curvearrowright;": "\u21b7", +- "cuvee;": "\u22ce", +- "cuwed;": "\u22cf", +- "cwconint;": "\u2232", +- "cwint;": "\u2231", +- "cylcty;": "\u232d", +- "dArr;": "\u21d3", +- "dHar;": "\u2965", +- "dagger;": "\u2020", +- "daleth;": "\u2138", +- "darr;": "\u2193", +- "dash;": "\u2010", +- "dashv;": "\u22a3", +- "dbkarow;": "\u290f", +- "dblac;": "\u02dd", +- "dcaron;": "\u010f", +- "dcy;": "\u0434", +- "dd;": "\u2146", +- "ddagger;": "\u2021", +- "ddarr;": "\u21ca", +- "ddotseq;": "\u2a77", +- "deg": "\xb0", +- "deg;": "\xb0", +- "delta;": "\u03b4", +- "demptyv;": "\u29b1", +- "dfisht;": "\u297f", +- "dfr;": "\U0001d521", +- "dharl;": "\u21c3", +- "dharr;": "\u21c2", +- "diam;": "\u22c4", +- "diamond;": "\u22c4", +- "diamondsuit;": "\u2666", +- "diams;": "\u2666", +- "die;": "\xa8", +- "digamma;": "\u03dd", +- "disin;": "\u22f2", +- "div;": "\xf7", +- "divide": "\xf7", +- "divide;": "\xf7", +- "divideontimes;": "\u22c7", +- "divonx;": "\u22c7", +- "djcy;": "\u0452", +- "dlcorn;": "\u231e", +- "dlcrop;": "\u230d", +- "dollar;": "$", +- "dopf;": "\U0001d555", +- "dot;": "\u02d9", +- "doteq;": "\u2250", +- "doteqdot;": "\u2251", +- "dotminus;": "\u2238", +- "dotplus;": "\u2214", +- "dotsquare;": "\u22a1", +- "doublebarwedge;": "\u2306", +- "downarrow;": "\u2193", +- "downdownarrows;": "\u21ca", +- "downharpoonleft;": "\u21c3", +- "downharpoonright;": "\u21c2", +- "drbkarow;": "\u2910", +- "drcorn;": "\u231f", +- "drcrop;": "\u230c", +- "dscr;": "\U0001d4b9", +- "dscy;": "\u0455", +- "dsol;": "\u29f6", +- "dstrok;": "\u0111", +- "dtdot;": "\u22f1", +- "dtri;": "\u25bf", +- "dtrif;": "\u25be", +- "duarr;": "\u21f5", +- "duhar;": "\u296f", +- "dwangle;": "\u29a6", +- "dzcy;": "\u045f", +- "dzigrarr;": "\u27ff", +- "eDDot;": "\u2a77", +- "eDot;": "\u2251", +- "eacute": "\xe9", +- "eacute;": "\xe9", +- "easter;": "\u2a6e", +- "ecaron;": "\u011b", +- "ecir;": "\u2256", +- "ecirc": "\xea", +- "ecirc;": "\xea", +- "ecolon;": "\u2255", +- "ecy;": "\u044d", +- "edot;": "\u0117", +- "ee;": "\u2147", +- "efDot;": "\u2252", +- "efr;": "\U0001d522", +- "eg;": "\u2a9a", +- "egrave": "\xe8", +- "egrave;": "\xe8", +- "egs;": "\u2a96", +- "egsdot;": "\u2a98", +- "el;": "\u2a99", +- "elinters;": "\u23e7", +- "ell;": "\u2113", +- "els;": "\u2a95", +- "elsdot;": "\u2a97", +- "emacr;": "\u0113", +- "empty;": "\u2205", +- "emptyset;": "\u2205", +- "emptyv;": "\u2205", +- "emsp13;": "\u2004", +- "emsp14;": "\u2005", +- "emsp;": "\u2003", +- "eng;": "\u014b", +- "ensp;": "\u2002", +- "eogon;": "\u0119", +- "eopf;": "\U0001d556", +- "epar;": "\u22d5", +- "eparsl;": "\u29e3", +- "eplus;": "\u2a71", +- "epsi;": "\u03b5", +- "epsilon;": "\u03b5", +- "epsiv;": "\u03f5", +- "eqcirc;": "\u2256", +- "eqcolon;": "\u2255", +- "eqsim;": "\u2242", +- "eqslantgtr;": "\u2a96", +- "eqslantless;": "\u2a95", +- "equals;": "=", +- "equest;": "\u225f", +- "equiv;": "\u2261", +- "equivDD;": "\u2a78", +- "eqvparsl;": "\u29e5", +- "erDot;": "\u2253", +- "erarr;": "\u2971", +- "escr;": "\u212f", +- "esdot;": "\u2250", +- "esim;": "\u2242", +- "eta;": "\u03b7", +- "eth": "\xf0", +- "eth;": "\xf0", +- "euml": "\xeb", +- "euml;": "\xeb", +- "euro;": "\u20ac", +- "excl;": "!", +- "exist;": "\u2203", +- "expectation;": "\u2130", +- "exponentiale;": "\u2147", +- "fallingdotseq;": "\u2252", +- "fcy;": "\u0444", +- "female;": "\u2640", +- "ffilig;": "\ufb03", +- "fflig;": "\ufb00", +- "ffllig;": "\ufb04", +- "ffr;": "\U0001d523", +- "filig;": "\ufb01", +- "fjlig;": "fj", +- "flat;": "\u266d", +- "fllig;": "\ufb02", +- "fltns;": "\u25b1", +- "fnof;": "\u0192", +- "fopf;": "\U0001d557", +- "forall;": "\u2200", +- "fork;": "\u22d4", +- "forkv;": "\u2ad9", +- "fpartint;": "\u2a0d", +- "frac12": "\xbd", +- "frac12;": "\xbd", +- "frac13;": "\u2153", +- "frac14": "\xbc", +- "frac14;": "\xbc", +- "frac15;": "\u2155", +- "frac16;": "\u2159", +- "frac18;": "\u215b", +- "frac23;": "\u2154", +- "frac25;": "\u2156", +- "frac34": "\xbe", +- "frac34;": "\xbe", +- "frac35;": "\u2157", +- "frac38;": "\u215c", +- "frac45;": "\u2158", +- "frac56;": "\u215a", +- "frac58;": "\u215d", +- "frac78;": "\u215e", +- "frasl;": "\u2044", +- "frown;": "\u2322", +- "fscr;": "\U0001d4bb", +- "gE;": "\u2267", +- "gEl;": "\u2a8c", +- "gacute;": "\u01f5", +- "gamma;": "\u03b3", +- "gammad;": "\u03dd", +- "gap;": "\u2a86", +- "gbreve;": "\u011f", +- "gcirc;": "\u011d", +- "gcy;": "\u0433", +- "gdot;": "\u0121", +- "ge;": "\u2265", +- "gel;": "\u22db", +- "geq;": "\u2265", +- "geqq;": "\u2267", +- "geqslant;": "\u2a7e", +- "ges;": "\u2a7e", +- "gescc;": "\u2aa9", +- "gesdot;": "\u2a80", +- "gesdoto;": "\u2a82", +- "gesdotol;": "\u2a84", +- "gesl;": "\u22db\ufe00", +- "gesles;": "\u2a94", +- "gfr;": "\U0001d524", +- "gg;": "\u226b", +- "ggg;": "\u22d9", +- "gimel;": "\u2137", +- "gjcy;": "\u0453", +- "gl;": "\u2277", +- "glE;": "\u2a92", +- "gla;": "\u2aa5", +- "glj;": "\u2aa4", +- "gnE;": "\u2269", +- "gnap;": "\u2a8a", +- "gnapprox;": "\u2a8a", +- "gne;": "\u2a88", +- "gneq;": "\u2a88", +- "gneqq;": "\u2269", +- "gnsim;": "\u22e7", +- "gopf;": "\U0001d558", +- "grave;": "`", +- "gscr;": "\u210a", +- "gsim;": "\u2273", +- "gsime;": "\u2a8e", +- "gsiml;": "\u2a90", +- "gt": ">", +- "gt;": ">", +- "gtcc;": "\u2aa7", +- "gtcir;": "\u2a7a", +- "gtdot;": "\u22d7", +- "gtlPar;": "\u2995", +- "gtquest;": "\u2a7c", +- "gtrapprox;": "\u2a86", +- "gtrarr;": "\u2978", +- "gtrdot;": "\u22d7", +- "gtreqless;": "\u22db", +- "gtreqqless;": "\u2a8c", +- "gtrless;": "\u2277", +- "gtrsim;": "\u2273", +- "gvertneqq;": "\u2269\ufe00", +- "gvnE;": "\u2269\ufe00", +- "hArr;": "\u21d4", +- "hairsp;": "\u200a", +- "half;": "\xbd", +- "hamilt;": "\u210b", +- "hardcy;": "\u044a", +- "harr;": "\u2194", +- "harrcir;": "\u2948", +- "harrw;": "\u21ad", +- "hbar;": "\u210f", +- "hcirc;": "\u0125", +- "hearts;": "\u2665", +- "heartsuit;": "\u2665", +- "hellip;": "\u2026", +- "hercon;": "\u22b9", +- "hfr;": "\U0001d525", +- "hksearow;": "\u2925", +- "hkswarow;": "\u2926", +- "hoarr;": "\u21ff", +- "homtht;": "\u223b", +- "hookleftarrow;": "\u21a9", +- "hookrightarrow;": "\u21aa", +- "hopf;": "\U0001d559", +- "horbar;": "\u2015", +- "hscr;": "\U0001d4bd", +- "hslash;": "\u210f", +- "hstrok;": "\u0127", +- "hybull;": "\u2043", +- "hyphen;": "\u2010", +- "iacute": "\xed", +- "iacute;": "\xed", +- "ic;": "\u2063", +- "icirc": "\xee", +- "icirc;": "\xee", +- "icy;": "\u0438", +- "iecy;": "\u0435", +- "iexcl": "\xa1", +- "iexcl;": "\xa1", +- "iff;": "\u21d4", +- "ifr;": "\U0001d526", +- "igrave": "\xec", +- "igrave;": "\xec", +- "ii;": "\u2148", +- "iiiint;": "\u2a0c", +- "iiint;": "\u222d", +- "iinfin;": "\u29dc", +- "iiota;": "\u2129", +- "ijlig;": "\u0133", +- "imacr;": "\u012b", +- "image;": "\u2111", +- "imagline;": "\u2110", +- "imagpart;": "\u2111", +- "imath;": "\u0131", +- "imof;": "\u22b7", +- "imped;": "\u01b5", +- "in;": "\u2208", +- "incare;": "\u2105", +- "infin;": "\u221e", +- "infintie;": "\u29dd", +- "inodot;": "\u0131", +- "int;": "\u222b", +- "intcal;": "\u22ba", +- "integers;": "\u2124", +- "intercal;": "\u22ba", +- "intlarhk;": "\u2a17", +- "intprod;": "\u2a3c", +- "iocy;": "\u0451", +- "iogon;": "\u012f", +- "iopf;": "\U0001d55a", +- "iota;": "\u03b9", +- "iprod;": "\u2a3c", +- "iquest": "\xbf", +- "iquest;": "\xbf", +- "iscr;": "\U0001d4be", +- "isin;": "\u2208", +- "isinE;": "\u22f9", +- "isindot;": "\u22f5", +- "isins;": "\u22f4", +- "isinsv;": "\u22f3", +- "isinv;": "\u2208", +- "it;": "\u2062", +- "itilde;": "\u0129", +- "iukcy;": "\u0456", +- "iuml": "\xef", +- "iuml;": "\xef", +- "jcirc;": "\u0135", +- "jcy;": "\u0439", +- "jfr;": "\U0001d527", +- "jmath;": "\u0237", +- "jopf;": "\U0001d55b", +- "jscr;": "\U0001d4bf", +- "jsercy;": "\u0458", +- "jukcy;": "\u0454", +- "kappa;": "\u03ba", +- "kappav;": "\u03f0", +- "kcedil;": "\u0137", +- "kcy;": "\u043a", +- "kfr;": "\U0001d528", +- "kgreen;": "\u0138", +- "khcy;": "\u0445", +- "kjcy;": "\u045c", +- "kopf;": "\U0001d55c", +- "kscr;": "\U0001d4c0", +- "lAarr;": "\u21da", +- "lArr;": "\u21d0", +- "lAtail;": "\u291b", +- "lBarr;": "\u290e", +- "lE;": "\u2266", +- "lEg;": "\u2a8b", +- "lHar;": "\u2962", +- "lacute;": "\u013a", +- "laemptyv;": "\u29b4", +- "lagran;": "\u2112", +- "lambda;": "\u03bb", +- "lang;": "\u27e8", +- "langd;": "\u2991", +- "langle;": "\u27e8", +- "lap;": "\u2a85", +- "laquo": "\xab", +- "laquo;": "\xab", +- "larr;": "\u2190", +- "larrb;": "\u21e4", +- "larrbfs;": "\u291f", +- "larrfs;": "\u291d", +- "larrhk;": "\u21a9", +- "larrlp;": "\u21ab", +- "larrpl;": "\u2939", +- "larrsim;": "\u2973", +- "larrtl;": "\u21a2", +- "lat;": "\u2aab", +- "latail;": "\u2919", +- "late;": "\u2aad", +- "lates;": "\u2aad\ufe00", +- "lbarr;": "\u290c", +- "lbbrk;": "\u2772", +- "lbrace;": "{", +- "lbrack;": "[", +- "lbrke;": "\u298b", +- "lbrksld;": "\u298f", +- "lbrkslu;": "\u298d", +- "lcaron;": "\u013e", +- "lcedil;": "\u013c", +- "lceil;": "\u2308", +- "lcub;": "{", +- "lcy;": "\u043b", +- "ldca;": "\u2936", +- "ldquo;": "\u201c", +- "ldquor;": "\u201e", +- "ldrdhar;": "\u2967", +- "ldrushar;": "\u294b", +- "ldsh;": "\u21b2", +- "le;": "\u2264", +- "leftarrow;": "\u2190", +- "leftarrowtail;": "\u21a2", +- "leftharpoondown;": "\u21bd", +- "leftharpoonup;": "\u21bc", +- "leftleftarrows;": "\u21c7", +- "leftrightarrow;": "\u2194", +- "leftrightarrows;": "\u21c6", +- "leftrightharpoons;": "\u21cb", +- "leftrightsquigarrow;": "\u21ad", +- "leftthreetimes;": "\u22cb", +- "leg;": "\u22da", +- "leq;": "\u2264", +- "leqq;": "\u2266", +- "leqslant;": "\u2a7d", +- "les;": "\u2a7d", +- "lescc;": "\u2aa8", +- "lesdot;": "\u2a7f", +- "lesdoto;": "\u2a81", +- "lesdotor;": "\u2a83", +- "lesg;": "\u22da\ufe00", +- "lesges;": "\u2a93", +- "lessapprox;": "\u2a85", +- "lessdot;": "\u22d6", +- "lesseqgtr;": "\u22da", +- "lesseqqgtr;": "\u2a8b", +- "lessgtr;": "\u2276", +- "lesssim;": "\u2272", +- "lfisht;": "\u297c", +- "lfloor;": "\u230a", +- "lfr;": "\U0001d529", +- "lg;": "\u2276", +- "lgE;": "\u2a91", +- "lhard;": "\u21bd", +- "lharu;": "\u21bc", +- "lharul;": "\u296a", +- "lhblk;": "\u2584", +- "ljcy;": "\u0459", +- "ll;": "\u226a", +- "llarr;": "\u21c7", +- "llcorner;": "\u231e", +- "llhard;": "\u296b", +- "lltri;": "\u25fa", +- "lmidot;": "\u0140", +- "lmoust;": "\u23b0", +- "lmoustache;": "\u23b0", +- "lnE;": "\u2268", +- "lnap;": "\u2a89", +- "lnapprox;": "\u2a89", +- "lne;": "\u2a87", +- "lneq;": "\u2a87", +- "lneqq;": "\u2268", +- "lnsim;": "\u22e6", +- "loang;": "\u27ec", +- "loarr;": "\u21fd", +- "lobrk;": "\u27e6", +- "longleftarrow;": "\u27f5", +- "longleftrightarrow;": "\u27f7", +- "longmapsto;": "\u27fc", +- "longrightarrow;": "\u27f6", +- "looparrowleft;": "\u21ab", +- "looparrowright;": "\u21ac", +- "lopar;": "\u2985", +- "lopf;": "\U0001d55d", +- "loplus;": "\u2a2d", +- "lotimes;": "\u2a34", +- "lowast;": "\u2217", +- "lowbar;": "_", +- "loz;": "\u25ca", +- "lozenge;": "\u25ca", +- "lozf;": "\u29eb", +- "lpar;": "(", +- "lparlt;": "\u2993", +- "lrarr;": "\u21c6", +- "lrcorner;": "\u231f", +- "lrhar;": "\u21cb", +- "lrhard;": "\u296d", +- "lrm;": "\u200e", +- "lrtri;": "\u22bf", +- "lsaquo;": "\u2039", +- "lscr;": "\U0001d4c1", +- "lsh;": "\u21b0", +- "lsim;": "\u2272", +- "lsime;": "\u2a8d", +- "lsimg;": "\u2a8f", +- "lsqb;": "[", +- "lsquo;": "\u2018", +- "lsquor;": "\u201a", +- "lstrok;": "\u0142", +- "lt": "<", +- "lt;": "<", +- "ltcc;": "\u2aa6", +- "ltcir;": "\u2a79", +- "ltdot;": "\u22d6", +- "lthree;": "\u22cb", +- "ltimes;": "\u22c9", +- "ltlarr;": "\u2976", +- "ltquest;": "\u2a7b", +- "ltrPar;": "\u2996", +- "ltri;": "\u25c3", +- "ltrie;": "\u22b4", +- "ltrif;": "\u25c2", +- "lurdshar;": "\u294a", +- "luruhar;": "\u2966", +- "lvertneqq;": "\u2268\ufe00", +- "lvnE;": "\u2268\ufe00", +- "mDDot;": "\u223a", +- "macr": "\xaf", +- "macr;": "\xaf", +- "male;": "\u2642", +- "malt;": "\u2720", +- "maltese;": "\u2720", +- "map;": "\u21a6", +- "mapsto;": "\u21a6", +- "mapstodown;": "\u21a7", +- "mapstoleft;": "\u21a4", +- "mapstoup;": "\u21a5", +- "marker;": "\u25ae", +- "mcomma;": "\u2a29", +- "mcy;": "\u043c", +- "mdash;": "\u2014", +- "measuredangle;": "\u2221", +- "mfr;": "\U0001d52a", +- "mho;": "\u2127", +- "micro": "\xb5", +- "micro;": "\xb5", +- "mid;": "\u2223", +- "midast;": "*", +- "midcir;": "\u2af0", +- "middot": "\xb7", +- "middot;": "\xb7", +- "minus;": "\u2212", +- "minusb;": "\u229f", +- "minusd;": "\u2238", +- "minusdu;": "\u2a2a", +- "mlcp;": "\u2adb", +- "mldr;": "\u2026", +- "mnplus;": "\u2213", +- "models;": "\u22a7", +- "mopf;": "\U0001d55e", +- "mp;": "\u2213", +- "mscr;": "\U0001d4c2", +- "mstpos;": "\u223e", +- "mu;": "\u03bc", +- "multimap;": "\u22b8", +- "mumap;": "\u22b8", +- "nGg;": "\u22d9\u0338", +- "nGt;": "\u226b\u20d2", +- "nGtv;": "\u226b\u0338", +- "nLeftarrow;": "\u21cd", +- "nLeftrightarrow;": "\u21ce", +- "nLl;": "\u22d8\u0338", +- "nLt;": "\u226a\u20d2", +- "nLtv;": "\u226a\u0338", +- "nRightarrow;": "\u21cf", +- "nVDash;": "\u22af", +- "nVdash;": "\u22ae", +- "nabla;": "\u2207", +- "nacute;": "\u0144", +- "nang;": "\u2220\u20d2", +- "nap;": "\u2249", +- "napE;": "\u2a70\u0338", +- "napid;": "\u224b\u0338", +- "napos;": "\u0149", +- "napprox;": "\u2249", +- "natur;": "\u266e", +- "natural;": "\u266e", +- "naturals;": "\u2115", +- "nbsp": "\xa0", +- "nbsp;": "\xa0", +- "nbump;": "\u224e\u0338", +- "nbumpe;": "\u224f\u0338", +- "ncap;": "\u2a43", +- "ncaron;": "\u0148", +- "ncedil;": "\u0146", +- "ncong;": "\u2247", +- "ncongdot;": "\u2a6d\u0338", +- "ncup;": "\u2a42", +- "ncy;": "\u043d", +- "ndash;": "\u2013", +- "ne;": "\u2260", +- "neArr;": "\u21d7", +- "nearhk;": "\u2924", +- "nearr;": "\u2197", +- "nearrow;": "\u2197", +- "nedot;": "\u2250\u0338", +- "nequiv;": "\u2262", +- "nesear;": "\u2928", +- "nesim;": "\u2242\u0338", +- "nexist;": "\u2204", +- "nexists;": "\u2204", +- "nfr;": "\U0001d52b", +- "ngE;": "\u2267\u0338", +- "nge;": "\u2271", +- "ngeq;": "\u2271", +- "ngeqq;": "\u2267\u0338", +- "ngeqslant;": "\u2a7e\u0338", +- "nges;": "\u2a7e\u0338", +- "ngsim;": "\u2275", +- "ngt;": "\u226f", +- "ngtr;": "\u226f", +- "nhArr;": "\u21ce", +- "nharr;": "\u21ae", +- "nhpar;": "\u2af2", +- "ni;": "\u220b", +- "nis;": "\u22fc", +- "nisd;": "\u22fa", +- "niv;": "\u220b", +- "njcy;": "\u045a", +- "nlArr;": "\u21cd", +- "nlE;": "\u2266\u0338", +- "nlarr;": "\u219a", +- "nldr;": "\u2025", +- "nle;": "\u2270", +- "nleftarrow;": "\u219a", +- "nleftrightarrow;": "\u21ae", +- "nleq;": "\u2270", +- "nleqq;": "\u2266\u0338", +- "nleqslant;": "\u2a7d\u0338", +- "nles;": "\u2a7d\u0338", +- "nless;": "\u226e", +- "nlsim;": "\u2274", +- "nlt;": "\u226e", +- "nltri;": "\u22ea", +- "nltrie;": "\u22ec", +- "nmid;": "\u2224", +- "nopf;": "\U0001d55f", +- "not": "\xac", +- "not;": "\xac", +- "notin;": "\u2209", +- "notinE;": "\u22f9\u0338", +- "notindot;": "\u22f5\u0338", +- "notinva;": "\u2209", +- "notinvb;": "\u22f7", +- "notinvc;": "\u22f6", +- "notni;": "\u220c", +- "notniva;": "\u220c", +- "notnivb;": "\u22fe", +- "notnivc;": "\u22fd", +- "npar;": "\u2226", +- "nparallel;": "\u2226", +- "nparsl;": "\u2afd\u20e5", +- "npart;": "\u2202\u0338", +- "npolint;": "\u2a14", +- "npr;": "\u2280", +- "nprcue;": "\u22e0", +- "npre;": "\u2aaf\u0338", +- "nprec;": "\u2280", +- "npreceq;": "\u2aaf\u0338", +- "nrArr;": "\u21cf", +- "nrarr;": "\u219b", +- "nrarrc;": "\u2933\u0338", +- "nrarrw;": "\u219d\u0338", +- "nrightarrow;": "\u219b", +- "nrtri;": "\u22eb", +- "nrtrie;": "\u22ed", +- "nsc;": "\u2281", +- "nsccue;": "\u22e1", +- "nsce;": "\u2ab0\u0338", +- "nscr;": "\U0001d4c3", +- "nshortmid;": "\u2224", +- "nshortparallel;": "\u2226", +- "nsim;": "\u2241", +- "nsime;": "\u2244", +- "nsimeq;": "\u2244", +- "nsmid;": "\u2224", +- "nspar;": "\u2226", +- "nsqsube;": "\u22e2", +- "nsqsupe;": "\u22e3", +- "nsub;": "\u2284", +- "nsubE;": "\u2ac5\u0338", +- "nsube;": "\u2288", +- "nsubset;": "\u2282\u20d2", +- "nsubseteq;": "\u2288", +- "nsubseteqq;": "\u2ac5\u0338", +- "nsucc;": "\u2281", +- "nsucceq;": "\u2ab0\u0338", +- "nsup;": "\u2285", +- "nsupE;": "\u2ac6\u0338", +- "nsupe;": "\u2289", +- "nsupset;": "\u2283\u20d2", +- "nsupseteq;": "\u2289", +- "nsupseteqq;": "\u2ac6\u0338", +- "ntgl;": "\u2279", +- "ntilde": "\xf1", +- "ntilde;": "\xf1", +- "ntlg;": "\u2278", +- "ntriangleleft;": "\u22ea", +- "ntrianglelefteq;": "\u22ec", +- "ntriangleright;": "\u22eb", +- "ntrianglerighteq;": "\u22ed", +- "nu;": "\u03bd", +- "num;": "#", +- "numero;": "\u2116", +- "numsp;": "\u2007", +- "nvDash;": "\u22ad", +- "nvHarr;": "\u2904", +- "nvap;": "\u224d\u20d2", +- "nvdash;": "\u22ac", +- "nvge;": "\u2265\u20d2", +- "nvgt;": ">\u20d2", +- "nvinfin;": "\u29de", +- "nvlArr;": "\u2902", +- "nvle;": "\u2264\u20d2", +- "nvlt;": "<\u20d2", +- "nvltrie;": "\u22b4\u20d2", +- "nvrArr;": "\u2903", +- "nvrtrie;": "\u22b5\u20d2", +- "nvsim;": "\u223c\u20d2", +- "nwArr;": "\u21d6", +- "nwarhk;": "\u2923", +- "nwarr;": "\u2196", +- "nwarrow;": "\u2196", +- "nwnear;": "\u2927", +- "oS;": "\u24c8", +- "oacute": "\xf3", +- "oacute;": "\xf3", +- "oast;": "\u229b", +- "ocir;": "\u229a", +- "ocirc": "\xf4", +- "ocirc;": "\xf4", +- "ocy;": "\u043e", +- "odash;": "\u229d", +- "odblac;": "\u0151", +- "odiv;": "\u2a38", +- "odot;": "\u2299", +- "odsold;": "\u29bc", +- "oelig;": "\u0153", +- "ofcir;": "\u29bf", +- "ofr;": "\U0001d52c", +- "ogon;": "\u02db", +- "ograve": "\xf2", +- "ograve;": "\xf2", +- "ogt;": "\u29c1", +- "ohbar;": "\u29b5", +- "ohm;": "\u03a9", +- "oint;": "\u222e", +- "olarr;": "\u21ba", +- "olcir;": "\u29be", +- "olcross;": "\u29bb", +- "oline;": "\u203e", +- "olt;": "\u29c0", +- "omacr;": "\u014d", +- "omega;": "\u03c9", +- "omicron;": "\u03bf", +- "omid;": "\u29b6", +- "ominus;": "\u2296", +- "oopf;": "\U0001d560", +- "opar;": "\u29b7", +- "operp;": "\u29b9", +- "oplus;": "\u2295", +- "or;": "\u2228", +- "orarr;": "\u21bb", +- "ord;": "\u2a5d", +- "order;": "\u2134", +- "orderof;": "\u2134", +- "ordf": "\xaa", +- "ordf;": "\xaa", +- "ordm": "\xba", +- "ordm;": "\xba", +- "origof;": "\u22b6", +- "oror;": "\u2a56", +- "orslope;": "\u2a57", +- "orv;": "\u2a5b", +- "oscr;": "\u2134", +- "oslash": "\xf8", +- "oslash;": "\xf8", +- "osol;": "\u2298", +- "otilde": "\xf5", +- "otilde;": "\xf5", +- "otimes;": "\u2297", +- "otimesas;": "\u2a36", +- "ouml": "\xf6", +- "ouml;": "\xf6", +- "ovbar;": "\u233d", +- "par;": "\u2225", +- "para": "\xb6", +- "para;": "\xb6", +- "parallel;": "\u2225", +- "parsim;": "\u2af3", +- "parsl;": "\u2afd", +- "part;": "\u2202", +- "pcy;": "\u043f", +- "percnt;": "%", +- "period;": ".", +- "permil;": "\u2030", +- "perp;": "\u22a5", +- "pertenk;": "\u2031", +- "pfr;": "\U0001d52d", +- "phi;": "\u03c6", +- "phiv;": "\u03d5", +- "phmmat;": "\u2133", +- "phone;": "\u260e", +- "pi;": "\u03c0", +- "pitchfork;": "\u22d4", +- "piv;": "\u03d6", +- "planck;": "\u210f", +- "planckh;": "\u210e", +- "plankv;": "\u210f", +- "plus;": "+", +- "plusacir;": "\u2a23", +- "plusb;": "\u229e", +- "pluscir;": "\u2a22", +- "plusdo;": "\u2214", +- "plusdu;": "\u2a25", +- "pluse;": "\u2a72", +- "plusmn": "\xb1", +- "plusmn;": "\xb1", +- "plussim;": "\u2a26", +- "plustwo;": "\u2a27", +- "pm;": "\xb1", +- "pointint;": "\u2a15", +- "popf;": "\U0001d561", +- "pound": "\xa3", +- "pound;": "\xa3", +- "pr;": "\u227a", +- "prE;": "\u2ab3", +- "prap;": "\u2ab7", +- "prcue;": "\u227c", +- "pre;": "\u2aaf", +- "prec;": "\u227a", +- "precapprox;": "\u2ab7", +- "preccurlyeq;": "\u227c", +- "preceq;": "\u2aaf", +- "precnapprox;": "\u2ab9", +- "precneqq;": "\u2ab5", +- "precnsim;": "\u22e8", +- "precsim;": "\u227e", +- "prime;": "\u2032", +- "primes;": "\u2119", +- "prnE;": "\u2ab5", +- "prnap;": "\u2ab9", +- "prnsim;": "\u22e8", +- "prod;": "\u220f", +- "profalar;": "\u232e", +- "profline;": "\u2312", +- "profsurf;": "\u2313", +- "prop;": "\u221d", +- "propto;": "\u221d", +- "prsim;": "\u227e", +- "prurel;": "\u22b0", +- "pscr;": "\U0001d4c5", +- "psi;": "\u03c8", +- "puncsp;": "\u2008", +- "qfr;": "\U0001d52e", +- "qint;": "\u2a0c", +- "qopf;": "\U0001d562", +- "qprime;": "\u2057", +- "qscr;": "\U0001d4c6", +- "quaternions;": "\u210d", +- "quatint;": "\u2a16", +- "quest;": "?", +- "questeq;": "\u225f", +- "quot": "\"", +- "quot;": "\"", +- "rAarr;": "\u21db", +- "rArr;": "\u21d2", +- "rAtail;": "\u291c", +- "rBarr;": "\u290f", +- "rHar;": "\u2964", +- "race;": "\u223d\u0331", +- "racute;": "\u0155", +- "radic;": "\u221a", +- "raemptyv;": "\u29b3", +- "rang;": "\u27e9", +- "rangd;": "\u2992", +- "range;": "\u29a5", +- "rangle;": "\u27e9", +- "raquo": "\xbb", +- "raquo;": "\xbb", +- "rarr;": "\u2192", +- "rarrap;": "\u2975", +- "rarrb;": "\u21e5", +- "rarrbfs;": "\u2920", +- "rarrc;": "\u2933", +- "rarrfs;": "\u291e", +- "rarrhk;": "\u21aa", +- "rarrlp;": "\u21ac", +- "rarrpl;": "\u2945", +- "rarrsim;": "\u2974", +- "rarrtl;": "\u21a3", +- "rarrw;": "\u219d", +- "ratail;": "\u291a", +- "ratio;": "\u2236", +- "rationals;": "\u211a", +- "rbarr;": "\u290d", +- "rbbrk;": "\u2773", +- "rbrace;": "}", +- "rbrack;": "]", +- "rbrke;": "\u298c", +- "rbrksld;": "\u298e", +- "rbrkslu;": "\u2990", +- "rcaron;": "\u0159", +- "rcedil;": "\u0157", +- "rceil;": "\u2309", +- "rcub;": "}", +- "rcy;": "\u0440", +- "rdca;": "\u2937", +- "rdldhar;": "\u2969", +- "rdquo;": "\u201d", +- "rdquor;": "\u201d", +- "rdsh;": "\u21b3", +- "real;": "\u211c", +- "realine;": "\u211b", +- "realpart;": "\u211c", +- "reals;": "\u211d", +- "rect;": "\u25ad", +- "reg": "\xae", +- "reg;": "\xae", +- "rfisht;": "\u297d", +- "rfloor;": "\u230b", +- "rfr;": "\U0001d52f", +- "rhard;": "\u21c1", +- "rharu;": "\u21c0", +- "rharul;": "\u296c", +- "rho;": "\u03c1", +- "rhov;": "\u03f1", +- "rightarrow;": "\u2192", +- "rightarrowtail;": "\u21a3", +- "rightharpoondown;": "\u21c1", +- "rightharpoonup;": "\u21c0", +- "rightleftarrows;": "\u21c4", +- "rightleftharpoons;": "\u21cc", +- "rightrightarrows;": "\u21c9", +- "rightsquigarrow;": "\u219d", +- "rightthreetimes;": "\u22cc", +- "ring;": "\u02da", +- "risingdotseq;": "\u2253", +- "rlarr;": "\u21c4", +- "rlhar;": "\u21cc", +- "rlm;": "\u200f", +- "rmoust;": "\u23b1", +- "rmoustache;": "\u23b1", +- "rnmid;": "\u2aee", +- "roang;": "\u27ed", +- "roarr;": "\u21fe", +- "robrk;": "\u27e7", +- "ropar;": "\u2986", +- "ropf;": "\U0001d563", +- "roplus;": "\u2a2e", +- "rotimes;": "\u2a35", +- "rpar;": ")", +- "rpargt;": "\u2994", +- "rppolint;": "\u2a12", +- "rrarr;": "\u21c9", +- "rsaquo;": "\u203a", +- "rscr;": "\U0001d4c7", +- "rsh;": "\u21b1", +- "rsqb;": "]", +- "rsquo;": "\u2019", +- "rsquor;": "\u2019", +- "rthree;": "\u22cc", +- "rtimes;": "\u22ca", +- "rtri;": "\u25b9", +- "rtrie;": "\u22b5", +- "rtrif;": "\u25b8", +- "rtriltri;": "\u29ce", +- "ruluhar;": "\u2968", +- "rx;": "\u211e", +- "sacute;": "\u015b", +- "sbquo;": "\u201a", +- "sc;": "\u227b", +- "scE;": "\u2ab4", +- "scap;": "\u2ab8", +- "scaron;": "\u0161", +- "sccue;": "\u227d", +- "sce;": "\u2ab0", +- "scedil;": "\u015f", +- "scirc;": "\u015d", +- "scnE;": "\u2ab6", +- "scnap;": "\u2aba", +- "scnsim;": "\u22e9", +- "scpolint;": "\u2a13", +- "scsim;": "\u227f", +- "scy;": "\u0441", +- "sdot;": "\u22c5", +- "sdotb;": "\u22a1", +- "sdote;": "\u2a66", +- "seArr;": "\u21d8", +- "searhk;": "\u2925", +- "searr;": "\u2198", +- "searrow;": "\u2198", +- "sect": "\xa7", +- "sect;": "\xa7", +- "semi;": ";", +- "seswar;": "\u2929", +- "setminus;": "\u2216", +- "setmn;": "\u2216", +- "sext;": "\u2736", +- "sfr;": "\U0001d530", +- "sfrown;": "\u2322", +- "sharp;": "\u266f", +- "shchcy;": "\u0449", +- "shcy;": "\u0448", +- "shortmid;": "\u2223", +- "shortparallel;": "\u2225", +- "shy": "\xad", +- "shy;": "\xad", +- "sigma;": "\u03c3", +- "sigmaf;": "\u03c2", +- "sigmav;": "\u03c2", +- "sim;": "\u223c", +- "simdot;": "\u2a6a", +- "sime;": "\u2243", +- "simeq;": "\u2243", +- "simg;": "\u2a9e", +- "simgE;": "\u2aa0", +- "siml;": "\u2a9d", +- "simlE;": "\u2a9f", +- "simne;": "\u2246", +- "simplus;": "\u2a24", +- "simrarr;": "\u2972", +- "slarr;": "\u2190", +- "smallsetminus;": "\u2216", +- "smashp;": "\u2a33", +- "smeparsl;": "\u29e4", +- "smid;": "\u2223", +- "smile;": "\u2323", +- "smt;": "\u2aaa", +- "smte;": "\u2aac", +- "smtes;": "\u2aac\ufe00", +- "softcy;": "\u044c", +- "sol;": "/", +- "solb;": "\u29c4", +- "solbar;": "\u233f", +- "sopf;": "\U0001d564", +- "spades;": "\u2660", +- "spadesuit;": "\u2660", +- "spar;": "\u2225", +- "sqcap;": "\u2293", +- "sqcaps;": "\u2293\ufe00", +- "sqcup;": "\u2294", +- "sqcups;": "\u2294\ufe00", +- "sqsub;": "\u228f", +- "sqsube;": "\u2291", +- "sqsubset;": "\u228f", +- "sqsubseteq;": "\u2291", +- "sqsup;": "\u2290", +- "sqsupe;": "\u2292", +- "sqsupset;": "\u2290", +- "sqsupseteq;": "\u2292", +- "squ;": "\u25a1", +- "square;": "\u25a1", +- "squarf;": "\u25aa", +- "squf;": "\u25aa", +- "srarr;": "\u2192", +- "sscr;": "\U0001d4c8", +- "ssetmn;": "\u2216", +- "ssmile;": "\u2323", +- "sstarf;": "\u22c6", +- "star;": "\u2606", +- "starf;": "\u2605", +- "straightepsilon;": "\u03f5", +- "straightphi;": "\u03d5", +- "strns;": "\xaf", +- "sub;": "\u2282", +- "subE;": "\u2ac5", +- "subdot;": "\u2abd", +- "sube;": "\u2286", +- "subedot;": "\u2ac3", +- "submult;": "\u2ac1", +- "subnE;": "\u2acb", +- "subne;": "\u228a", +- "subplus;": "\u2abf", +- "subrarr;": "\u2979", +- "subset;": "\u2282", +- "subseteq;": "\u2286", +- "subseteqq;": "\u2ac5", +- "subsetneq;": "\u228a", +- "subsetneqq;": "\u2acb", +- "subsim;": "\u2ac7", +- "subsub;": "\u2ad5", +- "subsup;": "\u2ad3", +- "succ;": "\u227b", +- "succapprox;": "\u2ab8", +- "succcurlyeq;": "\u227d", +- "succeq;": "\u2ab0", +- "succnapprox;": "\u2aba", +- "succneqq;": "\u2ab6", +- "succnsim;": "\u22e9", +- "succsim;": "\u227f", +- "sum;": "\u2211", +- "sung;": "\u266a", +- "sup1": "\xb9", +- "sup1;": "\xb9", +- "sup2": "\xb2", +- "sup2;": "\xb2", +- "sup3": "\xb3", +- "sup3;": "\xb3", +- "sup;": "\u2283", +- "supE;": "\u2ac6", +- "supdot;": "\u2abe", +- "supdsub;": "\u2ad8", +- "supe;": "\u2287", +- "supedot;": "\u2ac4", +- "suphsol;": "\u27c9", +- "suphsub;": "\u2ad7", +- "suplarr;": "\u297b", +- "supmult;": "\u2ac2", +- "supnE;": "\u2acc", +- "supne;": "\u228b", +- "supplus;": "\u2ac0", +- "supset;": "\u2283", +- "supseteq;": "\u2287", +- "supseteqq;": "\u2ac6", +- "supsetneq;": "\u228b", +- "supsetneqq;": "\u2acc", +- "supsim;": "\u2ac8", +- "supsub;": "\u2ad4", +- "supsup;": "\u2ad6", +- "swArr;": "\u21d9", +- "swarhk;": "\u2926", +- "swarr;": "\u2199", +- "swarrow;": "\u2199", +- "swnwar;": "\u292a", +- "szlig": "\xdf", +- "szlig;": "\xdf", +- "target;": "\u2316", +- "tau;": "\u03c4", +- "tbrk;": "\u23b4", +- "tcaron;": "\u0165", +- "tcedil;": "\u0163", +- "tcy;": "\u0442", +- "tdot;": "\u20db", +- "telrec;": "\u2315", +- "tfr;": "\U0001d531", +- "there4;": "\u2234", +- "therefore;": "\u2234", +- "theta;": "\u03b8", +- "thetasym;": "\u03d1", +- "thetav;": "\u03d1", +- "thickapprox;": "\u2248", +- "thicksim;": "\u223c", +- "thinsp;": "\u2009", +- "thkap;": "\u2248", +- "thksim;": "\u223c", +- "thorn": "\xfe", +- "thorn;": "\xfe", +- "tilde;": "\u02dc", +- "times": "\xd7", +- "times;": "\xd7", +- "timesb;": "\u22a0", +- "timesbar;": "\u2a31", +- "timesd;": "\u2a30", +- "tint;": "\u222d", +- "toea;": "\u2928", +- "top;": "\u22a4", +- "topbot;": "\u2336", +- "topcir;": "\u2af1", +- "topf;": "\U0001d565", +- "topfork;": "\u2ada", +- "tosa;": "\u2929", +- "tprime;": "\u2034", +- "trade;": "\u2122", +- "triangle;": "\u25b5", +- "triangledown;": "\u25bf", +- "triangleleft;": "\u25c3", +- "trianglelefteq;": "\u22b4", +- "triangleq;": "\u225c", +- "triangleright;": "\u25b9", +- "trianglerighteq;": "\u22b5", +- "tridot;": "\u25ec", +- "trie;": "\u225c", +- "triminus;": "\u2a3a", +- "triplus;": "\u2a39", +- "trisb;": "\u29cd", +- "tritime;": "\u2a3b", +- "trpezium;": "\u23e2", +- "tscr;": "\U0001d4c9", +- "tscy;": "\u0446", +- "tshcy;": "\u045b", +- "tstrok;": "\u0167", +- "twixt;": "\u226c", +- "twoheadleftarrow;": "\u219e", +- "twoheadrightarrow;": "\u21a0", +- "uArr;": "\u21d1", +- "uHar;": "\u2963", +- "uacute": "\xfa", +- "uacute;": "\xfa", +- "uarr;": "\u2191", +- "ubrcy;": "\u045e", +- "ubreve;": "\u016d", +- "ucirc": "\xfb", +- "ucirc;": "\xfb", +- "ucy;": "\u0443", +- "udarr;": "\u21c5", +- "udblac;": "\u0171", +- "udhar;": "\u296e", +- "ufisht;": "\u297e", +- "ufr;": "\U0001d532", +- "ugrave": "\xf9", +- "ugrave;": "\xf9", +- "uharl;": "\u21bf", +- "uharr;": "\u21be", +- "uhblk;": "\u2580", +- "ulcorn;": "\u231c", +- "ulcorner;": "\u231c", +- "ulcrop;": "\u230f", +- "ultri;": "\u25f8", +- "umacr;": "\u016b", +- "uml": "\xa8", +- "uml;": "\xa8", +- "uogon;": "\u0173", +- "uopf;": "\U0001d566", +- "uparrow;": "\u2191", +- "updownarrow;": "\u2195", +- "upharpoonleft;": "\u21bf", +- "upharpoonright;": "\u21be", +- "uplus;": "\u228e", +- "upsi;": "\u03c5", +- "upsih;": "\u03d2", +- "upsilon;": "\u03c5", +- "upuparrows;": "\u21c8", +- "urcorn;": "\u231d", +- "urcorner;": "\u231d", +- "urcrop;": "\u230e", +- "uring;": "\u016f", +- "urtri;": "\u25f9", +- "uscr;": "\U0001d4ca", +- "utdot;": "\u22f0", +- "utilde;": "\u0169", +- "utri;": "\u25b5", +- "utrif;": "\u25b4", +- "uuarr;": "\u21c8", +- "uuml": "\xfc", +- "uuml;": "\xfc", +- "uwangle;": "\u29a7", +- "vArr;": "\u21d5", +- "vBar;": "\u2ae8", +- "vBarv;": "\u2ae9", +- "vDash;": "\u22a8", +- "vangrt;": "\u299c", +- "varepsilon;": "\u03f5", +- "varkappa;": "\u03f0", +- "varnothing;": "\u2205", +- "varphi;": "\u03d5", +- "varpi;": "\u03d6", +- "varpropto;": "\u221d", +- "varr;": "\u2195", +- "varrho;": "\u03f1", +- "varsigma;": "\u03c2", +- "varsubsetneq;": "\u228a\ufe00", +- "varsubsetneqq;": "\u2acb\ufe00", +- "varsupsetneq;": "\u228b\ufe00", +- "varsupsetneqq;": "\u2acc\ufe00", +- "vartheta;": "\u03d1", +- "vartriangleleft;": "\u22b2", +- "vartriangleright;": "\u22b3", +- "vcy;": "\u0432", +- "vdash;": "\u22a2", +- "vee;": "\u2228", +- "veebar;": "\u22bb", +- "veeeq;": "\u225a", +- "vellip;": "\u22ee", +- "verbar;": "|", +- "vert;": "|", +- "vfr;": "\U0001d533", +- "vltri;": "\u22b2", +- "vnsub;": "\u2282\u20d2", +- "vnsup;": "\u2283\u20d2", +- "vopf;": "\U0001d567", +- "vprop;": "\u221d", +- "vrtri;": "\u22b3", +- "vscr;": "\U0001d4cb", +- "vsubnE;": "\u2acb\ufe00", +- "vsubne;": "\u228a\ufe00", +- "vsupnE;": "\u2acc\ufe00", +- "vsupne;": "\u228b\ufe00", +- "vzigzag;": "\u299a", +- "wcirc;": "\u0175", +- "wedbar;": "\u2a5f", +- "wedge;": "\u2227", +- "wedgeq;": "\u2259", +- "weierp;": "\u2118", +- "wfr;": "\U0001d534", +- "wopf;": "\U0001d568", +- "wp;": "\u2118", +- "wr;": "\u2240", +- "wreath;": "\u2240", +- "wscr;": "\U0001d4cc", +- "xcap;": "\u22c2", +- "xcirc;": "\u25ef", +- "xcup;": "\u22c3", +- "xdtri;": "\u25bd", +- "xfr;": "\U0001d535", +- "xhArr;": "\u27fa", +- "xharr;": "\u27f7", +- "xi;": "\u03be", +- "xlArr;": "\u27f8", +- "xlarr;": "\u27f5", +- "xmap;": "\u27fc", +- "xnis;": "\u22fb", +- "xodot;": "\u2a00", +- "xopf;": "\U0001d569", +- "xoplus;": "\u2a01", +- "xotime;": "\u2a02", +- "xrArr;": "\u27f9", +- "xrarr;": "\u27f6", +- "xscr;": "\U0001d4cd", +- "xsqcup;": "\u2a06", +- "xuplus;": "\u2a04", +- "xutri;": "\u25b3", +- "xvee;": "\u22c1", +- "xwedge;": "\u22c0", +- "yacute": "\xfd", +- "yacute;": "\xfd", +- "yacy;": "\u044f", +- "ycirc;": "\u0177", +- "ycy;": "\u044b", +- "yen": "\xa5", +- "yen;": "\xa5", +- "yfr;": "\U0001d536", +- "yicy;": "\u0457", +- "yopf;": "\U0001d56a", +- "yscr;": "\U0001d4ce", +- "yucy;": "\u044e", +- "yuml": "\xff", +- "yuml;": "\xff", +- "zacute;": "\u017a", +- "zcaron;": "\u017e", +- "zcy;": "\u0437", +- "zdot;": "\u017c", +- "zeetrf;": "\u2128", +- "zeta;": "\u03b6", +- "zfr;": "\U0001d537", +- "zhcy;": "\u0436", +- "zigrarr;": "\u21dd", +- "zopf;": "\U0001d56b", +- "zscr;": "\U0001d4cf", +- "zwj;": "\u200d", +- "zwnj;": "\u200c", +-} +- +-replacementCharacters = { +- 0x0: "\uFFFD", +- 0x0d: "\u000D", +- 0x80: "\u20AC", +- 0x81: "\u0081", +- 0x82: "\u201A", +- 0x83: "\u0192", +- 0x84: "\u201E", +- 0x85: "\u2026", +- 0x86: "\u2020", +- 0x87: "\u2021", +- 0x88: "\u02C6", +- 0x89: "\u2030", +- 0x8A: "\u0160", +- 0x8B: "\u2039", +- 0x8C: "\u0152", +- 0x8D: "\u008D", +- 0x8E: "\u017D", +- 0x8F: "\u008F", +- 0x90: "\u0090", +- 0x91: "\u2018", +- 0x92: "\u2019", +- 0x93: "\u201C", +- 0x94: "\u201D", +- 0x95: "\u2022", +- 0x96: "\u2013", +- 0x97: "\u2014", +- 0x98: "\u02DC", +- 0x99: "\u2122", +- 0x9A: "\u0161", +- 0x9B: "\u203A", +- 0x9C: "\u0153", +- 0x9D: "\u009D", +- 0x9E: "\u017E", +- 0x9F: "\u0178", +-} +- +-tokenTypes = { +- "Doctype": 0, +- "Characters": 1, +- "SpaceCharacters": 2, +- "StartTag": 3, +- "EndTag": 4, +- "EmptyTag": 5, +- "Comment": 6, +- "ParseError": 7 +-} +- +-tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], +- tokenTypes["EmptyTag"]]) +- +- +-prefixes = dict([(v, k) for k, v in namespaces.items()]) +-prefixes["http://www.w3.org/1998/Math/MathML"] = "math" +- +- +-class DataLossWarning(UserWarning): +- pass +- +- +-class ReparseException(Exception): +- pass +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/__init__.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/__init__.py +deleted file mode 100644 +index e69de29..0000000 +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/alphabeticalattributes.py +deleted file mode 100644 +index 4795bae..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/alphabeticalattributes.py ++++ /dev/null +@@ -1,20 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-from . import base +- +-try: +- from collections import OrderedDict +-except ImportError: +- from ordereddict import OrderedDict +- +- +-class Filter(base.Filter): +- def __iter__(self): +- for token in base.Filter.__iter__(self): +- if token["type"] in ("StartTag", "EmptyTag"): +- attrs = OrderedDict() +- for name, value in sorted(token["data"].items(), +- key=lambda x: x[0]): +- attrs[name] = value +- token["data"] = attrs +- yield token +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/base.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/base.py +deleted file mode 100644 +index c7dbaed..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/base.py ++++ /dev/null +@@ -1,12 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +- +-class Filter(object): +- def __init__(self, source): +- self.source = source +- +- def __iter__(self): +- return iter(self.source) +- +- def __getattr__(self, name): +- return getattr(self.source, name) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/inject_meta_charset.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/inject_meta_charset.py +deleted file mode 100644 +index 2059ec8..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/inject_meta_charset.py ++++ /dev/null +@@ -1,65 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-from . import base +- +- +-class Filter(base.Filter): +- def __init__(self, source, encoding): +- base.Filter.__init__(self, source) +- self.encoding = encoding +- +- def __iter__(self): +- state = "pre_head" +- meta_found = (self.encoding is None) +- pending = [] +- +- for token in base.Filter.__iter__(self): +- type = token["type"] +- if type == "StartTag": +- if token["name"].lower() == "head": +- state = "in_head" +- +- elif type == "EmptyTag": +- if token["name"].lower() == "meta": +- # replace charset with actual encoding +- has_http_equiv_content_type = False +- for (namespace, name), value in token["data"].items(): +- if namespace is not None: +- continue +- elif name.lower() == 'charset': +- token["data"][(namespace, name)] = self.encoding +- meta_found = True +- break +- elif name == 'http-equiv' and value.lower() == 'content-type': +- has_http_equiv_content_type = True +- else: +- if has_http_equiv_content_type and (None, "content") in token["data"]: +- token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding +- meta_found = True +- +- elif token["name"].lower() == "head" and not meta_found: +- # insert meta into empty head +- yield {"type": "StartTag", "name": "head", +- "data": token["data"]} +- yield {"type": "EmptyTag", "name": "meta", +- "data": {(None, "charset"): self.encoding}} +- yield {"type": "EndTag", "name": "head"} +- meta_found = True +- continue +- +- elif type == "EndTag": +- if token["name"].lower() == "head" and pending: +- # insert meta into head (if necessary) and flush pending queue +- yield pending.pop(0) +- if not meta_found: +- yield {"type": "EmptyTag", "name": "meta", +- "data": {(None, "charset"): self.encoding}} +- while pending: +- yield pending.pop(0) +- meta_found = True +- state = "post_head" +- +- if state == "in_head": +- pending.append(token) +- else: +- yield token +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/lint.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/lint.py +deleted file mode 100644 +index 3b892c8..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/lint.py ++++ /dev/null +@@ -1,81 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-from pip._vendor.six import text_type +- +-from . import base +-from ..constants import namespaces, voidElements +- +-from ..constants import spaceCharacters +-spaceCharacters = "".join(spaceCharacters) +- +- +-class Filter(base.Filter): +- def __init__(self, source, require_matching_tags=True): +- super(Filter, self).__init__(source) +- self.require_matching_tags = require_matching_tags +- +- def __iter__(self): +- open_elements = [] +- for token in base.Filter.__iter__(self): +- type = token["type"] +- if type in ("StartTag", "EmptyTag"): +- namespace = token["namespace"] +- name = token["name"] +- assert namespace is None or isinstance(namespace, text_type) +- assert namespace != "" +- assert isinstance(name, text_type) +- assert name != "" +- assert isinstance(token["data"], dict) +- if (not namespace or namespace == namespaces["html"]) and name in voidElements: +- assert type == "EmptyTag" +- else: +- assert type == "StartTag" +- if type == "StartTag" and self.require_matching_tags: +- open_elements.append((namespace, name)) +- for (namespace, name), value in token["data"].items(): +- assert namespace is None or isinstance(namespace, text_type) +- assert namespace != "" +- assert isinstance(name, text_type) +- assert name != "" +- assert isinstance(value, text_type) +- +- elif type == "EndTag": +- namespace = token["namespace"] +- name = token["name"] +- assert namespace is None or isinstance(namespace, text_type) +- assert namespace != "" +- assert isinstance(name, text_type) +- assert name != "" +- if (not namespace or namespace == namespaces["html"]) and name in voidElements: +- assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} +- elif self.require_matching_tags: +- start = open_elements.pop() +- assert start == (namespace, name) +- +- elif type == "Comment": +- data = token["data"] +- assert isinstance(data, text_type) +- +- elif type in ("Characters", "SpaceCharacters"): +- data = token["data"] +- assert isinstance(data, text_type) +- assert data != "" +- if type == "SpaceCharacters": +- assert data.strip(spaceCharacters) == "" +- +- elif type == "Doctype": +- name = token["name"] +- assert name is None or isinstance(name, text_type) +- assert token["publicId"] is None or isinstance(name, text_type) +- assert token["systemId"] is None or isinstance(name, text_type) +- +- elif type == "Entity": +- assert isinstance(token["name"], text_type) +- +- elif type == "SerializerError": +- assert isinstance(token["data"], text_type) +- +- else: +- assert False, "Unknown token type: %(type)s" % {"type": type} +- +- yield token +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/optionaltags.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/optionaltags.py +deleted file mode 100644 +index f6edb73..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/optionaltags.py ++++ /dev/null +@@ -1,206 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-from . import base +- +- +-class Filter(base.Filter): +- def slider(self): +- previous1 = previous2 = None +- for token in self.source: +- if previous1 is not None: +- yield previous2, previous1, token +- previous2 = previous1 +- previous1 = token +- if previous1 is not None: +- yield previous2, previous1, None +- +- def __iter__(self): +- for previous, token, next in self.slider(): +- type = token["type"] +- if type == "StartTag": +- if (token["data"] or +- not self.is_optional_start(token["name"], previous, next)): +- yield token +- elif type == "EndTag": +- if not self.is_optional_end(token["name"], next): +- yield token +- else: +- yield token +- +- def is_optional_start(self, tagname, previous, next): +- type = next and next["type"] or None +- if tagname in 'html': +- # An html element's start tag may be omitted if the first thing +- # inside the html element is not a space character or a comment. +- return type not in ("Comment", "SpaceCharacters") +- elif tagname == 'head': +- # A head element's start tag may be omitted if the first thing +- # inside the head element is an element. +- # XXX: we also omit the start tag if the head element is empty +- if type in ("StartTag", "EmptyTag"): +- return True +- elif type == "EndTag": +- return next["name"] == "head" +- elif tagname == 'body': +- # A body element's start tag may be omitted if the first thing +- # inside the body element is not a space character or a comment, +- # except if the first thing inside the body element is a script +- # or style element and the node immediately preceding the body +- # element is a head element whose end tag has been omitted. +- if type in ("Comment", "SpaceCharacters"): +- return False +- elif type == "StartTag": +- # XXX: we do not look at the preceding event, so we never omit +- # the body element's start tag if it's followed by a script or +- # a style element. +- return next["name"] not in ('script', 'style') +- else: +- return True +- elif tagname == 'colgroup': +- # A colgroup element's start tag may be omitted if the first thing +- # inside the colgroup element is a col element, and if the element +- # is not immediately preceded by another colgroup element whose +- # end tag has been omitted. +- if type in ("StartTag", "EmptyTag"): +- # XXX: we do not look at the preceding event, so instead we never +- # omit the colgroup element's end tag when it is immediately +- # followed by another colgroup element. See is_optional_end. +- return next["name"] == "col" +- else: +- return False +- elif tagname == 'tbody': +- # A tbody element's start tag may be omitted if the first thing +- # inside the tbody element is a tr element, and if the element is +- # not immediately preceded by a tbody, thead, or tfoot element +- # whose end tag has been omitted. +- if type == "StartTag": +- # omit the thead and tfoot elements' end tag when they are +- # immediately followed by a tbody element. See is_optional_end. +- if previous and previous['type'] == 'EndTag' and \ +- previous['name'] in ('tbody', 'thead', 'tfoot'): +- return False +- return next["name"] == 'tr' +- else: +- return False +- return False +- +- def is_optional_end(self, tagname, next): +- type = next and next["type"] or None +- if tagname in ('html', 'head', 'body'): +- # An html element's end tag may be omitted if the html element +- # is not immediately followed by a space character or a comment. +- return type not in ("Comment", "SpaceCharacters") +- elif tagname in ('li', 'optgroup', 'tr'): +- # A li element's end tag may be omitted if the li element is +- # immediately followed by another li element or if there is +- # no more content in the parent element. +- # An optgroup element's end tag may be omitted if the optgroup +- # element is immediately followed by another optgroup element, +- # or if there is no more content in the parent element. +- # A tr element's end tag may be omitted if the tr element is +- # immediately followed by another tr element, or if there is +- # no more content in the parent element. +- if type == "StartTag": +- return next["name"] == tagname +- else: +- return type == "EndTag" or type is None +- elif tagname in ('dt', 'dd'): +- # A dt element's end tag may be omitted if the dt element is +- # immediately followed by another dt element or a dd element. +- # A dd element's end tag may be omitted if the dd element is +- # immediately followed by another dd element or a dt element, +- # or if there is no more content in the parent element. +- if type == "StartTag": +- return next["name"] in ('dt', 'dd') +- elif tagname == 'dd': +- return type == "EndTag" or type is None +- else: +- return False +- elif tagname == 'p': +- # A p element's end tag may be omitted if the p element is +- # immediately followed by an address, article, aside, +- # blockquote, datagrid, dialog, dir, div, dl, fieldset, +- # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, +- # nav, ol, p, pre, section, table, or ul, element, or if +- # there is no more content in the parent element. +- if type in ("StartTag", "EmptyTag"): +- return next["name"] in ('address', 'article', 'aside', +- 'blockquote', 'datagrid', 'dialog', +- 'dir', 'div', 'dl', 'fieldset', 'footer', +- 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', +- 'header', 'hr', 'menu', 'nav', 'ol', +- 'p', 'pre', 'section', 'table', 'ul') +- else: +- return type == "EndTag" or type is None +- elif tagname == 'option': +- # An option element's end tag may be omitted if the option +- # element is immediately followed by another option element, +- # or if it is immediately followed by an optgroup +- # element, or if there is no more content in the parent +- # element. +- if type == "StartTag": +- return next["name"] in ('option', 'optgroup') +- else: +- return type == "EndTag" or type is None +- elif tagname in ('rt', 'rp'): +- # An rt element's end tag may be omitted if the rt element is +- # immediately followed by an rt or rp element, or if there is +- # no more content in the parent element. +- # An rp element's end tag may be omitted if the rp element is +- # immediately followed by an rt or rp element, or if there is +- # no more content in the parent element. +- if type == "StartTag": +- return next["name"] in ('rt', 'rp') +- else: +- return type == "EndTag" or type is None +- elif tagname == 'colgroup': +- # A colgroup element's end tag may be omitted if the colgroup +- # element is not immediately followed by a space character or +- # a comment. +- if type in ("Comment", "SpaceCharacters"): +- return False +- elif type == "StartTag": +- # XXX: we also look for an immediately following colgroup +- # element. See is_optional_start. +- return next["name"] != 'colgroup' +- else: +- return True +- elif tagname in ('thead', 'tbody'): +- # A thead element's end tag may be omitted if the thead element +- # is immediately followed by a tbody or tfoot element. +- # A tbody element's end tag may be omitted if the tbody element +- # is immediately followed by a tbody or tfoot element, or if +- # there is no more content in the parent element. +- # A tfoot element's end tag may be omitted if the tfoot element +- # is immediately followed by a tbody element, or if there is no +- # more content in the parent element. +- # XXX: we never omit the end tag when the following element is +- # a tbody. See is_optional_start. +- if type == "StartTag": +- return next["name"] in ['tbody', 'tfoot'] +- elif tagname == 'tbody': +- return type == "EndTag" or type is None +- else: +- return False +- elif tagname == 'tfoot': +- # A tfoot element's end tag may be omitted if the tfoot element +- # is immediately followed by a tbody element, or if there is no +- # more content in the parent element. +- # XXX: we never omit the end tag when the following element is +- # a tbody. See is_optional_start. +- if type == "StartTag": +- return next["name"] == 'tbody' +- else: +- return type == "EndTag" or type is None +- elif tagname in ('td', 'th'): +- # A td element's end tag may be omitted if the td element is +- # immediately followed by a td or th element, or if there is +- # no more content in the parent element. +- # A th element's end tag may be omitted if the th element is +- # immediately followed by a td or th element, or if there is +- # no more content in the parent element. +- if type == "StartTag": +- return next["name"] in ('td', 'th') +- else: +- return type == "EndTag" or type is None +- return False +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/sanitizer.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/sanitizer.py +deleted file mode 100644 +index 026748d..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/sanitizer.py ++++ /dev/null +@@ -1,865 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-import re +-from xml.sax.saxutils import escape, unescape +- +-from pip._vendor.six.moves import urllib_parse as urlparse +- +-from . import base +-from ..constants import namespaces, prefixes +- +-__all__ = ["Filter"] +- +- +-allowed_elements = frozenset(( +- (namespaces['html'], 'a'), +- (namespaces['html'], 'abbr'), +- (namespaces['html'], 'acronym'), +- (namespaces['html'], 'address'), +- (namespaces['html'], 'area'), +- (namespaces['html'], 'article'), +- (namespaces['html'], 'aside'), +- (namespaces['html'], 'audio'), +- (namespaces['html'], 'b'), +- (namespaces['html'], 'big'), +- (namespaces['html'], 'blockquote'), +- (namespaces['html'], 'br'), +- (namespaces['html'], 'button'), +- (namespaces['html'], 'canvas'), +- (namespaces['html'], 'caption'), +- (namespaces['html'], 'center'), +- (namespaces['html'], 'cite'), +- (namespaces['html'], 'code'), +- (namespaces['html'], 'col'), +- (namespaces['html'], 'colgroup'), +- (namespaces['html'], 'command'), +- (namespaces['html'], 'datagrid'), +- (namespaces['html'], 'datalist'), +- (namespaces['html'], 'dd'), +- (namespaces['html'], 'del'), +- (namespaces['html'], 'details'), +- (namespaces['html'], 'dfn'), +- (namespaces['html'], 'dialog'), +- (namespaces['html'], 'dir'), +- (namespaces['html'], 'div'), +- (namespaces['html'], 'dl'), +- (namespaces['html'], 'dt'), +- (namespaces['html'], 'em'), +- (namespaces['html'], 'event-source'), +- (namespaces['html'], 'fieldset'), +- (namespaces['html'], 'figcaption'), +- (namespaces['html'], 'figure'), +- (namespaces['html'], 'footer'), +- (namespaces['html'], 'font'), +- (namespaces['html'], 'form'), +- (namespaces['html'], 'header'), +- (namespaces['html'], 'h1'), +- (namespaces['html'], 'h2'), +- (namespaces['html'], 'h3'), +- (namespaces['html'], 'h4'), +- (namespaces['html'], 'h5'), +- (namespaces['html'], 'h6'), +- (namespaces['html'], 'hr'), +- (namespaces['html'], 'i'), +- (namespaces['html'], 'img'), +- (namespaces['html'], 'input'), +- (namespaces['html'], 'ins'), +- (namespaces['html'], 'keygen'), +- (namespaces['html'], 'kbd'), +- (namespaces['html'], 'label'), +- (namespaces['html'], 'legend'), +- (namespaces['html'], 'li'), +- (namespaces['html'], 'm'), +- (namespaces['html'], 'map'), +- (namespaces['html'], 'menu'), +- (namespaces['html'], 'meter'), +- (namespaces['html'], 'multicol'), +- (namespaces['html'], 'nav'), +- (namespaces['html'], 'nextid'), +- (namespaces['html'], 'ol'), +- (namespaces['html'], 'output'), +- (namespaces['html'], 'optgroup'), +- (namespaces['html'], 'option'), +- (namespaces['html'], 'p'), +- (namespaces['html'], 'pre'), +- (namespaces['html'], 'progress'), +- (namespaces['html'], 'q'), +- (namespaces['html'], 's'), +- (namespaces['html'], 'samp'), +- (namespaces['html'], 'section'), +- (namespaces['html'], 'select'), +- (namespaces['html'], 'small'), +- (namespaces['html'], 'sound'), +- (namespaces['html'], 'source'), +- (namespaces['html'], 'spacer'), +- (namespaces['html'], 'span'), +- (namespaces['html'], 'strike'), +- (namespaces['html'], 'strong'), +- (namespaces['html'], 'sub'), +- (namespaces['html'], 'sup'), +- (namespaces['html'], 'table'), +- (namespaces['html'], 'tbody'), +- (namespaces['html'], 'td'), +- (namespaces['html'], 'textarea'), +- (namespaces['html'], 'time'), +- (namespaces['html'], 'tfoot'), +- (namespaces['html'], 'th'), +- (namespaces['html'], 'thead'), +- (namespaces['html'], 'tr'), +- (namespaces['html'], 'tt'), +- (namespaces['html'], 'u'), +- (namespaces['html'], 'ul'), +- (namespaces['html'], 'var'), +- (namespaces['html'], 'video'), +- (namespaces['mathml'], 'maction'), +- (namespaces['mathml'], 'math'), +- (namespaces['mathml'], 'merror'), +- (namespaces['mathml'], 'mfrac'), +- (namespaces['mathml'], 'mi'), +- (namespaces['mathml'], 'mmultiscripts'), +- (namespaces['mathml'], 'mn'), +- (namespaces['mathml'], 'mo'), +- (namespaces['mathml'], 'mover'), +- (namespaces['mathml'], 'mpadded'), +- (namespaces['mathml'], 'mphantom'), +- (namespaces['mathml'], 'mprescripts'), +- (namespaces['mathml'], 'mroot'), +- (namespaces['mathml'], 'mrow'), +- (namespaces['mathml'], 'mspace'), +- (namespaces['mathml'], 'msqrt'), +- (namespaces['mathml'], 'mstyle'), +- (namespaces['mathml'], 'msub'), +- (namespaces['mathml'], 'msubsup'), +- (namespaces['mathml'], 'msup'), +- (namespaces['mathml'], 'mtable'), +- (namespaces['mathml'], 'mtd'), +- (namespaces['mathml'], 'mtext'), +- (namespaces['mathml'], 'mtr'), +- (namespaces['mathml'], 'munder'), +- (namespaces['mathml'], 'munderover'), +- (namespaces['mathml'], 'none'), +- (namespaces['svg'], 'a'), +- (namespaces['svg'], 'animate'), +- (namespaces['svg'], 'animateColor'), +- (namespaces['svg'], 'animateMotion'), +- (namespaces['svg'], 'animateTransform'), +- (namespaces['svg'], 'clipPath'), +- (namespaces['svg'], 'circle'), +- (namespaces['svg'], 'defs'), +- (namespaces['svg'], 'desc'), +- (namespaces['svg'], 'ellipse'), +- (namespaces['svg'], 'font-face'), +- (namespaces['svg'], 'font-face-name'), +- (namespaces['svg'], 'font-face-src'), +- (namespaces['svg'], 'g'), +- (namespaces['svg'], 'glyph'), +- (namespaces['svg'], 'hkern'), +- (namespaces['svg'], 'linearGradient'), +- (namespaces['svg'], 'line'), +- (namespaces['svg'], 'marker'), +- (namespaces['svg'], 'metadata'), +- (namespaces['svg'], 'missing-glyph'), +- (namespaces['svg'], 'mpath'), +- (namespaces['svg'], 'path'), +- (namespaces['svg'], 'polygon'), +- (namespaces['svg'], 'polyline'), +- (namespaces['svg'], 'radialGradient'), +- (namespaces['svg'], 'rect'), +- (namespaces['svg'], 'set'), +- (namespaces['svg'], 'stop'), +- (namespaces['svg'], 'svg'), +- (namespaces['svg'], 'switch'), +- (namespaces['svg'], 'text'), +- (namespaces['svg'], 'title'), +- (namespaces['svg'], 'tspan'), +- (namespaces['svg'], 'use'), +-)) +- +-allowed_attributes = frozenset(( +- # HTML attributes +- (None, 'abbr'), +- (None, 'accept'), +- (None, 'accept-charset'), +- (None, 'accesskey'), +- (None, 'action'), +- (None, 'align'), +- (None, 'alt'), +- (None, 'autocomplete'), +- (None, 'autofocus'), +- (None, 'axis'), +- (None, 'background'), +- (None, 'balance'), +- (None, 'bgcolor'), +- (None, 'bgproperties'), +- (None, 'border'), +- (None, 'bordercolor'), +- (None, 'bordercolordark'), +- (None, 'bordercolorlight'), +- (None, 'bottompadding'), +- (None, 'cellpadding'), +- (None, 'cellspacing'), +- (None, 'ch'), +- (None, 'challenge'), +- (None, 'char'), +- (None, 'charoff'), +- (None, 'choff'), +- (None, 'charset'), +- (None, 'checked'), +- (None, 'cite'), +- (None, 'class'), +- (None, 'clear'), +- (None, 'color'), +- (None, 'cols'), +- (None, 'colspan'), +- (None, 'compact'), +- (None, 'contenteditable'), +- (None, 'controls'), +- (None, 'coords'), +- (None, 'data'), +- (None, 'datafld'), +- (None, 'datapagesize'), +- (None, 'datasrc'), +- (None, 'datetime'), +- (None, 'default'), +- (None, 'delay'), +- (None, 'dir'), +- (None, 'disabled'), +- (None, 'draggable'), +- (None, 'dynsrc'), +- (None, 'enctype'), +- (None, 'end'), +- (None, 'face'), +- (None, 'for'), +- (None, 'form'), +- (None, 'frame'), +- (None, 'galleryimg'), +- (None, 'gutter'), +- (None, 'headers'), +- (None, 'height'), +- (None, 'hidefocus'), +- (None, 'hidden'), +- (None, 'high'), +- (None, 'href'), +- (None, 'hreflang'), +- (None, 'hspace'), +- (None, 'icon'), +- (None, 'id'), +- (None, 'inputmode'), +- (None, 'ismap'), +- (None, 'keytype'), +- (None, 'label'), +- (None, 'leftspacing'), +- (None, 'lang'), +- (None, 'list'), +- (None, 'longdesc'), +- (None, 'loop'), +- (None, 'loopcount'), +- (None, 'loopend'), +- (None, 'loopstart'), +- (None, 'low'), +- (None, 'lowsrc'), +- (None, 'max'), +- (None, 'maxlength'), +- (None, 'media'), +- (None, 'method'), +- (None, 'min'), +- (None, 'multiple'), +- (None, 'name'), +- (None, 'nohref'), +- (None, 'noshade'), +- (None, 'nowrap'), +- (None, 'open'), +- (None, 'optimum'), +- (None, 'pattern'), +- (None, 'ping'), +- (None, 'point-size'), +- (None, 'poster'), +- (None, 'pqg'), +- (None, 'preload'), +- (None, 'prompt'), +- (None, 'radiogroup'), +- (None, 'readonly'), +- (None, 'rel'), +- (None, 'repeat-max'), +- (None, 'repeat-min'), +- (None, 'replace'), +- (None, 'required'), +- (None, 'rev'), +- (None, 'rightspacing'), +- (None, 'rows'), +- (None, 'rowspan'), +- (None, 'rules'), +- (None, 'scope'), +- (None, 'selected'), +- (None, 'shape'), +- (None, 'size'), +- (None, 'span'), +- (None, 'src'), +- (None, 'start'), +- (None, 'step'), +- (None, 'style'), +- (None, 'summary'), +- (None, 'suppress'), +- (None, 'tabindex'), +- (None, 'target'), +- (None, 'template'), +- (None, 'title'), +- (None, 'toppadding'), +- (None, 'type'), +- (None, 'unselectable'), +- (None, 'usemap'), +- (None, 'urn'), +- (None, 'valign'), +- (None, 'value'), +- (None, 'variable'), +- (None, 'volume'), +- (None, 'vspace'), +- (None, 'vrml'), +- (None, 'width'), +- (None, 'wrap'), +- (namespaces['xml'], 'lang'), +- # MathML attributes +- (None, 'actiontype'), +- (None, 'align'), +- (None, 'columnalign'), +- (None, 'columnalign'), +- (None, 'columnalign'), +- (None, 'columnlines'), +- (None, 'columnspacing'), +- (None, 'columnspan'), +- (None, 'depth'), +- (None, 'display'), +- (None, 'displaystyle'), +- (None, 'equalcolumns'), +- (None, 'equalrows'), +- (None, 'fence'), +- (None, 'fontstyle'), +- (None, 'fontweight'), +- (None, 'frame'), +- (None, 'height'), +- (None, 'linethickness'), +- (None, 'lspace'), +- (None, 'mathbackground'), +- (None, 'mathcolor'), +- (None, 'mathvariant'), +- (None, 'mathvariant'), +- (None, 'maxsize'), +- (None, 'minsize'), +- (None, 'other'), +- (None, 'rowalign'), +- (None, 'rowalign'), +- (None, 'rowalign'), +- (None, 'rowlines'), +- (None, 'rowspacing'), +- (None, 'rowspan'), +- (None, 'rspace'), +- (None, 'scriptlevel'), +- (None, 'selection'), +- (None, 'separator'), +- (None, 'stretchy'), +- (None, 'width'), +- (None, 'width'), +- (namespaces['xlink'], 'href'), +- (namespaces['xlink'], 'show'), +- (namespaces['xlink'], 'type'), +- # SVG attributes +- (None, 'accent-height'), +- (None, 'accumulate'), +- (None, 'additive'), +- (None, 'alphabetic'), +- (None, 'arabic-form'), +- (None, 'ascent'), +- (None, 'attributeName'), +- (None, 'attributeType'), +- (None, 'baseProfile'), +- (None, 'bbox'), +- (None, 'begin'), +- (None, 'by'), +- (None, 'calcMode'), +- (None, 'cap-height'), +- (None, 'class'), +- (None, 'clip-path'), +- (None, 'color'), +- (None, 'color-rendering'), +- (None, 'content'), +- (None, 'cx'), +- (None, 'cy'), +- (None, 'd'), +- (None, 'dx'), +- (None, 'dy'), +- (None, 'descent'), +- (None, 'display'), +- (None, 'dur'), +- (None, 'end'), +- (None, 'fill'), +- (None, 'fill-opacity'), +- (None, 'fill-rule'), +- (None, 'font-family'), +- (None, 'font-size'), +- (None, 'font-stretch'), +- (None, 'font-style'), +- (None, 'font-variant'), +- (None, 'font-weight'), +- (None, 'from'), +- (None, 'fx'), +- (None, 'fy'), +- (None, 'g1'), +- (None, 'g2'), +- (None, 'glyph-name'), +- (None, 'gradientUnits'), +- (None, 'hanging'), +- (None, 'height'), +- (None, 'horiz-adv-x'), +- (None, 'horiz-origin-x'), +- (None, 'id'), +- (None, 'ideographic'), +- (None, 'k'), +- (None, 'keyPoints'), +- (None, 'keySplines'), +- (None, 'keyTimes'), +- (None, 'lang'), +- (None, 'marker-end'), +- (None, 'marker-mid'), +- (None, 'marker-start'), +- (None, 'markerHeight'), +- (None, 'markerUnits'), +- (None, 'markerWidth'), +- (None, 'mathematical'), +- (None, 'max'), +- (None, 'min'), +- (None, 'name'), +- (None, 'offset'), +- (None, 'opacity'), +- (None, 'orient'), +- (None, 'origin'), +- (None, 'overline-position'), +- (None, 'overline-thickness'), +- (None, 'panose-1'), +- (None, 'path'), +- (None, 'pathLength'), +- (None, 'points'), +- (None, 'preserveAspectRatio'), +- (None, 'r'), +- (None, 'refX'), +- (None, 'refY'), +- (None, 'repeatCount'), +- (None, 'repeatDur'), +- (None, 'requiredExtensions'), +- (None, 'requiredFeatures'), +- (None, 'restart'), +- (None, 'rotate'), +- (None, 'rx'), +- (None, 'ry'), +- (None, 'slope'), +- (None, 'stemh'), +- (None, 'stemv'), +- (None, 'stop-color'), +- (None, 'stop-opacity'), +- (None, 'strikethrough-position'), +- (None, 'strikethrough-thickness'), +- (None, 'stroke'), +- (None, 'stroke-dasharray'), +- (None, 'stroke-dashoffset'), +- (None, 'stroke-linecap'), +- (None, 'stroke-linejoin'), +- (None, 'stroke-miterlimit'), +- (None, 'stroke-opacity'), +- (None, 'stroke-width'), +- (None, 'systemLanguage'), +- (None, 'target'), +- (None, 'text-anchor'), +- (None, 'to'), +- (None, 'transform'), +- (None, 'type'), +- (None, 'u1'), +- (None, 'u2'), +- (None, 'underline-position'), +- (None, 'underline-thickness'), +- (None, 'unicode'), +- (None, 'unicode-range'), +- (None, 'units-per-em'), +- (None, 'values'), +- (None, 'version'), +- (None, 'viewBox'), +- (None, 'visibility'), +- (None, 'width'), +- (None, 'widths'), +- (None, 'x'), +- (None, 'x-height'), +- (None, 'x1'), +- (None, 'x2'), +- (namespaces['xlink'], 'actuate'), +- (namespaces['xlink'], 'arcrole'), +- (namespaces['xlink'], 'href'), +- (namespaces['xlink'], 'role'), +- (namespaces['xlink'], 'show'), +- (namespaces['xlink'], 'title'), +- (namespaces['xlink'], 'type'), +- (namespaces['xml'], 'base'), +- (namespaces['xml'], 'lang'), +- (namespaces['xml'], 'space'), +- (None, 'y'), +- (None, 'y1'), +- (None, 'y2'), +- (None, 'zoomAndPan'), +-)) +- +-attr_val_is_uri = frozenset(( +- (None, 'href'), +- (None, 'src'), +- (None, 'cite'), +- (None, 'action'), +- (None, 'longdesc'), +- (None, 'poster'), +- (None, 'background'), +- (None, 'datasrc'), +- (None, 'dynsrc'), +- (None, 'lowsrc'), +- (None, 'ping'), +- (namespaces['xlink'], 'href'), +- (namespaces['xml'], 'base'), +-)) +- +-svg_attr_val_allows_ref = frozenset(( +- (None, 'clip-path'), +- (None, 'color-profile'), +- (None, 'cursor'), +- (None, 'fill'), +- (None, 'filter'), +- (None, 'marker'), +- (None, 'marker-start'), +- (None, 'marker-mid'), +- (None, 'marker-end'), +- (None, 'mask'), +- (None, 'stroke'), +-)) +- +-svg_allow_local_href = frozenset(( +- (None, 'altGlyph'), +- (None, 'animate'), +- (None, 'animateColor'), +- (None, 'animateMotion'), +- (None, 'animateTransform'), +- (None, 'cursor'), +- (None, 'feImage'), +- (None, 'filter'), +- (None, 'linearGradient'), +- (None, 'pattern'), +- (None, 'radialGradient'), +- (None, 'textpath'), +- (None, 'tref'), +- (None, 'set'), +- (None, 'use') +-)) +- +-allowed_css_properties = frozenset(( +- 'azimuth', +- 'background-color', +- 'border-bottom-color', +- 'border-collapse', +- 'border-color', +- 'border-left-color', +- 'border-right-color', +- 'border-top-color', +- 'clear', +- 'color', +- 'cursor', +- 'direction', +- 'display', +- 'elevation', +- 'float', +- 'font', +- 'font-family', +- 'font-size', +- 'font-style', +- 'font-variant', +- 'font-weight', +- 'height', +- 'letter-spacing', +- 'line-height', +- 'overflow', +- 'pause', +- 'pause-after', +- 'pause-before', +- 'pitch', +- 'pitch-range', +- 'richness', +- 'speak', +- 'speak-header', +- 'speak-numeral', +- 'speak-punctuation', +- 'speech-rate', +- 'stress', +- 'text-align', +- 'text-decoration', +- 'text-indent', +- 'unicode-bidi', +- 'vertical-align', +- 'voice-family', +- 'volume', +- 'white-space', +- 'width', +-)) +- +-allowed_css_keywords = frozenset(( +- 'auto', +- 'aqua', +- 'black', +- 'block', +- 'blue', +- 'bold', +- 'both', +- 'bottom', +- 'brown', +- 'center', +- 'collapse', +- 'dashed', +- 'dotted', +- 'fuchsia', +- 'gray', +- 'green', +- '!important', +- 'italic', +- 'left', +- 'lime', +- 'maroon', +- 'medium', +- 'none', +- 'navy', +- 'normal', +- 'nowrap', +- 'olive', +- 'pointer', +- 'purple', +- 'red', +- 'right', +- 'solid', +- 'silver', +- 'teal', +- 'top', +- 'transparent', +- 'underline', +- 'white', +- 'yellow', +-)) +- +-allowed_svg_properties = frozenset(( +- 'fill', +- 'fill-opacity', +- 'fill-rule', +- 'stroke', +- 'stroke-width', +- 'stroke-linecap', +- 'stroke-linejoin', +- 'stroke-opacity', +-)) +- +-allowed_protocols = frozenset(( +- 'ed2k', +- 'ftp', +- 'http', +- 'https', +- 'irc', +- 'mailto', +- 'news', +- 'gopher', +- 'nntp', +- 'telnet', +- 'webcal', +- 'xmpp', +- 'callto', +- 'feed', +- 'urn', +- 'aim', +- 'rsync', +- 'tag', +- 'ssh', +- 'sftp', +- 'rtsp', +- 'afs', +- 'data', +-)) +- +-allowed_content_types = frozenset(( +- 'image/png', +- 'image/jpeg', +- 'image/gif', +- 'image/webp', +- 'image/bmp', +- 'text/plain', +-)) +- +- +-data_content_type = re.compile(r''' +- ^ +- # Match a content type / +- (?P[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) +- # Match any character set and encoding +- (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) +- |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) +- # Assume the rest is data +- ,.* +- $ +- ''', +- re.VERBOSE) +- +- +-class Filter(base.Filter): +- """ sanitization of XHTML+MathML+SVG and of inline style attributes.""" +- def __init__(self, +- source, +- allowed_elements=allowed_elements, +- allowed_attributes=allowed_attributes, +- allowed_css_properties=allowed_css_properties, +- allowed_css_keywords=allowed_css_keywords, +- allowed_svg_properties=allowed_svg_properties, +- allowed_protocols=allowed_protocols, +- allowed_content_types=allowed_content_types, +- attr_val_is_uri=attr_val_is_uri, +- svg_attr_val_allows_ref=svg_attr_val_allows_ref, +- svg_allow_local_href=svg_allow_local_href): +- super(Filter, self).__init__(source) +- self.allowed_elements = allowed_elements +- self.allowed_attributes = allowed_attributes +- self.allowed_css_properties = allowed_css_properties +- self.allowed_css_keywords = allowed_css_keywords +- self.allowed_svg_properties = allowed_svg_properties +- self.allowed_protocols = allowed_protocols +- self.allowed_content_types = allowed_content_types +- self.attr_val_is_uri = attr_val_is_uri +- self.svg_attr_val_allows_ref = svg_attr_val_allows_ref +- self.svg_allow_local_href = svg_allow_local_href +- +- def __iter__(self): +- for token in base.Filter.__iter__(self): +- token = self.sanitize_token(token) +- if token: +- yield token +- +- # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and +- # stripping out all # attributes not in ALLOWED_ATTRIBUTES. Style +- # attributes are parsed, and a restricted set, # specified by +- # ALLOWED_CSS_PROPERTIES and ALLOWED_CSS_KEYWORDS, are allowed through. +- # attributes in ATTR_VAL_IS_URI are scanned, and only URI schemes specified +- # in ALLOWED_PROTOCOLS are allowed. +- # +- # sanitize_html('') +- # => <script> do_nasty_stuff() </script> +- # sanitize_html('Click here for $100') +- # => Click here for $100 +- def sanitize_token(self, token): +- +- # accommodate filters which use token_type differently +- token_type = token["type"] +- if token_type in ("StartTag", "EndTag", "EmptyTag"): +- name = token["name"] +- namespace = token["namespace"] +- if ((namespace, name) in self.allowed_elements or +- (namespace is None and +- (namespaces["html"], name) in self.allowed_elements)): +- return self.allowed_token(token) +- else: +- return self.disallowed_token(token) +- elif token_type == "Comment": +- pass +- else: +- return token +- +- def allowed_token(self, token): +- if "data" in token: +- attrs = token["data"] +- attr_names = set(attrs.keys()) +- +- # Remove forbidden attributes +- for to_remove in (attr_names - self.allowed_attributes): +- del token["data"][to_remove] +- attr_names.remove(to_remove) +- +- # Remove attributes with disallowed URL values +- for attr in (attr_names & self.attr_val_is_uri): +- assert attr in attrs +- # I don't have a clue where this regexp comes from or why it matches those +- # characters, nor why we call unescape. I just know it's always been here. +- # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all +- # this will do is remove *more* than it otherwise would. +- val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\s]+", '', +- unescape(attrs[attr])).lower() +- # remove replacement characters from unescaped characters +- val_unescaped = val_unescaped.replace("\ufffd", "") +- try: +- uri = urlparse.urlparse(val_unescaped) +- except ValueError: +- uri = None +- del attrs[attr] +- if uri and uri.scheme: +- if uri.scheme not in self.allowed_protocols: +- del attrs[attr] +- if uri.scheme == 'data': +- m = data_content_type.match(uri.path) +- if not m: +- del attrs[attr] +- elif m.group('content_type') not in self.allowed_content_types: +- del attrs[attr] +- +- for attr in self.svg_attr_val_allows_ref: +- if attr in attrs: +- attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', +- ' ', +- unescape(attrs[attr])) +- if (token["name"] in self.svg_allow_local_href and +- (namespaces['xlink'], 'href') in attrs and re.search('^\s*[^#\s].*', +- attrs[(namespaces['xlink'], 'href')])): +- del attrs[(namespaces['xlink'], 'href')] +- if (None, 'style') in attrs: +- attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) +- token["data"] = attrs +- return token +- +- def disallowed_token(self, token): +- token_type = token["type"] +- if token_type == "EndTag": +- token["data"] = "" % token["name"] +- elif token["data"]: +- assert token_type in ("StartTag", "EmptyTag") +- attrs = [] +- for (ns, name), v in token["data"].items(): +- attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) +- token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) +- else: +- token["data"] = "<%s>" % token["name"] +- if token.get("selfClosing"): +- token["data"] = token["data"][:-1] + "/>" +- +- token["type"] = "Characters" +- +- del token["name"] +- return token +- +- def sanitize_css(self, style): +- # disallow urls +- style = re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) +- +- # gauntlet +- if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): +- return '' +- if not re.match("^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): +- return '' +- +- clean = [] +- for prop, value in re.findall("([-\w]+)\s*:\s*([^:;]*)", style): +- if not value: +- continue +- if prop.lower() in self.allowed_css_properties: +- clean.append(prop + ': ' + value + ';') +- elif prop.split('-')[0].lower() in ['background', 'border', 'margin', +- 'padding']: +- for keyword in value.split(): +- if keyword not in self.allowed_css_keywords and \ +- not re.match("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa +- break +- else: +- clean.append(prop + ': ' + value + ';') +- elif prop.lower() in self.allowed_svg_properties: +- clean.append(prop + ': ' + value + ';') +- +- return ' '.join(clean) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/whitespace.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/whitespace.py +deleted file mode 100644 +index 8921052..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/filters/whitespace.py ++++ /dev/null +@@ -1,38 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +- +-import re +- +-from . import base +-from ..constants import rcdataElements, spaceCharacters +-spaceCharacters = "".join(spaceCharacters) +- +-SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) +- +- +-class Filter(base.Filter): +- +- spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) +- +- def __iter__(self): +- preserve = 0 +- for token in base.Filter.__iter__(self): +- type = token["type"] +- if type == "StartTag" \ +- and (preserve or token["name"] in self.spacePreserveElements): +- preserve += 1 +- +- elif type == "EndTag" and preserve: +- preserve -= 1 +- +- elif not preserve and type == "SpaceCharacters" and token["data"]: +- # Test on token["data"] above to not introduce spaces where there were not +- token["data"] = " " +- +- elif not preserve and type == "Characters": +- token["data"] = collapse_spaces(token["data"]) +- +- yield token +- +- +-def collapse_spaces(text): +- return SPACES_REGEX.sub(' ', text) +diff --git a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/html5parser.py b/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/html5parser.py +deleted file mode 100644 +index f7043cb..0000000 +--- a/pipenv/patched/piptools/_vendored/pip/_vendor/html5lib/html5parser.py ++++ /dev/null +@@ -1,2733 +0,0 @@ +-from __future__ import absolute_import, division, unicode_literals +-from pip._vendor.six import with_metaclass, viewkeys, PY3 +- +-import types +- +-try: +- from collections import OrderedDict +-except ImportError: +- from pip._vendor.ordereddict import OrderedDict +- +-from . import _inputstream +-from . import _tokenizer +- +-from . import treebuilders +-from .treebuilders.base import Marker +- +-from . import _utils +-from .constants import ( +- spaceCharacters, asciiUpper2Lower, +- specialElements, headingElements, cdataElements, rcdataElements, +- tokenTypes, tagTokenTypes, +- namespaces, +- htmlIntegrationPointElements, mathmlTextIntegrationPointElements, +- adjustForeignAttributes as adjustForeignAttributesMap, +- adjustMathMLAttributes, adjustSVGAttributes, +- E, +- ReparseException +-) +- +- +-def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): +- """Parse a string or file-like object into a tree""" +- tb = treebuilders.getTreeBuilder(treebuilder) +- p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) +- return p.parse(doc, **kwargs) +- +- +-def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): +- tb = treebuilders.getTreeBuilder(treebuilder) +- p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) +- return p.parseFragment(doc, container=container, **kwargs) +- +- +-def method_decorator_metaclass(function): +- class Decorated(type): +- def __new__(meta, classname, bases, classDict): +- for attributeName, attribute in classDict.items(): +- if isinstance(attribute, types.FunctionType): +- attribute = function(attribute) +- +- classDict[attributeName] = attribute +- return type.__new__(meta, classname, bases, classDict) +- return Decorated +- +- +-class HTMLParser(object): +- """HTML parser. Generates a tree structure from a stream of (possibly +- malformed) HTML""" +- +- def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): +- """ +- strict - raise an exception when a parse error is encountered +- +- tree - a treebuilder class controlling the type of tree that will be +- returned. Built in treebuilders can be accessed through +- html5lib.treebuilders.getTreeBuilder(treeType) +- """ +- +- # Raise an exception on the first error encountered +- self.strict = strict +- +- if tree is None: +- tree = treebuilders.getTreeBuilder("etree") +- self.tree = tree(namespaceHTMLElements) +- self.errors = [] +- +- self.phases = dict([(name, cls(self, self.tree)) for name, cls in +- getPhases(debug).items()]) +- +- def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): +- +- self.innerHTMLMode = innerHTML +- self.container = container +- self.scripting = scripting +- self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) +- self.reset() +- +- try: +- self.mainLoop() +- except ReparseException: +- self.reset() +- self.mainLoop() +- +- def reset(self): +- self.tree.reset() +- self.firstStartTag = False +- self.errors = [] +- self.log = [] # only used with debug mode +- # "quirks" / "limited quirks" / "no quirks" +- self.compatMode = "no quirks" +- +- if self.innerHTMLMode: +- self.innerHTML = self.container.lower() +- +- if self.innerHTML in cdataElements: +- self.tokenizer.state = self.tokenizer.rcdataState +- elif self.innerHTML in rcdataElements: +- self.tokenizer.state = self.tokenizer.rawtextState +- elif self.innerHTML == 'plaintext': +- self.tokenizer.state = self.tokenizer.plaintextState +- else: +- # state already is data state +- # self.tokenizer.state = self.tokenizer.dataState +- pass +- self.phase = self.phases["beforeHtml"] +- self.phase.insertHtmlElement() +- self.resetInsertionMode() +- else: +- self.innerHTML = False # pylint:disable=redefined-variable-type +- self.phase = self.phases["initial"] +- +- self.lastPhase = None +- +- self.beforeRCDataPhase = None +- +- self.framesetOK = True +- +- @property +- def documentEncoding(self): +- """The name of the character encoding +- that was used to decode the input stream, +- or :obj:`None` if that is not determined yet. +- +- """ +- if not hasattr(self, 'tokenizer'): +- return None +- return self.tokenizer.stream.charEncoding[0].name +- +- def isHTMLIntegrationPoint(self, element): +- if (element.name == "annotation-xml" and +- element.namespace == namespaces["mathml"]): +- return ("encoding" in element.attributes and +- element.attributes["encoding"].translate( +- asciiUpper2Lower) in +- ("text/html", "application/xhtml+xml")) +- else: +- return (element.namespace, element.name) in htmlIntegrationPointElements +- +- def isMathMLTextIntegrationPoint(self, element): +- return (element.namespace, element.name) in mathmlTextIntegrationPointElements +- +- def mainLoop(self): +- CharactersToken = tokenTypes["Characters"] +- SpaceCharactersToken = tokenTypes["SpaceCharacters"] +- StartTagToken = tokenTypes["StartTag"] +- EndTagToken = tokenTypes["EndTag"] +- CommentToken = tokenTypes["Comment"] +- DoctypeToken = tokenTypes["Doctype"] +- ParseErrorToken = tokenTypes["ParseError"] +- +- for token in self.normalizedTokens(): +- prev_token = None +- new_token = token +- while new_token is not None: +- prev_token = new_token +- currentNode = self.tree.openElements[-1] if self.tree.openElements else None +- currentNodeNamespace = currentNode.namespace if currentNode else None +- currentNodeName = currentNode.name if currentNode else None +- +- type = new_token["type"] +- +- if type == ParseErrorToken: +- self.parseError(new_token["data"], new_token.get("datavars", {})) +- new_token = None +- else: +- if (len(self.tree.openElements) == 0 or +- currentNodeNamespace == self.tree.defaultNamespace or +- (self.isMathMLTextIntegrationPoint(currentNode) and +- ((type == StartTagToken and +- token["name"] not in frozenset(["mglyph", "malignmark"])) or +- type in (CharactersToken, SpaceCharactersToken))) or +- (currentNodeNamespace == namespaces["mathml"] and +- currentNodeName == "annotation-xml" and +- type == StartTagToken and +- token["name"] == "svg") or +- (self.isHTMLIntegrationPoint(currentNode) and +- type in (StartTagToken, CharactersToken, SpaceCharactersToken))): +- phase = self.phase +- else: +- phase = self.phases["inForeignContent"] +- +- if type == CharactersToken: +- new_token = phase.processCharacters(new_token) +- elif type == SpaceCharactersToken: +- new_token = phase.processSpaceCharacters(new_token) +- elif type == StartTagToken: +- new_token = phase.processStartTag(new_token) +- elif type == EndTagToken: +- new_token = phase.processEndTag(new_token) +- elif type == CommentToken: +- new_token = phase.processComment(new_token) +- elif type == DoctypeToken: +- new_token = phase.processDoctype(new_token) +- +- if (type == StartTagToken and prev_token["selfClosing"] and +- not prev_token["selfClosingAcknowledged"]): +- self.parseError("non-void-element-with-trailing-solidus", +- {"name": prev_token["name"]}) +- +- # When the loop finishes it's EOF +- reprocess = True +- phases = [] +- while reprocess: +- phases.append(self.phase) +- reprocess = self.phase.processEOF() +- if reprocess: +- assert self.phase not in phases +- +- def normalizedTokens(self): +- for token in self.tokenizer: +- yield self.normalizeToken(token) +- +- def parse(self, stream, *args, **kwargs): +- """Parse a HTML document into a well-formed tree +- +- stream - a filelike object or string containing the HTML to be parsed +- +- The optional encoding parameter must be a string that indicates +- the encoding. If specified, that encoding will be used, +- regardless of any BOM or later declaration (such as in a meta +- element) +- +- scripting - treat noscript elements as if javascript was turned on +- """ +- self._parse(stream, False, None, *args, **kwargs) +- return self.tree.getDocument() +- +- def parseFragment(self, stream, *args, **kwargs): +- """Parse a HTML fragment into a well-formed tree fragment +- +- container - name of the element we're setting the innerHTML property +- if set to None, default to 'div' +- +- stream - a filelike object or string containing the HTML to be parsed +- +- The optional encoding parameter must be a string that indicates +- the encoding. If specified, that encoding will be used, +- regardless of any BOM or later declaration (such as in a meta +- element) +- +- scripting - treat noscript elements as if javascript was turned on +- """ +- self._parse(stream, True, *args, **kwargs) +- return self.tree.getFragment() +- +- def parseError(self, errorcode="XXX-undefined-error", datavars=None): +- # XXX The idea is to make errorcode mandatory. +- if datavars is None: +- datavars = {} +- self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) +- if self.strict: +- raise ParseError(E[errorcode] % datavars) +- +- def normalizeToken(self, token): +- """ HTML5 specific normalizations to the token stream """ +- +- if token["type"] == tokenTypes["StartTag"]: +- raw = token["data"] +- token["data"] = OrderedDict(raw) +- if len(raw) > len(token["data"]): +- # we had some duplicated attribute, fix so first wins +- token["data"].update(raw[::-1]) +- +- return token +- +- def adjustMathMLAttributes(self, token): +- adjust_attributes(token, adjustMathMLAttributes) +- +- def adjustSVGAttributes(self, token): +- adjust_attributes(token, adjustSVGAttributes) +- +- def adjustForeignAttributes(self, token): +- adjust_attributes(token, adjustForeignAttributesMap) +- +- def reparseTokenNormal(self, token): +- # pylint:disable=unused-argument +- self.parser.phase() +- +- def resetInsertionMode(self): +- # The name of this method is mostly historical. (It's also used in the +- # specification.) +- last = False +- newModes = { +- "select": "inSelect", +- "td": "inCell", +- "th": "inCell", +- "tr": "inRow", +- "tbody": "inTableBody", +- "thead": "inTableBody", +- "tfoot": "inTableBody", +- "caption": "inCaption", +- "colgroup": "inColumnGroup", +- "table": "inTable", +- "head": "inBody", +- "body": "inBody", +- "frameset": "inFrameset", +- "html": "beforeHead" +- } +- for node in self.tree.openElements[::-1]: +- nodeName = node.name +- new_phase = None +- if node == self.tree.openElements[0]: +- assert self.innerHTML +- last = True +- nodeName = self.innerHTML +- # Check for conditions that should only happen in the innerHTML +- # case +- if nodeName in ("select", "colgroup", "head", "html"): +- assert self.innerHTML +- +- if not last and node.namespace != self.tree.defaultNamespace: +- continue +- +- if nodeName in newModes: +- new_phase = self.phases[newModes[nodeName]] +- break +- elif last: +- new_phase = self.phases["inBody"] +- break +- +- self.phase = new_phase +- +- def parseRCDataRawtext(self, token, contentType): +- """Generic RCDATA/RAWTEXT Parsing algorithm +- contentType - RCDATA or RAWTEXT +- """ +- assert contentType in ("RAWTEXT", "RCDATA") +- +- self.tree.insertElement(token) +- +- if contentType == "RAWTEXT": +- self.tokenizer.state = self.tokenizer.rawtextState +- else: +- self.tokenizer.state = self.tokenizer.rcdataState +- +- self.originalPhase = self.phase +- +- self.phase = self.phases["text"] +- +- +-@_utils.memoize +-def getPhases(debug): +- def log(function): +- """Logger that records which phase processes each token""" +- type_names = dict((value, key) for key, value in +- tokenTypes.items()) +- +- def wrapped(self, *args, **kwargs): +- if function.__name__.startswith("process") and len(args) > 0: +- token = args[0] +- try: +- info = {"type": type_names[token['type']]} +- except: +- raise +- if token['type'] in tagTokenTypes: +- info["name"] = token['name'] +- +- self.parser.log.append((self.parser.tokenizer.state.__name__, +- self.parser.phase.__class__.__name__, +- self.__class__.__name__, +- function.__name__, +- info)) +- return function(self, *args, **kwargs) +- else: +- return function(self, *args, **kwargs) +- return wrapped +- +- def getMetaclass(use_metaclass, metaclass_func): +- if use_metaclass: +- return method_decorator_metaclass(metaclass_func) +- else: +- return type +- +- # pylint:disable=unused-argument +- class Phase(with_metaclass(getMetaclass(debug, log))): +- """Base class for helper object that implements each phase of processing +- """ +- +- def __init__(self, parser, tree): +- self.parser = parser +- self.tree = tree +- +- def processEOF(self): +- raise NotImplementedError +- +- def processComment(self, token): +- # For most phases the following is correct. Where it's not it will be +- # overridden. +- self.tree.insertComment(token, self.tree.openElements[-1]) +- +- def processDoctype(self, token): +- self.parser.parseError("unexpected-doctype") +- +- def processCharacters(self, token): +- self.tree.insertText(token["data"]) +- +- def processSpaceCharacters(self, token): +- self.tree.insertText(token["data"]) +- +- def processStartTag(self, token): +- return self.startTagHandler[token["name"]](token) +- +- def startTagHtml(self, token): +- if not self.parser.firstStartTag and token["name"] == "html": +- self.parser.parseError("non-html-root") +- # XXX Need a check here to see if the first start tag token emitted is +- # this token... If it's not, invoke self.parser.parseError(). +- for attr, value in token["data"].items(): +- if attr not in self.tree.openElements[0].attributes: +- self.tree.openElements[0].attributes[attr] = value +- self.parser.firstStartTag = False +- +- def processEndTag(self, token): +- return self.endTagHandler[token["name"]](token) +- +- class InitialPhase(Phase): +- def processSpaceCharacters(self, token): +- pass +- +- def processComment(self, token): +- self.tree.insertComment(token, self.tree.document) +- +- def processDoctype(self, token): +- name = token["name"] +- publicId = token["publicId"] +- systemId = token["systemId"] +- correct = token["correct"] +- +- if (name != "html" or publicId is not None or +- systemId is not None and systemId != "about:legacy-compat"): +- self.parser.parseError("unknown-doctype") +- +- if publicId is None: +- publicId = "" +- +- self.tree.insertDoctype(token) +- +- if publicId != "": +- publicId = publicId.translate(asciiUpper2Lower) +- +- if (not correct or token["name"] != "html" or +- publicId.startswith( +- ("+//silmaril//dtd html pro v0r11 19970101//", +- "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", +- "-//as//dtd html 3.0 aswedit + extensions//", +- "-//ietf//dtd html 2.0 level 1//", +- "-//ietf//dtd html 2.0 level 2//", +- "-//ietf//dtd html 2.0 strict level 1//", +- "-//ietf//dtd html 2.0 strict level 2//", +- "-//ietf//dtd html 2.0 strict//", +- "-//ietf//dtd html 2.0//", +- "-//ietf//dtd html 2.1e//", +- "-//ietf//dtd html 3.0//", +- "-//ietf//dtd html 3.2 final//", +- "-//ietf//dtd html 3.2//", +- "-//ietf//dtd html 3//", +- "-//ietf//dtd html level 0//", +- "-//ietf//dtd html level 1//", +- "-//ietf//dtd html level 2//", +- "-//ietf//dtd html level 3//", +- "-//ietf//dtd html strict level 0//", +- "-//ietf//dtd html strict level 1//", +- "-//ietf//dtd html strict level 2//", +- "-//ietf//dtd html strict level 3//", +- "-//ietf//dtd html strict//", +- "-//ietf//dtd html//", +- "-//metrius//dtd metrius presentational//", +- "-//microsoft//dtd internet explorer 2.0 html strict//", +- "-//microsoft//dtd internet explorer 2.0 html//", +- "-//microsoft//dtd internet explorer 2.0 tables//", +- "-//microsoft//dtd internet explorer 3.0 html strict//", +- "-//microsoft//dtd internet explorer 3.0 html//", +- "-//microsoft//dtd internet explorer 3.0 tables//", +- "-//netscape comm. corp.//dtd html//", +- "-//netscape comm. corp.//dtd strict html//", +- "-//o'reilly and associates//dtd html 2.0//", +- "-//o'reilly and associates//dtd html extended 1.0//", +- "-//o'reilly and associates//dtd html extended relaxed 1.0//", +- "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", +- "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", +- "-//spyglass//dtd html 2.0 extended//", +- "-//sq//dtd html 2.0 hotmetal + extensions//", +- "-//sun microsystems corp.//dtd hotjava html//", +- "-//sun microsystems corp.//dtd hotjava strict html//", +- "-//w3c//dtd html 3 1995-03-24//", +- "-//w3c//dtd html 3.2 draft//", +- "-//w3c//dtd html 3.2 final//", +- "-//w3c//dtd html 3.2//", +- "-//w3c//dtd html 3.2s draft//", +- "-//w3c//dtd html 4.0 frameset//", +- "-//w3c//dtd html 4.0 transitional//", +- "-//w3c//dtd html experimental 19960712//", +- "-//w3c//dtd html experimental 970421//", +- "-//w3c//dtd w3 html//", +- "-//w3o//dtd w3 html 3.0//", +- "-//webtechs//dtd mozilla html 2.0//", +- "-//webtechs//dtd mozilla html//")) or +- publicId in ("-//w3o//dtd w3 html strict 3.0//en//", +- "-/w3c/dtd html 4.0 transitional/en", +- "html") or +- publicId.startswith( +- ("-//w3c//dtd html 4.01 frameset//", +- "-//w3c//dtd html 4.01 transitional//")) and +- systemId is None or +- systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): +- self.parser.compatMode = "quirks" +- elif (publicId.startswith( +- ("-//w3c//dtd xhtml 1.0 frameset//", +- "-//w3c//dtd xhtml 1.0 transitional//")) or +- publicId.startswith( +- ("-//w3c//dtd html 4.01 frameset//", +- "-//w3c//dtd html 4.01 transitional//")) and +- systemId is not None): +- self.parser.compatMode = "limited quirks" +- +- self.parser.phase = self.parser.phases["beforeHtml"] +- +- def anythingElse(self): +- self.parser.compatMode = "quirks" +- self.parser.phase = self.parser.phases["beforeHtml"] +- +- def processCharacters(self, token): +- self.parser.parseError("expected-doctype-but-got-chars") +- self.anythingElse() +- return token +- +- def processStartTag(self, token): +- self.parser.parseError("expected-doctype-but-got-start-tag", +- {"name": token["name"]}) +- self.anythingElse() +- return token +- +- def processEndTag(self, token): +- self.parser.parseError("expected-doctype-but-got-end-tag", +- {"name": token["name"]}) +- self.anythingElse() +- return token +- +- def processEOF(self): +- self.parser.parseError("expected-doctype-but-got-eof") +- self.anythingElse() +- return True +- +- class BeforeHtmlPhase(Phase): +- # helper methods +- def insertHtmlElement(self): +- self.tree.insertRoot(impliedTagToken("html", "StartTag")) +- self.parser.phase = self.parser.phases["beforeHead"] +- +- # other +- def processEOF(self): +- self.insertHtmlElement() +- return True +- +- def processComment(self, token): +- self.tree.insertComment(token, self.tree.document) +- +- def processSpaceCharacters(self, token): +- pass +- +- def processCharacters(self, token): +- self.insertHtmlElement() +- return token +- +- def processStartTag(self, token): +- if token["name"] == "html": +- self.parser.firstStartTag = True +- self.insertHtmlElement() +- return token +- +- def processEndTag(self, token): +- if token["name"] not in ("head", "body", "html", "br"): +- self.parser.parseError("unexpected-end-tag-before-html", +- {"name": token["name"]}) +- else: +- self.insertHtmlElement() +- return token +- +- class BeforeHeadPhase(Phase): +- def __init__(self, parser, tree): +- Phase.__init__(self, parser, tree) +- +- self.startTagHandler = _utils.MethodDispatcher([ +- ("html", self.startTagHtml), +- ("head", self.startTagHead) +- ]) +- self.startTagHandler.default = self.startTagOther +- +- self.endTagHandler = _utils.MethodDispatcher([ +- (("head", "body", "html", "br"), self.endTagImplyHead) +- ]) +- self.endTagHandler.default = self.endTagOther +- +- def processEOF(self): +- self.startTagHead(impliedTagToken("head", "StartTag")) +- return True +- +- def processSpaceCharacters(self, token): +- pass +- +- def processCharacters(self, token): +- self.startTagHead(impliedTagToken("head", "StartTag")) +- return token +- +- def startTagHtml(self, token): +- return self.parser.phases["inBody"].processStartTag(token) +- +- def startTagHead(self, token): +- self.tree.insertElement(token) +- self.tree.headPointer = self.tree.openElements[-1] +- self.parser.phase = self.parser.phases["inHead"] +- +- def startTagOther(self, token): +- self.startTagHead(impliedTagToken("head", "StartTag")) +- return token +- +- def endTagImplyHead(self, token): +- self.startTagHead(impliedTagToken("head", "StartTag")) +- return token +- +- def endTagOther(self, token): +- self.parser.parseError("end-tag-after-implied-root", +- {"name": token["name"]}) +- +- class InHeadPhase(Phase): +- def __init__(self, parser, tree): +- Phase.__init__(self, parser, tree) +- +- self.startTagHandler = _utils.MethodDispatcher([ +- ("html", self.startTagHtml), +- ("title", self.startTagTitle), +- (("noframes", "style"), self.startTagNoFramesStyle), +- ("noscript", self.startTagNoscript), +- ("script", self.startTagScript), +- (("base", "basefont", "bgsound", "command", "link"), +- self.startTagBaseLinkCommand), +- ("meta", self.startTagMeta), +- ("head", self.startTagHead) +- ]) +- self.startTagHandler.default = self.startTagOther +- +- self.endTagHandler = _utils.MethodDispatcher([ +- ("head", self.endTagHead), +- (("br", "html", "body"), self.endTagHtmlBodyBr) +- ]) +- self.endTagHandler.default = self.endTagOther +- +- # the real thing +- def processEOF(self): +- self.anythingElse() +- return True +- +- def processCharacters(self, token): +- self.anythingElse() +- return token +- +- def startTagHtml(self, token): +- return self.parser.phases["inBody"].processStartTag(token) +- +- def startTagHead(self, token): +- self.parser.parseError("two-heads-are-not-better-than-one") +- +- def startTagBaseLinkCommand(self, token): +- self.tree.insertElement(token) +- self.tree.openElements.pop() +- token["selfClosingAcknowledged"] = True +- +- def startTagMeta(self, token): +- self.tree.insertElement(token) +- self.tree.openElements.pop() +- token["selfClosingAcknowledged"] = True +- +- attributes = token["data"] +- if self.parser.tokenizer.stream.charEncoding[1] == "tentative": +- if "charset" in attributes: +- self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) +- elif ("content" in attributes and +- "http-equiv" in attributes and +- attributes["http-equiv"].lower() == "content-type"): +- # Encoding it as UTF-8 here is a hack, as really we should pass +- # the abstract Unicode string, and just use the +- # ContentAttrParser on that, but using UTF-8 allows all chars +- # to be encoded and as a ASCII-superset works. +- data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) +- parser = _inputstream.ContentAttrParser(data) +- codec = parser.parse() +- self.parser.tokenizer.stream.changeEncoding(codec) +- +- def startTagTitle(self, token): +- self.parser.parseRCDataRawtext(token, "RCDATA") +- +- def startTagNoFramesStyle(self, token): +- # Need to decide whether to implement the scripting-disabled case +- self.parser.parseRCDataRawtext(token, "RAWTEXT") +- +- def startTagNoscript(self, token): +- if self.parser.scripting: +- self.parser.parseRCDataRawtext(token, "RAWTEXT") +- else: +- self.tree.insertElement(token) +- self.parser.phase = self.parser.phases["inHeadNoscript"] +- +- def startTagScript(self, token): +- self.tree.insertElement(token) +- self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState +- self.parser.originalPhase = self.parser.phase +- self.parser.phase = self.parser.phases["text"] +- +- def startTagOther(self, token): +- self.anythingElse() +- return token +- +- def endTagHead(self, token): +- node = self.parser.tree.openElements.pop() +- assert node.name == "head", "Expected head got %s" % node.name +- self.parser.phase = self.parser.phases["afterHead"] +- +- def endTagHtmlBodyBr(self, token): +- self.anythingElse() +- return token +- +- def endTagOther(self, token): +- self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) +- +- def anythingElse(self): +- self.endTagHead(impliedTagToken("head")) +- +- class InHeadNoscriptPhase(Phase): +- def __init__(self, parser, tree): +- Phase.__init__(self, parser, tree) +- +- self.startTagHandler = _utils.MethodDispatcher([ +- ("html", self.startTagHtml), +- (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), +- (("head", "noscript"), self.startTagHeadNoscript), +- ]) +- self.startTagHandler.default = self.startTagOther +- +- self.endTagHandler = _utils.MethodDispatcher([ +- ("noscript", self.endTagNoscript), +- ("br", self.endTagBr), +- ]) +- self.endTagHandler.default = self.endTagOther +- +- def processEOF(self): +- self.parser.parseError("eof-in-head-noscript") +- self.anythingElse() +- return True +- +- def processComment(self, token): +- return self.parser.phases["inHead"].processComment(token) +- +- def processCharacters(self, token): +- self.parser.parseError("char-in-head-noscript") +- self.anythingElse() +- return token +- +- def processSpaceCharacters(self, token): +- return self.parser.phases["inHead"].processSpaceCharacters(token) +- +- def startTagHtml(self, token): +- return self.parser.phases["inBody"].processStartTag(token) +- +- def startTagBaseLinkCommand(self, token): +- return self.parser.phases["inHead"].processStartTag(token) +- +- def startTagHeadNoscript(self, token): +- self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) +- +- def startTagOther(self, token): +- self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) +- self.anythingElse() +- return token +- +- def endTagNoscript(self, token): +- node = self.parser.tree.openElements.pop() +- assert node.name == "noscript", "Expected noscript got %s" % node.name +- self.parser.phase = self.parser.phases["inHead"] +- +- def endTagBr(self, token): +- self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) +- self.anythingElse() +- return token +- +- def endTagOther(self, token): +- self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) +- +- def anythingElse(self): +- # Caller must raise parse error first! +- self.endTagNoscript(impliedTagToken("noscript")) +- +- class AfterHeadPhase(Phase): +- def __init__(self, parser, tree): +- Phase.__init__(self, parser, tree) +- +- self.startTagHandler = _utils.MethodDispatcher([ +- ("html", self.startTagHtml), +- ("body", self.startTagBody), +- ("frameset", self.startTagFrameset), +- (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", +- "style", "title"), +- self.startTagFromHead), +- ("head", self.startTagHead) +- ]) +- self.startTagHandler.default = self.startTagOther +- self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), +- self.endTagHtmlBodyBr)]) +- self.endTagHandler.default = self.endTagOther +- +- def processEOF(self): +- self.anythingElse() +- return True +- +- def processCharacters(self, token): +- self.anythingElse() +- return token +- +- def startTagHtml(self, token): +- return self.parser.phases["inBody"].processStartTag(token) +- +- def startTagBody(self, token): +- self.parser.framesetOK = False +- self.tree.insertElement(token) +- self.parser.phase = self.parser.phases["inBody"] +- +- def startTagFrameset(self, token): +- self.tree.insertElement(token) +- self.parser.phase = self.parser.phases["inFrameset"] +- +- def startTagFromHead(self, token): +- self.parser.parseError("unexpected-start-tag-out-of-my-head", +- {"name": token["name"]}) +- self.tree.openElements.append(self.tree.headPointer) +- self.parser.phases["inHead"].processStartTag(token) +- for node in self.tree.openElements[::-1]: +- if node.name == "head": +- self.tree.openElements.remove(node) +- break +- +- def startTagHead(self, token): +- self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) +- +- def startTagOther(self, token): +- self.anythingElse() +- return token +- +- def endTagHtmlBodyBr(self, token): +- self.anythingElse() +- return token +- +- def endTagOther(self, token): +- self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) +- +- def anythingElse(self): +- self.tree.insertElement(impliedTagToken("body", "StartTag")) +- self.parser.phase = self.parser.phases["inBody"] +- self.parser.framesetOK = True +- +- class InBodyPhase(Phase): +- # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody +- # the really-really-really-very crazy mode +- def __init__(self, parser, tree): +- Phase.__init__(self, parser, tree) +- +- # Set this to the default handler +- self.processSpaceCharacters = self.processSpaceCharactersNonPre +- +- self.startTagHandler = _utils.MethodDispatcher([ +- ("html", self.startTagHtml), +- (("base", "basefont", "bgsound", "command", "link", "meta", +- "script", "style", "title"), +- self.startTagProcessInHead), +- ("body", self.startTagBody), +- ("frameset", self.startTagFrameset), +- (("address", "article", "aside", "blockquote", "center", "details", +- "dir", "div", "dl", "fieldset", "figcaption", "figure", +- "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", +- "section", "summary", "ul"), +- self.startTagCloseP), +- (headingElements, self.startTagHeading), +- (("pre", "listing"), self.startTagPreListing), +- ("form", self.startTagForm), +- (("li", "dd", "dt"), self.startTagListItem), +- ("plaintext", self.startTagPlaintext), +- ("a", self.startTagA), +- (("b", "big", "code", "em", "font", "i", "s", "small", "strike", +- "strong", "tt", "u"), self.startTagFormatting), +- ("nobr", self.startTagNobr), +- ("button", self.startTagButton), +- (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), +- ("xmp", self.startTagXmp), +- ("table", self.startTagTable), +- (("area", "br", "embed", "img", "keygen", "wbr"), +- self.startTagVoidFormatting), +- (("param", "source", "track"), self.startTagParamSource), +- ("input", self.startTagInput), +- ("hr", self.startTagHr), +- ("image", self.startTagImage), +- ("isindex", self.startTagIsIndex), +- ("textarea", self.startTagTextarea), +- ("iframe", self.startTagIFrame), +- ("noscript", self.startTagNoscript), +- (("noembed", "noframes"), self.startTagRawtext), +- ("select", self.startTagSelect), +- (("rp", "rt"), self.startTagRpRt), +- (("option", "optgroup"), self.startTagOpt), +- (("math"), self.startTagMath), +- (("svg"), self.startTagSvg), +- (("caption", "col", "colgroup", "frame", "head", +- "tbody", "td", "tfoot", "th", "thead", +- "tr"), self.startTagMisplaced) +- ]) +- self.startTagHandler.default = self.startTagOther +- +- self.endTagHandler = _utils.MethodDispatcher([ +- ("body", self.endTagBody), +- ("html", self.endTagHtml), +- (("address", "article", "aside", "blockquote", "button", "center", +- "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", +- "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", +- "section", "summary", "ul"), self.endTagBlock), +- ("form", self.endTagForm), +- ("p", self.endTagP), +- (("dd", "dt", "li"), self.endTagListItem), +- (headingElements, self.endTagHeading), +- (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", +- "strike", "strong", "tt", "u"), self.endTagFormatting), +- (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), +- ("br", self.endTagBr), +- ]) +- self.endTagHandler.default = self.endTagOther +- +- def isMatchingFormattingElement(self, node1, node2): +- return (node1.name == node2.name and +- node1.namespace == node2.namespace and +- node1.attributes == node2.attributes) +- +- # helper +- def addFormattingElement(self, token): +- self.tree.insertElement(token) +- element = self.tree.openElements[-1] +- +- matchingElements = [] +- for node in self.tree.activeFormattingElements[::-1]: +- if node is Marker: +- break +- elif self.isMatchingFormattingElement(node, element): +- matchingElements.append(node) +- +- assert len(matchingElements) <= 3 +- if len(matchingElements) == 3: +- self.tree.activeFormattingElements.remove(matchingElements[-1]) +- self.tree.activeFormattingElements.append(element) +- +- # the real deal +- def processEOF(self): +- allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", +- "tfoot", "th", "thead", "tr", "body", +- "html")) +- for node in self.tree.openElements[::-1]: +- if node.name not in allowed_elements: +- self.parser.parseError("expected-closing-tag-but-got-eof") +- break +- # Stop parsing +- +- def processSpaceCharactersDropNewline(self, token): +- # Sometimes (start of
, , and