App Engine Python SDK version 1.9.15

git-svn-id: http://googleappengine.googlecode.com/svn/trunk/python@490 80f5ef21-4148-0410-bacc-cfb02402ada8
diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index 3d9c59c..1d79dff 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -3,8 +3,52 @@
 
 App Engine SDK - Release Notes
 
-Version 1.9.13
+Version 1.9.15
 
+All
+==============================
+- Fixed an issue with Datastore stats not displaying entity counts.
+    https://code.google.com/p/googleappengine/issues/detail?id=9328
+
+Python
+==============================
+- search.GetResponse in the Search API now supports __len__.
+    https://code.google.com/p/googleappengine/issues/detail?id=10340
+- The get_access_token() method of the App Identity API now caches access
+  tokens within the instance.
+- Fixed an issue with Cloud Endpoints where multi-class Python APIs
+  that reused method names could result in incorrect API descriptors.
+    https://code.google.com/p/googleappengine/issues/detail?id=10595
+    https://code.google.com/p/googleappengine/issues/detail?id=11366
+    https://code.google.com/p/googleappengine/issues/detail?id=11373
+
+PHP
+==============================
+- Temporary uploaded files are now unlinked (deleted) if not moved. Empty
+  files not written to a temporary directory are removed.
+    http://stackoverflow.com/questions/21571418/google-app-engine-empty-form
+    -upload-field-submission-issue
+- Fixed an issue with get_define_constraints not returning a Core array.
+    https://code.google.com/p/googleappengine/issues/detail?id=11236
+
+Version 1.9.14
+
+All
+==============================
+- The URL Fetch service will always issue a GET request when it receives
+  and responds to a 302 response; previously it would preserve the original
+  HTTP method. This new behavior is in line with modern conventions (see
+  http://tools.ietf.org/html/rfc7231#section-6.4).  You can
+  use the final_url field of the Response object (or a similar object in other
+  APIs, see
+  https://cloud.google.com/appengine/docs/python/urlfetch/responseobjects)
+  to determine if your fetches are being redirected. If this change affects
+  your application, please contact our support team - even if you do not have
+  a support contract at
+  https://support.google.com/cloud/answer/3420056?hl=en&ref_topic=3473162.
+
+Version 1.9.13
+==============================
 - No changes for 1.9.13
 
 
diff --git a/VERSION b/VERSION
index bd34a5a..4abc0b6 100644
--- a/VERSION
+++ b/VERSION
@@ -1,5 +1,5 @@
-release: "1.9.13"
-timestamp: 1411710077
+release: "1.9.15"
+timestamp: 1413915397
 api_versions: ['1']
 supported_api_versions:
   python:
diff --git a/_php_runtime.py b/_php_runtime.py
index c47660d..4f1d74e 100755
--- a/_php_runtime.py
+++ b/_php_runtime.py
@@ -17,6 +17,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/_python_runtime.py b/_python_runtime.py
index c47660d..4f1d74e 100755
--- a/_python_runtime.py
+++ b/_python_runtime.py
@@ -17,6 +17,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/api_server.py b/api_server.py
index de775b6..833a338 100755
--- a/api_server.py
+++ b/api_server.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/appcfg.py b/appcfg.py
index de775b6..833a338 100755
--- a/appcfg.py
+++ b/appcfg.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/backends_conversion.py b/backends_conversion.py
index de775b6..833a338 100755
--- a/backends_conversion.py
+++ b/backends_conversion.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/bulkload_client.py b/bulkload_client.py
index de775b6..833a338 100755
--- a/bulkload_client.py
+++ b/bulkload_client.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/bulkloader.py b/bulkloader.py
index de775b6..833a338 100755
--- a/bulkloader.py
+++ b/bulkloader.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/dev_appserver.py b/dev_appserver.py
index c47660d..4f1d74e 100755
--- a/dev_appserver.py
+++ b/dev_appserver.py
@@ -17,6 +17,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/download_appstats.py b/download_appstats.py
index de775b6..833a338 100755
--- a/download_appstats.py
+++ b/download_appstats.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/endpointscfg.py b/endpointscfg.py
index de775b6..833a338 100755
--- a/endpointscfg.py
+++ b/endpointscfg.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/gen_protorpc.py b/gen_protorpc.py
index de775b6..833a338 100755
--- a/gen_protorpc.py
+++ b/gen_protorpc.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/google/appengine/api/apiproxy_rpc.py b/google/appengine/api/apiproxy_rpc.py
index a95f0c0..0ed4129 100644
--- a/google/appengine/api/apiproxy_rpc.py
+++ b/google/appengine/api/apiproxy_rpc.py
@@ -28,6 +28,7 @@
 
 
 
+
 import sys
 
 
diff --git a/google/appengine/api/apiproxy_stub.py b/google/appengine/api/apiproxy_stub.py
index f27b609..f3ef604 100644
--- a/google/appengine/api/apiproxy_stub.py
+++ b/google/appengine/api/apiproxy_stub.py
@@ -30,6 +30,7 @@
 
 
 
+
 import random
 import threading
 
diff --git a/google/appengine/api/apiproxy_stub_map.py b/google/appengine/api/apiproxy_stub_map.py
index f4f5787..f9ec3aa 100644
--- a/google/appengine/api/apiproxy_stub_map.py
+++ b/google/appengine/api/apiproxy_stub_map.py
@@ -36,6 +36,7 @@
 
 
 
+
 import inspect
 import sys
 import threading
diff --git a/google/appengine/api/app_identity/app_identity.py b/google/appengine/api/app_identity/app_identity.py
index 448aaa2..3e92c75 100644
--- a/google/appengine/api/app_identity/app_identity.py
+++ b/google/appengine/api/app_identity/app_identity.py
@@ -28,7 +28,9 @@
 
 
 
+
 import os
+import time
 
 from google.appengine.api import apiproxy_stub_map
 from google.appengine.api import memcache
@@ -72,6 +74,26 @@
 _MEMCACHE_NAMESPACE = '_ah_'
 
 
+
+_TOKEN_EXPIRY_SAFETY_MARGIN = 300
+_MAX_TOKEN_CACHE_SIZE = 100
+
+
+_MAX_RANDOM_EXPIRY_DELTA = 60
+
+
+
+
+_access_token_cache = {}
+
+
+
+
+
+_random_cache_expiry_delta = (
+    hash(time.time()) % (_MAX_RANDOM_EXPIRY_DELTA * 1000) / 1000.0)
+
+
 class Error(Exception):
   """Base error type."""
 
@@ -537,7 +559,7 @@
   Each application has an associated Google account. This function returns
   OAuth2 access token corresponding to the running app. Access tokens are safe
   to cache and reuse until their expiry time as returned. This method will
-  do that using memcache.
+  do that using both an in-process cache and memcache.
 
   Args:
     scopes: The requested API scope string, or a list of strings.
@@ -548,16 +570,42 @@
 
 
 
-  memcache_key = _MEMCACHE_KEY_PREFIX + str(scopes)
+  cache_key = _MEMCACHE_KEY_PREFIX + str(scopes)
   if service_account_id:
-    memcache_key += ',%s' % service_account_id
-  memcache_value = memcache.get(memcache_key, namespace=_MEMCACHE_NAMESPACE)
+    cache_key += ',%s' % service_account_id
+
+
+  cached = _access_token_cache.get(cache_key)
+  if cached is not None:
+    access_token, expires_at = cached
+    safe_expiry = (expires_at - _TOKEN_EXPIRY_SAFETY_MARGIN -
+                   _random_cache_expiry_delta)
+    if time.time() < safe_expiry:
+      return access_token, expires_at
+
+
+  memcache_value = memcache.get(cache_key, namespace=_MEMCACHE_NAMESPACE)
   if memcache_value:
     access_token, expires_at = memcache_value
   else:
     access_token, expires_at = get_access_token_uncached(
         scopes, service_account_id=service_account_id)
 
-    memcache.add(memcache_key, (access_token, expires_at), expires_at - 300,
+
+
+
+    memcache_expiry = expires_at - _TOKEN_EXPIRY_SAFETY_MARGIN
+    memcache_expiry -= _MAX_RANDOM_EXPIRY_DELTA
+    memcache_expiry -= 10
+    memcache.add(cache_key, (access_token, expires_at),
+                 memcache_expiry,
                  namespace=_MEMCACHE_NAMESPACE)
+
+
+  if len(_access_token_cache) >= _MAX_TOKEN_CACHE_SIZE:
+
+
+    _access_token_cache.clear()
+  _access_token_cache[cache_key] = (access_token, expires_at)
+
   return access_token, expires_at
diff --git a/google/appengine/api/app_identity/app_identity_keybased_stub.py b/google/appengine/api/app_identity/app_identity_keybased_stub.py
index fab7db6..267305c 100644
--- a/google/appengine/api/app_identity/app_identity_keybased_stub.py
+++ b/google/appengine/api/app_identity/app_identity_keybased_stub.py
@@ -33,6 +33,7 @@
 
 
 
+
 import base64
 import json
 import os
diff --git a/google/appengine/api/app_identity/app_identity_stub.py b/google/appengine/api/app_identity/app_identity_stub.py
index f50776c..64ae88a 100644
--- a/google/appengine/api/app_identity/app_identity_stub.py
+++ b/google/appengine/api/app_identity/app_identity_stub.py
@@ -34,6 +34,7 @@
 
 
 
+
 import binascii
 import time
 
diff --git a/google/appengine/api/app_logging.py b/google/appengine/api/app_logging.py
index b718d0f..d591da8 100644
--- a/google/appengine/api/app_logging.py
+++ b/google/appengine/api/app_logging.py
@@ -33,6 +33,7 @@
 
 
 
+
 import logging
 
 from google.appengine import runtime
diff --git a/google/appengine/api/appinfo.py b/google/appengine/api/appinfo.py
index c4a1e05..b531c3b 100644
--- a/google/appengine/api/appinfo.py
+++ b/google/appengine/api/appinfo.py
@@ -38,6 +38,7 @@
 
 
 
+
 import logging
 import os
 import re
@@ -232,7 +233,11 @@
 BASIC_SCALING = 'basic_scaling'
 VM = 'vm'
 VM_SETTINGS = 'vm_settings'
+BETA_SETTINGS = 'beta_settings'
 VM_HEALTH_CHECK = 'vm_health_check'
+HEALTH_CHECK = 'health_check'
+RESOURCES = 'resources'
+NETWORK = 'network'
 VERSION = 'version'
 MAJOR_VERSION = 'major_version'
 MINOR_VERSION = 'minor_version'
@@ -313,6 +318,14 @@
 HOST = 'host'
 
 
+CPU = 'cpu'
+MEMORY_GB = 'memory_gb'
+
+
+FORWARDED_PORTS = 'forwarded_ports'
+INSTANCE_TAG = 'instance_tag'
+
+
 class _VersionedLibrary(object):
   """A versioned library supported by App Engine."""
 
@@ -1331,7 +1344,7 @@
 class VmSettings(validation.ValidatedDict):
   """Class for VM settings.
 
-  We don't validate these further because the feature is in flux.
+  We don't validate these further here.  They're validated in Olympus.
   """
 
   KEY_VALIDATOR = validation.Regex('[a-zA-Z_][a-zA-Z0-9_]*')
@@ -1348,6 +1361,20 @@
     return VmSettings(**result_vm_settings) if result_vm_settings else None
 
 
+class BetaSettings(VmSettings):
+  """Class for Beta (internal or unreleased) settings.
+
+  This class is meant to replace VmSettings eventually.
+
+  We don't validate these further here.  They're validated in Olympus.
+  """
+
+  @classmethod
+  def Merge(cls, beta_settings_one, beta_settings_two):
+    merged = VmSettings.Merge(beta_settings_one, beta_settings_two)
+    return BetaSettings(**merged.ToDict()) if merged else None
+
+
 class EnvironmentVariables(validation.ValidatedDict):
   """Class representing a mapping of environment variable key value pairs."""
 
@@ -1391,11 +1418,13 @@
       appyaml.vm_settings = VmSettings()
 
 
+
     if runtime == 'dart' or runtime == 'contrib-dart':
       runtime = 'dart'
       appyaml.vm_settings['has_docker_image'] = True
 
 
+
     appyaml.vm_settings['vm_runtime'] = runtime
     appyaml.runtime = 'vm'
   else:
@@ -1421,8 +1450,24 @@
   if appyaml.vm:
     if not appyaml.vm_settings:
       appyaml.vm_settings = VmSettings()
+
     if 'vm_runtime' not in appyaml.vm_settings:
       appyaml = VmSafeSetRuntime(appyaml, appyaml.runtime)
+
+
+    if hasattr(appyaml, 'beta_settings') and appyaml.beta_settings:
+
+
+
+      if 'vm_runtime' not in appyaml.beta_settings:
+
+        appyaml.beta_settings['vm_runtime'] = appyaml.vm_settings[
+            'vm_runtime']
+      if ('has_docker_image' not in appyaml.beta_settings and
+          'has_docker_image' in appyaml.vm_settings):
+        appyaml.beta_settings['has_docker_image'] = appyaml.vm_settings[
+            'has_docker_image']
+
   return appyaml
 
 
@@ -1439,6 +1484,41 @@
       HOST: validation.Optional(validation.TYPE_STR)}
 
 
+class HealthCheck(VmHealthCheck):
+  """Class representing the health check configuration.
+
+  This class is meant to replace VmHealthCheck eventually.
+  """
+  pass
+
+
+class Resources(validation.Validated):
+  """Class representing the configuration of VM resources."""
+
+
+
+
+
+  ATTRIBUTES = {
+      CPU: validation.Optional(validation.TYPE_FLOAT, default=.5),
+      MEMORY_GB: validation.Optional(validation.TYPE_FLOAT, default=1.3)
+  }
+
+
+class Network(validation.Validated):
+  """Class representing the VM network configuration."""
+
+  ATTRIBUTES = {
+
+      FORWARDED_PORTS: validation.Optional(validation.Repeated(validation.Regex(
+          '[0-9]+(:[0-9]+)?'))),
+
+
+      INSTANCE_TAG: validation.Optional(validation.Regex(
+          r'^[a-z\d]([a-z\d-]{0,61}[a-z\d])?$'))
+  }
+
+
 class AppInclude(validation.Validated):
   """Class representing the contents of an included app.yaml file.
 
@@ -1456,6 +1536,7 @@
       MANUAL_SCALING: validation.Optional(ManualScaling),
       VM: validation.Optional(bool),
       VM_SETTINGS: validation.Optional(VmSettings),
+      BETA_SETTINGS: validation.Optional(BetaSettings),
       ENV_VARIABLES: validation.Optional(EnvironmentVariables),
       SKIP_FILES: validation.RegexStr(default=SKIP_NO_FILES),
 
@@ -1516,6 +1597,11 @@
                                        two.vm_settings)
 
 
+    if hasattr(one, 'beta_settings'):
+      one.beta_settings = BetaSettings.Merge(one.beta_settings,
+                                             two.beta_settings)
+
+
 
     one.env_variables = EnvironmentVariables.Merge(one.env_variables,
                                                    two.env_variables)
@@ -1647,7 +1733,11 @@
       BASIC_SCALING: validation.Optional(BasicScaling),
       VM: validation.Optional(bool),
       VM_SETTINGS: validation.Optional(VmSettings),
+      BETA_SETTINGS: validation.Optional(BetaSettings),
       VM_HEALTH_CHECK: validation.Optional(VmHealthCheck),
+      HEALTH_CHECK: validation.Optional(HealthCheck),
+      RESOURCES: validation.Optional(Resources),
+      NETWORK: validation.Optional(Network),
       BUILTINS: validation.Optional(validation.Repeated(BuiltinHandler)),
       INCLUDES: validation.Optional(validation.Type(list)),
       HANDLERS: validation.Optional(validation.Repeated(URLMap), default=[]),
@@ -1739,8 +1829,12 @@
     if self.libraries:
       vm_runtime_python27 = (
           self.runtime == 'vm' and
-          hasattr(self, 'vm_settings') and
-          self.vm_settings['vm_runtime'] == 'python27')
+          (hasattr(self, 'vm_settings') and
+           self.vm_settings and
+           self.vm_settings['vm_runtime'] == 'python27') or
+          (hasattr(self, 'beta_settings') and
+           self.beta_settings and
+           self.beta_settings['vm_runtime'] == 'python27'))
       if not self._skip_runtime_checks and not (
           vm_runtime_python27 or self.runtime == 'python27'):
         raise appinfo_errors.RuntimeDoesNotSupportLibraries(
@@ -1873,12 +1967,15 @@
     """Returns the app's runtime, resolving VMs to the underlying vm_runtime.
 
     Returns:
-      The effective runtime: the value of vm_settings.vm_runtime if runtime is
-      "vm", or runtime otherwise.
+      The effective runtime: the value of beta/vm_settings.vm_runtime if
+      runtime is "vm", or runtime otherwise.
     """
     if (self.runtime == 'vm' and hasattr(self, 'vm_settings')
         and self.vm_settings is not None):
       return self.vm_settings.get('vm_runtime')
+    if (self.runtime == 'vm' and hasattr(self, 'beta_settings')
+        and self.beta_settings is not None):
+      return self.beta_settings.get('vm_runtime')
     return self.runtime
 
 
diff --git a/google/appengine/api/appinfo_errors.py b/google/appengine/api/appinfo_errors.py
index f378fb0..1ad1a42 100644
--- a/google/appengine/api/appinfo_errors.py
+++ b/google/appengine/api/appinfo_errors.py
@@ -30,6 +30,7 @@
 
 
 
+
 class Error(Exception):
   """Base datastore AppInfo type."""
 
diff --git a/google/appengine/api/appinfo_includes.py b/google/appengine/api/appinfo_includes.py
index ab80db0..da8fd8e 100644
--- a/google/appengine/api/appinfo_includes.py
+++ b/google/appengine/api/appinfo_includes.py
@@ -31,6 +31,7 @@
 
 
 
+
 import logging
 import os
 
diff --git a/google/appengine/api/backendinfo.py b/google/appengine/api/backendinfo.py
index 935e465..285bf9d 100644
--- a/google/appengine/api/backendinfo.py
+++ b/google/appengine/api/backendinfo.py
@@ -29,6 +29,7 @@
 
 
 
+
 import os
 import yaml
 from yaml import representer
diff --git a/google/appengine/api/backends/backends.py b/google/appengine/api/backends/backends.py
index a76b5a0..e3b2379 100644
--- a/google/appengine/api/backends/backends.py
+++ b/google/appengine/api/backends/backends.py
@@ -33,6 +33,7 @@
 
 
 
+
 import logging
 import os
 import re
diff --git a/google/appengine/api/background_thread/background_thread.py b/google/appengine/api/background_thread/background_thread.py
index b188775..580d736 100644
--- a/google/appengine/api/background_thread/background_thread.py
+++ b/google/appengine/api/background_thread/background_thread.py
@@ -28,6 +28,7 @@
 """
 
 
+
 __all__ = ['start_new_background_thread',
            'BackgroundThread',
            'Error',
diff --git a/google/appengine/api/blobstore/blobstore.py b/google/appengine/api/blobstore/blobstore.py
index a435122..2b6d553 100644
--- a/google/appengine/api/blobstore/blobstore.py
+++ b/google/appengine/api/blobstore/blobstore.py
@@ -31,6 +31,7 @@
 
 
 
+
 import datetime
 import time
 
diff --git a/google/appengine/api/blobstore/blobstore_stub.py b/google/appengine/api/blobstore/blobstore_stub.py
index 5c0ef1f..9a3ab55 100644
--- a/google/appengine/api/blobstore/blobstore_stub.py
+++ b/google/appengine/api/blobstore/blobstore_stub.py
@@ -33,6 +33,7 @@
 
 
 
+
 import base64
 import os
 import time
diff --git a/google/appengine/api/blobstore/dict_blob_storage.py b/google/appengine/api/blobstore/dict_blob_storage.py
index da03692..b40079f 100644
--- a/google/appengine/api/blobstore/dict_blob_storage.py
+++ b/google/appengine/api/blobstore/dict_blob_storage.py
@@ -33,6 +33,7 @@
 
 
 
+
 import StringIO
 
 from google.appengine.api import blobstore
diff --git a/google/appengine/api/blobstore/file_blob_storage.py b/google/appengine/api/blobstore/file_blob_storage.py
index 391faea..a0edd82 100644
--- a/google/appengine/api/blobstore/file_blob_storage.py
+++ b/google/appengine/api/blobstore/file_blob_storage.py
@@ -33,6 +33,7 @@
 
 
 
+
 import errno
 import os
 
diff --git a/google/appengine/api/capabilities/__init__.py b/google/appengine/api/capabilities/__init__.py
index a44eacd..1aa9b10 100644
--- a/google/appengine/api/capabilities/__init__.py
+++ b/google/appengine/api/capabilities/__init__.py
@@ -55,6 +55,7 @@
 
 
 
+
 import warnings
 
 from google.appengine.api.capabilities import capability_service_pb
diff --git a/google/appengine/api/capabilities/capability_stub.py b/google/appengine/api/capabilities/capability_stub.py
index bfd5da1..0dffe93 100644
--- a/google/appengine/api/capabilities/capability_stub.py
+++ b/google/appengine/api/capabilities/capability_stub.py
@@ -26,6 +26,7 @@
 
 
 
+
 from google.appengine.api import apiproxy_stub
 from google.appengine.api import capabilities
 
diff --git a/google/appengine/api/channel/channel.py b/google/appengine/api/channel/channel.py
index 2758216..cdd0d46 100644
--- a/google/appengine/api/channel/channel.py
+++ b/google/appengine/api/channel/channel.py
@@ -32,6 +32,7 @@
 
 
 
+
 import os
 
 from google.appengine.api import api_base_pb
diff --git a/google/appengine/api/channel/channel_service_stub.py b/google/appengine/api/channel/channel_service_stub.py
index 533064b..c9cc512 100644
--- a/google/appengine/api/channel/channel_service_stub.py
+++ b/google/appengine/api/channel/channel_service_stub.py
@@ -27,6 +27,7 @@
 
 
 
+
 import hashlib
 import logging
 import random
diff --git a/google/appengine/api/conf.py b/google/appengine/api/conf.py
index 56a755d..8921338 100644
--- a/google/appengine/api/conf.py
+++ b/google/appengine/api/conf.py
@@ -22,6 +22,7 @@
 """
 
 
+
 import logging
 import os
 import re
diff --git a/google/appengine/api/croninfo.py b/google/appengine/api/croninfo.py
index 22d228c..949a2a9 100644
--- a/google/appengine/api/croninfo.py
+++ b/google/appengine/api/croninfo.py
@@ -30,6 +30,7 @@
 
 
 
+
 import logging
 import sys
 import traceback
diff --git a/google/appengine/api/datastore.py b/google/appengine/api/datastore.py
index 0324a8f..f01e9bb 100644
--- a/google/appengine/api/datastore.py
+++ b/google/appengine/api/datastore.py
@@ -44,6 +44,7 @@
 
 
 
+
 import heapq
 import itertools
 import logging
diff --git a/google/appengine/api/datastore_admin.py b/google/appengine/api/datastore_admin.py
index c43da53..d518495 100644
--- a/google/appengine/api/datastore_admin.py
+++ b/google/appengine/api/datastore_admin.py
@@ -28,6 +28,7 @@
 
 
 
+
 from google.appengine.api import api_base_pb
 from google.appengine.api import apiproxy_stub_map
 from google.appengine.api import datastore
diff --git a/google/appengine/api/datastore_entities.py b/google/appengine/api/datastore_entities.py
index 6e2fcb1..26fabad 100644
--- a/google/appengine/api/datastore_entities.py
+++ b/google/appengine/api/datastore_entities.py
@@ -35,6 +35,7 @@
 
 
 
+
 import types
 import urlparse
 from xml.sax import saxutils
diff --git a/google/appengine/api/datastore_errors.py b/google/appengine/api/datastore_errors.py
index 54bdffc..a285af5 100644
--- a/google/appengine/api/datastore_errors.py
+++ b/google/appengine/api/datastore_errors.py
@@ -32,6 +32,7 @@
 
 
 
+
 class Error(Exception):
   """Base datastore error type.
   """
diff --git a/google/appengine/api/datastore_file_stub.py b/google/appengine/api/datastore_file_stub.py
index 586a05e..1e326a1 100644
--- a/google/appengine/api/datastore_file_stub.py
+++ b/google/appengine/api/datastore_file_stub.py
@@ -40,6 +40,7 @@
 
 
 
+
 import collections
 import logging
 import os
diff --git a/google/appengine/api/datastore_types.py b/google/appengine/api/datastore_types.py
index a349aab..e183880 100644
--- a/google/appengine/api/datastore_types.py
+++ b/google/appengine/api/datastore_types.py
@@ -43,6 +43,7 @@
 
 
 
+
 import base64
 import calendar
 import datetime
diff --git a/google/appengine/api/dispatchinfo.py b/google/appengine/api/dispatchinfo.py
index 0336c4d..9088500 100644
--- a/google/appengine/api/dispatchinfo.py
+++ b/google/appengine/api/dispatchinfo.py
@@ -27,6 +27,7 @@
 
 
 
+
 import re
 
 from google.appengine.api import appinfo
diff --git a/google/appengine/api/dosinfo.py b/google/appengine/api/dosinfo.py
index 22637ce..c7d2f5f 100644
--- a/google/appengine/api/dosinfo.py
+++ b/google/appengine/api/dosinfo.py
@@ -29,6 +29,7 @@
 
 
 
+
 import re
 import google
 import ipaddr
diff --git a/google/appengine/api/files/__init__.py b/google/appengine/api/files/__init__.py
index acd0c9d..ebafe57 100644
--- a/google/appengine/api/files/__init__.py
+++ b/google/appengine/api/files/__init__.py
@@ -25,6 +25,7 @@
 """
 
 
+
 from file import *
 import blobstore
 import gs
diff --git a/google/appengine/api/files/blobstore.py b/google/appengine/api/files/blobstore.py
index 65d5ea1..72819b9 100644
--- a/google/appengine/api/files/blobstore.py
+++ b/google/appengine/api/files/blobstore.py
@@ -28,6 +28,7 @@
 from __future__ import with_statement
 
 
+
 __all__ = ['create', 'get_blob_key', 'get_file_name']
 
 import hashlib
diff --git a/google/appengine/api/files/crc32c.py b/google/appengine/api/files/crc32c.py
index 4426849..1e90a4b 100644
--- a/google/appengine/api/files/crc32c.py
+++ b/google/appengine/api/files/crc32c.py
@@ -30,6 +30,7 @@
 
 
 
+
 import array
 
 CRC_TABLE = (
diff --git a/google/appengine/api/files/file.py b/google/appengine/api/files/file.py
index 1646d8d..5ee7c3d 100644
--- a/google/appengine/api/files/file.py
+++ b/google/appengine/api/files/file.py
@@ -26,6 +26,7 @@
 from __future__ import with_statement
 
 
+
 __all__ = [
            'ApiTemporaryUnavailableError',
            'BLOBSTORE_FILESYSTEM',
diff --git a/google/appengine/api/files/file_service_stub.py b/google/appengine/api/files/file_service_stub.py
index 07334bb..c8cdf75 100644
--- a/google/appengine/api/files/file_service_stub.py
+++ b/google/appengine/api/files/file_service_stub.py
@@ -21,6 +21,7 @@
 """Stubs for File service."""
 
 
+
 import base64
 import datetime
 import hashlib
diff --git a/google/appengine/api/files/gs.py b/google/appengine/api/files/gs.py
index 9eb40a4..69340e2 100644
--- a/google/appengine/api/files/gs.py
+++ b/google/appengine/api/files/gs.py
@@ -33,6 +33,7 @@
 from __future__ import with_statement
 
 
+
 __all__ = ['create']
 
 import os
diff --git a/google/appengine/api/files/records.py b/google/appengine/api/files/records.py
index 0808931..d06eff0 100644
--- a/google/appengine/api/files/records.py
+++ b/google/appengine/api/files/records.py
@@ -86,6 +86,7 @@
 """
 
 
+
 import logging
 import struct
 
diff --git a/google/appengine/api/files/shuffler.py b/google/appengine/api/files/shuffler.py
index 5f9a86d..2ba0a7f 100644
--- a/google/appengine/api/files/shuffler.py
+++ b/google/appengine/api/files/shuffler.py
@@ -26,6 +26,7 @@
 Files API Shuffler interface"""
 
 
+
 import logging
 
 from google.appengine.api.files import file as files
diff --git a/google/appengine/api/files/testutil.py b/google/appengine/api/files/testutil.py
index 696999c..09a4ab6 100644
--- a/google/appengine/api/files/testutil.py
+++ b/google/appengine/api/files/testutil.py
@@ -26,6 +26,7 @@
 Testing utils for writing tests involving Files API."""
 
 
+
 __all__ = ['TestFileServiceStub']
 
 
diff --git a/google/appengine/api/images/__init__.py b/google/appengine/api/images/__init__.py
index 9320643..7bd2345 100644
--- a/google/appengine/api/images/__init__.py
+++ b/google/appengine/api/images/__init__.py
@@ -37,6 +37,7 @@
 
 
 
+
 import struct
 
 try:
diff --git a/google/appengine/api/labs/taskqueue/__init__.py b/google/appengine/api/labs/taskqueue/__init__.py
index 1e8fb50..caa2499 100644
--- a/google/appengine/api/labs/taskqueue/__init__.py
+++ b/google/appengine/api/labs/taskqueue/__init__.py
@@ -26,6 +26,7 @@
 
 
 
+
 import os
 import warnings
 
diff --git a/google/appengine/api/labs/taskqueue/taskqueue.py b/google/appengine/api/labs/taskqueue/taskqueue.py
index 1dcb061..14b7a72 100644
--- a/google/appengine/api/labs/taskqueue/taskqueue.py
+++ b/google/appengine/api/labs/taskqueue/taskqueue.py
@@ -37,6 +37,8 @@
 
 
 
+
+
 __all__ = [
 
     'BadTaskStateError', 'BadTransactionState', 'BadTransactionStateError',
diff --git a/google/appengine/api/labs/taskqueue/taskqueue_service_pb.py b/google/appengine/api/labs/taskqueue/taskqueue_service_pb.py
index 803f373..071e250 100644
--- a/google/appengine/api/labs/taskqueue/taskqueue_service_pb.py
+++ b/google/appengine/api/labs/taskqueue/taskqueue_service_pb.py
@@ -24,6 +24,7 @@
 """
 
 
+
 from google.appengine.api.taskqueue import taskqueue_service_pb
 
 
diff --git a/google/appengine/api/labs/taskqueue/taskqueue_stub.py b/google/appengine/api/labs/taskqueue/taskqueue_stub.py
index 7fafe87..2037645 100644
--- a/google/appengine/api/labs/taskqueue/taskqueue_stub.py
+++ b/google/appengine/api/labs/taskqueue/taskqueue_stub.py
@@ -37,6 +37,7 @@
 
 
 
+
 import StringIO
 import base64
 import bisect
diff --git a/google/appengine/api/lib_config.py b/google/appengine/api/lib_config.py
index 19e4671..5972f58 100644
--- a/google/appengine/api/lib_config.py
+++ b/google/appengine/api/lib_config.py
@@ -73,6 +73,7 @@
 """
 
 
+
 __all__ = ['DEFAULT_MODNAME',
            'LibConfigRegistry',
            'ConfigHandle',
diff --git a/google/appengine/api/logservice/logservice.py b/google/appengine/api/logservice/logservice.py
index 51da582..5107b0d 100644
--- a/google/appengine/api/logservice/logservice.py
+++ b/google/appengine/api/logservice/logservice.py
@@ -29,6 +29,7 @@
 
 from __future__ import with_statement
 import base64
+import collections
 import cStringIO
 import logging
 import os
@@ -121,15 +122,11 @@
     return self.__last_end_time
 
 
-class LogsBuffer(object):
+class LogsBufferNew(object):
   """Threadsafe buffer for storing and periodically flushing app logs."""
 
-  _MAX_FLUSH_SIZE = 1000 * 1000
-  _MAX_LINE_SIZE = _MAX_FLUSH_SIZE
-  assert _MAX_LINE_SIZE <= _MAX_FLUSH_SIZE
-
   def __init__(self, stream=None, stderr=False):
-    """Initializes the buffer, which wraps the given stream or sys.stderr.
+    """Initializes the buffer, which wraps an internal buffer or sys.stderr.
 
     The state of the LogsBuffer is protected by a separate lock.  The lock is
     acquired before any variables are mutated or accessed, and released
@@ -138,30 +135,49 @@
     'unlock()' calls have been performed.
 
     Args:
-      stream: A file-like object to store logs. Defaults to a cStringIO object.
+      stream: Unused. Left there for backward compatibility.
       stderr: If specified, use sys.stderr as the underlying stream.
+
+    Raises:
+      ValueError: if stream is provided.
     """
+    if stream is not None:
+      raise ValueError('underlying streams are no longer supported')
+
+
+
+
+    self._buffer = collections.deque()
     self._stderr = stderr
-    if self._stderr:
-      assert stream is None
-    else:
-      self._stream = stream or cStringIO.StringIO()
     self._lock = threading.RLock()
     self._reset()
 
+  _MAX_FLUSH_SIZE = 1000 * 1000
+  _MAX_LINE_SIZE = _MAX_FLUSH_SIZE
+
+  @staticmethod
+  def _truncate(line, max_length=_MAX_LINE_SIZE):
+    """Truncates a potentially long log down to a specified maximum length."""
+    if len(line) > max_length:
+      original_length = len(line)
+      suffix = '...(length %d)' % original_length
+      line = line[:max_length - len(suffix)] + suffix
+    return line
+
   def stream(self):
     """Returns the underlying file-like object used to buffer logs."""
     if self._stderr:
 
 
       return sys.stderr
-    else:
-      return self._stream
+
+
+    return cStringIO.StringIO(self.contents())
 
   def lines(self):
     """Returns the number of log lines currently buffered."""
     with self._lock:
-      return self._lines
+      return len(self._buffer)
 
   def bytes(self):
     """Returns the size of the log buffer, in bytes."""
@@ -185,12 +201,7 @@
 
   def _contents(self):
     """Internal version of contents() with no locking."""
-    try:
-      return self.stream().getvalue()
-    except AttributeError:
-
-
-      return ''
+    return ''.join(self._buffer)
 
   def reset(self):
     """Resets the buffer state, without clearing the underlying stream."""
@@ -199,9 +210,7 @@
 
   def _reset(self):
     """Internal version of reset() with no locking."""
-    contents = self._contents()
-    self._bytes = len(contents)
-    self._lines = len(contents.split('\n')) - 1
+    self._bytes = sum(len(line) for line in self._buffer)
     self._flush_time = time.time()
     self._request = logsutil.RequestID()
 
@@ -212,8 +221,7 @@
 
   def _clear(self):
     """Internal version of clear() with no locking."""
-    if self._bytes > 0:
-      self.stream().truncate(0)
+    self._buffer.clear()
     self._reset()
 
   def close(self):
@@ -224,11 +232,12 @@
   def _close(self):
     """Internal version of close() with no locking."""
     self._flush()
-    self.stream().close()
 
   def parse_logs(self):
     """Parse the contents of the buffer and return an array of log lines."""
-    return logsutil.ParseLogs(self.contents())
+    without_newlines = (line[:-1] if line[-1] == '\n' else line
+                        for line in self._buffer)
+    return [logsutil.ParseLogEntry(line) for line in without_newlines if line]
 
   def write(self, line):
     """Writes a line to the logs buffer."""
@@ -240,27 +249,34 @@
     for line in seq:
       self.write(line)
 
+  def _put_line(self, line):
+    """Write the line in the internal buffer for the next flush."""
+    self._buffer.append(line)
+    self._bytes += len(line)
+
+  def _get_line(self):
+    """Get and deque the oldest log line from the internal buffer."""
+    line = self._buffer.popleft()
+    self._bytes -= len(line)
+    return line
+
+  def _rollback_line(self, line):
+    """Write back the line as the oldest in the internal buffer."""
+    self._buffer.appendleft(line)
+    self._bytes += len(line)
+
   def _write(self, line):
     """Writes a line to the logs buffer."""
     if self._request != logsutil.RequestID():
 
 
       self._reset()
-    self.stream().write(line)
-
-    self._lines += 1
-    self._bytes += len(line)
+    if self._stderr:
+      sys.stderr.write(line)
+    else:
+      self._put_line(line)
     self._autoflush()
 
-  @staticmethod
-  def _truncate(line, max_length=_MAX_LINE_SIZE):
-    """Truncates a potentially long log down to a specified maximum length."""
-    if len(line) > max_length:
-      original_length = len(line)
-      suffix = '...(length %d)' % original_length
-      line = line[:max_length - len(suffix)] + suffix
-    return line
-
   def flush(self):
     """Flushes the contents of the logs buffer.
 
@@ -275,36 +291,67 @@
 
   def _flush(self):
     """Internal version of flush() with no locking."""
-    logs = self.parse_logs()
-    self._clear()
+    if self._stderr:
+      sys.stderr.flush()
+      return
 
-    while True:
-      group = log_service_pb.UserAppLogGroup()
-      byte_size = 0
-      n = 0
-      for timestamp_usec, level, message in logs:
+    lines_to_be_flushed = []
+    try:
+      while True:
+        group = log_service_pb.UserAppLogGroup()
+        bytes_left = LogsBufferNew._MAX_FLUSH_SIZE
+        while self._buffer:
+          bare_line = self._get_line()
+
+          timestamp_usec, level, message = logsutil.ParseLogEntry(bare_line)
+
+          if message[-1] == '\n':
+            message = message[:-1]
+
+          if not message:
+            continue
 
 
-        message = self._truncate(message, LogsBuffer._MAX_LINE_SIZE)
+
+          message = LogsBufferNew._truncate(
+              message, LogsBufferNew._MAX_LINE_SIZE)
 
 
-        if byte_size + len(message) > LogsBuffer._MAX_FLUSH_SIZE:
+          if len(message) > bytes_left:
+            self._rollback_line(bare_line)
+            break
+
+          lines_to_be_flushed.append(bare_line)
+
+          line = group.add_log_line()
+          line.set_timestamp_usec(timestamp_usec)
+          line.set_level(level)
+          line.set_message(message)
+
+          bytes_left -= 1 + group.lengthString(line.ByteSize())
+
+        request = log_service_pb.FlushRequest()
+        request.set_logs(group.Encode())
+        response = api_base_pb.VoidProto()
+        apiproxy_stub_map.MakeSyncCall('logservice', 'Flush', request, response)
+        if not self._buffer:
           break
-        line = group.add_log_line()
-        line.set_timestamp_usec(timestamp_usec)
-        line.set_level(level)
-        line.set_message(message)
-        byte_size += 1 + group.lengthString(line.ByteSize())
-        n += 1
-      assert n > 0 or not logs
-      logs = logs[n:]
+    except apiproxy_errors.CancelledError:
 
-      request = log_service_pb.FlushRequest()
-      request.set_logs(group.Encode())
-      response = api_base_pb.VoidProto()
-      apiproxy_stub_map.MakeSyncCall('logservice', 'Flush', request, response)
-      if not logs:
-        break
+
+      lines_to_be_flushed.reverse()
+      self._buffer.extendleft(lines_to_be_flushed)
+    except Exception, e:
+      lines_to_be_flushed.reverse()
+      self._buffer.extendleft(lines_to_be_flushed)
+      if not self._stderr:
+        line = '-' * 80
+        msg = 'ERROR: Could not flush to log_service (%s)\n%s\n%s\n%s\n'
+        sys.stderr.write(msg % (str(e), line, '\n'.join(self._buffer), line))
+      self._clear()
+      raise
+    else:
+      self._clear()
 
   def autoflush(self):
     """Flushes the buffer if certain conditions have been met."""
@@ -326,10 +373,6 @@
     return AUTOFLUSH_ENABLED
 
 
-
-_global_buffer = LogsBuffer(stderr=True)
-
-
 def logs_buffer():
   """Returns the LogsBuffer used by the current request."""
 
@@ -1004,3 +1047,222 @@
     request.set_count(batch_size)
 
   return _LogQueryResult(request, timeout=timeout)
+
+
+
+
+
+
+
+
+
+class LogsBufferOld(object):
+  """Threadsafe buffer for storing and periodically flushing app logs."""
+
+  _MAX_FLUSH_SIZE = 1000 * 1000
+  _MAX_LINE_SIZE = _MAX_FLUSH_SIZE
+  assert _MAX_LINE_SIZE <= _MAX_FLUSH_SIZE
+
+  def __init__(self, stream=None, stderr=False):
+    """Initializes the buffer, which wraps the given stream or sys.stderr.
+
+    The state of the LogsBuffer is protected by a separate lock.  The lock is
+    acquired before any variables are mutated or accessed, and released
+    afterward.  A recursive lock is used so that a single thread can acquire the
+    lock multiple times, and release it only when an identical number of
+    'unlock()' calls have been performed.
+
+    Args:
+      stream: A file-like object to store logs. Defaults to a cStringIO object.
+      stderr: If specified, use sys.stderr as the underlying stream.
+    """
+    self._stderr = stderr
+    if self._stderr:
+      assert stream is None
+    else:
+      self._stream = stream or cStringIO.StringIO()
+    self._lock = threading.RLock()
+    self._reset()
+
+  def stream(self):
+    """Returns the underlying file-like object used to buffer logs."""
+    if self._stderr:
+
+
+      return sys.stderr
+    else:
+      return self._stream
+
+  def lines(self):
+    """Returns the number of log lines currently buffered."""
+    with self._lock:
+      return self._lines
+
+  def bytes(self):
+    """Returns the size of the log buffer, in bytes."""
+    with self._lock:
+      return self._bytes
+
+  def age(self):
+    """Returns the number of seconds since the log buffer was flushed."""
+    with self._lock:
+      return time.time() - self._flush_time
+
+  def flush_time(self):
+    """Returns last time that the log buffer was flushed."""
+    with self._lock:
+      return self._flush_time
+
+  def contents(self):
+    """Returns the contents of the logs buffer."""
+    with self._lock:
+      return self._contents()
+
+  def _contents(self):
+    """Internal version of contents() with no locking."""
+    try:
+      return self.stream().getvalue()
+    except AttributeError:
+
+
+      return ''
+
+  def reset(self):
+    """Resets the buffer state, without clearing the underlying stream."""
+    with self._lock:
+      return self._reset()
+
+  def _reset(self):
+    """Internal version of reset() with no locking."""
+    contents = self._contents()
+    self._bytes = len(contents)
+    self._lines = len(contents.split('\n')) - 1
+    self._flush_time = time.time()
+    self._request = logsutil.RequestID()
+
+  def clear(self):
+    """Clears the contents of the logs buffer, and resets autoflush state."""
+    with self._lock:
+      return self._clear()
+
+  def _clear(self):
+    """Internal version of clear() with no locking."""
+    if self._bytes > 0:
+      self.stream().truncate(0)
+    self._reset()
+
+  def close(self):
+    """Closes the underlying stream, flushing the current contents."""
+    with self._lock:
+      return self._close()
+
+  def _close(self):
+    """Internal version of close() with no locking."""
+    self._flush()
+    self.stream().close()
+
+  def parse_logs(self):
+    """Parse the contents of the buffer and return an array of log lines."""
+    return logsutil.ParseLogs(self.contents())
+
+  def write(self, line):
+    """Writes a line to the logs buffer."""
+    with self._lock:
+      return self._write(line)
+
+  def writelines(self, seq):
+    """Writes each line in the given sequence to the logs buffer."""
+    for line in seq:
+      self.write(line)
+
+  def _write(self, line):
+    """Writes a line to the logs buffer."""
+    if self._request != logsutil.RequestID():
+
+
+      self._reset()
+    self.stream().write(line)
+
+    self._lines += 1
+    self._bytes += len(line)
+    self._autoflush()
+
+  @staticmethod
+  def _truncate(line, max_length=_MAX_LINE_SIZE):
+    """Truncates a potentially long log down to a specified maximum length."""
+    if len(line) > max_length:
+      original_length = len(line)
+      suffix = '...(length %d)' % original_length
+      line = line[:max_length - len(suffix)] + suffix
+    return line
+
+  def flush(self):
+    """Flushes the contents of the logs buffer.
+
+    This method holds the buffer lock until the API call has finished to ensure
+    that flush calls are performed in the correct order, so that log messages
+    written during the flush call aren't dropped or accidentally wiped, and so
+    that the other buffer state variables (flush time, lines, bytes) are updated
+    synchronously with the flush.
+    """
+    with self._lock:
+      self._flush()
+
+  def _flush(self):
+    """Internal version of flush() with no locking."""
+    logs = self.parse_logs()
+    self._clear()
+
+    while True:
+      group = log_service_pb.UserAppLogGroup()
+      byte_size = 0
+      n = 0
+      for timestamp_usec, level, message in logs:
+
+
+        message = self._truncate(message, LogsBufferOld._MAX_LINE_SIZE)
+
+        if byte_size + len(message) > LogsBufferOld._MAX_FLUSH_SIZE:
+          break
+        line = group.add_log_line()
+        line.set_timestamp_usec(timestamp_usec)
+        line.set_level(level)
+        line.set_message(message)
+        byte_size += 1 + group.lengthString(line.ByteSize())
+        n += 1
+      assert n > 0 or not logs
+      logs = logs[n:]
+
+      request = log_service_pb.FlushRequest()
+      request.set_logs(group.Encode())
+      response = api_base_pb.VoidProto()
+      apiproxy_stub_map.MakeSyncCall('logservice', 'Flush', request, response)
+      if not logs:
+        break
+
+  def autoflush(self):
+    """Flushes the buffer if certain conditions have been met."""
+    with self._lock:
+      return self._autoflush()
+
+  def _autoflush(self):
+    """Internal version of autoflush() with no locking."""
+    if not self.autoflush_enabled():
+      return
+
+    if ((AUTOFLUSH_EVERY_SECONDS and self.age() >= AUTOFLUSH_EVERY_SECONDS) or
+        (AUTOFLUSH_EVERY_LINES and self.lines() >= AUTOFLUSH_EVERY_LINES) or
+        (AUTOFLUSH_EVERY_BYTES and self.bytes() >= AUTOFLUSH_EVERY_BYTES)):
+      self._flush()
+
+  def autoflush_enabled(self):
+    """Indicates if the buffer will periodically flush logs during a request."""
+    return AUTOFLUSH_ENABLED
+
+
+
+
+LogsBuffer = LogsBufferOld
+
+
+_global_buffer = LogsBuffer(stderr=True)
diff --git a/google/appengine/api/logservice/logsutil.py b/google/appengine/api/logservice/logsutil.py
index 493ef21..1d0b1f5 100644
--- a/google/appengine/api/logservice/logsutil.py
+++ b/google/appengine/api/logservice/logsutil.py
@@ -19,6 +19,7 @@
 """Utility methods for working with logs."""
 
 
+
 import os
 import time
 
diff --git a/google/appengine/api/mail.py b/google/appengine/api/mail.py
index 09ae32c..3191ee7 100644
--- a/google/appengine/api/mail.py
+++ b/google/appengine/api/mail.py
@@ -33,6 +33,7 @@
 
 
 
+
 import email
 from email import MIMEBase
 from email import MIMEMultipart
diff --git a/google/appengine/api/mail_errors.py b/google/appengine/api/mail_errors.py
index 2b488cf..5f22e16 100644
--- a/google/appengine/api/mail_errors.py
+++ b/google/appengine/api/mail_errors.py
@@ -21,6 +21,7 @@
 """Exceptions raised my mail API."""
 
 
+
 class Error(Exception):
   """Base Mail error type."""
 
diff --git a/google/appengine/api/mail_stub.py b/google/appengine/api/mail_stub.py
index 63239d2..8e6b261 100644
--- a/google/appengine/api/mail_stub.py
+++ b/google/appengine/api/mail_stub.py
@@ -29,6 +29,7 @@
 
 
 
+
 from email import encoders
 from email import MIMEBase
 from email import MIMEMultipart
diff --git a/google/appengine/api/memcache/__init__.py b/google/appengine/api/memcache/__init__.py
index e20515d..0677f04 100644
--- a/google/appengine/api/memcache/__init__.py
+++ b/google/appengine/api/memcache/__init__.py
@@ -31,6 +31,7 @@
 
 
 
+
 import cPickle
 import cStringIO
 import hashlib
diff --git a/google/appengine/api/memcache/memcache_stub.py b/google/appengine/api/memcache/memcache_stub.py
index e07cf6d..75facfe 100644
--- a/google/appengine/api/memcache/memcache_stub.py
+++ b/google/appengine/api/memcache/memcache_stub.py
@@ -26,6 +26,8 @@
 
 
 
+
+
 import logging
 import time
 
diff --git a/google/appengine/api/namespace_manager/namespace_manager.py b/google/appengine/api/namespace_manager/namespace_manager.py
index c6b46b3..d435e81 100644
--- a/google/appengine/api/namespace_manager/namespace_manager.py
+++ b/google/appengine/api/namespace_manager/namespace_manager.py
@@ -31,6 +31,7 @@
 
 
 
+
 import os
 import re
 import warnings
diff --git a/google/appengine/api/oauth/oauth_api.py b/google/appengine/api/oauth/oauth_api.py
index f0b730f..b46ff27 100644
--- a/google/appengine/api/oauth/oauth_api.py
+++ b/google/appengine/api/oauth/oauth_api.py
@@ -42,6 +42,7 @@
 
 
 
+
 import cPickle
 import os
 
diff --git a/google/appengine/api/pagespeedinfo.py b/google/appengine/api/pagespeedinfo.py
index e7cd234..73b0f82 100644
--- a/google/appengine/api/pagespeedinfo.py
+++ b/google/appengine/api/pagespeedinfo.py
@@ -30,6 +30,7 @@
 
 
 
+
 import google
 
 from google.appengine.api import validation
diff --git a/google/appengine/api/prospective_search/prospective_search.py b/google/appengine/api/prospective_search/prospective_search.py
index b336525..3eac3fe 100644
--- a/google/appengine/api/prospective_search/prospective_search.py
+++ b/google/appengine/api/prospective_search/prospective_search.py
@@ -45,6 +45,7 @@
 
 
 
+
 __all__ = ['get_document',
            'get_subscription',
            'list_subscriptions',
diff --git a/google/appengine/api/prospective_search/prospective_search_admin.py b/google/appengine/api/prospective_search/prospective_search_admin.py
index 0989536..052996d 100644
--- a/google/appengine/api/prospective_search/prospective_search_admin.py
+++ b/google/appengine/api/prospective_search/prospective_search_admin.py
@@ -32,6 +32,7 @@
 
 
 
+
 from google.appengine.api import apiproxy_stub_map
 from google.appengine.api.prospective_search import prospective_search_pb
 
diff --git a/google/appengine/api/prospective_search/prospective_search_stub.py b/google/appengine/api/prospective_search/prospective_search_stub.py
index d887b0a..7e07da3 100644
--- a/google/appengine/api/prospective_search/prospective_search_stub.py
+++ b/google/appengine/api/prospective_search/prospective_search_stub.py
@@ -26,6 +26,7 @@
 
 
 
+
 import base64
 import bisect
 
diff --git a/google/appengine/api/queueinfo.py b/google/appengine/api/queueinfo.py
index 3be0cad..c7ba941 100644
--- a/google/appengine/api/queueinfo.py
+++ b/google/appengine/api/queueinfo.py
@@ -134,6 +134,7 @@
 
 
 
+
 from google.appengine.api import appinfo
 from google.appengine.api import validation
 from google.appengine.api import yaml_builder
diff --git a/google/appengine/api/quota.py b/google/appengine/api/quota.py
index 9fe6a86..746f36b 100644
--- a/google/appengine/api/quota.py
+++ b/google/appengine/api/quota.py
@@ -28,6 +28,7 @@
 
 
 
+
 import os
 import warnings
 
diff --git a/google/appengine/api/rdbms.py b/google/appengine/api/rdbms.py
index 5402d77..d1e13a8 100644
--- a/google/appengine/api/rdbms.py
+++ b/google/appengine/api/rdbms.py
@@ -29,6 +29,7 @@
 
 
 
+
 import logging
 
 from google.storage.speckle.python.api import rdbms_apiproxy
diff --git a/google/appengine/api/rdbms_mysqldb.py b/google/appengine/api/rdbms_mysqldb.py
index fac4a14..f1e2b58 100644
--- a/google/appengine/api/rdbms_mysqldb.py
+++ b/google/appengine/api/rdbms_mysqldb.py
@@ -29,6 +29,7 @@
 
 
 
+
 import logging
 import os
 
diff --git a/google/appengine/api/remote_socket/_remote_socket.py b/google/appengine/api/remote_socket/_remote_socket.py
index ecc5e8b..95c28bc 100644
--- a/google/appengine/api/remote_socket/_remote_socket.py
+++ b/google/appengine/api/remote_socket/_remote_socket.py
@@ -37,6 +37,7 @@
 
 
 
+
 import errno
 import os
 import re
diff --git a/google/appengine/api/remote_socket/_remote_socket_stub.py b/google/appengine/api/remote_socket/_remote_socket_stub.py
index 5a8e53b..c328847 100644
--- a/google/appengine/api/remote_socket/_remote_socket_stub.py
+++ b/google/appengine/api/remote_socket/_remote_socket_stub.py
@@ -22,6 +22,7 @@
 from __future__ import with_statement
 
 
+
 import binascii
 import errno
 import os
diff --git a/google/appengine/api/remote_socket/remote_socket_service_pb.py b/google/appengine/api/remote_socket/remote_socket_service_pb.py
index 91d8736..99d4121 100644
--- a/google/appengine/api/remote_socket/remote_socket_service_pb.py
+++ b/google/appengine/api/remote_socket/remote_socket_service_pb.py
@@ -665,6 +665,8 @@
   remote_ip_ = None
   has_app_id_ = 0
   app_id_ = ""
+  has_project_id_ = 0
+  project_id_ = 0
 
   def __init__(self, contents=None):
     self.socket_options_ = []
@@ -777,6 +779,19 @@
 
   def has_app_id(self): return self.has_app_id_
 
+  def project_id(self): return self.project_id_
+
+  def set_project_id(self, x):
+    self.has_project_id_ = 1
+    self.project_id_ = x
+
+  def clear_project_id(self):
+    if self.has_project_id_:
+      self.has_project_id_ = 0
+      self.project_id_ = 0
+
+  def has_project_id(self): return self.has_project_id_
+
 
   def MergeFrom(self, x):
     assert x is not self
@@ -787,6 +802,7 @@
     if (x.has_listen_backlog()): self.set_listen_backlog(x.listen_backlog())
     if (x.has_remote_ip()): self.mutable_remote_ip().MergeFrom(x.remote_ip())
     if (x.has_app_id()): self.set_app_id(x.app_id())
+    if (x.has_project_id()): self.set_project_id(x.project_id())
 
   def Equals(self, x):
     if x is self: return 1
@@ -805,6 +821,8 @@
     if self.has_remote_ip_ and self.remote_ip_ != x.remote_ip_: return 0
     if self.has_app_id_ != x.has_app_id_: return 0
     if self.has_app_id_ and self.app_id_ != x.app_id_: return 0
+    if self.has_project_id_ != x.has_project_id_: return 0
+    if self.has_project_id_ and self.project_id_ != x.project_id_: return 0
     return 1
 
   def IsInitialized(self, debug_strs=None):
@@ -833,6 +851,7 @@
     if (self.has_listen_backlog_): n += 1 + self.lengthVarInt64(self.listen_backlog_)
     if (self.has_remote_ip_): n += 1 + self.lengthString(self.remote_ip_.ByteSize())
     if (self.has_app_id_): n += 1 + self.lengthString(len(self.app_id_))
+    if (self.has_project_id_): n += 1 + self.lengthVarInt64(self.project_id_)
     return n + 2
 
   def ByteSizePartial(self):
@@ -849,6 +868,7 @@
     if (self.has_listen_backlog_): n += 1 + self.lengthVarInt64(self.listen_backlog_)
     if (self.has_remote_ip_): n += 1 + self.lengthString(self.remote_ip_.ByteSizePartial())
     if (self.has_app_id_): n += 1 + self.lengthString(len(self.app_id_))
+    if (self.has_project_id_): n += 1 + self.lengthVarInt64(self.project_id_)
     return n
 
   def Clear(self):
@@ -859,6 +879,7 @@
     self.clear_listen_backlog()
     self.clear_remote_ip()
     self.clear_app_id()
+    self.clear_project_id()
 
   def OutputUnchecked(self, out):
     out.putVarInt32(8)
@@ -883,6 +904,9 @@
     if (self.has_app_id_):
       out.putVarInt32(74)
       out.putPrefixedString(self.app_id_)
+    if (self.has_project_id_):
+      out.putVarInt32(80)
+      out.putVarInt64(self.project_id_)
 
   def OutputPartial(self, out):
     if (self.has_family_):
@@ -909,6 +933,9 @@
     if (self.has_app_id_):
       out.putVarInt32(74)
       out.putPrefixedString(self.app_id_)
+    if (self.has_project_id_):
+      out.putVarInt32(80)
+      out.putVarInt64(self.project_id_)
 
   def TryMerge(self, d):
     while d.avail() > 0:
@@ -943,6 +970,9 @@
       if tt == 74:
         self.set_app_id(d.getPrefixedString())
         continue
+      if tt == 80:
+        self.set_project_id(d.getVarInt64())
+        continue
 
 
       if (tt == 0): raise ProtocolBuffer.ProtocolBufferDecodeError
@@ -971,6 +1001,7 @@
       res+=self.remote_ip_.__str__(prefix + "  ", printElemNumber)
       res+=prefix+">\n"
     if self.has_app_id_: res+=prefix+("app_id: %s\n" % self.DebugFormatString(self.app_id_))
+    if self.has_project_id_: res+=prefix+("project_id: %s\n" % self.DebugFormatInt64(self.project_id_))
     return res
 
 
@@ -984,6 +1015,7 @@
   klisten_backlog = 5
   kremote_ip = 6
   kapp_id = 9
+  kproject_id = 10
 
   _TEXT = _BuildTagLookupTable({
     0: "ErrorCode",
@@ -994,7 +1026,8 @@
     5: "listen_backlog",
     6: "remote_ip",
     9: "app_id",
-  }, 9)
+    10: "project_id",
+  }, 10)
 
   _TYPES = _BuildTagLookupTable({
     0: ProtocolBuffer.Encoder.NUMERIC,
@@ -1005,7 +1038,8 @@
     5: ProtocolBuffer.Encoder.NUMERIC,
     6: ProtocolBuffer.Encoder.STRING,
     9: ProtocolBuffer.Encoder.STRING,
-  }, 9, ProtocolBuffer.Encoder.MAX_TYPE)
+    10: ProtocolBuffer.Encoder.NUMERIC,
+  }, 10, ProtocolBuffer.Encoder.MAX_TYPE)
 
 
   _STYLE = """"""
diff --git a/google/appengine/api/runtime/runtime.py b/google/appengine/api/runtime/runtime.py
index a3599e5..0c7d18a 100644
--- a/google/appengine/api/runtime/runtime.py
+++ b/google/appengine/api/runtime/runtime.py
@@ -33,6 +33,7 @@
 from __future__ import with_statement
 
 
+
 import threading
 
 from google.appengine.api import apiproxy_stub_map
diff --git a/google/appengine/api/search/__init__.py b/google/appengine/api/search/__init__.py
index acaa436..ac9ffc4 100644
--- a/google/appengine/api/search/__init__.py
+++ b/google/appengine/api/search/__init__.py
@@ -21,6 +21,7 @@
 """Search API module."""
 
 from search import AtomField
+from search import AtomFacet
 from search import Cursor
 from search import DateField
 from search import DeleteError
@@ -29,6 +30,13 @@
 from search import DOCUMENT_ID_FIELD_NAME
 from search import Error
 from search import ExpressionError
+from search import Facet
+from search import FacetOptions
+from search import FacetRange
+from search import FacetRefinement
+from search import FacetRequest
+from search import FacetResult
+from search import FacetResultValue
 from search import Field
 from search import FieldExpression
 from search import GeoField
@@ -44,6 +52,9 @@
 from search import MAXIMUM_DOCUMENT_ID_LENGTH
 from search import MAXIMUM_DOCUMENTS_PER_PUT_REQUEST
 from search import MAXIMUM_DOCUMENTS_RETURNED_PER_SEARCH
+from search import MAXIMUM_DEPTH_FOR_FACETED_SEARCH
+from search import MAXIMUM_FACETS_TO_RETURN
+from search import MAXIMUM_FACET_VALUES_TO_RETURN
 from search import MAXIMUM_EXPRESSION_LENGTH
 from search import MAXIMUM_FIELD_ATOM_LENGTH
 from search import MAXIMUM_FIELD_NAME_LENGTH
@@ -57,6 +68,7 @@
 from search import MAXIMUM_SEARCH_OFFSET
 from search import MAXIMUM_SORTED_DOCUMENTS
 from search import NumberField
+from search import NumberFacet
 from search import OperationResult
 from search import PutError
 from search import PutResult
diff --git a/google/appengine/api/search/expression_parser.py b/google/appengine/api/search/expression_parser.py
index edbdc15..662db76 100644
--- a/google/appengine/api/search/expression_parser.py
+++ b/google/appengine/api/search/expression_parser.py
@@ -21,6 +21,7 @@
 """Wrapper for ExpressionParser."""
 
 
+
 from google.appengine._internal import antlr3
 from google.appengine.api.search import ExpressionLexer
 from google.appengine.api.search import ExpressionParser
diff --git a/google/appengine/api/search/search.py b/google/appengine/api/search/search.py
index 27dc8ab..dd7100b 100644
--- a/google/appengine/api/search/search.py
+++ b/google/appengine/api/search/search.py
@@ -27,12 +27,16 @@
 
 
 
+
+
+import base64
 import datetime
 import logging
 import re
 import string
 import sys
 import warnings
+from google.net.proto import ProtocolBuffer
 
 from google.appengine.datastore import document_pb
 from google.appengine.api import apiproxy_stub_map
@@ -48,6 +52,7 @@
 
 __all__ = [
     'AtomField',
+    'AtomFacet',
     'ConcurrentTransactionError',
     'Cursor',
     'DateField',
@@ -57,6 +62,13 @@
     'DOCUMENT_ID_FIELD_NAME',
     'Error',
     'ExpressionError',
+    'Facet',
+    'FacetOptions',
+    'FacetRange',
+    'FacetRefinement',
+    'FacetRequest',
+    'FacetResult',
+    'FacetResultValue',
     'Field',
     'FieldExpression',
     'HtmlField',
@@ -73,6 +85,9 @@
     'MAXIMUM_DOCUMENT_ID_LENGTH',
     'MAXIMUM_DOCUMENTS_PER_PUT_REQUEST',
     'MAXIMUM_DOCUMENTS_RETURNED_PER_SEARCH',
+    'MAXIMUM_DEPTH_FOR_FACETED_SEARCH',
+    'MAXIMUM_FACETS_TO_RETURN',
+    'MAXIMUM_FACET_VALUES_TO_RETURN',
     'MAXIMUM_EXPRESSION_LENGTH',
     'MAXIMUM_FIELD_ATOM_LENGTH',
     'MAXIMUM_FIELD_NAME_LENGTH',
@@ -90,6 +105,7 @@
     'MIN_DATE',
     'MIN_NUMBER_VALUE',
     'NumberField',
+    'NumberFacet',
     'OperationResult',
     'PutError',
     'PutResult',
@@ -118,6 +134,9 @@
 MAXIMUM_EXPRESSION_LENGTH = 5000
 MAXIMUM_QUERY_LENGTH = 2000
 MAXIMUM_DOCUMENTS_RETURNED_PER_SEARCH = 1000
+MAXIMUM_DEPTH_FOR_FACETED_SEARCH = 10000
+MAXIMUM_FACETS_TO_RETURN = 100
+MAXIMUM_FACET_VALUES_TO_RETURN = 100
 MAXIMUM_SEARCH_OFFSET = 1000
 
 MAXIMUM_SORTED_DOCUMENTS = 10000
@@ -560,6 +579,19 @@
   return _ValidateVisiblePrintableAsciiNotReserved(index_name, 'index_name')
 
 
+def _CheckFacetName(name):
+  """Checks facet name is not too long and matches facet name pattern.
+
+  Facet name pattern: "[A-Za-z][A-Za-z0-9_]*".
+
+  Args:
+    name: the name string to validate.
+  Returns:
+    the valid name.
+  """
+  return _CheckFieldName(name)
+
+
 def _CheckFieldName(name):
   """Checks field name is not too long and matches field name pattern.
 
@@ -609,6 +641,24 @@
   return []
 
 
+def _CheckType(obj, obj_type, obj_name):
+  """Check the type of an object."""
+  if not isinstance(obj, obj_type):
+    raise TypeError('%s must be a %s, got %s'
+                    % (obj_name, obj_type, obj.__class__.__name__))
+  return obj
+
+
+def _ConvertToListAndCheckType(arg, element_type, arg_name):
+  """Converts args to a list and check its element type."""
+  ret = _ConvertToList(arg)
+  for element in ret:
+    if not isinstance(element, element_type):
+      raise TypeError('%s should be single element or list of type %s'
+                      % (arg_name, element_type))
+  return ret
+
+
 def _ConvertToUnicodeList(arg):
   """Converts arg to a list of unicode objects."""
   return [_ConvertToUnicode(value) for value in _ConvertToList(arg)]
@@ -892,6 +942,391 @@
     field_value_pb.set_string_value(self.value.encode('utf-8'))
 
 
+class Facet(object):
+  """An abstract base class which represents a facet of a document.
+
+    This class should not be directly instantiated.
+  """
+
+  def __init__(self, name, value):
+    """Initializer.
+
+    Args:
+      name: The name of the facet. Facet names must have maximum length
+        MAXIMUM_FIELD_NAME_LENGTH and match pattern "[A-Za-z][A-Za-z0-9_]*".
+      value: The value of the facet which can be a str, unicode or number.
+
+    Raises:
+      TypeError: If any of the parameters have invalid types, or an unknown
+        attribute is passed.
+      ValueError: If any of the parameters have invalid values.
+    """
+    self._name = _CheckFacetName(_ConvertToUnicode(name))
+    self._value = self._CheckValue(value)
+
+  @property
+  def name(self):
+    """Returns the name of the facet."""
+    return self._name
+
+  @property
+  def value(self):
+    """Returns the value of the facet."""
+    return self._value
+
+  def _CheckValue(self, value):
+    """Checks the value is valid for the given type.
+
+    Args:
+      value: The value to check.
+
+    Returns:
+      The checked value.
+    """
+    raise NotImplementedError('_CheckValue is an abstract method')
+
+  def _CopyStringValueToProtocolBuffer(self, facet_value_pb):
+    """Copies value to a string value in proto buf."""
+    facet_value_pb.set_string_value(self.value.encode('utf-8'))
+
+  def _CopyToProtocolBuffer(self, pb):
+    """Copies facet's contents to a document_pb.Facet proto buffer."""
+    pb.set_name(self.name)
+    if self.value is not None:
+      facet_value_pb = pb.mutable_value()
+      self._CopyValueToProtocolBuffer(facet_value_pb)
+    return pb
+
+  def _AttributeValueList(self):
+    return [self.name, self.value]
+
+  def __eq__(self, other):
+    return (isinstance(other, type(self)) and
+            self._AttributeValueList() == other._AttributeValueList())
+
+  def __ne__(self, other):
+    return not self == other
+
+  def __hash__(self):
+    return hash(self._AttributeValueList())
+
+  def __repr__(self):
+    return _Repr(self, [('name', self.name), ('value', self.value)])
+
+
+class AtomFacet(Facet):
+  """A Facet that has content to be treated as a single token for indexing.
+
+  The following example shows an atom facet named wine_type:
+    AtomFacet(name='wine_type', value='Red')
+  """
+
+  def __init__(self, name, value=None):
+    """Initializer.
+
+    Args:
+      name: The name of the facet.
+      value: A str or unicode object to be treated as an indivisible text value.
+
+    Raises:
+      TypeError: If value is not a string.
+      ValueError: If value is longer than allowed.
+    """
+    Facet.__init__(self, name, _ConvertToUnicode(value))
+
+  def _CheckValue(self, value):
+    return _CheckAtom(value)
+
+  def _CopyValueToProtocolBuffer(self, facet_value_pb):
+    facet_value_pb.set_type(document_pb.FacetValue.ATOM)
+    self._CopyStringValueToProtocolBuffer(facet_value_pb)
+
+
+class NumberFacet(Facet):
+  """A Facet that has a numeric value.
+
+  The following example shows a number facet named wine_vintage:
+    NumberFacet(name='wine_vintage', value=2000)
+  """
+
+  def __init__(self, name, value=None):
+    """Initializer.
+
+    Args:
+      name: The name of the facet.
+      value: A numeric value.
+
+    Raises:
+      TypeError: If value is not numeric.
+      ValueError: If value is out of range.
+    """
+    Facet.__init__(self, name, value)
+
+  def _CheckValue(self, value):
+    value = _CheckNumber(value, 'facet value')
+    if value < MIN_NUMBER_VALUE or value > MAX_NUMBER_VALUE:
+      raise ValueError('value, %d must be between %d and %d' %
+                       (value, MIN_NUMBER_VALUE, MAX_NUMBER_VALUE))
+    return value
+
+  def _CopyValueToProtocolBuffer(self, facet_value_pb):
+    facet_value_pb.set_type(document_pb.FacetValue.NUMBER)
+    facet_value_pb.set_string_value(str(self.value))
+
+
+def _NewFacetFromPb(pb):
+  """Constructs a Facet from a document_pb.Facet protocol buffer."""
+  name = _DecodeUTF8(pb.name())
+  val_type = pb.value().type()
+  value = _DecodeValue(_GetValue(pb.value()), val_type)
+  if val_type == document_pb.FacetValue.ATOM:
+    return AtomFacet(name, value)
+  elif val_type == document_pb.FacetValue.NUMBER:
+    return NumberFacet(name, value)
+  return InvalidRequest('Unknown facet value type %d' % val_type)
+
+
+def _NewFacetsFromPb(facet_list):
+  """Returns a list of Facet copied from a document_pb.Document proto buf."""
+  return [_NewFacetFromPb(f) for f in facet_list]
+
+
+class FacetRange(object):
+  """A facet range with a name, start and end values.
+
+    An example of a FacetRange for good rating is:
+    FacetRange('good', start='3.0', end='3.5')
+  """
+
+  @datastore_rpc._positional(2)
+  def __init__(self, name=None, start=None, end=None):
+    """Initializer.
+
+    Args:
+      name: The name of the range.
+      start: Start value for the range, inclusive.
+      end: End value for the range. exclusive.
+
+    Raises:
+      TypeError: If any of the parameters have invalid types, or an unknown
+        attribute is passed.
+      ValueError: If any of the parameters have invalid values.
+    """
+    self._name = name
+    if start is None and end is None:
+      raise ValueError(
+          'Either start or end need to be provided for a facet range.')
+    none_or_numeric_type = (type(None), int, float, long)
+    self._start = _CheckType(start, none_or_numeric_type, 'start')
+    self._end = _CheckType(end, none_or_numeric_type, 'end')
+
+  @property
+  def name(self):
+    """Returns the name of the range."""
+    return self._name
+
+  @property
+  def start(self):
+    """Returns inclusive start of the range."""
+    return self._start
+
+  @property
+  def end(self):
+    """Returns exclusive end of the range."""
+    return self._end
+
+
+class FacetRequest(object):
+  """A facet to be included in search result.
+
+  An example of a request for a facet only with name:
+    FacetRequest('ExpediteShipping')
+  (in that case, results will always have this facet)
+  Or with a value constraint:
+    FacetRequest('Size', values=['XL','L','M']
+  (results will have this facet with only specified values)
+  Or ranges:
+    FacetRequest('Rating', ranges=[
+        FacetRange('Fair', 1.0, 2.0),
+        FacetRange('Good', 2.0, 3.5),
+        FacetRange('Excelent', 3.5, 4.0)]
+  (results will have this facet with specified ranges)
+  """
+
+  @datastore_rpc._positional(2)
+  def __init__(self, name, value_limit=10, ranges=None, values=None):
+    """Initializer.
+
+    Args:
+      name: The name of the facet.
+      value_limit: Number of values to return if values is not specified.
+      ranges: Range of values to return. Cannot be set with values.
+      values: Specific values to return. Cannot be set with ranges.
+
+    Raises:
+      TypeError: If any of the parameters have invalid types, or an unknown
+        attribute is passed.
+      ValueError: If any of the parameters have invalid values.
+    """
+    self._name = _CheckFacetName(_ConvertToUnicode(name))
+    self._value_limit = _CheckFacetValueLimit(value_limit)
+    if ranges is not None and values is not None:
+      raise ValueError(
+          'Cannot specify both ranges and values.')
+    self._ranges = _ConvertToListAndCheckType(
+        ranges, FacetRange, 'ranges')
+    self._values = _ConvertToListAndCheckType(
+        values, (basestring, int, float, long), 'values')
+
+  @property
+  def name(self):
+    """Returns the name of the facet."""
+    return self._name
+
+  @property
+  def value_limit(self):
+    """Returns number of values to be included in the result."""
+    return self._value_limit
+
+  @property
+  def ranges(self):
+    """Returns FacetRanges of values to be included in the result."""
+    return self._ranges
+
+  @property
+  def values(self):
+    """Returns specific values to be included in the result."""
+    return self._values
+
+  def _CopyToProtocolBuffer(self, facet_request_pb):
+    """Converts this object to a search_service_pb.FacetRequest proto buff."""
+    facet_request_pb.set_name(self.name)
+    request_param_pb = facet_request_pb.mutable_params()
+    request_param_pb.set_value_limit(self.value_limit)
+    for facet_range in self.ranges:
+      range_pb = request_param_pb.add_range()
+      range_pb.set_name(facet_range.name)
+      if facet_range.start is not None:
+        range_pb.set_start(str(facet_range.start))
+      if facet_range.end is not None:
+        range_pb.set_end(str(facet_range.end))
+    for constraint in self.values:
+      request_param_pb.add_value_constraint(constraint)
+
+
+class FacetRefinement(object):
+  """A Facet Refinement to filter out search results based on a facet value.
+
+  NOTE: The recommended way to use facet refinement is to use the token
+  string. Each FacetResult will have a token that is acceptable instead of this
+  class. To provide manual FacetRefinement, an instance of this class can be
+  passed to SearchOptions.
+  NOTE: that either value or facet_range should be set but not both.
+  Example: Request for a range refinement for a numeric facet:
+    FacetRefinement(name='rating', facet_range=FacetRange(start=1.0,end=2.5))
+  """
+
+  @datastore_rpc._positional(2)
+  def __init__(self, name, value=None, facet_range=None):
+    """Initializer.
+
+    Args:
+      name: The name of the facet.
+      value: Value of the facet.
+      facet_range: A FacetRange to refine facet based on a range.
+      FacetRange.name should be empty.
+
+    Raises:
+      TypeError: If any of the parameters have invalid types, or an unknown
+        attribute is passed.
+      ValueError: If any of the parameters have invalid values.
+    """
+    self._name = _ConvertToUnicode(name)
+    if (value is None) == (facet_range is None):
+      raise ValueError('Either value or facet_range should be set but not '
+                       'both.')
+    if facet_range is not None and facet_range.name is not None:
+      logging.warning('FacetRefinement.facet_range.name should be None.')
+    self._value = value
+    self._facet_range = facet_range
+
+  @property
+  def name(self):
+    """Returns name of the facet refinement."""
+    return self._name
+
+  @property
+  def value(self):
+    """Returns value of the facet refinement."""
+    return self._value
+
+  @property
+  def facet_range(self):
+    """Returns range of the facet refinement."""
+    return self._facet_range
+
+  def ToTokenString(self):
+    """Converts this refinement to a token string safe to be used in HTML.
+
+    The format of this string may change.
+
+    Returns:
+      A token string safe to be used in HTML for this facet refinement.
+    """
+    facet_refinement = search_service_pb.FacetRefinement()
+    self._CopyToProtocolBuffer(facet_refinement)
+    return base64.b64encode(facet_refinement.SerializeToString())
+
+  @staticmethod
+  def FromTokenString(token_string):
+    """Converts a token string to a FacetRefinement object.
+
+    Do not store token strings between different versions of API as key could
+    be incompatible.
+
+    Args:
+      token_string: A token string created by ToTokenString method or returned
+      by a search result.
+    Returns:
+      A FacetRefinement object.
+    Raises:
+      ValueError: If the token_string is invalid.
+    """
+    ref_pb = search_service_pb.FacetRefinement()
+
+    try:
+      ref_pb.ParseFromString(base64.b64decode(token_string))
+    except (ProtocolBuffer.ProtocolBufferDecodeError, TypeError), e:
+
+
+      raise ValueError('Invalid refinement token %s' % token_string, e)
+
+    facet_range = None
+    if ref_pb.has_range():
+      range_pb = ref_pb.range()
+      facet_range = FacetRange(
+          name=None,
+          start=float(range_pb.start()) if range_pb.has_start() else None,
+          end=float(range_pb.end()) if range_pb.has_end() else None)
+
+    return FacetRefinement(ref_pb.name(),
+                           value=ref_pb.value() if ref_pb.has_value() else None,
+                           facet_range=facet_range)
+
+  def _CopyToProtocolBuffer(self, facet_refinement_pb):
+    """Copies This object to a search_service_pb.FacetRefinement."""
+    facet_refinement_pb.set_name(self.name)
+    if self.value is not None:
+      facet_refinement_pb.set_value(self.value)
+    if self.facet_range is not None:
+      if self.facet_range.start:
+        facet_refinement_pb.mutable_range().set_start(
+            str(self.facet_range.start))
+      if self.facet_range.end:
+        facet_refinement_pb.mutable_range().set_end(
+            str(self.facet_range.end))
+
+
 def _CopyFieldToProtocolBuffer(field, pb):
   """Copies field's contents to a document_pb.Field protocol buffer."""
   pb.set_name(field.name.encode('utf-8'))
@@ -1223,7 +1658,8 @@
   """
   _FIRST_JAN_2011 = datetime.datetime(2011, 1, 1)
 
-  def __init__(self, doc_id=None, fields=None, language='en', rank=None):
+  def __init__(self, doc_id=None, fields=None, language='en', rank=None,
+               facets=None):
     """Initializer.
 
     Args:
@@ -1238,6 +1674,8 @@
         If not specified, the number of seconds since 1st Jan 2011 is used.
         Documents are returned in descending order of their rank, in absence
         of sorting or scoring options.
+      facets: An iterable of Facet instances representing the facets for this
+        document.
 
     Raises:
       TypeError: If any of the parameters have invalid types, or an unknown
@@ -1249,11 +1687,15 @@
       _CheckDocumentId(doc_id)
     self._doc_id = doc_id
     self._fields = _GetList(fields)
+    self._facets = _GetList(facets)
     self._language = _CheckLanguage(_ConvertToUnicode(language))
 
 
     self._field_map = None
 
+
+    self._facet_map = None
+
     doc_rank = rank
     if doc_rank is None:
       doc_rank = self._GetDefaultRank()
@@ -1272,6 +1714,11 @@
     return self._fields
 
   @property
+  def facets(self):
+    """Returns a list of facets of the document."""
+    return self._facets
+
+  @property
   def language(self):
     """Returns the code of the language the document fields are written in."""
     return self._language
@@ -1300,6 +1747,17 @@
         'Must have exactly one field with name %s, but found %d.' %
         (field_name, len(fields)))
 
+  def facet(self, facet_name):
+    """Returns list of facets with the provided name.
+
+    Args:
+      facet_name: The name of the facet to return.
+
+    Returns:
+      A list of facets with the given name.
+    """
+    return self._BuildFacetMap().get(facet_name, [])
+
   def __getitem__(self, field_name):
     """Returns a list of all fields with the provided field name.
 
@@ -1322,11 +1780,21 @@
   def _BuildFieldMap(self):
     """Lazily build the field map."""
     if self._field_map is None:
-      self._field_map = {}
+      field_map = {}
       for field in self._fields:
-        self._field_map.setdefault(field.name, []).append(field)
+        field_map.setdefault(field.name, []).append(field)
+      self._field_map = field_map
     return self._field_map
 
+  def _BuildFacetMap(self):
+    """Lazily build the facet map."""
+    if self._facet_map is None:
+      facet_map = {}
+      for facet in self._facets:
+        facet_map.setdefault(facet.name, []).append(facet)
+      self._facet_map = facet_map
+    return self._facet_map
+
   def _CheckRank(self, rank):
     """Checks if rank is valid, then returns it."""
     return _CheckInteger(rank, 'rank', upper_bound=sys.maxint)
@@ -1339,12 +1807,13 @@
   def __repr__(self):
     return _Repr(
         self, [('doc_id', self.doc_id), ('fields', self.fields),
-               ('language', self.language), ('rank', self.rank)])
+               ('facets', self.facets), ('language', self.language),
+               ('rank', self.rank)])
 
   def __eq__(self, other):
     return (isinstance(other, type(self)) and self.doc_id == other.doc_id and
             self.rank == other.rank and self.language == other.language
-            and self.fields == other.fields)
+            and self.fields == other.fields and self.facets == other.facets)
 
   def __ne__(self, other):
     return not self == other
@@ -1369,6 +1838,9 @@
   for field in document.fields:
     field_pb = pb.add_field()
     _CopyFieldToProtocolBuffer(field, field_pb)
+  for facet in document.facets:
+    facet_pb = pb.add_facet()
+    facet._CopyToProtocolBuffer(facet_pb)
   pb.set_order_id(document.rank)
   return pb
 
@@ -1386,7 +1858,8 @@
   return Document(doc_id=_DecodeUTF8(doc_pb.id()),
                   fields=_NewFieldsFromPb(doc_pb.field_list()),
                   language=lang,
-                  rank=doc_pb.order_id())
+                  rank=doc_pb.order_id(),
+                  facets=_NewFacetsFromPb(doc_pb.facet_list()))
 
 
 def _QuoteString(argument):
@@ -1725,11 +2198,90 @@
                ('default_value', self.default_value)])
 
 
+class FacetResultValue(object):
+  """A facet value as part of search result."""
+
+  def __init__(self, label, count, refinement):
+    """Initializer.
+
+    Args:
+      label: The label of the facet. Either the name of the facet, user
+        provider range name, or system generated range name.
+      count: Occurrence frequency of the label for the given facet.
+      refinement: The FacetRefinement object for this value. Passing this object
+        or its string token to the next query will refine the result based on
+        this facet value.
+    Raises:
+      TypeError: If any of the parameters have invalid types, or an unknown
+        attribute is passed.
+      ValueError: If any of the parameters have invalid values.
+    """
+    self._label = label
+    self._count = count
+    _CheckType(refinement, FacetRefinement, 'refinement')
+    self._refinement_token = refinement.ToTokenString()
+    self._refinement = refinement
+
+  @property
+  def label(self):
+    """Returns the label for this facet value."""
+    return self._label
+
+  @property
+  def count(self):
+    """Returns the count for this facet value."""
+    return self._count
+
+  @property
+  def refinement_token(self):
+    """Returns the refinement token string for this facet value."""
+    return self._refinement_token
+
+  def __repr__(self):
+    return _Repr(self, [('label', self.label),
+                        ('count', self.count),
+                        ('refinement', self._refinement)])
+
+
+class FacetResult(object):
+  """Represents a facet result returned from a search with faceted search."""
+
+  def __init__(self, name, values=None):
+    """Initializer.
+
+    Args:
+      name: The name of this facet result.
+      values: An iterable of FacetResultValue instances representing values for
+        this document.
+    Raises:
+      TypeError: If any of the parameters have invalid types, or an unknown
+        attribute is passed.
+      ValueError: If any of the parameters have invalid values.
+    """
+    self._name = _ConvertToUnicode(name)
+    self._values = values
+
+  @property
+  def name(self):
+    """Returns the name of this facet result."""
+    return self._name
+
+  @property
+  def values(self):
+    """Returns values for this facet result."""
+    return self._values
+
+  def __repr__(self):
+    return _Repr(self, [('name', self.name),
+                        ('values', self.values)])
+
+
 class ScoredDocument(Document):
   """Represents a scored document returned from a search."""
 
   def __init__(self, doc_id=None, fields=None, language='en',
-               sort_scores=None, expressions=None, cursor=None, rank=None):
+               sort_scores=None, expressions=None, cursor=None, rank=None,
+               facets=None):
     """Initializer.
 
     Args:
@@ -1749,6 +2301,8 @@
         less than sys.maxint. If not specified, the number of seconds since
         1st Jan 2011 is used. Documents are returned in descending order of
         their rank.
+      facets: An iterable of Facet instances representing the facets for this
+        document.
 
     Raises:
       TypeError: If any of the parameters have invalid types, or an unknown
@@ -1756,7 +2310,8 @@
       ValueError: If any of the parameters have invalid values.
     """
     super(ScoredDocument, self).__init__(doc_id=doc_id, fields=fields,
-                                         language=language, rank=rank)
+                                         language=language, rank=rank,
+                                         facets=facets)
     self._sort_scores = self._CheckSortScores(_GetList(sort_scores))
     self._expressions = _GetList(expressions)
     if cursor is not None and not isinstance(cursor, Cursor):
@@ -1824,7 +2379,7 @@
 class SearchResults(object):
   """Represents the result of executing a search request."""
 
-  def __init__(self, number_found, results=None, cursor=None):
+  def __init__(self, number_found, results=None, cursor=None, facets=None):
     """Initializer.
 
     Args:
@@ -1833,6 +2388,8 @@
         search request.
       cursor: A Cursor to continue the search from the end of the
         search results.
+      facets: The list of FacetResults returned from executing a search request
+        with faceted search enabled.
 
     Raises:
       TypeError: If any of the parameters have an invalid type, or an unknown
@@ -1845,6 +2402,7 @@
       raise TypeError('cursor must be a Cursor, got %s' %
                       cursor.__class__.__name__)
     self._cursor = cursor
+    self._facets = _GetList(facets)
 
   def __iter__(self):
 
@@ -1881,10 +2439,16 @@
     """
     return self._cursor
 
+  @property
+  def facets(self):
+    """Return the list of FacetResults that found in matched documents."""
+    return self._facets
+
   def __repr__(self):
     return _Repr(self, [('results', self.results),
                         ('number_found', self.number_found),
-                        ('cursor', self.cursor)])
+                        ('cursor', self.cursor),
+                        ('facets', self.facets)])
 
 
 class GetResponse(object):
@@ -1915,6 +2479,12 @@
     for result in self.results:
       yield result
 
+  def __len__(self):
+    return len(self.results)
+
+  def __getitem__(self, index):
+    return self.results[index]
+
   @property
   def results(self):
     """Returns a list of results ordered by Id from the index."""
@@ -2027,6 +2597,36 @@
       upper_bound=MAXIMUM_DOCUMENTS_RETURNED_PER_SEARCH)
 
 
+def _CheckFacetDepth(depth):
+  """Checks the facet depth to return is an integer within range."""
+  if depth is None:
+    return None
+  else:
+    return _CheckInteger(
+        depth, 'depth', zero_ok=False,
+        upper_bound=MAXIMUM_DEPTH_FOR_FACETED_SEARCH)
+
+
+def _CheckFacetDiscoveryLimit(facet_limit):
+  """Checks the facet limit is an integer within range."""
+  if facet_limit is None:
+    return None
+  else:
+    return _CheckInteger(
+        facet_limit, 'discover_facet_limit',
+        upper_bound=MAXIMUM_FACETS_TO_RETURN)
+
+
+def _CheckFacetValueLimit(value_limit):
+  """Checks the facet value limit is an integer within range."""
+  if value_limit is None:
+    return None
+  else:
+    return _CheckInteger(
+        value_limit, 'facet_value_limit', zero_ok=False,
+        upper_bound=MAXIMUM_FACET_VALUES_TO_RETURN)
+
+
 def _CheckOffset(offset):
   """Checks the offset in document list is an integer within range."""
   return _CheckInteger(
@@ -2058,6 +2658,73 @@
         % (number_expressions, MAXIMUM_FIELDS_RETURNED_PER_SEARCH))
 
 
+class FacetOptions(object):
+  """Options for processing facet reults of a query."""
+
+  @datastore_rpc._positional(1)
+  def __init__(self, discovery_limit=10, discovery_value_limit=None,
+               depth=None):
+    """Initializer.
+
+    Options include number of facets to discover, number of values for each
+    facet and the depth of the result to be considered for facet computation.
+
+    If you wish to discovering 5 facets with 10 values each in 6000 search
+    results, you can use a FacetOption object like this:
+
+    facet_option = FacetOption(discover_facet_limit=5,
+                               discover_facet_value_limit=10,
+                               facet_depth=6000)
+
+    Args:
+      discovery_limit: Number of facets to discover if facet discovery is
+        turned on. If None, discover facets will be disabled.
+      discovery_value_limit: Number of values to be discovered for each of
+        the top discovered facets.
+      depth: Number of documents in query results to evaluate to gather
+        facet information.
+    Raises:
+      TypeError: If an unknown attribute is passed.
+      ValueError: If any of the parameters have invalid values (e.g., a
+        negative facet_depth).
+    """
+    self._discovery_limit = _CheckFacetDiscoveryLimit(discovery_limit)
+    self._discovery_value_limit = _CheckFacetValueLimit(
+        discovery_value_limit)
+    self._depth = _CheckFacetDepth(depth)
+
+  @property
+  def discovery_limit(self):
+    """Returns the number of facets to discover."""
+    return self._discovery_limit
+
+  @property
+  def discovery_value_limit(self):
+    """Returns the number of values to discover for each facet."""
+    return self._discovery_value_limit
+
+  @property
+  def depth(self):
+    """Returns the number of documents to analyze for facet discovery."""
+    return self._depth
+
+  def __repr__(self):
+    return _Repr(
+        self, [('discovery_limit', self.discovery_limit),
+               ('discovery_value_limit', self.discovery_value_limit),
+               ('depth', self._depth)])
+
+  def _CopyToProtocolBuffer(self, params):
+    """Copies a FacetOptions object to a SearchParams proto buff."""
+    if self.discovery_limit is not None:
+      params.set_auto_discover_facet_count(self.discovery_limit)
+    if self.discovery_value_limit is not None:
+      params.mutable_facet_auto_detect_param().set_value_limit(
+          self.discovery_value_limit)
+    if self.depth is not None:
+      params.set_facet_depth(self.depth)
+
+
 class QueryOptions(object):
   """Options for post-processing results for a query.
 
@@ -2285,7 +2952,9 @@
 class Query(object):
   """Represents a request on the search service to query the index."""
 
-  def __init__(self, query_string, options=None):
+  @datastore_rpc._positional(3)
+  def __init__(self, query_string, options=None, enable_facet_discovery=False,
+               return_facets=None, facet_options=None, facet_refinements=None):
 
 
 
@@ -2308,7 +2977,8 @@
                       SortExpression(expression='subject')],
                   limit=1000),
               returned_fields=['author', 'subject', 'summary'],
-              snippeted_fields=['content'])))
+              snippeted_fields=['content']),
+          facet_refinements=[ref_key1, ref_key2]))
 
     In order to get a Cursor, you specify a Cursor in QueryOptions.cursor
     and extract the Cursor for the next request from results.cursor to
@@ -2318,6 +2988,31 @@
           Query(query_string='subject:first good',
                 options=QueryOptions(cursor=results.cursor)))
 
+    To enable faceted search in the result, you can use
+    enable_facet_discovery or return_facets, as shown below:
+
+    # discover top facets
+    results = index.search(
+        Query(query_string='movies',
+              enable_facet_discovery=true))
+
+    # included specific facets with search result
+    results = index.search(
+        Query(query_string='movies',
+              include_facets=['rating', 'shipping_method']))
+
+    # discover only 5 facets and two manual facets with customized value
+    facet_option = FacetOption(discovery_limit=5)
+    facet1 = FacetRequest('Rating', ranges=[
+        FacetRange('Fair', 1.0, 2.0),
+        FacetRange('Good', 2.0, 3.5),
+        FacetRange('Excelent', 3.5, 4.0)]
+    results = index.search(
+        Query(query_string='movies',
+              enable_facet_discovery=true,
+              facet_option=facet_option,
+              include_facets=[facet1, 'shipping_method']))
+
     Args:
       query_string: The query to match against documents in the index. A query
         is a boolean expression containing terms.  For example, the query
@@ -2335,12 +3030,34 @@
         https://developers.google.com/appengine/docs/python/search/overview#Expressions
         for a list of expressions that can be used in queries.
       options: A QueryOptions describing post-processing of search results.
+      enable_facet_discovery: discovery top relevent facets to this search query
+        and return them.
+      return_facets: An iterable of FacetRequest or basestring as facet name to
+        return specific facet with the result.
+      facet_options: A FacetOption describing processing of facets.
+      facet_refinements: An iterable of FacetRefinement objects or refinement
+        token strings used to filter out search results based on a facet value.
+        refinements for different facets will be conjunction and refinements for
+        the same facet will be disjunction.
     Raises:
       QueryError: If the query string is not parseable.
     """
     self._query_string = _ConvertToUnicode(query_string)
     _CheckQuery(self._query_string)
     self._options = options
+    self._facet_options = facet_options
+    self._enable_facet_discovery = enable_facet_discovery
+    self._return_facets = _ConvertToListAndCheckType(
+        return_facets, (basestring, FacetRequest), 'return_facet')
+    for index, facet in enumerate(self._return_facets):
+      if isinstance(facet, basestring):
+        self._return_facets[index] = FacetRequest(self._return_facets[index])
+    self._facet_refinements = _ConvertToListAndCheckType(
+        facet_refinements, (basestring, FacetRefinement), 'facet_refinements')
+    for index, refinement in enumerate(self._facet_refinements):
+      if isinstance(refinement, basestring):
+        self._facet_refinements[index] = FacetRefinement.FromTokenString(
+            refinement)
 
   @property
   def query_string(self):
@@ -2352,6 +3069,26 @@
     """Returns QueryOptions defining post-processing on the search results."""
     return self._options
 
+  @property
+  def facet_options(self):
+    """Returns FacetOptions defining processing of facets."""
+    return self._facet_options
+
+  @property
+  def facet_refinements(self):
+    """Returns list of facet refinements."""
+    return self._facet_refinements
+
+  @property
+  def enable_facet_discovery(self):
+    """Returns true if facet disocery is on."""
+    return self._enable_facet_discovery
+
+  @property
+  def return_facets(self):
+    """Returns the list of specific facets to be included with the result."""
+    return self._return_facets
+
 
 def _CopyQueryToProtocolBuffer(query, params):
   """Copies Query object to params protobuf."""
@@ -2360,10 +3097,19 @@
 
 def _CopyQueryObjectToProtocolBuffer(query, params):
   _CopyQueryToProtocolBuffer(query.query_string, params)
+  for refinement in query.facet_refinements:
+    refinement._CopyToProtocolBuffer(params.add_facet_refinement())
+  for return_facet in query.return_facets:
+    return_facet._CopyToProtocolBuffer(params.add_include_facet())
   options = query.options
   if query.options is None:
     options = QueryOptions()
   _CopyQueryOptionsObjectToProtocolBuffer(query.query_string, options, params)
+  facet_options = query.facet_options
+  if facet_options is None:
+    facet_options = FacetOptions(
+        discovery_limit=10 if query.enable_facet_discovery else None)
+  facet_options._CopyToProtocolBuffer(params)
 
 
 class Index(object):
@@ -2731,9 +3477,32 @@
     return ScoredDocument(
         doc_id=_DecodeUTF8(doc_pb.id()),
         fields=_NewFieldsFromPb(doc_pb.field_list()),
+        facets=_NewFacetsFromPb(doc_pb.facet_list()),
         language=lang, rank=doc_pb.order_id(), sort_scores=sort_scores,
         expressions=_NewFieldsFromPb(expressions), cursor=cursor)
 
+  def _NewFacetResultFromPb(self, facet_result_pb):
+    """Returns a FacetResult populated from search_service FacetResult pb."""
+    values = []
+    for facet_value_pb in facet_result_pb.value_list():
+      refinement_pb = facet_value_pb.refinement()
+      if refinement_pb.has_range():
+        range_pb = refinement_pb.range()
+        facet_range = FacetRange(
+            name=None,
+            start=(float(range_pb.start()) if range_pb.has_start() else None),
+            end=(float(range_pb.end()) if range_pb.has_end() else None))
+      else:
+        facet_range = None
+      refinement = FacetRefinement(
+          name=refinement_pb.name(),
+          value=refinement_pb.value() if refinement_pb.has_value() else None,
+          facet_range=facet_range)
+      values.append(FacetResultValue(label=facet_value_pb.name(),
+                                     count=facet_value_pb.count(),
+                                     refinement=refinement))
+    return FacetResult(name=facet_result_pb.name(), values=values)
+
   def _NewSearchResults(self, response, cursor):
     """Returns a SearchResults populated from a search_service response pb."""
     results = []
@@ -2754,9 +3523,12 @@
 
         results_cursor = Cursor(web_safe_string=_ToWebSafeString(
             cursor.per_result, _DecodeUTF8(response.cursor())))
+    facets = []
+    for facet_result in response.facet_result_list():
+      facets.append(self._NewFacetResultFromPb(facet_result))
     return SearchResults(
         results=results, number_found=response.matched_count(),
-        cursor=results_cursor)
+        cursor=results_cursor, facets=facets)
 
   @datastore_rpc._positional(2)
   def get(self, doc_id, deadline=None):
diff --git a/google/appengine/api/search/search_util.py b/google/appengine/api/search/search_util.py
index 5f188f8..c8edb78 100644
--- a/google/appengine/api/search/search_util.py
+++ b/google/appengine/api/search/search_util.py
@@ -19,6 +19,7 @@
 """Provides utility methods used by modules in the FTS API stub."""
 
 
+
 import datetime
 import re
 
diff --git a/google/appengine/api/search/simple_search_stub.py b/google/appengine/api/search/simple_search_stub.py
index ad0a0a6..3eab265 100644
--- a/google/appengine/api/search/simple_search_stub.py
+++ b/google/appengine/api/search/simple_search_stub.py
@@ -29,6 +29,7 @@
 
 
 
+
 import base64
 import bisect
 import copy
@@ -56,6 +57,7 @@
 from google.appengine.api.search import search_util
 from google.appengine.api.search.stub import document_matcher
 from google.appengine.api.search.stub import expression_evaluator
+from google.appengine.api.search.stub import simple_facet
 from google.appengine.api.search.stub import simple_tokenizer
 from google.appengine.api.search.stub import tokens
 from google.appengine.runtime import apiproxy_errors
@@ -780,6 +782,18 @@
         self._AddSchemaInformation(index, metadata)
       self._AddStorageInformation(index, metadata)
 
+  def _Dynamic_DeleteSchema(self, request, response):
+    """A local implementation of SearchService.DeleteSchema RPC.
+
+    Args:
+      request: A search_service_pb.DeleteSchemaRequest.
+      response: An search_service_pb.DeleteSchemaResponse.
+    """
+
+    params = request.params()
+    for index_spec in params.index_spec_list():
+      response.add_status().set_code(search_service_pb.SearchServiceError.OK)
+
   def _AddSchemaInformation(self, index, metadata_pb):
     schema = index.GetSchema()
     for name in schema:
@@ -945,7 +959,7 @@
         if (isinstance(expression, float) or
             isinstance(expression, long) or
             isinstance(expression, int)):
-          expr.mutable_value().set_string_value(str(expression))
+          expr.mutable_value().set_string_value(repr(float(expression)))
           expr.mutable_value().set_type(document_pb.FieldValue.NUMBER)
         else:
           expr.mutable_value().set_string_value(expression)
@@ -984,8 +998,10 @@
       self._InvalidRequest(response.mutable_status(), e)
       response.set_matched_count(0)
       return
-    response.set_matched_count(len(results))
 
+    facet_analyzer = simple_facet.SimpleFacet(params)
+    results = facet_analyzer.RefineResults(results)
+    response.set_matched_count(len(results))
     offset = 0
     if params.has_cursor():
       try:
@@ -1026,6 +1042,7 @@
     self._FillSearchResponse(results, result_range, params.cursor_type(),
                              _ScoreRequested(params), response, field_names,
                              params.keys_only())
+    facet_analyzer.FillFacetResponse(results, response)
 
     response.mutable_status().set_code(search_service_pb.SearchServiceError.OK)
 
diff --git a/google/appengine/api/search/stub/expression_evaluator.py b/google/appengine/api/search/stub/expression_evaluator.py
index e0b839b..3531725 100644
--- a/google/appengine/api/search/stub/expression_evaluator.py
+++ b/google/appengine/api/search/stub/expression_evaluator.py
@@ -45,6 +45,7 @@
 
 
 import logging
+import math
 
 from google.appengine.datastore import document_pb
 
@@ -94,14 +95,14 @@
     self._case_preserving_tokenizer = simple_tokenizer.SimpleTokenizer(
         preserve_case=True)
     self._function_table = {
-        ExpressionParser.ABS: self._Unsupported('abs'),
+        ExpressionParser.ABS: self._Abs,
         ExpressionParser.COUNT: self._Count,
         ExpressionParser.DISTANCE: self._Distance,
         ExpressionParser.GEOPOINT: self._Geopoint,
-        ExpressionParser.LOG: self._Unsupported('log'),
+        ExpressionParser.LOG: self._Log,
         ExpressionParser.MAX: self._Max,
         ExpressionParser.MIN: self._Min,
-        ExpressionParser.POW: self._Unsupported('pow'),
+        ExpressionParser.POW: self._Pow,
         ExpressionParser.SNIPPET: self._Snippet,
         ExpressionParser.SWITCH: self._Unsupported('switch'),
         }
@@ -152,6 +153,23 @@
     return max(self._Eval(
         node, document_pb.FieldValue.NUMBER) for node in nodes)
 
+  def _Abs(self, return_type, node):
+    if return_type == search_util.EXPRESSION_RETURN_TYPE_TEXT:
+      raise _ExpressionError('Abs cannot be converted to a text type')
+    return abs(self._Eval(node, document_pb.FieldValue.NUMBER))
+
+  def _Log(self, return_type, node):
+    if return_type == search_util.EXPRESSION_RETURN_TYPE_TEXT:
+      raise _ExpressionError('Log cannot be converted to a text type')
+    return math.log(self._Eval(node, document_pb.FieldValue.NUMBER))
+
+  def _Pow(self, return_type, *nodes):
+    if return_type == search_util.EXPRESSION_RETURN_TYPE_TEXT:
+      raise _ExpressionError('Pow cannot be converted to a text type')
+    lhs, rhs = nodes
+    return pow(self._Eval(lhs, document_pb.FieldValue.NUMBER),
+               self._Eval(rhs, document_pb.FieldValue.NUMBER))
+
   def _Distance(self, return_type, *nodes):
     if return_type == search_util.EXPRESSION_RETURN_TYPE_TEXT:
       raise _ExpressionError('Distance cannot be converted to a text type')
diff --git a/google/appengine/api/search/stub/simple_facet.py b/google/appengine/api/search/stub/simple_facet.py
new file mode 100644
index 0000000..926d811
--- /dev/null
+++ b/google/appengine/api/search/stub/simple_facet.py
@@ -0,0 +1,342 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# 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.
+#
+"""A Simple facet analyzer."""
+
+from google.appengine.datastore import document_pb
+
+
+class SimpleFacet(object):
+  """A Simple facet analyzer."""
+
+  def __init__(self, params):
+    self._params = params
+
+  def FillFacetResponse(self, results, response):
+    """Extract facet results and add them to the response."""
+
+
+    manual_facet_map = {}
+    manual_facets = {}
+    for manual_facet in self._params.include_facet_list():
+      manual_facet_map[manual_facet.name()] = manual_facet.params()
+
+
+      if (manual_facet.params().range_list() and
+          manual_facet.params().value_constraint_list()):
+        raise ValueError('Manual facet request should either specify range '
+                         'or value constraint, not both')
+      facet_obj = _Facet(
+          manual_facet.name(),
+          (manual_facet.params().value_limit()
+           if manual_facet.params().has_value_limit()
+           else self._params.facet_auto_detect_param().value_limit()))
+      manual_facets[manual_facet.name()] = facet_obj
+
+
+      for value in manual_facet.params().value_constraint_list():
+        facet_obj.AddValue(value, 0)
+
+
+      for range_pb in manual_facet.params().range_list():
+        range_pair = (
+            float(range_pb.start()) if range_pb.has_start() else None,
+            float(range_pb.end()) if range_pb.has_end() else None)
+        facet_obj.AddValue(range_pb.name(), 0, refinement=range_pair)
+
+    if not manual_facet_map and not self._params.auto_discover_facet_count():
+      return
+    discovered_facets = {}
+
+
+
+    for result in results[:self._params.facet_depth()]:
+      for facet in result.document.facet_list():
+
+        if facet.value().type() == document_pb.FacetValue.ATOM:
+
+          if facet.name() in manual_facet_map:
+            manual_facet_req = manual_facet_map[facet.name()]
+            facet_obj = manual_facets[facet.name()]
+
+
+
+            if not manual_facet_req.range_list() and (
+                not manual_facet_req.value_constraint_list() or
+                facet.value().string_value() in
+                manual_facet_req.value_constraint_list()):
+              facet_obj.AddValue(facet.value().string_value())
+          elif self._params.auto_discover_facet_count():
+            if facet.name() in discovered_facets:
+              facet_obj = discovered_facets[facet.name()]
+            else:
+              facet_obj = discovered_facets[facet.name()] = _Facet(
+                  facet.name(),
+                  self._params.facet_auto_detect_param().value_limit())
+            facet_obj.AddValue(facet.value().string_value())
+
+        elif facet.value().type() == document_pb.FacetValue.NUMBER:
+          facet_value = float(facet.value().string_value())
+          if facet.name() in manual_facet_map:
+            manual_facet_req = manual_facet_map[facet.name()]
+            facet_obj = manual_facets[facet.name()]
+            if manual_facet_req.range_list():
+              for range_pb in manual_facet_req.range_list():
+                range_pair = (
+                    float(range_pb.start()) if range_pb.has_start() else None,
+                    float(range_pb.end()) if range_pb.has_end() else None)
+                if ((range_pair[0] is None or facet_value >= range_pair[0]) and
+                    (range_pair[1] is None or facet_value < range_pair[1])):
+                  facet_obj.AddValue(range_pb.name(), refinement=range_pair)
+            elif manual_facet_req.value_constraint_list():
+              for constraint in manual_facet_req.value_constraint_list():
+                if facet_value == float(constraint):
+                  facet_obj.AddValue(constraint)
+            else:
+              facet_obj.AddNumericValue(facet_value)
+          elif self._params.auto_discover_facet_count():
+            if facet.name() in discovered_facets:
+              facet_obj = discovered_facets[facet.name()]
+            else:
+              facet_obj = discovered_facets[facet.name()] = _Facet(
+                  facet.name(),
+                  self._params.facet_auto_detect_param().value_limit())
+            facet_obj.AddNumericValue(facet_value)
+        else:
+          raise ValueError('Facet type %d is not supported' %
+                           facet.value().type())
+
+
+
+    for facet in manual_facets.values():
+      self._FillResponseForSingleFacet(facet, response.add_facet_result())
+    for facet in  _GetTopN(discovered_facets.values(),
+                           self._params.auto_discover_facet_count()):
+      self._FillResponseForSingleFacet(facet, response.add_facet_result())
+
+  def _FillResponseForSingleFacet(self, facet, facet_result_pb):
+    """Convert a single _Facet to a facet_result_pb."""
+
+
+    if facet.min is not None:
+      facet.AddValue('%s,%s' % (facet.min, facet.max), facet.min_max_count,
+                     (facet.min, facet.max))
+    facet_result_pb.set_name(facet.name)
+    for value in facet.GetTopValues(facet.value_limit):
+      value_pb = facet_result_pb.add_value()
+      ref_pb = value_pb.mutable_refinement()
+
+
+      if value.refinement is not None:
+        if value.refinement[0] is not None:
+          ref_pb.mutable_range().set_start(str(value.refinement[0]))
+        if value.refinement[1] is not None:
+          ref_pb.mutable_range().set_end(str(value.refinement[1]))
+      else:
+
+
+        ref_pb.set_value(str(value.label))
+      ref_pb.set_name(facet.name)
+      value_pb.set_name(str(value.label))
+      value_pb.set_count(value.count)
+
+  def RefineResults(self, results):
+    """Returns refined results using facet refinement parameters."""
+    if not self._params.facet_refinement_list():
+      return results
+
+
+    ref_groups = {}
+    for refinement in self._params.facet_refinement_list():
+      if refinement.name() in ref_groups:
+        ref_groups[refinement.name()].append(refinement)
+      else:
+        ref_groups[refinement.name()] = [refinement]
+
+    return [doc for doc in results
+            if self._MatchFacetRefinements(doc, ref_groups)]
+
+  def _MatchFacetRefinements(self, doc, ref_groups):
+
+
+    return all([self._MatchFacetRefinementSameName(doc, ref_same_names)
+                for ref_same_names in ref_groups.values()])
+
+  def _MatchFacetRefinementSameName(self, doc, ref_same_names):
+
+    return any([self._MatchFacetRefinement(doc, ref)
+                for ref in ref_same_names])
+
+  def _MatchFacetRefinement(self, doc, refinement):
+
+
+    doc_facets = []
+    for facet in doc.document.facet_list():
+      if facet.name() == refinement.name():
+        doc_facets.append(facet)
+    return any([self._MatchSingleFacetRefinement(doc_facet, refinement)
+                for doc_facet in doc_facets])
+
+  def _MatchSingleFacetRefinement(self, doc_facet, refinement):
+
+    if refinement.has_value():
+      if refinement.has_range():
+        raise ValueError('Refinement request for facet %s should either '
+                         'specify range or value constraint, '
+                         'not both.' % refinement.name())
+      facet_value = doc_facet.value().string_value()
+      if doc_facet.value().type() == document_pb.FacetValue.NUMBER:
+        return float(facet_value) == float(refinement.value())
+      else:
+        return facet_value == refinement.value()
+    else:
+      if not refinement.has_range():
+        raise ValueError('Refinement request for facet %s should specify '
+                         'range or value constraint.' % refinement.name())
+
+
+      if doc_facet.value().type() != document_pb.FacetValue.NUMBER:
+        return False
+      facet_value = float(doc_facet.value().string_value())
+      ref_range = refinement.range()
+      start = float(ref_range.start()) if ref_range.has_start() else None
+      end = float(ref_range.end()) if ref_range.has_end() else None
+      return ((start is None or facet_value >= start) and
+              (end is None or facet_value < end))
+
+
+class _FacetValue(object):
+  """A representation of a single facet value."""
+
+  def __init__(self, label, count=0, refinement=None):
+    """Initilizer.
+
+    Args:
+      label: label of this value. can be the actual value or a custom label for
+        ranges. If this is a custom label, refinement should be set.
+      count: Initial number of facets with this value. This number can be
+        increased later.
+      refinement: If this value does not need a custom refinement, this value
+        should be None. If the value needs a range refinement, this value should
+        be a pair representing start and end value for the range.
+    """
+    self._label = label
+    self._count = count
+    self._refinement = refinement
+
+  @property
+  def label(self):
+    return self._label
+
+  @property
+  def count(self):
+    return self._count
+
+  @property
+  def refinement(self):
+    return self._refinement
+
+  def IncCount(self, value):
+    self._count += value
+
+  def __repr__(self):
+    return '_FacetValue(label=%s, count=%d, refinement=%s)' % (self.label,
+                                                               self.count,
+                                                               self.refinement)
+
+
+class _Facet(object):
+  """Simple facet implementation that holds values and overall count."""
+
+  def __init__(self, name, value_limit):
+    """Initilizer.
+
+    Args:
+      name: The name of the facet.
+      value_limit: Maximum number of values for this facet.
+    """
+    self._name = name
+    self._value_limit = value_limit
+    self._values = {}
+    self._count = 0
+    self._min = self._max = None
+    self._min_max_count = 0
+
+  @property
+  def name(self):
+    return self._name
+
+  @property
+  def value_limit(self):
+    return self._value_limit
+
+  @property
+  def count(self):
+    return self._count + self._min_max_count
+
+  @property
+  def min(self):
+    return self._min
+
+  @property
+  def max(self):
+    return self._max
+
+  @property
+  def min_max_count(self):
+    return self._min_max_count
+
+  def AddNumericValue(self, value):
+    """Add value for discovered numeric facets.
+
+    For numeric facets, we only keep minimum and maximum values not the actual
+    value.
+
+    Args:
+      value: numeric value.
+    """
+    if self._min is None or self._min > value:
+      self._min = value
+    if self._max is None or self._max < value:
+      self._max = value
+    self._min_max_count += 1
+
+  def AddValue(self, label, count=1, refinement=None):
+    if label in self._values:
+      self._values[label].IncCount(count)
+    else:
+      self._values[label] = _FacetValue(label, count, refinement)
+    self._count += count
+
+  def GetTopValues(self, n):
+    return _GetTopN(self._values.values(), n)
+
+  def __repr__(self):
+    return '_Facet(name=%s, count=%d, values=%s)' % (
+        self.name, self.count, self._values)
+
+
+def _GetTopN(objects, n):
+  """Returns top n objects with maximum count.
+
+  Args:
+    objects: any object that has count property
+    n: number of top elements to return
+  Returns:
+    top N elements if objects size is greater than N otherwise the map elements
+    in a sorted order.
+  """
+  return sorted(objects, key=lambda o: o.count, reverse=True)[:n]
diff --git a/google/appengine/api/search/stub/simple_tokenizer.py b/google/appengine/api/search/stub/simple_tokenizer.py
index e7f8650..2555193 100644
--- a/google/appengine/api/search/stub/simple_tokenizer.py
+++ b/google/appengine/api/search/stub/simple_tokenizer.py
@@ -21,6 +21,7 @@
 
 
 
+
 import re
 
 
diff --git a/google/appengine/api/search/stub/tokens.py b/google/appengine/api/search/stub/tokens.py
index 5069408..c7101b0 100644
--- a/google/appengine/api/search/stub/tokens.py
+++ b/google/appengine/api/search/stub/tokens.py
@@ -21,6 +21,7 @@
 
 
 
+
 from google.appengine.api.search import search_util
 
 
diff --git a/google/appengine/api/system/system_stub.py b/google/appengine/api/system/system_stub.py
index 50fc990..1b76296 100644
--- a/google/appengine/api/system/system_stub.py
+++ b/google/appengine/api/system/system_stub.py
@@ -26,6 +26,7 @@
 
 
 
+
 import random
 
 from google.appengine.api import apiproxy_stub
diff --git a/google/appengine/api/taskqueue/taskqueue.py b/google/appengine/api/taskqueue/taskqueue.py
index 4c95c11..6a60c3c 100644
--- a/google/appengine/api/taskqueue/taskqueue.py
+++ b/google/appengine/api/taskqueue/taskqueue.py
@@ -43,6 +43,8 @@
 
 
 
+
+
 __all__ = [
 
     'BadTaskStateError', 'BadTransactionState', 'BadTransactionStateError',
diff --git a/google/appengine/api/taskqueue/taskqueue_stub.py b/google/appengine/api/taskqueue/taskqueue_stub.py
index 69a9fb9..af575be 100644
--- a/google/appengine/api/taskqueue/taskqueue_stub.py
+++ b/google/appengine/api/taskqueue/taskqueue_stub.py
@@ -40,6 +40,7 @@
 
 
 
+
 __all__ = []
 
 import base64
diff --git a/google/appengine/api/urlfetch.py b/google/appengine/api/urlfetch.py
index df362a2..6432b6a 100644
--- a/google/appengine/api/urlfetch.py
+++ b/google/appengine/api/urlfetch.py
@@ -33,6 +33,7 @@
 
 
 
+
 import httplib
 import os
 import StringIO
diff --git a/google/appengine/api/urlfetch_errors.py b/google/appengine/api/urlfetch_errors.py
index ca02759..88dc80a 100644
--- a/google/appengine/api/urlfetch_errors.py
+++ b/google/appengine/api/urlfetch_errors.py
@@ -31,6 +31,7 @@
 
 
 
+
 class Error(Exception):
   """Base URL fetcher error type."""
 
diff --git a/google/appengine/api/urlfetch_stub.py b/google/appengine/api/urlfetch_stub.py
index 7468905..0160b06 100644
--- a/google/appengine/api/urlfetch_stub.py
+++ b/google/appengine/api/urlfetch_stub.py
@@ -24,6 +24,7 @@
 
 
 
+
 _successfully_imported_fancy_urllib = False
 _fancy_urllib_InvalidCertException = None
 _fancy_urllib_SSLError = None
diff --git a/google/appengine/api/user_service_stub.py b/google/appengine/api/user_service_stub.py
index 9213912..f8a3fb5 100644
--- a/google/appengine/api/user_service_stub.py
+++ b/google/appengine/api/user_service_stub.py
@@ -22,6 +22,8 @@
 """Trivial implementation of the UserService."""
 
 
+
+
 import os
 import urllib
 import urlparse
diff --git a/google/appengine/api/users.py b/google/appengine/api/users.py
index e17d32f..2401598 100644
--- a/google/appengine/api/users.py
+++ b/google/appengine/api/users.py
@@ -39,6 +39,8 @@
 
 
 
+
+
 import os
 from google.appengine.api import apiproxy_stub_map
 from google.appengine.api import user_service_pb
diff --git a/google/appengine/api/validation.py b/google/appengine/api/validation.py
index 547a904..1a49f1e 100644
--- a/google/appengine/api/validation.py
+++ b/google/appengine/api/validation.py
@@ -45,6 +45,7 @@
 
 
 
+
 import re
 
 import google
diff --git a/google/appengine/api/xmpp/__init__.py b/google/appengine/api/xmpp/__init__.py
index c5c9e19..6240cd0 100644
--- a/google/appengine/api/xmpp/__init__.py
+++ b/google/appengine/api/xmpp/__init__.py
@@ -43,6 +43,7 @@
 
 
 
+
 from google.appengine.api import apiproxy_stub_map
 from google.appengine.api.xmpp import xmpp_service_pb
 from google.appengine.runtime import apiproxy_errors
diff --git a/google/appengine/api/xmpp/xmpp_service_stub.py b/google/appengine/api/xmpp/xmpp_service_stub.py
index 8ebfff8..e2a4817 100644
--- a/google/appengine/api/xmpp/xmpp_service_stub.py
+++ b/google/appengine/api/xmpp/xmpp_service_stub.py
@@ -28,6 +28,7 @@
 
 
 
+
 import logging
 import os
 
diff --git a/google/appengine/api/yaml_builder.py b/google/appengine/api/yaml_builder.py
index dc5fb58..88e3754 100644
--- a/google/appengine/api/yaml_builder.py
+++ b/google/appengine/api/yaml_builder.py
@@ -32,6 +32,7 @@
 
 
 
+
 from google.appengine.api import yaml_errors
 from google.appengine.api import yaml_listener
 
diff --git a/google/appengine/api/yaml_errors.py b/google/appengine/api/yaml_errors.py
index 9afd3a9..fdd0a4a 100644
--- a/google/appengine/api/yaml_errors.py
+++ b/google/appengine/api/yaml_errors.py
@@ -23,6 +23,7 @@
 
 
 
+
 class Error(Exception):
   """Base datastore yaml error type."""
 
diff --git a/google/appengine/api/yaml_listener.py b/google/appengine/api/yaml_listener.py
index 0b0a41f..abccc73 100644
--- a/google/appengine/api/yaml_listener.py
+++ b/google/appengine/api/yaml_listener.py
@@ -25,6 +25,7 @@
 """
 
 
+
 from google.appengine.api import yaml_errors
 import yaml
 
diff --git a/google/appengine/api/yaml_object.py b/google/appengine/api/yaml_object.py
index 4e7391b..6c9ae84 100644
--- a/google/appengine/api/yaml_object.py
+++ b/google/appengine/api/yaml_object.py
@@ -32,6 +32,7 @@
 
 
 
+
 from google.appengine.api import validation
 from google.appengine.api import yaml_listener
 from google.appengine.api import yaml_builder
diff --git a/google/appengine/client/services/port_manager.py b/google/appengine/client/services/port_manager.py
index 3ed1bda..5af9d92 100644
--- a/google/appengine/client/services/port_manager.py
+++ b/google/appengine/client/services/port_manager.py
@@ -51,8 +51,8 @@
   """Construct a PortManager object with port forwarding configured.
 
   Args:
-    forwarded_ports: A dictionary containing desired mappings from VM host port
-        to docker container port.
+    forwarded_ports: A string containing desired mappings from VM host ports
+        to docker container ports.
     container_port: An integer port number for the container port.
 
   Returns:
diff --git a/google/appengine/client/services/vme_errors.py b/google/appengine/client/services/vme_errors.py
index 9d4644b..26a28f6 100644
--- a/google/appengine/client/services/vme_errors.py
+++ b/google/appengine/client/services/vme_errors.py
@@ -186,10 +186,6 @@
   """Thrown if there was a timeout with a ReplicaPool operation."""
 
 
-class MigrateDuplicateZoneError(PermanentAppError):
-  """Thrown if attempted to migrating a replica pool to its existing zone."""
-
-
 class ReplicaPoolTransientError(TransientError):
   """Thrown if there was an 5xx HttpError from the ReplicaPool service."""
 
diff --git a/google/appengine/cron/GrocParser.py b/google/appengine/cron/GrocParser.py
index 3f5c2c3..554bc0d 100644
--- a/google/appengine/cron/GrocParser.py
+++ b/google/appengine/cron/GrocParser.py
@@ -51,6 +51,7 @@
 
 
 
+
 allOrdinals = set([1, 2, 3, 4, 5])
 numOrdinals = len(allOrdinals)
 
diff --git a/google/appengine/cron/groc.py b/google/appengine/cron/groc.py
index e907d2a..172c3df 100644
--- a/google/appengine/cron/groc.py
+++ b/google/appengine/cron/groc.py
@@ -26,6 +26,7 @@
 """A wrapper around the generated Groc parser and lexer."""
 
 
+
 import google
 
 import antlr3
diff --git a/google/appengine/cron/groctimespecification.py b/google/appengine/cron/groctimespecification.py
index b0ad14f..e4d4394 100644
--- a/google/appengine/cron/groctimespecification.py
+++ b/google/appengine/cron/groctimespecification.py
@@ -38,6 +38,7 @@
 """
 
 
+
 import calendar
 import datetime
 
diff --git a/google/appengine/datastore/datastore_index.py b/google/appengine/datastore/datastore_index.py
index 7daa43d..41f3ac8 100644
--- a/google/appengine/datastore/datastore_index.py
+++ b/google/appengine/datastore/datastore_index.py
@@ -62,6 +62,8 @@
 
 
 
+
+
 import google
 import yaml
 
diff --git a/google/appengine/datastore/datastore_pb.py b/google/appengine/datastore/datastore_pb.py
index ad1cab8..1a61380 100644
--- a/google/appengine/datastore/datastore_pb.py
+++ b/google/appengine/datastore/datastore_pb.py
@@ -27,6 +27,7 @@
 
 
 
+
 from google.appengine.datastore.action_pb import Action
 from google.appengine.datastore.entity_pb import CompositeIndex
 from google.appengine.datastore.entity_pb import EntityProto
diff --git a/google/appengine/datastore/datastore_pbs.py b/google/appengine/datastore/datastore_pbs.py
index 323897f..c3600f0 100644
--- a/google/appengine/datastore/datastore_pbs.py
+++ b/google/appengine/datastore/datastore_pbs.py
@@ -38,6 +38,7 @@
 
 
 
+
 from google.appengine.datastore import entity_pb
 
 from google.appengine.datastore import entity_v4_pb
diff --git a/google/appengine/datastore/datastore_query.py b/google/appengine/datastore/datastore_query.py
index 2698701..1f26513 100644
--- a/google/appengine/datastore/datastore_query.py
+++ b/google/appengine/datastore/datastore_query.py
@@ -35,6 +35,7 @@
 
 
 
+
 __all__ = ['Batch',
            'Batcher',
            'CompositeFilter',
@@ -897,11 +898,6 @@
   has to be of type V3 PointValue. V4 GeoPoints converts to this type.
   """
 
-
-
-
-
-
   def __init__(self, property_name, latitude, longitude, radius_meters):
     self._property_name = property_name
     self._lat_lng = geo_util.LatLng(latitude, longitude)
@@ -932,7 +928,6 @@
 
     lat_lng = geo_util.LatLng(latitude, longitude)
 
-
     return self._lat_lng - lat_lng <= self._radius_meters
 
 
@@ -944,8 +939,6 @@
   has to be of type V3 PointValue. V4 GeoPoints converts to this type.
   """
 
-
-
   def __init__(self, property_name, southwest, northeast):
     """Initializes a _BoundingBoxFilter.
 
@@ -961,7 +954,6 @@
       of the north-east coordinate.
     """
 
-
     if southwest.lat > northeast.lat:
       raise datastore_errors.BadArgumentError(
           'the south-west coordinate is on top of the north-east coordinate')
@@ -990,8 +982,6 @@
 
     _, latitude, longitude = value
 
-
-
     if not self._southwest.lat <= latitude <= self._northeast.lat:
       return False
 
@@ -1557,38 +1547,24 @@
   immediately after the last result returned by a batch.
 
   A cursor should only be used on a query with an identical signature to the
-  one that produced it.
+  one that produced it or on a query with its sort order reversed.
   """
 
   @datastore_rpc._positional(1)
-  def __init__(self, _cursor_pb=None, urlsafe=None, _cursor_bytes=None):
+  def __init__(self, urlsafe=None, _cursor_bytes=None):
     """Constructor.
 
     A Cursor constructed with no arguments points the first result of any
     query. If such a Cursor is used as an end_cursor no results will ever be
     returned.
     """
-
-
     super(Cursor, self).__init__()
-    if ((urlsafe is not None) + (_cursor_pb is not None)
-        + (_cursor_bytes is not None) > 1):
-      raise datastore_errors.BadArgumentError(
-          'Can only specify one of _cursor_pb, urlsafe, and _cursor_bytes')
     if urlsafe is not None:
-      _cursor_bytes = self._urlsafe_to_bytes(urlsafe)
-    if _cursor_pb is not None:
-      if not isinstance(_cursor_pb, datastore_pb.CompiledCursor):
+      if _cursor_bytes is not None:
         raise datastore_errors.BadArgumentError(
-            '_cursor_pb argument should be datastore_pb.CompiledCursor (%r)' %
-            (_cursor_pb,))
-      _cursor_bytes = _cursor_pb.Encode()
+            'Can only specify one of urlsafe and _cursor_bytes')
+      _cursor_bytes = self._urlsafe_to_bytes(urlsafe)
     if _cursor_bytes is not None:
-      if _cursor_pb is None and urlsafe is None:
-
-
-
-        Cursor._bytes_to_cursor_pb(_cursor_bytes)
       self.__cursor_bytes = _cursor_bytes
     else:
       self.__cursor_bytes = ''
@@ -1599,16 +1575,13 @@
       arg = '<%s>' % arg
     return '%s(%s)' % (self.__class__.__name__, arg)
 
-
   def reversed(self):
-    """Creates a cursor for use in a query with a reversed sort order."""
-    compiled_cursor = self._to_pb()
-    if compiled_cursor.has_position():
-      pos = compiled_cursor.position()
-      if pos.has_start_key():
-        raise datastore_errors.BadRequestError('Cursor cannot be reversed.')
-      pos.set_start_inclusive(not pos.start_inclusive())
-    return Cursor(_cursor_pb=compiled_cursor)
+    """DEPRECATED. It is no longer necessary to call reversed() on cursors.
+
+    A cursor returned by a query may also be used in a query whose sort order
+    has been reversed. This method returns a copy of the original cursor.
+    """
+    return Cursor(_cursor_bytes=self.__cursor_bytes)
 
   def to_bytes(self):
     """Serialize cursor as a byte string."""
@@ -1633,29 +1606,6 @@
     """
     return Cursor(_cursor_bytes=cursor)
 
-
-  @staticmethod
-  def _bytes_to_cursor_pb(cursor):
-
-    try:
-      cursor_pb = datastore_pb.CompiledCursor(cursor)
-    except (ValueError, TypeError), e:
-      raise datastore_errors.BadValueError(
-          'Invalid cursor (%r). Details: %s' % (cursor, e))
-    except Exception, e:
-
-
-
-
-
-
-      if e.__class__.__name__ == 'ProtocolBufferDecodeError':
-        raise datastore_errors.BadValueError(
-            'Invalid cursor %s. Details: %s' % (cursor, e))
-      else:
-        raise
-    return cursor_pb
-
   def urlsafe(self):
     """Serialize cursor as a websafe string.
 
@@ -1704,7 +1654,7 @@
   @staticmethod
   def _from_query_result(query_result):
     if query_result.has_compiled_cursor():
-      return Cursor(_cursor_pb=query_result.compiled_cursor())
+      return Cursor(_cursor_bytes=query_result.compiled_cursor().Encode())
     return None
 
   def advance(self, offset, query, conn):
@@ -1730,11 +1680,6 @@
     return query.run(conn, query_options).next_batch(
         Batcher.AT_LEAST_OFFSET).cursor(0)
 
-
-  def _to_pb(self):
-    """Returns the internal only pb representation."""
-    return Cursor._bytes_to_cursor_pb(self.__cursor_bytes)
-
   def __setstate__(self, state):
     if '_Cursor__compiled_cursor' in state:
 
@@ -2117,12 +2062,13 @@
 
 
     if query_options.start_cursor is not None:
-      pb.mutable_compiled_cursor().CopyFrom(query_options.start_cursor._to_pb())
+      pb.mutable_compiled_cursor().ParseFromString(
+          query_options.start_cursor.to_bytes())
 
 
     if query_options.end_cursor is not None:
-      pb.mutable_end_compiled_cursor().CopyFrom(
-          query_options.end_cursor._to_pb())
+      pb.mutable_end_compiled_cursor().ParseFromString(
+          query_options.end_cursor.to_bytes())
 
 
     if ((query_options.hint == QueryOptions.ORDER_FIRST and pb.order_size()) or
@@ -2618,9 +2564,9 @@
       return self.__start_cursor
     elif (index == 0 and
           self.__skipped_cursor):
-      return Cursor(_cursor_pb=self.__skipped_cursor)
+      return Cursor(_cursor_bytes=self.__skipped_cursor.Encode())
     elif index > 0 and self.__result_cursors:
-      return Cursor(_cursor_pb=self.__result_cursors[index - 1])
+      return Cursor(_cursor_bytes=self.__result_cursors[index - 1].Encode())
 
     elif index == len(self.__results):
       return self.__end_cursor
diff --git a/google/appengine/datastore/datastore_rpc.py b/google/appengine/datastore/datastore_rpc.py
index b6f4ced..4ce64dd 100644
--- a/google/appengine/datastore/datastore_rpc.py
+++ b/google/appengine/datastore/datastore_rpc.py
@@ -35,6 +35,7 @@
 
 
 
+
 __all__ = ['AbstractAdapter',
            'BaseConfiguration',
            'BaseConnection',
diff --git a/google/appengine/datastore/datastore_sqlite_stub.py b/google/appengine/datastore/datastore_sqlite_stub.py
index fc97993..50abb9a 100644
--- a/google/appengine/datastore/datastore_sqlite_stub.py
+++ b/google/appengine/datastore/datastore_sqlite_stub.py
@@ -39,6 +39,7 @@
 
 
 
+
 import array
 import itertools
 import logging
diff --git a/google/appengine/datastore/datastore_stats_generator.py b/google/appengine/datastore/datastore_stats_generator.py
index 81ed3de..a5dbdb5 100644
--- a/google/appengine/datastore/datastore_stats_generator.py
+++ b/google/appengine/datastore/datastore_stats_generator.py
@@ -28,6 +28,7 @@
 
 
 
+
 import datetime
 import logging
 
diff --git a/google/appengine/datastore/datastore_stub_index.py b/google/appengine/datastore/datastore_stub_index.py
index e328bfd..7664231 100644
--- a/google/appengine/datastore/datastore_stub_index.py
+++ b/google/appengine/datastore/datastore_stub_index.py
@@ -28,6 +28,7 @@
 
 
 
+
 __all__ = ['GenerateIndexFromHistory',
            'IndexYamlUpdater',
           ]
diff --git a/google/appengine/datastore/datastore_stub_util.py b/google/appengine/datastore/datastore_stub_util.py
index 3e459d9..ae58a12 100644
--- a/google/appengine/datastore/datastore_stub_util.py
+++ b/google/appengine/datastore/datastore_stub_util.py
@@ -32,6 +32,7 @@
 
 
 
+
 try:
   import hashlib
   _MD5_FUNC = hashlib.md5
@@ -171,6 +172,16 @@
 _SCATTER_SHIFT = 64 - _MAX_SEQUENTIAL_BIT + 1
 
 
+_SHOULD_FAIL_ON_BAD_OFFSET = False
+
+def _HandleBadOffset(expected, actual):
+  logging.warn('Encountered an offset %d to Next but expected %d given the '
+               'query offset and the number of skipped entities.' %
+               (actual, expected))
+  if (_SHOULD_FAIL_ON_BAD_OFFSET):
+    raise datastore_errors.BadArgumentError(
+        'Invalid offset provided. Got %s expected %s.' % (actual, expected))
+
 def _GetScatterProperty(entity_proto):
   """Gets the scatter property for an object.
 
@@ -1010,6 +1021,17 @@
     self.app = query.app()
     self.cursor = self._AcquireCursorID()
 
+    if query.has_count():
+      count = query.count()
+    elif query.has_limit():
+      count = query.limit()
+    else:
+      count = BaseDatastore._BATCH_SIZE
+
+    self.__use_persisted_offset = query.persist_offset()
+    self.__persisted_offset = query.offset()
+    self.__persisted_count = count
+
     self.__order_compare_entities = dsquery._order.cmp_for_filter(
         dsquery._filter_predicate)
     if self.group_by:
@@ -1131,6 +1153,34 @@
       position.set_start_inclusive(False)
       _SetBeforeAscending(position, self.__first_sort_order)
 
+  def PopulateQueryResult(self, result, count, offset,
+                          compile=False, first_result=False):
+    """Populates a QueryResult with this cursor and the given number of results.
+
+    Args:
+      result: datastore_pb.QueryResult
+      count: integer of how many results to return, or None if not specified
+      offset: integer of how many results to skip
+      compile: boolean, whether we are compiling this query
+      first_result: whether the query result is the first for this query
+
+    Offset and count may be ignored if the query requested information
+    to be persisted.
+    """
+    if count is None:
+      count = BaseDatastore._BATCH_SIZE
+    if self.__use_persisted_offset:
+      offset = self.__persisted_offset
+      count = self.__persisted_count
+    elif self.__persisted_offset != offset:
+      _HandleBadOffset(self.__persisted_offset, offset)
+    self._PopulateQueryResult(result, count, offset,
+                              compile, first_result)
+    self.__persisted_offset -= result.skipped_results()
+
+  def _PopulateQueryResult(self, result, count, offset,
+                           compile, first_result):
+    raise NotImplementedError
 
 class ListCursor(BaseCursor):
   """A query cursor over a list of entities.
@@ -1214,17 +1264,7 @@
         hi = mid
     return lo
 
-  def PopulateQueryResult(self, result, count, offset,
-                          compile=False, first_result=False):
-    """Populates a QueryResult with this cursor and the given number of results.
-
-    Args:
-      result: datastore_pb.QueryResult
-      count: integer of how many results to return
-      offset: integer of how many results to skip
-      compile: boolean, whether we are compiling this query
-      first_result: whether the query result is the first for this query
-    """
+  def _PopulateQueryResult(self, result, count, offset, compile, first_result):
     Check(offset >= 0, 'Offset must be >= 0')
 
     offset = min(offset, self.__count - self.__offset)
@@ -2949,8 +2989,6 @@
     else:
       return os.path.isdir(web_inf)
 
-
-
   def Clear(self):
     """Clears out all stored values."""
     self._query_cursors = {}
@@ -3044,13 +3082,7 @@
     cursor = self._datastore.GetQueryCursor(query, self._trusted, self._app_id,
                                             filter_predicate)
 
-    if query.has_count():
-      count = query.count()
-    elif query.has_limit():
-      count = query.limit()
-    else:
-      count = self._BATCH_SIZE
-
+    count = query.count() if query.has_count() else None
     cursor.PopulateQueryResult(query_result, count, query.offset(),
                                query.compile(), first_result=True)
     if query_result.has_cursor():
@@ -3136,12 +3168,12 @@
     Check(cursor and cursor.app == app,
           'Cursor %d not found' % next_request.cursor().cursor())
 
-    count = self._BATCH_SIZE
-    if next_request.has_count():
-      count = next_request.count()
-
-    cursor.PopulateQueryResult(query_result, count, next_request.offset(),
-                               next_request.compile(), first_result=False)
+    count = next_request.count() if next_request.has_count() else None
+    cursor.PopulateQueryResult(query_result,
+                               count,
+                               next_request.offset(),
+                               next_request.compile(),
+                               first_result=False)
 
     if not query_result.has_cursor():
       del self._query_cursors[next_request.cursor().cursor()]
diff --git a/google/appengine/datastore/datastore_v4_stub.py b/google/appengine/datastore/datastore_v4_stub.py
index 52cdb64..cec1484 100644
--- a/google/appengine/datastore/datastore_v4_stub.py
+++ b/google/appengine/datastore/datastore_v4_stub.py
@@ -31,6 +31,7 @@
 
 
 
+
 from google.appengine.datastore import entity_pb
 
 from google.appengine.api import api_base_pb
diff --git a/google/appengine/datastore/datastore_v4_validator.py b/google/appengine/datastore/datastore_v4_validator.py
index 403efea..082b95f 100644
--- a/google/appengine/datastore/datastore_v4_validator.py
+++ b/google/appengine/datastore/datastore_v4_validator.py
@@ -38,6 +38,7 @@
 
 
 
+
 import re
 
 from google.appengine.datastore import datastore_pbs
diff --git a/google/appengine/datastore/entity_pb.py b/google/appengine/datastore/entity_pb.py
index 7d47dae..0b7857d 100644
--- a/google/appengine/datastore/entity_pb.py
+++ b/google/appengine/datastore/entity_pb.py
@@ -3556,13 +3556,14 @@
 class SearchIndexEntry(ProtocolBuffer.ProtocolMessage):
   has_index_id_ = 0
   index_id_ = 0
+  has_write_division_family_ = 0
+  write_division_family_ = ""
   has_fingerprint_1999_ = 0
   fingerprint_1999_ = 0
   has_fingerprint_2011_ = 0
   fingerprint_2011_ = 0
 
   def __init__(self, contents=None):
-    self.division_family_ = []
     if contents is not None: self.MergeFromString(contents)
 
   def index_id(self): return self.index_id_
@@ -3578,20 +3579,18 @@
 
   def has_index_id(self): return self.has_index_id_
 
-  def division_family_size(self): return len(self.division_family_)
-  def division_family_list(self): return self.division_family_
+  def write_division_family(self): return self.write_division_family_
 
-  def division_family(self, i):
-    return self.division_family_[i]
+  def set_write_division_family(self, x):
+    self.has_write_division_family_ = 1
+    self.write_division_family_ = x
 
-  def set_division_family(self, i, x):
-    self.division_family_[i] = x
+  def clear_write_division_family(self):
+    if self.has_write_division_family_:
+      self.has_write_division_family_ = 0
+      self.write_division_family_ = ""
 
-  def add_division_family(self, x):
-    self.division_family_.append(x)
-
-  def clear_division_family(self):
-    self.division_family_ = []
+  def has_write_division_family(self): return self.has_write_division_family_
 
   def fingerprint_1999(self): return self.fingerprint_1999_
 
@@ -3623,7 +3622,7 @@
   def MergeFrom(self, x):
     assert x is not self
     if (x.has_index_id()): self.set_index_id(x.index_id())
-    for i in xrange(x.division_family_size()): self.add_division_family(x.division_family(i))
+    if (x.has_write_division_family()): self.set_write_division_family(x.write_division_family())
     if (x.has_fingerprint_1999()): self.set_fingerprint_1999(x.fingerprint_1999())
     if (x.has_fingerprint_2011()): self.set_fingerprint_2011(x.fingerprint_2011())
 
@@ -3631,9 +3630,8 @@
     if x is self: return 1
     if self.has_index_id_ != x.has_index_id_: return 0
     if self.has_index_id_ and self.index_id_ != x.index_id_: return 0
-    if len(self.division_family_) != len(x.division_family_): return 0
-    for e1, e2 in zip(self.division_family_, x.division_family_):
-      if e1 != e2: return 0
+    if self.has_write_division_family_ != x.has_write_division_family_: return 0
+    if self.has_write_division_family_ and self.write_division_family_ != x.write_division_family_: return 0
     if self.has_fingerprint_1999_ != x.has_fingerprint_1999_: return 0
     if self.has_fingerprint_1999_ and self.fingerprint_1999_ != x.fingerprint_1999_: return 0
     if self.has_fingerprint_2011_ != x.has_fingerprint_2011_: return 0
@@ -3646,40 +3644,43 @@
       initialized = 0
       if debug_strs is not None:
         debug_strs.append('Required field: index_id not set.')
+    if (not self.has_write_division_family_):
+      initialized = 0
+      if debug_strs is not None:
+        debug_strs.append('Required field: write_division_family not set.')
     return initialized
 
   def ByteSize(self):
     n = 0
     n += self.lengthVarInt64(self.index_id_)
-    n += 1 * len(self.division_family_)
-    for i in xrange(len(self.division_family_)): n += self.lengthString(len(self.division_family_[i]))
+    n += self.lengthString(len(self.write_division_family_))
     if (self.has_fingerprint_1999_): n += 9
     if (self.has_fingerprint_2011_): n += 9
-    return n + 1
+    return n + 2
 
   def ByteSizePartial(self):
     n = 0
     if (self.has_index_id_):
       n += 1
       n += self.lengthVarInt64(self.index_id_)
-    n += 1 * len(self.division_family_)
-    for i in xrange(len(self.division_family_)): n += self.lengthString(len(self.division_family_[i]))
+    if (self.has_write_division_family_):
+      n += 1
+      n += self.lengthString(len(self.write_division_family_))
     if (self.has_fingerprint_1999_): n += 9
     if (self.has_fingerprint_2011_): n += 9
     return n
 
   def Clear(self):
     self.clear_index_id()
-    self.clear_division_family()
+    self.clear_write_division_family()
     self.clear_fingerprint_1999()
     self.clear_fingerprint_2011()
 
   def OutputUnchecked(self, out):
     out.putVarInt32(8)
     out.putVarInt64(self.index_id_)
-    for i in xrange(len(self.division_family_)):
-      out.putVarInt32(18)
-      out.putPrefixedString(self.division_family_[i])
+    out.putVarInt32(18)
+    out.putPrefixedString(self.write_division_family_)
     if (self.has_fingerprint_1999_):
       out.putVarInt32(25)
       out.put64(self.fingerprint_1999_)
@@ -3691,9 +3692,9 @@
     if (self.has_index_id_):
       out.putVarInt32(8)
       out.putVarInt64(self.index_id_)
-    for i in xrange(len(self.division_family_)):
+    if (self.has_write_division_family_):
       out.putVarInt32(18)
-      out.putPrefixedString(self.division_family_[i])
+      out.putPrefixedString(self.write_division_family_)
     if (self.has_fingerprint_1999_):
       out.putVarInt32(25)
       out.put64(self.fingerprint_1999_)
@@ -3708,7 +3709,7 @@
         self.set_index_id(d.getVarInt64())
         continue
       if tt == 18:
-        self.add_division_family(d.getPrefixedString())
+        self.set_write_division_family(d.getPrefixedString())
         continue
       if tt == 25:
         self.set_fingerprint_1999(d.get64())
@@ -3725,12 +3726,7 @@
   def __str__(self, prefix="", printElemNumber=0):
     res=""
     if self.has_index_id_: res+=prefix+("index_id: %s\n" % self.DebugFormatInt64(self.index_id_))
-    cnt=0
-    for e in self.division_family_:
-      elm=""
-      if printElemNumber: elm="(%d)" % cnt
-      res+=prefix+("division_family%s: %s\n" % (elm, self.DebugFormatString(e)))
-      cnt+=1
+    if self.has_write_division_family_: res+=prefix+("write_division_family: %s\n" % self.DebugFormatString(self.write_division_family_))
     if self.has_fingerprint_1999_: res+=prefix+("fingerprint_1999: %s\n" % self.DebugFormatFixed64(self.fingerprint_1999_))
     if self.has_fingerprint_2011_: res+=prefix+("fingerprint_2011: %s\n" % self.DebugFormatFixed64(self.fingerprint_2011_))
     return res
@@ -3740,14 +3736,14 @@
     return tuple([sparse.get(i, default) for i in xrange(0, 1+maxtag)])
 
   kindex_id = 1
-  kdivision_family = 2
+  kwrite_division_family = 2
   kfingerprint_1999 = 3
   kfingerprint_2011 = 4
 
   _TEXT = _BuildTagLookupTable({
     0: "ErrorCode",
     1: "index_id",
-    2: "division_family",
+    2: "write_division_family",
     3: "fingerprint_1999",
     4: "fingerprint_2011",
   }, 4)
diff --git a/google/appengine/datastore/sortable_pb_encoder.py b/google/appengine/datastore/sortable_pb_encoder.py
index 5294d45..cca52b2 100644
--- a/google/appengine/datastore/sortable_pb_encoder.py
+++ b/google/appengine/datastore/sortable_pb_encoder.py
@@ -52,6 +52,7 @@
 
 
 
+
 import array
 import struct
 
diff --git a/google/appengine/dist/_library.py b/google/appengine/dist/_library.py
index 3d10db9..4a0f80f 100644
--- a/google/appengine/dist/_library.py
+++ b/google/appengine/dist/_library.py
@@ -36,6 +36,7 @@
 """
 
 
+
 __all__ = ['use_library']
 
 
diff --git a/google/appengine/dist/py_imp.py b/google/appengine/dist/py_imp.py
index e1ca09f..019aa35 100644
--- a/google/appengine/dist/py_imp.py
+++ b/google/appengine/dist/py_imp.py
@@ -21,6 +21,7 @@
 """Stub replacement for Python's imp module."""
 
 
+
 import os
 import sys
 
diff --git a/google/appengine/dist/py_select.py b/google/appengine/dist/py_select.py
index aa5df27..5fe20bd 100644
--- a/google/appengine/dist/py_select.py
+++ b/google/appengine/dist/py_select.py
@@ -21,4 +21,5 @@
 """This module supports asynchronous I/O on multiple file descriptors."""
 
 
+
 from google.appengine.api.remote_socket._remote_socket import select, error
diff --git a/google/appengine/dist/py_zipimport.py b/google/appengine/dist/py_zipimport.py
index a6e5743..950cff9 100644
--- a/google/appengine/dist/py_zipimport.py
+++ b/google/appengine/dist/py_zipimport.py
@@ -46,6 +46,7 @@
 """
 
 
+
 __all__ = ['ZipImportError', 'zipimporter']
 
 
diff --git a/google/appengine/dist/select.py b/google/appengine/dist/select.py
index aa5df27..5fe20bd 100644
--- a/google/appengine/dist/select.py
+++ b/google/appengine/dist/select.py
@@ -21,4 +21,5 @@
 """This module supports asynchronous I/O on multiple file descriptors."""
 
 
+
 from google.appengine.api.remote_socket._remote_socket import select, error
diff --git a/google/appengine/dist27/httplib.py b/google/appengine/dist27/httplib.py
index f6e547b..774df4f 100644
--- a/google/appengine/dist27/httplib.py
+++ b/google/appengine/dist27/httplib.py
@@ -1,6 +1,7 @@
 # Copyright 2013 Google Inc. All Rights Reserved.
 
 
+
 import os
 
 if 'GAE_USE_SOCKETS_HTTPLIB' in os.environ:
diff --git a/google/appengine/ext/admin/__init__.py b/google/appengine/ext/admin/__init__.py
index eba729b..a4903e7 100644
--- a/google/appengine/ext/admin/__init__.py
+++ b/google/appengine/ext/admin/__init__.py
@@ -28,6 +28,7 @@
 
 
 
+
 import cgi
 import collections
 import csv
diff --git a/google/appengine/ext/admin_redirect/main.py b/google/appengine/ext/admin_redirect/main.py
index bab40c1..3705eb4 100644
--- a/google/appengine/ext/admin_redirect/main.py
+++ b/google/appengine/ext/admin_redirect/main.py
@@ -26,6 +26,7 @@
 """
 
 
+
 import logging
 
 from google.appengine.ext import webapp
diff --git a/google/appengine/ext/analytics/main.py b/google/appengine/ext/analytics/main.py
index 2071848..c3e0996 100644
--- a/google/appengine/ext/analytics/main.py
+++ b/google/appengine/ext/analytics/main.py
@@ -21,6 +21,7 @@
 """Main script for appstats analytics."""
 
 
+
 import email.Utils
 try:
   import json
diff --git a/google/appengine/ext/analytics/process.py b/google/appengine/ext/analytics/process.py
index 6a7a324..b9a5fa7 100644
--- a/google/appengine/ext/analytics/process.py
+++ b/google/appengine/ext/analytics/process.py
@@ -27,6 +27,7 @@
 """
 
 
+
 try:
   import json
 except ImportError:
diff --git a/google/appengine/ext/analytics/standaloneapp.py b/google/appengine/ext/analytics/standaloneapp.py
index 2e3b8dd..60b5a95 100644
--- a/google/appengine/ext/analytics/standaloneapp.py
+++ b/google/appengine/ext/analytics/standaloneapp.py
@@ -21,6 +21,7 @@
 """Script which allows analytics to run as stand alone app."""
 
 
+
 from google.appengine.ext import webapp
 from google.appengine.ext.webapp.util import run_wsgi_app
 
diff --git a/google/appengine/ext/analytics/stats.py b/google/appengine/ext/analytics/stats.py
index b2ab92c..89212d8 100644
--- a/google/appengine/ext/analytics/stats.py
+++ b/google/appengine/ext/analytics/stats.py
@@ -27,6 +27,7 @@
 """
 
 
+
 import logging
 import entity
 
diff --git a/google/appengine/ext/appstats/formatting.py b/google/appengine/ext/appstats/formatting.py
index 1fa08b7..e47d14f 100644
--- a/google/appengine/ext/appstats/formatting.py
+++ b/google/appengine/ext/appstats/formatting.py
@@ -21,6 +21,7 @@
 """A fast but lossy, totally generic object formatter."""
 
 
+
 import os
 import types
 
diff --git a/google/appengine/ext/appstats/loader.py b/google/appengine/ext/appstats/loader.py
index aaed2d0..0898e57 100644
--- a/google/appengine/ext/appstats/loader.py
+++ b/google/appengine/ext/appstats/loader.py
@@ -28,6 +28,7 @@
 """
 
 
+
 import cPickle as pickle
 import logging
 import time
diff --git a/google/appengine/ext/appstats/recording.py b/google/appengine/ext/appstats/recording.py
index c365bce..eeb2e01 100644
--- a/google/appengine/ext/appstats/recording.py
+++ b/google/appengine/ext/appstats/recording.py
@@ -23,6 +23,7 @@
 from __future__ import with_statement
 
 
+
 import datetime
 import logging
 import os
diff --git a/google/appengine/ext/appstats/sample_appengine_config.py b/google/appengine/ext/appstats/sample_appengine_config.py
index a359f3e..b9f056a 100644
--- a/google/appengine/ext/appstats/sample_appengine_config.py
+++ b/google/appengine/ext/appstats/sample_appengine_config.py
@@ -32,6 +32,7 @@
 """
 
 
+
 import logging
 import os
 import random
diff --git a/google/appengine/ext/appstats/static/appstats_js.js b/google/appengine/ext/appstats/static/appstats_js.js
index 38d7be6..5e8ff0b 100644
--- a/google/appengine/ext/appstats/static/appstats_js.js
+++ b/google/appengine/ext/appstats/static/appstats_js.js
@@ -2,88 +2,89 @@
 typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if("function"==b&&"undefined"==typeof a.call)return"object";return b},da=function(a){return"array"==ca(a)},ea=function(a){var b=ca(a);return"array"==b||"object"==b&&"number"==typeof a.length},m=function(a){return"string"==typeof a},n=function(a){return"function"==ca(a)},fa=function(a){var b=typeof a;return"object"==b&&null!=a||"function"==b},ia=function(a){return a[ga]||
 (a[ga]=++ha)},ga="closure_uid_"+(1E9*Math.random()>>>0),ha=0,ja=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}},ka=function(a,b){var c=a.split("."),d=l;c[0]in d||!d.execScript||d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)c.length||void 0===b?d=d[e]?d[e]:d[e]={}:d[e]=b},p=function(a,b){function c(){}c.prototype=b.prototype;a.f=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.nc=
 function(a,c,g){return b.prototype[c].apply(a,Array.prototype.slice.call(arguments,2))}};var la=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,la);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))};p(la,Error);la.prototype.name="CustomError";var ma;var na=function(a,b){for(var c=a.split("%s"),d="",e=Array.prototype.slice.call(arguments,1);e.length&&1<c.length;)d+=c.shift()+e.shift();return d+c.join("%s")},oa=String.prototype.trim?function(a){return a.trim()}:function(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},wa=function(a){if(!pa.test(a))return a;-1!=a.indexOf("&")&&(a=a.replace(qa,"&amp;"));-1!=a.indexOf("<")&&(a=a.replace(ra,"&lt;"));-1!=a.indexOf(">")&&(a=a.replace(sa,"&gt;"));-1!=a.indexOf('"')&&(a=a.replace(ta,"&quot;"));-1!=a.indexOf("'")&&
-(a=a.replace(ua,"&#39;"));-1!=a.indexOf("\x00")&&(a=a.replace(va,"&#0;"));return a},qa=/&/g,ra=/</g,sa=/>/g,ta=/"/g,ua=/'/g,va=/\x00/g,pa=/[\x00&<>"']/,xa=function(a,b){return a<b?-1:a>b?1:0};var ya=function(a,b){b.unshift(a);la.call(this,na.apply(null,b));b.shift()};p(ya,la);ya.prototype.name="AssertionError";var za=function(a,b,c){var d="Assertion failed";if(b)var d=d+(": "+b),e=c;else a&&(d+=": "+a,e=null);throw new ya(""+d,e||[]);},q=function(a,b,c){a||za("",b,Array.prototype.slice.call(arguments,2))},Aa=function(a,b,c,d){a instanceof b||za("instanceof check failed.",c,Array.prototype.slice.call(arguments,3))};var r=Array.prototype,Ba=r.indexOf?function(a,b,c){q(null!=a.length);return r.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(m(a))return m(b)&&1==b.length?a.indexOf(b,c):-1;for(;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},s=r.forEach?function(a,b,c){q(null!=a.length);r.forEach.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=m(a)?a.split(""):a,g=0;g<d;g++)g in e&&b.call(c,e[g],g,a)},Ca=r.filter?function(a,b,c){q(null!=a.length);return r.filter.call(a,b,
-c)}:function(a,b,c){for(var d=a.length,e=[],g=0,h=m(a)?a.split(""):a,k=0;k<d;k++)if(k in h){var I=h[k];b.call(c,I,k,a)&&(e[g++]=I)}return e},Da=r.every?function(a,b,c){q(null!=a.length);return r.every.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=m(a)?a.split(""):a,g=0;g<d;g++)if(g in e&&!b.call(c,e[g],g,a))return!1;return!0},t=function(a,b){return 0<=Ba(a,b)},Ea=function(a,b){var c=Ba(a,b),d;if(d=0<=c)q(null!=a.length),r.splice.call(a,c,1);return d},Fa=function(a){var b=a.length;if(0<b){for(var c=
-Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]},Ha=function(a,b,c,d){q(null!=a.length);r.splice.apply(a,Ga(arguments,1))},Ga=function(a,b,c){q(null!=a.length);return 2>=arguments.length?r.slice.call(a,b):r.slice.call(a,b,c)};var Ia=function(a){a=a.className;return m(a)&&a.match(/\S+/g)||[]},Ja=function(a,b){for(var c=Ia(a),d=Ga(arguments,1),e=c,g=0;g<d.length;g++)t(e,d[g])||e.push(d[g]);a.className=c.join(" ")},La=function(a,b){var c=Ia(a),d=Ga(arguments,1),c=Ka(c,d);a.className=c.join(" ")},Ka=function(a,b){return Ca(a,function(a){return!t(b,a)})};var Ma=function(a,b){for(var c in a)b.call(void 0,a[c],c,a)},Na=function(a,b){for(var c in a)if(a[c]==b)return!0;return!1},Oa=function(a,b,c){if(b in a)throw Error('The object already contains the key "'+b+'"');a[b]=c},Pa=function(a){var b={},c;for(c in a)b[a[c]]=c;return b},Qa="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),Ra=function(a,b){for(var c,d,e=1;e<arguments.length;e++){d=arguments[e];for(c in d)a[c]=d[c];for(var g=0;g<Qa.length;g++)c=
-Qa[g],Object.prototype.hasOwnProperty.call(d,c)&&(a[c]=d[c])}};var Sa;t:{var Ta=l.navigator;if(Ta){var Ua=Ta.userAgent;if(Ua){Sa=Ua;break t}}Sa=""}var u=function(a){return-1!=Sa.indexOf(a)};var Va=u("Opera")||u("OPR"),v=u("Trident")||u("MSIE"),w=u("Gecko")&&-1==Sa.toLowerCase().indexOf("webkit")&&!(u("Trident")||u("MSIE")),x=-1!=Sa.toLowerCase().indexOf("webkit"),Wa=l.navigator||null,y=-1!=(Wa&&Wa.platform||"").indexOf("Mac"),Xa=function(){var a=l.document;return a?a.documentMode:void 0},Ya=function(){var a="",b;if(Va&&l.opera)return a=l.opera.version,n(a)?a():a;w?b=/rv\:([^\);]+)(\)|;)/:v?b=/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/:x&&(b=/WebKit\/(\S+)/);b&&(a=(a=b.exec(Sa))?a[1]:"");return v&&
-(b=Xa(),b>parseFloat(a))?String(b):a}(),Za={},A=function(a){var b;if(!(b=Za[a])){b=0;for(var c=oa(String(Ya)).split("."),d=oa(String(a)).split("."),e=Math.max(c.length,d.length),g=0;0==b&&g<e;g++){var h=c[g]||"",k=d[g]||"",I=RegExp("(\\d*)(\\D*)","g"),z=RegExp("(\\d*)(\\D*)","g");do{var K=I.exec(h)||["","",""],P=z.exec(k)||["","",""];if(0==K[0].length&&0==P[0].length)break;b=xa(0==K[1].length?0:parseInt(K[1],10),0==P[1].length?0:parseInt(P[1],10))||xa(0==K[2].length,0==P[2].length)||xa(K[2],P[2])}while(0==
-b)}b=Za[a]=0<=b}return b},$a=l.document,ab=$a&&v?Xa()||("CSS1Compat"==$a.compatMode?parseInt(Ya,10):5):void 0;var bb=!v||v&&9<=ab;!w&&!v||v&&v&&9<=ab||w&&A("1.9.1");var cb=v&&!A("9");var fb=function(a){return a?new db(eb(a)):ma||(ma=new db)},gb=function(a,b){return m(b)?a.getElementById(b):b},hb=function(a,b,c){var d=document;c=c||d;a=a&&"*"!=a?a.toUpperCase():"";if(c.querySelectorAll&&c.querySelector&&(a||b))return c.querySelectorAll(a+(b?"."+b:""));if(b&&c.getElementsByClassName){c=c.getElementsByClassName(b);if(a){for(var d={},e=0,g=0,h;h=c[g];g++)a==h.nodeName&&(d[e++]=h);d.length=e;return d}return c}c=c.getElementsByTagName(a||"*");if(b){d={};for(g=e=0;h=c[g];g++)a=h.className,
-"function"==typeof a.split&&t(a.split(/\s+/),b)&&(d[e++]=h);d.length=e;return d}return c},jb=function(a,b){Ma(b,function(b,d){"style"==d?a.style.cssText=b:"class"==d?a.className=b:"for"==d?a.htmlFor=b:d in ib?a.setAttribute(ib[d],b):0==d.lastIndexOf("aria-",0)||0==d.lastIndexOf("data-",0)?a.setAttribute(d,b):a[d]=b})},ib={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",frameborder:"frameBorder",height:"height",maxlength:"maxLength",role:"role",rowspan:"rowSpan",type:"type",usemap:"useMap",
-valign:"vAlign",width:"width"},lb=function(a,b,c){return kb(document,arguments)},kb=function(a,b){var c=b[0],d=b[1];if(!bb&&d&&(d.name||d.type)){c=["<",c];d.name&&c.push(' name="',wa(d.name),'"');if(d.type){c.push(' type="',wa(d.type),'"');var e={};Ra(e,d);delete e.type;d=e}c.push(">");c=c.join("")}c=a.createElement(c);d&&(m(d)?c.className=d:da(d)?c.className=d.join(" "):jb(c,d));2<b.length&&mb(a,c,b);return c},mb=function(a,b,c){function d(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=
-2;e<c.length;e++){var g=c[e];if(!ea(g)||fa(g)&&0<g.nodeType)d(g);else{var h;t:{if(g&&"number"==typeof g.length){if(fa(g)){h="function"==typeof g.item||"string"==typeof g.item;break t}if(n(g)){h="function"==typeof g.item;break t}}h=!1}s(h?Fa(g):g,d)}}},nb=function(a,b){if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||Boolean(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a},eb=function(a){q(a,"Node cannot be null or undefined.");
-return 9==a.nodeType?a:a.ownerDocument||a.document},ob=function(a,b){q(null!=a,"goog.dom.setTextContent expects a non-null value for node");if("textContent"in a)a.textContent=b;else if(3==a.nodeType)a.data=b;else if(a.firstChild&&3==a.firstChild.nodeType){for(;a.lastChild!=a.firstChild;)a.removeChild(a.lastChild);a.firstChild.data=b}else{for(var c;c=a.firstChild;)a.removeChild(c);c=eb(a);a.appendChild(c.createTextNode(String(b)))}},pb={SCRIPT:1,STYLE:1,HEAD:1,IFRAME:1,OBJECT:1},qb={IMG:" ",BR:"\n"},
-tb=function(a){return rb(a)&&sb(a)},ub=function(a,b){b?a.tabIndex=0:(a.tabIndex=-1,a.removeAttribute("tabIndex"))},rb=function(a){a=a.getAttributeNode("tabindex");return null!=a&&a.specified},sb=function(a){a=a.tabIndex;return"number"==typeof a&&0<=a&&32768>a},vb=function(a,b,c){if(!(a.nodeName in pb))if(3==a.nodeType)c?b.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in qb)b.push(qb[a.nodeName]);else for(a=a.firstChild;a;)vb(a,b,c),a=a.nextSibling},db=
-function(a){this.Q=a||l.document||document};f=db.prototype;f.mb=fb;f.a=function(a){return gb(this.Q,a)};f.o=function(a,b,c){return kb(this.Q,arguments)};f.createElement=function(a){return this.Q.createElement(a)};f.createTextNode=function(a){return this.Q.createTextNode(String(a))};f.appendChild=function(a,b){a.appendChild(b)};f.contains=nb;
-f.I=function(a){var b;(b="A"==a.tagName||"INPUT"==a.tagName||"TEXTAREA"==a.tagName||"SELECT"==a.tagName||"BUTTON"==a.tagName?!a.disabled&&(!rb(a)||sb(a)):tb(a))&&v?(a=n(a.getBoundingClientRect)?a.getBoundingClientRect():{height:a.offsetHeight,width:a.offsetWidth},a=null!=a&&0<a.height&&0<a.width):a=b;return a};var wb=function(a){wb[" "](a);return a};wb[" "]=aa;var xb=!v||v&&9<=ab,yb=!v||v&&9<=ab,zb=v&&!A("9");!x||A("528");w&&A("1.9b")||v&&A("8")||Va&&A("9.5")||x&&A("528");w&&!A("8")||v&&A("9");var Ab=function(){this.eb=this.eb;this.ic=this.ic};Ab.prototype.eb=!1;var B=function(a,b){this.type=a;this.currentTarget=this.target=b;this.defaultPrevented=this.$=!1;this.wb=!0};B.prototype.stopPropagation=function(){this.$=!0};B.prototype.preventDefault=function(){this.defaultPrevented=!0;this.wb=!1};var C=function(a,b){B.call(this,a?a.type:"");this.relatedTarget=this.currentTarget=this.target=null;this.charCode=this.keyCode=this.button=this.screenY=this.screenX=this.clientY=this.clientX=this.offsetY=this.offsetX=0;this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.kb=!1;this.O=null;if(a){var c=this.type=a.type;this.target=a.target||a.srcElement;this.currentTarget=b;var d=a.relatedTarget;if(d){if(w){var e;t:{try{wb(d.nodeName);e=!0;break t}catch(g){}e=!1}e||(d=null)}}else"mouseover"==
+(a=a.replace(ua,"&#39;"));-1!=a.indexOf("\x00")&&(a=a.replace(va,"&#0;"));return a},qa=/&/g,ra=/</g,sa=/>/g,ta=/"/g,ua=/'/g,va=/\x00/g,pa=/[\x00&<>"']/,xa=function(a,b){return a<b?-1:a>b?1:0};var ya=function(a,b){b.unshift(a);la.call(this,na.apply(null,b));b.shift()};p(ya,la);ya.prototype.name="AssertionError";
+var za=function(a,b,c,d){var e="Assertion failed";if(c)var e=e+(": "+c),g=d;else a&&(e+=": "+a,g=b);throw new ya(""+e,g||[]);},q=function(a,b,c){a||za("",null,b,Array.prototype.slice.call(arguments,2))},Aa=function(a,b,c){fa(a)&&1==a.nodeType||za("Expected Element but got %s: %s.",[ca(a),a],b,Array.prototype.slice.call(arguments,2))},Ba=function(a,b,c,d){a instanceof b||za("instanceof check failed.",null,c,Array.prototype.slice.call(arguments,3))};var r=Array.prototype,Ca=r.indexOf?function(a,b,c){q(null!=a.length);return r.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(m(a))return m(b)&&1==b.length?a.indexOf(b,c):-1;for(;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},s=r.forEach?function(a,b,c){q(null!=a.length);r.forEach.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=m(a)?a.split(""):a,g=0;g<d;g++)g in e&&b.call(c,e[g],g,a)},Da=r.filter?function(a,b,c){q(null!=a.length);return r.filter.call(a,b,
+c)}:function(a,b,c){for(var d=a.length,e=[],g=0,h=m(a)?a.split(""):a,k=0;k<d;k++)if(k in h){var I=h[k];b.call(c,I,k,a)&&(e[g++]=I)}return e},Ea=r.every?function(a,b,c){q(null!=a.length);return r.every.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=m(a)?a.split(""):a,g=0;g<d;g++)if(g in e&&!b.call(c,e[g],g,a))return!1;return!0},t=function(a,b){return 0<=Ca(a,b)},Fa=function(a,b){var c=Ca(a,b),d;if(d=0<=c)q(null!=a.length),r.splice.call(a,c,1);return d},Ga=function(a){var b=a.length;if(0<b){for(var c=
+Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]},Ia=function(a,b,c,d){q(null!=a.length);r.splice.apply(a,Ha(arguments,1))},Ha=function(a,b,c){q(null!=a.length);return 2>=arguments.length?r.slice.call(a,b):r.slice.call(a,b,c)};var Ja=function(a){a=a.className;return m(a)&&a.match(/\S+/g)||[]},Ka=function(a,b){for(var c=Ja(a),d=Ha(arguments,1),e=c,g=0;g<d.length;g++)t(e,d[g])||e.push(d[g]);a.className=c.join(" ")},Ma=function(a,b){var c=Ja(a),d=Ha(arguments,1),c=La(c,d);a.className=c.join(" ")},La=function(a,b){return Da(a,function(a){return!t(b,a)})};var Na=function(a,b){for(var c in a)b.call(void 0,a[c],c,a)},Oa=function(a,b){for(var c in a)if(a[c]==b)return!0;return!1},Pa=function(a,b,c){if(b in a)throw Error('The object already contains the key "'+b+'"');a[b]=c},Qa=function(a){var b={},c;for(c in a)b[a[c]]=c;return b},Ra="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),Sa=function(a,b){for(var c,d,e=1;e<arguments.length;e++){d=arguments[e];for(c in d)a[c]=d[c];for(var g=0;g<Ra.length;g++)c=
+Ra[g],Object.prototype.hasOwnProperty.call(d,c)&&(a[c]=d[c])}};var Ta;t:{var Ua=l.navigator;if(Ua){var Va=Ua.userAgent;if(Va){Ta=Va;break t}}Ta=""}var u=function(a){return-1!=Ta.indexOf(a)};var Wa=u("Opera")||u("OPR"),v=u("Trident")||u("MSIE"),w=u("Gecko")&&-1==Ta.toLowerCase().indexOf("webkit")&&!(u("Trident")||u("MSIE")),x=-1!=Ta.toLowerCase().indexOf("webkit"),Xa=l.navigator||null,y=-1!=(Xa&&Xa.platform||"").indexOf("Mac"),Ya=function(){var a=l.document;return a?a.documentMode:void 0},Za=function(){var a="",b;if(Wa&&l.opera)return a=l.opera.version,n(a)?a():a;w?b=/rv\:([^\);]+)(\)|;)/:v?b=/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/:x&&(b=/WebKit\/(\S+)/);b&&(a=(a=b.exec(Ta))?a[1]:"");return v&&
+(b=Ya(),b>parseFloat(a))?String(b):a}(),$a={},A=function(a){var b;if(!(b=$a[a])){b=0;for(var c=oa(String(Za)).split("."),d=oa(String(a)).split("."),e=Math.max(c.length,d.length),g=0;0==b&&g<e;g++){var h=c[g]||"",k=d[g]||"",I=RegExp("(\\d*)(\\D*)","g"),z=RegExp("(\\d*)(\\D*)","g");do{var K=I.exec(h)||["","",""],P=z.exec(k)||["","",""];if(0==K[0].length&&0==P[0].length)break;b=xa(0==K[1].length?0:parseInt(K[1],10),0==P[1].length?0:parseInt(P[1],10))||xa(0==K[2].length,0==P[2].length)||xa(K[2],P[2])}while(0==
+b)}b=$a[a]=0<=b}return b},ab=l.document,bb=ab&&v?Ya()||("CSS1Compat"==ab.compatMode?parseInt(Za,10):5):void 0;var cb=!v||v&&9<=bb;!w&&!v||v&&v&&9<=bb||w&&A("1.9.1");var db=v&&!A("9");var gb=function(a){return a?new eb(fb(a)):ma||(ma=new eb)},hb=function(a,b){return m(b)?a.getElementById(b):b},ib=function(a,b,c){var d=document;c=c||d;a=a&&"*"!=a?a.toUpperCase():"";if(c.querySelectorAll&&c.querySelector&&(a||b))return c.querySelectorAll(a+(b?"."+b:""));if(b&&c.getElementsByClassName){c=c.getElementsByClassName(b);if(a){for(var d={},e=0,g=0,h;h=c[g];g++)a==h.nodeName&&(d[e++]=h);d.length=e;return d}return c}c=c.getElementsByTagName(a||"*");if(b){d={};for(g=e=0;h=c[g];g++)a=h.className,
+"function"==typeof a.split&&t(a.split(/\s+/),b)&&(d[e++]=h);d.length=e;return d}return c},kb=function(a,b){Na(b,function(b,d){"style"==d?a.style.cssText=b:"class"==d?a.className=b:"for"==d?a.htmlFor=b:d in jb?a.setAttribute(jb[d],b):0==d.lastIndexOf("aria-",0)||0==d.lastIndexOf("data-",0)?a.setAttribute(d,b):a[d]=b})},jb={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",frameborder:"frameBorder",height:"height",maxlength:"maxLength",role:"role",rowspan:"rowSpan",type:"type",usemap:"useMap",
+valign:"vAlign",width:"width"},mb=function(a,b,c){return lb(document,arguments)},lb=function(a,b){var c=b[0],d=b[1];if(!cb&&d&&(d.name||d.type)){c=["<",c];d.name&&c.push(' name="',wa(d.name),'"');if(d.type){c.push(' type="',wa(d.type),'"');var e={};Sa(e,d);delete e.type;d=e}c.push(">");c=c.join("")}c=a.createElement(c);d&&(m(d)?c.className=d:da(d)?c.className=d.join(" "):kb(c,d));2<b.length&&nb(a,c,b);return c},nb=function(a,b,c){function d(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=
+2;e<c.length;e++){var g=c[e];if(!ea(g)||fa(g)&&0<g.nodeType)d(g);else{var h;t:{if(g&&"number"==typeof g.length){if(fa(g)){h="function"==typeof g.item||"string"==typeof g.item;break t}if(n(g)){h="function"==typeof g.item;break t}}h=!1}s(h?Ga(g):g,d)}}},ob=function(a,b){if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||Boolean(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a},fb=function(a){q(a,"Node cannot be null or undefined.");
+return 9==a.nodeType?a:a.ownerDocument||a.document},pb=function(a,b){q(null!=a,"goog.dom.setTextContent expects a non-null value for node");if("textContent"in a)a.textContent=b;else if(3==a.nodeType)a.data=b;else if(a.firstChild&&3==a.firstChild.nodeType){for(;a.lastChild!=a.firstChild;)a.removeChild(a.lastChild);a.firstChild.data=b}else{for(var c;c=a.firstChild;)a.removeChild(c);c=fb(a);a.appendChild(c.createTextNode(String(b)))}},qb={SCRIPT:1,STYLE:1,HEAD:1,IFRAME:1,OBJECT:1},rb={IMG:" ",BR:"\n"},
+ub=function(a){return sb(a)&&tb(a)},vb=function(a,b){b?a.tabIndex=0:(a.tabIndex=-1,a.removeAttribute("tabIndex"))},sb=function(a){a=a.getAttributeNode("tabindex");return null!=a&&a.specified},tb=function(a){a=a.tabIndex;return"number"==typeof a&&0<=a&&32768>a},wb=function(a,b,c){if(!(a.nodeName in qb))if(3==a.nodeType)c?b.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in rb)b.push(rb[a.nodeName]);else for(a=a.firstChild;a;)wb(a,b,c),a=a.nextSibling},eb=
+function(a){this.Q=a||l.document||document};f=eb.prototype;f.mb=gb;f.a=function(a){return hb(this.Q,a)};f.o=function(a,b,c){return lb(this.Q,arguments)};f.createElement=function(a){return this.Q.createElement(a)};f.createTextNode=function(a){return this.Q.createTextNode(String(a))};f.appendChild=function(a,b){a.appendChild(b)};f.contains=ob;
+f.I=function(a){var b;(b="A"==a.tagName||"INPUT"==a.tagName||"TEXTAREA"==a.tagName||"SELECT"==a.tagName||"BUTTON"==a.tagName?!a.disabled&&(!sb(a)||tb(a)):ub(a))&&v?(a=n(a.getBoundingClientRect)?a.getBoundingClientRect():{height:a.offsetHeight,width:a.offsetWidth},a=null!=a&&0<a.height&&0<a.width):a=b;return a};var xb=function(a){xb[" "](a);return a};xb[" "]=aa;var yb=!v||v&&9<=bb,zb=!v||v&&9<=bb,Ab=v&&!A("9");!x||A("528");w&&A("1.9b")||v&&A("8")||Wa&&A("9.5")||x&&A("528");w&&!A("8")||v&&A("9");var Bb=function(){this.eb=this.eb;this.ic=this.ic};Bb.prototype.eb=!1;var B=function(a,b){this.type=a;this.currentTarget=this.target=b;this.defaultPrevented=this.$=!1;this.wb=!0};B.prototype.stopPropagation=function(){this.$=!0};B.prototype.preventDefault=function(){this.defaultPrevented=!0;this.wb=!1};var C=function(a,b){B.call(this,a?a.type:"");this.relatedTarget=this.currentTarget=this.target=null;this.charCode=this.keyCode=this.button=this.screenY=this.screenX=this.clientY=this.clientX=this.offsetY=this.offsetX=0;this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.kb=!1;this.O=null;if(a){var c=this.type=a.type;this.target=a.target||a.srcElement;this.currentTarget=b;var d=a.relatedTarget;if(d){if(w){var e;t:{try{xb(d.nodeName);e=!0;break t}catch(g){}e=!1}e||(d=null)}}else"mouseover"==
 c?d=a.fromElement:"mouseout"==c&&(d=a.toElement);this.relatedTarget=d;this.offsetX=x||void 0!==a.offsetX?a.offsetX:a.layerX;this.offsetY=x||void 0!==a.offsetY?a.offsetY:a.layerY;this.clientX=void 0!==a.clientX?a.clientX:a.pageX;this.clientY=void 0!==a.clientY?a.clientY:a.pageY;this.screenX=a.screenX||0;this.screenY=a.screenY||0;this.button=a.button;this.keyCode=a.keyCode||0;this.charCode=a.charCode||("keypress"==c?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=
-a.metaKey;this.kb=y?a.metaKey:a.ctrlKey;this.state=a.state;this.O=a;a.defaultPrevented&&this.preventDefault()}};p(C,B);var Bb=[1,4,2],Cb=function(a){return xb?0==a.O.button:"click"==a.type?!0:!!(a.O.button&Bb[0])};C.prototype.stopPropagation=function(){C.f.stopPropagation.call(this);this.O.stopPropagation?this.O.stopPropagation():this.O.cancelBubble=!0};
-C.prototype.preventDefault=function(){C.f.preventDefault.call(this);var a=this.O;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,zb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Db="closure_listenable_"+(1E6*Math.random()|0),Eb=0;var Fb=function(a,b,c,d,e){this.W=a;this.Ea=null;this.src=b;this.type=c;this.Fa=!!d;this.Ha=e;this.key=++Eb;this.ha=this.Ga=!1},Gb=function(a){a.ha=!0;a.W=null;a.Ea=null;a.src=null;a.Ha=null};var D=function(a){this.src=a;this.m={};this.ua=0};D.prototype.add=function(a,b,c,d,e){var g=a.toString();a=this.m[g];a||(a=this.m[g]=[],this.ua++);var h=Hb(a,b,d,e);-1<h?(b=a[h],c||(b.Ga=!1)):(b=new Fb(b,this.src,g,!!d,e),b.Ga=c,a.push(b));return b};D.prototype.remove=function(a,b,c,d){a=a.toString();if(!(a in this.m))return!1;var e=this.m[a];b=Hb(e,b,c,d);return-1<b?(Gb(e[b]),q(null!=e.length),r.splice.call(e,b,1),0==e.length&&(delete this.m[a],this.ua--),!0):!1};
-var Ib=function(a,b){var c=b.type;if(!(c in a.m))return!1;var d=Ea(a.m[c],b);d&&(Gb(b),0==a.m[c].length&&(delete a.m[c],a.ua--));return d};D.prototype.ab=function(a){a=a&&a.toString();var b=0,c;for(c in this.m)if(!a||c==a){for(var d=this.m[c],e=0;e<d.length;e++)++b,Gb(d[e]);delete this.m[c];this.ua--}return b};D.prototype.wa=function(a,b,c,d){a=this.m[a.toString()];var e=-1;a&&(e=Hb(a,b,c,d));return-1<e?a[e]:null};
-var Hb=function(a,b,c,d){for(var e=0;e<a.length;++e){var g=a[e];if(!g.ha&&g.W==b&&g.Fa==!!c&&g.Ha==d)return e}return-1};var Jb="closure_lm_"+(1E6*Math.random()|0),Kb={},Lb=0,E=function(a,b,c,d,e){if(da(b)){for(var g=0;g<b.length;g++)E(a,b[g],c,d,e);return null}c=Mb(c);if(a&&a[Db])a=a.c(b,c,d,e);else{if(!b)throw Error("Invalid event type");var g=!!d,h=Nb(a);h||(a[Jb]=h=new D(a));c=h.add(b,c,!1,d,e);c.Ea||(d=Ob(),c.Ea=d,d.src=a,d.W=c,a.addEventListener?a.addEventListener(b.toString(),d,g):a.attachEvent(Pb(b.toString()),d),Lb++);a=c}return a},Ob=function(){var a=Qb,b=yb?function(c){return a.call(b.src,b.W,c)}:function(c){c=
-a.call(b.src,b.W,c);if(!c)return c};return b},Rb=function(a,b,c,d,e){if(da(b))for(var g=0;g<b.length;g++)Rb(a,b[g],c,d,e);else c=Mb(c),a&&a[Db]?a.u(b,c,d,e):a&&(a=Nb(a))&&(b=a.wa(b,c,!!d,e))&&F(b)},F=function(a){if("number"==typeof a||!a||a.ha)return!1;var b=a.src;if(b&&b[Db])return Ib(b.Y,a);var c=a.type,d=a.Ea;b.removeEventListener?b.removeEventListener(c,d,a.Fa):b.detachEvent&&b.detachEvent(Pb(c),d);Lb--;(c=Nb(b))?(Ib(c,a),0==c.ua&&(c.src=null,b[Jb]=null)):Gb(a);return!0},Pb=function(a){return a in
-Kb?Kb[a]:Kb[a]="on"+a},Tb=function(a,b,c,d){var e=1;if(a=Nb(a))if(b=a.m[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var g=b[a];g&&g.Fa==c&&!g.ha&&(e&=!1!==Sb(g,d))}return Boolean(e)},Sb=function(a,b){var c=a.W,d=a.Ha||a.src;a.Ga&&F(a);return c.call(d,b)},Qb=function(a,b){if(a.ha)return!0;if(!yb){var c;if(!(c=b))t:{c=["window","event"];for(var d=l,e;e=c.shift();)if(null!=d[e])d=d[e];else{c=null;break t}c=d}e=c;c=new C(e,this);d=!0;if(!(0>e.keyCode||void 0!=e.returnValue)){t:{var g=!1;if(0==
-e.keyCode)try{e.keyCode=-1;break t}catch(h){g=!0}if(g||void 0==e.returnValue)e.returnValue=!0}e=[];for(g=c.currentTarget;g;g=g.parentNode)e.push(g);for(var g=a.type,k=e.length-1;!c.$&&0<=k;k--)c.currentTarget=e[k],d&=Tb(e[k],g,!0,c);for(k=0;!c.$&&k<e.length;k++)c.currentTarget=e[k],d&=Tb(e[k],g,!1,c)}return d}return Sb(a,new C(b,this))},Nb=function(a){a=a[Jb];return a instanceof D?a:null},Ub="__closure_events_fn_"+(1E9*Math.random()>>>0),Mb=function(a){q(a,"Listener can not be null.");if(n(a))return a;
-q(a.handleEvent,"An object listener must have handleEvent method.");a[Ub]||(a[Ub]=function(b){return a.handleEvent(b)});return a[Ub]};var G=function(a){Ab.call(this);this.Eb=a;this.Ma={}};p(G,Ab);var Vb=[];G.prototype.c=function(a,b,c,d){da(b)||(b&&(Vb[0]=b.toString()),b=Vb);for(var e=0;e<b.length;e++){var g=E(a,b[e],c||this.handleEvent,d||!1,this.Eb||this);if(!g)break;this.Ma[g.key]=g}return this};
-G.prototype.u=function(a,b,c,d,e){if(da(b))for(var g=0;g<b.length;g++)this.u(a,b[g],c,d,e);else c=c||this.handleEvent,e=e||this.Eb||this,c=Mb(c),d=!!d,b=a&&a[Db]?a.wa(b,c,d,e):a?(a=Nb(a))?a.wa(b,c,d,e):null:null,b&&(F(b),delete this.Ma[b.key]);return this};G.prototype.ab=function(){Ma(this.Ma,F);this.Ma={}};G.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};var H=function(){Ab.call(this);this.Y=new D(this);this.dc=this;this.nb=null};p(H,Ab);H.prototype[Db]=!0;f=H.prototype;f.hb=function(a){this.nb=a};f.addEventListener=function(a,b,c,d){E(this,a,b,c,d)};f.removeEventListener=function(a,b,c,d){Rb(this,a,b,c,d)};
-f.dispatchEvent=function(a){Wb(this);var b,c=this.nb;if(c){b=[];for(var d=1;c;c=c.nb)b.push(c),q(1E3>++d,"infinite loop")}c=this.dc;d=a.type||a;if(m(a))a=new B(a,c);else if(a instanceof B)a.target=a.target||c;else{var e=a;a=new B(d,c);Ra(a,e)}var e=!0,g;if(b)for(var h=b.length-1;!a.$&&0<=h;h--)g=a.currentTarget=b[h],e=Xb(g,d,!0,a)&&e;a.$||(g=a.currentTarget=c,e=Xb(g,d,!0,a)&&e,a.$||(e=Xb(g,d,!1,a)&&e));if(b)for(h=0;!a.$&&h<b.length;h++)g=a.currentTarget=b[h],e=Xb(g,d,!1,a)&&e;return e};
-f.c=function(a,b,c,d){Wb(this);return this.Y.add(String(a),b,!1,c,d)};f.u=function(a,b,c,d){return this.Y.remove(String(a),b,c,d)};var Xb=function(a,b,c,d){b=a.Y.m[String(b)];if(!b)return!0;b=b.concat();for(var e=!0,g=0;g<b.length;++g){var h=b[g];if(h&&!h.ha&&h.Fa==c){var k=h.W,I=h.Ha||h.src;h.Ga&&Ib(a.Y,h);e=!1!==k.call(I,d)&&e}}return e&&0!=d.wb};H.prototype.wa=function(a,b,c,d){return this.Y.wa(String(a),b,c,d)};var Wb=function(a){q(a.Y,"Event target is not initialized. Did you call the superclass (goog.events.EventTarget) constructor?")};var J=function(a,b){a.style.display=b?"":"none"},Yb=w?"MozUserSelect":x?"WebkitUserSelect":null,Zb=function(a,b,c){c=c?null:a.getElementsByTagName("*");if(Yb){if(b=b?"none":"",a.style[Yb]=b,c){a=0;for(var d;d=c[a];a++)d.style[Yb]=b}}else if(v||Va)if(b=b?"on":"",a.setAttribute("unselectable",b),c)for(a=0;d=c[a];a++)d.setAttribute("unselectable",b)};var $b=function(){};ba($b);$b.prototype.gc=0;var L=function(a){H.call(this);this.A=a||fb();this.Ca=ac;this.da=null;this.g=!1;this.d=null;this.pa=void 0;this.F=this.q=this.p=null};p(L,H);L.prototype.fc=$b.ia();
-var ac=null,bc=function(a,b){switch(a){case 1:return b?"disable":"enable";case 2:return b?"highlight":"unhighlight";case 4:return b?"activate":"deactivate";case 8:return b?"select":"unselect";case 16:return b?"check":"uncheck";case 32:return b?"focus":"blur";case 64:return b?"open":"close"}throw Error("Invalid component state");},cc=function(a){return a.da||(a.da=":"+(a.fc.gc++).toString(36))},dc=function(a,b){if(a.p&&a.p.F){var c=a.p.F,d=a.da;d in c&&delete c[d];Oa(a.p.F,b,a)}a.da=b};
-L.prototype.a=function(){return this.d};var ec=function(a){a.pa||(a.pa=new G(a));return a.pa},gc=function(a,b){if(a==b)throw Error("Unable to set parent component");if(b&&a.p&&a.da&&fc(a.p,a.da)&&a.p!=b)throw Error("Unable to set parent component");a.p=b;L.f.hb.call(a,b)};f=L.prototype;f.getParent=function(){return this.p};f.hb=function(a){if(this.p&&this.p!=a)throw Error("Method not supported");L.f.hb.call(this,a)};f.mb=function(){return this.A};f.o=function(){this.d=this.A.createElement("div")};
-f.K=function(a){if(this.g)throw Error("Component already rendered");if(a&&this.X(a)){var b=eb(a);this.A&&this.A.Q==b||(this.A=fb(a));this.Za(a);this.D()}else throw Error("Invalid element to decorate");};f.X=function(){return!0};f.Za=function(a){this.d=a};f.D=function(){this.g=!0;hc(this,function(a){!a.g&&a.a()&&a.D()})};f.ba=function(){hc(this,function(a){a.g&&a.ba()});this.pa&&this.pa.ab();this.g=!1};f.Da=function(a,b){this.Va(a,M(this),b)};
-f.Va=function(a,b,c){q(!!a,"Provided element must not be null.");if(a.g&&(c||!this.g))throw Error("Component already rendered");if(0>b||b>M(this))throw Error("Child component index out of bounds");this.F&&this.q||(this.F={},this.q=[]);if(a.getParent()==this){var d=cc(a);this.F[d]=a;Ea(this.q,a)}else Oa(this.F,cc(a),a);gc(a,this);Ha(this.q,b,0,a);if(a.g&&this.g&&a.getParent()==this)c=this.C(),c.insertBefore(a.a(),c.childNodes[b]||null);else if(c){this.d||this.o();c=N(this,b+1);b=this.C();c=c?c.d:null;
+a.metaKey;this.kb=y?a.metaKey:a.ctrlKey;this.state=a.state;this.O=a;a.defaultPrevented&&this.preventDefault()}};p(C,B);var Cb=[1,4,2],Db=function(a){return yb?0==a.O.button:"click"==a.type?!0:!!(a.O.button&Cb[0])};C.prototype.stopPropagation=function(){C.f.stopPropagation.call(this);this.O.stopPropagation?this.O.stopPropagation():this.O.cancelBubble=!0};
+C.prototype.preventDefault=function(){C.f.preventDefault.call(this);var a=this.O;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Ab)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Eb="closure_listenable_"+(1E6*Math.random()|0),Fb=0;var Gb=function(a,b,c,d,e){this.W=a;this.Ea=null;this.src=b;this.type=c;this.Fa=!!d;this.Ha=e;this.key=++Fb;this.ha=this.Ga=!1},Hb=function(a){a.ha=!0;a.W=null;a.Ea=null;a.src=null;a.Ha=null};var D=function(a){this.src=a;this.m={};this.ua=0};D.prototype.add=function(a,b,c,d,e){var g=a.toString();a=this.m[g];a||(a=this.m[g]=[],this.ua++);var h=Ib(a,b,d,e);-1<h?(b=a[h],c||(b.Ga=!1)):(b=new Gb(b,this.src,g,!!d,e),b.Ga=c,a.push(b));return b};D.prototype.remove=function(a,b,c,d){a=a.toString();if(!(a in this.m))return!1;var e=this.m[a];b=Ib(e,b,c,d);return-1<b?(Hb(e[b]),q(null!=e.length),r.splice.call(e,b,1),0==e.length&&(delete this.m[a],this.ua--),!0):!1};
+var Jb=function(a,b){var c=b.type;if(!(c in a.m))return!1;var d=Fa(a.m[c],b);d&&(Hb(b),0==a.m[c].length&&(delete a.m[c],a.ua--));return d};D.prototype.ab=function(a){a=a&&a.toString();var b=0,c;for(c in this.m)if(!a||c==a){for(var d=this.m[c],e=0;e<d.length;e++)++b,Hb(d[e]);delete this.m[c];this.ua--}return b};D.prototype.wa=function(a,b,c,d){a=this.m[a.toString()];var e=-1;a&&(e=Ib(a,b,c,d));return-1<e?a[e]:null};
+var Ib=function(a,b,c,d){for(var e=0;e<a.length;++e){var g=a[e];if(!g.ha&&g.W==b&&g.Fa==!!c&&g.Ha==d)return e}return-1};var Kb="closure_lm_"+(1E6*Math.random()|0),Lb={},Mb=0,E=function(a,b,c,d,e){if(da(b)){for(var g=0;g<b.length;g++)E(a,b[g],c,d,e);return null}c=Nb(c);if(a&&a[Eb])a=a.c(b,c,d,e);else{if(!b)throw Error("Invalid event type");var g=!!d,h=Ob(a);h||(a[Kb]=h=new D(a));c=h.add(b,c,!1,d,e);c.Ea||(d=Pb(),c.Ea=d,d.src=a,d.W=c,a.addEventListener?a.addEventListener(b.toString(),d,g):a.attachEvent(Qb(b.toString()),d),Mb++);a=c}return a},Pb=function(){var a=Rb,b=zb?function(c){return a.call(b.src,b.W,c)}:function(c){c=
+a.call(b.src,b.W,c);if(!c)return c};return b},Sb=function(a,b,c,d,e){if(da(b))for(var g=0;g<b.length;g++)Sb(a,b[g],c,d,e);else c=Nb(c),a&&a[Eb]?a.u(b,c,d,e):a&&(a=Ob(a))&&(b=a.wa(b,c,!!d,e))&&F(b)},F=function(a){if("number"==typeof a||!a||a.ha)return!1;var b=a.src;if(b&&b[Eb])return Jb(b.Y,a);var c=a.type,d=a.Ea;b.removeEventListener?b.removeEventListener(c,d,a.Fa):b.detachEvent&&b.detachEvent(Qb(c),d);Mb--;(c=Ob(b))?(Jb(c,a),0==c.ua&&(c.src=null,b[Kb]=null)):Hb(a);return!0},Qb=function(a){return a in
+Lb?Lb[a]:Lb[a]="on"+a},Ub=function(a,b,c,d){var e=1;if(a=Ob(a))if(b=a.m[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var g=b[a];g&&g.Fa==c&&!g.ha&&(e&=!1!==Tb(g,d))}return Boolean(e)},Tb=function(a,b){var c=a.W,d=a.Ha||a.src;a.Ga&&F(a);return c.call(d,b)},Rb=function(a,b){if(a.ha)return!0;if(!zb){var c;if(!(c=b))t:{c=["window","event"];for(var d=l,e;e=c.shift();)if(null!=d[e])d=d[e];else{c=null;break t}c=d}e=c;c=new C(e,this);d=!0;if(!(0>e.keyCode||void 0!=e.returnValue)){t:{var g=!1;if(0==
+e.keyCode)try{e.keyCode=-1;break t}catch(h){g=!0}if(g||void 0==e.returnValue)e.returnValue=!0}e=[];for(g=c.currentTarget;g;g=g.parentNode)e.push(g);for(var g=a.type,k=e.length-1;!c.$&&0<=k;k--)c.currentTarget=e[k],d&=Ub(e[k],g,!0,c);for(k=0;!c.$&&k<e.length;k++)c.currentTarget=e[k],d&=Ub(e[k],g,!1,c)}return d}return Tb(a,new C(b,this))},Ob=function(a){a=a[Kb];return a instanceof D?a:null},Vb="__closure_events_fn_"+(1E9*Math.random()>>>0),Nb=function(a){q(a,"Listener can not be null.");if(n(a))return a;
+q(a.handleEvent,"An object listener must have handleEvent method.");a[Vb]||(a[Vb]=function(b){return a.handleEvent(b)});return a[Vb]};var G=function(a){Bb.call(this);this.Eb=a;this.Ma={}};p(G,Bb);var Wb=[];G.prototype.c=function(a,b,c,d){da(b)||(b&&(Wb[0]=b.toString()),b=Wb);for(var e=0;e<b.length;e++){var g=E(a,b[e],c||this.handleEvent,d||!1,this.Eb||this);if(!g)break;this.Ma[g.key]=g}return this};
+G.prototype.u=function(a,b,c,d,e){if(da(b))for(var g=0;g<b.length;g++)this.u(a,b[g],c,d,e);else c=c||this.handleEvent,e=e||this.Eb||this,c=Nb(c),d=!!d,b=a&&a[Eb]?a.wa(b,c,d,e):a?(a=Ob(a))?a.wa(b,c,d,e):null:null,b&&(F(b),delete this.Ma[b.key]);return this};G.prototype.ab=function(){Na(this.Ma,F);this.Ma={}};G.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};var H=function(){Bb.call(this);this.Y=new D(this);this.dc=this;this.nb=null};p(H,Bb);H.prototype[Eb]=!0;f=H.prototype;f.hb=function(a){this.nb=a};f.addEventListener=function(a,b,c,d){E(this,a,b,c,d)};f.removeEventListener=function(a,b,c,d){Sb(this,a,b,c,d)};
+f.dispatchEvent=function(a){Xb(this);var b,c=this.nb;if(c){b=[];for(var d=1;c;c=c.nb)b.push(c),q(1E3>++d,"infinite loop")}c=this.dc;d=a.type||a;if(m(a))a=new B(a,c);else if(a instanceof B)a.target=a.target||c;else{var e=a;a=new B(d,c);Sa(a,e)}var e=!0,g;if(b)for(var h=b.length-1;!a.$&&0<=h;h--)g=a.currentTarget=b[h],e=Yb(g,d,!0,a)&&e;a.$||(g=a.currentTarget=c,e=Yb(g,d,!0,a)&&e,a.$||(e=Yb(g,d,!1,a)&&e));if(b)for(h=0;!a.$&&h<b.length;h++)g=a.currentTarget=b[h],e=Yb(g,d,!1,a)&&e;return e};
+f.c=function(a,b,c,d){Xb(this);return this.Y.add(String(a),b,!1,c,d)};f.u=function(a,b,c,d){return this.Y.remove(String(a),b,c,d)};var Yb=function(a,b,c,d){b=a.Y.m[String(b)];if(!b)return!0;b=b.concat();for(var e=!0,g=0;g<b.length;++g){var h=b[g];if(h&&!h.ha&&h.Fa==c){var k=h.W,I=h.Ha||h.src;h.Ga&&Jb(a.Y,h);e=!1!==k.call(I,d)&&e}}return e&&0!=d.wb};H.prototype.wa=function(a,b,c,d){return this.Y.wa(String(a),b,c,d)};var Xb=function(a){q(a.Y,"Event target is not initialized. Did you call the superclass (goog.events.EventTarget) constructor?")};var J=function(a,b){a.style.display=b?"":"none"},Zb=w?"MozUserSelect":x?"WebkitUserSelect":null,$b=function(a,b,c){c=c?null:a.getElementsByTagName("*");if(Zb){if(b=b?"none":"",a.style[Zb]=b,c){a=0;for(var d;d=c[a];a++)d.style[Zb]=b}}else if(v||Wa)if(b=b?"on":"",a.setAttribute("unselectable",b),c)for(a=0;d=c[a];a++)d.setAttribute("unselectable",b)};var ac=function(){};ba(ac);ac.prototype.gc=0;var L=function(a){H.call(this);this.A=a||gb();this.Ca=bc;this.da=null;this.g=!1;this.d=null;this.pa=void 0;this.F=this.q=this.p=null};p(L,H);L.prototype.fc=ac.ia();
+var bc=null,cc=function(a,b){switch(a){case 1:return b?"disable":"enable";case 2:return b?"highlight":"unhighlight";case 4:return b?"activate":"deactivate";case 8:return b?"select":"unselect";case 16:return b?"check":"uncheck";case 32:return b?"focus":"blur";case 64:return b?"open":"close"}throw Error("Invalid component state");},dc=function(a){return a.da||(a.da=":"+(a.fc.gc++).toString(36))},ec=function(a,b){if(a.p&&a.p.F){var c=a.p.F,d=a.da;d in c&&delete c[d];Pa(a.p.F,b,a)}a.da=b};
+L.prototype.a=function(){return this.d};var fc=function(a){a.pa||(a.pa=new G(a));return a.pa},hc=function(a,b){if(a==b)throw Error("Unable to set parent component");if(b&&a.p&&a.da&&gc(a.p,a.da)&&a.p!=b)throw Error("Unable to set parent component");a.p=b;L.f.hb.call(a,b)};f=L.prototype;f.getParent=function(){return this.p};f.hb=function(a){if(this.p&&this.p!=a)throw Error("Method not supported");L.f.hb.call(this,a)};f.mb=function(){return this.A};f.o=function(){this.d=this.A.createElement("div")};
+f.K=function(a){if(this.g)throw Error("Component already rendered");if(a&&this.X(a)){var b=fb(a);this.A&&this.A.Q==b||(this.A=gb(a));this.Za(a);this.D()}else throw Error("Invalid element to decorate");};f.X=function(){return!0};f.Za=function(a){this.d=a};f.D=function(){this.g=!0;ic(this,function(a){!a.g&&a.a()&&a.D()})};f.ba=function(){ic(this,function(a){a.g&&a.ba()});this.pa&&this.pa.ab();this.g=!1};f.Da=function(a,b){this.Va(a,M(this),b)};
+f.Va=function(a,b,c){q(!!a,"Provided element must not be null.");if(a.g&&(c||!this.g))throw Error("Component already rendered");if(0>b||b>M(this))throw Error("Child component index out of bounds");this.F&&this.q||(this.F={},this.q=[]);if(a.getParent()==this){var d=dc(a);this.F[d]=a;Fa(this.q,a)}else Pa(this.F,dc(a),a);hc(a,this);Ia(this.q,b,0,a);if(a.g&&this.g&&a.getParent()==this)c=this.C(),c.insertBefore(a.a(),c.childNodes[b]||null);else if(c){this.d||this.o();c=N(this,b+1);b=this.C();c=c?c.d:null;
 if(a.g)throw Error("Component already rendered");a.d||a.o();b?b.insertBefore(a.d,c||null):a.A.Q.body.appendChild(a.d);a.p&&!a.p.g||a.D()}else this.g&&!a.g&&a.d&&a.d.parentNode&&1==a.d.parentNode.nodeType&&a.D()};f.C=function(){return this.d};
-var ic=function(a){if(null==a.Ca){var b=a.g?a.d:a.A.Q.body,c;t:{c=eb(b);if(c.defaultView&&c.defaultView.getComputedStyle&&(c=c.defaultView.getComputedStyle(b,null))){c=c.direction||c.getPropertyValue("direction")||"";break t}c=""}a.Ca="rtl"==(c||(b.currentStyle?b.currentStyle.direction:null)||b.style&&b.style.direction)}return a.Ca};L.prototype.ra=function(a){if(this.g)throw Error("Component already rendered");this.Ca=a};
-var M=function(a){return a.q?a.q.length:0},fc=function(a,b){var c;a.F&&b?(c=a.F,c=(b in c?c[b]:void 0)||null):c=null;return c},N=function(a,b){return a.q?a.q[b]||null:null},hc=function(a,b,c){a.q&&s(a.q,b,c)},jc=function(a,b){return a.q&&b?Ba(a.q,b):-1};
-L.prototype.removeChild=function(a,b){if(a){var c=m(a)?a:cc(a);a=fc(this,c);if(c&&a){var d=this.F;c in d&&delete d[c];Ea(this.q,a);b&&(a.ba(),a.d&&(c=a.d)&&c.parentNode&&c.parentNode.removeChild(c));gc(a,null)}}if(!a)throw Error("Child is not in parent component");return a};var kc,lc={oc:"activedescendant",tc:"atomic",uc:"autocomplete",wc:"busy",zc:"checked",Ec:"controls",Gc:"describedby",Jc:"disabled",Lc:"dropeffect",Mc:"expanded",Nc:"flowto",Pc:"grabbed",Tc:"haspopup",Vc:"hidden",Xc:"invalid",Yc:"label",Zc:"labelledby",$c:"level",ed:"live",pd:"multiline",qd:"multiselectable",ud:"orientation",vd:"owns",wd:"posinset",yd:"pressed",Cd:"readonly",Ed:"relevant",Fd:"required",Ld:"selected",Nd:"setsize",Pd:"sort",be:"valuemax",ce:"valuemin",de:"valuenow",ee:"valuetext"};var mc={pc:"alert",qc:"alertdialog",rc:"application",sc:"article",vc:"banner",xc:"button",yc:"checkbox",Ac:"columnheader",Bc:"combobox",Cc:"complementary",Dc:"contentinfo",Fc:"definition",Hc:"dialog",Ic:"directory",Kc:"document",Oc:"form",Qc:"grid",Rc:"gridcell",Sc:"group",Uc:"heading",Wc:"img",ad:"link",bd:"list",cd:"listbox",dd:"listitem",fd:"log",gd:"main",hd:"marquee",jd:"math",kd:"menu",ld:"menubar",md:"menuitem",nd:"menuitemcheckbox",od:"menuitemradio",rd:"navigation",sd:"note",td:"option",
-xd:"presentation",zd:"progressbar",Ad:"radio",Bd:"radiogroup",Dd:"region",Gd:"row",Hd:"rowgroup",Id:"rowheader",Jd:"scrollbar",Kd:"search",Md:"separator",Od:"slider",Qd:"spinbutton",Rd:"status",Sd:"tab",Td:"tablist",Ud:"tabpanel",Vd:"textbox",Wd:"timer",Xd:"toolbar",Yd:"tooltip",Zd:"tree",$d:"treegrid",ae:"treeitem"};var nc=function(a,b){b?(q(Na(mc,b),"No such ARIA role "+b),a.setAttribute("role",b)):a.removeAttribute("role")},pc=function(a,b,c){da(c)&&(c=c.join(" "));var d=oc(b);""===c||void 0==c?(kc||(kc={atomic:!1,autocomplete:"none",dropeffect:"none",haspopup:!1,live:"off",multiline:!1,multiselectable:!1,orientation:"vertical",readonly:!1,relevant:"additions text",required:!1,sort:"none",busy:!1,disabled:!1,hidden:!1,invalid:"false"}),c=kc,b in c?a.setAttribute(d,c[b]):a.removeAttribute(d)):a.setAttribute(d,
-c)},oc=function(a){q(a,"ARIA attribute cannot be empty.");q(Na(lc,a),"No such ARIA attribute "+a);return"aria-"+a};var sc=function(a,b,c,d,e){if(!(v||x&&A("525")))return!0;if(y&&e)return qc(a);if(e&&!d)return!1;"number"==typeof b&&(b=rc(b));if(!c&&(17==b||18==b||y&&91==b))return!1;if(x&&d&&c)switch(a){case 220:case 219:case 221:case 192:case 186:case 189:case 187:case 188:case 190:case 191:case 192:case 222:return!1}if(v&&d&&b==a)return!1;switch(a){case 13:return!0;case 27:return!x}return qc(a)},qc=function(a){if(48<=a&&57>=a||96<=a&&106>=a||65<=a&&90>=a||x&&0==a)return!0;switch(a){case 32:case 63:case 107:case 109:case 110:case 111:case 186:case 59:case 189:case 187:case 61:case 188:case 190:case 191:case 192:case 222:case 219:case 220:case 221:return!0;
-default:return!1}},rc=function(a){if(w)a=tc(a);else if(y&&x)t:switch(a){case 93:a=91;break t}return a},tc=function(a){switch(a){case 61:return 187;case 59:return 186;case 173:return 189;case 224:return 91;case 0:return 224;default:return a}};var O=function(a,b){H.call(this);a&&uc(this,a,b)};p(O,H);f=O.prototype;f.d=null;f.Ia=null;f.Ya=null;f.Ja=null;f.r=-1;f.N=-1;f.lb=!1;
-var vc={3:13,12:144,63232:38,63233:40,63234:37,63235:39,63236:112,63237:113,63238:114,63239:115,63240:116,63241:117,63242:118,63243:119,63244:120,63245:121,63246:122,63247:123,63248:44,63272:46,63273:36,63275:35,63276:33,63277:34,63289:144,63302:45},wc={Up:38,Down:40,Left:37,Right:39,Enter:13,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,"U+007F":46,Home:36,End:35,PageUp:33,PageDown:34,Insert:45},xc=v||x&&A("525"),yc=y&&w;
-O.prototype.Tb=function(a){x&&(17==this.r&&!a.ctrlKey||18==this.r&&!a.altKey||y&&91==this.r&&!a.metaKey)&&(this.N=this.r=-1);-1==this.r&&(a.ctrlKey&&17!=a.keyCode?this.r=17:a.altKey&&18!=a.keyCode?this.r=18:a.metaKey&&91!=a.keyCode&&(this.r=91));xc&&!sc(a.keyCode,this.r,a.shiftKey,a.ctrlKey,a.altKey)?this.handleEvent(a):(this.N=rc(a.keyCode),yc&&(this.lb=a.altKey))};O.prototype.Ub=function(a){this.N=this.r=-1;this.lb=a.altKey};
-O.prototype.handleEvent=function(a){var b=a.O,c,d,e=b.altKey;v&&"keypress"==a.type?(c=this.N,d=13!=c&&27!=c?b.keyCode:0):x&&"keypress"==a.type?(c=this.N,d=0<=b.charCode&&63232>b.charCode&&qc(c)?b.charCode:0):Va?(c=this.N,d=qc(c)?b.keyCode:0):(c=b.keyCode||this.N,d=b.charCode||0,yc&&(e=this.lb),y&&63==d&&224==c&&(c=191));var g=c=rc(c),h=b.keyIdentifier;c?63232<=c&&c in vc?g=vc[c]:25==c&&a.shiftKey&&(g=9):h&&h in wc&&(g=wc[h]);a=g==this.r;this.r=g;b=new zc(g,d,a,b);b.altKey=e;this.dispatchEvent(b)};
-O.prototype.a=function(){return this.d};var uc=function(a,b,c){a.Ja&&a.detach();a.d=b;a.Ia=E(a.d,"keypress",a,c);a.Ya=E(a.d,"keydown",a.Tb,c,a);a.Ja=E(a.d,"keyup",a.Ub,c,a)};O.prototype.detach=function(){this.Ia&&(F(this.Ia),F(this.Ya),F(this.Ja),this.Ja=this.Ya=this.Ia=null);this.d=null;this.N=this.r=-1};var zc=function(a,b,c,d){C.call(this,d);this.type="key";this.keyCode=a;this.charCode=b;this.repeat=c};p(zc,C);var Q=function(a){if(a.classList)return a.classList;a=a.className;return m(a)&&a.match(/\S+/g)||[]},Ac=function(a,b){return a.classList?a.classList.contains(b):t(Q(a),b)},Bc=function(a,b){a.classList?a.classList.add(b):Ac(a,b)||(a.className+=0<a.className.length?" "+b:b)},Cc=function(a,b){if(a.classList)s(b,function(b){Bc(a,b)});else{var c={};s(Q(a),function(a){c[a]=!0});s(b,function(a){c[a]=!0});a.className="";for(var d in c)a.className+=0<a.className.length?" "+d:d}},Dc=function(a,b){a.classList?
-a.classList.remove(b):Ac(a,b)&&(a.className=Ca(Q(a),function(a){return a!=b}).join(" "))},Ec=function(a,b){a.classList?s(b,function(b){Dc(a,b)}):a.className=Ca(Q(a),function(a){return!t(b,a)}).join(" ")};var Gc=function(a,b){if(!a)throw Error("Invalid class name "+a);if(!n(b))throw Error("Invalid decorator function "+b);Fc[a]=b},Hc={},Fc={};var R=function(a){this.Hb=a};ba(R);R.prototype.fa=function(){return this.Hb};var Ic=function(a,b){a&&(a.tabIndex=b?0:-1)};f=R.prototype;f.o=function(a){return a.mb().o("div",this.ta(a).join(" "))};f.C=function(a){return a};f.X=function(a){return"DIV"==a.tagName};f.K=function(a,b){b.id&&dc(a,b.id);var c=this.v(),d=!1,e=Q(b);e&&s(e,function(b){b==c?d=!0:b&&this.bb(a,b,c)},this);d||Bc(b,c);Jc(a,this.C(b));return b};
-f.bb=function(a,b,c){b==c+"-disabled"?a.ca(!1):b==c+"-horizontal"?Kc(a,"horizontal"):b==c+"-vertical"&&Kc(a,"vertical")};var Jc=function(a,b){if(b)for(var c=b.firstChild,d;c&&c.parentNode==b;){d=c.nextSibling;if(1==c.nodeType){var e;t:{var g=c;e=void 0;q(g);for(var g=Q(g),h=0,k=g.length;h<k;h++)if(e=g[h],e=e in Fc?Fc[e]():null)break t;e=null}e&&(e.d=c,a.isEnabled()||e.ca(!1),a.Da(e),e.K(c))}else c.nodeValue&&""!=oa(c.nodeValue)||b.removeChild(c);c=d}};
-R.prototype.Oa=function(a){a=a.a();q(a,"The container DOM element cannot be null.");Zb(a,!0,w);v&&(a.hideFocus=!0);var b=this.fa();b&&nc(a,b)};R.prototype.j=function(a){return a.a()};R.prototype.v=function(){return"goog-container"};R.prototype.ta=function(a){var b=this.v(),c=[b,"horizontal"==a.L?b+"-horizontal":b+"-vertical"];a.isEnabled()||c.push(b+"-disabled");return c};var S=function(){},Lc;ba(S);var Mc={button:"pressed",checkbox:"checked",menuitem:"selected",menuitemcheckbox:"checked",menuitemradio:"checked",radio:"checked",tab:"selected",treeitem:"selected"};f=S.prototype;f.fa=function(){};f.o=function(a){var b=a.mb().o("div",this.ta(a).join(" "),a.Ba);Nc(a,b);return b};f.C=function(a){return a};f.sa=function(a,b,c){if(a=a.a?a.a():a){var d=[b];v&&!A("7")&&(d=Oc(Q(a),b),d.push(b));(c?Cc:Ec)(a,d)}};f.X=function(){return!0};
-f.K=function(a,b){b.id&&dc(a,b.id);var c=this.C(b);c&&c.firstChild?Pc(a,c.firstChild.nextSibling?Fa(c.childNodes):c.firstChild):a.Ba=null;var d=0,e=this.v(),g=this.v(),h=!1,k=!1,I=!1,z=Fa(Q(b));s(z,function(a){h||a!=e?k||a!=g?d|=Qc(this,a):k=!0:(h=!0,g==e&&(k=!0));1==Qc(this,a)&&tb(c)&&ub(c,!1)},this);a.h=d;h||(z.push(e),g==e&&(k=!0));k||z.push(g);var K=a.G;K&&z.push.apply(z,K);if(v&&!A("7")){var P=Oc(z);0<P.length&&(z.push.apply(z,P),I=!0)}if(!h||!k||K||I)b.className=z.join(" ");Nc(a,b);return b};
-f.Oa=function(a){ic(a)&&this.ra(a.a(),!0);a.isEnabled()&&this.oa(a,a.s())};var Rc=function(a,b,c){if(a=c||a.fa())q(b,"The element passed as a first parameter cannot be null."),c=b.getAttribute("role")||null,a!=c&&nc(b,a)},Nc=function(a,b){q(a);q(b);a.s()||pc(b,"hidden",!a.s());a.isEnabled()||Sc(b,1,!a.isEnabled());a.l&8&&Sc(b,8,!!(a.h&8));a.l&16&&Sc(b,16,!!(a.h&16));a.l&64&&Sc(b,64,!!(a.h&64))};f=S.prototype;f.za=function(a,b){Zb(a,!b,!v&&!Va)};f.ra=function(a,b){this.sa(a,this.v()+"-rtl",b)};
-f.I=function(a){var b;return a.l&32&&(b=a.j())?tb(b):!1};f.oa=function(a,b){var c;if(a.l&32&&(c=a.j())){if(!b&&a.h&32){try{c.blur()}catch(d){}a.h&32&&a.ma(null)}tb(c)!=b&&ub(c,b)}};f.ka=function(a,b){J(a,b);a&&pc(a,"hidden",!b)};f.t=function(a,b,c){var d=a.a();if(d){var e=Tc(this,b);e&&this.sa(a,e,c);Sc(d,b,c)}};
-var Sc=function(a,b,c){Lc||(Lc={1:"disabled",8:"selected",16:"checked",64:"expanded"});q(a,"The element passed as a first parameter cannot be null.");b=Lc[b];var d=a.getAttribute("role")||null;d&&(d=Mc[d]||b,b="checked"==b||"selected"==b?d:b);b&&pc(a,b,c)};S.prototype.j=function(a){return a.a()};S.prototype.v=function(){return"goog-control"};
-S.prototype.ta=function(a){var b=this.v(),c=[b],d=this.v();d!=b&&c.push(d);b=a.h;for(d=[];b;){var e=b&-b;d.push(Tc(this,e));b&=~e}c.push.apply(c,d);(a=a.G)&&c.push.apply(c,a);v&&!A("7")&&c.push.apply(c,Oc(c));return c};
-var Oc=function(a,b){var c=[];b&&(a=a.concat([b]));s([],function(d){!Da(d,ja(t,a))||b&&!t(d,b)||c.push(d.join("_"))});return c},Tc=function(a,b){a.Na||Uc(a);return a.Na[b]},Qc=function(a,b){a.Gb||(a.Na||Uc(a),a.Gb=Pa(a.Na));var c=parseInt(a.Gb[b],10);return isNaN(c)?0:c},Uc=function(a){var b=a.v(),c=b.replace(/\xa0|\s/g," ");q(-1==c.indexOf(" "),"ControlRenderer has an invalid css class: '"+b+"'");a.Na={1:b+"-disabled",2:b+"-hover",4:b+"-active",8:b+"-selected",16:b+"-checked",32:b+"-focused",64:b+
-"-open"}};var T=function(a,b,c){L.call(this,c);if(!b){b=this.constructor;for(var d;b;){d=ia(b);if(d=Hc[d])break;b=b.f?b.f.constructor:null}b=d?n(d.ia)?d.ia():new d:null}this.b=b;this.Ba=void 0!==a?a:null};p(T,L);f=T.prototype;f.Ba=null;f.h=0;f.l=39;f.ec=255;f.T=0;f.n=!0;f.G=null;f.Z=!0;f.xa=!1;f.sb=null;f.qb=function(){return this.Z};f.Pa=function(a){this.g&&a!=this.Z&&Vc(this,a);this.Z=a};f.j=function(){return this.b.j(this)};f.ya=function(){return this.ga||(this.ga=new O)};f.Ab=function(){return this.b};
-f.sa=function(a,b){b?a&&(this.G?t(this.G,a)||this.G.push(a):this.G=[a],this.b.sa(this,a,!0)):a&&this.G&&Ea(this.G,a)&&(0==this.G.length&&(this.G=null),this.b.sa(this,a,!1))};f.o=function(){var a=this.b.o(this);this.d=a;Rc(this.b,a,this.sb);this.xa||this.b.za(a,!1);this.s()||this.b.ka(a,!1)};f.C=function(){return this.b.C(this.a())};f.X=function(a){return this.b.X(a)};f.Za=function(a){this.d=a=this.b.K(this,a);Rc(this.b,a,this.sb);this.xa||this.b.za(a,!1);this.n="none"!=a.style.display};
-f.D=function(){T.f.D.call(this);this.b.Oa(this);if(this.l&-2&&(this.qb()&&Vc(this,!0),this.l&32)){var a=this.j();if(a){var b=this.ya();uc(b,a);ec(this).c(b,"key",this.J).c(a,"focus",this.na).c(a,"blur",this.ma)}}};
-var Vc=function(a,b){var c=ec(a),d=a.a();b?(c.c(d,"mouseover",a.Sa).c(d,"mousedown",a.la).c(d,"mouseup",a.Ta).c(d,"mouseout",a.Ra),a.qa!=aa&&c.c(d,"contextmenu",a.qa),v&&c.c(d,"dblclick",a.ub)):(c.u(d,"mouseover",a.Sa).u(d,"mousedown",a.la).u(d,"mouseup",a.Ta).u(d,"mouseout",a.Ra),a.qa!=aa&&c.u(d,"contextmenu",a.qa),v&&c.u(d,"dblclick",a.ub))};T.prototype.ba=function(){T.f.ba.call(this);this.ga&&this.ga.detach();this.s()&&this.isEnabled()&&this.b.oa(this,!1)};var Pc=function(a,b){a.Ba=b};f=T.prototype;
+var jc=function(a){if(null==a.Ca){var b=a.g?a.d:a.A.Q.body,c;t:{c=fb(b);if(c.defaultView&&c.defaultView.getComputedStyle&&(c=c.defaultView.getComputedStyle(b,null))){c=c.direction||c.getPropertyValue("direction")||"";break t}c=""}a.Ca="rtl"==(c||(b.currentStyle?b.currentStyle.direction:null)||b.style&&b.style.direction)}return a.Ca};L.prototype.ra=function(a){if(this.g)throw Error("Component already rendered");this.Ca=a};
+var M=function(a){return a.q?a.q.length:0},gc=function(a,b){var c;a.F&&b?(c=a.F,c=(b in c?c[b]:void 0)||null):c=null;return c},N=function(a,b){return a.q?a.q[b]||null:null},ic=function(a,b,c){a.q&&s(a.q,b,c)},kc=function(a,b){return a.q&&b?Ca(a.q,b):-1};
+L.prototype.removeChild=function(a,b){if(a){var c=m(a)?a:dc(a);a=gc(this,c);if(c&&a){var d=this.F;c in d&&delete d[c];Fa(this.q,a);b&&(a.ba(),a.d&&(c=a.d)&&c.parentNode&&c.parentNode.removeChild(c));hc(a,null)}}if(!a)throw Error("Child is not in parent component");return a};var lc,mc={oc:"activedescendant",tc:"atomic",uc:"autocomplete",wc:"busy",zc:"checked",Ec:"controls",Gc:"describedby",Jc:"disabled",Lc:"dropeffect",Mc:"expanded",Nc:"flowto",Pc:"grabbed",Tc:"haspopup",Vc:"hidden",Xc:"invalid",Yc:"label",Zc:"labelledby",$c:"level",ed:"live",pd:"multiline",qd:"multiselectable",ud:"orientation",vd:"owns",wd:"posinset",yd:"pressed",Cd:"readonly",Ed:"relevant",Fd:"required",Ld:"selected",Nd:"setsize",Pd:"sort",be:"valuemax",ce:"valuemin",de:"valuenow",ee:"valuetext"};var nc={pc:"alert",qc:"alertdialog",rc:"application",sc:"article",vc:"banner",xc:"button",yc:"checkbox",Ac:"columnheader",Bc:"combobox",Cc:"complementary",Dc:"contentinfo",Fc:"definition",Hc:"dialog",Ic:"directory",Kc:"document",Oc:"form",Qc:"grid",Rc:"gridcell",Sc:"group",Uc:"heading",Wc:"img",ad:"link",bd:"list",cd:"listbox",dd:"listitem",fd:"log",gd:"main",hd:"marquee",jd:"math",kd:"menu",ld:"menubar",md:"menuitem",nd:"menuitemcheckbox",od:"menuitemradio",rd:"navigation",sd:"note",td:"option",
+xd:"presentation",zd:"progressbar",Ad:"radio",Bd:"radiogroup",Dd:"region",Gd:"row",Hd:"rowgroup",Id:"rowheader",Jd:"scrollbar",Kd:"search",Md:"separator",Od:"slider",Qd:"spinbutton",Rd:"status",Sd:"tab",Td:"tablist",Ud:"tabpanel",Vd:"textbox",Wd:"timer",Xd:"toolbar",Yd:"tooltip",Zd:"tree",$d:"treegrid",ae:"treeitem"};var oc=function(a,b){b?(q(Oa(nc,b),"No such ARIA role "+b),a.setAttribute("role",b)):a.removeAttribute("role")},qc=function(a,b,c){da(c)&&(c=c.join(" "));var d=pc(b);""===c||void 0==c?(lc||(lc={atomic:!1,autocomplete:"none",dropeffect:"none",haspopup:!1,live:"off",multiline:!1,multiselectable:!1,orientation:"vertical",readonly:!1,relevant:"additions text",required:!1,sort:"none",busy:!1,disabled:!1,hidden:!1,invalid:"false"}),c=lc,b in c?a.setAttribute(d,c[b]):a.removeAttribute(d)):a.setAttribute(d,
+c)},pc=function(a){q(a,"ARIA attribute cannot be empty.");q(Oa(mc,a),"No such ARIA attribute "+a);return"aria-"+a};var tc=function(a,b,c,d,e){if(!(v||x&&A("525")))return!0;if(y&&e)return rc(a);if(e&&!d)return!1;"number"==typeof b&&(b=sc(b));if(!c&&(17==b||18==b||y&&91==b))return!1;if(x&&d&&c)switch(a){case 220:case 219:case 221:case 192:case 186:case 189:case 187:case 188:case 190:case 191:case 192:case 222:return!1}if(v&&d&&b==a)return!1;switch(a){case 13:return!0;case 27:return!x}return rc(a)},rc=function(a){if(48<=a&&57>=a||96<=a&&106>=a||65<=a&&90>=a||x&&0==a)return!0;switch(a){case 32:case 63:case 107:case 109:case 110:case 111:case 186:case 59:case 189:case 187:case 61:case 188:case 190:case 191:case 192:case 222:case 219:case 220:case 221:return!0;
+default:return!1}},sc=function(a){if(w)a=uc(a);else if(y&&x)t:switch(a){case 93:a=91;break t}return a},uc=function(a){switch(a){case 61:return 187;case 59:return 186;case 173:return 189;case 224:return 91;case 0:return 224;default:return a}};var O=function(a,b){H.call(this);a&&vc(this,a,b)};p(O,H);f=O.prototype;f.d=null;f.Ia=null;f.Ya=null;f.Ja=null;f.r=-1;f.N=-1;f.lb=!1;
+var wc={3:13,12:144,63232:38,63233:40,63234:37,63235:39,63236:112,63237:113,63238:114,63239:115,63240:116,63241:117,63242:118,63243:119,63244:120,63245:121,63246:122,63247:123,63248:44,63272:46,63273:36,63275:35,63276:33,63277:34,63289:144,63302:45},xc={Up:38,Down:40,Left:37,Right:39,Enter:13,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,"U+007F":46,Home:36,End:35,PageUp:33,PageDown:34,Insert:45},yc=v||x&&A("525"),zc=y&&w;
+O.prototype.Tb=function(a){x&&(17==this.r&&!a.ctrlKey||18==this.r&&!a.altKey||y&&91==this.r&&!a.metaKey)&&(this.N=this.r=-1);-1==this.r&&(a.ctrlKey&&17!=a.keyCode?this.r=17:a.altKey&&18!=a.keyCode?this.r=18:a.metaKey&&91!=a.keyCode&&(this.r=91));yc&&!tc(a.keyCode,this.r,a.shiftKey,a.ctrlKey,a.altKey)?this.handleEvent(a):(this.N=sc(a.keyCode),zc&&(this.lb=a.altKey))};O.prototype.Ub=function(a){this.N=this.r=-1;this.lb=a.altKey};
+O.prototype.handleEvent=function(a){var b=a.O,c,d,e=b.altKey;v&&"keypress"==a.type?(c=this.N,d=13!=c&&27!=c?b.keyCode:0):x&&"keypress"==a.type?(c=this.N,d=0<=b.charCode&&63232>b.charCode&&rc(c)?b.charCode:0):Wa?(c=this.N,d=rc(c)?b.keyCode:0):(c=b.keyCode||this.N,d=b.charCode||0,zc&&(e=this.lb),y&&63==d&&224==c&&(c=191));var g=c=sc(c),h=b.keyIdentifier;c?63232<=c&&c in wc?g=wc[c]:25==c&&a.shiftKey&&(g=9):h&&h in xc&&(g=xc[h]);a=g==this.r;this.r=g;b=new Ac(g,d,a,b);b.altKey=e;this.dispatchEvent(b)};
+O.prototype.a=function(){return this.d};var vc=function(a,b,c){a.Ja&&a.detach();a.d=b;a.Ia=E(a.d,"keypress",a,c);a.Ya=E(a.d,"keydown",a.Tb,c,a);a.Ja=E(a.d,"keyup",a.Ub,c,a)};O.prototype.detach=function(){this.Ia&&(F(this.Ia),F(this.Ya),F(this.Ja),this.Ja=this.Ya=this.Ia=null);this.d=null;this.N=this.r=-1};var Ac=function(a,b,c,d){C.call(this,d);this.type="key";this.keyCode=a;this.charCode=b;this.repeat=c};p(Ac,C);var Q=function(a){if(a.classList)return a.classList;a=a.className;return m(a)&&a.match(/\S+/g)||[]},Bc=function(a,b){return a.classList?a.classList.contains(b):t(Q(a),b)},Cc=function(a,b){a.classList?a.classList.add(b):Bc(a,b)||(a.className+=0<a.className.length?" "+b:b)},Dc=function(a,b){if(a.classList)s(b,function(b){Cc(a,b)});else{var c={};s(Q(a),function(a){c[a]=!0});s(b,function(a){c[a]=!0});a.className="";for(var d in c)a.className+=0<a.className.length?" "+d:d}},Ec=function(a,b){a.classList?
+a.classList.remove(b):Bc(a,b)&&(a.className=Da(Q(a),function(a){return a!=b}).join(" "))},Fc=function(a,b){a.classList?s(b,function(b){Ec(a,b)}):a.className=Da(Q(a),function(a){return!t(b,a)}).join(" ")};var Hc=function(a,b){if(!a)throw Error("Invalid class name "+a);if(!n(b))throw Error("Invalid decorator function "+b);Gc[a]=b},Ic={},Gc={};var R=function(a){this.Hb=a};ba(R);R.prototype.fa=function(){return this.Hb};var Jc=function(a,b){a&&(a.tabIndex=b?0:-1)};f=R.prototype;f.o=function(a){return a.mb().o("div",this.ta(a).join(" "))};f.C=function(a){return a};f.X=function(a){return"DIV"==a.tagName};f.K=function(a,b){b.id&&ec(a,b.id);var c=this.v(),d=!1,e=Q(b);e&&s(e,function(b){b==c?d=!0:b&&this.bb(a,b,c)},this);d||Cc(b,c);Kc(a,this.C(b));return b};
+f.bb=function(a,b,c){b==c+"-disabled"?a.ca(!1):b==c+"-horizontal"?Lc(a,"horizontal"):b==c+"-vertical"&&Lc(a,"vertical")};var Kc=function(a,b){if(b)for(var c=b.firstChild,d;c&&c.parentNode==b;){d=c.nextSibling;if(1==c.nodeType){var e;t:{var g=c;e=void 0;q(g);for(var g=Q(g),h=0,k=g.length;h<k;h++)if(e=g[h],e=e in Gc?Gc[e]():null)break t;e=null}e&&(e.d=c,a.isEnabled()||e.ca(!1),a.Da(e),e.K(c))}else c.nodeValue&&""!=oa(c.nodeValue)||b.removeChild(c);c=d}};
+R.prototype.Oa=function(a){a=a.a();q(a,"The container DOM element cannot be null.");$b(a,!0,w);v&&(a.hideFocus=!0);var b=this.fa();b&&oc(a,b)};R.prototype.j=function(a){return a.a()};R.prototype.v=function(){return"goog-container"};R.prototype.ta=function(a){var b=this.v(),c=[b,"horizontal"==a.L?b+"-horizontal":b+"-vertical"];a.isEnabled()||c.push(b+"-disabled");return c};var S=function(){},Mc;ba(S);var Nc={button:"pressed",checkbox:"checked",menuitem:"selected",menuitemcheckbox:"checked",menuitemradio:"checked",radio:"checked",tab:"selected",treeitem:"selected"};f=S.prototype;f.fa=function(){};f.o=function(a){var b=a.mb().o("div",this.ta(a).join(" "),a.Ba);Oc(a,b);return b};f.C=function(a){return a};f.sa=function(a,b,c){if(a=a.a?a.a():a){var d=[b];v&&!A("7")&&(d=Pc(Q(a),b),d.push(b));(c?Dc:Fc)(a,d)}};f.X=function(){return!0};
+f.K=function(a,b){b.id&&ec(a,b.id);var c=this.C(b);c&&c.firstChild?Qc(a,c.firstChild.nextSibling?Ga(c.childNodes):c.firstChild):a.Ba=null;var d=0,e=this.v(),g=this.v(),h=!1,k=!1,I=!1,z=Ga(Q(b));s(z,function(a){h||a!=e?k||a!=g?d|=Rc(this,a):k=!0:(h=!0,g==e&&(k=!0));1==Rc(this,a)&&(Aa(c),ub(c)&&vb(c,!1))},this);a.h=d;h||(z.push(e),g==e&&(k=!0));k||z.push(g);var K=a.G;K&&z.push.apply(z,K);if(v&&!A("7")){var P=Pc(z);0<P.length&&(z.push.apply(z,P),I=!0)}if(!h||!k||K||I)b.className=z.join(" ");Oc(a,b);
+return b};f.Oa=function(a){jc(a)&&this.ra(a.a(),!0);a.isEnabled()&&this.oa(a,a.s())};var Sc=function(a,b,c){if(a=c||a.fa())q(b,"The element passed as a first parameter cannot be null."),c=b.getAttribute("role")||null,a!=c&&oc(b,a)},Oc=function(a,b){q(a);q(b);a.s()||qc(b,"hidden",!a.s());a.isEnabled()||Tc(b,1,!a.isEnabled());a.l&8&&Tc(b,8,!!(a.h&8));a.l&16&&Tc(b,16,!!(a.h&16));a.l&64&&Tc(b,64,!!(a.h&64))};f=S.prototype;f.za=function(a,b){$b(a,!b,!v&&!Wa)};
+f.ra=function(a,b){this.sa(a,this.v()+"-rtl",b)};f.I=function(a){var b;return a.l&32&&(b=a.j())?ub(b):!1};f.oa=function(a,b){var c;if(a.l&32&&(c=a.j())){if(!b&&a.h&32){try{c.blur()}catch(d){}a.h&32&&a.ma(null)}ub(c)!=b&&vb(c,b)}};f.ka=function(a,b){J(a,b);a&&qc(a,"hidden",!b)};f.t=function(a,b,c){var d=a.a();if(d){var e=Uc(this,b);e&&this.sa(a,e,c);Tc(d,b,c)}};
+var Tc=function(a,b,c){Mc||(Mc={1:"disabled",8:"selected",16:"checked",64:"expanded"});q(a,"The element passed as a first parameter cannot be null.");b=Mc[b];var d=a.getAttribute("role")||null;d&&(d=Nc[d]||b,b="checked"==b||"selected"==b?d:b);b&&qc(a,b,c)};S.prototype.j=function(a){return a.a()};S.prototype.v=function(){return"goog-control"};
+S.prototype.ta=function(a){var b=this.v(),c=[b],d=this.v();d!=b&&c.push(d);b=a.h;for(d=[];b;){var e=b&-b;d.push(Uc(this,e));b&=~e}c.push.apply(c,d);(a=a.G)&&c.push.apply(c,a);v&&!A("7")&&c.push.apply(c,Pc(c));return c};
+var Pc=function(a,b){var c=[];b&&(a=a.concat([b]));s([],function(d){!Ea(d,ja(t,a))||b&&!t(d,b)||c.push(d.join("_"))});return c},Uc=function(a,b){a.Na||Vc(a);return a.Na[b]},Rc=function(a,b){a.Gb||(a.Na||Vc(a),a.Gb=Qa(a.Na));var c=parseInt(a.Gb[b],10);return isNaN(c)?0:c},Vc=function(a){var b=a.v(),c=b.replace(/\xa0|\s/g," ");q(-1==c.indexOf(" "),"ControlRenderer has an invalid css class: '"+b+"'");a.Na={1:b+"-disabled",2:b+"-hover",4:b+"-active",8:b+"-selected",16:b+"-checked",32:b+"-focused",64:b+
+"-open"}};var T=function(a,b,c){L.call(this,c);if(!b){b=this.constructor;for(var d;b;){d=ia(b);if(d=Ic[d])break;b=b.f?b.f.constructor:null}b=d?n(d.ia)?d.ia():new d:null}this.b=b;this.Ba=void 0!==a?a:null};p(T,L);f=T.prototype;f.Ba=null;f.h=0;f.l=39;f.ec=255;f.T=0;f.n=!0;f.G=null;f.Z=!0;f.xa=!1;f.sb=null;f.qb=function(){return this.Z};f.Pa=function(a){this.g&&a!=this.Z&&Wc(this,a);this.Z=a};f.j=function(){return this.b.j(this)};f.ya=function(){return this.ga||(this.ga=new O)};f.Ab=function(){return this.b};
+f.sa=function(a,b){b?a&&(this.G?t(this.G,a)||this.G.push(a):this.G=[a],this.b.sa(this,a,!0)):a&&this.G&&Fa(this.G,a)&&(0==this.G.length&&(this.G=null),this.b.sa(this,a,!1))};f.o=function(){var a=this.b.o(this);this.d=a;Sc(this.b,a,this.sb);this.xa||this.b.za(a,!1);this.s()||this.b.ka(a,!1)};f.C=function(){return this.b.C(this.a())};f.X=function(a){return this.b.X(a)};f.Za=function(a){this.d=a=this.b.K(this,a);Sc(this.b,a,this.sb);this.xa||this.b.za(a,!1);this.n="none"!=a.style.display};
+f.D=function(){T.f.D.call(this);this.b.Oa(this);if(this.l&-2&&(this.qb()&&Wc(this,!0),this.l&32)){var a=this.j();if(a){var b=this.ya();vc(b,a);fc(this).c(b,"key",this.J).c(a,"focus",this.na).c(a,"blur",this.ma)}}};
+var Wc=function(a,b){var c=fc(a),d=a.a();b?(c.c(d,"mouseover",a.Sa).c(d,"mousedown",a.la).c(d,"mouseup",a.Ta).c(d,"mouseout",a.Ra),a.qa!=aa&&c.c(d,"contextmenu",a.qa),v&&c.c(d,"dblclick",a.ub)):(c.u(d,"mouseover",a.Sa).u(d,"mousedown",a.la).u(d,"mouseup",a.Ta).u(d,"mouseout",a.Ra),a.qa!=aa&&c.u(d,"contextmenu",a.qa),v&&c.u(d,"dblclick",a.ub))};T.prototype.ba=function(){T.f.ba.call(this);this.ga&&this.ga.detach();this.s()&&this.isEnabled()&&this.b.oa(this,!1)};var Qc=function(a,b){a.Ba=b};f=T.prototype;
 f.ra=function(a){T.f.ra.call(this,a);var b=this.a();b&&this.b.ra(b,a)};f.za=function(a){this.xa=a;var b=this.a();b&&this.b.za(b,a)};f.s=function(){return this.n};f.ka=function(a,b){if(b||this.n!=a&&this.dispatchEvent(a?"show":"hide")){var c=this.a();c&&this.b.ka(c,a);this.isEnabled()&&this.b.oa(this,a);this.n=a;return!0}return!1};f.isEnabled=function(){return!(this.h&1)};
-f.ca=function(a){var b=this.getParent();b&&"function"==typeof b.isEnabled&&!b.isEnabled()||!U(this,1,!a)||(a||(this.setActive(!1),this.B(!1)),this.s()&&this.b.oa(this,a),this.t(1,!a,!0))};f.B=function(a){U(this,2,a)&&this.t(2,a)};f.setActive=function(a){U(this,4,a)&&this.t(4,a)};var Wc=function(a,b){U(a,8,b)&&a.t(8,b)},Xc=function(a,b){U(a,64,b)&&a.t(64,b)};T.prototype.t=function(a,b,c){c||1!=a?this.l&a&&b!=!!(this.h&a)&&(this.b.t(this,a,b),this.h=b?this.h|a:this.h&~a):this.ca(!b)};
-var Yc=function(a,b,c){if(a.g&&a.h&b&&!c)throw Error("Component already rendered");!c&&a.h&b&&a.t(b,!1);a.l=c?a.l|b:a.l&~b},V=function(a,b){return!!(a.ec&b)&&!!(a.l&b)},U=function(a,b,c){return!!(a.l&b)&&!!(a.h&b)!=c&&(!(a.T&b)||a.dispatchEvent(bc(b,c)))&&!a.eb};f=T.prototype;f.Sa=function(a){(!a.relatedTarget||!nb(this.a(),a.relatedTarget))&&this.dispatchEvent("enter")&&this.isEnabled()&&V(this,2)&&this.B(!0)};
-f.Ra=function(a){a.relatedTarget&&nb(this.a(),a.relatedTarget)||!this.dispatchEvent("leave")||(V(this,4)&&this.setActive(!1),V(this,2)&&this.B(!1))};f.qa=aa;f.la=function(a){this.isEnabled()&&(V(this,2)&&this.B(!0),!Cb(a)||x&&y&&a.ctrlKey||(V(this,4)&&this.setActive(!0),this.b.I(this)&&this.j().focus()));this.xa||!Cb(a)||x&&y&&a.ctrlKey||a.preventDefault()};f.Ta=function(a){this.isEnabled()&&(V(this,2)&&this.B(!0),this.h&4&&Zc(this,a)&&V(this,4)&&this.setActive(!1))};
-f.ub=function(a){this.isEnabled()&&Zc(this,a)};var Zc=function(a,b){if(V(a,16)){var c=!(a.h&16);U(a,16,c)&&a.t(16,c)}V(a,8)&&Wc(a,!0);V(a,64)&&Xc(a,!(a.h&64));c=new B("action",a);b&&(c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey,c.kb=b.kb);return a.dispatchEvent(c)};T.prototype.na=function(){V(this,32)&&U(this,32,!0)&&this.t(32,!0)};T.prototype.ma=function(){V(this,4)&&this.setActive(!1);V(this,32)&&U(this,32,!1)&&this.t(32,!1)};
-T.prototype.J=function(a){return this.s()&&this.isEnabled()&&this.ob(a)?(a.preventDefault(),a.stopPropagation(),!0):!1};T.prototype.ob=function(a){return 13==a.keyCode&&Zc(this,a)};if(!n(T))throw Error("Invalid component class "+T);if(!n(S))throw Error("Invalid renderer class "+S);var $c=ia(T);Hc[$c]=S;Gc("goog-control",function(){return new T(null)});var W=function(a,b,c){L.call(this,c);this.b=b||R.ia();this.L=a||"vertical"};p(W,L);f=W.prototype;f.vb=null;f.ga=null;f.b=null;f.L=null;f.n=!0;f.U=!0;f.$a=!0;f.e=-1;f.i=null;f.aa=!1;f.Sb=!1;f.Rb=!0;f.M=null;f.j=function(){return this.vb||this.b.j(this)};f.ya=function(){return this.ga||(this.ga=new O(this.j()))};f.Ab=function(){return this.b};f.o=function(){this.d=this.b.o(this)};f.C=function(){return this.b.C(this.a())};f.X=function(a){return this.b.X(a)};
-f.Za=function(a){this.d=this.b.K(this,a);"none"==a.style.display&&(this.n=!1)};f.D=function(){W.f.D.call(this);hc(this,function(a){a.g&&ad(this,a)},this);var a=this.a();this.b.Oa(this);this.ka(this.n,!0);ec(this).c(this,"enter",this.Lb).c(this,"highlight",this.Mb).c(this,"unhighlight",this.Ob).c(this,"open",this.Nb).c(this,"close",this.Jb).c(a,"mousedown",this.la).c(eb(a),"mouseup",this.Kb).c(a,["mousedown","mouseup","mouseover","mouseout","contextmenu"],this.Ib);this.I()&&bd(this,!0)};
-var bd=function(a,b){var c=ec(a),d=a.j();b?c.c(d,"focus",a.na).c(d,"blur",a.ma).c(a.ya(),"key",a.J):c.u(d,"focus",a.na).u(d,"blur",a.ma).u(a.ya(),"key",a.J)};f=W.prototype;f.ba=function(){cd(this,-1);this.i&&Xc(this.i,!1);this.aa=!1;W.f.ba.call(this)};f.Lb=function(){return!0};
-f.Mb=function(a){var b=jc(this,a.target);if(-1<b&&b!=this.e){var c=N(this,this.e);c&&c.B(!1);this.e=b;c=N(this,this.e);this.aa&&c.setActive(!0);this.Rb&&this.i&&c!=this.i&&(c.l&64?Xc(c,!0):Xc(this.i,!1))}b=this.a();q(b,"The DOM element for the container cannot be null.");null!=a.target.a()&&pc(b,"activedescendant",a.target.a().id)};f.Ob=function(a){a.target==N(this,this.e)&&(this.e=-1);a=this.a();q(a,"The DOM element for the container cannot be null.");a.removeAttribute(oc("activedescendant"))};
-f.Nb=function(a){(a=a.target)&&a!=this.i&&a.getParent()==this&&(this.i&&Xc(this.i,!1),this.i=a)};f.Jb=function(a){a.target==this.i&&(this.i=null)};f.la=function(a){this.U&&(this.aa=!0);var b=this.j();b&&tb(b)?b.focus():a.preventDefault()};f.Kb=function(){this.aa=!1};
-f.Ib=function(a){var b;t:{b=a.target;if(this.M)for(var c=this.a();b&&b!==c;){var d=b.id;if(d in this.M){b=this.M[d];break t}b=b.parentNode}b=null}if(b)switch(a.type){case "mousedown":b.la(a);break;case "mouseup":b.Ta(a);break;case "mouseover":b.Sa(a);break;case "mouseout":b.Ra(a);break;case "contextmenu":b.qa(a)}};f.na=function(){};f.ma=function(){cd(this,-1);this.aa=!1;this.i&&Xc(this.i,!1)};
+f.ca=function(a){var b=this.getParent();b&&"function"==typeof b.isEnabled&&!b.isEnabled()||!U(this,1,!a)||(a||(this.setActive(!1),this.B(!1)),this.s()&&this.b.oa(this,a),this.t(1,!a,!0))};f.B=function(a){U(this,2,a)&&this.t(2,a)};f.setActive=function(a){U(this,4,a)&&this.t(4,a)};var Xc=function(a,b){U(a,8,b)&&a.t(8,b)},Yc=function(a,b){U(a,64,b)&&a.t(64,b)};T.prototype.t=function(a,b,c){c||1!=a?this.l&a&&b!=!!(this.h&a)&&(this.b.t(this,a,b),this.h=b?this.h|a:this.h&~a):this.ca(!b)};
+var Zc=function(a,b,c){if(a.g&&a.h&b&&!c)throw Error("Component already rendered");!c&&a.h&b&&a.t(b,!1);a.l=c?a.l|b:a.l&~b},V=function(a,b){return!!(a.ec&b)&&!!(a.l&b)},U=function(a,b,c){return!!(a.l&b)&&!!(a.h&b)!=c&&(!(a.T&b)||a.dispatchEvent(cc(b,c)))&&!a.eb};f=T.prototype;f.Sa=function(a){(!a.relatedTarget||!ob(this.a(),a.relatedTarget))&&this.dispatchEvent("enter")&&this.isEnabled()&&V(this,2)&&this.B(!0)};
+f.Ra=function(a){a.relatedTarget&&ob(this.a(),a.relatedTarget)||!this.dispatchEvent("leave")||(V(this,4)&&this.setActive(!1),V(this,2)&&this.B(!1))};f.qa=aa;f.la=function(a){this.isEnabled()&&(V(this,2)&&this.B(!0),!Db(a)||x&&y&&a.ctrlKey||(V(this,4)&&this.setActive(!0),this.b.I(this)&&this.j().focus()));this.xa||!Db(a)||x&&y&&a.ctrlKey||a.preventDefault()};f.Ta=function(a){this.isEnabled()&&(V(this,2)&&this.B(!0),this.h&4&&$c(this,a)&&V(this,4)&&this.setActive(!1))};
+f.ub=function(a){this.isEnabled()&&$c(this,a)};var $c=function(a,b){if(V(a,16)){var c=!(a.h&16);U(a,16,c)&&a.t(16,c)}V(a,8)&&Xc(a,!0);V(a,64)&&Yc(a,!(a.h&64));c=new B("action",a);b&&(c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey,c.kb=b.kb);return a.dispatchEvent(c)};T.prototype.na=function(){V(this,32)&&U(this,32,!0)&&this.t(32,!0)};T.prototype.ma=function(){V(this,4)&&this.setActive(!1);V(this,32)&&U(this,32,!1)&&this.t(32,!1)};
+T.prototype.J=function(a){return this.s()&&this.isEnabled()&&this.ob(a)?(a.preventDefault(),a.stopPropagation(),!0):!1};T.prototype.ob=function(a){return 13==a.keyCode&&$c(this,a)};if(!n(T))throw Error("Invalid component class "+T);if(!n(S))throw Error("Invalid renderer class "+S);var ad=ia(T);Ic[ad]=S;Hc("goog-control",function(){return new T(null)});var W=function(a,b,c){L.call(this,c);this.b=b||R.ia();this.L=a||"vertical"};p(W,L);f=W.prototype;f.vb=null;f.ga=null;f.b=null;f.L=null;f.n=!0;f.U=!0;f.$a=!0;f.e=-1;f.i=null;f.aa=!1;f.Sb=!1;f.Rb=!0;f.M=null;f.j=function(){return this.vb||this.b.j(this)};f.ya=function(){return this.ga||(this.ga=new O(this.j()))};f.Ab=function(){return this.b};f.o=function(){this.d=this.b.o(this)};f.C=function(){return this.b.C(this.a())};f.X=function(a){return this.b.X(a)};
+f.Za=function(a){this.d=this.b.K(this,a);"none"==a.style.display&&(this.n=!1)};f.D=function(){W.f.D.call(this);ic(this,function(a){a.g&&bd(this,a)},this);var a=this.a();this.b.Oa(this);this.ka(this.n,!0);fc(this).c(this,"enter",this.Lb).c(this,"highlight",this.Mb).c(this,"unhighlight",this.Ob).c(this,"open",this.Nb).c(this,"close",this.Jb).c(a,"mousedown",this.la).c(fb(a),"mouseup",this.Kb).c(a,["mousedown","mouseup","mouseover","mouseout","contextmenu"],this.Ib);this.I()&&cd(this,!0)};
+var cd=function(a,b){var c=fc(a),d=a.j();b?c.c(d,"focus",a.na).c(d,"blur",a.ma).c(a.ya(),"key",a.J):c.u(d,"focus",a.na).u(d,"blur",a.ma).u(a.ya(),"key",a.J)};f=W.prototype;f.ba=function(){dd(this,-1);this.i&&Yc(this.i,!1);this.aa=!1;W.f.ba.call(this)};f.Lb=function(){return!0};
+f.Mb=function(a){var b=kc(this,a.target);if(-1<b&&b!=this.e){var c=N(this,this.e);c&&c.B(!1);this.e=b;c=N(this,this.e);this.aa&&c.setActive(!0);this.Rb&&this.i&&c!=this.i&&(c.l&64?Yc(c,!0):Yc(this.i,!1))}b=this.a();q(b,"The DOM element for the container cannot be null.");null!=a.target.a()&&qc(b,"activedescendant",a.target.a().id)};f.Ob=function(a){a.target==N(this,this.e)&&(this.e=-1);a=this.a();q(a,"The DOM element for the container cannot be null.");a.removeAttribute(pc("activedescendant"))};
+f.Nb=function(a){(a=a.target)&&a!=this.i&&a.getParent()==this&&(this.i&&Yc(this.i,!1),this.i=a)};f.Jb=function(a){a.target==this.i&&(this.i=null)};f.la=function(a){this.U&&(this.aa=!0);var b=this.j();b&&ub(b)?b.focus():a.preventDefault()};f.Kb=function(){this.aa=!1};
+f.Ib=function(a){var b;t:{b=a.target;if(this.M)for(var c=this.a();b&&b!==c;){var d=b.id;if(d in this.M){b=this.M[d];break t}b=b.parentNode}b=null}if(b)switch(a.type){case "mousedown":b.la(a);break;case "mouseup":b.Ta(a);break;case "mouseover":b.Sa(a);break;case "mouseout":b.Ra(a);break;case "contextmenu":b.qa(a)}};f.na=function(){};f.ma=function(){dd(this,-1);this.aa=!1;this.i&&Yc(this.i,!1)};
 f.J=function(a){return this.isEnabled()&&this.s()&&(0!=M(this)||this.vb)&&this.ob(a)?(a.preventDefault(),a.stopPropagation(),!0):!1};
-f.ob=function(a){var b=N(this,this.e);if(b&&"function"==typeof b.J&&b.J(a)||this.i&&this.i!=b&&"function"==typeof this.i.J&&this.i.J(a))return!0;if(a.shiftKey||a.ctrlKey||a.metaKey||a.altKey)return!1;switch(a.keyCode){case 27:if(this.I())this.j().blur();else return!1;break;case 36:dd(this);break;case 35:ed(this);break;case 38:if("vertical"==this.L)fd(this);else return!1;break;case 37:if("horizontal"==this.L)ic(this)?gd(this):fd(this);else return!1;break;case 40:if("vertical"==this.L)gd(this);else return!1;
-break;case 39:if("horizontal"==this.L)ic(this)?fd(this):gd(this);else return!1;break;default:return!1}return!0};var ad=function(a,b){var c=b.a(),c=c.id||(c.id=cc(b));a.M||(a.M={});a.M[c]=b};W.prototype.Da=function(a,b){Aa(a,T,"The child of a container must be a control");W.f.Da.call(this,a,b)};
-W.prototype.Va=function(a,b,c){Aa(a,T);a.T|=2;a.T|=64;!this.I()&&this.Sb||Yc(a,32,!1);a.Pa(!1);var d=a.getParent()==this?jc(this,a):-1;W.f.Va.call(this,a,b,c);a.g&&this.g&&ad(this,a);a=d;-1==a&&(a=M(this));a==this.e?this.e=Math.min(M(this)-1,b):a>this.e&&b<=this.e?this.e++:a<this.e&&b>this.e&&this.e--};
-W.prototype.removeChild=function(a,b){a=m(a)?fc(this,a):a;Aa(a,T);if(a){var c=jc(this,a);-1!=c&&(c==this.e?(a.B(!1),this.e=-1):c<this.e&&this.e--);var d=a.a();d&&d.id&&this.M&&(c=this.M,d=d.id,d in c&&delete c[d])}a=W.f.removeChild.call(this,a,b);a.Pa(!0);return a};var Kc=function(a,b){if(a.a())throw Error("Component already rendered");a.L=b};f=W.prototype;f.s=function(){return this.n};
-f.ka=function(a,b){if(b||this.n!=a&&this.dispatchEvent(a?"show":"hide")){this.n=a;var c=this.a();c&&(J(c,a),this.I()&&Ic(this.j(),this.U&&this.n),b||this.dispatchEvent(this.n?"aftershow":"afterhide"));return!0}return!1};f.isEnabled=function(){return this.U};f.ca=function(a){this.U!=a&&this.dispatchEvent(a?"enable":"disable")&&(a?(this.U=!0,hc(this,function(a){a.xb?delete a.xb:a.ca(!0)})):(hc(this,function(a){a.isEnabled()?a.ca(!1):a.xb=!0}),this.aa=this.U=!1),this.I()&&Ic(this.j(),a&&this.n))};
-f.I=function(){return this.$a};f.oa=function(a){a!=this.$a&&this.g&&bd(this,a);this.$a=a;this.U&&this.n&&Ic(this.j(),a)};var cd=function(a,b){var c=N(a,b);c?c.B(!0):-1<a.e&&N(a,a.e).B(!1)};W.prototype.B=function(a){cd(this,jc(this,a))};
-var dd=function(a){hd(a,function(a,c){return(a+1)%c},M(a)-1)},ed=function(a){hd(a,function(a,c){a--;return 0>a?c-1:a},0)},gd=function(a){hd(a,function(a,c){return(a+1)%c},a.e)},fd=function(a){hd(a,function(a,c){a--;return 0>a?c-1:a},a.e)},hd=function(a,b,c){c=0>c?jc(a,a.i):c;var d=M(a);c=b.call(a,c,d);for(var e=0;e<=d;){var g=N(a,c);if(g&&g.s()&&g.isEnabled()&&g.l&2){a.Wa(c);break}e++;c=b.call(a,c,d)}};W.prototype.Wa=function(a){cd(this,a)};var id=function(){};p(id,S);ba(id);f=id.prototype;f.v=function(){return"goog-tab"};f.fa=function(){return"tab"};f.o=function(a){var b=id.f.o.call(this,a);(a=a.Ua())&&this.Xa(b,a);return b};f.K=function(a,b){b=id.f.K.call(this,a,b);var c=this.Ua(b);c&&(a.tb=c);a.h&8&&(c=a.getParent())&&n(c.V)&&(a.t(8,!1),c.V(a));return b};f.Ua=function(a){return a.title||""};f.Xa=function(a,b){a&&(a.title=b||"")};var jd=function(a,b,c){T.call(this,a,b||id.ia(),c);Yc(this,8,!0);this.T|=9};p(jd,T);jd.prototype.Ua=function(){return this.tb};jd.prototype.Xa=function(a){this.Ab().Xa(this.a(),a);this.tb=a};Gc("goog-tab",function(){return new jd(null)});var X=function(){this.Hb="tablist"};p(X,R);ba(X);X.prototype.v=function(){return"goog-tab-bar"};X.prototype.bb=function(a,b,c){this.Bb||(this.Ka||kd(this),this.Bb=Pa(this.Ka));var d=this.Bb[b];d?(Kc(a,ld(d)),a.yb=d):X.f.bb.call(this,a,b,c)};X.prototype.ta=function(a){var b=X.f.ta.call(this,a);this.Ka||kd(this);b.push(this.Ka[a.yb]);return b};var kd=function(a){var b=a.v();a.Ka={top:b+"-top",bottom:b+"-bottom",start:b+"-start",end:b+"-end"}};var Y=function(a,b,c){a=a||"top";Kc(this,ld(a));this.yb=a;W.call(this,this.L,b||X.ia(),c);md(this)};p(Y,W);f=Y.prototype;f.ac=!0;f.H=null;f.D=function(){Y.f.D.call(this);md(this)};f.removeChild=function(a,b){nd(this,a);return Y.f.removeChild.call(this,a,b)};f.Wa=function(a){Y.f.Wa.call(this,a);this.ac&&this.V(N(this,a))};f.V=function(a){a?Wc(a,!0):this.H&&Wc(this.H,!1)};
-var nd=function(a,b){if(b&&b==a.H){for(var c=jc(a,b),d=c-1;b=N(a,d);d--)if(b.s()&&b.isEnabled()){a.V(b);return}for(c+=1;b=N(a,c);c++)if(b.s()&&b.isEnabled()){a.V(b);return}a.V(null)}};f=Y.prototype;f.Zb=function(a){this.H&&this.H!=a.target&&Wc(this.H,!1);this.H=a.target};f.$b=function(a){a.target==this.H&&(this.H=null)};f.Xb=function(a){nd(this,a.target)};f.Yb=function(a){nd(this,a.target)};f.na=function(){N(this,this.e)||this.B(this.H||N(this,0))};
-var md=function(a){ec(a).c(a,"select",a.Zb).c(a,"unselect",a.$b).c(a,"disable",a.Xb).c(a,"hide",a.Yb)},ld=function(a){return"start"==a||"end"==a?"vertical":"horizontal"};Gc("goog-tab-bar",function(){return new Y});var Z=function(a,b,c,d,e){function g(a){a&&(a.tabIndex=0,nc(a,h.fa()),Bc(a,"goog-zippy-header"),od(h,a),a&&h.Pb.c(a,"keydown",h.Qb))}H.call(this);this.A=e||fb();this.R=this.A.a(a)||null;this.Aa=this.A.a(d||null);this.ea=(this.Qa=n(b)?b:null)||!b?null:this.A.a(b);this.k=1==c;this.Pb=new G(this);this.rb=new G(this);var h=this;g(this.R);g(this.Aa);this.S(this.k)};p(Z,H);f=Z.prototype;f.Z=!0;f.fa=function(){return"tab"};f.C=function(){return this.ea};f.toggle=function(){this.S(!this.k)};
-f.S=function(a){this.ea?J(this.ea,a):a&&this.Qa&&(this.ea=this.Qa());this.ea&&Bc(this.ea,"goog-zippy-content");if(this.Aa)J(this.R,!a),J(this.Aa,a);else if(this.R){var b=this.R;a?Bc(b,"goog-zippy-expanded"):Dc(b,"goog-zippy-expanded");b=this.R;a?Dc(b,"goog-zippy-collapsed"):Bc(b,"goog-zippy-collapsed");pc(this.R,"expanded",a)}this.k=a;this.dispatchEvent(new pd("toggle",this))};f.qb=function(){return this.Z};f.Pa=function(a){this.Z!=a&&((this.Z=a)?(od(this,this.R),od(this,this.Aa)):this.rb.ab())};
-var od=function(a,b){b&&a.rb.c(b,"click",a.bc)};Z.prototype.Qb=function(a){if(13==a.keyCode||32==a.keyCode)this.toggle(),this.dispatchEvent(new B("action",this)),a.preventDefault(),a.stopPropagation()};Z.prototype.bc=function(){this.toggle();this.dispatchEvent(new B("action",this))};var pd=function(a,b){B.call(this,a,b)};p(pd,B);var rd=function(a,b){this.pb=[];for(var c=hb("span","ae-zippy",gb(document,a)),d=0,e;e=c[d];d++){var g=e.parentNode.parentNode.parentNode;if(void 0!=g.nextElementSibling)g=g.nextElementSibling;else for(g=g.nextSibling;g&&1!=g.nodeType;)g=g.nextSibling;e=new Z(e,g,!1);this.pb.push(e)}this.hc=new qd(this.pb,gb(document,b))};rd.prototype.lc=function(){return this.hc};rd.prototype.mc=function(){return this.pb};
-var qd=function(a,b){this.va=a;if(this.va.length)for(var c=0,d;d=this.va[c];c++)E(d,"toggle",this.Wb,!1,this);this.La=0;this.k=!1;c="ae-toggle ae-plus ae-action";this.va.length||(c+=" ae-disabled");this.P=lb("span",{className:c},"Expand All");E(this.P,"click",this.Vb,!1,this);b&&b.appendChild(this.P)};qd.prototype.Vb=function(){this.va.length&&this.S(!this.k)};
-qd.prototype.Wb=function(a){a=a.currentTarget;this.La=a.k?this.La+1:this.La-1;a.k!=this.k&&(a.k?(this.k=!0,sd(this,!0)):0==this.La&&(this.k=!1,sd(this,!1)))};qd.prototype.S=function(a){this.k=a;a=0;for(var b;b=this.va[a];a++)b.k!=this.k&&b.S(this.k);sd(this)};
-var sd=function(a,b){(void 0!==b?b:a.k)?(La(a.P,"ae-plus"),Ja(a.P,"ae-minus"),ob(a.P,"Collapse All")):(La(a.P,"ae-minus"),Ja(a.P,"ae-plus"),ob(a.P,"Expand All"))},td=function(a){this.cc=a;this.Db={};var b,c=lb("div",{},b=lb("div",{id:"ae-stats-details-tabs",className:"goog-tab-bar goog-tab-bar-top"}),lb("div",{className:"goog-tab-bar-clear"}),a=lb("div",{id:"ae-stats-details-tabs-content",className:"goog-tab-content"})),d=new Y;d.K(b);E(d,"select",this.Cb,!1,this);E(d,"unselect",this.Cb,!1,this);
-b=0;for(var e;e=this.cc[b];b++)if(e=gb(document,"ae-stats-details-"+e)){var g=hb("h2",null,e)[0],h;h=g;var k=void 0;cb&&"innerText"in h?k=h.innerText.replace(/(\r\n|\r|\n)/g,"\n"):(k=[],vb(h,k,!0),k=k.join(""));k=k.replace(/ \xAD /g," ").replace(/\xAD/g,"");k=k.replace(/\u200B/g,"");cb||(k=k.replace(/ +/g," "));" "!=k&&(k=k.replace(/^\s*/,""));h=k;g&&g.parentNode&&g.parentNode.removeChild(g);g=new jd(h);this.Db[ia(g)]=e;d.Da(g,!0);a.appendChild(e);0==b?d.V(g):J(e,!1)}gb(document,"bd").appendChild(c)};
-td.prototype.Cb=function(a){var b=this.Db[ia(a.target)];J(b,"select"==a.type)};ka("ae.Stats.Details.Tabs",td);ka("goog.ui.Zippy",Z);Z.prototype.setExpanded=Z.prototype.S;ka("ae.Stats.MakeZippys",rd);rd.prototype.getExpandCollapse=rd.prototype.lc;rd.prototype.getZippys=rd.prototype.mc;qd.prototype.setExpanded=qd.prototype.S;var $=function(){this.cb=[];this.jb=[]},ud=[[5,.2,1],[6,.2,1.2],[5,.25,1.25],[6,.25,1.5],[4,.5,2],[5,.5,2.5],[6,.5,3],[4,1,4],[5,1,5],[6,1,6],[4,2,8],[5,2,10]],vd=function(a){if(0>=a)return[2,.5,1];for(var b=1;1>a;)a*=10,b/=10;for(;10<=a;)a/=10,b*=10;for(var c=0;c<ud.length;c++)if(a<=ud[c][2])return[ud[c][0],ud[c][1]*b,ud[c][2]*b];return[5,2*b,10*b]};$.prototype.ib="stats/static/pix.gif";$.prototype.w="ae-stats-gantt-";$.prototype.gb=0;$.prototype.write=function(a){this.jb.push(a)};
-var wd=function(a,b,c,d){a.write('<tr class="'+a.w+'axisrow"><td width="20%"></td><td>');a.write('<div class="'+a.w+'axis">');for(var e=0;e<=b;e++)a.write('<img class="'+a.w+'tick" src="'+a.ib+'" alt="" '),a.write('style="left:'+e*c*d+'%"\n>'),a.write('<span class="'+a.w+'scale" style="left:'+e*c*d+'%">'),a.write("&nbsp;"+e*c+"</span>");a.write("</div></td></tr>\n")};
-$.prototype.kc=function(){this.jb=[];var a=vd(this.gb),b=a[0],c=a[1],a=100/a[2];this.write('<table class="'+this.w+'table">\n');wd(this,b,c,a);for(var d=0;d<this.cb.length;d++){var e=this.cb[d];this.write('<tr class="'+this.w+'datarow"><td width="20%">');0<e.label.length&&(0<e.ja.length&&this.write('<a class="'+this.w+'link" href="'+e.ja+'">'),this.write(e.label),0<e.ja.length&&this.write("</a>"));this.write("</td>\n<td>");this.write('<div class="'+this.w+'container">');0<e.ja.length&&this.write('<a class="'+
+f.ob=function(a){var b=N(this,this.e);if(b&&"function"==typeof b.J&&b.J(a)||this.i&&this.i!=b&&"function"==typeof this.i.J&&this.i.J(a))return!0;if(a.shiftKey||a.ctrlKey||a.metaKey||a.altKey)return!1;switch(a.keyCode){case 27:if(this.I())this.j().blur();else return!1;break;case 36:ed(this);break;case 35:fd(this);break;case 38:if("vertical"==this.L)gd(this);else return!1;break;case 37:if("horizontal"==this.L)jc(this)?hd(this):gd(this);else return!1;break;case 40:if("vertical"==this.L)hd(this);else return!1;
+break;case 39:if("horizontal"==this.L)jc(this)?gd(this):hd(this);else return!1;break;default:return!1}return!0};var bd=function(a,b){var c=b.a(),c=c.id||(c.id=dc(b));a.M||(a.M={});a.M[c]=b};W.prototype.Da=function(a,b){Ba(a,T,"The child of a container must be a control");W.f.Da.call(this,a,b)};
+W.prototype.Va=function(a,b,c){Ba(a,T);a.T|=2;a.T|=64;!this.I()&&this.Sb||Zc(a,32,!1);a.Pa(!1);var d=a.getParent()==this?kc(this,a):-1;W.f.Va.call(this,a,b,c);a.g&&this.g&&bd(this,a);a=d;-1==a&&(a=M(this));a==this.e?this.e=Math.min(M(this)-1,b):a>this.e&&b<=this.e?this.e++:a<this.e&&b>this.e&&this.e--};
+W.prototype.removeChild=function(a,b){a=m(a)?gc(this,a):a;Ba(a,T);if(a){var c=kc(this,a);-1!=c&&(c==this.e?(a.B(!1),this.e=-1):c<this.e&&this.e--);var d=a.a();d&&d.id&&this.M&&(c=this.M,d=d.id,d in c&&delete c[d])}a=W.f.removeChild.call(this,a,b);a.Pa(!0);return a};var Lc=function(a,b){if(a.a())throw Error("Component already rendered");a.L=b};f=W.prototype;f.s=function(){return this.n};
+f.ka=function(a,b){if(b||this.n!=a&&this.dispatchEvent(a?"show":"hide")){this.n=a;var c=this.a();c&&(J(c,a),this.I()&&Jc(this.j(),this.U&&this.n),b||this.dispatchEvent(this.n?"aftershow":"afterhide"));return!0}return!1};f.isEnabled=function(){return this.U};f.ca=function(a){this.U!=a&&this.dispatchEvent(a?"enable":"disable")&&(a?(this.U=!0,ic(this,function(a){a.xb?delete a.xb:a.ca(!0)})):(ic(this,function(a){a.isEnabled()?a.ca(!1):a.xb=!0}),this.aa=this.U=!1),this.I()&&Jc(this.j(),a&&this.n))};
+f.I=function(){return this.$a};f.oa=function(a){a!=this.$a&&this.g&&cd(this,a);this.$a=a;this.U&&this.n&&Jc(this.j(),a)};var dd=function(a,b){var c=N(a,b);c?c.B(!0):-1<a.e&&N(a,a.e).B(!1)};W.prototype.B=function(a){dd(this,kc(this,a))};
+var ed=function(a){id(a,function(a,c){return(a+1)%c},M(a)-1)},fd=function(a){id(a,function(a,c){a--;return 0>a?c-1:a},0)},hd=function(a){id(a,function(a,c){return(a+1)%c},a.e)},gd=function(a){id(a,function(a,c){a--;return 0>a?c-1:a},a.e)},id=function(a,b,c){c=0>c?kc(a,a.i):c;var d=M(a);c=b.call(a,c,d);for(var e=0;e<=d;){var g=N(a,c);if(g&&g.s()&&g.isEnabled()&&g.l&2){a.Wa(c);break}e++;c=b.call(a,c,d)}};W.prototype.Wa=function(a){dd(this,a)};var jd=function(){};p(jd,S);ba(jd);f=jd.prototype;f.v=function(){return"goog-tab"};f.fa=function(){return"tab"};f.o=function(a){var b=jd.f.o.call(this,a);(a=a.Ua())&&this.Xa(b,a);return b};f.K=function(a,b){b=jd.f.K.call(this,a,b);var c=this.Ua(b);c&&(a.tb=c);a.h&8&&(c=a.getParent())&&n(c.V)&&(a.t(8,!1),c.V(a));return b};f.Ua=function(a){return a.title||""};f.Xa=function(a,b){a&&(a.title=b||"")};var kd=function(a,b,c){T.call(this,a,b||jd.ia(),c);Zc(this,8,!0);this.T|=9};p(kd,T);kd.prototype.Ua=function(){return this.tb};kd.prototype.Xa=function(a){this.Ab().Xa(this.a(),a);this.tb=a};Hc("goog-tab",function(){return new kd(null)});var X=function(){this.Hb="tablist"};p(X,R);ba(X);X.prototype.v=function(){return"goog-tab-bar"};X.prototype.bb=function(a,b,c){this.Bb||(this.Ka||ld(this),this.Bb=Qa(this.Ka));var d=this.Bb[b];d?(Lc(a,md(d)),a.yb=d):X.f.bb.call(this,a,b,c)};X.prototype.ta=function(a){var b=X.f.ta.call(this,a);this.Ka||ld(this);b.push(this.Ka[a.yb]);return b};var ld=function(a){var b=a.v();a.Ka={top:b+"-top",bottom:b+"-bottom",start:b+"-start",end:b+"-end"}};var Y=function(a,b,c){a=a||"top";Lc(this,md(a));this.yb=a;W.call(this,this.L,b||X.ia(),c);nd(this)};p(Y,W);f=Y.prototype;f.ac=!0;f.H=null;f.D=function(){Y.f.D.call(this);nd(this)};f.removeChild=function(a,b){od(this,a);return Y.f.removeChild.call(this,a,b)};f.Wa=function(a){Y.f.Wa.call(this,a);this.ac&&this.V(N(this,a))};f.V=function(a){a?Xc(a,!0):this.H&&Xc(this.H,!1)};
+var od=function(a,b){if(b&&b==a.H){for(var c=kc(a,b),d=c-1;b=N(a,d);d--)if(b.s()&&b.isEnabled()){a.V(b);return}for(c+=1;b=N(a,c);c++)if(b.s()&&b.isEnabled()){a.V(b);return}a.V(null)}};f=Y.prototype;f.Zb=function(a){this.H&&this.H!=a.target&&Xc(this.H,!1);this.H=a.target};f.$b=function(a){a.target==this.H&&(this.H=null)};f.Xb=function(a){od(this,a.target)};f.Yb=function(a){od(this,a.target)};f.na=function(){N(this,this.e)||this.B(this.H||N(this,0))};
+var nd=function(a){fc(a).c(a,"select",a.Zb).c(a,"unselect",a.$b).c(a,"disable",a.Xb).c(a,"hide",a.Yb)},md=function(a){return"start"==a||"end"==a?"vertical":"horizontal"};Hc("goog-tab-bar",function(){return new Y});var Z=function(a,b,c,d,e){function g(a){a&&(a.tabIndex=0,oc(a,h.fa()),Cc(a,"goog-zippy-header"),pd(h,a),a&&h.Pb.c(a,"keydown",h.Qb))}H.call(this);this.A=e||gb();this.R=this.A.a(a)||null;this.Aa=this.A.a(d||null);this.ea=(this.Qa=n(b)?b:null)||!b?null:this.A.a(b);this.k=1==c;this.Pb=new G(this);this.rb=new G(this);var h=this;g(this.R);g(this.Aa);this.S(this.k)};p(Z,H);f=Z.prototype;f.Z=!0;f.fa=function(){return"tab"};f.C=function(){return this.ea};f.toggle=function(){this.S(!this.k)};
+f.S=function(a){this.ea?J(this.ea,a):a&&this.Qa&&(this.ea=this.Qa());this.ea&&Cc(this.ea,"goog-zippy-content");if(this.Aa)J(this.R,!a),J(this.Aa,a);else if(this.R){var b=this.R;a?Cc(b,"goog-zippy-expanded"):Ec(b,"goog-zippy-expanded");b=this.R;a?Ec(b,"goog-zippy-collapsed"):Cc(b,"goog-zippy-collapsed");qc(this.R,"expanded",a)}this.k=a;this.dispatchEvent(new qd("toggle",this))};f.qb=function(){return this.Z};f.Pa=function(a){this.Z!=a&&((this.Z=a)?(pd(this,this.R),pd(this,this.Aa)):this.rb.ab())};
+var pd=function(a,b){b&&a.rb.c(b,"click",a.bc)};Z.prototype.Qb=function(a){if(13==a.keyCode||32==a.keyCode)this.toggle(),this.dispatchEvent(new B("action",this)),a.preventDefault(),a.stopPropagation()};Z.prototype.bc=function(){this.toggle();this.dispatchEvent(new B("action",this))};var qd=function(a,b){B.call(this,a,b)};p(qd,B);var sd=function(a,b){this.pb=[];for(var c=ib("span","ae-zippy",hb(document,a)),d=0,e;e=c[d];d++){var g=e.parentNode.parentNode.parentNode;if(void 0!=g.nextElementSibling)g=g.nextElementSibling;else for(g=g.nextSibling;g&&1!=g.nodeType;)g=g.nextSibling;e=new Z(e,g,!1);this.pb.push(e)}this.hc=new rd(this.pb,hb(document,b))};sd.prototype.lc=function(){return this.hc};sd.prototype.mc=function(){return this.pb};
+var rd=function(a,b){this.va=a;if(this.va.length)for(var c=0,d;d=this.va[c];c++)E(d,"toggle",this.Wb,!1,this);this.La=0;this.k=!1;c="ae-toggle ae-plus ae-action";this.va.length||(c+=" ae-disabled");this.P=mb("span",{className:c},"Expand All");E(this.P,"click",this.Vb,!1,this);b&&b.appendChild(this.P)};rd.prototype.Vb=function(){this.va.length&&this.S(!this.k)};
+rd.prototype.Wb=function(a){a=a.currentTarget;this.La=a.k?this.La+1:this.La-1;a.k!=this.k&&(a.k?(this.k=!0,td(this,!0)):0==this.La&&(this.k=!1,td(this,!1)))};rd.prototype.S=function(a){this.k=a;a=0;for(var b;b=this.va[a];a++)b.k!=this.k&&b.S(this.k);td(this)};
+var td=function(a,b){(void 0!==b?b:a.k)?(Ma(a.P,"ae-plus"),Ka(a.P,"ae-minus"),pb(a.P,"Collapse All")):(Ma(a.P,"ae-minus"),Ka(a.P,"ae-plus"),pb(a.P,"Expand All"))},ud=function(a){this.cc=a;this.Db={};var b,c=mb("div",{},b=mb("div",{id:"ae-stats-details-tabs",className:"goog-tab-bar goog-tab-bar-top"}),mb("div",{className:"goog-tab-bar-clear"}),a=mb("div",{id:"ae-stats-details-tabs-content",className:"goog-tab-content"})),d=new Y;d.K(b);E(d,"select",this.Cb,!1,this);E(d,"unselect",this.Cb,!1,this);
+b=0;for(var e;e=this.cc[b];b++)if(e=hb(document,"ae-stats-details-"+e)){var g=ib("h2",null,e)[0],h;h=g;var k=void 0;db&&"innerText"in h?k=h.innerText.replace(/(\r\n|\r|\n)/g,"\n"):(k=[],wb(h,k,!0),k=k.join(""));k=k.replace(/ \xAD /g," ").replace(/\xAD/g,"");k=k.replace(/\u200B/g,"");db||(k=k.replace(/ +/g," "));" "!=k&&(k=k.replace(/^\s*/,""));h=k;g&&g.parentNode&&g.parentNode.removeChild(g);g=new kd(h);this.Db[ia(g)]=e;d.Da(g,!0);a.appendChild(e);0==b?d.V(g):J(e,!1)}hb(document,"bd").appendChild(c)};
+ud.prototype.Cb=function(a){var b=this.Db[ia(a.target)];J(b,"select"==a.type)};ka("ae.Stats.Details.Tabs",ud);ka("goog.ui.Zippy",Z);Z.prototype.setExpanded=Z.prototype.S;ka("ae.Stats.MakeZippys",sd);sd.prototype.getExpandCollapse=sd.prototype.lc;sd.prototype.getZippys=sd.prototype.mc;rd.prototype.setExpanded=rd.prototype.S;var $=function(){this.cb=[];this.jb=[]},vd=[[5,.2,1],[6,.2,1.2],[5,.25,1.25],[6,.25,1.5],[4,.5,2],[5,.5,2.5],[6,.5,3],[4,1,4],[5,1,5],[6,1,6],[4,2,8],[5,2,10]],wd=function(a){if(0>=a)return[2,.5,1];for(var b=1;1>a;)a*=10,b/=10;for(;10<=a;)a/=10,b*=10;for(var c=0;c<vd.length;c++)if(a<=vd[c][2])return[vd[c][0],vd[c][1]*b,vd[c][2]*b];return[5,2*b,10*b]};$.prototype.ib="stats/static/pix.gif";$.prototype.w="ae-stats-gantt-";$.prototype.gb=0;$.prototype.write=function(a){this.jb.push(a)};
+var xd=function(a,b,c,d){a.write('<tr class="'+a.w+'axisrow"><td width="20%"></td><td>');a.write('<div class="'+a.w+'axis">');for(var e=0;e<=b;e++)a.write('<img class="'+a.w+'tick" src="'+a.ib+'" alt="" '),a.write('style="left:'+e*c*d+'%"\n>'),a.write('<span class="'+a.w+'scale" style="left:'+e*c*d+'%">'),a.write("&nbsp;"+e*c+"</span>");a.write("</div></td></tr>\n")};
+$.prototype.kc=function(){this.jb=[];var a=wd(this.gb),b=a[0],c=a[1],a=100/a[2];this.write('<table class="'+this.w+'table">\n');xd(this,b,c,a);for(var d=0;d<this.cb.length;d++){var e=this.cb[d];this.write('<tr class="'+this.w+'datarow"><td width="20%">');0<e.label.length&&(0<e.ja.length&&this.write('<a class="'+this.w+'link" href="'+e.ja+'">'),this.write(e.label),0<e.ja.length&&this.write("</a>"));this.write("</td>\n<td>");this.write('<div class="'+this.w+'container">');0<e.ja.length&&this.write('<a class="'+
 this.w+'link" href="'+e.ja+'"\n>');this.write('<img class="'+this.w+'bar" src="'+this.ib+'" alt="" ');this.write('style="left:'+e.start*a+"%;width:"+e.duration*a+'%;min-width:1px"\n>');0<e.fb&&(this.write('<img class="'+this.w+'extra" src="'+this.ib+'" alt="" '),this.write('style="left:'+e.start*a+"%;width:"+e.fb*a+'%"\n>'));0<e.zb.length&&(this.write('<span class="'+this.w+'inline" style="left:'+(e.start+Math.max(e.duration,e.fb))*a+'%">&nbsp;'),this.write(e.zb),this.write("</span>"));0<e.ja.length&&
-this.write("</a>");this.write("</div></td></tr>\n")}wd(this,b,c,a);this.write("</table>\n");return this.jb.join("")};$.prototype.jc=function(a,b,c,d,e,g){this.gb=Math.max(this.gb,Math.max(b+c,b+d));this.cb.push({label:a,start:b,duration:c,fb:d,zb:e,ja:g})};ka("Gantt",$);$.prototype.add_bar=$.prototype.jc;$.prototype.draw=$.prototype.kc;})();
+this.write("</a>");this.write("</div></td></tr>\n")}xd(this,b,c,a);this.write("</table>\n");return this.jb.join("")};$.prototype.jc=function(a,b,c,d,e,g){this.gb=Math.max(this.gb,Math.max(b+c,b+d));this.cb.push({label:a,start:b,duration:c,fb:d,zb:e,ja:g})};ka("Gantt",$);$.prototype.add_bar=$.prototype.jc;$.prototype.draw=$.prototype.kc;})();
diff --git a/google/appengine/ext/appstats/ui.py b/google/appengine/ext/appstats/ui.py
index e22dbfb..cdf4175 100644
--- a/google/appengine/ext/appstats/ui.py
+++ b/google/appengine/ext/appstats/ui.py
@@ -32,6 +32,7 @@
 """
 
 
+
 import cgi
 import cStringIO
 import email.Utils
diff --git a/google/appengine/ext/blobstore/blobstore.py b/google/appengine/ext/blobstore/blobstore.py
index 97461f5..72a2265 100644
--- a/google/appengine/ext/blobstore/blobstore.py
+++ b/google/appengine/ext/blobstore/blobstore.py
@@ -34,6 +34,7 @@
 
 
 
+
 import base64
 import email
 import email.message
diff --git a/google/appengine/ext/builtins/__init__.py b/google/appengine/ext/builtins/__init__.py
index 1a9719e..13c7a02 100644
--- a/google/appengine/ext/builtins/__init__.py
+++ b/google/appengine/ext/builtins/__init__.py
@@ -37,6 +37,7 @@
 
 
 
+
 import logging
 import os
 
diff --git a/google/appengine/ext/bulkload/bulkload_deprecated.py b/google/appengine/ext/bulkload/bulkload_deprecated.py
index 8ed0f3c..e56d060 100644
--- a/google/appengine/ext/bulkload/bulkload_deprecated.py
+++ b/google/appengine/ext/bulkload/bulkload_deprecated.py
@@ -31,6 +31,7 @@
 
 
 
+
 import Cookie
 import StringIO
 import csv
diff --git a/google/appengine/ext/bulkload/bulkloader_config.py b/google/appengine/ext/bulkload/bulkloader_config.py
index 29b1954..91159a4 100644
--- a/google/appengine/ext/bulkload/bulkloader_config.py
+++ b/google/appengine/ext/bulkload/bulkloader_config.py
@@ -35,6 +35,7 @@
 
 
 
+
 import copy
 import os
 import sys
diff --git a/google/appengine/ext/bulkload/bulkloader_errors.py b/google/appengine/ext/bulkload/bulkloader_errors.py
index 067aefd..19b30f8 100644
--- a/google/appengine/ext/bulkload/bulkloader_errors.py
+++ b/google/appengine/ext/bulkload/bulkloader_errors.py
@@ -28,6 +28,7 @@
 
 
 
+
 class Error(Exception):
   """Base bulkloader error type."""
 
diff --git a/google/appengine/ext/bulkload/bulkloader_parser.py b/google/appengine/ext/bulkload/bulkloader_parser.py
index f04754e..07b1c48 100644
--- a/google/appengine/ext/bulkload/bulkloader_parser.py
+++ b/google/appengine/ext/bulkload/bulkloader_parser.py
@@ -37,6 +37,7 @@
 
 
 
+
 import inspect
 import sys
 
diff --git a/google/appengine/ext/bulkload/connector_interface.py b/google/appengine/ext/bulkload/connector_interface.py
index 47b1438..c3fb9bd 100644
--- a/google/appengine/ext/bulkload/connector_interface.py
+++ b/google/appengine/ext/bulkload/connector_interface.py
@@ -31,6 +31,7 @@
 
 
 
+
 class ConnectorInterface(object):
   """Abstract base class describing the external Connector interface.
 
diff --git a/google/appengine/ext/bulkload/constants.py b/google/appengine/ext/bulkload/constants.py
index 8af9d18..31a663e 100644
--- a/google/appengine/ext/bulkload/constants.py
+++ b/google/appengine/ext/bulkload/constants.py
@@ -23,5 +23,6 @@
 """
 
 
+
 KIND_PARAM = 'kind'
 CSV_PARAM = 'csv'
diff --git a/google/appengine/ext/bulkload/csv_connector.py b/google/appengine/ext/bulkload/csv_connector.py
index 973dc13..0df8b05 100644
--- a/google/appengine/ext/bulkload/csv_connector.py
+++ b/google/appengine/ext/bulkload/csv_connector.py
@@ -34,6 +34,7 @@
 
 
 
+
 import codecs
 import cStringIO
 import csv
diff --git a/google/appengine/ext/bulkload/simpletext_connector.py b/google/appengine/ext/bulkload/simpletext_connector.py
index b934790..c3db4ad 100644
--- a/google/appengine/ext/bulkload/simpletext_connector.py
+++ b/google/appengine/ext/bulkload/simpletext_connector.py
@@ -33,6 +33,7 @@
 
 
 
+
 from google.appengine.ext.bulkload import bulkloader_errors
 from google.appengine.ext.bulkload import connector_interface
 
diff --git a/google/appengine/ext/bulkload/simplexml_connector.py b/google/appengine/ext/bulkload/simplexml_connector.py
index 4ea05cb..f015ca1 100644
--- a/google/appengine/ext/bulkload/simplexml_connector.py
+++ b/google/appengine/ext/bulkload/simplexml_connector.py
@@ -33,6 +33,7 @@
 
 
 
+
 import codecs
 import logging
 import re
diff --git a/google/appengine/ext/bulkload/transform.py b/google/appengine/ext/bulkload/transform.py
index 6348d73..18fa4f9 100644
--- a/google/appengine/ext/bulkload/transform.py
+++ b/google/appengine/ext/bulkload/transform.py
@@ -34,6 +34,7 @@
 
 
 
+
 import base64
 
 import datetime
diff --git a/google/appengine/ext/cloudstorage/cloudstorage_stub.py b/google/appengine/ext/cloudstorage/cloudstorage_stub.py
index fbb15ef..069b7b6 100644
--- a/google/appengine/ext/cloudstorage/cloudstorage_stub.py
+++ b/google/appengine/ext/cloudstorage/cloudstorage_stub.py
@@ -19,6 +19,7 @@
 
 
 
+
 import calendar
 import datetime
 import hashlib
diff --git a/google/appengine/ext/cloudstorage/common.py b/google/appengine/ext/cloudstorage/common.py
index 19e91fb..8379365 100644
--- a/google/appengine/ext/cloudstorage/common.py
+++ b/google/appengine/ext/cloudstorage/common.py
@@ -38,6 +38,7 @@
 
 
 
+
 __all__ = ['CS_XML_NS',
            'CSFileStat',
            'dt_str_to_posix',
diff --git a/google/appengine/ext/cloudstorage/stub_dispatcher.py b/google/appengine/ext/cloudstorage/stub_dispatcher.py
index 3d84853..373ffd7 100644
--- a/google/appengine/ext/cloudstorage/stub_dispatcher.py
+++ b/google/appengine/ext/cloudstorage/stub_dispatcher.py
@@ -26,6 +26,7 @@
 
 
 
+
 import httplib
 import re
 import threading
diff --git a/google/appengine/ext/datastore_admin/backup_handler.py b/google/appengine/ext/datastore_admin/backup_handler.py
index f74f60c..5752398 100644
--- a/google/appengine/ext/datastore_admin/backup_handler.py
+++ b/google/appengine/ext/datastore_admin/backup_handler.py
@@ -34,6 +34,7 @@
 
 
 
+
 import cStringIO
 import datetime
 import itertools
diff --git a/google/appengine/ext/datastore_admin/backup_pb2.py b/google/appengine/ext/datastore_admin/backup_pb2.py
index 8b2f4f9..c934d38 100644
--- a/google/appengine/ext/datastore_admin/backup_pb2.py
+++ b/google/appengine/ext/datastore_admin/backup_pb2.py
@@ -19,6 +19,7 @@
 
 import sys
 _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+import google
 from google.net.proto2.python.public import descriptor as _descriptor
 from google.net.proto2.python.public import message as _message
 from google.net.proto2.python.public import reflection as _reflection
diff --git a/google/appengine/ext/datastore_admin/copy_handler.py b/google/appengine/ext/datastore_admin/copy_handler.py
index 4512830..9544887 100644
--- a/google/appengine/ext/datastore_admin/copy_handler.py
+++ b/google/appengine/ext/datastore_admin/copy_handler.py
@@ -31,6 +31,7 @@
 """
 
 
+
 import logging
 import urllib
 
diff --git a/google/appengine/ext/datastore_admin/delete_handler.py b/google/appengine/ext/datastore_admin/delete_handler.py
index e8a108c..c78917e 100644
--- a/google/appengine/ext/datastore_admin/delete_handler.py
+++ b/google/appengine/ext/datastore_admin/delete_handler.py
@@ -24,6 +24,7 @@
 
 
 
+
 import os
 import re
 import urllib
diff --git a/google/appengine/ext/datastore_admin/main.py b/google/appengine/ext/datastore_admin/main.py
index d743dd1..aa53b3b 100644
--- a/google/appengine/ext/datastore_admin/main.py
+++ b/google/appengine/ext/datastore_admin/main.py
@@ -26,6 +26,7 @@
 """
 
 
+
 import logging
 import operator
 import os
diff --git a/google/appengine/ext/datastore_admin/remote_api_put_stub.py b/google/appengine/ext/datastore_admin/remote_api_put_stub.py
index ef4ecde..b8dae85 100644
--- a/google/appengine/ext/datastore_admin/remote_api_put_stub.py
+++ b/google/appengine/ext/datastore_admin/remote_api_put_stub.py
@@ -38,6 +38,7 @@
 
 
 
+
 import logging
 import pickle
 import random
diff --git a/google/appengine/ext/datastore_admin/utils.py b/google/appengine/ext/datastore_admin/utils.py
index ba05098..fa3c19d 100644
--- a/google/appengine/ext/datastore_admin/utils.py
+++ b/google/appengine/ext/datastore_admin/utils.py
@@ -21,6 +21,7 @@
 """Used render templates for datastore admin."""
 
 
+
 import base64
 import datetime
 import logging
diff --git a/google/appengine/ext/db/__init__.py b/google/appengine/ext/db/__init__.py
index 7ce16ff..0551f18 100644
--- a/google/appengine/ext/db/__init__.py
+++ b/google/appengine/ext/db/__init__.py
@@ -87,6 +87,9 @@
 
 
 
+
+
+
 import copy
 import datetime
 import logging
diff --git a/google/appengine/ext/db/djangoforms.py b/google/appengine/ext/db/djangoforms.py
index 233dfb0..a89f642 100644
--- a/google/appengine/ext/db/djangoforms.py
+++ b/google/appengine/ext/db/djangoforms.py
@@ -87,6 +87,7 @@
 
 
 
+
 import itertools
 import logging
 
diff --git a/google/appengine/ext/db/metadata.py b/google/appengine/ext/db/metadata.py
index dac2357..c1005d4 100644
--- a/google/appengine/ext/db/metadata.py
+++ b/google/appengine/ext/db/metadata.py
@@ -53,6 +53,7 @@
 
 
 
+
 from google.appengine.api import datastore_types
 from google.appengine.ext import db
 
diff --git a/google/appengine/ext/db/polymodel.py b/google/appengine/ext/db/polymodel.py
index 77a7faa..ff7d1a0 100644
--- a/google/appengine/ext/db/polymodel.py
+++ b/google/appengine/ext/db/polymodel.py
@@ -34,6 +34,7 @@
 """
 
 
+
 from google.appengine.ext import db
 
 
diff --git a/google/appengine/ext/db/stats.py b/google/appengine/ext/db/stats.py
index 195dd7e..e044b60 100644
--- a/google/appengine/ext/db/stats.py
+++ b/google/appengine/ext/db/stats.py
@@ -33,6 +33,7 @@
 
 
 
+
 from google.appengine.ext import db
 
 
diff --git a/google/appengine/ext/deferred/__init__.py b/google/appengine/ext/deferred/__init__.py
index 3ee0ac3..227e9b0 100644
--- a/google/appengine/ext/deferred/__init__.py
+++ b/google/appengine/ext/deferred/__init__.py
@@ -26,6 +26,7 @@
 
 
 
+
 from deferred import *
 
 
diff --git a/google/appengine/ext/deferred/deferred.py b/google/appengine/ext/deferred/deferred.py
index dc71e2c..0875e37 100644
--- a/google/appengine/ext/deferred/deferred.py
+++ b/google/appengine/ext/deferred/deferred.py
@@ -91,6 +91,7 @@
 
 
 
+
 import logging
 import os
 import pickle
diff --git a/google/appengine/ext/deferred/handler.py b/google/appengine/ext/deferred/handler.py
index c0feeed..486fbe7 100644
--- a/google/appengine/ext/deferred/handler.py
+++ b/google/appengine/ext/deferred/handler.py
@@ -31,6 +31,7 @@
 
 
 
+
 from google.appengine.ext.deferred import deferred
 from google.appengine.ext.webapp.util import run_wsgi_app
 
diff --git a/google/appengine/ext/django/backends/rdbms/base.py b/google/appengine/ext/django/backends/rdbms/base.py
index 64adc24..c2d34f6 100644
--- a/google/appengine/ext/django/backends/rdbms/base.py
+++ b/google/appengine/ext/django/backends/rdbms/base.py
@@ -24,4 +24,5 @@
 """
 
 
+
 from google.storage.speckle.python.django.backend.base import *
diff --git a/google/appengine/ext/django/main.py b/google/appengine/ext/django/main.py
index a65aa21..ee6eacb 100644
--- a/google/appengine/ext/django/main.py
+++ b/google/appengine/ext/django/main.py
@@ -27,6 +27,7 @@
 
 
 
+
 import logging
 import os
 
diff --git a/google/appengine/ext/django/management/commands/getoauthtoken.py b/google/appengine/ext/django/management/commands/getoauthtoken.py
index e88b24c..5571be1 100644
--- a/google/appengine/ext/django/management/commands/getoauthtoken.py
+++ b/google/appengine/ext/django/management/commands/getoauthtoken.py
@@ -24,4 +24,5 @@
 """
 
 
+
 from google.storage.speckle.python.django.management.commands.getoauthtoken import *
diff --git a/google/appengine/ext/endpoints/__init__.py b/google/appengine/ext/endpoints/__init__.py
index 09529c2..d7135ab 100644
--- a/google/appengine/ext/endpoints/__init__.py
+++ b/google/appengine/ext/endpoints/__init__.py
@@ -65,6 +65,19 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
 from endpoints import *
 
 
diff --git a/google/appengine/ext/ereporter/ereporter.py b/google/appengine/ext/ereporter/ereporter.py
index f9f1553..a93d495 100644
--- a/google/appengine/ext/ereporter/ereporter.py
+++ b/google/appengine/ext/ereporter/ereporter.py
@@ -78,6 +78,7 @@
 
 
 
+
 import datetime
 import logging
 import os
diff --git a/google/appengine/ext/ereporter/report_generator.py b/google/appengine/ext/ereporter/report_generator.py
index 8a8e88d..2885c03 100644
--- a/google/appengine/ext/ereporter/report_generator.py
+++ b/google/appengine/ext/ereporter/report_generator.py
@@ -44,6 +44,7 @@
 
 
 
+
 import datetime
 import itertools
 import os
diff --git a/google/appengine/ext/gql/__init__.py b/google/appengine/ext/gql/__init__.py
index 3d4a411..c072be3 100644
--- a/google/appengine/ext/gql/__init__.py
+++ b/google/appengine/ext/gql/__init__.py
@@ -34,6 +34,7 @@
 
 
 
+
 import calendar
 import datetime
 import itertools
diff --git a/google/appengine/ext/key_range/__init__.py b/google/appengine/ext/key_range/__init__.py
index 8e4ac60..2ab9087 100644
--- a/google/appengine/ext/key_range/__init__.py
+++ b/google/appengine/ext/key_range/__init__.py
@@ -24,6 +24,7 @@
 """Key range representation and splitting."""
 
 
+
 import os
 
 
diff --git a/google/appengine/ext/mapreduce/api/map_job/__init__.py b/google/appengine/ext/mapreduce/api/map_job/__init__.py
index bf17d2e..4c2c30e 100644
--- a/google/appengine/ext/mapreduce/api/map_job/__init__.py
+++ b/google/appengine/ext/mapreduce/api/map_job/__init__.py
@@ -24,9 +24,6 @@
 
 from .input_reader import InputReader
 from .map_job_config import JobConfig
-from .map_job_context import JobContext
-from .map_job_context import ShardContext
-from .map_job_context import SliceContext
 from .map_job_control import Job
 from .mapper import Mapper
 from .output_writer import OutputWriter
diff --git a/google/appengine/ext/mapreduce/api/map_job/input_reader.py b/google/appengine/ext/mapreduce/api/map_job/input_reader.py
index 01b9655..7fb60d7 100644
--- a/google/appengine/ext/mapreduce/api/map_job/input_reader.py
+++ b/google/appengine/ext/mapreduce/api/map_job/input_reader.py
@@ -16,9 +16,9 @@
 #
 """Input Reader interface for map job."""
 
-from . import shard_life_cycle
 from google.appengine.ext.mapreduce import errors
 from google.appengine.ext.mapreduce import json_util
+from google.appengine.ext.mapreduce import shard_life_cycle
 
 
 
diff --git a/google/appengine/ext/mapreduce/api/map_job/mapper.py b/google/appengine/ext/mapreduce/api/map_job/mapper.py
index 95217e2..d80392a 100644
--- a/google/appengine/ext/mapreduce/api/map_job/mapper.py
+++ b/google/appengine/ext/mapreduce/api/map_job/mapper.py
@@ -16,7 +16,8 @@
 #
 """Interface for user defined mapper."""
 
-from . import shard_life_cycle
+from google.appengine.ext.mapreduce import shard_life_cycle
+
 
 
 
@@ -66,7 +67,7 @@
     CAUTION! Carefully tune to not to exceed memory limit or request deadline.
 
     Args:
-      slice_ctx: map_job.SliceContext object.
+      slice_ctx: map_job_context.SliceContext object.
       val: a single value yielded by your input reader. The type
         depends on the input reader. For example, some may yield a single
         datastore entity, others may yield a (int, str) tuple.
diff --git a/google/appengine/ext/mapreduce/api/map_job/output_writer.py b/google/appengine/ext/mapreduce/api/map_job/output_writer.py
index 4e9cef6..785d8ba 100644
--- a/google/appengine/ext/mapreduce/api/map_job/output_writer.py
+++ b/google/appengine/ext/mapreduce/api/map_job/output_writer.py
@@ -16,9 +16,9 @@
 #
 """Output writer interface for map job."""
 
-from . import shard_life_cycle
 from google.appengine.ext.mapreduce import errors
 from google.appengine.ext.mapreduce import json_util
+from google.appengine.ext.mapreduce import shard_life_cycle
 
 
 
@@ -95,7 +95,7 @@
     """Create new writer for a shard.
 
     Args:
-      shard_ctx: map_job.ShardContext for this shard.
+      shard_ctx: map_job_context.ShardContext for this shard.
     """
     raise NotImplementedError("create() not implemented in %s" % cls)
 
@@ -118,7 +118,7 @@
     (e.g a list of filenames)
 
     Args:
-      shard_ctx: map_job.ShardContext for this shard.
+      shard_ctx: map_job_context.ShardContext for this shard.
       iterator: an iterator that yields json serializable
         references to the outputs from this shard.
         Contents from the iterator can be accessible later via
diff --git a/google/appengine/ext/mapreduce/base_handler.py b/google/appengine/ext/mapreduce/base_handler.py
index fdb4096..7e8377a 100644
--- a/google/appengine/ext/mapreduce/base_handler.py
+++ b/google/appengine/ext/mapreduce/base_handler.py
@@ -35,6 +35,7 @@
 
 
 
+
 import httplib
 import logging
 
diff --git a/google/appengine/ext/mapreduce/context.py b/google/appengine/ext/mapreduce/context.py
index d535ca5..cd662d5 100644
--- a/google/appengine/ext/mapreduce/context.py
+++ b/google/appengine/ext/mapreduce/context.py
@@ -38,6 +38,7 @@
 """
 
 
+
 __all__ = ["get",
            "Pool",
            "Context",
diff --git a/google/appengine/ext/mapreduce/control.py b/google/appengine/ext/mapreduce/control.py
index 1515a66..380b3fc 100644
--- a/google/appengine/ext/mapreduce/control.py
+++ b/google/appengine/ext/mapreduce/control.py
@@ -33,6 +33,7 @@
 """API for controlling MapReduce execution outside of MapReduce framework."""
 
 
+
 __all__ = ["start_map"]
 
 
diff --git a/google/appengine/ext/mapreduce/datastore_range_iterators.py b/google/appengine/ext/mapreduce/datastore_range_iterators.py
index 6d035e1..ebce79f 100644
--- a/google/appengine/ext/mapreduce/datastore_range_iterators.py
+++ b/google/appengine/ext/mapreduce/datastore_range_iterators.py
@@ -19,6 +19,7 @@
 
 
 
+
 from google.appengine.datastore import datastore_query
 from google.appengine.datastore import datastore_rpc
 from google.appengine.ext import db
diff --git a/google/appengine/ext/mapreduce/errors.py b/google/appengine/ext/mapreduce/errors.py
index 8b0cb6f..8be958b 100644
--- a/google/appengine/ext/mapreduce/errors.py
+++ b/google/appengine/ext/mapreduce/errors.py
@@ -31,6 +31,7 @@
 """Map Reduce framework errors."""
 
 
+
 __all__ = [
     "BadCombinerOutputError",
     "BadParamsError",
diff --git a/google/appengine/ext/mapreduce/file_format_parser.py b/google/appengine/ext/mapreduce/file_format_parser.py
index 30826e7..f44040f 100644
--- a/google/appengine/ext/mapreduce/file_format_parser.py
+++ b/google/appengine/ext/mapreduce/file_format_parser.py
@@ -33,6 +33,7 @@
 
 
 
+
 __all__ = ['parse']
 
 import re
diff --git a/google/appengine/ext/mapreduce/file_format_root.py b/google/appengine/ext/mapreduce/file_format_root.py
index f37d475..ef57408 100644
--- a/google/appengine/ext/mapreduce/file_format_root.py
+++ b/google/appengine/ext/mapreduce/file_format_root.py
@@ -34,6 +34,7 @@
 
 
 
+
 __all__ = ['FileFormatRoot',
            'split']
 
diff --git a/google/appengine/ext/mapreduce/file_formats.py b/google/appengine/ext/mapreduce/file_formats.py
index d183f8e..25ecc3f 100644
--- a/google/appengine/ext/mapreduce/file_formats.py
+++ b/google/appengine/ext/mapreduce/file_formats.py
@@ -33,6 +33,7 @@
 
 
 
+
 __all__ = ['FileFormat',
            'FORMATS']
 
diff --git a/google/appengine/ext/mapreduce/handlers.py b/google/appengine/ext/mapreduce/handlers.py
index a544736..b27188d 100644
--- a/google/appengine/ext/mapreduce/handlers.py
+++ b/google/appengine/ext/mapreduce/handlers.py
@@ -35,6 +35,7 @@
 
 
 
+
 import datetime
 import logging
 import math
@@ -57,13 +58,14 @@
 from google.appengine.ext.mapreduce import context
 from google.appengine.ext.mapreduce import errors
 from google.appengine.ext.mapreduce import input_readers
+from google.appengine.ext.mapreduce import map_job_context
 from google.appengine.ext.mapreduce import model
 from google.appengine.ext.mapreduce import operation
 from google.appengine.ext.mapreduce import output_writers
 from google.appengine.ext.mapreduce import parameters
+from google.appengine.ext.mapreduce import shard_life_cycle
 from google.appengine.ext.mapreduce import util
 from google.appengine.ext.mapreduce.api import map_job
-from google.appengine.ext.mapreduce.api.map_job import shard_life_cycle
 from google.appengine.runtime import apiproxy_errors
 
 
@@ -143,6 +145,8 @@
     """Constructor."""
     super(MapperWorkerCallbackHandler, self).__init__(*args)
     self._time = time.time
+    self.slice_context = None
+    self.shard_context = None
 
   def _drop_gracefully(self):
     """Drop worker task gracefully.
@@ -407,6 +411,19 @@
       if last_slice:
         obj.end_shard(shard_context)
 
+  def _lc_start_slice(self, tstate, slice_id):
+    self._maintain_LC(tstate.output_writer, slice_id)
+    self._maintain_LC(tstate.input_reader, slice_id)
+    self._maintain_LC(tstate.handler, slice_id)
+
+  def _lc_end_slice(self, tstate, slice_id, last_slice=False):
+    self._maintain_LC(tstate.handler, slice_id, last_slice=last_slice,
+                      begin_slice=False)
+    self._maintain_LC(tstate.input_reader, slice_id, last_slice=last_slice,
+                      begin_slice=False)
+    self._maintain_LC(tstate.output_writer, slice_id, last_slice=last_slice,
+                      begin_slice=False)
+
   def handle(self):
     """Handle request.
 
@@ -463,33 +480,17 @@
     job_config = map_job.JobConfig._to_map_job_config(
         spec,
         os.environ.get("HTTP_X_APPENGINE_QUEUENAME"))
-    job_context = map_job.JobContext(job_config)
-    self.shard_context = map_job.ShardContext(job_context, shard_state)
-    self.slice_context = map_job.SliceContext(self.shard_context,
-                                              shard_state,
-                                              tstate)
+    job_context = map_job_context.JobContext(job_config)
+    self.shard_context = map_job_context.ShardContext(job_context, shard_state)
+    self.slice_context = map_job_context.SliceContext(self.shard_context,
+                                                      shard_state,
+                                                      tstate)
     try:
       slice_id = tstate.slice_id
-      self._maintain_LC(tstate.handler, slice_id)
-      self._maintain_LC(tstate.input_reader, slice_id)
-      self._maintain_LC(tstate.output_writer, slice_id)
+      self._lc_start_slice(tstate, slice_id)
 
-      if is_this_a_retry:
-        task_directive = self._attempt_slice_recovery(shard_state, tstate)
-        if task_directive != self._TASK_DIRECTIVE.PROCEED_TASK:
-          return self.__return(shard_state, tstate, task_directive)
-
-      last_slice = self._process_inputs(
-          tstate.input_reader, shard_state, tstate, ctx)
-
-      self._maintain_LC(tstate.handler, slice_id, last_slice, False)
-      self._maintain_LC(tstate.input_reader, slice_id, last_slice, False)
-      self._maintain_LC(tstate.output_writer, slice_id, last_slice, False)
-
-      ctx.flush()
-
-      if last_slice:
-
+      if shard_state.is_input_finished():
+        self._lc_end_slice(tstate, slice_id, last_slice=True)
 
         if (tstate.output_writer and
             isinstance(tstate.output_writer, output_writers.OutputWriter)):
@@ -499,6 +500,25 @@
 
           tstate.output_writer.finalize(ctx, shard_state)
         shard_state.set_for_success()
+        return self.__return(shard_state, tstate, task_directive)
+
+      if is_this_a_retry:
+        task_directive = self._attempt_slice_recovery(shard_state, tstate)
+        if task_directive != self._TASK_DIRECTIVE.PROCEED_TASK:
+          return self.__return(shard_state, tstate, task_directive)
+
+      last_slice = self._process_inputs(
+          tstate.input_reader, shard_state, tstate, ctx)
+
+      self._lc_end_slice(tstate, slice_id)
+
+      ctx.flush()
+
+      if last_slice:
+
+
+
+        shard_state.set_input_finished()
 
     except Exception, e:
       logging.warning("Shard %s got error.", shard_state.shard_id)
diff --git a/google/appengine/ext/mapreduce/hooks.py b/google/appengine/ext/mapreduce/hooks.py
index 0aa33aa..f39d7f0 100644
--- a/google/appengine/ext/mapreduce/hooks.py
+++ b/google/appengine/ext/mapreduce/hooks.py
@@ -33,6 +33,7 @@
 """API allowing control over some mapreduce implementation details."""
 
 
+
 __all__ = ["Hooks"]
 
 
diff --git a/google/appengine/ext/mapreduce/input_readers.py b/google/appengine/ext/mapreduce/input_readers.py
index ba3c4e4..1acec33 100644
--- a/google/appengine/ext/mapreduce/input_readers.py
+++ b/google/appengine/ext/mapreduce/input_readers.py
@@ -31,6 +31,7 @@
 """Defines input readers for MapReduce."""
 
 
+
 __all__ = [
     "AbstractDatastoreInputReader",
     "ALLOW_CHECKPOINT",
@@ -2554,6 +2555,16 @@
       self._bucket_iter = iter(self._bucket)
 
   @classmethod
+  def get_params(cls, mapper_spec, allowed_keys=None, allow_old=True):
+    params = _get_params(mapper_spec, allowed_keys, allow_old)
+
+
+    if (mapper_spec.params.get(cls.BUCKET_NAME_PARAM) is not None and
+        params.get(cls.BUCKET_NAME_PARAM) is None):
+      params[cls.BUCKET_NAME_PARAM] = mapper_spec.params[cls.BUCKET_NAME_PARAM]
+    return params
+
+  @classmethod
   def validate(cls, mapper_spec):
     """Validate mapper specification.
 
@@ -2564,7 +2575,7 @@
       BadReaderParamsError: if the specification is invalid for any reason such
         as missing the bucket name or providing an invalid bucket name.
     """
-    reader_spec = _get_params(mapper_spec, allow_old=False)
+    reader_spec = cls.get_params(mapper_spec, allow_old=False)
 
 
     if cls.BUCKET_NAME_PARAM not in reader_spec:
@@ -2614,7 +2625,7 @@
     Returns:
       A list of InputReaders. None when no input data can be found.
     """
-    reader_spec = _get_params(mapper_spec, allow_old=False)
+    reader_spec = cls.get_params(mapper_spec, allow_old=False)
     bucket = reader_spec[cls.BUCKET_NAME_PARAM]
     filenames = reader_spec[cls.OBJECT_NAMES_PARAM]
     delimiter = reader_spec.get(cls.DELIMITER_PARAM)
@@ -2764,14 +2775,15 @@
         self._record_reader = None
 
 
-
-class _ReducerReader(RecordsReader):
-  """Reader to read KeyValues records files from Files API."""
+class _ReducerReader(_GoogleCloudStorageRecordInputReader):
+  """Reader to read KeyValues records from GCS."""
 
   expand_parameters = True
 
-  def __init__(self, filenames, position):
-    super(_ReducerReader, self).__init__(filenames, position)
+  def __init__(self, filenames, index=0, buffer_size=None, _account_id=None,
+               delimiter=None):
+    super(_ReducerReader, self).__init__(filenames, index, buffer_size,
+                                         _account_id, delimiter)
     self.current_key = None
     self.current_values = None
 
@@ -2784,50 +2796,54 @@
       if combiner_spec:
         combiner = util.handler_for_name(combiner_spec)
 
-    for binary_record in super(_ReducerReader, self).__iter__():
-      proto = file_service_pb.KeyValues()
-      proto.ParseFromString(binary_record)
+    try:
+      while True:
+        binary_record = super(_ReducerReader, self).next()
+        proto = file_service_pb.KeyValues()
+        proto.ParseFromString(binary_record)
 
-      to_yield = None
-      if self.current_key is not None and self.current_key != proto.key():
-        to_yield = (self.current_key, self.current_values)
-        self.current_key = None
-        self.current_values = None
+        to_yield = None
+        if self.current_key is not None and self.current_key != proto.key():
+          to_yield = (self.current_key, self.current_values)
+          self.current_key = None
+          self.current_values = None
 
-      if self.current_key is None:
-        self.current_key = proto.key()
-        self.current_values = []
+        if self.current_key is None:
+          self.current_key = proto.key()
+          self.current_values = []
 
-      if combiner:
-        combiner_result = combiner(
-            self.current_key, proto.value_list(), self.current_values)
+        if combiner:
+          combiner_result = combiner(
+              self.current_key, proto.value_list(), self.current_values)
 
-        if not util.is_generator(combiner_result):
-          raise errors.BadCombinerOutputError(
-              "Combiner %s should yield values instead of returning them (%s)" %
-              (combiner, combiner_result))
+          if not util.is_generator(combiner_result):
+            raise errors.BadCombinerOutputError(
+                "Combiner %s should yield values instead of returning them "
+                "(%s)" % (combiner, combiner_result))
 
-        self.current_values = []
-        for value in combiner_result:
-          if isinstance(value, operation.Operation):
-            value(ctx)
-          else:
+          self.current_values = []
+          for value in combiner_result:
+            if isinstance(value, operation.Operation):
+              value(ctx)
+            else:
 
-            self.current_values.append(value)
+              self.current_values.append(value)
 
 
 
 
-        if not to_yield:
+          if not to_yield:
+            yield ALLOW_CHECKPOINT
+        else:
+
+          self.current_values.extend(proto.value_list())
+
+        if to_yield:
+          yield to_yield
+
           yield ALLOW_CHECKPOINT
-      else:
-
-        self.current_values.extend(proto.value_list())
-
-      if to_yield:
-        yield to_yield
-
-        yield ALLOW_CHECKPOINT
+    except StopIteration:
+      pass
 
 
 
diff --git a/google/appengine/ext/mapreduce/key_ranges.py b/google/appengine/ext/mapreduce/key_ranges.py
index 8a23425..9f79e14 100644
--- a/google/appengine/ext/mapreduce/key_ranges.py
+++ b/google/appengine/ext/mapreduce/key_ranges.py
@@ -17,6 +17,7 @@
 """An abstract for a collection of key_range.KeyRange objects."""
 
 
+
 from google.appengine.ext import key_range
 from google.appengine.ext.mapreduce import namespace_range
 
diff --git a/google/appengine/ext/mapreduce/main.py b/google/appengine/ext/mapreduce/main.py
index 223b41a..7a6ed91 100644
--- a/google/appengine/ext/mapreduce/main.py
+++ b/google/appengine/ext/mapreduce/main.py
@@ -42,6 +42,7 @@
 
 
 
+
 import google
 
 
diff --git a/google/appengine/ext/mapreduce/api/map_job/map_job_context.py b/google/appengine/ext/mapreduce/map_job_context.py
similarity index 100%
rename from google/appengine/ext/mapreduce/api/map_job/map_job_context.py
rename to google/appengine/ext/mapreduce/map_job_context.py
diff --git a/google/appengine/ext/mapreduce/mapper_pipeline.py b/google/appengine/ext/mapreduce/mapper_pipeline.py
index 9fadcd1..65573ae 100644
--- a/google/appengine/ext/mapreduce/mapper_pipeline.py
+++ b/google/appengine/ext/mapreduce/mapper_pipeline.py
@@ -28,18 +28,16 @@
 
 
 
-
-
 """Pipelines for mapreduce library."""
 
 
+
 __all__ = [
     "MapperPipeline",
     ]
 
 import google
 
-from google.appengine.api import files
 from google.appengine.ext.mapreduce import control
 from google.appengine.ext.mapreduce import model
 from google.appengine.ext.mapreduce import parameters
@@ -141,27 +139,3 @@
     self.fill(self.outputs.result_status, mapreduce_state.result_status)
     self.fill(self.outputs.counters, mapreduce_state.counters_map.to_dict())
     self.complete(outputs)
-
-
-class _CleanupPipeline(pipeline_base.PipelineBase):
-  """A pipeline to do a cleanup for mapreduce jobs.
-
-  Args:
-    filename_or_list: list of files or file lists to delete.
-  """
-
-  def delete_file_or_list(self, filename_or_list):
-    if isinstance(filename_or_list, list):
-      for filename in filename_or_list:
-        self.delete_file_or_list(filename)
-    else:
-      filename = filename_or_list
-      for _ in range(10):
-        try:
-          files.delete(filename)
-          break
-        except:
-          pass
-
-  def run(self, temp_files):
-    self.delete_file_or_list(temp_files)
diff --git a/google/appengine/ext/mapreduce/mapreduce_pipeline.py b/google/appengine/ext/mapreduce/mapreduce_pipeline.py
index 1c802d5..86393ed 100644
--- a/google/appengine/ext/mapreduce/mapreduce_pipeline.py
+++ b/google/appengine/ext/mapreduce/mapreduce_pipeline.py
@@ -28,13 +28,12 @@
 
 
 
-
-
 """Pipelines for mapreduce library."""
 
 from __future__ import with_statement
 
 
+
 __all__ = [
     "CleanupPipeline",
     "MapPipeline",
@@ -48,13 +47,15 @@
 
 from appengine_pipeline.src import pipeline
 from appengine_pipeline.src.pipeline import common as pipeline_common
-from google.appengine.api import files
+from google.appengine.api import app_identity
+from google.appengine.ext.mapreduce import errors
 from google.appengine.ext.mapreduce import input_readers
 from google.appengine.ext.mapreduce import mapper_pipeline
 from google.appengine.ext.mapreduce import model
 from google.appengine.ext.mapreduce import output_writers
 from google.appengine.ext.mapreduce import pipeline_base
 from google.appengine.ext.mapreduce import shuffler
+from google.appengine.ext.mapreduce import util
 
 
 
@@ -65,7 +66,7 @@
 
 ShufflePipeline = shuffler.ShufflePipeline
 
-CleanupPipeline = mapper_pipeline._CleanupPipeline
+CleanupPipeline = shuffler._GCSCleanupPipeline
 
 
 _ReducerReader = input_readers._ReducerReader
@@ -95,13 +96,17 @@
           input_reader_spec,
           params,
           shards=None):
+    new_params = dict(params or {})
+
+
+    new_params.update({"output_writer": {}})
     yield MapperPipeline(
         job_name + "-map",
         mapper_spec,
         input_reader_spec,
-        output_writer_spec=
-            output_writers.__name__ + ".KeyValueBlobstoreOutputWriter",
-        params=params,
+        output_writer_spec=(output_writers.__name__ +
+                            "._GoogleCloudStorageKeyValueOutputWriter"),
+        params=new_params,
         shards=shards)
 
 
@@ -117,6 +122,7 @@
     output_writer_spec: specification of output write to use with reduce
       function.
     params: mapper parameters to use as dict.
+    bucket_name: The name of the Google Cloud Storage bucket.
     filenames: list of filenames to reduce.
     combiner_spec: Optional. Specification of a combine function. If not
       supplied, no combine step will take place. The combine function takes a
@@ -136,13 +142,18 @@
           reducer_spec,
           output_writer_spec,
           params,
+          bucket_name,
           filenames,
           combiner_spec=None,
           shards=None):
+    filenames_only = (
+        util.strip_prefix_from_items("/%s/" % bucket_name, filenames))
     new_params = dict(params or {})
     new_params.update({
-        "files": filenames
-        })
+        "input_reader": {
+            "bucket_name": bucket_name,
+            "objects": filenames_only,
+        }})
     if combiner_spec:
       new_params.update({
           "combiner_spec": combiner_spec,
@@ -165,6 +176,10 @@
                         pipeline_base.PipelineBase):
   """Pipeline to execute MapReduce jobs.
 
+  The Shuffle stage uses Google Cloud Storage (GCS). For newly created projects,
+  GCS is activated automatically. To activate GCS follow these instructions:
+  https://cloud.google.com/storage/docs/signup#activate
+
   Args:
     job_name: job name as string.
     mapper_spec: specification of mapper to use.
@@ -184,7 +199,7 @@
   Returns:
     result_status: one of model.MapreduceState._RESULTS. Check this to see
       if the job is successful.
-    default: a list of filenames if the mapreduce was sucesssful and
+    default: a list of filenames if the mapreduce was successful and
       was outputting files. An empty list otherwise.
   """
 
@@ -198,18 +213,34 @@
           reducer_params=None,
           shards=None,
           combiner_spec=None):
+
+
+    if mapper_params.get("bucket_name") is None:
+      try:
+        mapper_params["bucket_name"] = (
+            app_identity.get_default_gcs_bucket_name())
+      except Exception, e:
+        raise errors.Error("Unable to get the GCS default bucket name. "
+                           "Check to see that GCS is properly activated. "
+                           + str(e))
+    if mapper_params["bucket_name"] is None:
+      raise errors.Error("There is no GCS default bucket name. "
+                         "Check to see that GCS is properly activated.")
+
+
     map_pipeline = yield MapPipeline(job_name,
                                      mapper_spec,
                                      input_reader_spec,
                                      params=mapper_params,
                                      shards=shards)
     shuffler_pipeline = yield ShufflePipeline(
-        job_name, map_pipeline)
+        job_name, mapper_params, map_pipeline)
     reducer_pipeline = yield ReducePipeline(
         job_name,
         reducer_spec,
         output_writer_spec,
         reducer_params,
+        mapper_params["bucket_name"],
         shuffler_pipeline,
         combiner_spec=combiner_spec)
     with pipeline.After(reducer_pipeline):
diff --git a/google/appengine/ext/mapreduce/model.py b/google/appengine/ext/mapreduce/model.py
index 4174931..c66b6c3 100644
--- a/google/appengine/ext/mapreduce/model.py
+++ b/google/appengine/ext/mapreduce/model.py
@@ -41,6 +41,7 @@
 
 
 
+
 __all__ = ["MapreduceState",
            "MapperSpec",
            "MapreduceControl",
@@ -910,6 +911,7 @@
 
   mapreduce_id = db.StringProperty(required=True)
   active = db.BooleanProperty(default=True, indexed=False)
+  input_finished = db.BooleanProperty(default=False, indexed=False)
   counters_map = json_util.JsonProperty(
       CountersMap, default=CountersMap(), indexed=False)
   result_status = db.StringProperty(choices=_RESULTS, indexed=False)
@@ -958,6 +960,7 @@
     self.last_work_item = ""
     self.active = True
     self.result_status = None
+    self.input_finished = False
     self.counters_map = CountersMap()
     self.slice_id = 0
     self.slice_start_time = None
@@ -990,6 +993,12 @@
     self.active = False
     self.result_status = self.RESULT_ABORTED
 
+  def set_input_finished(self):
+    self.input_finished = True
+
+  def is_input_finished(self):
+    return self.input_finished
+
   def set_for_success(self):
     self.active = False
     self.result_status = self.RESULT_SUCCESS
diff --git a/google/appengine/ext/mapreduce/namespace_range.py b/google/appengine/ext/mapreduce/namespace_range.py
index b2d2992..5af2417 100644
--- a/google/appengine/ext/mapreduce/namespace_range.py
+++ b/google/appengine/ext/mapreduce/namespace_range.py
@@ -33,6 +33,7 @@
 
 
 
+
 __all__ = [
     'NAMESPACE_CHARACTERS',
     'MAX_NAMESPACE_LENGTH',
diff --git a/google/appengine/ext/mapreduce/operation/__init__.py b/google/appengine/ext/mapreduce/operation/__init__.py
index 1f99022..ae4793f 100644
--- a/google/appengine/ext/mapreduce/operation/__init__.py
+++ b/google/appengine/ext/mapreduce/operation/__init__.py
@@ -39,6 +39,7 @@
 
 
 
+
 import db
 import counters
 from base import Operation
diff --git a/google/appengine/ext/mapreduce/operation/base.py b/google/appengine/ext/mapreduce/operation/base.py
index a312488..cad2472 100644
--- a/google/appengine/ext/mapreduce/operation/base.py
+++ b/google/appengine/ext/mapreduce/operation/base.py
@@ -33,6 +33,7 @@
 """Base operation class."""
 
 
+
 __all__ = ['Operation']
 
 
diff --git a/google/appengine/ext/mapreduce/operation/counters.py b/google/appengine/ext/mapreduce/operation/counters.py
index e2bc7e8..32945a8 100644
--- a/google/appengine/ext/mapreduce/operation/counters.py
+++ b/google/appengine/ext/mapreduce/operation/counters.py
@@ -33,6 +33,7 @@
 """Counters-related operations."""
 
 
+
 __all__ = ['Increment']
 
 
diff --git a/google/appengine/ext/mapreduce/operation/db.py b/google/appengine/ext/mapreduce/operation/db.py
index 31899b0..bb53f78 100644
--- a/google/appengine/ext/mapreduce/operation/db.py
+++ b/google/appengine/ext/mapreduce/operation/db.py
@@ -33,6 +33,7 @@
 """DB-related operations."""
 
 
+
 __all__ = ['Put', 'Delete']
 
 
diff --git a/google/appengine/ext/mapreduce/output_writers.py b/google/appengine/ext/mapreduce/output_writers.py
index a7270ab..5f321bf 100644
--- a/google/appengine/ext/mapreduce/output_writers.py
+++ b/google/appengine/ext/mapreduce/output_writers.py
@@ -33,6 +33,7 @@
 from __future__ import with_statement
 
 
+
 __all__ = [
     "BlobstoreOutputWriter",
     "BlobstoreOutputWriterBase",
@@ -40,12 +41,15 @@
     "FileOutputWriter",
     "FileOutputWriterBase",
     "FileRecordsOutputWriter",
+    "GoogleCloudStorageConsistentOutputWriter",
+    "GoogleCloudStorageConsistentRecordOutputWriter",
     "KeyValueBlobstoreOutputWriter",
     "KeyValueFileOutputWriter",
     "COUNTER_IO_WRITE_BYTES",
     "COUNTER_IO_WRITE_MSEC",
     "OutputWriter",
     "RecordsPool",
+    "GCSRecordsPool"
     ]
 
 
@@ -55,6 +59,7 @@
 import gc
 import logging
 import pickle
+import random
 import string
 import time
 
@@ -66,21 +71,32 @@
 from google.appengine.ext.mapreduce import model
 from google.appengine.ext.mapreduce import operation
 from google.appengine.ext.mapreduce import records
+from google.appengine.ext.mapreduce import shard_life_cycle
 
 
 
 try:
 
+  cloudstorage = None
   from google.appengine.ext import cloudstorage
   if hasattr(cloudstorage, "_STUB"):
     cloudstorage = None
 
   if cloudstorage:
     from google.appengine.ext.cloudstorage import cloudstorage_api
+    from google.appengine.ext.cloudstorage import errors as cloud_errors
 except ImportError:
   pass
 
 
+if cloudstorage is None:
+  try:
+    import cloudstorage
+    from cloudstorage import cloudstorage_api
+  except ImportError:
+    pass
+
+
 
 COUNTER_IO_WRITE_BYTES = "io-write-bytes"
 
@@ -285,10 +301,10 @@
 
 
 
-_FILES_API_FLUSH_SIZE = 128*1024
+_FILE_POOL_FLUSH_SIZE = 128*1024
 
 
-_FILES_API_MAX_SIZE = 1000*1024
+_FILE_POOL_MAX_SIZE = 1000*1024
 
 
 def _get_params(mapper_spec, allowed_keys=None, allow_old=True):
@@ -336,7 +352,7 @@
 class _FilePool(context.Pool):
   """Pool of file append operations."""
 
-  def __init__(self, flush_size_chars=_FILES_API_FLUSH_SIZE, ctx=None):
+  def __init__(self, flush_size_chars=_FILE_POOL_FLUSH_SIZE, ctx=None):
     """Constructor.
 
     Args:
@@ -368,10 +384,10 @@
     if self._size + len(data) > self._flush_size:
       self.flush()
 
-    if len(data) > _FILES_API_MAX_SIZE:
+    if len(data) > _FILE_POOL_MAX_SIZE:
       raise errors.Error(
           "Can't write more than %s bytes in one request: "
-          "risk of writes interleaving." % _FILES_API_MAX_SIZE)
+          "risk of writes interleaving." % _FILE_POOL_MAX_SIZE)
     else:
       self.__append(filename, data)
 
@@ -383,7 +399,7 @@
     start_time = time.time()
     for filename, data in self._append_buffer.iteritems():
       with files.open(filename, "a") as f:
-        if len(data) > _FILES_API_MAX_SIZE:
+        if len(data) > _FILE_POOL_MAX_SIZE:
           raise errors.Error("Bad data of length: %s" % len(data))
         if self._ctx:
           operation.counters.Increment(
@@ -397,20 +413,21 @@
     self._size = 0
 
 
-class RecordsPool(context.Pool):
-  """Pool of append operations for records files."""
+class _RecordsPoolBase(context.Pool):
+  """Base class for Pool of append operations for records files."""
 
 
   _RECORD_OVERHEAD_BYTES = 10
 
-  def __init__(self, filename,
-               flush_size_chars=_FILES_API_FLUSH_SIZE,
+  def __init__(self,
+               flush_size_chars=_FILE_POOL_FLUSH_SIZE,
                ctx=None,
                exclusive=False):
     """Constructor.
 
+    Any classes that subclass this will need to implement the _write() function.
+
     Args:
-      filename: file name to write data to as string.
       flush_size_chars: buffer flush threshold as int.
       ctx: mapreduce context as context.Context.
       exclusive: a boolean flag indicating if the pool has an exclusive
@@ -420,7 +437,6 @@
     self._flush_size = flush_size_chars
     self._buffer = []
     self._size = 0
-    self._filename = filename
     self._ctx = ctx
     self._exclusive = exclusive
 
@@ -430,9 +446,9 @@
     if self._size + data_length > self._flush_size:
       self.flush()
 
-    if not self._exclusive and data_length > _FILES_API_MAX_SIZE:
+    if not self._exclusive and data_length > _FILE_POOL_MAX_SIZE:
       raise errors.Error(
-          "Too big input %s (%s)."  % (data_length, _FILES_API_MAX_SIZE))
+          "Too big input %s (%s)."  % (data_length, _FILE_POOL_MAX_SIZE))
     else:
       self._buffer.append(data)
       self._size += data_length
@@ -451,22 +467,20 @@
     str_buf = buf.getvalue()
     buf.close()
 
-    if not self._exclusive and len(str_buf) > _FILES_API_MAX_SIZE:
+    if not self._exclusive and len(str_buf) > _FILE_POOL_MAX_SIZE:
 
       raise errors.Error(
           "Buffer too big. Can't write more than %s bytes in one request: "
           "risk of writes interleaving. Got: %s" %
-          (_FILES_API_MAX_SIZE, len(str_buf)))
+          (_FILE_POOL_MAX_SIZE, len(str_buf)))
 
 
     start_time = time.time()
-    with files.open(self._filename, "a", exclusive_lock=self._exclusive) as f:
-      f.write(str_buf)
-      if self._ctx:
-        operation.counters.Increment(
-            COUNTER_IO_WRITE_BYTES, len(str_buf))(self._ctx)
+    self._write(str_buf)
     if self._ctx:
       operation.counters.Increment(
+          COUNTER_IO_WRITE_BYTES, len(str_buf))(self._ctx)
+      operation.counters.Increment(
           COUNTER_IO_WRITE_MSEC,
           int((time.time() - start_time) * 1000))(self._ctx)
 
@@ -475,6 +489,9 @@
     self._size = 0
     gc.collect()
 
+  def _write(self, str_buf):
+    raise NotImplementedError("_write() not implemented in %s" % type(self))
+
   def __enter__(self):
     return self
 
@@ -482,6 +499,60 @@
     self.flush()
 
 
+class RecordsPool(_RecordsPoolBase):
+  """Pool of append operations for records using Files API."""
+
+  def __init__(self,
+               filename,
+               flush_size_chars=_FILE_POOL_FLUSH_SIZE,
+               ctx=None,
+               exclusive=False):
+    """Requires the filename of the file to write to via the Filaes API."""
+    super(RecordsPool, self).__init__(flush_size_chars, ctx, exclusive)
+    self._filename = filename
+
+  def _write(self, str_buf):
+    """Opens and appends to the filename."""
+    with files.open(self._filename, "a", exclusive_lock=self._exclusive) as f:
+      f.write(str_buf)
+
+
+class GCSRecordsPool(_RecordsPoolBase):
+  """Pool of append operations for records using GCS."""
+
+
+  _GCS_BLOCK_SIZE = 256 * 1024
+
+  def __init__(self,
+               filehandle,
+               flush_size_chars=_FILE_POOL_FLUSH_SIZE,
+               ctx=None,
+               exclusive=False):
+    """Requires the filehandle of an open GCS file to write to."""
+    super(GCSRecordsPool, self).__init__(flush_size_chars, ctx, exclusive)
+    self._filehandle = filehandle
+    self._buf_size = 0
+
+  def _write(self, str_buf):
+    """Uses the filehandle to the file in GCS to write to it."""
+    self._filehandle.write(str_buf)
+    self._buf_size += len(str_buf)
+
+  def flush(self, force=False):
+    """Flush pool contents.
+
+    Args:
+      force: Inserts additional padding to achieve the minimum block size
+        required for GCS.
+    """
+    super(GCSRecordsPool, self).flush()
+    if force:
+      extra_padding = self._buf_size % self._GCS_BLOCK_SIZE
+      if extra_padding > 0:
+        self._write("\x00" * (self._GCS_BLOCK_SIZE - extra_padding))
+    self._filehandle.flush()
+
+
 class FileOutputWriterBase(OutputWriter):
   """Base class for all file output writers."""
 
@@ -876,11 +947,9 @@
   """Output writer for KeyValue records files in blobstore."""
 
 
-class _GoogleCloudStorageOutputWriter(OutputWriter):
-  """Output writer to Google Cloud Storage using the cloudstorage library.
-
-  This class is expected to be subclassed with a writer that applies formatting
-  to user-level records.
+class _GoogleCloudStorageBase(shard_life_cycle._ShardLifeCycle,
+                              OutputWriter):
+  """Base abstract class for all GCS writers.
 
   Required configuration in the mapper_spec.output_writer dictionary.
     BUCKET_NAME_PARAM: name of the bucket to use (with no extra delimiters or
@@ -900,15 +969,8 @@
       be applied by the writer.
     CONTENT_TYPE_PARAM: mime type to apply on the files. If not provided, Google
       Cloud Storage will apply its default.
-    _NO_DUPLICATE: if True, slice recovery logic will be used to ensure
-      output files has no duplicates. Every shard should have only one final
-      output in user specified location. But it may produce many smaller
-      files (named "seg") due to slice recovery. These segs live in a
-      tmp directory and should be combined and renamed to the final location.
-      In current impl, they are not combined.
   """
 
-
   BUCKET_NAME_PARAM = "bucket_name"
   ACL_PARAM = "acl"
   NAMING_FORMAT_PARAM = "naming_format"
@@ -916,13 +978,179 @@
   _NO_DUPLICATE = "no_duplicate"
 
 
-  DEFAULT_NAMING_FORMAT = "$name/$id/output-$num"
+  _ACCOUNT_ID_PARAM = "account_id"
+
+
+class _GoogleCloudStorageOutputWriterBase(_GoogleCloudStorageBase):
+  """Base class for GCS writers directly interacting with GCS.
+
+  Base class for both _GoogleCloudStorageOutputWriter and
+  GoogleCloudStorageConsistentOutputWriter.
+
+  This class is expected to be subclassed with a writer that applies formatting
+  to user-level records.
+
+  Subclasses need to define to_json, from_json, create, finalize and
+  _get_write_buffer methods.
+
+  See _GoogleCloudStorageBase for config options.
+  """
+
+
+  _DEFAULT_NAMING_FORMAT = "$name/$id/output-$num"
 
 
   _MR_TMP = "gae_mr_tmp"
   _TMP_FILE_NAMING_FORMAT = (
       _MR_TMP + "/$name/$id/attempt-$attempt/output-$num/seg-$seg")
-  _ACCOUNT_ID_PARAM = "account_id"
+
+  @classmethod
+  def _generate_filename(cls, writer_spec, name, job_id, num,
+                         attempt=None, seg_index=None):
+    """Generates a filename for a particular output.
+
+    Args:
+      writer_spec: specification dictionary for the output writer.
+      name: name of the job.
+      job_id: the ID number assigned to the job.
+      num: shard number.
+      attempt: the shard attempt number.
+      seg_index: index of the seg. None means the final output.
+
+    Returns:
+      a string containing the filename.
+
+    Raises:
+      BadWriterParamsError: if the template contains any errors such as invalid
+        syntax or contains unknown substitution placeholders.
+    """
+    naming_format = cls._TMP_FILE_NAMING_FORMAT
+    if seg_index is None:
+      naming_format = writer_spec.get(cls.NAMING_FORMAT_PARAM,
+                                      cls._DEFAULT_NAMING_FORMAT)
+
+    template = string.Template(naming_format)
+    try:
+
+      if seg_index is None:
+        return template.substitute(name=name, id=job_id, num=num)
+      else:
+        return template.substitute(name=name, id=job_id, num=num,
+                                   attempt=attempt,
+                                   seg=seg_index)
+    except ValueError, error:
+      raise errors.BadWriterParamsError("Naming template is bad, %s" % (error))
+    except KeyError, error:
+      raise errors.BadWriterParamsError("Naming template '%s' has extra "
+                                        "mappings, %s" % (naming_format, error))
+
+  @classmethod
+  def get_params(cls, mapper_spec, allowed_keys=None, allow_old=True):
+    params = _get_params(mapper_spec, allowed_keys, allow_old)
+
+
+    if (mapper_spec.params.get(cls.BUCKET_NAME_PARAM) is not None and
+        params.get(cls.BUCKET_NAME_PARAM) is None):
+      params[cls.BUCKET_NAME_PARAM] = mapper_spec.params[cls.BUCKET_NAME_PARAM]
+    return params
+
+  @classmethod
+  def validate(cls, mapper_spec):
+    """Validate mapper specification.
+
+    Args:
+      mapper_spec: an instance of model.MapperSpec.
+
+    Raises:
+      BadWriterParamsError: if the specification is invalid for any reason such
+        as missing the bucket name or providing an invalid bucket name.
+    """
+    writer_spec = cls.get_params(mapper_spec, allow_old=False)
+
+
+    if cls.BUCKET_NAME_PARAM not in writer_spec:
+      raise errors.BadWriterParamsError(
+          "%s is required for Google Cloud Storage" %
+          cls.BUCKET_NAME_PARAM)
+    try:
+      cloudstorage.validate_bucket_name(
+          writer_spec[cls.BUCKET_NAME_PARAM])
+    except ValueError, error:
+      raise errors.BadWriterParamsError("Bad bucket name, %s" % (error))
+
+    if writer_spec.get(cls._NO_DUPLICATE, False) not in (True, False):
+      raise errors.BadWriterParamsError("No duplicate must a boolean.")
+
+
+    cls._generate_filename(writer_spec, "name", "id", 0)
+    cls._generate_filename(writer_spec, "name", "id", 0, 1, 0)
+
+  @classmethod
+  def _open_file(cls, writer_spec, filename_suffix):
+    """Opens a new gcs file for writing."""
+
+    filename = "/%s/%s" % (writer_spec[cls.BUCKET_NAME_PARAM], filename_suffix)
+
+    content_type = writer_spec.get(cls.CONTENT_TYPE_PARAM, None)
+
+    options = {}
+    if cls.ACL_PARAM in writer_spec:
+      options["x-goog-acl"] = writer_spec.get(cls.ACL_PARAM)
+
+    account_id = writer_spec.get(cls._ACCOUNT_ID_PARAM, None)
+
+    return cloudstorage.open(filename, mode="w", content_type=content_type,
+                             options=options, _account_id=account_id)
+
+  @classmethod
+  def _get_filename(cls, shard_state):
+    return shard_state.writer_state["filename"]
+
+  @classmethod
+  def get_filenames(cls, mapreduce_state):
+    filenames = []
+    for shard in model.ShardState.find_all_by_mapreduce_state(mapreduce_state):
+      if shard.result_status == model.ShardState.RESULT_SUCCESS:
+        filenames.append(cls._get_filename(shard))
+    return filenames
+
+  def _get_write_buffer(self):
+    """Returns a buffer to be used by the write() method."""
+    raise NotImplementedError()
+
+  def write(self, data):
+    """Write data to the GoogleCloudStorage file.
+
+    Args:
+      data: string containing the data to be written.
+    """
+    start_time = time.time()
+    self._get_write_buffer().write(data)
+    ctx = context.get()
+    operation.counters.Increment(COUNTER_IO_WRITE_BYTES, len(data))(ctx)
+    operation.counters.Increment(
+        COUNTER_IO_WRITE_MSEC, int((time.time() - start_time) * 1000))(ctx)
+
+
+  def _supports_shard_retry(self, tstate):
+    return True
+
+
+class _GoogleCloudStorageOutputWriter(_GoogleCloudStorageOutputWriterBase):
+  """Naive version of GoogleCloudStorageWriter.
+
+  This version is known to create inconsistent outputs if the input changes
+  during slice retries. Consider using GoogleCloudStorageConsistentOutputWriter
+  instead.
+
+  Optional configuration in the mapper_spec.output_writer dictionary:
+    _NO_DUPLICATE: if True, slice recovery logic will be used to ensure
+      output files has no duplicates. Every shard should have only one final
+      output in user specified location. But it may produce many smaller
+      files (named "seg") due to slice recovery. These segs live in a
+      tmp directory and should be combined and renamed to the final location.
+      In current impl, they are not combined.
+  """
   _SEG_PREFIX = "seg_prefix"
   _LAST_SEG_INDEX = "last_seg_index"
   _JSON_GCS_BUFFER = "buffer"
@@ -955,81 +1183,13 @@
 
       self._seg_valid_length = 0
 
-  @classmethod
-  def _generate_filename(cls, writer_spec, name, job_id, num,
-                         attempt=None, seg_index=None):
-    """Generates a filename for a particular output.
-
-    Args:
-      writer_spec: specification dictionary for the output writer.
-      name: name of the job.
-      job_id: the ID number assigned to the job.
-      num: shard number.
-      attempt: the shard attempt number.
-      seg_index: index of the seg. None means the final output.
-
-    Returns:
-      a string containing the filename.
-
-    Raises:
-      BadWriterParamsError: if the template contains any errors such as invalid
-        syntax or contains unknown substitution placeholders.
-    """
-    naming_format = cls._TMP_FILE_NAMING_FORMAT
-    if seg_index is None:
-      naming_format = writer_spec.get(cls.NAMING_FORMAT_PARAM,
-                                      cls.DEFAULT_NAMING_FORMAT)
-
-    template = string.Template(naming_format)
-    try:
-
-      if seg_index is None:
-        return template.substitute(name=name, id=job_id, num=num)
-      else:
-        return template.substitute(name=name, id=job_id, num=num,
-                                   attempt=attempt,
-                                   seg=seg_index)
-    except ValueError, error:
-      raise errors.BadWriterParamsError("Naming template is bad, %s" % (error))
-    except KeyError, error:
-      raise errors.BadWriterParamsError("Naming template '%s' has extra "
-                                        "mappings, %s" % (naming_format, error))
-
-  @classmethod
-  def validate(cls, mapper_spec):
-    """Validate mapper specification.
-
-    Args:
-      mapper_spec: an instance of model.MapperSpec.
-
-    Raises:
-      BadWriterParamsError: if the specification is invalid for any reason such
-        as missing the bucket name or providing an invalid bucket name.
-    """
-    writer_spec = _get_params(mapper_spec, allow_old=False)
-
-
-    if cls.BUCKET_NAME_PARAM not in writer_spec:
-      raise errors.BadWriterParamsError(
-          "%s is required for Google Cloud Storage" %
-          cls.BUCKET_NAME_PARAM)
-    try:
-      cloudstorage.validate_bucket_name(
-          writer_spec[cls.BUCKET_NAME_PARAM])
-    except ValueError, error:
-      raise errors.BadWriterParamsError("Bad bucket name, %s" % (error))
-
-    if writer_spec.get(cls._NO_DUPLICATE, False) not in (True, False):
-      raise errors.BadWriterParamsError("No duplicate must a boolean.")
-
-
-    cls._generate_filename(writer_spec, "name", "id", 0)
-    cls._generate_filename(writer_spec, "name", "id", 0, 1, 0)
+  def _get_write_buffer(self):
+    return self._streaming_buffer
 
   @classmethod
   def create(cls, mr_spec, shard_number, shard_attempt, _writer_state=None):
     """Inherit docs."""
-    writer_spec = _get_params(mr_spec.mapper, allow_old=False)
+    writer_spec = cls.get_params(mr_spec.mapper, allow_old=False)
     seg_index = None
     if writer_spec.get(cls._NO_DUPLICATE, False):
       seg_index = 0
@@ -1044,37 +1204,10 @@
   @classmethod
   def _create(cls, writer_spec, filename_suffix):
     """Helper method that actually creates the file in cloud storage."""
-
-    filename = "/%s/%s" % (writer_spec[cls.BUCKET_NAME_PARAM], filename_suffix)
-
-    content_type = writer_spec.get(cls.CONTENT_TYPE_PARAM, None)
-
-    options = {}
-    if cls.ACL_PARAM in writer_spec:
-      options["x-goog-acl"] = writer_spec.get(cls.ACL_PARAM)
-
-    account_id = writer_spec.get(cls._ACCOUNT_ID_PARAM, None)
-
-    writer = cloudstorage.open(filename, mode="w",
-                               content_type=content_type,
-                               options=options,
-                               _account_id=account_id)
-
+    writer = cls._open_file(writer_spec, filename_suffix)
     return cls(writer, writer_spec=writer_spec)
 
   @classmethod
-  def _get_filename(cls, shard_state):
-    return shard_state.writer_state["filename"]
-
-  @classmethod
-  def get_filenames(cls, mapreduce_state):
-    filenames = []
-    for shard in model.ShardState.find_all_by_mapreduce_state(mapreduce_state):
-      if shard.result_status == model.ShardState.RESULT_SUCCESS:
-        filenames.append(cls._get_filename(shard))
-    return filenames
-
-  @classmethod
   def from_json(cls, state):
     writer = cls(pickle.loads(state[cls._JSON_GCS_BUFFER]))
     no_dup = state.get(cls._JSON_NO_DUP, False)
@@ -1084,10 +1217,11 @@
       writer._seg_index = state[cls._JSON_SEG_INDEX]
     return writer
 
-  def to_json(self):
-
+  def end_slice(self, slice_ctx):
     if not self._streaming_buffer.closed:
       self._streaming_buffer.flush()
+
+  def to_json(self):
     result = {self._JSON_GCS_BUFFER: pickle.dumps(self._streaming_buffer),
               self._JSON_NO_DUP: self._no_dup}
     if self._no_dup:
@@ -1101,19 +1235,6 @@
           self._JSON_SEG_INDEX: self._seg_index})
     return result
 
-  def write(self, data):
-    """Write data to the GoogleCloudStorage file.
-
-    Args:
-      data: string containing the data to be written.
-    """
-    start_time = time.time()
-    self._streaming_buffer.write(data)
-    ctx = context.get()
-    operation.counters.Increment(COUNTER_IO_WRITE_BYTES, len(data))(ctx)
-    operation.counters.Increment(
-        COUNTER_IO_WRITE_MSEC, int((time.time() - start_time) * 1000))(ctx)
-
   def finalize(self, ctx, shard_state):
     self._streaming_buffer.close()
 
@@ -1125,7 +1246,7 @@
 
 
       mr_spec = ctx.mapreduce_spec
-      writer_spec = _get_params(mr_spec.mapper, allow_old=False)
+      writer_spec = self.get_params(mr_spec.mapper, allow_old=False)
       filename = self._generate_filename(writer_spec,
                                          mr_spec.name,
                                          mr_spec.mapreduce_id,
@@ -1141,12 +1262,8 @@
     else:
       shard_state.writer_state = {"filename": self._streaming_buffer.name}
 
-
-  def _supports_shard_retry(self, tstate):
-    return True
-
   def _supports_slice_recovery(self, mapper_spec):
-    writer_spec = _get_params(mapper_spec, allow_old=False)
+    writer_spec = self.get_params(mapper_spec, allow_old=False)
     return writer_spec.get(self._NO_DUPLICATE, False)
 
   def _recover(self, mr_spec, shard_number, shard_attempt):
@@ -1173,7 +1290,7 @@
                     self._seg_valid_length})
       next_seg_index = self._seg_index + 1
 
-    writer_spec = _get_params(mr_spec.mapper, allow_old=False)
+    writer_spec = self.get_params(mr_spec.mapper, allow_old=False)
 
     key = self._generate_filename(
         writer_spec, mr_spec.name,
@@ -1185,45 +1302,279 @@
     new_writer._seg_index = next_seg_index
     return new_writer
 
+  def _get_filename_for_test(self):
+    return self._streaming_buffer.name
 
-class _GoogleCloudStorageRecordOutputWriter(_GoogleCloudStorageOutputWriter):
-  """Write data to the Google Cloud Storage file using LevelDB format.
 
-  Data are written to cloudstorage in record format. On writer serializaton,
-  up to 32KB padding may be added to ensure the next slice aligns with
-  record boundary.
+class _ConsistentStatus(object):
+  """Object used to pass status to the next slice."""
 
-  See the _GoogleCloudStorageOutputWriter for configuration options.
+  def __init__(self):
+    self.writer_spec = None
+    self.mapreduce_id = None
+    self.shard = None
+    self.mainfile = None
+    self.tmpfile = None
+    self.tmpfile_1ago = None
+
+
+class GoogleCloudStorageConsistentOutputWriter(
+    _GoogleCloudStorageOutputWriterBase):
+  """Output writer to Google Cloud Storage using the cloudstorage library.
+
+  This version ensures that the output written to GCS is consistent.
   """
 
-  def __init__(self,
-               streaming_buffer,
-               writer_spec=None):
-    """Initialize a CloudStorageOutputWriter instance.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  _JSON_STATUS = "status"
+  _RAND_BITS = 128
+  _REWRITE_BLOCK_SIZE = 1024 * 256
+  _REWRITE_MR_TMP = "gae_mr_tmp"
+  _TMPFILE_PATTERN = _REWRITE_MR_TMP + "/$id-tmp-$shard-$random"
+  _TMPFILE_PREFIX = _REWRITE_MR_TMP + "/$id-tmp-$shard-"
+
+  def __init__(self, status):
+    """Initialize a GoogleCloudStorageConsistentOutputWriter instance.
 
     Args:
-      streaming_buffer: an instance of writable buffer from cloudstorage_api.
-      writer_spec: the specification for the writer.
+      status: an instance of _ConsistentStatus with initialized tmpfile
+              and mainfile.
     """
-    super(_GoogleCloudStorageRecordOutputWriter, self).__init__(
-        streaming_buffer, writer_spec)
-    self._record_writer = records.RecordsWriter(
-        super(_GoogleCloudStorageRecordOutputWriter, self))
+
+    self.status = status
+    self._data_written_to_slice = False
+
+  def _get_write_buffer(self):
+    if not self.status.tmpfile:
+      raise errors.FailJobError(
+          "write buffer called but empty, begin_slice missing?")
+    return self.status.tmpfile
+
+  def _get_filename_for_test(self):
+    return self.status.mainfile.name
+
+  @classmethod
+  def create(cls, mr_spec, shard_number, shard_attempt, _writer_state=None):
+    """Inherit docs."""
+    writer_spec = cls.get_params(mr_spec.mapper, allow_old=False)
+
+
+    key = cls._generate_filename(writer_spec, mr_spec.name,
+                                 mr_spec.mapreduce_id,
+                                 shard_number, shard_attempt)
+
+    status = _ConsistentStatus()
+    status.writer_spec = writer_spec
+    status.mainfile = cls._open_file(writer_spec, key)
+    status.mapreduce_id = mr_spec.mapreduce_id
+    status.shard = shard_number
+
+    return cls(status)
+
+  def _remove_file(self, filename, writer_spec):
+    if not filename:
+      return
+    account_id = writer_spec.get(self._ACCOUNT_ID_PARAM, None)
+    try:
+      cloudstorage_api.delete(filename, _account_id=account_id)
+    except cloud_errors.NotFoundError:
+      pass
+
+  def _rewrite_tmpfile(self, mainfile, tmpfile, writer_spec):
+    """Copies contents of tmpfile (name) to mainfile (buffer)."""
+    if mainfile.closed:
+
+      return
+
+    account_id = writer_spec.get(self._ACCOUNT_ID_PARAM, None)
+    f = cloudstorage_api.open(tmpfile, _account_id=account_id)
+
+    data = f.read(self._REWRITE_BLOCK_SIZE)
+    while data:
+      mainfile.write(data)
+      data = f.read(self._REWRITE_BLOCK_SIZE)
+    f.close()
+    mainfile.flush()
+
+  @classmethod
+  def _create_tmpfile(cls, status):
+    """Creates a new random-named tmpfile."""
+
+
+
+
+
+
+
+    tmpl = string.Template(cls._TMPFILE_PATTERN)
+    filename = tmpl.substitute(
+        id=status.mapreduce_id, shard=status.shard,
+        random=random.getrandbits(cls._RAND_BITS))
+
+    return cls._open_file(status.writer_spec, filename)
+
+  def begin_slice(self, slice_ctx):
+    status = self.status
+    writer_spec = status.writer_spec
+
+
+    if status.tmpfile_1ago:
+      self._remove_file(status.tmpfile_1ago.name, writer_spec)
+
+
+    if status.tmpfile:
+      self._rewrite_tmpfile(status.mainfile, status.tmpfile.name, writer_spec)
+
+
+    self._try_to_clean_garbage(writer_spec)
+
+
+    status.tmpfile_1ago = status.tmpfile
+    status.tmpfile = self._create_tmpfile(status)
+
+
+    if status.mainfile.closed:
+      status.tmpfile.close()
+      self._remove_file(status.tmpfile.name, writer_spec)
+
+  @classmethod
+  def from_json(cls, state):
+    return cls(pickle.loads(state[cls._JSON_STATUS]))
+
+  def end_slice(self, slice_ctx):
+    self.status.tmpfile.close()
 
   def to_json(self):
-
-    if not self._streaming_buffer.closed:
-      self._record_writer._pad_block()
-    return super(_GoogleCloudStorageRecordOutputWriter, self).to_json()
+    return {self._JSON_STATUS: pickle.dumps(self.status)}
 
   def write(self, data):
-    """Write a single record of data to the file using LevelDB format.
+    super(GoogleCloudStorageConsistentOutputWriter, self).write(data)
+    self._data_written_to_slice = True
 
-    Args:
-      data: string containing the data to be written.
-    """
+  def _try_to_clean_garbage(self, writer_spec):
+
+
+    tmpl = string.Template(self._TMPFILE_PREFIX)
+    prefix = tmpl.substitute(
+        id=self.status.mapreduce_id, shard=self.status.shard)
+    bucket = self.status.writer_spec[self.BUCKET_NAME_PARAM]
+    account_id = writer_spec.get(self._ACCOUNT_ID_PARAM, None)
+    for f in cloudstorage.listbucket("/%s/%s" % (bucket, prefix),
+                                     _account_id=account_id):
+      self._remove_file(f.filename, self.status.writer_spec)
+
+  def finalize(self, ctx, shard_state):
+    if self._data_written_to_slice:
+      raise errors.FailJobError(
+          "finalize() called after data was written")
+
+    if self.status.tmpfile:
+      self.status.tmpfile.close()
+    self.status.mainfile.close()
+
+
+    if self.status.tmpfile_1ago:
+      self._remove_file(self.status.tmpfile_1ago.name, self.status.writer_spec)
+    if self.status.tmpfile:
+      self._remove_file(self.status.tmpfile.name, self.status.writer_spec)
+
+    self._try_to_clean_garbage(self.status.writer_spec)
+
+    shard_state.writer_state = {"filename": self.status.mainfile.name}
+
+
+class _GoogleCloudStorageRecordOutputWriterBase(_GoogleCloudStorageBase):
+  """Wraps a GCS writer with a records.RecordsWriter.
+
+  This class wraps a WRITER_CLS (and its instance) and delegates most calls
+  to it. write() calls are done using records.RecordsWriter.
+
+  WRITER_CLS has to be set to a subclass of _GoogleCloudStorageOutputWriterBase.
+
+  For list of supported parameters see _GoogleCloudStorageBase.
+  """
+
+  WRITER_CLS = None
+
+  def __init__(self, writer):
+    self._writer = writer
+    self._record_writer = records.RecordsWriter(writer)
+
+  @classmethod
+  def validate(cls, mapper_spec):
+    return cls.WRITER_CLS.validate(mapper_spec)
+
+  @classmethod
+  def init_job(cls, mapreduce_state):
+    return cls.WRITER_CLS.init_job(mapreduce_state)
+
+  @classmethod
+  def finalize_job(cls, mapreduce_state):
+    return cls.WRITER_CLS.finalize_job(mapreduce_state)
+
+  @classmethod
+  def from_json(cls, state):
+    return cls(cls.WRITER_CLS.from_json(state))
+
+  def to_json(self):
+    return self._writer.to_json()
+
+  @classmethod
+  def create(cls, mr_spec, shard_number, shard_attempt, _writer_state=None):
+    return cls(cls.WRITER_CLS.create(mr_spec, shard_number, shard_attempt,
+                                     _writer_state))
+
+  def write(self, data):
     self._record_writer.write(data)
 
+  def finalize(self, ctx, shard_state):
+    return self._writer.finalize(ctx, shard_state)
+
+  @classmethod
+  def get_filenames(cls, mapreduce_state):
+    return cls.WRITER_CLS.get_filenames(mapreduce_state)
+
+  def _supports_shard_retry(self, tstate):
+    return self._writer._supports_shard_retry(tstate)
+
+  def _supports_slice_recovery(self, mapper_spec):
+    return self._writer._supports_slice_recovery(mapper_spec)
+
+  def _recover(self, mr_spec, shard_number, shard_attempt):
+    return self._writer._recover(mr_spec, shard_number, shard_attempt)
+
+  def begin_slice(self, slice_ctx):
+    return self._writer.begin_slice(slice_ctx)
+
+  def end_slice(self, slice_ctx):
+
+    if not self._writer._get_write_buffer().closed:
+      self._record_writer._pad_block()
+    return self._writer.end_slice(slice_ctx)
+
+
+class _GoogleCloudStorageRecordOutputWriter(
+    _GoogleCloudStorageRecordOutputWriterBase):
+  WRITER_CLS = _GoogleCloudStorageOutputWriter
+
+
+class GoogleCloudStorageConsistentRecordOutputWriter(
+    _GoogleCloudStorageRecordOutputWriterBase):
+  WRITER_CLS = GoogleCloudStorageConsistentOutputWriter
+
 
 
 class _GoogleCloudStorageKeyValueOutputWriter(
diff --git a/google/appengine/ext/mapreduce/property_range.py b/google/appengine/ext/mapreduce/property_range.py
index 08631e2..ee7b132 100644
--- a/google/appengine/ext/mapreduce/property_range.py
+++ b/google/appengine/ext/mapreduce/property_range.py
@@ -20,6 +20,7 @@
 
 
 
+
 import datetime
 
 from google.appengine.ext import ndb
diff --git a/google/appengine/ext/mapreduce/api/map_job/shard_life_cycle.py b/google/appengine/ext/mapreduce/shard_life_cycle.py
similarity index 91%
rename from google/appengine/ext/mapreduce/api/map_job/shard_life_cycle.py
rename to google/appengine/ext/mapreduce/shard_life_cycle.py
index ba3e8c1..18a2144 100644
--- a/google/appengine/ext/mapreduce/api/map_job/shard_life_cycle.py
+++ b/google/appengine/ext/mapreduce/shard_life_cycle.py
@@ -45,7 +45,7 @@
     Make it idempotent.
 
     Args:
-      shard_ctx: map_job.ShardContext object.
+      shard_ctx: map_job_context.ShardContext object.
     """
     pass
 
@@ -59,7 +59,7 @@
     won't be called.
 
     Args:
-      shard_ctx: map_job.ShardContext object.
+      shard_ctx: map_job_context.ShardContext object.
     """
     pass
 
@@ -70,7 +70,7 @@
     Make it idempotent.
 
     Args:
-      slice_ctx: map_job.SliceContext object.
+      slice_ctx: map_job_context.SliceContext object.
     """
     pass
 
@@ -84,6 +84,6 @@
     won't be called.
 
     Args:
-      slice_ctx: map_job.SliceContext object.
+      slice_ctx: map_job_context.SliceContext object.
     """
     pass
diff --git a/google/appengine/ext/mapreduce/shuffler.py b/google/appengine/ext/mapreduce/shuffler.py
index 8901207..000dafc 100644
--- a/google/appengine/ext/mapreduce/shuffler.py
+++ b/google/appengine/ext/mapreduce/shuffler.py
@@ -29,37 +29,50 @@
 
 
 
-
 """Mapreduce shuffler implementation."""
 
 from __future__ import with_statement
 
 
 
+
 __all__ = [
     "ShufflePipeline",
     ]
 
+
+
 import gc
 import heapq
 import logging
-import os
+import pickle
 import time
 
 from appengine_pipeline.src import pipeline
 from appengine_pipeline.src.pipeline import common as pipeline_common
-from google.appengine.api import files
-from google.appengine.api import modules
 from google.appengine.api.files import file_service_pb
 from google.appengine.ext import db
 from google.appengine.ext.mapreduce import context
 from google.appengine.ext.mapreduce import errors
 from google.appengine.ext.mapreduce import input_readers
 from google.appengine.ext.mapreduce import mapper_pipeline
+from google.appengine.ext.mapreduce import model
 from google.appengine.ext.mapreduce import operation
 from google.appengine.ext.mapreduce import output_writers
 from google.appengine.ext.mapreduce import pipeline_base
 from google.appengine.ext.mapreduce import records
+from google.appengine.ext.mapreduce import util
+
+
+
+try:
+
+  from google.appengine.ext import cloudstorage
+  if hasattr(cloudstorage, "_STUB"):
+    cloudstorage = None
+except ImportError:
+  pass
+
 
 
 
@@ -94,33 +107,40 @@
   return cmp(key_record1[0], key_record2[0])
 
 
-class _BatchRecordsReader(input_readers.RecordsReader):
-  """Records reader that reads in big batches."""
+class _BatchGCSRecordsReader(
+    input_readers._GoogleCloudStorageRecordInputReader):
+  """GCS Records reader that reads in big batches."""
 
-  BATCH_SIZE = 1024*1024 * 3
+  BATCH_SIZE = 1024 *1024 * 3
 
   def __iter__(self):
+
     records = []
     size = 0
-    for record in input_readers.RecordsReader.__iter__(self):
-      records.append(record)
-      size += len(record)
-      if size > self.BATCH_SIZE:
-        yield records
-        size = 0
-        records = []
-        gc.collect()
+    try:
+      while True:
+        record = super(_BatchGCSRecordsReader, self).next()
+        records.append(record)
+        size += len(record)
+        if size > self.BATCH_SIZE:
+          yield records
+          size = 0
+          records = []
+          gc.collect()
+    except StopIteration:
+      pass
     if records:
       yield records
       records = []
       gc.collect()
 
 
+
 def _sort_records_map(records):
   """Map function sorting records.
 
   Converts records to KeyValue protos, sorts them by key and writes them
-  into new blobstore file. Creates _OutputFile entity to record resulting
+  into new GCS file. Creates _OutputFile entity to record resulting
   file name.
 
   Args:
@@ -140,20 +160,21 @@
   key_records.sort(cmp=_compare_keys)
 
   logging.debug("Writing")
-  blob_file_name = (ctx.mapreduce_spec.name + "-" +
-                    ctx.mapreduce_id + "-output")
-  output_path = files.blobstore.create(
-      _blobinfo_uploaded_filename=blob_file_name)
-  with output_writers.RecordsPool(output_path, ctx=ctx) as pool:
+  mapper_spec = ctx.mapreduce_spec.mapper
+  params = input_readers._get_params(mapper_spec)
+  bucket_name = params.get("bucket_name")
+  filename = (ctx.mapreduce_spec.name + "/" + ctx.mapreduce_id + "/output-" +
+              ctx.shard_id + "-" + str(int(time.time())))
+  full_filename = "/%s/%s" % (bucket_name, filename)
+  filehandle = cloudstorage.open(full_filename, mode="w")
+  with output_writers.GCSRecordsPool(filehandle, ctx=ctx) as pool:
     for key_record in key_records:
       pool.append(key_record[1])
 
   logging.debug("Finalizing")
-  files.finalize(output_path)
-  output_path = files.blobstore.get_file_name(
-      files.blobstore.get_blob_key(output_path))
+  filehandle.close()
 
-  entity = _OutputFile(key_name=output_path,
+  entity = _OutputFile(key_name=full_filename,
                        parent=_OutputFile.get_root_key(ctx.mapreduce_id))
   entity.put()
 
@@ -163,24 +184,30 @@
 
   Args:
     job_name: root job name.
-    filenames: list of filenames to sort.
+    bucket_name: The name of the Google Cloud Storage bucket.
+    filenames: list of a list of filenames (hashed/bucketed) to sort,
+      as produced by _HashingGCSOutputWriter.
 
   Returns:
-    The list of lists of sorted filenames. Each list corresponds to one
-    input file. Each filenames contains a chunk of sorted data.
+    The list of lists of sorted filenames. Each list corresponds to each
+    list of input files. Each filenames contains a chunk of sorted data.
   """
-  def run(self, job_name, filenames):
+
+  def run(self, job_name, bucket_name, filenames):
     sort_mappers = []
     for i in range(len(filenames)):
-      filename = filenames[i]
+      filenames_only = util.strip_prefix_from_items("/%s/" % bucket_name,
+                                                    filenames[i])
       sort_mapper = yield mapper_pipeline.MapperPipeline(
           "%s-shuffle-sort-%s" % (job_name, str(i)),
           __name__ + "._sort_records_map",
-          __name__ + "._BatchRecordsReader",
+          __name__ + "._BatchGCSRecordsReader",
           None,
           {
-              "files": [filename],
-              "processing_rate": 1000000,
+              "input_reader": {
+                  "bucket_name": bucket_name,
+                  "objects": filenames_only,
+              },
           },
           shards=1)
       sort_mappers.append(sort_mapper)
@@ -219,7 +246,6 @@
   """
 
   def run(self, job_ids):
-    result = []
     for job_id in job_ids:
       db.delete(_OutputFile.all().ancestor(_OutputFile.get_root_key(job_id)))
 
@@ -242,6 +268,9 @@
   MAX_VALUES_COUNT_PARAM = "max_values_count"
   MAX_VALUES_SIZE_PARAM = "max_values_size"
 
+
+  GCS_BUFFER_SIZE = 256 * 1024
+
   def __init__(self,
                offsets,
                max_values_count,
@@ -263,6 +292,12 @@
 
     self._offsets is always correctly updated so that stopping iterations
     doesn't skip records and doesn't read the same record twice.
+
+    Raises:
+      Exception: when Files list and offsets do not match.
+
+    Yields:
+      The result.
     """
     ctx = context.get()
     mapper_spec = ctx.mapreduce_spec.mapper
@@ -278,7 +313,10 @@
 
     for (i, filename) in enumerate(filenames):
       offset = self._offsets[i]
-      reader = records.RecordsReader(files.BufferedFile(filename))
+
+
+      reader = records.RecordsReader(
+          cloudstorage.open(filename, read_buffer_size=self.GCS_BUFFER_SIZE))
       reader.seek(offset)
       readers.append((None, None, i, reader))
 
@@ -302,12 +340,12 @@
 
             should_yield = True
           elif (self._max_values_count != -1 and
-              current_count >= self._max_values_count):
+                current_count >= self._max_values_count):
 
             current_result[2] = True
             should_yield = True
           elif (self._max_values_size != -1 and
-              current_size >= self._max_values_size):
+                current_size >= self._max_values_size):
 
             current_result[2] = True
             should_yield = True
@@ -374,24 +412,33 @@
     if mapper_spec.input_reader_class() != cls:
       raise errors.BadReaderParamsError("Input reader class mismatch")
     params = mapper_spec.params
-    if not cls.FILES_PARAM in params:
+    if cls.FILES_PARAM not in params:
       raise errors.BadReaderParamsError("Missing files parameter.")
 
 
-class _HashingBlobstoreOutputWriter(output_writers.BlobstoreOutputWriterBase):
-  """An OutputWriter which outputs data into blobstore in key-value format.
+class _HashingGCSOutputWriter(output_writers.OutputWriter):
+  """An OutputWriter which outputs data into GCS in key-value format.
 
   The output is tailored towards shuffler needs. It shards key/values using
-  key hash modulo number of output files.
+  key hash modulo number of output files. Each shard will hash keys that will
+  be placed in one of shard_count number of files (buckets) specific to that
+  shard. The same key will be hashed to the same logical file across all of
+  the shards. Then the list of all the same logical files will be assembled
+  and a list of those lists will be returned.
   """
 
-  def __init__(self, filenames):
+
+  BUCKET_NAME_PARAM = "bucket_name"
+
+
+  def __init__(self, filehandles):
     """Constructor.
 
     Args:
-      filenames: list of filenames that this writer outputs to.
+      filehandles: list of file handles that this writer outputs to.
     """
-    self._filenames = filenames
+    self._filehandles = filehandles
+    self._pools = [None] * len(filehandles)
 
   @classmethod
   def validate(cls, mapper_spec):
@@ -399,29 +446,17 @@
 
     Args:
       mapper_spec: an instance of model.MapperSpec to validate.
+    Raises:
+      BadWriterParamsError: when Output writer class mismatch.
     """
     if mapper_spec.output_writer_class() != cls:
       raise errors.BadWriterParamsError("Output writer class mismatch")
+    params = output_writers._get_params(mapper_spec)
 
-  @classmethod
-  def init_job(cls, mapreduce_state):
-    """Initialize job-level writer state.
-
-    Args:
-      mapreduce_state: an instance of model.MapreduceState describing current
-      job. State can be modified during initialization.
-    """
-    shards = mapreduce_state.mapreduce_spec.mapper.shard_count
-
-    filenames = []
-    for i in range(shards):
-      blob_file_name = (mapreduce_state.mapreduce_spec.name +
-                        "-" + mapreduce_state.mapreduce_spec.mapreduce_id +
-                        "-output-" + str(i))
-      filenames.append(
-          files.blobstore.create(
-              _blobinfo_uploaded_filename=blob_file_name))
-    mapreduce_state.writer_state = {"filenames": filenames}
+    if cls.BUCKET_NAME_PARAM not in params:
+      raise errors.BadWriterParamsError(
+          "%s is required for the _HashingGCSOutputWriter" %
+          cls.BUCKET_NAME_PARAM)
 
   @classmethod
   def finalize_job(cls, mapreduce_state):
@@ -431,13 +466,16 @@
       mapreduce_state: an instance of model.MapreduceState describing current
         job. State can be modified during finalization.
     """
-    finalized_filenames = []
-    for filename in mapreduce_state.writer_state["filenames"]:
-      files.finalize(filename)
-      finalized_filenames.append(
-          files.blobstore.get_file_name(
-              files.blobstore.get_blob_key(filename)))
-    mapreduce_state.writer_state = {"filenames": finalized_filenames}
+    shards = mapreduce_state.mapreduce_spec.mapper.shard_count
+    filenames = []
+    for _ in range(shards):
+      filenames.append([None] * shards)
+    shard_states = model.ShardState.find_all_by_mapreduce_state(mapreduce_state)
+    for x, shard_state in enumerate(shard_states):
+      shard_filenames = shard_state.writer_state["shard_filenames"]
+      for y in range(shards):
+        filenames[y][x] = shard_filenames[y]
+    mapreduce_state.writer_state = {"filenames": filenames}
 
   @classmethod
   def from_json(cls, json):
@@ -449,7 +487,7 @@
     Returns:
       An instance of the OutputWriter configured using the values of json.
     """
-    return cls(json["filenames"])
+    return cls(pickle.loads(json["filehandles"]))
 
   def to_json(self):
     """Returns writer state to serialize in json.
@@ -457,12 +495,29 @@
     Returns:
       A json-izable version of the OutputWriter state.
     """
-    return {"filenames": self._filenames}
+
+
+
+    for pool in self._pools:
+      if pool is not None:
+        pool.flush(True)
+    return {"filehandles": pickle.dumps(self._filehandles)}
 
   @classmethod
   def create(cls, mr_spec, shard_number, shard_attempt, _writer_state=None):
     """Inherit docs."""
-    return cls(_writer_state["filenames"])
+    mapper_spec = mr_spec.mapper
+    params = output_writers._get_params(mapper_spec)
+    bucket_name = params.get(cls.BUCKET_NAME_PARAM)
+    shards = mapper_spec.shard_count
+
+    filehandles = []
+    filename = (mr_spec.name + "/" + mr_spec.mapreduce_id +
+                "/shard-" + str(shard_number) + "-bucket-")
+    for i in range(shards):
+      full_filename = "/%s/%s%d" % (bucket_name, filename, i)
+      filehandles.append(cloudstorage.open(full_filename, mode="w"))
+    return cls(filehandles)
 
   @classmethod
   def get_filenames(cls, mapreduce_state):
@@ -472,7 +527,12 @@
     return []
 
   def finalize(self, ctx, shard_state):
-    pass
+    """See parent class."""
+    filenames = []
+    for filehandle in self._filehandles:
+      filenames.append(filehandle.name)
+      filehandle.close()
+    shard_state.writer_state = {"shard_filenames": filenames}
 
   def write(self, data):
     """Write data.
@@ -492,21 +552,28 @@
       logging.error("Expecting a tuple, but got %s: %s",
                     data.__class__.__name__, data)
 
-    file_index = key.__hash__() % len(self._filenames)
-    pool_name = "kv_pool%d" % file_index
-    filename = self._filenames[file_index]
+    file_index = key.__hash__() % len(self._filehandles)
 
-    if ctx.get_pool(pool_name) is None:
-      ctx.register_pool(pool_name,
-                        output_writers.RecordsPool(filename=filename, ctx=ctx))
+
+
+
+
+    pool = self._pools[file_index]
+    if pool is None:
+      filehandle = self._filehandles[file_index]
+      pool = output_writers.GCSRecordsPool(filehandle=filehandle, ctx=ctx)
+      self._pools[file_index] = pool
+
     proto = file_service_pb.KeyValue()
     proto.set_key(key)
     proto.set_value(value)
-    ctx.get_pool(pool_name).append(proto.Encode())
+    pool.append(proto.Encode())
 
 
 class _ShardOutputs(pipeline_base.PipelineBase):
-  """Takes a flat list of filenames, returns a list of lists, each with
+  """Shards the ouputs.
+
+  Takes a flat list of filenames, returns a list of lists, each with
   one member each.
   """
 
@@ -526,6 +593,9 @@
     key: values key.
     values: values themselves.
     partial: True if more values for this key will follow. False otherwise.
+
+  Yields:
+    The proto.
   """
   proto = file_service_pb.KeyValues()
   proto.set_key(key)
@@ -544,7 +614,7 @@
       shard. Each file in the list should have keys sorted and should contain
       records with KeyValue serialized entity.
 
-  Returns:
+  Yields:
     The list of filenames, where each filename is fully merged and will contain
     records with KeyValues serialized entity.
   """
@@ -554,25 +624,34 @@
 
   _MAX_VALUES_SIZE = 1000000
 
-  def run(self, job_name, filenames):
+  def run(self, job_name, bucket_name, filenames):
     yield mapper_pipeline.MapperPipeline(
         job_name + "-shuffle-merge",
         __name__ + "._merge_map",
         __name__ + "._MergingReader",
         output_writer_spec=
-        output_writers.__name__ + ".BlobstoreRecordsOutputWriter",
+        output_writers.__name__ + "._GoogleCloudStorageRecordOutputWriter",
         params={
-          _MergingReader.FILES_PARAM: filenames,
-          _MergingReader.MAX_VALUES_COUNT_PARAM: self._MAX_VALUES_COUNT,
-          _MergingReader.MAX_VALUES_SIZE_PARAM: self._MAX_VALUES_SIZE,
-          },
+            _MergingReader.FILES_PARAM: filenames,
+            _MergingReader.MAX_VALUES_COUNT_PARAM: self._MAX_VALUES_COUNT,
+            _MergingReader.MAX_VALUES_SIZE_PARAM: self._MAX_VALUES_SIZE,
+            "output_writer": {
+                "bucket_name": bucket_name,
+            },
+        },
         shards=len(filenames))
 
 
 def _hashing_map(binary_record):
   """A map function used in hash phase.
 
-  Reads KeyValue from binary record and yields (key, value).
+  Reads KeyValue from binary record.
+
+  Args:
+    binary_record: The binary record.
+
+  Yields:
+    The (key, value).
   """
   proto = file_service_pb.KeyValue()
   proto.ParseFromString(binary_record)
@@ -584,116 +663,50 @@
 
   Args:
     job_name: root mapreduce job name.
+    bucket_name: The name of the Google Cloud Storage bucket.
     filenames: filenames of mapper output. Should be of records format
       with serialized KeyValue proto.
     shards: Optional. Number of output shards to generate. Defaults
       to the number of input files.
 
-  Returns:
+  Yields:
     The list of filenames. Each file is of records formad with serialized
     KeyValue proto. For each proto its output file is decided based on key
     hash. Thus all equal keys would end up in the same file.
   """
-  def run(self, job_name, filenames, shards=None):
+
+  def run(self, job_name, bucket_name, filenames, shards=None):
+    filenames_only = (
+        util.strip_prefix_from_items("/%s/" % bucket_name, filenames))
     if shards is None:
       shards = len(filenames)
     yield mapper_pipeline.MapperPipeline(
         job_name + "-shuffle-hash",
         __name__ + "._hashing_map",
-        input_readers.__name__ + ".RecordsReader",
-        output_writer_spec= __name__ + "._HashingBlobstoreOutputWriter",
-        params={'files': filenames},
+        input_readers.__name__ + "._GoogleCloudStorageRecordInputReader",
+        output_writer_spec=__name__ + "._HashingGCSOutputWriter",
+        params={
+            "input_reader": {
+                "bucket_name": bucket_name,
+                "objects": filenames_only,
+            },
+            "output_writer": {
+                "bucket_name": bucket_name,
+            },
+        },
         shards=shards)
 
 
-class _ShuffleServicePipeline(pipeline_base.PipelineBase):
-  """A pipeline to invoke shuffle service.
-
-  Args:
-    input_files: list of file names to shuffle.
-
-  Returns:
-    list of shuffled file names. Empty list if there is no input.
-  """
-  async = True
-
-  output_names = [
-
-      "_output_files",
-      ]
-
-  def run(self, job_name, input_files):
-
-
-    empty = True
-    for filename in input_files:
-      if files.stat(filename).st_size > 0:
-        empty = False
-        break
-    if empty:
-      self.complete([])
-      return
-
-    shard_number = len(input_files)
-    output_files = []
-    for i in range(shard_number):
-      blob_file_name = (job_name + "-shuffle-output-" + str(i))
-      file_name = files.blobstore.create(
-          _blobinfo_uploaded_filename=blob_file_name)
-      output_files.append(file_name)
-    self.fill(self.outputs._output_files, output_files)
-
-
-
-    target = modules.get_current_version_name()
-    module_name = modules.get_current_module_name()
-    if module_name != "default":
-
-
-
-      target = "%s.%s." % (target, module_name)
-
-    files.shuffler.shuffle("%s-%s" % (job_name, int(time.time())),
-                           input_files,
-                           output_files,
-                           {
-                               "url": self.get_callback_url(),
-
-
-
-                               "method": "GET",
-                               "queue": self.queue_name,
-                               "version": target,
-                           })
-
-  def callback(self, **kwargs):
-    if "error" in kwargs:
-      self.retry("Error from shuffle service: %s" % kwargs["error"])
-      return
-
-    output_files = self.outputs._output_files.value
-    for filename in output_files:
-      files.finalize(filename)
-
-    finalized_file_names = []
-    for filename in output_files:
-      finalized_file_names.append(
-          files.blobstore.get_file_name(
-              files.blobstore.get_blob_key(filename)))
-    self.complete(finalized_file_names)
-
-  def try_cancel(self):
-    return True
-
-
 class ShufflePipeline(pipeline_base.PipelineBase):
   """A pipeline to shuffle multiple key-value files.
 
   Args:
     job_name: The descriptive name of the overall job.
+    mapper_params: parameters to use for mapper phase.
     filenames: list of file names to sort. Files have to be of records format
       defined by Files API and contain serialized file_service_pb.KeyValue
-      protocol messages.
+      protocol messages. The filenames may or may not contain the
+      GCS bucket name in their path.
     shards: Optional. Number of output shards to generate. Defaults
       to the number of input files.
 
@@ -705,15 +718,48 @@
       in memory shuffler.
   """
 
-  def run(self, job_name, filenames, shards=None):
-    hashed_files = yield _HashPipeline(job_name, filenames, shards=shards)
-    sorted_files = yield _SortChunksPipeline(job_name, hashed_files)
+  def run(self, job_name, mapper_params, filenames, shards=None):
+    bucket_name = mapper_params["bucket_name"]
+    hashed_files = yield _HashPipeline(job_name, bucket_name,
+                                       filenames, shards=shards)
+    sorted_files = yield _SortChunksPipeline(job_name, bucket_name,
+                                             hashed_files)
     temp_files = [hashed_files, sorted_files]
 
-    merged_files = yield _MergePipeline(job_name, sorted_files)
+    merged_files = yield _MergePipeline(job_name, bucket_name, sorted_files)
 
     with pipeline.After(merged_files):
       all_temp_files = yield pipeline_common.Extend(*temp_files)
-      yield mapper_pipeline._CleanupPipeline(all_temp_files)
+      yield _GCSCleanupPipeline(all_temp_files)
 
     yield pipeline_common.Return(merged_files)
+
+
+class _GCSCleanupPipeline(pipeline_base.PipelineBase):
+  """A pipeline to do a cleanup for mapreduce jobs that use GCS.
+
+  Args:
+    filename_or_list: list of files or file lists to delete.
+  """
+
+
+  _MIN_RETRIES = 5
+
+  _MAX_RETRIES = 10
+
+  def delete_file_or_list(self, filename_or_list):
+    if isinstance(filename_or_list, list):
+      for filename in filename_or_list:
+        self.delete_file_or_list(filename)
+    else:
+      filename = filename_or_list
+      retry_params = cloudstorage.RetryParams(min_retries=self._MIN_RETRIES,
+                                              max_retries=self._MAX_RETRIES)
+
+      try:
+        cloudstorage.delete(filename, retry_params)
+      except:
+        pass
+
+  def run(self, temp_files):
+    self.delete_file_or_list(temp_files)
diff --git a/google/appengine/ext/mapreduce/status.py b/google/appengine/ext/mapreduce/status.py
index 480e783..b4abce1 100644
--- a/google/appengine/ext/mapreduce/status.py
+++ b/google/appengine/ext/mapreduce/status.py
@@ -33,6 +33,8 @@
 """Status page handler for mapreduce framework."""
 
 
+
+
 import os
 import pkgutil
 import time
diff --git a/google/appengine/ext/mapreduce/test_support.py b/google/appengine/ext/mapreduce/test_support.py
index d46e0b3..b57f013 100644
--- a/google/appengine/ext/mapreduce/test_support.py
+++ b/google/appengine/ext/mapreduce/test_support.py
@@ -33,6 +33,7 @@
 """Utilities to aid in testing mapreduces."""
 
 
+
 import base64
 import collections
 import logging
@@ -99,9 +100,13 @@
   url = task["url"]
   handler = None
 
+  params = []
+
   for (re_str, handler_class) in handlers_map:
     re_str = "^" + re_str + "($|\\?)"
-    if re.match(re_str, url):
+    m = re.match(re_str, url)
+    if m:
+      params = m.groups()[:-1]
       break
   else:
     raise Exception("Can't determine handler for %s" % task)
@@ -166,9 +171,9 @@
     os.environ = copy_os_environ
 
     if task["method"] == "POST":
-      handler.post()
+      handler.post(*params)
     elif task["method"] == "GET":
-      handler.get()
+      handler.get(*params)
     else:
       raise Exception("Unsupported method: %s" % task.method)
   finally:
diff --git a/google/appengine/ext/mapreduce/util.py b/google/appengine/ext/mapreduce/util.py
index 63a1ced..92dbc4b 100644
--- a/google/appengine/ext/mapreduce/util.py
+++ b/google/appengine/ext/mapreduce/util.py
@@ -28,13 +28,12 @@
 
 
 
-
-
 """Utility functions for use with the mapreduce library."""
 
 
 
 
+
 __all__ = [
     "create_datastore_write_config",
     "for_name",
@@ -47,6 +46,7 @@
     "try_serialize_handler",
     "try_deserialize_handler",
     "CALLBACK_MR_ID_TASK_HEADER",
+    "strip_prefix_from_items"
     ]
 
 import inspect
@@ -202,7 +202,8 @@
   name doesn't contain '.', the current module will be used.
 
   Args:
-    fq_name: fully qualified name of something to find
+    fq_name: fully qualified name of something to find.
+    recursive: run recursively or not.
 
   Returns:
     class object or None if fq_name is None.
@@ -238,7 +239,7 @@
       raise
     else:
       raise ImportError("Could not find '%s' on path '%s'" % (
-                        short_name, module_name))
+          short_name, module_name))
   except ImportError:
 
 
@@ -251,7 +252,7 @@
         raise KeyError()
     except KeyError:
       raise ImportError("Could not find '%s' on path '%s'" % (
-                        short_name, module_name))
+          short_name, module_name))
     except ImportError:
 
 
@@ -422,3 +423,25 @@
           "Object %r must be defined on the top level of a module." % obj)
     return "%s.%s" % (obj.__module__, obj.__name__)
   raise TypeError("Unexpected type %s." % type(obj))
+
+
+def strip_prefix_from_items(prefix, items):
+  """Strips out the prefix from each of the items if it is present.
+
+  Args:
+    prefix: the string for that you wish to strip from the beginning of each
+      of the items.
+    items: a list of strings that may or may not contain the prefix you want
+      to strip out.
+
+  Returns:
+    items_no_prefix: a copy of the list of items (same order) without the
+      prefix (if present).
+  """
+  items_no_prefix = []
+  for item in items:
+    if item.startswith(prefix):
+      items_no_prefix.append(item[len(prefix):])
+    else:
+      items_no_prefix.append(item)
+  return items_no_prefix
diff --git a/google/appengine/ext/ndb/query.py b/google/appengine/ext/ndb/query.py
index 8d6d47c..e558d89 100644
--- a/google/appengine/ext/ndb/query.py
+++ b/google/appengine/ext/ndb/query.py
@@ -1293,6 +1293,8 @@
     total = 0
     while rpc is not None:
       batch = yield rpc
+      options = QueryOptions(offset=options.offset - batch.skipped_results,
+                             config=options)
       rpc = batch.next_batch_async(options)
       total += batch.skipped_results
     raise tasklets.Return(total)
diff --git a/google/appengine/ext/preload/__init__.py b/google/appengine/ext/preload/__init__.py
index 257e729..ea1771a 100644
--- a/google/appengine/ext/preload/__init__.py
+++ b/google/appengine/ext/preload/__init__.py
@@ -34,6 +34,7 @@
 
 
 
+
 import os
 _original_os_urandom = os.urandom
 def os_urandom_replacement(n):
diff --git a/google/appengine/ext/remote_api/handler.py b/google/appengine/ext/remote_api/handler.py
index 8e81f95..ee9ee3b 100644
--- a/google/appengine/ext/remote_api/handler.py
+++ b/google/appengine/ext/remote_api/handler.py
@@ -59,6 +59,7 @@
 
 
 
+
 import google
 import hashlib
 import logging
diff --git a/google/appengine/ext/remote_api/remote_api_services.py b/google/appengine/ext/remote_api/remote_api_services.py
index 289116b..628f724 100644
--- a/google/appengine/ext/remote_api/remote_api_services.py
+++ b/google/appengine/ext/remote_api/remote_api_services.py
@@ -240,6 +240,8 @@
                         search_service_pb.ListIndexesResponse),
         'Search': (search_service_pb.SearchRequest,
                    search_service_pb.SearchResponse),
+        'DeleteSchema': (search_service_pb.DeleteSchemaRequest,
+                         search_service_pb.DeleteSchemaResponse),
     },
     'modules': {
         'GetModules': (modules_service_pb.GetModulesRequest,
diff --git a/google/appengine/ext/remote_api/remote_api_stub.py b/google/appengine/ext/remote_api/remote_api_stub.py
index 1304812..7715008 100644
--- a/google/appengine/ext/remote_api/remote_api_stub.py
+++ b/google/appengine/ext/remote_api/remote_api_stub.py
@@ -65,6 +65,7 @@
 
 
 
+
 import google
 import os
 import pickle
@@ -660,6 +661,155 @@
   return app_id, server
 
 
+
+_OAUTH_SCOPES = [
+    'https://www.googleapis.com/auth/appengine.apis',
+    'https://www.googleapis.com/auth/userinfo.email',
+    ]
+
+
+
+def _ConfigureRemoteApiWithKeyFile(servername,
+                                   path,
+                                   service_account,
+                                   key_file_path):
+  """Does necessary setup to allow easy remote access to App Engine APIs.
+
+  This function uses OAuth2 with a credential derived from service_account and
+  key_file_path to communicate with App Engine APIs.
+
+  Use of this method requires an encryption library to be installed.
+
+  Args:
+    servername: The hostname your app is deployed on (typically,
+        <app_id>.appspot.com).
+    path: The path to the remote_api handler for your app
+      (for example, '/_ah/remote_api').
+    service_account: The email address of the service account to use for
+      making OAuth requests.
+    key_file_path: The path to a .p12 file containing the private key for
+      service_account.
+
+  Returns:
+    server, a server which may be useful for calling the application directly.
+
+  Raises:
+    urllib2.HTTPError: if app_id is not provided and there is an error while
+      retrieving it.
+    ConfigurationError: if there is a error configuring the DatstoreFileStub.
+    ImportError: if the oauth2client module is not available or an appropriate
+      encryption library cannot not be found.
+    IOError: if key_file_path does not exist or cannot be read.
+  """
+  try:
+
+    import oauth2client.client
+  except ImportError, e:
+    raise ImportError('Use of a key file to access the Remote API '
+                      'requires the oauth2client module: %s' % e)
+
+  if not oauth2client.client.HAS_CRYPTO:
+    raise ImportError('Use of a key file to access the Remote API '
+                      'requires an encryption library. Please install '
+                      'either PyOpenSSL or PyCrypto 2.6 or later.')
+
+  with open(key_file_path, 'rb') as key_file:
+    key = key_file.read()
+    credentials = oauth2client.client.SignedJwtAssertionCredentials(
+        service_account,
+        key,
+        _OAUTH_SCOPES)
+    return _ConfigureRemoteApiWithOAuthCredentials(servername,
+                                                   path,
+                                                   credentials)
+
+
+
+def _ConfigureRemoteApiWithComputeEngineCredential(servername,
+                                                   path):
+  """Does necessary setup to allow easy remote access to App Engine APIs.
+
+  This function uses OAuth2 with a credential from the Compute Engine metadata
+  server to communicate with App Engine APIs.
+
+  Args:
+    servername: The hostname your app is deployed on (typically,
+        <app_id>.appspot.com).
+    path: The path to the remote_api handler for your app
+      (for example, '/_ah/remote_api').
+
+  Returns:
+    server, a server which may be useful for calling the application directly.
+
+  Raises:
+    urllib2.HTTPError: if app_id is not provided and there is an error while
+      retrieving it.
+    ConfigurationError: if there is a error configuring the DatstoreFileStub.
+    ImportError: if the oauth2client or httplib2 module is not available.
+  """
+  try:
+
+    import httplib2
+    import oauth2client
+  except ImportError, e:
+    raise ImportError('Use of Compute Engine credentials requires the '
+                      'oauth2client and httplib2 modules: %s' % e)
+  credentials = oauth2client.gce.AppAssertionCredentials(_OAUTH_SCOPES)
+  http = httplib2.Http()
+  credentials.authorize(http)
+  credentials.refresh(http)
+  return _ConfigureRemoteApiWithOAuthCredentials(servername,
+                                                 path,
+                                                 credentials)
+
+
+def _ConfigureRemoteApiWithOAuthCredentials(servername,
+                                            path,
+                                            credentials):
+  """Does necessary setup to allow easy remote access to App Engine APIs.
+
+  Args:
+    servername: The hostname your app is deployed on (typically,
+        <app_id>.appspot.com).
+    path: The path to the remote_api handler for your app
+      (for example, '/_ah/remote_api').
+    credentials: An oauth2client.OAuth2Credentials object.
+
+  Returns:
+    server, a server which may be useful for calling the application directly.
+
+  Raises:
+    urllib2.HTTPError: if app_id is not provided and there is an error while
+      retrieving it.
+    ConfigurationError: if there is a error configuring the DatstoreFileStub.
+    ImportError: if the appengine_rpc_httplib2 module is not available.
+  """
+  try:
+
+    from google.appengine.tools import appengine_rpc_httplib2
+  except ImportError, e:
+    raise ImportError('Use of OAuth credentials requires the '
+                      'appengine_rpc_httplib2 module. %s' % e)
+  if not servername:
+    raise ConfigurationError('servername required')
+
+  oauth2_parameters = (
+      appengine_rpc_httplib2.HttpRpcServerOAuth2.OAuth2Parameters(
+          access_token=None,
+          client_id=None,
+          client_secret=None,
+          scope=None,
+          refresh_token=None,
+          credential_file=None,
+          credentials=credentials))
+  return ConfigureRemoteApi(
+      app_id=None,
+      path=path,
+      auth_func=oauth2_parameters,
+      servername=servername,
+      rpc_server_factory=appengine_rpc_httplib2.HttpRpcServerOAuth2)
+
+
 def ConfigureRemoteApi(app_id,
                        path,
                        auth_func,
@@ -679,8 +829,7 @@
 
   Note that if the app_id is specified, the internal appid must be used;
   this may include a partition and a domain. It is often easier to let
-  remote_api_stub retreive the app_id automatically.
-
+  remote_api_stub retrieve the app_id automatically.
 
   Args:
     app_id: The app_id of your app, as declared in app.yaml, or None.
diff --git a/google/appengine/ext/remote_api/throttle.py b/google/appengine/ext/remote_api/throttle.py
index 9f56ce9..e8b552b 100644
--- a/google/appengine/ext/remote_api/throttle.py
+++ b/google/appengine/ext/remote_api/throttle.py
@@ -63,6 +63,7 @@
 """
 
 
+
 import logging
 import os
 import threading
diff --git a/google/appengine/ext/search/__init__.py b/google/appengine/ext/search/__init__.py
index a8f804a..c149bf5 100644
--- a/google/appengine/ext/search/__init__.py
+++ b/google/appengine/ext/search/__init__.py
@@ -126,6 +126,7 @@
 
 
 
+
 import re
 import string
 import sys
diff --git a/google/appengine/ext/testbed/__init__.py b/google/appengine/ext/testbed/__init__.py
index d66ad0b..9dae4ca 100644
--- a/google/appengine/ext/testbed/__init__.py
+++ b/google/appengine/ext/testbed/__init__.py
@@ -101,6 +101,9 @@
 
 
 
+
+
+
 import os
 import unittest
 
diff --git a/google/appengine/ext/vendor/__init__.py b/google/appengine/ext/vendor/__init__.py
new file mode 100644
index 0000000..58a23f6
--- /dev/null
+++ b/google/appengine/ext/vendor/__init__.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# 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.
+#
+"""Dependencies vendoring helpers."""
+
+import os.path
+import site
+import sys
+
+
+PYTHON_VERSION = 'python%d.%d' % (sys.version_info[0], sys.version_info[1])
+
+
+def add(path, index=1):
+  """Insert site dir or virtualenv at a given index in sys.path.
+
+  Args:
+    path: relative path to a site dir or virtualenv.
+    index: sys.path position to insert the site dir.
+
+  Raises:
+    ValueError: path doesn't exist.
+  """
+  venv_path = os.path.join(path, 'lib', PYTHON_VERSION, 'site-packages')
+  if os.path.isdir(venv_path):
+    site_dir = venv_path
+  elif os.path.isdir(path):
+    site_dir = path
+  else:
+    raise ValueError('virtualenv: cannot access %s: '
+                     'No such virtualenv or site directory' % path)
+
+
+
+  sys_path = sys.path[:]
+  del sys.path[index:]
+  site.addsitedir(site_dir)
+  sys.path.extend(sys_path[index:])
diff --git a/google/appengine/ext/webapp/__init__.py b/google/appengine/ext/webapp/__init__.py
index 9f5ce27..69c2438 100644
--- a/google/appengine/ext/webapp/__init__.py
+++ b/google/appengine/ext/webapp/__init__.py
@@ -66,6 +66,7 @@
 """
 
 
+
 import logging
 import os
 
diff --git a/google/appengine/ext/webapp/_template.py b/google/appengine/ext/webapp/_template.py
index 0dbc044..e5fc9df 100644
--- a/google/appengine/ext/webapp/_template.py
+++ b/google/appengine/ext/webapp/_template.py
@@ -27,6 +27,7 @@
 
 
 
+
 import warnings
 warnings.filterwarnings('ignore',
                         '',
diff --git a/google/appengine/ext/webapp/_webapp25.py b/google/appengine/ext/webapp/_webapp25.py
index 71dc2c7..cc9764c 100644
--- a/google/appengine/ext/webapp/_webapp25.py
+++ b/google/appengine/ext/webapp/_webapp25.py
@@ -65,6 +65,7 @@
 
 
 
+
 import cgi
 import logging
 import re
diff --git a/google/appengine/ext/webapp/blobstore_handlers.py b/google/appengine/ext/webapp/blobstore_handlers.py
index 5da27f2..dfb33c3 100644
--- a/google/appengine/ext/webapp/blobstore_handlers.py
+++ b/google/appengine/ext/webapp/blobstore_handlers.py
@@ -41,6 +41,7 @@
 
 
 
+
 import cgi
 import collections
 import re
diff --git a/google/appengine/ext/webapp/mail_handlers.py b/google/appengine/ext/webapp/mail_handlers.py
index baa2edc..266209b 100644
--- a/google/appengine/ext/webapp/mail_handlers.py
+++ b/google/appengine/ext/webapp/mail_handlers.py
@@ -37,6 +37,7 @@
 
 
 
+
 from google.appengine.api import mail
 from google.appengine.ext import webapp
 
diff --git a/google/appengine/ext/webapp/mock_webapp.py b/google/appengine/ext/webapp/mock_webapp.py
index 91effd8..458c25a 100644
--- a/google/appengine/ext/webapp/mock_webapp.py
+++ b/google/appengine/ext/webapp/mock_webapp.py
@@ -24,6 +24,7 @@
 """
 
 
+
 import StringIO
 import urlparse
 
diff --git a/google/appengine/ext/webapp/template.py b/google/appengine/ext/webapp/template.py
index e7c5702..c5a7020 100644
--- a/google/appengine/ext/webapp/template.py
+++ b/google/appengine/ext/webapp/template.py
@@ -49,6 +49,8 @@
 
 
 
+
+
 import logging
 import os
 import warnings
diff --git a/google/appengine/ext/webapp/util.py b/google/appengine/ext/webapp/util.py
index 7f9d21f..adfc9a6 100644
--- a/google/appengine/ext/webapp/util.py
+++ b/google/appengine/ext/webapp/util.py
@@ -28,6 +28,7 @@
 
 
 
+
 __all__ = ['login_required',
            'run_wsgi_app',
            'add_wsgi_middleware',
diff --git a/google/appengine/ext/webapp/xmpp_handlers.py b/google/appengine/ext/webapp/xmpp_handlers.py
index 3f7658b..07eb0d4 100644
--- a/google/appengine/ext/webapp/xmpp_handlers.py
+++ b/google/appengine/ext/webapp/xmpp_handlers.py
@@ -30,6 +30,7 @@
 
 
 
+
 import logging
 from google.appengine.api import xmpp
 from google.appengine.ext import webapp
diff --git a/google/appengine/ext/zipserve/__init__.py b/google/appengine/ext/zipserve/__init__.py
index b7ecc2d..f63be94 100644
--- a/google/appengine/ext/zipserve/__init__.py
+++ b/google/appengine/ext/zipserve/__init__.py
@@ -58,6 +58,7 @@
 """
 
 
+
 import email.Utils
 import logging
 import mimetypes
diff --git a/google/appengine/runtime/__init__.py b/google/appengine/runtime/__init__.py
index a365006..1a2e446 100644
--- a/google/appengine/runtime/__init__.py
+++ b/google/appengine/runtime/__init__.py
@@ -23,6 +23,7 @@
 
 
 
+
 try:
   BaseException
 except NameError:
diff --git a/google/appengine/runtime/apiproxy.py b/google/appengine/runtime/apiproxy.py
index ee085ea..4d6f1fb 100644
--- a/google/appengine/runtime/apiproxy.py
+++ b/google/appengine/runtime/apiproxy.py
@@ -26,6 +26,7 @@
 """
 
 
+
 import sys
 
 apiproxy_stub_map_loaded = (
diff --git a/google/appengine/runtime/apiproxy_errors.py b/google/appengine/runtime/apiproxy_errors.py
index b0ad72c..9aec93a 100644
--- a/google/appengine/runtime/apiproxy_errors.py
+++ b/google/appengine/runtime/apiproxy_errors.py
@@ -22,6 +22,7 @@
 """
 
 
+
 class Error(Exception):
   """Base APIProxy error type."""
 
diff --git a/google/appengine/runtime/background.py b/google/appengine/runtime/background.py
index fac550c..6d39aea 100644
--- a/google/appengine/runtime/background.py
+++ b/google/appengine/runtime/background.py
@@ -23,6 +23,7 @@
 """
 
 
+
 import logging
 import sys
 import thread
diff --git a/google/appengine/runtime/cgi.py b/google/appengine/runtime/cgi.py
index 2c458ad..af99bf9 100644
--- a/google/appengine/runtime/cgi.py
+++ b/google/appengine/runtime/cgi.py
@@ -27,6 +27,7 @@
 from __future__ import with_statement
 
 
+
 import cStringIO
 from email import feedparser
 import imp
diff --git a/google/appengine/runtime/features.py b/google/appengine/runtime/features.py
new file mode 100644
index 0000000..0fc303f
--- /dev/null
+++ b/google/appengine/runtime/features.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# 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.
+#
+"""features module.
+
+This module simplifies the access to the appengine feature flags.
+"""
+
+import __builtin__
+
+
+def IsEnabled(feature_name, default=False):
+  """Indicates if a specific feature flag is enabled.
+
+  Args:
+    feature_name: The name of the feature flag to check.
+    default: Default value if the flags are not initialized (In a test
+             environment for example).
+
+  Returns:
+    True/False if the flag is set/not set or default if the feature flags
+    were not initialized.
+  """
+  try:
+
+    return feature_name in __builtin__._APPENGINE_FEATURE_FLAGS
+  except AttributeError:
+    return default
diff --git a/google/appengine/runtime/request_environment.py b/google/appengine/runtime/request_environment.py
index 85ffc7b..9a15e3f 100644
--- a/google/appengine/runtime/request_environment.py
+++ b/google/appengine/runtime/request_environment.py
@@ -26,6 +26,7 @@
 
 
 
+
 import collections
 import os
 import sys
diff --git a/google/appengine/runtime/runtime.py b/google/appengine/runtime/runtime.py
index 2c9268f..6b3c32f 100644
--- a/google/appengine/runtime/runtime.py
+++ b/google/appengine/runtime/runtime.py
@@ -30,6 +30,7 @@
 
 
 
+
 import cStringIO
 import thread
 import threading
diff --git a/google/appengine/runtime/shutdown.py b/google/appengine/runtime/shutdown.py
index 86194f5..34cc70d 100644
--- a/google/appengine/runtime/shutdown.py
+++ b/google/appengine/runtime/shutdown.py
@@ -29,6 +29,7 @@
 
 
 
+
 import logging
 import sys
 import traceback
diff --git a/google/appengine/runtime/wsgi.py b/google/appengine/runtime/wsgi.py
index 87a5a35..f65e5d3 100644
--- a/google/appengine/runtime/wsgi.py
+++ b/google/appengine/runtime/wsgi.py
@@ -30,6 +30,7 @@
 
 
 
+
 import logging
 import sys
 import types
diff --git a/google/appengine/tools/adaptive_thread_pool.py b/google/appengine/tools/adaptive_thread_pool.py
index 3f730ec..b30b2ef 100644
--- a/google/appengine/tools/adaptive_thread_pool.py
+++ b/google/appengine/tools/adaptive_thread_pool.py
@@ -26,6 +26,7 @@
 
 
 
+
 import logging
 import Queue
 import sys
diff --git a/google/appengine/tools/api_server.py b/google/appengine/tools/api_server.py
index 3b51b04..b26d641 100644
--- a/google/appengine/tools/api_server.py
+++ b/google/appengine/tools/api_server.py
@@ -22,6 +22,7 @@
 from __future__ import with_statement
 
 
+
 import BaseHTTPServer
 import httplib
 import logging
@@ -382,8 +383,6 @@
   except ImportError:
 
 
-    logging.warning('Could not initialize images API; you are likely missing '
-                    'the Python "PIL" module.')
 
     from google.appengine.api.images import images_not_implemented_stub
     apiproxy_stub_map.apiproxy.RegisterStub(
diff --git a/google/appengine/tools/appcfg.py b/google/appengine/tools/appcfg.py
index 591527c..6471489 100644
--- a/google/appengine/tools/appcfg.py
+++ b/google/appengine/tools/appcfg.py
@@ -29,6 +29,7 @@
 from __future__ import with_statement
 
 
+
 import calendar
 import contextlib
 import copy
diff --git a/google/appengine/tools/appcfg_java.py b/google/appengine/tools/appcfg_java.py
index c6b6e53..0953501 100644
--- a/google/appengine/tools/appcfg_java.py
+++ b/google/appengine/tools/appcfg_java.py
@@ -34,6 +34,7 @@
 from google.appengine.tools import dispatch_xml_parser
 from google.appengine.tools import dos_xml_parser
 from google.appengine.tools import jarfile
+from google.appengine.tools import java_utils
 from google.appengine.tools import queue_xml_parser
 from google.appengine.tools import web_xml_parser
 from google.appengine.tools import yaml_translator
@@ -134,7 +135,7 @@
 
       self.options.no_symlinks = True
 
-    java_home, exec_suffix = JavaHomeAndSuffix()
+    java_home, exec_suffix = java_utils.JavaHomeAndSuffix()
     self.java_command = os.path.join(java_home, 'bin', 'java' + exec_suffix)
     self.javac_command = os.path.join(java_home, 'bin', 'javac' + exec_suffix)
 
@@ -589,61 +590,6 @@
   return matches
 
 
-def JavaHomeAndSuffix():
-  """Find the directory that the JDK is installed in.
-
-  The JDK install directory is expected to have a bin directory that contains
-  at a minimum the java and javac executables. If the environment variable
-  JAVA_HOME is set then it must point to such a directory. Otherwise, we look
-  for javac on the PATH and check that it is inside a JDK install directory.
-
-  Returns:
-    A tuple where the first element is the JDK install directory and the second
-    element is a suffix that must be appended to executables in that directory
-    ('' on Unix-like systems, '.exe' on Windows).
-
-  Raises:
-    RuntimeError: If JAVA_HOME is set but is not a JDK install directory, or
-    otherwise if a JDK install directory cannot be found based on the PATH.
-  """
-  def ResultForJdkAt(path):
-    """Return (path, suffix) if path is a JDK install directory, else None."""
-    def IsExecutable(binary):
-      return os.path.isfile(binary) and os.access(binary, os.X_OK)
-
-    def ResultFor(path):
-      for suffix in ['', '.exe']:
-        if all(IsExecutable(os.path.join(path, 'bin', binary + suffix))
-               for binary in ['java', 'javac', 'jar']):
-          return (path, suffix)
-      return None
-
-    result = ResultFor(path)
-    if not result:
-
-
-      head, tail = os.path.split(path)
-      if tail == 'jre':
-        result = ResultFor(head)
-    return result
-
-  java_home = os.getenv('JAVA_HOME')
-  if java_home:
-    result = ResultForJdkAt(java_home)
-    if result:
-      return result
-    else:
-      raise RuntimeError(
-          'JAVA_HOME is set but does not reference a valid JDK: %s' % java_home)
-  for path_dir in os.environ['PATH'].split(os.pathsep):
-    maybe_root, last = os.path.split(path_dir)
-    if last == 'bin':
-      result = ResultForJdkAt(maybe_root)
-      if result:
-        return result
-  raise RuntimeError('Did not find JDK in PATH and JAVA_HOME is not set')
-
-
 def _FindApiJars(lib_dir):
   """Find the appengine-api-*.jar and its version.
 
diff --git a/google/appengine/tools/appengine_rpc.py b/google/appengine/tools/appengine_rpc.py
index 2f8c738..a040d30 100644
--- a/google/appengine/tools/appengine_rpc.py
+++ b/google/appengine/tools/appengine_rpc.py
@@ -17,6 +17,7 @@
 """Tool for performing authenticated RPCs against App Engine."""
 
 
+
 import google
 
 import cookielib
diff --git a/google/appengine/tools/appengine_rpc_httplib2.py b/google/appengine/tools/appengine_rpc_httplib2.py
index 2f8cece..6c4d4af 100644
--- a/google/appengine/tools/appengine_rpc_httplib2.py
+++ b/google/appengine/tools/appengine_rpc_httplib2.py
@@ -291,7 +291,8 @@
     """Class encapsulating parameters related to OAuth2 authentication."""
 
     def __init__(self, access_token, client_id, client_secret, scope,
-                 refresh_token, credential_file, token_uri=None):
+                 refresh_token, credential_file, token_uri=None,
+                 credentials=None):
       self.access_token = access_token
       self.client_id = client_id
       self.client_secret = client_secret
@@ -299,6 +300,7 @@
       self.refresh_token = refresh_token
       self.credential_file = credential_file
       self.token_uri = token_uri
+      self.credentials = credentials
 
   def __init__(self, host, oauth2_parameters, user_agent, source,
                host_override=None, extra_headers=None, save_cookies=False,
@@ -344,8 +346,10 @@
     else:
       self.storage = NoStorage()
 
-    if any((oauth2_parameters.access_token, oauth2_parameters.refresh_token,
-            oauth2_parameters.token_uri)):
+    if oauth2_parameters.credentials:
+      self.credentials = oauth2_parameters.credentials
+    elif any((oauth2_parameters.access_token, oauth2_parameters.refresh_token,
+              oauth2_parameters.token_uri)):
       token_uri = (oauth2_parameters.token_uri or
                    ('https://%s/o/oauth2/token' %
                     os.getenv('APPENGINE_AUTH_SERVER', 'accounts.google.com')))
diff --git a/google/appengine/tools/bulkload_client.py b/google/appengine/tools/bulkload_client.py
index 65273ce..a6a5acc 100644
--- a/google/appengine/tools/bulkload_client.py
+++ b/google/appengine/tools/bulkload_client.py
@@ -37,6 +37,7 @@
 """
 
 
+
 import StringIO
 import httplib
 import logging
diff --git a/google/appengine/tools/dev-channel-js.js b/google/appengine/tools/dev-channel-js.js
index db6866c..beb5743 100644
--- a/google/appengine/tools/dev-channel-js.js
+++ b/google/appengine/tools/dev-channel-js.js
@@ -126,7 +126,7 @@
   } else {
     if (goog.inHtmlDocument_()) {
       for (var doc = goog.global.document, scripts = doc.getElementsByTagName("script"), i = scripts.length - 1;0 <= i;--i) {
-        var src = scripts[i].src, qmark = src.lastIndexOf("?"), l = -1 == qmark ? src.length : qmark;
+        var script = scripts[i], src = script.src, qmark = src.lastIndexOf("?"), l = -1 == qmark ? src.length : qmark;
         if ("base.js" == src.substr(l - 7, 7)) {
           goog.basePath = src.substr(0, l - 7);
           break;
@@ -195,7 +195,7 @@
     goog.loadedModules_[moduleName] = exports;
     if (goog.moduleLoaderState_.declareTestMethods) {
       for (var entry in exports) {
-        if (0 === entry.indexOf("test", 0) || "tearDown" == entry || "setup" == entry) {
+        if (0 === entry.indexOf("test", 0) || "tearDown" == entry || "setUp" == entry || "setUpPage" == entry || "tearDownPage" == entry) {
           goog.global[entry] = exports[entry];
         }
       }
@@ -594,12 +594,17 @@
 goog.string.collapseWhitespace = function(str) {
   return str.replace(/[\s\xa0]+/g, " ").replace(/^\s+|\s+$/g, "");
 };
-goog.string.isEmpty = function(str) {
+goog.string.isEmptyOrWhitespace = function(str) {
   return/^[\s\xa0]*$/.test(str);
 };
-goog.string.isEmptySafe = function(str) {
-  return goog.string.isEmpty(goog.string.makeSafe(str));
+goog.string.isEmptyString = function(str) {
+  return 0 == str.length;
 };
+goog.string.isEmpty = goog.string.isEmptyOrWhitespace;
+goog.string.isEmptyOrWhitespaceSafe = function(str) {
+  return goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str));
+};
+goog.string.isEmptySafe = goog.string.isEmptyOrWhitespaceSafe;
 goog.string.isBreakingWhitespace = function(str) {
   return!/[^\t\n\r ]/.test(str);
 };
@@ -1378,7 +1383,15 @@
 goog.array.flatten = function(var_args) {
   for (var result = [], i = 0;i < arguments.length;i++) {
     var element = arguments[i];
-    goog.isArray(element) ? result.push.apply(result, goog.array.flatten.apply(null, element)) : result.push(element);
+    if (goog.isArray(element)) {
+      for (var c = 0;c < element.length;c += 8192) {
+        for (var chunk = goog.array.slice(element, c, c + 8192), recurseResult = goog.array.flatten.apply(null, chunk), r = 0;r < recurseResult.length;r++) {
+          result.push(recurseResult[r]);
+        }
+      }
+    } else {
+      result.push(element);
+    }
   }
   return result;
 };
@@ -1754,11 +1767,13 @@
   return key in obj ? obj[key] : obj[key] = value;
 };
 goog.object.equals = function(a, b) {
-  if (!goog.array.equals(goog.object.getKeys(a), goog.object.getKeys(b))) {
-    return!1;
-  }
   for (var k in a) {
-    if (a[k] !== b[k]) {
+    if (!(k in b) || a[k] !== b[k]) {
+      return!1;
+    }
+  }
+  for (k in b) {
+    if (!(k in a)) {
       return!1;
     }
   }
@@ -1885,6 +1900,12 @@
 goog.labs.userAgent.browser.matchSafari_ = function() {
   return goog.labs.userAgent.util.matchUserAgent("Safari") && !goog.labs.userAgent.util.matchUserAgent("Chrome") && !goog.labs.userAgent.util.matchUserAgent("CriOS") && !goog.labs.userAgent.util.matchUserAgent("Android");
 };
+goog.labs.userAgent.browser.matchCoast_ = function() {
+  return goog.labs.userAgent.util.matchUserAgent("Coast");
+};
+goog.labs.userAgent.browser.matchIosWebview_ = function() {
+  return(goog.labs.userAgent.util.matchUserAgent("iPad") || goog.labs.userAgent.util.matchUserAgent("iPhone")) && !goog.labs.userAgent.browser.matchSafari_() && !goog.labs.userAgent.browser.matchChrome_() && !goog.labs.userAgent.browser.matchCoast_() && goog.labs.userAgent.util.matchUserAgent("AppleWebKit");
+};
 goog.labs.userAgent.browser.matchChrome_ = function() {
   return goog.labs.userAgent.util.matchUserAgent("Chrome") || goog.labs.userAgent.util.matchUserAgent("CriOS");
 };
@@ -1895,6 +1916,8 @@
 goog.labs.userAgent.browser.isIE = goog.labs.userAgent.browser.matchIE_;
 goog.labs.userAgent.browser.isFirefox = goog.labs.userAgent.browser.matchFirefox_;
 goog.labs.userAgent.browser.isSafari = goog.labs.userAgent.browser.matchSafari_;
+goog.labs.userAgent.browser.isCoast = goog.labs.userAgent.browser.matchCoast_;
+goog.labs.userAgent.browser.isIosWebview = goog.labs.userAgent.browser.matchIosWebview_;
 goog.labs.userAgent.browser.isChrome = goog.labs.userAgent.browser.matchChrome_;
 goog.labs.userAgent.browser.isAndroidBrowser = goog.labs.userAgent.browser.matchAndroidBrowser_;
 goog.labs.userAgent.browser.isSilk = function() {
@@ -2038,7 +2061,6 @@
   goog.userAgent.detectedMac_ = goog.string.contains(goog.userAgent.PLATFORM, "Mac");
   goog.userAgent.detectedWindows_ = goog.string.contains(goog.userAgent.PLATFORM, "Win");
   goog.userAgent.detectedLinux_ = goog.string.contains(goog.userAgent.PLATFORM, "Linux");
-  goog.userAgent.detectedX11_ = !!goog.userAgent.getNavigator() && goog.string.contains(goog.userAgent.getNavigator().appVersion || "", "X11");
   var ua = goog.userAgent.getUserAgentString();
   goog.userAgent.detectedAndroid_ = !!ua && goog.string.contains(ua, "Android");
   goog.userAgent.detectedIPhone_ = !!ua && goog.string.contains(ua, "iPhone");
@@ -2048,7 +2070,11 @@
 goog.userAgent.MAC = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_MAC : goog.userAgent.detectedMac_;
 goog.userAgent.WINDOWS = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_WINDOWS : goog.userAgent.detectedWindows_;
 goog.userAgent.LINUX = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_LINUX : goog.userAgent.detectedLinux_;
-goog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_X11 : goog.userAgent.detectedX11_;
+goog.userAgent.isX11_ = function() {
+  var navigator = goog.userAgent.getNavigator();
+  return!!navigator && goog.string.contains(navigator.appVersion || "", "X11");
+};
+goog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_X11 : goog.userAgent.isX11_();
 goog.userAgent.ANDROID = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_ANDROID : goog.userAgent.detectedAndroid_;
 goog.userAgent.IPHONE = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPHONE : goog.userAgent.detectedIPhone_;
 goog.userAgent.IPAD = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPAD : goog.userAgent.detectedIPad_;
@@ -3010,9 +3036,9 @@
 CHANGE:"change", SELECT:"select", SUBMIT:"submit", INPUT:"input", PROPERTYCHANGE:"propertychange", DRAGSTART:"dragstart", DRAG:"drag", DRAGENTER:"dragenter", DRAGOVER:"dragover", DRAGLEAVE:"dragleave", DROP:"drop", DRAGEND:"dragend", TOUCHSTART:"touchstart", TOUCHMOVE:"touchmove", TOUCHEND:"touchend", TOUCHCANCEL:"touchcancel", BEFOREUNLOAD:"beforeunload", CONSOLEMESSAGE:"consolemessage", CONTEXTMENU:"contextmenu", DOMCONTENTLOADED:"DOMContentLoaded", ERROR:"error", HELP:"help", LOAD:"load", LOSECAPTURE:"losecapture", 
 ORIENTATIONCHANGE:"orientationchange", READYSTATECHANGE:"readystatechange", RESIZE:"resize", SCROLL:"scroll", UNLOAD:"unload", HASHCHANGE:"hashchange", PAGEHIDE:"pagehide", PAGESHOW:"pageshow", POPSTATE:"popstate", COPY:"copy", PASTE:"paste", CUT:"cut", BEFORECOPY:"beforecopy", BEFORECUT:"beforecut", BEFOREPASTE:"beforepaste", ONLINE:"online", OFFLINE:"offline", MESSAGE:"message", CONNECT:"connect", ANIMATIONSTART:goog.events.getVendorPrefixedName_("AnimationStart"), ANIMATIONEND:goog.events.getVendorPrefixedName_("AnimationEnd"), 
 ANIMATIONITERATION:goog.events.getVendorPrefixedName_("AnimationIteration"), TRANSITIONEND:goog.events.getVendorPrefixedName_("TransitionEnd"), POINTERDOWN:"pointerdown", POINTERUP:"pointerup", POINTERCANCEL:"pointercancel", POINTERMOVE:"pointermove", POINTEROVER:"pointerover", POINTEROUT:"pointerout", POINTERENTER:"pointerenter", POINTERLEAVE:"pointerleave", GOTPOINTERCAPTURE:"gotpointercapture", LOSTPOINTERCAPTURE:"lostpointercapture", MSGESTURECHANGE:"MSGestureChange", MSGESTUREEND:"MSGestureEnd", 
-MSGESTUREHOLD:"MSGestureHold", MSGESTURESTART:"MSGestureStart", MSGESTURETAP:"MSGestureTap", MSGOTPOINTERCAPTURE:"MSGotPointerCapture", MSINERTIASTART:"MSInertiaStart", MSLOSTPOINTERCAPTURE:"MSLostPointerCapture", MSPOINTERCANCEL:"MSPointerCancel", MSPOINTERDOWN:"MSPointerDown", MSPOINTERENTER:"MSPointerEnter", MSPOINTERHOVER:"MSPointerHover", MSPOINTERLEAVE:"MSPointerLeave", MSPOINTERMOVE:"MSPointerMove", MSPOINTEROUT:"MSPointerOut", MSPOINTEROVER:"MSPointerOver", MSPOINTERUP:"MSPointerUp", TEXTINPUT:"textinput", 
-COMPOSITIONSTART:"compositionstart", COMPOSITIONUPDATE:"compositionupdate", COMPOSITIONEND:"compositionend", EXIT:"exit", LOADABORT:"loadabort", LOADCOMMIT:"loadcommit", LOADREDIRECT:"loadredirect", LOADSTART:"loadstart", LOADSTOP:"loadstop", RESPONSIVE:"responsive", SIZECHANGED:"sizechanged", UNRESPONSIVE:"unresponsive", VISIBILITYCHANGE:"visibilitychange", STORAGE:"storage", DOMSUBTREEMODIFIED:"DOMSubtreeModified", DOMNODEINSERTED:"DOMNodeInserted", DOMNODEREMOVED:"DOMNodeRemoved", DOMNODEREMOVEDFROMDOCUMENT:"DOMNodeRemovedFromDocument", 
-DOMNODEINSERTEDINTODOCUMENT:"DOMNodeInsertedIntoDocument", DOMATTRMODIFIED:"DOMAttrModified", DOMCHARACTERDATAMODIFIED:"DOMCharacterDataModified"};
+MSGESTUREHOLD:"MSGestureHold", MSGESTURESTART:"MSGestureStart", MSGESTURETAP:"MSGestureTap", MSGOTPOINTERCAPTURE:"MSGotPointerCapture", MSINERTIASTART:"MSInertiaStart", MSLOSTPOINTERCAPTURE:"MSLostPointerCapture", MSPOINTERCANCEL:"MSPointerCancel", MSPOINTERDOWN:"MSPointerDown", MSPOINTERENTER:"MSPointerEnter", MSPOINTERHOVER:"MSPointerHover", MSPOINTERLEAVE:"MSPointerLeave", MSPOINTERMOVE:"MSPointerMove", MSPOINTEROUT:"MSPointerOut", MSPOINTEROVER:"MSPointerOver", MSPOINTERUP:"MSPointerUp", TEXT:"text", 
+TEXTINPUT:"textInput", COMPOSITIONSTART:"compositionstart", COMPOSITIONUPDATE:"compositionupdate", COMPOSITIONEND:"compositionend", EXIT:"exit", LOADABORT:"loadabort", LOADCOMMIT:"loadcommit", LOADREDIRECT:"loadredirect", LOADSTART:"loadstart", LOADSTOP:"loadstop", RESPONSIVE:"responsive", SIZECHANGED:"sizechanged", UNRESPONSIVE:"unresponsive", VISIBILITYCHANGE:"visibilitychange", STORAGE:"storage", DOMSUBTREEMODIFIED:"DOMSubtreeModified", DOMNODEINSERTED:"DOMNodeInserted", DOMNODEREMOVED:"DOMNodeRemoved", 
+DOMNODEREMOVEDFROMDOCUMENT:"DOMNodeRemovedFromDocument", DOMNODEINSERTEDINTODOCUMENT:"DOMNodeInsertedIntoDocument", DOMATTRMODIFIED:"DOMAttrModified", DOMCHARACTERDATAMODIFIED:"DOMCharacterDataModified"};
 goog.events.BrowserEvent = function(opt_e, opt_currentTarget) {
   goog.events.Event.call(this, opt_e ? opt_e.type : "");
   this.relatedTarget = this.currentTarget = this.target = null;
@@ -3942,21 +3968,15 @@
   return newIter;
 };
 goog.iter.takeWhile = function(iterable, f, opt_obj) {
-  var iterator = goog.iter.toIterator(iterable), newIter = new goog.iter.Iterator, taking = !0;
-  newIter.next = function() {
-    for (;;) {
-      if (taking) {
-        var val = iterator.next();
-        if (f.call(opt_obj, val, void 0, iterator)) {
-          return val;
-        }
-        taking = !1;
-      } else {
-        throw goog.iter.StopIteration;
-      }
+  var iterator = goog.iter.toIterator(iterable), iter = new goog.iter.Iterator;
+  iter.next = function() {
+    var val = iterator.next();
+    if (f.call(opt_obj, val, void 0, iterator)) {
+      return val;
     }
+    throw goog.iter.StopIteration;
   };
-  return newIter;
+  return iter;
 };
 goog.iter.toArray = function(iterable) {
   if (goog.isArrayLike(iterable)) {
@@ -5080,7 +5100,7 @@
     doc.write("");
     doc.close();
     var message = "callImmediate" + Math.random(), origin = "file:" == win.location.protocol ? "*" : win.location.protocol + "//" + win.location.host, onmessage = goog.bind(function(e) {
-      if (e.origin == origin || e.data == message) {
+      if (("*" == origin || e.origin == origin) && e.data == message) {
         this.port1.onmessage();
       }
     }, this);
@@ -5093,10 +5113,12 @@
   if ("undefined" !== typeof Channel && !goog.labs.userAgent.browser.isIE()) {
     var channel = new Channel, head = {}, tail = head;
     channel.port1.onmessage = function() {
-      head = head.next;
-      var cb = head.cb;
-      head.cb = null;
-      cb();
+      if (goog.isDef(head.next)) {
+        head = head.next;
+        var cb = head.cb;
+        head.cb = null;
+        cb();
+      }
     };
     return function(cb) {
       tail.next = {cb:cb};
diff --git a/google/appengine/tools/dev_appserver_apiserver.py b/google/appengine/tools/dev_appserver_apiserver.py
index 34a8b0b..7a1b5a8 100644
--- a/google/appengine/tools/dev_appserver_apiserver.py
+++ b/google/appengine/tools/dev_appserver_apiserver.py
@@ -30,6 +30,7 @@
 
 
 
+
 import base64
 import cgi
 import cStringIO
diff --git a/google/appengine/tools/dev_appserver_blobimage.py b/google/appengine/tools/dev_appserver_blobimage.py
index a8b3c79..5130be1 100644
--- a/google/appengine/tools/dev_appserver_blobimage.py
+++ b/google/appengine/tools/dev_appserver_blobimage.py
@@ -24,6 +24,7 @@
 """
 
 
+
 import logging
 import re
 import urlparse
diff --git a/google/appengine/tools/dev_appserver_blobstore.py b/google/appengine/tools/dev_appserver_blobstore.py
index 753565d..cf78da6 100644
--- a/google/appengine/tools/dev_appserver_blobstore.py
+++ b/google/appengine/tools/dev_appserver_blobstore.py
@@ -29,6 +29,7 @@
 
 
 
+
 import cgi
 import cStringIO
 import logging
diff --git a/google/appengine/tools/dev_appserver_channel.py b/google/appengine/tools/dev_appserver_channel.py
index fb846bd..3ee9366 100644
--- a/google/appengine/tools/dev_appserver_channel.py
+++ b/google/appengine/tools/dev_appserver_channel.py
@@ -25,6 +25,7 @@
 
 
 
+
 import cgi
 import os
 import urlparse
diff --git a/google/appengine/tools/dev_appserver_index.py b/google/appengine/tools/dev_appserver_index.py
index fb80ee9..a5c3857 100644
--- a/google/appengine/tools/dev_appserver_index.py
+++ b/google/appengine/tools/dev_appserver_index.py
@@ -22,6 +22,7 @@
 
 
 
+
 from google.appengine.api import apiproxy_stub_map
 from google.appengine.datastore.datastore_stub_index import *
 
diff --git a/google/appengine/tools/dev_appserver_login.py b/google/appengine/tools/dev_appserver_login.py
index d72bb86..a4d6df5 100644
--- a/google/appengine/tools/dev_appserver_login.py
+++ b/google/appengine/tools/dev_appserver_login.py
@@ -28,6 +28,7 @@
 """
 
 
+
 import cgi
 import Cookie
 import os
diff --git a/google/appengine/tools/dev_appserver_main.py b/google/appengine/tools/dev_appserver_main.py
index fbf6432..850b998 100644
--- a/google/appengine/tools/dev_appserver_main.py
+++ b/google/appengine/tools/dev_appserver_main.py
@@ -148,6 +148,7 @@
 
 
 
+
 from google.appengine.tools import os_compat
 
 import getopt
diff --git a/google/appengine/tools/dev_appserver_multiprocess.py b/google/appengine/tools/dev_appserver_multiprocess.py
index 0442da2..36ef5ec 100644
--- a/google/appengine/tools/dev_appserver_multiprocess.py
+++ b/google/appengine/tools/dev_appserver_multiprocess.py
@@ -34,6 +34,7 @@
 """
 
 
+
 import BaseHTTPServer
 import copy
 import cStringIO
diff --git a/google/appengine/tools/dev_appserver_oauth.py b/google/appengine/tools/dev_appserver_oauth.py
index 66aaa7e..93ed470 100644
--- a/google/appengine/tools/dev_appserver_oauth.py
+++ b/google/appengine/tools/dev_appserver_oauth.py
@@ -18,6 +18,7 @@
 
 
 
+
 import cgi
 
 
diff --git a/google/appengine/tools/dev_appserver_upload.py b/google/appengine/tools/dev_appserver_upload.py
index db53c5d..0bb1b60 100644
--- a/google/appengine/tools/dev_appserver_upload.py
+++ b/google/appengine/tools/dev_appserver_upload.py
@@ -25,6 +25,7 @@
 """
 
 
+
 import base64
 import cStringIO
 import datetime
diff --git a/google/appengine/tools/devappserver2/admin/admin_request_handler.py b/google/appengine/tools/devappserver2/admin/admin_request_handler.py
index 1470ff9..021837e 100644
--- a/google/appengine/tools/devappserver2/admin/admin_request_handler.py
+++ b/google/appengine/tools/devappserver2/admin/admin_request_handler.py
@@ -17,6 +17,7 @@
 """A base class for all Admin UI request handlers and related utilities."""
 
 
+
 import os.path
 import random
 import string
@@ -122,7 +123,7 @@
     For example, if the request URL is
     "http://foo/bar?animal=cat&color=redirect" then
     _construct_url(['animal'], {'vehicle': 'car'}) will return
-    "http://foo/bar?vehicle=car&color=redirect"
+    "http://foo/bar?color=redirect&vehicle=car"
 
     Args:
       remove: A sequence of query parameters to remove from the query string.
diff --git a/google/appengine/tools/devappserver2/admin/admin_request_handler_test.py b/google/appengine/tools/devappserver2/admin/admin_request_handler_test.py
index 439804a..1e322e7 100644
--- a/google/appengine/tools/devappserver2/admin/admin_request_handler_test.py
+++ b/google/appengine/tools/devappserver2/admin/admin_request_handler_test.py
@@ -17,6 +17,7 @@
 """Tests for devappserver2.admin.admin_request_handler."""
 
 
+
 import os.path
 import tempfile
 import unittest
diff --git a/google/appengine/tools/devappserver2/admin/admin_server.py b/google/appengine/tools/devappserver2/admin/admin_server.py
index d25f10a..b7a9ebc 100644
--- a/google/appengine/tools/devappserver2/admin/admin_server.py
+++ b/google/appengine/tools/devappserver2/admin/admin_server.py
@@ -17,13 +17,13 @@
 """Run a server displaying the administrative UI for the application."""
 
 
+
 import logging
-import os.path
 
 import google
-import jinja2
 import webapp2
 
+from google.appengine.tools.devappserver2 import wsgi_server
 from google.appengine.tools.devappserver2.admin import admin_request_handler
 from google.appengine.tools.devappserver2.admin import blobstore_viewer
 from google.appengine.tools.devappserver2.admin import console
@@ -31,6 +31,7 @@
 from google.appengine.tools.devappserver2.admin import datastore_indexes_viewer
 from google.appengine.tools.devappserver2.admin import datastore_stats_handler
 from google.appengine.tools.devappserver2.admin import datastore_viewer
+from google.appengine.tools.devappserver2.admin import logs_handler
 from google.appengine.tools.devappserver2.admin import mail_request_handler
 from google.appengine.tools.devappserver2.admin import memcache_viewer
 from google.appengine.tools.devappserver2.admin import modules_handler
@@ -40,7 +41,6 @@
 from google.appengine.tools.devappserver2.admin import taskqueue_queues_handler
 from google.appengine.tools.devappserver2.admin import taskqueue_tasks_handler
 from google.appengine.tools.devappserver2.admin import xmpp_request_handler
-from google.appengine.tools.devappserver2 import wsgi_server
 
 
 class AdminApplication(webapp2.WSGIApplication):
@@ -79,6 +79,7 @@
          ('/search/index', search_handler.SearchIndexHandler),
          ('/assets/(.+)', static_file_handler.StaticFileHandler),
          ('/instances', modules_handler.ModulesHandler),
+         ('/instances/logs', logs_handler.LogsHandler),
          webapp2.Route('/',
                        webapp2.RedirectHandler,
                        defaults={'_uri': '/instances'})],
diff --git a/google/appengine/tools/devappserver2/admin/console.py b/google/appengine/tools/devappserver2/admin/console.py
index 1fa62d3..e3f4fca 100644
--- a/google/appengine/tools/devappserver2/admin/console.py
+++ b/google/appengine/tools/devappserver2/admin/console.py
@@ -17,6 +17,7 @@
 """A handler that provides an interactive console."""
 
 
+
 import threading
 
 from google.appengine.tools.devappserver2 import module
diff --git a/google/appengine/tools/devappserver2/admin/console_test.py b/google/appengine/tools/devappserver2/admin/console_test.py
index 652be69..621c009 100644
--- a/google/appengine/tools/devappserver2/admin/console_test.py
+++ b/google/appengine/tools/devappserver2/admin/console_test.py
@@ -17,6 +17,7 @@
 """Tests for devappserver2.admin.console."""
 
 
+
 import unittest
 
 import google
diff --git a/google/appengine/tools/devappserver2/admin/datastore_viewer.py b/google/appengine/tools/devappserver2/admin/datastore_viewer.py
index 452ffdd..5b97d0f 100644
--- a/google/appengine/tools/devappserver2/admin/datastore_viewer.py
+++ b/google/appengine/tools/devappserver2/admin/datastore_viewer.py
@@ -17,6 +17,7 @@
 """A handler that displays information about datastore entities."""
 
 
+
 import cgi
 import datetime
 import math
diff --git a/google/appengine/tools/devappserver2/admin/datastore_viewer_test.py b/google/appengine/tools/devappserver2/admin/datastore_viewer_test.py
index 5876e72..b0919ac 100644
--- a/google/appengine/tools/devappserver2/admin/datastore_viewer_test.py
+++ b/google/appengine/tools/devappserver2/admin/datastore_viewer_test.py
@@ -17,6 +17,7 @@
 """Tests for devappserver2.admin.datastore_viewer."""
 
 
+
 import datetime
 import os
 import unittest
diff --git a/google/appengine/tools/devappserver2/admin/logs_handler.py b/google/appengine/tools/devappserver2/admin/logs_handler.py
new file mode 100644
index 0000000..7280a44
--- /dev/null
+++ b/google/appengine/tools/devappserver2/admin/logs_handler.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# 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.
+#
+"""A handler that displays logs for instances."""
+
+import json
+import os
+
+import google
+import requests
+
+from google.appengine.tools.devappserver2 import log_manager
+from google.appengine.tools.devappserver2.admin import admin_request_handler
+
+
+class LogsHandler(admin_request_handler.AdminRequestHandler):
+  _REQUIRED_PARAMS = ['app', 'module', 'version', 'instance', 'log_type']
+
+  def get(self):
+    try:
+      ps = self.request.params
+      params = dict([(p, ps[p]) for p in self._REQUIRED_PARAMS])
+    except KeyError, e:
+      self.abort(404, detail='Missing log request parameter %s.' % e.message)
+
+    # Forward request to LogServer
+    host = os.environ.get(log_manager.APP_ENGINE_LOG_SERVER_HOST)
+    port = os.environ.get(log_manager.APP_ENGINE_LOG_SERVER_PORT)
+    if not host or not port:
+      self.abort(404, detail='LogServer Host and Port must be set')
+
+    r = requests.get('http://{host}:{port}'.format(host=host, port=port),
+                     params=params)
+    params['logs'] = json.loads(r.text)
+
+    self.response.write(self.render('instance_logs.html', params))
diff --git a/google/appengine/tools/devappserver2/admin/memcache_viewer.py b/google/appengine/tools/devappserver2/admin/memcache_viewer.py
index bceac87..308a2df 100644
--- a/google/appengine/tools/devappserver2/admin/memcache_viewer.py
+++ b/google/appengine/tools/devappserver2/admin/memcache_viewer.py
@@ -26,6 +26,7 @@
 """
 
 
+
 import datetime
 import logging
 import urllib
diff --git a/google/appengine/tools/devappserver2/admin/static_file_handler.py b/google/appengine/tools/devappserver2/admin/static_file_handler.py
index fef47d3..0d25b2f 100644
--- a/google/appengine/tools/devappserver2/admin/static_file_handler.py
+++ b/google/appengine/tools/devappserver2/admin/static_file_handler.py
@@ -17,6 +17,7 @@
 """A simple handler to serve static assets."""
 
 
+
 import logging
 import mimetypes
 import os
diff --git a/google/appengine/tools/devappserver2/admin/taskqueue_queues_handler.py b/google/appengine/tools/devappserver2/admin/taskqueue_queues_handler.py
index f574bb6..9229ba0 100644
--- a/google/appengine/tools/devappserver2/admin/taskqueue_queues_handler.py
+++ b/google/appengine/tools/devappserver2/admin/taskqueue_queues_handler.py
@@ -17,6 +17,7 @@
 """A handler that displays queue information for the application."""
 
 
+
 from google.appengine.api import apiproxy_stub_map
 from google.appengine.api.taskqueue import taskqueue_service_pb
 
diff --git a/google/appengine/tools/devappserver2/admin/taskqueue_queues_handler_test.py b/google/appengine/tools/devappserver2/admin/taskqueue_queues_handler_test.py
index 904f44a..1227c43 100644
--- a/google/appengine/tools/devappserver2/admin/taskqueue_queues_handler_test.py
+++ b/google/appengine/tools/devappserver2/admin/taskqueue_queues_handler_test.py
@@ -17,6 +17,7 @@
 """Tests for devappserver2.admin.taskqueue_queues_handler."""
 
 
+
 import unittest
 
 import google
diff --git a/google/appengine/tools/devappserver2/admin/taskqueue_tasks_handler.py b/google/appengine/tools/devappserver2/admin/taskqueue_tasks_handler.py
index c384ce5..80d1fa3 100644
--- a/google/appengine/tools/devappserver2/admin/taskqueue_tasks_handler.py
+++ b/google/appengine/tools/devappserver2/admin/taskqueue_tasks_handler.py
@@ -17,6 +17,7 @@
 """A handler that displays task information for a single queue."""
 
 
+
 import datetime
 import urllib
 
diff --git a/google/appengine/tools/devappserver2/admin/taskqueue_utils.py b/google/appengine/tools/devappserver2/admin/taskqueue_utils.py
index ae3bc28..5ba67af 100644
--- a/google/appengine/tools/devappserver2/admin/taskqueue_utils.py
+++ b/google/appengine/tools/devappserver2/admin/taskqueue_utils.py
@@ -17,6 +17,7 @@
 """Shared utilities for dealing with taskqueue."""
 
 
+
 import datetime
 
 from google.appengine.api import apiproxy_stub_map
diff --git a/google/appengine/tools/devappserver2/admin/taskqueue_utils_test.py b/google/appengine/tools/devappserver2/admin/taskqueue_utils_test.py
index 38aeb26..bd39239 100644
--- a/google/appengine/tools/devappserver2/admin/taskqueue_utils_test.py
+++ b/google/appengine/tools/devappserver2/admin/taskqueue_utils_test.py
@@ -17,6 +17,7 @@
 """Tests for devappserver2.admin.taskqueue_utils."""
 
 
+
 import unittest
 
 import google
diff --git a/google/appengine/tools/devappserver2/admin/templates/instance_logs.css b/google/appengine/tools/devappserver2/admin/templates/instance_logs.css
new file mode 100644
index 0000000..923bae4
--- /dev/null
+++ b/google/appengine/tools/devappserver2/admin/templates/instance_logs.css
@@ -0,0 +1,16 @@
+#tabs {
+  border-bottom: .5em solid #EEEEEE;
+  margin: 0;
+  padding: 0;
+}
+
+#tabs li {
+  display:inline;
+}
+
+#tabs li a {
+  text-decoration: none;
+  padding: 0.25em 1em;
+  color: #000;
+  font-size: 150%;
+}
diff --git a/google/appengine/tools/devappserver2/admin/templates/instance_logs.html b/google/appengine/tools/devappserver2/admin/templates/instance_logs.html
new file mode 100644
index 0000000..8981a56
--- /dev/null
+++ b/google/appengine/tools/devappserver2/admin/templates/instance_logs.html
@@ -0,0 +1,41 @@
+{% extends "skeleton.html" %}
+{% block page_title %}Logs{% endblock %}
+
+{% block page_head %}
+  <style type="text/css">
+    {% include "instance_logs.css" %}
+  </style>
+{% endblock %}
+
+{% block body %}
+  <h3>
+    Logs for instance
+    {% if module.supports_individually_addressable_instances %}
+      <a href="//{{ module.get_instance_address(instance.instance_id) }}"
+          target="_blank">
+    {% endif %}
+      {{ instance.instance_id }}
+    {% if module.supports_individually_addressable_instances %}
+      </a>
+    {% endif %}
+    of module
+    <a href="//{{ module.balanced_address }}" target="_blank">
+      {{ module.name }}
+    </a>.
+  </h3>
+  <ul id="tabs">
+    <!--TODO(gloom): pass the list of logtypes here-->
+    {% for log_type in ['request', 'app', 'appjson'] %}
+      <li id={{ log_type }}>
+        <a href="/instances/logs?app={{ module.app_name_external }}&module={{ module.name }}&version={{ module.version }}&instance={{ instance.instance_id }}&log_type={{ log_type }}">
+          {{ log_type }}
+        </a>
+      </li>
+    {% endfor %}
+  </ul>
+  {% for l in logs %}
+  <li>
+    {{ l }}
+  </li>
+  {% endfor %}
+{% endblock %}
diff --git a/google/appengine/tools/devappserver2/admin/templates/modules.html b/google/appengine/tools/devappserver2/admin/templates/modules.html
index ee72953..8a976df 100644
--- a/google/appengine/tools/devappserver2/admin/templates/modules.html
+++ b/google/appengine/tools/devappserver2/admin/templates/modules.html
@@ -15,46 +15,55 @@
         <th>Latency (ms)</th>
         <th>QPS</th>
         <th>Total Requests</th>
+        <th>Logs</th>
         <th>Runtime</th>
       </tr>
     </thead>
     <tbody>
       {% for module in modules|sort(attribute='name') %}
-      <tr>
-        <th colspan=4>
-          <a href="//{{ module.balanced_address }}" target="_blank">
-            {{ module.name }}</a>
-        </th>
-        <td>
-          {% if module.runtime == "vm" %}
-            vm:
-          {% endif %}
-          {{ module.effective_runtime }}
-        </td>
-      </tr>
-      {% for instance in module.instances|sort(attribute='instance_id') %}
-      <tr class="instance">
-        <td class="instance-id">
-          {% if module.supports_individually_addressable_instances %}
-          <a href="//{{ module.get_instance_address(instance.instance_id) }}"
-            target="_blank">
-          {% endif %}
-          {{ instance.instance_id }}
-          {% if module.supports_individually_addressable_instances %}
-          </a>
-          {% endif %}
-        </td>
-        <td>
-          {{ '%0.1f'|format(instance.get_latency_60s() * 1000) }}
-        </td>
-        <td>
-          {{ '%0.2f'|format(instance.get_qps_60s()) }}
-        </td>
-        <td>
-          {{ instance.total_requests }}
-        </td>
-      </tr>
-      {% endfor %}
+        <tr>
+          <th colspan=5>
+            <a href="//{{ module.balanced_address }}" target="_blank">
+              {{ module.name }}</a>
+          </th>
+          <td>
+            {% if module.runtime == "vm" %}
+              vm:
+            {% endif %}
+            {{ module.effective_runtime }}
+          </td>
+        </tr>
+        {% for instance in module.instances|sort(attribute='instance_id') %}
+          <tr class="instance">
+            <td class="instance-id">
+              {% if module.supports_individually_addressable_instances %}
+                <a href="//{{ module.get_instance_address(instance.instance_id) }}"
+                  target="_blank">
+              {% endif %}
+                {{ instance.instance_id }}
+              {% if module.supports_individually_addressable_instances %}
+                </a>
+              {% endif %}
+            </td>
+            <td>
+              {{ '%0.1f'|format(instance.get_latency_60s() * 1000) }}
+            </td>
+            <td>
+              {{ '%0.2f'|format(instance.get_qps_60s()) }}
+            </td>
+            <td>
+              {{ instance.total_requests }}
+            </td>
+            {% if module.runtime == "vm" %}
+            <td>
+              <a href="/instances/logs?app={{ module.app_name_external }}&module={{ module.name }}&version={{ module.version }}&instance={{ instance.instance_id }}&log_type=request">
+                Logs
+              </a>
+            </td>
+            {% endif %}
+            <td></td>
+          </tr>
+        {% endfor %}
       {% endfor %}
     </tbody>
   </table>
diff --git a/google/appengine/tools/devappserver2/admin/xmpp_request_handler.py b/google/appengine/tools/devappserver2/admin/xmpp_request_handler.py
index 7ca5ef4..63cb6d2 100644
--- a/google/appengine/tools/devappserver2/admin/xmpp_request_handler.py
+++ b/google/appengine/tools/devappserver2/admin/xmpp_request_handler.py
@@ -17,6 +17,7 @@
 """A handler that allows the user to send XMPP messages to their application."""
 
 
+
 import cStringIO
 import random
 import string
diff --git a/google/appengine/tools/devappserver2/admin/xmpp_request_handler_test.py b/google/appengine/tools/devappserver2/admin/xmpp_request_handler_test.py
index 97611cc..43a95fa 100644
--- a/google/appengine/tools/devappserver2/admin/xmpp_request_handler_test.py
+++ b/google/appengine/tools/devappserver2/admin/xmpp_request_handler_test.py
@@ -17,6 +17,7 @@
 """Tests for devappserver2.admin.xmpp_request_handler."""
 
 
+
 import unittest
 
 import google
diff --git a/google/appengine/tools/devappserver2/api_server.py b/google/appengine/tools/devappserver2/api_server.py
index 325d9e1..2b7dfc3 100644
--- a/google/appengine/tools/devappserver2/api_server.py
+++ b/google/appengine/tools/devappserver2/api_server.py
@@ -20,6 +20,7 @@
 """
 
 
+
 import logging
 import os
 import pickle
@@ -334,6 +335,9 @@
     default_gcs_bucket_name: A str, overriding the default bucket behavior.
   """
 
+
+
+
   identity_stub = app_identity_stub.AppIdentityServiceStub.Create(
       email_address=appidentity_email_address,
       private_key_path=appidentity_private_key_path)
@@ -380,8 +384,9 @@
     from google.appengine.api.images import images_stub
   except ImportError:
 
-    logging.warning('Could not initialize images API; you are likely missing '
-                    'the Python "PIL" module.')
+
+
+
     # We register a stub which throws a NotImplementedError for most RPCs.
     from google.appengine.api.images import images_not_implemented_stub
     apiproxy_stub_map.apiproxy.RegisterStub(
diff --git a/google/appengine/tools/devappserver2/api_server_test.py b/google/appengine/tools/devappserver2/api_server_test.py
index 878cda4..1887217 100644
--- a/google/appengine/tools/devappserver2/api_server_test.py
+++ b/google/appengine/tools/devappserver2/api_server_test.py
@@ -17,6 +17,7 @@
 """Tests for google.apphosting.tools.devappserver2.api_server."""
 
 
+
 import cStringIO
 import pickle
 import re
diff --git a/google/appengine/tools/devappserver2/application_configuration.py b/google/appengine/tools/devappserver2/application_configuration.py
index 442b560..6e15648 100644
--- a/google/appengine/tools/devappserver2/application_configuration.py
+++ b/google/appengine/tools/devappserver2/application_configuration.py
@@ -19,6 +19,8 @@
 # TODO: Support more than just app.yaml.
 
 
+
+import datetime
 import errno
 import logging
 import os
@@ -48,6 +50,10 @@
 NOBUILD_FILES_CHANGED = 7
 
 
+
+
+
+
 _HEALTH_CHECK_DEFAULTS = {
     'enable_health_check': True,
     'check_interval_sec': 5,
@@ -361,6 +367,11 @@
         config, files = appinfo_includes.ParseAndReturnIncludePaths(f)
     if self._forced_app_id:
       config.application = self._forced_app_id
+
+    if config.runtime == 'vm' and not config.version:
+      config.version = generate_version_id()
+      logging.info('No version specified. Generated version id: %s',
+                   config.version)
     return config, [configuration_path] + files
 
   def _parse_java_configuration(self, app_engine_web_xml_path):
@@ -859,3 +870,15 @@
       return os.path.join(module_configuration.application_root,
                           error_handler.file)
   return None
+
+
+def generate_version_id(datetime_getter=datetime.datetime.now):
+  """Generates a version id based off the current time.
+
+  Args:
+    datetime_getter: A function that returns a datetime.datetime instance.
+
+  Returns:
+    A version string based.
+  """
+  return datetime_getter().isoformat().lower().translate(None, ':-')[:15]
diff --git a/google/appengine/tools/devappserver2/application_configuration_test.py b/google/appengine/tools/devappserver2/application_configuration_test.py
index 8471704..75f40b6 100644
--- a/google/appengine/tools/devappserver2/application_configuration_test.py
+++ b/google/appengine/tools/devappserver2/application_configuration_test.py
@@ -17,8 +17,10 @@
 """Tests for google.apphosting.tools.devappserver2.application_configuration."""
 
 
+
 import collections
 from contextlib import contextmanager
+import datetime
 import io
 import os.path
 import shutil
@@ -171,6 +173,29 @@
     self.assertEqual({'/appdir/app.yaml': 10}, config._mtimes)
     self.assertEqual(info.vm_health_check, config.vm_health_check)
 
+  def test_vm_no_version(self):
+    manual_scaling = appinfo.ManualScaling()
+    info = appinfo.AppInfoExternal(
+        application='app',
+        module='module1',
+        runtime='vm',
+        threadsafe=False,
+        manual_scaling=manual_scaling,
+    )
+
+    appinfo_includes.ParseAndReturnIncludePaths(mox.IgnoreArg()).AndReturn(
+        (info, []))
+    os.path.getmtime('/appdir/app.yaml').AndReturn(10)
+
+    self.mox.StubOutWithMock(application_configuration, 'generate_version_id')
+    application_configuration.generate_version_id().AndReturn(
+        'generated-version')
+    self.mox.ReplayAll()
+    config = application_configuration.ModuleConfiguration('/appdir/app.yaml')
+
+    self.mox.VerifyAll()
+    self.assertEqual(config.major_version, 'generated-version')
+
   def test_set_health_check_defaults(self):
     # Pass nothing in.
     self.assertEqual(
@@ -1148,5 +1173,15 @@
     self.assertEqual(dispatch_config, config.dispatch)
 
 
+class GenerateVersionIdTest(unittest.TestCase):
+  """Tests the GenerateVersionId function."""
+
+  def test_generate_version_id(self):
+    datetime_getter = lambda: datetime.datetime(2014, 9, 18, 17, 31, 45, 92949)
+    generated_version = application_configuration.generate_version_id(
+        datetime_getter)
+    self.assertEqual(generated_version, '20140918t173145')
+
+
 if __name__ == '__main__':
   unittest.main()
diff --git a/google/appengine/tools/devappserver2/blob_download.py b/google/appengine/tools/devappserver2/blob_download.py
index 07455f4..32c7269 100644
--- a/google/appengine/tools/devappserver2/blob_download.py
+++ b/google/appengine/tools/devappserver2/blob_download.py
@@ -17,6 +17,7 @@
 """Rewrites blob download headers in the response with full blob contents."""
 
 
+
 import logging
 
 from google.appengine.api import apiproxy_stub_map
diff --git a/google/appengine/tools/devappserver2/blob_upload.py b/google/appengine/tools/devappserver2/blob_upload.py
index afdc1ba..d8aac17 100644
--- a/google/appengine/tools/devappserver2/blob_upload.py
+++ b/google/appengine/tools/devappserver2/blob_upload.py
@@ -21,6 +21,7 @@
 """
 
 
+
 import base64
 import cgi
 import cStringIO
diff --git a/google/appengine/tools/devappserver2/blob_upload_test.py b/google/appengine/tools/devappserver2/blob_upload_test.py
index eba18ac..f5d4b99 100644
--- a/google/appengine/tools/devappserver2/blob_upload_test.py
+++ b/google/appengine/tools/devappserver2/blob_upload_test.py
@@ -17,6 +17,7 @@
 """Tests for devappserver2.blob_upload."""
 
 
+
 import base64
 import cgi
 import cStringIO
diff --git a/google/appengine/tools/devappserver2/channel.py b/google/appengine/tools/devappserver2/channel.py
index c2cb2e4..7a4039b 100644
--- a/google/appengine/tools/devappserver2/channel.py
+++ b/google/appengine/tools/devappserver2/channel.py
@@ -21,6 +21,7 @@
 """
 
 
+
 import os
 
 import google
diff --git a/google/appengine/tools/devappserver2/channel_test.py b/google/appengine/tools/devappserver2/channel_test.py
index 95fedd5..ca1e2bc 100644
--- a/google/appengine/tools/devappserver2/channel_test.py
+++ b/google/appengine/tools/devappserver2/channel_test.py
@@ -18,6 +18,7 @@
 
 
 
+
 import StringIO
 import unittest
 import urllib
diff --git a/google/appengine/tools/devappserver2/constants.py b/google/appengine/tools/devappserver2/constants.py
index ffe6eb6..779a967 100644
--- a/google/appengine/tools/devappserver2/constants.py
+++ b/google/appengine/tools/devappserver2/constants.py
@@ -17,6 +17,7 @@
 """Constants used by the devappserver2."""
 
 
+
 # These statuses must not include a response body (RFC 2616).
 NO_BODY_RESPONSE_STATUSES = frozenset([100, 101, 204, 304])
 
@@ -29,6 +30,9 @@
 # See:
 # https://developers.google.com/appengine/docs/python/runtime#Request_Headers
 
+
+
+
 IGNORED_REQUEST_HEADERS = frozenset([
     'accept-encoding',
     'connection',
@@ -46,6 +50,9 @@
 # Note: Content-Length is set by a subsequent rewriter or removed.
 # Note: Server and Date are then set by devappserver2.
 
+
+
+
 _COMMON_IGNORED_RESPONSE_HEADERS = frozenset([
     'connection',
     'content-encoding',
diff --git a/google/appengine/tools/devappserver2/devappserver2.py b/google/appengine/tools/devappserver2/devappserver2.py
index ffbc988..29eb023 100644
--- a/google/appengine/tools/devappserver2/devappserver2.py
+++ b/google/appengine/tools/devappserver2/devappserver2.py
@@ -17,6 +17,7 @@
 """The main entry point for the new development server."""
 
 
+
 import argparse
 import errno
 import getpass
@@ -371,7 +372,11 @@
       'can be a boolean, in which case all modules threadsafe setting will '
       'be overridden or a comma-separated list of module:threadsafe_override '
       'e.g. "default:False,backend:True"')
-  common_group.add_argument('--docker_daemon_url', help=argparse.SUPPRESS)
+  common_group.add_argument('--enable_mvm_logs',
+                            action=boolean_action.BooleanAction,
+                            const=True,
+                            default=False,
+                            help=argparse.SUPPRESS)
 
   # PHP
   php_group = parser.add_argument_group('PHP')
@@ -631,7 +636,12 @@
       'decide)')
   misc_group.add_argument(
       '--default_gcs_bucket_name', default=None,
-      help='default Google Cloud Storgage bucket name')
+      help='default Google Cloud Storage bucket name')
+
+
+
+
+
 
 
   return parser
@@ -702,6 +712,8 @@
   def module_to_address(self, module_name, instance=None):
     """Returns the address of a module."""
 
+
+
     if module_name is None:
       return self._dispatcher.dispatch_address
     return self._dispatcher.get_hostname(
@@ -918,8 +930,6 @@
   @staticmethod
   def _create_vm_config(options):
     vm_config = runtime_config_pb2.VMConfig()
-    if options.docker_daemon_url:
-      vm_config.docker_daemon_url = options.docker_daemon_url
     if options.dart_sdk:
       vm_config.dart_config.dart_sdk = os.path.abspath(options.dart_sdk)
     if options.dart_dev_mode:
@@ -928,6 +938,7 @@
       vm_config.dart_config.dart_pub_serve_host = options.dart_pub_serve_host
     if options.dart_pub_serve_port:
       vm_config.dart_config.dart_pub_serve_port = options.dart_pub_serve_port
+    vm_config.enable_logs = options.enable_mvm_logs
     return vm_config
 
   @staticmethod
diff --git a/google/appengine/tools/devappserver2/devappserver2_test.py b/google/appengine/tools/devappserver2/devappserver2_test.py
index 08ffd26..516226a 100644
--- a/google/appengine/tools/devappserver2/devappserver2_test.py
+++ b/google/appengine/tools/devappserver2/devappserver2_test.py
@@ -17,6 +17,7 @@
 """Tests for google.apphosting.tools.devappserver2.devappserver2."""
 
 
+
 import argparse
 import getpass
 import itertools
diff --git a/google/appengine/tools/devappserver2/dispatcher.py b/google/appengine/tools/devappserver2/dispatcher.py
index c4cd393..057eee3 100644
--- a/google/appengine/tools/devappserver2/dispatcher.py
+++ b/google/appengine/tools/devappserver2/dispatcher.py
@@ -107,8 +107,7 @@
           required configuration for local Google Cloud SQL development. If None
           then Cloud SQL will not be available.
       vm_config: A runtime_config_pb2.VMConfig instance containing
-          VM runtime-specific configuration. If vm_config does not have
-          docker_daemon_url specified all docker-related stuff is disabled.
+          VM runtime-specific configuration.
       module_to_max_instances: A mapping between a module name and the maximum
           number of instances that can be created (this overrides the settings
           found in the configuration argument) e.g.
@@ -661,6 +660,10 @@
     if not hostname or hostname == default_address:
       return self._module_for_request(path), None
 
+
+
+
+
     default_address_offset = hostname.find(default_address)
     if default_address_offset > 0:
       prefix = hostname[:default_address_offset - 1]
diff --git a/google/appengine/tools/devappserver2/dispatcher_test.py b/google/appengine/tools/devappserver2/dispatcher_test.py
index ba1b88a..7afdb7c 100644
--- a/google/appengine/tools/devappserver2/dispatcher_test.py
+++ b/google/appengine/tools/devappserver2/dispatcher_test.py
@@ -47,6 +47,7 @@
   def __init__(self, application, module_name, version, manual_scaling):
     self.application_root = '/'
     self.application = application
+    self.application_external_name = 'app'
     self.module_name = module_name
     self.major_version = version
     self.version_id = '%s:%s.%s' % (module_name, version, '12345')
diff --git a/google/appengine/tools/devappserver2/endpoints/api_config_manager.py b/google/appengine/tools/devappserver2/endpoints/api_config_manager.py
index 72577eb..ad49ddf 100644
--- a/google/appengine/tools/devappserver2/endpoints/api_config_manager.py
+++ b/google/appengine/tools/devappserver2/endpoints/api_config_manager.py
@@ -18,6 +18,10 @@
 
 
 
+
+
+
+
 import base64
 import json
 import logging
@@ -82,6 +86,9 @@
       body: A string, the JSON body of the getApiConfigs response.
     """
 
+
+
+
     try:
       response_obj = json.loads(body)
     except ValueError, unused_err:
@@ -152,6 +159,12 @@
           The score for the given path.
         """
 
+
+
+
+
+
+
         score = 0
         parts = path.split('/')
         for part in parts:
diff --git a/google/appengine/tools/devappserver2/endpoints/api_config_manager_test.py b/google/appengine/tools/devappserver2/endpoints/api_config_manager_test.py
index 2e43533..d76d320 100644
--- a/google/appengine/tools/devappserver2/endpoints/api_config_manager_test.py
+++ b/google/appengine/tools/devappserver2/endpoints/api_config_manager_test.py
@@ -18,6 +18,10 @@
 
 
 
+
+
+
+
 import json
 import re
 import unittest
@@ -268,6 +272,8 @@
 class ParameterizedPathTest(unittest.TestCase):
 
 
+
+
   def test_invalid_variable_name_leading_digit(self):
     self.assertEqual(
         None, re.match(api_config_manager._PATH_VARIABLE_PATTERN, '1abc'))
diff --git a/google/appengine/tools/devappserver2/endpoints/api_request.py b/google/appengine/tools/devappserver2/endpoints/api_request.py
index 6e24394..65a4ba5 100644
--- a/google/appengine/tools/devappserver2/endpoints/api_request.py
+++ b/google/appengine/tools/devappserver2/endpoints/api_request.py
@@ -21,6 +21,9 @@
 
 
 
+
+
+
 import cgi
 import copy
 import json
diff --git a/google/appengine/tools/devappserver2/endpoints/api_request_test.py b/google/appengine/tools/devappserver2/endpoints/api_request_test.py
index 2856b76..000778b 100644
--- a/google/appengine/tools/devappserver2/endpoints/api_request_test.py
+++ b/google/appengine/tools/devappserver2/endpoints/api_request_test.py
@@ -18,6 +18,10 @@
 
 
 
+
+
+
+
 import cStringIO
 import json
 import unittest
diff --git a/google/appengine/tools/devappserver2/endpoints/discovery_api_proxy.py b/google/appengine/tools/devappserver2/endpoints/discovery_api_proxy.py
index c01032b..293b156 100644
--- a/google/appengine/tools/devappserver2/endpoints/discovery_api_proxy.py
+++ b/google/appengine/tools/devappserver2/endpoints/discovery_api_proxy.py
@@ -18,6 +18,10 @@
 
 
 
+
+
+
+
 import httplib
 import json
 import logging
diff --git a/google/appengine/tools/devappserver2/endpoints/discovery_api_proxy_test.py b/google/appengine/tools/devappserver2/endpoints/discovery_api_proxy_test.py
index 20fc2d4..c34d19c 100644
--- a/google/appengine/tools/devappserver2/endpoints/discovery_api_proxy_test.py
+++ b/google/appengine/tools/devappserver2/endpoints/discovery_api_proxy_test.py
@@ -18,6 +18,10 @@
 
 
 
+
+
+
+
 import httplib
 import json
 import os
diff --git a/google/appengine/tools/devappserver2/endpoints/discovery_service.py b/google/appengine/tools/devappserver2/endpoints/discovery_service.py
index 32ba9cd..5490485 100644
--- a/google/appengine/tools/devappserver2/endpoints/discovery_service.py
+++ b/google/appengine/tools/devappserver2/endpoints/discovery_service.py
@@ -18,6 +18,10 @@
 
 
 
+
+
+
+
 import json
 import logging
 
diff --git a/google/appengine/tools/devappserver2/endpoints/discovery_service_test.py b/google/appengine/tools/devappserver2/endpoints/discovery_service_test.py
index 303d9c2..b0439c5 100644
--- a/google/appengine/tools/devappserver2/endpoints/discovery_service_test.py
+++ b/google/appengine/tools/devappserver2/endpoints/discovery_service_test.py
@@ -18,6 +18,10 @@
 
 
 
+
+
+
+
 import json
 import os
 import unittest
diff --git a/google/appengine/tools/devappserver2/endpoints/endpoints_server.py b/google/appengine/tools/devappserver2/endpoints/endpoints_server.py
index 4edeb3b..dda565c 100644
--- a/google/appengine/tools/devappserver2/endpoints/endpoints_server.py
+++ b/google/appengine/tools/devappserver2/endpoints/endpoints_server.py
@@ -27,6 +27,10 @@
 
 
 
+
+
+
+
 import httplib
 import json
 import logging
@@ -600,6 +604,11 @@
       # we need to call transform_parameter_value on them before calling
       # _add_message_field.
 
+
+
+
+
+
       body_json[key] = parameter_converter.transform_parameter_value(
           key, body_json[key], current_parameter)
       # Remove the old key and try to convert to nested message value
diff --git a/google/appengine/tools/devappserver2/endpoints/endpoints_server_test.py b/google/appengine/tools/devappserver2/endpoints/endpoints_server_test.py
index 1a26184..6e65c40 100644
--- a/google/appengine/tools/devappserver2/endpoints/endpoints_server_test.py
+++ b/google/appengine/tools/devappserver2/endpoints/endpoints_server_test.py
@@ -18,6 +18,10 @@
 
 
 
+
+
+
+
 import httplib
 import json
 import logging
diff --git a/google/appengine/tools/devappserver2/endpoints/errors.py b/google/appengine/tools/devappserver2/endpoints/errors.py
index 678f194..0248c50 100644
--- a/google/appengine/tools/devappserver2/endpoints/errors.py
+++ b/google/appengine/tools/devappserver2/endpoints/errors.py
@@ -19,6 +19,10 @@
 
 
 
+
+
+
+
 import json
 import logging
 
@@ -203,6 +207,9 @@
 
 
 
+
+
+
 class EnumRejectionError(InvalidParameterError):
   """Custom request rejection exception for enum values."""
 
diff --git a/google/appengine/tools/devappserver2/endpoints/generated_error_info.py b/google/appengine/tools/devappserver2/endpoints/generated_error_info.py
index b3540cd..462cbd7 100644
--- a/google/appengine/tools/devappserver2/endpoints/generated_error_info.py
+++ b/google/appengine/tools/devappserver2/endpoints/generated_error_info.py
@@ -25,6 +25,12 @@
 
 
 
+
+
+
+
+
+
 import collections
 
 
diff --git a/google/appengine/tools/devappserver2/endpoints/parameter_converter.py b/google/appengine/tools/devappserver2/endpoints/parameter_converter.py
index 0535002..579cd42 100644
--- a/google/appengine/tools/devappserver2/endpoints/parameter_converter.py
+++ b/google/appengine/tools/devappserver2/endpoints/parameter_converter.py
@@ -23,6 +23,10 @@
 
 
 
+
+
+
+
 from google.appengine.tools.devappserver2.endpoints import errors
 
 
@@ -83,6 +87,9 @@
     return
 
 
+
+
+
   if value.lower() not in ('1', 'true', '0', 'false'):
     raise errors.BasicTypeParameterError(parameter_name, value, 'boolean')
 
diff --git a/google/appengine/tools/devappserver2/endpoints/test_utils.py b/google/appengine/tools/devappserver2/endpoints/test_utils.py
index 3fae96e..a0eebc9 100644
--- a/google/appengine/tools/devappserver2/endpoints/test_utils.py
+++ b/google/appengine/tools/devappserver2/endpoints/test_utils.py
@@ -19,6 +19,9 @@
 
 
 
+
+
+
 import cStringIO
 import unittest
 import urlparse
diff --git a/google/appengine/tools/devappserver2/endpoints/testdata/test_service.py b/google/appengine/tools/devappserver2/endpoints/testdata/test_service.py
index ce1bcb5..0a329df 100644
--- a/google/appengine/tools/devappserver2/endpoints/testdata/test_service.py
+++ b/google/appengine/tools/devappserver2/endpoints/testdata/test_service.py
@@ -16,6 +16,8 @@
 #
 """Test service for regression testing of Cloud Endpoints support."""
 
+
+
 import logging
 
 import endpoints
diff --git a/google/appengine/tools/devappserver2/endpoints/util.py b/google/appengine/tools/devappserver2/endpoints/util.py
index ceb644a..002043d 100644
--- a/google/appengine/tools/devappserver2/endpoints/util.py
+++ b/google/appengine/tools/devappserver2/endpoints/util.py
@@ -18,6 +18,10 @@
 
 
 
+
+
+
+
 import json
 
 
diff --git a/google/appengine/tools/devappserver2/endpoints/util_test.py b/google/appengine/tools/devappserver2/endpoints/util_test.py
index 9a41cda..c747ce5 100644
--- a/google/appengine/tools/devappserver2/endpoints/util_test.py
+++ b/google/appengine/tools/devappserver2/endpoints/util_test.py
@@ -18,6 +18,10 @@
 
 
 
+
+
+
+
 import unittest
 
 from google.appengine.tools.devappserver2.endpoints import test_utils
diff --git a/google/appengine/tools/devappserver2/errors.py b/google/appengine/tools/devappserver2/errors.py
index 8ce24ef..b8c2677 100644
--- a/google/appengine/tools/devappserver2/errors.py
+++ b/google/appengine/tools/devappserver2/errors.py
@@ -18,6 +18,7 @@
 
 
 
+
 class Error(Exception):
   """Base class for exceptions in this package."""
 
diff --git a/google/appengine/tools/devappserver2/file_watcher.py b/google/appengine/tools/devappserver2/file_watcher.py
index b0efcdc..e38511b 100644
--- a/google/appengine/tools/devappserver2/file_watcher.py
+++ b/google/appengine/tools/devappserver2/file_watcher.py
@@ -17,6 +17,7 @@
 """Monitors a directory tree for changes."""
 
 
+
 import logging
 import sys
 import types
@@ -50,11 +51,11 @@
     for watcher in self._file_watchers:
       watcher.quit()
 
-  def has_changes(self):
-    # .has_changes() returns True if there has been any changes since the
-    # last call to .has_changes() so it must be called for every FileWatcher
-    # to prevent spurious change notifications on subsequent calls.
-    return any([watcher.has_changes() for watcher in self._file_watchers])
+  def changes(self):
+    # .changes() returns the set of file paths change if there has been any
+    # changes since the last call to .changes so it must be called for every
+    # FileWatcher to prevent spurious change notifications on subsequent calls.
+    return set.union(*[watcher.changes() for watcher in self._file_watchers])
 
 
 def _create_watcher(directories, watcher_class):
@@ -122,7 +123,7 @@
 
   Returns:
     A FileWatcher appropriate for the current platform. start() must be called
-    before has_changes().
+    before changes().
   """
   assert not isinstance(directories, types.StringTypes), 'expected list got str'
 
diff --git a/google/appengine/tools/devappserver2/gcd_application.py b/google/appengine/tools/devappserver2/gcd_application.py
index 03f40aa..8efc48f 100644
--- a/google/appengine/tools/devappserver2/gcd_application.py
+++ b/google/appengine/tools/devappserver2/gcd_application.py
@@ -17,6 +17,7 @@
 """Cloud datastore Web Application handling."""
 
 
+
 import getpass
 import os
 import shutil
diff --git a/google/appengine/tools/devappserver2/gcs_server.py b/google/appengine/tools/devappserver2/gcs_server.py
index e444628..09c3665 100644
--- a/google/appengine/tools/devappserver2/gcs_server.py
+++ b/google/appengine/tools/devappserver2/gcs_server.py
@@ -21,6 +21,7 @@
 """
 
 
+
 import httplib
 import logging
 import webob
diff --git a/google/appengine/tools/devappserver2/go_application.py b/google/appengine/tools/devappserver2/go_application.py
index c3e20c8..33c207a 100644
--- a/google/appengine/tools/devappserver2/go_application.py
+++ b/google/appengine/tools/devappserver2/go_application.py
@@ -17,6 +17,7 @@
 """An abstraction around the source and executable for a Go application."""
 
 
+
 import atexit
 import errno
 import logging
diff --git a/google/appengine/tools/devappserver2/go_runtime.py b/google/appengine/tools/devappserver2/go_runtime.py
index 2d44ae8..4774156 100644
--- a/google/appengine/tools/devappserver2/go_runtime.py
+++ b/google/appengine/tools/devappserver2/go_runtime.py
@@ -17,6 +17,7 @@
 """Serves content for "script" handlers using the Go runtime."""
 
 
+
 import logging
 import os
 import os.path
diff --git a/google/appengine/tools/devappserver2/http_proxy.py b/google/appengine/tools/devappserver2/http_proxy.py
index 8bdbaf0..de22dd5 100644
--- a/google/appengine/tools/devappserver2/http_proxy.py
+++ b/google/appengine/tools/devappserver2/http_proxy.py
@@ -23,24 +23,16 @@
 import contextlib
 import httplib
 import logging
-import socket
 import urllib
 import wsgiref.headers
 
 from google.appengine.tools.devappserver2 import http_runtime_constants
+from google.appengine.tools.devappserver2 import http_utils
 from google.appengine.tools.devappserver2 import instance
 from google.appengine.tools.devappserver2 import login
 from google.appengine.tools.devappserver2 import util
 
 
-class Error(Exception):
-  """Base class for errors in this module."""
-
-
-class HostNotReachable(Error):
-  """Raised if host can't be reached at given port."""
-
-
 class HttpProxy:
   """Forwards HTTP requests to an application instance."""
   def __init__(self, host, port, instance_died_unexpectedly,
@@ -87,29 +79,14 @@
       retries: int, Number of connection retries.
 
     Raises:
-      HostNotReachable: if host:port can't be reached after given number of
-        retries.
+      http_utils.HostNotReachable: if host:port can't be reached after given
+          number of retries.
     """
     # If there was a prior error, we don't need to wait for a connection.
     if self._prior_error:
       return
 
-    def ping():
-      connection = httplib.HTTPConnection(self._host, self._port)
-      with contextlib.closing(connection):
-        try:
-          connection.connect()
-        except (socket.error, httplib.HTTPException):
-          return False
-        else:
-          return True
-
-    while not ping() and retries > 0:
-      retries -= 1
-    if not retries:
-      raise HostNotReachable(
-          'Cannot connect to the instance on {host}:{port}'.format(
-              host=self._host, port=self._port))
+    http_utils.wait_for_connection(self._host, self._port, retries)
 
   def handle(self, environ, start_response, url_map, match, request_id,
              request_type):
diff --git a/google/appengine/tools/devappserver2/http_proxy_test.py b/google/appengine/tools/devappserver2/http_proxy_test.py
index 6281d3c..962e137 100644
--- a/google/appengine/tools/devappserver2/http_proxy_test.py
+++ b/google/appengine/tools/devappserver2/http_proxy_test.py
@@ -98,30 +98,6 @@
     shutil.rmtree(self.tmpdir)
     self.mox.UnsetStubs()
 
-  def test_wait_for_connection_retries_used_up(self):
-    retries = 5
-    for _ in xrange(0, retries + 1):
-      httplib.HTTPConnection.connect().AndRaise(socket.error)
-      httplib.HTTPConnection.close()
-
-    self.mox.ReplayAll()
-    self.assertRaises(http_proxy.HostNotReachable,
-                      self.proxy.wait_for_connection, retries)
-    self.mox.VerifyAll()
-
-  def test_wait_for_connection_worked(self):
-    retries = 5
-    for _ in xrange(0, retries):
-      httplib.HTTPConnection.connect().AndRaise(socket.error)
-      httplib.HTTPConnection.close()
-
-    httplib.HTTPConnection.connect()
-    httplib.HTTPConnection.close()
-
-    self.mox.ReplayAll()
-    self.proxy.wait_for_connection(retries + 1)
-    self.mox.VerifyAll()
-
   def test_handle_get(self):
     response = FakeHttpResponse(200,
                                 'OK',
diff --git a/google/appengine/tools/devappserver2/http_runtime.py b/google/appengine/tools/devappserver2/http_runtime.py
index 3960374..0beff17 100644
--- a/google/appengine/tools/devappserver2/http_runtime.py
+++ b/google/appengine/tools/devappserver2/http_runtime.py
@@ -34,6 +34,7 @@
 """
 
 
+
 import base64
 import logging
 import os
@@ -116,6 +117,9 @@
   # TODO: Determine if we can always use SIGTERM.
   # Set this to True to quit with SIGTERM rather than SIGKILL
 
+
+
+
   _quit_with_sigterm = False
 
   @classmethod
diff --git a/google/appengine/tools/devappserver2/http_runtime_constants.py b/google/appengine/tools/devappserver2/http_runtime_constants.py
index 19b1312..7fe5e5e 100644
--- a/google/appengine/tools/devappserver2/http_runtime_constants.py
+++ b/google/appengine/tools/devappserver2/http_runtime_constants.py
@@ -17,6 +17,7 @@
 """Constants used for communicating with the Python devappserver2 runtime."""
 
 
+
 SERVER_SOFTWARE = 'Development/2.0'
 
 # Internal AppEngine prefix for Headers (Environment variables)
diff --git a/google/appengine/tools/devappserver2/http_runtime_test.py b/google/appengine/tools/devappserver2/http_runtime_test.py
index 3d9ce09..4e4c5ed 100644
--- a/google/appengine/tools/devappserver2/http_runtime_test.py
+++ b/google/appengine/tools/devappserver2/http_runtime_test.py
@@ -17,6 +17,7 @@
 """Tests for google.appengine.tools.devappserver2.http_runtime."""
 
 
+
 import base64
 import os
 import re
diff --git a/google/appengine/tools/devappserver2/http_utils.py b/google/appengine/tools/devappserver2/http_utils.py
new file mode 100644
index 0000000..8d25d42
--- /dev/null
+++ b/google/appengine/tools/devappserver2/http_utils.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# 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.
+#
+"""HTTP utils for devappserver."""
+
+import contextlib
+import httplib
+import socket
+import time
+
+
+class Error(Exception):
+  """Base class for errors in this module."""
+
+
+class HostNotReachable(Error):
+  """Raised if host can't be reached at given port."""
+
+
+def wait_for_connection(host, port, retries=1):
+  """Tries to connect to the given host and port.
+
+  Retries until success or number of retires is used up.
+
+  Args:
+    host: str, Host to connect to.
+    port: int, Port to connect to.
+    retries: int, Number of connection retries.
+
+  Raises:
+      HostNotReachable: if host:port can't be reached after given number of
+        retries.
+  """
+  def ping():
+    connection = httplib.HTTPConnection(host, port)
+    with contextlib.closing(connection):
+      try:
+        connection.connect()
+      except (socket.error, httplib.HTTPException):
+        return False
+      else:
+        return True
+
+  while not ping() and retries > 0:
+    retries -= 1
+    if not retries:
+      raise HostNotReachable(
+          'Cannot connect to the instance on {host}:{port}'.format(
+              host=host, port=port))
+    time.sleep(1)
diff --git a/google/appengine/tools/devappserver2/inotify_file_watcher.py b/google/appengine/tools/devappserver2/inotify_file_watcher.py
index 83d70f6..a579200 100644
--- a/google/appengine/tools/devappserver2/inotify_file_watcher.py
+++ b/google/appengine/tools/devappserver2/inotify_file_watcher.py
@@ -20,6 +20,7 @@
 """
 
 
+
 import ctypes
 import ctypes.util
 import errno
@@ -45,7 +46,7 @@
 _INOTIFY_EVENT = struct.Struct('iIII')
 _INOTIFY_EVENT_SIZE = _INOTIFY_EVENT.size
 _INTERESTING_INOTIFY_EVENTS = (
-    IN_ATTRIB|IN_MODIFY|IN_MOVED_FROM|IN_MOVED_TO|IN_CREATE|IN_DELETE)
+    IN_ATTRIB | IN_MODIFY | IN_MOVED_FROM | IN_MOVED_TO | IN_CREATE | IN_DELETE)
 
 # inotify only available on Linux and a ctypes.CDLL will raise if code tries to
 # specify the arg types or return type for a non-existent function.
@@ -210,18 +211,25 @@
     """Stop watching the directory for changes."""
     os.close(self._inotify_fd)
 
-  def _get_changed_paths(self):
+  def changes(self, timeout_ms=0):
     """Return paths for changed files and directories.
 
     start() must be called before this method.
 
+    Args:
+      timeout_ms: a timeout in milliseconds on which this watcher will block
+                  waiting for a change. It allows for external polling threads
+                  to react immediately on a change instead of waiting for
+                  a random polling delay.
+
     Returns:
       A set of strings representing file and directory paths that have changed
       since the last call to get_changed_paths.
     """
     paths = set()
     while True:
-      if not self._inotify_poll.poll(0):
+      # Don't wait to detect subsequent changes after the initial one.
+      if not self._inotify_poll.poll(0 if paths else timeout_ms):
         break
 
       self._inotify_events += os.read(self._inotify_fd, 1024)
@@ -232,14 +240,15 @@
           break
 
         name = self._inotify_events[
-            _INOTIFY_EVENT_SIZE:_INOTIFY_EVENT_SIZE+length]
+            _INOTIFY_EVENT_SIZE:_INOTIFY_EVENT_SIZE + length]
         name = name.rstrip('\0')
 
         logging.debug('wd=%s, mask=%s, cookie=%s, length=%s, name=%r',
                       wd, _bit_str(mask, _ATTRIBUTE_MASK_NAMES), cookie, length,
                       name)
 
-        self._inotify_events = self._inotify_events[_INOTIFY_EVENT_SIZE+length:]
+        self._inotify_events = self._inotify_events[
+            _INOTIFY_EVENT_SIZE + length:]
 
         if mask & IN_IGNORED:
           continue
@@ -262,6 +271,3 @@
         if path not in paths and not watcher_common.ignore_file(path):
           paths.add(path)
     return paths
-
-  def has_changes(self):
-    return bool(self._get_changed_paths())
diff --git a/google/appengine/tools/devappserver2/inotify_file_watcher_test.py b/google/appengine/tools/devappserver2/inotify_file_watcher_test.py
index 4a1a4c6..914083e 100644
--- a/google/appengine/tools/devappserver2/inotify_file_watcher_test.py
+++ b/google/appengine/tools/devappserver2/inotify_file_watcher_test.py
@@ -17,6 +17,7 @@
 """Tests for google.apphosting.tools.devappserver2.inotify_file_watcher."""
 
 
+
 import logging
 import os
 import os.path
@@ -66,7 +67,7 @@
     # Divide the remaining number of directories to create among 4
     # subdirectories in an approximate even fashion.
     for i in range(4, 0, -1):
-      sub_dir_size = num_directories/i
+      sub_dir_size = num_directories / i
       self._create_directory_tree(os.path.join(path, 'dir%d' % i), sub_dir_size)
       num_directories -= sub_dir_size
 
@@ -75,7 +76,7 @@
     path = self._create_file('test')
     self.assertEqual(
         set([path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_file_modified(self):
     path = self._create_file('test')
@@ -84,7 +85,7 @@
       f.write('testing')
     self.assertEqual(
         set([path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_file_read(self):
     path = self._create_file('test')
@@ -96,7 +97,7 @@
     # Reads should not trigger updates.
     self.assertEqual(
         set(),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_file_deleted(self):
     path = self._create_file('test')
@@ -104,7 +105,7 @@
     os.remove(path)
     self.assertEqual(
         set([path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_file_renamed(self):
     source = self._create_file('test')
@@ -113,14 +114,14 @@
     os.rename(source, target)
     self.assertEqual(
         set([source, target]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_create_directory(self):
     self._watcher.start()
     directory = self._create_directory('test')
     self.assertEqual(
         set([directory]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_file_created_in_directory(self):
     directory = self._create_directory('test')
@@ -128,7 +129,7 @@
     path = self._create_file('test/file')
     self.assertEqual(
         set([path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_move_directory(self):
     source = self._create_directory('test')
@@ -137,7 +138,7 @@
     os.rename(source, target)
     self.assertEqual(
         set([source, target]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_move_directory_out_of_watched(self):
     source = self._create_directory('test')
@@ -146,13 +147,13 @@
     os.rename(source, target)
     self.assertEqual(
         set([source]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
     with open(os.path.join(target, 'file'), 'w'):
       pass
     # Changes to files in subdirectories that have been moved should be ignored.
     self.assertEqual(
         set([]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_move_directory_into_watched(self):
     source = os.path.join(self._junk_directory, 'source')
@@ -162,13 +163,13 @@
     os.rename(source, target)
     self.assertEqual(
         set([target]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
     file_path = os.path.join(target, 'file')
     with open(file_path, 'w+'):
       pass
     self.assertEqual(
         set([file_path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_directory_deleted(self):
     path = self._create_directory('test')
@@ -176,7 +177,7 @@
     os.rmdir(path)
     self.assertEqual(
         set([path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_subdirectory_deleted(self):
     """Tests that internal _directory_to_subdirs is updated on delete."""
@@ -190,7 +191,7 @@
     os.rmdir(sub_path)
     self.assertEqual(
         set([sub_path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
     self.assertEqual(
         set(),
         self._watcher._directory_to_subdirs[path])
@@ -198,7 +199,7 @@
     os.rmdir(path)
     self.assertEqual(
         set([path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_symlink_directory(self):
     sym_target = os.path.join(self._directory, 'test')
@@ -209,27 +210,27 @@
     os.symlink(self._junk_directory, sym_target)
     self.assertEqual(
         set([sym_target]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
     # Check that a file added to the symlinked directory is reported.
     with open(os.path.join(self._junk_directory, 'file1'), 'w'):
       pass
     self.assertEqual(
         set([os.path.join(self._directory, 'test', 'file1')]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
     # Check that modifying the file in the symlinked directory is reported.
     with open(os.path.join(self._junk_directory, 'file1'), 'w') as fp:
       fp.write('some data')
     self.assertEqual(
         set([os.path.join(self._directory, 'test', 'file1')]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
     # Check that a removed symlinked directory is reported.
     os.remove(sym_target)
     self.assertEqual(
         set([sym_target]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
     # Check that a file added to the removed symlinked directory is *not*
     # reported.
@@ -237,7 +238,7 @@
       pass
     self.assertEqual(
         set(),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   @unittest.skip('b/11896748')
   def test_symlink_file(self):
@@ -251,20 +252,20 @@
     os.symlink(actual_file, symbolic_link)
     self.assertEqual(
         set([symbolic_link]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
     # Check that modifying the source file is reported.
     with open(actual_file, 'w') as fp:
       fp.write('some data')
     self.assertEqual(
         set([symbolic_link]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
     # Check that deleting the source file is reported.
     os.unlink(actual_file)
     self.assertEqual(
         set([symbolic_link]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_many_directories(self):
     # Linux supports a limited number of watches per file descriptor. The
@@ -274,7 +275,7 @@
     path = self._create_file('bigdir/dir4/dir4/file')
     self.assertEqual(
         set([path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def test_internal_symlinks_relative(self):
     dir_a_b = self._create_directory('a/b')
@@ -283,8 +284,8 @@
     self._create_directory('p/q/r')
     self._watcher.start()
     shutil.rmtree(dir_p)
-    self._watcher._get_changed_paths()
-    # TODO: validate the value returned from _get_changed_paths once
+    self._watcher.changes()
+    # TODO: validate the value returned from self._watcher.changes() once
     # a solution is designed.
 
   def test_internal_symlinks_absolute(self):
@@ -294,8 +295,8 @@
     self._create_directory('p/q/r')
     self._watcher.start()
     shutil.rmtree(dir_p)
-    self._watcher._get_changed_paths()
-    # TODO: validate the value returned from _get_changed_paths once
+    self._watcher.changes()
+    # TODO: validate the value returned from self._watcher.changes() once
     # a solution is designed.
 
   @unittest.skip('b/14583335')
@@ -319,7 +320,7 @@
       f.write('change1')
     self.assertEqual(
         set([watched_junk_file]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
     # Temporarily create a second symlink to the junk directory. We don't
     # care about changed paths are reported, we just need to make sure the
@@ -327,16 +328,16 @@
     # when it is removed.
     symlink_junkdir_2 = os.path.join(self._directory, 'junk2')
     os.symlink(self._junk_directory, symlink_junkdir_2)
-    self._watcher._get_changed_paths()
+    self._watcher.changes()
     os.unlink(symlink_junkdir_2)
-    self._watcher._get_changed_paths()
+    self._watcher.changes()
 
     # And make sure changes to the file are still reported.
     with open(junk_file, 'w') as f:
       f.write('change2')
     self.assertEqual(
         set([watched_junk_file]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
 
 @unittest.skipUnless(sys.platform.startswith('linux'), 'requires linux')
@@ -364,20 +365,20 @@
     path = self._create_file(self._directories[0], 'moo')
     self.assertEqual(
         set([path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def testInDir2(self):
     path = self._create_file(self._directories[2], 'moo')
     self.assertEqual(
         set([path]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
   def testInDir1And3(self):
     path1 = self._create_file(self._directories[1], 'moo')
     path3 = self._create_file(self._directories[3], 'moo')
     self.assertEqual(
         set([path1, path3]),
-        self._watcher._get_changed_paths())
+        self._watcher.changes())
 
 
 class TestBitStr(unittest.TestCase):
diff --git a/google/appengine/tools/devappserver2/instance.py b/google/appengine/tools/devappserver2/instance.py
index 2eebbec..d3d7888 100644
--- a/google/appengine/tools/devappserver2/instance.py
+++ b/google/appengine/tools/devappserver2/instance.py
@@ -17,6 +17,7 @@
 """Manage the lifecycle of runtime processes and dispatch requests to them."""
 
 
+
 import collections
 import logging
 import threading
diff --git a/google/appengine/tools/devappserver2/instance_test.py b/google/appengine/tools/devappserver2/instance_test.py
index 871379d..58e9cde 100644
--- a/google/appengine/tools/devappserver2/instance_test.py
+++ b/google/appengine/tools/devappserver2/instance_test.py
@@ -17,6 +17,7 @@
 """Tests for google.apphosting.tools.devappserver2.instance."""
 
 
+
 import time
 import unittest
 
diff --git a/google/appengine/tools/devappserver2/java_application.py b/google/appengine/tools/devappserver2/java_application.py
index 27e9f9d..5494f57 100644
--- a/google/appengine/tools/devappserver2/java_application.py
+++ b/google/appengine/tools/devappserver2/java_application.py
@@ -17,6 +17,8 @@
 """An abstraction around the source and classfiles for a Java application."""
 
 
+
+
 import os
 import os.path
 import google
diff --git a/google/appengine/tools/devappserver2/java_runtime.py b/google/appengine/tools/devappserver2/java_runtime.py
index ee4e741..f510d23 100644
--- a/google/appengine/tools/devappserver2/java_runtime.py
+++ b/google/appengine/tools/devappserver2/java_runtime.py
@@ -17,6 +17,8 @@
 """Serves content for "script" handlers using the Java runtime."""
 
 
+
+
 import os
 import os.path
 import sys
diff --git a/google/appengine/tools/devappserver2/log_manager.py b/google/appengine/tools/devappserver2/log_manager.py
new file mode 100644
index 0000000..1966572
--- /dev/null
+++ b/google/appengine/tools/devappserver2/log_manager.py
@@ -0,0 +1,207 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# 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.
+#
+"""LogManager for Managed VMs modules.
+
+Should be accessed by get() function.
+"""
+
+import httplib
+import logging
+import os
+import threading
+import urllib
+
+import google
+
+from google.pyglib import singleton
+
+from google.appengine.tools.devappserver2 import http_utils
+from google.appengine.tools.docker import containers
+
+
+APP_ENGINE_LOG_SERVER_HOST = 'APP_ENGINE_LOG_SERVER_HOST'
+APP_ENGINE_LOG_SERVER_PORT = 'APP_ENGINE_LOG_SERVER_PORT'
+
+_DB_PATH = '/var/log/sqlite'
+_LOGS_PATH = '/var/log/app_engine'
+_TD_AGENT_PATH = '/var/tmp/td-agent'
+
+_LOG_PROCESSOR_IMAGE = 'google/appengine-log-processor'
+_LOG_SERVER_IMAGE = 'google/appengine-log-server'
+_DEFAULT_LOG_SERVER_PORT = 8080
+
+_LOG_TYPES = ['app', 'appjson', 'request']
+
+
+# TODO: more escaping.
+def _escape(s):
+  return s.replace('-', '_')
+
+
+def _make_container_name(app, module, version, instance):
+  tmpl = '{app}_{module}_{version}_{instance}'
+  return _escape(tmpl.format(app=app, module=module,
+                             version=version, instance=instance))
+
+
+def _make_external_logs_path(app, module, version, instance):
+  return os.path.join(_LOGS_PATH,
+                      app, module, version, instance)
+
+
+def _describe_volume(internal, external=None):
+  return (external if external else internal), {'bind': internal}
+
+
+class _LogManagerDisabled(object):
+  """Base class for Log Managers. Logs are disabled by default."""
+
+  def __init__(self, docker_client, log_server_port):
+    pass
+
+  def start(self):
+    pass
+
+  def add(self, app, module, version, instance):
+    pass
+
+  @property
+  def host(self):
+    return ''
+
+  @property
+  def port(self):
+    return -1
+
+
+class _LogManager(_LogManagerDisabled):
+  """Manages creation of log server and log processors for each instance."""
+
+  def __init__(self, docker_client, log_server_port):
+    super(_LogManager, self).__init__(docker_client, log_server_port)
+
+    self._docker_client = docker_client
+
+    volumes = [_describe_volume(_DB_PATH)]
+    self._server = containers.Container(
+        self._docker_client,
+        containers.ContainerOptions(
+            image_opts=containers.ImageOptions(tag=_LOG_SERVER_IMAGE),
+            port=log_server_port,
+            volumes=dict(volumes)))
+
+    self._lock = threading.RLock()
+    self._containers = {}
+
+  def __del__(self):
+    for c in self._containers:
+      c.Stop()
+    self._server.Stop()
+
+  def start(self):
+    self._server.Start()
+    http_utils.wait_for_connection(self._server.host, self._server.port, 100)
+
+  def add(self, app, module, version, instance):
+    container_name = _make_container_name(app, module, version, instance)
+
+    def _create_table(log_type):
+      """Sends a request to log-server container to create a table if needed."""
+      params = urllib.urlencode({
+          'app': _escape(app), 'module': _escape(module),
+          'version': _escape(version), 'instance': _escape(instance),
+          'log_type': log_type})
+      headers = {
+          'Content-Type': 'application/x-www-form-urlencoded',
+          'Accept': 'text/plain'}
+
+      conn = httplib.HTTPConnection(self._server.host, self._server.port)
+      conn.request('POST', '/submit', params, headers)
+      response = conn.getresponse()
+      logging.debug(
+          'Sent table creation request to {host}:{port}?{params}. '
+          'Received {status}, reason: {reason}.'.format(
+              host=self._server.host, port=self._server.port,
+              params=params, status=response.status, reason=response.reason))
+
+    def _make_logs_container():
+      """Creates a log-processor container."""
+
+      environment = {
+          'LOGS_PATH': _LOGS_PATH,
+          'PREFIX': container_name
+      }
+
+      volumes = [
+          _describe_volume(_LOGS_PATH,
+                           _make_external_logs_path(app, module,
+                                                    version, instance)),
+          _describe_volume(_DB_PATH),
+          _describe_volume(_TD_AGENT_PATH)
+      ]
+
+      return containers.Container(
+          self._docker_client,
+          containers.ContainerOptions(
+              image_opts=containers.ImageOptions(tag=_LOG_PROCESSOR_IMAGE),
+              environment=environment,
+              volumes=dict(volumes)))
+    with self._lock:
+      if container_name in self._containers:
+        return
+
+      for l in _LOG_TYPES:
+        _create_table(l)
+
+      container = _make_logs_container()
+      self._containers[container_name] = container
+    container.Start()
+
+  @property
+  def host(self):
+    return self._server.host
+
+  @property
+  def port(self):
+    return self._server.port
+
+
+@singleton.Singleton
+class LogManagerDisabled(_LogManagerDisabled):
+  """Singleton instance of _LogManagerDisabled."""
+
+
+@singleton.Singleton
+class LogManager(_LogManager):
+  """Singleton instance of _LogManager."""
+
+
+# TODO: images lookup before confirming that logs are enabled.
+def get(docker_client=None, log_server_port=_DEFAULT_LOG_SERVER_PORT,
+        enable_logging=False):
+  """Returns a LogManager/LogManagerDisabled instance. Creates one if needed."""
+  c = LogManager if enable_logging else LogManagerDisabled
+  try:
+    instance = c(docker_client, log_server_port)
+    instance.start()
+
+    # To pass these values to Admin Server to query logs.
+    os.environ[APP_ENGINE_LOG_SERVER_HOST] = instance.host
+    os.environ[APP_ENGINE_LOG_SERVER_PORT] = str(instance.port)
+  except singleton.ConstructorCalledAgainError:
+    instance = c.Singleton()
+  return instance
diff --git a/google/appengine/tools/devappserver2/login.py b/google/appengine/tools/devappserver2/login.py
index 717e2fb..2e6d0c7 100644
--- a/google/appengine/tools/devappserver2/login.py
+++ b/google/appengine/tools/devappserver2/login.py
@@ -29,6 +29,7 @@
 """
 
 
+
 import cgi
 import Cookie
 import hashlib
@@ -207,6 +208,9 @@
   else:
     login_message = 'Not logged in'
 
+
+
+
     email = 'test\x40example.com'
   admin_checked = 'checked' if admin else ''
 
diff --git a/google/appengine/tools/devappserver2/login_test.py b/google/appengine/tools/devappserver2/login_test.py
index b2428b4..1273e04 100644
--- a/google/appengine/tools/devappserver2/login_test.py
+++ b/google/appengine/tools/devappserver2/login_test.py
@@ -17,6 +17,7 @@
 """Tests for devappserver2.login."""
 
 
+
 import Cookie
 import unittest
 import urllib
diff --git a/google/appengine/tools/devappserver2/module.py b/google/appengine/tools/devappserver2/module.py
index 162ed7e..e1f562c 100644
--- a/google/appengine/tools/devappserver2/module.py
+++ b/google/appengine/tools/devappserver2/module.py
@@ -17,6 +17,7 @@
 """Manage the lifecycle of runtime processes and dispatch requests to them."""
 
 
+
 import collections
 import cStringIO
 import functools
@@ -108,6 +109,13 @@
 <A HREF="%(correct-url)s">here</A>.
 </BODY></HTML>'''
 
+_TIMEOUT_HTML = '<HTML><BODY>503 - This request has timed out.</BODY></HTML>'
+
+# Factor applied to the request timeouts to compensate for the
+# long vmengines reloads. TODO eventually remove that once we have
+# optimized the vm_engine reload.
+_VMENGINE_SLOWDOWN_FACTOR = 2
+
 
 def _static_files_regex_from_handlers(handlers):
   patterns = []
@@ -172,6 +180,18 @@
         'java7': java_runtime.JavaRuntimeInstanceFactory,
     })
 
+  _MAX_REQUEST_WAIT_TIME = 10
+
+  def _get_wait_time(self):
+    """Gets the wait time before timing out a request.
+
+    Returns:
+      The timeout value in seconds.
+    """
+    if self.vm_enabled():
+      return self._MAX_REQUEST_WAIT_TIME * _VMENGINE_SLOWDOWN_FACTOR
+    return self._MAX_REQUEST_WAIT_TIME
+
   def _create_instance_factory(self,
                                module_configuration):
     """Create an instance.InstanceFactory.
@@ -356,14 +376,15 @@
     # Always check for config and file changes because checking also clears
     # pending changes.
     config_changes = self._module_configuration.check_for_updates()
-    has_file_changes = self._watcher.has_changes()
-
+    file_changes = self._watcher.changes()
     if application_configuration.HANDLERS_CHANGED in config_changes:
       handlers = self._create_url_handlers()
       with self._handler_lock:
         self._handlers = handlers
 
-    if has_file_changes:
+    if file_changes:
+      logging.info(
+          'Detected file changes:\n  %s', '\n  '.join(sorted(file_changes)))
       self._instance_factory.files_changed()
 
     if config_changes & _RESTART_INSTANCES_CONFIG_CHANGES:
@@ -371,7 +392,7 @@
 
     self._maybe_restart_instances(
         config_changed=bool(config_changes & _RESTART_INSTANCES_CONFIG_CHANGES),
-        file_changed=has_file_changes)
+        file_changed=bool(file_changes))
 
   def __init__(self,
                module_configuration,
@@ -443,6 +464,8 @@
     """
     self._module_configuration = module_configuration
     self._name = module_configuration.module_name
+    self._version = module_configuration.major_version
+    self._app_name_external = module_configuration.application_external_name
     self._host = host
     self._api_host = api_host
     self._api_port = api_port
@@ -464,8 +487,7 @@
     self._default_version_port = default_version_port
     self._port_registry = port_registry
 
-    # TODO: remove when GA.
-    if self._vm_config and self._vm_config.HasField('docker_daemon_url'):
+    if self.vm_enabled():
       self._RUNTIME_INSTANCE_FACTORIES['vm'] = (
           vm_runtime_factory.VMRuntimeInstanceFactory)
 
@@ -484,6 +506,10 @@
         (self._host, self._balanced_port), self)
     self._quit_event = threading.Event()  # Set when quit() has been called.
 
+  def vm_enabled(self):
+    # TODO: change when GA
+    return self._vm_config
+
   @property
   def name(self):
     """The name of the module, as defined in app.yaml.
@@ -494,6 +520,24 @@
     return self._name
 
   @property
+  def version(self):
+    """The version of the module, as defined in app.yaml.
+
+    This value will be constant for the lifetime of the module even in the
+    module configuration changes.
+    """
+    return self._version
+
+  @property
+  def app_name_external(self):
+    """The external application name of the module, as defined in app.yaml.
+
+    This value will be constant for the lifetime of the module even in the
+    module configuration changes.
+    """
+    return self._app_name_external
+
+  @property
   def ready(self):
     """The module is ready to handle HTTP requests."""
     return self._balanced_module.ready
@@ -570,7 +614,13 @@
     start_response('404 Not Found', [('Content-Type', 'text/plain')])
     return ['The url "%s" does not match any handlers.' % environ['PATH_INFO']]
 
-  def _error_response(self, environ, start_response, status):
+  def _error_response(self, environ, start_response, status, body=None):
+    if body:
+      start_response(
+          '%d %s' % (status, httplib.responses[status]),
+          [('Content-Type', 'text/html'),
+           ('Content-Length', str(len(body)))])
+      return body
     start_response('%d %s' % (status, httplib.responses[status]), [])
     return []
 
@@ -679,6 +729,12 @@
         # all the data. To match the behavior of production, for large files
         # < 64M read the data to prevent the client bug from being triggered.
 
+
+
+
+
+
+
         if content_length <= _MAX_UPLOAD_NO_TRIGGER_BAD_CLIENT_BYTES:
           environ['wsgi.input'].read(content_length)
         status = '%d %s' % (httplib.REQUEST_ENTITY_TOO_LARGE,
@@ -1098,7 +1154,6 @@
                                             allow_skipped_files,
                                             threadsafe_override)
 
-
     self._process_automatic_scaling(
         self._module_configuration.automatic_scaling)
 
@@ -1435,7 +1490,6 @@
   """A pool of instances that is manually-scaled."""
 
   _DEFAULT_MANUAL_SCALING = appinfo.ManualScaling(instances='1')
-  _MAX_REQUEST_WAIT_TIME = 10
 
   @classmethod
   def _populate_default_manual_scaling(cls, manual_scaling):
@@ -1473,7 +1527,6 @@
                automatic_restarts,
                allow_skipped_files,
                threadsafe_override):
-
     """Initializer for ManualScalingModule.
 
     Args:
@@ -1543,7 +1596,6 @@
                                               allow_skipped_files,
                                               threadsafe_override)
 
-
     self._process_manual_scaling(module_configuration.manual_scaling)
 
     self._instances = []  # Protected by self._condition.
@@ -1638,7 +1690,7 @@
       An iterable over strings containing the body of the HTTP response.
     """
     start_time = time.time()
-    timeout_time = start_time + self._MAX_REQUEST_WAIT_TIME
+    timeout_time = start_time + self._get_wait_time()
     try:
       while time.time() < timeout_time:
         logging.debug('Dispatching request to %s after %0.4fs pending',
@@ -1696,7 +1748,8 @@
           request_type)
 
     start_time = time.time()
-    timeout_time = start_time + self._MAX_REQUEST_WAIT_TIME
+    timeout_time = start_time + self._get_wait_time()
+
     while time.time() < timeout_time:
       if ((request_type in (instance.NORMAL_REQUEST, instance.READY_REQUEST) and
            self._suspended) or self._quit_event.is_set()):
@@ -1714,7 +1767,7 @@
           with self._condition:
             self._condition.notify()
     else:
-      return self._error_response(environ, start_response, 503)
+      return self._error_response(environ, start_response, 503, _TIMEOUT_HTML)
 
   def _add_instance(self):
     """Creates and adds a new instance.Instance to the Module.
@@ -1809,20 +1862,21 @@
     # Always check for config and file changes because checking also clears
     # pending changes.
     config_changes = self._module_configuration.check_for_updates()
-    has_file_changes = self._watcher.has_changes()
-
+    file_changes = self._watcher.changes()
     if application_configuration.HANDLERS_CHANGED in config_changes:
       handlers = self._create_url_handlers()
       with self._handler_lock:
         self._handlers = handlers
 
-    if has_file_changes:
+    if file_changes:
+      logging.info(
+          'Detected file changes:\n  %s', '\n  '.join(sorted(file_changes)))
       self._instance_factory.files_changed()
 
     if config_changes & _RESTART_INSTANCES_CONFIG_CHANGES:
       self._instance_factory.configuration_changed(config_changes)
 
-    if config_changes & _RESTART_INSTANCES_CONFIG_CHANGES or has_file_changes:
+    if config_changes & _RESTART_INSTANCES_CONFIG_CHANGES or file_changes:
       with self._instances_change_lock:
         if not self._suspended:
           self.restart()
@@ -1997,7 +2051,6 @@
 
   _DEFAULT_BASIC_SCALING = appinfo.BasicScaling(max_instances='1',
                                                 idle_timeout='15m')
-  _MAX_REQUEST_WAIT_TIME = 10
 
   @staticmethod
   def _parse_idle_timeout(timing):
@@ -2056,7 +2109,6 @@
                automatic_restarts,
                allow_skipped_files,
                threadsafe_override):
-
     """Initializer for BasicScalingModule.
 
     Args:
@@ -2221,7 +2273,7 @@
     """
     instance_id = inst.instance_id
     start_time = time.time()
-    timeout_time = start_time + self._MAX_REQUEST_WAIT_TIME
+    timeout_time = start_time + self._get_wait_time()
     try:
       while time.time() < timeout_time:
         logging.debug('Dispatching request to %s after %0.4fs pending',
@@ -2287,7 +2339,7 @@
           request_type)
 
     start_time = time.time()
-    timeout_time = start_time + self._MAX_REQUEST_WAIT_TIME
+    timeout_time = start_time + self._get_wait_time()
     while time.time() < timeout_time:
       if self._quit_event.is_set():
         return self._error_response(environ, start_response, 404)
@@ -2304,7 +2356,7 @@
           with self._condition:
             self._condition.notify()
     else:
-      return self._error_response(environ, start_response, 503)
+      return self._error_response(environ, start_response, 503, _TIMEOUT_HTML)
 
   def _start_any_instance(self):
     """Choose an inactive instance and start it asynchronously.
@@ -2373,20 +2425,20 @@
     # Always check for config and file changes because checking also clears
     # pending changes.
     config_changes = self._module_configuration.check_for_updates()
-    has_file_changes = self._watcher.has_changes()
+    file_changes = self._watcher.changes()
 
     if application_configuration.HANDLERS_CHANGED in config_changes:
       handlers = self._create_url_handlers()
       with self._handler_lock:
         self._handlers = handlers
 
-    if has_file_changes:
+    if file_changes:
       self._instance_factory.files_changed()
 
     if config_changes & _RESTART_INSTANCES_CONFIG_CHANGES:
       self._instance_factory.configuration_changed(config_changes)
 
-    if config_changes & _RESTART_INSTANCES_CONFIG_CHANGES or has_file_changes:
+    if config_changes & _RESTART_INSTANCES_CONFIG_CHANGES or file_changes:
       self.restart()
 
   def _loop_watching_for_changes_and_idle_instances(self):
@@ -2603,7 +2655,7 @@
     assert request_type == instance.INTERACTIVE_REQUEST
 
     start_time = time.time()
-    timeout_time = start_time + self._MAX_REQUEST_WAIT_TIME
+    timeout_time = start_time + self._get_wait_time()
 
     while time.time() < timeout_time:
       new_instance = False
diff --git a/google/appengine/tools/devappserver2/module_test.py b/google/appengine/tools/devappserver2/module_test.py
index 92b035b..3887596 100644
--- a/google/appengine/tools/devappserver2/module_test.py
+++ b/google/appengine/tools/devappserver2/module_test.py
@@ -17,6 +17,7 @@
 """Tests for google.apphosting.tools.devappserver2.module."""
 
 
+
 import functools
 import httplib
 import logging
@@ -44,6 +45,7 @@
 
 
 class ModuleConfigurationStub(object):
+
   def __init__(self,
                application_root='/root',
                application='app',
@@ -60,7 +62,8 @@
                env_variables=None,
                manual_scaling=None,
                basic_scaling=None,
-               vm_health_check=None):
+               vm_health_check=None,
+               application_external_name='app'):
     self.application_root = application_root
     self.application = application
     self.module_name = module_name
@@ -78,12 +81,14 @@
     self.version_id = '%s:%s.%s' % (module_name, version, '12345')
     self.is_backend = False
     self.vm_health_check = vm_health_check
+    self.application_external_name = application_external_name
 
   def check_for_updates(self):
     return set()
 
 
 class ModuleFacade(module.Module):
+
   def __init__(self,
                module_configuration=ModuleConfigurationStub(),
                instance_factory=None,
@@ -126,6 +131,7 @@
 
 
 class AutoScalingModuleFacade(module.AutoScalingModule):
+
   def __init__(self,
                module_configuration=ModuleConfigurationStub(),
                balanced_port=0,
@@ -168,6 +174,7 @@
 
 
 class ManualScalingModuleFacade(module.ManualScalingModule):
+
   def __init__(self,
                module_configuration=None,
                balanced_port=0,
@@ -212,6 +219,7 @@
 
 
 class BasicScalingModuleFacade(module.BasicScalingModule):
+
   def __init__(self,
                host='fakehost',
                module_configuration=ModuleConfigurationStub(),
@@ -432,7 +440,7 @@
                        static_files=r'app_readable_static_images/\\1',
                        upload=r'app_readable_static_images/*.png',
                        application_readable=True),
-        ]
+    ]
     self.instance_factory = instance.InstanceFactory(None, 1)
 
   def test_static_files_regex(self):
@@ -562,7 +570,7 @@
         handlers=handlers,
         inbound_services=['warmup'],
         env_variables=appinfo.EnvironmentVariables(),
-        )
+    )
     config_path = '/appdir/app.yaml'
     application_configuration.ModuleConfiguration._parse_configuration(
         config_path).AndReturn((info, [config_path]))
@@ -591,7 +599,7 @@
         threadsafe=False,
         manual_scaling=manual_scaling,
         handlers=handlers,
-        )
+    )
     config_path = '/appdir/app.yaml'
     application_configuration.ModuleConfiguration._parse_configuration(
         config_path).AndReturn((info, [config_path]))
@@ -879,6 +887,7 @@
   """Tests for module.AutoScalingModule._split_instances."""
 
   class Instance(object):
+
     def __init__(self, num_outstanding_requests, can_accept_requests=True):
       self.num_outstanding_requests = num_outstanding_requests
       self.can_accept_requests = can_accept_requests
@@ -971,6 +980,7 @@
   """Tests for module.AutoScalingModule._choose_instance."""
 
   class Instance(object):
+
     def __init__(self, num_outstanding_requests, can_accept_requests=True):
       self.num_outstanding_requests = num_outstanding_requests
       self.remaining_request_capacity = 10 - num_outstanding_requests
@@ -1055,6 +1065,7 @@
   """Tests for module.AutoScalingModule._adjust_instances."""
 
   class Instance(object):
+
     def __init__(self, num_outstanding_requests):
       self.num_outstanding_requests = num_outstanding_requests
 
@@ -1148,14 +1159,14 @@
     self.mox.StubOutWithMock(self.servr, '_create_url_handlers')
     self.mox.StubOutWithMock(self.servr._module_configuration,
                              'check_for_updates')
-    self.mox.StubOutWithMock(self.servr._watcher, 'has_changes')
+    self.mox.StubOutWithMock(self.servr._watcher, 'changes')
 
   def tearDown(self):
     self.mox.UnsetStubs()
 
   def test_no_changes(self):
     self.servr._module_configuration.check_for_updates().AndReturn(frozenset())
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
     self.servr._maybe_restart_instances(config_changed=False,
                                         file_changed=False)
     self.mox.ReplayAll()
@@ -1164,7 +1175,7 @@
 
   def test_irrelevant_config_change(self):
     self.servr._module_configuration.check_for_updates().AndReturn(frozenset())
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
     self.servr._maybe_restart_instances(config_changed=False,
                                         file_changed=False)
 
@@ -1175,7 +1186,7 @@
   def test_restart_config_change(self):
     conf_change = frozenset([application_configuration.ENV_VARIABLES_CHANGED])
     self.servr._module_configuration.check_for_updates().AndReturn(conf_change)
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
     self.instance_factory.configuration_changed(conf_change)
     self.servr._maybe_restart_instances(config_changed=True, file_changed=False)
 
@@ -1186,7 +1197,7 @@
   def test_handler_change(self):
     conf_change = frozenset([application_configuration.HANDLERS_CHANGED])
     self.servr._module_configuration.check_for_updates().AndReturn(conf_change)
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
     self.servr._create_url_handlers()
     self.instance_factory.configuration_changed(conf_change)
     self.servr._maybe_restart_instances(config_changed=True, file_changed=False)
@@ -1197,7 +1208,7 @@
 
   def test_file_change(self):
     self.servr._module_configuration.check_for_updates().AndReturn(frozenset())
-    self.servr._watcher.has_changes().AndReturn(True)
+    self.servr._watcher.changes().AndReturn({'-'})
     self.instance_factory.files_changed()
     self.servr._maybe_restart_instances(config_changed=False, file_changed=True)
 
@@ -1416,6 +1427,7 @@
   """Tests for module.ManualScalingModule._add_instance."""
 
   class WsgiServer(object):
+
     def __init__(self, port):
       self.port = port
 
@@ -1449,7 +1461,7 @@
 
   def test_add_with_health_checks(self):
     servr = ManualScalingModuleFacade(instance_factory=self.factory)
-    servr.vm_config = runtime_config_pb2.VMConfig(docker_daemon_url='unused')
+    servr.vm_config = runtime_config_pb2.VMConfig()
     servr.module_configuration.runtime = 'vm'
     servr.module_configuration.vm_health_check = appinfo.VmHealthCheck(
         enable_health_check=True)
@@ -1697,8 +1709,9 @@
     self.mox.StubOutWithMock(self.manual_module, '_error_response')
 
     self.manual_module._choose_instance(10.0).WithSideEffects(advance_time)
-    self.manual_module._error_response(self.environ, self.start_response,
-                                       503).AndReturn(self.response)
+    self.manual_module._error_response(
+        self.environ, self.start_response, 503, mox.IgnoreArg()).AndReturn(
+            self.response)
     self.mox.ReplayAll()
     self.assertEqual(
         self.response,
@@ -1714,6 +1727,7 @@
   """Tests for module.ManualScalingModule._choose_instance."""
 
   class Instance(object):
+
     def __init__(self, can_accept_requests):
       self.can_accept_requests = can_accept_requests
 
@@ -1909,14 +1923,14 @@
     self.mox.StubOutWithMock(self.servr, '_create_url_handlers')
     self.mox.StubOutWithMock(self.servr._module_configuration,
                              'check_for_updates')
-    self.mox.StubOutWithMock(self.servr._watcher, 'has_changes')
+    self.mox.StubOutWithMock(self.servr._watcher, 'changes')
 
   def tearDown(self):
     self.mox.UnsetStubs()
 
   def test_no_changes(self):
     self.servr._module_configuration.check_for_updates().AndReturn(frozenset())
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
 
     self.mox.ReplayAll()
     self.servr._handle_changes()
@@ -1924,7 +1938,7 @@
 
   def test_irrelevant_config_change(self):
     self.servr._module_configuration.check_for_updates().AndReturn(frozenset())
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
 
     self.mox.ReplayAll()
     self.servr._handle_changes()
@@ -1933,7 +1947,7 @@
   def test_restart_config_change(self):
     conf_change = frozenset([application_configuration.ENV_VARIABLES_CHANGED])
     self.servr._module_configuration.check_for_updates().AndReturn(conf_change)
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
     self.instance_factory.configuration_changed(conf_change)
     self.servr.restart()
 
@@ -1944,7 +1958,7 @@
   def test_handler_change(self):
     conf_change = frozenset([application_configuration.HANDLERS_CHANGED])
     self.servr._module_configuration.check_for_updates().AndReturn(conf_change)
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
     self.servr._create_url_handlers()
     self.instance_factory.configuration_changed(conf_change)
 
@@ -1956,7 +1970,7 @@
 
   def test_file_change(self):
     self.servr._module_configuration.check_for_updates().AndReturn(frozenset())
-    self.servr._watcher.has_changes().AndReturn(True)
+    self.servr._watcher.changes().AndReturn({'-'})
     self.instance_factory.files_changed()
     self.servr.restart()
 
@@ -1968,7 +1982,7 @@
     self.servr._suspended = True
     conf_change = frozenset([application_configuration.ENV_VARIABLES_CHANGED])
     self.servr._module_configuration.check_for_updates().AndReturn(conf_change)
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
     self.instance_factory.configuration_changed(conf_change)
 
     self.mox.ReplayAll()
@@ -1979,7 +1993,7 @@
     self.servr._suspended = True
     conf_change = frozenset([application_configuration.HANDLERS_CHANGED])
     self.servr._module_configuration.check_for_updates().AndReturn(conf_change)
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
     self.servr._create_url_handlers()
     self.instance_factory.configuration_changed(conf_change)
 
@@ -1990,7 +2004,7 @@
   def test_file_change_suspended(self):
     self.servr._suspended = True
     self.servr._module_configuration.check_for_updates().AndReturn(frozenset())
-    self.servr._watcher.has_changes().AndReturn(True)
+    self.servr._watcher.changes().AndReturn({'-'})
     self.instance_factory.files_changed()
 
     self.mox.ReplayAll()
@@ -2153,8 +2167,9 @@
     self.mox.StubOutWithMock(self.basic_module, '_error_response')
 
     self.basic_module._choose_instance(20).WithSideEffects(self.advance_time)
-    self.basic_module._error_response(self.environ, self.start_response,
-                                      503).AndReturn(self.response)
+    self.basic_module._error_response(
+        self.environ, self.start_response, 503, mox.IgnoreArg()).AndReturn(
+            self.response)
 
     self.mox.ReplayAll()
     self.assertEqual(
@@ -2272,6 +2287,7 @@
   """Tests for module.BasicScalingModule._choose_instance."""
 
   class Instance(object):
+
     def __init__(self, can_accept_requests):
       self.can_accept_requests = can_accept_requests
 
@@ -2422,14 +2438,14 @@
     self.mox.StubOutWithMock(self.servr, '_create_url_handlers')
     self.mox.StubOutWithMock(self.servr._module_configuration,
                              'check_for_updates')
-    self.mox.StubOutWithMock(self.servr._watcher, 'has_changes')
+    self.mox.StubOutWithMock(self.servr._watcher.__class__, 'changes')
 
   def tearDown(self):
     self.mox.UnsetStubs()
 
   def test_no_changes(self):
     self.servr._module_configuration.check_for_updates().AndReturn(frozenset())
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
 
     self.mox.ReplayAll()
     self.servr._handle_changes()
@@ -2437,7 +2453,7 @@
 
   def test_irrelevant_config_change(self):
     self.servr._module_configuration.check_for_updates().AndReturn(frozenset())
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
 
     self.mox.ReplayAll()
     self.servr._handle_changes()
@@ -2446,7 +2462,7 @@
   def test_restart_config_change(self):
     conf_change = frozenset([application_configuration.ENV_VARIABLES_CHANGED])
     self.servr._module_configuration.check_for_updates().AndReturn(conf_change)
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
     self.instance_factory.configuration_changed(conf_change)
     self.servr.restart()
 
@@ -2457,7 +2473,7 @@
   def test_handler_change(self):
     conf_change = frozenset([application_configuration.HANDLERS_CHANGED])
     self.servr._module_configuration.check_for_updates().AndReturn(conf_change)
-    self.servr._watcher.has_changes().AndReturn(False)
+    self.servr._watcher.changes().AndReturn(set())
     self.servr._create_url_handlers()
     self.instance_factory.configuration_changed(conf_change)
     self.servr.restart()
@@ -2468,7 +2484,7 @@
 
   def test_file_change(self):
     self.servr._module_configuration.check_for_updates().AndReturn(frozenset())
-    self.servr._watcher.has_changes().AndReturn(True)
+    self.servr._watcher.changes().AndReturn({'-'})
     self.instance_factory.files_changed().AndReturn(True)
     self.servr.restart()
 
@@ -2478,6 +2494,7 @@
 
 
 class TestInteractiveCommandModule(unittest.TestCase):
+
   def setUp(self):
     api_server.test_setup_stubs()
 
@@ -2623,20 +2640,24 @@
     self.mox.VerifyAll()
 
   def test_handle_script_request_timeout(self):
-    self.servr._MAX_REQUEST_WAIT_TIME = 0
-    start_response = start_response_utils.CapturingStartResponse()
+    old_timeout = self.servr._MAX_REQUEST_WAIT_TIME
+    try:
+      self.servr._MAX_REQUEST_WAIT_TIME = 0
+      start_response = start_response_utils.CapturingStartResponse()
 
-    self.mox.ReplayAll()
-    self.assertEqual(
-        ['The command timed-out while waiting for another one to complete'],
-        self.servr._handle_script_request(self.environ,
-                                          start_response,
-                                          self.url_map,
-                                          self.match,
-                                          self.request_id))
-    self.mox.VerifyAll()
-    self.assertEqual('503 Service Unavailable',
-                     start_response.status)
+      self.mox.ReplayAll()
+      self.assertEqual(
+          ['The command timed-out while waiting for another one to complete'],
+          self.servr._handle_script_request(self.environ,
+                                            start_response,
+                                            self.url_map,
+                                            self.match,
+                                            self.request_id))
+      self.mox.VerifyAll()
+      self.assertEqual('503 Service Unavailable',
+                       start_response.status)
+    finally:
+      self.servr._MAX_REQUEST_WAIT_TIME = old_timeout
 
   def test_handle_script_request_restart(self):
     def restart_and_raise(*args):
diff --git a/google/appengine/tools/devappserver2/mtime_file_watcher.py b/google/appengine/tools/devappserver2/mtime_file_watcher.py
index 20c9002..9f654ba 100644
--- a/google/appengine/tools/devappserver2/mtime_file_watcher.py
+++ b/google/appengine/tools/devappserver2/mtime_file_watcher.py
@@ -22,6 +22,8 @@
 
 from google.appengine.tools.devappserver2 import watcher_common
 
+_MAX_MONITORED_FILES = 10000
+
 
 class MtimeFileWatcher(object):
   """Monitors a directory tree for changes using mtime polling."""
@@ -31,60 +33,61 @@
 
   def __init__(self, directory):
     self._directory = directory
-    self._quit_event = threading.Event()
     self._filename_to_mtime = None
-    self._has_changes = False
-    self._has_changes_lock = threading.Lock()
-    self._watcher_thread = threading.Thread(target=self._watch_changes)
-    self._watcher_thread.daemon = True
+    self._startup_thread = None
+
+  def _first_pass(self):
+    self._filename_to_mtime = (
+        MtimeFileWatcher._generate_filename_to_mtime(self._directory))
 
   def start(self):
     """Start watching a directory for changes."""
-    self._watcher_thread.start()
+    self._startup_thread = threading.Thread(target=self._first_pass)
+    self._startup_thread.start()
 
   def quit(self):
     """Stop watching a directory for changes."""
-    self._quit_event.set()
+    # TODO: stop the current crawling and join on the start thread.
 
-  def has_changes(self):
-    """Returns True if the watched directory has changed since the last call.
+  def changes(self):
+    """Returns a set of changed files if the watched directory has changed.
 
+    The changes set is reset at every call.
     start() must be called before this method.
 
     Returns:
-      Returns True if the watched directory has changed since the last call to
-      has_changes or, if has_changes has never been called, since start was
-      called.
+      Returns the set of file paths changes if the watched directory has changed
+      since the last call to changes or, if changes has never been called,
+      since start was called.
     """
-    with self._has_changes_lock:
-      has_changes = self._has_changes
-      self._has_changes = False
-    return has_changes
+    self._startup_thread.join()
+    old_filename_to_mtime = self._filename_to_mtime
+    self._filename_to_mtime = (
+        MtimeFileWatcher._generate_filename_to_mtime(self._directory))
+    diff_items = set(self._filename_to_mtime.items()).symmetric_difference(
+        old_filename_to_mtime.items())
+    return {k for k, _ in diff_items}
 
-  def _watch_changes(self):
-    while not self._quit_event.wait(1):
-      self._check_for_changes()
+  @staticmethod
+  def _generate_filename_to_mtime(directory):
+    """Records the state of a directory.
 
-  def _check_for_changes(self):
-    if self._has_changed_paths():
-      with self._has_changes_lock:
-        self._has_changes = True
+    Args:
+      directory: the root directory to traverse.
 
-  def _has_changed_paths(self):
-    self._filename_to_mtime, old_filename_to_mtime = (
-        self._generate_filename_to_mtime(), self._filename_to_mtime)
-    return (old_filename_to_mtime is not None and
-            self._filename_to_mtime != old_filename_to_mtime)
-
-  def _generate_filename_to_mtime(self):
+    Returns:
+      A dictionary of subdirectories and files under
+      directory associated with their timestamps.
+      the keys are absolute paths and values are epoch timestamps.
+    """
     filename_to_mtime = {}
     num_files = 0
-    for dirname, dirnames, filenames in os.walk(self._directory,
+    for dirname, dirnames, filenames in os.walk(directory,
                                                 followlinks=True):
       watcher_common.skip_ignored_dirs(dirnames)
       filenames = [f for f in filenames if not watcher_common.ignore_file(f)]
       for filename in filenames + dirnames:
-        if num_files == 10000:
+        if num_files == _MAX_MONITORED_FILES:
           warnings.warn(
               'There are too many files in your application for '
               'changes in all of them to be monitored. You may have to '
@@ -94,9 +97,7 @@
         num_files += 1
         path = os.path.join(dirname, filename)
         try:
-          mtime = os.path.getmtime(path)
+          filename_to_mtime[path] = os.path.getmtime(path)
         except (IOError, OSError):
           pass
-        else:
-          filename_to_mtime[path] = mtime
     return filename_to_mtime
diff --git a/google/appengine/tools/devappserver2/mtime_file_watcher_test.py b/google/appengine/tools/devappserver2/mtime_file_watcher_test.py
index c13a11b..7b74f02 100644
--- a/google/appengine/tools/devappserver2/mtime_file_watcher_test.py
+++ b/google/appengine/tools/devappserver2/mtime_file_watcher_test.py
@@ -16,7 +16,6 @@
 #
 """Tests for google.appengine.tools.devappserver2.mtime_file_watcher."""
 
-import logging
 import os
 import os.path
 import shutil
@@ -27,9 +26,8 @@
 from google.appengine.tools.devappserver2 import mtime_file_watcher
 
 
-class FakeThread(object):
-  def start(self):
-    pass
+def _sync():
+  time.sleep(.1)  # just to stay over the FS timestamp resolution
 
 
 class TestMtimeFileWatcher(unittest.TestCase):
@@ -39,9 +37,6 @@
     self._directory = tempfile.mkdtemp()  # The watched directory
     self._junk_directory = tempfile.mkdtemp()  # A scrap directory.
     self._watcher = mtime_file_watcher.MtimeFileWatcher(self._directory)
-    self._watcher._watcher_thread = FakeThread()
-    logging.debug('watched directory=%r, junk directory=%r',
-                  self._directory, self._junk_directory)
 
   def tearDown(self):
     self._watcher.quit()
@@ -61,143 +56,158 @@
 
   def test_file_created(self):
     self._watcher.start()
-    self._watcher._has_changed_paths()
-    self._create_file('test')
-    self.assertTrue(self._watcher._has_changed_paths())
+    self._watcher._startup_thread.join()
+    path = self._create_file('test')
+    self.assertEqual(self._watcher.changes(), {path})
 
   def test_file_modified(self):
     path = self._create_file('test')
+    _sync()
     self._watcher.start()
-    self._watcher._has_changed_paths()
-    time.sleep(1)
+    self._watcher._startup_thread.join()
     with open(path, 'w') as f:
       f.write('testing')
-    self.assertTrue(self._watcher._has_changed_paths())
+    self.assertEqual(self._watcher.changes(), {path})
 
   def test_file_read(self):
     path = self._create_file('test')
     with open(path, 'w') as f:
       f.write('testing')
     self._watcher.start()
-    self._watcher._has_changed_paths()
+    self._watcher._startup_thread.join()
     with open(path, 'r') as f:
       f.read()
     # Reads should not trigger updates.
-    self.assertFalse(self._watcher._has_changed_paths())
+    self.assertEqual(self._watcher.changes(), set())
 
   def test_file_deleted(self):
     path = self._create_file('test')
     self._watcher.start()
-    self._watcher._has_changed_paths()
+    self._watcher._startup_thread.join()
     os.remove(path)
-    self.assertTrue(self._watcher._has_changed_paths())
+    self.assertEqual(self._watcher.changes(), {path})
 
   def test_file_renamed(self):
     source = self._create_file('test')
     target = os.path.join(os.path.dirname(source), 'test2')
     self._watcher.start()
-    self._watcher._has_changed_paths()
+    self._watcher._startup_thread.join()
     os.rename(source, target)
-    self.assertTrue(self._watcher._has_changed_paths())
+    self.assertEqual(self._watcher.changes(), {source, target})
 
   def test_create_directory(self):
     self._watcher.start()
-    self._watcher._has_changed_paths()
-    self._create_directory('test')
-    self.assertTrue(self._watcher._has_changed_paths())
+    self._watcher._startup_thread.join()
+    path = self._create_directory('test')
+    self.assertEqual(self._watcher.changes(), {path})
 
   def test_file_created_in_directory(self):
-    self._create_directory('test')
+    dir_path = self._create_directory('test')
+    _sync()
     self._watcher.start()
-    self._watcher._has_changed_paths()
-    self._create_file('test/file')
-    self.assertTrue(self._watcher._has_changed_paths())
+    self._watcher._startup_thread.join()
+    path = self._create_file('test/file')
+    # Note : creating an entry in an inode changes its timestamp so the is
+    # normal
+    self.assertEqual(self._watcher.changes(), {dir_path, path})
 
   def test_move_directory(self):
     source = self._create_directory('test')
     target = os.path.join(os.path.dirname(source), 'test2')
     self._watcher.start()
-    self._watcher._has_changed_paths()
+    self._watcher._startup_thread.join()
     os.rename(source, target)
-    self.assertTrue(self._watcher._has_changed_paths())
+    self.assertEqual(self._watcher.changes(), {source, target})
 
   def test_move_directory_out_of_watched(self):
     source = self._create_directory('test')
     target = os.path.join(self._junk_directory, 'test')
     self._watcher.start()
-    self._watcher._has_changed_paths()
+    self._watcher._startup_thread.join()
     os.rename(source, target)
-    self.assertTrue(self._watcher._has_changed_paths())
+    self.assertEqual(self._watcher.changes(), {source})
     with open(os.path.join(target, 'file'), 'w'):
       pass
     # Changes to files in subdirectories that have been moved should be ignored.
-    self.assertFalse(self._watcher._has_changed_paths())
+    self.assertEqual(self._watcher.changes(), set())
 
   def test_move_directory_into_watched(self):
     source = os.path.join(self._junk_directory, 'source')
     target = os.path.join(self._directory, 'target')
     os.mkdir(source)
+    _sync()
     self._watcher.start()
-    self._watcher._has_changed_paths()
+    self._watcher._startup_thread.join()
     os.rename(source, target)
-    self.assertTrue(self._watcher._has_changed_paths())
+    self.assertEqual(self._watcher.changes(), {target})
     file_path = os.path.join(target, 'file')
     with open(file_path, 'w+'):
       pass
-    self.assertTrue(self._watcher._has_changed_paths())
+    # file has been created so target changed
+    self.assertEqual(self._watcher.changes(), {target, file_path})
 
   def test_directory_deleted(self):
     path = self._create_directory('test')
+    _sync()
     self._watcher.start()
-    self._watcher._has_changed_paths()
+    self._watcher._startup_thread.join()
     os.rmdir(path)
-    self.assertTrue(self._watcher._has_changed_paths())
+    self.assertEqual(self._watcher.changes(), {path})
 
   @unittest.skipUnless(hasattr(os, 'symlink'), 'requires os.symlink')
   def test_symlink(self):
     sym_target = os.path.join(self._directory, 'test')
     os.mkdir(os.path.join(self._junk_directory, 'subdir'))
+    # the translated path in the target dir
+    sym_subdir_path = os.path.join(sym_target, 'subdir')
+    _sync()
     self._watcher.start()
-    self._watcher._has_changed_paths()
+    self._watcher._startup_thread.join()
 
     # Check that an added symlinked directory is reported.
     os.symlink(self._junk_directory, sym_target)
-    self.assertTrue(self._watcher._has_changed_paths())
+    self.assertEqual(
+        self._watcher.changes(),
+        {sym_target, os.path.join(sym_target, 'subdir')})
 
     # Check that a file added to the symlinked directory is reported.
     with open(os.path.join(self._junk_directory, 'file1'), 'w'):
       pass
-    self.assertTrue(self._watcher._has_changed_paths())
+    sym_file_path = os.path.join(sym_target, 'file1')
+    # file1 has been created so sym_target changed
+    self.assertEqual(
+        self._watcher.changes(), {sym_target, sym_file_path})
 
     # Check that a removed symlinked directory is reported.
     os.remove(sym_target)
-    self.assertTrue(self._watcher._has_changed_paths())
+    self.assertEqual(
+        self._watcher.changes(), {sym_target, sym_file_path, sym_subdir_path})
 
     # Check that a file added to the removed symlinked directory is *not*
     # reported.
     with open(os.path.join(self._junk_directory, 'subdir', 'file2'), 'w'):
       pass
-    self.assertFalse(self._watcher._has_changed_paths())
+    self.assertEqual(self._watcher.changes(), set())
 
   def test_too_many_files(self):
     self._watcher.start()
-    self._watcher._has_changed_paths()
-
+    self._watcher._startup_thread.join()
     for i in range(10001):
       self._create_file('file%d' % i)
-    self.assertTrue(self._watcher._has_changed_paths())
+    self.assertEqual(len(self._watcher.changes()), 10000)
 
   @unittest.skipUnless(hasattr(os, 'symlink'), 'requires os.symlink')
   def test_symlink_loop(self):
     self._watcher.start()
-    self._watcher._has_changed_paths()
+    self._watcher._startup_thread.join()
 
     for i in range(1000):
       self._create_file('file%d' % i)
 
     for i in range(11):
       os.symlink(self._directory, os.path.join(self._directory, 'test%d' % i))
-    self.assertTrue(self._watcher._has_changed_paths())
+    # basically the set is completely crazy
+    self.assertEqual(len(self._watcher.changes()), 10000)
 
 
 if __name__ == '__main__':
diff --git a/google/appengine/tools/devappserver2/php/runtime.py b/google/appengine/tools/devappserver2/php/runtime.py
index bd5d039..1ac84ae 100644
--- a/google/appengine/tools/devappserver2/php/runtime.py
+++ b/google/appengine/tools/devappserver2/php/runtime.py
@@ -17,6 +17,7 @@
 """A PHP devappserver2 runtime."""
 
 
+
 import base64
 import cStringIO
 import httplib
@@ -39,7 +40,18 @@
 from google.appengine.tools.devappserver2 import wsgi_server
 
 SDK_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 'php/sdk'))
+
+
+
+
+
+
+
+os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 'php/sdk'))
+
+
+
+
 
 
 if not os.path.exists(SDK_PATH):
diff --git a/google/appengine/tools/devappserver2/php_runtime.py b/google/appengine/tools/devappserver2/php_runtime.py
index 2891815..c0faf8a 100644
--- a/google/appengine/tools/devappserver2/php_runtime.py
+++ b/google/appengine/tools/devappserver2/php_runtime.py
@@ -17,6 +17,7 @@
 """Serves content for "script" handlers using the PHP runtime."""
 
 
+
 import cgi
 import logging
 import os
diff --git a/google/appengine/tools/devappserver2/python/request_handler.py b/google/appengine/tools/devappserver2/python/request_handler.py
index 5276a96..9110afb 100644
--- a/google/appengine/tools/devappserver2/python/request_handler.py
+++ b/google/appengine/tools/devappserver2/python/request_handler.py
@@ -21,6 +21,7 @@
 """
 
 
+
 import cStringIO
 import os
 import sys
@@ -49,6 +50,14 @@
 # our httplib "forwarder" as the environment variable that controls which
 # implementation we get is not yet set.
 
+
+
+
+
+
+
+
+
 httplib_responses = {
     100: 'Continue',
     101: 'Switching Protocols',
diff --git a/google/appengine/tools/devappserver2/python/runtime.py b/google/appengine/tools/devappserver2/python/runtime.py
index c9a1f59..cc98288 100644
--- a/google/appengine/tools/devappserver2/python/runtime.py
+++ b/google/appengine/tools/devappserver2/python/runtime.py
@@ -17,6 +17,7 @@
 """A Python devappserver2 runtime."""
 
 
+
 import os
 import sys
 import time
diff --git a/google/appengine/tools/devappserver2/python/runtime_test.py b/google/appengine/tools/devappserver2/python/runtime_test.py
index 31f564c..fad23a1 100644
--- a/google/appengine/tools/devappserver2/python/runtime_test.py
+++ b/google/appengine/tools/devappserver2/python/runtime_test.py
@@ -17,6 +17,7 @@
 """Tests for google.appengine.tools.devappserver2.python.runtime."""
 
 
+
 import unittest
 
 import google
diff --git a/google/appengine/tools/devappserver2/python/sandbox.py b/google/appengine/tools/devappserver2/python/sandbox.py
index 7a17f19..7a51eaf 100644
--- a/google/appengine/tools/devappserver2/python/sandbox.py
+++ b/google/appengine/tools/devappserver2/python/sandbox.py
@@ -17,6 +17,7 @@
 """A sandbox implementation that emulates production App Engine."""
 
 
+
 import __builtin__
 import imp
 import os
@@ -137,6 +138,14 @@
     config: The runtime_config_pb2.Config to use to configure the sandbox.
   """
 
+
+
+
+
+
+
+
+
   devnull = open(os.path.devnull)
   modules = [os, traceback, google]
   c_module = _find_shared_object_c_module()
@@ -228,6 +237,9 @@
                    'google') or
           name.startswith('google.') or name.startswith('encodings.') or
 
+
+
+
           # Making mysql available is a hack to make the CloudSQL functionality
           # work.
           'mysql' in name.lower())
diff --git a/google/appengine/tools/devappserver2/python/sandbox_test.py b/google/appengine/tools/devappserver2/python/sandbox_test.py
index 93e9584..2c260fe 100644
--- a/google/appengine/tools/devappserver2/python/sandbox_test.py
+++ b/google/appengine/tools/devappserver2/python/sandbox_test.py
@@ -17,6 +17,7 @@
 """Tests for google.appengine.tools.devappserver2.python.sandbox."""
 
 
+
 import __builtin__
 import imp
 import os
diff --git a/google/appengine/tools/devappserver2/python/stubs.py b/google/appengine/tools/devappserver2/python/stubs.py
index aa426a3..6b2db5f 100644
--- a/google/appengine/tools/devappserver2/python/stubs.py
+++ b/google/appengine/tools/devappserver2/python/stubs.py
@@ -17,6 +17,7 @@
 """Stub implementations of restricted functions."""
 
 
+
 import errno
 import functools
 import inspect
diff --git a/google/appengine/tools/devappserver2/python/stubs_test.py b/google/appengine/tools/devappserver2/python/stubs_test.py
index fb6c593..9a6681c 100644
--- a/google/appengine/tools/devappserver2/python/stubs_test.py
+++ b/google/appengine/tools/devappserver2/python/stubs_test.py
@@ -17,6 +17,7 @@
 """Tests for google.appengine.tools.devappserver2.python.stubs."""
 
 
+
 import errno
 import locale
 import mimetypes
diff --git a/google/appengine/tools/devappserver2/python_runtime.py b/google/appengine/tools/devappserver2/python_runtime.py
index 86fb637..5b9f4af 100644
--- a/google/appengine/tools/devappserver2/python_runtime.py
+++ b/google/appengine/tools/devappserver2/python_runtime.py
@@ -17,6 +17,7 @@
 """Serves content for "script" handlers using the Python runtime."""
 
 
+
 import os
 import sys
 
diff --git a/google/appengine/tools/devappserver2/request_rewriter.py b/google/appengine/tools/devappserver2/request_rewriter.py
index e46d128..388a1e5 100644
--- a/google/appengine/tools/devappserver2/request_rewriter.py
+++ b/google/appengine/tools/devappserver2/request_rewriter.py
@@ -30,6 +30,7 @@
 """
 
 
+
 import calendar
 import cStringIO
 import email
@@ -183,6 +184,8 @@
       state.headers['Expires'] = 'Fri, 01 Jan 1990 00:00:00 GMT'
 
 
+
+
   if 'Set-Cookie' in state.headers:
     # It is a security risk to have any caching with Set-Cookie.
     # If Expires is omitted or set to a future date, and response code is
diff --git a/google/appengine/tools/devappserver2/request_rewriter_test.py b/google/appengine/tools/devappserver2/request_rewriter_test.py
index 1dda5f0..6c72f43 100644
--- a/google/appengine/tools/devappserver2/request_rewriter_test.py
+++ b/google/appengine/tools/devappserver2/request_rewriter_test.py
@@ -17,6 +17,7 @@
 """Tests for devappserver2.request_rewriter."""
 
 
+
 import functools
 import sys
 import time
diff --git a/google/appengine/tools/devappserver2/runtime_config_pb2.py b/google/appengine/tools/devappserver2/runtime_config_pb2.py
index b63767b..0660743 100644
--- a/google/appengine/tools/devappserver2/runtime_config_pb2.py
+++ b/google/appengine/tools/devappserver2/runtime_config_pb2.py
@@ -19,6 +19,7 @@
 
 import sys
 _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+import google
 from google.net.proto2.python.public import descriptor as _descriptor
 from google.net.proto2.python.public import message as _message
 from google.net.proto2.python.public import reflection as _reflection
@@ -34,7 +35,7 @@
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='apphosting/tools/devappserver2/runtime_config.proto',
   package='apphosting.tools.devappserver2',
-  serialized_pb=_b('\n3apphosting/tools/devappserver2/runtime_config.proto\x12\x1e\x61pphosting.tools.devappserver2\"\x85\x06\n\x06\x43onfig\x12\x0e\n\x06\x61pp_id\x18\x01 \x02(\x0c\x12\x12\n\nversion_id\x18\x02 \x02(\x0c\x12\x18\n\x10\x61pplication_root\x18\x03 \x02(\x0c\x12\x19\n\nthreadsafe\x18\x04 \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x08\x61pi_host\x18\x11 \x01(\t:\tlocalhost\x12\x10\n\x08\x61pi_port\x18\x05 \x02(\x05\x12:\n\tlibraries\x18\x06 \x03(\x0b\x32\'.apphosting.tools.devappserver2.Library\x12\x16\n\nskip_files\x18\x07 \x01(\t:\x02^$\x12\x18\n\x0cstatic_files\x18\x08 \x01(\t:\x02^$\x12\x43\n\rpython_config\x18\x0e \x01(\x0b\x32,.apphosting.tools.devappserver2.PythonConfig\x12=\n\nphp_config\x18\t \x01(\x0b\x32).apphosting.tools.devappserver2.PhpConfig\x12?\n\x0bjava_config\x18\x15 \x01(\x0b\x32*.apphosting.tools.devappserver2.JavaConfig\x12\x38\n\x07\x65nviron\x18\n \x03(\x0b\x32\'.apphosting.tools.devappserver2.Environ\x12\x42\n\x10\x63loud_sql_config\x18\x0b \x01(\x0b\x32(.apphosting.tools.devappserver2.CloudSQL\x12\x12\n\ndatacenter\x18\x0c \x02(\t\x12\x13\n\x0binstance_id\x18\r \x02(\t\x12\x1b\n\x10stderr_log_level\x18\x0f \x01(\x03:\x01\x31\x12\x13\n\x0b\x61uth_domain\x18\x10 \x02(\t\x12\x15\n\rmax_instances\x18\x12 \x01(\x05\x12;\n\tvm_config\x18\x13 \x01(\x0b\x32(.apphosting.tools.devappserver2.VMConfig\x12\x13\n\x0bserver_port\x18\x14 \x01(\x05\"A\n\tPhpConfig\x12\x1b\n\x13php_executable_path\x18\x01 \x01(\x0c\x12\x17\n\x0f\x65nable_debugger\x18\x03 \x02(\x08\"<\n\x0cPythonConfig\x12\x16\n\x0estartup_script\x18\x01 \x01(\t\x12\x14\n\x0cstartup_args\x18\x02 \x01(\t\"\x1e\n\nJavaConfig\x12\x10\n\x08jvm_args\x18\x01 \x03(\t\"t\n\x08\x43loudSQL\x12\x12\n\nmysql_host\x18\x01 \x02(\t\x12\x12\n\nmysql_port\x18\x02 \x02(\x05\x12\x12\n\nmysql_user\x18\x03 \x02(\t\x12\x16\n\x0emysql_password\x18\x04 \x02(\t\x12\x14\n\x0cmysql_socket\x18\x05 \x01(\t\"(\n\x07Library\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\x0f\n\x07version\x18\x02 \x02(\t\"%\n\x07\x45nviron\x12\x0b\n\x03key\x18\x01 \x02(\x0c\x12\r\n\x05value\x18\x02 \x02(\x0c\"f\n\x08VMConfig\x12\x19\n\x11\x64ocker_daemon_url\x18\x01 \x01(\t\x12?\n\x0b\x64\x61rt_config\x18\x02 \x01(\x0b\x32*.apphosting.tools.devappserver2.DartConfig\"o\n\nDartConfig\x12\x10\n\x08\x64\x61rt_sdk\x18\x01 \x01(\t\x12\x15\n\rdart_dev_mode\x18\x02 \x01(\t\x12\x1b\n\x13\x64\x61rt_pub_serve_host\x18\x03 \x01(\t\x12\x1b\n\x13\x64\x61rt_pub_serve_port\x18\x04 \x01(\x05\x42\x32\n,com.google.appengine.tools.development.proto \x02P\x01')
+  serialized_pb=_b('\n3apphosting/tools/devappserver2/runtime_config.proto\x12\x1e\x61pphosting.tools.devappserver2\"\x85\x06\n\x06\x43onfig\x12\x0e\n\x06\x61pp_id\x18\x01 \x02(\x0c\x12\x12\n\nversion_id\x18\x02 \x02(\x0c\x12\x18\n\x10\x61pplication_root\x18\x03 \x02(\x0c\x12\x19\n\nthreadsafe\x18\x04 \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x08\x61pi_host\x18\x11 \x01(\t:\tlocalhost\x12\x10\n\x08\x61pi_port\x18\x05 \x02(\x05\x12:\n\tlibraries\x18\x06 \x03(\x0b\x32\'.apphosting.tools.devappserver2.Library\x12\x16\n\nskip_files\x18\x07 \x01(\t:\x02^$\x12\x18\n\x0cstatic_files\x18\x08 \x01(\t:\x02^$\x12\x43\n\rpython_config\x18\x0e \x01(\x0b\x32,.apphosting.tools.devappserver2.PythonConfig\x12=\n\nphp_config\x18\t \x01(\x0b\x32).apphosting.tools.devappserver2.PhpConfig\x12?\n\x0bjava_config\x18\x15 \x01(\x0b\x32*.apphosting.tools.devappserver2.JavaConfig\x12\x38\n\x07\x65nviron\x18\n \x03(\x0b\x32\'.apphosting.tools.devappserver2.Environ\x12\x42\n\x10\x63loud_sql_config\x18\x0b \x01(\x0b\x32(.apphosting.tools.devappserver2.CloudSQL\x12\x12\n\ndatacenter\x18\x0c \x02(\t\x12\x13\n\x0binstance_id\x18\r \x02(\t\x12\x1b\n\x10stderr_log_level\x18\x0f \x01(\x03:\x01\x31\x12\x13\n\x0b\x61uth_domain\x18\x10 \x02(\t\x12\x15\n\rmax_instances\x18\x12 \x01(\x05\x12;\n\tvm_config\x18\x13 \x01(\x0b\x32(.apphosting.tools.devappserver2.VMConfig\x12\x13\n\x0bserver_port\x18\x14 \x01(\x05\"A\n\tPhpConfig\x12\x1b\n\x13php_executable_path\x18\x01 \x01(\x0c\x12\x17\n\x0f\x65nable_debugger\x18\x03 \x02(\x08\"<\n\x0cPythonConfig\x12\x16\n\x0estartup_script\x18\x01 \x01(\t\x12\x14\n\x0cstartup_args\x18\x02 \x01(\t\"\x1e\n\nJavaConfig\x12\x10\n\x08jvm_args\x18\x01 \x03(\t\"t\n\x08\x43loudSQL\x12\x12\n\nmysql_host\x18\x01 \x02(\t\x12\x12\n\nmysql_port\x18\x02 \x02(\x05\x12\x12\n\nmysql_user\x18\x03 \x02(\t\x12\x16\n\x0emysql_password\x18\x04 \x02(\t\x12\x14\n\x0cmysql_socket\x18\x05 \x01(\t\"(\n\x07Library\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\x0f\n\x07version\x18\x02 \x02(\t\"%\n\x07\x45nviron\x12\x0b\n\x03key\x18\x01 \x02(\x0c\x12\r\n\x05value\x18\x02 \x02(\x0c\"{\n\x08VMConfig\x12\x19\n\x11\x64ocker_daemon_url\x18\x01 \x01(\t\x12?\n\x0b\x64\x61rt_config\x18\x02 \x01(\x0b\x32*.apphosting.tools.devappserver2.DartConfig\x12\x13\n\x0b\x65nable_logs\x18\x03 \x01(\x08\"o\n\nDartConfig\x12\x10\n\x08\x64\x61rt_sdk\x18\x01 \x01(\t\x12\x15\n\rdart_dev_mode\x18\x02 \x01(\t\x12\x1b\n\x13\x64\x61rt_pub_serve_host\x18\x03 \x01(\t\x12\x1b\n\x13\x64\x61rt_pub_serve_port\x18\x04 \x01(\x05\x42\x32\n,com.google.appengine.tools.development.proto \x02P\x01')
 )
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -468,6 +469,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
+    _descriptor.FieldDescriptor(
+      name='enable_logs', full_name='apphosting.tools.devappserver2.VMConfig.enable_logs', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
   ],
   extensions=[
   ],
@@ -480,7 +488,7 @@
   oneofs=[
   ],
   serialized_start=1223,
-  serialized_end=1325,
+  serialized_end=1346,
 )
 
 
@@ -530,8 +538,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1327,
-  serialized_end=1438,
+  serialized_start=1348,
+  serialized_end=1459,
 )
 
 _CONFIG.fields_by_name['libraries'].message_type = _LIBRARY
diff --git a/google/appengine/tools/devappserver2/shutdown.py b/google/appengine/tools/devappserver2/shutdown.py
index 33f1cc9..4cca09d 100644
--- a/google/appengine/tools/devappserver2/shutdown.py
+++ b/google/appengine/tools/devappserver2/shutdown.py
@@ -17,6 +17,7 @@
 """Helper functions to quit the development server."""
 
 
+
 import logging
 import os
 import signal
diff --git a/google/appengine/tools/devappserver2/start_response_utils.py b/google/appengine/tools/devappserver2/start_response_utils.py
index 821fbac..05bb574 100644
--- a/google/appengine/tools/devappserver2/start_response_utils.py
+++ b/google/appengine/tools/devappserver2/start_response_utils.py
@@ -17,6 +17,7 @@
 """Implementations of start_response callables as defined in PEP-333."""
 
 
+
 import cStringIO
 
 
diff --git a/google/appengine/tools/devappserver2/start_response_utils_test.py b/google/appengine/tools/devappserver2/start_response_utils_test.py
index 0a4ece2..e101555 100644
--- a/google/appengine/tools/devappserver2/start_response_utils_test.py
+++ b/google/appengine/tools/devappserver2/start_response_utils_test.py
@@ -17,6 +17,7 @@
 """Tests for google.apphosting.tools.devappserver2.start_response_utils."""
 
 
+
 import unittest
 
 from google.appengine.tools.devappserver2 import start_response_utils
diff --git a/google/appengine/tools/devappserver2/static_files_handler.py b/google/appengine/tools/devappserver2/static_files_handler.py
index 7cf0458..fc0ab5b 100644
--- a/google/appengine/tools/devappserver2/static_files_handler.py
+++ b/google/appengine/tools/devappserver2/static_files_handler.py
@@ -17,6 +17,7 @@
 """Serves static content for "static_dir" and "static_files" handlers."""
 
 
+
 import base64
 import errno
 import httplib
diff --git a/google/appengine/tools/devappserver2/static_files_handler_test.py b/google/appengine/tools/devappserver2/static_files_handler_test.py
index 3a68c89..298e6f6 100644
--- a/google/appengine/tools/devappserver2/static_files_handler_test.py
+++ b/google/appengine/tools/devappserver2/static_files_handler_test.py
@@ -17,6 +17,7 @@
 """Tests for google.appengine.tools.devappserver2.static_files_handler."""
 
 
+
 import errno
 import os.path
 import unittest
diff --git a/google/appengine/tools/devappserver2/tee.py b/google/appengine/tools/devappserver2/tee.py
index 2f6c38f..fbda4bf 100644
--- a/google/appengine/tools/devappserver2/tee.py
+++ b/google/appengine/tools/devappserver2/tee.py
@@ -17,6 +17,7 @@
 """A simple line-oriented "tee"."""
 
 
+
 import collections
 import threading
 
diff --git a/google/appengine/tools/devappserver2/tee_test.py b/google/appengine/tools/devappserver2/tee_test.py
index 6e49385..a104d15 100644
--- a/google/appengine/tools/devappserver2/tee_test.py
+++ b/google/appengine/tools/devappserver2/tee_test.py
@@ -17,6 +17,7 @@
 """Tests for google.appengine.tools.devappserver2.tee."""
 
 
+
 import cStringIO
 import unittest
 
diff --git a/google/appengine/tools/devappserver2/thread_executor.py b/google/appengine/tools/devappserver2/thread_executor.py
index 0a6edfb..3dda564 100644
--- a/google/appengine/tools/devappserver2/thread_executor.py
+++ b/google/appengine/tools/devappserver2/thread_executor.py
@@ -26,6 +26,7 @@
 """
 
 
+
 import threading
 
 import google
diff --git a/google/appengine/tools/devappserver2/thread_executor_test.py b/google/appengine/tools/devappserver2/thread_executor_test.py
index df13d9a..8a26159 100644
--- a/google/appengine/tools/devappserver2/thread_executor_test.py
+++ b/google/appengine/tools/devappserver2/thread_executor_test.py
@@ -17,6 +17,7 @@
 """Tests for google.apphosting.tools.devappserver2.threadexecutor."""
 
 
+
 import unittest
 
 from google.appengine.tools.devappserver2 import thread_executor
diff --git a/google/appengine/tools/devappserver2/update_checker.py b/google/appengine/tools/devappserver2/update_checker.py
index 7c0837a..38875b6 100644
--- a/google/appengine/tools/devappserver2/update_checker.py
+++ b/google/appengine/tools/devappserver2/update_checker.py
@@ -17,6 +17,7 @@
 """Checks for SDK updates."""
 
 
+
 import sys
 
 from google.appengine.tools import appengine_rpc
diff --git a/google/appengine/tools/devappserver2/update_checker_test.py b/google/appengine/tools/devappserver2/update_checker_test.py
index ff54c55..8c4be7e 100644
--- a/google/appengine/tools/devappserver2/update_checker_test.py
+++ b/google/appengine/tools/devappserver2/update_checker_test.py
@@ -17,6 +17,7 @@
 """Tests for devappserver2.update_checker."""
 
 
+
 import unittest
 
 import google
diff --git a/google/appengine/tools/devappserver2/url_handler.py b/google/appengine/tools/devappserver2/url_handler.py
index 2511bd7..3975ee1 100644
--- a/google/appengine/tools/devappserver2/url_handler.py
+++ b/google/appengine/tools/devappserver2/url_handler.py
@@ -17,6 +17,7 @@
 """Base functionality for handling HTTP requests."""
 
 
+
 import logging
 import wsgiref.util
 
diff --git a/google/appengine/tools/devappserver2/url_handler_test.py b/google/appengine/tools/devappserver2/url_handler_test.py
index 003bb54..519115b 100644
--- a/google/appengine/tools/devappserver2/url_handler_test.py
+++ b/google/appengine/tools/devappserver2/url_handler_test.py
@@ -17,6 +17,7 @@
 """Tests for google.appengine.tools.devappserver2.url_handler."""
 
 
+
 import re
 import unittest
 import wsgiref.util
diff --git a/google/appengine/tools/devappserver2/util.py b/google/appengine/tools/devappserver2/util.py
index 6395f59..115efd3 100644
--- a/google/appengine/tools/devappserver2/util.py
+++ b/google/appengine/tools/devappserver2/util.py
@@ -18,6 +18,7 @@
 
 
 
+
 import wsgiref.headers
 
 
diff --git a/google/appengine/tools/devappserver2/util_test.py b/google/appengine/tools/devappserver2/util_test.py
index a643e11..c7aeca4 100644
--- a/google/appengine/tools/devappserver2/util_test.py
+++ b/google/appengine/tools/devappserver2/util_test.py
@@ -17,6 +17,7 @@
 """Unit tests for the util module."""
 
 
+
 import unittest
 import wsgiref
 
diff --git a/google/appengine/tools/devappserver2/vm_runtime_factory.py b/google/appengine/tools/devappserver2/vm_runtime_factory.py
index 45abb5a..5e7b3f8 100644
--- a/google/appengine/tools/devappserver2/vm_runtime_factory.py
+++ b/google/appengine/tools/devappserver2/vm_runtime_factory.py
@@ -19,14 +19,17 @@
 import logging
 
 import google
-import docker
-import requests
 
 from google.appengine.api import appinfo
 from google.appengine.tools.devappserver2 import instance
 from google.appengine.tools.devappserver2 import vm_runtime_proxy
 from google.appengine.tools.devappserver2 import vm_runtime_proxy_dart
 from google.appengine.tools.devappserver2 import vm_runtime_proxy_go
+from google.appengine.tools.docker import containers
+
+
+# docker uses requests which logs lots of noise.
+logging.getLogger('requests').setLevel(logging.WARNING)
 
 
 class Error(Exception):
@@ -58,7 +61,7 @@
   FILE_CHANGE_INSTANCE_RESTART_POLICY = instance.ALWAYS
 
   # Timeout of HTTP request from docker-py client to docker daemon, in seconds.
-  DOCKER_D_REQUEST_TIMEOUT = 60
+  DOCKER_D_REQUEST_TIMEOUT_SECS = 60
 
   def __init__(self, request_data, runtime_config_getter, module_configuration):
     """Initializer for VMRuntimeInstanceFactory.
@@ -73,23 +76,14 @@
           instance representing the configuration of the module that owns the
           runtime.
     """
-    assert runtime_config_getter().vm_config.HasField('docker_daemon_url'), (
-        'VM runtime requires docker_daemon_url to be specified')
     super(VMRuntimeInstanceFactory, self).__init__(
         request_data,
         8 if runtime_config_getter().threadsafe else 1, 10)
     self._runtime_config_getter = runtime_config_getter
     self._module_configuration = module_configuration
-    docker_daemon_url = runtime_config_getter().vm_config.docker_daemon_url
-    self._docker_client = docker.Client(base_url=docker_daemon_url,
-                                        version='1.9',
-                                        timeout=self.DOCKER_D_REQUEST_TIMEOUT)
-    try:
-      self._docker_client.ping()
-    except requests.exceptions.ConnectionError:
-      raise DockerDaemonConnectionError(
-          'Couldn\'t connect to the docker daemon at %s. Please check that the '
-          'docker daemon is running.' % docker_daemon_url)
+    self._docker_client = containers.NewDockerClient(
+        version='1.9',
+        timeout=self.DOCKER_D_REQUEST_TIMEOUT_SECS)
 
   def new_instance(self, instance_id, expect_ready_request=False):
     """Create and return a new Instance.
@@ -114,9 +108,8 @@
     proxy_class = self.RUNTIME_SPECIFIC_PROXY.get(
         effective_runtime, vm_runtime_proxy.VMRuntimeProxy)
 
-    proxy = proxy_class(self._docker_client,
-                        runtime_config_getter,
-                        self._module_configuration)
+    proxy = proxy_class(
+        self._docker_client, runtime_config_getter, self._module_configuration)
     return instance.Instance(self.request_data,
                              instance_id,
                              proxy,
diff --git a/google/appengine/tools/devappserver2/vm_runtime_proxy.py b/google/appengine/tools/devappserver2/vm_runtime_proxy.py
index d5e6923..66f8f9e 100644
--- a/google/appengine/tools/devappserver2/vm_runtime_proxy.py
+++ b/google/appengine/tools/devappserver2/vm_runtime_proxy.py
@@ -16,6 +16,7 @@
 #
 """Manages a VM Runtime process running inside of a docker container."""
 
+import datetime
 import logging
 import os
 import socket
@@ -25,11 +26,23 @@
 from google.appengine.tools.devappserver2 import application_configuration
 from google.appengine.tools.devappserver2 import http_proxy
 from google.appengine.tools.devappserver2 import instance
+from google.appengine.tools.devappserver2 import log_manager
 from google.appengine.tools.docker import containers
 
 
+_APP_ENGINE_PREFIX = 'google.appengine'
+
+# Number of seconds after a container start before we check if there is
+# any old containers and images to cleanup.
+_CLEANUP_DELAY_SEC = 10.0
+
 _DOCKER_IMAGE_NAME_FORMAT = '{display}.{module}.{version}'
-_DOCKER_CONTAINER_NAME_FORMAT = 'google.appengine.{image_name}.{instance_id}'
+_DOCKER_CONTAINER_NAME_FORMAT = (
+    _APP_ENGINE_PREFIX + '.{image_name}.{instance_id}.{timestamp}')
+
+# This is the number of containers the cleanup process will leave on docker for
+# investigation purposes.
+_CONTAINERS_TO_KEEP = 10
 
 
 class Error(Exception):
@@ -72,13 +85,35 @@
   return None
 
 
+def _ContainerName(image_name, instance_id, timestamp=None):
+  """Generates a container name.
+
+  Args:
+    image_name: the base image name.
+    instance_id: the instance # of the module.
+    timestamp: the timestamp as a string you want to generate the name from.
+               If None, it will be the now in the UTC timezone in ISO 8601.
+
+  Returns:
+    the generated container name.
+  """
+  if timestamp is None:
+    # ":" is not allowed in the container names but are optional in
+    # ISO8601.
+    timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H%M%S.%fZ')
+
+  return _DOCKER_CONTAINER_NAME_FORMAT.format(
+      image_name=image_name, instance_id=instance_id, timestamp=timestamp)
+
+
 class VMRuntimeProxy(instance.RuntimeProxy):
   """Manages a VM Runtime process running inside of a docker container."""
 
   DEFAULT_DEBUG_PORT = 5005
 
   def __init__(self, docker_client, runtime_config_getter,
-               module_configuration, default_port=8080, port_bindings=None,
+               module_configuration,
+               default_port=8080, port_bindings=None,
                additional_environment=None):
     """Initializer for VMRuntimeProxy.
 
@@ -104,6 +139,9 @@
     self._default_port = default_port
     self._port_bindings = port_bindings
     self._additional_environment = additional_environment
+    self._log_manager = log_manager.get(
+        self._docker_client,
+        enable_logging=self._runtime_config_getter().vm_config.enable_logs)
     self._container = None
     self._proxy = None
 
@@ -131,14 +169,14 @@
     return self._proxy.handle(environ, start_response, url_map, match,
                               request_id, request_type)
 
-  def _get_instance_logs(self):
-    # TODO: Handle docker container's logs
-    return ''
-
   def _instance_died_unexpectedly(self):
     # TODO: Check if container is still up and running
     return False
 
+  def get_instance_logs(self):
+    # TODO: Handle docker container's logs
+    return ''
+
   def _escape_domain(self, application_external_name):
     return application_external_name.replace(':', '.')
 
@@ -150,6 +188,12 @@
                     'configuration file.')
       raise VersionError()
 
+    self._log_manager.add(
+        self._escape_domain(
+            self._module_configuration.application_external_name),
+        self._module_configuration.module_name,
+        self._module_configuration.major_version, runtime_config.instance_id)
+
     if not dockerfile_dir:
       dockerfile_dir = self._module_configuration.application_root
 
@@ -223,7 +267,8 @@
         self._module_configuration.module_name,
         self._module_configuration.major_version,
         runtime_config.instance_id)
-    container_name = _DOCKER_CONTAINER_NAME_FORMAT.format(
+    internal_logs_path = '/var/log/app_engine'
+    container_name = _ContainerName(
         image_name=image_name,
         instance_id=runtime_config.instance_id)
     self._container = containers.Container(
@@ -237,12 +282,16 @@
             port_bindings=port_bindings,
             environment=environment,
             volumes={
-                external_logs_path: {'bind': '/var/log/app_engine'}
+                external_logs_path: {'bind': internal_logs_path}
             },
             name=container_name
         ))
 
     self._container.Start()
+    # As we add stuff, asynchronously check later for a cleanup.
+    containers.StartDelayedCleanup(
+        self._docker_client, _APP_ENGINE_PREFIX, _CLEANUP_DELAY_SEC,
+        _CONTAINERS_TO_KEEP)
 
     # Print the debug information before connecting to the container
     # as debugging might break the runtime during initialization, and
@@ -256,7 +305,7 @@
     self._proxy = http_proxy.HttpProxy(
         host=self._container.host, port=self._container.port,
         instance_died_unexpectedly=self._instance_died_unexpectedly,
-        instance_logs_getter=self._get_instance_logs,
+        instance_logs_getter=self.get_instance_logs,
         error_handler_file=application_configuration.get_app_error_file(
             self._module_configuration))
 
diff --git a/google/appengine/tools/devappserver2/vm_runtime_proxy_dart.py b/google/appengine/tools/devappserver2/vm_runtime_proxy_dart.py
index d2504fd..991570f 100644
--- a/google/appengine/tools/devappserver2/vm_runtime_proxy_dart.py
+++ b/google/appengine/tools/devappserver2/vm_runtime_proxy_dart.py
@@ -39,7 +39,8 @@
   """
 
   def __init__(self, docker_client, runtime_config_getter,
-               module_configuration, default_port=8080, port_bindings=None):
+               module_configuration,
+               default_port=8080, port_bindings=None):
     """Initializer for VMRuntimeProxy.
 
     Args:
@@ -146,9 +147,9 @@
           # Run 'pub build' to generate assets from web/ directory if necessary.
           web_dir = os.path.join(application_dir, 'web')
           if os.path.exists(web_dir):
-            subprocess.check_call([self._pub, 'build', '--mode=debug',
-                                   'web', '-o', dst_build_dir],
-                                  cwd=application_dir)
+            subprocess.check_call(' '.join([self._pub, 'build', '--mode=debug',
+                                            'web', '-o', dst_build_dir]),
+                                  cwd=application_dir, shell=True)
 
         self._vm_runtime_proxy.start(dockerfile_dir=dst_application_dir)
 
diff --git a/google/appengine/tools/devappserver2/watcher_common.py b/google/appengine/tools/devappserver2/watcher_common.py
index 024cc20..6cf7fcd 100644
--- a/google/appengine/tools/devappserver2/watcher_common.py
+++ b/google/appengine/tools/devappserver2/watcher_common.py
@@ -17,6 +17,7 @@
 """Common functionality for file watchers."""
 
 
+
 import os
 
 # A prefix for files and directories that we should not watch at all.
diff --git a/google/appengine/tools/devappserver2/win32_file_watcher.py b/google/appengine/tools/devappserver2/win32_file_watcher.py
index 0753627..e8eeefe 100644
--- a/google/appengine/tools/devappserver2/win32_file_watcher.py
+++ b/google/appengine/tools/devappserver2/win32_file_watcher.py
@@ -17,6 +17,7 @@
 """Monitors a directory tree for changes using win32 APIs."""
 
 
+
 import ctypes
 import os
 
@@ -80,19 +81,17 @@
     """Stop watching the directory for changes."""
     ctypes.windll.kernel32.FindCloseChangeNotification(self._find_change_handle)
 
-  def has_changes(self):
-    """Returns True if the watched directory has changed since the last call.
+  def changes(self):
+    """Returns the paths changed in the watched directory since the last call.
 
     start() must be called before this method.
 
     Returns:
-      Returns True if the watched directory has changed since the last call to
-      has_changes or, if has_changes has never been called, since start was
-      called.
+      Returns an iterable of changed directories/files.
     """
     found_change = False
-    # Loop until no new changes are found. This prevents future calls to
-    # has_changes() from returning True for changes that happened before this
+    # Loop until no new changes are found. This prevents future accesses to
+    # changes from returning the list of changes that happened before this
     # call was made.
     while True:
       wait_result = ctypes.windll.kernel32.WaitForSingleObject(
@@ -104,7 +103,7 @@
         found_change = True
         continue
       elif wait_result == WAIT_TIMEOUT:
-        return found_change
+        return {'-'} if found_change else set()  # TODO: implement
       elif wait_result == WAIT_FAILED:
         raise ctypes.WinError()
       else:
diff --git a/google/appengine/tools/devappserver2/win32_file_watcher_test.py b/google/appengine/tools/devappserver2/win32_file_watcher_test.py
index 1848e03..222fe88 100644
--- a/google/appengine/tools/devappserver2/win32_file_watcher_test.py
+++ b/google/appengine/tools/devappserver2/win32_file_watcher_test.py
@@ -17,6 +17,7 @@
 """Tests for google.apphosting.tools.devappserver2.win32_file_watcher."""
 
 
+
 import ctypes
 import os
 import unittest
@@ -32,6 +33,7 @@
 
 
 class Win32FileWatcherTest(unittest.TestCase):
+
   def setUp(self):
     self.mox = mox.Mox()
     ctypes.windll = self.mox.CreateMockAnything()
@@ -87,7 +89,7 @@
                       watcher.start)
     self.mox.VerifyAll()
 
-  def test_has_changes_with_changes(self):
+  def test_changes_with_changes(self):
     watcher = win32_file_watcher.Win32FileWatcher('/tmp')
     watcher._find_change_handle = 5
 
@@ -98,10 +100,10 @@
         win32_file_watcher.WAIT_TIMEOUT)
 
     self.mox.ReplayAll()
-    self.assertTrue(watcher.has_changes())
+    self.assertTrue(watcher.changes())
     self.mox.VerifyAll()
 
-  def test_has_changes_no_changes(self):
+  def test_changes_no_changes(self):
     watcher = win32_file_watcher.Win32FileWatcher('/tmp')
     watcher._find_change_handle = 5
 
@@ -109,10 +111,10 @@
         win32_file_watcher.WAIT_TIMEOUT)
 
     self.mox.ReplayAll()
-    self.assertFalse(watcher.has_changes())
+    self.assertFalse(watcher.changes())
     self.mox.VerifyAll()
 
-  def test_has_changes_wait_failed(self):
+  def test_changes_wait_failed(self):
     watcher = win32_file_watcher.Win32FileWatcher('/tmp')
     watcher._find_change_handle = 5
 
@@ -120,10 +122,10 @@
         win32_file_watcher.WAIT_FAILED)
 
     self.mox.ReplayAll()
-    self.assertRaises(WinError, watcher.has_changes)
+    self.assertRaises(WinError, watcher.changes)
     self.mox.VerifyAll()
 
-  def test_has_changes_find_next_change_notification_failed(self):
+  def test_changes_find_next_change_notification_failed(self):
     watcher = win32_file_watcher.Win32FileWatcher('/tmp')
     watcher._find_change_handle = 5
 
@@ -132,7 +134,7 @@
     ctypes.windll.kernel32.FindNextChangeNotification(5).AndReturn(False)
 
     self.mox.ReplayAll()
-    self.assertRaises(WinError, watcher.has_changes)
+    self.assertRaises(WinError, watcher.changes)
     self.mox.VerifyAll()
 
 if __name__ == '__main__':
diff --git a/google/appengine/tools/devappserver2/wsgi_handler.py b/google/appengine/tools/devappserver2/wsgi_handler.py
index 5b0b367..199fa48 100644
--- a/google/appengine/tools/devappserver2/wsgi_handler.py
+++ b/google/appengine/tools/devappserver2/wsgi_handler.py
@@ -17,6 +17,7 @@
 """Base functionality for handling HTTP requests for built-in pages."""
 
 
+
 import re
 
 from google.appengine.tools.devappserver2 import url_handler
diff --git a/google/appengine/tools/devappserver2/wsgi_request_info.py b/google/appengine/tools/devappserver2/wsgi_request_info.py
index 0568774..3d155e7 100644
--- a/google/appengine/tools/devappserver2/wsgi_request_info.py
+++ b/google/appengine/tools/devappserver2/wsgi_request_info.py
@@ -17,6 +17,7 @@
 """Associates request state, derived from a WSGI environ, with a unique id."""
 
 
+
 import contextlib
 import random
 import string
diff --git a/google/appengine/tools/devappserver2/wsgi_request_info_test.py b/google/appengine/tools/devappserver2/wsgi_request_info_test.py
index 7533b2e..bec4a7b 100644
--- a/google/appengine/tools/devappserver2/wsgi_request_info_test.py
+++ b/google/appengine/tools/devappserver2/wsgi_request_info_test.py
@@ -17,6 +17,7 @@
 """Tests for google.apphosting.tools.devappserver2.wsgi_request_info."""
 
 
+
 import re
 import unittest
 import wsgiref.util
diff --git a/google/appengine/tools/devappserver2/wsgi_server.py b/google/appengine/tools/devappserver2/wsgi_server.py
index 464abc9..94225df 100644
--- a/google/appengine/tools/devappserver2/wsgi_server.py
+++ b/google/appengine/tools/devappserver2/wsgi_server.py
@@ -17,6 +17,7 @@
 """A WSGI server implementation using a shared thread pool."""
 
 
+
 import collections
 import errno
 import httplib
@@ -54,6 +55,7 @@
 # tries) but it would probably be better to either figure out a better
 # algorithm or make it possible for code to work with inconsistent ports.
 
+
 _PORT_0_RETRIES = 2048
 
 
diff --git a/google/appengine/tools/devappserver2/wsgi_server_test.py b/google/appengine/tools/devappserver2/wsgi_server_test.py
index cf57fdb..efc797f 100644
--- a/google/appengine/tools/devappserver2/wsgi_server_test.py
+++ b/google/appengine/tools/devappserver2/wsgi_server_test.py
@@ -17,6 +17,7 @@
 """Tests for google.appengine.tools.devappserver2.wsgi_server."""
 
 
+
 import errno
 import json
 import select
diff --git a/google/appengine/tools/devappserver2/wsgi_test_utils.py b/google/appengine/tools/devappserver2/wsgi_test_utils.py
index d5767ca..42d94d2 100644
--- a/google/appengine/tools/devappserver2/wsgi_test_utils.py
+++ b/google/appengine/tools/devappserver2/wsgi_test_utils.py
@@ -17,6 +17,7 @@
 """Utilities for testing WSGI apps."""
 
 
+
 import cStringIO
 import unittest
 import wsgiref.headers
diff --git a/google/appengine/tools/docker/containers.py b/google/appengine/tools/docker/containers.py
index 9479b5c..a750d92 100644
--- a/google/appengine/tools/docker/containers.py
+++ b/google/appengine/tools/docker/containers.py
@@ -32,10 +32,10 @@
 """
 
 from collections import namedtuple
-
 import itertools
 import json
 import logging
+import os
 import re
 import threading
 import urlparse
@@ -52,6 +52,11 @@
 _STREAM = 'stream'
 
 
+_cleanup_scheduled = None
+_cleanup_scheduled_lock = threading.Lock()
+_cleanup_lock = threading.Lock()
+
+
 class ImageOptions(namedtuple('ImageOptionsT',
                               ['dockerfile_dir', 'tag', 'nocache', 'rm'])):
   """Options for building Docker Images."""
@@ -82,11 +87,12 @@
 class ContainerOptions(namedtuple('ContainerOptionsT',
                                   ['image_opts', 'port', 'port_bindings',
                                    'environment', 'volumes', 'volumes_from',
-                                   'name'])):
+                                   'links', 'name', 'command'])):
   """Options for creating and running Docker Containers."""
 
   def __new__(cls, image_opts=None, port=None, port_bindings=None,
-              environment=None, volumes=None, volumes_from=None, name=None):
+              environment=None, volumes=None, volumes_from=None, links=None,
+              name=None, command=None):
     """This method is redefined to provide default values for namedtuple.
 
     Args:
@@ -100,7 +106,9 @@
       environment: dict, Environment variables.
       volumes: dict,  Volumes to mount from the host system.
       volumes_from: list, Volumes from the specified container(s).
+      links: dict, Links to the specified container(s).
       name: str, Name of a container. Needed for data containers.
+      command: str, The command to execute within the container.
 
     Returns:
       ContainerOptions object.
@@ -108,7 +116,7 @@
     return super(ContainerOptions, cls).__new__(
         cls, image_opts=image_opts, port=port, port_bindings=port_bindings,
         environment=environment, volumes=volumes, volumes_from=volumes_from,
-        name=name)
+        name=name, links=links, command=command)
 
 
 class Error(Exception):
@@ -138,22 +146,11 @@
           Docker daemon.
       image_opts: an instance of ImageOptions class describing the parameters
           passed to docker commands.
-
-    Raises:
-      DockerDaemonConnectionError: If the docker daemon isn't responding.
     """
     self._docker_client = docker_client
     self._image_opts = image_opts
     self._id = None
 
-    try:
-      self._docker_client.ping()
-    except requests.exceptions.ConnectionError:
-      raise DockerDaemonConnectionError(
-          'Couldn\'t connect to the docker daemon at %s. Please check that '
-          'the docker daemon is running and that you have specified the '
-          'correct docker host.' % self._docker_client.base_url)
-
   def Build(self):
     """Calls "docker build" if needed."""
     raise NotImplementedError
@@ -234,7 +231,7 @@
       if not lines:
         return ''
       return ('Full Image Build Log:\n%s' %
-              ''.join(l.get(_STREAM) for l in lines))
+              ''.join(l.get(_STREAM, '') for l in lines))
 
     success_message = log_lines[-1].get(_STREAM)
     if success_message:
@@ -268,16 +265,8 @@
 
   def Remove(self):
     """Calls "docker rmi"."""
-    if self._id:
-      try:
-        self._docker_client.remove_image(self.id)
-      except docker.errors.APIError as e:
-        logging.warning('Image %s (id=%s) cannot be removed: %s. Try cleaning '
-                        'up old containers that can be listed with '
-                        '"docker ps -a" and removing the image again with '
-                        '"docker rmi IMAGE_ID".',
-                        self.tag, self.id, e)
-      self._id = None
+    # This will be done automatically by the cleanup.
+    self._id = None
 
 
 class PrebuiltImage(BaseImage):
@@ -352,6 +341,102 @@
   return parsed_url.hostname
 
 
+def _GetAllLingeringContainersInfo(docker_client, prefix):
+  """Lists all the stopped App engine containers.
+
+  Args:
+    docker_client: an object of docker.Client class to communicate with a
+        Docker daemon.
+    prefix: str, the container name prefix we are looking for.
+
+  Returns:
+    A list of container_info dictionaries.
+  """
+  all_containers = docker_client.containers(all=True)
+  # We roundtrip to the client as 'Status' is only a human readable string.
+  live_containers_ids = [container_info['Id']
+                         for container_info in docker_client.containers(
+                             quiet=True, all=False)]
+
+  def IsPrefixedAndStopped(cinfo):
+    return any(
+        name.startswith('/' + prefix)
+        for name in cinfo['Names']) and cinfo['Id'] not in live_containers_ids
+
+  return filter(IsPrefixedAndStopped, all_containers)
+
+
+def StartDelayedCleanup(docker_client, prefix, delay_sec,
+                        old_instances_to_spare=0):
+  """Start later a cleanup of the stopped containers with a prefix.
+
+  Args:
+    docker_client: an object of docker.Client class to communicate with a
+      Docker daemon.
+    prefix: str, the container name prefix we want to cleanup.
+    delay_sec: The delay before we trigger it.
+    old_instances_to_spare: leave at least this amount of old containers.
+  """
+  global _cleanup_scheduled
+  with _cleanup_scheduled_lock:
+    if not _cleanup_scheduled:
+      _cleanup_scheduled = threading.Timer(
+          delay_sec, _CleanupOldContainersAndImagesWithPrefix,
+          [docker_client, prefix, old_instances_to_spare])
+      _cleanup_scheduled.daemon = True
+      _cleanup_scheduled.start()
+
+
+def _CleanupOldContainersAndImagesWithPrefix(docker_client, prefix,
+                                             containers_to_keep=0):
+  """Remove Old App Engine unused containers and images.
+
+  Args:
+    docker_client: an object of docker.Client class to communicate with a
+        Docker daemon.
+    prefix: str, the container name prefix we are looking for.
+    containers_to_keep: leave at least this amount of old containers.
+  """
+  global _cleanup_scheduled
+  # Directly at the beginning of the cleanup we can authorize the scheduling of
+  # another cleanup.
+  with _cleanup_scheduled_lock:
+    _cleanup_scheduled = None
+
+  with _cleanup_lock:
+    logging.debug('Automatic cleanup...')
+    stopped_containers = _GetAllLingeringContainersInfo(
+        docker_client, prefix)
+    by_creation = lambda container_info: container_info['Created']
+    stopped_containers.sort(key=by_creation)
+    to_remove = stopped_containers[:-containers_to_keep]
+    for container in to_remove:
+      try:
+        logging.debug('Removing old container: %s:%s',
+                      container['Id'], container['Names'])
+        docker_client.remove_container(container)
+      except docker.errors.APIError as e:
+        logging.warning('Container %s (id=%s) cannot be removed: %s.\n'
+                        'Try cleaning up old containers manually.\n'
+                        'They can be listed with "docker ps -a".',
+                        container['Names'], container['Id'], e)
+      else:
+        try:
+          img = container['Image']
+          if [cinfo for cinfo in docker_client.containers(all=True)
+              if cinfo['Image'] == img]:
+            # another container derived from this image, clean it up later.
+            continue
+          logging.debug('Removing old image: %s', img)
+          docker_client.remove_image(img)
+        except docker.errors.APIError as e:
+          logging.warning('Image Id %s cannot be removed: %s.\n'
+                          'Try cleaning up old images manually.\n'
+                          'They can be listed with "docker images".',
+                          container['Image'], e)
+    logging.debug('Cleanup finished.')
+
+
 class Container(object):
   """Docker Container."""
 
@@ -370,7 +455,6 @@
     self._id = None
     self._host = GetDockerHost(self._docker_client)
     self._container_host = None
-    self._port = None
     # Port bindings will be set to a dictionary mapping exposed ports
     # to the interface they are bound to. This will be populated from
     # the container options passed when the container is started.
@@ -390,64 +474,68 @@
     if self.id:
       raise ContainerError('Trying to start already running container.')
 
-    self._image.Build()
+    # don't concurrently create and cleanup
+    with _cleanup_lock:
+      self._image.Build()
 
-    logging.info('Creating container...')
-    port_bindings = self._container_opts.port_bindings or {}
-    if self._container_opts.port:
-      # Add primary port to port bindings if not already specified.
-      # Setting its value to None lets docker pick any available port.
-      port_bindings[self._container_opts.port] = port_bindings.get(
-          self._container_opts.port)
+      logging.info('Creating container...')
+      port_bindings = self._container_opts.port_bindings or {}
+      if self._container_opts.port:
+        # Add primary port to port bindings if not already specified.
+        # Setting its value to None lets docker pick any available port.
+        port_bindings[self._container_opts.port] = port_bindings.get(
+            self._container_opts.port)
 
-    self._id = self._docker_client.create_container(
-        image=self._image.id, hostname=None, user=None, detach=True,
-        stdin_open=False,
-        tty=False, mem_limit=0,
-        ports=port_bindings.keys(),
-        volumes=(self._container_opts.volumes.keys()
-                 if self._container_opts.volumes else None),
-        environment=self._container_opts.environment,
-        dns=None,
-        network_disabled=False,
-        name=self.name)
-    # create_container returns a dict sometimes.
-    if isinstance(self.id, dict):
-      self._id = self.id.get('Id')
-    logging.info('Container %s created.', self.id)
+      response = self._docker_client.create_container(
+          image=self._image.id, hostname=None, user=None, detach=True,
+          command=self._container_opts.command,
+          stdin_open=False,
+          tty=False, mem_limit=0,
+          ports=port_bindings.keys(),
+          volumes=(self._container_opts.volumes.keys()
+                   if self._container_opts.volumes else None),
+          environment=self._container_opts.environment,
+          dns=None,
+          network_disabled=False,
+          name=self.name)
 
-    self._docker_client.start(
-        self.id,
-        port_bindings=port_bindings,
-        binds=self._container_opts.volumes,
-        # In the newer API version volumes_from got moved from
-        # create_container to start. In older version volumes_from option was
-        # completely broken therefore we support only passing volumes_from
-        # in start.
-        volumes_from=self._container_opts.volumes_from)
+      self._id = response.get('Id')
+      warnings = response.get('Warnings')
+      if warnings:
+        logging.warning(warnings)
 
-    self._logs_listener.start()
+      logging.info('Container %s created.', self.id)
 
-    if not port_bindings:
-      # Nothing to inspect
-      return
+      self._docker_client.start(
+          self.id,
+          port_bindings=port_bindings,
+          binds=self._container_opts.volumes,
+          links=self._container_opts.links,
+          # In the newer API version volumes_from got moved from
+          # create_container to start. In older version volumes_from option was
+          # completely broken therefore we support only passing volumes_from
+          # in start.
+          volumes_from=self._container_opts.volumes_from)
 
-    container_info = self._docker_client.inspect_container(self._id)
-    network_settings = container_info['NetworkSettings']
-    self._container_host = network_settings['IPAddress']
-    self._port_bindings = {
-        port: int(network_settings['Ports']['%d/tcp' % port][0]['HostPort'])
-        for port in port_bindings
-    }
+      self._logs_listener.start()
+
+      if not port_bindings:
+        # Nothing to inspect
+        return
+
+      container_info = self._docker_client.inspect_container(self._id)
+      network_settings = container_info['NetworkSettings']
+      self._container_host = network_settings['IPAddress']
+      self._port_bindings = {
+          port: int(network_settings['Ports']['%d/tcp' % port][0]['HostPort'])
+          for port in port_bindings
+      }
 
   def Stop(self):
     """Stops a running container, removes it and underlying image if needed."""
     if self._id:
       self._docker_client.kill(self.id)
-      self._docker_client.remove_container(self.id, v=False,
-                                           link=False)
       self._id = None
-      self._image.Remove()
 
   def PortBinding(self, port):
     """Get the host binding of a container port.
@@ -516,3 +604,65 @@
   def __del__(self):
     """Makes sure that all build and run artifacts are cleaned up."""
     self.Stop()
+
+
+def _KwargsFromEnv():
+  """Helper to build docker.Client constructor kwargs from the environment."""
+  host = os.environ.get('DOCKER_HOST')
+  cert_path = os.environ.get('DOCKER_CERT_PATH')
+  tls_verify = os.environ.get('DOCKER_TLS_VERIFY')
+  logging.debug('Detected docker environment variables: DOCKER_HOST=%s, '
+                'DOCKER_CERT_PATH=%s, DOCKER_TLS_VERIFY=%s', host, cert_path,
+                tls_verify)
+
+  params = {}
+  if host:
+    params['base_url'] = (host.replace('tcp://', 'https://') if tls_verify
+                          else host)
+  if tls_verify and cert_path:
+    # assert_hostname=False is needed for boot2docker to work with our custom
+    # registry.
+    params['tls'] = docker.docker.tls.TLSConfig(
+        client_cert=(os.path.join(cert_path, 'cert.pem'),
+                     os.path.join(cert_path, 'key.pem')),
+        ca_cert=os.path.join(cert_path, 'ca.pem'),
+        verify=True,
+        ssl_version=None,
+        assert_hostname=False)
+  return params
+
+
+def NewDockerClient(**kwargs):
+  """Factory method for building a docker.Client from environment variables.
+
+  Args:
+    **kwargs: Any kwargs will be passed to the docker.Client constructor and
+      override any determined from the environment.
+
+  Returns:
+    A docker.Client instance.
+
+  Raises:
+    DockerDaemonConnectionError: If the docker daemon isn't responding.
+  """
+  kwargs_from_env = _KwargsFromEnv()
+  kwargs_from_env.update(kwargs)
+  if 'base_url' not in kwargs_from_env:
+    raise DockerDaemonConnectionError(
+        'Couldn\'t connect to the docker daemon because the required '
+        'environment variables were not set. Please check the environment '
+        'variables DOCKER_HOST, DOCKER_CERT_PATH and DOCKER_TLS_VERIFY are set '
+        'correctly. If you are using boot2docker, make sure you have run '
+        '"$(boot2docker shellinit)"')
+  client = docker.Client(**kwargs_from_env)
+  try:
+    client.ping()
+  except requests.exceptions.ConnectionError:
+    raise DockerDaemonConnectionError(
+        'Couldn\'t connect to the docker daemon using the specified '
+        'environment variables. Please check the environment variables '
+        'DOCKER_HOST, DOCKER_CERT_PATH and DOCKER_TLS_VERIFY are set '
+        'correctly. If you are using boot2docker, make sure you have run '
+        '"$(boot2docker shellinit)"')
+  return client
+
diff --git a/google/appengine/tools/download_appstats.py b/google/appengine/tools/download_appstats.py
index 9c0dbbb..e9ffc5b 100644
--- a/google/appengine/tools/download_appstats.py
+++ b/google/appengine/tools/download_appstats.py
@@ -24,6 +24,7 @@
 
 
 
+
 from google.appengine.tools import os_compat
 
 import getpass
diff --git a/google/appengine/tools/endpointscfg.py b/google/appengine/tools/endpointscfg.py
index ade4fcf..e318901 100644
--- a/google/appengine/tools/endpointscfg.py
+++ b/google/appengine/tools/endpointscfg.py
@@ -45,6 +45,7 @@
 from __future__ import with_statement
 
 
+
 import argparse
 import collections
 import contextlib
diff --git a/google/appengine/tools/indexes_xml_parser.py b/google/appengine/tools/indexes_xml_parser.py
deleted file mode 100644
index 8ae3a31..0000000
--- a/google/appengine/tools/indexes_xml_parser.py
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2007 Google Inc.
-#
-# 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.
-#
-"""Directly processes text of datastore-indexes.xml.
-
-IndexesXmlParser is called with an XML string to produce an IndexXml object
-containing the data from the XML.
-
-IndexesXmlParser: converts XML to Index object.
-Index: describes a single index specified in datastore-indexes.xml
-"""
-
-from collections import OrderedDict
-from xml.etree import ElementTree
-
-from google.appengine.tools.app_engine_config_exception import AppEngineConfigException
-
-MISSING_KIND = '<datastore-index> node has missing attribute "kind".'
-BAD_DIRECTION = ('<property> tag attribute "direction" must have value "asc"'
-                 ' or "desc", given "%s"')
-NAME_MISSING = ('<datastore-index> node with kind "%s" needs to have a name'
-                ' attribute specified for its <property> node')
-
-
-def MakeIndexesListIntoYaml(indexes_list):
-  """Converts a list of parsed <datastore-index> clauses into YAML."""
-  statements = ['indexes:']
-  for index in indexes_list:
-    statements += index.ToYaml()
-  return '\n'.join(statements) + '\n'
-
-
-class IndexesXmlParser(object):
-  """Provides logic for walking down XML tree and pulling data."""
-
-  def ProcessXml(self, xml_str):
-    """Parses XML string and returns object representation of relevant info.
-
-    Args:
-      xml_str: The XML string.
-    Returns:
-      A list of Index objects containing information about datastore indexes
-      from the XML.
-    Raises:
-      AppEngineConfigException: In case of malformed XML or illegal inputs.
-    """
-
-    try:
-      self.indexes = []
-      self.errors = []
-      xml_root = ElementTree.fromstring(xml_str)
-      if xml_root.tag != 'datastore-indexes':
-        raise AppEngineConfigException('Root tag must be <datastore-indexes>')
-
-      for child in xml_root.getchildren():
-        self.ProcessIndexNode(child)
-
-      if self.errors:
-        raise AppEngineConfigException('\n'.join(self.errors))
-
-      return self.indexes
-    except ElementTree.ParseError as e:
-      raise AppEngineConfigException('Bad input -- not valid XML: %s' % e)
-
-  def ProcessIndexNode(self, node):
-    """Processes XML <datastore-index> nodes into Index objects.
-
-    The following information is parsed out:
-    kind: specifies the kind of entities to index.
-    ancestor: true if the index supports queries that filter by
-      ancestor-key to constraint results to a single entity group.
-    property: represents the entity properties to index, with a name
-      and direction attribute.
-
-    Args:
-      node: <datastore-index> XML node in datastore-indexes.xml.
-    """
-    if node.tag != 'datastore-index':
-      self.errors.append('Unrecognized node: <%s>' % node.tag)
-      return
-
-    index = Index()
-    index.kind = node.attrib.get('kind', '')
-    if not index.kind:
-      self.errors.append(MISSING_KIND)
-    ancestor = node.attrib.get('ancestor', 'false')
-    index.ancestor = self._BooleanAttribute(ancestor)
-    if index.ancestor is None:
-      self.errors.append(
-          'Value for ancestor should be true or false, not "%s"' % ancestor)
-    index.properties = OrderedDict()
-    property_nodes = [n for n in node.getchildren() if n.tag == 'property']
-    for property_node in property_nodes:
-      name = property_node.attrib.get('name', '')
-      if not name:
-        self.errors.append(NAME_MISSING % index.kind)
-        continue
-
-      direction = property_node.attrib.get('direction', 'asc')
-      if direction not in ('asc', 'desc'):
-        self.errors.append(BAD_DIRECTION % direction)
-        continue
-      index.properties[name] = direction
-    self.indexes.append(index)
-
-  @staticmethod
-  def _BooleanAttribute(value):
-    """Parse the given attribute value as a Boolean value.
-
-    This follows the specification here:
-    http://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/datatypes.html#boolean
-
-    Args:
-      value: the value to parse.
-
-    Returns:
-      True if the value parses as true, False if it parses as false, None if it
-      parses as neither.
-    """
-    if value in ['true', '1']:
-      return True
-    elif value in ['false', '0']:
-      return False
-    else:
-      return None
-
-
-class Index(object):
-
-  def ToYaml(self):
-    statements = ['- kind: "%s"' % self.kind]
-    if self.ancestor:
-      statements.append('  ancestor: yes')
-    if self.properties:
-      statements.append('  properties:')
-      for name in self.properties:
-        statements += ['  - name: "%s"' % name,
-                       '    direction: %s' % self.properties[name]]
-    return statements
diff --git a/google/appengine/tools/jarfile.py b/google/appengine/tools/jarfile.py
index 88caa50..26c387b 100644
--- a/google/appengine/tools/jarfile.py
+++ b/google/appengine/tools/jarfile.py
@@ -26,6 +26,7 @@
 from __future__ import with_statement
 
 
+
 import os
 import sys
 import zipfile
diff --git a/google/appengine/tools/java_quickstart.py b/google/appengine/tools/java_quickstart.py
new file mode 100644
index 0000000..b3aaa54
--- /dev/null
+++ b/google/appengine/tools/java_quickstart.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# 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.
+#
+"""Handles the generation of quickstart-web.xml based on servlet annotations."""
+
+from __future__ import with_statement
+
+import os
+import subprocess
+
+from google.appengine.tools import java_utils
+
+
+_QUICKSTART_JAR_PATH = os.path.join(
+    'google', 'appengine', 'javamanagedvm', 'appengine-java-vmruntime',
+    'quickstartgenerator.jar')
+
+
+def quickstart_generator(war_path, sdk_root=None):
+  """Run the quickstart-web.xml generator on the given Java app.
+
+  If the generator succeeds in creating quickstart-web.xml, this method returns
+  its contents. Otherwise, it raises RuntimeError. If there was already a
+  quickstart-web.xml when this method started, it is removed before generation
+  is attempted.
+
+  Args:
+    war_path: a string that is the path to a Java app. It should name a
+      directory that contains a WEB-INF subdirectory.
+    sdk_root: a string that is the path to an App Engine SDK with Java support.
+
+  Returns:
+    a string that is the contents of the generated quickstart-web.xml.
+
+  Raises:
+    CalledProcessError: if the quickstart generation fails.
+    IOError: if the quickstart generation apparently succeeds but the
+      quickstart-web.xml file is not created. (This should not happen.)
+  """
+  if not sdk_root:
+    sdk_root = os.path.dirname(os.path.dirname(
+        os.path.dirname(os.path.dirname(java_utils.__file__))))
+
+  quickstart_xml_path = os.path.join(war_path, 'WEB-INF', 'quickstart-web.xml')
+  if os.path.exists(quickstart_xml_path):
+    os.remove(quickstart_xml_path)
+
+  java_home, exec_suffix = java_utils.JavaHomeAndSuffix()
+  java_command = os.path.join(java_home, 'bin', 'java') + exec_suffix
+
+  quickstartgenerator_jar = os.path.join(sdk_root, _QUICKSTART_JAR_PATH)
+  command = [java_command, '-jar', quickstartgenerator_jar, war_path]
+  subprocess.check_call(command)
+
+  with open(quickstart_xml_path) as f:
+    return f.read()
diff --git a/google/appengine/tools/java_utils.py b/google/appengine/tools/java_utils.py
new file mode 100644
index 0000000..21cafad
--- /dev/null
+++ b/google/appengine/tools/java_utils.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# 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.
+#
+"""Utilities for handling Java code."""
+
+import os
+
+
+def JavaHomeAndSuffix():
+  """Find the directory that the JDK is installed in.
+
+  The JDK install directory is expected to have a bin directory that contains
+  at a minimum the java and javac executables. If the environment variable
+  JAVA_HOME is set then it must point to such a directory. Otherwise, we look
+  for javac on the PATH and check that it is inside a JDK install directory.
+
+  Returns:
+    A tuple where the first element is the JDK install directory and the second
+    element is a suffix that must be appended to executables in that directory
+    ('' on Unix-like systems, '.exe' on Windows).
+
+  Raises:
+    RuntimeError: If JAVA_HOME is set but is not a JDK install directory, or
+    otherwise if a JDK install directory cannot be found based on the PATH.
+  """
+  def ResultForJdkAt(path):
+    """Return (path, suffix) if path is a JDK install directory, else None."""
+    def IsExecutable(binary):
+      return os.path.isfile(binary) and os.access(binary, os.X_OK)
+
+    def ResultFor(path):
+      for suffix in ['', '.exe']:
+        if all(IsExecutable(os.path.join(path, 'bin', binary + suffix))
+               for binary in ['java', 'javac', 'jar']):
+          return (path, suffix)
+      return None
+
+    result = ResultFor(path)
+    if not result:
+
+
+      head, tail = os.path.split(path)
+      if tail == 'jre':
+        result = ResultFor(head)
+    return result
+
+  java_home = os.getenv('JAVA_HOME')
+  if java_home:
+    result = ResultForJdkAt(java_home)
+    if result:
+      return result
+    else:
+      raise RuntimeError(
+          'JAVA_HOME is set but does not reference a valid JDK: %s' % java_home)
+  for path_dir in os.environ['PATH'].split(os.pathsep):
+    maybe_root, last = os.path.split(path_dir)
+    if last == 'bin':
+      result = ResultForJdkAt(maybe_root)
+      if result:
+        return result
+  raise RuntimeError('Did not find JDK in PATH and JAVA_HOME is not set')
diff --git a/google/appengine/tools/old_dev_appserver.py b/google/appengine/tools/old_dev_appserver.py
index c8b1e92..5491a59 100644
--- a/google/appengine/tools/old_dev_appserver.py
+++ b/google/appengine/tools/old_dev_appserver.py
@@ -33,6 +33,7 @@
 
 
 
+
 from google.appengine.tools import os_compat
 
 import __builtin__
@@ -3668,8 +3669,6 @@
         'images',
         images_stub.ImagesServiceStub(host_prefix=host_prefix))
   except ImportError, e:
-    logging.warning('Could not initialize images API; you are likely missing '
-                    'the Python "PIL" module. ImportError: %s', e)
 
     from google.appengine.api.images import images_not_implemented_stub
     apiproxy_stub_map.apiproxy.RegisterStub(
diff --git a/google/appengine/tools/os_compat.py b/google/appengine/tools/os_compat.py
index 50a8ed5..057d600 100644
--- a/google/appengine/tools/os_compat.py
+++ b/google/appengine/tools/os_compat.py
@@ -30,6 +30,7 @@
 
 
 
+
 import os
 os.environ['TZ'] = 'UTC'
 import time
diff --git a/google/appengine/tools/php_cli.py b/google/appengine/tools/php_cli.py
index e5e16c4..ac187d4 100644
--- a/google/appengine/tools/php_cli.py
+++ b/google/appengine/tools/php_cli.py
@@ -17,6 +17,7 @@
 """Invoke PHP after setting up the App Engine environment."""
 
 
+
 import argparse
 import os
 import subprocess
diff --git a/google/appengine/tools/remote_api_shell.py b/google/appengine/tools/remote_api_shell.py
index 5d621a0..1815872 100644
--- a/google/appengine/tools/remote_api_shell.py
+++ b/google/appengine/tools/remote_api_shell.py
@@ -25,6 +25,7 @@
 
 
 
+
 from google.appengine.tools import os_compat
 
 import atexit
diff --git a/google/appengine/tools/requeue.py b/google/appengine/tools/requeue.py
index db571fc..02e90f5 100644
--- a/google/appengine/tools/requeue.py
+++ b/google/appengine/tools/requeue.py
@@ -17,6 +17,7 @@
 """A thread-safe queue in which removed objects put back to the front."""
 
 
+
 import logging
 import Queue
 import threading
diff --git a/google/net/proto/ProtocolBuffer.py b/google/net/proto/ProtocolBuffer.py
index 9a75220..a50159b 100644
--- a/google/net/proto/ProtocolBuffer.py
+++ b/google/net/proto/ProtocolBuffer.py
@@ -18,6 +18,25 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 import array
 import httplib
 import re
@@ -51,16 +70,32 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
   def __init__(self, contents=None):
+
+
     raise NotImplementedError
 
   def Clear(self):
+
+
     raise NotImplementedError
 
   def IsInitialized(self, debug_strs=None):
+
     raise NotImplementedError
 
   def Encode(self):
+
     try:
       return self._CEncode()
     except NotImplementedError:
@@ -69,9 +104,13 @@
       return e.buffer().tostring()
 
   def SerializeToString(self):
+
     return self.Encode()
 
   def SerializePartialToString(self):
+
+
+
     try:
       return self._CEncodePartial()
     except (NotImplementedError, AttributeError):
@@ -80,26 +119,44 @@
       return e.buffer().tostring()
 
   def _CEncode(self):
+
+
+
+
+
+
+
     raise NotImplementedError
 
   def _CEncodePartial(self):
+
     raise NotImplementedError
 
   def ParseFromString(self, s):
+
+
+
     self.Clear()
     self.MergeFromString(s)
 
   def ParsePartialFromString(self, s):
+
+
     self.Clear()
     self.MergePartialFromString(s)
 
   def MergeFromString(self, s):
+
+
+
     self.MergePartialFromString(s)
     dbg = []
     if not self.IsInitialized(dbg):
       raise ProtocolBufferDecodeError, '\n\t'.join(dbg)
 
   def MergePartialFromString(self, s):
+
+
     try:
       self._CMergeFromString(s)
     except NotImplementedError:
@@ -111,16 +168,44 @@
       self.TryMerge(d)
 
   def _CMergeFromString(self, s):
+
+
+
+
+
+
+
+
+
     raise NotImplementedError
 
   def __getstate__(self):
+
+
     return self.Encode()
 
   def __setstate__(self, contents_):
+
+
     self.__init__(contents=contents_)
 
   def sendCommand(self, server, url, response, follow_redirects=1,
                   secure=0, keyfile=None, certfile=None):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
     data = self.Encode()
     if secure:
       if keyfile and certfile:
@@ -152,20 +237,45 @@
 
   def sendSecureCommand(self, server, keyfile, certfile, url, response,
                         follow_redirects=1):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
     return self.sendCommand(server, url, response,
                             follow_redirects=follow_redirects,
                             secure=1, keyfile=keyfile, certfile=certfile)
 
   def __str__(self, prefix="", printElemNumber=0):
+
     raise NotImplementedError
 
   def ToASCII(self):
+
     return self._CToASCII(ProtocolMessage._SYMBOLIC_FULL_ASCII)
 
   def ToCompactASCII(self):
+
+
+
+
     return self._CToASCII(ProtocolMessage._NUMERIC_ASCII)
 
   def ToShortASCII(self):
+
+
+
+
     return self._CToASCII(ProtocolMessage._SYMBOLIC_SHORT_ASCII)
 
 
@@ -175,15 +285,32 @@
   _SYMBOLIC_FULL_ASCII = 2
 
   def _CToASCII(self, output_format):
+
+
+
+
+
     raise NotImplementedError
 
   def ParseASCII(self, ascii_string):
+
+
+
+
     raise NotImplementedError
 
   def ParseASCIIIgnoreUnknown(self, ascii_string):
+
+
+
+
     raise NotImplementedError
 
   def Equals(self, other):
+
+
+
+
     raise NotImplementedError
 
   def __eq__(self, other):
@@ -192,6 +319,7 @@
 
 
 
+
     if other.__class__ is self.__class__:
       return self.Equals(other)
     return NotImplemented
@@ -202,6 +330,7 @@
 
 
 
+
     if other.__class__ is self.__class__:
       return not self.Equals(other)
     return NotImplemented
@@ -211,6 +340,7 @@
 
 
   def Output(self, e):
+
     dbg = []
     if not self.IsInitialized(dbg):
       raise ProtocolBufferEncodeError, '\n\t'.join(dbg)
@@ -218,17 +348,22 @@
     return
 
   def OutputUnchecked(self, e):
+
     raise NotImplementedError
 
   def OutputPartial(self, e):
+
+
     raise NotImplementedError
 
   def Parse(self, d):
+
     self.Clear()
     self.Merge(d)
     return
 
   def Merge(self, d):
+
     self.TryMerge(d)
     dbg = []
     if not self.IsInitialized(dbg):
@@ -236,14 +371,17 @@
     return
 
   def TryMerge(self, d):
+
     raise NotImplementedError
 
   def CopyFrom(self, pb):
+
     if (pb == self): return
     self.Clear()
     self.MergeFrom(pb)
 
   def MergeFrom(self, pb):
+
     raise NotImplementedError
 
 
@@ -680,15 +818,29 @@
 
 class ExtendableProtocolMessage(ProtocolMessage):
   def HasExtension(self, extension):
+
     self._VerifyExtensionIdentifier(extension)
     return extension in self._extension_fields
 
   def ClearExtension(self, extension):
+
+
     self._VerifyExtensionIdentifier(extension)
     if extension in self._extension_fields:
       del self._extension_fields[extension]
 
   def GetExtension(self, extension, index=None):
+
+
+
+
+
+
+
+
+
+
+
     self._VerifyExtensionIdentifier(extension)
     if extension in self._extension_fields:
       result = self._extension_fields[extension]
@@ -704,6 +856,22 @@
     return result
 
   def SetExtension(self, extension, *args):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
     self._VerifyExtensionIdentifier(extension)
     if extension.composite_cls:
       raise TypeError(
@@ -726,6 +894,23 @@
       self._extension_fields[extension] = value
 
   def MutableExtension(self, extension, index=None):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
     self._VerifyExtensionIdentifier(extension)
     if extension.composite_cls is None:
       raise TypeError(
@@ -745,6 +930,11 @@
       return result
 
   def ExtensionList(self, extension):
+
+
+
+
+
     self._VerifyExtensionIdentifier(extension)
     if not extension.is_repeated:
       raise TypeError(
@@ -757,6 +947,11 @@
     return result
 
   def ExtensionSize(self, extension):
+
+
+
+
+
     self._VerifyExtensionIdentifier(extension)
     if not extension.is_repeated:
       raise TypeError(
@@ -767,6 +962,27 @@
     return 0
 
   def AddExtension(self, extension, value=None):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
     self._VerifyExtensionIdentifier(extension)
     if not extension.is_repeated:
       raise TypeError(
@@ -833,6 +1049,31 @@
 
   def _OutputExtensionFields(self, out, partial, extensions, start_index,
                              end_field_number):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
     def OutputSingleField(ext, value):
       out.putVarInt32(ext.wire_tag)
       if ext.field_type == TYPE_GROUP:
diff --git a/google/net/proto/RawMessage.py b/google/net/proto/RawMessage.py
index 5de4d1d..06d85ce 100644
--- a/google/net/proto/RawMessage.py
+++ b/google/net/proto/RawMessage.py
@@ -25,6 +25,7 @@
 
 """
 
+
 __pychecker__ = 'no-callinit no-argsused'
 
 from google.net.proto import ProtocolBuffer
diff --git a/google/net/proto/message_set.py b/google/net/proto/message_set.py
index 7410aea..9a9bfd5 100644
--- a/google/net/proto/message_set.py
+++ b/google/net/proto/message_set.py
@@ -48,6 +48,12 @@
 
 class Item:
 
+
+
+
+
+
+
   def __init__(self, message, message_class=None):
     self.message = message
     self.message_class = message_class
@@ -58,6 +64,7 @@
 
   def Parse(self, message_class):
 
+
     if self.message_class is not None:
       return 1
 
@@ -74,6 +81,10 @@
 
   def MergeFrom(self, other):
 
+
+
+
+
     if self.message_class is not None:
       if other.Parse(self.message_class):
         self.message.MergeFrom(other.message)
@@ -92,6 +103,7 @@
 
   def Copy(self):
 
+
     if self.message_class is None:
       return Item(self.message)
     else:
@@ -101,6 +113,10 @@
 
   def Equals(self, other):
 
+
+
+
+
     if self.message_class is not None:
       if not other.Parse(self.message_class): return 0
       return self.message.Equals(other.message)
@@ -114,6 +130,8 @@
 
   def IsInitialized(self, debug_strs=None):
 
+
+
     if self.message_class is None:
       return 1
     else:
@@ -121,6 +139,7 @@
 
   def ByteSize(self, pb, type_id):
 
+
     message_length = 0
     if self.message_class is None:
       message_length = len(self.message)
@@ -132,6 +151,7 @@
 
   def ByteSizePartial(self, pb, type_id):
 
+
     message_length = 0
     if self.message_class is None:
       message_length = len(self.message)
@@ -143,6 +163,7 @@
 
   def OutputUnchecked(self, out, type_id):
 
+
     out.putVarInt32(TAG_TYPE_ID)
 
 
@@ -158,6 +179,8 @@
 
   def OutputPartial(self, out, type_id):
 
+
+
     out.putVarInt32(TAG_TYPE_ID)
 
 
@@ -173,6 +196,9 @@
 
   def Decode(decoder):
 
+
+
+
     type_id = 0
     message = None
     while 1:
@@ -202,7 +228,43 @@
 
 class MessageSet(ProtocolBuffer.ProtocolMessage):
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
   def __init__(self, contents=None):
+
+
     self.items = dict()
     if contents is not None: self.MergeFromString(contents)
 
@@ -211,6 +273,16 @@
 
   def get(self, message_class):
 
+
+
+
+
+
+
+
+
+
+
     if message_class.MESSAGE_TYPE_ID not in self.items:
       return message_class()
     item = self.items[message_class.MESSAGE_TYPE_ID]
@@ -221,6 +293,11 @@
 
   def mutable(self, message_class):
 
+
+
+
+
+
     if message_class.MESSAGE_TYPE_ID not in self.items:
       message = message_class()
       self.items[message_class.MESSAGE_TYPE_ID] = Item(message, message_class)
@@ -232,21 +309,42 @@
 
   def has(self, message_class):
 
+
     if message_class.MESSAGE_TYPE_ID not in self.items:
       return 0
     item = self.items[message_class.MESSAGE_TYPE_ID]
     return item.Parse(message_class)
 
   def has_unparsed(self, message_class):
+
+
+
+
+
+
     return message_class.MESSAGE_TYPE_ID in self.items
 
   def GetTypeIds(self):
+
+
+
+
+
+
     return self.items.keys()
 
   def NumMessages(self):
+
+
+
+
+
+
+
     return len(self.items)
 
   def remove(self, message_class):
+
     if message_class.MESSAGE_TYPE_ID in self.items:
       del self.items[message_class.MESSAGE_TYPE_ID]
 
@@ -279,6 +377,11 @@
 
   def MergeFrom(self, other):
 
+
+
+
+
+
     assert other is not self
 
     for (type_id, item) in other.items.items():
@@ -288,6 +391,7 @@
         self.items[type_id] = item.Copy()
 
   def Equals(self, other):
+
     if other is self: return 1
     if len(self.items) != len(other.items): return 0
 
@@ -307,6 +411,8 @@
 
   def IsInitialized(self, debug_strs=None):
 
+
+
     initialized = 1
     for item in self.items.values():
       if not item.IsInitialized(debug_strs):
@@ -314,33 +420,42 @@
     return initialized
 
   def ByteSize(self):
+
     n = 2 * len(self.items)
     for (type_id, item) in self.items.items():
       n += item.ByteSize(self, type_id)
     return n
 
   def ByteSizePartial(self):
+
+
     n = 2 * len(self.items)
     for (type_id, item) in self.items.items():
       n += item.ByteSizePartial(self, type_id)
     return n
 
   def Clear(self):
+
     self.items = dict()
 
   def OutputUnchecked(self, out):
+
     for (type_id, item) in self.items.items():
       out.putVarInt32(TAG_BEGIN_ITEM_GROUP)
       item.OutputUnchecked(out, type_id)
       out.putVarInt32(TAG_END_ITEM_GROUP)
 
   def OutputPartial(self, out):
+
+
     for (type_id, item) in self.items.items():
       out.putVarInt32(TAG_BEGIN_ITEM_GROUP)
       item.OutputPartial(out, type_id)
       out.putVarInt32(TAG_END_ITEM_GROUP)
 
   def TryMerge(self, decoder):
+
+
     while decoder.avail() > 0:
       tag = decoder.getVarInt32()
       if tag == TAG_BEGIN_ITEM_GROUP:
diff --git a/google/net/proto2/proto/descriptor_pb2.py b/google/net/proto2/proto/descriptor_pb2.py
index c8ae767..46ab898 100644
--- a/google/net/proto2/proto/descriptor_pb2.py
+++ b/google/net/proto2/proto/descriptor_pb2.py
@@ -19,6 +19,7 @@
 
 import sys
 _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+import google
 from google.net.proto2.python.public import descriptor as _descriptor
 from google.net.proto2.python.public import message as _message
 from google.net.proto2.python.public import reflection as _reflection
@@ -33,7 +34,7 @@
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='net/proto2/proto/descriptor.proto',
   package='proto2',
-  serialized_pb=_b('\n!net/proto2/proto/descriptor.proto\x12\x06proto2\">\n\x11\x46ileDescriptorSet\x12)\n\x04\x66ile\x18\x01 \x03(\x0b\x32\x1b.proto2.FileDescriptorProto\"\xa5\x03\n\x13\x46ileDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07package\x18\x02 \x01(\t\x12\x12\n\ndependency\x18\x03 \x03(\t\x12\x19\n\x11public_dependency\x18\n \x03(\x05\x12\x17\n\x0fweak_dependency\x18\x0b \x03(\x05\x12-\n\x0cmessage_type\x18\x04 \x03(\x0b\x32\x17.proto2.DescriptorProto\x12.\n\tenum_type\x18\x05 \x03(\x0b\x32\x1b.proto2.EnumDescriptorProto\x12/\n\x07service\x18\x06 \x03(\x0b\x32\x1e.proto2.ServiceDescriptorProto\x12/\n\textension\x18\x07 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12$\n\x07options\x18\x08 \x01(\x0b\x32\x13.proto2.FileOptions\x12\x30\n\x10source_code_info\x18\t \x01(\x0b\x32\x16.proto2.SourceCodeInfo\x12\x0e\n\x06syntax\x18\x0c \x01(\t\"\xa5\x03\n\x0f\x44\x65scriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12+\n\x05\x66ield\x18\x02 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12/\n\textension\x18\x06 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12,\n\x0bnested_type\x18\x03 \x03(\x0b\x32\x17.proto2.DescriptorProto\x12.\n\tenum_type\x18\x04 \x03(\x0b\x32\x1b.proto2.EnumDescriptorProto\x12?\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32&.proto2.DescriptorProto.ExtensionRange\x12\x30\n\noneof_decl\x18\x08 \x03(\x0b\x32\x1c.proto2.OneofDescriptorProto\x12\'\n\x07options\x18\x07 \x01(\x0b\x32\x16.proto2.MessageOptions\x1a,\n\x0e\x45xtensionRange\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x05\"\x8e\x05\n\x14\x46ieldDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x03 \x01(\x05\x12\x31\n\x05label\x18\x04 \x01(\x0e\x32\".proto2.FieldDescriptorProto.Label\x12/\n\x04type\x18\x05 \x01(\x0e\x32!.proto2.FieldDescriptorProto.Type\x12\x11\n\ttype_name\x18\x06 \x01(\t\x12\x10\n\x08\x65xtendee\x18\x02 \x01(\t\x12\x15\n\rdefault_value\x18\x07 \x01(\t\x12\x13\n\x0boneof_index\x18\t \x01(\x05\x12%\n\x07options\x18\x08 \x01(\x0b\x32\x14.proto2.FieldOptions\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\x12\x12\n\x0eLABEL_REPEATED\x10\x03\"$\n\x14OneofDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\"z\n\x13\x45numDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x03(\x0b\x32 .proto2.EnumValueDescriptorProto\x12$\n\x07options\x18\x03 \x01(\x0b\x32\x13.proto2.EnumOptions\"c\n\x18\x45numValueDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x02 \x01(\x05\x12)\n\x07options\x18\x03 \x01(\x0b\x32\x18.proto2.EnumValueOptions\"\xad\x01\n\x16ServiceDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12-\n\x06method\x18\x02 \x03(\x0b\x32\x1d.proto2.MethodDescriptorProto\x12-\n\x06stream\x18\x04 \x03(\x0b\x32\x1d.proto2.StreamDescriptorProto\x12\'\n\x07options\x18\x03 \x01(\x0b\x32\x16.proto2.ServiceOptions\"v\n\x15MethodDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ninput_type\x18\x02 \x01(\t\x12\x13\n\x0boutput_type\x18\x03 \x01(\t\x12&\n\x07options\x18\x04 \x01(\x0b\x32\x15.proto2.MethodOptions\"\x87\x01\n\x15StreamDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x13\x63lient_message_type\x18\x02 \x01(\t\x12\x1b\n\x13server_message_type\x18\x03 \x01(\t\x12&\n\x07options\x18\x04 \x01(\x0b\x32\x15.proto2.StreamOptions\"\xc6\n\n\x0b\x46ileOptions\x12\x19\n\x0e\x63\x63_api_version\x18\x02 \x01(\x05:\x01\x32\x12V\n\x14\x63\x63_api_compatibility\x18\x0f \x01(\x0e\x32&.proto2.FileOptions.CompatibilityLevel:\x10NO_COMPATIBILITY\x12\'\n\x19\x63\x63_proto_array_compatible\x18\x16 \x01(\x08:\x04true\x12\"\n\x14\x63\x63_utf8_verification\x18\x18 \x01(\x08:\x04true\x12$\n\x15\x63\x63_proto1_text_format\x18\x19 \x01(\x08:\x05\x66\x61lse\x12\x14\n\x0cjava_package\x18\x01 \x01(\t\x12\x19\n\x0epy_api_version\x18\x04 \x01(\x05:\x01\x32\x12\x1b\n\x10java_api_version\x18\x05 \x01(\x05:\x01\x32\x12!\n\x13java_use_javaproto2\x18\x06 \x01(\x08:\x04true\x12\x1e\n\x10java_java5_enums\x18\x07 \x01(\x08:\x04true\x12)\n\x1ajava_generate_rpc_baseimpl\x18\r \x01(\x08:\x05\x66\x61lse\x12#\n\x14java_use_javastrings\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1c\n\x14java_alt_api_package\x18\x13 \x01(\t\x12\x34\n%java_enable_dual_generate_mutable_api\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1c\n\x14java_outer_classname\x18\x08 \x01(\t\x12\"\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lse\x12,\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08:\x05\x66\x61lse\x12%\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lse\x12\x1f\n\x10java_mutable_api\x18\x1c \x01(\x08:\x05\x66\x61lse\x12+\n#java_multiple_files_mutable_package\x18\x1d \x01(\t\x12=\n\x0coptimize_for\x18\t \x01(\x0e\x32 .proto2.FileOptions.OptimizeMode:\x05SPEED\x12\x12\n\ngo_package\x18\x0b \x01(\t\x12\x1a\n\x12javascript_package\x18\x0c \x01(\t\x12\x1a\n\x0fszl_api_version\x18\x0e \x01(\x05:\x01\x31\x12\"\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lse\x12$\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lse\x12\"\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x12\x65xperimental_style\x18\x1e \x01(\t\x12\x1f\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"c\n\x12\x43ompatibilityLevel\x12\x14\n\x10NO_COMPATIBILITY\x10\x00\x12\x15\n\x11PROTO1_COMPATIBLE\x10\x64\x12 \n\x1c\x44\x45PRECATED_PROTO1_COMPATIBLE\x10\x32\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xe4\x02\n\x0eMessageOptions\x12+\n#experimental_java_message_interface\x18\x04 \x03(\t\x12+\n#experimental_java_builder_interface\x18\x05 \x03(\t\x12+\n#experimental_java_interface_extends\x18\x06 \x03(\t\x12&\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lse\x12.\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x11\n\tmap_entry\x18\x07 \x01(\x08\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x82\x05\n\x0c\x46ieldOptions\x12\x31\n\x05\x63type\x18\x01 \x01(\x0e\x32\x1a.proto2.FieldOptions.CType:\x06STRING\x12\x0e\n\x06packed\x18\x02 \x01(\x08\x12\x31\n\x05jtype\x18\x04 \x01(\x0e\x32\x1a.proto2.FieldOptions.JType:\x06NORMAL\x12\x36\n\x06jstype\x18\x06 \x01(\x0e\x32\x1b.proto2.FieldOptions.JSType:\tJS_NORMAL\x12\x13\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x13\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lse\x12<\n\x0fupgraded_option\x18\x0b \x03(\x0b\x32#.proto2.FieldOptions.UpgradedOption\x12%\n\x16\x64\x65precated_raw_message\x18\x0c \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\x1a-\n\x0eUpgradedOption\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"<\n\x05JType\x12\n\n\x06NORMAL\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\x1c\n\x18\x45XPERIMENTAL_BYTE_BUFFER\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x99\x01\n\x0b\x45numOptions\x12\x13\n\x0bproto1_name\x18\x01 \x01(\t\x12\x13\n\x0b\x61llow_alias\x18\x02 \x01(\x08\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"t\n\x10\x45numValueOptions\x12\x19\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xb6\x01\n\x0eServiceOptions\x12\x1d\n\x0emulticast_stub\x18\x14 \x01(\x08:\x05\x66\x61lse\x12#\n\x17\x66\x61ilure_detection_delay\x18\x10 \x01(\x01:\x02-1\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd3\t\n\rMethodOptions\x12\x35\n\x08protocol\x18\x07 \x01(\x0e\x32\x1e.proto2.MethodOptions.Protocol:\x03TCP\x12\x14\n\x08\x64\x65\x61\x64line\x18\x08 \x01(\x01:\x02-1\x12$\n\x15\x64uplicate_suppression\x18\t \x01(\x08:\x05\x66\x61lse\x12\x18\n\tfail_fast\x18\n \x01(\x08:\x05\x66\x61lse\x12\'\n\x18\x65nd_user_creds_requested\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0e\x63lient_logging\x18\x0b \x01(\x11:\x03\x32\x35\x36\x12\x1b\n\x0eserver_logging\x18\x0c \x01(\x11:\x03\x32\x35\x36\x12\x41\n\x0esecurity_level\x18\r \x01(\x0e\x32#.proto2.MethodOptions.SecurityLevel:\x04NONE\x12\x43\n\x0fresponse_format\x18\x0f \x01(\x0e\x32\x1c.proto2.MethodOptions.Format:\x0cUNCOMPRESSED\x12\x42\n\x0erequest_format\x18\x11 \x01(\x0e\x32\x1c.proto2.MethodOptions.Format:\x0cUNCOMPRESSED\x12\x13\n\x0bstream_type\x18\x12 \x01(\t\x12\x16\n\x0esecurity_label\x18\x13 \x01(\t\x12\x18\n\x10\x63lient_streaming\x18\x14 \x01(\x08\x12\x18\n\x10server_streaming\x18\x15 \x01(\x08\x12\x1a\n\x12legacy_stream_type\x18\x16 \x01(\t\x12\x1a\n\x12legacy_result_type\x18\x17 \x01(\t\x12(\n\x1clegacy_client_initial_tokens\x18\x18 \x01(\x03:\x02-1\x12(\n\x1clegacy_server_initial_tokens\x18\x19 \x01(\x03:\x02-1\x12^\n\tlog_level\x18\x1b \x01(\x0e\x32\x1e.proto2.MethodOptions.LogLevel:+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"\x1c\n\x08Protocol\x12\x07\n\x03TCP\x10\x00\x12\x07\n\x03UDP\x10\x01\"e\n\rSecurityLevel\x12\x08\n\x04NONE\x10\x00\x12\r\n\tINTEGRITY\x10\x01\x12\x19\n\x15PRIVACY_AND_INTEGRITY\x10\x02\x12 \n\x1cSTRONG_PRIVACY_AND_INTEGRITY\x10\x03\"0\n\x06\x46ormat\x12\x10\n\x0cUNCOMPRESSED\x10\x00\x12\x14\n\x10ZIPPY_COMPRESSED\x10\x01\"\x9f\x01\n\x08LogLevel\x12\x0c\n\x08LOG_NONE\x10\x00\x12\x13\n\x0fLOG_HEADER_ONLY\x10\x01\x12/\n+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x10\x02\x12#\n\x1fLOG_HEADER_AND_FILTERED_PAYLOAD\x10\x03\x12\x1a\n\x16LOG_HEADER_AND_PAYLOAD\x10\x04*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xe7\x04\n\rStreamOptions\x12!\n\x15\x63lient_initial_tokens\x18\x01 \x01(\x03:\x02-1\x12!\n\x15server_initial_tokens\x18\x02 \x01(\x03:\x02-1\x12<\n\ntoken_unit\x18\x03 \x01(\x0e\x32\x1f.proto2.StreamOptions.TokenUnit:\x07MESSAGE\x12\x41\n\x0esecurity_level\x18\x04 \x01(\x0e\x32#.proto2.MethodOptions.SecurityLevel:\x04NONE\x12\x16\n\x0esecurity_label\x18\x05 \x01(\t\x12\x1b\n\x0e\x63lient_logging\x18\x06 \x01(\x05:\x03\x32\x35\x36\x12\x1b\n\x0eserver_logging\x18\x07 \x01(\x05:\x03\x32\x35\x36\x12\x14\n\x08\x64\x65\x61\x64line\x18\x08 \x01(\x01:\x02-1\x12\x18\n\tfail_fast\x18\t \x01(\x08:\x05\x66\x61lse\x12\'\n\x18\x65nd_user_creds_requested\x18\n \x01(\x08:\x05\x66\x61lse\x12^\n\tlog_level\x18\x0b \x01(\x0e\x32\x1e.proto2.MethodOptions.LogLevel:+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"\"\n\tTokenUnit\x12\x0b\n\x07MESSAGE\x10\x00\x12\x08\n\x04\x42YTE\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x95\x02\n\x13UninterpretedOption\x12\x32\n\x04name\x18\x02 \x03(\x0b\x32$.proto2.UninterpretedOption.NamePart\x12\x18\n\x10identifier_value\x18\x03 \x01(\t\x12\x1a\n\x12positive_int_value\x18\x04 \x01(\x04\x12\x1a\n\x12negative_int_value\x18\x05 \x01(\x03\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x14\n\x0cstring_value\x18\x07 \x01(\x0c\x12\x17\n\x0f\x61ggregate_value\x18\x08 \x01(\t\x1a\x33\n\x08NamePart\x12\x11\n\tname_part\x18\x01 \x02(\t\x12\x14\n\x0cis_extension\x18\x02 \x02(\x08\"\xa8\x01\n\x0eSourceCodeInfo\x12\x31\n\x08location\x18\x01 \x03(\x0b\x32\x1f.proto2.SourceCodeInfo.Location\x1a\x63\n\x08Location\x12\x10\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01\x12\x10\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01\x12\x18\n\x10leading_comments\x18\x03 \x01(\t\x12\x19\n\x11trailing_comments\x18\x04 \x01(\tB,\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01\xe0\x01\x01')
+  serialized_pb=_b('\n!net/proto2/proto/descriptor.proto\x12\x06proto2\">\n\x11\x46ileDescriptorSet\x12)\n\x04\x66ile\x18\x01 \x03(\x0b\x32\x1b.proto2.FileDescriptorProto\"\xa5\x03\n\x13\x46ileDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07package\x18\x02 \x01(\t\x12\x12\n\ndependency\x18\x03 \x03(\t\x12\x19\n\x11public_dependency\x18\n \x03(\x05\x12\x17\n\x0fweak_dependency\x18\x0b \x03(\x05\x12-\n\x0cmessage_type\x18\x04 \x03(\x0b\x32\x17.proto2.DescriptorProto\x12.\n\tenum_type\x18\x05 \x03(\x0b\x32\x1b.proto2.EnumDescriptorProto\x12/\n\x07service\x18\x06 \x03(\x0b\x32\x1e.proto2.ServiceDescriptorProto\x12/\n\textension\x18\x07 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12$\n\x07options\x18\x08 \x01(\x0b\x32\x13.proto2.FileOptions\x12\x30\n\x10source_code_info\x18\t \x01(\x0b\x32\x16.proto2.SourceCodeInfo\x12\x0e\n\x06syntax\x18\x0c \x01(\t\"\xa5\x03\n\x0f\x44\x65scriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12+\n\x05\x66ield\x18\x02 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12/\n\textension\x18\x06 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12,\n\x0bnested_type\x18\x03 \x03(\x0b\x32\x17.proto2.DescriptorProto\x12.\n\tenum_type\x18\x04 \x03(\x0b\x32\x1b.proto2.EnumDescriptorProto\x12?\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32&.proto2.DescriptorProto.ExtensionRange\x12\x30\n\noneof_decl\x18\x08 \x03(\x0b\x32\x1c.proto2.OneofDescriptorProto\x12\'\n\x07options\x18\x07 \x01(\x0b\x32\x16.proto2.MessageOptions\x1a,\n\x0e\x45xtensionRange\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x05\"\x8e\x05\n\x14\x46ieldDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x03 \x01(\x05\x12\x31\n\x05label\x18\x04 \x01(\x0e\x32\".proto2.FieldDescriptorProto.Label\x12/\n\x04type\x18\x05 \x01(\x0e\x32!.proto2.FieldDescriptorProto.Type\x12\x11\n\ttype_name\x18\x06 \x01(\t\x12\x10\n\x08\x65xtendee\x18\x02 \x01(\t\x12\x15\n\rdefault_value\x18\x07 \x01(\t\x12\x13\n\x0boneof_index\x18\t \x01(\x05\x12%\n\x07options\x18\x08 \x01(\x0b\x32\x14.proto2.FieldOptions\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\x12\x12\n\x0eLABEL_REPEATED\x10\x03\"$\n\x14OneofDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\"z\n\x13\x45numDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x03(\x0b\x32 .proto2.EnumValueDescriptorProto\x12$\n\x07options\x18\x03 \x01(\x0b\x32\x13.proto2.EnumOptions\"c\n\x18\x45numValueDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x02 \x01(\x05\x12)\n\x07options\x18\x03 \x01(\x0b\x32\x18.proto2.EnumValueOptions\"\xad\x01\n\x16ServiceDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12-\n\x06method\x18\x02 \x03(\x0b\x32\x1d.proto2.MethodDescriptorProto\x12-\n\x06stream\x18\x04 \x03(\x0b\x32\x1d.proto2.StreamDescriptorProto\x12\'\n\x07options\x18\x03 \x01(\x0b\x32\x16.proto2.ServiceOptions\"v\n\x15MethodDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ninput_type\x18\x02 \x01(\t\x12\x13\n\x0boutput_type\x18\x03 \x01(\t\x12&\n\x07options\x18\x04 \x01(\x0b\x32\x15.proto2.MethodOptions\"\x87\x01\n\x15StreamDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x13\x63lient_message_type\x18\x02 \x01(\t\x12\x1b\n\x13server_message_type\x18\x03 \x01(\t\x12&\n\x07options\x18\x04 \x01(\x0b\x32\x15.proto2.StreamOptions\"\x82\x0b\n\x0b\x46ileOptions\x12\x19\n\x0e\x63\x63_api_version\x18\x02 \x01(\x05:\x01\x32\x12V\n\x14\x63\x63_api_compatibility\x18\x0f \x01(\x0e\x32&.proto2.FileOptions.CompatibilityLevel:\x10NO_COMPATIBILITY\x12\'\n\x19\x63\x63_proto_array_compatible\x18\x16 \x01(\x08:\x04true\x12\"\n\x14\x63\x63_utf8_verification\x18\x18 \x01(\x08:\x04true\x12$\n\x15\x63\x63_proto1_text_format\x18\x19 \x01(\x08:\x05\x66\x61lse\x12\x14\n\x0cjava_package\x18\x01 \x01(\t\x12\x19\n\x0epy_api_version\x18\x04 \x01(\x05:\x01\x32\x12\x1b\n\x10java_api_version\x18\x05 \x01(\x05:\x01\x32\x12!\n\x13java_use_javaproto2\x18\x06 \x01(\x08:\x04true\x12\x1e\n\x10java_java5_enums\x18\x07 \x01(\x08:\x04true\x12)\n\x1ajava_generate_rpc_baseimpl\x18\r \x01(\x08:\x05\x66\x61lse\x12#\n\x14java_use_javastrings\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1c\n\x14java_alt_api_package\x18\x13 \x01(\t\x12\x34\n%java_enable_dual_generate_mutable_api\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1c\n\x14java_outer_classname\x18\x08 \x01(\t\x12\"\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lse\x12,\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08:\x05\x66\x61lse\x12%\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lse\x12\x1f\n\x10java_mutable_api\x18\x1c \x01(\x08:\x05\x66\x61lse\x12+\n#java_multiple_files_mutable_package\x18\x1d \x01(\t\x12=\n\x0coptimize_for\x18\t \x01(\x0e\x32 .proto2.FileOptions.OptimizeMode:\x05SPEED\x12\x12\n\ngo_package\x18\x0b \x01(\t\x12\x1a\n\x12javascript_package\x18\x0c \x01(\t\x12\x1a\n\x0fszl_api_version\x18\x0e \x01(\x05:\x01\x31\x12\"\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lse\x12$\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lse\x12\"\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x12\x65xperimental_style\x18\x1e \x01(\t\x12\x1f\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x0e\x63\x63_enable_maps\x18  \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x13go_force_proto2_api\x18! \x01(\x08\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"c\n\x12\x43ompatibilityLevel\x12\x14\n\x10NO_COMPATIBILITY\x10\x00\x12\x15\n\x11PROTO1_COMPATIBLE\x10\x64\x12 \n\x1c\x44\x45PRECATED_PROTO1_COMPATIBLE\x10\x32\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xe4\x02\n\x0eMessageOptions\x12+\n#experimental_java_message_interface\x18\x04 \x03(\t\x12+\n#experimental_java_builder_interface\x18\x05 \x03(\t\x12+\n#experimental_java_interface_extends\x18\x06 \x03(\t\x12&\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lse\x12.\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x11\n\tmap_entry\x18\x07 \x01(\x08\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x82\x05\n\x0c\x46ieldOptions\x12\x31\n\x05\x63type\x18\x01 \x01(\x0e\x32\x1a.proto2.FieldOptions.CType:\x06STRING\x12\x0e\n\x06packed\x18\x02 \x01(\x08\x12\x31\n\x05jtype\x18\x04 \x01(\x0e\x32\x1a.proto2.FieldOptions.JType:\x06NORMAL\x12\x36\n\x06jstype\x18\x06 \x01(\x0e\x32\x1b.proto2.FieldOptions.JSType:\tJS_NORMAL\x12\x13\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x13\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lse\x12<\n\x0fupgraded_option\x18\x0b \x03(\x0b\x32#.proto2.FieldOptions.UpgradedOption\x12%\n\x16\x64\x65precated_raw_message\x18\x0c \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\x1a-\n\x0eUpgradedOption\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"<\n\x05JType\x12\n\n\x06NORMAL\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\x1c\n\x18\x45XPERIMENTAL_BYTE_BUFFER\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x99\x01\n\x0b\x45numOptions\x12\x13\n\x0bproto1_name\x18\x01 \x01(\t\x12\x13\n\x0b\x61llow_alias\x18\x02 \x01(\x08\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"t\n\x10\x45numValueOptions\x12\x19\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xb6\x01\n\x0eServiceOptions\x12\x1d\n\x0emulticast_stub\x18\x14 \x01(\x08:\x05\x66\x61lse\x12#\n\x17\x66\x61ilure_detection_delay\x18\x10 \x01(\x01:\x02-1\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd3\t\n\rMethodOptions\x12\x35\n\x08protocol\x18\x07 \x01(\x0e\x32\x1e.proto2.MethodOptions.Protocol:\x03TCP\x12\x14\n\x08\x64\x65\x61\x64line\x18\x08 \x01(\x01:\x02-1\x12$\n\x15\x64uplicate_suppression\x18\t \x01(\x08:\x05\x66\x61lse\x12\x18\n\tfail_fast\x18\n \x01(\x08:\x05\x66\x61lse\x12\'\n\x18\x65nd_user_creds_requested\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0e\x63lient_logging\x18\x0b \x01(\x11:\x03\x32\x35\x36\x12\x1b\n\x0eserver_logging\x18\x0c \x01(\x11:\x03\x32\x35\x36\x12\x41\n\x0esecurity_level\x18\r \x01(\x0e\x32#.proto2.MethodOptions.SecurityLevel:\x04NONE\x12\x43\n\x0fresponse_format\x18\x0f \x01(\x0e\x32\x1c.proto2.MethodOptions.Format:\x0cUNCOMPRESSED\x12\x42\n\x0erequest_format\x18\x11 \x01(\x0e\x32\x1c.proto2.MethodOptions.Format:\x0cUNCOMPRESSED\x12\x13\n\x0bstream_type\x18\x12 \x01(\t\x12\x16\n\x0esecurity_label\x18\x13 \x01(\t\x12\x18\n\x10\x63lient_streaming\x18\x14 \x01(\x08\x12\x18\n\x10server_streaming\x18\x15 \x01(\x08\x12\x1a\n\x12legacy_stream_type\x18\x16 \x01(\t\x12\x1a\n\x12legacy_result_type\x18\x17 \x01(\t\x12(\n\x1clegacy_client_initial_tokens\x18\x18 \x01(\x03:\x02-1\x12(\n\x1clegacy_server_initial_tokens\x18\x19 \x01(\x03:\x02-1\x12^\n\tlog_level\x18\x1b \x01(\x0e\x32\x1e.proto2.MethodOptions.LogLevel:+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"\x1c\n\x08Protocol\x12\x07\n\x03TCP\x10\x00\x12\x07\n\x03UDP\x10\x01\"e\n\rSecurityLevel\x12\x08\n\x04NONE\x10\x00\x12\r\n\tINTEGRITY\x10\x01\x12\x19\n\x15PRIVACY_AND_INTEGRITY\x10\x02\x12 \n\x1cSTRONG_PRIVACY_AND_INTEGRITY\x10\x03\"0\n\x06\x46ormat\x12\x10\n\x0cUNCOMPRESSED\x10\x00\x12\x14\n\x10ZIPPY_COMPRESSED\x10\x01\"\x9f\x01\n\x08LogLevel\x12\x0c\n\x08LOG_NONE\x10\x00\x12\x13\n\x0fLOG_HEADER_ONLY\x10\x01\x12/\n+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x10\x02\x12#\n\x1fLOG_HEADER_AND_FILTERED_PAYLOAD\x10\x03\x12\x1a\n\x16LOG_HEADER_AND_PAYLOAD\x10\x04*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xe7\x04\n\rStreamOptions\x12!\n\x15\x63lient_initial_tokens\x18\x01 \x01(\x03:\x02-1\x12!\n\x15server_initial_tokens\x18\x02 \x01(\x03:\x02-1\x12<\n\ntoken_unit\x18\x03 \x01(\x0e\x32\x1f.proto2.StreamOptions.TokenUnit:\x07MESSAGE\x12\x41\n\x0esecurity_level\x18\x04 \x01(\x0e\x32#.proto2.MethodOptions.SecurityLevel:\x04NONE\x12\x16\n\x0esecurity_label\x18\x05 \x01(\t\x12\x1b\n\x0e\x63lient_logging\x18\x06 \x01(\x05:\x03\x32\x35\x36\x12\x1b\n\x0eserver_logging\x18\x07 \x01(\x05:\x03\x32\x35\x36\x12\x14\n\x08\x64\x65\x61\x64line\x18\x08 \x01(\x01:\x02-1\x12\x18\n\tfail_fast\x18\t \x01(\x08:\x05\x66\x61lse\x12\'\n\x18\x65nd_user_creds_requested\x18\n \x01(\x08:\x05\x66\x61lse\x12^\n\tlog_level\x18\x0b \x01(\x0e\x32\x1e.proto2.MethodOptions.LogLevel:+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"\"\n\tTokenUnit\x12\x0b\n\x07MESSAGE\x10\x00\x12\x08\n\x04\x42YTE\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x95\x02\n\x13UninterpretedOption\x12\x32\n\x04name\x18\x02 \x03(\x0b\x32$.proto2.UninterpretedOption.NamePart\x12\x18\n\x10identifier_value\x18\x03 \x01(\t\x12\x1a\n\x12positive_int_value\x18\x04 \x01(\x04\x12\x1a\n\x12negative_int_value\x18\x05 \x01(\x03\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x14\n\x0cstring_value\x18\x07 \x01(\x0c\x12\x17\n\x0f\x61ggregate_value\x18\x08 \x01(\t\x1a\x33\n\x08NamePart\x12\x11\n\tname_part\x18\x01 \x02(\t\x12\x14\n\x0cis_extension\x18\x02 \x02(\x08\"\xa8\x01\n\x0eSourceCodeInfo\x12\x31\n\x08location\x18\x01 \x03(\x0b\x32\x1f.proto2.SourceCodeInfo.Location\x1a\x63\n\x08Location\x12\x10\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01\x12\x10\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01\x12\x18\n\x10leading_comments\x18\x03 \x01(\t\x12\x19\n\x11trailing_comments\x18\x04 \x01(\tB,\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01\xe0\x01\x01')
 )
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -172,8 +173,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=3492,
-  serialized_end=3591,
+  serialized_start=3552,
+  serialized_end=3651,
 )
 _sym_db.RegisterEnumDescriptor(_FILEOPTIONS_COMPATIBILITYLEVEL)
 
@@ -198,8 +199,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=3593,
-  serialized_end=3651,
+  serialized_start=3653,
+  serialized_end=3711,
 )
 _sym_db.RegisterEnumDescriptor(_FILEOPTIONS_OPTIMIZEMODE)
 
@@ -224,8 +225,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=4491,
-  serialized_end=4538,
+  serialized_start=4551,
+  serialized_end=4598,
 )
 _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_CTYPE)
 
@@ -250,8 +251,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=4540,
-  serialized_end=4600,
+  serialized_start=4600,
+  serialized_end=4660,
 )
 _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_JTYPE)
 
@@ -276,8 +277,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=4602,
-  serialized_end=4655,
+  serialized_start=4662,
+  serialized_end=4715,
 )
 _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_JSTYPE)
 
@@ -298,8 +299,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=6009,
-  serialized_end=6037,
+  serialized_start=6069,
+  serialized_end=6097,
 )
 _sym_db.RegisterEnumDescriptor(_METHODOPTIONS_PROTOCOL)
 
@@ -328,8 +329,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=6039,
-  serialized_end=6140,
+  serialized_start=6099,
+  serialized_end=6200,
 )
 _sym_db.RegisterEnumDescriptor(_METHODOPTIONS_SECURITYLEVEL)
 
@@ -350,8 +351,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=6142,
-  serialized_end=6190,
+  serialized_start=6202,
+  serialized_end=6250,
 )
 _sym_db.RegisterEnumDescriptor(_METHODOPTIONS_FORMAT)
 
@@ -384,8 +385,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=6193,
-  serialized_end=6352,
+  serialized_start=6253,
+  serialized_end=6412,
 )
 _sym_db.RegisterEnumDescriptor(_METHODOPTIONS_LOGLEVEL)
 
@@ -406,8 +407,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=6936,
-  serialized_end=6970,
+  serialized_start=6996,
+  serialized_end=7030,
 )
 _sym_db.RegisterEnumDescriptor(_STREAMOPTIONS_TOKENUNIT)
 
@@ -1241,7 +1242,21 @@
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='uninterpreted_option', full_name='proto2.FileOptions.uninterpreted_option', index=30,
+      name='cc_enable_maps', full_name='proto2.FileOptions.cc_enable_maps', index=30,
+      number=32, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='go_force_proto2_api', full_name='proto2.FileOptions.go_force_proto2_api', index=31,
+      number=33, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='uninterpreted_option', full_name='proto2.FileOptions.uninterpreted_option', index=32,
       number=999, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -1261,7 +1276,7 @@
   oneofs=[
   ],
   serialized_start=2312,
-  serialized_end=3662,
+  serialized_end=3722,
 )
 
 
@@ -1339,8 +1354,8 @@
   extension_ranges=[(1000, 536870912), ],
   oneofs=[
   ],
-  serialized_start=3665,
-  serialized_end=4021,
+  serialized_start=3725,
+  serialized_end=4081,
 )
 
 
@@ -1376,8 +1391,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4444,
-  serialized_end=4489,
+  serialized_start=4504,
+  serialized_end=4549,
 )
 
 _FIELDOPTIONS = _descriptor.Descriptor(
@@ -1471,8 +1486,8 @@
   extension_ranges=[(1000, 536870912), ],
   oneofs=[
   ],
-  serialized_start=4024,
-  serialized_end=4666,
+  serialized_start=4084,
+  serialized_end=4726,
 )
 
 
@@ -1522,8 +1537,8 @@
   extension_ranges=[(1000, 536870912), ],
   oneofs=[
   ],
-  serialized_start=4669,
-  serialized_end=4822,
+  serialized_start=4729,
+  serialized_end=4882,
 )
 
 
@@ -1559,8 +1574,8 @@
   extension_ranges=[(1000, 536870912), ],
   oneofs=[
   ],
-  serialized_start=4824,
-  serialized_end=4940,
+  serialized_start=4884,
+  serialized_end=5000,
 )
 
 
@@ -1610,8 +1625,8 @@
   extension_ranges=[(1000, 536870912), ],
   oneofs=[
   ],
-  serialized_start=4943,
-  serialized_end=5125,
+  serialized_start=5003,
+  serialized_end=5185,
 )
 
 
@@ -1784,8 +1799,8 @@
   extension_ranges=[(1000, 536870912), ],
   oneofs=[
   ],
-  serialized_start=5128,
-  serialized_end=6363,
+  serialized_start=5188,
+  serialized_end=6423,
 )
 
 
@@ -1899,8 +1914,8 @@
   extension_ranges=[(1000, 536870912), ],
   oneofs=[
   ],
-  serialized_start=6366,
-  serialized_end=6981,
+  serialized_start=6426,
+  serialized_end=7041,
 )
 
 
@@ -1936,8 +1951,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=7210,
-  serialized_end=7261,
+  serialized_start=7270,
+  serialized_end=7321,
 )
 
 _UNINTERPRETEDOPTION = _descriptor.Descriptor(
@@ -2007,8 +2022,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6984,
-  serialized_end=7261,
+  serialized_start=7044,
+  serialized_end=7321,
 )
 
 
@@ -2058,8 +2073,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=7333,
-  serialized_end=7432,
+  serialized_start=7393,
+  serialized_end=7492,
 )
 
 _SOURCECODEINFO = _descriptor.Descriptor(
@@ -2087,8 +2102,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=7264,
-  serialized_end=7432,
+  serialized_start=7324,
+  serialized_end=7492,
 )
 
 _FILEDESCRIPTORSET.fields_by_name['file'].message_type = _FILEDESCRIPTORPROTO
diff --git a/google/net/proto2/python/internal/containers.py b/google/net/proto2/python/internal/containers.py
index fbaae4f..fc3c698 100644
--- a/google/net/proto2/python/internal/containers.py
+++ b/google/net/proto2/python/internal/containers.py
@@ -29,6 +29,7 @@
 
 
 
+
 class BaseContainer(object):
 
   """Base container class."""
diff --git a/google/net/proto2/python/internal/decoder.py b/google/net/proto2/python/internal/decoder.py
index bb34fb9..30d37a0 100644
--- a/google/net/proto2/python/internal/decoder.py
+++ b/google/net/proto2/python/internal/decoder.py
@@ -69,6 +69,7 @@
 """
 
 
+
 import struct
 import sys
 _PY2 = sys.version_info[0] < 3
diff --git a/google/net/proto2/python/internal/encoder.py b/google/net/proto2/python/internal/encoder.py
index 745a01e..d4415ec 100644
--- a/google/net/proto2/python/internal/encoder.py
+++ b/google/net/proto2/python/internal/encoder.py
@@ -55,6 +55,7 @@
 """
 
 
+
 import struct
 import sys
 _PY2 = sys.version_info[0] < 3
diff --git a/google/net/proto2/python/internal/enum_type_wrapper.py b/google/net/proto2/python/internal/enum_type_wrapper.py
index a1cb020..5adce21 100644
--- a/google/net/proto2/python/internal/enum_type_wrapper.py
+++ b/google/net/proto2/python/internal/enum_type_wrapper.py
@@ -25,6 +25,7 @@
 
 
 
+
 class EnumTypeWrapper(object):
   """A utility for finding the names of enum values."""
 
diff --git a/google/net/proto2/python/internal/message_listener.py b/google/net/proto2/python/internal/message_listener.py
index 5e0571f..8dadae7 100644
--- a/google/net/proto2/python/internal/message_listener.py
+++ b/google/net/proto2/python/internal/message_listener.py
@@ -26,6 +26,7 @@
 
 
 
+
 class MessageListener(object):
 
   """Listens for modifications made to a message.  Meant to be registered via
diff --git a/google/net/proto2/python/internal/python_message.py b/google/net/proto2/python/internal/python_message.py
index 60cbcfa..51c5806 100644
--- a/google/net/proto2/python/internal/python_message.py
+++ b/google/net/proto2/python/internal/python_message.py
@@ -39,6 +39,7 @@
 """
 
 
+
 import sys
 if sys.version_info[0] < 3:
   try:
@@ -80,7 +81,7 @@
   if (descriptor.has_options and
       descriptor.GetOptions().message_set_wire_format):
     cls._decoders_by_tag[decoder.MESSAGE_SET_ITEM_TAG] = (
-        decoder.MessageSetItemDecoder(cls._extensions_by_number))
+        decoder.MessageSetItemDecoder(cls._extensions_by_number), None)
 
 
   for field in descriptor.fields:
@@ -207,7 +208,9 @@
     cls._decoders_by_tag[tag_bytes] = (
         type_checkers.TYPE_TO_DECODER[field_descriptor.type](
             field_descriptor.number, is_repeated, is_packed,
-            field_descriptor, field_descriptor._default_constructor))
+            field_descriptor, field_descriptor._default_constructor),
+        field_descriptor if field_descriptor.containing_oneof is not None
+        else None)
 
   AddDecoder(type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type],
              False)
@@ -691,6 +694,7 @@
 
     self._fields = {}
     self._unknown_fields = ()
+    self._oneofs = {}
     self._Modified()
   cls.Clear = Clear
 
@@ -860,7 +864,7 @@
     unknown_field_list = self._unknown_fields
     while pos != end:
       (tag_bytes, new_pos) = local_ReadTag(buffer, pos)
-      field_decoder = decoders_by_tag.get(tag_bytes)
+      field_decoder, field_desc = decoders_by_tag.get(tag_bytes, (None, None))
       if field_decoder is None:
         value_start_pos = new_pos
         new_pos = local_SkipField(buffer, new_pos, end, tag_bytes)
@@ -872,6 +876,8 @@
         pos = new_pos
       else:
         pos = field_decoder(buffer, new_pos, end, self, field_dict)
+        if field_desc:
+          self._UpdateOneofState(field_desc)
     return pos
   cls._InternalParse = InternalParse
 
diff --git a/google/net/proto2/python/internal/type_checkers.py b/google/net/proto2/python/internal/type_checkers.py
index 0242c2d..9f0ecb9 100644
--- a/google/net/proto2/python/internal/type_checkers.py
+++ b/google/net/proto2/python/internal/type_checkers.py
@@ -34,6 +34,7 @@
 """
 
 
+
 import sys
 if sys.version < '2.6': bytes = str
 from google.net.proto2.python.internal import api_implementation
diff --git a/google/net/proto2/python/internal/wire_format.py b/google/net/proto2/python/internal/wire_format.py
index 1806b78..08f4f42 100644
--- a/google/net/proto2/python/internal/wire_format.py
+++ b/google/net/proto2/python/internal/wire_format.py
@@ -21,6 +21,7 @@
 """Constants and static functions to support protocol buffer wire format."""
 
 
+
 import struct
 from google.net.proto2.python.public import descriptor
 from google.net.proto2.python.public import message
diff --git a/google/net/proto2/python/public/descriptor.py b/google/net/proto2/python/public/descriptor.py
index 024024b..3c39f36 100644
--- a/google/net/proto2/python/public/descriptor.py
+++ b/google/net/proto2/python/public/descriptor.py
@@ -24,6 +24,7 @@
 """
 
 
+
 from google.net.proto2.python.internal import api_implementation
 
 
diff --git a/google/net/proto2/python/public/descriptor_database.py b/google/net/proto2/python/public/descriptor_database.py
index 702a48d..c86106c 100644
--- a/google/net/proto2/python/public/descriptor_database.py
+++ b/google/net/proto2/python/public/descriptor_database.py
@@ -20,6 +20,7 @@
 
 
 
+
 class Error(Exception):
   pass
 
diff --git a/google/net/proto2/python/public/descriptor_pool.py b/google/net/proto2/python/public/descriptor_pool.py
index 2d47ea1..899ef38 100644
--- a/google/net/proto2/python/public/descriptor_pool.py
+++ b/google/net/proto2/python/public/descriptor_pool.py
@@ -44,6 +44,7 @@
 """
 
 
+
 import sys
 
 from google.net.proto2.python.public import descriptor
diff --git a/google/net/proto2/python/public/message.py b/google/net/proto2/python/public/message.py
index 10c679a..89a199c 100644
--- a/google/net/proto2/python/public/message.py
+++ b/google/net/proto2/python/public/message.py
@@ -26,6 +26,7 @@
 
 
 
+
 class Error(Exception): pass
 class DecodeError(Error): pass
 class EncodeError(Error): pass
diff --git a/google/net/proto2/python/public/reflection.py b/google/net/proto2/python/public/reflection.py
index 9544ccf..839f9ad 100644
--- a/google/net/proto2/python/public/reflection.py
+++ b/google/net/proto2/python/public/reflection.py
@@ -37,6 +37,7 @@
 
 
 
+
 from google.net.proto2.python.internal import api_implementation
 from google.net.proto2.python.public import descriptor as descriptor_mod
 from google.net.proto2.python.public import message
diff --git a/google/net/proto2/python/public/service.py b/google/net/proto2/python/public/service.py
index 2430e45..b562727 100644
--- a/google/net/proto2/python/public/service.py
+++ b/google/net/proto2/python/public/service.py
@@ -32,6 +32,7 @@
 
 
 
+
 class RpcException(Exception):
   """Exception raised on failed blocking RPC method call."""
   pass
diff --git a/google/net/proto2/python/public/service_reflection.py b/google/net/proto2/python/public/service_reflection.py
index ec0b6ba..ebcb765 100644
--- a/google/net/proto2/python/public/service_reflection.py
+++ b/google/net/proto2/python/public/service_reflection.py
@@ -28,6 +28,7 @@
 
 
 
+
 class GeneratedServiceType(type):
 
   """Metaclass for service classes created at runtime from ServiceDescriptors.
diff --git a/google/net/proto2/python/public/text_format.py b/google/net/proto2/python/public/text_format.py
index 4b262d3..5290f82 100644
--- a/google/net/proto2/python/public/text_format.py
+++ b/google/net/proto2/python/public/text_format.py
@@ -21,6 +21,7 @@
 """Contains routines for printing protocol messages in text format."""
 
 
+
 import cStringIO
 import re
 
diff --git a/google/pyglib/singleton.py b/google/pyglib/singleton.py
new file mode 100644
index 0000000..eae42f7
--- /dev/null
+++ b/google/pyglib/singleton.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# 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.
+#
+# Copyright 2011 Google Inc. All Rights Reserved.
+
+"""Thread-safe implementation of a singleton decorator.
+
+Sometimes, only a single instance of a class should ever be created. This file
+provides a wrapper that turns a class into a Singleton. The constructor may
+only be called once; a static method Singleton() provides access to the
+constructed instance. If Singleton() is called before the constructor, or if
+the constructor is called multiple times, Errors are raised. This wrapper is
+thread-safe; calls to the constructor and Singleton() method are protected
+by per-class locks.
+
+Singletons are often associated with bad coding practices; see
+https://wiki/Main/SingletonsConsideredDangerous and decide if you should
+really be using this functionality. Consider alternatives, like the
+"Borg pattern" where object state (instead of object identity) is shared.
+
+To make your singletons more testable, use the following idiom:
+
+
+class A(...):
+  "All the complicated code goes in here, can be tested normally..."
+  ..
+  ..
+
+
+@singleton.Singleton
+class B(A):
+  "Singleton instance of A"
+
+
+Example usage:
+
+from google.pyglib import singleton
+
+
+@singleton.Singleton
+class Foo(object):
+  "Example singleton"
+
+
+a = Foo()
+b = Foo.Singleton()
+c = Foo.Singleton()
+assert a == b
+assert b == c
+
+
+Note that class decorator syntax was added after python2.4. If your code
+is python2.4 compliant, use an idiom like:
+
+from google.pyglib import singleton
+
+
+class Foo(object):
+  "Foo class"
+
+Bar = singleton.Singleton(Foo)
+
+
+a = Bar()
+b = Bar.Singleton()
+c = Bar.Singleton()
+assert a == b
+assert b == c
+"""
+
+
+
+import threading
+
+_CLASS_LOCKS = {}  # Holds the per-class locks.
+_CLASS_LOCKS_LOCK = threading.Lock()  # Lock for obtaining a per-class lock.
+_INSTANCES = {}  # Mapping from class to instantiated object.
+
+
+class Error(Exception):
+  """Base error class."""
+
+
+class AlreadyHasSingletonMethodError(Error):
+  """Raised if the class already defines a Singleton() method."""
+
+  def __init__(self, cls):
+    Error.__init__(self)
+    self.cls = cls
+
+  def __str__(self):
+    return 'Class already has a Singleton() method: %s' % self.cls
+
+
+class NotConstructedError(Error):
+  """Raised if the constructor has not been called yet."""
+
+  def __init__(self, cls):
+    Error.__init__(self)
+    self.cls = cls
+
+  def __str__(self):
+    return 'Constructor has not yet been called for class %s' % self.cls
+
+
+class ConstructorCalledAgainError(Error):
+  """Raised if the constructor is called twice for a singleton."""
+
+  def __init__(self, cls, args, kws):
+    Error.__init__(self)
+    self.cls = cls
+    self.args = args
+    self.kws = kws
+
+  def __str__(self):
+    return ('Constructor called (again) on class %s with args %s and kws %s'
+            % (self.cls, self.args, self.kws))
+
+
+def _GetClassLock(cls):
+  """Returns the lock associated with the class."""
+  with _CLASS_LOCKS_LOCK:
+    if cls not in _CLASS_LOCKS:
+      _CLASS_LOCKS[cls] = threading.Lock()
+    return _CLASS_LOCKS[cls]
+
+
+def Singleton(cls):
+  """Turn a class into a singleton.
+
+  One call to the constructor is allowed. After that, all future calls
+  must be to the Singleton() static method.
+
+  This code is multithread-safe. Shared locks are held for brief periods
+  of time; when a class is instantiated, it uses a class specific lock.
+
+  Args:
+    cls: The class to decorate.
+
+  Returns:
+    The singleton class. Note that this class is an extension
+    of the class it is decorating.
+
+  Raises:
+    AlreadyHasSingletonMethodError: If the class has a Singleton method
+      defined.
+  """
+  if hasattr(cls, 'Singleton'):
+    raise AlreadyHasSingletonMethodError(cls)
+
+  class _Singleton(cls):
+
+    def __init__(self, *args, **kws):
+      class_lock = _GetClassLock(cls)
+      with class_lock:
+        if cls not in _INSTANCES:
+          cls.__init__(self, *args, **kws)
+          _INSTANCES[cls] = self
+        else:
+          raise ConstructorCalledAgainError(cls, args, kws)
+
+    @staticmethod
+    def Singleton():
+      class_lock = _GetClassLock(cls)
+      with class_lock:
+        if cls not in _INSTANCES:
+          raise NotConstructedError(cls)
+        else:
+          return _INSTANCES[cls]
+
+  return _Singleton
diff --git a/google/storage/speckle/proto/client_error_code_pb2.py b/google/storage/speckle/proto/client_error_code_pb2.py
index 3e3836c..559ab20 100644
--- a/google/storage/speckle/proto/client_error_code_pb2.py
+++ b/google/storage/speckle/proto/client_error_code_pb2.py
@@ -19,6 +19,7 @@
 
 import sys
 _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+import google
 from google.net.proto2.python.public import descriptor as _descriptor
 from google.net.proto2.python.public import message as _message
 from google.net.proto2.python.public import reflection as _reflection
@@ -34,7 +35,7 @@
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='storage/speckle/proto/client_error_code.proto',
   package='speckle.sql',
-  serialized_pb=_b('\n-storage/speckle/proto/client_error_code.proto\x12\x0bspeckle.sql\"\xb3\x08\n\x15SqlServiceClientError\"\x99\x08\n\x0f\x43lientErrorCode\x12\x06\n\x02OK\x10\x00\x12\x13\n\x0fTRANSIENT_ERROR\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x13\n\x0fINVALID_REQUEST\x10\x03\x12\x16\n\x12\x44\x45PRECATED_TIMEOUT\x10\x04\x12\x1d\n\x19\x44\x45PRECATED_NOT_AUTHORIZED\x10\x05\x12\x1a\n\x16\x44\x45PRECATED_RDBMS_ERROR\x10\x06\x12\"\n\x1d\x45RROR_PUBLIC_ERROR_CODE_START\x10\xe8\x07\x12\x10\n\x0b\x45RROR_RDBMS\x10\xe9\x07\x12\x12\n\rERROR_TIMEOUT\x10\xea\x07\x12\x19\n\x14\x45RROR_NOT_AUTHORIZED\x10\xeb\x07\x12\x1d\n\x18\x45RROR_INSTANCE_SUSPENDED\x10\xec\x07\x12\x1c\n\x17\x45RROR_INVALID_PARAMETER\x10\xed\x07\x12\"\n\x1d\x45RROR_NOT_ALL_VARIABLES_BOUND\x10\xee\x07\x12\x1d\n\x18\x45RROR_UNKNOWN_CONNECTION\x10\xef\x07\x12\x1c\n\x17\x45RROR_UNKNOWN_STATEMENT\x10\xf0\x07\x12\x1a\n\x15\x45RROR_UNKNOWN_CATALOG\x10\xf1\x07\x12\x19\n\x14\x45RROR_UNKNOWN_CURSOR\x10\xf2\x07\x12\x1b\n\x16\x45RROR_CURSOR_EXHAUSTED\x10\xfc\x07\x12\x1e\n\x19\x45RROR_NOT_YET_IMPLEMENTED\x10\x86\x08\x12\x1a\n\x15\x45RROR_NOT_IMPLEMENTED\x10\x87\x08\x12\x1f\n\x1a\x45RROR_INSTANCE_MAINTENANCE\x10\x88\x08\x12\'\n\"ERROR_TOO_MANY_CONCURRENT_REQUESTS\x10\x89\x08\x12\"\n\x1d\x45RROR_RESOURCE_DOES_NOT_EXIST\x10\x8a\x08\x12\"\n\x1d\x45RROR_RESOURCE_ALREADY_EXISTS\x10\x8b\x08\x12\x1c\n\x17\x45RROR_CONNECTION_IN_USE\x10\x8c\x08\x12!\n\x1c\x45RROR_CLIENT_VERSION_TOO_OLD\x10\x8d\x08\x12\x1b\n\x16\x45RROR_RESPONSE_PENDING\x10\x8e\x08\x12(\n#ERROR_INSTANCE_SUSPENDED_BY_BILLING\x10\x8f\x08\x12\x1e\n\x19\x45RROR_RESULTSET_TOO_LARGE\x10\x90\x08\x12)\n$ERROR_ACTIVATION_POLICY_SET_TO_NEVER\x10\x91\x08\x12&\n!ERROR_INSTANCE_SUSPENDED_BY_LEGAL\x10\x92\x08\x12\x19\n\x14\x45RROR_QUOTA_EXCEEDED\x10\x93\x08\x12\x32\n-ERROR_INVALID_BINLOG_COORDINATES_IN_DUMP_FILE\x10\x94\x08\x42%\n\x1b\x63om.google.protos.cloud.sql\x10\x02 \x02(\x02P\x01')
+  serialized_pb=_b('\n-storage/speckle/proto/client_error_code.proto\x12\x0bspeckle.sql\"\xe1\x08\n\x15SqlServiceClientError\"\xc7\x08\n\x0f\x43lientErrorCode\x12\x06\n\x02OK\x10\x00\x12\x13\n\x0fTRANSIENT_ERROR\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x13\n\x0fINVALID_REQUEST\x10\x03\x12\x16\n\x12\x44\x45PRECATED_TIMEOUT\x10\x04\x12\x1d\n\x19\x44\x45PRECATED_NOT_AUTHORIZED\x10\x05\x12\x1a\n\x16\x44\x45PRECATED_RDBMS_ERROR\x10\x06\x12\"\n\x1d\x45RROR_PUBLIC_ERROR_CODE_START\x10\xe8\x07\x12\x10\n\x0b\x45RROR_RDBMS\x10\xe9\x07\x12\x12\n\rERROR_TIMEOUT\x10\xea\x07\x12\x19\n\x14\x45RROR_NOT_AUTHORIZED\x10\xeb\x07\x12\x1d\n\x18\x45RROR_INSTANCE_SUSPENDED\x10\xec\x07\x12\x1c\n\x17\x45RROR_INVALID_PARAMETER\x10\xed\x07\x12\"\n\x1d\x45RROR_NOT_ALL_VARIABLES_BOUND\x10\xee\x07\x12\x1d\n\x18\x45RROR_UNKNOWN_CONNECTION\x10\xef\x07\x12\x1c\n\x17\x45RROR_UNKNOWN_STATEMENT\x10\xf0\x07\x12\x1a\n\x15\x45RROR_UNKNOWN_CATALOG\x10\xf1\x07\x12\x19\n\x14\x45RROR_UNKNOWN_CURSOR\x10\xf2\x07\x12\x1b\n\x16\x45RROR_CURSOR_EXHAUSTED\x10\xfc\x07\x12\x1e\n\x19\x45RROR_NOT_YET_IMPLEMENTED\x10\x86\x08\x12\x1a\n\x15\x45RROR_NOT_IMPLEMENTED\x10\x87\x08\x12\x1f\n\x1a\x45RROR_INSTANCE_MAINTENANCE\x10\x88\x08\x12\'\n\"ERROR_TOO_MANY_CONCURRENT_REQUESTS\x10\x89\x08\x12\"\n\x1d\x45RROR_RESOURCE_DOES_NOT_EXIST\x10\x8a\x08\x12\"\n\x1d\x45RROR_RESOURCE_ALREADY_EXISTS\x10\x8b\x08\x12\x1c\n\x17\x45RROR_CONNECTION_IN_USE\x10\x8c\x08\x12!\n\x1c\x45RROR_CLIENT_VERSION_TOO_OLD\x10\x8d\x08\x12\x1b\n\x16\x45RROR_RESPONSE_PENDING\x10\x8e\x08\x12(\n#ERROR_INSTANCE_SUSPENDED_BY_BILLING\x10\x8f\x08\x12\x1e\n\x19\x45RROR_RESULTSET_TOO_LARGE\x10\x90\x08\x12)\n$ERROR_ACTIVATION_POLICY_SET_TO_NEVER\x10\x91\x08\x12&\n!ERROR_INSTANCE_SUSPENDED_BY_LEGAL\x10\x92\x08\x12\x19\n\x14\x45RROR_QUOTA_EXCEEDED\x10\x93\x08\x12\x32\n-ERROR_INVALID_BINLOG_COORDINATES_IN_DUMP_FILE\x10\x94\x08\x12,\n\'ERROR_GAE_APP_CONNECTION_LIMIT_EXCEEDED\x10\x95\x08\x42%\n\x1b\x63om.google.protos.cloud.sql\x10\x02 \x02(\x02P\x01')
 )
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -182,11 +183,15 @@
       name='ERROR_INVALID_BINLOG_COORDINATES_IN_DUMP_FILE', index=33, number=1044,
       options=None,
       type=None),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR_GAE_APP_CONNECTION_LIMIT_EXCEEDED', index=34, number=1045,
+      options=None,
+      type=None),
   ],
   containing_type=None,
   options=None,
   serialized_start=89,
-  serialized_end=1138,
+  serialized_end=1184,
 )
 _sym_db.RegisterEnumDescriptor(_SQLSERVICECLIENTERROR_CLIENTERRORCODE)
 
@@ -211,7 +216,7 @@
   oneofs=[
   ],
   serialized_start=63,
-  serialized_end=1138,
+  serialized_end=1184,
 )
 
 _SQLSERVICECLIENTERROR_CLIENTERRORCODE.containing_type = _SQLSERVICECLIENTERROR
diff --git a/google/storage/speckle/proto/client_pb2.py b/google/storage/speckle/proto/client_pb2.py
index 3279311..d3f5b16 100644
--- a/google/storage/speckle/proto/client_pb2.py
+++ b/google/storage/speckle/proto/client_pb2.py
@@ -19,6 +19,7 @@
 
 import sys
 _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+import google
 from google.net.proto2.python.internal import enum_type_wrapper
 from google.net.proto2.python.public import descriptor as _descriptor
 from google.net.proto2.python.public import message as _message
diff --git a/google/storage/speckle/proto/jdbc_type.py b/google/storage/speckle/proto/jdbc_type.py
index ff699db..604f4ce 100644
--- a/google/storage/speckle/proto/jdbc_type.py
+++ b/google/storage/speckle/proto/jdbc_type.py
@@ -29,6 +29,7 @@
 
 
 
+
 BIT = -7
 TINYINT = -6
 SMALLINT = 5
diff --git a/google/storage/speckle/proto/sql_pb2.py b/google/storage/speckle/proto/sql_pb2.py
index bc53279..90702dd 100644
--- a/google/storage/speckle/proto/sql_pb2.py
+++ b/google/storage/speckle/proto/sql_pb2.py
@@ -19,6 +19,7 @@
 
 import sys
 _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+import google
 from google.net.proto2.python.public import descriptor as _descriptor
 from google.net.proto2.python.public import message as _message
 from google.net.proto2.python.public import reflection as _reflection
@@ -44,7 +45,7 @@
 _sym_db = _symbol_database.Default()
 
 
-import google.storage.speckle.proto.client_pb2
+from google.storage.speckle.proto import client_pb2 as google_dot_storage_dot_speckle_dot_proto_dot_client__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
@@ -52,7 +53,7 @@
   package='speckle.sql',
   serialized_pb=_b('\n\x1fstorage/speckle/proto/sql.proto\x12\x0bspeckle.sql\x1a\"storage/speckle/proto/client.proto\"\x8c\x03\n\x0b\x45xecRequest\x12\x10\n\x08instance\x18\x01 \x02(\t\x12\x14\n\x0cstatement_id\x18\x02 \x01(\x04\x12\x11\n\tstatement\x18\x03 \x01(\t\x12\x31\n\rbind_variable\x18\x04 \x03(\x0b\x32\x1a.speckle.BindVariableProto\x12\x15\n\rconnection_id\x18\x05 \x02(\x0c\x12%\n\x07options\x18\x06 \x01(\x0b\x32\x14.speckle.ExecOptions\x12I\n\x0estatement_type\x18\t \x01(\x0e\x32&.speckle.sql.ExecRequest.StatementType:\tSTATEMENT\x12\"\n\x05\x62\x61tch\x18\n \x01(\x0b\x32\x13.speckle.BatchProto\x12\x12\n\nrequest_id\x18\x0b \x01(\x04\"N\n\rStatementType\x12\r\n\tSTATEMENT\x10\x01\x12\x16\n\x12PREPARED_STATEMENT\x10\x02\x12\x16\n\x12\x43\x41LLABLE_STATEMENT\x10\x03\"b\n\x0c\x45xecResponse\x12$\n\x06result\x18\x01 \x01(\x0b\x32\x14.speckle.ResultProto\x12,\n\rsql_exception\x18\x02 \x01(\x0b\x32\x15.speckle.SqlException\"j\n\rExecOpRequest\x12\x10\n\x08instance\x18\x01 \x02(\t\x12\x15\n\rconnection_id\x18\x02 \x02(\x0c\x12\x1c\n\x02op\x18\x03 \x02(\x0b\x32\x10.speckle.OpProto\x12\x12\n\nrequest_id\x18\x08 \x01(\x04\"\xed\x01\n\x0e\x45xecOpResponse\x12\x12\n\nnative_sql\x18\x01 \x01(\t\x12%\n\tsavepoint\x18\x02 \x01(\x0b\x32\x12.speckle.SavePoint\x12,\n\rsql_exception\x18\x03 \x01(\x0b\x32\x15.speckle.SqlException\x12$\n\x06result\x18\x04 \x01(\x0b\x32\x14.speckle.ResultProto\x12\x30\n\x10\x63\x61\x63hed_rpc_error\x18\x05 \x01(\x0b\x32\x16.speckle.RpcErrorProto\x12\x1a\n\x0e\x63\x61\x63hed_payload\x18\x06 \x01(\x0c\x42\x02\x08\x01\"\xaa\x01\n\x0fMetadataRequest\x12\x10\n\x08instance\x18\x01 \x02(\t\x12\'\n\x08metadata\x18\x03 \x02(\x0e\x32\x15.speckle.MetadataType\x12\x31\n\rbind_variable\x18\x04 \x03(\x0b\x32\x1a.speckle.BindVariableProto\x12\x15\n\rconnection_id\x18\x05 \x02(\x0c\x12\x12\n\nrequest_id\x18\x08 \x01(\x04\"\xaa\x01\n\x10MetadataResponse\x12$\n\x06result\x18\x01 \x01(\x0b\x32\x14.speckle.ResultProto\x12\x42\n\x16jdbc_database_metadata\x18\x02 \x01(\x0b\x32\".speckle.JdbcDatabaseMetaDataProto\x12,\n\rsql_exception\x18\x03 \x01(\x0b\x32\x15.speckle.SqlException\"\xac\x01\n\x15OpenConnectionRequest\x12\x10\n\x08instance\x18\x01 \x02(\t\x12#\n\x08property\x18\x02 \x03(\x0b\x32\x11.speckle.Property\x12\x1b\n\x10protocol_version\x18\x05 \x01(\x04:\x01\x31\x12?\n\x0b\x63lient_type\x18\x06 \x01(\x0e\x32\x13.speckle.ClientType:\x15\x43LIENT_TYPE_JAVA_JDBC\"\x86\x01\n\x16OpenConnectionResponse\x12\x15\n\rconnection_id\x18\x01 \x01(\x0c\x12,\n\rsql_exception\x18\x02 \x01(\x0b\x32\x15.speckle.SqlException\x12\'\n\x08warnings\x18\x06 \x03(\x0b\x32\x15.speckle.SqlException\"A\n\x16\x43loseConnectionRequest\x12\x10\n\x08instance\x18\x01 \x02(\t\x12\x15\n\rconnection_id\x18\x02 \x02(\x0c\"G\n\x17\x43loseConnectionResponse\x12,\n\rsql_exception\x18\x01 \x01(\x0b\x32\x15.speckle.SqlException2\xac\x03\n\nSqlService\x12?\n\x04\x45xec\x12\x18.speckle.sql.ExecRequest\x1a\x19.speckle.sql.ExecResponse\"\x02P\x01\x12\x45\n\x06\x45xecOp\x12\x1a.speckle.sql.ExecOpRequest\x1a\x1b.speckle.sql.ExecOpResponse\"\x02P\x01\x12N\n\x0bGetMetadata\x12\x1c.speckle.sql.MetadataRequest\x1a\x1d.speckle.sql.MetadataResponse\"\x02P\x01\x12\x64\n\x0eOpenConnection\x12\".speckle.sql.OpenConnectionRequest\x1a#.speckle.sql.OpenConnectionResponse\"\tP\x01\x9a\x01\x04read\x12`\n\x0f\x43loseConnection\x12#.speckle.sql.CloseConnectionRequest\x1a$.speckle.sql.CloseConnectionResponse\"\x02P\x01\x42.\n\x1b\x63om.google.protos.cloud.sql\x10\x02 \x02(\x02P\x01\x80\x01\x00\x88\x01\x00\x90\x01\x00')
   ,
-  dependencies=[google.storage.speckle.proto.client_pb2.DESCRIPTOR,])
+  dependencies=[google_dot_storage_dot_speckle_dot_proto_dot_client__pb2.DESCRIPTOR,])
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 
@@ -587,28 +588,28 @@
   serialized_end=1727,
 )
 
-_EXECREQUEST.fields_by_name['bind_variable'].message_type = google.storage.speckle.proto.client_pb2._BINDVARIABLEPROTO
-_EXECREQUEST.fields_by_name['options'].message_type = google.storage.speckle.proto.client_pb2._EXECOPTIONS
+_EXECREQUEST.fields_by_name['bind_variable'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._BINDVARIABLEPROTO
+_EXECREQUEST.fields_by_name['options'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._EXECOPTIONS
 _EXECREQUEST.fields_by_name['statement_type'].enum_type = _EXECREQUEST_STATEMENTTYPE
-_EXECREQUEST.fields_by_name['batch'].message_type = google.storage.speckle.proto.client_pb2._BATCHPROTO
+_EXECREQUEST.fields_by_name['batch'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._BATCHPROTO
 _EXECREQUEST_STATEMENTTYPE.containing_type = _EXECREQUEST
-_EXECRESPONSE.fields_by_name['result'].message_type = google.storage.speckle.proto.client_pb2._RESULTPROTO
-_EXECRESPONSE.fields_by_name['sql_exception'].message_type = google.storage.speckle.proto.client_pb2._SQLEXCEPTION
-_EXECOPREQUEST.fields_by_name['op'].message_type = google.storage.speckle.proto.client_pb2._OPPROTO
-_EXECOPRESPONSE.fields_by_name['savepoint'].message_type = google.storage.speckle.proto.client_pb2._SAVEPOINT
-_EXECOPRESPONSE.fields_by_name['sql_exception'].message_type = google.storage.speckle.proto.client_pb2._SQLEXCEPTION
-_EXECOPRESPONSE.fields_by_name['result'].message_type = google.storage.speckle.proto.client_pb2._RESULTPROTO
-_EXECOPRESPONSE.fields_by_name['cached_rpc_error'].message_type = google.storage.speckle.proto.client_pb2._RPCERRORPROTO
-_METADATAREQUEST.fields_by_name['metadata'].enum_type = google.storage.speckle.proto.client_pb2._METADATATYPE
-_METADATAREQUEST.fields_by_name['bind_variable'].message_type = google.storage.speckle.proto.client_pb2._BINDVARIABLEPROTO
-_METADATARESPONSE.fields_by_name['result'].message_type = google.storage.speckle.proto.client_pb2._RESULTPROTO
-_METADATARESPONSE.fields_by_name['jdbc_database_metadata'].message_type = google.storage.speckle.proto.client_pb2._JDBCDATABASEMETADATAPROTO
-_METADATARESPONSE.fields_by_name['sql_exception'].message_type = google.storage.speckle.proto.client_pb2._SQLEXCEPTION
-_OPENCONNECTIONREQUEST.fields_by_name['property'].message_type = google.storage.speckle.proto.client_pb2._PROPERTY
-_OPENCONNECTIONREQUEST.fields_by_name['client_type'].enum_type = google.storage.speckle.proto.client_pb2._CLIENTTYPE
-_OPENCONNECTIONRESPONSE.fields_by_name['sql_exception'].message_type = google.storage.speckle.proto.client_pb2._SQLEXCEPTION
-_OPENCONNECTIONRESPONSE.fields_by_name['warnings'].message_type = google.storage.speckle.proto.client_pb2._SQLEXCEPTION
-_CLOSECONNECTIONRESPONSE.fields_by_name['sql_exception'].message_type = google.storage.speckle.proto.client_pb2._SQLEXCEPTION
+_EXECRESPONSE.fields_by_name['result'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._RESULTPROTO
+_EXECRESPONSE.fields_by_name['sql_exception'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._SQLEXCEPTION
+_EXECOPREQUEST.fields_by_name['op'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._OPPROTO
+_EXECOPRESPONSE.fields_by_name['savepoint'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._SAVEPOINT
+_EXECOPRESPONSE.fields_by_name['sql_exception'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._SQLEXCEPTION
+_EXECOPRESPONSE.fields_by_name['result'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._RESULTPROTO
+_EXECOPRESPONSE.fields_by_name['cached_rpc_error'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._RPCERRORPROTO
+_METADATAREQUEST.fields_by_name['metadata'].enum_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._METADATATYPE
+_METADATAREQUEST.fields_by_name['bind_variable'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._BINDVARIABLEPROTO
+_METADATARESPONSE.fields_by_name['result'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._RESULTPROTO
+_METADATARESPONSE.fields_by_name['jdbc_database_metadata'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._JDBCDATABASEMETADATAPROTO
+_METADATARESPONSE.fields_by_name['sql_exception'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._SQLEXCEPTION
+_OPENCONNECTIONREQUEST.fields_by_name['property'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._PROPERTY
+_OPENCONNECTIONREQUEST.fields_by_name['client_type'].enum_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._CLIENTTYPE
+_OPENCONNECTIONRESPONSE.fields_by_name['sql_exception'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._SQLEXCEPTION
+_OPENCONNECTIONRESPONSE.fields_by_name['warnings'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._SQLEXCEPTION
+_CLOSECONNECTIONRESPONSE.fields_by_name['sql_exception'].message_type = google_dot_storage_dot_speckle_dot_proto_dot_client__pb2._SQLEXCEPTION
 DESCRIPTOR.message_types_by_name['ExecRequest'] = _EXECREQUEST
 DESCRIPTOR.message_types_by_name['ExecResponse'] = _EXECRESPONSE
 DESCRIPTOR.message_types_by_name['ExecOpRequest'] = _EXECOPREQUEST
diff --git a/google/storage/speckle/python/api/constants/CLIENT.py b/google/storage/speckle/python/api/constants/CLIENT.py
index 82db3b3..7739fe3 100644
--- a/google/storage/speckle/python/api/constants/CLIENT.py
+++ b/google/storage/speckle/python/api/constants/CLIENT.py
@@ -51,3 +51,4 @@
 
 
 
+
diff --git a/google/storage/speckle/python/api/constants/FIELD_TYPE.py b/google/storage/speckle/python/api/constants/FIELD_TYPE.py
index 8403993..655116d 100644
--- a/google/storage/speckle/python/api/constants/FIELD_TYPE.py
+++ b/google/storage/speckle/python/api/constants/FIELD_TYPE.py
@@ -28,6 +28,7 @@
 
 
 
+
 from google.storage.speckle.proto import jdbc_type
 
 
diff --git a/google/storage/speckle/python/api/constants/FLAG.py b/google/storage/speckle/python/api/constants/FLAG.py
index d245f4b..94cfcf0 100644
--- a/google/storage/speckle/python/api/constants/FLAG.py
+++ b/google/storage/speckle/python/api/constants/FLAG.py
@@ -46,3 +46,4 @@
 
 
 
+
diff --git a/google/storage/speckle/python/api/converters.py b/google/storage/speckle/python/api/converters.py
index 9d3d789..fea8aa6 100644
--- a/google/storage/speckle/python/api/converters.py
+++ b/google/storage/speckle/python/api/converters.py
@@ -54,6 +54,7 @@
 """
 
 
+
 import datetime
 import decimal
 import functools
diff --git a/google/storage/speckle/python/api/rdbms.py b/google/storage/speckle/python/api/rdbms.py
index aecce53..aff9984 100644
--- a/google/storage/speckle/python/api/rdbms.py
+++ b/google/storage/speckle/python/api/rdbms.py
@@ -24,6 +24,7 @@
 """
 
 
+
 import collections
 import datetime
 import decimal
diff --git a/google/storage/speckle/python/api/rdbms_apiproxy.py b/google/storage/speckle/python/api/rdbms_apiproxy.py
index 97ea7b5..ddd76d1 100644
--- a/google/storage/speckle/python/api/rdbms_apiproxy.py
+++ b/google/storage/speckle/python/api/rdbms_apiproxy.py
@@ -21,6 +21,7 @@
 """SQL Service connection module for ApiProxy."""
 
 
+
 from google.appengine.api import apiproxy_stub_map
 from google.appengine.runtime import apiproxy_errors
 from google.storage.speckle.proto import sql_pb2
diff --git a/google/storage/speckle/python/api/rdbms_googleapi.py b/google/storage/speckle/python/api/rdbms_googleapi.py
index afc2098..e6d6ec9 100644
--- a/google/storage/speckle/python/api/rdbms_googleapi.py
+++ b/google/storage/speckle/python/api/rdbms_googleapi.py
@@ -23,6 +23,7 @@
 
 
 
+
 import logging
 import os
 
diff --git a/google/storage/speckle/python/django/backend/base.py b/google/storage/speckle/python/django/backend/base.py
index 87c7c12..b3615ab 100644
--- a/google/storage/speckle/python/django/backend/base.py
+++ b/google/storage/speckle/python/django/backend/base.py
@@ -54,6 +54,7 @@
 
 
 
+
 import logging
 import os
 import sys
diff --git a/google/storage/speckle/python/django/backend/client.py b/google/storage/speckle/python/django/backend/client.py
index 9dd4af1..3c65897 100644
--- a/google/storage/speckle/python/django/backend/client.py
+++ b/google/storage/speckle/python/django/backend/client.py
@@ -25,6 +25,7 @@
 """
 
 
+
 from django.db import backends
 
 
diff --git a/google/storage/speckle/python/django/backend/oauth2storage.py b/google/storage/speckle/python/django/backend/oauth2storage.py
index a0b2f29..3559790 100644
--- a/google/storage/speckle/python/django/backend/oauth2storage.py
+++ b/google/storage/speckle/python/django/backend/oauth2storage.py
@@ -21,6 +21,7 @@
 """OAuth 2.0 credential storage for rdbms."""
 
 
+
 import apiclient
 from django.core.cache import cache
 from oauth2client import client
diff --git a/google/storage/speckle/python/django/management/commands/getoauthtoken.py b/google/storage/speckle/python/django/management/commands/getoauthtoken.py
index d86e0aa..3eddce6 100644
--- a/google/storage/speckle/python/django/management/commands/getoauthtoken.py
+++ b/google/storage/speckle/python/django/management/commands/getoauthtoken.py
@@ -26,6 +26,7 @@
 
 
 
+
 from google.storage.speckle.python.api import rdbms_googleapi
 
 import apiclient
diff --git a/google/storage/speckle/python/tool/google_sql.py b/google/storage/speckle/python/tool/google_sql.py
index 420ff50..3aa1288 100644
--- a/google/storage/speckle/python/tool/google_sql.py
+++ b/google/storage/speckle/python/tool/google_sql.py
@@ -40,6 +40,7 @@
 """
 
 
+
 import logging
 import optparse
 import os
diff --git a/google_sql.py b/google_sql.py
index de775b6..833a338 100755
--- a/google_sql.py
+++ b/google_sql.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/lib/cacerts/urlfetch_cacerts.txt b/lib/cacerts/urlfetch_cacerts.txt
index 48d1f64..310fdc7 100644
--- a/lib/cacerts/urlfetch_cacerts.txt
+++ b/lib/cacerts/urlfetch_cacerts.txt
@@ -83,23 +83,6 @@
 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
 -----END CERTIFICATE-----
 
-subject= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
-serial=70BAE41D10D92934B638CA7B03CCBABF
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
-MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
-BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
-ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
-BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
-I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
-CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
-lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
-AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
------END CERTIFICATE-----
-
 subject= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority - G2/OU=(c) 1998 VeriSign, Inc. - For authorized use only/OU=VeriSign Trust Network
 serial=7DD9FE07CFA81EB7107967FBA78934C6
 -----BEGIN CERTIFICATE-----
@@ -171,69 +154,6 @@
 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
 -----END CERTIFICATE-----
 
-subject= /L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 1 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com
-serial=01
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
-BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
-aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
-9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
-NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
-azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
-Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
-cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
-LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
-TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
-TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
-LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
-I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
-nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
------END CERTIFICATE-----
-
-subject= /L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 2 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com
-serial=01
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
-BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
-aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
-9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
-NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
-azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
-Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
-cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
-dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
-WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
-v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
-UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
-IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
-W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
------END CERTIFICATE-----
-
-subject= /L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 3 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com
-serial=01
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
-BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
-aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
-9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
-NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
-azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
-Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
-cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
-cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
-2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
-JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
-Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
-n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
-PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
------END CERTIFICATE-----
-
 subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 1999 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G3
 serial=9B7E0649A33E62B9D5EE90487129EF57
 -----BEGIN CERTIFICATE-----
@@ -288,37 +208,6 @@
 bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
 -----END CERTIFICATE-----
 
-subject= /C=US/O=Entrust.net/OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Secure Server Certification Authority
-serial=374AD243
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
-ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
-KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
-ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
-MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
-b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
-bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
-U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
-I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
-wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
-AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
-oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
-BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
-dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
-MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
-b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
-dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
-MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
-E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
-MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
-hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
-95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
-2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----
-
 subject= /O=Entrust.net/OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Certification Authority (2048)
 serial=3863DEF8
 -----BEGIN CERTIFICATE-----
@@ -1064,34 +953,6 @@
 iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
 -----END CERTIFICATE-----
 
-subject= /C=DK/O=TDC Internet/OU=TDC Internet Root CA
-serial=3ACCA54C
------BEGIN CERTIFICATE-----
-MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE
-SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg
-Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV
-BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl
-cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA
-vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu
-Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a
-0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1
-4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN
-eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD
-R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG
-A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu
-dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME
-Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3
-WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw
-HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ
-KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO
-Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX
-wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
-2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89
-9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0
-jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38
-aQNiuJkFBT1reBK9sG9l
------END CERTIFICATE-----
-
 subject= /C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN - DATACorp SGC
 serial=44BE0C8B500021B411D32A6806A9AD69
 -----BEGIN CERTIFICATE-----
@@ -1252,74 +1113,6 @@
 8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI
 -----END CERTIFICATE-----
 
-subject= /C=HU/L=Budapest/O=NetLock Halozatbiztonsagi Kft./OU=Tanusitvanykiadok/CN=NetLock Uzleti (Class B) Tanusitvanykiado
-serial=69
------BEGIN CERTIFICATE-----
-MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx
-ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
-b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD
-EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05
-OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G
-A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh
-Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l
-dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG
-SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK
-gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX
-iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc
-Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E
-BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G
-SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu
-b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh
-bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv
-Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln
-aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0
-IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
-c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph
-biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo
-ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP
-UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj
-YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo
-dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA
-bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06
-sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa
-n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS
-NitjrFgBazMpUIaD8QFI
------END CERTIFICATE-----
-
-subject= /C=HU/L=Budapest/O=NetLock Halozatbiztonsagi Kft./OU=Tanusitvanykiadok/CN=NetLock Expressz (Class C) Tanusitvanykiado
-serial=68
------BEGIN CERTIFICATE-----
-MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx
-ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
-b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD
-EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X
-DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw
-DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u
-c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr
-TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN
-BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA
-OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC
-2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW
-RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P
-AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW
-ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0
-YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz
-b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO
-ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB
-IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs
-b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
-ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s
-YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg
-a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g
-SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0
-aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg
-YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg
-Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY
-ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g
-pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4
-Fp1hBWeAyNDYpQcCNJgEjTME1A==
------END CERTIFICATE-----
-
 subject= /C=US/OU=www.xrampsecurity.com/O=XRamp Security Services Inc/CN=XRamp Global Certification Authority
 serial=50946CEC18EAD59C4DD597EF758FA0AD
 -----BEGIN CERTIFICATE-----
@@ -2185,46 +1978,6 @@
 WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
 -----END CERTIFICATE-----
 
-subject= /C=CO/O=Sociedad Cameral de Certificaci\xC3\xB3n Digital - Certic\xC3\xA1mara S.A./CN=AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
-serial=077E52937BE015E357F0698CCBEC0C
------BEGIN CERTIFICATE-----
-MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx
-CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp
-ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa
-QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw
-NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft
-ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu
-QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq
-hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG
-qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL
-fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ
-Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4
-Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ
-54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b
-MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j
-ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej
-YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt
-A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF
-rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ
-pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
-AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB
-lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy
-YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50
-7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs
-YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6
-xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc
-unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/
-Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp
-ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42
-gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0
-jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+
-XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD
-W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/
-RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r
-MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk
-BYn8eNZcLCZDqQ==
------END CERTIFICATE-----
-
 subject= /C=DE/O=TC TrustCenter GmbH/OU=TC TrustCenter Class 2 CA/CN=TC TrustCenter Class 2 CA II
 serial=2E6A000100021FD752212C115C3B
 -----BEGIN CERTIFICATE-----
@@ -2963,23 +2716,6 @@
 Z05phkOTOPu220+DkdRgfks+KzgHVZhepA==
 -----END CERTIFICATE-----
 
-subject= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
-serial=3C9131CB1FF6D01B0E9AB8D044BF12BE
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
-MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
-BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
-ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
-BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
-I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
-CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
-2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
-2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
------END CERTIFICATE-----
-
 subject= /C=HU/L=Budapest/O=Microsec Ltd./CN=Microsec e-Szigno Root CA 2009/emailAddress=info@e-szigno.hu
 serial=C27E43044E473F19
 -----BEGIN CERTIFICATE-----
@@ -4369,6 +4105,298 @@
 lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv
 KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
 -----END CERTIFICATE-----
+
+subject= /C=BM/O=QuoVadis Limited/CN=QuoVadis Root CA 1 G3
+serial=78585F2EAD2C194BE3370735341328B596D46593
+-----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-----
+
+subject= /C=BM/O=QuoVadis Limited/CN=QuoVadis Root CA 2 G3
+serial=445734245B81899B35F2CEB82B3B5BA726F07528
+-----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-----
+
+subject= /C=BM/O=QuoVadis Limited/CN=QuoVadis Root CA 3 G3
+serial=2EF59B0228A7DB7AFFD5A3A9EEBD03A0CF126A1D
+-----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-----
+
+subject= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root G2
+serial=0B931C3AD63967EA6723BFC3AF9AF44B
+-----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-----
+
+subject= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root G3
+serial=0BA15AFA1DDFA0B54944AFCD24A06CEC
+-----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-----
+
+subject= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G2
+serial=033AF1E6A711A9A0BB2864B11D09FAE5
+-----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-----
+
+subject= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G3
+serial=055556BCF25EA43535C3A40FD5AB4572
+-----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-----
+
+subject= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Trusted Root G4
+serial=059B1B579E8E2132E23907BDA777755C
+-----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-----
+
+subject= /C=CN/O=WoSign CA Limited/CN=Certification Authority of WoSign
+serial=5E68D61171946350560068F33EC9C591
+-----BEGIN CERTIFICATE-----
+MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV
+BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw
+MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX
+b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN
+rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U
+fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc
+f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2
+ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M
+x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR
+aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch
+zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar
+uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K
+mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA
+Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv
+HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H
+EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1
+LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ
+MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e
+JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN
+g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp
+dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab
+R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ
+PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce
+xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+
+J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl
+OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT
+ee5Ehr7XHuQe+w==
+-----END CERTIFICATE-----
+
+subject= /C=CN/O=WoSign CA Limited/CN=CA \xE6\xB2\x83\xE9\x80\x9A\xE6\xA0\xB9\xE8\xAF\x81\xE4\xB9\xA6
+serial=50706BCDD813FC1B4E3B3372D211488D
+-----BEGIN CERTIFICATE-----
+MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV
+BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw
+MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl
+ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r
+D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1
+9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf
+v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk
+UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L
+NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb
++gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V
+qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K
+yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G
+AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK
+J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC
+AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4
+WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6
+yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj
+/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6
+jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2
+ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX
+X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n
+FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D
+u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l
+O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le
+ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1
+2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ==
+-----END CERTIFICATE-----
 # ***** BEGIN LICENSE BLOCK *****
 # This file is a collection of intermediate certificates accumulated
 # from mapreducing valid certificate chains.
@@ -4379,6 +4407,61 @@
 
 # ***** END LICENSE BLOCK *****
 
+subject= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
+serial=3C9131CB1FF6D01B0E9AB8D044BF12BE
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
+2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
+2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
+-----END CERTIFICATE-----
+
+subject= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
+serial=70BAE41D10D92934B638CA7B03CCBABF
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
+lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
+AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
+-----END CERTIFICATE-----
+
+subject= /L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 2 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com
+serial=01
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
+NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
+dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
+WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
+v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
+UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
+IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
+W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
+-----END CERTIFICATE-----
+
 subject= /O=RSA Security Inc./CN=RSA Public Root CA v1/emailAddress=rsakeonrootsign@rsasecurity.com
 serial=BE1C9FD2CDB584A680736366D565F82D
 -----BEGIN CERTIFICATE-----
@@ -4613,29 +4696,54 @@
 UwkB+Q==
 -----END CERTIFICATE-----
 
-subject= /O=Sempra Energy/CN=Sempra Energy Internet Authority
-serial=07271BB2
+subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO ECC Domain Validation Secure Server CA
+serial=510601E63B50673C55EE4E19DA304CA8
 -----BEGIN CERTIFICATE-----
-MIIDojCCAwugAwIBAgIEBycbsjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
-UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
-cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
-b2JhbCBSb290MB4XDTA4MDcyMzEzNDIxNVoXDTE4MDcyMzEzNDExMFowQzEWMBQG
-A1UEChMNU2VtcHJhIEVuZXJneTEpMCcGA1UEAxMgU2VtcHJhIEVuZXJneSBJbnRl
-cm5ldCBBdXRob3JpdHkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKRAkfoN
-GrIAqbDtiVzxu6WtYJ2ANOSwAYNJAOg6l5+uBZKzUrCF2HIIIFyUHg1z3msMIDL7
-hOSCoDXuTbC8N1+mgG1JcfMK3nRzlSONP7fOQ/CpqUi/spSgpQmexg/rogkqBODv
-iGCPn5VCKHa17dg+dBcxWSBdwr2wDAp6d2bdAgMBAAGjggFvMIIBazASBgNVHRMB
-Af8ECDAGAQH/AgECMFMGA1UdIARMMEowSAYJKwYBBAGxPgEAMDswOQYIKwYBBQUH
-AgEWLWh0dHA6Ly9jeWJlcnRydXN0Lm9tbmlyb290LmNvbS9yZXBvc2l0b3J5LmNm
-bTAOBgNVHQ8BAf8EBAMCAYYwgYkGA1UdIwSBgTB/oXmkdzB1MQswCQYDVQQGEwJV
-UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
-cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
-b2JhbCBSb290ggIBpTBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vd3d3LnB1Ymxp
-Yy10cnVzdC5jb20vY2dpLWJpbi9DUkwvMjAxOC9jZHAuY3JsMB0GA1UdDgQWBBSN
-6iYkEayTh4ICmoQBq5UVRnFjwTANBgkqhkiG9w0BAQUFAAOBgQAbsrqwxgpw7F3U
-6TqMLfwBU4LvOV/I6Tu6GdpshB0oW7L8Vt3ULGqI6Zb66qff71kpqB6jNpapi11X
-WjQXYtGMk2dSJZlx3aJhlUcpi3C3kuqddXLbGy/OA/vzdt0OMlXFGfSC+RursWKM
-awpk+hKu3TtQ7Kea64hlNjodQGpviQ==
+MIIDnTCCAyKgAwIBAgIQUQYB5jtQZzxV7k4Z2jBMqDAKBggqhkjOPQQDAzCBhTEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
+IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMzEzMDAw
+MDAwWhcNMjkwMzEyMjM1OTU5WjCBkDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
+ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
+T0RPIENBIExpbWl0ZWQxNjA0BgNVBAMTLUNPTU9ETyBFQ0MgRG9tYWluIFZhbGlk
+YXRpb24gU2VjdXJlIFNlcnZlciBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
+BIg2jdgJVPWaKXk+JD06oiTxihgKVH3tQCza8LqO2YT1Rd03cJEkrLoU61FoIN3S
+SFUAXW9E7ggci/lVXySaVIOjggFlMIIBYTAfBgNVHSMEGDAWgBR1cacZSBm8nZ3q
+QUfflMRId5nTeTAdBgNVHQ4EFgQUu/oI4L9U7lr9FqQ1AgmppMjs/UswDgYDVR0P
+AQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0lBBYwFAYIKwYBBQUH
+AwEGCCsGAQUFBwMCMBsGA1UdIAQUMBIwBgYEVR0gADAIBgZngQwBAgEwTAYDVR0f
+BEUwQzBBoD+gPYY7aHR0cDovL2NybC5jb21vZG9jYS5jb20vQ09NT0RPRUNDQ2Vy
+dGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwcQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUF
+BzAChi9odHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9FQ0NBZGRUcnVzdENB
+LmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMAoGCCqG
+SM49BAMDA2kAMGYCMQDtilgEuIgqZMub1nOMLJwPVr3Lrs/A4RVYuImPsVNTtWG6
+5FL7j6YooeQtlSxIViACMQDvavtMsSKuUzwaH3x8vVhGiljleoI0iloIE64Adby0
+id6I7ObgYgAsmupHtaSvojI=
+-----END CERTIFICATE-----
+
+subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO ECC Domain Validation Secure Server CA 2
+serial=5B25CE6907C4265566D3390C99A954AD
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAyWgAwIBAgIQWyXOaQfEJlVm0zkMmalUrTAKBggqhkjOPQQDAzCBhTEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
+IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwOTI1MDAw
+MDAwWhcNMjkwOTI0MjM1OTU5WjCBkjELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
+ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
+T0RPIENBIExpbWl0ZWQxODA2BgNVBAMTL0NPTU9ETyBFQ0MgRG9tYWluIFZhbGlk
+YXRpb24gU2VjdXJlIFNlcnZlciBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
+QgAEAjgZgTrJaYRwWQKOqIofMN+83gP8eR06JSxrQSEYgur5PkrkM8wSzypD/A7y
+ZADA4SVQgiTNtkk4DyVHkUikraOCAWYwggFiMB8GA1UdIwQYMBaAFHVxpxlIGbyd
+nepBR9+UxEh3mdN5MB0GA1UdDgQWBBRACWFn8LyDcU/eEggsb9TUK3Y9ljAOBgNV
+HQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUEFjAUBggrBgEF
+BQcDAQYIKwYBBQUHAwIwGwYDVR0gBBQwEjAGBgRVHSAAMAgGBmeBDAECATBMBgNV
+HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9FQ0ND
+ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDByBggrBgEFBQcBAQRmMGQwOwYIKwYB
+BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET0VDQ0FkZFRydXN0
+Q0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC5jb21vZG9jYTQuY29tMAoG
+CCqGSM49BAMDA2gAMGUCMQCsaEclgBNPE1bAojcJl1pQxOfttGHLKIoKETKm4nHf
+EQGJbwd6IGZrGNC5LkP3Um8CMBKFfI4TZpIEuppFCZRKMGHRSdxv6+ctyYnPHmp8
+7IXOMCVZuoFwNLg0f+cB0eLLUg==
 -----END CERTIFICATE-----
 
 subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO ECC Extended Validation Secure Server CA
@@ -4663,6 +4771,31 @@
 lnxmeeOBnnCaDIxAcA3aCj2Gtdt3sA==
 -----END CERTIFICATE-----
 
+subject= /C=US/O=DigiCert Inc/CN=DigiCert ECC Secure Server CA
+serial=0ACB28BA465EE53908767470F3CDC612
+-----BEGIN CERTIFICATE-----
+MIIDrDCCApSgAwIBAgIQCssoukZe5TkIdnRw883GEjANBgkqhkiG9w0BAQwFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0xMzAzMDgxMjAwMDBaFw0yMzAzMDgxMjAwMDBaMEwxCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxJjAkBgNVBAMTHURpZ2lDZXJ0IEVDQyBT
+ZWN1cmUgU2VydmVyIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE4ghC6nfYJN6g
+LGSkE85AnCNyqQIKDjc/ITa4jVMU9tWRlUvzlgKNcR7E2Munn17voOZ/WpIRllNv
+68DLP679Wz9HJOeaBy6Wvqgvu1cYr3GkvXg6HuhbPGtkESvMNCuMo4IBITCCAR0w
+EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwNAYIKwYBBQUHAQEE
+KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQgYDVR0f
+BDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xv
+YmFsUm9vdENBLmNybDA9BgNVHSAENjA0MDIGBFUdIAAwKjAoBggrBgEFBQcCARYc
+aHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAdBgNVHQ4EFgQUo53mH/naOU/A
+buiRy5Wl2jHiCp8wHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJ
+KoZIhvcNAQEMBQADggEBAMeKoENL7HTJxavVHzA1Nm6YVntIrAVjrnuaVyRXzG/6
+3qttnMe2uuzO58pzZNvfBDcKAEmzP58mrZGMIOgfiA4q+2Y3yDDo0sIkp0VILeoB
+UEoxlBPfjV/aKrtJPGHzecicZpIalir0ezZYoyxBEHQa0+1IttK7igZFcTMQMHp6
+mCHdJLnsnLWSB62DxsRq+HfmNb4TDydkskO/g+l3VtsIh5RHFPVfKK+jaEyDj2D3
+loB5hWp2Jp2VDCADjT7ueihlZGak2YPqmXTNbk19HOuNssWvFhtOyPNV6og4ETQd
+Ea8/B6hPatJ0ES8q/HO3X8IVQwVs1n3aAr0im0/T+Xc=
+-----END CERTIFICATE-----
+
 subject= /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Trusted Network CA
 serial=071DB8DDABF23F6DD4D452AF401277EB
 -----BEGIN CERTIFICATE-----
@@ -4792,30 +4925,30 @@
 R1uUq27UlTMdphVx8fiUylQ5PsE=
 -----END CERTIFICATE-----
 
-subject= /C=TW/O=TAIWAN-CA.COM Inc./OU=SSL Certification Service Provider/CN=TaiCA Secure CA
-serial=07274E79
+subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO ECC Certification Authority
+serial=4352023FFAA8901F139FE3F4E5C1444E
 -----BEGIN CERTIFICATE-----
-MIID0DCCAzmgAwIBAgIEBydOeTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
-UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
-cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
-b2JhbCBSb290MB4XDTA5MTAwNzE2NTkzNFoXDTE2MDkzMDE2NTg1N1owcTELMAkG
-A1UEBhMCVFcxGzAZBgNVBAoTElRBSVdBTi1DQS5DT00gSW5jLjErMCkGA1UECxMi
-U1NMIENlcnRpZmljYXRpb24gU2VydmljZSBQcm92aWRlcjEYMBYGA1UEAxMPVGFp
-Q0EgU2VjdXJlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1OzjY7jSl
-qX9ZWBR9ssvLkChMkn3mVPSMSS4/JfxQCcx7Ip3e4PCuELnlIAdfp301OJBhDsFo
-3/61E6NXcW/ZuavrXLTcJAWIwYC4UfMoPZUWDvFXvIDUZHeT/9KWWrcb24V0VVhH
-k/n95FRgYAH4bWy68XjUKESGHrYJcfylwQIDAQABo4IBbzCCAWswEgYDVR0TAQH/
-BAgwBgEB/wIBADBTBgNVHSAETDBKMEgGCSsGAQQBsT4BADA7MDkGCCsGAQUFBwIB
-Fi1odHRwOi8vY3liZXJ0cnVzdC5vbW5pcm9vdC5jb20vcmVwb3NpdG9yeS5jZm0w
-DgYDVR0PAQH/BAQDAgEGMIGJBgNVHSMEgYEwf6F5pHcwdTELMAkGA1UEBhMCVVMx
-GDAWBgNVBAoTD0dURSBDb3Jwb3JhdGlvbjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1
-c3QgU29sdXRpb25zLCBJbmMuMSMwIQYDVQQDExpHVEUgQ3liZXJUcnVzdCBHbG9i
-YWwgUm9vdIICAaUwRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL3d3dy5wdWJsaWMt
-dHJ1c3QuY29tL2NnaS1iaW4vQ1JMLzIwMTgvY2RwLmNybDAdBgNVHQ4EFgQU1IUn
-0iekvqteL0Eb6lIkOZlORi4wDQYJKoZIhvcNAQEFBQADgYEASRM0Dm8Ae+lqWYMl
-G090qlR3ZBr4LMx0hjiltLb3bVYrgKesDcuQBDO95wraxKt3UmJKqcUYwM5Ip18g
-cXMo3A1mR7yVWB15fkSwoDXzqnOjKS5uBqPBPJ3vtEZeMns6XVh1eZQKO2eSo+5I
-HsRuVcX/D7yhWkn5ZNTJiTGBdM0=
+MIID0DCCArigAwIBAgIQQ1ICP/qokB8Tn+P05cFETjANBgkqhkiG9w0BAQwFADBv
+MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
+ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
+eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow
+gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
+BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD
+VQQDEyJDT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MHYwEAYHKoZI
+zj0CAQYFK4EEACIDYgAEA0d7L3XJghWF+3XkkRbUq2KZ9T5SCwbOQQB/l+EKJDwd
+AQTuPdKNCZcM4HXk+vt3iir1A2BLNosWIxatCXH0SvQoULT+iBxuP2wvLwlZW6Vb
+CzOZ4sM9iflqLO+y0wbpo4H+MIH7MB8GA1UdIwQYMBaAFK29mHo0tCb3+sQmVO8D
+veAky1QaMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zARBgNVHSAECjAIMAYGBFUdIAAwSQYDVR0f
+BEIwQDA+oDygOoY4aHR0cDovL2NybC50cnVzdC1wcm92aWRlci5jb20vQWRkVHJ1
+c3RFeHRlcm5hbENBUm9vdC5jcmwwOgYIKwYBBQUHAQEELjAsMCoGCCsGAQUFBzAB
+hh5odHRwOi8vb2NzcC50cnVzdC1wcm92aWRlci5jb20wDQYJKoZIhvcNAQEMBQAD
+ggEBAB3H+i5AtlwFSw+8VTYBWOBTBT1k+6zZpTi4pyE7r5VbvkjI00PUIWxB7Qkt
+nHMAcZyuIXN+/46NuY5YkI78jG12yAA6nyCmLX3MF/3NmJYyCRrJZfwE67SaCnjl
+lztSjxLCdJcBns/hbWjYk7mcJPuWJ0gBnOqUP3CYQbNzUTcp6PYBerknuCRR2RFo
+1KaFpzanpZa6gPim/a5thCCuNXZzQg+HCezF3OeTAyIal+6ailFhp5cmHunudVEI
+kAWvL54TnJM/ev/m6+loeYyv4Lb67psSE/5FjNJ80zXrIRKT/mZ1JioVhCb3ZsnL
+jbsJQdQYr7GzEPUQyp2aDrV1aug=
 -----END CERTIFICATE-----
 
 subject= /C=US/O=GeoTrust, Inc./CN=RapidSSL CA
@@ -4974,6 +5107,32 @@
 U0IjskLWj3u+kheyef2OcFlSwLeVgAkc2BIOJBUjDFqakCM=
 -----END CERTIFICATE-----
 
+subject= /C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 ECC 256 bit Extended Validation CA
+serial=4D955D20AF85C49F6925FBAB7C665F89
+-----BEGIN CERTIFICATE-----
+MIID4zCCA2qgAwIBAgIQTZVdIK+FxJ9pJfurfGZfiTAKBggqhkjOPQQDAzCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzQwHhcNMTIxMjIwMDAwMDAwWhcNMjIxMjE5MjM1OTU5WjCBizELMAkG
+A1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQL
+ExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMTwwOgYDVQQDEzNTeW1hbnRlYyBDbGFz
+cyAzIEVDQyAyNTYgYml0IEV4dGVuZGVkIFZhbGlkYXRpb24gQ0EwWTATBgcqhkjO
+PQIBBggqhkjOPQMBBwNCAATdBD2y8pCTl8bpu7yR21Hwo4bt+8bThZMyBUngBINh
+llH/VyGuC9oO5wShf9sqHL3KmDXFcXNAzehqq1SEQybio4IBbTCCAWkwEgYDVR0T
+AQH/BAgwBgEB/wIBADA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLndzLnN5
+bWFudGVjLmNvbS9wY2EzLWc0LmNybDAOBgNVHQ8BAf8EBAMCAQYwNwYIKwYBBQUH
+AQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC53cy5zeW1hbnRlYy5jb20w
+ZQYDVR0gBF4wXDBaBgRVHSAAMFIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc3lt
+YXV0aC5jb20vY3BzMCgGCCsGAQUFBwICMBwaGmh0dHA6Ly93d3cuc3ltYXV0aC5j
+b20vcnBhMCoGA1UdEQQjMCGkHzAdMRswGQYDVQQDExJTWU1DLUVDQy1DQS1wMjU2
+LTMwHQYDVR0OBBYEFEgTZReU7J4WKip0XOhTLbT7g+uOMB8GA1UdIwQYMBaAFLMW
+kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2cAMGQCMFyb7oOjdk2MLQVM
+gjS6s77Oj+jDNIH7QHfoNGxbFys7rdWno9LzZsJPsrDIdpiPvwIwT8IvzpLFqb3O
+fU7UGztmJOpOzYKvVEqI7+O/OpNjVCF9EjDSMs2ryYGwpxFDe0Vm
+-----END CERTIFICATE-----
+
 subject= /C=EE/O=AS Sertifitseerimiskeskus/OU=Sertifitseerimisteenused/CN=KLASS3-SK 2010
 serial=4BB31328
 -----BEGIN CERTIFICATE-----
@@ -5078,33 +5237,6 @@
 jtp6hJA/zytRTsvFkEnZ1gqEkyLCE01gpqzEcxcQ+wqWK3wVfW/3aPKrumjjkw==
 -----END CERTIFICATE-----
 
-subject= /C=US/O=ORC PKI/CN=ORC Public CA 1
-serial=AD7B9382938CF808B0ABEA1542EC1D49
------BEGIN CERTIFICATE-----
-MIID7TCCAtWgAwIBAgIRAK17k4KTjPgIsKvqFULsHUkwDQYJKoZIhvcNAQEFBQAw
-OjEZMBcGA1UEChMQUlNBIFNlY3VyaXR5IEluYzEdMBsGA1UECxMUUlNBIFNlY3Vy
-aXR5IDIwNDggVjMwHhcNMTAxMjA5MTgxMjE5WhcNMTYxMjMxMTU0NDA3WjA5MQsw
-CQYDVQQGEwJVUzEQMA4GA1UEChMHT1JDIFBLSTEYMBYGA1UEAxMPT1JDIFB1Ymxp
-YyBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxsLO/5M51303
-NdgBytCXPeLZ1OkI1WF/lEJA1fvN3nm9M7KZZ0eX0BWshEVfjRvx6hDfrDdM2Sog
-qeDciFMReZewwdeIolVQisPY3/+kkXazRuamW6ty2mVkYL76wPwa3HzWwzcioDux
-5tL2RDdGCWM+99rXPujazkz8f7GWHmruKgIbH4tTDaCokixrhHWZBm2q8y/Li6O7
-Z4XTvpHYHT7BWUEMerM5EPzw+gxGdH9QovwEtiHIIV+uIoe2hh3dUa6/Rb0QTBKi
-2lXTjDHN4b+zoIliKaOSAjikQzUBV4SQgs/PGf2VsF+U0qw+AxKSPqXMWiGdrFeC
-Cy28tOkw+wIDAQABo4HuMIHrMB8GA1UdIwQYMBaAFAfDUTCkqulFrjUk+v8kLDPQ
-sZ2MMHAGA1UdHwRpMGcwZaBjoGGGX2h0dHA6Ly93d3cucnNhc2VjdXJpdHkuY29t
-L3Byb2R1Y3RzL2tlb24vcmVwb3NpdG9yeS9jZXJ0aWZpY2F0ZV9zdGF0dXMvUlNB
-X1NlY3VyaXR5XzIwNDhfdjMuQ1JMMA8GA1UdEwEB/wQFMAMBAf8wFgYDVR0gBA8w
-DTALBgkqhkiG9w0FBgEwDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBQOZLf8mJfB
-SLS2DFy6fYMR64fLTzANBgkqhkiG9w0BAQUFAAOCAQEAE2d9ck9fx6PPm6pZQXoc
-45Iy8giR+DSw7dKnb2SuVd+5Za2KnsrZzhrKePm8nP/Ir0N18zoE6KzJSZ8aiPiE
-WMVq4jSKwlvlOWjJ0F1ZYD+Jzl+prOf6t6TM2hMsqUL+Hf+5x2O9Bs8OWdpVP71o
-iVGIDhoVigeAWHvey8BfJX2n58MMzOubTGTSPdqeqNgTSUznYRVI7bEvSDfVFlHw
-a6p7vZAWzTHnrJtnVzYCgjUWf+Y931DL+6ryGdhakoYeaL5cAuXvgDfADeXK2o9/
-WystOFEPPeX0Kd6TGV3zbplDVSyu4PtrVOeIRjfbyiLthRjbSFry3DpeUIymgsMR
-uQ==
------END CERTIFICATE-----
-
 subject= /C=BE/CN=Belgium Root CA2
 serial=04000000000141A1E134BA
 -----BEGIN CERTIFICATE-----
@@ -5159,6 +5291,33 @@
 Kg/FQg==
 -----END CERTIFICATE-----
 
+subject= /C=US/O=Google Inc/CN=Google Internet Authority G2
+serial=023A76
+-----BEGIN CERTIFICATE-----
+MIID8DCCAtigAwIBAgIDAjp2MA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTYxMjMxMjM1OTU5WjBJMQswCQYDVQQG
+EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy
+bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP
+VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv
+h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE
+ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ
+EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC
+DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7
+qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD
+VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig
+JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF
+BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMBcGA1UdIAQQ
+MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQUFAAOCAQEAJ4zP6cc7vsBv6JaE
++5xcXZDkd9uLMmCbZdiFJrW6nx7eZE4fxsggWwmfq6ngCTRFomUlNz1/Wm8gzPn6
+8R2PEAwCOsTJAXaWvpv5Fdg50cUDR3a4iowx1mDV5I/b+jzG1Zgo+ByPF5E0y8tS
+etH7OiDk4Yax2BgPvtaHZI3FCiVCUe+yOLjgHdDh/Ob0r0a678C/xbQF9ZR1DP6i
+vgK66oZb+TWzZvXFjYWhGiN3GhkXVBNgnwvhtJwoKvmuAjRtJZOcgqgXe/GFsNMP
+WOH7sf6coaPo/ck/9Ndx3L2MpBngISMjVROPpBYCCX65r+7bU2S9cS+5Oc4wt7S8
+VOBHBw==
+-----END CERTIFICATE-----
+
 subject= /O=Cybertrust Inc/CN=Cybertrust SureServer EV CA
 serial=0400000000011025564C93
 -----BEGIN CERTIFICATE-----
@@ -5267,6 +5426,33 @@
 jp/f0vCXArlDz8Q=
 -----END CERTIFICATE-----
 
+subject= /C=FR/O=MINEFI/OU=TELEPROCEDURES/CN=MINEFI-AC TELEPROCEDURES-2
+serial=1121724615F9396E518268938B0E21162A41
+-----BEGIN CERTIFICATE-----
+MIID+DCCAuCgAwIBAgISESFyRhX5OW5RgmiTiw4hFipBMA0GCSqGSIb3DQEBBQUA
+MGoxCzAJBgNVBAYTAkZSMQ8wDQYDVQQKEwZNSU5FRkkxGDAWBgNVBAsTD0FHRU5D
+RSBBVVRPUklURTEwMC4GA1UEAxMnTUlORUZJLUFVVE9SSVRFIERFIENFUlRJRklD
+QVRJT04gUkFDSU5FMB4XDTE0MDUxMjAwMDAwMFoXDTE2MDYwODAwMDAwMFowXDEL
+MAkGA1UEBhMCRlIxDzANBgNVBAoMBk1JTkVGSTEXMBUGA1UECwwOVEVMRVBST0NF
+RFVSRVMxIzAhBgNVBAMMGk1JTkVGSS1BQyBURUxFUFJPQ0VEVVJFUy0yMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnT9tq46eOl3mDw3/0USoHhE1G8MG
+spwYUeGGe1Qgm5lc1ebl7EYnW4HenW1QdiXcsEcpM9Y0L6LcHHEDrjRxdkmLPgVA
+x/cDPeEoB+aJwcBQAqGqXsHbeWRl8tEmmiOrie7J8sInhRg4ImszuQgbPxtQ4oBb
+gQssH/aeBs9XfCSAmwfbkyi8+d1EhgnUPwyenjOb5vZ++QbzwQX/p7FqHneF6lxO
+V3d7XN2hl/8wLJq2x/gKYYPKK0Jf0tezKZ9LuO4uPKhPsXHjK0IZan4AuW+tpXHO
+rdzOwOxl605a+TeFmy6INjlgcPYXSN4JM8WPgs24c7Vv4lPxn0TzdnoW2QIDAQAB
+o4GlMIGiMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMDwGA1Ud
+HwQ1MDMwMaAvoC2GK2h0dHA6Ly93d3cuaWNwLm1pbmVmaS5nb3V2LmZyL2FjLXJh
+Y2luZS5jcmwwHQYDVR0OBBYEFFg1V9G6TGQgv+9+T7Jd3bs9R/TkMB8GA1UdIwQY
+MBaAFD8LbtttybFYQR6HPFkV1iyVDbh2MA0GCSqGSIb3DQEBBQUAA4IBAQBYnjVt
+Wd/Xdw6D5HWKI8xLIkzID6bOzmUiMJvOi/dzEsayhGDFv8MzkPImQVBqNn865xjA
+J3W6Uzl1nvfQldrwb+gXYuR5uqKL8CocLLDhRNOMYDc+ZXf+oXT9/P3C4xsNdXrp
+zTOP1YGG+3Lk8OqhuGki30oE7EwQPvEq4V4vwMaYZ+ZDwiu6dwtntSWflqLsGTuf
+pg3hfzsqoJA3GKdsHw8N8W6FIVH3QW3Agcfvd5OOKdNtfVH83dyFWqsPXYqEZQfo
+HxB/3yKOaFtYP0Wh75+xq2lka/hgdS+6M9hFbEOmYvao8tMw71mmzoP3ZP61Is7t
+8vc7QBsLehiHxiS+
+-----END CERTIFICATE-----
+
 subject= /C=US/O=GeoTrust Inc./OU=Domain Validated SSL/CN=GeoTrust DV SSL CA
 serial=0236D2
 -----BEGIN CERTIFICATE-----
@@ -5429,6 +5615,33 @@
 aLwTDrpEy3UvnK23pdfkdvP/vMA9nfasMw==
 -----END CERTIFICATE-----
 
+subject= /C=NO/O=Buypass AS-983163327/CN=Buypass Class 3 CA 2
+serial=0B
+-----BEGIN CERTIFICATE-----
+MIIEBTCCAu2gAwIBAgIBCzANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
+Q2xhc3MgMyBDQSAxMB4XDTEwMTAyNjA5MTYxN1oXDTE1MDUwOTE0MTMwM1owSzEL
+MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
+VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL1OFdoURRXuCuwTBJpuCKDE8Euzcg0AeCRGq3VdagbChyCECQ5v
+YWwmpHCyFl1b+r2KyWdQBBdG+msAcIYZal5cjZzrTWvbkfiAD/OneMjhqYB0pTQI
+XbTjpPUMOjFM8waNZcqGJqC9H+Z9NkjK5THAK0oOOfKNPHg1MeImbOHVw0fR48Wn
+NrPpnQDt+SbPFSvw+dACDAybx1XgjMPq7pmZDWbkajOz4yCvrgZm6jvAPeT3qkBF
+h7zOZ3IZVdfmRjVahx0iXp5TJ1SsrRr/uCiae1O+NR//XDG3dl9j17HsFlhYRl6E
+vEfVV0OcW94Ret9uBUF73ANZl0b+gwCXnV0CAwEAAaOB8zCB8DAPBgNVHRMBAf8E
+BTADAQH/MB8GA1UdIwQYMBaAFDgU5sjwqaQD9E4+IqNb8tbgrUB0MB0GA1UdDgQW
+BBQiMC7S+/ZLysC4O9IExOly5pebDDAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAow
+CDAGBgRVHSAAMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly9jcmwuYnV5cGFzcy5u
+by9jcmwvQlBDbGFzczNDQTEuY3JsMD4GCCsGAQUFBwEBBDIwMDAuBggrBgEFBQcw
+AYYiaHR0cDovL29jc3AuYnV5cGFzcy5uby9vY3NwL0JQT2NzcDANBgkqhkiG9w0B
+AQUFAAOCAQEAO19knBgMx6Z6k1jNeAdSd7NoGYJPARJlv7CRottaT+FQe24pHHmr
+9BOowz4CQ2mV1KVdg7TFtdqqrCwmkN+pHLxAFWtlFiOfvXlss81kcDXSh5jEFVmx
+oDXXGbBIQg6xLbaFMSLSCd9+rQjBP+HM43w1bsCN2DCv6WRyU5/K87vJ2Z/ydqwF
+Bi9YGG+G9gOYJdwrBIk9P7GhHupHubKuuJr1BVfp1vW28zX6pNscJRx+nlen0dHS
+ETZRZnNQ8ApZMwG8jkm7/QEZy1vE7VdXCyhVTLg58A38ah2rcSWvdqgLLUqHNu5h
+xOmx3zkvIaCnXDmbSFTokapjdY2z+4+j0A==
+-----END CERTIFICATE-----
+
 subject= /C=JP/O=XiPS/CN=XiPS CA
 serial=12B9B0E7
 -----BEGIN CERTIFICATE-----
@@ -5672,6 +5885,33 @@
 jamVk/yj7EWXcZXqHXR0kZaS0NwQF2aVwFYY4ZeJpZNrDeM=
 -----END CERTIFICATE-----
 
+subject= /C=CN/O=CNNIC SSL/CN=CNNIC SSL
+serial=49330066
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIESTMAZjANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD
+TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMTQwNzAx
+MTA0NDE4WhcNMjQwNzAxMTA0NDE4WjA1MQswCQYDVQQGEwJDTjESMBAGA1UEChMJ
+Q05OSUMgU1NMMRIwEAYDVQQDEwlDTk5JQyBTU0wwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCYv+6jDjZnaHUaim+UDGTPF2kC18tuhI05wW5S/lgtcjxl
+8UxcmEo6ySgd4lCj9SJ4/XcpjX0Kg9BdKf2loekQpR2/zaAMEds4yH/Ma0rVTnlA
+onrg8+Ze01Smf2pJVv1HCMyJo/Uo0c4scydEHXey9EltdVoM1HfyBKhx8tgx6t6i
+Qt6lJ35Fi5pj5RO0FCeHIOtpBcGdr85x2/bZcBhD3dopOIgAgVC/F9e8eAVf/w3j
+pdc++Q6QzC45lE4v78JrHP9SqPRJcK35IxeC+12P4W0Pzf6poTDJ/DgYiMG0yNeK
+EUv/HolKk3tC9CsKwvmKPehwUwUTmwGVoFf19GcZAgMBAAGjggEoMIIBJDAfBgNV
+HSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MD8G
+A1UdIAQ4MDYwNAYKKwYBBAGB6QwBBjAmMCQGCCsGAQUFBwIBFhhodHRwOi8vd3d3
+LmNubmljLmNuL2Nwcy8wgYIGA1UdHwR7MHkwQqBAoD6kPDA6MQswCQYDVQQGEwJD
+TjEOMAwGA1UEChMFQ05OSUMxDDAKBgNVBAsTA2NybDENMAsGA1UEAxMEY3JsMTAz
+oDGgL4YtaHR0cDovL3d3dy5jbm5pYy5jbi9kb3dubG9hZC9yb290Y3JsL0NSTDEu
+Y3JsMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQURQC6ihiQUcOxyve8ZTkujFaQRDAw
+DQYJKoZIhvcNAQEFBQADggEBANHrlFgGbl6l/vXQTQow6wIkQ4yu5oK8e0ix+WvK
+DrkdrrRZvkKve0K4Gf0TXMw//fCfsRP/ro5iZdIOud1gtmKk51XpedotW3p8hCSu
+XBSLZGnkSqLmkXoyH9lCuUyohmSxS1mgV9gfB/DBVvmG33gY6PS1mJ26LdRVrQDi
+1NuU0cnAbwUD3FSkKd0xmelZbVXBQwlnpn7m4CaNClDLw3oS/eNqOCw4vIri7xg9
+MLNI62061K69Z5al1eO18/z9LssPZiUZaZF00nflbyLJ5rEAvemQzjCa9YLmgNmN
+yz4XMxnZiUIx01ZZtCSVu1TXVObQQpNlRkg60UNfieRke5A=
+-----END CERTIFICATE-----
+
 subject= /C=FR/O=MINEFI/OU=TELEPROCEDURES/CN=MINEFI-AC TELEPROCEDURES
 serial=112052C1666305FABF8210D12A82B04BAC19
 -----BEGIN CERTIFICATE-----
@@ -5699,33 +5939,6 @@
 zPcRfV02m8znPVzS9BlLA19xlsIGLBzP46DbSNp0/7LUHTHVzA==
 -----END CERTIFICATE-----
 
-subject= /CN=Sempra Energy Secure Server CA1
-serial=610D4BEE00010000000D
------BEGIN CERTIFICATE-----
-MIIEETCCA3qgAwIBAgIKYQ1L7gABAAAADTANBgkqhkiG9w0BAQUFADBDMRYwFAYD
-VQQKEw1TZW1wcmEgRW5lcmd5MSkwJwYDVQQDEyBTZW1wcmEgRW5lcmd5IEludGVy
-bmV0IEF1dGhvcml0eTAeFw0xMzAyMjEyMjUzMTZaFw0xODAyMjEyMzAzMTZaMCox
-KDAmBgNVBAMTH1NlbXByYSBFbmVyZ3kgU2VjdXJlIFNlcnZlciBDQTEwgZ8wDQYJ
-KoZIhvcNAQEBBQADgY0AMIGJAoGBALCGPto5jE1/TtB4J5FFgxX/xYYCuRxsQmk/
-qADPsaQFwsP0eGJxoVy8NlBH2r4VaDQbbNA1ZZ9agH2ILPhtAT5Mmnn1tE+0xVkw
-dczKBI+bwH0G40GhOzL1dK07f4MfzjrLBsz9RWTvkjXVq675G04h+lbH05vSriFf
-PTt4HovvAgMBAAGjggIjMIICHzASBgkrBgEEAYI3FQEEBQIDBAAEMCMGCSsGAQQB
-gjcVAgQWBBQlNxqSNwebaumR9yXOYeBxnoMtQjAdBgNVHQ4EFgQURizn/KbjTcEn
-VHTxpsrch5kFN70wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQD
-AgGGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHwYDVR0jBBgwFoAUjeomJBGsk4eCApqE
-AauVFUZxY8EwgagGA1UdHwSBoDCBnTCBmqCBl6CBlIZMaHR0cDovL3BraTEuc2Vt
-cHJhLmNvbS9wa2kvY3JsL1NlbXByYSUyMEVuZXJneSUyMEludGVybmV0JTIwQXV0
-aG9yaXR5KDEpLmNybIZEaHR0cDovL2NvcnBwa2kvcGtpL2NybC9TZW1wcmElMjBF
-bmVyZ3klMjBJbnRlcm5ldCUyMEF1dGhvcml0eSgxKS5jcmwwgbwGCCsGAQUFBwEB
-BIGvMIGsMFgGCCsGAQUFBzAChkxodHRwOi8vcGtpMS5zZW1wcmEuY29tL3BraS9h
-aWEvU2VtcHJhJTIwRW5lcmd5JTIwSW50ZXJuZXQlMjBBdXRob3JpdHkoMSkuY3J0
-MFAGCCsGAQUFBzAChkRodHRwOi8vY29ycHBraS9wa2kvYWlhL1NlbXByYSUyMEVu
-ZXJneSUyMEludGVybmV0JTIwQXV0aG9yaXR5KDEpLmNydDANBgkqhkiG9w0BAQUF
-AAOBgQCZ8ClGA5vefb+h0eCTgT2RCRFQEBttJYERjZBfMSD225sfdr3S0pbKBPF+
-DxsVnYZFkpkfA8P4RFodBfNo+KdfD7HIwfNAxEL9B9GgG9/WO60X3CuTBzbPX7M+
-jJ3pR2+W5VHwaKJEHmIZmcOl8iwrtNKBUZ/BKTCz0W3mxd0e8A==
------END CERTIFICATE-----
-
 subject= /C=JP/O=CrossTrust/CN=CrossTrust OV CA1
 serial=12B9B0D4
 -----BEGIN CERTIFICATE-----
@@ -5753,33 +5966,6 @@
 F+hfKncL3SlgaTOHpS6X4K1QMPk6r1I3ETjXugazqRh2rvIxh79bt4A=
 -----END CERTIFICATE-----
 
-subject= /C=JP/O=CrossTrust/CN=CrossTrust DV CA1
-serial=12B9B0D5
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIEErmw1TANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJK
-UDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBD
-b21tdW5pY2F0aW9uIFJvb3RDQTEwHhcNMTEwMjI0MDcxMTM3WhcNMjEwMjI0MDcx
-MTM3WjA+MQswCQYDVQQGEwJKUDETMBEGA1UEChMKQ3Jvc3NUcnVzdDEaMBgGA1UE
-AxMRQ3Jvc3NUcnVzdCBEViBDQTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQCgozr55j9hqwOwzmUP8tTpyWz60a0pRYIUAMDQmzPNxsSLQhle7U4Gjcli
-guHvuUfI/8BBYc59aotnDs5mH3uG5icIzSSCiwrvSso/z199232cdJdya5CLqsC+
-A2IgHN1YHa14nJXCciA9IVc3H4qpUHz/3y7zBNbKR12yz110QHmiKhhKcCH4Bqxo
-3ANcz3p/1rWplo6p87e0Mg7WcleIt61bJ4k8jjuKhUi2cBgy6ZCfhZYV3Vfb+qoB
-48vAFrPAsRb1q1cWVWvkGwF0/yPQWQwkbf3x2Px8jZskFcf4L4DeuU5rb5RqJU72
-fRaLT56q8aWE4VguFyDkGxzURQo/AgMBAAGjggEHMIIBAzAdBgNVHQ4EFgQUpvQw
-lC9CzdnDKYeiqz9nt7mfHRowHwYDVR0jBBgwFoAUoHNJmWjchVtl45soL1efvTO8
-B0gwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwSQYDVR0fBEIw
-QDA+oDygOoY4aHR0cDovL3JlcG9zaXRvcnkuc2Vjb210cnVzdC5uZXQvU0MtUm9v
-dDEvU0NSb290MUNSTC5jcmwwUgYDVR0gBEswSTBHBgoqgwiMmxtkhwUBMDkwNwYI
-KwYBBQUHAgEWK2h0dHBzOi8vcmVwb3NpdG9yeS5zZWNvbXRydXN0Lm5ldC9TQy1S
-b290MS8wDQYJKoZIhvcNAQEFBQADggEBAIgdz0qdqqQ08f5vkiaCF26MTZSCHk3T
-NRcofuiZv+VnXH/CzK5eUEnD8kPWZuc0M3lxEr1PuJrDxXdxNuEv1kYbJwwDbH3+
-OaCvK0ZgUF2epENY+Jm6z0wZUgjI4ypY57inJIARm2PR8y+FmpUskQOJM0gTQGOf
-1hoXD4bVMbbZTavoGO8mvI4FbXJAViT69tjlSP9a7tLq6WZ/+DQnYqDtyhS3Zqy8
-xxnO3M6byAM1A3gmBRY70YBetCiUhOn8bECpfe/PoM4X7rsigKeiE5Cq8/JnSwHn
-pmWCdO1zOUxdcFck8sGuZ7l2T+C2ewVjhZ+lJOrdExzuckqGCiw4M1U=
------END CERTIFICATE-----
-
 subject= /C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root
 serial=07278EED
 -----BEGIN CERTIFICATE-----
@@ -6053,6 +6239,34 @@
 qAD38hw=
 -----END CERTIFICATE-----
 
+subject= /C=US/O=GeoTrust Inc./CN=GeoTrust SSL CA - G4
+serial=023A79
+-----BEGIN CERTIFICATE-----
+MIIEIjCCAwqgAwIBAgIDAjp5MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMTQwOTA4MjA0MTEwWhcNMjIwNTIwMjA0MTEwWjBEMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
+U1NMIENBIC0gRzQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCafZho
+EUDBX3LsVbOxY/MyInKRxhYFuwiCMbT27tQYOREvLtpH/lExblvyqQrrL7v1YVll
+VwLNgP/HcDJUif3brply1E8MJrkuYzB93hRbatdSeCH5v7xQ1VQSWdi1NtkhR7g/
+algdjHLhl5XT4UWo8Vrlvv7jU3yl8FLgzzmUDBlx8sAlB0h9HObxOSUvmHlD6Bhy
+9GWGmFoABEfaS1gefIaxSzWmIAAczRs7Il3RkygzEiOUCKrDOvXRxox+mdMYoK2d
+GM9JrRAD95kzJoZGmi+gumxuyIgCt276ep6YSu6aMX0ZFGAM7I8gIzzalya26oBs
+ileeIO5vFyVKMq01AgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjAdBgNVHQ4EFgQUrDLtWsng3jCckFhVJmP2cqZUX+MwEgYDVR0T
+AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCigJoYk
+aHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUFBwEB
+BCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARFMEMw
+QQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3RydXN0
+LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQBhQK0hDwO7ldyJ
+/KPLBXHpHFmXNcL6awWkFsZWRjd0GxvxPizoNxm3lNIPDsW/FAcrNM1btI3HVp0Z
+/AK0npAx+qRExnXd3R8lVKMwTKzb/sSI9zEmGEeuTCAZGseuPpgKFj3SwqZdDS4p
+fbKdx0EyF8qdrjm/kZje50TilZyUXGxCG1nJe2gTqJYJdO5AFKTV18l7M6MPWmmc
+GvpvEkcc3x5McE5t3f4ch7Wd4VQHCYrNvqqoRnhuFvLnkQ7Dr9p2ANHYokYkA6Ua
+hYFWg2MnupCO+WIRuqd8kKkaZrTFvI8pQavrjZmmzJFkutzGpkyztCMmUXJW+fN0
+VZ8ldU8r
+-----END CERTIFICATE-----
+
 subject= /C=US/ST=Illinois/L=Chicago/O=Trustwave Holdings, Inc./CN=Trustwave Domain Validation CA, Level 1/emailAddress=ca@trustwave.com
 serial=4786F656
 -----BEGIN CERTIFICATE-----
@@ -6081,6 +6295,34 @@
 RroCAth0Mg==
 -----END CERTIFICATE-----
 
+subject= /C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
+serial=023A77
+-----BEGIN CERTIFICATE-----
+MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMTQwODI5MjEzOTMyWhcNMjIwNTIwMjEzOTMyWjBHMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXUmFwaWRTU0wg
+U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv
+VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp
+SowLBkMEu/SW4ib2YQGRZjEiwzQ0Xz8/kS9EX9zHFLYDn4ZLDqP/oIACg8PTH2lS
+1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ
+DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM
+QriYrRmIV9cE7Ie/fodOoyH5U/02mEiN1vi7SPIpyGTRzFRIU4uvt2UevykzKdkp
+YEj4/5G8V1jlNS67abZZAgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7
+qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwEgYD
+VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig
+JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF
+BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF
+MEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3Ry
+dXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQCjWB7GQzKs
+rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp
+fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B
+kvwHtnm8hEqddwnxxYny8LScVKoSew26T++TGezvfU5ho452nFnPjJSxhJf3GrkH
+uLLGTxN5279PURt/aQ1RKsHWFf83UTRlUfQevjhq7A6rvz17OQV79PP7GqHQyH5O
+ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh
+gP8L8mJMcCaY
+-----END CERTIFICATE-----
+
 subject= /C=LU/O=LuxTrust s.a./CN=LuxTrust root CA
 serial=07276FAF
 -----BEGIN CERTIFICATE-----
@@ -6165,34 +6407,6 @@
 FjHtbn88AEk83Ecf9A==
 -----END CERTIFICATE-----
 
-subject= /C=US/ST=Virginia/L=Dulles/O=America Online Inc./CN=AOL Member CA
-serial=07
------BEGIN CERTIFICATE-----
-MIIEKzCCAxOgAwIBAgIBBzANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
-bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTA0MDYwNDE3
-MjYzOVoXDTI5MDYwNDE3MjYzOVowZzELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZp
-cmdpbmlhMQ8wDQYDVQQHEwZEdWxsZXMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5l
-IEluYy4xFjAUBgNVBAMTDUFPTCBNZW1iZXIgQ0EwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQD4Y9jxzNYRbwXh1p9DJycl+q9nh3Ss3Nb8wpq9M3JOZbBa
-zev4qWlIOW5oLnEWbp5ZfMJ8ze1uQ9gJQk4Nmn3utVojgdKkW6lRVBzf9oTfGcM+
-lC2NuhD46EMIDzI1bDUx+NbT/Akx1qmheiAGWQzgK42EwzegCB7xNXMQ3U/9DHKT
-Jm6vxRw548rzlW8wwoU9TYQgyD490EDW/gZKGHMLbldn24PBE2aX071ZvH76LzZF
-FM28v6tod79I6xGJTmqE810c5WtqAOZrjUikCbkh3C1mKfRWnvAFaP/MwcmIvNIs
-C68ddBqGaKRtFHTsJID4lbnzLjw9IG8JAjjqOjgFAgMBAAGjgeUwgeIwDgYDVR0P
-AQH/BAQDAgGGMB0GA1UdDgQWBBRhppltJJ8OEYjmOeD+dNEFaVKpQzAfBgNVHSME
-GDAWgBQArdmj9nn2bnSpfzM9gRfXTM8z3jAPBgNVHRMBAf8EBTADAQH/MEgGA1Ud
-IARBMD8wPQYEVR0gADA1MDMGCCsGAQUFBwIBFidodHRwczovL3BraS1pbmZvLmFv
-bC5jb20vQU9ML2luZGV4Lmh0bWwwNQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL2Ny
-bC5hb2wuY29tL0FPTC9NYXN0ZXJDUkwuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQAM
-nbzMHdQukRuvoDrrzV78JSopjrMg4Bc3+vy7xbUUuxxmDm9YX8Zx0BOJx60jC+1M
-uFjB48KkJExldg2zhmRPKLrPlvhlmg6CJvWChU41ILNFzGDuD04glDorL8sjEJtG
-G37DVnVJJKS4TZ8caNTm8i+vju0rt+WWaxw9jb8g028tVC+ceTX92gbeaCAgS69d
-q15mwxRke/cC5ieWrRgeq/OCYPxMX7YKUnuenDsuzjxCXzZta/6hdooiIf1b6L1/
-n85RdEhsrLXRomr6B0Te0NupjRgf8bnF6Crruj07GIzADDCzySEcM0w6SVPUqLq6
-OCM9OmWCXnlxFfglK30Z
------END CERTIFICATE-----
-
 subject= /O=McAfee Inc/CN=McAfee Public CA v1
 serial=55A1BA093A529CB41F12EB6A1FF71EF6
 -----BEGIN CERTIFICATE-----
@@ -6473,34 +6687,6 @@
 VMr0f18BQFDmT/wZrxSTc8Uqr6iSy3s=
 -----END CERTIFICATE-----
 
-subject= /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Level I CA
-serial=047A51
------BEGIN CERTIFICATE-----
-MIIENDCCAxygAwIBAgIDBHpRMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM
-MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
-QTAeFw0wOTAzMDMxMjUyMzBaFw0yNDAzMDMxMjUyMzBaMHYxCzAJBgNVBAYTAlBM
-MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
-ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGjAYBgNVBAMTEUNlcnR1bSBM
-ZXZlbCBJIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAppT58EI4
-A7Ez+x7MIGrEQ0f4nCAe0zq1ld1yq1owFqBVKhKK2bi0JAChDjX83bii6bBeiR1F
-6PZmqO18nMm6dyK/kwKqy/B1jlPnQX5W670KoUkr9t+Jj3Jzqk9MU1Rgv17BqA2Y
-82HqSSa8TYXitDOSxMEQwPfmJHLrZIO0gajSROmtgnzswU/H+UiiapQ64r6mo0pG
-2o2wrqMtvJ5hWHt0Rpb2qNraBjT/5n4pbn+LHbU3Ax09/UjbKEppPPG6tvh/kiv1
-pO5ugDRzBPOM8eFFc7UUve8t0aKw4cc523B29DcpgbP9pmC3kSJ3YYUquKnpVNSn
-jrmUzNp3f49udQIDAQABo4IBATCB/jAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
-/wQEAwIBBjAdBgNVHQ4EFgQUxgW9Yx3i2G4oNh9F7jU8yX9yyjswUgYDVR0jBEsw
-SaFCpEAwPjELMAkGA1UEBhMCUEwxGzAZBgNVBAoTElVuaXpldG8gU3AuIHogby5v
-LjESMBAGA1UEAxMJQ2VydHVtIENBggMBACAwLAYDVR0fBCUwIzAhoB+gHYYbaHR0
-cDovL2NybC5jZXJ0dW0ucGwvY2EuY3JsMDoGA1UdIAQzMDEwLwYEVR0gADAnMCUG
-CCsGAQUFBwIBFhlodHRwczovL3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEB
-BQUAA4IBAQBiRtchcPJVPXoU26Qv6xdrd6nWkwulIHWlrR1LXjaNVJAw7uqGl+f3
-Ut9AtoLg8abDxI5j2TKqUNTnQqX0s2MegOFClVnbJMm1ZXhPWavsbM0Er0C0Rihu
-JzWyH7bETj1ANxbRa0pI04sK84iXj/Lw+I/ytGK205IdWm27JTm0PyIOqYRPQMoR
-dxh95pvE/hFTWg8im7PlmR0V6TudwSgMLMD0HcESzYcacH/u6+YAR6KrVmH6vI1C
-eQRrYxJ3pDFgJws5e7NpLmF5AYI+nDfxL5EDuoNTYwp6raBXFuwoouoZ2wmeibZF
-GU9VMecajP2na0cS2cfJDUVFIeU47tad
------END CERTIFICATE-----
-
 subject= /C=JP/O=Cybertrust Japan Co., Ltd./CN=Cybertrust Japan Public CA G2
 serial=07275C26
 -----BEGIN CERTIFICATE-----
@@ -7229,6 +7415,34 @@
 HQV6R3C2PYDGIilfiCRHxx/PXkQ4z4Uk82T+FEN9nN1Tp2GFc7si
 -----END CERTIFICATE-----
 
+subject= /C=US/O=GeoTrust Inc./OU=Domain Validated SSL/CN=GeoTrust DV SSL CA - G4
+serial=023A78
+-----BEGIN CERTIFICATE-----
+MIIERDCCAyygAwIBAgIDAjp4MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMTQwODI5MjIyNDU4WhcNMjIwNTIwMjIyNDU4WjBmMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UECxMURG9tYWluIFZh
+bGlkYXRlZCBTU0wxIDAeBgNVBAMTF0dlb1RydXN0IERWIFNTTCBDQSAtIEc0MIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA30GUetr35DFDtuoBG1zOY+r6
+baPZau4tmnX51ZxbvTTf2BzJbdgEiNputbe18DCuQNZd+sRTwdQinQROEaaV1UV8
+QQVY4Ezd+e5VvV9G3K0TCJ0s5PeC5gcrng6MNKHOxKHggXCGAAY/Lep8myiuGyiL
+OQnT5/BFpLG6EWeQVXuP3u04XKHh44PEw3KRT5juHMKAqmSlPoNiHMzgnvhawBMS
+faKni6PnnyrXm8rL7ZcBnCiEUQRQQby0/HjpG88U6h8P/C4BMo22NcsKGDvsWj48
+G9OZQx4v973zWxK5B17tPtGph8x3cifU2XWiY0uTNr3lXNe/X3kNszKnC7JjIwID
+AQABo4IBHTCCARkwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwRfap9ZbjKzE4wHQYD
+VR0OBBYEFAtQ7HfvKpv/7AOhCv+txuQqGMc+MBIGA1UdEwEB/wQIMAYBAf8CAQAw
+DgYDVR0PAQH/BAQDAgEGMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9nLnN5bWNi
+LmNvbS9jcmxzL2d0Z2xvYmFsLmNybDAuBggrBgEFBQcBAQQiMCAwHgYIKwYBBQUH
+MAGGEmh0dHA6Ly9nLnN5bWNkLmNvbTBMBgNVHSAERTBDMEEGCmCGSAGG+EUBBzYw
+MzAxBggrBgEFBQcCARYlaHR0cDovL3d3dy5nZW90cnVzdC5jb20vcmVzb3VyY2Vz
+L2NwczANBgkqhkiG9w0BAQsFAAOCAQEAMyTVkKopDDW5L8PHQpPAxhBLAwh2hBCi
+4OdTEifyCtp/Otz9XHlajxd0Q1Ox1dFdWbmmhGTK8ToKWZYQv6mBV4tch9x/4+S7
+BXqgMgkTThCBKB+cA2K89AG1KYNGB7nnuF3I6dHdrTv4NNvB0ZWpkRjtPCw3EU3M
+/lM+UEP5w1ZBrFObbAWymuLgWVcwMrYmThMlzfpIcA91VWAR9TvVXlo8i1sPD2JC
+SGGFixD0wYi/f1+KwtfNK5RcHzRKCK/rromoSHVVlR27wJoBufQDIj7U5lIwDWe5
+wJH9LUwwjr2MpQSRu6Srfw/Yb/BmAMmjXPWwj4PmnFrmtrnFvL7kAg==
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=GAD EG/OU=VR IDENT/CN=VR IDENT EXTERNAL ROOT CA 2011
 serial=07275E1A
 -----BEGIN CERTIFICATE-----
@@ -7257,6 +7471,34 @@
 vK8lysCFLEIHGWZTHS4qEvvsdwLvBnu655+DlydSUwfHQfh3jUsOAg==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=GAD EG/OU=VR IDENT/CN=VR IDENT EXTERNAL ROOT CA 2013
+serial=072790F6
+-----BEGIN CERTIFICATE-----
+MIIERDCCAyygAwIBAgIEByeQ9jANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTEzMDkwNDE5MDc0MVoX
+DTIzMDkwNDE5MDYzNlowWjELMAkGA1UEBhMCREUxDzANBgNVBAoTBkdBRCBFRzER
+MA8GA1UECxMIVlIgSURFTlQxJzAlBgNVBAMTHlZSIElERU5UIEVYVEVSTkFMIFJP
+T1QgQ0EgMjAxMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgNzO4A
+nJ5G5tiqoIcJGWkBQVxi0kdSFpedd3XKK0dkXSBpw1oDY5eFqQkEk36BVC0i63M9
+8DTnwZP4pVVrwEWbIwQr5oDk+SZfgrDrZy/A+G0q7y+HOSHuwH5e7BvhcPBXx0DH
+Yb7cv2SFOb1MGa25OlqHF8V+qoqJmn2vCjaa0prZE6rlf9rGy4VF9Ktu1st1h0Ba
+hi6nqK7GXoOVwGTiD0zUjjBgyu63QFMrdB6Zn8cZeWZx0pj5LMEWLdVp5JBUhtHb
+W0fncVel7Oh5Q7wkhiz168Ex1IFgwCyDSTx5kBqT9l0Yc7v3xB8EE0AkuEOUOGa3
+Ty3pzI66jetcoSECAwEAAaOCARAwggEMMBIGA1UdEwEB/wQIMAYBAf8CAQEwUwYD
+VR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEFBQcCARYtaHR0cDovL2N5YmVy
+dHJ1c3Qub21uaXJvb3QuY29tL3JlcG9zaXRvcnkuY2ZtMA4GA1UdDwEB/wQEAwIB
+hjAfBgNVHSMEGDAWgBTlnVkwgkdYzKz6CFQ2hns6tQRN8DBCBgNVHR8EOzA5MDeg
+NaAzhjFodHRwOi8vY2RwMS5wdWJsaWMtdHJ1c3QuY29tL0NSTC9PbW5pcm9vdDIw
+MjUuY3JsMCwGA1UdDgQlBCNQUk9ELkdUTi5FWFJPT1RDQS5TSUdHRU5SUy4wMDAw
+MjQwMDANBgkqhkiG9w0BAQUFAAOCAQEASnU5rVxwttw61asuj25PLrtKRjpoKzxj
+/PlG5xrc1f6xVWB3S+MwfT1qwUzrZOq48qMqQqKmj0zP2F3CriLdo8ABiFjig/NC
+iksGPvxGfV+kNwRxqil5F8NoQanHSi+xIrqSb221CCXC5Bb+lN/FENdo/8e+mDuG
+wxqpD1GrKXBi7f0pE9ql/fNNYuMUTBA2OEIy8d5fZZoAL+kdbY37/IEJlZ917Y1e
+iPN5VpC0hjrBCjMDBqFvt404HqOJq7uC9JOg7WtQljUXpe1t+aPutiIT+EgO8VXl
+pDcJ4IVrCR1MxY5I6w4Bj7AJERHQWFCS5bzADUrikWqblEk/zSxpOw==
+-----END CERTIFICATE-----
+
 subject= /C=UK/O=Vodafone Group/CN=Vodafone (Corporate Domain 2009)
 serial=07273709
 -----BEGIN CERTIFICATE-----
@@ -7313,6 +7555,34 @@
 E5503Ku9v0Oj/QNcTtjQDkMQuMBTd3HD3rBE3sxy55pK+OYD+duQobI=
 -----END CERTIFICATE-----
 
+subject= /C=JP/O=Cybertrust Japan Co., Ltd./CN=Cybertrust Japan EV CA G2
+serial=040000000001446E1952E6
+-----BEGIN CERTIFICATE-----
+MIIERTCCAy2gAwIBAgILBAAAAAABRG4ZUuYwDQYJKoZIhvcNAQELBQAwOzEYMBYG
+A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
+bCBSb290MB4XDTE0MDIyNjA4MDAwMFoXDTE5MTIxMDA4MDAwMFowVjELMAkGA1UE
+BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMSIwIAYD
+VQQDExlDeWJlcnRydXN0IEphcGFuIEVWIENBIEcyMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArCKKisPZ9Q65mENR+uZiufhKz1jxO27rMNvjs8t53jg3
+VDa06k/sZPEyUaqyKb7W5l2TfDGhrppzvNWT/IEiHHEO6/IYqWwLAaoH3NrxKVH7
+ZKuzUGWom/OOEuK3ApF6h9YF8Ar8gXy2kHxlaZzi+K+hstgEqGnrXqIOYdQRriqF
+KroRaAETF0yx28Z9Bfl9HB8UPoS4c8EZp4a1I747G2+AxXL+ViR3Jedj2eLHMZC9
+Gx07uRhTFDVpHfdsSVIR5/xg3VP8JpSfp0ul0lMq9OpfDlgDazK4ecb0pkTh73NG
+4nvqpHlOo02HeYRgh4QEsuotbzg5xv7G23zwZpdjyQIDAQABo4IBLTCCASkwDgYD
+VR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJFDBey0
+ahVP3OHuhlZcEdAqK41fMFAGA1UdIARJMEcwRQYKKwYBBAGxPgFkATA3MDUGCCsG
+AQUFBwIBFilodHRwOi8vY3liZXJ0cnVzdC5vbW5pcm9vdC5jb20vcmVwb3NpdG9y
+eTA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vY3JsLm9tbmlyb290LmNvbS9jdGds
+b2JhbC5jcmwwOgYIKwYBBQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRwOi8vb2Nz
+cC5vbW5pcm9vdC5jb20vZXZzc2wwHwYDVR0jBBgwFoAUtgh7DXrMrCBMhlYyXs+r
+boUtcFcwDQYJKoZIhvcNAQELBQADggEBAA0gyrDmAxSDnyRrYZpl6ic+O6fMKz0v
+G1cxgOsJbzlm77U8wBroT77atZrcf5CXh26dTKovZaMYCYXw1y/p/IVCg9NQqt1w
+t0PYhNAvCOL00dyfW4qztVOgCrMtCOMLy2XGlHTjxKA0A56hj6nTtQuwM+kXV4nJ
+zsbPpn/b7BcEtqgAlNSM1CoAn8CxHMi6vtYyAPm5CTpa0VAhkCBa6MJwkvf89Q6u
+gwmwXtTFcDCcoCywmpDMxCYlFjXEUIDYHU4mlWEjXaElUusqbucq5qfj2Hg/cpit
+pE9sZ00O6XWRGLdxyrnayanqzlwyafYYWSgzTrrtxddsMz9A/VA46JY=
+-----END CERTIFICATE-----
+
 subject= /C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
 serial=3365500879AD73E230B9E01D0D7FAC91
 -----BEGIN CERTIFICATE-----
@@ -7565,32 +7835,33 @@
 OTsN/SknUh6Dq0gjhVhQs5XGC7Mm4xYtqDDcA1BtXNEMzSqhR5rPIBvbQ4gfwvzg
 -----END CERTIFICATE-----
 
-subject= /C=DE/O=GAD eG/OU=VR IDENT/CN=VR IDENT EXTERNAL ROOT CA 2009
-serial=0727489E
+subject= /C=BE/O=GlobalSign nv-sa/CN=AlphaSSL CA - SHA256 - G2
+serial=040000000001444EF03631
 -----BEGIN CERTIFICATE-----
-MIIETDCCA7WgAwIBAgIEBydInjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
-UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
-cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
-b2JhbCBSb290MB4XDTA5MDgwNTE3MzEzMVoXDTE2MDgwNTE3MzA0M1owWjELMAkG
-A1UEBhMCREUxDzANBgNVBAoTBkdBRCBlRzERMA8GA1UECxMIVlIgSURFTlQxJzAl
-BgNVBAMTHlZSIElERU5UIEVYVEVSTkFMIFJPT1QgQ0EgMjAwOTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKeQvkjveaO0Rz7TBwrFMa/4zNg8spAAZA1d
-Jy9vjbeeBK1jB8+wUD7/N2MMGmTM4wsot9962nyYsoss3OcJAHjpU2gfgtYydz+q
-EheA4P1SxUuyY9l2AT/SHKkLOB7uKrR9nMWYau9e8Z/rbniwDuN0RO3qwThS1xy5
-glViyWZZH7N8kMuqsWrlesq6Gg5q06yt3xFzt0+zFyAKjcbBnHxMZ97Ll56lhsZ1
-e4frbuT5uH/AsB8zq6moqXGgfrKOGgrX40xwDSBP6pDMEEQhMFBpuvsn8zqaGzy4
-zDyq2sODe88f0UF97Svt8SE6lS2TmbrJzILGgYt88QCEQZNh70UCAwEAAaOCAX4w
-ggF6MBIGA1UdEwEB/wQIMAYBAf8CAQEwUwYDVR0gBEwwSjBIBgkrBgEEAbE+AQAw
-OzA5BggrBgEFBQcCARYtaHR0cDovL2N5YmVydHJ1c3Qub21uaXJvb3QuY29tL3Jl
-cG9zaXRvcnkuY2ZtMA4GA1UdDwEB/wQEAwIBhjCBiQYDVR0jBIGBMH+heaR3MHUx
-CzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsT
-HkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5
-YmVyVHJ1c3QgR2xvYmFsIFJvb3SCAgGlMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6
-Ly93d3cucHVibGljLXRydXN0LmNvbS9jZ2ktYmluL0NSTC8yMDE4L2NkcC5jcmww
-LAYDVR0OBCUEI1BST0QuR1ROLkVYUk9PVENBLlNJR0dFTlJTLjAwMDAxNjAwMA0G
-CSqGSIb3DQEBBQUAA4GBAIBqVFa9Y7EtnJTRyiLS5ShQM+3BBSJIOz+mxxv3ir7/
-AAK66yop5aKcUVlvx9kJQ+O5nbqhSQlyqsYCJLyH1Ay2LOV/Jjc1vHDbpGEhsup+
-24tPM9+kubQazh+8xgHgZN2JxCFHpqYurwPIJTJ0IpQNX3EiqFgfd4IuiY4u+Y3j
+MIIETTCCAzWgAwIBAgILBAAAAAABRE7wNjEwDQYJKoZIhvcNAQELBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw
+MDBaFw0yNDAyMjAxMDAwMDBaMEwxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMSIwIAYDVQQDExlBbHBoYVNTTCBDQSAtIFNIQTI1NiAtIEcy
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2gHs5OxzYPt+j2q3xhfj
+kmQy1KwA2aIPue3ua4qGypJn2XTXXUcCPI9A1p5tFM3D2ik5pw8FCmiiZhoexLKL
+dljlq10dj0CzOYvvHoN9ItDjqQAu7FPPYhmFRChMwCfLew7sEGQAEKQFzKByvkFs
+MVtI5LHsuSPrVU3QfWJKpbSlpFmFxSWRpv6mCZ8GEG2PgQxkQF5zAJrgLmWYVBAA
+cJjI4e00X9icxw3A1iNZRfz+VXqG7pRgIvGu0eZVRvaZxRsIdF+ssGSEj4k4HKGn
+kCFPAm694GFn1PhChw8K98kEbSqpL+9Cpd/do1PbmB6B+Zpye1reTz5/olig4het
+ZwIDAQABo4IBIzCCAR8wDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8C
+AQAwHQYDVR0OBBYEFPXN1TwIUPlqTzq3l9pWg+Zp0mj3MEUGA1UdIAQ+MDwwOgYE
+VR0gADAyMDAGCCsGAQUFBwIBFiRodHRwczovL3d3dy5hbHBoYXNzbC5jb20vcmVw
+b3NpdG9yeS8wMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5nbG9iYWxzaWdu
+Lm5ldC9yb290LmNybDA9BggrBgEFBQcBAQQxMC8wLQYIKwYBBQUHMAGGIWh0dHA6
+Ly9vY3NwLmdsb2JhbHNpZ24uY29tL3Jvb3RyMTAfBgNVHSMEGDAWgBRge2YaRQ2X
+yolQL30EzTSo//z9SzANBgkqhkiG9w0BAQsFAAOCAQEAYEBoFkfnFo3bXKFWKsv0
+XJuwHqJL9csCP/gLofKnQtS3TOvjZoDzJUN4LhsXVgdSGMvRqOzm+3M+pGKMgLTS
+xRJzo9P6Aji+Yz2EuJnB8br3n8NA0VgYU8Fi3a8YQn80TsVD1XGwMADH45CuP1eG
+l87qDBKOInDjZqdUfy4oy9RU0LMeYmcI+Sfhy+NmuCQbiWqJRGXy2UzSWByMTsCV
+odTvZy84IOgu/5ZR8LrYPZJwR2UcnnNytGAMXOLRc3bgr07i5TelRS+KIz6HxzDm
+MTh89N1SyvNTBCVXVmaU6Avu5gMUTu79bZRknl7OedSyps9AsUSoPocZXun4IRZZ
+Uw==
 -----END CERTIFICATE-----
 
 subject= /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Global Services CA
@@ -7651,6 +7922,35 @@
 hA==
 -----END CERTIFICATE-----
 
+subject= /C=US/O=GeoTrust Inc./CN=GeoTrust EV SSL CA - G5
+serial=3CB6BC2996B37A14A792D1E5D8EC335A
+-----BEGIN CERTIFICATE-----
+MIIETjCCAzagAwIBAgIQPLa8KZazehSnktHl2OwzWjANBgkqhkiG9w0BAQsFADBY
+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
+R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNDA5
+MDkwMDAwMDBaFw0yNDA5MDgyMzU5NTlaMEcxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMSAwHgYDVQQDExdHZW9UcnVzdCBFViBTU0wgQ0EgLSBH
+NTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALiytAioX4l4sarlK5g0
+BYeP+4S5HLVRTHGMVAQTUYTlM5ZYxNwAfm+bH8CNOQqWUzwe3rkhS8CUmX6JoxbR
+oIVIGWJuw6lcPaGS5VIll6uiELuHMDBdAkT/W6+xzT99Nz65VuqiPtk5n3NklFjm
+sm63B5kQP9GGKWaurzJD9Ow46WS0mEl1eiWt5NWNcjP4ztOKOe8xXWJrWP0KJY+R
+m1KS8rJea0JO6vcpgdWxTBqr4LmdE7mK7mhQ4r5ePVUMt3Exsnkb08yLi82fvK9P
+3bJzcLa56w7CsHr+UDqWlzRbF5igsYYRq3gHkQMv3rf+jo4Yhg7K0n2iNiCRntJb
+rnsCAwEAAaOCASMwggEfMBIGA1UdEwEB/wQIMAYBAf8CAQAwLgYIKwYBBQUHAQEE
+IjAgMB4GCCsGAQUFBzABhhJodHRwOi8vZy5zeW1jZC5jb20wVAYDVR0gBE0wSzBJ
+BgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHBzOi8vd3d3Lmdlb3RydXN0LmNvbS9y
+ZXNvdXJjZXMvcmVwb3NpdG9yeS9sZWdhbDAzBgNVHR8ELDAqMCigJqAkhiJodHRw
+Oi8vZy5zeW1jYi5jb20vR2VvVHJ1c3RQQ0EuY3JsMA4GA1UdDwEB/wQEAwIBBjAd
+BgNVHQ4EFgQUCCUHIUdsMf4IWA6m6i/n2xtiaMowHwYDVR0jBBgwFoAULNVQQZcV
+i/CPNmFbSvtr2ZnJM5IwDQYJKoZIhvcNAQELBQADggEBAF1R8Szzu5OMY7OiWTNj
+HO5PB2c0mPIxksmUmEjCJegoF4ihMiIKqE4IMLXhCZs7/oS8CRSFjmS3DVeqTz8i
++Bk6o/AhXwsv1ZYT9eEBWKOxrSTJfeGoLsQz9OgRE/3UhCraAv+9/SvJ1PvKkglH
+Gv67K+Uw5ezBOxfWtdM2wJkTEqzDxcDPhVQufIxinAc57tcih1ozO0/Hut7/pZeh
+t9PJ6UTl4xktKfeEoogi/OpDyPzvqcButxv2jDBJTcTQmq+tqgBsIazwVLold69R
+Dqvo9DWpRk/xacqN4oaYFLN006qDRiWqklrM0vEL81FZFWhFXs/qTuq81dXyni30
+YKo=
+-----END CERTIFICATE-----
+
 subject= /C=FR/O=Gouv/OU=Journaux officiels/OU=0002 16000102000017/CN=AC JO Racine
 serial=112166E8BCCC63D1FF5E58673978F0483310
 -----BEGIN CERTIFICATE-----
@@ -7709,6 +8009,35 @@
 eIg=
 -----END CERTIFICATE-----
 
+subject= /C=US/O=GeoTrust Inc./CN=GeoTrust SSL CA - G3
+serial=023A6F
+-----BEGIN CERTIFICATE-----
+MIIETzCCAzegAwIBAgIDAjpvMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMTMxMTA1MjEzNjUwWhcNMjIwNTIwMjEzNjUwWjBEMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
+U1NMIENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDjvn4K
+hqPPa209K6GXrUkkTdd3uTR5CKWeop7eRxKSPX7qGYax6E89X/fQp3eaWx8KA7UZ
+U9ulIZRpY51qTJEMEEe+EfpshiW3qwRoQjgJZfAU2hme+msLq2LvjafvY3AjqK+B
+89FuiGdT7BKkKXWKp/JXPaKDmJfyCn3U50NuMHhiIllZuHEnRaoPZsZVP/oyFysx
+j0ag+mkUfJ2fWuLrM04QprPtd2PYw5703d95mnrU7t7dmszDt6ldzBE6B7tvl6QB
+I0eVH6N3+liSxsfQvc+TGEK3fveeZerVO8rtrMVwof7UEJrwEgRErBpbeFBFV0xv
+vYDLgVwts7x2oR5lAgMBAAGjggFKMIIBRjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjAdBgNVHQ4EFgQU0m/3lvSFP3I8MH0j2oV4m6N8WnwwEgYDVR0T
+AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNgYDVR0fBC8wLTAroCmgJ4Yl
+aHR0cDovL2cxLnN5bWNiLmNvbS9jcmxzL2d0Z2xvYmFsLmNybDAvBggrBgEFBQcB
+AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9nMi5zeW1jYi5jb20wTAYDVR0gBEUw
+QzBBBgpghkgBhvhFAQc2MDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuZ2VvdHJ1
+c3QuY29tL3Jlc291cmNlcy9jcHMwKQYDVR0RBCIwIKQeMBwxGjAYBgNVBAMTEVN5
+bWFudGVjUEtJLTEtNTM5MA0GCSqGSIb3DQEBCwUAA4IBAQCg1Pcs+3QLf2TxzUNq
+n2JTHAJ8mJCi7k9o1CAacxI+d7NQ63K87oi+fxfqd4+DYZVPhKHLMk9sIb7SaZZ9
+Y73cK6gf0BOEcP72NZWJ+aZ3sEbIu7cT9clgadZM/tKO79NgwYCA4ef7i28heUrg
+3Kkbwbf7w0lZXLV3B0TUl/xJAIlvBk4BcBmsLxHA4uYPL4ZLjXvDuacu9PGsFj45
+SVGeF0tPEDpbpaiSb/361gsDTUdWVxnzy2v189bPsPX1oxHSIFMTNDcFLENaY9+N
+QNaFHlHpURceA1bJ8TCt55sRornQMYGbaLHZ6PPmlH7HrhMvh+3QJbBo+d4IWvMp
+zNSS
+-----END CERTIFICATE-----
+
 subject= /DC=com/DC=sanpaoloimi/DC=corp/CN=Intesa Sanpaolo CA Servizi Esterni
 serial=072796C8
 -----BEGIN CERTIFICATE-----
@@ -7970,35 +8299,6 @@
 pdsvt1cqDw==
 -----END CERTIFICATE-----
 
-subject= /C=JP/O=Japan Certification Services, Inc./CN=SecureSign Public CA11
-serial=03
------BEGIN CERTIFICATE-----
-MIIEVDCCAzygAwIBAgIBAzANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
-MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
-A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwOTA2NTFaFw0yOTA0
-MDgwNDU2NDdaMFsxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
-Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMR8wHQYDVQQDExZTZWN1cmVTaWduIFB1Ymxp
-YyBDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA16tNcWt7oV+4
-5tYThbu1Qbb812aYfoVnVqq59lPX/iJSMyCq9Ya6Eh5T6k4sPeCN70WdyOOLtGkJ
-kaz/bWp3yNbXXY8ICuCqopsKuA+Xc7/FS6Ggv3ROPDXTkYKaLjvezNFEkh7lu6lp
-+mJAr1BldiaWWTUHqT2JcHLqiaDvcw6XoCYtsmnlKaU5aTswTEk4aSQ7o/Skk9Yl
-ZeLdCABfWfN0l58adzUfrAXolDR9Gub1ZQLFOf3R/dhxegE6WDnpWkaaL9RrNh0B
-Fei0zVPK49nUcGiQiYDwUIcplwKpRuHfImV667F51HTbmb71x6GyqVrl0uqeHG0a
-Zxc62Gi0wQIDAQABo4IBJDCCASAwHQYDVR0OBBYEFGRLtQXAVoZbJE2KM7Uefg+R
-c/CTMA4GA1UdDwEB/wQEAwIBBjBTBgNVHSAETDBKMEgGCCqDCIybCwQCMDwwOgYI
-KwYBBQUHAgEWLmh0dHBzOi8vY3AuamNzaW5jLmNvLmpwL1NlY3VyZVNpZ24vQUQv
-UlBBLmh0bWwwDwYDVR0TAQH/BAUwAwEB/zCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0
-dHA6Ly9zc2lnbmFkY3JsMDEuamNzaW5jLmNvLmpwL3JlcG9zaXRvcnkvY3JsL3Jj
-YS5jcmwwPaA7oDmGN2h0dHA6Ly9zc2lnbmFkY3JsMDIuamNzaW5jLmNvLmpwL3Jl
-cG9zaXRvcnkvY3JsL3JjYS5jcmwwDQYJKoZIhvcNAQEFBQADggEBADIzQcrO6Fv+
-3R0hy3joVo9zOwvOH3/kRTtbM6cCcR9vfwwA6eD3SZuQ2+ZWNiEPHjJkrJrk+i0O
-k0ZAxKf/aj2eaZU4rJZPCJH8oe6B0VSA04MExRQxAhRTProeYvEoDWLryYzTXsgW
-3sAFQ268S/phiZBNQAmlTRqYJvZJn4vOaziMHy6cWAyszWzpyIRlK8TB8qnnfUr1
-AWpMZjKMzrnjjR35jznPNdVN/qISeumic2SD9gUKn8v41JFs3+01WawkvdPF3CvL
-MjSzVLpiSDKqL6pONY6RwrcZRw1DWWRE96ga+HlL5FZBXRJ3DAN0yACr9iW4sgeh
-BdVWDfBx8z0=
------END CERTIFICATE-----
-
 subject= /C=JP/L=Academe2/O=National Institute of Informatics/OU=UPKI/OU=NII Open Domain CA - G2
 serial=12B9B0C7
 -----BEGIN CERTIFICATE-----
@@ -8434,6 +8734,35 @@
 hcC8roQwkHT7HvfYBoc74FM=
 -----END CERTIFICATE-----
 
+subject= /C=BE/O=GlobalSign nv-sa/CN=GlobalSign Extended Validation CA - SHA256 - G2
+serial=040000000001444EF04A55
+-----BEGIN CERTIFICATE-----
+MIIEXTCCA0WgAwIBAgILBAAAAAABRE7wSlUwDQYJKoZIhvcNAQELBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQwMjIwMTAwMDAwWhcNMjExMjE1
+MDgwMDAwWjBiMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1z
+YTE4MDYGA1UEAxMvR2xvYmFsU2lnbiBFeHRlbmRlZCBWYWxpZGF0aW9uIENBIC0g
+U0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCj6qHS
+w0nl9xxdr8OSQq+KPNzvTOYvXwwrn4pQMGbvTshPIUr25/JOG4xTV7CeyFv3uEZV
+sxrtwmr+9BvsSEYOj+D74JEZ35kYby5Rr9r2mspkb5lUEHTqPMiqgE1DN/vIpH8F
+nTeSvZgANVqvu1t0FQ68vMbpt4bn7q5NSwRMK6C0ZUi4wzrNdbs3yUrAARHZvz8V
+hmAZazQgRvWGZg8k9Mxin5+eHf0QpJle8EHrsJT/LLM21usdpxdf385qd8eaxDJj
+pwat8xIbnTByWQvrcusq0nd7kXfbAPzYb/Uv2HrFDDqge16Q852EWcgB2ZE3VuU6
+U5OtYEknJdnh2oLXAgMBAAGjggEoMIIBJDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0T
+AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU2kB3Q2Uc+P6n4/Rkgj5NQxMiMQIwRwYD
+VR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3Lmdsb2Jh
+bHNpZ24uY29tL3JlcG9zaXRvcnkvMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9j
+cmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC1yMi5jcmwwPQYIKwYBBQUHAQEEMTAvMC0G
+CCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290cjIwHwYD
+VR0jBBgwFoAUm+IHV2ccHsBqBt5ZtJot39wZhi4wDQYJKoZIhvcNAQELBQADggEB
+AEDvEpCDdJaK+Tq6m1lKM9PvTBMrtZHLyZbtbvVsZPHGhLJGWVpYglLxNKBUQWQg
+q9hXO9QUdHEYNswTwcdwwPVFZg5xroevkpTrcUAJ9Mx39xuThYpKrjOF5nSu9RCm
+PslZg8P5XJb5KPc0e+k4xpE8T3FYdf7hVnV2zUDEFUA5qUH9ZBAPl4UH6Hlk0FtN
+TJsnl9NzXpJ+H0jiyrkFl07vLBxrTYpfeFOVzQI5wi/maU/2cdGZtX9tIN5Dj9sA
+G6M7N97RP23ztpB2Haydb4RPJJQJduCdqE33TTePpC9fS0HkSRaXzHtsrxHKllQJ
+iyRRrl3tovG7UxBNl/oadwM=
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=T-Systems International GmbH/OU=Trust Center Services/CN=TeleSec ServerPass CA 1
 serial=072742C2
 -----BEGIN CERTIFICATE-----
@@ -8521,35 +8850,6 @@
 S5Q55daxgepJZbMfSeNmfFZ2bA==
 -----END CERTIFICATE-----
 
-subject= /C=DE/ST=Hamburg/L=Hamburg/O=TC TrustCenter for Security in Data Networks GmbH/OU=TC TrustCenter Class 2 CA/emailAddress=certificate@trustcenter.de
-serial=929100010002FF35AA3A9131258C
------BEGIN CERTIFICATE-----
-MIIEXzCCA0egAwIBAgIPAJKRAAEAAv81qjqRMSWMMA0GCSqGSIb3DQEBBQUAMHYx
-CzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRlciBHbWJIMSIwIAYD
-VQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSUwIwYDVQQDExxUQyBUcnVz
-dENlbnRlciBDbGFzcyAyIENBIElJMB4XDTA3MTEyNjE2MDEyM1oXDTI1MTIzMTIy
-Mjk1N1owgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQH
-EwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkg
-aW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
-bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRl
-ci5kZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA2jjo7TIAKXGDAQ2/jAHc
-2satOaSpii/Vi1xoX1DGYvVmvcqRIuyqHVHXPbNRsoNOXctJsPBMVeVrLceFCzAc
-kk6C1MoC7fdvvtzg4xS4BVPymvRWi1qehZPRtIJWrk27qEtXFrz++Fie+CmNsHvN
-eMlPrItnDPGc+/xXm1dcTw0CAwEAAaOCASUwggEhMEIGCCsGAQUFBwEBBDYwNDAy
-BggrBgEFBQcwAYYmaHR0cDovL29jc3AudGNjbGFzczItSUkudHJ1c3RjZW50ZXIu
-ZGUwHwYDVR0jBBgwFoAU46tUTICh21ZDt5FKy/OCehNcCKswDwYDVR0TAQH/BAUw
-AwEB/zBFBgNVHSAEPjA8MDoGBFUdIAAwMjAwBggrBgEFBQcCARYkaHR0cDovL3d3
-dy50cnVzdGNlbnRlci5kZS9ndWlkZWxpbmVzMA4GA1UdDwEB/wQEAwIBBjBSBgNV
-HR8ESzBJMEegRaBDhkFodHRwOi8vY3JsLnRjY2xhc3MyLWlpLnRydXN0Y2VudGVy
-LmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybDANBgkqhkiG9w0BAQUFAAOC
-AQEAcF/geGiuLfY4w3n/JhObAP4AF60FbybVEao4UyHuIAyTotXMiW4mLWALLKss
-K8ayLpTOJS02nvdH5WTRlz+ingMcxGkOCJqNzqpG19EoAGx+4mZmi+bX+vHpbzIs
-CcMhY5rpCyb8Tgq/oJnB/aHzTxOUz1fWLfCGAgU4fC0bzYdzPK30uo2CcdWMcbrb
-6jjQmBXvALkvk4OMyoeYBPOsiSpHlxED6kLuLldUFz+IxI257YL2a464aXrF7VZE
-bJSC4vxayl5kOGgvHbUAo11YSKQV8V+18os6ie7HWLY7wJ0FHL6GOnYbfnV1EAtD
-lHA6DpKRfkOsnriUz3IcygIPBA==
------END CERTIFICATE-----
-
 subject= /C=US/O=WoSign, Inc./CN=WoSign SGC Server Authority
 serial=54030193BF4D55BF8BF904A7C5AC72AE
 -----BEGIN CERTIFICATE-----
@@ -8637,35 +8937,6 @@
 wFZUTKiL8IkyhtyTMr5NGvo1dbU=
 -----END CERTIFICATE-----
 
-subject= /C=US/O=Bechtel Corporation/OU=Information Security/CN=Bechtel External Policy CA 1
-serial=07272B51
------BEGIN CERTIFICATE-----
-MIIEYTCCA8qgAwIBAgIEBycrUTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
-UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
-cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
-b2JhbCBSb290MB4XDTA5MDIxODE4MjUyMloXDTE2MDIxODE4MjQ1MFowcTELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0JlY2h0ZWwgQ29ycG9yYXRpb24xHTAbBgNVBAsT
-FEluZm9ybWF0aW9uIFNlY3VyaXR5MSUwIwYDVQQDExxCZWNodGVsIEV4dGVybmFs
-IFBvbGljeSBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuVkT
-3jGRa9ZZ/BjD8HMkSdf1aHPtNuslK4sFBBwcksf8PBSTBLTqbKaBUZ1zMMBPTJb/
-oXtu5p9DOeeUqIj/um9S+vStnXhH8JxO1OwsNFSjfFg7Ehdecxxfdk4rOjzoDkhx
-2khEVTQCxvwnZZTvoBR6Fp9YW3nYiZKZbRJ5KlrjsSapnBhvyTcHCs4AyLmULip0
-mSD/k8DKUwhjQwq1Dhmu86iB9S6bowfLCDInyxQDo06LpcoAcGBNAWoyCMtPDQ5w
-JTzYWjA3SjfFGUXPMPpOGpAos6rB1WjYGmTrrFNLeM5KGtKqqaeCb28UAV3dpA1D
-/FkUegS7VQou4BQ06QIDAQABo4IBfDCCAXgwEgYDVR0TAQH/BAgwBgEB/wIBATBg
-BgNVHSAEWTBXMEgGCSsGAQQBsT4BADA7MDkGCCsGAQUFBwIBFi1odHRwOi8vY3li
-ZXJ0cnVzdC5vbW5pcm9vdC5jb20vcmVwb3NpdG9yeS5jZm0wCwYJKwYBBAH9UgIC
-MA4GA1UdDwEB/wQEAwIBhjCBiQYDVR0jBIGBMH+heaR3MHUxCzAJBgNVBAYTAlVT
-MRgwFgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy
-dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xv
-YmFsIFJvb3SCAgGlMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cucHVibGlj
-LXRydXN0LmNvbS9jZ2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwHQYDVR0OBBYEFEp2
-9h7LAj46K3wTqLPZqahch2RiMA0GCSqGSIb3DQEBBQUAA4GBAI7H+opi6enEzPbd
-EgBG/dB3RN6mmhs+xbgYZwtpuxivE+PQ5NnZPESjJoyFzztd9X4jb6wCom/ZG851
-zS1FXD8qBKas/v4MendDHGOY6Hgr/byxYGr39ML+HRHRP46FkiveRvAdUyCPXspo
-R33gb+P84IQWD0e2+ka8h6bTaDGk
------END CERTIFICATE-----
-
 subject= /C=US/O=SAIC/OU=PKI/CN=SAIC Public Policy CA 01
 serial=072746AA
 -----BEGIN CERTIFICATE-----
@@ -8695,6 +8966,35 @@
 brwl14xOGbe3yA94mMJVgIbZ3Rp0
 -----END CERTIFICATE-----
 
+subject= /C=US/O=AffirmTrust/OU=http://www.affirmtrust.com/resources/CN=AffirmTrust Commercial Extended Validation CA
+serial=631BF90C8AB02C81
+-----BEGIN CERTIFICATE-----
+MIIEYjCCA0qgAwIBAgIIYxv5DIqwLIEwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBDb21tZXJjaWFsMB4XDTEwMDUxODAxMzY0NVoXDTMwMTIzMTE0MDYwNlowgYox
+CzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEtMCsGA1UECwwkaHR0
+cDovL3d3dy5hZmZpcm10cnVzdC5jb20vcmVzb3VyY2VzMTYwNAYDVQQDDC1BZmZp
+cm1UcnVzdCBDb21tZXJjaWFsIEV4dGVuZGVkIFZhbGlkYXRpb24gQ0EwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkMcRZDNB2BlxC7SlYaCkiA3eTcQRh
+Lbri5nbZZZCtm+jJtbBkyv/JjszLZrf6hBtJK0Q8Xx4UDAY1SeW72x/DaLCqnrg2
+WG8kKO51ksSZ4/261CXicikFUolHafc6nsMuOLCfsmY0koB2yWd1S2m/ZmswQh0S
+RxnT/y3zijCrlMXIqNcDWDr3VMD4FcUKfxcQW3kUL4soFDAVB9TnmZiRIAZ/duRX
+Oqwslo5t3hu3MgKAcLw/r3dvJKrE+GLvVUcn/s0TuZEu07Ae7g/lQ6Qvrosg0f0Q
+Yej3ajaxhD0EylFgaY4/xz6Pmm1WLqej7WlINr0PmFFt9B75Yst53/jVAgMBAAGj
+ggEPMIIBCzAdBgNVHQ4EFgQUpqEXuOwGuj4hWo64KEDhUS1EJtwwDwYDVR0TAQH/
+BAUwAwEB/zAfBgNVHSMEGDAWgBSdk8ZTi17Krz+fHg/lmZW8JPaUjzBdBgNVHSAE
+VjBUMAwGCisGAQQBgo8JAgEwRAYKKwYBBAGCjwkBATA2MDQGCCsGAQUFBwIBFiho
+dHRwOi8vd3d3LmFmZmlybXRydXN0LmNvbS9yZXNvdXJjZXMvY3BzMEkGA1UdHwRC
+MEAwPqA8oDqGOGh0dHA6Ly9jcmwuYWZmaXJtdHJ1c3QuY29tL2NybC9BZmZpcm1U
+cnVzdENvbW1lcmNpYWwuY3JsMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAQEAW76fwA8wBjh0wBk6KcxkZPPh3jbzi2OT9KqisljK0ZOpUQI+sgHydjy7
+ecnNwdVtFp7acdOdcIPnREVVP6q7LggsdReN9/SYZAxQgTaBQGhTXJn1e0ZrklZ6
+tTpWn8IzfUkYz0PJYtiZJ9okjENaIYQ3xK9Iz+n3wJaYs853+nql6ONXaJu6Db84
+6aWZB8abJyeo1gfYr3W/0iSV/UjXFXmjaGzPmWgEWxSXsEtOOvSe+oknn/Z/L9B+
+3xcOSPAJ116rknMiK/vag3aD54JzxVdjmwDKjsnYeQ6JGO1WVDyPzRYbEXFtkaFq
+3cG6zepDXVFb2Yzu4cd+io0d4qPU+w==
+-----END CERTIFICATE-----
+
 subject= /C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
 serial=0400000000013189C644C9
 -----BEGIN CERTIFICATE-----
@@ -8724,33 +9024,33 @@
 gA/7zuIpalhQ6abX6xwyNrVip8H65g==
 -----END CERTIFICATE-----
 
-subject= /O=Dell Inc./CN=Dell Inc. Enterprise Issuing CA1
-serial=152C3972000000000016
+subject= /O=Dell Inc./CN=Dell Inc. Enterprise Utility CA1
+serial=53CE7B8F000000000019
 -----BEGIN CERTIFICATE-----
-MIIEYzCCA0ugAwIBAgIKFSw5cgAAAAAAFjANBgkqhkiG9w0BAQUFADA2MRIwEAYD
+MIIEYzCCA0ugAwIBAgIKU857jwAAAAAAGTANBgkqhkiG9w0BAQUFADA2MRIwEAYD
 VQQKEwlEZWxsIEluYy4xIDAeBgNVBAMTF0RlbGwgSW5jLiBFbnRlcnByaXNlIENB
-MB4XDTEwMDYyMjE2NDYwMloXDTE1MDYyMjE2NTYwMlowPzESMBAGA1UEChMJRGVs
-bCBJbmMuMSkwJwYDVQQDEyBEZWxsIEluYy4gRW50ZXJwcmlzZSBJc3N1aW5nIENB
-MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ7IXSR5s3pBXpHS6VMx
-+W/IxpJoZKKA4gJ4TkVTs15lax9dSooRoUDHxJx1h9cg5OybbbDNKRhesKv6RV0J
-8hhn36zn2T9TyfnCIBOwqbZUjUY5i3pBXr8NiXpYQlYXDlQHN4ZZV4n59co837m+
-pnBbbNPRRylifEMkMCnhM8mA1vzH7WJs5FEXyJ9ZKO44Bbq7RVIoGMlSR1zDZ72U
-Cp1KPY6GMBsrryajzA+HpWmZ7PJadfYWwjLI+iX2H4lqp2X7VqNU3YXhF0rcVPuw
-rslu5HY3CpVM/z1UoEx1pkl1PRyGCAIC7ooKRih5zKhLQIWZskqzFxfPw4TiGWzP
-YR0CAwEAAaOCAWgwggFkMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUC
-BBYEFI2me8o7gSm2NowGyQ4kBAAzxgFrMB0GA1UdDgQWBBTQvrZI9RS6N6kH1jvh
-U/TWW+4WkDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYw
+MB4XDTEwMDgyNjE2MTcyN1oXDTE1MDgyNjE2MjcyN1owPzESMBAGA1UEChMJRGVs
+bCBJbmMuMSkwJwYDVQQDEyBEZWxsIEluYy4gRW50ZXJwcmlzZSBVdGlsaXR5IENB
+MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALbx5aL9Hxzb+xRJOZ7B
+4wQ9borMAI3jvYMMznKkLG5AsMlG6/OhoMTsWIsX+jVVublte02nfTsOUxHIJXIV
+RJyWY/Q3Tcd1B9JrH/mhmEMKO3VTlT0+Puh3sIqKdj5tN99L9h+14IkNcEm+1NIG
+V9IiNveUDxCeNEubzhjZVC88iNSyFC/eQUU+nzfSJ8CRHymE3V38Np2pqPG5gos6
+fKRxnUwdIs7tlyx8fv0hGHgteVKd/3WwRCqmgKQv7Q3aeB41IZWVHjd3/qQAYVSh
+fQUbUNwLYU8J666j4uq7EeE/Tcf33VRAtpeJQ8nmpvZBX9MYg85tdMZODqpo3s6d
+uysCAwEAAaOCAWgwggFkMBIGCSsGAQQBgjcVAQQFAgMBAAIwIwYJKwYBBAGCNxUC
+BBYEFNndUa83YX9/if+wufxuZSdOGzcOMB0GA1UdDgQWBBT6RPoh9miyIEdXzv7H
+AvjH5YZ91TAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYw
 EgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAWgBSkZiEOAUG49enxccbQONIF
 NWmqEzBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vZGVsbGluY2NhLmRlbGwuY29t
 L2NybC9EZWxsJTIwSW5jLiUyMEVudGVycHJpc2UlMjBDQS5jcmwwWwYIKwYBBQUH
 AQEETzBNMEsGCCsGAQUFBzAChj9odHRwOi8vZGVsbGluY2NhLmRlbGwuY29tL2Ny
 bC9EZWxsJTIwSW5jLiUyMEVudGVycHJpc2UlMjBDQS5jcnQwDQYJKoZIhvcNAQEF
-BQADggEBAI2mkXt/vgyQ6wPaavy3Xh/q+HJ4e5RcdYW45KoL6fIO0/Cm7CcZIn9w
-MFj29lRcnf7nVZqYt4JzwLrpMIc2i8sxGUmzpfLreloXfcWGMttE1yes9kioFblN
-OOjxy2yq1PPhv4rf6J2dRY7Ug2ewSZ8n9z1iYMMkw8sribbvCiQzW9nF/ldGzuJ1
-4p745ILOKeSekn+dt7KSg0+XAkW4lN2C3vzZ75qSy4nE/5PUCyYdepvRtyOHU300
-MiXI8op+4IrAWDRgioh23gJaAYm82y+lptVV4NL2JnWwQjO/0nwsXhELQxOpoyxo
-8a1fjuV+O2S+x0xS73rveQOioMlwV3o=
+BQADggEBAF+xJD6iDCuVfUoyFCt8RGkY9Q9MI3+fecmoWz2YYVJXEYHbh2uLOXgt
+vDRD2P0t70oHd9gPK1kIOsNydHJ6EPYtC40TZBL5dKRowqilIAbzLzl3mbz9rPHy
+aSSeBM5A3NsmCDNZTgYH3w9QVR11DfcoPNZi2nc40aDtQmKnhdX0P/h2cvbwguT9
+QE3VQgP5YQ8r37krh8IqEY3v6p8wgCFwrfpXO2xoo7VtXIy2W0ahWI9HZqGXsCDU
+xa/PFQ04BMJ9D1aSClKwNoIHEa+uEgev53IAF6/ZkVvk2Yh+r3YUnE+KPZqD4agP
+6gMG+OuzqLXrpmGhIRy5N6obZ/dCqEs=
 -----END CERTIFICATE-----
 
 subject= /O=Dell Inc./CN=Dell Inc. Enterprise Issuing CA1
@@ -8782,6 +9082,35 @@
 Pr6P2ILSvEAql4/gbkRItZEp9fBskYY=
 -----END CERTIFICATE-----
 
+subject= /C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - SHA256 - G2
+serial=040000000001444EF03E20
+-----BEGIN CERTIFICATE-----
+MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw
+MDBaFw0yNDAyMjAxMDAwMDBaMGAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMTYwNAYDVQQDEy1HbG9iYWxTaWduIERvbWFpbiBWYWxpZGF0
+aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCp3cwOs+IyOd1JIqgTaZOHiOEM7nF9vZCHll1Z8syz0lhXV/lG72wm2DZC
+jn4wsy+aPlN7H262okxFHzzTFZMcie089Ffeyr3sBppqKqAZUn9R0XQ5CJ+r69eG
+ExWXrjbDVGYOWvKgc4Ux47JkFGr/paKOJLu9hVIVonnu8LXuPbj0fYC82ZA1ZbgX
+qa2zmJ+gfn1u+z+tfMIbWTaW2jcyS0tdNQJjjtunz2LuzC7Ujcm9PGqRcqIip3It
+INH6yjfaGJjmFiRxJUvE5XuJUgkC/VkrBG7KB4HUs9ra2+PMgKhWBwZ8lgg3nds4
+tmI0kWIHdAE42HIw4uuQcSZiwFfzAgMBAAGjggElMIIBITAOBgNVHQ8BAf8EBAMC
+AQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU6k581IAt5RWBhiaMgm3A
+mKTPlw8wRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v
+d3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSG
+Imh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYBBQUHAQEE
+MTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290
+cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZIhvcNAQEL
+BQADggEBANdFnqDc4ONhWgt9d4QXLWVagpqNoycqhffJ7+mG/dRHzQFSlsVDvTex
+4bjyqdKKEYRxkRWJ3AKdC8tsM4U0KJ4gsrGX3G0LEME8zV/qXdeYMcU0mVwAYVXE
+GwJbxeOJyLS4bx448lYm6UHvPc2smU9ZSlctS32ux4j71pg79eXw6ImJuYsDy1oj
+H6T9uOr7Lp2uanMJvPzVoLVEgqtEkS5QLlfBQ9iRBIvpES5ftD953x77PzAAi1Pj
+tywdO02L3ORkHQRYM68bVeerDL8wBHTk8w4vMDmNSwSMHnVmZkngvkA0x1xaUZK6
+EjxS1QSCVS1npd+3lXzuP8MIugS+wEY=
+-----END CERTIFICATE-----
+
 subject= /C=NL/O=Intermediate Certificate/OU=Domain Validated SSL/CN=Intermediate Certificate DV SSL CA
 serial=023A60
 -----BEGIN CERTIFICATE-----
@@ -8927,35 +9256,6 @@
 c738B0E0t6pu7qfb0ZM87ZDsMpKI2cgjbHQh
 -----END CERTIFICATE-----
 
-subject= /C=DE/O=GAD EG/OU=VR IDENT/CN=VR IDENT SSL CA 2009
-serial=02
------BEGIN CERTIFICATE-----
-MIIEZzCCA1GgAwIBAgIBAjALBgkqhkiG9w0BAQUwWjELMAkGA1UEBhMCREUxDzAN
-BgNVBAoTBkdBRCBlRzERMA8GA1UECxMIVlIgSURFTlQxJzAlBgNVBAMTHlZSIElE
-RU5UIEVYVEVSTkFMIFJPT1QgQ0EgMjAwOTAeFw0wOTA5MDExMzQzNThaFw0xNjA4
-MDUxNzMwNDNaMFAxCzAJBgNVBAYTAkRFMQ8wDQYDVQQKDAZHQUQgRUcxETAPBgNV
-BAsMCFZSIElERU5UMR0wGwYDVQQDDBRWUiBJREVOVCBTU0wgQ0EgMjAwOTCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMkkUOLwvOHMwNf7OCp9V6885K+Y
-HKD74mswf3p0y8QcmA5g/6jbExXbfLH8X2iuKDbFJGJ6lEoFnyK+ZEE4aHIIlsZX
-jBWVqSuTmA2QXTMCX4lQB0uTEMbkp8l9VJZOcwnp56/422+B+V/PQE4IWTbbIa46
-MVpiS0LpYU5dyzdlwScFyV8uH1IRhJkC05/7o4MrsqxsN9ZU9KI2ezo6oyJwEEfp
-bsqsGm50f8wwHtIzuNMnOkg6ZLIp1+bwezclGnpwaYAcAUUbJLjD1BjXDlopVR7t
-rlgrrCH/ZJ5/x1z/Dxq4wXXeY6SY7MAAECg6o4fmSeK+hE2pdY7qNzDJWJMCAwEA
-AaOCAUQwggFAMGYGCCsGAQUFBwEBBFowWDBWBggrBgEFBQcwAYZKaHR0cDovL29j
-c3AudnItaWRlbnQuZGUvZ3Rub2NzcC9PQ1NQUmVzcG9uZGVyL1ZSJTIwSWRlbnQl
-MjBTU0wlMjBDQSUyMDIwMDkwLgYDVR0jBCcwJYAjUFJPRC5HVE4uRVhST09UQ0Eu
-U0lHR0VOUlMuMDAwMDE2MDAwDwYDVR0TAQH/BAUwAwEB/zBYBgNVHR8EUTBPME2g
-S6BJhkdodHRwOi8vd3d3LnZyLWlkZW50LmRlL2d0bmNybC9DUkxSZXNwb25kZXIv
-VlIlMjBJZGVudCUyMFNTTCUyMENBJTIwMjAwOTAOBgNVHQ8BAf8EBAMCAYYwKwYD
-VR0OBCQEIlBST0QuR1ROLkVYU1NMQ0EuU0lHR0VOUlMuMDAwMDE2MDAwCwYJKoZI
-hvcNAQEFA4IBAQARXS47O/pO2QPLWV5bBey+x8Qc6EnkdzNyZRbniAa4ZRwoNFWH
-ZUuBO9BpyJ5Ej2MLpERrVdD62N8r1HCBWDI53dotZz2CrfLTxHWhpXE11G/f48aT
-i57pIS/Wi1iXIJNF67jf5q6WJrIcDkFJaOP/Sv4k3AGNdYBGtVHqOQf/zm/VEmCO
-sSLxndd8ql+1WDL0eNXXbQRMl7HgOy7UH9xU/uzd2cg2peTKs6IhUy/Xmt3+ogJm
-8dxP8r4Cr7EqQGvMV7qclkrLqaVa1LOPBa3jXWO4s7U1YXmdUIGAW/BAf6PRh/mj
-X9AEX5RpvrIJ8rjqzTgn1tQl+tyW6g8wrHlE
------END CERTIFICATE-----
-
 subject= /C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
 serial=56E6EBCB8F78C1D4587D41B415898586
 -----BEGIN CERTIFICATE-----
@@ -8985,6 +9285,35 @@
 wDWrZ64W5eU6Udktv4fM7bbUPzzld6nsGtSX
 -----END CERTIFICATE-----
 
+subject= /C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
+serial=040000000001444EF04247
+-----BEGIN CERTIFICATE-----
+MIIEaTCCA1GgAwIBAgILBAAAAAABRE7wQkcwDQYJKoZIhvcNAQELBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw
+MDBaFw0yNDAyMjAxMDAwMDBaMGYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMTwwOgYDVQQDEzNHbG9iYWxTaWduIE9yZ2FuaXphdGlvbiBW
+YWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDHDmw/I5N/zHClnSDDDlM/fsBOwphJykfVI+8DNIV0yKMCLkZc
+C33JiJ1Pi/D4nGyMVTXbv/Kz6vvjVudKRtkTIso21ZvBqOOWQ5PyDLzm+ebomchj
+SHh/VzZpGhkdWtHUfcKc1H/hgBKueuqI6lfYygoKOhJJomIZeg0k9zfrtHOSewUj
+mxK1zusp36QUArkBpdSmnENkiN74fv7j9R7l/tyjqORmMdlMJekYuYlZCa7pnRxt
+Nw9KHjUgKOKv1CGLAcRFrW4rY6uSa2EKTSDtc7p8zv4WtdufgPDWi2zZCHlKT3hl
+2pK8vjX5s8T5J4BO/5ZS5gIg4Qdz6V0rvbLxAgMBAAGjggElMIIBITAOBgNVHQ8B
+Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUlt5h8b0cFilT
+HMDMfTuDAEDmGnwwRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0
+dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCow
+KKAmoCSGImh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYB
+BQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNv
+bS9yb290cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZI
+hvcNAQELBQADggEBAEYq7l69rgFgNzERhnF0tkZJyBAW/i9iIxerH4f4gu3K3w4s
+32R1juUYcqeMOovJrKV3UPfvnqTgoI8UV6MqX+x+bRDmuo2wCId2Dkyy2VG7EQLy
+XN0cvfNVlg/UBsD84iOKJHDTu/B5GqdhcIOKrwbFINihY9Bsrk8y1658GEV1BSl3
+30JAZGSGvip2CTFvHST0mdCF/vIhCPnG9vHQWe3WVjwIKANnuvD58ZAWR65n5ryA
+SOlCdjSXVWkkDoPWoC209fN5ikkodBpBocLTJIg1MGCUF7ThBCIxPTsvFwayuJ2G
+K1pp74P1S8SqtCr4fKGxhZSM9AyHDPSsQPhZSZg=
+-----END CERTIFICATE-----
+
 subject= /C=US/ST=Illinois/L=Chicago/O=Trustwave Holdings, Inc./CN=Trustwave Organization Validation CA, Level 2/emailAddress=ca@trustwave.com
 serial=47869FE5
 -----BEGIN CERTIFICATE-----
@@ -9246,6 +9575,35 @@
 50Eg/iCW/5GJpexcu+ejsZ6sAYRjc+HRoUUuBhbXpkryCpIp
 -----END CERTIFICATE-----
 
+subject= /C=JP/O=INTEC INC./CN=EINS/PKI Public Certification Authority V2
+serial=12B9B0F1
+-----BEGIN CERTIFICATE-----
+MIIEcDCCA1igAwIBAgIEErmw8TANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJK
+UDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBD
+b21tdW5pY2F0aW9uIFJvb3RDQTEwHhcNMTMxMjI0MDUyMzA0WhcNMjMxMjI0MDUy
+MzA0WjBXMQswCQYDVQQGEwJKUDETMBEGA1UEChMKSU5URUMgSU5DLjEzMDEGA1UE
+AxMqRUlOUy9QS0kgUHVibGljIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFYyMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqaftrPT0xZYGt3X0rroXQq8
+epOsRwtA8EdMyYli1t1y6kAPkt1HPYaALLj1kev6yb3lSf8RiVtNqzAvuYF7epb0
+kWl7cPsDzgut1EH9A+Z8sTjTq1XNHlfKxaTTPyp01Qqb8TO1GLWkx3ZUEhqwQ0a5
+t8o4RzyJ5E1HrkLI+A0G52sxAXb/DlR9GYa8OsPXt/tK8LxptaVRaOoFiioYBmH6
+RYtsA72iu3XpYaiz1zn2qQNQiGljwE5ZonEDFpOF8nONpNITAHlR3JipEPsxiBn7
+DWqiNY2k6YxL2N1hJCvbXaQOgiLj98Ew7z5O1ARZI70foS+GQh7Q8U+XUB4GjQID
+AQABo4IBSTCCAUUwHQYDVR0OBBYEFNz+tYCYGRSsjaqzgEPFIHVlJs6PMB8GA1Ud
+IwQYMBaAFKBzSZlo3IVbZeObKC9Xn70zvAdIMBIGA1UdEwEB/wQIMAYBAf8CAQAw
+DgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9yZXBvc2l0
+b3J5LnNlY29tdHJ1c3QubmV0L1NDLVJvb3QxL1NDUm9vdDFDUkwuY3JsMFIGA1Ud
+IARLMEkwRwYKKoMIjJsbZIcFATA5MDcGCCsGAQUFBwIBFitodHRwczovL3JlcG9z
+aXRvcnkuc2Vjb210cnVzdC5uZXQvU0MtUm9vdDEvMEAGCCsGAQUFBwEBBDQwMjAw
+BggrBgEFBQcwAYYkaHR0cDovL3Njcm9vdGNhMS5vY3NwLnNlY29tdHJ1c3QubmV0
+MA0GCSqGSIb3DQEBBQUAA4IBAQAfZ8RmNASe/vp8xoyVz+nGbBDUkNODit+OwWYX
+MUIHpr214BJSjel5T2BTSkaWknTbImeRNb9LGKP+HH98+CQkC6v7Z2NUs5BR6nld
+dQ1COJ4bOPaTpFc4TlgyiPgNXKSsV8OHkCa2l6EkEkY3CsjOt6GCnKKkffEmYyJp
+xPpDHNVTG8BKXcp1b8WyJ7lNJweObpiXSTC5oG6M++EShNKXcTnF52GzXwQ64auw
+TgvQXdRRrvdP8lY08SWoAKNUEBRrnWXv7iuyUa6geEw+Zf/4G4LQLTDXa2tbiPDp
+SEQ9fCdSKQzuZS4ynBRiUV9dto94YddtUaFMgzmzxwe9uQrS
+-----END CERTIFICATE-----
+
 subject= /emailAddress=pki_admin@sungard.com/O=SunGard Availability Services/CN=SAS Public CA v1
 serial=3C344F58BD915AE818A8480A1D7B1055
 -----BEGIN CERTIFICATE-----
@@ -9275,35 +9633,6 @@
 Nbms3auPcAzsBIeNm1XlOms8muhf4GYXVzAewdNQzJu4vVYxwQ==
 -----END CERTIFICATE-----
 
-subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO EV SSL CA
-serial=21D95F9EA9BFEE5DE9D27CE40A4E210C
------BEGIN CERTIFICATE-----
-MIIEcjCCA1qgAwIBAgIQIdlfnqm/7l3p0nzkCk4hDDANBgkqhkiG9w0BAQUFADCB
-gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
-MDBaFw0xOTEyMzEyMzU5NTlaMHMxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVh
-dGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9E
-TyBDQSBMaW1pdGVkMRkwFwYDVQQDExBDT01PRE8gRVYgU1NMIENBMIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0JBEcT/vD9kcVeleXQ0aCSDKmlFi0Oho
-BlwSxJbGiA1TsPsaBBaie5Hl7loe1m/onCXjHDF51i7drRikuy24MbyvaPWIS/3p
-nMNpRuNXvFHDxNcPOst5pZvi5DBsTH6D/wU4Yf3byWgRjddARI8XkJ88Olcfu7hw
-7NnU3jcdYHgQuSkDWgRZjK/AeYxe2ngmPV3/Wavi2GUaxK7q7hkFuWxxIaccsi3B
-U/fkdh6ppK6+LbX4JLV3auSWmPIRdtn7ZXTr9neo/03WlHQDbl70GTh4dPBhBo7R
-HJZIOPhB0pjXLnhS6P8Clh4G3ahSU1WUn7tSSskAQJamtSXCNIuMWwIDAQABo4Hy
-MIHvMB8GA1UdIwQYMBaAFAtY5YvGTBU3pECpMKkhvkc2Wlb/MB0GA1UdDgQWBBRp
-FknstnVkWukDI2AvVGKlNFw+4jAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgw
-BgEB/wIBADA+BgNVHSAENzA1MDMGBFUdIAAwKzApBggrBgEFBQcCARYdaHR0cHM6
-Ly9zZWN1cmUuY29tb2RvLm5ldC9DUFMwSQYDVR0fBEIwQDA+oDygOoY4aHR0cDov
-L2NybC5jb21vZG9jYS5jb20vQ09NT0RPQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5j
-cmwwDQYJKoZIhvcNAQEFBQADggEBADm7Pc1cJAaaKNbKUANrI4MxGWHBfOaN2hqP
-Eenmqb/Ukyd4MQT7S4a/KwBhSrkobrCWlRBWDxRi5ZIFvQZx7jPUloOLtWNG/tqP
-bgSG0rF60qmOjw8OG4/SEBEtipMJs09XxBsU1wtpWE4m5maRIAT/uAMx4uCwP4hd
-CQ3HQnecdp+QZiWylsXRtw5iYLHGjVpFZeJ62efLLnhnktuObKZzg3LnXMOpEJdZ
-EEOSFgv0qvh9hRilbh/Jg2LYVCuwq5ImW/nhtm8T4A2PGzlWYzMZ2T4i4SZhUhdp
-9X3PGSSUWH7P5MEYU4u0yuRtpGnfKwGxUyFKoA9kn1O8wt/qPLQ=
------END CERTIFICATE-----
-
 subject= /C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN-USERFirst-Hardware
 serial=26211BF52AEB51B00BFA9FDD8D36DA9E
 -----BEGIN CERTIFICATE-----
@@ -9333,6 +9662,64 @@
 F9UCjiJE/JDErEafSDkqqQ5qlwYgPz9a+qyVI3rchsjq2Tt4jCZE
 -----END CERTIFICATE-----
 
+subject= /C=US/O=Trend Micro Inc/CN=Trend Micro CA
+serial=3D847C1B4ABB3202
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIIPYR8G0q7MgIwDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBOZXR3b3JraW5nMB4XDTE0MDQyOTAyMjU1NVoXDTMwMTIzMTE0MDgyNFowQDEL
+MAkGA1UEBhMCVVMxGDAWBgNVBAoMD1RyZW5kIE1pY3JvIEluYzEXMBUGA1UEAwwO
+VHJlbmQgTWljcm8gQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC
+tz7qUBb61DHFYDbRj69nikk/4sbQ53NnPSrOBJEX3E59MAPoEO/biYzoMF4A3UdB
+LzZsRp4SYJZ0WybyvaExs9FHECfpcXohOCPkG7u1RC4EtUgMjw3lNvu3gDvyi5ut
+cdKI4uOwIkhD8objKuzSlU4IaUjsTaeIROKQHttkDMw7d8HhORy3QnTSIClZ3hgW
+DJZZHOyE2xhGhdyG/KfNlw/uXtJ9A5/YUPHp4dDfrQV2PUr+dTgs3BIh9r7dRngl
+a4BqbvNaH8Yw3fFJ8DqY118JH5GSQ3RQwHpz2f34n0y2PTSMLQlMUC2iRBOd8dhW
+Je5RGbKfveHXDfBgqdBBAgMBAAGjggFsMIIBaDBvBggrBgEFBQcBAQRjMGEwMgYI
+KwYBBQUHMAKGJmh0dHA6Ly9vY3NwLmFmZmlybXRydXN0LmNvbS9udHdrY2EuY3J0
+MCsGCCsGAQUFBzABhh9odHRwOi8vb2NzcC50cmVuZG1pY3JvLmNvbS9udHdrMB0G
+A1UdDgQWBBStMcf6As5n92Uc+7pfwLvFUExnyDAPBgNVHRMBAf8EBTADAQH/MB8G
+A1UdIwQYMBaAFAcf0uec2sJuokC0sHpQEFB0xMi9MEkGA1UdIARCMEAwPgYEVR0g
+ADA2MDQGCCsGAQUFBwIBFihodHRwOi8vd3d3LmFmZmlybXRydXN0LmNvbS9yZXNv
+dXJjZXMvY3BzMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9jcmwuYWZmaXJtdHJ1
+c3QuY29tL2NybC9BZmZpcm1UcnVzdE5ldHdvcmtpbmcuY3JsMA4GA1UdDwEB/wQE
+AwIBBjANBgkqhkiG9w0BAQUFAAOCAQEADPu8ViwJnfsv1a+JcSPldgbVTnWObm8p
+26PDohmr3zJOEvz3RRGVz7NWukJw798lIfljV98ev08i+ygs7XbxgO9qqJPQ8ZFN
+ehMEqlL6IQk8EGa1WSaPN2SW0cY4zvYevE/8Qrl4F6x+QPe+CmsrVLwTdjIGK5pw
+fwcXx5KrGy1SYXuW2vg5MXzjjABPyN+c3rpYOBAlay2C0A/+uxz+Og9wiTIU3Ywn
+h2s/NWCNGQ+lqqVXCLZeBZ+zo+FtWizAqzkUIi+3DST5BhLnPUZZb5mFQbwoC61A
+UXy1sa5T68oU4+2fAw+lF8dVEffcA5mSQUJw/7RRxuOS1Qs9gJ3HpQ==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=DFN-Verein/OU=DFN-PKI/CN=DFN-Verein PCA Global - G01
+serial=89901115583E879B
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIJAImQERVYPoebMA0GCSqGSIb3DQEBCwUAMHExCzAJBgNV
+BAYTAkRFMRwwGgYDVQQKExNEZXV0c2NoZSBUZWxla29tIEFHMR8wHQYDVQQLExZU
+LVRlbGVTZWMgVHJ1c3QgQ2VudGVyMSMwIQYDVQQDExpEZXV0c2NoZSBUZWxla29t
+IFJvb3QgQ0EgMjAeFw0xNDAyMTExMzExNDVaFw0xOTA3MDkyMzU5MDBaMFoxCzAJ
+BgNVBAYTAkRFMRMwEQYDVQQKEwpERk4tVmVyZWluMRAwDgYDVQQLEwdERk4tUEtJ
+MSQwIgYDVQQDExtERk4tVmVyZWluIFBDQSBHbG9iYWwgLSBHMDEwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDpm8NnhfkNrvWNVMOWUDU9YuluTO2U1wBb
+lSJ01CDrNI/W7MAxBAuZgeKmFNJSoCgjhIt0iQReW+DieMF4yxbLKDU5ey2QRdDt
+oAB6fL9KDhsAw4bpXCsxEXsM84IkQ4wcOItqaACa7txPeKvSxhObdq3u3ibo7wGv
+dA/BCaL2a869080UME/15eOkyGKbghoDJzANAmVgTe3RCSMqljVYJ9N2xnG2kB3E
+7f81hn1vM7PbD8URwoqDoZRdQWvY0hD1TP3KUazZve+Sg7va64sWVlZDz+HVEz2m
+HycwzUlU28kTNJpxdcVs6qcLmPkhnSevPqM5OUhqjK3JmfvDEvK9AgMBAAGjggEk
+MIIBIDAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFEm3xs/oPR9/6kR7Eyn38Qpw
+Pt5kMB8GA1UdIwQYMBaAFDHDeRu69VPXF+CJei0XbAqzK50zMBIGA1UdEwEB/wQI
+MAYBAf8CAQIwPwYDVR0fBDgwNjA0oDKgMIYuaHR0cDovL29jc3AwMzM2LnRlbGVz
+ZWMuZGUvcmwvRFRfUk9PVF9DQV8yLmNybDB5BggrBgEFBQcBAQRtMGswLAYIKwYB
+BQUHMAGGIGh0dHA6Ly9vY3NwMDMzNi50ZWxlc2VjLmRlL29jc3ByMDsGCCsGAQUF
+BzAChi9odHRwOi8vb2NzcDAzMzYudGVsZXNlYy5kZS9jcnQvRFRfUk9PVF9DQV8y
+LmNlcjANBgkqhkiG9w0BAQsFAAOCAQEALC+p4F5DLwVw3FGVdV2AjjsMwWNYVIEw
+g5xdqVGHybbXDyu6eEgkYELM8aLiM+EyHjKbUROVeca1rNAk7RgUvC8q6i+rshOs
+SR1eAAsEGGqaZdToRzW8ru3fdLbY8YBQZaDG2iObjVNHymy7QMmVXU5geivku2ZA
+Va+2M8HqIyFu/FSd3TNCbkxr1eTD8uoGt1oyajJFdLa1b/7q/xxjqruI0fhYryB+
+j7//9vc4d4satlA/rT1HeUbDV7QXYoe9nqM2JQdoJKoi8vavKew3pRSZrroBYIZ1
+LWEVuniWh7WSz+FQkZ5ZOhXsnlrGhvwoPma61Nk1r608SSKFh+5vjw==
+-----END CERTIFICATE-----
+
 subject= /C=AT/O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH/OU=a-sign-SSL-03/CN=a-sign-SSL-03
 serial=026538
 -----BEGIN CERTIFICATE-----
@@ -9362,6 +9749,35 @@
 KTrGp5k42PG2MMkw8f6GMF/6yePXgzFMCRN8ReR7J5Htv33SytLRmFRd8g==
 -----END CERTIFICATE-----
 
+subject= /C=AT/O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH/OU=a-sign-SSL-03/CN=a-sign-SSL-03
+serial=14B4FD
+-----BEGIN CERTIFICATE-----
+MIIEdzCCA1+gAwIBAgIDFLT9MA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB
+VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp
+bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R
+dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTE0MDcyMzEwNDIw
+NVoXDTI0MDcyMzA4NDIwNVowgYcxCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy
+dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52
+ZXJrZWhyIEdtYkgxFjAUBgNVBAsMDWEtc2lnbi1TU0wtMDMxFjAUBgNVBAMMDWEt
+c2lnbi1TU0wtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMjPM6
+PqgdPBPV4Efudpytt2Y4GZJfjeRdZo5SCuULDvvL+23xxBWnR3scFvfE1ekHN/YK
+k+2/qhU2B2ntoSNJSyDchNM8YPc9Lx67zZyhQTZgbBzh3IZAVb/hwuRRRV68JCBj
+r3r6v7IbwjH5XcVISdB4szx0z93aAQyKW9QkV+tD5a1vWFETvdHsZeVmDzfqcdsG
+AznPJw+9HrImCsswCWYUgPcFRkPNjj2r2NoyckVN781aWmNTAqJPf/Ckj9l9pUIt
+Vjhy8XNJW4iVDBkkykBXcGSkIau0ypJrRjsD1jKqUTIRZ/y2HlyltmwWi8OuyBLd
+LaHDbjc0b6JmqoivAgMBAAGjgeMwgeAwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4E
+CgQIQD6h02K0A90wEwYDVR0jBAwwCoAIRGqVZ1V5EU8wDgYDVR0PAQH/BAQDAgEG
+MIGUBgNVHR8EgYwwgYkwgYaggYOggYCGfmxkYXA6Ly9sZGFwLmEtdHJ1c3QuYXQv
+b3U9QS1UcnVzdC1uUXVhbC0wMyxvPUEtVHJ1c3QsYz1BVD9jZXJ0aWZpY2F0ZXJl
+dm9jYXRpb25saXN0P2Jhc2U/b2JqZWN0Y2xhc3M9ZWlkQ2VydGlmaWNhdGlvbkF1
+dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAQEAbHQvTl94ommGFln3s6wmd/tr6r5R
+3FR3A7O/uiGEAqm/7B84KGkTmKHhChGMiCiMcBSGtMx1IaO+t7gimLtRL57wgeIf
+k6nsgcbBioh0nO12XDagdtj75Dr7buEFyQvFdfydi5cAwScLW+YYxtwDni9/debd
+ypFKeCRxdCX12n0oFQDPJf8YvE4CaDitBJCQrZdJBDpB6muF8mpNq8CIuyTPIBZX
+RPKJNfIraKq/Xi7tuLkvWVGVsSqJeTvP++05Tvv/44+XBpCp3sUrjsb0G0Mj90PG
+SnAapsrgzDzLO/LQ8vrB9H2oRM4iYfUxu/dKSOBVXa3WQzsLBL0/9zZ30g==
+-----END CERTIFICATE-----
+
 subject= /OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign
 serial=0400000000012F4EE14710
 -----BEGIN CERTIFICATE-----
@@ -9420,6 +9836,64 @@
 nxvyqMJTRbJlhAPtuwsSQwXA4vYGRONOE1WK2MwRzS03zNF9RPDz8ifpHdc=
 -----END CERTIFICATE-----
 
+subject= /C=JP/O=Cybertrust Japan Co., Ltd./CN=Cybertrust Japan Public CA G3
+serial=07279CA5
+-----BEGIN CERTIFICATE-----
+MIIEeTCCA2GgAwIBAgIEByecpTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE0MDEyMjE4NDU1NFoX
+DTIwMDYwOTE3NDQ0NlowWjELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1
+c3QgSmFwYW4gQ28uLCBMdGQuMSYwJAYDVQQDEx1DeWJlcnRydXN0IEphcGFuIFB1
+YmxpYyBDQSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJRWo0VE
+VKpgZL+4V59O29R5aF8TBfQ/zSXdPF5Ydxyd5p/jMknvAjo0U41S5eM5Zh/nM2G2
+J8YkVVAnAmXwsIxBjTBeR1uCb8ecoyhDbVh7yBWYTiVvy3YnWwssLLWYI+eLfP13
+GsRSul0Z7nghTSGa2RJ8MxVrGsmB6traV7fVL84fS/y0M+CgyZQnuydAtpDbrJ51
+phErSRktw8JDBwm7PW6Io+OKxdKG9mVbNMOfTALlCbosxnZm69F2JfQwE/tYYKhY
+41FvSwgEYY2sqTAvUkGjIsEzWat7WfmTZ0vJiXVS7ylJNJMcnJNznBnOXBjNTAkn
+wT/1Sez04t9Lr48CAwEAAaOCAUUwggFBMBIGA1UdEwEB/wQIMAYBAf8CAQAwUwYD
+VR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEFBQcCARYtaHR0cDovL2N5YmVy
+dHJ1c3Qub21uaXJvb3QuY29tL3JlcG9zaXRvcnkuY2ZtMEIGCCsGAQUFBwEBBDYw
+NDAyBggrBgEFBQcwAYYmaHR0cDovL29jc3Aub21uaXJvb3QuY29tL2JhbHRpbW9y
+ZXJvb3QwDgYDVR0PAQH/BAQDAgEGMB8GA1UdIwQYMBaAFOWdWTCCR1jMrPoIVDaG
+ezq1BE3wMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jZHAxLnB1YmxpYy10cnVz
+dC5jb20vQ1JML09tbmlyb290MjAyNS5jcmwwHQYDVR0OBBYEFHOoCFMpuBX7mYDl
+xTfY+Dl7pBMGMA0GCSqGSIb3DQEBBQUAA4IBAQAjOKLpuAVUTqRGcWhOL/la2SVb
+uMD3ZZO2F7NDdIXdBoUtHDTdH3C0LLmHqMZlcJE6nAlh6HMgJIcz9lQxjpvQ7ZnM
+1gvG15hrtK4v8+CMj1EC2xy3eYNom85lCazpMFHYRjmXwmdSd0Kt/mzmkHNpT9MB
+GyKF4OYsfPTaRlbDdjwi1h0UBdrFPIOJZXLR72eSsObaxYaksJlMCxPPDomFqpax
+s/DJkejN7fJD2gEUUhOe8CjbwbajVrdRackp1dg3oL3d1E6u6zkCWkym9r4mokjI
+GNfM4LRDE2vbHxmiff1LpKBZaEl75sF6KANdNF/a3cFq/IgwbCoAvv4IvbqQ
+-----END CERTIFICATE-----
+
+subject= /C=JP/O=Cybertrust Japan Co., Ltd./CN=Cybertrust Japan Public CA G3
+serial=0727A276
+-----BEGIN CERTIFICATE-----
+MIIEeTCCA2GgAwIBAgIEByeidjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE0MDIyNzE4MDkyN1oX
+DTIwMDYwOTE3MDcyOVowWjELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1
+c3QgSmFwYW4gQ28uLCBMdGQuMSYwJAYDVQQDEx1DeWJlcnRydXN0IEphcGFuIFB1
+YmxpYyBDQSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJRWo0VE
+VKpgZL+4V59O29R5aF8TBfQ/zSXdPF5Ydxyd5p/jMknvAjo0U41S5eM5Zh/nM2G2
+J8YkVVAnAmXwsIxBjTBeR1uCb8ecoyhDbVh7yBWYTiVvy3YnWwssLLWYI+eLfP13
+GsRSul0Z7nghTSGa2RJ8MxVrGsmB6traV7fVL84fS/y0M+CgyZQnuydAtpDbrJ51
+phErSRktw8JDBwm7PW6Io+OKxdKG9mVbNMOfTALlCbosxnZm69F2JfQwE/tYYKhY
+41FvSwgEYY2sqTAvUkGjIsEzWat7WfmTZ0vJiXVS7ylJNJMcnJNznBnOXBjNTAkn
+wT/1Sez04t9Lr48CAwEAAaOCAUUwggFBMBIGA1UdEwEB/wQIMAYBAf8CAQAwUwYD
+VR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEFBQcCARYtaHR0cDovL2N5YmVy
+dHJ1c3Qub21uaXJvb3QuY29tL3JlcG9zaXRvcnkuY2ZtMEIGCCsGAQUFBwEBBDYw
+NDAyBggrBgEFBQcwAYYmaHR0cDovL29jc3Aub21uaXJvb3QuY29tL2JhbHRpbW9y
+ZXJvb3QwDgYDVR0PAQH/BAQDAgEGMB8GA1UdIwQYMBaAFOWdWTCCR1jMrPoIVDaG
+ezq1BE3wMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jZHAxLnB1YmxpYy10cnVz
+dC5jb20vQ1JML09tbmlyb290MjAyNS5jcmwwHQYDVR0OBBYEFHOoCFMpuBX7mYDl
+xTfY+Dl7pBMGMA0GCSqGSIb3DQEBCwUAA4IBAQBo3/5yVE4b+1xuWkVGz0K+sgKc
+nZBqCS63NmQktrHiSGfOF0abI3V4EfbGCThCYpaXMHtRd98ztQBRKdUk/reYoqxs
+oRN/yvO3plLCFg3sOr+jN3dPrntVHUbpENrDtAVcW/ZIIQCJ9Ls4jh4z80mXgTFs
+FnQIkRfA0yWzvMEVtaTNhE25yOvFWUIQFCV5+Nu20ObToBR8FxwgHu2ZkGXAQXHD
+qz8pQWf54tGY4/jfOrjKo29oi2yfboh8nUFcussZBYOcmfQa0iRpVwoPesMbLEsG
+0yqXfgew+SBatZJLW6jr6zYzRzbacpy/aEWBMb7S/TvpctVw3abeXw22XgBJ
+-----END CERTIFICATE-----
+
 subject= /C=JP/O=SECOM Trust Systems CO.,LTD./CN=SECOM Passport for Web EV CA
 serial=1033C4D7
 -----BEGIN CERTIFICATE-----
@@ -9507,6 +9981,36 @@
 KLHIdkr0IgMMVdT8DIdWfgtl74frfPclt80nTNs8CSlpF46LsEfo2mC3p2lm+ws=
 -----END CERTIFICATE-----
 
+subject= /C=AT/O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH/OU=a-sign-SSL-EV-03/CN=a-sign-SSL-EV-03
+serial=08A190
+-----BEGIN CERTIFICATE-----
+MIIEfTCCA2WgAwIBAgIDCKGQMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB
+VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp
+bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R
+dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTExMDIwODEzMTU0
+OFoXDTIxMDIwODEzMTU0OFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy
+dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52
+ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEGEtc2lnbi1TU0wtRVYtMDMxGTAXBgNVBAMM
+EGEtc2lnbi1TU0wtRVYtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCk5mTlOGJIRysELGRNCcwKnotizOGSKQus2pyz15FEdCsFj0qQtaI7pOeNWree
+GXeVnnZAiDIW07TAAeA7XoIA2awo6dwWy2AFoR3U+P3EnoeF5Iq7bhjOWWzzqxMZ
+AoQU/OyZq77jial8mylNBoKmZYj4RFg/e6PKaqRFr49XWhlF9GH1u4vZ71Y6XQRG
+235KsEQD7k/uC8ZUdRhg6U+fseXu3aMHDjiIeIITGgnHnO389IxfuB3lUcd8JxB0
+4C44sTZx91sWz4xwxufFrYwxj5dkjstugFD1fEYAohFH+pqmrCaPSZREiXU24XiN
+ijfYkLJgJz00+e2ooub4zqolAgMBAAGjgeMwgeAwDwYDVR0TAQH/BAUwAwEB/zAR
+BgNVHQ4ECgQIRjFbUl7cQgAwEwYDVR0jBAwwCoAIRGqVZ1V5EU8wDgYDVR0PAQH/
+BAQDAgEGMIGUBgNVHR8EgYwwgYkwgYaggYOggYCGfmxkYXA6Ly9sZGFwLmEtdHJ1
+c3QuYXQvb3U9QS1UcnVzdC1uUXVhbC0wMyxvPUEtVHJ1c3QsYz1BVD9jZXJ0aWZp
+Y2F0ZXJldm9jYXRpb25saXN0P2Jhc2U/b2JqZWN0Y2xhc3M9ZWlkQ2VydGlmaWNh
+dGlvbkF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAQEAX4Bf4E0pyCqQvXwo5Z1l
+TlF6hiS+1SZVCOKm8SXMDWK1FQhZrUx5MhifevD3G2q3zJcnJoB7EAnRmY8BruYK
+kVUHDnSpJQieBx5KtXVjIvzS3Yu7K15sB4/WuUdqKyhySRP+FigmgJB6bgRQZlX8
+TB8KGsf6dv2BpJWDX7OSVbSMo9zA7EUXxHkJfMvi2nOaTV4IdT0Ghrgku2v4Z2Kd
+tQpiTWieRHo5wQ30o3R98NJtDC0g3hQRDYgdo996gkkQwQtN8uog4gxdMbrXkK0H
+JFpFFJFmvu7gdLFZ4oJYJMm1SgWrnsUc+wa7fl+uo/JPyRbys3kDkpgheCEOSLbh
+6A==
+-----END CERTIFICATE-----
+
 subject= /C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
 serial=1BE715
 -----BEGIN CERTIFICATE-----
@@ -9867,36 +10371,6 @@
 kLRLaIHQwvrgPw==
 -----END CERTIFICATE-----
 
-subject= /DC=CH/DC=Coop/O=Coop/CN=Coop System CA 1
-serial=617EF9CC000000000004
------BEGIN CERTIFICATE-----
-MIIEhzCCA2+gAwIBAgIKYX75zAAAAAAABDANBgkqhkiG9w0BAQUFADBEMQswCQYD
-VQQGEwJDSDEcMBoGA1UEChMTQ29vcCBHZW5vc3NlbnNjaGFmdDEXMBUGA1UEAxMO
-Q29vcCBSb290IENBIDEwHhcNMDkwODA3MDkzNDExWhcNMTkwODA1MDkzNDExWjBU
-MRIwEAYKCZImiZPyLGQBGRYCQ0gxFDASBgoJkiaJk/IsZAEZFgRDb29wMQ0wCwYD
-VQQKEwRDb29wMRkwFwYDVQQDExBDb29wIFN5c3RlbSBDQSAxMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwaS68oRWAJFY9KB4ppqpTJLBl1/AXhvYNzxQ
-upt0jkNIHzybInPpAi0jFoTiITTtaZvwSTdGJeYEvk/NC3y8Cd+J8k6pqLV3K4qi
-FS/qk3G0dhGq/IG458TTqUcrQbpCdaiylQkS5CzrdHKHQUP6g4xsLqo+F8HnwNLn
-3+DBw9ijbeXHJ9UXByExwtjxJ/m0KWsgmNamROlE4Xod7QejaPWaFklOVZyZAdqf
-momKW5zq0gk6MsEIZat8bZdxTTzbvffHdK5DJ+nYML5bUMu9QHmId/OgPPmTbi7g
-x07wLnrahXa0gkoz0kJg47yre5vHRHMS5C6XcyiL5tbPhYplhQIDAQABo4IBaTCC
-AWUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUYUcl43f/WsIt733DL7r1
-Ey2AD3swCwYDVR0PBAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMD0GA1UdIAQ2MDQw
-MgYKKwYBBAGfNAABATAkMCIGCCsGAQUFBwIBFhZodHRwOi8vd3d3LmNvb3AuY2gv
-cGtpMDwGCSsGAQQBgjcVBwQvMC0GJSsGAQQBgjcVCIfyg0aH1IFeuZETg9r0HIa+
-gWQfhdr3U4XpnGUCAWQCAQIwHwYDVR0jBBgwFoAUzWTa7qHZ5XGBhUeIkiWvLydB
-ToYwMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5jb29wLmNoL0Nvb3BSb290
-Q0ExLmNybDA+BggrBgEFBQcBAQQyMDAwLgYIKwYBBQUHMAKGImh0dHA6Ly9haWEu
-Y29vcC5jaC9Db29wUm9vdENBMS5jcnQwDQYJKoZIhvcNAQEFBQADggEBAHoPgP1q
-LOMTXhPlmMEa7a0gOGrATMTPETKl1rnt+him3SswKEK1zNTbU9BjSw/PJh2cjm5h
-cOetNVZwfVIQceRhLypWVXtbtmJMsW9llN05qHrjXr7GUxlg4syB+82UNqe5CmeP
-uC42uxlBzu6VNPrxAf1HODZ55Pt6ipybavNFELEoCWAWvkLCcrhywct7ai18rZGM
-hHi3C0Evrxhn0THj+l0JHaCcPWyZOgdqhfBVSP9w2Dq2wsb4m1bKCqFIe2PGNBhk
-2BQyojkGxllIt1ywP222kycToeuXcR7y5gvO2IuqsApaZxHikZxU35tFkUBAMMuI
-j2n/cZIn9WBGM1Q=
------END CERTIFICATE-----
-
 subject= /C=AU/O=Department of Education and Training/OU=ITD/CN=NSW-DET-ISS-CA1
 serial=61317BE300010000000E
 -----BEGIN CERTIFICATE-----
@@ -10617,6 +11091,36 @@
 iawXqMzVN3cWxYC5DI9XAlWZhXtJ8C5boMJXU12i6KY3wwH6
 -----END CERTIFICATE-----
 
+subject= /C=PL/O=nazwa.pl S.A./OU=http://nazwa.pl/CN=nazwaSSL
+serial=1AD71FB5BB5A1D595D4975F4F3D42CD2
+-----BEGIN CERTIFICATE-----
+MIIEoDCCA4igAwIBAgIQGtcftbtaHVldSXX089Qs0jANBgkqhkiG9w0BAQUFADB+
+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5B
+LjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIwIAYD
+VQQDExlDZXJ0dW0gR2xvYmFsIFNlcnZpY2VzIENBMCIYDzIwMTQwNTA2MTIwMDAw
+WhgPMjAyMjA3MDQxMDMxNDBaMFIxCzAJBgNVBAYTAlBMMRYwFAYDVQQKEw1uYXp3
+YS5wbCBTLkEuMRgwFgYDVQQLEw9odHRwOi8vbmF6d2EucGwxETAPBgNVBAMTCG5h
+endhU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzJH19wEJT3XI
+CccUj+QamXggmUBZbxAv//7QEP8Gozk9xPFLB88iOSCAQ1DBr7QBcaCjMBFS09KY
+2cJp9+MA2Rk/PbM7UnXj0wyr/1cBOoNc9QK7KP6QOI6ihM9hSOeZ4HIkthFYShhX
+DTQYXjXIs6wEX404L6LP0tx02EEC7ODbDFSBpHrFNNUZhrYeZfc89rLdOrW3kWEY
+/YEsimjX1qgzt0e4+UitNe4Rk/nCqfqUjk+70R6nZHS0+Q+IpxGnMxrCsRQMEqhr
+gkR4TtV5j1xgKUdMNjVSx61swCA5k/HIszvZxuzdIkUnolASB/j+OHkkibn33uDG
+6WTj9Av6xwIDAQABo4IBQDCCATwwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4E
+FgQUnc7wWrTLJc82pYJdj/d/mEYZNy4wHwYDVR0jBBgwFoAURcWyhk7M3SmX5N0U
+xG6uTbjBd/gwDgYDVR0PAQH/BAQDAgEGMC4GA1UdHwQnMCUwI6AhoB+GHWh0dHA6
+Ly9jcmwuY2VydHVtLnBsL2dzY2EuY3JsMGoGCCsGAQUFBwEBBF4wXDAoBggrBgEF
+BQcwAYYcaHR0cDovL3N1YmNhLm9jc3AtY2VydHVtLmNvbTAwBggrBgEFBQcwAoYk
+aHR0cDovL3JlcG9zaXRvcnkuY2VydHVtLnBsL2dzY2EuY2VyMDoGA1UdIAQzMDEw
+LwYEVR0gADAnMCUGCCsGAQUFBwIBFhlodHRwczovL3d3dy5jZXJ0dW0ucGwvQ1BT
+MA0GCSqGSIb3DQEBBQUAA4IBAQCGClqg2Im3VUaxtLnvPJN/c9HFJm0j/oAb5WFp
+2CUMtrVvZSyr/I7B3C7uKaLsc5GjZcCDnGuVM0NCWvd/XlrreGpgADHjWzSdYzuB
+dLrAk7tgeqrR6gkP1zSgxi/11u1Alkgy8/MYW75AVmbsuz/YGISa3Sp1I2shTNka
+XJNSmRF1D0eKg5uVP1m/M8KxVFL67HdKIlDbQN1ho/GTVikR8/b4HQD94i6vkRUw
+snhxkL9vHIFl0AwyaZHaJuioiYKLWRxwrXJfVCNFo3/Ty0tdXD2D11kQuhxHYBCa
+TqCLv91pzrss+o/BRJGmeP/+UMqECwvPU9V5/kiuZmnvY5sP
+-----END CERTIFICATE-----
+
 subject= /C=US/ST=Illinois/L=Chicago/O=Trustwave Holdings, Inc./CN=Trustwave Organization Issuing CA, Level 2/emailAddress=ca@trustwave.com
 serial=4190ABBC
 -----BEGIN CERTIFICATE-----
@@ -10887,36 +11391,6 @@
 hVBkZWH/eONhLYokvWB1RjyQ7YLZU60FPPuevBBQ5Knvr0Hj1Gf4DMZLrFZ+
 -----END CERTIFICATE-----
 
-subject= /C=DE/O=TC TrustCenter GmbH/OU=TC TrustCenter Class 4 L1 CA/CN=TC TrustCenter Class 4 Extended Validation CA III
-serial=2322156B31B8444F4011191BF9E907F3
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIQIyIVazG4RE9AERkb+ekH8zANBgkqhkiG9w0BAQUFADBY
-MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
-R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTEw
-MTEwMDAwMDBaFw0xNjEwMTAyMzU5NTlaMIGOMQswCQYDVQQGEwJERTEcMBoGA1UE
-ChMTVEMgVHJ1c3RDZW50ZXIgR21iSDElMCMGA1UECxMcVEMgVHJ1c3RDZW50ZXIg
-Q2xhc3MgNCBMMSBDQTE6MDgGA1UEAxMxVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgNCBF
-eHRlbmRlZCBWYWxpZGF0aW9uIENBIElJSTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAKDkSwe6uPBHG6KsNz8f+pDzTpugJiz9TqI5EIVm+iz1lpY5rsE4
-H0yx7B5oiZgInMzNaTMu33Jhz4SuOlaA/E7uhVoYKkBFUT0C3qe7b5kxPPMvFRBE
-muGmkymKPyYAKAfw7jYONV0q3zMd8Y2+fqxrm5nRCii8pRaAuPETDEYxxHGp48M0
-Pp2IzmnqySU4v1ArSCGRRpZbBsSioZj8pWehKlGXYOoQyjk77UtCrIw4u1+mI2HU
-Dwzp8LyrFvMUaeBCBhQBIijRJSA98AIQYGEFkaWiSfNM0uK4W2eP4u3AA1WrGKqp
-Sl0lAVxVwJNxhrO7ullCK9FtA6Kc0KmPIf8CAwEAAaOCATcwggEzMB0GA1UdDgQW
-BBTDTGF7wF0r1xerKAYqJsxU6cN6NjA9BggrBgEFBQcBAQQxMC8wLQYIKwYBBQUH
-MAGGIWh0dHA6Ly9FVlNlY3VyZS1vY3NwLmdlb3RydXN0LmNvbTASBgNVHRMBAf8E
-CDAGAQH/AgEAMEsGA1UdIAREMEIwQAYJKwYBBAHwIgEGMDMwMQYIKwYBBQUHAgEW
-JWh0dHA6Ly93d3cuZ2VvdHJ1c3QuY29tL3Jlc291cmNlcy9jcHMwQQYDVR0fBDow
-ODA2oDSgMoYwaHR0cDovL0VWU2VjdXJlLWNybC5nZW90cnVzdC5jb20vR2VvVHJ1
-c3RQQ0EuY3JsMA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQs1VBBlxWL8I82
-YVtK+2vZmckzkjANBgkqhkiG9w0BAQUFAAOCAQEAsAXucnyDP/7cnhBTwn3aZ/YV
-rkDardW///ZeZaxtpwDVewBSYalwREFX+wgL6fTRB9ZowJsPhxfvsqWaMg4mxwLp
-AdjTp54w/kzON1VDAEnbMI/TaTJo5GHzu9LfDQc/GpAUmiDnpfaYJ5gm5q+Hjr+W
-LFHxVzPDmQYM16WYGCFbSi4YbUOOPfySI7CKEldfv9h9xIo2xFVKBOhol0OGos5U
-FcuNzQjmgtiwETKYAUvhLv8Yuaz49tQnZx+BmQGKP2pVAbQwPJzDmdon3DpI//zM
-hSMLn7Pw9lzoHmIW9II7PPZCq7KE/51lLsn2M3/BlMynYhpTveaHCTEwAS0RBQ==
------END CERTIFICATE-----
-
 subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO Certification Authority
 serial=2E79832E908887EA8B8EF31A6EE67A44
 -----BEGIN CERTIFICATE-----
@@ -10947,34 +11421,35 @@
 +y3kL48ThqsxE0ATrG7ttRAwixtQqc7ujMrrfLW5Fj3U+m+SbR6ivfsCSsVwvvE=
 -----END CERTIFICATE-----
 
-subject= /C=US/O=Bechtel Corporation/OU=Information Security/CN=Bechtel External Policy CA 1
-serial=07277971
+subject= /C=US/O=thawte, Inc./CN=thawte EV SSL CA - G2
+serial=05237150E67BDD38F33EF53CD211313F
 -----BEGIN CERTIFICATE-----
-MIIEqzCCBBSgAwIBAgIEByd5cTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
-UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
-cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
-b2JhbCBSb290MB4XDTExMDYxNDE2NTQwNloXDTE4MDYxNDE2NTMxNFowcTELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0JlY2h0ZWwgQ29ycG9yYXRpb24xHTAbBgNVBAsT
-FEluZm9ybWF0aW9uIFNlY3VyaXR5MSUwIwYDVQQDExxCZWNodGVsIEV4dGVybmFs
-IFBvbGljeSBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj/qt
-svCMMInUz9sjr9Y7znxXAk36MwFXYWvVYfGWFEppM0V+XLxaCnE4keOHQPgJzenZ
-ELlTmGiLTUtFCAVfLtuUNgHhO+MvtW6Mwfo/MVsS9F6HkAaRfsBThHe9DLev72GW
-2DnJ+1c2DcqyLUeffj4OOzN4dDDtin00HoqMN4fUXy2OzjtxXEqSsbNXqg+afbAe
-/EFy55iskmku2vdUQZ8BLYpTWxOPsnlTgpBVi7cTyk4PAekRQ0cOKi2Cyi1RCepB
-Dm5/vheQMP7VSFMdPakGn9u2jRqD0AdPHdTyk7f4frc2St4wJIG0Njjc3atKw8SQ
-3PP504gw4rRbukwyMQIDAQABo4IBxjCCAcIwEgYDVR0TAQH/BAgwBgEB/wIBATCB
-qQYDVR0gBIGhMIGeMEgGCSsGAQQBsT4BADA7MDkGCCsGAQUFBwIBFi1odHRwOi8v
-Y3liZXJ0cnVzdC5vbW5pcm9vdC5jb20vcmVwb3NpdG9yeS5jZm0wDAYKKwYBBAH9
-UgIFATAMBgorBgEEAf1SAgUCMAwGCisGAQQB/VICBQMwDAYKKwYBBAH9UgIFBDAM
-BgorBgEEAf1SAgUFMAwGCisGAQQB/VICBQYwDgYDVR0PAQH/BAQDAgGGMIGJBgNV
-HSMEgYEwf6F5pHcwdTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD0dURSBDb3Jwb3Jh
-dGlvbjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuMSMw
-IQYDVQQDExpHVEUgQ3liZXJUcnVzdCBHbG9iYWwgUm9vdIICAaUwRQYDVR0fBD4w
-PDA6oDigNoY0aHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL2NnaS1iaW4vQ1JM
-LzIwMTgvY2RwLmNybDAdBgNVHQ4EFgQUkJV0VJwV/wQovj4LU/YSNpCGsrowDQYJ
-KoZIhvcNAQEFBQADgYEAjPDjcwCjp30vdopCnCRyzt+0qGYTEznCfy2tePmjJph8
-Cb200qSvUIbM67BFSpOKMIadwTaiimc/hnNLHy60OlNtf1hLbFQtULMh+1e7SfWh
-fMdjjfQm4MWm+n4l9iQd4YCT37yyoUYJrlOdoVgWF+r+hcb+cj0AoEBnE0DxJM8=
+MIIErzCCA5egAwIBAgIQBSNxUOZ73TjzPvU80hExPzANBgkqhkiG9w0BAQUFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMTMxMDMxMDAwMDAwWhcNMjMx
+MDMwMjM1OTU5WjBEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMu
+MR4wHAYDVQQDExV0aGF3dGUgRVYgU1NMIENBIC0gRzIwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQC0OdfRaYVQLcLryGKXMjAXBPTxgJ42N0UuRJhZvWjc
+ZaHMo4Q2+bopTFkef3zLozYK1Da8nWbuDeC0SeGgtuL2P4xph3HNNCR84gl7QH0X
+Tx07r+2Inhz7AcoWJjoZxFp7MmTscPt2jMmiXx4vEo3SAAtnF/vcQXefw8rTLEQp
+dA0SVB4BqvsEhI4jxALF9R1x+99EwUkfiYL23J9SQlfKDiRv+f3guiGXNRp3vF1k
+CNkTDLpHe3PcZ9tqWNTboFpYsPStSGX+dJqPzWtfS04oQGSYZpKxz3LYxXYL3LzZ
+Dr06D7ygFnKLjKOxAwKW9ilCkOrBwwtNvsJ9lFx5x/EhAgMBAAGjggE1MIIBMTAS
+BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAvBggrBgEFBQcBAQQj
+MCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly90Mi5zeW1jYi5jb20wOwYDVR0gBDQwMjAw
+BgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHBzOi8vd3d3LnRoYXd0ZS5jb20vY3Bz
+MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly90MS5zeW1jYi5jb20vVGhhd3RlUENB
+LmNybDApBgNVHREEIjAgpB4wHDEaMBgGA1UEAxMRU3ltYW50ZWNQS0ktMS01MzUw
+HQYDVR0OBBYEFC40Iw1fwXqy30AvXuVWMOSapGyEMB8GA1UdIwQYMBaAFHtbRc+v
+zst6/TGSGmq280brV0hQMA0GCSqGSIb3DQEBBQUAA4IBAQCQB3H7nhipCm+K4gcT
+7XNGnYDGt4FNKRPF4SenZuZsnu9TcJRaQJOJdYZk5tuDLK7CF8t3nCJof7hdP9vW
+IyYJ/xYTSA+qQaGIP8DdyG0Ch/ysJ+LAK4Y6djQxXQS6rrqL2twRCw0SLz/tWoaH
+wlE2gkoMSeirqHgYBXEBJeoM4aljXLClHbM+GOJBqhSVgBnq0Kgfx1HAp/E3WZu8
+H+r0LaHtfmO+bHOotBGlRlTigl2WMPb0dKe2pr2a8Cb8YwbnHBqhpAztRr7G/QKo
+aQKQ+m00ioV0ZuS8l3COYKYdDMTmqBOVQxrqFOE0nGr65yTPPJ7jBtE5YEoesvKU
+i4Ah
 -----END CERTIFICATE-----
 
 subject= /C=NL/O=TERENA/CN=TERENA eScience SSL CA
@@ -11008,6 +11483,37 @@
 YkPL
 -----END CERTIFICATE-----
 
+subject= /C=US/O=thawte, Inc./CN=thawte EV SSL CA - G3
+serial=5D72FB337620F64C7280DBE91281FF6A
+-----BEGIN CERTIFICATE-----
+MIIErzCCA5egAwIBAgIQXXL7M3Yg9kxygNvpEoH/ajANBgkqhkiG9w0BAQsFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMTMxMDMxMDAwMDAwWhcNMjMx
+MDMwMjM1OTU5WjBEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMu
+MR4wHAYDVQQDExV0aGF3dGUgRVYgU1NMIENBIC0gRzMwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDE3dqUHjKyLqCDwKZ9X2Ut/Se4cw74C6nUViZpmGc1
+OWRYzoJvmJTRj+CQ1u1VS5hL1xBZNAIb51ExUcQ4wrzbA1zK4XzcT1mX6gd/D4U+
+kuqqp9m+AUHkYlZHNr1XkeYh0/hBC9i66O2BrXDAi27ziW4nnqamc1m7cQDUT0tI
+6dXJJzacfBwCqqy9O9FTg2of5ghHM6exnwK+m0ftMwTcHIAn0UozoIzrAUehMpBk
+e8TghMky6d00H4poZ/OtEGPr7oqasSobJnShKrCP/lKYRpfPo1Ycb26Zl40mDqns
+wlNw/HqlGUm9tReCVd6X4F1ihIHwcKg0U08U/T1dPW+5AgMBAAGjggE1MIIBMTAS
+BgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAvBggrBgEFBQcBAQQj
+MCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly90Mi5zeW1jYi5jb20wOwYDVR0gBDQwMjAw
+BgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHBzOi8vd3d3LnRoYXd0ZS5jb20vY3Bz
+MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly90MS5zeW1jYi5jb20vVGhhd3RlUENB
+LmNybDApBgNVHREEIjAgpB4wHDEaMBgGA1UEAxMRU3ltYW50ZWNQS0ktMS01MzYw
+HQYDVR0OBBYEFPBwUdrTKpFPUnfXhnd0D85xGmwiMB8GA1UdIwQYMBaAFHtbRc+v
+zst6/TGSGmq280brV0hQMA0GCSqGSIb3DQEBCwUAA4IBAQChLpQ+mxb0WBpvwfrB
+fkOTssP3iesTYl3dzGETKx1OiHkRYhQ3MEb/iWIQhSqHHvjir/6TApPK8ulGA2uh
+GqzV8IAbmG+4OlD4VHEGA+eEzI5h0l9NDJcCZbWMJrwFmPTcxq/kV3/j3KHXJ0cq
+4Cw/CXTcWuW1fPqCmhX6dCuELmus7zWmMPpHSqo2RPZakQfT5E6XP6ZT2CkzMm+L
+PbWlDeXkiuj1wPqv2DcoJ8PtNDHZfKavTRJP0CuSnGmV8iim/qjG4CxNNusRNNbh
+gZmdQfLnxVcFDhnKr0I5H6cnXuAKF7iuR6uS8YoE3zDgu0+K+RuITwO0JXp43i59
+KdEx
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=Mitteldeutscher Rundfunk/CN=MDR CA
 serial=0AA33332
 -----BEGIN CERTIFICATE-----
@@ -11039,37 +11545,6 @@
 5nKMjA==
 -----END CERTIFICATE-----
 
-subject= /C=DE/O=EON/OU=CA/CN=E.ON Group CA V2
-serial=285A0001000231E1FB6AD5D741F1
------BEGIN CERTIFICATE-----
-MIIEsDCCA5igAwIBAgIOKFoAAQACMeH7atXXQfEwDQYJKoZIhvcNAQEFBQAwdjEL
-MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
-BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
-Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDgwMjI2MDkyNTUyWhcNMjUxMjMxMjI1
-OTU5WjBDMQswCQYDVQQGEwJERTEMMAoGA1UEChMDRU9OMQswCQYDVQQLEwJDQTEZ
-MBcGA1UEAxMQRS5PTiBHcm91cCBDQSBWMjCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAOeTJ3sNw7YVndtGWetuOy3My9N3eHYyc/qOV0t+ig/wEsbm7yPX
-niuzHEfdZ6DvJ2t3zn8kYChggDgJroJoVUhI36SmWaaWf1oh9Z7CzSjTRSYzWGh1
-XOSNmtail+UqoC8BuqXAn74pq3t3fGF1PcXgIn9ZZ67AgoNxDObdwUfw+/rSt80d
-BE8bu9wr1cNCNjJ8U10mMNXTc9wFiuqzD2tMIC3S2Ne5sDg+Umo0tWbERcC5A889
-dTdqSCoIAWr7uXB+/qDimMv2BFdAsJt8Lp+OpfB5M0oUO1m882XDsPgh/JxQOgn4
-NFoy2meomohjG/TiMsirCdO/3dKKL9vjFKECAwEAAaOCAW0wggFpMIGnBggrBgEF
-BQcBAQSBmjCBlzBEBggrBgEFBQcwAoY4aHR0cDovL3BraS5pbnRyYW5ldC5lb24u
-Y29tL2NhY2VydHMvdGNfY2xhc3NfMl9jYV9JSS5jcnQwTwYIKwYBBQUHMAKGQ2h0
-dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2VydHNlcnZpY2VzL2NhY2VydHMvdGNf
-Y2xhc3NfMl9jYV9JSS5jcnQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFEvCEOX9KKATyXaMr04glrHRMf3+MH0GA1UdHwR2MHQwcqBw
-oG6GNWh0dHA6Ly9wa2kuaW50cmFuZXQuZW9uLmNvbS9jcmxzL3RjX2NsYXNzXzJf
-Y2FfSUkuY3JshjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90Y19j
-bGFzc18yX2NhX0lJLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAaO/zJnIrYDfVUD5w
-wRDVBhveqYxO6W/o0LPykmKADTXqs9qp6X2aNWVULg95ZoeY4huvX2irNSUpdV6Z
-z2M1XFsu11Xe9CxikIMvNpev2rmYw8yZc1efEKX1aD2Jd3JhBoynOrGk8kbLyKzi
-RjG6OP4UTKNiAzr/+Bj5cEsF4bBYqXzjDul6L8e21OXuuMpLuZ48iODKLemFVbZW
-NbWobEnmxLXsAPuvchjSQF2JBkFmO051RD62h6Irh7ClnH3GZXEFS4FGIEFzlfk4
-K/G6JGWSha2aTPHrhWC+D+mR6OP/EJy7jitbbhY/m15/cxkydaZcfy+rXNRmkYh3
-/suGJA==
------END CERTIFICATE-----
-
 subject= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
 serial=04E1E7A4DC5CF2F36DC02B42B85D159F
 -----BEGIN CERTIFICATE-----
@@ -11101,6 +11576,68 @@
 cPUeybQ=
 -----END CERTIFICATE-----
 
+subject= /C=PL/O=NetArt Sp\xC3\xB3\xC5\x82ka Akcyjna S.K.A./OU=http://nazwa.pl/CN=nazwaSSL
+serial=435507AA1C573D95C0E50C44A4E6DACF
+-----BEGIN CERTIFICATE-----
+MIIEsTCCA5mgAwIBAgIQQ1UHqhxXPZXA5QxEpObazzANBgkqhkiG9w0BAQUFADB+
+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5B
+LjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIwIAYD
+VQQDExlDZXJ0dW0gR2xvYmFsIFNlcnZpY2VzIENBMCIYDzIwMTIwNzA2MTAzMTQw
+WhgPMjAyMjA3MDQxMDMxNDBaMGMxCzAJBgNVBAYTAlBMMScwJQYDVQQKFB5OZXRB
+cnQgU3DDs8WCa2EgQWtjeWpuYSBTLksuQS4xGDAWBgNVBAsTD2h0dHA6Ly9uYXp3
+YS5wbDERMA8GA1UEAxMIbmF6d2FTU0wwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDMkfX3AQlPdcgJxxSP5BqZeCCZQFlvEC///tAQ/wajOT3E8UsHzyI5
+IIBDUMGvtAFxoKMwEVLT0pjZwmn34wDZGT89sztSdePTDKv/VwE6g1z1Arso/pA4
+jqKEz2FI55ngciS2EVhKGFcNNBheNcizrARfjTgvos/S3HTYQQLs4NsMVIGkesU0
+1RmGth5l9zz2st06tbeRYRj9gSyKaNfWqDO3R7j5SK017hGT+cKp+pSOT7vRHqdk
+dLT5D4inEaczGsKxFAwSqGuCRHhO1XmPXGApR0w2NVLHrWzAIDmT8cizO9nG7N0i
+RSeiUBIH+P44eSSJuffe4MbpZOP0C/rHAgMBAAGjggFAMIIBPDASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdDgQWBBSdzvBatMslzzalgl2P93+YRhk3LjAfBgNVHSME
+GDAWgBRFxbKGTszdKZfk3RTEbq5NuMF3+DAOBgNVHQ8BAf8EBAMCAQYwLgYDVR0f
+BCcwJTAjoCGgH4YdaHR0cDovL2NybC5jZXJ0dW0ucGwvZ3NjYS5jcmwwagYIKwYB
+BQUHAQEEXjBcMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0dW0u
+Y29tMDAGCCsGAQUFBzAChiRodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvZ3Nj
+YS5jZXIwOgYDVR0gBDMwMTAvBgRVHSAAMCcwJQYIKwYBBQUHAgEWGWh0dHBzOi8v
+d3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQEFBQADggEBAHlQ3wmHSzZOp3ct
+HTbFloKweF2+S2BEsjJgVUOJbq3q7bJjQLIR8Zak75dXQzHyFOosZr7X3fRIZvqC
+4Jylo/kPGTV7KDUgI8uOHSXPDiwhszjXQ1Ub+dsFE3c5lsOj0z/AGu7ap36UP8sB
+fWnZ36f3LMudBri3aX8EPhEdIoF3cg+cvTVQyEhfXZVtyRmudwhBFdjMka4KFFrs
+awc2yFJ2au2wS3QZm0dFGZ7deRJ2GiqahEUCITNyjQ24rtQ3w1VlqYLEIUhlv+af
+54cFvM6QqnajvjZFzmui9cxfl/wQl6ZvKyDT1pl3XJ/F5koDsHaQoaq8vEyGIW2B
+J51EZVc=
+-----END CERTIFICATE-----
+
+subject= /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Level IV CA
+serial=4CA5FEC6617C48B056382A8280E0508C
+-----BEGIN CERTIFICATE-----
+MIIEsTCCA5mgAwIBAgIQTKX+xmF8SLBWOCqCgOBQjDANBgkqhkiG9w0BAQUFADA+
+MQswCQYDVQQGEwJQTDEbMBkGA1UEChMSVW5pemV0byBTcC4geiBvLm8uMRIwEAYD
+VQQDEwlDZXJ0dW0gQ0EwIhgPMjAwOTAzMDMxMjU0MjVaGA8yMDI0MDMwMzEyNTQy
+NVowdzELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVz
+IFMuQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEb
+MBkGA1UEAxMSQ2VydHVtIExldmVsIElWIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA5hJEHqRlYJDkoiyormawL5B+OrLLnAludx7RgtMUqFZZ36Yb
+TM/epf7GQfdPcFf9xS5mRmCuHpMW/QGPUA5pM9rqlNNFxVHb6JehQbsneG74Lh34
+CALSPPDVmwWsWLVMp+mqLFYZxMLkyi9Pv7yaxm5rzVOZI4Co5QqVae6zU2z518on
+63D4t82lZBK9j5dclTFP8xUcEcGc8S/xyHz1kJeCooBAuoflTdykyMXHWReypx+I
+AqowWqb2MrrJGdKVPQHvTBC14WyYafKdr7oOngj58XJxLuTfER60TKoWCTRSOaCM
+S9hXSnOBlTnD98PCFnoUuErVD3OjDdSTf/6hCwIDAQABo4IBbDCCAWgwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQUzUpGygNlkOYxEBqCxqUcXtFQzx8wUgYDVR0j
+BEswSaFCpEAwPjELMAkGA1UEBhMCUEwxGzAZBgNVBAoTElVuaXpldG8gU3AuIHog
+by5vLjESMBAGA1UEAxMJQ2VydHVtIENBggMBACAwDgYDVR0PAQH/BAQDAgEGMCwG
+A1UdHwQlMCMwIaAfoB2GG2h0dHA6Ly9jcmwuY2VydHVtLnBsL2NhLmNybDBoBggr
+BgEFBQcBAQRcMFowKAYIKwYBBQUHMAGGHGh0dHA6Ly9zdWJjYS5vY3NwLWNlcnR1
+bS5jb20wLgYIKwYBBQUHMAKGImh0dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9j
+YS5jZXIwOgYDVR0gBDMwMTAvBgRVHSAAMCcwJQYIKwYBBQUHAgEWGWh0dHBzOi8v
+d3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQEFBQADggEBAFsbmjzw5fokBAM+
+/6/zOHp3q55yK93jl5hvFv7j0V7URp9Jv3NfLxTq4G74Xz2LvSSoVkgOKIDqrnF4
+gG3qMkRtRjkdlPVGg8fULl54igIqogI4BXreDfgvQFMphvhJl83hzAev6Ykgr2w9
+xg4M5hlM8OjERAAX1Q4wdkhjWMLofoe2tRjFgwUlY1VEGkLlwFFQHyypwGaFYLXC
+myDS2t6R0bZ5pojKqDmsVr5wE3EYl3QChsvwc8KcU1y/4+h2J3M8QjchuPLqZXUq
+Er1tZCzufnT0G1kH0OH/HNoLzENT7sXqnnOEnu4vzassegYMwubUQ1yUiorA+iuz
+F//e7qw=
+-----END CERTIFICATE-----
+
 subject= /C=US/O=Network Solutions L.L.C./CN=Network Solutions Certificate Authority
 serial=5468B579749F60FFFE9336D1C362AF2E
 -----BEGIN CERTIFICATE-----
@@ -11132,6 +11669,37 @@
 a7Mda4U=
 -----END CERTIFICATE-----
 
+subject= /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Level II CA
+serial=770AC6C2BA51A41C1D5D2F99B26B0C1A
+-----BEGIN CERTIFICATE-----
+MIIEsTCCA5mgAwIBAgIQdwrGwrpRpBwdXS+ZsmsMGjANBgkqhkiG9w0BAQUFADA+
+MQswCQYDVQQGEwJQTDEbMBkGA1UEChMSVW5pemV0byBTcC4geiBvLm8uMRIwEAYD
+VQQDEwlDZXJ0dW0gQ0EwIhgPMjAwOTAzMDMxMjUzMThaGA8yMDI0MDMwMzEyNTMx
+OFowdzELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVz
+IFMuQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEb
+MBkGA1UEAxMSQ2VydHVtIExldmVsIElJIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4LE0Ixw8h5Lper9tHVtZkWIujxYsPVgUZABeZZgQsKTdJjaG
+VP64B/oiEV5Hd3AxRqaZ7dRRsf4Pg/PSS/2mHRQQ/SH3XACbrDHmucDvYgtU/WoZ
+yp9d6PXVPY4j7J5t/52s+EbZD5swSuQLGjZ9iwg9sXX3JdJ9Ty+B3z80oiajpK0B
+wqAxrcX3DekEOknj7LkAOK6iuQKI85REj4IVb9kD7KKIWdISGbfL4Ezh/TP51e0L
+/WhTJ7lHbHbRzFfPU/oi3Qyt5tEexrPKe+6N+Jrejdb5Ya7Ne3tKujDU7KlbO+dn
+pzFH7VHkBPJcQJ7QUrprPaqVsVg3JJ1PXTqVnwIDAQABo4IBbDCCAWgwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQUgGIR3sBrpxDhCPBVtDCDv/qPCGAwUgYDVR0j
+BEswSaFCpEAwPjELMAkGA1UEBhMCUEwxGzAZBgNVBAoTElVuaXpldG8gU3AuIHog
+by5vLjESMBAGA1UEAxMJQ2VydHVtIENBggMBACAwDgYDVR0PAQH/BAQDAgEGMCwG
+A1UdHwQlMCMwIaAfoB2GG2h0dHA6Ly9jcmwuY2VydHVtLnBsL2NhLmNybDBoBggr
+BgEFBQcBAQRcMFowKAYIKwYBBQUHMAGGHGh0dHA6Ly9zdWJjYS5vY3NwLWNlcnR1
+bS5jb20wLgYIKwYBBQUHMAKGImh0dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9j
+YS5jZXIwOgYDVR0gBDMwMTAvBgRVHSAAMCcwJQYIKwYBBQUHAgEWGWh0dHBzOi8v
+d3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQEFBQADggEBAI/jSDAW/w9qLzF6
+4oQiIRB7dGKp2Nlj27xZFYDBRINn4DKyZExkpanASF2of9eEzvrS+qoDY29mhXCi
+MkiGr0vCsVhn0ReUpjg4Z5SsiQhZ2BGSjXiOJgaDI7Dw1MH7Ru6jdfSbLyd97EFj
+ER0ERGdrcA2kLw7KfQm78IkClXEEKjKnAUTn1d/5Y4UuBWDCEL0FLgO9AqNXEzIy
+rlXVGIs73kdefAK+Z1T6dm83vUrDMyzemWNRBI2tVBujkN6zkaF6uPjE4hfoIkEQ
+Z4317byFkG4mxjATU+tQLG1Bs88HUAOrxtJOo/WoeCNsFJaxbYPt4oQGxIVYdz29
+OUX9CQA=
+-----END CERTIFICATE-----
+
 subject= /C=US/O=Register.com/CN=Register.com CA SSL Services (OV)
 serial=087740B0D544C934101173A791BD2D59
 -----BEGIN CERTIFICATE-----
@@ -11194,6 +11762,37 @@
 Bb7//9VB
 -----END CERTIFICATE-----
 
+subject= /C=US/O=thawte, Inc./CN=thawte SSL CA - G2
+serial=1687D6886DE2300685233DBF11BF6597
+-----BEGIN CERTIFICATE-----
+MIIEsjCCA5qgAwIBAgIQFofWiG3iMAaFIz2/Eb9llzANBgkqhkiG9w0BAQsFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMTMxMDMxMDAwMDAwWhcNMjMx
+MDMwMjM1OTU5WjBBMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMu
+MRswGQYDVQQDExJ0aGF3dGUgU1NMIENBIC0gRzIwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCy/Ab7BJPS6lkgO0SFl1I55xDweuCwlEDaRvgMKLu5zmA4
+P9LYEUIbka1J7o/H3mzeN2/9iyA8bed009zVJIhBgInuNr7E1b6NUxOq5KW4kwq+
+7NrNPNQyVu/QTqC4l7s5UB5uZcP9ss7gWalICcb+vq78PjuBIJeLj0bfYGQHdbsb
+hjifR3s0zqHRl6122J+3Jtt5gDZI8sU3+NkyrnykU4HHmaFUOC9PdaC7WqW7zawC
+WxkC1RMYp86sdFUSBYubopVGZHI4zVobOhanvnGZjFQDuJZsAdM+Bpg/IYE7An4A
+R1MBHg5GQ/tLLdwLGugvmPh+0ZmrE2ykF95v9hX1AgMBAAGjggE7MIIBNzASBgNV
+HRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAyBgNVHR8EKzApMCegJaAj
+hiFodHRwOi8vdDEuc3ltY2IuY29tL1RoYXd0ZVBDQS5jcmwwLwYIKwYBBQUHAQEE
+IzAhMB8GCCsGAQUFBzABhhNodHRwOi8vdDIuc3ltY2IuY29tMEEGA1UdIAQ6MDgw
+NgYKYIZIAYb4RQEHNjAoMCYGCCsGAQUFBwIBFhpodHRwczovL3d3dy50aGF3dGUu
+Y29tL2NwczApBgNVHREEIjAgpB4wHDEaMBgGA1UEAxMRU3ltYW50ZWNQS0ktMS01
+MzcwHQYDVR0OBBYEFMJPSFf80U+awF04fQ4F29kutVJgMB8GA1UdIwQYMBaAFHtb
+Rc+vzst6/TGSGmq280brV0hQMA0GCSqGSIb3DQEBCwUAA4IBAQCNBt5DyXYCytkj
+l17zY9d9RMIPawr1B+WLuPrgo/prgJK1AyzFN+DC5ZW1knAYKEKU7kt3agEPiyPs
+Vk30AGnlhMji6t5bPvY8BzqUymwnscyDGmBxJ9K/AvUeRNNI1abTdiEAnPqYZOsX
+Nj/rGzw+prHZWAYOctlovvGnINdS5KR3H3FwnVU1hTfhHU2UwnB/lUBuS32ytCkq
+A3nIuUxnYQSgiyf/WQDrVX/GtzM1LV5OrLjqEsXo97mrvnSSLLfZTcqELxzC8HJ8
+sjFuz4DliAc2UXu6Ya9tjSNbNKOVvKIxf/L157fo78S1JzLp955pxyvovrsMqufq
+YBLqJop4
+-----END CERTIFICATE-----
+
 subject= /C=US/O=Register.com/CN=Register.com CA SSL Services (DV)
 serial=58511A61F340D216E7FCF6392489D1E4
 -----BEGIN CERTIFICATE-----
@@ -11380,35 +11979,97 @@
 yIiv//1KApvm1Q==
 -----END CERTIFICATE-----
 
-subject= /C=DE/O=Giesecke and Devrient/OU=Corporate CA/CN=Giesecke and Devrient Corporate CA
-serial=0400000000011E4487922D
+subject= /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Trusted Network CA
+serial=23E8290D71950418C008597E42F7481B
 -----BEGIN CERTIFICATE-----
-MIIEujCCA6KgAwIBAgILBAAAAAABHkSHki0wDQYJKoZIhvcNAQEFBQAwcTEoMCYG
-A1UEAxMfR2xvYmFsU2lnbiBSb290U2lnbiBQYXJ0bmVycyBDQTEdMBsGA1UECxMU
-Um9vdFNpZ24gUGFydG5lcnMgQ0ExGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
-CzAJBgNVBAYTAkJFMB4XDTA4MTIxNzEyMDAwMFoXDTE4MTIxNzEyMDAwMFowcTEL
-MAkGA1UEBhMCREUxHjAcBgNVBAoTFUdpZXNlY2tlIGFuZCBEZXZyaWVudDEVMBMG
-A1UECxMMQ29ycG9yYXRlIENBMSswKQYDVQQDEyJHaWVzZWNrZSBhbmQgRGV2cmll
-bnQgQ29ycG9yYXRlIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-1xTYyTGIpIaDHxewPskSWx1/+XIfxBrkUAieXL+vdGy3oOJ7IR0ospqPeBOQu1wE
-uOL4br/BoShJ1nTGI9dgvuftHDU6hMWSSusfi3jY82PBGJilEGLHBDBUoHCJIz2j
-J7WdnLBiQGH1sSgPrMcs0No3Poy64GyeDBfwK9WsdlH11soArutKbG0Unmjx8rNw
-lCJr2IZlf7bvPw+o2PpBkHONWgqYXETA4PNUbrcgHGiUQqpb32SyyQ/Im+J7mAIZ
-VwGxGtP+FTC75m34wE0YeeoD+ERyEvOFy3pGjXQC1knANpoTDdXsNjXH+BAgXHz2
-4VrCo04iXu4oTAWMPp5FXwIDAQABo4IBUTCCAU0wDgYDVR0PAQH/BAQDAgEGMBIG
-A1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFCe848aDWPGI1LQ1KiwRdw0kScgV
-ME0GA1UdIARGMEQwQgYJKwYBBAGgMgE8MDUwMwYIKwYBBQUHAgIwJxolaHR0cDov
-L3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzA/BgNVHR8EODA2MDSgMqAw
-hi5odHRwOi8vY3JsLmdsb2JhbHNpZ24ubmV0L1Jvb3RTaWduUGFydG5lcnMuY3Js
-MFcGCCsGAQUFBwEBBEswSTBHBggrBgEFBQcwAoY7aHR0cDovL3NlY3VyZS5nbG9i
-YWxzaWduLm5ldC9jYWNlcnQvUm9vdFNpZ25QYXJ0bmVycy1SMS5jcnQwHwYDVR0j
-BBgwFoAUVoTstXGl52PY21EE1vrm8EhSSc4wDQYJKoZIhvcNAQEFBQADggEBAD/s
-hCEdsXG/Rgr+6KX8WD3iioBudnxJD/Qp4eXxs3tEOL4X1lLQZ24EVXkhHot/l61k
-bxbgk+HPKFOhwm/7w2Z5icCAe71pbMjQpC3mEc2eHXsJFL2v2mOrbTg4SdkeukBn
-mHoA7CthNe55s6FJYqPMybzFFMasS9kYRqg+vPMQfOOLYM1s+BZu2+nw7UvjsLBE
-FWFu15m2dc3MvVEciHTcWpjp9frvtJN1bo0guVsG2SIX56MZxP5rRd4+aXXGRvsO
-Thycnma7+Z1v/ul/VD/qaJ4sprf8tgsZ6Vb4Uk333tDK0Bcm5jtzYAxxWPqOrx2F
-JxNe/m94vDhwRzwJhRY=
+MIIEuDCCA6CgAwIBAgIQI+gpDXGVBBjACFl+QvdIGzANBgkqhkiG9w0BAQUFADA+
+MQswCQYDVQQGEwJQTDEbMBkGA1UEChMSVW5pemV0byBTcC4geiBvLm8uMRIwEAYD
+VQQDEwlDZXJ0dW0gQ0EwIhgPMjAwODEwMjIxMjA3MzdaGA8yMDI1MTIzMDIzNTk1
+OVowfjELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVz
+IFMuQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEi
+MCAGA1UEAxMZQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAOP7faNyusLwyRSH9WsBTuFuQAe6bSddf/dbLbNa
+x1Ffq6QypmGHtm4PhtIwApf412lXoRg5XWpkecYBWaw8MUo4fNIE0kso6CBfOwei
+zE1z2/OuT8dW1Vqnlon686to1COGWSfPCSe8rG5ygxwwct/gounS4XR1Gb0qnnsV
+VAQb10M5rVUoxeIau/TA5K44STPMdoWfOUXSpJ7yEoxR+HzkLX/1rF/rFp+xLdG6
+zJFCd0wlyZA4b9vwzPuOHpdZPtVgTuYFKO1JeRNLukjbL/ly0znK/h/YNHL1tEDP
+MQHD7N4RLRddH7hQ0V4Zp2neBzMoylCV+adUy1SGUEWp+UkCAwEAAaOCAWwwggFo
+MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAh2zcsH/yT2xc3tu5C84oQ3RnX3
+MFIGA1UdIwRLMEmhQqRAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRv
+IFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQYIDAQAgMA4GA1UdDwEB/wQE
+AwIBBjAsBgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vY3JsLmNlcnR1bS5wbC9jYS5j
+cmwwaAYIKwYBBQUHAQEEXDBaMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2Nz
+cC1jZXJ0dW0uY29tMC4GCCsGAQUFBzAChiJodHRwOi8vcmVwb3NpdG9yeS5jZXJ0
+dW0ucGwvY2EuY2VyMDoGA1UdIAQzMDEwLwYEVR0gADAnMCUGCCsGAQUFBwIBFhlo
+dHRwczovL3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEBBQUAA4IBAQBRIGBe
+Zq1Fsbn2DNEa8X4lqAp6dMtsZdHXlGLBWyKMHtnO8xjJyWxhVe5O2cbo8h67s5b2
+XG2q9ikXlPzuyoAlN/jA35DS+Qo9wPbw07O2vvtdgAG19POKOS2AKTtWPfu8UPSV
+scnBz7GHvBOCkCxGFb3v/AMZnjgExPgtCoIwMlcFFAHCRzUcTT+z9l2zc9aBp2gG
+35rI1cW3RlIk7orNZl6awHIV1gFalXHZ+3olO6IRpWClXFTYdnTKxBL8Wq5WLr+l
+6Z+V4cIL/T0+BY019U8zYayYZDXb85FQlULTvPcOO3YTaUdwHiCHCiiRKl7pqqky
+xLYz+f1feWUhrGop
+-----END CERTIFICATE-----
+
+subject= /C=AT/O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH/OU=a-sign-SSL-EV-03/CN=a-sign-SSL-EV-03
+serial=09790D
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIDCXkNMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB
+VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp
+bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R
+dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTExMDcyMDExMjY0
+MVoXDTE2MDcyMDA5MjY0MVowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy
+dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52
+ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEGEtc2lnbi1TU0wtRVYtMDMxGTAXBgNVBAMM
+EGEtc2lnbi1TU0wtRVYtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCk5mTlOGJIRysELGRNCcwKnotizOGSKQus2pyz15FEdCsFj0qQtaI7pOeNWree
+GXeVnnZAiDIW07TAAeA7XoIA2awo6dwWy2AFoR3U+P3EnoeF5Iq7bhjOWWzzqxMZ
+AoQU/OyZq77jial8mylNBoKmZYj4RFg/e6PKaqRFr49XWhlF9GH1u4vZ71Y6XQRG
+235KsEQD7k/uC8ZUdRhg6U+fseXu3aMHDjiIeIITGgnHnO389IxfuB3lUcd8JxB0
+4C44sTZx91sWz4xwxufFrYwxj5dkjstugFD1fEYAohFH+pqmrCaPSZREiXU24XiN
+ijfYkLJgJz00+e2ooub4zqolAgMBAAGjggEeMIIBGjB1BggrBgEFBQcBAQRpMGcw
+JwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLmEtdHJ1c3QuYXQvb2NzcDA8BggrBgEF
+BQcwAoYwaHR0cDovL3d3dy5hLXRydXN0LmF0L2NlcnRzL2EtdHJ1c3QtbnF1YWwt
+MDMuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cuYS10cnVzdC5hdC90
+ZW1wY2VydHMvYS10cnVzdC1ucXVhbC0wMy5jcmwwEwYDVR0jBAwwCoAIRGqVZ1V5
+EU8wDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIRjFbUl7cQgAwDgYDVR0PAQH/
+BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQUFAAOCAQEAdlZA
+sNho2ERUGo/1vR9Jt8eN0KgIZ9vvionI2RXPy0+0MSsazNLsinsD9q2xv+pdHmSp
+YKunmJT5xb9uJWbeKSxW1/rGAkX/8a6o7lBtgb5r12eLM31xvu2QwHSh/fyB7LfO
+AccXTWKJzQLy7FSBljL6cEiULi+KyHq+4J6jqnmZ+IqVeHrmiiX75q7kjPqxFTxr
+mmm7HWi98ou7cQ3sU+4NdcYJjU9zMuCW9b5IDgVJAY0ID8qyZfyCGac1XgX14tTB
+I0I51Jt/6y5Zz6Lr2JvCncX+ftNJZvxp9ytsUU7SxPhxk4J09zC6Hbv9DhEPbo7V
+lwcSl9B/o3xt51lqEw==
+-----END CERTIFICATE-----
+
+subject= /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Global Services CA
+serial=C53C18BF8F3F9CC77306A9C6A13E84E7
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIRAMU8GL+PP5zHcwapxqE+hOcwDQYJKoZIhvcNAQEFBQAw
+PjELMAkGA1UEBhMCUEwxGzAZBgNVBAoTElVuaXpldG8gU3AuIHogby5vLjESMBAG
+A1UEAxMJQ2VydHVtIENBMCIYDzIwMDkwMzAzMTMwNjEyWhgPMjAyNDAzMDMxMzA2
+MTJaMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2ll
+cyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
+IjAgBgNVBAMTGUNlcnR1bSBHbG9iYWwgU2VydmljZXMgQ0EwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC2WbjWcRnHoJcjIywSItrmuvILxCLKm1VuPTFB
+I0275U7w2wFKlVlfuAuHHI+2cILXVzUjIu8CObDDAmiEax1S/BVe2n9s2+CZVX+A
+buj6N6aDl05QAc52lXjXpKjK+9Fdx8vV+yD6Y273p2XnlxsibXzgKxYphWp9Lw25
+3imjPts7emJ3VFyCujZAEppCQb2yNyEHiCsRpPO0x5a4YtZ4Hi9gP03q6girACza
+MFWF5qe0UILRVm8k565nFSV1dZwXpOTogA1wQZrzHd8czfaQGqFAuao/H05FpQGF
+bngkqChwqQ8XjsTyri1mJhyezqvdK9O15PzI/zIEl4GPT4XzAgMBAAGjggFsMIIB
+aDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRFxbKGTszdKZfk3RTEbq5NuMF3
++DBSBgNVHSMESzBJoUKkQDA+MQswCQYDVQQGEwJQTDEbMBkGA1UEChMSVW5pemV0
+byBTcC4geiBvLm8uMRIwEAYDVQQDEwlDZXJ0dW0gQ0GCAwEAIDAOBgNVHQ8BAf8E
+BAMCAQYwLAYDVR0fBCUwIzAhoB+gHYYbaHR0cDovL2NybC5jZXJ0dW0ucGwvY2Eu
+Y3JsMGgGCCsGAQUFBwEBBFwwWjAoBggrBgEFBQcwAYYcaHR0cDovL3N1YmNhLm9j
+c3AtY2VydHVtLmNvbTAuBggrBgEFBQcwAoYiaHR0cDovL3JlcG9zaXRvcnkuY2Vy
+dHVtLnBsL2NhLmNlcjA6BgNVHSAEMzAxMC8GBFUdIAAwJzAlBggrBgEFBQcCARYZ
+aHR0cHM6Ly93d3cuY2VydHVtLnBsL0NQUzANBgkqhkiG9w0BAQUFAAOCAQEAdkAS
+JUhem+q0pqo1NwySqtBsF3zHbnjHJSg0XgWeFIQ29r+C7OXsmvo5xGyVC9P367ZA
+OIee86xq8nZ+cyanadrTixrL3A5D2nAdyi9NBiaVzqKoIKSiYGlOdB4p29Ij72sQ
+I1+/5oHpvxPLf8ZKp2pAWvE+zyD3EUmTadyT/Jq0tmhfZQ3O6ZjHpjaU68Mh+mSY
+eTayqMQMlBjg9E9whZqGDtAFtrBM+SFE1WGf9OsOsiLJx/dlhSeUWLKbzqMlvGry
+lvIDrZJueSPZss+njbuL4ov9IghC0QbbM/DWcAFnp0EneYpQHO+/dNs4HVW1M0iX
+U/r5z3rVPH9ZcaWOkg==
 -----END CERTIFICATE-----
 
 subject= /emailAddress=its-mensa@nau.edu/ST=Arizona/OU=Information Technology Services/O=Northern Arizona University/L=Flagstaff/C=US/CN=NAU Offline Intermediate CA
@@ -11659,6 +12320,99 @@
 BOyCqZe1veM7iCzNYJHVJPpnGK/jyg==
 -----END CERTIFICATE-----
 
+subject= /CN=UIS-IntB-CA
+serial=51CDF243
+-----BEGIN CERTIFICATE-----
+MIIEwjCCA6qgAwIBAgIEUc3yQzANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0xNDAxMjIyMDQ0MjlaFw0xNjA3
+MjMxMzM4MzZaMBYxFDASBgNVBAMTC1VJUy1JbnRCLUNBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAyVBgWLUrmsSsqffDhgQG+Dk0SfUChTwcdO9FaitC
+QRiEqQI9flG7kwHtEYrtxoW5gA50c7aRSYerEBn60fWHrvt5jzT6ZhAgW5hBkk9u
+Sj3UUnyy5/ghNTJMppc1lhDUkBiafDv15INP2KOw+mC45XRi1QuGk9ygCZCorKhT
+t+se+xf/mB7aaowI/XLoq5nVQaT2hJj31YaDnV6GFQ99dGuaYRON0X1d3i0wnKuk
+OKVF7TO9FUZhKvRmzLXbtyy9NT/YR9ZqS9xhj9lmPVPik10cb4Bp6QFcjpAghb1r
+ZPb/Q2MhL1vm9SU2t0dN4WENDkjYtG2S3d67ZSo48Tq5CQIDAQABo4IBdzCCAXMw
+DgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwJwYDVR0lBCAwHgYI
+KwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcDBDB7BgNVHSAEdDByMDYGCmCGSAGG
++mwKAQgwKDAmBggrBgEFBQcCARYaaHR0cDovL3d3dy5lbnRydXN0Lm5ldC9jcHMw
+OAYJYIZIAYb9MAEBMCswKQYIKwYBBQUHAgEWHWh0dHA6Ly91aXNwa2kudW5pc3lz
+LmNvbS9yZXAvMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29j
+c3AuZW50cnVzdC5uZXQwMgYDVR0fBCswKTAnoCWgI4YhaHR0cDovL2NybC5lbnRy
+dXN0Lm5ldC8yMDQ4Y2EuY3JsMB0GA1UdDgQWBBQinpr725qHyAWk4G73r8dAXV4N
+TzAfBgNVHSMEGDAWgBRV5IHREYC+2Im5CKMx+aEkCRa5cDANBgkqhkiG9w0BAQUF
+AAOCAQEAF39fUJvZAMbd3pvzXqtY+e2pIi3PIMbKz4pMoKfV4ZxctesG962TVg6z
+X0Ia6vin9edRm2gM7rSbKxTDve48xWiO+sz4FyYW0WWcuFoNJJ574OfDvtvUJiM5
+ZKuaWzaIq1J9K8SLLWIKVNB5T794osH6+2vCTS1o0fAV8SuptFVGVASXwEYXtPUQ
+O6BooGtQClfDs4KR4qvWLLo9eEGOUB4AWdhqze0IJN3222810gOLLZzxwCefRwXE
+SEjt9X3ftohyNULLD8ARqtQYId+xk36HFVlmSh8dMocw2PQebWxN2cNPRHz24nzo
+I5Vn6oVSh9eAxMukZBSG7H5k5ETLmg==
+-----END CERTIFICATE-----
+
+subject= /CN=UIS-IntB-CA
+serial=51CDFEDB
+-----BEGIN CERTIFICATE-----
+MIIEwjCCA6qgAwIBAgIEUc3+2zANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0xNDA3MjQxNDUyMjhaFw0xNzA3
+MjQyMTExMjdaMBYxFDASBgNVBAMTC1VJUy1JbnRCLUNBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAyVBgWLUrmsSsqffDhgQG+Dk0SfUChTwcdO9FaitC
+QRiEqQI9flG7kwHtEYrtxoW5gA50c7aRSYerEBn60fWHrvt5jzT6ZhAgW5hBkk9u
+Sj3UUnyy5/ghNTJMppc1lhDUkBiafDv15INP2KOw+mC45XRi1QuGk9ygCZCorKhT
+t+se+xf/mB7aaowI/XLoq5nVQaT2hJj31YaDnV6GFQ99dGuaYRON0X1d3i0wnKuk
+OKVF7TO9FUZhKvRmzLXbtyy9NT/YR9ZqS9xhj9lmPVPik10cb4Bp6QFcjpAghb1r
+ZPb/Q2MhL1vm9SU2t0dN4WENDkjYtG2S3d67ZSo48Tq5CQIDAQABo4IBdzCCAXMw
+DgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwJwYDVR0lBCAwHgYI
+KwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcDBDB7BgNVHSAEdDByMDYGCmCGSAGG
++mwKAQgwKDAmBggrBgEFBQcCARYaaHR0cDovL3d3dy5lbnRydXN0Lm5ldC9jcHMw
+OAYJYIZIAYb9MAEBMCswKQYIKwYBBQUHAgEWHWh0dHA6Ly91aXNwa2kudW5pc3lz
+LmNvbS9yZXAvMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29j
+c3AuZW50cnVzdC5uZXQwMgYDVR0fBCswKTAnoCWgI4YhaHR0cDovL2NybC5lbnRy
+dXN0Lm5ldC8yMDQ4Y2EuY3JsMB0GA1UdDgQWBBQinpr725qHyAWk4G73r8dAXV4N
+TzAfBgNVHSMEGDAWgBRV5IHREYC+2Im5CKMx+aEkCRa5cDANBgkqhkiG9w0BAQUF
+AAOCAQEAKypL/DqGcgZHw6xBs32WZXoX1W4kmIsDs6fP6Cz6eRcq5X7xtSqivLg/
+OOoHMTQhr3fHPdnrhGFFKtFYjoi2ut9SPBuVLNHhaE0rvQuY9hmrVhAe8hrfRqe9
+JD9t0hmt/mHarvMjpW+6sgk1ZmnEzX76oaZpXlYH4CEAEeOvGwDihXejHfY8dIoN
+frbBsRnZGC2tT3wZtFMMuS4OJaN9sc7w0LnaT5E0UlDvQ2EnsGdL6J1OIS4qBU2x
+Dgo48WBwIINCs/MYm4kyz4iRm1ZGDa1Re6SmcbKM9FDsz5KOUWWE/LJaykV/925y
+HOtSNI46psccul0bF9WNxBN9EGgcZg==
+-----END CERTIFICATE-----
+
+subject= /C=US/O=thawte, Inc./CN=thawte SHA256 SSL CA
+serial=36349E18C99C2669B6562E6CE5AD7132
+-----BEGIN CERTIFICATE-----
+MIIEwjCCA6qgAwIBAgIQNjSeGMmcJmm2Vi5s5a1xMjANBgkqhkiG9w0BAQsFADCB
+rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
+BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0xMzA1MjMwMDAwMDBa
+Fw0yMzA1MjIyMzU5NTlaMEMxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwx0aGF3dGUs
+IEluYy4xHTAbBgNVBAMTFHRoYXd0ZSBTSEEyNTYgU1NMIENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo2Mr1LpdOK6wz7lMON8gffErR3Edi2jzVvmc
+2qrlhCbepXEwvPMxI53oO4DIZld1tlcO25P1Jo5wumRSZooqiFxEGE2oony9VmEy
+kBL5NYdIYLBukGdEAY3nyQ1jaHJyq2M8hrgffa2IJadqiCn7WcZ4cV8suonm04D9
+V+y5UV9DMy5+JTukBNFgjLNEM5MMrSq2RKIZO6/EkG97BYeGmyxqnStsd8kAn8nP
+rO0+G/fD89n4bNSgV8T7KDKqM/Dmupjf5cJOnHS/ikjC8hvwd0BBBwSyOtVMxCmp
+EUA/AkbwkdXSgYOGE7Mx7UarqId2qZl9vM0xUPSltdylMrOLiwIDAQABo4IBRDCC
+AUAwMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzABhhZodHRwOi8vb2NzcC50aGF3
+dGUuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYDVR0gBDowODA2BgpghkgBhvhF
+AQc2MCgwJgYIKwYBBQUHAgEWGmh0dHBzOi8vd3d3LnRoYXd0ZS5jb20vY3BzMDcG
+A1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9jcmwudGhhd3RlLmNvbS9UaGF3dGVQQ0Et
+RzMuY3JsMA4GA1UdDwEB/wQEAwIBBjAqBgNVHREEIzAhpB8wHTEbMBkGA1UEAxMS
+VmVyaVNpZ25NUEtJLTItNDE1MB0GA1UdDgQWBBQrmjWuARg4MOFwegXgEXajzr2Q
+FDAfBgNVHSMEGDAWgBStbKqUYJzt5P/6Pgp0K2MD97ZZvzANBgkqhkiG9w0BAQsF
+AAOCAQEAdKZW6K+Tlhn7JvkNsESlzel6SAN0AWwTcbfggpCZYiPj1pmv8McenqgY
+Idu0lD80VhuZVS+O8EUzMrdywRNbNNP1YOUuGNFcxWrBqodQDBydZCv/G9zVLmEL
+57m2kVOG2QMq0T17StorB74p8mBCqZEaDi480X2lExQC+u6LjbbIuD5WgVchJD9l
+w7TJzlyNRqxT8/lVdMgr/dJ4cPX4EeX0p60g9Z3x7HD2E6zmjI3bP8byeQ6rUvLM
+G3knzxaz1vPGNoBD7MWU8N2QjfjGUkZW63RHvqbzGa5xTMDh59TP7dQGKCoRPLrZ
+QW4A54E3k+TaYsYdZ29jtBSG2aZi8A==
+-----END CERTIFICATE-----
+
 subject= /C=US/O=Internet2/OU=InCommon/CN=InCommon Server CA
 serial=7F71C1D3A226B0D2B113F3E68167643E
 -----BEGIN CERTIFICATE-----
@@ -11814,6 +12568,37 @@
 CPMr3u00HUSe0gST9MsFFy0JLS1j7/YmC3s=
 -----END CERTIFICATE-----
 
+subject= /C=US/O=GeoTrust Inc./CN=GeoTrust SHA256 SSL CA
+serial=4182127D12D9C6B321394312566400B8
+-----BEGIN CERTIFICATE-----
+MIIExzCCA6+gAwIBAgIQQYISfRLZxrMhOUMSVmQAuDANBgkqhkiG9w0BAQsFADCB
+mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
+MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEczMB4XDTEzMDUyMzAwMDAwMFoXDTIzMDUyMjIzNTk1OVowRjELMAkG
+A1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHzAdBgNVBAMTFkdlb1Ry
+dXN0IFNIQTI1NiBTU0wgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDGqQtdF6V9xs8q78Zm0UIeX4N4aJGv5qeL8B1EAQoZypzUix3hoZCjwVu011tq
+i/wOSR7CYin+gBU5i4EqJ7X7EqgFIgvFLPXZmN0WLztm52KiQzKsj7WFyFIGLFzA
+d/pn94PoXgWNyKuhFjKK0kDshjocI6mNtQDecr2FVf4GAWBdrbPgZXOlkhSelFZv
+k+6vqTowJUqOCYTvt9LV15tJzenAXmdxIqxQkEMgXaGjFYP9/Kc5vGtlSBJg/90j
+szqq9J+cN1NBokeTgTMJ5SLGyBxJoW6NzIOzms3qQ/IZ0yTLqCmuUsz0CCewhOrO
+J7XhNBNzklyHhirGsGg2rcsJAgMBAAGjggFcMIIBWDA7BggrBgEFBQcBAQQvMC0w
+KwYIKwYBBQUHMAGGH2h0dHA6Ly9wY2EtZzMtb2NzcC5nZW90cnVzdC5jb20wEgYD
+VR0TAQH/BAgwBgEB/wIBADBMBgNVHSAERTBDMEEGCmCGSAGG+EUBBzYwMzAxBggr
+BgEFBQcCARYlaHR0cDovL3d3dy5nZW90cnVzdC5jb20vcmVzb3VyY2VzL2NwczA7
+BgNVHR8ENDAyMDCgLqAshipodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9HZW9UcnVz
+dFBDQS1HMy5jcmwwDgYDVR0PAQH/BAQDAgEGMCoGA1UdEQQjMCGkHzAdMRswGQYD
+VQQDExJWZXJpU2lnbk1QS0ktMi00MTYwHQYDVR0OBBYEFBRnju2DT9YenUAEDARG
+oXA0sg9yMB8GA1UdIwQYMBaAFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3
+DQEBCwUAA4IBAQAQEOryENYIRuLBjz42WcgrD/5N7OP4tlYxeCXUdvII3e8/zYsc
+fqp//AuoI2RRs4fWCfoi+scKUejOuPYDcOAbWrmxspMREPmXBQcpbG1XJVTo+Wab
+Dvvbn+6Wb2XLH9hVzjH6zwL00H9QZv8veZulwt/Wz8gVg5aEmLJG1F8TqD6nNJwF
+ONrP1mmVqSaHdgHXslEPgWlGJhyZtoNY4ztYj9y0ccC5v0KcHAOe5Eao6rnBzfZb
+qTyW+3mkM3Onnni5cNxydMQyyAAbye9I0/s6m/r+eppAaRzI2ig3C9OjuX6WzCso
+w1Zsb+nbUrH6mvvnr7WXpiLDxaiTsQDJB7J9
+-----END CERTIFICATE-----
+
 subject= /C=US/O=DREAMHOST CERTIFICATION AUTHORITY/CN=DREAMHOST SSL DOMAIN VALIDATED CA
 serial=7EE45145D65AD88691203A8CBF425508
 -----BEGIN CERTIFICATE-----
@@ -12093,35 +12878,35 @@
 LXY2JtwE65/3YR8V3Idv7kaWKK2hJn0KCacuBKONvPi8BDAB
 -----END CERTIFICATE-----
 
-subject= /C=US/ST=New Jersey/L=Jersey City/O=Positive Software Corporation/CN=LiteSSL CA
-serial=30A79E6DB1E9195AB1C850D3967D63D5
+subject= /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Extended Validation CA
+serial=7F510C05CFB39D04FFF306BA2C56E827
 -----BEGIN CERTIFICATE-----
-MIIE0DCCA7igAwIBAgIQMKeebbHpGVqxyFDTln1j1TANBgkqhkiG9w0BAQUFADBv
-MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
-ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
-eHRlcm5hbCBDQSBSb290MB4XDTA1MDcxNDAwMDAwMFoXDTE5MDcwOTE4MTkyMlow
-dTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
-cnNleSBDaXR5MSYwJAYDVQQKEx1Qb3NpdGl2ZSBTb2Z0d2FyZSBDb3Jwb3JhdGlv
-bjETMBEGA1UEAxMKTGl0ZVNTTCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAL1PeVgik8koPlIRAC/AqSCK1y1VHhDnuH/ihiqk7F7p5JJYllQN8xe6
-QZ4VkVXvwu4AIBhFgybfIMw9s6ETMQohXHmDeaskFVxW8LSVmKHa0hvqFrXLt7DB
-U/mkRtrwLiS4Yp6Oi14rWpag6lDpiPsoKk2anEhPg7aHrk/FyLXZ/b4/0aedxiwT
-DcABx7Nw849pu7A8EN/rCQCEP27v/OMttMddEcz38vH24uMAfhIO3o19AMo6PfZy
-6HklpggW96uI/1ZeCRfAWoIFYjQrKEgyl9CEDKwTGNueZseqFIsRaU3xCdO6XamI
-N2LYvwObndfmBX7CalKqjQeA6o4O8x0CAwEAAaOCAWAwggFcMB0GA1UdDgQWBBS4
-yhHpBjF528OUxugZKry7NRYxpDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgw
-BgEB/wIBATARBglghkgBhvhCAQEEBAMCAgQwewYDVR0fBHQwcjA4oDagNIYyaHR0
-cDovL2NybC5jb21vZG9jYS5jb20vQWRkVHJ1c3RFeHRlcm5hbENBUm9vdC5jcmww
-NqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BZGRUcnVzdEV4dGVybmFsQ0FS
-b290LmNybDCBhgYIKwYBBQUHAQEEejB4MDsGCCsGAQUFBzAChi9odHRwOi8vY3J0
-LmNvbW9kb2NhLmNvbS9BZGRUcnVzdFVUTlNlcnZlckNBLmNydDA5BggrBgEFBQcw
-AoYtaHR0cDovL2NydC5jb21vZG8ubmV0L0FkZFRydXN0VVROU2VydmVyQ0EuY3J0
-MA0GCSqGSIb3DQEBBQUAA4IBAQBC6Axe81lrom4vHWzOmzz+QYj/ADLgK8RDWDbI
-QHwZcNXyYJPz7kmOcpAbayWK1yAzGr4JPiKP3z86voZ56MpIfOt0eKpxKBUdXtsV
-P1XOLeKbmHDhcjxZjRYRIi2e1dXHOAAlF/abnGSsR/eCo/4RRf9FcCZPgvBx1Kin
-94eVLE9rI2JwuUpDnogyo+EHMTUWIdtCdtsLFP1IY1JCdfZCFph/kW+FLdiQ8DOr
-nJkl8PP6wL2aXDnnniFcBMa9rqB/ib5buMRAO+nJVv28mJkggodDRpZXFp+OGTIU
-WjEZgqr9NaoNZCZpyfZxPsOFYzoxLYEmJs3AJHxkhIHg6YQU
+MIIE0DCCA7igAwIBAgIQf1EMBc+znQT/8wa6LFboJzANBgkqhkiG9w0BAQUFADB+
+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5B
+LjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIwIAYD
+VQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMCIYDzIwMDkxMjAzMTIzMDUx
+WhgPMjAyNDEyMDMxMjMwNTFaMIGCMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5p
+emV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MSYwJAYDVQQDEx1DZXJ0dW0gRXh0ZW5kZWQgVmFsaWRh
+dGlvbiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALdbeWT9FRmu
+vkny0wq+Rvkw3dqXjyi9NgIODqux3YFMzSglw1UiSa/HaaDEe7/hLZG1uS/681uF
+TJPW8CjuB2zL4/JajSg+4Vk83Tl5frlKPcee247R2+zREyulv8FsDAEFrXHIksv/
+neymQPhsNo88TuYvQUsQ00CO0k4kXGGcrsi3g+n4OAPJy5wbOeh5IRFysYui6h2O
+fuskEy/zCWqagCJG12xJizNXZA/7NZOA8k3FlitDKoBtI5nhDEWSKsuC9+BRY0US
+Y6WmtzK/eyGf4dL1LzL8VDy4Q1C6EV1WHjIzu3c8CYl5ZedxTWpqgbFvpU8lZPRq
+2+4fSfYEV50CAwEAAaOCAT8wggE7MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FMA7CvoP2f4PTgKYZRQMih4uAIwDMB8GA1UdIwQYMBaAFAh2zcsH/yT2xc3tu5C8
+4oQ3RnX3MA4GA1UdDwEB/wQEAwIBBjAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8v
+Y3JsLmNlcnR1bS5wbC9jdG5jYS5jcmwwawYIKwYBBQUHAQEEXzBdMCgGCCsGAQUF
+BzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0dW0uY29tMDEGCCsGAQUFBzAChiVo
+dHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvY3RuY2EuY2VyMDoGA1UdIAQzMDEw
+LwYEVR0gADAnMCUGCCsGAQUFBwIBFhlodHRwczovL3d3dy5jZXJ0dW0ucGwvQ1BT
+MA0GCSqGSIb3DQEBBQUAA4IBAQDjVwCnq+GLDRGX3/0iHG5Kly0xNZyeUAVO87Vu
+NooCBrDNwoEktiVONSZKVZXyMSz0gicLoVEQqPvA4f+i8O5w1UUiJ5v85pE6nU6n
+p15S8lDHaouvaeb0QIJ1G2m6atELRIoWuXdiij9Az2cKeWk5IuTVfL4upvVK95R6
+MybtIihbdZXHz3E7zTUQh3Uun4K2msHoJMUhURSk2uAr17wcggaOcHiXNmDnDaD5
+Q3hHzlFPr+Oh+xMoDIFyXLj4IG1SDp3Wz9EZIyUsbcrNSNiFmZiqrdNNcqzKBZ7S
+3j3nhOAabYpUwHoNxn+fJ0qdFSviuRWkJBHVfipSnmw7Dkjz
 -----END CERTIFICATE-----
 
 subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
@@ -12186,35 +12971,35 @@
 gNCukPCuzm0Htc+MVWW4Mf6GO1IZFxnjBfro5099kL+EJNvB/g==
 -----END CERTIFICATE-----
 
-subject= /C=US/O=Bechtel Corporation/OU=Information Security/CN=Bechtel External iBechtel CA 1
-serial=61059E1C000000000003
+subject= /C=US/O=thawte, Inc./OU=Domain Validated SSL/CN=thawte DV SSL CA - G2
+serial=2C69E12F6A670BD99DD20F919EF09E51
 -----BEGIN CERTIFICATE-----
-MIIE0jCCA7qgAwIBAgIKYQWeHAAAAAAAAzANBgkqhkiG9w0BAQUFADBxMQswCQYD
-VQQGEwJVUzEcMBoGA1UEChMTQmVjaHRlbCBDb3Jwb3JhdGlvbjEdMBsGA1UECxMU
-SW5mb3JtYXRpb24gU2VjdXJpdHkxJTAjBgNVBAMTHEJlY2h0ZWwgRXh0ZXJuYWwg
-UG9saWN5IENBIDEwHhcNMDkwMjE5MjEwNDA3WhcNMTYwMjE4MTgyNDUwWjBzMQsw
-CQYDVQQGEwJVUzEcMBoGA1UEChMTQmVjaHRlbCBDb3Jwb3JhdGlvbjEdMBsGA1UE
-CxMUSW5mb3JtYXRpb24gU2VjdXJpdHkxJzAlBgNVBAMTHkJlY2h0ZWwgRXh0ZXJu
-YWwgaUJlY2h0ZWwgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AIvKYFyPRD3SQ+Z0PPsFwYHRFLPk0sthIm43KrWZ27pOpq+UIIYPOQ924v5CRFuC
-An6AGWdtvmFIl5z4hiNhRR2V/Cd+gvErlG+6auG56cnRanfTRRy+mI4dfwNW9Zy0
-yI9LsKY9kGx7cMsHj9Qy7WRNvL4+E9CbDZkDGEvQYAAhE57jRhf756YM19PDsJ6P
-hP4ZYzIvjXnbVb82/4WwWRugHOomZ6hAccD9I8Z9Yp4Ej3et2LOBVaCqjG7oR2T2
-/T1kvkbgk4UNlzPIy5g6hJTX9gQyKoxg29LJ5KO0Va3thmczhH5j4crNIlnhQBJY
-uI5xt/cM2S8H4SCBI+iE+EcCAwEAAaOCAWgwggFkMBIGA1UdEwEB/wQIMAYBAf8C
-AQAwHQYDVR0OBBYEFI8xhWTDhtYAgrmh7lALkvVRzOLUMAsGA1UdDwQEAwIBhjAQ
-BgkrBgEEAYI3FQEEAwIBADAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAfBgNV
-HSMEGDAWgBRKdvYeywI+Oit8E6iz2amoXIdkYjBeBgNVHR8EVzBVMFOgUaBPhk1o
-dHRwOi8vY2VydGF1dGguYmVjaHRlbC5jb20vQ2VydERhdGEvQmVjaHRlbCUyMEV4
-dGVybmFsJTIwUG9saWN5JTIwQ0ElMjAxLmNybDB0BggrBgEFBQcBAQRoMGYwZAYI
-KwYBBQUHMAKGWGh0dHA6Ly9jZXJ0YXV0aC5iZWNodGVsLmNvbS9DZXJ0RGF0YS9w
-b2xleHRjYTAxX0JlY2h0ZWwlMjBFeHRlcm5hbCUyMFBvbGljeSUyMENBJTIwMS5j
-cnQwDQYJKoZIhvcNAQEFBQADggEBAG43R/NcENpGERErNMECNhdFXvyMjJkejidW
-/fgq2f+uMpiRj31Eve/Xb4i+wNqsZBJoZAEwA0iTMNfJc6ZUhJT96ZlVGLvqTlxS
-E9QwfBv7kMIeCF9Ol5jDgR1kerJRvFje+6RpOYW4zWzp0rCQOd9vtEqmoNjY4oSt
-uP2+C348UxyzwOjVoR0CIWvp17JarUj4rDXXybW8Ze9IYRGTtWPuk6bai5pK3YXe
-Uk/c0hzX5cOEAq1CSFe7B4Usfa5P8OcbM4tFFrvgOGYhV6wmsnu1F3NcgJMqfkw2
-zYm9YiiDQYuhafwUIsHVpWdXexMa36TCeKlIocPpjNeIoiqqUxs=
+MIIE0jCCA7qgAwIBAgIQLGnhL2pnC9md0g+RnvCeUTANBgkqhkiG9w0BAQsFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMTQwNjEwMDAwMDAwWhcNMjQw
+NjA5MjM1OTU5WjBjMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMu
+MR0wGwYDVQQLExREb21haW4gVmFsaWRhdGVkIFNTTDEeMBwGA1UEAxMVdGhhd3Rl
+IERWIFNTTCBDQSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+6pQHhchBLPaDEmySX6sfANSWb3TNLhHpbA85AblIkEA5TcSiyHlqpZq9kURld1St
+/yVf7kL7swIP6l163RpUntdzQpvMeV/FTfS3Cxg5IHrdUAFdNEVfTBEO9YcmJrSw
+835xoDFxUIloWmOKFGLljDoWVQ0+66qAHXF644cHq72idM3aCAGdG8wniIxH1Gkl
+Qta7UG2FUNBIgg0In+kj40LGPJi4u27FcBPfGR0B/dK1TuZi9Af6a30Rd8RiT0BO
+pXiXqyxNDKd8w8RQMp/QcJsP//91WTSFrUnVNe5PW9TUNpWgfujFoRy9E0597mNq
+lhmZyKcqAOZRjUbrMFjoLQIDAQABo4IBOTCCATUwEgYDVR0TAQH/BAgwBgEB/wIB
+ADBBBgNVHSAEOjA4MDYGCmCGSAGG+EUBBzYwKDAmBggrBgEFBQcCARYaaHR0cHM6
+Ly93d3cudGhhd3RlLmNvbS9jcHMwDgYDVR0PAQH/BAQDAgEGMC4GCCsGAQUFBwEB
+BCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL3Quc3ltY2QuY29tMDEGA1UdHwQqMCgw
+JqAkoCKGIGh0dHA6Ly90LnN5bWNiLmNvbS9UaGF3dGVQQ0EuY3JsMCkGA1UdEQQi
+MCCkHjAcMRowGAYDVQQDExFTeW1hbnRlY1BLSS0xLTY5ODAdBgNVHQ4EFgQUn7jB
+qWzy9cAiKpTtXJms1OzXxgcwHwYDVR0jBBgwFoAUe1tFz6/Oy3r9MZIaarbzRutX
+SFAwDQYJKoZIhvcNAQELBQADggEBAFNU8keoAtfvqjV4vkoIDZAYS22eKlMr6VQX
+d3QpftA3BwW45Pq4tGOYRNzGT4EGjDq+xzBXxnD81pMZn8NV1z4fcoqdMFo1lzLL
+Y+TGct/7aMppL9vNUDg+K7urO4LH/UubvXxBmO8BU9g1jyXJAwbmnFfBUQ+e9n2T
+Tfh2yDpr9MSPMzJ/nSGENNmn+ZL6QZFhhAWdo3lGzmfngfJerEy8qKtqbRXinE5a
+2WOAvPdC65pExoxrBja0izKJ3sLxqCaqqaz/6nGm54xB+hc1u7OHMamTwshY4QpO
+lYOcue07pe8I4HT5wxvmB6PuB9dCInkhoKHUHSbT0NamXStBwHk=
 -----END CERTIFICATE-----
 
 subject= /C=DE/O=Leibniz Universitaet Hannover/OU=RRZN/CN=CA der LUH (UH-CA) - G03
@@ -12310,6 +13095,37 @@
 WhzaSlx/hRVCvs2guO1tVxX4ZGcgIbZry9QIyjk5OGJ550L45yCN+w==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=DFN-Verein/OU=DFN-PKI/CN=DFN-Verein PCA Global - G01
+serial=504EC6F53D11B464
+-----BEGIN CERTIFICATE-----
+MIIE1TCCA72gAwIBAgIIUE7G9T0RtGQwDQYJKoZIhvcNAQELBQAwcTELMAkGA1UE
+BhMCREUxHDAaBgNVBAoTE0RldXRzY2hlIFRlbGVrb20gQUcxHzAdBgNVBAsTFlQt
+VGVsZVNlYyBUcnVzdCBDZW50ZXIxIzAhBgNVBAMTGkRldXRzY2hlIFRlbGVrb20g
+Um9vdCBDQSAyMB4XDTE0MDcyMjEyMDgyNloXDTE5MDcwOTIzNTkwMFowWjELMAkG
+A1UEBhMCREUxEzARBgNVBAoTCkRGTi1WZXJlaW4xEDAOBgNVBAsTB0RGTi1QS0kx
+JDAiBgNVBAMTG0RGTi1WZXJlaW4gUENBIEdsb2JhbCAtIEcwMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAOmbw2eF+Q2u9Y1Uw5ZQNT1i6W5M7ZTXAFuV
+InTUIOs0j9bswDEEC5mB4qYU0lKgKCOEi3SJBF5b4OJ4wXjLFssoNTl7LZBF0O2g
+AHp8v0oOGwDDhulcKzERewzzgiRDjBw4i2poAJru3E94q9LGE5t2re7eJujvAa90
+D8EJovZrzr3TzRQwT/Xl46TIYpuCGgMnMA0CZWBN7dEJIyqWNVgn03bGcbaQHcTt
+/zWGfW8zs9sPxRHCioOhlF1Ba9jSEPVM/cpRrNm975KDu9rrixZWVkPP4dUTPaYf
+JzDNSVTbyRM0mnF1xWzqpwuY+SGdJ68+ozk5SGqMrcmZ+8MS8r0CAwEAAaOCAYYw
+ggGCMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUSbfGz+g9H3/qRHsTKffxCnA+
+3mQwHwYDVR0jBBgwFoAUMcN5G7r1U9cX4Il6LRdsCrMrnTMwEgYDVR0TAQH/BAgw
+BgEB/wIBAjBiBgNVHSAEWzBZMBEGDysGAQQBga0hgiwBAQQCAjARBg8rBgEEAYGt
+IYIsAQEEAwAwEQYPKwYBBAGBrSGCLAEBBAMBMA8GDSsGAQQBga0hgiwBAQQwDQYL
+KwYBBAGBrSGCLB4wPgYDVR0fBDcwNTAzoDGgL4YtaHR0cDovL3BraTAzMzYudGVs
+ZXNlYy5kZS9ybC9EVF9ST09UX0NBXzIuY3JsMHgGCCsGAQUFBwEBBGwwajAsBggr
+BgEFBQcwAYYgaHR0cDovL29jc3AwMzM2LnRlbGVzZWMuZGUvb2NzcHIwOgYIKwYB
+BQUHMAKGLmh0dHA6Ly9wa2kwMzM2LnRlbGVzZWMuZGUvY3J0L0RUX1JPT1RfQ0Ff
+Mi5jZXIwDQYJKoZIhvcNAQELBQADggEBAGMgKP2cIYZyvjlGWTkyJbypAZsNzMp9
+QZyGbQpuLLMTWXWxM5IbYScW/8Oy1TWC+4QqAUm9ZrtmL7LCBl1uP27jAVpbykNj
+XJW24TGnH9UHX03mZYJOMvnDfHpLzU1cdO4h8nUC7FI+0slq05AjbklnNb5/TVak
+7Mwvz7ehl6hyPsm8QNZapAg91ryCw7e3Mo6xLI5qbbc1AhnP9TlEWGOnJAAQsLv8
+Tq9uLzi7pVdJP9huUG8sl5bcHUaaZYnPrszy5dmfU7M+oS+SqdgLxoQfBMbrHuif
+fbV7pQLxJMUkYxE0zFqTICp5iDolQpCpZTt8htMSFSMp/CzazDlbVBc=
+-----END CERTIFICATE-----
+
 subject= /C=KR/O=SGssl/CN=SGTRUST SGC CERTIFICATION AUTHORITY
 serial=4BEB8A04B3F2AA04B7ABDA1B892CB0B3
 -----BEGIN CERTIFICATE-----
@@ -12341,6 +13157,37 @@
 BrkEZRmDnlqRtJM0iuMV4LrsvawozmDuSSHgIhswszCs8FEd+tYCBMA=
 -----END CERTIFICATE-----
 
+subject= /C=US/O=GeoTrust Inc./CN=GeoTrust Extended Validation SHA256 SSL CA
+serial=5418A02AD0BF5719DDF72336B147F0BA
+-----BEGIN CERTIFICATE-----
+MIIE1jCCA76gAwIBAgIQVBigKtC/Vxnd9yM2sUfwujANBgkqhkiG9w0BAQsFADCB
+mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
+MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEczMB4XDTEzMDQwOTAwMDAwMFoXDTIzMDQwODIzNTk1OVowWjELMAkG
+A1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xMzAxBgNVBAMTKkdlb1Ry
+dXN0IEV4dGVuZGVkIFZhbGlkYXRpb24gU0hBMjU2IFNTTCBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMyTtRz0xgdcgBRXASeOv/9MLaY63wmj1AtU
+qgN1I/EwdcyRNWPhCok/Y8h+xOy/SKMdfDEIvWx5BabA4sEQ+ZByI2Kkrir6gJ9O
+YTaC/puD4GwIWXZeY4FLKaCJqEhRXYsCUQBupY6ur6qIz2EDugz+/NvorDkBhm+4
+FhZbr9GK7XaS+yLp+rH5RAE5VBDJ/QpIC8wONyoI1s/JIs+/0QOV3iNP5aT5Nc3O
+KnCbKP9jxWAi06N+Kohc8+ZHEs1mOWRYOkxtkx6fa/uFTwYLrjIPsQroBA/ei0kA
+Wf5crs+I3w+MSCeekhLbxEONCvLZiuurKCJp6qFIgb0823q51fkCAwEAAaOCAVcw
+ggFTMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMEcGA1UdIARA
+MD4wPAYEVR0gADA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nZW90cnVzdC5j
+b20vcmVzb3VyY2VzL2NwczA7BgNVHR8ENDAyMDCgLqAshipodHRwOi8vY3JsLmdl
+b3RydXN0LmNvbS9HZW9UcnVzdFBDQS1HMy5jcmwwOwYIKwYBBQUHAQEELzAtMCsG
+CCsGAQUFBzABhh9odHRwOi8vcGNhLWczLW9jc3AuZ2VvdHJ1c3QuY29tMCoGA1Ud
+EQQjMCGkHzAdMRswGQYDVQQDExJWZXJpU2lnbk1QS0ktMi0zNzUwHQYDVR0OBBYE
+FBe43KqxUyIZQZV7PIHqiJtJw6KLMB8GA1UdIwQYMBaAFMR5yo6hTgMdHNxr2zFb
+lD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAQTwBTUY/eNNrhqBOxJG1kAe76zOpw
+pmYnXFoXmlww27wgPDLeLV4gdLoH37hBek9xmdaTmGx4rUOjWwo3PCQc2uAAQAbU
+lMexbDS3jRe7tLUhnrOHpsYT+jCxBihNlxnMQaFbWqb7dkORAq83gQUoUQQXp8Ce
+6A6Gn69mpWG1HF3gnV0kN+tyl50WcSTxozpg5cvQj4XeicVGLcfwTHDcH+otkgLk
+Y/zY8CiAVREHOr6GtrODu1A8rp6DNEUxT1IUWoiBm/CzU3nokWlJq+88NdPPAQVA
+SmH8MWdlDFttkLDmEdINTBUuaHj6jcjaihtzGUpCDzxlUEFLyozGWBj0
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=Jacobs University Bremen gGmbH/OU=IRC-IT/CN=Jacobs University CA - G01
 serial=0A15EFCF
 -----BEGIN CERTIFICATE-----
@@ -12403,6 +13250,37 @@
 zwCUPjp2zXgqipvjuAeBO82TPxOoPzHvEEacGhckm4oJI5q2R6XSjmP/eHI=
 -----END CERTIFICATE-----
 
+subject= /C=US/O=Entrust.net/OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Secure Server Certification Authority
+serial=374AD243
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
+MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
+ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
+b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
+U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
+I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
+wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
+AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
+oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
+BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
+dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
+MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
+MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
+E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
+MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
+hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
+95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
+2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+
 subject= /C=PT/O=MarketWare/OU=Certificate Services/CN=MarketWare Server CA
 serial=5AA3BD7C8797388F7FB395866CD1BDA7
 -----BEGIN CERTIFICATE-----
@@ -12879,6 +13757,38 @@
 e1FbYT/ZFR0D3BI=
 -----END CERTIFICATE-----
 
+subject= /C=US/O=Verizon Business/OU=OmniRoot/CN=Verizon Global Root CA
+serial=0727AC3A
+-----BEGIN CERTIFICATE-----
+MIIE6DCCA9CgAwIBAgIEByesOjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE0MDUxMzE2MjQxMFoX
+DTI0MDUxMzE2MjE0OVowXDELMAkGA1UEBhMCVVMxGTAXBgNVBAoMEFZlcml6b24g
+QnVzaW5lc3MxETAPBgNVBAsMCE9tbmlSb290MR8wHQYDVQQDDBZWZXJpem9uIEds
+b2JhbCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAigAM
+cB2/6zSGw5lFNR5/Q/erbyQtzRnCELuwyilbqSCrq3IsxOICOW2CuMUR6vj7s55i
++DMesB/J4/Y32wTIO2NPNuKFpCUdx2kfBL1oRROWBx+UUPU+xSdUnsBJV0SOB2PU
+pq7tIpnMTZZpBBNudomfdBaU+R1UvaK50oMBIgxNRICq/jWJJyWnhonG1RqS44/F
+laAUcproVsUCVRyX+SAu0PU8Exla9uH5CwOCaaeMt9ZvnFY+negqCWBtS+b7i5kU
+9zRPZVmAjblXyKI1IdiIcVZd7oJXLSaQGJ+anJyP79TFY6dUfUeRh30aEqgbGG+p
+b7EnuuQEdM43Hn9mxQIDAQABo4IBsjCCAa4wEgYDVR0TAQH/BAgwBgEB/wIBAjBH
+BgNVHSAEQDA+MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly9zZWN1cmUu
+b21uaXJvb3QuY29tL3JlcG9zaXRvcnkwgboGCCsGAQUFBwEBBIGtMIGqMDIGCCsG
+AQUFBzABhiZodHRwOi8vb2NzcC5vbW5pcm9vdC5jb20vYmFsdGltb3Jlcm9vdDA5
+BggrBgEFBQcwAoYtaHR0cHM6Ly9jYWNlcnQub21uaXJvb3QuY29tL2JhbHRpbW9y
+ZXJvb3QuY3J0MDkGCCsGAQUFBzAChi1odHRwczovL2NhY2VydC5vbW5pcm9vdC5j
+b20vYmFsdGltb3Jlcm9vdC5kZXIwDgYDVR0PAQH/BAQDAgHGMB8GA1UdIwQYMBaA
+FOWdWTCCR1jMrPoIVDaGezq1BE3wMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9j
+ZHAxLnB1YmxpYy10cnVzdC5jb20vQ1JML09tbmlyb290MjAyNS5jcmwwHQYDVR0O
+BBYEFEw4EbiYAFtaK3A+qnjk1WdnZ6d+MA0GCSqGSIb3DQEBCwUAA4IBAQBiXlyu
+PJ+brWd3Yw37wLOWRpgiD/533S8ox2ynOGfOzkYXgY/x0bE2jSgsQWcPx03mqRqP
+IabYCUOnvFEJCNoaWlIOb1N0iukmaIEGcHsYdFkrSBwCU+Le0joEKLFTS6ptM2gi
+W2gXSjcKnOQMuHtnHT+r4xVA+uK7ZJS1QWgO4ocej0Bf08vqpRnnLtirls0jEF0A
+Ri+tkiCxgYiPCKtNqb8r7zqY+kI9TsySm/FQmpx1K13Et3LiInNiVGJBN4H1BU0V
+jbhiu8uzChuzi6WgEDqodBIZ0iFmLgdw3pamoTmW74I6Ar2IP027WP9O+xThIvOq
+L8N2Cb5kLzkUiImh
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=RWTH Aachen/CN=RWTH Aachen CA/emailAddress=ca@rwth-aachen.de
 serial=09F274E0
 -----BEGIN CERTIFICATE-----
@@ -15055,6 +15965,38 @@
 HIkA169mKAdKEphbo2AShfTe6mTMFOnB3BLgKgM4tajqdxgnVg==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=IPK Gatersleben/CN=IPK Gatersleben CA - G02/emailAddress=ca@ipk-gatersleben.de
+serial=0CF9BAF8
+-----BEGIN CERTIFICATE-----
+MIIFATCCA+mgAwIBAgIEDPm6+DANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
+RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
+AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA4MDkyNDEzMTUyMFoX
+DTE5MDYzMDAwMDAwMFowcDELMAkGA1UEBhMCREUxGDAWBgNVBAoTD0lQSyBHYXRl
+cnNsZWJlbjEhMB8GA1UEAxMYSVBLIEdhdGVyc2xlYmVuIENBIC0gRzAyMSQwIgYJ
+KoZIhvcNAQkBFhVjYUBpcGstZ2F0ZXJzbGViZW4uZGUwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCpjnN8lve2+xbW7GUIDLPopCEzEbNI8VU+M1QByeBI
+CCvyK2aJg3K8pfGnPdSsOkDVNBYO415dheROSTqqSDlASdfajoCPSXU3OUlbBziz
+1LK/AVaz+l9qb5NSWMKsv7wMaDHNKEWdk7cBR8lKSXIW5w1+0jwFdemQ8aftYEMm
+p7lXlxgXugnpE+UZ9CsF/5d78pw0LqrDFNqUDG/hEJ3jD8PDyj1hBzGSPtWnsH9m
+LMdVQTHT5db77QPp2AVO6HYznPGDUtmsqudtqJBcf6XXFPfKClX5fbCIkB0YMee+
+MISbyrbSySkPXJAcwt7aFyHpqrjSAdrbRfn50f2s4StfAgMBAAGjggG3MIIBszAS
+BgNVHRMBAf8ECDAGAQH/AgEBMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUU5d150z7
+uVxsGEcj9aqMnVPsP5YwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQw
+IAYDVR0RBBkwF4EVY2FAaXBrLWdhdGVyc2xlYmVuLmRlMIGIBgNVHR8EgYAwfjA9
+oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCBogYIKwYBBQUHAQEEgZUwgZIw
+RwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2Rw
+Mi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy
+dDANBgkqhkiG9w0BAQUFAAOCAQEAUOSigbtFpUpPVy54V3L/flKBQsGlZn6Z/gok
+OWLogKETI8IJLP1FQUHkNQVXqZWYJrOcYs40dKN+Y2NW8ff4KVr2fEGDRtzt9ybL
+lBZB6jn6PqWkn9mx/PcQtMAEQBupOWS8n5Q1+wePbD0lhyIpWIGB5guWKmH9Gj6/
+FWVnXxh1b4qg+mYHin0QZ5wEuc44Ah7zHUFUEOvTOgcXYp/Y4Y1K6dlKQObleoQe
+Ikne9Hen9pZZ4PhDb/tkD2ZzIxChcQtyuJ2HBM8w0sqDFC3BQU547bAXFKL3vNsj
+7JuvV2qQ8OmKspKxuQcyTS9lF3B69RlFJDjLP37264C0X/vmkw==
+-----END CERTIFICATE-----
+
 subject= /C=DE/L=Darmstadt/O=Hochschule Darmstadt/CN=Hochschule Darmstadt/emailAddress=pki@h-da.de
 serial=0A7CE292
 -----BEGIN CERTIFICATE-----
@@ -16271,6 +17213,39 @@
 xkQkrNsspJZsqT9lkj3+BLKwL7X5TmFNbB7fTLditheWjfOtBLINieJuiJta1enG
 -----END CERTIFICATE-----
 
+subject= /C=NL/L=Amsterdam/O=Verizon Enterprise Solutions/OU=Cybertrust/CN=Verizon Global Issuing CA
+serial=0644
+-----BEGIN CERTIFICATE-----
+MIIFDTCCA/WgAwIBAgICBkQwDQYJKoZIhvcNAQELBQAwXDELMAkGA1UEBhMCVVMx
+GTAXBgNVBAoMEFZlcml6b24gQnVzaW5lc3MxETAPBgNVBAsMCE9tbmlSb290MR8w
+HQYDVQQDDBZWZXJpem9uIEdsb2JhbCBSb290IENBMB4XDTE0MDUwNzE2MTgxNloX
+DTIxMDUwNzE2MTcwOFowgYExCzAJBgNVBAYTAk5MMRIwEAYDVQQHEwlBbXN0ZXJk
+YW0xJTAjBgNVBAoTHFZlcml6b24gRW50ZXJwcmlzZSBTb2x1dGlvbnMxEzARBgNV
+BAsTCkN5YmVydHJ1c3QxIjAgBgNVBAMTGVZlcml6b24gR2xvYmFsIElzc3Vpbmcg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6udF8xdxjMTkrk/gF
+kGx7LY//HVGE5JDNAV6tUMwqVaYJLy7198tV+GBNP/IWVNzWEwXy0rp2JG1QysNr
+9Ak7YA/ST3SpvQaJ0sXOzb2bGrg2iBVsWBy77TZpc9ixyiOR7LkPoSpBbvkpmU3t
+y7H/qsKn7COerW0YZQBAOCSn7EwVlxCX8nlDLuZVJ9Beu6ihOO3TPiW/tx75ocfA
+0RhvOYcSn8GkWmuq7ldaGHhOhwfIlE5akYXwl4K3O8M85NRYKvayXgLNKVO/nsJi
+NhWrAplw4ES0l/YCePrikOT2Ufb+pQXwUzGtICZn/6yZHSPBetmYXGmVDXFhdQt0
+iCzXAgMBAAGjggGxMIIBrTASBgNVHRMBAf8ECDAGAQH/AgEAMEwGA1UdIARFMEMw
+QQYJKwYBBAGxPgEyMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vc2VjdXJlLm9tbmly
+b290LmNvbS9yZXBvc2l0b3J5MIG0BggrBgEFBQcBAQSBpzCBpDAwBggrBgEFBQcw
+AYYkaHR0cDovL29jc3Aub21uaXJvb3QuY29tL3Zlcml6b25yb290MDcGCCsGAQUF
+BzAChitodHRwczovL2NhY2VydC5vbW5pcm9vdC5jb20vdmVyaXpvbnJvb3QuY3J0
+MDcGCCsGAQUFBzAChitodHRwczovL2NhY2VydC5vbW5pcm9vdC5jb20vdmVyaXpv
+bnJvb3QuZGVyMA4GA1UdDwEB/wQEAwIBxjAfBgNVHSMEGDAWgBRMOBG4mABbWitw
+Pqp45NVnZ2enfjBCBgNVHR8EOzA5MDegNaAzhjFodHRwOi8vY2RwMS5wdWJsaWMt
+dHJ1c3QuY29tL0NSTC9PbW5pcm9vdDIwMzQuY3JsMB0GA1UdDgQWBBRfDxcU4r66
+0q6P4g2jIUCnewB75jANBgkqhkiG9w0BAQsFAAOCAQEAUXezwR1X8o+DLcVfNe+q
+BQU82XJdE7i06jbgHdERAv3gl4dKKYGHSYWHr+hHfXQFbb8D7f+jZdOUBkP9YB7j
+gIRgv5B/F1x+Wgq5B5TUZTmvgvkSum5xslMpPqIDUVOWQ31GA8mgIBuoPriPWRKg
+sSQrF0obzXMJpGy7/4wGnoLGMUunN+Q7Mf2fel3JQX80Qoqy6eU8rruCFh/OehDO
+dvdIREiMjFZQCpjVaO2Rbd8Mdv4LudqxIOFYfu66tZMVUhbijDrNCpe4nC9iuKav
+fQc9Z+i2gt1SC8BTr6sWWHC0pKrcqcdVSoR0ZQBEa2VCbh4hPXLztJpoXTdYGQ+c
+Lw==
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=Fachhochschule Stralsund/OU=ZIK/CN=FH Stralsund CA - G02/emailAddress=ca@fh-stralsund.de
 serial=09E154BB
 -----BEGIN CERTIFICATE-----
@@ -16634,6 +17609,39 @@
 sO0=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Wissenschaftszentrum Berlin fuer Sozialforschung gGmbH/OU=DV/CN=WZB CA/emailAddress=certs@wzb.eu
+serial=09E15512
+-----BEGIN CERTIFICATE-----
+MIIFDzCCA/egAwIBAgIECeFVEjANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
+RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
+AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MDIwMTEyMDUyNFoX
+DTE5MDEzMTAwMDAwMFowgYkxCzAJBgNVBAYTAkRFMT8wPQYDVQQKEzZXaXNzZW5z
+Y2hhZnRzemVudHJ1bSBCZXJsaW4gZnVlciBTb3ppYWxmb3JzY2h1bmcgZ0dtYkgx
+CzAJBgNVBAsTAkRWMQ8wDQYDVQQDEwZXWkIgQ0ExGzAZBgkqhkiG9w0BCQEWDGNl
+cnRzQHd6Yi5ldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKedbe1I
+oZRNSNUs3h5/hegpRDeMWdq+9oO3VfJZFbZkFuReUdpgMJTtC9Dt1USFrKkPEelF
+b49m1K788z30gdUZPlgjsQCqUVSPH7rP5yx2wbXkGrKqgQeKD1dG0JSJgwiF6q5/
+JreP1mf4zSnVbat1JJRliHlC2u3ShIYHmoOeoFOtH9xqh+L0aeO/Vjvh7mIEzIz4
+B1uK053OGI7CAm71Q+pmHxXOasnRo5URXqmtBBQhAEjFffh7U00fCNpwoEwOdFxb
+d/xakkWIHXXbVVE2egxTAAkOwyA89s1n+GbtHPuTs0Wt6fZnXGUn8cTRc7Z/XbQ9
+b4S2w1KxLcWATWcCAwEAAaOCAaswggGnMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0P
+BAQDAgEGMB0GA1UdDgQWBBRyPXhHifdDyr7PiKd4nivHsRmlwDAfBgNVHSMEGDAW
+gBRJt8bP6D0ff+pEexMp9/EKcD7eZDAXBgNVHREEEDAOgQxjZXJ0c0B3emIuZXUw
+gYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2Jh
+bC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIGiBggr
+BgEFBQcBAQSBlTCBkjBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUH
+MAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Nh
+Y2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQDPXAlo9qiB4Cz93zNr
+yhGsEWHaj9Fq2hza2rrXaWeDt0oMenyA4XSZby7FT9uANgPcoA/y7RW2KbN0Sd/R
+pw7+Z7GTaI//ztiWomT/sWCwAjt30TamUrNR2CN9l/p6rNipr+6BobKocCUTmCtS
+pyDjW2WDjz9Z+wrGN0N8Duju/U5jJ50xpsZu4rhghsMSjEeOt6CKTN0w2wsZBWzL
+hP7n28QI9rNTTIGI9h1jh0gM1L3WD7Uz68U9CD++xnree2/aDPVsyDw2q2MgntIV
+Bj/EvLCNxTGgux8P8n6xiivH18hzWUKrgre/OIN5o/QKxaG8yLgHxdDa25IBnCHA
+fhFf
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=Hochschule Neubrandenburg/OU=Hochschulrechenzentrum/CN=HS NB - CA - G02/emailAddress=pki@hs-nb.de
 serial=0A17432D
 -----BEGIN CERTIFICATE-----
@@ -16733,6 +17741,39 @@
 YeCBFw==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Deutsches Institut fuer Internationale Paedagogische Forschung/CN=DIPF CA - G02/emailAddress=ca@dipf.de
+serial=0BA56EFA
+-----BEGIN CERTIFICATE-----
+MIIFEDCCA/igAwIBAgIEC6Vu+jANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
+RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
+AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA4MDExMDEwMjAyN1oX
+DTE5MDYzMDAwMDAwMFowgYkxCzAJBgNVBAYTAkRFMUcwRQYDVQQKEz5EZXV0c2No
+ZXMgSW5zdGl0dXQgZnVlciBJbnRlcm5hdGlvbmFsZSBQYWVkYWdvZ2lzY2hlIEZv
+cnNjaHVuZzEWMBQGA1UEAxMNRElQRiBDQSAtIEcwMjEZMBcGCSqGSIb3DQEJARYK
+Y2FAZGlwZi5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKvYOSfk
+JkWoRBRv27XnC5KkBVfwsbo2ZVScqw/v8Vcotee9mUNl6/P0wYf8BIRCh08+vvh6
+0IDLLwXku9I5PczBJFYjCcrZ5f6CaWq19udAHh1YSRZ4TvwSzEehIlGgR/CIY/0r
+oafE3TU+j14Kv1o1oicOhebxUFEEpbTGkJfEQft2tT/Trx/RGpstjz4PsqDXxRZd
+F5FfiGObAR/Bp2InccKRaSSzN+5KJLsq9ka8QO2UbqmQ6Mgxc9PBa7BmfTFJPA6j
+VOdNGz5BqGKyShLAJHfQBufAkyHCyuURuOuAMgHRoR9o98JQRqJDhpSylU84yJCg
+ikxmCeGA2fRc9BcCAwEAAaOCAawwggGoMBIGA1UdEwEB/wQIMAYBAf8CAQEwCwYD
+VR0PBAQDAgEGMB0GA1UdDgQWBBRNTI7+Ju9lfZCIjR0aXy+aZwJu6DAfBgNVHSME
+GDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAVBgNVHREEDjAMgQpjYUBkaXBmLmRl
+MIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIu
+cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCBogYI
+KwYBBQUHAQEEgZUwgZIwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUF
+BzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9j
+YWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAQEA57RRvQAZuFv/njlz
+i4CvmijZ5HE+fgCAnvF9fs/w9qnmQAWW6KyqWOHsn7e7OWPPORklGtRQb4KbbrCU
+W2I+dvnIc2Pm559Rlln/e9KTxYG49ZJtIEMxdYzht4TRE4O4B85AdzutEH72FWm1
+vobOztxWIInNKNW7HSeXnb60O49L12VikjdZ0DfDj950sb5rrpCbfN848CzwTTyP
+BxSCzXAn0UUmluZon+V1w4U1nSSHsLxeNtL1HFKGVCAubZ+EVXPlMjnX53ZW72Kn
+7McW9ia9RvNlcgicV2sLFV7KXJufTuI5cQ8/buzV1OBjC3RatN/KIHhHksRXBcEs
+2/xL+A==
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Niedersachsen/O=Hochschule Emden/Leer/CN=HS-EL CA/emailAddress=pki@hs-emden-leer.de
 serial=12BF64DAA34613
 -----BEGIN CERTIFICATE-----
@@ -16898,6 +17939,39 @@
 7+Lw/Rmn
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=DFN-Verein/OU=DFN-PKI/CN=DFN-Verein CA Services
+serial=17887D07675E24
+-----BEGIN CERTIFICATE-----
+MIIFEjCCA/qgAwIBAgIHF4h9B2deJDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUwNjE1Mjc1
+MVoXDTE5MDcwOTIzNTkwMFowVTELMAkGA1UEBhMCREUxEzARBgNVBAoTCkRGTi1W
+ZXJlaW4xEDAOBgNVBAsTB0RGTi1QS0kxHzAdBgNVBAMTFkRGTi1WZXJlaW4gQ0Eg
+U2VydmljZXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCoJb9T3NY7
+K60rZDMvWrSrGIb8+eGrdcasn5LIrta5i2OTazMQzAD1LNNYj6JF1btlNbpwfmHu
+tWEHXxshnL9lPaBOlL7VLdqpxfuBgbYWS4wN18gkvAEoBStnN0pCF/FZV9aLkuuK
+/iQEwHpaTLsJqfOH279Aud1TqEOSrnqX0PjuwqjaG7fHj28b+MW5J8CxSOWoylF3
+OUDsFKdF6ccWu4F7rLymDVEDe/tCrUqCIBguB3Yb2LxRn4ga6RnMrSzAHtzr40Gg
+R/gJ4OOLKNtH9b54uhMZi5v05oz3/LHTopY2/gZY8z1RgNdZnMs60bBt1HMfhZum
+NaJlNyCtOmEJAgMBAAGjggHgMIIB3DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
+DwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFB2p8YYmdk3P
+Xf1Qo27r8bwidW3rMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMIGI
+BgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYB
+BQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUv
+T0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQBuX+V472GlQTm1
+CbKkoyIg1SIPGoPPw8X4gZATi6jQjfA0h81EZ3NZhjJabaHbBhLxPR49QD2Fd1t+
+edWb3NnoXTNZKUXnMbVvNeG/Uaq3ykGQb/A6gLKkPnLWHLfJIdPtClLTHvNEHAf5
+AoD1/O9KrUH+NMhG1QPCVR4ODVSL/bUH6O3ymKc9cHWSMtotCVEZ4bbZ71y6ZBQc
+0n3oqed0dpqG1aE3pChWM8Pi4t41DU0aaLtN6QHlRYZn+66NYEdiYxrZvWec3sPJ
+FJgCUhltDxa1XM/8MOZoHuPgEbZDTDphIgV/+QWY+XB7ESMc2zmV5PFLye5a/IWR
+URtf8EkZ
+-----END CERTIFICATE-----
+
 subject= /C=US/O=Starfield Technologies, Inc./OU=Starfield Class 2 Certification Authority
 serial=010C
 -----BEGIN CERTIFICATE-----
@@ -17294,39 +18368,6 @@
 qkDln+rHiQ8=
 -----END CERTIFICATE-----
 
-subject= /C=US/O=MasterCard Worldwide/OU=Key Management Services/CN=MasterCard Public Root CA Gen 3
-serial=663D91D48C41AAD14C6CA7AFF25D5BC3
------BEGIN CERTIFICATE-----
-MIIFFDCCA/ygAwIBAgIQZj2R1IxBqtFMbKev8l1bwzANBgkqhkiG9w0BAQUFADA6
-MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
-dHkgMjA0OCBWMzAeFw0wOTA2MjkxMzUyMTlaFw0xNzA3MDExNDQ1MDdaMHgxCzAJ
-BgNVBAYTAlVTMR0wGwYDVQQKExRNYXN0ZXJDYXJkIFdvcmxkd2lkZTEgMB4GA1UE
-CxMXS2V5IE1hbmFnZW1lbnQgU2VydmljZXMxKDAmBgNVBAMTH01hc3RlckNhcmQg
-UHVibGljIFJvb3QgQ0EgR2VuIDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQDB4gLVvuunL5Uy9an5b9qbDsRxD9cvMVVf+HVoku4d+VvDKK7X5Lhta5PH
-1xAwFz26FeK9opcgOksKjZ80XguZTZO7ycl4XrN5gdPVC3uX9vJ/uBgUIzlsp3uj
-MTRo7QB5oWQ8qTtZic6ZTsNglmuqp8SBfBJKsLGANXL4pExSgtAbSNmo55KZt5bJ
-qpwwwPcIfh1DuVWC/4G2D91UZuQvE2Bngx3sD+SyzS54HHq3JIU+Sl26plk8sQSc
-wht+1okyG+IARsBLsd3up0vWFtjwUcCtHD9+e9XM4OYlG+urB5Pu+egzTizdRyWn
-Q+QTkhNeMY0qulUO5qop2Eq7uFuNAgMBAAGjggHWMIIB0jAfBgNVHSMEGDAWgBQH
-w1EwpKrpRa41JPr/JCwz0LGdjDASBgNVHRMBAf8ECDAGAQH/AgECMHAGA1UdHwRp
-MGcwZaBjoGGGX2h0dHA6Ly93d3cucnNhc2VjdXJpdHkuY29tL3Byb2R1Y3RzL2tl
-b24vcmVwb3NpdG9yeS9jZXJ0aWZpY2F0ZV9zdGF0dXMvUlNBX1NlY3VyaXR5XzIw
-NDhfdjMuQ1JMMB0GA1UdDgQWBBTiy0S3gXEci/Wry68i6Ag6rq+BxDAOBgNVHQ8B
-Af8EBAMCAYYwgfkGA1UdIASB8TCB7jCB6wYJKoZIhvcNBQYBMIHdMDMGCCsGAQUF
-BwIBFidodHRwOi8vY2VydGlmaWNhdGVzLm1hc3RlcmNhcmQuY29tL0NQUy8wgaUG
-CCsGAQUFBwICMIGYMBsWFE1hc3RlckNhcmQgV29ybGR3aWRlMAMCAQEaeU1hc3Rl
-ckNhcmQgV29ybGR3aWRlIENlcnRpZmljYXRpb24gUHJhY3RpY2UgU3RhdGVtZW50
-LCAgZ292ZXJucyB0aGlzIGNlcnRpZmljYXRlIGFuZCBpcyBpbmNvcnBvcmF0ZWQg
-YnkgcmVmZXJlbmNlIGhlcmVpbi4wDQYJKoZIhvcNAQEFBQADggEBAK2ea6p/tE1O
-V4yvzRwTgWcrZdnuUw+rY9jrxbeN5m8biFqZHMWnv+9+x3B2la671UvejyHlyGlB
-lvFTdQ8STeMIyHvKYNy8+BjA3OCqYIqvMumkCY4ifEDNKrg/Sm4+6DlCHemqxnSZ
-qB+K2ZkxgfNPOEM+N37AzzHR/6ehfGBJ8lKFgvjAtf9XIWiF+znKispcD14lNzQG
-54ycDuEoroIOsJntlWXmQmDpco7zXupyfpQ5v09GaTLksldz8Gb4KQ74bd3PtmOh
-tViTJoTRTOSlD5zHmSJm+26rgoJub8+Ek4OqWJDw0n2H3rfu0+35SDkoHTiwqM9c
-yH1GTeNPwcc=
------END CERTIFICATE-----
-
 subject= /C=DE/O=Universitaet Bielefeld/CN=CA der Universitaet Bielefeld - G02/emailAddress=hrz-ra@uni-bielefeld.de
 serial=09DD66B6
 -----BEGIN CERTIFICATE-----
@@ -17393,6 +18434,39 @@
 3OU/eKG/ebb7
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=DFN-CERT Services GmbH/CN=DFN-CERT Services GmbH CA - G02
+serial=175108F4184AC6
+-----BEGIN CERTIFICATE-----
+MIIFFTCCA/2gAwIBAgIHF1EI9BhKxjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDMyNTEzNTc1
+N1oXDTE5MDYzMDIzNTkwMFowWDELMAkGA1UEBhMCREUxHzAdBgNVBAoTFkRGTi1D
+RVJUIFNlcnZpY2VzIEdtYkgxKDAmBgNVBAMTH0RGTi1DRVJUIFNlcnZpY2VzIEdt
+YkggQ0EgLSBHMDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzbepP
+qgn/97Cg1R6Dp/162sx+swETAywzNZVNXzTXtLApha2Ql4ru5aL8Wd28MjHkUwSq
+eBlyU45QwcwoWnCr48lrRkJXw2/cK09BH5jEenlrDE3wi3dR9YtN6BwT9X3iCEDL
+Zw5rhNelQrVX7NpJbf6Pfi+7SEkECCq3TBi+uYdSkn1yG2KERChraF4BSDUUXNYf
+uizvU2TXyVtPRzh5RPsNuG527m3w277OFMRbHXG12msUSVsaik1lb0x/WDRCcQhw
+YUFaFPM956hA2cCIsGweZLamv3cza1LlAfri6vf94rQ0SXF6lIp3WOI4fAlYoSWU
+cw2BhhVfkq6LlYRNAgMBAAGjggHgMIIB3DASBgNVHRMBAf8ECDAGAQH/AgEBMA4G
+A1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFMaLz/pE
+/DpqS2ir6Oe/OCPlugqWMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5k
+MIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIu
+cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYI
+KwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4u
+ZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYI
+KwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQDj3CGaWtmK
+PYur3eeKtBSDLfRVWGQwG0iaBIttI1L69fpgm+GBbKE6kPE6Y2hH4vC+x5JO4nVI
+d9AX/CG3WvH6lDfH0+Pnx9gm+lG+rcjOwvzYfk606GNcj+klph4oaHBZ9kSuHqN4
+5WBbrAF0jZZGQKaUtmtgDxIPUbKpahkF4lSbQdewK9WmblLJ5604ofs6j8WpdnpP
+bsR1FKunkzzBeFFDU9U/ghkKQk0J6E2/2oqEPg7KlwxxSGw36TVn/tR4nShmlsbQ
+SPfiPQ4X4bXqxSmXpXm44efN0DqN7IXUr9jrNcRDssjYS9j8DOoG64CBNbhUCoGn
+IQfW6HtfWfwG
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=Universitaet Freiburg/OU=Rechenzentrum/CN=Uni-FR CA - G02/emailAddress=pki@rz.uni-freiburg.de
 serial=0A0CB183
 -----BEGIN CERTIFICATE-----
@@ -17492,6 +18566,39 @@
 Pj9CjDUXsC1gkg8=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Hochschule Esslingen/OU=Rechenzentrum/CN=HE CA - G02
+serial=1790610D2DC32B
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIHF5BhDS3DKzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYz
+N1oXDTE5MDcwOTIzNTkwMFowWjELMAkGA1UEBhMCREUxHTAbBgNVBAoTFEhvY2hz
+Y2h1bGUgRXNzbGluZ2VuMRYwFAYDVQQLEw1SZWNoZW56ZW50cnVtMRQwEgYDVQQD
+EwtIRSBDQSAtIEcwMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMFK
+VgRed4po1dKXTFbI3bF9gzUawieE+IAA1UrQFIkzm4+Z7XtXuMkuhHE9CzhRYHWn
+IjynbSSrkJ6QBLKG2HYSPUc9Rz43V5sY0/VmBIoC0WY6DPDiucYk0Q2Wx/wAleen
+8s5vMuk4gOsgo+uW/rjjoHegTByBoESvsgEQp1axwjhLwxUpAnkEWFcMZ97R5T0A
+/pGtAWLARkeqo2DOBXeAkTe2Fngwxn+H/cgY9+H9xd33EiXxYn0DDjNYJ4EObj6P
+2y+9eE3o7Su7jV6c2hqciooBD/e73sNzcRDl6CiedaDjP+aWe/jbt/O1FXClgxse
+4TLpwpnoajko7MTs0k8CAwEAAaOCAeAwggHcMBIGA1UdEwEB/wQIMAYBAf8CAQEw
+DgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQU41sX
+vNYsMmUyQN1NF8A33jpNX1wwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+
+3mQwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2ds
+b2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2Rw
+Mi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHX
+BggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRm
+bi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBH
+BggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAA/0jmqF
+0rB8zcYlZR/XDnbSOxuzz7pwDhEM4AEZEAyedsKmmG/9Z+sqLfKbuTuwPyjZ7tVH
+q8LkP+42iHgH+BUKS6vQZrLCvP5PHvFQfnXzA5iKhQLeQ0q76TCtOSeQgFd2wgj2
+t1zqQpcKlSoJoarmlXmZzmwN0LGebNcYRwojhcG5g1WuKXmKckzWdHHfRgL34IUK
+GWWSnXM7WoaS6MndKnsjQ+iRWeQGsM8kuMX2adoKY9/7/qZO+nvBA2yZmC5HgZLF
+4HzUlki6S4VEoHIKFaoqV9Tq2qtZQazAb8k6+cGAZ7Tk0MQ62+vh0md9KYVSFChN
+mrsQJSe99V5cwRw=
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=Universitaet Muenster/CN=Zertifizierungsstelle Universitaet Muenster - G02/emailAddress=ca@uni-muenster.de
 serial=0A02236E
 -----BEGIN CERTIFICATE-----
@@ -17723,39 +18830,6 @@
 QP2T82x+FiWLmQBruw==
 -----END CERTIFICATE-----
 
-subject= /DC=com/DC=unisys/DC=uis/CN=UIS-IsuB1-CA
-serial=159AEF91000100000009
------BEGIN CERTIFICATE-----
-MIIFGTCCBAGgAwIBAgIKFZrvkQABAAAACTANBgkqhkiG9w0BAQUFADAWMRQwEgYD
-VQQDEwtVSVMtSW50Qi1DQTAeFw0xMDA3MTAxNzE3MjBaFw0xNjA3MTAxNzI3MjBa
-MFkxEzARBgoJkiaJk/IsZAEZFgNjb20xFjAUBgoJkiaJk/IsZAEZFgZ1bmlzeXMx
-EzARBgoJkiaJk/IsZAEZFgN1aXMxFTATBgNVBAMTDFVJUy1Jc3VCMS1DQTCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANnzYKXND/mcPu6QBG0soLyzp0cJ
-B8eEd53o8h0s0VYb8XOKzy/5BA5nqoC6PrxHqZUf4/zTm1a9Q5OdrDB4vARBFmaa
-gvYXI9eY3UduXM/lgXIaHUzmkbeNtUcp+T7wF4Nah2PgDOCg3FJaP5Gtcs/j7YNM
-LfaSj41ECNAoHaex8v8BrqQzXDgL/K3m1WdDfVQHsHbj/t1NqXCcecre0MNpa21N
-fvp2jrW791LWBEfAg9fjk8esNnuJzKifAkC99t2NmpxdP3xEZ/+2mecLIk443Hff
-6swwUU/OloyGqwN4iRkNogzINx4Pz4mVnPJ/qs57F/EchZXlJhZZ0VAr9EcCAwEA
-AaOCAiQwggIgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFED96Rk/lJhGwXvl
-ToIKIBIy2YXRMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAgACMCMGCSsG
-AQQBgjcVAgQWBBSvy8mB0c0tuO4lAXJt3Nl8bOcvvjAZBgkrBgEEAYI3FAIEDB4K
-AFMAdQBiAEMAQTAfBgNVHSMEGDAWgBT1xt0zj+A019VbRJT/NTVwffPsNTCBpAYD
-VR0fBIGcMIGZMIGWoIGToIGQhixsZGFwOi8vcGtpbGRwLnVuaXN5cy5jb20vcmVw
-L1VJUy1JbnRCLUNBLmNybIYvaHR0cDovL3Vpc3BraS51bmlzeXMuY29tL3JlcC9V
-SVMtSW50Qi1DQSgxKS5jcmyGL2h0dHA6Ly9wa2lyZXAudW5pc3lzLmNvbS9yZXAv
-VUlTLUludEItQ0EoMSkuY3JsMIHEBggrBgEFBQcBAQSBtzCBtDA4BggrBgEFBQcw
-AoYsbGRhcDovL3BraWxkcC51bmlzeXMuY29tL3JlcC9VSVMtSW50Qi1DQS5jcnQw
-OwYIKwYBBQUHMAKGL2h0dHA6Ly91aXNwa2kudW5pc3lzLmNvbS9yZXAvVUlTLUlu
-dEItQ0EoMSkuY3J0MDsGCCsGAQUFBzAChi9odHRwOi8vcGtpcmVwLnVuaXN5cy5j
-b20vcmVwL1VJUy1JbnRCLUNBKDEpLmNydDANBgkqhkiG9w0BAQUFAAOCAQEAjimZ
-Ah8PcH4LMazZcGeU3diV50efxXUKFuDYaJmkMWfFdZrz9xZJKC1bMEHBBYu0fSwz
-FQxTCJOn/eLJ42L32E4P6B4SxyuGxETEma52Na08uiD/1VazZ9WBwdf9esaokesa
-EH4o4laowBgAd9vh5X5ABZceuOjddcBO0wRJhQmayhR/CK1g5PaYszajEQ8NC0wm
-bgitsDVoFiGqyCeUjLIGHzw2iuPRHnES2sfFVhGFv3wuUB8OZ1cWfN4Spbnfi1UU
-uUU6SMkPWPl04eP5n6zMBA1d5+jT7YD0O5LdohRIELwrnPTYpYf3C5FQNEXy3NFE
-mlaZIleMSDwonW/AAg==
------END CERTIFICATE-----
-
 subject= /C=US/ST=California/L=San Jose/O=Cadence Design Systems/OU=Information Security Services/CN=Cadence Secure Server Authority/emailAddress=security-services@cadence.com
 serial=619C03B2000000000009
 -----BEGIN CERTIFICATE-----
@@ -18020,6 +19094,39 @@
 Os52OWnTjvxCIhbJbOjsdJA=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Technische Universitaet Muenchen/CN=Zertifizierungsstelle der TUM
+serial=179060DFF401D9
+-----BEGIN CERTIFICATE-----
+MIIFHTCCBAWgAwIBAgIHF5Bg3/QB2TANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU1
+MVoXDTE5MDcwOTIzNTkwMFowYDELMAkGA1UEBhMCREUxKTAnBgNVBAoTIFRlY2hu
+aXNjaGUgVW5pdmVyc2l0YWV0IE11ZW5jaGVuMSYwJAYDVQQDEx1aZXJ0aWZpemll
+cnVuZ3NzdGVsbGUgZGVyIFRVTTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAKjv6NPYBFzJ+ZELc6JfE/5aga/7K7LWMVBHZvohdJZGd31pN9QEfzQeph0k
+iqsm1X5kHraPtTc9jMH8SLASBI45JppNSSYRfw6j6RjKA7PUStRfV0dq5cBPBl5F
+pxAY23lAzMzY+6EQEq3/hS8Ia3zG5Q5saJsc+9B2So8+gvaVwZhrWhe7NhyvVqYM
+iBpTE9fbViah3Ur5VdDpcGbsb/BqRDxRrOCjQdNQ6TCQHfIUEDTQMW/czj1wbgLx
+rp8sB5XlwMPX7c2Do+yByWbcrkitdGEeagcWqC1gc8pD/f8PJIoVeW4cy60PjHRI
+fYC0NBVvg9P0viuwFEyWM17brI8CAwEAAaOCAeAwggHcMBIGA1UdEwEB/wQIMAYB
+Af8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4E
+FgQUnZ8j8BkbfscjXScqzKU2OqZp5YkwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsT
+KffxCnA+3mQwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRw
+Oi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fjcmwu
+Y3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3Au
+cGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8v
+Y2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0
+LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEB
+ANaFYIHzwjpv6JVEdDhka/NaydcN/TSxDEYwI7YJ34SlUbk7FVykIRBWlTR8uEwU
+qhBgNtp1Rg+Kq8qSS9DtSnpOG5EqPvxJRN55x9zNCqZvWINnVU+p0V/yOTn+mYBB
+lgQhgixSxBkanY8VoPBcjr2/i6cck1Mc8co3bZa8i32qCrX0E0mODGohpEVA6sll
+NkRU6NozLScnab7sibPN7K9w3gbCX61yCPfTvtmiWorJr/GgtLR4D7GczhoDofrJ
+pBzxSacgckbZPirIEgloRZL+1X9kAAjka/hEXh+KYd3qkCdNiMAM8+/Por4Kg8Y/
+l1k+CDudwzwDxAS9H0tcXl4=
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=FH Duesseldorf/OU=DVZ/CN=Zertifizierungsstelle FH Duesseldorf - G02/emailAddress=pki@fh-duesseldorf.de
 serial=0A31AC70
 -----BEGIN CERTIFICATE-----
@@ -18185,6 +19292,39 @@
 V1Tr5Bqojn4YZqDBYbJ6FBMJ
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Fachhochschule Rosenheim/OU=Rechenzentrum/CN=FH-RO CA - G02
+serial=179060FAE72405
+-----BEGIN CERTIFICATE-----
+MIIFHjCCBAagAwIBAgIHF5Bg+uckBTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYx
+OFoXDTE5MDcwOTIzNTkwMFowYTELMAkGA1UEBhMCREUxITAfBgNVBAoTGEZhY2ho
+b2Noc2NodWxlIFJvc2VuaGVpbTEWMBQGA1UECxMNUmVjaGVuemVudHJ1bTEXMBUG
+A1UEAxMORkgtUk8gQ0EgLSBHMDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQDTo37T3cp87b/7+mM33ECapeAoHMbYuoLOZ8BDQTAts7SfkZoFdNktjPnB
+QrflclP78A+BX6gd3YK8Bt+9tG02ywRaMPlI+t5fJsAKkA9gMnt2tD6j+n+Bzp0L
+ki8wgQaUDPO56pVEc1BVgq87NMst4NTpShgHRC1QkUViLNURYh0pyKh+IBSrhGUN
+9vZd7Ozj94K89XT03ovc+lOtS5H7fSTiSsl5phNDGTJQ45ACXUWLfdoKV4AIYIit
+SXxCLYEPwCWRN7qjsQblqLe76yl9hPoaEh2co2ZgNy+PQkA7HtHLvx1LxE9lqibj
+boS1DtL7ehPUi78jkUyIDoKqG9y5AgMBAAGjggHgMIIB3DASBgNVHRMBAf8ECDAG
+AQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0O
+BBYEFCBmbiUvqWNNouAnuol/yxW6P66RMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7
+Eyn38QpwPt5kMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0
+cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3Js
+LmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3Nw
+LnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDov
+L2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2Vy
+dC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFs
+LXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IB
+AQARPl5P2/EZaPK1dTkgA83QtJjoOH7gAAwo92txj/suuWzzV+4HZWzFOJI8nFUL
+zmawG7bTN91j1+AX6iFuptIrmwoykrzjKu9xjpt0iFwFvuAPneY4XQMKBnNNaesp
+sIl6WV0kRRkMoQb9HMUhunIQVw8tJLVeS05k8A59DX/f9vU6Cs9sfV0qAc/AzHBy
+DJUNDF6uXL7KpzC/kWUGN2UP9Zxr5CotsWLTD1fqbbaBmMXdu3ubw7q60++51d6e
+kk+0pXWFEjGG/LiC3Pm7HypNwUhgiL/UytT9A2K7GrIXA6sH8Ul+aYoaQX/VB1UD
+Qf5OuIZTAmnxTrGEAoO9hG/+
+-----END CERTIFICATE-----
+
 subject= /C=US/ST=CA/L=San Francisco/O=Bechtel Corporation/OU=Information Security/CN=IEXTCA-SSL.ibechtel.com
 serial=61815A8000030000001F
 -----BEGIN CERTIFICATE-----
@@ -18284,6 +19424,171 @@
 TPV7ieXV9O1vEujejvcZYtzg
 -----END CERTIFICATE-----
 
+subject= /C=BR/ST=Rio de Janeiro/L=Rio de Janeiro/OU=Gerencia de Servicos (GSer)/O=Rede Nacional de Ensino e Pesquisa - RNP/CN=ICPEdu
+serial=57B09EEF615610874491E92C5462F46196
+-----BEGIN CERTIFICATE-----
+MIIFHjCCBAagAwIBAgIRV7Ce72FWEIdEkeksVGL0YZYwDQYJKoZIhvcNAQELBQAw
+YzELMAkGA1UEBhMCQkUxFTATBgNVBAsTDFRydXN0ZWQgUm9vdDEZMBcGA1UEChMQ
+R2xvYmFsU2lnbiBudi1zYTEiMCAGA1UEAxMZVHJ1c3RlZCBSb290IENBIFNIQTI1
+NiBHMjAeFw0xNDAzMDQwMDAwMDBaFw0yMTAzMDQwMDAwMDBaMIGpMQswCQYDVQQG
+EwJCUjEXMBUGA1UECBMOUmlvIGRlIEphbmVpcm8xFzAVBgNVBAcTDlJpbyBkZSBK
+YW5laXJvMSQwIgYDVQQLExtHZXJlbmNpYSBkZSBTZXJ2aWNvcyAoR1NlcikxMTAv
+BgNVBAoTKFJlZGUgTmFjaW9uYWwgZGUgRW5zaW5vIGUgUGVzcXVpc2EgLSBSTlAx
+DzANBgNVBAMTBklDUEVkdTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AKBD/AYytLrwwqh3AxTwyumXpiEgdo9356XAhOXTrzUgtvtjkqgOkUDkMFzEWWEz
+PV1EAelH4csW93DYXVO+C5kpWF+jW3gj6Vu8HNkouiKM5BdmZWp338h6db+rSPMD
+B0IOc1DMOQB7gtNL3awXOR1yKr2jP5h+LboGDxLGfwdYvONTkmr7nTbx+cR3Kj8J
+e1MbnwkMt1xLpk21Yo59RV46zLaY+JUMHd8Z7fgVBIcDx/ASdoTR3e1ShIWghUow
+lOdK7vtdo3lZPfDlXsq8rjPUDPudk/CVjnW1b6pKSB6ez8+nmSiw87brmkUCV105
+HiE7J/Gc2cifblIKn4XPqncCAwEAAaOCAYQwggGAMA4GA1UdDwEB/wQEAwIBBjBH
+BgNVHSAEQDA+MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xv
+YmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wEgYDVR0TAQH/BAgwBgEB/wIBADBBBgNV
+HR8EOjA4MDagNKAyhjBodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2dzL3RydXN0
+cm9vdHNoYTJnMi5jcmwwgY0GCCsGAQUFBwEBBIGAMH4wNwYIKwYBBQUHMAGGK2h0
+dHA6Ly9vY3NwMi5nbG9iYWxzaWduLmNvbS90cnVzdHJvb3RzaGEyZzIwQwYIKwYB
+BQUHMAKGN2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5jb20vY2FjZXJ0L3RydXN0
+cm9vdHNoYTJnMi5jcnQwHQYDVR0OBBYEFJXwpIQap1wgNqbFCNdlQgLld2jjMB8G
+A1UdIwQYMBaAFMhjmwhpVMKYyNnN4zO3UF74yQGbMA0GCSqGSIb3DQEBCwUAA4IB
+AQBk3q+/7S1BpzW83NDHdXF8Jx0/+E3tqnyl5MphjGh9oKk3I8hCzPQgetE03awP
+QhDRf6r64SnIkhr8/dWm9edpsBJFj7PwXzlfq6zI6S0hIov/A+59lLeCVDPTIOu3
+m8CHEQeKtoesWUXgrYEY5F0fl/E8V5SQ5NKrDC88ipNWerMKhYEZu1HN+fStJLWv
+/H3v0x1hRVElrxdolHwh2ANhkFVquUALQihDN5Q5DwO/5jcvqm/XYK2fGQAStBGG
+/NgongTibMpHGOq62jv1HcnHhpVUfZMop0KX4i60puToNn9kIW8KzclGLd7EKypO
+PkSbcBmQzwivcyo7HkPUDg9o
+-----END CERTIFICATE-----
+
+subject= /C=NL/L=Amsterdam/O=Verizon Enterprise Solutions/OU=Cybertrust/CN=Verizon Akamai SureServer CA G14-SHA1
+serial=0727A46A
+-----BEGIN CERTIFICATE-----
+MIIFHzCCBAegAwIBAgIEByekajANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE0MDQwMjE0MzI0NVoX
+DTIxMDQwMjE0MzEzOVowgY0xCzAJBgNVBAYTAk5MMRIwEAYDVQQHEwlBbXN0ZXJk
+YW0xJTAjBgNVBAoTHFZlcml6b24gRW50ZXJwcmlzZSBTb2x1dGlvbnMxEzARBgNV
+BAsTCkN5YmVydHJ1c3QxLjAsBgNVBAMTJVZlcml6b24gQWthbWFpIFN1cmVTZXJ2
+ZXIgQ0EgRzE0LVNIQTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCR
+6y01mwxkbMqLLdU5tjO0/EkKFnjXqD03EAJ229fbT5xWS6FptEstSuND9m8WCLXv
+dEWPdFYWKxWlFkx9bwqZtCDninucRumuMfsTT/CXFmHjuiulJNjcS5bBvtOrv2bY
+RCb5FpbtnDYs3yk0KrU9E9KxQS1Tk8u1dCgG9GONXt6yqBvXfU8kZjPtxoqwhG7G
+CVqWKAaM5FHLocVLu99EPwpaw1YRi/U8ldsJe9Y0iFGi/UuqSRR3qbEkqyVPYpy5
++ckHLRDIcLcYsVYyHT+pglKnsLJhJGpfjHT2LHgsIFlwC3bO/FCtUuucokU2mouB
+G03/THab3ins9b3mCF7rAgMBAAGjggG3MIIBszASBgNVHRMBAf8ECDAGAQH/AgEC
+MEwGA1UdIARFMEMwQQYJKwYBBAGxPgEyMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v
+c2VjdXJlLm9tbmlyb290LmNvbS9yZXBvc2l0b3J5MIG6BggrBgEFBQcBAQSBrTCB
+qjAyBggrBgEFBQcwAYYmaHR0cDovL29jc3Aub21uaXJvb3QuY29tL2JhbHRpbW9y
+ZXJvb3QwOQYIKwYBBQUHMAKGLWh0dHBzOi8vY2FjZXJ0Lm9tbmlyb290LmNvbS9i
+YWx0aW1vcmVyb290LmNydDA5BggrBgEFBQcwAoYtaHR0cHM6Ly9jYWNlcnQub21u
+aXJvb3QuY29tL2JhbHRpbW9yZXJvb3QuZGVyMA4GA1UdDwEB/wQEAwIBxjAfBgNV
+HSMEGDAWgBTlnVkwgkdYzKz6CFQ2hns6tQRN8DBCBgNVHR8EOzA5MDegNaAzhjFo
+dHRwOi8vY2RwMS5wdWJsaWMtdHJ1c3QuY29tL0NSTC9PbW5pcm9vdDIwMjUuY3Js
+MB0GA1UdDgQWBBTdbIB8urUyF6WEQUDw0gRmEy+pkDANBgkqhkiG9w0BAQUFAAOC
+AQEAWEEi/01CVa7IBodFP4tZ0wc5mrKgkYHSDMFnT09xKFqQHGk6mvabwAj0WiKJ
+Vd9vr0W4ohN5GLWq08L+y3BzhSVb1cxvBpCp2K92jnQHUIMQTR15MJbZ6QIf4yHW
+7NI8MCy1U8kSp/LDY+72q/vge4X9hNZbV1A49NMZKT4R8GZA5J/Bu/Bs4m8kPqZr
+NyH1J7unAiK5/EPa7RMP54M2VZF6ABzW+BlsOg9Ec5OVygHW5l+FRxonfgUSNJ1I
+zZcEhDp1+nYUmF2oaWvZ9u3RxsofHcNiqcXwMU0zb4smkUtADfHn0Kc7j6cynd6d
+qXEQ3/RHTMctqSE0jukLbznxyQ==
+-----END CERTIFICATE-----
+
+subject= /C=NL/L=Amsterdam/O=Verizon Enterprise Solutions/OU=Cybertrust/CN=Verizon Public SureServer CA G14-SHA1
+serial=0727A660
+-----BEGIN CERTIFICATE-----
+MIIFHzCCBAegAwIBAgIEByemYDANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE0MDQwOTE1NTk0OFoX
+DTIxMDQwOTE1NTgzMlowgY0xCzAJBgNVBAYTAk5MMRIwEAYDVQQHEwlBbXN0ZXJk
+YW0xJTAjBgNVBAoTHFZlcml6b24gRW50ZXJwcmlzZSBTb2x1dGlvbnMxEzARBgNV
+BAsTCkN5YmVydHJ1c3QxLjAsBgNVBAMTJVZlcml6b24gUHVibGljIFN1cmVTZXJ2
+ZXIgQ0EgRzE0LVNIQTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDp
+KNx/2K3kYgb5UesbNTgYl2mdC5erIt0UTMYnidExmtGoog22qpGkLA4o/8SckDC1
+XEHBD+wFt742L6tgyCPGc338etqAdlVJVsHuGp146mkajt+HsmxGjExlAAAD47S8
+AJ3MgORfVonc9P1uB0ACXwYMGkaH7OhbPoa4QhOOA8UHnZknZKihQg+olxkb3BXH
+LzhPkK8I7RAo9mBPxsIAbWay7mliVQKU+sPKoyjwwlomzFFBUuBzbkLxGXFV9pXM
+0XD97e7nF/HcDZ2qL6xFBb4Q3plTHwOepiTX/t2wNzkB6aTY3COJms4VhxKQBvvh
+nrV21xs+boROc9UbWRWlAgMBAAGjggG3MIIBszASBgNVHRMBAf8ECDAGAQH/AgEA
+MEwGA1UdIARFMEMwQQYJKwYBBAGxPgEyMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v
+c2VjdXJlLm9tbmlyb290LmNvbS9yZXBvc2l0b3J5MIG6BggrBgEFBQcBAQSBrTCB
+qjAyBggrBgEFBQcwAYYmaHR0cDovL29jc3Aub21uaXJvb3QuY29tL2JhbHRpbW9y
+ZXJvb3QwOQYIKwYBBQUHMAKGLWh0dHBzOi8vY2FjZXJ0Lm9tbmlyb290LmNvbS9i
+YWx0aW1vcmVyb290LmNydDA5BggrBgEFBQcwAoYtaHR0cHM6Ly9jYWNlcnQub21u
+aXJvb3QuY29tL2JhbHRpbW9yZXJvb3QuZGVyMA4GA1UdDwEB/wQEAwIBxjAfBgNV
+HSMEGDAWgBTlnVkwgkdYzKz6CFQ2hns6tQRN8DBCBgNVHR8EOzA5MDegNaAzhjFo
+dHRwOi8vY2RwMS5wdWJsaWMtdHJ1c3QuY29tL0NSTC9PbW5pcm9vdDIwMjUuY3Js
+MB0GA1UdDgQWBBRZ8lhWlV5Caz9dGNMBYoMmtqGUXjANBgkqhkiG9w0BAQUFAAOC
+AQEAMhannqED8ljv9jPJXtIvh1XffukCT8MoSBLJ5HhHAhRPtr8Ol73/ZfbJjh24
+ck7M85F81fDPzUpysB+NgFCzx1A+aiy7TSi82m4Q6Maz17ERwFkuAhmyOLPI6NfL
+22sMYbymLGB/x7A/bqa0riwZUKtaNYIJa8NnyGMcVJGtySUTHmw0Fo1+zd+wehs4
+J4QoF6Hw2y32O+7mQhCPl60fQUQYDU32TWTbPRpCXGOsrDUHJnx9CFd4o99OwEv6
+F+wU1rGGmFBOJcdwLlBGTXB5ZY+nX/zOJ/WTq5mrtinpEa4k/0vbuaB5d7nUJYmO
+by8h1KtNH6oy3EIVRWqZ2Woy6Q==
+-----END CERTIFICATE-----
+
+subject= /C=NL/L=Amsterdam/O=Verizon Enterprise Solutions/OU=Cybertrust/CN=Verizon Public SureServer CA G14-SHA2
+serial=0727A661
+-----BEGIN CERTIFICATE-----
+MIIFHzCCBAegAwIBAgIEByemYTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE0MDQwOTE2MDMwNloX
+DTIxMDQwOTE2MDIxMFowgY0xCzAJBgNVBAYTAk5MMRIwEAYDVQQHEwlBbXN0ZXJk
+YW0xJTAjBgNVBAoTHFZlcml6b24gRW50ZXJwcmlzZSBTb2x1dGlvbnMxEzARBgNV
+BAsTCkN5YmVydHJ1c3QxLjAsBgNVBAMTJVZlcml6b24gUHVibGljIFN1cmVTZXJ2
+ZXIgQ0EgRzE0LVNIQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDo
+OwWImO3Kdhcb8lmJVOROdTidMxYJasOStOvLgnHWmzyn6VbeP1xeZbS8mIyHxY0m
+916FlYdsWd3sKV+wnXFBZCnYJEvLTABe1dT3Tob4acjGEonr9RKiDbeBb6LcRA3Y
+YHMmdnRAfzHtOAPj7CqVcSFdcib7HuTTf2Ot+xEzJkRyh7dPs+OcXvo0mBp8Oyga
+TBTZiMg3d5t2UVZQbNf+3O2BMBVhnixXTA7JDEYf0RfLPdbbKjYxE9yez4ICwURL
+JwSQUv/9Ylrb65NAVWpfmmceOU7LH0XvHy+6KHIZtnIxP53/w/X3Ui+X4o2R30jt
+iDdq3McycOlB/Bv2zqAhAgMBAAGjggG3MIIBszASBgNVHRMBAf8ECDAGAQH/AgEA
+MEwGA1UdIARFMEMwQQYJKwYBBAGxPgEyMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v
+c2VjdXJlLm9tbmlyb290LmNvbS9yZXBvc2l0b3J5MIG6BggrBgEFBQcBAQSBrTCB
+qjAyBggrBgEFBQcwAYYmaHR0cDovL29jc3Aub21uaXJvb3QuY29tL2JhbHRpbW9y
+ZXJvb3QwOQYIKwYBBQUHMAKGLWh0dHBzOi8vY2FjZXJ0Lm9tbmlyb290LmNvbS9i
+YWx0aW1vcmVyb290LmNydDA5BggrBgEFBQcwAoYtaHR0cHM6Ly9jYWNlcnQub21u
+aXJvb3QuY29tL2JhbHRpbW9yZXJvb3QuZGVyMA4GA1UdDwEB/wQEAwIBxjAfBgNV
+HSMEGDAWgBTlnVkwgkdYzKz6CFQ2hns6tQRN8DBCBgNVHR8EOzA5MDegNaAzhjFo
+dHRwOi8vY2RwMS5wdWJsaWMtdHJ1c3QuY29tL0NSTC9PbW5pcm9vdDIwMjUuY3Js
+MB0GA1UdDgQWBBTkLbuRAWUmH7R6P6MVJaTOjEQzOzANBgkqhkiG9w0BAQsFAAOC
+AQEAdA8XA5Qvi4LTuB/IeCu44Bv/dFrvuhtUYUmrm1ZxQcbJ0Z8Vqyl54AT0tN8d
+PmvBQk+ORWF2Ncoa7dvVX3UBT0Hnu2lITWEpq7ul6qFp6QWwnev2T8JlKJ6oeCCW
+qmu71/Eo7YfYsxmhdwyPMZpwjYhyGXBdBhooEuoJLg9S2hUiyPdxG52Pr1pZJti5
+A9dEYJfZ5etyfQyd+aO51rA8jpe3rpMS8blSBkfid8GrSawwSDvUTGFC18om4K70
+vPHTStzKNAciUKSdAEY6VNzxkJOu6IkR5H3f6Sw/Mq9EOK9jg6t0qGWwu24WunkO
+9KlgK++DdBLm13arqkkvSebisQ==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=GAD EG/OU=VR IDENT/CN=VR IDENT SSL CA 2013
+serial=01323F9E677855DC8A71FF
+-----BEGIN CERTIFICATE-----
+MIIFHzCCBAegAwIBAgILATI/nmd4VdyKcf8wDQYJKoZIhvcNAQEFBQAwWjELMAkG
+A1UEBhMCREUxDzANBgNVBAoTBkdBRCBFRzERMA8GA1UECxMIVlIgSURFTlQxJzAl
+BgNVBAMTHlZSIElERU5UIEVYVEVSTkFMIFJPT1QgQ0EgMjAxMzAeFw0xMzA5MTIx
+MzA4MzlaFw0yMzA5MDQxOTA2MzZaMFAxCzAJBgNVBAYTAkRFMQ8wDQYDVQQKDAZH
+QUQgRUcxETAPBgNVBAsMCFZSIElERU5UMR0wGwYDVQQDDBRWUiBJREVOVCBTU0wg
+Q0EgMjAxMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALxcxCeaCQJB
+zFav0d353Kz5kc2Xvl1VbIyLx8FfzttR2wByvLl8j9MoHItPORadB6NIQClhkNtp
+V+V34SOuk6qEZ5ZOmF+573NPE5iD4YOoK0jGOQkkCBhcUrfQ8QMBRZYby1gZ5Ylr
+4XFqrn6Kq+1Fh8JqlmyqKdbG+/bXEYLxBJU6ps1WMDU6z06JKtah4sY0Ap+2gBND
+KddcllBOfOzGCh9krodg9NvNu05mMlreOjqK+FU5VfD3Y8EvPBwcgpz4QTbEXWXg
++ONWQyl1gi2f+95g4Jo61Z4fkhR9duAL6cqQXOhAa6BQkt8Hg0B/uXvwrX65ly2h
+aqvRrBN0ojUCAwEAAaOCAe4wggHqMHIGCCsGAQUFBwEBBGYwZDBiBggrBgEFBQcw
+AYZWaHR0cDovL29jc3AudnItaWRlbnQuZGUvZ3Rub2NzcC9PQ1NQUmVzcG9uZGVy
+L1ZSJTIwSURFTlQlMjBFWFRFUk5BTCUyMFJPT1QlMjBDQSUyMDIwMTMwLgYDVR0j
+BCcwJYAjUFJPRC5HVE4uRVhST09UQ0EuU0lHR0VOUlMuMDAwMDI0MDAwEgYDVR0T
+AQH/BAgwBgEB/wIBADCBjAYDVR0gBIGEMIGBMDUGDSsGAQQBgYogBAEBCQIwJDAi
+BggrBgEFBQcCARYWaHR0cDovL3d3dy52ci1pZGVudC5kZTBIBgkrBgEEAbE+AQAw
+OzA5BggrBgEFBQcCARYtaHR0cDovL2N5YmVydHJ1c3Qub21uaXJvb3QuY29tL3Jl
+cG9zaXRvcnkuY2ZtMGQGA1UdHwRdMFswWaBXoFWGU2h0dHA6Ly93d3cudnItaWRl
+bnQuZGUvZ3RuY3JsL0NSTFJlc3BvbmRlci9WUiUyMElERU5UJTIwRVhURVJOQUwl
+MjBST09UJTIwQ0ElMjAyMDEzMA4GA1UdDwEB/wQEAwIBhjArBgNVHQ4EJAQiUFJP
+RC5HVE4uRVhTU0xDQS5TSUdHRU5SUy4wMDAwMjQwMDANBgkqhkiG9w0BAQUFAAOC
+AQEAGBHskcKj2ewgTphPpnZ9za6i5kzXow2ndrRZmYc/FweKmAmvkd7S6gWaod8e
+aQeDUkcZr6YGVRwu1CqbUFgSszpfGHuJvjzIW3bzhSXiMvdVZVJIidqN27HapSoC
+npbc3OYjSJ3gpYqx0SM75KfdKf+wd4zSZPL2MitPW33OA0mk0nfrX80EoEyHIBY4
+KDnpJOqzVtNF6aRNoDIvYrt/5cqB0xTlfgyfkKvFVjaaqmNYsaKPPnrSYw4ZBCql
+/UBL2JMivBmi2qQBvinoeqF2KyMTEEupkuLzTh9Y8utcjz7nMMIoBR8AN71bfxzu
+xiJQi2ciM4mkRziNI6ZPDzdauw==
+-----END CERTIFICATE-----
+
 subject= /C=TW/O=TAIWAN-CA INC./OU=SSL Security Services/CN=TWCA Secure Certification Authority
 serial=74C18753F7EEB4EA238D8416B5AC7646
 -----BEGIN CERTIFICATE-----
@@ -18482,39 +19787,6 @@
 uiwR6x+SlgfoGhpMG4+wBKhGg58N
 -----END CERTIFICATE-----
 
-subject= /C=ES/O=AC Camerfirma SA/CN=CA Camerfirma Express Corporate Server/serialNumber=A82743287
-serial=08
------BEGIN CERTIFICATE-----
-MIIFIjCCBAqgAwIBAgIBCDANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn
-MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
-ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg
-b2YgQ29tbWVyY2UgUm9vdDAeFw0wNDA0MjAxNzA1NThaFw0zNDA0MjExNzA1NTha
-MG0xCzAJBgNVBAYTAkVTMRkwFwYDVQQKExBBQyBDYW1lcmZpcm1hIFNBMS8wLQYD
-VQQDEyZDQSBDYW1lcmZpcm1hIEV4cHJlc3MgQ29ycG9yYXRlIFNlcnZlcjESMBAG
-A1UEBRMJQTgyNzQzMjg3MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-uSy+2i/afKJtZnuCh2h01FkAoBwv+IWKxxHRW/F4rrBTxKrz5IkleQejc11S8VM+
-64maXYgzaRsodkkOQb7RSHEZV0a1SFdiyx/D0Qq4FCXUTqHdVD80f7CQ2psb/hIQ
-tN59mAVSankqsZS/hHVJwWHvcPQ0HDqE+JyB6P7Udx/8rN1PYjC7tVACkdAom0eI
-isnHg+wrlN0NuBvNig3oXmXonaiQpkTukqCmqlyZxZDNyQSWeZNz0Ln56tTQnHuG
-JU0YrAI26jqOojxEMaG9aPC7jLX+lpt/xhSsahnTKvgm9hXXjYintVCR1oIepoG3
-MFp4yYcwJJYIe/Jzf2Y+wwIDAQABo4IBuTCCAbUwEgYDVR0TAQH/BAgwBgEB/wIB
-CzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
-aGFtYmVyc3Jvb3QuY3JsMB0GA1UdDgQWBBQNfChpUp8Yr8dNnC5McgVSVtG3pTCB
-qwYDVR0jBIGjMIGggBTjlPWxTenboSlbV4tNdgZ24dGiiqGBhKSBgTB/MQswCQYD
-VQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3
-MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZ
-Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdIIBADAOBgNVHQ8BAf8EBAMCAYYwCQYD
-VR0RBAIwADAnBgNVHRIEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3Jn
-MFAGA1UdIARJMEcwRQYLKwYBBAGBhy4KCwEwNjA0BggrBgEFBQcCARYoaHR0cDov
-L2Nwcy5jYW1lcmZpcm1hLmNvbS9jcHMvY21mY3MuaHRtbDANBgkqhkiG9w0BAQUF
-AAOCAQEAVxyJ7YUCTD2zn33oOymb8RqQPgssAlXNd5/82uzjSlEL7y1nstVSdxMB
-8+J0xBR1lISn0sfFA9ZHedz3GPD3FOzmzX2ZQ31iTS6B/b7AWdh1GhY094MR3n8S
-AWTKNvrAYawXyF/HqcNdIbEqa6dRxqR3fcBNiyfb01zUdpidezHShNl8KbaokEW3
-HgRlpCBHhiu3uAXflarw7UT9OjUj04fgYSrtOy4xJoZhUCNTVOpCdVTc7YmVuLFi
-Rh5STyaMLRHkjabYM//udQicSgMrEvj+WBX2GmSmlbk5abVoYUtjDUB7gQ38UMJn
-cARUSjsyS35DKvZot0YRNcVaGXz+bg==
------END CERTIFICATE-----
-
 subject= /C=DE/O=Universitaet Osnabrueck/OU=Rechenzentrum/CN=Uni-Osnabrueck RZ-CA G-002/emailAddress=ca@uni-osnabrueck.de
 serial=0A972452
 -----BEGIN CERTIFICATE-----
@@ -18878,6 +20150,39 @@
 sGvrslzZiufdnUsjuW00dgkUNgnEir/J
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Leibniz Universitaet Hannover/OU=RRZN/CN=CA der LUH (UH-CA) - G03
+serial=17906104FC65C2
+-----BEGIN CERTIFICATE-----
+MIIFJDCCBAygAwIBAgIHF5BhBPxlwjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYy
+OFoXDTE5MDcwOTIzNTkwMFowZzELMAkGA1UEBhMCREUxJjAkBgNVBAoTHUxlaWJu
+aXogVW5pdmVyc2l0YWV0IEhhbm5vdmVyMQ0wCwYDVQQLEwRSUlpOMSEwHwYDVQQD
+ExhDQSBkZXIgTFVIIChVSC1DQSkgLSBHMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDQqNv2Q98KioaZviQqCRxVSqqwRZkROa6VEJOtMGEzTgS9wBgf
+ZjdFWtqbZjZ1PQ6ffvMeXfGbycU09eJSz0FY3mra/pw04e32ibas34L/zfjhBoZV
+nRy7Q5joZoWtdh6eRBLDM0g1tCFsuwHS8u9+4ERY3+dxqqjJqS+RigelBH6qi3q/
++2mN9b6pFcrgEalRIj//GOHQYxAwsCsjKpyDTl5S7B/MUb3i3tNTuLbgpJkshk+N
+HyGdienaTDO6zVfR1S6eL9NHQqyNhnZsDutPDZ17hgJ3Obt3b610grSGNTmzqdc5
+aI5SoE5xURNrfmtAoXM3xDr9SAPNcvnnpE1nAgMBAAGjggHgMIIB3DASBgNVHRMB
+Af8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAw
+HQYDVR0OBBYEFNP74E3kTYiF9FGpb3l16cApIS4TMB8GA1UdIwQYMBaAFEm3xs/o
+PR9/6kR7Eyn38QpwPt5kMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEu
+cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDug
+OYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3Js
+L2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6
+Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7
+aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0
+L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUv
+Z2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEB
+CwUAA4IBAQCbKEKxHAJHkp97nO9RjZSFlpyiSa/eXv44lyg3uFniibOhZ8re1il3
+ogq05uD58w7mbmtmDNS16xEjUU/rtvzd77w8Bf4ZN02nfVW8KlWYGAN+1W6azsnd
+C4AOkVmIjPrdWmXlzeH0PY/VPGCpmECpshGov+j7Hb964xnxeb46zCt2HJxeygig
+yrfQLLjQup2UOsligzGGFeiswAQ+OwrmxEnD3hRq7IgnKxipiMatV+KgaZWDTSrk
+niLseWV/1E7esDa/HCNkj5hDFqxuicY+zALhMzW3o0c3bs/ivkpJWwMgaXbVPAb1
+Ugw6fFQAftB5Rd9J3LH2dzM6/M+qkXtS
+-----END CERTIFICATE-----
+
 subject= /C=TW/O=\xE8\xA1\x8C\xE6\x94\xBF\xE9\x99\xA2/OU=\xE6\x94\xBF\xE5\xBA\x9C\xE6\x86\x91\xE8\xAD\x89\xE7\xAE\xA1\xE7\x90\x86\xE4\xB8\xAD\xE5\xBF\x83
 serial=088DD2963B8B629C194E3200DA77CE2C
 -----BEGIN CERTIFICATE-----
@@ -18944,39 +20249,6 @@
 58KYKSxTbOGbBt1cRf10CCR1/3YGE9C7rg==
 -----END CERTIFICATE-----
 
-subject= /C=DE/O=Universitaet Dortmund/OU=Hochschulrechenzentrum/CN=Uni Dortmund CA - G01/emailAddress=ca@pki.uni-dortmund.de
-serial=09DE9958
------BEGIN CERTIFICATE-----
-MIIFJTCCBA2gAwIBAgIECd6ZWDANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
-RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
-AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MDEzMDEwMTk1NFoX
-DTE5MDEyOTAwMDAwMFowgZUxCzAJBgNVBAYTAkRFMR4wHAYDVQQKExVVbml2ZXJz
-aXRhZXQgRG9ydG11bmQxHzAdBgNVBAsTFkhvY2hzY2h1bHJlY2hlbnplbnRydW0x
-HjAcBgNVBAMTFVVuaSBEb3J0bXVuZCBDQSAtIEcwMTElMCMGCSqGSIb3DQEJARYW
-Y2FAcGtpLnVuaS1kb3J0bXVuZC5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAIrk+GEiQrYJ4xa5gfqE2rcQRbLoWq/VBmP6lqC4KNPkGvTuBVAnruBC
-ppGoWBPAymI8GG3IuXx773XL6SIMXQpITn35Vek9V4devWbwXPDmcmj49Rh1O7ny
-pCBiPQqlPBuFwV29M8AW9q3jSfBMRfugHv4RYcpU2aV4pqbIpbyX1f46Qi48Aii6
-3GwEE8yaeQyKeDYXbQeuo0zzahwnjE8fWeo6Efd1POPMggISvqoX+yfcLukeih42
-y3/Nxj+Jc3Dg7Q6LWYZCVcwe8Nz2FUZhiro8iptS92yJcOISXXowT3YLqQlalYYe
-5NIUqdkbeopOV9GzAkzSLLc+x4GPaOMCAwEAAaOCAbUwggGxMA8GA1UdEwEB/wQF
-MAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBS2xUwehoacGohRNe4UZpnBM+vD
-PDAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAhBgNVHREEGjAYgRZj
-YUBwa2kudW5pLWRvcnRtdW5kLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDov
-L2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNy
-bDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9w
-dWIvY3JsL2NhY3JsLmNybDCBogYIKwYBBQUHAQEEgZUwgZIwRwYIKwYBBQUHMAKG
-O2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2Vy
-dC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRl
-L2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0B
-AQUFAAOCAQEAQuo5LRdEzbyEId5S9uVysnzQ+jF5XMeMmqhXyAMF7a/JOkhvxHqq
-tEZTUBkQljxedggXWyTcIRFJDR4gvS8Y1db98jqOmcwYRi2NrcypgaosRszeaysZ
-zlfd+1fMoFIvFzderys0cvJ0LjePQMVVHkmgHi4SyZbgx/pSvj8urvkxc3qnAcPY
-7L+pdueZ/rz1ZpPzTw1uyT3ksHSSAQzFcw6ojXsXFuL93jycScwolql5I++pHCLN
-n9GjQVE+gzgfQ5TOK78G0c4aKum+slk4Giw3XZGywFfBnFkYM7UrRHuJIs1B7s4o
-eQTtWo/SbivQuX68yXo2MYzOjzSiFdUm1A==
------END CERTIFICATE-----
-
 subject= /C=DE/O=Fachhochschule Flensburg/OU=IT Dezernat/CN=FH-Flensburg CA - G02/emailAddress=postmaster@fh-flensburg.de
 serial=09E6A042
 -----BEGIN CERTIFICATE-----
@@ -19109,6 +20381,39 @@
 QYW482MXJqtPfiV1po/fO7SIQxsZMnxHFco=
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Brandenburg/L=Senftenberg/O=Hochschule Lausitz/CN=Hochschule Lausitz CA/emailAddress=pki@hs-lausitz.de
+serial=0E3C9CBA
+-----BEGIN CERTIFICATE-----
+MIIFJjCCBA6gAwIBAgIEDjycujANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
+RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
+AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA5MDUyNzExMDgyNloX
+DTE5MDYzMDAwMDAwMFowgZgxCzAJBgNVBAYTAkRFMRQwEgYDVQQIEwtCcmFuZGVu
+YnVyZzEUMBIGA1UEBxMLU2VuZnRlbmJlcmcxGzAZBgNVBAoTEkhvY2hzY2h1bGUg
+TGF1c2l0ejEeMBwGA1UEAxMVSG9jaHNjaHVsZSBMYXVzaXR6IENBMSAwHgYJKoZI
+hvcNAQkBFhFwa2lAaHMtbGF1c2l0ei5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAJv+JuNSi3KOG1v8I5tz3AvngGvCwaVmWClWk/sVQc7f9C0Sr6rX
+I7YMBpVeWjAwYLgfVv3G6TtQma378DM61eb8r3I8pYif52Moo5+EiNRUhZstV4Gp
+dIrxsszQKwDvvhj8KZukG+F7o1xpMsNL7v6nvOgodIVgiDxMWkD1BgDTa7u26HZP
+x91+SENVHH1s0/K9yBOIuTh450k49AWbnQTtXiVe7Pb4Qi5DdyZSgHDUW++2rbuD
+kWaHXp2Ox/bSv65bmmWHdv0ApV1/frj4WB4u9hOLAIuw6w/kQcSFG9fAPVKH5c7n
+TmVstkqpbwbWkyCsp0OFGmJXjmW1a73MG48CAwEAAaOCAbMwggGvMBIGA1UdEwEB
+/wQIMAYBAf8CAQEwCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBRXwaSWu0cBhol1+Ch/
+g01zpnhMgTAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAcBgNVHREE
+FTATgRFwa2lAaHMtbGF1c2l0ei5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6
+Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5j
+cmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NybC9jYWNybC5jcmwwgaIGCCsGAQUFBwEBBIGVMIGSMEcGCCsGAQUFBzAC
+hjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNl
+cnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcN
+AQEFBQADggEBAON6CO8ikb/xeRX6BPX8nCyvEZn+Lwfa7s1YTC77UbyVYOhN5VI2
+yvVVhQdQocJ1p1co8ILaXHuG5k7BybaHG/G4i7TBDuLNdVxAAbo+Jl3pYsWc/oW+
+UTlqbmPW+K/VtEctidCxbpbG8V8Xye/S2ZvacixZ5sp0JPtp/94j/YPUrx5+gcCj
+cTYZQeaMA62LsLl/5xO/Aa2hGv2Yw1qvNe+aecABurqjtygcYMstStv0DEpYtxmK
+gkhCUgClLCgEHdOfLWFo012bu+EDy8EpGnV1BtvCv8lIZFBc/FSWdGITm/VRZ7eQ
+fv7Ki7PRMqzmSniwSSHPI+0RyGNh3svipyI=
+-----END CERTIFICATE-----
+
 subject= /DC=com/DC=disney/OU=TWDC-PKI/CN=The Walt Disney Company Issuing CA
 serial=4E402B56
 -----BEGIN CERTIFICATE-----
@@ -19142,39 +20447,6 @@
 LIq5JpQ8kH9L08cCBxjhbgDA2SH0pZFXLiDX
 -----END CERTIFICATE-----
 
-subject= /C=US/O=MasterCard Worldwide/OU=Key Management Services/CN=MasterCard Public Sub CA Gen 3
-serial=CE6325FF6111ADB48B7215C78F8AF1FA
------BEGIN CERTIFICATE-----
-MIIFJzCCBA+gAwIBAgIRAM5jJf9hEa20i3IVx4+K8fowDQYJKoZIhvcNAQEFBQAw
-eDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFE1hc3RlckNhcmQgV29ybGR3aWRlMSAw
-HgYDVQQLExdLZXkgTWFuYWdlbWVudCBTZXJ2aWNlczEoMCYGA1UEAxMfTWFzdGVy
-Q2FyZCBQdWJsaWMgUm9vdCBDQSBHZW4gMzAeFw0wOTA3MTAwOTM0MjBaFw0xNzA2
-MzAxMjQ1MDBaMHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRNYXN0ZXJDYXJkIFdv
-cmxkd2lkZTEgMB4GA1UECxMXS2V5IE1hbmFnZW1lbnQgU2VydmljZXMxJzAlBgNV
-BAMTHk1hc3RlckNhcmQgUHVibGljIFN1YiBDQSBHZW4gMzCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBANUW/BYsvUIgz/PeJGf/Lmdf+MEFxvuCnjc0EyMt
-iYv7xtMUmvUe2oqpLlDtZkARxqzecpVyIh9mv/cYhJWGyE0KzmDykYHfZpJxzwvJ
-mi3BHrf7C1+iXdUL4ziYseNtCmeTvPwvLvBj9As6t02HWYEueLiHkX65/Xd00WTu
-dxZOXfdgHcaZjoCo9IpDCpGh3jjIgk12fd5XXMnMdnROJf4olaR7QZKx8wC4rSeB
-rbwBz1laXac3N4MlF2oSoCjKoaCcbeH2tj+J5npRJ1u/tqrJJQ9c5+5HgH8nMmqz
-hzZ7avFTA860hZK1bcFMUE6dCx0I3HjqyQMAOdFX+nfLCHsCAwEAAaOCAaswggGn
-MA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEBMIH5BgNVHSAEgfEw
-ge4wgesGCSqGSIb3DQUGATCB3TAzBggrBgEFBQcCARYnaHR0cDovL2NlcnRpZmlj
-YXRlcy5tYXN0ZXJjYXJkLmNvbS9DUFMvMIGlBggrBgEFBQcCAjCBmDAbFhRNYXN0
-ZXJDYXJkIFdvcmxkd2lkZTADAgEBGnlNYXN0ZXJDYXJkIFdvcmxkd2lkZSBDZXJ0
-aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudCwgIGdvdmVybnMgdGhpcyBjZXJ0
-aWZpY2F0ZSBhbmQgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZSBoZXJlaW4u
-MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jZXJ0aWZpY2F0ZXMubWFzdGVyY2Fy
-ZC5jb20vQ1JMX1BVQl9ST09UX0dFTjMwHQYDVR0OBBYEFJeQxAntTUuEEDo0h9+V
-rc7kpOLHMB8GA1UdIwQYMBaAFOLLRLeBcRyL9avLryLoCDqur4HEMA0GCSqGSIb3
-DQEBBQUAA4IBAQAwcjn40uM6tUhYiFOnGCdJc6gJyspC1HbdMcYmc4Izj9XEQuMa
-w6/SHOl+omdugcYIKUWEG+iqM9rAjoX7VZiknn+iD3T3Sg6aQ32c7Xom9VSeo08z
-lXlaxt6p3GY01RoUM3jPH/D4FZP9S09znUtRAQuMCBpkSir/WbLZn9Mg0+n08rD5
-sVHaFje1yDOc0U+k2eCiIihUoFRKlUt2jCClaGmEJRoMCZ4ogke7L15pl60ZrxGT
-XcE/DZ3qGbIIIzeZ2yyOo2fzoJ44gY18IF8LBwstoiIXjqAERwLSJtzu6WJtxUI0
-SOEDQRPgsjKkhmSGF2/XTGOcKOiNzheQVEk1
------END CERTIFICATE-----
-
 subject= /C=DE/O=Technische Universitaet Clausthal/OU=Rechenzentrum/CN=TU Clausthal CA - G02/emailAddress=pki@rz.tu-clausthal.de
 serial=0A0CB196
 -----BEGIN CERTIFICATE-----
@@ -19208,39 +20480,6 @@
 90lxelWquWjvtXOJrcL8QzlhfNTBu/8nqloIFQ==
 -----END CERTIFICATE-----
 
-subject= /C=DE/ST=Bremen/L=Bremen/O=Hochschule fuer Kuenste Bremen/CN=HFK-BREMEN-CA/emailAddress=hotline@hfk-bremen.de
-serial=0DE9AA4A
------BEGIN CERTIFICATE-----
-MIIFKDCCBBCgAwIBAgIEDemqSjANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
-RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
-AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA5MDMyNTEzMDgxMVoX
-DTE5MDYzMDAwMDAwMFowgZYxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCcmVtZW4x
-DzANBgNVBAcTBkJyZW1lbjEnMCUGA1UEChMeSG9jaHNjaHVsZSBmdWVyIEt1ZW5z
-dGUgQnJlbWVuMRYwFAYDVQQDEw1IRkstQlJFTUVOLUNBMSQwIgYJKoZIhvcNAQkB
-FhVob3RsaW5lQGhmay1icmVtZW4uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCu7/7ETz/TyBNjN1cmMOrgifjLxBZ7aTNrdFy3HRy4pOY8EDhCD430
-tZnv6zadDYiohwqyRYbf8rM6k+arhvMX+Z/YszImODWRBUNwTBigErTMgEZ0xZJZ
-3SE/HgAc3sNT7e/pUDD1FECC5ueE3RnsDQISOtSK7XIfFvrzqScWi66F0y7zqh9F
-S5yIa47Vq/2k3ZRMbV3MQ0BtkW0JO4RgeQnu3ge7xC0mcUIl+G4Gd3m2iH2+1D6c
-lcvvdRxEj6XILXzUjhixWi7P6zlGs9pTdK3MHdlOPw5L2e1mmgawgQC5WrUNi93R
-fQXdyh+hrHkv4nfXjIpZ3fx1wIqNVIW9AgMBAAGjggG3MIIBszASBgNVHRMBAf8E
-CDAGAQH/AgEBMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU6CWLfcbrGyunq+xLvkjc
-lulMYw8wHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwIAYDVR0RBBkw
-F4EVaG90bGluZUBoZmstYnJlbWVuLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0
-cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3Js
-LmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
-YS9wdWIvY3JsL2NhY3JsLmNybDCBogYIKwYBBQUHAQEEgZUwgZIwRwYIKwYBBQUH
-MAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Nh
-Y2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZu
-LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG
-9w0BAQUFAAOCAQEAFHeO5T2+bct5X8e3H9urVrBYCSG3WpBevNlsftcCYhnPOciQ
-8RUJpXJlqwdQOjMQ7zIdYAbHqIS1WXrO+1sfUuXVpL4UqMGbSjuiNvofGXzzGEjI
-H7MJS8S9oZdY9ZtR2kaAPB683Q545Wvk5Plc4lGIzTCbo4/CWJd47N+J/IK5hltK
-xxJQ6L3FaNpEPupuhPBE4vAT2PmLfvz77M2R1kD4j83ktZGrHryBTQVwUkWTeKa3
-lOvfBC1SNCYp1vNWEysNMyaQ7vKUETAy/rb51yCMUG0wU6gZn6spe4emGp86ew6R
-kyMnB3vdyFRpLjUQ8mgK2pGaUWaQAo78g8eM8Q==
------END CERTIFICATE-----
-
 subject= /C=DE/O=Otto-Friedrich-Universitaet Bamberg/OU=Rechenzentrum/CN=Uni Bamberg CA - G02/emailAddress=pki@urz.uni-bamberg.de
 serial=0A285C36
 -----BEGIN CERTIFICATE-----
@@ -19274,39 +20513,6 @@
 vakpm97T7dfta7MEDzxzjDjKpHJqwLl94dwWTrc=
 -----END CERTIFICATE-----
 
-subject= /C=DE/ST=Sachsen/L=Dresden/O=Leibniz-Institut fuer Polymerforschung Dresden e.V./CN=IPF CA - G01/emailAddress=pki@ipfdd.de
-serial=0A3C0CEE
------BEGIN CERTIFICATE-----
-MIIFKTCCBBGgAwIBAgIECjwM7jANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
-RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
-AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MDQxMTA3MzM1MloX
-DTE5MDQwOTAwMDAwMFowgaMxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdTYWNoc2Vu
-MRAwDgYDVQQHEwdEcmVzZGVuMTwwOgYDVQQKEzNMZWlibml6LUluc3RpdHV0IGZ1
-ZXIgUG9seW1lcmZvcnNjaHVuZyBEcmVzZGVuIGUuVi4xFTATBgNVBAMTDElQRiBD
-QSAtIEcwMTEbMBkGCSqGSIb3DQEJARYMcGtpQGlwZmRkLmRlMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtSRbNZJ7S6bt2hZMBeF0Mx9qm47EXv/3vSDC
-clvbHtSdu+whVakBetMVTpi9fK92CNIHTp+KNp3xH3zzQamD3wNeV2lxAR9wobZ6
-md0l65TQwE92Jlvy6iIynDQaE0nI5pLyOwEaIP/vpqCp21IRhn9S/LKK+tXrydcW
-c6UQYFKD/sUSG2EjJDs/XL68kmkuyEeaok1mPRdmEmU3gVyFmxl9PZVP0hixy4Tu
-RxwqizZY9smLEg5zSfwqCGOZs876T8alyLzjHhJ+G+lvRl2uvbdQt9ofkc465Epw
-enzAlJTTInpNUR5Lz4k2JySxkaQN2bY9UhU66JkhdHhKQ/OsiwIDAQABo4IBqzCC
-AacwDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFKxHHRcD
-N6XBWECdbTLZPqIIfjxyMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5k
-MBcGA1UdEQQQMA6BDHBraUBpcGZkZC5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0
-dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNy
-bC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
-Y2EvcHViL2NybC9jYWNybC5jcmwwgaIGCCsGAQUFBwEBBIGVMIGSMEcGCCsGAQUF
-BzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9j
-YWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRm
-bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZI
-hvcNAQEFBQADggEBAEYgJlauoh9PHhl08K72fHruay4DGfOjHswENnI5Ut8HlIb5
-QXcoUby5boVfQJzgfFQFxlKhJTO1SiTNstmx7v4YZo+PV40ZUSfFcND8AXosG4ED
-zjOHDdazoOOWDZanIYrN/SxhCo8NFZYO4UjkAaLqwYVBiP/z7ko6tHnRTYeFtks/
-oVlsZuUhUapaxF9FZJURwtlmP5JWVP+9AI36K6KYA6wt56Ul3+457IKcH90/daxd
-T+uueDwTuFGdA4EHNzSoI80xYX7HY/LcLXzfiXVbfDnAVweduYve4SC+ALruUNOZ
-+noJit/hxRYyhI3KoVOjpb7J4+Awf/YbIUAzNsI=
------END CERTIFICATE-----
-
 subject= /C=DE/ST=Schleswig-Holstein/L=Elmshorn/O=NORDAKADEMIE gAG/CN=NORDAKADEMIE CA-01/emailAddress=pki@nordakademie.de
 serial=0BE4D2E4
 -----BEGIN CERTIFICATE-----
@@ -19538,6 +20744,105 @@
 Exo+5aDWvzjB9AzqYRtjtO8Mf1/C6b4v+P+vp+TC
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Bremen/L=Bremen/O=Universitaet Bremen/CN=Universitaet Bremen CA
+serial=179060F67AC0A4
+-----BEGIN CERTIFICATE-----
+MIIFKzCCBBOgAwIBAgIHF5Bg9nrApDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYx
+NFoXDTE5MDcwOTIzNTkwMFowbjELMAkGA1UEBhMCREUxDzANBgNVBAgTBkJyZW1l
+bjEPMA0GA1UEBxMGQnJlbWVuMRwwGgYDVQQKExNVbml2ZXJzaXRhZXQgQnJlbWVu
+MR8wHQYDVQQDExZVbml2ZXJzaXRhZXQgQnJlbWVuIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAya6bqhlcFF6kbyKzclo3s4OSO0gRVPTZrrsKMhOa
+OH0zCdl+AK6oCay+bcnav1Jmb/X0Wxoabi9AROjOVJXA6/OsjkGiLOJuMZOVjVxX
+0Vt00vo8mPDBkt4ZIdgQektG61UL/TbukCoI1yeqSq/ssQpyOmVya1z4n+8Kz7zk
+VAGDVqYF90rkEPekYUL4CDZe/UlsRBAlaoI6n56lE4OYlWpNVFonad/+u1yvHcQl
+wWXHeXgrBG0f+W+aXWfH9NXsuB0xZKaEkSBaVCqGqHN+4gsJS2pywp8veK5RxQRp
+RuIPMX8KTaR3BG9HqYBPbQfY0BXoGtnNR2Ru9uCXvEWVvQIDAQABo4IB4DCCAdww
+EgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAG
+BgRVHSAAMB0GA1UdDgQWBBTky8TsedDfrm6skomunUkvxeWYQTAfBgNVHSMEGDAW
+gBRJt8bP6D0ff+pEexMp9/EKcD7eZDCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6
+Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5j
+cmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzAB
+hidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2Eu
+ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkq
+hkiG9w0BAQsFAAOCAQEAaSbmEkTbja5qzNylgRY/SKZuhcMskkiN+vJfF5u0Ynm9
+v0aNp3R4HxLPe3CTSHtkvNHMcJCTcE8hMYMucRbuXut51Q8s88ye+PHIMUgDsFJh
+ufmlL22VJ+6Qbnyk2MpCJ+c40RUr137Q0POkbVoaMM7mM8JXL17O+XQ0nSRUcBpy
+T93TBSp3Bqv1cNJ8nD19m/HB7r+IfWxCJAEyMLv7gLcwBQG9nHIG3FE378CNV4qd
+PkHL2N9GneFtJGXihLhaQBXwIJj6tynn85+OsuU6QadixkIwTxzpNPvy4IcZCYHc
+4pwMfQ7vQr7b2xRAMmyeu+pV75KEvlaNnh/N4B+/dg==
+-----END CERTIFICATE-----
+
+subject= /C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 EV SSL CA - G2
+serial=366585077A8867AB58F4A094F8103733
+-----BEGIN CERTIFICATE-----
+MIIFKzCCBBOgAwIBAgIQNmWFB3qIZ6tY9KCU+BA3MzANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMTMxMDMxMDAwMDAwWhcNMjMxMDMwMjM1OTU5WjB3MQsw
+CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
+BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5bWFudGVjIENs
+YXNzIDMgRVYgU1NMIENBIC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQDa7MVqNhGG2yAho+xMIf0PxVw6vuyibpgOgplrenrrbvIlyS1gIF3WK+bd
+mdnxVFx2mwv5J0IkfOrU5jwqziOf+3jJFUT0VixVzla3MPBJif4N2G4BfGHTRJlm
+XpZIGIcJyMNJ6TXsu0x6FZFV7WCAlQvXGPOnS+bodAwua0X0F/nLv1RW7jbUTubP
+rR9NfY+zVTXdYtJuVIWeRVN67mCWIn+4Gq9voA6mjhO2haHMXIyerR1xuAiU5s68
+ONDR6T9xQ/uXI6hs9DHcAjveKVXyoL4eIWyvGlzfajdkAprQUXGlf7ppxSyJZ3A7
+EwVy7SEjECsjKhquOglkI3onYhLRAgMBAAGjggFdMIIBWTAvBggrBgEFBQcBAQQj
+MCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/BAgw
+BgEB/wIBADBlBgNVHSAEXjBcMFoGBFUdIAAwUjAmBggrBgEFBQcCARYaaHR0cDov
+L3d3dy5zeW1hdXRoLmNvbS9jcHMwKAYIKwYBBQUHAgIwHBoaaHR0cDovL3d3dy5z
+eW1hdXRoLmNvbS9ycGEwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3MxLnN5bWNi
+LmNvbS9wY2EzLWc1LmNybDAOBgNVHQ8BAf8EBAMCAQYwKQYDVR0RBCIwIKQeMBwx
+GjAYBgNVBAMTEVN5bWFudGVjUEtJLTEtNTMyMB0GA1UdDgQWBBRL+i3k7jMy4t8N
+AaGG06A7OrmsrjAfBgNVHSMEGDAWgBR/02Wnwt3su/AwCfNDOfoCrzMxMzANBgkq
+hkiG9w0BAQUFAAOCAQEARqb1s+ikVsm4NPD3/vMsLmORYyzp1RR/E5P2TN5NgpnM
+a8l4YfsSLUgPcOonb3jo9wM+yrg7usnfsDri3iLQMS1m2m4RJUL1eyTC3ksSd81W
+2PuGgLoKU27lAQgb0cmydZ2rBics8lKPWb2uHXT648b8RE1bSmzJuDnZ91qE+aAD
+wjhOizKlQNrCdfS8yvlX+YYHdVvudjUwhQdz0lxG7Q965X9sPTfBveaFSWC6jfnv
+2qxKMeFk9nlnvz9v4pVS3k+NydQ9/L07uDHw9dn1QQRU4CafmYP5BTYlccTLwSse
+g1CoewuMVg6qXabpL6Fn/jcgxT6d/J2sIP17u5y4IA==
+-----END CERTIFICATE-----
+
+subject= /C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 EV SSL CA - G3
+serial=7EE14A6F6FEFF2D37F3FAD654D3ADAB4
+-----BEGIN CERTIFICATE-----
+MIIFKzCCBBOgAwIBAgIQfuFKb2/v8tN/P61lTTratDANBgkqhkiG9w0BAQsFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMTMxMDMxMDAwMDAwWhcNMjMxMDMwMjM1OTU5WjB3MQsw
+CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
+BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5bWFudGVjIENs
+YXNzIDMgRVYgU1NMIENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQDYoWV0I+grZOIy1zM3PY71NBZI3U9/hxz4RCMTjvsR2ERaGHGOYBYmkpv9
+FwvhcXBC/r/6HMCqo6e1cej/GIP23xAKE2LIPZyn3i4/DNkd5y77Ks7Imn+Hv9hM
+BBUyydHMlXGgTihPhNk1++OGb5RT5nKKY2cuvmn2926OnGAE6yn6xEdC0niY4+wL
+pZLct5q9gGQrOHw4CVtm9i2VeoayNC6FnpAOX7ddpFFyRnATv2fytqdNFB5suVPu
+IxpOjUhVQ0GxiXVqQCjFfd3SbtICGS97JJRL6/EaqZvjI5rq+jOrCiy39GAI3Z8c
+zd0tAWaAr7MvKR0juIrhoXAHDDQPAgMBAAGjggFdMIIBWTAvBggrBgEFBQcBAQQj
+MCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/BAgw
+BgEB/wIBADBlBgNVHSAEXjBcMFoGBFUdIAAwUjAmBggrBgEFBQcCARYaaHR0cDov
+L3d3dy5zeW1hdXRoLmNvbS9jcHMwKAYIKwYBBQUHAgIwHBoaaHR0cDovL3d3dy5z
+eW1hdXRoLmNvbS9ycGEwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3MxLnN5bWNi
+LmNvbS9wY2EzLWc1LmNybDAOBgNVHQ8BAf8EBAMCAQYwKQYDVR0RBCIwIKQeMBwx
+GjAYBgNVBAMTEVN5bWFudGVjUEtJLTEtNTMzMB0GA1UdDgQWBBQBWavn3ToLWaZk
+Y9bPIAdX1ZHnajAfBgNVHSMEGDAWgBR/02Wnwt3su/AwCfNDOfoCrzMxMzANBgkq
+hkiG9w0BAQsFAAOCAQEAQgFVe9AWGl1Y6LubqE3X89frE5SG1n8hC0e8V5uSXU8F
+nzikEHzPg74GQ0aNCLxq1xCm+quvL2GoY/Jl339MiBKIT7Np2f8nwAqXkY9W+4nE
+qLuSLRtzsMarNvSWbCAI7woeZiRFT2cAQMgHVHQzO6atuyOfZu2iRHA0+w7qAf3P
+eHTfp61Vt19N9tY/4IbOJMdCqRMURDVLtt/JYKwMf9mTIUvunORJApjTYHtcvNUw
+LwfORELEC5n+5p/8sHiGUW3RLJ3GlvuFgrsEL/digO9i2n/2DqyQuFa9eT/ygG6j
+2bkPXToHHZGThkspTOHcteHgM52zyzaRS/6htO7w+Q==
+-----END CERTIFICATE-----
+
 subject= /C=DE/L=Passau/O=Universitaet Passau/OU=Rechenzentrum/CN=Universitaet Passau CA - G01/emailAddress=ca@rz.uni-passau.de
 serial=09F93DBB
 -----BEGIN CERTIFICATE-----
@@ -19604,72 +20909,6 @@
 bMNXer8qB9HE+SfyOOIN39UksT7gE3/GYce8yTSv1edH
 -----END CERTIFICATE-----
 
-subject= /C=DE/O=Fachhochschule Osnabrueck/OU=Fachdienst EDV/CN=FH Osnabrueck CA - G02/emailAddress=certificate@fh-osnabrueck.de
-serial=0A285C46
------BEGIN CERTIFICATE-----
-MIIFLjCCBBagAwIBAgIECihcRjANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
-RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
-AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MDMyNzA5MDcwM1oX
-DTE5MDMyNjAwMDAwMFowgZgxCzAJBgNVBAYTAkRFMSIwIAYDVQQKExlGYWNoaG9j
-aHNjaHVsZSBPc25hYnJ1ZWNrMRcwFQYDVQQLEw5GYWNoZGllbnN0IEVEVjEfMB0G
-A1UEAxMWRkggT3NuYWJydWVjayBDQSAtIEcwMjErMCkGCSqGSIb3DQEJARYcY2Vy
-dGlmaWNhdGVAZmgtb3NuYWJydWVjay5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBALGu4OvKO0kjxEc7kEnNFGNK5BQxwd9dqTdnyxDqHMKz5BbbQ0P0
-blUa9CXKaavI2ivBWa56Tg4rarRrkF5B3eovaiyImsHvPz5IxurSr7BqKUVdNNQ+
-9mEVIK5Gw8V3YFvLXdSTdxnaoxdM/3oroneNOvRiJFmz3CMXE1CTFa+sxrlvT/vj
-siorQqV6yrIUbtG7kOqkZJRdQJmbqFIf3qo0XYJN2SZWWqc0pjkj46NL0yEprrNo
-zvDICSWpxIquPDRpuGzpGiAEkc/AVfVnQDIxcY7Gh2XX3Udk5JDmwFNDpvbNS6BO
-LbThjnz5A9OkMh72fQSbXDspRwsOMnfHxiUCAwEAAaOCAbswggG3MA8GA1UdEwEB
-/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTNe6EstzDMc6yrHmTRHDvW
-w9DBQDAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAnBgNVHREEIDAe
-gRxjZXJ0aWZpY2F0ZUBmaC1vc25hYnJ1ZWNrLmRlMIGIBgNVHR8EgYAwfjA9oDug
-OYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3Js
-L2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwt
-cm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCBogYIKwYBBQUHAQEEgZUwgZIwRwYI
-KwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
-cHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5w
-Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDAN
-BgkqhkiG9w0BAQUFAAOCAQEAlF23q9Ua5CU3x6OvesOZZo8SmV8xkDU7fGCDaPdt
-X5oRTQQqZzF9lt1GpB0j/oa11DR28bYfu+Byk81zRCkVpa03ccV+iGyXQ3l5/hCA
-1aXozrAhesFpcwKr5nOkPbPJM5d+dqr6Cky1Q4wc3vGZxmHzp4751AuXDbZNRKrB
-YKcuHB88wM5YlRu4h0j4tdKQj7FvKSAbVUkXuaHfQATOhO3sGwLX4B1rFqBIKXG7
-0UNX4Oa8xsXDwPCbp4K9XBykBhJlUJ9u/4gK0FNhYWoY8XUwFS4tTqzo8k/XHEVD
-JzS7rzV3C9uMs0IwU4xUaYt3OpEpnzZ9jauoKlQDlDZOMg==
------END CERTIFICATE-----
-
-subject= /C=DE/O=Fachhochschule Oldenburg/Ostfriesland/Wilhelmshaven/OU=Hochschulrechenzentrum/CN=FH-OOW CA - G02/emailAddress=pki@fh-oow.de
-serial=0A42C015
------BEGIN CERTIFICATE-----
-MIIFLjCCBBagAwIBAgIECkLAFTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
-RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
-AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MDQxNjA5MzE1MVoX
-DTE5MDQxNTAwMDAwMFowgaQxCzAJBgNVBAYTAkRFMTwwOgYDVQQKEzNGYWNoaG9j
-aHNjaHVsZSBPbGRlbmJ1cmcvT3N0ZnJpZXNsYW5kL1dpbGhlbG1zaGF2ZW4xHzAd
-BgNVBAsTFkhvY2hzY2h1bHJlY2hlbnplbnRydW0xGDAWBgNVBAMTD0ZILU9PVyBD
-QSAtIEcwMjEcMBoGCSqGSIb3DQEJARYNcGtpQGZoLW9vdy5kZTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBALe52QNsxG8my9mhe6I/oYpFRK37zbQyLktX
-k0v6buT1af5AA/5lw2SU2R/e46yzurk0B3hxupvlYddB7a1/T3/SYYZbpDSkXa6k
-aLG6hj7t3vTKAHaXgfrvNmnuNy2bJmFtGnHyNDpbdjHHyhZtO95rV3WSxMGQuEzq
-1XDM1xC2oFsAFMVpRNPHaU78gmk6pvVD6wINduWEvk0KBStUqr4QRO/bC5R3vKY8
-+uIJoIMvbLzFER6KeYaZ9NVFId8pbZajfliNoNDVICqPpjVTf4dsEH+qoOe3xI1h
-mJDbPUzEwD0UK5Ij38M1rZ5HChl07gK0htzhG7M+NAHXwanZ90sCAwEAAaOCAa8w
-ggGrMBIGA1UdEwEB/wQIMAYBAf8CAQEwCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBR+
-cUvRDxPWxyiXYsnwX68cCpEKSTAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EK
-cD7eZDAYBgNVHREEETAPgQ1wa2lAZmgtb293LmRlMIGIBgNVHR8EgYAwfjA9oDug
-OYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3Js
-L2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwt
-cm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCBogYIKwYBBQUHAQEEgZUwgZIwRwYI
-KwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
-cHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5w
-Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDAN
-BgkqhkiG9w0BAQUFAAOCAQEAPUOjYK0+PmjEfFsShhgEwOw22uoIsxn6roFNp741
-J0RoZ+1Wmsre5q7qbWRWPSY8CvSlxEptmd6DTRD7jPfph0AvDgHOYM4qdHsSMKeT
-2YMhFNGR3Xr6SxjeUxSsVy6l5J6eeGNHbpgdYlvhPcivnv5ci8zQC3qh1LEYacBh
-RIny6zBe8f572sxVzKwJ3tA6qS/b4O51TzN4r6cTx5k3I2i/R5vDapqIXuU7jhew
-jqggN656AoDPGvbevSA6mGEuCPAAhLKWEYyptIc8uD4evz0ctHgutdpvWH/+XQHk
-8w89AHjHDES6urO1kLBFkP8zjRBBOo743L9VWIiFagngBw==
------END CERTIFICATE-----
-
 subject= /C=DE/ST=Sachsen/L=Mittweida/O=Hochschule Mittweida (FH) - University of Applied Sciences/CN=HTWM CA/emailAddress=pki@htwm.de
 serial=0B510882
 -----BEGIN CERTIFICATE-----
@@ -20297,6 +21536,39 @@
 NQ+o2VGeosGa5Jro0MBxVkSTHOj4SW0dU2jTCqnHBGIx+drjrxOze64=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Max-Planck-Gesellschaft/CN=MPG CA/emailAddress=mpg-ca@mpg.de
+serial=17A4248A6BC150
+-----BEGIN CERTIFICATE-----
+MIIFNTCCBB2gAwIBAgIHF6QkimvBUDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTM0
+NloXDTE5MDcwOTIzNTkwMFowXjELMAkGA1UEBhMCREUxIDAeBgNVBAoTF01heC1Q
+bGFuY2stR2VzZWxsc2NoYWZ0MQ8wDQYDVQQDEwZNUEcgQ0ExHDAaBgkqhkiG9w0B
+CQEWDW1wZy1jYUBtcGcuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDYUXKeoNTLgkGwbani4rlua5jzlzISfHnaj/5qS+mojQqA/eYa0bGucylV5hyQ
+uyJz7d4gRckdhMDV8DZIxERUIsFlXFj6HGHjaZjlhIHbo4S12GjLhTH5YZ37O7MH
+Vw0L/JhhzUIxESM1ZfRT/xLqhz2idJYjT98W9OFvzPgT0yrdieMzkLUz5X/fpY8M
+uyYBgxnddBJRw6ZtlhdCml4F8Q35pSb8J2qANiwuJVu3WCTgL/ydo3eA8vDieMMZ
+7O+L1wAnCzBbHAjJ5H6xU1B7mlwmu7V3pToKPgcWmlO0HcTpa68McNTGGiY8pO0/
+Rn1fXkqDYf8z0lPdWUWxbM1RAgMBAAGjggH6MIIB9jASBgNVHRMBAf8ECDAGAQH/
+AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYE
+FALWHm4Jq79YZacKPEgzYdHOfcNbMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn3
+8QpwPt5kMBgGA1UdEQQRMA+BDW1wZy1jYUBtcGcuZGUwgYgGA1UdHwSBgDB+MD2g
+O6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9j
+cmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2Jh
+bC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAz
+BggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9P
+Q1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDov
+L2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2Vy
+dC5jcnQwDQYJKoZIhvcNAQELBQADggEBAD/cd8LT8GRsriCROVmv9Ojss/K0uhma
+hZ17jQdZuPg4/1R9XYBdW3yym4ZIYWvb7YvdjngbXWIP5s/Kr3hSZH63dFzwV/8V
+6n7e56XKc9729bQduTnAs++YTxUUy05pFna47Nv9BCbiS5ETXUKZPMIJA01XwA7y
+XkFP+bRdmJRsFn8weKbjnOE1dm64tX6upfP1N8hWkGfsIwyO2N47STHrv0/VPlHh
+KxYdLWQ07qbE1p/IvQWymISQewLBjmO72gWB4ocGA2fTrD73wn29X4ZsR1Hn05xi
+6PLQ06HQOxGRrS9eED0UQoHYzf1F0a3o+zY6OnyNacCmd4VrYGdStBw=
+-----END CERTIFICATE-----
+
 subject= /C=PL/O=DOMENY.PL Ltd./OU=Controlled by COMODO exclusively for DOMENY.PL Ltd./OU=CertyfikatySSL.pl Security Dept./CN=DOMENY.PL EV Certification Authority
 serial=17172E90057689ADD4753893E85D4627
 -----BEGIN CERTIFICATE-----
@@ -20660,6 +21932,39 @@
 V7y+59F3zE4lfD0I/6BcW6/6BsoolmH3m2iFLre73kKHUUSKw9OJ+f6nzd1N
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=RWTH Aachen/CN=RWTH Aachen CA/emailAddress=ca@rwth-aachen.de
+serial=179060E1CC0093
+-----BEGIN CERTIFICATE-----
+MIIFOTCCBCGgAwIBAgIHF5Bg4cwAkzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU1
+M1oXDTE5MDcwOTIzNTkwMFowXjELMAkGA1UEBhMCREUxFDASBgNVBAoTC1JXVEgg
+QWFjaGVuMRcwFQYDVQQDEw5SV1RIIEFhY2hlbiBDQTEgMB4GCSqGSIb3DQEJARYR
+Y2FAcnd0aC1hYWNoZW4uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQC4MAhk48jcelLfNUI5kvMv+CF54xJnL4x/cJQnN2NId6CJ3fqs0siO2exIACfz
+djxOUpQ6ZFOn5pdTvTi7stnk8WAaP/d9LFd8k9Gbxjh7xh3L+0a3ac+/tHJcX564
+ntUxGtVGMuShEoUaZUT5fw97TL36UJ8OqXLrqpdAKcFKaJ+pgRp2gTLj4MNUMPjA
+4GlstpjoLnT++qFm7t/ZS92/E3OqNJUwHH6C35vSroVscmg+a7XxT6U4JO99MYxN
+cTIMzhPS9Ytp+302w7i51daBjr0hFGPK0nLSV6gv77zBSFJ7AVGJJxBSUzDn0xkD
+LYvZwqaeYkj8kDB2oSeRyfGjAgMBAAGjggH+MIIB+jASBgNVHRMBAf8ECDAGAQH/
+AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYE
+FG7VPsAcL3HJPL9JTu9qVUjs0fI4MB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn3
+8QpwPt5kMBwGA1UdEQQVMBOBEWNhQHJ3dGgtYWFjaGVuLmRlMIGIBgNVHR8EgYAw
+fjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9w
+dWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcow
+gccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2
+ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0
+dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9j
+YWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQBu4RMsIIzIOBrkrz5loQOmoZuH
+ekB7LGlYBiou7YTqjWOaAxUGL5xf2L9qo2QnxeFhWUnDIHsgTHtoJQmAgM/e/gwT
+v0u/x3zWAsgOGPPXKuLrJRrLIcwoWT9V9VzqZfbzga9s0Uo2s7wVxGnSexKAmzGG
+dIsYP7BBQWkAr6bFWLQmD2R8Cr5OTOHNBS//w2ZuWsvetM7HAOH4ECTYZtG4ZXP2
+u0jclErqjePssIkh09lb3ESeIZ+8avIqAXz0QVTNti3HYAPandLyq7PhR/PaWajJ
+Z6Hq30iq2w32zhFAghqTjJMPJCgU78MehKS5QdVCFfIr4xJA+O7sr1kh3eYu
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=Deutsche Telekom AG, Laboratories/CN=Deutsche Telekom AG, Laboratories CA - G01/emailAddress=hotline.laboratories@telekom.de
 serial=0ACEB1A1
 -----BEGIN CERTIFICATE-----
@@ -20926,38 +22231,72 @@
 BQ==
 -----END CERTIFICATE-----
 
-subject= /C=US/O=ORC PKI/CN=ORC Public Sub CA 1
-serial=528773FA5A429680BC9CB681D7130A70
+subject= /C=DE/O=Fachhochschule Suedwestfalen/CN=FH-SWF CA/emailAddress=pki@fh-swf.de
+serial=179060FF1169B3
 -----BEGIN CERTIFICATE-----
-MIIFPTCCBCWgAwIBAgIQUodz+lpCloC8nLaB1xMKcDANBgkqhkiG9w0BAQUFADA5
-MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHT1JDIFBLSTEYMBYGA1UEAxMPT1JDIFB1
-YmxpYyBDQSAxMB4XDTExMDEwMTAwMDAwMFoXDTE2MDEwMTAwMDAwMFowPTELMAkG
-A1UEBhMCVVMxEDAOBgNVBAoTB09SQyBQS0kxHDAaBgNVBAMTE09SQyBQdWJsaWMg
-U3ViIENBIDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDknuMHiFnV
-cWcf8XAA1m/owXtQpW9I4ZU75zZdCBF1bf+6ZTkxW+zzjlESkb6oShYn5+hoDWPP
-PNZZY9FvqkVZK+ylO2hAr48kAGSX2cy/ki1pRKu/ZM+eRzfTqLvS1G4s/c1IAX9W
-aKLAPejiFLKnVtDhaTATEHvjpXjfSrxHW/6IB0oJP9EhlOLwGhh4hwQONGibdFsN
-izLW9v9lAfWi7/+tjfU6XMB2fM9KJZr+QPDo/9cpSnBbeSEHLTejv5LH4VlyY+mZ
-XFHSTpWVimHtsCKHfFyGSI/KbHZmOMGQDYOL6tD8pvRDjmEupa7roMfRb+oWVS0u
-2lVzBgDoc4O/AgMBAAGjggI7MIICNzAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBT1
-R56FR4q2/pPynQpxdqCfoYnY9jCCAQYGCCsGAQUFBwEBBIH5MIH2MCsGCCsGAQUF
-BzABhh9odHRwOi8vb3JjcHVibGljY2ExLmV2YS5vcmMuY29tMD4GCCsGAQUFBzAC
-hjJodHRwOi8vY3JsLXNlcnZlci5vcmMuY29tL2NhQ2VydHMvT1JDUFVCTElDQ0Ex
-LnA3YzCBhgYIKwYBBQUHMAKGemxkYXA6Ly9vcmMtZHMub3JjLmNvbS9jbiUzZE9S
-QyUyMFBVQkxJQyUyMENBJTIwMSUyY28lM2RPUkMlMjBQS0klMmNjJTNkVVM/Y0FD
-ZXJ0aWZpY2F0ZTtiaW5hcnksY3Jvc3NDZXJ0aWZpY2F0ZVBhaXI7YmluYXJ5MB8G
-A1UdIwQYMBaAFA5kt/yYl8FItLYMXLp9gxHrh8tPMBYGA1UdIAQPMA0wCwYJKoZI
-hvcNBQYBMIG0BgNVHR8EgawwgakwNaAzoDGGL2h0dHA6Ly9jcmwtc2VydmVyLm9y
-Yy5jb20vQ1JMcy9PUkNQVUJMSUNDQTEuY3JsMHCgbqBshmpsZGFwOi8vb3JjLWRz
-Lm9yYy5jb20vY24lM2RPUkMlMjBQVUJMSUMlMjBDQSUyMDElMmNvJTNkT1JDJTIw
-UEtJJTJjYyUzZFVTP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q7YmluYXJ5MA4G
-A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEARh2kInRw1efUHKwVYi51
-s4CzKpKOK4TZFVDS+5bm7XMMdBLK17nuwyYpFd5cyPUmN/2nNr1+oldNKlPO6RWI
-PeYgbrwalJYL7ReiNdFg+UUQphWhiY2rSfpOuI0ycxJz6GdAZK/4cHeyp62Irrtv
-phBSWC1O1G/mbV0QP+oiDnrgMEpfge1vOKgqr4ZoVad7TIsipoQ7NeJQuvPL+pOa
-au1svAgLBsv/72XEl+RZQuYVEtOaR2gyUFtXjYt4pzVsiATOi6JvceqB43fSZ29n
-o1xzDAds9Y1IxMUWgCOBJJfE0hDbSx81DMDJ7W9bwxQI1TrcQZTBfmcDzL0CQtO7
-Zw==
+MIIFPTCCBCWgAwIBAgIHF5Bg/xFpszANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYy
+M1oXDTE5MDcwOTIzNTkwMFowZjELMAkGA1UEBhMCREUxJTAjBgNVBAoTHEZhY2ho
+b2Noc2NodWxlIFN1ZWR3ZXN0ZmFsZW4xEjAQBgNVBAMTCUZILVNXRiBDQTEcMBoG
+CSqGSIb3DQEJARYNcGtpQGZoLXN3Zi5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAKIBNVHMWBC4scFDiL+OY9TzZTDzcEOkDWEt5NxSJXTxNZf994IO
+Uj7HmjkBpJPwjvQvtIak9+IY+v/oFWnKFLKYOeftPRu/Ybo6vg10q4oeR8WfgUj5
+bsHGaFzhI2aqQtrW2vW35dLQaS6dcQZ5iYwvoVnny5gKcMYQrnsyXgvc6d1ydfRy
+HmPd5m9GHm1UYHG/rRu5MVKNvq9scp7icaCAXOYuxBaqmyZauBFHrqqxPTwtcZwZ
+dMcJTmeFzyxTP533VBwDLH5jVuzG4cRb94RgsN9Xlz791x2i5xV7q7bKyAB71Rhi
+IU1gE97lj9eGm/AE6yi+JPWPd6oZW1In8msCAwEAAaOCAfowggH2MBIGA1UdEwEB
+/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAd
+BgNVHQ4EFgQUqnxK8swST8VrJV7sW8005Eh59DMwHwYDVR0jBBgwFoAUSbfGz+g9
+H3/qRHsTKffxCnA+3mQwGAYDVR0RBBEwD4ENcGtpQGZoLXN3Zi5kZTCBiAYDVR0f
+BIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEB
+BIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1At
+U2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
+Z2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAC
+hjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNl
+cnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAgJRZc124x9uE/5Z4TNyc
+XTuerCMj7VTm9xX12vF4OCXTCP84kMmvEuMAsifxare3sK0otKP3UWUt05M5fBdM
+xfUkhhcXVmbmARaDFyaC2VORsFI9HE/hwClxaEi+DozNNSSaxLzj5gXsxzf05IkZ
+BEnOqE7p3qWfmbfXQrPwjfnJcH76j2NoczrOG35ZuQTwA6kmCrahRwNGgczBghm3
+jDi1TUP4OiRsJEv5pj6Q2ecOqYtIStDvAVkTXv8Yo2Qg6Dw5HTSE2LfsH5GsM9CO
+mL6TU7GE0ZfTyYBSGKm9rDg878Psq2IklJptUapW0Qy5cfL5Tzk55tNsv9HXMq7H
++A==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Hochschul-Informations-System GmbH/CN=HIS GmbH CA/emailAddress=ca@his.de
+serial=17AFF6CD63FC5F
+-----BEGIN CERTIFICATE-----
+MIIFPTCCBCWgAwIBAgIHF6/2zWP8XzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDU0
+OVoXDTE5MDcwOTIzNTkwMFowajELMAkGA1UEBhMCREUxKzApBgNVBAoTIkhvY2hz
+Y2h1bC1JbmZvcm1hdGlvbnMtU3lzdGVtIEdtYkgxFDASBgNVBAMTC0hJUyBHbWJI
+IENBMRgwFgYJKoZIhvcNAQkBFgljYUBoaXMuZGUwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQDFmFF7V/anE+J2KTv+v/OgopgqK1Pn95PMRWnEppcLVcqS
+hOh72mXhABXLAByVPFjFBKhMMO7cLcUTxj9ijiks2gv1yVvnZIoyXNVQPll2erGW
+1J/8gCy/6Vu31AuGZOlGIOear32K29YpVfuWq45VOtcQR6pmUEAZe4ABOTplQZlI
+46bKSDF0NEe2B6GnWNlnsH1xvG4PPzu73G2kT0dRMWsIxXUVpZPpLmR6wdTwde35
+agdIDD0WI3Ho8qE9Kf8F0906NqS0Wo8UgL2TyOFkqZ9ETEzheJAQ0dw/S9f+Jl0k
+HUlUw3Sn6iWNXsZcZruF9f60d61l2diSodH190mxAgMBAAGjggH2MIIB8jASBgNV
+HRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUd
+IAAwHQYDVR0OBBYEFDQ1RIpbjillgSC9rFUc8Ko4ZqXMMB8GA1UdIwQYMBaAFEm3
+xs/oPR9/6kR7Eyn38QpwPt5kMBQGA1UdEQQNMAuBCWNhQGhpcy5kZTCBiAYDVR0f
+BIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEB
+BIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1At
+U2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
+Z2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAC
+hjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNl
+cnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAAJG0N1/9yZQeIvRkEzDo
+H8ioZRcmaM4WZIW8+1gYbsJvbDW4ivl6D7J7Vt8QkZ7crcsZWzVq+1q2GNIvi4PQ
+1bXBT2/wAcUXvJscslumQzzbeds+swfSIqli2NumH6YrbH2dvD4upBskp4Kh9GhT
+Rbm8vHjT6GO6LnN3ZX96PX7AEl/xpqxRqai55LyMy9ven1A/0XDivoz4rOg+SSvR
+JAcjTJIAHqVJkKskwF23Qx+TXjzaXiD3o4Gjt1TOlcjXbXDP7vMhwNM5OEAOKAJq
+DCS2ABYg034XzZo5AvBlx9a43vcsvbuTlU7Zn04ck28hiKfdeZ1boc0k0YbLgn90
+Dg==
 -----END CERTIFICATE-----
 
 subject= /C=DE/ST=Berlin/L=Berlin/O=Freie Universitaet Berlin/OU=ZEDAT/CN=Freie Universitaet Berlin - FU-CA - G01/emailAddress=ca@FU-Berlin.DE
@@ -21266,6 +22605,74 @@
 I+X6
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Fachhochschule Koeln/CN=FH Koeln CA - G01/emailAddress=ca@fh-koeln.de
+serial=17AFF70A00A851
+-----BEGIN CERTIFICATE-----
+MIIFPzCCBCegAwIBAgIHF6/3CgCoUTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDY1
+MVoXDTE5MDcwOTIzNTkwMFowZzELMAkGA1UEBhMCREUxHTAbBgNVBAoTFEZhY2ho
+b2Noc2NodWxlIEtvZWxuMRowGAYDVQQDExFGSCBLb2VsbiBDQSAtIEcwMTEdMBsG
+CSqGSIb3DQEJARYOY2FAZmgta29lbG4uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDExRfvBM0SdCQzKa9pvYaIinBDsW2iyQKUI4wnMEFOE4u/QaIc
+3fC/HX005cD1TgF5EgsJ6mvVNL9F2sqaOOi4Ug8tEw3oUcVFoirKjHi6zJl3EGia
+p5k7VwVkdWATLWslIKcxjxs8vFj7g+sPyvw+RD3e3ewgv9RrgNQOgk9tTZbnzo7K
+xlq1gAxItGUN5Z0wK2xWFOPrBkG8fVlCFddI1b1/SHka6LoYwnhBgXDLL9/BS9X8
+XwnnaXG+a/cuHox9N9ggXsn6eWZUjeMDAfuS3q78js45mawcgqnGCX/4b7SHTHl5
+3TA/DrQQ93n9juDwtMyo/5Hr5aZiWoMQHwudAgMBAAGjggH7MIIB9zASBgNVHRMB
+Af8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAw
+HQYDVR0OBBYEFJsqmrqNDXyy4wURnxqXJTCaNL6gMB8GA1UdIwQYMBaAFEm3xs/o
+PR9/6kR7Eyn38QpwPt5kMBkGA1UdEQQSMBCBDmNhQGZoLWtvZWxuLmRlMIGIBgNV
+HR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9v
+dC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUH
+AQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NT
+UC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUH
+MAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Nh
+Y2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAwhMadAItqBK5DVZSK
+RAJ8ATuoCKg6ObQYOyxtOQkq8FGIEuDfX3VfhbFrR4pI5U6RJvjfX6lJgFQBToxK
+oNuP8eXBBiauODqdyyvp/bEwmUCtqCjz3Q6yHD6uXsnQeP/UjGqi3Toj56IRXlJH
+71skZ6Jjx9osaV9qLB82/5bWammMLlDXkd0gBk5XZqmNMi1yixXqG6Q/uRxdeEE/
+MQ6+Y5UtyeZvSV3hiCfnkcQ6a2WXUGqxQaePhMuU944HC0FgxQW1poOhS2ILgj6L
+U6MJpibpFJCaRgHXFKM3clHV1iSqDDgAHvFTsNi3XLPvFdh85bu0kvzxW22geGJj
+sPsD
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Hochschule Bochum/CN=HS Bochum CA - G01/emailAddress=ca@hs-bochum.de
+serial=17AFF71243C025
+-----BEGIN CERTIFICATE-----
+MIIFPzCCBCegAwIBAgIHF6/3EkPAJTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDY1
+OFoXDTE5MDcwOTIzNTkwMFowZjELMAkGA1UEBhMCREUxGjAYBgNVBAoTEUhvY2hz
+Y2h1bGUgQm9jaHVtMRswGQYDVQQDExJIUyBCb2NodW0gQ0EgLSBHMDExHjAcBgkq
+hkiG9w0BCQEWD2NhQGhzLWJvY2h1bS5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAK3ElM6+uVbzWgedjZ9q3oxxaMnWKiNm3kz/l8PXeKrRNi7Vjh7F
+9+8s2DSvo12MWOyPQ7BbKvTPW/YOv7laM0Li7RJTCs3jzGnF5Q16B/g68Br1Lmpl
+BaUrH8X2IGxJ+XfGwPAb7CIOAtVxXoUpAsViyaTW+kL769XSMnqvX/Yh+pCFEb2J
+BIS3qigy82Qpeko0Qa2ZWaQb3BKRW3qcUneNqULW6mzDNXayRfY8Cytlhiqd6p6L
+H1lYtR5aJiYbW/PLzjI3iaiXK/tXdSG/vpnlHVJbSv3JFesmZeVmx6xT+sPTez4Q
+5KmdTYemMyCIkcI8XsbJhKxj5pM/WEeokicCAwEAAaOCAfwwggH4MBIGA1UdEwEB
+/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAd
+BgNVHQ4EFgQUMJ+i8wyZVFuT+pMZl1hd8xgEw5swHwYDVR0jBBgwFoAUSbfGz+g9
+H3/qRHsTKffxCnA+3mQwGgYDVR0RBBMwEYEPY2FAaHMtYm9jaHVtLmRlMIGIBgNV
+HR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9v
+dC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUH
+AQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NT
+UC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUH
+MAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Nh
+Y2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQC5Cw04Y/F4BJlulEc2
+5tCZY8obtfaOwe7II+bbHf27qiDIlKEdyLxmmfwAUPo7YEY02RWoq5dvojg2sRwU
+MiI2tDd7gqXR2g7eKu2bfcE/KTYFAVfyTA6bgyJrJa+4brfTgjlKU6Y8o+Ud5qJy
+471HdD3OaAh+msC1oxenwmjd/L+jMPiGz52JBqmdO02vTHovfhnkekjfXq8NsAiQ
+HtLzR7LFvV7W6r3Nu1e+HJU0rxFTHwRYfXeYu9ywVF0ZOJMjkVJhH8TDs99pCJnz
+Ve7JYw5Nz9x2K283YgxhxNIX3VipVyGpWnkKBSr2kICA8ivH801yokLVDU85v12x
+Nn41
+-----END CERTIFICATE-----
+
 subject= /C=FR/ST=Calvados/L=Caen/O=TBS INTERNET/OU=Terms and Conditions: http://www.tbs-internet.com/CA/repository/OU=TBS INTERNET CA/CN=TBS X509 CA business
 serial=0E5073FFEFA245298B0DE5511D3FE100
 -----BEGIN CERTIFICATE-----
@@ -21436,6 +22843,40 @@
 KhT+Yw==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Technische Universitaet Berlin/CN=TUB-CA/emailAddress=ca@TU-Berlin.DE
+serial=17A4250C370ED7
+-----BEGIN CERTIFICATE-----
+MIIFQDCCBCigAwIBAgIHF6QlDDcO1zANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTU1
+NloXDTE5MDcwOTIzNTkwMFowZzELMAkGA1UEBhMCREUxJzAlBgNVBAoTHlRlY2hu
+aXNjaGUgVW5pdmVyc2l0YWV0IEJlcmxpbjEPMA0GA1UEAxMGVFVCLUNBMR4wHAYJ
+KoZIhvcNAQkBFg9jYUBUVS1CZXJsaW4uREUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQC4AxwkOaesxXoQK7x3BAtuxt1vEJXi6WpgSuwnD2GnKT3KebP7
+PKiy3tM/lN9ytWE6v4u1EEW5RgqM3Dz9B0Uk7hkyfbtt730sE+AG+S/aeAysyPjc
+YKfGV3mhvTrQL6sVRUVZj4Mx+bwg+RSqyqNJlWGi3S4XcbBwVCgU/R/uf2fnqrLb
+u1o2WcI06kwcnwqAh4uNz97JYTcX3gAx570cpv22pO22OcI6HHF5nHqZFbGZpWS4
+AzZFbTV5Tl9V/HFpCFIy49xhF6RKBQGaXEk1BzeX4qfhsGGtWCNgzw9uknQZja9p
+8xZ8W7GHIEuZOqgWYAMeSLKtNQy2IZY64UYxAgMBAAGjggH8MIIB+DASBgNVHRMB
+Af8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAw
+HQYDVR0OBBYEFCMyQp7+YkJO+07QF5t45+2KjD54MB8GA1UdIwQYMBaAFEm3xs/o
+PR9/6kR7Eyn38QpwPt5kMBoGA1UdEQQTMBGBD2NhQFRVLUJlcmxpbi5ERTCBiAYD
+VR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJv
+b3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5k
+Zm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUF
+BwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09D
+U1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUF
+BzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9j
+YWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEATwqf7vDqB6muBNS2
+cGR+VxR0IGDWMvYYrX1HIIK5wvSd+/LEBPDyMsDaVadLFYh6U3K5wTbeC7d7XFpP
+cIumj9Rvc2OuE5Tv03+YcsexNvPRjZ/7bVrCxQlfQMoRaKO1VOhIdeFuINfLotJI
+ug1Ygo/MezS0QGeOOtXUccDtOiFj4vXUqBpScw6l4Zpwig0+Dl0YhKhov0eTceGD
+FkoAS10YRRTKPn3uvJqkwdLB/5bbSV5affZFpZaf72wer1xY178OsntFm1FObJOo
+g664LjBzmAJjaJtjl9hjtWMSXvtj9gfFF8NR5ZyM7vgH+8QmAu29JTcXsPWAbnBR
+nl73Pw==
+-----END CERTIFICATE-----
+
 subject= /C=BR/ST=SP/L=Sao Paulo/O=Site Blindado S.A./OU=Controlled by COMODO exclusively for Site Blindado S.A./OU=Certifica\xC3\xA7\xC3\xA3o Digital/CN=SSL Blindado EV
 serial=5A993ED6F5258FCB604203CEB1F02336
 -----BEGIN CERTIFICATE-----
@@ -21538,6 +22979,40 @@
 xKjTmwc=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Thuenen-Institut/CN=Thuenen-Institut CA - G01/emailAddress=ca@ti.bund.de
+serial=177D94D5B4EA4D
+-----BEGIN CERTIFICATE-----
+MIIFQTCCBCmgAwIBAgIHF32U1bTqTTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDQyODA4NTQy
+OVoXDTE5MDcwOTAwMDAwMFowajELMAkGA1UEBhMCREUxGTAXBgNVBAoTEFRodWVu
+ZW4tSW5zdGl0dXQxIjAgBgNVBAMTGVRodWVuZW4tSW5zdGl0dXQgQ0EgLSBHMDEx
+HDAaBgkqhkiG9w0BCQEWDWNhQHRpLmJ1bmQuZGUwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQC1amJwf8LlWD4A/q3uoCSPkylDyGtMr/COw6SpJVnodtjv
+UMaVh4rmAQTyywvC0FqCn7Sc6bMjN2BuVUwGMfga1wtBkxzO2uxg2Wu891IBgV46
+5KoQhCwvyBj6bteuVOPBpzwedJ/I1pc3R/7j7TtCQPoLYeAPukacYWHZ+ECCXQYz
+NHqgorDlsz4iI5rF5OUlPni+to/dlBU9xvjdKfbZlS+5eHlwPpgWnqxW5mtxxDZF
+fm6b2MhB2Yd71OoxKufxe7KMZ3QsoVfsAnLermZEicplY/SHiscBzQWdZP7V3dio
+OP7Sx6Pz6oZ8WdyvBqBmcmjAYrH5A2ZUhv36iaIzAgMBAAGjggH6MIIB9jASBgNV
+HRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUd
+IAAwHQYDVR0OBBYEFMZ+gp7XivJ5Nw+oEROV/I0Tkps1MB8GA1UdIwQYMBaAFEm3
+xs/oPR9/6kR7Eyn38QpwPt5kMBgGA1UdEQQRMA+BDWNhQHRpLmJ1bmQuZGUwgYgG
+A1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2Eu
+ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEF
+BQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9P
+Q1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEF
+BQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAELhjOpAH+IBmUE0
+I1LdHxh/PtfY95sd/TSJkzBOXljUWK70YwVI6P795XdG1n8jFyn9sdz9wyZGs7bY
+XiBtq0D5WZMXTquORDkawDIdt6ojv8Haf9Pkt5tIR35vgsZPV3VuZtr3Q6d7nJdM
+6REzHi+y9dp1hT+HNZN6v31AXlcv+QyBCd341qAC30Mc5WEqHOYxbg22UHk8SdpG
+wqtQmua/oeWI7VHzqsUMJYXivdCeF+TxzR5UmYWYVYw8tp0ks7l09wPng/Q0O5Oq
+c8nxDTAF7eLevlbFWz+UjhWECGQYTNpxqauE7U6bUa/WQ+8BRWvha+cOPlgqAtYG
+J/JJlbk=
+-----END CERTIFICATE-----
+
 subject= /C=US/ST=New Jersey/L=Jersey City/O=OptimumSSL CA/CN=OptimumSSL CA
 serial=20FF9A1C9B68D49DB3E7D571B45EEEDE
 -----BEGIN CERTIFICATE-----
@@ -21708,6 +23183,176 @@
 TYzbyDZK
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Uni-Konstanz/CN=Uni-Konstanz CA-S001/emailAddress=ca@uni-konstanz.de
+serial=179060E0B33DAA
+-----BEGIN CERTIFICATE-----
+MIIFQjCCBCqgAwIBAgIHF5Bg4LM9qjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU1
+MloXDTE5MDcwOTIzNTkwMFowZjELMAkGA1UEBhMCREUxFTATBgNVBAoTDFVuaS1L
+b25zdGFuejEdMBsGA1UEAxMUVW5pLUtvbnN0YW56IENBLVMwMDExITAfBgkqhkiG
+9w0BCQEWEmNhQHVuaS1rb25zdGFuei5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAK/TtP3kiSNcIWSVW/0iM0nIrbvUs3So0XOEtQWxxqezriws5S95
+prDTGBAA3g33lYTorEdRNWYLAz0XNdBWxVAyE/5uVYcqSOaNQNJ4rc8sMLQDeltK
+vqCvkkuwKO+Co9gv+QKbI33QADc6azfYkthRROczGtF0WyPYXHEjW/CbccYJbZYY
+xAxze85DZZDVx/2BKnb4bPWfoh/fPKgESt5lYRUdfLzQj41NzsykzR5aL4829g10
+6lGq/I+qvClyegMTR69hFL3RlO/8k6mNKVJmn+Ecw+hQr0WNxyACjoChu6Rx3u72
+/FabfPa4tPAUxIozqsDpN0HnxteaKYrs3ysCAwEAAaOCAf8wggH7MBIGA1UdEwEB
+/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAd
+BgNVHQ4EFgQU2WJ0iheLXBYiYrwnDuPvGpyctUMwHwYDVR0jBBgwFoAUSbfGz+g9
+H3/qRHsTKffxCnA+3mQwHQYDVR0RBBYwFIESY2FAdW5pLWtvbnN0YW56LmRlMIGI
+BgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYB
+BQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUv
+T0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQDLaTMwvG2Gk6nR
+PCASRVa9NL38GE32S5hb2qIdXLA/lSQQO7lQsQhITVf0G+X1lQHBnWJYFyGxIDPN
+qX6tyATu9g0btBzN5fOfZZy5lFu6OS3nAH9BEfUjp/Qhp+icyRMq88GKmt069KOM
+nfJ9JetwEMwkIpFIwqp8O2pi9PJQhO4CeucoLZW2JMe7DyOJtj5mMwpuZKrGMEFU
+mhGzoVyeVH9Y7t0EiQiE3NkCvpx3MHFXUrH0Zv4Gs33/EGwpu4+IIWuaLqnLmTeO
+l1Kl9Sl5eZ31Oa7NGaJsWzD0vBosm0/HcTByB78U6X/KLEyT+hqdgj4QyvhsJBDB
+QmR+e0Jy
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Deutsches Klimarechenzentrum GmbH/CN=DKRZ CA - G02/emailAddress=pki@dkrz.de
+serial=179060ED96115A
+-----BEGIN CERTIFICATE-----
+MIIFQjCCBCqgAwIBAgIHF5Bg7ZYRWjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYw
+NVoXDTE5MDcwOTIzNTkwMFowbTELMAkGA1UEBhMCREUxKjAoBgNVBAoTIURldXRz
+Y2hlcyBLbGltYXJlY2hlbnplbnRydW0gR21iSDEWMBQGA1UEAxMNREtSWiBDQSAt
+IEcwMjEaMBgGCSqGSIb3DQEJARYLcGtpQGRrcnouZGUwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCqhnbMtlVx2/scupWN3EJJYUWc1C2wnH5KrT2EZxUS
+41fKjm/rwfXBtpsbODSoEEAIsO0MJg0KhhTx3c6WBIIArZqDF7xfZhY1IbJu4qIz
+sOQz67cLMF+6SOwLYvJO+W8lBFUVKa0ImVHLvSP6CGq1ySZD6sM4ZfYu9kyxkqx2
+gGz8ERUZL9x+/JUIa8fC2IGnIrpalgKBhZBE/8L5AaAP8W4SeZQ0s/Moy8kCbN8Y
+XiXConE+C8XvumN0XwVDEz4gf85To4FTv121Q+KV9lXWxVmqNyAxfwb2k8Q0SAvs
+6Ji1rWEKTqc9PR3yD8Q41l00nXj8QmzUELyWFAN32RwbAgMBAAGjggH4MIIB9DAS
+BgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYG
+BFUdIAAwHQYDVR0OBBYEFKsz6DojHTkuXuAFoglZKUgt7OY2MB8GA1UdIwQYMBaA
+FEm3xs/oPR9/6kR7Eyn38QpwPt5kMBYGA1UdEQQPMA2BC3BraUBka3J6LmRlMIGI
+BgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYB
+BQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUv
+T0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAVIfcnOPj+MBrZ
+g4EAoTmGux22h2QLFycMMxCG2MXYRrjLuwbLBWqG6AF2yNKQcTcSTGepUqONLIF7
+D/LxebAHdhFUbPTXwAbGxpIllBPSKw6tAB0N8jezp8OM+/yqUCSDhkXZzjYxJUR7
+Mz0eDKdBNU1SK/g4KlMHZhZc2ElMldbiT4fUqGF66KaizALRsaDMyiv0/xhwc1jd
+L0k6k5oeQ5chtm4mmr1KP7e5w2ahyMeLR43tCXDiR7/W7nNUtEMB8t+xMnAo6vgd
+0Vb35y8C4oialrIb0G2D8TCQ0n3qw5PiYJQDINzkLLdUXfCg0BjKOjmAr/ElxCA7
+8nS0e/mF
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Universitaet Siegen/OU=Zentrum fuer Informations- und Medientechnologie/CN=Uni-Siegen CA - G02
+serial=179060FEE5D9AA
+-----BEGIN CERTIFICATE-----
+MIIFQjCCBCqgAwIBAgIHF5Bg/uXZqjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYy
+MloXDTE5MDcwOTIzNTkwMFowgYQxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNVbml2
+ZXJzaXRhZXQgU2llZ2VuMTkwNwYDVQQLEzBaZW50cnVtIGZ1ZXIgSW5mb3JtYXRp
+b25zLSB1bmQgTWVkaWVudGVjaG5vbG9naWUxHDAaBgNVBAMTE1VuaS1TaWVnZW4g
+Q0EgLSBHMDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJmuk9sK0+
+i1bfCcBW7a28OAKybBBSUJPg4GJNZvuCSpBOZnPNbJn6kZ/mXmQIcWE8SAlB09D6
+CXV2apxn5BEGJH0YIkj5oOBh/Rst9H01stn4tQ49CgPNWiPTJceA+SdG2B5p81IC
+u/z4EIlPXg6d2fW6APAjw6qaPQjhm0+Aa4ZptVXsosjHE6TtUnYTome4II/wsCvb
+SpConLS+iMYbDhCM8BflWq6S6pqEZfmMOsuzJGoud+Un0cc0ncuIFRW8fL7i0ai9
+vBcNdDPwXPsprFg+kY6ZXHZjY7ktAUaZpm2RKSHkytmnjct2nZ1J37jSC9WJp9ub
+SObcksG3VwV9AgMBAAGjggHgMIIB3DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
+DwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFP90wmk68ISf
+nAKTzZ+e993/AcVlMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMIGI
+BgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYB
+BQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUv
+T0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQCuOZsMy218iEzH
+uSGvMhuBQS5vVndAgZJX+bTfkeNinR+pIPUa1KB8Y0KNZ9McWyaURj83Sybk3nIM
+pjv+B3UbHsCe01NLRXHuFFNyxum0vVK6piVf5llr1NavzHRMgUYl5VjgjYq1NYuN
+aqzQpGesuHGBydl66XPbfqJA7Mfha2eH8AZ7VsPwhOGHqiSPj8UCern837EYJLwt
+nD3/btlXUnqFCbMFswu/z/hvTDGJ0i7vt08bF10180k3uSs8LLtOLpRMCZqoEmmb
+TxhyqO4+52TfmNetRROn3YJhKChQLF/TRKi0e/f42HTX67Zw++F78Y6j6apcRyBy
+ZtMawmda
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Hochschule Ostwestfalen-Lippe/CN=HS OWL CA - G01/emailAddress=ca@hs-owl.de
+serial=17A424B991D00C
+-----BEGIN CERTIFICATE-----
+MIIFQjCCBCqgAwIBAgIHF6QkuZHQDDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTQz
+M1oXDTE5MDcwOTIzNTkwMFowbDELMAkGA1UEBhMCREUxJjAkBgNVBAoTHUhvY2hz
+Y2h1bGUgT3N0d2VzdGZhbGVuLUxpcHBlMRgwFgYDVQQDEw9IUyBPV0wgQ0EgLSBH
+MDExGzAZBgkqhkiG9w0BCQEWDGNhQGhzLW93bC5kZTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAKSYADEMUdbU3B3MLXZ/PE82BdBYqaX4ca86psvkTKcJ
+RB+KP8iMKt8Co4zTkc+AVBKVTHjbtB9tpDCcKadshoH0xvtI6UvtZ2I41HSf+iIB
+Rv9LFSICKbGtf/KgG5oZbXeaWs/+R2dekfnfeOx3aAQGwCfJCpEX0/25to8Z7cz/
+/rLNxnrn1SodqhlUlBCRpdTkhmlB5S/jdrYYXvVVzBIMgt1esEGG8SC56hGAV8Gk
+3CBJnR2/3gsJfM1wQTXGSLBv/CA2QGY7XUPERMcbze2zOZy/b3dZFroKUi0t+VSM
+l9LqkMK6SHMiPksbomlqj279uJkoRBRpVVW2sFK3xUMCAwEAAaOCAfkwggH1MBIG
+A1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYE
+VR0gADAdBgNVHQ4EFgQUSo3gv9jjKdDBL9xQQE26p8d7yX8wHwYDVR0jBBgwFoAU
+SbfGz+g9H3/qRHsTKffxCnA+3mQwFwYDVR0RBBAwDoEMY2FAaHMtb3dsLmRlMIGI
+BgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYB
+BQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUv
+T0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAMeQyMT2TXYDTJ
+UwOigFkZphE9SW9Ozj6kqBPJKdAzJkYMxbtW3KxfwxHH/LDpZBiJfk4ShIshRGgM
+3JyXPKL+OgdpV869DOMescBaEI0pcmo9LCR9EcJgsDxKGA4RK9cAYeoDYRmA4uwd
+YPjZJeeE6HopOLcdlmwWm9bMaBG82Qw4JL+Qi30v2QnBUjZGSQY4h2XBIvpJncrn
+f57BhbAvaY/TpO+c3A3E4mFXdGQmo0cSKsv4iiiY+wLshj1McBaJYcNbFqgFLRuA
+d5UVEjF1bfiujtrrl+hcv5878D7hvp/uCLrEgjf39EFA0H2tNtBROT9L8bNuwU0C
+tF2jXHvP
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Humboldt-Universitaet zu Berlin/CN=HU-CA/emailAddress=pki@hu-berlin.de
+serial=17A424EB3D0CD7
+-----BEGIN CERTIFICATE-----
+MIIFQjCCBCqgAwIBAgIHF6Qk6z0M1zANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTUy
+M1oXDTE5MDcwOTIzNTkwMFowaDELMAkGA1UEBhMCREUxKDAmBgNVBAoTH0h1bWJv
+bGR0LVVuaXZlcnNpdGFldCB6dSBCZXJsaW4xDjAMBgNVBAMTBUhVLUNBMR8wHQYJ
+KoZIhvcNAQkBFhBwa2lAaHUtYmVybGluLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA6wxB17AojABvR7rEkR8v3wfquJ1RAGBx9Bhv0pQis98kCJaa
+YYO1cspc0znfEAOcBk9lBhb/sWfV13KFKDcib7WlY1sFBHCJAbGkpcNTfqp/enTt
+DZOzXFUzXOj5+lcaHwn6qt2HQ7oafm8wfPp9efd3ykRzCWhbZ7K3o/kCCMHw5Dxe
+9na4OdQCXqwp6Hhpmx9CGHq2SPWxrRZqdZJzmfhmDV3yVYghIuyHN/jDTorshki3
+pWF3OFHpok1w09LKPDUZRdHZzUt7ZIZYEwdvjVAKJAsHyKjzrASRfHJgXvJQLENc
+BJwPGXfJGMSXj3AcS9CjwQdtMlyDsU4D5RV4BQIDAQABo4IB/TCCAfkwEgYDVR0T
+AQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAA
+MB0GA1UdDgQWBBQf9Sw+90CrLpCgatPieV7yds2DdDAfBgNVHSMEGDAWgBRJt8bP
+6D0ff+pEexMp9/EKcD7eZDAbBgNVHREEFDASgRBwa2lAaHUtYmVybGluLmRlMIGI
+BgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYB
+BQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUv
+T0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQCqEy8UFl/6yI7t
+/KGZVC2hsSpjaW++0bDCNwG/r3nzmdUCmyQdhwGtoCRUmiv4Dqikl8jhNFeyYG2V
+oWpOkE8CNPOlKuusxOCNqvCrh/4jAwJepvtEROrZpKxcvhDCoY2Opo9DycakGq8y
+0R9wuMRTadxBLomYSjdZkocAnDVDMlclhlPxVcA1zhtc6tQNI5YwGiWbVQebeEoI
+J6X1vfb9B1OWMi1DAICZQQNZJnk9pxaUnbHs4MG7/Lr46/oAm8hij0D3jmBtZ+FW
+D/+u7DHBgJywIBOi6tqH8ZnOhoi472HOXovhjbMH+GfUMly4g6nMSinWroNnND10
+9ulDkJeP
+-----END CERTIFICATE-----
+
 subject= /C=FR/ST=Calvados/L=Caen/O=TBS INTERNET/OU=Terms and Conditions: http://www.tbs-internet.com/CA/repository/OU=TBS INTERNET CA/CN=TBS X509 CA business
 serial=7BB4AE8A6E9B0E8314321D9B58F2CE31
 -----BEGIN CERTIFICATE-----
@@ -21742,40 +23387,6 @@
 UxTOIXSE
 -----END CERTIFICATE-----
 
-subject= /C=DE/ST=Bayern/L=Ingolstadt/O=Fachhochschule Ingolstadt/OU=Rechenzentrum/CN=FH Ingolstadt CA - G01/emailAddress=pki@fh-ingolstadt.de
-serial=09E6B573
------BEGIN CERTIFICATE-----
-MIIFQzCCBCugAwIBAgIECea1czANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
-RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
-AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MDIwNTEzNTc1N1oX
-DTE5MDIwNDAwMDAwMFowgbUxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4x
-EzARBgNVBAcTCkluZ29sc3RhZHQxIjAgBgNVBAoTGUZhY2hob2Noc2NodWxlIElu
-Z29sc3RhZHQxFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xHzAdBgNVBAMTFkZIIElu
-Z29sc3RhZHQgQ0EgLSBHMDExIzAhBgkqhkiG9w0BCQEWFHBraUBmaC1pbmdvbHN0
-YWR0LmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzIF5ylwoaqeo
-r/3qi4rZquDbmTK6OhsasBXmoX86m4nV+BLZsl1t+r7kA3hVBzJuCkoilpg2iHNJ
-6GQTFI5pMsGNhuyEvXffpIuy9IjKRKcl40wu4SzoWEInn6QipJxyvzSw8BJMRQKD
-3wbRbtcMcUqmbebM8VqwVKa9ghPRzx1ieY0+2UaSEGzKBy8oRFYbn6KpXQqbNWSS
-diAhVm3/a1iw374tE/vT4s28fAwzX0DFVX33+62zuRoU7tHASAjqYLA6mb9KUHMn
-9aHPzwGpMGPzFTQwHXsJfbesCfwxBp06lJvy00CdTawU/JEgGz3B6jbhOwdZ1hyq
-RBLVNgTqEwIDAQABo4IBszCCAa8wDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMC
-AQYwHQYDVR0OBBYEFKl8kv9Pr8YwW79igJLrWkTZhy63MB8GA1UdIwQYMBaAFEm3
-xs/oPR9/6kR7Eyn38QpwPt5kMB8GA1UdEQQYMBaBFHBraUBmaC1pbmdvbHN0YWR0
-LmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9n
-bG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2Nk
-cDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB
-ogYIKwYBBQUHAQEEgZUwgZIwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5k
-Zm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsG
-AQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1
-Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAQEAXA84bvsddwnx
-+moCm6iSk7CSCmMpQtgBsgfPDE2DnAhzq8GDcY0ShdEkrjOP9ErUwQleK09SMMzN
-SKq0krYT91VaniPTWV5FIfLFyDtLBOFQ8TAM7pAxq03hBL8kns17AqqhIbsOIUz1
-sWrwW9uM4LhYQzuy3qwfCXQt0nbySvrbM/yi7RpHulz2GwcfynZ2wdFDzt8bNoN/
-YPg0+aSuwy9TwIwxyP0q6of8saBjNRIfjG+D4Fh3CnB1UEp56QRT4hoEhWdSBcTT
-4wxkpSsU1q6ZgTxlF6HohAE5GVsQ2utbTTeJ101fLwvFz8pJ1ptvHhXirhtnqS3c
-567OSruYMA==
------END CERTIFICATE-----
-
 subject= /C=DE/ST=Nordrhein-Westfalen/L=Bochum/O=Ruhr-Universitaet Bochum/CN=Ruhr-Universitaet Bochum CA/emailAddress=rubca@ruhr-uni-bochum.de
 serial=0A7D0B8E
 -----BEGIN CERTIFICATE-----
@@ -21810,40 +23421,6 @@
 UPW/v+bxGQ==
 -----END CERTIFICATE-----
 
-subject= /C=DE/ST=Berlin/L=Berlin/O=Technische Fachhochschule Berlin/OU=Hochschulrechenzentrum/CN=TFH Berlin CA/emailAddress=pki@tfh-berlin.de
-serial=0B467300
------BEGIN CERTIFICATE-----
-MIIFQzCCBCugAwIBAgIEC0ZzADANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
-RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
-AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MTAzMDA5MTIxOFoX
-DTE5MDYzMDAwMDAwMFowgbUxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCZXJsaW4x
-DzANBgNVBAcTBkJlcmxpbjEpMCcGA1UEChMgVGVjaG5pc2NoZSBGYWNoaG9jaHNj
-aHVsZSBCZXJsaW4xHzAdBgNVBAsTFkhvY2hzY2h1bHJlY2hlbnplbnRydW0xFjAU
-BgNVBAMTDVRGSCBCZXJsaW4gQ0ExIDAeBgkqhkiG9w0BCQEWEXBraUB0ZmgtYmVy
-bGluLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArZgnPGeRUyv5
-GJw1bAfpCYMN5Yi5jPy7oWpWb5YGFFhcoly6NdQEDuae2BN5fyPChgrj7AGHdsWc
-PcTYwYILqZkYCtoB4QRdHBvVqQEYwdRJ/2dA22PsOc5xqZzlTZdPlNAHZIss6j85
-oFOny4rKEUVSUW0y8DbgBiOJHP9gYrAvTYrcL/lLvEJSI7BwrCyfG8sGrAm2oF9a
-kMa7pjlpgiZFYpGQux1xDLWgvaAXXFE7v7fimLg73ENvem2CswYq2pwi7aE6QFQy
-dXQttTSltd73rSqVQF3x0I/9TW4W+3P2C5dl2lLsqLJSpf1SFRSn2AMVv/INchYs
-lQZFm9udbQIDAQABo4IBszCCAa8wEgYDVR0TAQH/BAgwBgEB/wIBATALBgNVHQ8E
-BAMCAQYwHQYDVR0OBBYEFOWPf+BJlE4HU+5CVQprTCZX7EYsMB8GA1UdIwQYMBaA
-FEm3xs/oPR9/6kR7Eyn38QpwPt5kMBwGA1UdEQQVMBOBEXBraUB0ZmgtYmVybGlu
-LmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9n
-bG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2Nk
-cDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB
-ogYIKwYBBQUHAQEEgZUwgZIwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5k
-Zm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsG
-AQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1
-Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAQEAeaEe97Quxr/n
-+CjEaXJPMcHwts50nKWXi3au+OagetKtoEegS1p723ODt+t6NzrA2N1FRVs+a0jh
-3wOV3kF85DtDYXGCKSQkeCbMwwDvYM1HdkmqiCNmx5VhUTg9ibW4KYukOIDfoBZ3
-eHwkx6fKBmDRugEjb3onz2Po9qJ5gwVoaB2jd/Lmr60YKqdPR1OQ+qBlu3u7Y1Dz
-qFp988E74z2wOK+3Bc9oBQhJ43U9RQbm47f5cZejDy1faCPva+bixbeBDJBMFNG1
-yrbJwwZu1NCzbDh2adyn1WbVlwFn7hi4wEFKyF6yBWZFXu3Dk+e0xGHxG8xzb23s
-zduEDZ+/kw==
------END CERTIFICATE-----
-
 subject= /C=DE/O=Georg-Simon-Ohm-Hochschule f. angewandte Wissenschaften FH Nbg/OU=Rechenzentrum/CN=Ohm CA - G01/emailAddress=HS-PKI@ohm-hochschule.de
 serial=0BCA51FB
 -----BEGIN CERTIFICATE-----
@@ -22082,6 +23659,40 @@
 ddo+kGdNivk=
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Schleswig-Holstein/L=Heide/O=Fachhochschule Westkueste/OU=EDV Abteilung/CN=FH-Westkueste CA/emailAddress=ca@fh-westkueste.de
+serial=0F9DE6C3
+-----BEGIN CERTIFICATE-----
+MIIFRTCCBC2gAwIBAgIED53mwzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
+RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
+AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTEwMDIxOTEwMzQyOFoX
+DTE5MDYzMDAwMDAwMFowgbUxCzAJBgNVBAYTAkRFMRswGQYDVQQIExJTY2hsZXN3
+aWctSG9sc3RlaW4xDjAMBgNVBAcTBUhlaWRlMSIwIAYDVQQKExlGYWNoaG9jaHNj
+aHVsZSBXZXN0a3Vlc3RlMRYwFAYDVQQLEw1FRFYgQWJ0ZWlsdW5nMRkwFwYDVQQD
+ExBGSC1XZXN0a3Vlc3RlIENBMSIwIAYJKoZIhvcNAQkBFhNjYUBmaC13ZXN0a3Vl
+c3RlLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsFJf09qC7jsh
+DGr188l9Vg0GQkRmTy7Q4aZrdNNOLXGkRsCqFviz7D3xcLnl7bO2sWtht8CX601v
+EJEdACRpf7tVVrfPJKetgyCUk6UAouP9uFkv4urPVEVDkPc70BOWX6Ti4VzjsvF+
+Jj/BtFfwCsdUedbIE4vMyz+135T/o9tJQjs4pqTKJNJ8wj9S7QrGCpEfVCBF70MQ
+m04sxsyexZyZ1PqGILjRNrvuDcQGCGT68Gu55owEH7gRt0fnTgZpIfd6N9448Y8a
+YdtqqQ8v+vFfCjR4rRKeW1WJWkYrcBmmrfxKXdJXGTgzOgNt+lu5czm6VqvdLvs3
+gtYno/2lDwIDAQABo4IBtTCCAbEwEgYDVR0TAQH/BAgwBgEB/wIBATALBgNVHQ8E
+BAMCAQYwHQYDVR0OBBYEFAOiVN+KFMWeTZl42Vrxr4YDeBtzMB8GA1UdIwQYMBaA
+FEm3xs/oPR9/6kR7Eyn38QpwPt5kMB4GA1UdEQQXMBWBE2NhQGZoLXdlc3RrdWVz
+dGUuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRl
+L2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8v
+Y2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3Js
+MIGiBggrBgEFBQcBAQSBlTCBkjBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYI
+KwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQA00n3R9e0C
+XJ4XbG06GkRf7lqXMfUeT4tJK9Mcp9gcuSbXwvgbAXs9Z3BXmD5uG+/VavK5TCOY
+nU9wm7NZ4ugY7lQeu+LZn2NMryTsh0Ge7cb5Z/1gTBnlMt+Idf0WF3mfKZNoVR66
+1LScjNKwvsimC+M+quq4Jrn1sslMsw/A52GP5YALcu+hCDLjR2i2DZ/+4yaxYcSr
+qAW+Hqc2q6Td73UmxaB/RMJeUEf3tqw3qtm2DVBgRqcomzDFeAJDNCicXhdZM29B
+jVnEAiD054d3M6RE6W18oDcqpNrN5AHBkCzG0WqboCrwkMTr7dZuXQhsnjVYzUub
+EefcFIgoRBiW
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Bayern/L=Muenchen/O=Fraunhofer/OU=Fraunhofer Corporate PKI/CN=Fraunhofer Service CA - G01/emailAddress=pki@fraunhofer.de
 serial=13C33F11E20125
 -----BEGIN CERTIFICATE-----
@@ -22116,6 +23727,40 @@
 7NTkC7BZse1I
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Hochschule Bremen/CN=Hochschule Bremen CA 1/emailAddress=pki@hs-bremen.de
+serial=17AFF6A98E2669
+-----BEGIN CERTIFICATE-----
+MIIFRTCCBC2gAwIBAgIHF6/2qY4maTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUx
+NFoXDTE5MDcwOTIzNTkwMFowazELMAkGA1UEBhMCREUxGjAYBgNVBAoTEUhvY2hz
+Y2h1bGUgQnJlbWVuMR8wHQYDVQQDExZIb2Noc2NodWxlIEJyZW1lbiBDQSAxMR8w
+HQYJKoZIhvcNAQkBFhBwa2lAaHMtYnJlbWVuLmRlMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAwJmwrji0ce6Rtpj/8VISjhyIQ3a9ZcLYzUihTdn9tpWb
+vBAGmGtmxjY2UA/qRqL3LrX6tkQCzb+mhJFqNeWHm0y4/CgElCgMiEo6LwO+UNHH
+h8YL1j0unIkoU9J83Zt4zFnd+oiJG4KwG56SLWAJCo81AvAL0pt7oRSDvonNCzjS
+ayWggWJeCSOVlidXgiQQwGVBUPmM5ShBF252JMvT+9ljXS+x3MN35WSuzTy8Y80g
+1D2N0l7pdd3b6/rLB3T7wFNkv99DhWFCGRxQwtZAswOdZIjfStmM3CoeXcU2CeBq
+CqfxdNotbq5uel0Rj+eJk81IiXnoDu+Cdcy+mABFlQIDAQABo4IB/TCCAfkwEgYD
+VR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRV
+HSAAMB0GA1UdDgQWBBQodhX9ujUTxke+F3Ef/nTDwe3UBjAfBgNVHSMEGDAWgBRJ
+t8bP6D0ff+pEexMp9/EKcD7eZDAbBgNVHREEFDASgRBwa2lAaHMtYnJlbWVuLmRl
+MIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIu
+cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYI
+KwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4u
+ZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYI
+KwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQBiOPwX1P4r
+xqfHW3qVeaYp/jKrB0divxkS/beBXwM3v+bUh6I3n0uSi39EK68I3NeVVnuco5uu
+/xPnm/1jAjSsbHxBhqqTrRNPaSfk/Ej5194fxR+UN2jtj6TMWsg/eiDRNvMD1IxG
++68waMOOSmYxiu5OsEuymg2S+dkBBs+tLL1PwwI3mbJVpB1swFfytDM/Zoir7hXd
+Trd6UWuuHR0JTJ8vPdqdi9NHP/GhRP8+afiwaZq8/S+0byULTT2hrYGQN59C/qrW
+SYyZEOQGDZsz7cXqv+xWJtQohe0+7IvM9m+Blj2mxGZQauSPgrDaFYU4Hi1rbyak
+1W5R3Zr/zc4v
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Bayern/L=Coburg/O=Hochschule fuer angewandte Wissenschaften Fachhochschule Coburg/CN=FH-Coburg CA/emailAddress=fhc-pki@fh-coburg.de
 serial=0A581BB2
 -----BEGIN CERTIFICATE-----
@@ -22456,6 +24101,40 @@
 A+1rAZAwUsuDQT2o
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Medizinische Hochschule Hannover/CN=MHH CA/emailAddress=pki@mh-hannover.de
+serial=17AFF69A20799F
+-----BEGIN CERTIFICATE-----
+MIIFSDCCBDCgAwIBAgIHF6/2miB5nzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDQ1
+OFoXDTE5MDcwOTIzNTkwMFowbDELMAkGA1UEBhMCREUxKTAnBgNVBAoTIE1lZGl6
+aW5pc2NoZSBIb2Noc2NodWxlIEhhbm5vdmVyMQ8wDQYDVQQDEwZNSEggQ0ExITAf
+BgkqhkiG9w0BCQEWEnBraUBtaC1oYW5ub3Zlci5kZTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAMkAHWWEN4gDBoEdWQtN5dplyqmVkHFGYMf90KhQLjnu
+s0OWDIhWWGJ3Fom23A19maYcgbfaJZp2sAQfrfHSroA5Vcp7B3jKMdHhsoghmNjk
+4R9VN06c/qk9uOnZAJ6lsXDHdkaaRjUBa+IFSMcrfFFvYIync+hvwJBc+etU06tC
+W8NjzLPzvc7gqh1/1KyLocpQ/gnLa2xJpOaLpfhNKfAP7sn1dOvjCfbAGnGfDO2K
+N9KiDdsLfxtPGkwbtWfm0EQIQabJPzBvXU8q/PjO4tFwQ2pLzg8Kmxekrjkqepum
+NnoUMyij6SZrVCXPEP9EGsm2aZ71vPFbk7NOojdkJW0CAwEAAaOCAf8wggH7MBIG
+A1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYE
+VR0gADAdBgNVHQ4EFgQUJZuBmmj89gJMu3dfHExoM7NuRmswHwYDVR0jBBgwFoAU
+SbfGz+g9H3/qRHsTKffxCnA+3mQwHQYDVR0RBBYwFIEScGtpQG1oLWhhbm5vdmVy
+LmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2Nk
+cDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB
+1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5k
+Zm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEu
+cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQw
+RwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQCQqtCK
+HXNXFuBrTkvXmh7cbtZiqfH0Vc3o/75XISVE95w/VSAgJWMQ8QBzNL+v/1d6uAgp
+VYmgIIo2/r51y6e+ARMnXD8homb+nSw9HauEiZp4jaWESy8WCKw1fs7K3uP2JsZy
+C2y5eza4EuMAOdPE4Db51YNUKfhDwFuFl1HXh2VQ7SxB21S6+y+WDj2HPXOXjHXc
+voW2OlMFTb/Z0iLMwMK1Ksk3+AQG0749/Q1Y/3IULMIbr4k03h1E5qG9rkduH4vv
+8xIN+FBbwDvXPP/IAw4vsXxMewH/UNmAkeq+HBl+3cwmIqkIsrrQIHEHg8gCl+WU
+ncpOPRCSsLlP8OKc
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Niedersachsen/L=Hannover/O=Fachhochschule Hannover/OU=Rechenzentrum/CN=Fachhochschule Hannover CA/emailAddress=pki@fh-hannover.de
 serial=0AB6F504
 -----BEGIN CERTIFICATE-----
@@ -22626,40 +24305,6 @@
 tvrTZXlTRH6Q9az+iQ==
 -----END CERTIFICATE-----
 
-subject= /C=DE/ST=Nordrhein-Westfalen/L=Hamm/O=Hochschule Hamm-Lippstadt/CN=Hochschule Hamm-Lippstadt CA - G01
-serial=143B3E63DB3757
------BEGIN CERTIFICATE-----
-MIIFSTCCBDGgAwIBAgIHFDs+Y9s3VzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
-EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
-A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTEyMDgwMzEyMTUx
-NloXDTE5MDYzMDAwMDAwMFowgYsxCzAJBgNVBAYTAkRFMRwwGgYDVQQIExNOb3Jk
-cmhlaW4tV2VzdGZhbGVuMQ0wCwYDVQQHEwRIYW1tMSIwIAYDVQQKExlIb2Noc2No
-dWxlIEhhbW0tTGlwcHN0YWR0MSswKQYDVQQDEyJIb2Noc2NodWxlIEhhbW0tTGlw
-cHN0YWR0IENBIC0gRzAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-4LmuICcyWUQlL/SbrMl+9kyt1wqzy3Ipy8ylF9+iYsg79sAwNeE0rwr/zWc50nwl
-u4f6elV5kahKwM1uY9FaNYzFdBWda4SgfPN4bq5yxOx45as/c4bFNpzZrCxPM8gP
-2qBz3yzdOPR5GVNmS4/iPLgClKTb+pYHOYBS2R1/EKTdL/CSaJM+XUfFsC/fQ3D9
-bT4Z+a95elKx9e0as8XgyZyJiK/aBNiowHuNwJRSpy2zfQAMzUfwdPvehSrJK7nY
-7O6yXCtr5adWjs3NERXSzsU/1+z8IZa4gDzF8V9btWORh1v940Ql2utSJ9QFJYqr
-5/TNeTACBjQXkudGAneofQIDAQABo4IB4DCCAdwwEgYDVR0TAQH/BAgwBgEB/wIB
-ATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBR+
-3H1eRWlqjO8FynUGsgc8VS5RETAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EK
-cD7eZDCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
-Z2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9j
-ZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmww
-gdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2Eu
-ZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAx
-LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0
-MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290
-LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAQEAq+gB
-ub65rVCmMCJHFgOzent6Jp9KnL72M4eeDS2AhezBhCgaxYBoGS/kn5QZYf+uz8h3
-JkPBU7zYLNTzOY0fwkb1dK4x8ZwyIr+/F1recTr9S1CHx4xW2zFj1oIBCjl6Acog
-gPE2a2R31BZSwbb8m9LMkKKiakFPB65TSBNqL0dpycFwTbDpK9QDH3LDk9DcDtiw
-t9VQ8OmN1JRKSRiKYCe8ffAQN/KHHxM729p0HsXqwAagy2rKiiqyA1fY+zzVNpSr
-1+wh5F+JMorgCdV0fvAmukr0l6JGSQ3bJHLbiagmKd0ftiiMk43m6MHw5MbDQ4Hv
-u8BH2toye1I7PMB4lw==
------END CERTIFICATE-----
-
 subject= /C=DE/O=Max Rubner-Institut/CN=Max Rubner-Institut CA - G01/emailAddress=ca@mri.bund.de
 serial=16D0F429C8288A
 -----BEGIN CERTIFICATE-----
@@ -22694,6 +24339,176 @@
 XWL9pEOhCqIUtaKKSw==
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Nordrhein-Westfalen/L=Hamm/O=Hochschule Hamm-Lippstadt/CN=Hochschule Hamm-Lippstadt CA - G01
+serial=17887D0BD014C7
+-----BEGIN CERTIFICATE-----
+MIIFSTCCBDGgAwIBAgIHF4h9C9AUxzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUwNjE1Mjc1
+NVoXDTE5MDcwOTIzNTkwMFowgYsxCzAJBgNVBAYTAkRFMRwwGgYDVQQIExNOb3Jk
+cmhlaW4tV2VzdGZhbGVuMQ0wCwYDVQQHEwRIYW1tMSIwIAYDVQQKExlIb2Noc2No
+dWxlIEhhbW0tTGlwcHN0YWR0MSswKQYDVQQDEyJIb2Noc2NodWxlIEhhbW0tTGlw
+cHN0YWR0IENBIC0gRzAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+4LmuICcyWUQlL/SbrMl+9kyt1wqzy3Ipy8ylF9+iYsg79sAwNeE0rwr/zWc50nwl
+u4f6elV5kahKwM1uY9FaNYzFdBWda4SgfPN4bq5yxOx45as/c4bFNpzZrCxPM8gP
+2qBz3yzdOPR5GVNmS4/iPLgClKTb+pYHOYBS2R1/EKTdL/CSaJM+XUfFsC/fQ3D9
+bT4Z+a95elKx9e0as8XgyZyJiK/aBNiowHuNwJRSpy2zfQAMzUfwdPvehSrJK7nY
+7O6yXCtr5adWjs3NERXSzsU/1+z8IZa4gDzF8V9btWORh1v940Ql2utSJ9QFJYqr
+5/TNeTACBjQXkudGAneofQIDAQABo4IB4DCCAdwwEgYDVR0TAQH/BAgwBgEB/wIB
+ATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBR+
+3H1eRWlqjO8FynUGsgc8VS5RETAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EK
+cD7eZDCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
+Z2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9j
+ZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmww
+gdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2Eu
+ZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAx
+LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0
+MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAoqv2
+vZUxSNSgp2rD3ujXN+hJu0k70fQ9GJcGMpzOxx+jGItr6hMfx8mpK4xAs4WVC4z7
+3ooWnTXdnjwHzftEeV8IOH3bIKQfIPSuQYDys/pdW0Y1narlzjqHv7ABsHG5oSYS
+VXF6ywsXrf8PEkC0ZiC+iy5oPjPrtFKnN2SwCwvcoztrZLou161AbptskzftT2rf
+AIjvV23jocohfv8QlcdkG/iOwslI69LlxT3yXARl+0sHmEK4lZkrW2Sh6o/PHpZd
+kDbhU8e+ofDeRvzwmaD3roJWHeWPZlfHqz2Wyz2r2ynR5glqDCMnN9Vpzso2iLjt
+xl9eK2itaQzTEgSYOw==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Universitaet Wuerzburg/CN=UNIWUE-CA - G01/emailAddress=ca@uni-wuerzburg.de
+serial=179060F3098F03
+-----BEGIN CERTIFICATE-----
+MIIFSTCCBDGgAwIBAgIHF5Bg8wmPAzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYx
+MVoXDTE5MDcwOTIzNTkwMFowbDELMAkGA1UEBhMCREUxHzAdBgNVBAoTFlVuaXZl
+cnNpdGFldCBXdWVyemJ1cmcxGDAWBgNVBAMTD1VOSVdVRS1DQSAtIEcwMTEiMCAG
+CSqGSIb3DQEJARYTY2FAdW5pLXd1ZXJ6YnVyZy5kZTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBALhjNWskDXys/1P4PX/pdsEA73CqsHHsCC7COUSmMCbt
+Uyk0DMVa7dQvlaL1WpPz9Mj7uwn9kiuyyYRouUVwlkI4MM11WPzj+emNr67DGvKw
+dCiuNTlue/jKwBgihJ/WrDZ119cmd3PqpYHfrhEley99iTutDePMv+WIDO0sOQPs
+P4wxwlpMJuLCYyUfljfz1DMnTvUPjQzuq2R0o7Bdli7WxdZIKLovGseNlJk2937Y
+btSw0aQ3WJqYcfRzIXJ76RZfeoZS20SOI4O0mndCWoyx6LJkAIaN9nqIHDvihhRT
+hZ5w5ZvXBDfQNKz3iQykf9Mue8iKTpmfvtlysKKFkpMCAwEAAaOCAgAwggH8MBIG
+A1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYE
+VR0gADAdBgNVHQ4EFgQUfR+oQPam9jJOgeX4MgvDbSvEM24wHwYDVR0jBBgwFoAU
+SbfGz+g9H3/qRHsTKffxCnA+3mQwHgYDVR0RBBcwFYETY2FAdW5pLXd1ZXJ6YnVy
+Zy5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
+Z2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9j
+ZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmww
+gdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2Eu
+ZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAx
+LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0
+MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAFtMw
+XxEkNqZE4xasGWDfaJIrAU/niAT2BADr8uWGAfqQHskMEWsXQkckKC1THSaoWete
+ZqJRtlhcp1M/KLboU4/IXwNyuUsjD0bpIqzDWElBzSKY9Y9XB3sFld35csKDzGXQ
+Kww5PQ8rgmZU59DmYbkYPt3uD1TEk3iB+CcNMW7IhlXUermMxZXbVFL2CTbqttm6
+1SMHf539Fx2phkqpS1Igf3i3efkPza43FX63SgoPJolkkMUs3y7V/q4RpTUtHV+W
+kliL73U8Nv2WHaRMvNFEHofzlezQoAbJA1UBHyqugfK7Z7UbMyd9ZbJ0zCXvv/eh
+cJAkTkBdmVsMDn1yZA==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Max Rubner-Institut/CN=Max Rubner-Institut CA - G01/emailAddress=ca@mri.bund.de
+serial=17AFF71FD7DDCA
+-----BEGIN CERTIFICATE-----
+MIIFSTCCBDGgAwIBAgIHF6/3H9fdyjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDcx
+MVoXDTE5MDcwOTIzNTkwMFowcTELMAkGA1UEBhMCREUxHDAaBgNVBAoTE01heCBS
+dWJuZXItSW5zdGl0dXQxJTAjBgNVBAMTHE1heCBSdWJuZXItSW5zdGl0dXQgQ0Eg
+LSBHMDExHTAbBgkqhkiG9w0BCQEWDmNhQG1yaS5idW5kLmRlMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw1LFbu/5gJaToGqyJKG5fQh//pbGEEpMoNmx
+G41hVxKAEdNpKWtaRfoWFT8YLrAp8J0sQwXlrFGyTNVzPRUeDHvVTCVvTA1+oTui
+7aiLlIR8GTLqTBZ8oqGfmEY0GuQSrWUxyWOZf6AapB5jc13BFVN3pVfz3ylilLNu
+CBhVI1ek9tUjeBb0jydxZkyIH6S82b0JplPf0/SKKNltgiFrynVWXfJ87IzLIrNF
+s8FTHhDL1RE7rSOIKplSVrAUKot3z/KjYPVluvEap1sfXv+tetToUveCwieNe9du
+yYeLEqZCwSLzPDDJPukIBb3wRnEr+ufrCY861bh3vEGLn4n8XwIDAQABo4IB+zCC
+AfcwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAow
+CDAGBgRVHSAAMB0GA1UdDgQWBBRH3rPKrIxXE+Lu6ck+qduS2fkJmTAfBgNVHSME
+GDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAZBgNVHREEEjAQgQ5jYUBtcmkuYnVu
+ZC5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
+Z2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9j
+ZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmww
+gdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2Eu
+ZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAx
+LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0
+MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAym7m
+w6zeTZQju16Lc3hTK8xJ55c2X0GXuBZzTKCx6OCTrgYu2u/piWFHPYkDHPUEgcZT
+OLGH+NVhfR//ZAaepaWpKRhATMTVRWAor//O/a8zfOJHUs385y1//y8LAOr8N7Sa
+Wtb9A3qj5uBVBPelOAvu2Nsw8lukLYpbVP587eTyn5/WbIQ+0rVqaUdcBy5EeVer
+etCr0qBUZ2/IWBV01vsvtRVaBROlSK2SgeXGxuHttH4WLmuYEEwQMxWdkEsf3Ojh
+ldtgHE1aFPYnR7msQo2EuUE50zciIcnBlv1DAf/rSNIIuqUtY2ekja9CG3cfMwgt
+8SwvZQLlP9Ec3bP9RQ==
+-----END CERTIFICATE-----
+
+subject= /C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Extended Validation SHA256 SSL CA
+serial=09B749FD7F0B4916CA055656CFF6D982
+-----BEGIN CERTIFICATE-----
+MIIFSTCCBDGgAwIBAgIQCbdJ/X8LSRbKBVZWz/bZgjANBgkqhkiG9w0BAQsFADCB
+vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
+ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0xMzA0MDkwMDAwMDBaFw0yMzA0MDgyMzU5NTlaMIGKMQswCQYDVQQGEwJVUzEd
+MBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVj
+IFRydXN0IE5ldHdvcmsxOzA5BgNVBAMTMlN5bWFudGVjIENsYXNzIDMgRXh0ZW5k
+ZWQgVmFsaWRhdGlvbiBTSEEyNTYgU1NMIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAwUo5gP1SVSC5FK9OwhPfSgNKsGXFaGaKJJxyi63peok7gyXs
+LFcSKSb3qHD0Y+AGVTyD8cPxY0sypzk9D/exa/G+Xxua5KoXZUbBpue3YXWKmCYZ
+HqcPo8eypoUnOQR0G8YHFiqSqOjpm8RaIIoby0YJUeSi5CGDM9UnyXvbqOF2hljp
+4b0TV2vgGq9xA7MV8EQB5WFk9fIRmVLs7ej1PRNrISfCxgPA8g/VWH/17yql/yjq
+jeWOdt8sZmSbNb9j/Z9KSJ8whT7VsvH+yESoWC6gnWC9Cs7BJQgcTfK0w+tcOLfY
+1JslzuMzFs/JL8wocPpjdNXExxEVpZnyKSLABQIDAQABo4IBdDCCAXAwNwYIKwYB
+BQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC53cy5zeW1hbnRlYy5j
+b20wEgYDVR0TAQH/BAgwBgEB/wIBADBlBgNVHSAEXjBcMFoGBFUdIAAwUjAmBggr
+BgEFBQcCARYaaHR0cDovL3d3dy5zeW1hdXRoLmNvbS9jcHMwKAYIKwYBBQUHAgIw
+HBoaaHR0cDovL3d3dy5zeW1hdXRoLmNvbS9ycGEwPgYDVR0fBDcwNTAzoDGgL4Yt
+aHR0cDovL2NybC53cy5zeW1hbnRlYy5jb20vdW5pdmVyc2FsLXJvb3QuY3JsMA4G
+A1UdDwEB/wQEAwIBBjAqBgNVHREEIzAhpB8wHTEbMBkGA1UEAxMSVmVyaVNpZ25N
+UEtJLTItMzcyMB0GA1UdDgQWBBSybePkFA+MPHNCplqZGtMUdbaG2zAfBgNVHSME
+GDAWgBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEAdJ3d
+mGjc+GgcDYkNvwlH3cWvtjX7EqazxfQGSbmJcnB0fKn1cxQh6wAW9VOsKBq0salx
+V6wBS/SYJMULRSKRRtL+1rYIRPMbgwUcFMBo34qHylbm72/zlBO0W4VPrVe68Ow7
+gOeiAV+7ZYUARJc0uNiuIW+Xva9zHMVw3Mb3x2sgh6oEYmnI9sPzpHSPG1VPKrsH
+NUZlCdqof2NXVfDrn0kVlVeqf8tER1EAWVaDHUCRLdgd0l9x7ibBbkUNxU0SP7+R
+5TYnB2qysmYrhf8nQaKSs8pOAY371fbh5FTWa8ySae7kOY6dNM4Us/CAauNW7mW0
+zB9UpGiJBN2YLL3Pow==
+-----END CERTIFICATE-----
+
+subject= /C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server SHA256 SSL CA
+serial=69879419D9E36270749DBBE59DC6685E
+-----BEGIN CERTIFICATE-----
+MIIFSTCCBDGgAwIBAgIQaYeUGdnjYnB0nbvlncZoXjANBgkqhkiG9w0BAQsFADCB
+vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
+ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0xMzA0MDkwMDAwMDBaFw0yMzA0MDgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEd
+MBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVj
+IFRydXN0IE5ldHdvcmsxNTAzBgNVBAMTLFN5bWFudGVjIENsYXNzIDMgU2VjdXJl
+IFNlcnZlciBTSEEyNTYgU1NMIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvjgWUYuA2+oOTezoP1zEfKJd7TuvpdaeEDUs48XlqN6Mhhcm5t4LUUos
+0PvRFFpy98nduIMcxkaMMSWRDlkXo9ATjJLBr4FUTrxiAp6qpxpX2MqmmXpwVk+Y
+By5LltBMOVO5YS87dnyOBZ6ZRNEDVHcpK1YqqmHkhC8SFTy914roCR5W8bUUrIqE
+zq54omAKU34TTBpAcA5SWf9aaC5MRhM7OQmCeAI1SSAIgrOxbIkPbh41JbAsJIPj
+xVAsukaQRYcNcv9dETjFkXbFLPsFKoKVoVlj49AmWM1nVjq633zS0jvY3hp6d+QM
+jAvrK8IisL1Vutm5VdEiesYCTj/DNQIDAQABo4IBejCCAXYwEgYDVR0TAQH/BAgw
+BgEB/wIBADA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY3JsLndzLnN5bWFudGVj
+LmNvbS91bml2ZXJzYWwtcm9vdC5jcmwwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUF
+BwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3Aud3Muc3ltYW50ZWMuY29t
+MGsGA1UdIARkMGIwYAYKYIZIAYb4RQEHNjBSMCYGCCsGAQUFBwIBFhpodHRwOi8v
+d3d3LnN5bWF1dGguY29tL2NwczAoBggrBgEFBQcCAjAcGhpodHRwOi8vd3d3LnN5
+bWF1dGguY29tL3JwYTAqBgNVHREEIzAhpB8wHTEbMBkGA1UEAxMSVmVyaVNpZ25N
+UEtJLTItMzczMB0GA1UdDgQWBBTbYiD7fQKJfNI7b8fkMmwFUh2tsTAfBgNVHSME
+GDAWgBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEAGcyV
+4i97SdBIkFP0B7EgRDVwFNVENzHv73DRLUzpLbBTkQFMVOd9m9o6/7fLFK0wD2ka
+KvC8zTXrSNy5h/3PsVr2Bdo8ZOYr5txzXprYDJvSl7Po+oeVU+GZrYjo+rwJTaLE
+ahsoOy3DIRXuFPqdmBDrnz7mJCRfehwFu5oxI1h5TOxtGBlNUR8IYb2RBQxanCb8
+C6UgJb9qGyv3AglyaYMyFMNgW379mjL6tJUOGvk7CaRUR5oMzjKv0SHMf9IG72AO
+Ym9vgRoXncjLKMziX24serTLR3x0aHtIcQKcIwnzWq5fQi5fK1ktUojljQuzqGH5
+S5tV1tqxkju/w5v5LA==
+-----END CERTIFICATE-----
+
 subject= /C=PT/O=SCEE/CN=ECRaizEstado
 serial=072721A1
 -----BEGIN CERTIFICATE-----
@@ -22898,6 +24713,40 @@
 4Q1HtbSn2tXev4YkyVw=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Duale Hochschule Baden-Wuerttemberg/CN=DHBW CA - G01/emailAddress=pki@dhbw-vs.de
+serial=17AFF6D0362BDA
+-----BEGIN CERTIFICATE-----
+MIIFSjCCBDKgAwIBAgIHF6/20DYr2jANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDU1
+MloXDTE5MDcwOTIzNTkwMFowcjELMAkGA1UEBhMCREUxLDAqBgNVBAoTI0R1YWxl
+IEhvY2hzY2h1bGUgQmFkZW4tV3VlcnR0ZW1iZXJnMRYwFAYDVQQDEw1ESEJXIENB
+IC0gRzAxMR0wGwYJKoZIhvcNAQkBFg5wa2lAZGhidy12cy5kZTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBALtoqHrbNRjuRdIh20VPATXIitkVgIva+HcA
+Q7qA87lsm6v28DSasCPgx+TnGoUduGucA7fA7UhtWGqmU5cbJ5Ucsra0XBwqbOEN
+u7GIBVcK7vUac67Ny+9TEqB/mtKz4nU/G8TlpX5hotMDg4H46SvtIvtSz1RJ2BVs
+ssssubz3zI/W5Y6qqfRhZGLzrqmZYYlfCc/sn0jOkElgomAzzt4rmKRq8CsX3bYJ
+ImeUaEHXU5QgTEZLgA9olse54r6N2O+cM4y/eDK9q9RaWdjNKTDsRq/sILlgUIaO
+XcxzBa3pOhQ7zRb5amGiTIxWb2Szzy+Ka1XO9BseTFCcot8BAO8CAwEAAaOCAfsw
+ggH3MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQK
+MAgwBgYEVR0gADAdBgNVHQ4EFgQUjOlwcWC4U59ExpdeQh/tKHK9Dn4wHwYDVR0j
+BBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwGQYDVR0RBBIwEIEOcGtpQGRoYnct
+dnMuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRl
+L2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8v
+Y2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3Js
+MIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNh
+LmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2Rw
+MS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy
+dDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9v
+dC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAMS9
+5ypdDi/q3AeBOfzj3A3PZaQaLumKxvVeA2xy8j8XtwWpPeG99QwtqeKlJ3+OCuwT
+eRtkWxnsm0eonLYI2rSL8y94LUoM0kj4GiHbRqL4eqPJKCwoQeTWxkeW/2fmZPtn
+u9zBDAWFDgMtK9iiIOzp9FlNljHKJH1EdaWJD/Gv/5+ElNZpFDZ/oz/kosyvLeWZ
+EiA3U8/LDPFPlxe+gVqmr7+tzo88/C6i3NZSaUJ3qkaWSxx+xx/sNXoHX22msHwN
+SqnBQinCotrRO3WgZVDvhN3/eHZ8Zj7z6re7x/qlIGsKDVGxidWjGQDF2jp8O5Rp
+uD3s1d70097Es++KwAg=
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=T-Systems International GmbH/OU=T-Systems Trust Center/CN=Shared Business CA 3
 serial=03810F39E00CB4
 -----BEGIN CERTIFICATE-----
@@ -23034,6 +24883,40 @@
 K/Q6+mDnSpxOtV3tkpjzhQ==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Technische Universitaet Ilmenau/CN=TU Ilmenau CA/emailAddress=pki@tu-ilmenau.de
+serial=17AFF6A5C9609C
+-----BEGIN CERTIFICATE-----
+MIIFTDCCBDSgAwIBAgIHF6/2pclgnDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUw
+OVoXDTE5MDcwOTIzNTkwMFowcTELMAkGA1UEBhMCREUxKDAmBgNVBAoTH1RlY2hu
+aXNjaGUgVW5pdmVyc2l0YWV0IElsbWVuYXUxFjAUBgNVBAMTDVRVIElsbWVuYXUg
+Q0ExIDAeBgkqhkiG9w0BCQEWEXBraUB0dS1pbG1lbmF1LmRlMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4DvX94YAwIBxEyUA8mzYsQvbmi4m8DDQacsx
+if8y0ofo7Ps6lqoL8N2OOoXIwEYBQzRvVnOUskOvILcC9ViHP8pRSsNlyBQufpaX
+RDISuBqmuav7hAd5aPCLJNqbQHj3H6dqMBuot7N9TGyLqTjiSSVn6S+lhQxqV7Sd
+ZWRSJ3EQXU0bukaW/Pfry2tV16xuqKkE6UBVlFgbZDYnDIUX3piNYBh0646rDBbS
+od+kOL6yjXAo6FG99lHreAMP/Zk9iIuHaMFyzpkNWAvAttZ8dmH4qBI25YVoi2Ks
+yEyeo3KMGTFUpnWRFhZPJp+6rdnnG1526CQ7zyZ63MZCowvxzQIDAQABo4IB/jCC
+AfowEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAow
+CDAGBgRVHSAAMB0GA1UdDgQWBBTUw0USiqnrTaXKVn9p0cJodGP9ATAfBgNVHSME
+GDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAcBgNVHREEFTATgRFwa2lAdHUtaWxt
+ZW5hdS5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6
+Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5j
+cmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5w
+Y2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9j
+ZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQu
+Y3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEA
+l/pytylYXf5cIuj4x7GPledpYP1DNnAVQ+T5FPLolNFQGKnkoYRREveCqTH1Cqr1
+ZRwnGIUbIJ4t7OdnbIBYQPy1Inbqiwwt2WiVw4scz1pmAiqosmDMIh+D1sIprcaf
+dISPKDgqrc5Zj6FOI7JsMSAUMznupBM91VUDhEvMuYUxaODldlOTQ5Jae/qMa088
+ofSix8q9BXNr+ywTraFUmHrmyugv16hkQyy7+2srPieQvox919PSxl2TOwU6AAJt
+aL5gEvZ6oJ3k5Wyajd1Im3yAsQWsWtw47iH6cxins5XfHDTVsncG4U2LBXTJfKY5
+b4aXuQY0sGmttxpLC6DBNA==
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Baden-Wuerttemberg/L=Heidelberg/O=Paedagogische Hochschule Heidelberg/OU=IfDI/CN=PH Heidelberg CA/emailAddress=pki@ph-heidelberg.de
 serial=0F47129B
 -----BEGIN CERTIFICATE-----
@@ -23102,6 +24985,74 @@
 0bAwfSlmMssRBHU4GFNsb6c=
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Berlin/L=Berlin/O=Deutsches Archaeologisches Institut/OU=IT/CN=Deutsches Archaeologisches Institut - CA G01/emailAddress=pkica@dainst.de
+serial=0FB5F6E1
+-----BEGIN CERTIFICATE-----
+MIIFTTCCBDWgAwIBAgIED7X24TANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
+RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
+AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTEwMDMwOTE2MzczN1oX
+DTE5MDYzMDAwMDAwMFowgcExCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCZXJsaW4x
+DzANBgNVBAcTBkJlcmxpbjEsMCoGA1UEChMjRGV1dHNjaGVzIEFyY2hhZW9sb2dp
+c2NoZXMgSW5zdGl0dXQxCzAJBgNVBAsTAklUMTUwMwYDVQQDEyxEZXV0c2NoZXMg
+QXJjaGFlb2xvZ2lzY2hlcyBJbnN0aXR1dCAtIENBIEcwMTEeMBwGCSqGSIb3DQEJ
+ARYPcGtpY2FAZGFpbnN0LmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAt9hMD7832wndUl3J+Osylpfz4gKWr4joHjywfRwvaGqYuEwBjmoA65BRoJKx
+7sJDRiFiT/YDAcLQ7AJXBqr1AWiaLFhgKwME67+t2reZNsTxVlvtemDEYnX6Fu0C
+27LsDyLqAXSUiYpB8tmTxbTduchrLJbbbfOsHPniYOmRd3d0CO4wWvhLk061ruTg
+kxPEK64prK2OfFgsWJ3EqrLGFfpSnD/0uqPqFObLDriXCnhqkV2znNND9Rs4iyXJ
+Cef8bzzcZ5XxQmBw2++hEp42AcKiUUq9OH+DINEZUWfXMX/wjNmWuiuSN0x6w74j
+QNhfiwdDETzdzC437EgDa5F8zwIDAQABo4IBsTCCAa0wEgYDVR0TAQH/BAgwBgEB
+/wIBATALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFLAiqmag3uins2PpSO7RY90DAXXu
+MB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMBoGA1UdEQQTMBGBD3Br
+aWNhQGRhaW5zdC5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBj
+YS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmG
+N2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9j
+YWNybC5jcmwwgaIGCCsGAQUFBwEBBIGVMIGSMEcGCCsGAQUFBzAChjtodHRwOi8v
+Y2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0
+LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQEFBQADggEB
+AEhTik/0ELpspqDqZkuAK66DlerZ95Vx1BN6/EXE8S640yVJ5xcyp+7AlnjzbiVt
+oFl/+ak0a3keV9X1DE+HK5L/V6Ub4PRY9APXwOgpTC7UTexpcFvq7f4jY8SJaKCh
+WnaddC4AgY1Rr905RQLcPhQseE9FY5Iw/KcNZs7UpPYGsPKVJXImDVz9MId2TKy8
+UgZNzmhiZoIgwUckqShHLEluAw3E5UcFu5B4cjr2IQs58C7Gxk7lKsq+mfT0OCVN
+Nz2MDwqSNMzeHOoDnUyucG7TmPCSA+vgI+RpT2It1xVz53zk0kTCs1IpGmA2nZ77
+FgSKz85qUtzG15GRk7hObkk=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Julius Kuehn-Institut/CN=Julius Kuehn-Institut CA - G01/emailAddress=ca@jki.bund.de
+serial=177D94D8B79C1F
+-----BEGIN CERTIFICATE-----
+MIIFTTCCBDWgAwIBAgIHF32U2LecHzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDQyODA4NTQz
+M1oXDTE5MDcwOTAwMDAwMFowdTELMAkGA1UEBhMCREUxHjAcBgNVBAoTFUp1bGl1
+cyBLdWVobi1JbnN0aXR1dDEnMCUGA1UEAxMeSnVsaXVzIEt1ZWhuLUluc3RpdHV0
+IENBIC0gRzAxMR0wGwYJKoZIhvcNAQkBFg5jYUBqa2kuYnVuZC5kZTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMpnd5CP/ujL1UQECq/08/kfeDjIIhHE
+WbkyCZ9c2WpqyuhnvSxYovd0g9QuuBI7DI3If5IFYeVwSCtTPGvRYj0vNVEad5j/
+kg1UpPszN1Z2XBlbP9b/Kp46cmU6QuTudMx46ufij/UOeUXy9iPuyCMNLVt0uyUb
+nw3M0c8ZEZIjLnpu+PNfQ66TMB0QZbI7C9bxG8CfLEHu5Ef/xaLvgT+/zYq0b3BX
+flucwjpcO4+l5g99aWpvCHx9nKbautcgnFfvSU/jokCN/Qd+YyXtK/OyXXJwMlWK
+ipELJiUXfAv6QWIrJup/D2UtFlyHmS+v012LB5Hjr5VW2EQ0oiGrydMCAwEAAaOC
+AfswggH3MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1Ud
+IAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQUcM/Yw8bDgH0/h1udf149wDrxAakwHwYD
+VR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwGQYDVR0RBBIwEIEOY2FAamtp
+LmJ1bmQuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRw
+Oi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fjcmwu
+Y3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3Au
+cGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8v
+Y2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0
+LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEB
+AOWbBSrg6nO1iBIwUO8ExcTA1VP1fVlymP3XfrbY3lsFszYEO4CmZ7l1KXMzDuJB
+Frz+NnWzDoa/kWveK7dUhMaOxlYOFRheZaT6+IF33jtmVkaJPyeJSLd4rkG8k3u7
+p4V6A4TGZRMplDqqDc8KsdAefb/TM8uq09/G6nit/mWn8jrEn9WEFo+nCS8Z5uoz
+2M9VMKhnorpDfkG64MQ4AuiMVaeIEGGv/BwSqu/jHdsFmT54pVRpyvnPXzYwX1eO
+A5ilR/M7lUjT+1QiDqyIaFXWdBSTaWlDwxN7gaBCxp3EFqpBYOIHYASlKhVAZIGK
+Hq3Ik+We9J/blRF14REFxAk=
+-----END CERTIFICATE-----
+
 subject= /C=BM/O=QuoVadis Limited/OU=www.quovadisglobal.com/CN=QuoVadis Global SSL ICA
 serial=057A
 -----BEGIN CERTIFICATE-----
@@ -23442,38 +25393,38 @@
 dmjL0aBZPlkW61W5BgN1wg9ESBdS
 -----END CERTIFICATE-----
 
-subject= /C=DE/L=Potsdam-Babelsberg/O=Hochschule fuer Film und Fernsehen Konrad Wolf/CN=Hochschule fuer Film und Fernsehen Konrad Wolf CA/emailAddress=pki@hff-potsdam.de
-serial=0F110D6D
+subject= /C=DE/O=Hochschule fuer Wirtschaft und Umwelt Nuertingen-Geislingen/CN=HfWU/emailAddress=ca@hfwu.de
+serial=17A425389CB255
 -----BEGIN CERTIFICATE-----
-MIIFUTCCBDmgAwIBAgIEDxENbTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
-RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
-AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA5MTEwNDE0Mjk1MFoX
-DTE5MDYzMDAwMDAwMFowgcIxCzAJBgNVBAYTAkRFMRswGQYDVQQHExJQb3RzZGFt
-LUJhYmVsc2JlcmcxNzA1BgNVBAoTLkhvY2hzY2h1bGUgZnVlciBGaWxtIHVuZCBG
-ZXJuc2VoZW4gS29ucmFkIFdvbGYxOjA4BgNVBAMTMUhvY2hzY2h1bGUgZnVlciBG
-aWxtIHVuZCBGZXJuc2VoZW4gS29ucmFkIFdvbGYgQ0ExITAfBgkqhkiG9w0BCQEW
-EnBraUBoZmYtcG90c2RhbS5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBALT6k6qCQc1QW+V68BWKt4pF3xQk480KMk/r5LPbO7tfWZ7gq/Vwyq6jsPPb
-u83BC5qxgZwy0kVsi9PF1zyXaDAkUp4mtXaKZNaR2T4kdEoYtNe6xyQTFUH1/6QY
-AmcpGOtLoDrENMsBzUa4UEvUhy2g70IIn42fRvALXxk4R+mN+Pu85mHTwwmtu2x0
-TpuHEpS8oZeKAWLVGgaPM/LsWtrUZsohReUg9AiRrMTyGlt+53SByfnZrHTMXdLm
-pw3X8gnX7hJMHsTwLHKkztruemIygpDprEqCfPonfhWjjeP00HcYJgihfJLDjw+M
-QlkV9cOwxGhDcNkWDZuvcQGv9IMCAwEAAaOCAbQwggGwMBIGA1UdEwEB/wQIMAYB
-Af8CAQEwCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQ/UHMKSVYygDRDj6up90EnXAhm
-8zAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAdBgNVHREEFjAUgRJw
-a2lAaGZmLXBvdHNkYW0uZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2Rw
-MS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2g
-O6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9j
-cmwvY2FjcmwuY3JsMIGiBggrBgEFBQcBAQSBlTCBkjBHBggrBgEFBQcwAoY7aHR0
+MIIFUTCCBDmgAwIBAgIHF6QlOJyyVTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTY0
+MFoXDTE5MDcwOTIzNTkwMFowfTELMAkGA1UEBhMCREUxRDBCBgNVBAoTO0hvY2hz
+Y2h1bGUgZnVlciBXaXJ0c2NoYWZ0IHVuZCBVbXdlbHQgTnVlcnRpbmdlbi1HZWlz
+bGluZ2VuMQ0wCwYDVQQDEwRIZldVMRkwFwYJKoZIhvcNAQkBFgpjYUBoZnd1LmRl
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvc4buIpJ03F6kFt4+Gps
+Yxp1K1mm7iYEEbAdqO+TS0K+vFydIUKqOBaitFJeZMODL9keSVbrJdhMuY/NjzdY
+OvrLU7lnqldu1tdUuZ5qSC4hwEDySo57I8LUja2Ncb8YOisMAmzFa9U7Zi+6WE3N
+NiCwZGs9zv8eKg74xs15e+9aC8qTcJn9OvvLkoaeg5rN2MdU3Gc2NpleOP/ShshY
+cnZKlRpRc+LX4nYE6BVUa2a3u7eOfzDwx0hsWA6fqyNVTqOjjGw2taYW4tjtwWNx
+ZtTrkyCBN8qCOfkLGL5Euz4S+MDNmOY1W74+jlfdadWiTdDeZszRKdu6056nLSkt
+BQIDAQABo4IB9zCCAfMwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMC
+AQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBQ6lWltGddajmmDrWZX2Wqn
+inO8azAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAVBgNVHREEDjAM
+gQpjYUBoZnd1LmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3
+aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2Nh
+Y3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9v
+Y3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0
 cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2Nh
 Y2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xv
-YmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBBQUA
-A4IBAQCLQ+NXXeWLVefq6FkpiCDtJ0yCfMCB+ty07rA7Yh+Ded0t6SzTzYwgRPq5
-jUEGEdo9vMRWKOM+gUMWcul8hSOKf7aO0jRsMKkUAvVwpMrD9bmRCdB5JGErZ2Jt
-b48vQsWl68wR3gYWPAEQWArfbScBcKgFS2gr/1gHGFgLp3SdYgy5oSXFyw/p8kWU
-m6MLnRsvDoPFx8twomnB0dxBl435A+sVWqelTHMpOJW0zob1GeislU9VxjPhXgvi
-WtnpQqvpgBmslvZOQF5HhCuuEMixjvga1sNAfx19jo5ARddJgfbwaEp0kenAHMR4
-yaObwEJegxbnDMkn/2VMvvA/SSVe
+YmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUA
+A4IBAQDVJJypL90Hh7NT3NL13o3MOdPyP7EmEclw/zwPdve2jWD705REyhhJEoNd
+dNiOpreV5Pt+RE/gEIGu7dPcvtQyu8gPqBpdmZOAXZ9e2/0VtFcwUXHQljXI0GbC
+Lc0ICuYGYM6E5lg2BOOuUqI6m3lVBUxeOGzPbHJn8qYBznN2gUK15ZG71irLEsyD
+1uRTertjAQRAQXK/NM1l/tIYrUoD8L9dBZmuKyLr52rR+Jg94eh9R4tbUKtrFlja
+ctOQmXQ8JCZ7XeyQe9y+duD+RhvqJaTB8CamEEq6yZfBJYPQsL2mqVHKZYol/Cwi
+JndMHiMrp9TFIMComm8Tqritqw6s
 -----END CERTIFICATE-----
 
 subject= /DC=COM/DC=ABB/O=ABB/CN=ABB Issuing CA 4
@@ -23612,6 +25563,40 @@
 So/VFB9PyEwhfdlw7WkxDzW217vXGQ==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Hochschule Anhalt (FH)/OU=ZIK/CN=HS Anhalt CA - G02/emailAddress=ca@hs-anhalt.de
+serial=179060DDE4415D
+-----BEGIN CERTIFICATE-----
+MIIFUjCCBDqgAwIBAgIHF5Bg3eRBXTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU0
+OVoXDTE5MDcwOTIzNTkwMFoweTELMAkGA1UEBhMCREUxHzAdBgNVBAoTFkhvY2hz
+Y2h1bGUgQW5oYWx0IChGSCkxDDAKBgNVBAsTA1pJSzEbMBkGA1UEAxMSSFMgQW5o
+YWx0IENBIC0gRzAyMR4wHAYJKoZIhvcNAQkBFg9jYUBocy1hbmhhbHQuZGUwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCag9Xay0idncrk59nnuCaQ/lsB
+mdylg8S2EYSdiYZAshUJ3EswIi15PpaFLdRcu4pqU6aF55gqMfm38SGC5Kp4480d
+DGzqdeBE7otvuXu25GH52pvWGCIfs9Jf4Xt1CSYwuOLErK7ayVTfeG2O5JQaGLVN
+JxiHI56yIcza/Dq4qR3AX1HVuHtd7QgihncEzOdnbw1OYyipoAIZ6MFO30TuCQFj
+vQpfKFs1Ss0OTlGKlFE0vMDMKMWToCwQ3cFFWYszGmb58EY1CwqhqbNUXsRhU1Gf
+Vz+PrLCI6NQfNNYQNPvVdzj0tL4E978TVA4fvlZO8g0OUuTu6G77aZS41vOhAgMB
+AAGjggH8MIIB+DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjAR
+BgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFJvBHrDwWaN8fYNOkwRTIFGS9kzq
+MB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMBoGA1UdEQQTMBGBD2Nh
+QGhzLWFuaGFsdC5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBj
+YS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmG
+N2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9j
+YWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8v
+b2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0
+dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9j
+YWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2ds
+b2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsF
+AAOCAQEAt7D8VyyFYYydWI1MIqTh0kLs0C+9OVy6iSywu7p2zm22IhafCjSSaRBJ
+ONXm2qzhNoi/9O3JnGdwQ9a/XA1UrwVYNCJX7FzcE4fBocbQIdoDkjOvSkg7h3OU
+tGGc6HucQJJK6r4iaHskxRHA4i/mXPaU0b6CmyZ40OOJ/5Qf2RBlEtAC64fykTGg
+y94LJVRXMrkpTynYaT4ibSVsjM0YmmP6oeB06cl89jpGDZjSjg0CEZDW5sONE0g/
+5IDpdmeQ47Hw05XrYniEy/Fh2Bbl5gZ6HE8G+ZBbHj81ZqjiLREQeaVOUPrjtqZ1
+z6FfWhmuQaeRI5GcQ4qjY4y4mT9lpw==
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Baden-Wuerttemberg/L=Stuttgart/O=Staatliche Hochschule f. Musik u. Darstellende Kunst Stuttgart/CN=MH Stuttgart CA/emailAddress=ca@mh-stuttgart.de
 serial=0AC5702E
 -----BEGIN CERTIFICATE-----
@@ -23748,38 +25733,38 @@
 lDTBMmediFqIW8MP/JK5tTJe8Tguvq2N
 -----END CERTIFICATE-----
 
-subject= /C=DE/ST=Schleswig-Holstein/L=Luebeck/O=Musikhochschule Luebeck/OU=Sachgebiet EDV/CN=Musikhochschule Luebeck CA - G01/emailAddress=ca@mh-luebeck.de
-serial=134A20F131571F
+subject= /C=DE/O=Bibliotheksservice-Zentrum Baden-Wuerttemberg/CN=BSZ-BW CA - G02/emailAddress=pki@bsz-bw.de
+serial=179060F2BFD7AC
 -----BEGIN CERTIFICATE-----
-MIIFVjCCBD6gAwIBAgIHE0og8TFXHzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
+MIIFVDCCBDygAwIBAgIHF5Bg8r/XrDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
 EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
-A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTEyMDIwMjE0NTMy
-MVoXDTE5MDYzMDAwMDAwMFowgcMxCzAJBgNVBAYTAkRFMRswGQYDVQQIExJTY2hs
-ZXN3aWctSG9sc3RlaW4xEDAOBgNVBAcTB0x1ZWJlY2sxIDAeBgNVBAoTF011c2lr
-aG9jaHNjaHVsZSBMdWViZWNrMRcwFQYDVQQLEw5TYWNoZ2ViaWV0IEVEVjEpMCcG
-A1UEAxMgTXVzaWtob2Noc2NodWxlIEx1ZWJlY2sgQ0EgLSBHMDExHzAdBgkqhkiG
-9w0BCQEWEGNhQG1oLWx1ZWJlY2suZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCRVdoHIteFV321fz8n0CrbEIJz8iz8j5GlNwQuzWWE2JbQ8K0/r0rT
-lRZF+nXhK1akhTUFY1Z/N7lL5y3F4jhIt536B9fvSlwT2FzoFzhxBBVlLPJakcwr
-JkcA6nM9K2TE7BGZipJwo8serEZ+WmGelQPgmb9qAFnku7Er5+pU+IuG+DKQ2Igc
-44fIfQP05gwbuvh28scpPQfZLrPPjHaM4BVhiQsNWJ0tt9aP0gQ2RBh57PAv547x
-Bq3apIP9MoyWQalEejO5Qv76YYxMJBCtobMU1PKbhjr1fcqNqrLYt0XpjvFMg4l0
-KvnN+UVzqz9+nkDTyNAdlAi6RNUBjkx/AgMBAAGjggG1MIIBsTASBgNVHRMBAf8E
-CDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUccqQAOeGn/iJOzeu
-iy91t6aorHowHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwGwYDVR0R
-BBQwEoEQY2FAbWgtbHVlYmVjay5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6
-Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5j
-cmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
-cHViL2NybC9jYWNybC5jcmwwgaIGCCsGAQUFBwEBBIGVMIGSMEcGCCsGAQUFBzAC
-hjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNl
-cnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5k
-ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcN
-AQEFBQADggEBAFknpbOehIA4RxoCw5vMPhg8GtEdktbSo6pS+h2LNetAviXlfgOL
-UCf2CHXt0+C943Ez8UIWh3khAoExPmGM2Oog+lK36G09v40cSdaF+M/eT8neNP0h
-mGEYP9lEL++hYzUOaMAfscdGC7gPZanu5Gb0HjLHzHg4PMX5F6JR97/az/dkFuJY
-9TPFTqj9c5DmDBt9qQuJPYUtMAE02/1PPXZTXU+bCqwcjRjuOkOWWLJ1w+XPzk+K
-y5ALxMWW+Y7T5DgbSQFhF+qaZqUgYT19DZNwb/zHWnL4yafFgQJrTbqh8TTH6YQI
-Uifbeurbk57Hg7iWfJkcsBaHDG36goXCOw8=
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYx
+MFoXDTE5MDcwOTIzNTkwMFowfTELMAkGA1UEBhMCREUxNjA0BgNVBAoTLUJpYmxp
+b3RoZWtzc2VydmljZS1aZW50cnVtIEJhZGVuLVd1ZXJ0dGVtYmVyZzEYMBYGA1UE
+AxMPQlNaLUJXIENBIC0gRzAyMRwwGgYJKoZIhvcNAQkBFg1wa2lAYnN6LWJ3LmRl
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAugFAG5M+IfbOfYZzSW/H
+YO7zAozUBq5T2wZ1N13D41Mg6/+UVZRcT+IIBU40dA/MpDxrDQ7aE+NHdghIyPrk
+IUpjY/oBPuFmIUG1Gjel4Uh7vHrVctSBRyQvM75eCc3YhYeXQKk8BwQrlj9jwFw8
+RbnZYILs5cFHKzU8BIoDY11LhEW2OxH5CVtj8mPqw0JIzrWFrFUnIeUq9gY8fHHR
+D/AjkuziR+FIscNXwPOoYRyJXsBaIf2uzDZ0KfNi/Wpc/AdgBmMR6of6JTSnDgSV
+8lV7/Q1FP2Y1nV/Ub1kZfDL7JEz7BTalzKxUJPKt8G2oPNhCQEKZCxcDpKAPGIj8
+SwIDAQABo4IB+jCCAfYwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMC
+AQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBQprQDey2blH96qjW3snLRC
+/vubITAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAYBgNVHREEETAP
+gQ1wa2lAYnN6LWJ3LmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEu
+cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDug
+OYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3Js
+L2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6
+Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7
+aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0
+L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUv
+Z2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEB
+CwUAA4IBAQDWyTVzpK7HswnMZ1HLfcQLpr0i8GeWuibHKiW8LnmjfODPWd5C3HTr
+mqGEec1xRdKqs0sjW8pVg/6gQukzDJCZN3Yhg6Ogkl/8k/qwZw8XseRalUYpJZFe
+214VxxGxZYIkQSgzpfnTSi4cR9xHSxPP4AkJgyZZgHgB5p3eZCfuJFrByP1b2+mE
+Q/sHPzguWjfH5cGZVBMppJOIXGX2fJXY/Q0n4hYeTGhriJnH0puKDai8x/RjaG1c
+RI0PZaxrw2SXqastHB/lBwEoZs8sConJVwXDgBDvWYxbJLytp6LRhebJB7u2wVXM
+4FVRSX4GfNy5RB9zzGrAmltyaFm/3zXF
 -----END CERTIFICATE-----
 
 subject= /C=FR/ST=Calvados/L=Caen/O=TBS INTERNET/OU=Terms and Conditions: http://www.tbs-internet.com/CA/repository/OU=TBS INTERNET CA/CN=TBS X509 CA SGC
@@ -23952,6 +25937,74 @@
 hq7F8trJyonBOMud6+/51RtA6hIxe7JbuWNp
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Universitaet zu Luebeck/CN=CA der Universitaet zu Luebeck/emailAddress=pki@uni-luebeck.de
+serial=17AFF6EC5CA9EA
+-----BEGIN CERTIFICATE-----
+MIIFVzCCBD+gAwIBAgIHF6/27Fyp6jANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDYy
+MVoXDTE5MDcwOTIzNTkwMFowezELMAkGA1UEBhMCREUxIDAeBgNVBAoTF1VuaXZl
+cnNpdGFldCB6dSBMdWViZWNrMScwJQYDVQQDEx5DQSBkZXIgVW5pdmVyc2l0YWV0
+IHp1IEx1ZWJlY2sxITAfBgkqhkiG9w0BCQEWEnBraUB1bmktbHVlYmVjay5kZTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJZlLuavteOPCLNspfHcdBjG
+Tfr0HDjSvfWMaWc3SUmXZ75ULMprYo5Iad1DZ188QV8ZNLXoESGl/xI89gM8SwzP
+xZH8Wdl0UYriqlXRvv6nM3svjGCcqgbYtdZolHaHKAJvp8bYSI9ZPt6i83g8r+w1
+eP/l6Q99d3IqsP19sw+GWX6ZNNH0OwLKkfmgMY4UCw0CfeHSITh1g9OXrtPcsaFi
+XtZ3tn3NJlF8Ppr6U6YnzqOC4EvWt+rnC95/Ai+wZlhjA5N/65nIyiwVhmUYwkJj
+Sb0k79k2hEZ0MZ2/WIVVLF4vSKbbyBnOhERo9tzuoVpMrDTDaQKhE4RiFeauoUMC
+AwEAAaOCAf8wggH7MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEG
+MBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQUtytvwMcYEDE2F1IQdaHQQMM5
+NB8wHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwHQYDVR0RBBYwFIES
+cGtpQHVuaS1sdWViZWNrLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2Nk
+cDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9
+oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0
+dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcw
+AoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2Fj
+ZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3
+DQEBCwUAA4IBAQB1h5iP/Vv0MvdAng5c5aQYmy/KrVjmtReQGn2B+ta/iHAeuiMk
+CDOBJ/oP1/h6ZECXzmrn2D8xtwRrrKTEVpWrAOd/va8/z7ITuVFN/t9flHC1fg5Z
+2pK93Av/IRFFxeQLU5Jmgs2BZtXcuBXHWqitKVEV/WDsYUalHPr5Z7lSnGttE0uk
+Jy27ycjeP79h/SAd6Y93jv5SyonKolIZHY9HB6zbXjmw3dIo0gbA24YP3JPfUwQg
+ZtBizn629XDLh08vnreSuvJ6SIAKIwh2WYC6rTuARjdwlxCnFF9BPtMYsToDYEEc
+Q4Ij9uaq/F/eyV5uUWOptf/hD1+8EFXlGLaJ
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Hochschule fuer Wirtschaft und Recht Berlin/CN=HWR Berlin CA/emailAddress=pki@hwr-berlin.de
+serial=17AFF6A79CC893
+-----BEGIN CERTIFICATE-----
+MIIFWDCCBECgAwIBAgIHF6/2p5zIkzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUx
+MVoXDTE5MDcwOTIzNTkwMFowfTELMAkGA1UEBhMCREUxNDAyBgNVBAoTK0hvY2hz
+Y2h1bGUgZnVlciBXaXJ0c2NoYWZ0IHVuZCBSZWNodCBCZXJsaW4xFjAUBgNVBAMT
+DUhXUiBCZXJsaW4gQ0ExIDAeBgkqhkiG9w0BCQEWEXBraUBod3ItYmVybGluLmRl
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw5GbfmS1WGLDTeFK7EUo
+xAk6+1yL089dOero7FCu3J/bkQx4tTZpuhG8WtQFacOac57mDVLH1k7wz16UyvJR
+VKxM/1jQ+WB4+ZaohAsxCGseY4ubnx0wPEvXDuzHEpd1HWLVRfx1SwzobEonqabn
+1M163PoPXvd6ojQeLMzfUUqFpPEJAhNK15jqPVu6+lQY/A9GHVW/qiEoXHaDs2Li
+5zFt1sDG/iwmzO10AbWK254909b+6xfG95hQpgjoCqk9Mm9vSRFaAsCKP6V0D0Eu
+hrpLdiPU33TFHnf+hh1cYoHiXWnHiuIB8Fy6Q+JULMQsD+hww2OEX2wAbQXDBN8s
+QwIDAQABo4IB/jCCAfowEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMC
+AQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBQalhOw6lYjZNi+Im1FuAyY
+BIpDaTAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAcBgNVHREEFTAT
+gRFwa2lAaHdyLWJlcmxpbi5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9j
+ZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmww
+PaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhido
+dHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUH
+MAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Nh
+Y2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG
+9w0BAQsFAAOCAQEAq9N75mrxvnUJe3gHTuLc8Jk6q3xqLdh4BCuWzEe4XYVfaeyM
+4ijCSG5zXAdS9ABdpfBYhI4p3//QxpgSYSIqmXdXGGpmrP0lMxGH3pY989sswQfL
+bXDfJSk9J8HH9caJnXVOSZAGAdG2VrnLo5pnma9XsfWRMS8HX8ijx8HNRvYsb+/k
+j/mLbbsXujbs3NDJRHPfG4Mpmh6W4VwRmG3wp/CQaUvLER53lsnmrjFNwr+TELyp
+CBZmyIqxNrDrSu6CGu+hy4KTOEbEUi912vb+qrc9XWzH09mqSYJzk/M3/BDPRUxH
+4q5fJrGnhzsGWTOsmSVm3xgbLW9Na5blgg4Bzg==
+-----END CERTIFICATE-----
+
 subject= /C=ch/O=Swisscom/OU=Digital Certificate Services/CN=Swisscom Rubin CA 1
 serial=261D94750F6C9D82D4EFCCE3B90F613A
 -----BEGIN CERTIFICATE-----
@@ -23986,6 +26039,40 @@
 +/TBdorJxjI07x7eWkCdTaBDhYmOcb0j3PKcMus=
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Bayern/L=Aschaffenburg/O=Fachhochschule Aschaffenburg/OU=Rechenzentrum/CN=Fachhochschule Aschaffenburg/emailAddress=pki2@fh-aschaffenburg.de
+serial=0B73522C
+-----BEGIN CERTIFICATE-----
+MIIFWjCCBEKgAwIBAgIEC3NSLDANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJE
+RTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UE
+AxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MTIwMzEwMDQxM1oX
+DTE5MDYzMDAwMDAwMFowgcUxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4x
+FjAUBgNVBAcTDUFzY2hhZmZlbmJ1cmcxJTAjBgNVBAoTHEZhY2hob2Noc2NodWxl
+IEFzY2hhZmZlbmJ1cmcxFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xJTAjBgNVBAMT
+HEZhY2hob2Noc2NodWxlIEFzY2hhZmZlbmJ1cmcxJzAlBgkqhkiG9w0BCQEWGHBr
+aTJAZmgtYXNjaGFmZmVuYnVyZy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALxT5KJIXypH3jTdbPdQS5uTfW7u2XIUpm+g1PODNUp/9k55DyhcOgJp
+cKfWdKOg7xP2kNHgy6FwhiST/9l9pitxeKZM0JKieS8ER/XjqXcJXKMHQ0eH/Y5D
+b86OJGn0zalAfgn0/F5Il6kFkxFkrzcItgSO8UZWHJOX1nYyqghGnCi1grAq3Bi3
+wF6uuHWbLC/ogiwuETOahG9dMGmMq0tMGeqc+p2jDva7osR0gzzec22RBMvsa+Up
+68zuUEWk4BtJqOq1XXZseGXD1CuEZDJM1j7nk7qJ8FpBim4P0Q2hnVc+VXyKh4P9
+kYVacSt9VETgk1+0NVZnQXdodE6dnx0CAwEAAaOCAbowggG2MBIGA1UdEwEB/wQI
+MAYBAf8CAQEwCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBSTBF47wll+tUa2RXMqun9V
+9vuFLzAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAjBgNVHREEHDAa
+gRhwa2kyQGZoLWFzY2hhZmZlbmJ1cmcuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdo
+dHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fj
+cmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIGiBggrBgEFBQcBAQSBlTCBkjBHBggrBgEF
+BQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5k
+Zm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqG
+SIb3DQEBBQUAA4IBAQAv2uqcKTRyLkaxwc9/Drgrl1gS2BigR2elOgrjwb0Fxrv5
+J/v4FLCwJy0J+tk9hPQZgNAAzLponYyUIBMmUk7arsjUCtNtkQ8U6SisidX3Bae5
+vSE3/XYjx90qHlhyoZ7IWbmb7PHLD+/veUySaM7zwVByJWg6if4DyujUn74r54yu
+RX9ZxYz0VVjrIoUEz7rkYINsUYS2c749tW8aEST/+Emg5N0tGdg4Zi8pr1m+J8KZ
+UL4+dHv6XdMnbtzOLhQ1pDK9TvfvZUfyR88xazmiqJqQdiir7nWJ+qo3BSWJhxYS
+d2Nsi4qbhxV95lSDe+i7UL5g5gb+tPMqHqXtPlez
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Brandenburg/L=Cottbus/O=Brandenburgische Technische Universitaet Cottbus/OU=Rechenzentrum/CN=BTU-CA (G01 2008)/emailAddress=ca-btu@tu-cottbus.de
 serial=0B89EFAD
 -----BEGIN CERTIFICATE-----
@@ -24122,6 +26209,40 @@
 AuchyPhjNQo92+WBW/JSpLFZZF8SFRTTExtIdKiNjA==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Universitaet Leipzig/OU=URZ/CN=UNIVERSITAET LEIPZIG CA/emailAddress=pki@uni-leipzig.de
+serial=17A4247B56BA55
+-----BEGIN CERTIFICATE-----
+MIIFWzCCBEOgAwIBAgIHF6Qke1a6VTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MDEzMTA5MjM1
+NloXDTE5MDcwOTIzNTkwMFowfzELMAkGA1UEBhMCREUxHTAbBgNVBAoTFFVuaXZl
+cnNpdGFldCBMZWlwemlnMQwwCgYDVQQLEwNVUloxIDAeBgNVBAMTF1VOSVZFUlNJ
+VEFFVCBMRUlQWklHIENBMSEwHwYJKoZIhvcNAQkBFhJwa2lAdW5pLWxlaXB6aWcu
+ZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7wVBfW41FOpO/f1hA
++0mow+ZzeNLJeaQzbBMO8E/8r/walUSpB8rgvgDNz0p/EkuNk0FTYBrUf3grGp5z
+SL6iO13Kk0e7NhIisYOGzers7uQO1mPJCvRur6PrCe2dxiqEGVdOaR3Xdul+zX7d
+l1B/+eV7CHo+hzL2PV9kR7uYSqtnCyAONLsIv8UXHjSlGFoSLbIqidVELlsbYK7p
+Ynr/cIPSl+DffWZS0LhP6sH2NBPf6loRkkd5RopEGy9fqnGdEt9QgjVK9J3VCvLA
+cHGzsa5U0R/1W3lUq76CBwbAeaMJvPy+JRiL+rRQHVFTGakJSbwMmmirHSfTUn48
+yGZZAgMBAAGjggH/MIIB+zASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQE
+AwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFDaM3R6c0bqQgPinird0
+ak3JN9oOMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMB0GA1UdEQQW
+MBSBEnBraUB1bmktbGVpcHppZy5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6
+Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5j
+cmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzAB
+hidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2Eu
+ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkq
+hkiG9w0BAQsFAAOCAQEAiTdIYedR+AhZPrZvIpgi8PjZt9hjU9OFzXf6ACA2FDiM
+cGgRGQDFdEtMzFkbzpMaJ8RZXJsbx0otizp2WXFWiGXeWp/4tKmYnITjFctmvRp/
+mAJb6xZ1uPkPmGDjLP82NYovrIUssmJCcM/GpeBXWR7DgQp7DJ+frLlH1NpylI6y
+uVolHWFoX1hF/gSiiZvwlbley2aOh71XSritTpUe+kUC6+VPkiwYEMcx8N8INJEu
+g5dmcCz35nxk43x7OVLojBKE/FR+v33pMlQZAEjVbKYjgd6JI/8k8fQ+6rEGxkj+
+q5Hz/FeaIf/58QfOv9F/rip8AfkIy75JplI5WA0ywQ==
+-----END CERTIFICATE-----
+
 subject= /CN=T\xC3\x9CRKTRUST Elektronik Sunucu Sertifikas\xC4\xB1 Hizmetleri/C=TR/O=T\xC3\x9CRKTRUST Bilgi \xC4\xB0leti\xC5\x9Fim ve Bili\xC5\x9Fim G\xC3\xBCvenli\xC4\x9Fi Hizmetleri A.\xC5\x9E. (c) Kas\xC4\xB1m  2005
 serial=03
 -----BEGIN CERTIFICATE-----
@@ -24190,6 +26311,40 @@
 ylQy7xWZJ4Qhl1UOV870PfriQydSQn5ccFtUCtbyLbo=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Otto-von-Guericke-Universitaet Magdeburg/CN=Uni Magdeburg CA/emailAddress=ca@uni-magdeburg.de
+serial=179060D5D94352
+-----BEGIN CERTIFICATE-----
+MIIFXDCCBESgAwIBAgIHF5Bg1dlDUjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU0
+MVoXDTE5MDcwOTIzNTkwMFowfzELMAkGA1UEBhMCREUxMTAvBgNVBAoTKE90dG8t
+dm9uLUd1ZXJpY2tlLVVuaXZlcnNpdGFldCBNYWdkZWJ1cmcxGTAXBgNVBAMTEFVu
+aSBNYWdkZWJ1cmcgQ0ExIjAgBgkqhkiG9w0BCQEWE2NhQHVuaS1tYWdkZWJ1cmcu
+ZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIUXtjT59Pcb1eFk8K
+/yGoJ9AhxLQeaZnoz9P4UDW/IVOzqDmWUn3WUK81o6ZjZJItfzU721Kj5azpvpDA
+2cVCOwJf8V7KlsujQo3amPDjQRzNzFxBG49/Hm0Kq7rz9KiWSP4Ib2KGnHAfg2WV
+peVs+OENFm9lbWjyozWMhSb5MzTvUrhwc9roQPOgi4wi99J2bsLK89kHFD81IhEm
+m5ZOaFhxXuPkeJlaki2xXcCbrIiwwF/a/trSgQt6FIoTfDRI5+vsor9tlbsgEwvF
+5speQL5OhZHT+aUZzK2nu3Zy2malK9oV7vZLepUxz9r9Kp+nMc9xiU9stBMLITaJ
+pY1fAgMBAAGjggIAMIIB/DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQE
+AwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFAhrQNqrKkLyLpUzOGNF
+38kjPyaEMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMB4GA1UdEQQX
+MBWBE2NhQHVuaS1tYWdkZWJ1cmcuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRw
+Oi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fjcmwu
+Y3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNh
+L3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcw
+AYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsG
+AQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1
+Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJ
+KoZIhvcNAQELBQADggEBAFaEwoLWnotTK9vycLMX36uCv6pQXRcLmKJhV6VBMSgd
+2jAd4b+JaGuJ33qsCBdhah/0pV16KznGd7WAKN/Qx+kDiagieuZ/unA46hNx6TD6
+L33cC7YTRZFxX6r5ZlBP9yNH7nST0OqYkPX8U2qPZaZoTJ6nLX1RUTmgM+8VoF24
+lydiobaqya1t1FfDyV+h7r1Pg+5sxRzYZE7fw3coudAItsm8WfLWZXGHtxAUpup2
+lO8hkM6StmpwLPj+62kJlzibkkBea7i1qA5bwDWkitTf9s5NxvcAwbvzQJ55oLcp
+zyBcikPygc2T1oRBB8kMAOsJGSHxHJ2llcA4S94gmLk=
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=Freie Hansestadt Bremen/CN=Freie Hansestadt Bremen CA - G01/emailAddress=ca@bildung.bremen.de
 serial=14DC2F23B56A05
 -----BEGIN CERTIFICATE-----
@@ -24360,38 +26515,106 @@
 pH+ezLciEWshS5KkBFSf8YQ1z9NVIi09y1HxGt3szSO5SQ==
 -----END CERTIFICATE-----
 
-subject= /C=US/O=Bechtel Corporation/OU=Information Security/CN=Bechtel External iBechtel CA 1
-serial=611F813F00010000000A
+subject= /C=DE/O=Fachhochschule Frankfurt am Main/CN=FH-Frankfurt a.M. - CA/emailAddress=ca@dv.fh-frankfurt.de
+serial=1790610698975A
 -----BEGIN CERTIFICATE-----
-MIIFXjCCBEagAwIBAgIKYR+BPwABAAAACjANBgkqhkiG9w0BAQUFADBxMQswCQYD
-VQQGEwJVUzEcMBoGA1UEChMTQmVjaHRlbCBDb3Jwb3JhdGlvbjEdMBsGA1UECxMU
-SW5mb3JtYXRpb24gU2VjdXJpdHkxJTAjBgNVBAMTHEJlY2h0ZWwgRXh0ZXJuYWwg
-UG9saWN5IENBIDEwHhcNMTEwNzE0MTk0NDA1WhcNMTgwNjE0MTY1MzE0WjBzMQsw
-CQYDVQQGEwJVUzEcMBoGA1UEChMTQmVjaHRlbCBDb3Jwb3JhdGlvbjEdMBsGA1UE
-CxMUSW5mb3JtYXRpb24gU2VjdXJpdHkxJzAlBgNVBAMTHkJlY2h0ZWwgRXh0ZXJu
-YWwgaUJlY2h0ZWwgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AMFlQNP2bp0VMnCGGBohtyck3a7IM6b62qRieNzDlOYI6fxxT9qL5RUxcoGch2+h
-igNWYh3KxcnXg7PKL6EIV3OyRls4hQmdqR+Kl+VXBWKLr+cmJmlLD4thWqYbcdlf
-HXFZFB8L5HkFI/jX6ouitV9GCwMBlZTS/sSqXwnkErWNh8ixiWyiWCeqrGDaaW9z
-l9A78iizt5kxP3qlLjcdOenzpvmGjD498kkHp5NjkVy1sWKYvHbE7GHiNwqD+uAA
-h1mt59U7RCBjhQis1X2ZlgBiekY1c2aLzDnWTVdfe7gzolE6MH/Dh6/vthKwSoe5
-Ir8bQbOR1nFkp8+HRrxSgqsCAwEAAaOCAfQwggHwMAsGA1UdDwQEAwIBhjASBgkr
-BgEEAYI3FQEEBQIDAQACMCMGCSsGAQQBgjcVAgQWBBRNP45aYCFepqPdwvAn5VP+
-Ny67yDAdBgNVHQ4EFgQUEk9kPF5CmxA/RcE8CxKv2aQcYtUwXQYDVR0gBFYwVDAM
-BgorBgEEAf1SAgUBMAwGCisGAQQB/VICBQIwDAYKKwYBBAH9UgIFAzAMBgorBgEE
-Af1SAgUEMAwGCisGAQQB/VICBQUwDAYKKwYBBAH9UgIFBjAZBgkrBgEEAYI3FAIE
-DB4KAFMAdQBiAEMAQTASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFJCV
-dFScFf8EKL4+C1P2EjaQhrK6MGEGA1UdHwRaMFgwVqBUoFKGUGh0dHA6Ly9jZXJ0
-YXV0aC5iZWNodGVsLmNvbS9DZXJ0RGF0YS9CZWNodGVsJTIwRXh0ZXJuYWwlMjBQ
-b2xpY3klMjBDQSUyMDEoMSkuY3JsMHcGCCsGAQUFBwEBBGswaTBnBggrBgEFBQcw
-AoZbaHR0cDovL2NlcnRhdXRoLmJlY2h0ZWwuY29tL0NlcnREYXRhL3BvbGV4dGNh
-MDFfQmVjaHRlbCUyMEV4dGVybmFsJTIwUG9saWN5JTIwQ0ElMjAxKDEpLmNydDAN
-BgkqhkiG9w0BAQUFAAOCAQEAE+CuHuIL2vgx6U/0Sf7SRE0Q3/0+X5FzT9CIJXId
-egiKXilVy1cbr/BahP1ROY1ZrR1ckrRAQ00+VjByd1bTnnTHJTsZY1iE9vIVkoDU
-65ZWq9e8ZL73/vAytpiGxWGwyBepEAOuLrc7a2ZdJkg495zbJpmVyhiNpYq1ubeO
-kNQ78jlbta8U3C9FMFLriseQoIjoqqJrVNe93dFEv0kk2E3tXDKWmeANxiBPCxq+
-Y+sWbVeqM0E9XiWiFEtql5avYkBD9+/boqlVnyZ69/3CbegV/2SSNEntvUaEcg34
-6F/5YyXJK07ozqzBGUYOHxKOK7xHt2Pyu9ifY3UuhTrUiA==
+MIIFXjCCBEagAwIBAgIHF5BhBpiXWjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYz
+MVoXDTE5MDcwOTIzNTkwMFowfzELMAkGA1UEBhMCREUxKTAnBgNVBAoTIEZhY2ho
+b2Noc2NodWxlIEZyYW5rZnVydCBhbSBNYWluMR8wHQYDVQQDExZGSC1GcmFua2Z1
+cnQgYS5NLiAtIENBMSQwIgYJKoZIhvcNAQkBFhVjYUBkdi5maC1mcmFua2Z1cnQu
+ZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEjKilHag/2YKQcvvw
+P7cXFw2tHbUNCCsdPMadDA8+uqlygTOo6GRAp2YDywBvMlKUbO/bHM6qp5WO6b9b
+S/KZRnPHO3k0JMlKiGlXCbAcf4j71eecVdUW3Zv9ciyfeUT+EjB+ukr33GLDwUmB
+aKuLAGvOCby0ho0B/Rz7nl5Gd8+Jcq++ptXdEy44N0zO/TZeKmo/G4Gvt7uf9oRW
+HpOzW+PUGBO7BTANvTBqn0srJpOLaRrCtdWnGQbs6417cwlIn9TnKDgb0ErIzOu2
+Ww/TjnXNk/bn4Tuuu7HM82XrqLGJi0ljQdWxyXWItSbtUAgzWSZtYrL87gxG6st7
+93BtAgMBAAGjggICMIIB/jASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQE
+AwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFI8G/+2+7mR9U1Mqzhlg
+jHSZU/UWMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMCAGA1UdEQQZ
+MBeBFWNhQGR2LmZoLWZyYW5rZnVydC5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0
+dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNy
+bC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUF
+BzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYI
+KwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDAN
+BgkqhkiG9w0BAQsFAAOCAQEAOdWAzGQnp1xGngdIqJG96dwOEPxEQlnAEARMjvQZ
+61UvS9rZf2xXtQNfjiS9gEwrtPZyCsNzEsCeCUszVrnbfSvSLnZYJ7sSDEGXz424
+QFlTMrdNs8ZM2rJLyPOoZE44bbAMMZi7/lXmEP9xFehDlHVnBNGL3h7L9V48Q7Z2
+FY8GapyCFTHQA6VR3y05oCPDNjyGJn2MpOyfclZblDK6N2ScCnSE1AOkskxPr/r2
+vZNEaN9m0edJBqhdlc2KLNtwm17wIZBdlxVmH86P2HfzgSJu9s9oM6ItGpbAzB0C
+uSWFULSl/acLEzZrcCL++IRGPi86R4ijL0+LrsMvLXBVpA==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Regionales Hochschulrechenzentrum Kaiserslautern/CN=RHRK-CA - G02/emailAddress=ca@rhrk.uni-kl.de
+serial=17999FDA57D7B2
+-----BEGIN CERTIFICATE-----
+MIIFXjCCBEagAwIBAgIHF5mf2lfXsjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxOTE1MjQ1
+OFoXDTE5MDcwOTIzNTkwMFowgYIxCzAJBgNVBAYTAkRFMTkwNwYDVQQKEzBSZWdp
+b25hbGVzIEhvY2hzY2h1bHJlY2hlbnplbnRydW0gS2Fpc2Vyc2xhdXRlcm4xFjAU
+BgNVBAMTDVJIUkstQ0EgLSBHMDIxIDAeBgkqhkiG9w0BCQEWEWNhQHJocmsudW5p
+LWtsLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArkBDHdIGttkO
+w7WYdJ2BisOniuHlJCPep/0pUeTb9QFLZaprodeeRm6kFix2XGl3h4imLu7dGwtu
+8oRRpGcZ6tm3i2VSpw1zxxk9uUV2sMiRHK2HVkN3qWFwq/RBOgPEaVNhdF5hMz7Q
+ZjZrdXtXOM4LGG8kBZqD75Q+U0mbtDagOL1NIwtJuY3YqnL/6Hvptb4F30RDVUnY
+mhsWVX+RCNaMvO1rU9gHHONICEv8AAP1XKRX4L7lB77wDpNZL6CImPp+xPHybnU6
+e98QjTa3InO40E8sCKchXrWfpKeuwW8iXSTwjEp7zuhS39oDPwHmNYzPLEF4NO1L
+SUKK1PNFswIDAQABo4IB/jCCAfowEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8B
+Af8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBQv3ROYY1wLw2+4
+7YbgAyfBb7q2AjAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAcBgNV
+HREEFTATgRFjYUByaHJrLnVuaS1rbC5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0
+dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNy
+bC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUF
+BzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYI
+KwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDAN
+BgkqhkiG9w0BAQsFAAOCAQEA3rH+7oW8Dj5JvS3ijKWDByPxQpZispCRD/tR3Jx/
+wr/2z5B6NiozII7uAvd9ruZwBG/X4tmb2u+72FsymXJS1E+iffMJe18LsSUmE2wC
+61a/OFinQyVdz2GJJG+T59yEZARvEh+iRvaasX8ox0j80JR2mDwjnSKy1zBYzk7H
+g3gdgCjqAffWt0I/BsiV+mHdOWG/ubljt+j7jsCqBobUixc1wEXwSzzSq+sO5Xn7
+MqstpT2O9JkuCVcxhcKVEDAq6vErEpvJLafwkd5j+lkUaqnPQU8l449+ClRXlRcQ
+US7fy3C1zpi2iR1RweUMoybqv7/7H6RU3g+cLiFgssc8fQ==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Forschungszentrum Juelich GmbH/CN=FZJ Certification Authority - G02/emailAddress=ca@fz-juelich.de
+serial=17A4249B7910DF
+-----BEGIN CERTIFICATE-----
+MIIFXjCCBEagAwIBAgIHF6Qkm3kQ3zANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTQw
+M1oXDTE5MDcwOTIzNTkwMFowgYMxCzAJBgNVBAYTAkRFMScwJQYDVQQKEx5Gb3Jz
+Y2h1bmdzemVudHJ1bSBKdWVsaWNoIEdtYkgxKjAoBgNVBAMTIUZaSiBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAtIEcwMjEfMB0GCSqGSIb3DQEJARYQY2FAZnotanVl
+bGljaC5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMmSAUNDDTy
+ykywGt4Jp6Ewx42cyN605du2f44+2suXWA0AKPqwjYU+eF4TSpodWNNCe0lY1rO0
+1g8Rs8/GDeaCtbTwtqcLXWuyEb43ecV8QhprmZq7FW3XmO8lva4IINsUCtyIVJOJ
+C4+WKvFAsEle2Y9ZJm1+2bJkv30lz0LHndhPcpcorsApVw7Idp7jVadF2e7oIYrS
+rKrqMRVj+X6sOLkQ0XdLtEmxDMHDD3HapHv24GJbp3/JgGjdElko1O5ooR8hDwHM
+mVHSf7KCVxJjD8QaT+lCWm8Ikfh9EWnmJ897Bm2QtaD/8iBokED5i9YjYC/ylZ6z
+K2KRBNAfLBECAwEAAaOCAf0wggH5MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0P
+AQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQUIL1xiaXJKjMv
+EeAf5ZQmVg8RAiUwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwGwYD
+VR0RBBQwEoEQY2FAZnotanVlbGljaC5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0
+dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNy
+bC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUF
+BzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYI
+KwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDAN
+BgkqhkiG9w0BAQsFAAOCAQEAZx+MTZsyZ0M+0A59ikr+jSmNp+NJu2kWhbKf5OOb
+bvT3xJtKTTry53id4NN/IOSpUpQmh0YUNfioGavZirOwPTSludARArFOhFF9+Xd3
+PrvPhCWEu1XFB3BbY8+8/sVIAF+Vd0QwUsZrhhxYylyfFEE4b1qELTkFmo/8XlhR
+St+OAYozZL9TY2M/c7Smj9I2/46Yv38slKRTBI7geZP2Pym0B9hxiQkm2cb+DJtp
+rkeyzz3RcluYtn0ncT8hLa5AK5BOfXm/+who0JQ98Cj3agWFc6yeFuoWF7u9ubYR
+6fO6Pexw9vo3ERmmGxxOh/w74Pp1XW75GyRbgS2b7XkmXQ==
 -----END CERTIFICATE-----
 
 subject= /C=FR/ST=Calvados/L=Caen/O=TBS INTERNET/OU=Terms and Conditions: http://www.tbs-internet.com/CA/repository/OU=TBS INTERNET CA/CN=TBS X509 CA pro hosting
@@ -24462,6 +26685,40 @@
 22hy2cxWpWuPQSWok/YGB0/HclGy5N+gCzLk2rA1FmImGQY=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=T-Systems International GmbH/OU=Trust Center Services/CN=TeleSec ServerPass CA 2/ST=Nordrhein Westfalen/postalCode=57250/L=Netphen/street=Untere Industriestr. 20
+serial=0727B216
+-----BEGIN CERTIFICATE-----
+MIIFYDCCBEigAwIBAgIEByeyFjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE0MDcwOTE3MTQ1MFoX
+DTIxMDcwOTE3MDkwNFowgdgxCzAJBgNVBAYTAkRFMSUwIwYDVQQKExxULVN5c3Rl
+bXMgSW50ZXJuYXRpb25hbCBHbWJIMR4wHAYDVQQLExVUcnVzdCBDZW50ZXIgU2Vy
+dmljZXMxIDAeBgNVBAMTF1RlbGVTZWMgU2VydmVyUGFzcyBDQSAyMRwwGgYDVQQI
+ExNOb3JkcmhlaW4gV2VzdGZhbGVuMQ4wDAYDVQQREwU1NzI1MDEQMA4GA1UEBxMH
+TmV0cGhlbjEgMB4GA1UECRMXVW50ZXJlIEluZHVzdHJpZXN0ci4gMjAwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDOiwnq/1yGnxwkfemFGfSS2hk4YW3c
+42GhrWjVwzDb7Mp5h0TrM0Dl1CFk0tq7IllMhdvQUjSTjpmu6LswGeEI4riwnSsF
+XqDv83nzTEBx3hCR1N03ioT1Ob9iWCmEhCIskt2AsxPFXB2s1Dspiwg5ZY6OyC4A
+P08ySY+Sl+Fn0b2VUSRJJEaH2lY9NMAN9RKsC0mfTsYN6HAnXgCGVpYLc94Ltbdk
+BO6sevsMn9TBRldq5IFzKd1Dx/r9OJszya1kZSvp/vrSP629JdANRWQVnBoLLJu3
+zp8k6dLG96AD3Z/lYPWurNeAjhP6OPoTg+mB6Lhu+hw06hrXGJzwPGpBAgMBAAGj
+ggGtMIIBqTASBgNVHRMBAf8ECDAGAQH/AgEAMIGbBgNVHSAEgZMwgZAwSAYJKwYB
+BAGxPgEAMDswOQYIKwYBBQUHAgEWLWh0dHA6Ly9jeWJlcnRydXN0Lm9tbmlyb290
+LmNvbS9yZXBvc2l0b3J5LmNmbTBEBgkrBgEEAb1HDQIwNzA1BggrBgEFBQcCARYp
+aHR0cDovL3d3dy50ZWxlc2VjLmRlL3NlcnZlcnBhc3MvY3BzLmh0bWwwQgYIKwYB
+BQUHAQEENjA0MDIGCCsGAQUFBzABhiZodHRwOi8vb2NzcC5vbW5pcm9vdC5jb20v
+YmFsdGltb3Jlcm9vdDAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0lBBYwFAYIKwYBBQUH
+AwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFOWdWTCCR1jMrPoIVDaGezq1BE3wMEIG
+A1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jZHAxLnB1YmxpYy10cnVzdC5jb20vQ1JM
+L09tbmlyb290MjAyNS5jcmwwHQYDVR0OBBYEFBW73tYlb73yMZ9iE9xcpvRltG3y
+MA0GCSqGSIb3DQEBCwUAA4IBAQBNSC2Jb3V64H4ivhM2fK53fnvypHgiodSitLvY
+48vy6gWIlbZaac19iroZSDrQC/pcijupH92HQ2V8TPPIa/M1e4iV/ANQTRIyrBiQ
+76N0xpx7wQFn8EdRO0NjCJ3BS+MITK0W4+Dy8/xqTjGbcvTXe9O3I/o4CGUOI93L
+WbxEwulUg/XBm/usvqIu7KEWvl9KJ9E1MX+/xllkkwr3sEBtKzUsMriuQZIPagk4
+Sopmwkt94g8k0xC4L7zkmzOWbc3usSrEJSJmBcclCl0W3+D6enOnNQDQSeTtN82B
+TlYoBJHkStMogP3lYYCI8YZsHAyYxjwAiuSO3dzi1wBs0aiO
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=Universitaet Duisburg-Essen/OU=Zentrum fuer Informations- und Mediendienste/CN=Universitaet Duisburg-Essen CA -G01/emailAddress=caadmin@uni-duisburg-essen.de
 serial=0C1AEF88
 -----BEGIN CERTIFICATE-----
@@ -24598,6 +26855,108 @@
 O78rKL+5W2sRNWgMxl2mEHmTHOz9QdEovDvBTDRO/LNRnI6wrw==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Hochschule Neubrandenburg/OU=Hochschulrechenzentrum/CN=HS NB - CA - G02/emailAddress=pki@hs-nb.de
+serial=179060FBF38C9B
+-----BEGIN CERTIFICATE-----
+MIIFYTCCBEmgAwIBAgIHF5Bg+/OMmzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYy
+MFoXDTE5MDcwOTIzNTkwMFowgYoxCzAJBgNVBAYTAkRFMSIwIAYDVQQKExlIb2No
+c2NodWxlIE5ldWJyYW5kZW5idXJnMR8wHQYDVQQLExZIb2Noc2NodWxyZWNoZW56
+ZW50cnVtMRkwFwYDVQQDExBIUyBOQiAtIENBIC0gRzAyMRswGQYJKoZIhvcNAQkB
+Fgxwa2lAaHMtbmIuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDP
+UMCNZ1nS0vToKvmBtyF5KBsnzSo/+PEvRkjaSRzrOV9lopuqR8rmBnDD8tfaoZVb
+nRXsT8SohhNC7VjjcrKO69u/3f7+O4oUflaUSrJMcVkIJLy3aEqbUl3xTUuYlcET
+r5uU5LinQ83zlsK9G4vUTCMMXmQCnRExtQzHApQDsDW7xPQeYOAFDBOdMy3E2JEf
+6aYTaGyZQyTqTZfj4k/4A2twgl+JBf95SdJIelS/5FHfJBZfB//tcNYC+t+Rr0ET
+DNWNptAmIvsWA3MdMTxgLzWfxXwwCxwPemCB/TCezRgxUspr8n2/ijKbVkF3YD9W
+buD5fYgvjis4rGdHGd5FAgMBAAGjggH5MIIB9TASBgNVHRMBAf8ECDAGAQH/AgEB
+MA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFA6j
+8ueSg4TXp1C8zLnjz4rTnTSeMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38Qpw
+Pt5kMBcGA1UdEQQQMA6BDHBraUBocy1uYi5kZTCBiAYDVR0fBIGAMH4wPaA7oDmG
+N2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9j
+YWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJv
+b3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsG
+AQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1Aw
+RwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2Rw
+Mi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy
+dDANBgkqhkiG9w0BAQsFAAOCAQEAJl89MEM3U1o1Yb5p5+BFms2a21BpN10CcCal
+Y/bFLOXNUvOiz9s85LzFOeLW9oQ77YduySDz7nXQ0jNkgS4w8oV5pE7i6Z1Krvg5
+AOcQzVHgSaNoVahhWLZwNvdEJPCRKP7FGpSNryJArgaW4lx55GpNB30OwYBkKMWk
+Jm0tsooiYTzbQZ4/U3MyT8wmT/1iFbjKEHys2X43C0UvM8Q9iE6AO9GNn3e3KqV+
+bHUlAmPbgK0pSJ/vrL/E6XsJoE62iyG+cWefTXvyRd7Fz22rAFy+YWJtvibA+4MC
+8ICXUw/8m6RUMc6l2sX9Nyk753dJKpOm3blPzTOmdlKuqqP37w==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Universitaet Rostock/OU=Rechenzentrum/CN=Uni Rostock CA - G02/emailAddress=ca@uni-rostock.de
+serial=1790610B4B7EEC
+-----BEGIN CERTIFICATE-----
+MIIFYTCCBEmgAwIBAgIHF5BhC0t+7DANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYz
+NVoXDTE5MDcwOTIzNTkwMFowgYUxCzAJBgNVBAYTAkRFMR0wGwYDVQQKExRVbml2
+ZXJzaXRhZXQgUm9zdG9jazEWMBQGA1UECxMNUmVjaGVuemVudHJ1bTEdMBsGA1UE
+AxMUVW5pIFJvc3RvY2sgQ0EgLSBHMDIxIDAeBgkqhkiG9w0BCQEWEWNhQHVuaS1y
+b3N0b2NrLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAozMtxDLr
+uZVexNUpmcHAlxn/1CxpoLPVMKnonekIyEiZ+yrTteryo5AlFiqo65hPFOM2QK6K
+axdcYCMILrAMml+KG05bnpGn44/tSsMjKeZZaqiLJvDzb8j1XRCjfegT1le/idzW
+520f+N5Km2KhqsCBlad7JkjOo4cZtYbYJn4cVVAz3MA20o+6WKBB1HU6OfgKMc9/
+N/bSzeKKCZnInWcm3diW114HfjXsZgDXCcVZxA5Cl0KRxq5ypnxBah7oI6hyJDFD
+si5JCtpAkF+AvnPzVWz3lxQB21X86PvLBeYyRx6tDx6CK2UdVCH+PAboRuwUtpv1
+6vNs8OztUeya6wIDAQABo4IB/jCCAfowEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNV
+HQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBSzFfWiV4+D
+e9QQ01zyjj5T929DNzAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAc
+BgNVHREEFTATgRFjYUB1bmktcm9zdG9jay5kZTCBiAYDVR0fBIGAMH4wPaA7oDmG
+N2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9j
+YWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJv
+b3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsG
+AQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1Aw
+RwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2Rw
+Mi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy
+dDANBgkqhkiG9w0BAQsFAAOCAQEATxKZBErVoT12pyZe5T1k/NI3l13X0eC1C680
+Bx4HWaF5qvKztSWOpD1RrcEC1ZO2Gosa6LLu+vu6Xzt+uCklFWjN5HIh485jtHSI
+phuY9NseCPhcdHJz1nYPqHU15zylZCDHgFKqzfEAumKj6AErdQeyLdewnHhmktO5
+uhFHj4EVOYTB22wZl/p88sFql9tLTGWzTke8+2tLDokZYKUTU+J0+XczmSIBGN0S
+ngfMOv78jNPH3zbemhgafF8I8vUzdNvoQK6C/uYFmJYT3Rs/MV+/3IReRfQ+nmJ6
+XP9eQIIw4H6AOBVlu22Yz8FK+h67D4a24KqpXWDqVzX8lkE22A==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Technische Universitaet Dresden/OU=ZIH/CN=TU Dresden CA - G02/emailAddress=pki@tu-dresden.de
+serial=17A42479685C8E
+-----BEGIN CERTIFICATE-----
+MIIFYTCCBEmgAwIBAgIHF6QkeWhcjjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTMy
+OVoXDTE5MDcwOTIzNTkwMFowgYUxCzAJBgNVBAYTAkRFMSgwJgYDVQQKEx9UZWNo
+bmlzY2hlIFVuaXZlcnNpdGFldCBEcmVzZGVuMQwwCgYDVQQLEwNaSUgxHDAaBgNV
+BAMTE1RVIERyZXNkZW4gQ0EgLSBHMDIxIDAeBgkqhkiG9w0BCQEWEXBraUB0dS1k
+cmVzZGVuLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwQ4ek/NE
+9uzQJ/dQemELBDQVk/yxH2xj2oDs4TNcNQo8dyAgopWAoCXiD0JgWU/UWpccRds9
+jhgz3EU7qnGhT5ILXRmsNQRRCF/pBntyLc9hpWiiz50AR8HKfjg4/DnYLw+MGamJ
+L7I2g8dXJNrKRx1cSxIf+8m3sSS939c2rajyZCtnybjnnlM9yKe+LD6oSp90AOUO
+ROCVB5b4d5eEwxa25hCDJ7Uaqyfi2htiQkNhvYXxFL8XqN2a+svPCHRvnex26fly
+ZGWKDnp1SLZvc/mrc6PjQcXZlvJw9NMSQBudsUEsDeB0fqrY9AnJzLY+Nc17+rpd
+hO5bUbm6jTN7JwIDAQABo4IB/jCCAfowEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNV
+HQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBTFK1OTF4PJ
+9UZC7UNq37aApkfy4DAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAc
+BgNVHREEFTATgRFwa2lAdHUtZHJlc2Rlbi5kZTCBiAYDVR0fBIGAMH4wPaA7oDmG
+N2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9j
+YWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJv
+b3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsG
+AQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1Aw
+RwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2Rw
+Mi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy
+dDANBgkqhkiG9w0BAQsFAAOCAQEAiYTAQ+DoeD14UcBAq1oKJgw5xCwwxYeBTdXt
+oNIGGyi4P5ANIMOkSiJoeBoU0QGxDcVtjMvrR2ihY7cEHQWmp4pZOAzefNY6sY6N
++4zxMA5jTc0/FOLLIsJpDA9m1jNr03HO5Q49oO8PrEcyCfM4tQLQleN2yU/MQVY9
+D0KRbqmFb2M4DKvijbRp+GMogQDMg2NRMzxILTqLze7Kl294xg2u9YKnR1iCn/aK
+3w1gmf2PHfmPq0qrQQB49H5wM45yILSb1CIn/gH8f+Eb8ctDB496urh4TxXGfUAT
+5vr8V9p1lxDJSXH9QPyIHWoeYVKZJgECFFCbKPEGxOIFwUvwTw==
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Nordrhein-Westfalen/L=Krefeld/O=Hochschule Niederrhein/OU=Datenverarbeitungszentrale/CN=Hochschule Niederrhein CA - G01/emailAddress=pki@hs-niederrhein.de
 serial=0A31AC61
 -----BEGIN CERTIFICATE-----
@@ -24632,6 +26991,108 @@
 QPaTJmexhzoDPm4TJYLarD704RDvvoD8EK8CdEejXCqTNDadzzU=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Helmut-Schmidt-Universitaet Universitaet der Bundeswehr Hamburg/CN=HSU CA - G01/emailAddress=ca@hsu-hh.de
+serial=17A42497BCEDEC
+-----BEGIN CERTIFICATE-----
+MIIFYjCCBEqgAwIBAgIHF6Qkl7zt7DANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTM1
+OVoXDTE5MDcwOTIzNTkwMFowgYsxCzAJBgNVBAYTAkRFMUgwRgYDVQQKEz9IZWxt
+dXQtU2NobWlkdC1Vbml2ZXJzaXRhZXQgVW5pdmVyc2l0YWV0IGRlciBCdW5kZXN3
+ZWhyIEhhbWJ1cmcxFTATBgNVBAMTDEhTVSBDQSAtIEcwMTEbMBkGCSqGSIb3DQEJ
+ARYMY2FAaHN1LWhoLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+nJ/H2N4/LvFSZE/ztzZMHjpTW7kj4HaelwUJc4mwrdJE/IGoivK9wpD+NEZrhbTy
+j3Nr/oTzbk7+bwfn22i98lsq1g3a5iDyjSsfqMZAjHYoxj+dkenjD8efvo7cAtDM
+GybW4Lgk0/ifZ4TX33SElQLZKcfaJ/Yf2fJLJnRRLREE/fTUarnDThK7o7boSPJv
+65g8ARKKe4oHOzpWCQdp5VvzA8wCwuVHSV0lJmtj2Sg2KOfMSjsFPEFYOSjBpE/Z
+kaJFV29froz0cAsWgtky8cIoPNxbjchwI5H8goZVKBOIxfDjhk12kHaYE5jduKCe
+5jTb9Q0SXe3CsUGhXiZ0/wIDAQABo4IB+TCCAfUwEgYDVR0TAQH/BAgwBgEB/wIB
+ATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBTQ
+4X8dxzK84pC7WBSAFMZfnezBqjAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EK
+cD7eZDAXBgNVHREEEDAOgQxjYUBoc3UtaGguZGUwgYgGA1UdHwSBgDB+MD2gO6A5
+hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwv
+Y2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggr
+BgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQ
+MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2Nk
+cDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5j
+cnQwDQYJKoZIhvcNAQELBQADggEBAD3fNZ0LEFd9QejVaBF3LIhFc1P15faS40vU
+X/4g/emHjCyIR0ySC/zKGsp0wflmIo6O6uxt6nnPWMNiIafp3fZUPYmDWgWI7F9/
+a2+/2f5L8oHiPyql+dWIqa1l+hYEDGTz9KY0RqvexShihMp/XOJwfcPB7sBos43g
+xsfVdqIThZz9dRBDz92gXSVLT5strKLWogGW/tWPA+ADR3XmQrWWvNzdtYUguSPt
+GRuhyqLxXuxBuV8kvICpzScauwpTA6Kws7PB6LImx1/tRSyAzlL7I300qdCLR2y8
+ucj4DncaX4Ua4NYRSn0HK1wgKxM36aee+wj4CP86lpwEim7jF4M=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Fachhochschule Neu-Ulm/OU=Rechenzentrum/CN=FH Neu-Ulm CA - G01/emailAddress=pki@fh-neu-ulm.de
+serial=17A42518492621
+-----BEGIN CERTIFICATE-----
+MIIFYjCCBEqgAwIBAgIHF6QlGEkmITANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTYw
+OVoXDTE5MDcwOTIzNTkwMFowgYYxCzAJBgNVBAYTAkRFMR8wHQYDVQQKExZGYWNo
+aG9jaHNjaHVsZSBOZXUtVWxtMRYwFAYDVQQLEw1SZWNoZW56ZW50cnVtMRwwGgYD
+VQQDExNGSCBOZXUtVWxtIENBIC0gRzAxMSAwHgYJKoZIhvcNAQkBFhFwa2lAZmgt
+bmV1LXVsbS5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALqErCVr
+BhbLlregAzf9cSVV4M9AjbCRHWH4fZuWNdCJiHxcDVDK4So0Wcrwtwukmf2g8ozg
+ql5JUULKAg0/IfaaG0/Sz7VpgNEA4ASZ3E4dbtQVOraR24rD5X5aDOayxxbZnRC5
+DAAxBqzmxZ6nkUToFonvhEPCikOwAGNN4Vzz+3+9An88GjPWfWJ6LrvbKMPIMEAN
+vN8RqRVElDoksHu+8Gr/MnZlZpotsTEOnk63fTeRPhIeLXo+mofbLG2cwTCHAKgk
+//Dzsxql9lpN+vzB8TSEUanBNnKTWfXAg3UgI/JIh55Jtp2z3OMf6vYyfIhgGwm8
+C+YXYTd3pezXEukCAwEAAaOCAf4wggH6MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
+VR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQU2TP4uM6z
+Rg6lnv6/CT1pVHrbaOswHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQw
+HAYDVR0RBBUwE4ERcGtpQGZoLW5ldS11bG0uZGUwgYgGA1UdHwSBgDB+MD2gO6A5
+hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwv
+Y2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggr
+BgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQ
+MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2Nk
+cDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5j
+cnQwDQYJKoZIhvcNAQELBQADggEBAFQIwDwy0SQGgfdHJWrg29AO/8vRpKsM7xQQ
+D7F8Haccy01owxhXWFaOZyXG0tIsGvTxa/7pKxSs+0P4pvSAKCpWIXw7HsBb7eDR
+5gigWEh4jo763ifPdhMo1bY8j/bxoFf6KpXefNbJiZTA0Qxe9RD7Rg47bDlvTPYD
+P/jeyXt3mr7Uj5Lznh7v5n/dYeMDr5kxW5Zde004IPGX5herKzH7JdcsJACfkj3r
+2jDsyy2h/0ARU1ovWmoefNwnq/2p/vCq86gVzfmqrWtVNnbTHUq8D3nPA0geX+Rb
+b1XnjQcB4rHHZs9qrVl1e8HmZ8G0SWjCFuJfCG+sABPdOhreMDQ=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=GeoForschungsZentrum Potsdam/CN=GeoForschungsZentrum Potsdam CA - G01/emailAddress=pki@gfz-potsdam.de
+serial=17906107BB7781
+-----BEGIN CERTIFICATE-----
+MIIFZDCCBEygAwIBAgIHF5BhB7t3gTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYz
+MloXDTE5MDcwOTIzNTkwMFowgYcxCzAJBgNVBAYTAkRFMSUwIwYDVQQKExxHZW9G
+b3JzY2h1bmdzWmVudHJ1bSBQb3RzZGFtMS4wLAYDVQQDEyVHZW9Gb3JzY2h1bmdz
+WmVudHJ1bSBQb3RzZGFtIENBIC0gRzAxMSEwHwYJKoZIhvcNAQkBFhJwa2lAZ2Z6
+LXBvdHNkYW0uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCxVK7v
+R9OgDeK7po+HapoHc1wpfEomf3L001aHLxpaP+IPXaAECw1dwNggzg79JYwGYrTO
+rUURCHWdJLEVRPaYwCig+OByV8P/ny14qjoW9fn1nUY2sfnVlt+BDZYcfQklPZfN
+p4aC02AGMLQMlz9KfIZTU0kksuzq/1XP5T71Gg0nmNcJJYJDzY7KGX6m+rFN9bh6
+87J3yrttpdTwTLhCk4WNsGubX2qpx00OGkksyOn8BYXvZfqvefqtEMN5Ypq9trVm
+YwNtMnrTWTsJDP37Z9Ak5g4hLUormXWZgqF88K8/K7vO1OtyhNzGMvt8axsM1HPn
+8S+qXHTZCBv28pwzAgMBAAGjggH/MIIB+zASBgNVHRMBAf8ECDAGAQH/AgEBMA4G
+A1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFJzIouWb
+AGzLDqKI66S6a5+zOVmEMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5k
+MB0GA1UdEQQWMBSBEnBraUBnZnotcG90c2RhbS5kZTCBiAYDVR0fBIGAMH4wPaA7
+oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Ny
+bC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFs
+LXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMG
+CCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09D
+U1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJv
+b3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8v
+Y2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0
+LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAqhUzy/xLos5grdZ34DX7vmq6ODDTjLao
+yQ9Qx3rGLE1cPKHvJvGVQhBmeXA34QRbijWQ7yMiAi4xeO6SUVlCK+9Y6jDEtUww
+cUYr3k+iSdb8dB1r6pEr3HIJVcK0AHe+4n9RW9E7YXdQSknOUYtQ3VIDOqEz/pJZ
+ePV5PaRVjFxwEogn1CsnxIPYkkZzCuOwpPx4AbfjpqwR/UmwQLUs+Fmu5Ies7V/Q
++lpAlO+Gj0eWGQZ+5IxRPqak+HZ6pHKjwxjsgJ8YqD2imRcBOT7NaM1rPUzzhVkQ
+Z8gFBLPMx7j5guFxR1lNWvDegtVH58fSF0T4aaaB4IPdfodnlBj8Jg==
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Baden-Wuerttemberg/L=Oberwolfach/O=Mathematisches Forschungsinstitut Oberwolfach gGmbH/CN=Mathematisches Forschungsinstitut Oberwolfach gGmbH CA - G01/emailAddress=ca@mfo.de
 serial=0D688CB7
 -----BEGIN CERTIFICATE-----
@@ -24666,6 +27127,176 @@
 A7ZFu3lVvDYBKMPpnWqNcX12dGaMg29f/yHxxPdqfeYXcgni5Isn1rc=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Max-Planck-Institut fuer Eisenforschung GmbH/OU=Network Centre/CN=MPIE-CA - G01/emailAddress=ca@mpie.de
+serial=166A3B8F65BC9D
+-----BEGIN CERTIFICATE-----
+MIIFZTCCBE2gAwIBAgIHFmo7j2W8nTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTEzMTAwMTEyMjAx
+NVoXDTE5MDYzMDAwMDAwMFowgZAxCzAJBgNVBAYTAkRFMTUwMwYDVQQKEyxNYXgt
+UGxhbmNrLUluc3RpdHV0IGZ1ZXIgRWlzZW5mb3JzY2h1bmcgR21iSDEXMBUGA1UE
+CxMOTmV0d29yayBDZW50cmUxFjAUBgNVBAMTDU1QSUUtQ0EgLSBHMDExGTAXBgkq
+hkiG9w0BCQEWCmNhQG1waWUuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQDgAAsCjctuuiS2aM9qnhtvVrwfVdKHEkDvesPNS7QnqwFzJh4VVdDf8Us6
+tjAFiAO03bFanMpzXq1tAwUk5Op+6aI5bkARsWmMtDW4KVYQRDLByK1CjFESZKr4
+mtnnXCWe/rFfVYi/FvvN4QKFktWjTrpOkwSkhsT+Pqmv3br+RBEbrP2hfpOU+8g9
+HnKRA7Lva8o/OXOriCvfiLSrLTeiLScADiVJvK7q18MoTixpHpm70VoDMozfHM/L
+jusF11NDKN94g44eoFZEVplaXqyv58/M6cW7YuDLVFMQQR6vyiX8m1lqY6UUxvRP
++OInEA8hGTCyg/hbjpgkexUrZNODAgMBAAGjggH3MIIB8zASBgNVHRMBAf8ECDAG
+AQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0O
+BBYEFPw2O9OseHT/xhBLcsRK3rQ5CK+xMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7
+Eyn38QpwPt5kMBUGA1UdEQQOMAyBCmNhQG1waWUuZGUwgYgGA1UdHwSBgDB+MD2g
+O6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9j
+cmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2Jh
+bC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAz
+BggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9P
+Q1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDov
+L2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2Vy
+dC5jcnQwDQYJKoZIhvcNAQEFBQADggEBAMtm3c5mS0HobzgY35Y91G+eTkn9pQU1
+ncyHbPKO2/dtiuyEtSNgAzfimBf7cfsCtiLxRFXxJ3hj7hHcodcxLHp63Fdp9Gx+
+/XIbTdurYRhGVyuks/ZrHlxEsYz+raWB/BxBqHd5Kv4U90KG59q6qq5YInrYzzcI
+jRTYb0pSfoJU/KYj+SoD40RNinvkAUYT42MgIKGDPwvtcGw3dg64V4voU4TOOYJ9
+4LvNldw5fvyrTKp8imb4FA1ga8cdSZg3ByNvGtK7l6z7r/4jmH7eVRqBBcHWacbG
+Z3SDkETh7/DVvcGAVc22uRLLinNdDlaeHheHz4TCIBECVpFwhVeBNSg=
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Bayern/L=Muenchen/O=Ludwig-Maximilians-Universitaet Muenchen/CN=LMU-CA/emailAddress=pki@lmu.de
+serial=17A4250F6D0E34
+-----BEGIN CERTIFICATE-----
+MIIFZTCCBE2gAwIBAgIHF6QlD20ONDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTYw
+MFoXDTE5MDcwOTIzNTkwMFowgZAxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXll
+cm4xETAPBgNVBAcTCE11ZW5jaGVuMTEwLwYDVQQKEyhMdWR3aWctTWF4aW1pbGlh
+bnMtVW5pdmVyc2l0YWV0IE11ZW5jaGVuMQ8wDQYDVQQDEwZMTVUtQ0ExGTAXBgkq
+hkiG9w0BCQEWCnBraUBsbXUuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQDVKOyRZyHbxsqsIUcVQEQ7ItWYxvGz+OLej/nAKIa5DM7s8eani4CKAw2k
+uqRKuzXbZ3aBvnVw2SZUsdQxB/kVTDQMwNio5VQdT33Vov1IpqsNLsHknR93Jlha
+PP/ljogNNMMVYF5P+xYbFJ6Q3DNFaudZ2H7BuEMTGWWeyg/ONsCNMnSh4Nw2sdAr
+zY6WIlMJLeOaYn2pM1Chj5srUTb8hcA1RNjD4q8GZt2BTfUz41tdUllS4gXu2/CB
+QIuxSEBOQln9VEznTU1YRwTcKUyQgia/xRRe5ryPp6SpQbLvkM+D/R2vhblfgR/0
+3x/cEgJUeG0ATl0c0sIih9ju5flHAgMBAAGjggH3MIIB8zASBgNVHRMBAf8ECDAG
+AQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0O
+BBYEFHmHeGov+pu8I0+UpqN3HR4OlIAPMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7
+Eyn38QpwPt5kMBUGA1UdEQQOMAyBCnBraUBsbXUuZGUwgYgGA1UdHwSBgDB+MD2g
+O6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9j
+cmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2Jh
+bC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAz
+BggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9P
+Q1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDov
+L2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2Vy
+dC5jcnQwDQYJKoZIhvcNAQELBQADggEBAGVyhFOIbZadiJKj7yk48ueklon+93X2
+lH64OXtOJZgLsEktK2Gh/3Sy9uiH8foC60hG5B1/5abEmsXmVjr6BN1/zVaCSDKq
+3buAzfb9R4yj1GHcOI3nNgaZPfSJ/qKhRQulMQvS7RcZwvxADPlx90KN79WlCyn5
+iPgNc+Y4m11U92QjFbL3Mzf5rt9iyVpHnuJB1UsblyUnEyzsCLPZcDYoMJ50joI4
+i8R9Ccjmd8FNyyNizK/jIqJb+W0a+5Usn7OOykSdmHKPqguoflEQdWPJOnbYe7rt
+5cde+Sd+ABozWhv/JYDGkQ/4JL1Xma7qKqdTO5BaGzQhldY9l1dQA00=
+-----END CERTIFICATE-----
+
+subject= /C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 EV SSL SGC CA - G2
+serial=7A0F41DF1CCD14DCB269298EE22C6A35
+-----BEGIN CERTIFICATE-----
+MIIFZTCCBE2gAwIBAgIQeg9B3xzNFNyyaSmO4ixqNTANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMTMxMDMxMDAwMDAwWhcNMjMxMDMwMjM1OTU5WjB7MQsw
+CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
+BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxLDAqBgNVBAMTI1N5bWFudGVjIENs
+YXNzIDMgRVYgU1NMIFNHQyBDQSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxDhMQwqzoGTTUNPmqgk9gLqsHOgKaWOOgOFWBDG5b6gJiqjUtAxM
+vwYqzn3LofSsemv8msy/whs+dsx7XVCzHSZsFZXgS9RdoQzTfRNZC07FlpBQLoiT
+lq+XMnQN9xukxwkqFk//+lJW73H/MLW0ZUJZ0pySdadcdKVRjIg8U41mmt6iyPjI
+3T05XcJ5xEg3xij6JHP+DCpo8Gao0LLwdpQiGGzzj+TRrVmBD479ioVeReh9iFbv
+FGPKDppmNIfsv/3hUQ4azUtPq/xSmEhN9/vWsHGiJ7htRraPgFiASVcOdjPvnG8p
+8Kh/sNUP39bBAcsMeO2cbbstldi/x5Z6TwIDAQABo4IBkzCCAY8wEgYDVR0TAQH/
+BAgwBgEB/wIBADAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vczEuc3ltY2IuY29t
+L3BjYTMtZzUuY3JsMA4GA1UdDwEB/wQEAwIBBjAvBggrBgEFBQcBAQQjMCEwHwYI
+KwYBBQUHMAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wZQYDVR0gBF4wXDBaBgRVHSAA
+MFIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc3ltYXV0aC5jb20vY3BzMCgGCCsG
+AQUFBwICMBwaGmh0dHA6Ly93d3cuc3ltYXV0aC5jb20vcnBhMDQGA1UdJQQtMCsG
+CWCGSAGG+EIEAQYKYIZIAYb4RQEIAQYIKwYBBQUHAwEGCCsGAQUFBwMCMCkGA1Ud
+EQQiMCCkHjAcMRowGAYDVQQDExFTeW1hbnRlY1BLSS0xLTU0MjAdBgNVHQ4EFgQU
+Rk/B4IjafdN4m8huWS+w5PcdkOIwHwYDVR0jBBgwFoAUf9Nlp8Ld7LvwMAnzQzn6
+Aq8zMTMwDQYJKoZIhvcNAQEFBQADggEBAFMvp4r4RXIynzhC9YXex2z6fOW2xFf9
+QOatRfSb6/6bBJbBZl+ro+DfGmDr0JPRwRqKhcG89tgLMHNcFj64Sb0DHZcZ4lqY
+qP6GFh4JAMLnuU9lI+Tck33+UyDZgPXjcmCuKez/ZzYLTRqhxvCf1SdTPtpP2YAK
+NAt2EMJ19Kl37x4aNKouge9PeAOPfIunBLnl58uTgHtqBs4ux8kaiMo7FLB1OdXB
+IwNckDPsgQz6sxw4WgNdqAij/tXJCFfJj2lf2X/rckAXzYEZueTdSfWqXP+Y2jLs
+fJMqJv7aTB4j9xjkO2IJZ0Mg7Ta4OjWgbNxpWcoqJ5Q6be54oEex9ZQ=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Universitaet Bielefeld/CN=CA der Universitaet Bielefeld - G02/emailAddress=hrz-ra@uni-bielefeld.de
+serial=179060D258D603
+-----BEGIN CERTIFICATE-----
+MIIFZjCCBE6gAwIBAgIHF5Bg0ljWAzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDUz
+OFoXDTE5MDcwOTIzNTkwMFowgYQxCzAJBgNVBAYTAkRFMR8wHQYDVQQKExZVbml2
+ZXJzaXRhZXQgQmllbGVmZWxkMSwwKgYDVQQDEyNDQSBkZXIgVW5pdmVyc2l0YWV0
+IEJpZWxlZmVsZCAtIEcwMjEmMCQGCSqGSIb3DQEJARYXaHJ6LXJhQHVuaS1iaWVs
+ZWZlbGQuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6yEIff/w+
+TsAEysFvAyBjUqpYMqEgH7qwo2H+fTNHsyj6i6jIKYgvReQVAr0xaSUwwrLDd60+
+3LQ77L45uZswqI4yqNAC71q36JGlZv+I66IHc0ujB9YWjzCCBEIadaX0sze7rqPt
+u+DB2ngxjLwDHQBDMvADOGOHxQbgRYorI1uCOec61tGD4TXPg7st36qJlz1c2Xh4
+F9uQ0BaI0llEGi26G2J7jmnutEVxDFbqZ8+dtfcVLbvBBilWu7MmBn5c0elpzMlv
+CSeSR4vzzuglN8R4yhfUAoieIJ4sgqbi1NhmKDF/v9yDeJdwa6lIlNC2YKCIhCh9
++XacfSQLyHRNAgMBAAGjggIEMIICADASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
+DwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFKIgigusAs2B
+PEu3SIpUrLAEttyZMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMCIG
+A1UdEQQbMBmBF2hyei1yYUB1bmktYmllbGVmZWxkLmRlMIGIBgNVHR8EgYAwfjA9
+oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccw
+MwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIv
+T0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6
+Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNl
+cnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAI9QAvdYwxfy7jvk9bkAiHxj2VuLGg
+CIYsXctFc+AA+JSjzWkacIlIlN+6ttYrRDvO9cfKPUMaXuTZNMI/7Zsbq+d3BPIq
+2IQ0Bhde3W3s4Tn5587t4Re/QNSFtD/7w9f+E9YTj6GxvchqJbSu5Bw14cFjesD9
+R9LHodvbZ1XHDq3mb9dwYABYiTctOMsyudfs0QLqD14g9U8iAwqcXqQdnJwF8d9b
+byh5XI3QW1CYcycLeMOtya6GVjFb3Tl1E3bPzJwcJq8J+O9lQji+bAFT4H518l5x
+4ymLtIYO4fadaIvhizyzOan3AkpbC/CT2uGmNhetvTz00/HF+6V1qQuJ
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Hochschule Furtwangen/OU=Rechenzentrum/CN=HFU CA - G01/emailAddress=pki-ca@hs-furtwangen.de
+serial=17AFF6A20BB287
+-----BEGIN CERTIFICATE-----
+MIIFZjCCBE6gAwIBAgIHF6/2oguyhzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUw
+NloXDTE5MDcwOTIzNTkwMFowgYQxCzAJBgNVBAYTAkRFMR4wHAYDVQQKExVIb2No
+c2NodWxlIEZ1cnR3YW5nZW4xFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xFTATBgNV
+BAMTDEhGVSBDQSAtIEcwMTEmMCQGCSqGSIb3DQEJARYXcGtpLWNhQGhzLWZ1cnR3
+YW5nZW4uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDXwWfbL6BC
+By8WJyoeP4MD6JfvBCco8Mw9M7ru7c5WwGoHF3zzQuyaRXSeROF7KeaxTeho3gZc
+PIeYHPEnt2Om5ny40nljohYRH1/EmLkxzeniEkhgT+6tV4+ECw6k+ASTY8Ihv25Z
+aNnf8G16jnmtVSEBIQlWjR2sk55u4lHaQrXyCDXhmgSfEaq+oaNId7kdT3nc1R0o
+cjEsXmGDjYCRN+V+OE10AHj98V2344u2EpJPi8+AjG80C5bbkGtRquyPvVLYxLQ6
+MXwQv3YQmIiSozEL/On4iBp5WVVVdjL7jV8uDYfrz9CD3jlw5WiTl5pBqgNrQmdM
+4+uokHakpUYJAgMBAAGjggIEMIICADASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
+DwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFGhwEA3JLXMG
++YgYPp+LjO0pABbHMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMCIG
+A1UdEQQbMBmBF3BraS1jYUBocy1mdXJ0d2FuZ2VuLmRlMIGIBgNVHR8EgYAwfjA9
+oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccw
+MwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIv
+T0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6
+Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNl
+cnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAMRqu8BfesOn5XPkoFgUZ+5rq5V6/2
+gXuAlOecOGWIeWDeoOXhqe3ARcDN9blotAyvVwaplXiiAsu0z5cpmncUY+yqVX1x
+L8qDgWXFs/OWEDtSYL6+RWkFAbi7zrKr3SAja6Is/ftcFmb/3VDf+DFUA3AnJyKw
+iuftcIKkiiSikrdXHKMHqGrR6Di9+vosXbIkal7qkMeBD7yzYL/M7GrX2ZdkbRz1
+uBXbBs7s4REksnuCAO2h+5QW69ElTzirVBw89Al9uhG1J5T41ErsEzeHV8eA+0eD
+rWWYJWytFAywvFDCov3TiMN/Zf+VnJ94jtXAeSUClXRkKtJd/02PeSAJ
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Bayern/L=Ingolstadt/O=Hochschule fuer angewandte Wissenschaften FH Ingolstadt/OU=Rechenzentrum/CN=HAW Ingolstadt CA - G01/emailAddress=pki@haw-ingolstadt.de
 serial=0F87AF37
 -----BEGIN CERTIFICATE-----
@@ -24700,6 +27331,108 @@
 haw9DJNQ1+iopPtLME5r33D6l0UGnV4qm0xmFokoSB8JfiNENcZaXYqDNw==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Universitaet Freiburg/OU=Rechenzentrum/CN=Uni-FR CA - G02/emailAddress=pki@rz.uni-freiburg.de
+serial=179060EE9096EF
+-----BEGIN CERTIFICATE-----
+MIIFZzCCBE+gAwIBAgIHF5Bg7pCW7zANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYw
+NloXDTE5MDcwOTIzNTkwMFowgYYxCzAJBgNVBAYTAkRFMR4wHAYDVQQKExVVbml2
+ZXJzaXRhZXQgRnJlaWJ1cmcxFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xGDAWBgNV
+BAMTD1VuaS1GUiBDQSAtIEcwMjElMCMGCSqGSIb3DQEJARYWcGtpQHJ6LnVuaS1m
+cmVpYnVyZy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ/ubPKR
+yTxV/wVTLkPC1i00o0KZ8EsEADiPRJnz9osnn/HyWBNAZmtNc7VTFmlwIgyj69Ck
+d8dJWADfS2KHnP1rXrMcmoOKm24cLDBx2Ga4YRZ9IEmAXmDR/RVcHYU6I6jnFTyQ
+bD4haQL/47PEIwo4MZcdM4giz/JFBtTUcquqGNR6k2HUe78sFC3wRe1Zs84tHedT
+gEkuzcbanjTPA5THDzLxwVe7RomhsqVgqCkc2q0fJnuH8tfmMyOlrEf2xspNP5nE
+vZ9Lp6KCE3i0kUjmzO34VYZJIL8Zx1a9ZnBhmL42cfQIqEnEICCu0H5nExhbB98w
+VDEEBvCmDuE87OUCAwEAAaOCAgMwggH/MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
+VR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQUM2ep1vGT
+VTasoTK9weSWOf9McDEwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQw
+IQYDVR0RBBowGIEWcGtpQHJ6LnVuaS1mcmVpYnVyZy5kZTCBiAYDVR0fBIGAMH4w
+PaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xv
+YmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHH
+MDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVy
+L09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFs
+LXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRw
+Oi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2Fj
+ZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAjl56HEqzPIeWxNlPocCw8V/LeAM3
+0cTzEqtF8+qHKVU2R0Z17uLT2yDjjZRaDY+aCVSrsELEa7f2y5Jj2JARnN1fkKym
+S0WB9rw7Yphr9n7v8rTGinJjonNn0QhcemmaJhcTxliiY8SvFop1ZPpYbBEApQvg
+Vjyf5NsOWsNwrzl5tBxTXwXf3tLyCmHoQCWTT8ujzUg/dHGjEtRf0GzxhRZBDYaG
+vJBl8iUSqlEgFFKx3XNLGAcJi+BBOzmxoniMr/o1mM7npxZoY/QdnnrhS4ZLaU8P
+g5jItQaCHzQrxiB44kdzE4/n3jQXoRJEWw9SZpE6Lyzt5QaojpZ61z8OIQ==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Hochschule Bremerhaven/OU=ZBRV/CN=Hochschule Bremerhaven CA/emailAddress=pki@hs-bremerhaven.de
+serial=17AFF6AE5E52FD
+-----BEGIN CERTIFICATE-----
+MIIFZzCCBE+gAwIBAgIHF6/2rl5S/TANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUx
+OFoXDTE5MDcwOTIzNTkwMFowgYcxCzAJBgNVBAYTAkRFMR8wHQYDVQQKExZIb2No
+c2NodWxlIEJyZW1lcmhhdmVuMQ0wCwYDVQQLEwRaQlJWMSIwIAYDVQQDExlIb2No
+c2NodWxlIEJyZW1lcmhhdmVuIENBMSQwIgYJKoZIhvcNAQkBFhVwa2lAaHMtYnJl
+bWVyaGF2ZW4uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzxE10
+qnpkWzi9912G6rZ2PZ0LSjcS/uXWOEI0djoPJX2dfDtBGS9Ll7cLBmEI4wSlbh55
+dgb6UOlN5fRHup1e2jd0B7eqbTx/zPb3ka56UyXC2wxEiZgBiknrHjniGQq8Kpmi
+twGTwDNKwD+yrAkbDjc5WQtJFamfsJ8GJHlbjdhYDUlZqlaekPTK2hsScCnrGkaK
+9QUEwDEv6l/7WT39s8Vk99uqEqbHWqIBKkCiZCeB6AonUDQT6cAVX2PPG05C5Yh9
+JfVVMlNP3u47UCoL2xD3nnwRYUKtDr4Fqw8oN8sbonwEK5DVn8dJkR+StE0RKOb/
+Pfn4/dz27O3MCzoRAgMBAAGjggICMIIB/jASBgNVHRMBAf8ECDAGAQH/AgEBMA4G
+A1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFH9kh6hP
+Zfr3S1y9tk3WoAqabZOhMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5k
+MCAGA1UdEQQZMBeBFXBraUBocy1icmVtZXJoYXZlbi5kZTCBiAYDVR0fBIGAMH4w
+PaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xv
+YmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHH
+MDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVy
+L09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFs
+LXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRw
+Oi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2Fj
+ZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAKXUcPG8ZIHgRBVWPgDAz/IjZti0n
+de/QFtLHx56BMF/MGvIAUslO/j2RoID3We3K/dgDmb5SCxbyY/GJekNqkS5qoyvf
+zh3JllyZTLEj+Gxjyyt54hpNuCizxq/38jlU78lOFtiGlvb9Ns1Q/jz7VaUVrsUu
+aHSiNDVRc7ISBrL4CCRxZeNQNPxT3hiX49mv95FHA5ayBEfXalOZblezPPtSyKdC
+KiCOvwLlD5Q7DIwWZi2tV+f4uvPynZB7L7ICHpJb3IJq0UF8BRJ9odqDPJSSxXwI
+TLDNdPkm+0TRQSz/E3y49RvE4MO7TmAyOb9NfAtnorP69amE/b3XwvmUUQ==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Forschungszentrum Dresden-Rossendorf e.V./OU=Informationstechnologie/CN=FZD-CA - G02/emailAddress=ra@fzd.de
+serial=179060D84716E7
+-----BEGIN CERTIFICATE-----
+MIIFaDCCBFCgAwIBAgIHF5Bg2EcW5zANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU0
+NFoXDTE5MDcwOTIzNTkwMFowgZQxCzAJBgNVBAYTAkRFMTIwMAYDVQQKEylGb3Jz
+Y2h1bmdzemVudHJ1bSBEcmVzZGVuLVJvc3NlbmRvcmYgZS5WLjEgMB4GA1UECxMX
+SW5mb3JtYXRpb25zdGVjaG5vbG9naWUxFTATBgNVBAMTDEZaRC1DQSAtIEcwMjEY
+MBYGCSqGSIb3DQEJARYJcmFAZnpkLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEA8m1GeCgBDpPgT8IUvZ2FQLJbvz6fpH1JA+DlZgNog4uFLue/6Lh9
+pT8EvcNbor8Qb2rt9rwRbk3p3WqEc7AUZdxUY9ZGaYqcR9BUwHaFyaEcSYmKTfQ2
+scoxiazM+rmxu+UXtF/wBh8kHo9CSsY4eWy1GSDkYksZlWhqOImpVkQmEWgoqu7b
+rg60ug6YtbzE3n93MVQRQF4bFS2Kxvh+Rpq7u9eP1UYIqG0+0G7T3v9CT/a7gw7q
+GQGkryoE+G3YoRq/1KM4+LZVWKgQzLGH3XMzgSbGlXzWfJ/aWsD88UkKyKjMiFeU
+isbO7yyM5FhYaZT2f6ZM25AuBvI+P+ZhOQIDAQABo4IB9jCCAfIwEgYDVR0TAQH/
+BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0G
+A1UdDgQWBBSlKUj1lZkYtT43yIYCik6/QvAdjDAfBgNVHSMEGDAWgBRJt8bP6D0f
+f+pEexMp9/EKcD7eZDAUBgNVHREEDTALgQlyYUBmemQuZGUwgYgGA1UdHwSBgDB+
+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1
+Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2ds
+b2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCB
+xzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZl
+ci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2Jh
+bC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0
+cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2Nh
+Y2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAC9Y+prXCAxJzhcGTqHbUWZN0Bbc
+tjNv4zorznGPFZ42NVfCSqR9gIRiwnDBYlBJ+Q+PppFZNE/97E1XCmk/iFWE89wW
+tEfTem5OPjKej3FfnuVCl1e11o8re9j91KC2Sv4B5tXVwZ1C0tjJDFvA0c4g42pc
+e38LNR5kpuGPeGXrDCscTF0R1eTWzt2OLBPVjLl43Sf8RbIM+R0s1VSlb/YGnVLU
+AK8TcRuoNgDwIFa7uxtC7DP2c+WrQt4lESADB2finpsWW9a+prAH6RWd8PuW3lPg
+XBd7vum8wpXfSVF3oXvPakBQaz57Dr9EC6GMMkKy8PRxj3Ak0/XQAIKJWPo=
+-----END CERTIFICATE-----
+
 subject= /C=TW/O=Chunghwa Telecom Co., Ltd./OU=Public Certification Authority
 serial=C953FEEEB895E91884ABB22A68A42A7D
 -----BEGIN CERTIFICATE-----
@@ -24836,6 +27569,40 @@
 r+RVVvxCP+FYD4begjQmTyxOEXtTwPFeREGcYZU9FtT2vkcrJkRXFbCFiRsr
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Universitaet Muenster/CN=Zertifizierungsstelle Universitaet Muenster - G02/emailAddress=ca@uni-muenster.de
+serial=179060EBAE9B8C
+-----BEGIN CERTIFICATE-----
+MIIFaTCCBFGgAwIBAgIHF5Bg666bjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYw
+M1oXDTE5MDcwOTIzNTkwMFowgYwxCzAJBgNVBAYTAkRFMR4wHAYDVQQKExVVbml2
+ZXJzaXRhZXQgTXVlbnN0ZXIxOjA4BgNVBAMTMVplcnRpZml6aWVydW5nc3N0ZWxs
+ZSBVbml2ZXJzaXRhZXQgTXVlbnN0ZXIgLSBHMDIxITAfBgkqhkiG9w0BCQEWEmNh
+QHVuaS1tdWVuc3Rlci5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AJHHWJslAlN4Ur306v5LbuDr+jsXu4uEiHjWaOKNIasGiaV0Mh4VAuyPUiCOvaYU
+1FNfhSQnDnSc20cT/g80efYFJMygl0fxDgz2WUeP/zcVQZQ0N7dnVNe66ggbiLq9
+NURcHLnBlF2jDGcBV0f5nXT6pYHQPhu78x+wVM9oZusQ9tzQXLvrR7bgnNXZ0YTC
+XMaApZw4CRl4t2m8KVx/xDqpPZZMxHRSOpSlz1o7Caj1SRqkz10K0f0Hj3MRYYOY
+CQjCaQtpqMGawjU8LpCMacbMoq6hiJVBSfGQdNKZafu+GaE5ld/yobWViwV+FMMH
+Xp11WYaThl9HbKouzqUfzb0CAwEAAaOCAf8wggH7MBIGA1UdEwEB/wQIMAYBAf8C
+AQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQU
+vp5RosmSfLtgi+awaGR3WlIZoQAwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffx
+CnA+3mQwHQYDVR0RBBYwFIESY2FAdW5pLW11ZW5zdGVyLmRlMIGIBgNVHR8EgYAw
+fjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9w
+dWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcow
+gccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2
+ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0
+dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9j
+YWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQCb7WDa6y5go9o8w/CAAXjU8d/x
+DrE9QWedVcQFmEvTNtD1DejKKdExwFACiVNsp5xlaxqmQXhl+KM0i9y2WLTkFfJn
+JlQsXj32/4OSIQBYvbe7icxj85dF7wDylDxQJgWnShV0SuJrYzLvLwhBxijf52x4
+Dhm+OTk4qOiq+DeQFOdzu2icU28TxsEnHDr8fUt54wHGx5rGA2S4/9i3Z4n7lnEU
+t9ct4QZ79r3Bi23Yi6uJ5Rt53bHxGMyXGRuOPW7XrRHnA3C67pkTT2wMdQCdbgfu
+IrHfKxcsw2FXPf3XKqQoC1lbiSH/rzKkIj3hJC4NqYUGR0UaWqnN3Bs+fR8q
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Niedersachsen/L=Hannover/O=Land Niedersachsen/OU=Landesbetrieb fuer Statistik und Kommunikationstechnologie/CN=LSKN CA/emailAddress=ca@lskn.niedersachsen.de
 serial=0E8FCDDD
 -----BEGIN CERTIFICATE-----
@@ -24938,6 +27705,210 @@
 yddkD3aSWHViIPfG+uiE05IMUR6cUASMOkfbH3XeorYhu9TOcD6X7V8UyvOqxzo=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Deutsches Forschungszentrum fuer Kuenstliche Intelligenz GmbH/OU=ISG/CN=DFKI-CA - G01/emailAddress=ca@dfki.de
+serial=17AFF71CD0145F
+-----BEGIN CERTIFICATE-----
+MIIFazCCBFOgAwIBAgIHF6/3HNAUXzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDcw
+OFoXDTE5MDcwOTIzNTkwMFowgZYxCzAJBgNVBAYTAkRFMUYwRAYDVQQKEz1EZXV0
+c2NoZXMgRm9yc2NodW5nc3plbnRydW0gZnVlciBLdWVuc3RsaWNoZSBJbnRlbGxp
+Z2VueiBHbWJIMQwwCgYDVQQLEwNJU0cxFjAUBgNVBAMTDURGS0ktQ0EgLSBHMDEx
+GTAXBgkqhkiG9w0BCQEWCmNhQGRma2kuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDA91SMX7kVnNKpegNpJzxyv/Q9kUI37BrPVe/lOEuUaFmlb4j3
+PxZ+P7uvMahnBGlNFITz1lFq2f370v47mNvive8RbVWIf/Q1k+39QKbjjg2I+KZB
+7q2+lGCylQpTiuqsPsF7+Fb0rY2RXfDfit12mhiHBmxQDT9dBhr4y0NogVLwM3Gf
+DyRYryaSyw8HP3S00msP2WyI4V7kV3NTCjuy/hyZR3TZo/0prk2DiHqRUYil7FjV
+H5uH2qdYUfkGMIv/ory9RE2poWw0D/8Wx1te9/AoI/qhasKwCAXM5/wzWJm2oefX
+4BCG8Jq+896uRCYr51IG+MqnPYbUpLLOfY7nAgMBAAGjggH3MIIB8zASBgNVHRMB
+Af8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAw
+HQYDVR0OBBYEFLBD2QHTeMxYrYcU8tQ6SKpwcUrsMB8GA1UdIwQYMBaAFEm3xs/o
+PR9/6kR7Eyn38QpwPt5kMBUGA1UdEQQOMAyBCmNhQGRma2kuZGUwgYgGA1UdHwSB
+gDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNh
+L3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRl
+L2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSB
+yjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNl
+cnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2ds
+b2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7
+aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0
+L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBADZDqRmsskqtvTvZbWUGVSM2
+b9o/pHFNFyaStxfncQ8t0hCIIKHzqUjABUTshezbkmxpaC0kXFsu+uFfcdFMMQgx
+p33dQSHhTUE0RuKYKb1neQ5bs0OWSOooS+zYyA8cE0iY+xIyMJQQ9NaMypSGsNG9
+2JQM2r2LiyP5B+i54GXmnUYHUGrLzOi0sP9sZ6R2zyX8xi1lehskF8fCJZm00Gpj
+wU3pkMLcpnSG/173Ns3hm9DepFcPNn7SJ4gMICZoOq9YL4jkqXC+rP2E43dKpLg1
+b8X265MnheJXIoMjupZwltZhNCxBxVDQmGO7TctZ4iGtJQ8H4ubm4EVS1aDxOa0=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Universitaet Marburg/OU=Hochschulrechenzentrum/CN=Uni Marburg CA - G02/emailAddress=pki@uni-marburg.de
+serial=179060D9AFCD84
+-----BEGIN CERTIFICATE-----
+MIIFbDCCBFSgAwIBAgIHF5Bg2a/NhDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU0
+NVoXDTE5MDcwOTIzNTkwMFowgY8xCzAJBgNVBAYTAkRFMR0wGwYDVQQKExRVbml2
+ZXJzaXRhZXQgTWFyYnVyZzEfMB0GA1UECxMWSG9jaHNjaHVscmVjaGVuemVudHJ1
+bTEdMBsGA1UEAxMUVW5pIE1hcmJ1cmcgQ0EgLSBHMDIxITAfBgkqhkiG9w0BCQEW
+EnBraUB1bmktbWFyYnVyZy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAOtputnG9ibUbBWLIdkya5GO9oRENnkMGdJStSBmitoqfY5HBasdSD4ckfZR
+LC435+3704pPKMLYhkMkEp1vCZezDhvO9sb6GJOhp+hBZf1NzF3c9cdzWD+bk9lR
+Du3GnrqriPO0AbyQCEuTSPqU4AJ0n2nXi7YayXggV6MM2+lAn5EjiYXb+koJUbf2
+4Un4c7C71veBXyKxcsXCifFjVQHozQmgeCbp96uSiIBEiCmM20eDY3x3JVLiWFpL
+vMX0bxH7Gkge0xY7g3d5/xlZZhZFxUB7GA5YOqlnOqWszYeeM8UFRnQI2Nkk6D03
+6UDLJV+I4OCGJ3tK2MXCFAsXS9sCAwEAAaOCAf8wggH7MBIGA1UdEwEB/wQIMAYB
+Af8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4E
+FgQU8XpfsK40LX+ME5/XLwIhmAmPKvMwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsT
+KffxCnA+3mQwHQYDVR0RBBYwFIEScGtpQHVuaS1tYXJidXJnLmRlMIGIBgNVHR8E
+gYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEE
+gcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1T
+ZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKG
+O2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2Vy
+dC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQDgx8fFzvw6Eg40QWI1vS4x
+XzlssRCtkJLAc8rvlHxxmDt6bBAO0WC/Pgra7gLjrY1gy07TQocUL9UVifmzCvk1
+7yV55vevEosTtJwPoR3dxPrDp2dJMqOlyOriNoazTVYm36z+/fk6CMY1yIYEVROe
+WVwgxsyjHWQJHwggphXnbMFJO2KkPj8gkU+dFTaBNV29wy+aE8vtqkQcAH27GVm7
+mAt1HzN4hM+Rr9GSDZaeki11qHr7VMTj0BebXzt4KGkkewg426f7uG6IdLa2Q6YO
+OTjcyhSGD+hCEmEnzQeRkBzN4Wm7sZZOWd7OYZzo1U8RekFHKGID5ejhrtD2hrOj
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Thueringen/L=Jena/O=Universitaet Jena/CN=Universitaet Jena CA - G01/emailAddress=pki@uni-jena.de
+serial=17A42482A14E04
+-----BEGIN CERTIFICATE-----
+MIIFbDCCBFSgAwIBAgIHF6QkgqFOBDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTMz
+OFoXDTE5MDcwOTIzNTkwMFowgZIxCzAJBgNVBAYTAkRFMRMwEQYDVQQIEwpUaHVl
+cmluZ2VuMQ0wCwYDVQQHEwRKZW5hMRowGAYDVQQKExFVbml2ZXJzaXRhZXQgSmVu
+YTEjMCEGA1UEAxMaVW5pdmVyc2l0YWV0IEplbmEgQ0EgLSBHMDExHjAcBgkqhkiG
+9w0BCQEWD3BraUB1bmktamVuYS5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMKyHtmKxPVThu4QQLdTMH/ruQ7Fjz/geEwVMNH6bMyoTdziTSCBDAhf
+g7qIBLROk7+8dg4K12ipgNrzh1F7LJjvVbNoPKpkEy+PdrEmk3Y9oZFNDXwMBsYA
+oBfq0VUK4AD/SnVGH64GSQSjnIixJNT83J+1udVSf3zjFYb97MPAjQ7zKieEa7If
+pfsTmWxqh4kbDJV5smF1cmB3g9tkswTeaIK0W5mc1bnghp6j934vT+uJ8KKtC49k
+0DejBAcJ+dK4epJzOGbdGFYDk2wZvMlxXqsVxKR0t977nHqIZREJrjcbhJ5DjchJ
+VbEfPkbml8U3Ymn3P6iO6wBW1nyI0JECAwEAAaOCAfwwggH4MBIGA1UdEwEB/wQI
+MAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNV
+HQ4EFgQUGlg/3I08EeVUPoY7bC5TtnqqScQwHwYDVR0jBBgwFoAUSbfGz+g9H3/q
+RHsTKffxCnA+3mQwGgYDVR0RBBMwEYEPcGtpQHVuaS1qZW5hLmRlMIGIBgNVHR8E
+gYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEE
+gcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1T
+ZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKG
+O2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2Vy
+dC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQDL65k6PH8RKaSCBpzf0zD+
+Mz0leY4XTmNsSdPFMOKIN+Ce9ceA3vefY00WXPAsBE1IlfgGClq/9kuyynoO78iE
+kKSDpG9G4q+WHnx+JTPAGfPtR76l7PXr/rhOWMjG02+QQePmUMYzPCvkCe4yVTIz
+H/T54sgIAhToj53RVcphmln/0EtRFoNHCUQkjEzUo65so+6kPBJyzYFMm/QaKpq+
+J/odoDl+788RFFiU7Gugly99uoT70C0VRa/z8urNqSvHnSyWywBE8bqdzumkKOlA
+yy0agqlU+2XnO7HhjkEzQEQDHBx/ll+Ew+tcy9LwOdVVeqICNpnrtxoxyvmZvSE4
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Bayern/L=Muenchen/O=Universitaet der Bundeswehr Muenchen/CN=UniBwM CA-G01/emailAddress=pki@unibw.de
+serial=17A424AFACED99
+-----BEGIN CERTIFICATE-----
+MIIFbDCCBFSgAwIBAgIHF6Qkr6ztmTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTQy
+M1oXDTE5MDcwOTIzNTkwMFowgZUxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXll
+cm4xETAPBgNVBAcTCE11ZW5jaGVuMS0wKwYDVQQKEyRVbml2ZXJzaXRhZXQgZGVy
+IEJ1bmRlc3dlaHIgTXVlbmNoZW4xFjAUBgNVBAMTDVVuaUJ3TSBDQS1HMDExGzAZ
+BgkqhkiG9w0BCQEWDHBraUB1bmlidy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAPsWJ5KLpWLV3N4ba5oihn8Bi8f+sQo0Ifd4+Fe3ZQZuxRzrJRbg
+/MYdPY5Yf+ehjp4YsOWEcLsDXe552jDBCHeGqXqW/CeK4f1MUd+w6kch3W8Z9S7J
+iaNjLl/MOCU40SE/vxmJ8fJ44HGKTSm6CB2T50jdhrrG24KJLj9uTmpwtTbmT93q
+PXY6X0IpxQRxtT7SoRe0NdfW+kmBwuQMoBdRXdyS0rZlhktkd8sfxwK2GunTB8ya
+ucBjkcj5H1rnCbVml2J/ygAlGz8+rPwzktvw0WYsJ7qXSIjG4etQ5h3KnXmBiCpg
+Qh3YPJHCY2zWlRns5mLAHbIL1/9nOIHE9q0CAwEAAaOCAfkwggH1MBIGA1UdEwEB
+/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAd
+BgNVHQ4EFgQUjHN+YMkMhHcwiv1kjQmEwMwG5jUwHwYDVR0jBBgwFoAUSbfGz+g9
+H3/qRHsTKffxCnA+3mQwFwYDVR0RBBAwDoEMcGtpQHVuaWJ3LmRlMIGIBgNVHR8E
+gYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEE
+gcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1T
+ZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKG
+O2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2Vy
+dC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQCPVgUs0TRusFpePMNBsX0F
+gx7gpjRVrYBAcQ+r31tx5PFzeP/gsa2vfeUfyjYGDCUwEEfFSgy3C7Hrz4vrDWYh
+CvOYRqEfjYbyF2dPGHBipnlqnFjvsQV/Q8DnhJmYyuX3qlFuxgR9ftW40l8DQ1Gp
+EfNcFyI8AxCCxESuz6/+0WCLZi+kb6RmiLmAioJbPiwQ5Ij++VFEeNUsuJzvPSsm
+BYXOabi/L07kDYFtSeM/zCjrsoauiLHs0hHxHsnJlac5yJC37Vj56tPxK+BeU1lG
+3AxpaJaqPWUXNZSbp+1faG9ON3Lgu/wz5o9MhjHeWxGa5gGZobQ36iV0K8ChCw11
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Technische Universitaet Dortmund/OU=ITMC/CN=TU Dortmund CA - G01/emailAddress=ca@pki.tu-dortmund.de
+serial=17A424BE124001
+-----BEGIN CERTIFICATE-----
+MIIFbDCCBFSgAwIBAgIHF6QkvhJAATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTQz
+OFoXDTE5MDcwOTIzNTkwMFowgYwxCzAJBgNVBAYTAkRFMSkwJwYDVQQKEyBUZWNo
+bmlzY2hlIFVuaXZlcnNpdGFldCBEb3J0bXVuZDENMAsGA1UECxMESVRNQzEdMBsG
+A1UEAxMUVFUgRG9ydG11bmQgQ0EgLSBHMDExJDAiBgkqhkiG9w0BCQEWFWNhQHBr
+aS50dS1kb3J0bXVuZC5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+APS6BHbuWpc/uK6Rir0fIhZf53E3ZFsiC+MOaHFwMDNw5IolT2Sp9+0vl4AOA8qn
+JwxcM3gLes3Ng8Fhy3ZTLfanOMjzlWwwV0Cb76hOHvyRPCfSOc+MN6OI3+coLWtv
+jwif+O5HzT6NbKPkRB5MIoI/UpL4HhExL7Od/fIZFpakE41xbLV+dQgQpGwrQTUh
+iucru5y1nZVvwstUUREee3j0FpB1cletGq2uqjVTPpDGNaSe4g8LpwI+6lIUwCdW
+/DAQ2XbH86hAHSOyjTIEz0IwEcNVQEbcFkVXhpOxlYJsq3KPSwngD3Ov+UI9CaWY
+rTtVEotYngEmK2s3oEKecLkCAwEAAaOCAgIwggH+MBIGA1UdEwEB/wQIMAYBAf8C
+AQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQU
++7Fcm23oJeSpqjJE7wKDRQ3mBuwwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffx
+CnA+3mQwIAYDVR0RBBkwF4EVY2FAcGtpLnR1LWRvcnRtdW5kLmRlMIGIBgNVHR8E
+gYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEE
+gcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1T
+ZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKG
+O2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2Vy
+dC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQDJzFPxsfrYZQhvtzCWGhg/
+50NJzXcAhxNpbLGFQwm4/2xUznVwf3aVWPP37xc3t7dTuiWdPuXdqYgTGXL9RjaJ
+74fB0cgF45v5H02WxwsBiei0jjzyHMhuUeLGLom8S9zDCItSvy1ohNotJo3EN24s
+NMBh3817MQMFyDOoQUF6EYrt+hHjuwEHO2dyulaM2KbYqk/KSvkZb3L7Lzi93UxW
+RFj9rXq6tz7qkA756BS44rFDr2k4q88EFwZlADOsrgwPjfrRg3zkvgeKSH8ywURj
+WIw2d//MxLIKqlTwkforTPB8qcyQeABh871++U2pH3rGXy195M497O4Z2If0iiYM
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Hochschule Heilbronn/OU=Rechenzentrum/CN=Hochschule Heilbronn CA-G02/emailAddress=pki@hs-heilbronn.de
+serial=17AFF699BBB1B2
+-----BEGIN CERTIFICATE-----
+MIIFbDCCBFSgAwIBAgIHF6/2mbuxsjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDQ1
+N1oXDTE5MDcwOTIzNTkwMFowgY4xCzAJBgNVBAYTAkRFMR0wGwYDVQQKExRIb2No
+c2NodWxlIEhlaWxicm9ubjEWMBQGA1UECxMNUmVjaGVuemVudHJ1bTEkMCIGA1UE
+AxMbSG9jaHNjaHVsZSBIZWlsYnJvbm4gQ0EtRzAyMSIwIAYJKoZIhvcNAQkBFhNw
+a2lAaHMtaGVpbGJyb25uLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAjKbZd3EMJcwe8ezY0tmmRnmzJ2HKrMzFVO7kPaUjiC/NEfqTOXL910jcn7w5
+JTPbjOt0LJwfcxANPgMt2l52jr523/z1yRk5dosf5jvFag5E1fJ7WF34WMzniR+6
+sB5oyKaxR5NyUqnD7Kl6imSUbtHg+udx7FsiBFX+KM0jf4f+1LcZj2e7zRsHxcTh
+9aZD2iitzwCfY4pY8CmKQ3mu59GIJOn3SQlCmrizMXll3fYeZov+TcmHgcxENxwC
+ORCjhV9uDaTe6pKqnp7p340Gy8+S6rUb0BCZZZ/5lo2Lw576hZb+st01pzAwC0dZ
+nqww1B+0kVr2mbxHc/EqB8wUdQIDAQABo4ICADCCAfwwEgYDVR0TAQH/BAgwBgEB
+/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQW
+BBRnFK9hZ5JlnTo8SLToUpv76vak4zAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp
+9/EKcD7eZDAeBgNVHREEFzAVgRNwa2lAaHMtaGVpbGJyb25uLmRlMIGIBgNVHR8E
+gYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEE
+gcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1T
+ZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKG
+O2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2Vy
+dC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQC0iYWnghR5leA1vKK+bIBg
+F90sX2PgEYCIzt+91aYfauZ40Q2ynpvhped/AqxQo44BYcdbmdTlHgQVuRHXshQS
+/Vt90iw05J9BaCXPJynOiRAprAH4sr2/rvk3D2UIslfj6cbifja3SbfjBOk3z7k+
+kufiQZaFcRvVfPdEYLJdICEn/NPjlHs6cuVz9cI82cZh+KCMyJE7rMVCHYA6y8bL
+I9brydpWgZ15tb64+qJ6bM7M363mW9FISywfn7g07HIZapMv7pxPhxzoRHjPvjJV
+rJM6BeFTSvLjLJQfO5DiKcJJw6BNuzu0V19ywlhFN9/KMJAGl5UVkMagC4EyRqlk
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Sachsen/L=Leipzig/O=Helmholtz-Zentrum fuer Umweltforschung GmbH - UFZ/OU=WKDV/CN=Helmholtz-Zentrum fuer Umweltforschung GmbH - UFZ CA - G01/emailAddress=wkdv-pki@ufz.de
 serial=0BE4D2EB
 -----BEGIN CERTIFICATE-----
@@ -25148,6 +28119,76 @@
 FAuW
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=FH Duesseldorf/OU=DVZ/CN=Zertifizierungsstelle FH Duesseldorf - G02/emailAddress=pki@fh-duesseldorf.de
+serial=1790610C586A51
+-----BEGIN CERTIFICATE-----
+MIIFbzCCBFegAwIBAgIHF5BhDFhqUTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYz
+NloXDTE5MDcwOTIzNTkwMFowgY8xCzAJBgNVBAYTAkRFMRcwFQYDVQQKEw5GSCBE
+dWVzc2VsZG9yZjEMMAoGA1UECxMDRFZaMTMwMQYDVQQDEypaZXJ0aWZpemllcnVu
+Z3NzdGVsbGUgRkggRHVlc3NlbGRvcmYgLSBHMDIxJDAiBgkqhkiG9w0BCQEWFXBr
+aUBmaC1kdWVzc2VsZG9yZi5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAI3ggJfoCNmfwvantrY9zgFKkyVxNZ7Ob+5SgyPm9cv93FQscBmCPN0QcgLh
+k+A8cjIf7RnLk590lVngBhKdNQsNF+Y4vzUE+j/bC81/CIkH8PLuQ80w3YVE8dok
+tcxgGv5dmv2jUXR4cSBZYE/L8nQp3MGmH+QS2KhQlhJ+2cFmlj3a/EYmW9UpZ9e7
+WRiLe6oc00lvqPX5oTkcqLENT3jDVrSoBMSJLiLQTtNtwP1yNayF0qw7zB9OLSj0
+KTl071dQNN472foyrMo1H4KJ4nRc7609rfX4CMnh8aq5cpCrF2B2DH5xYLOWqTix
+PmlkaBfHJvx5X71jD3dPSxNT5rMCAwEAAaOCAgIwggH+MBIGA1UdEwEB/wQIMAYB
+Af8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4E
+FgQUnvMD0SDnIepxSF0RQwZVePnIDuYwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsT
+KffxCnA+3mQwIAYDVR0RBBkwF4EVcGtpQGZoLWR1ZXNzZWxkb3JmLmRlMIGIBgNV
+HR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9v
+dC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUH
+AQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NT
+UC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUH
+MAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Nh
+Y2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAVklr2rs50JX1BLDCH
+ZplwKkktCh6gMJwV5OYor2LClTTT8KJ2yRcoho4N364KIcTUT5FO/YvVMdwbNDU/
+35nCz23Nm6AhVdPWE1t7vD8Hgp3BAnK2pXvO8oN8pPqTnnS9T4OlG7y7GKT/HZMz
+MJHhlHbg4GaU6iDEZwDq3k3pxx/6+UIRH0eeFXw5Ojh7yHL959eR0YvaFNWKtyxr
+cH3CYsoFnStHKzlD9BAPuyHEigGEibII9UZ7X2oodvsKy+l66M4CTv6HOTjcXqd1
+8SeIBf7HAT2kUuXr1pt0f0lzzdLcRYbTTF5jH5dfAzE0gkgVAxGROtiDQSuOXR6I
+LBjV
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Hochschule Osnabrueck/OU=zentrale IT/CN=Hochschule Osnabrueck CA - G 01/emailAddress=ca@hs-osnabrueck.de
+serial=17AFF6E8FC082A
+-----BEGIN CERTIFICATE-----
+MIIFbzCCBFegAwIBAgIHF6/26PwIKjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDYx
+NloXDTE5MDcwOTIzNTkwMFowgZExCzAJBgNVBAYTAkRFMR4wHAYDVQQKExVIb2No
+c2NodWxlIE9zbmFicnVlY2sxFDASBgNVBAsTC3plbnRyYWxlIElUMSgwJgYDVQQD
+Ex9Ib2Noc2NodWxlIE9zbmFicnVlY2sgQ0EgLSBHIDAxMSIwIAYJKoZIhvcNAQkB
+FhNjYUBocy1vc25hYnJ1ZWNrLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAqVlH0lmfsSUiK1DPBPU73xbD41ZIoE4foC/DekYs+Sp8+GnN1ohTOaW3
+mFodaqaQBNFKIjbr1GK5YQOfEAgU7MWGSvvdSfUzs10ZUwFFK2t+A7bllpD9P1TU
+US0fTGkkKJybK3WFBMXtJSVPfS3dlaErsf0pGaaVfJRH3Md6QeZSwAlbU4aR6yqs
+VZ0Xx7qkHL/0usbhvoZUa75I0phpFIMu/bcHJzXgZA1qXJmDRFwzfkv4ix0XthNe
+A8X2zRBHoaZWKMpW8eDGNisRN/3uIoYTg/ec+Cp9UVxaxdHJh4m6xGxK5tex5f72
+UV9/aQtxQR14ppFcAl6C4xxcDdg9MwIDAQABo4ICADCCAfwwEgYDVR0TAQH/BAgw
+BgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1Ud
+DgQWBBSEP8itmNww7iD9USts+vIt2sR97TAfBgNVHSMEGDAWgBRJt8bP6D0ff+pE
+exMp9/EKcD7eZDAeBgNVHREEFzAVgRNjYUBocy1vc25hYnJ1ZWNrLmRlMIGIBgNV
+HR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9v
+dC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUH
+AQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NT
+UC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUH
+MAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Nh
+Y2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAuJVj5Qs2LDnDTQsxI
+VUr8y6N8Hw3BW5e6EZfPEG79tYJp4a5QzMYLlQ8i7ksA7WZVJAox+TdZaXMVN4wT
+WyXtQs+3pqSlBtN5rudzKpgfNhhbo7XNNSS2qTplYt2y2TvbqHStXSpXGWu9U21y
+izysESR9aG8xcJQHayweLM50Yr36UhDek+XqLKVEOe41pDY0Jlp7rDYUiK5Jm9+P
+ujn8a8qrOAE5/s7PslKoelRkeLS4WSPmw+Y2/rFTvnbmAy0sURlFG5SanHoP1dlM
+gWPK25mNaGXQfxajo/r6WW5jUfZn/U7fHXJL1QD+g9vM/Vzk4d6ABniWcCDi0TRU
+eP4m
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Nordrhein-Westfalen/L=Hagen/O=FernUniversitaet in Hagen/OU=Zentrum fuer Medien und IT/CN=FernUniversitaet in Hagen Global CA/emailAddress=caadmin@fernuni-hagen.de
 serial=0E5AEA1D
 -----BEGIN CERTIFICATE-----
@@ -25218,6 +28259,111 @@
 cIfr+g==
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Universitaet Osnabrueck/OU=Rechenzentrum/CN=Uni-Osnabrueck RZ-CA G-002/emailAddress=ca@uni-osnabrueck.de
+serial=17A4247C57B2A8
+-----BEGIN CERTIFICATE-----
+MIIFcDCCBFigAwIBAgIHF6QkfFeyqDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTMz
+M1oXDTE5MDcwOTIzNTkwMFowgZExCzAJBgNVBAYTAkRFMSAwHgYDVQQKExdVbml2
+ZXJzaXRhZXQgT3NuYWJydWVjazEWMBQGA1UECxMNUmVjaGVuemVudHJ1bTEjMCEG
+A1UEAxMaVW5pLU9zbmFicnVlY2sgUlotQ0EgRy0wMDIxIzAhBgkqhkiG9w0BCQEW
+FGNhQHVuaS1vc25hYnJ1ZWNrLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEApLZxV6i214uWBb3c16AMckkujPKMXxl9Z4XsEIhrA47tG5YL9upeUrj+
+duDcrbEQvphvSXJFveVkLK1JMANHJuu/Wa32Bc8IRljYBqhaKMTGRO1q5L6jkMBD
+wBwenozhlGAaqG+8Cy+qcFoUaoWBRCH2++t5FtXyS1/1GKhWu7yQxCblFul7VXvn
+LKyaNlOaTalREXb9pQk2N31+rrOgwkbogxc2z30gQAJXeJ2Ra0SlReqINMmcDd4l
+fluXjBpFmiJa4xHhQIVJpW2vF8dbqmeKqxIoYziBh78NGaqMSC8IbDPbCM3qaDaG
+UWKccgb/SKZvrNTLU+jcW66yGi1YPwIDAQABo4ICATCCAf0wEgYDVR0TAQH/BAgw
+BgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1Ud
+DgQWBBSqH9h3FW6Z5F+Q1uxjJk4Z6mcUUDAfBgNVHSMEGDAWgBRJt8bP6D0ff+pE
+exMp9/EKcD7eZDAfBgNVHREEGDAWgRRjYUB1bmktb3NuYWJydWVjay5kZTCBiAYD
+VR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJv
+b3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5k
+Zm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUF
+BwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09D
+U1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUF
+BzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9j
+YWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEApVPS1rUMH9oWu02n
+JHDVC7jF74wUYbzFaX1ULtkEGXK0MV2HyR8kZ3t19qcmEzgo/eaYv5+OE/nMnNHW
+UH/ybTN3bQFFK4+L+42SwRkSnyXVQsb38NsUknpDAlUeR9+jv5rkhIF5u+sRIXSB
+1lzoohtVUkYsC50UO1L4bWchK7DE++22NDiTgtoFWwC1nn2wt8FYTB4IIbCOogEI
+6fFXIHZkG6BlLiYmPFmbNfPwNJpv25g87P0SXpQR1uxSv4giL6o6XWCDJpnCEA4+
+029ZYLZG0e1bSzk4wI+ho08oxNs8B7NPlH2pjOpq40pZwvVw5rp2nu3W5CaDxgHd
+xXBX5A==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Deutsches Institut fuer Wirtschaftsforschung e.V. (DIW Berlin)/OU=IT/CN=DIW Berlin CA/emailAddress=diw-ca@diw.de
+serial=17AFF6A8E30F38
+-----BEGIN CERTIFICATE-----
+MIIFcTCCBFmgAwIBAgIHF6/2qOMPODANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUx
+M1oXDTE5MDcwOTIzNTkwMFowgZkxCzAJBgNVBAYTAkRFMUcwRQYDVQQKEz5EZXV0
+c2NoZXMgSW5zdGl0dXQgZnVlciBXaXJ0c2NoYWZ0c2ZvcnNjaHVuZyBlLlYuIChE
+SVcgQmVybGluKTELMAkGA1UECxMCSVQxFjAUBgNVBAMTDURJVyBCZXJsaW4gQ0Ex
+HDAaBgkqhkiG9w0BCQEWDWRpdy1jYUBkaXcuZGUwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCTnjgt+05ipzhTz6bBaGf1MpfATTbkD+BCwJcbGvkRZbbQ
+jqAzImMgzrg/uToF7hfEs6Rf+W1GHYI08+zOa6G9QAxMg8MrZ1I5c3cJ8+THvGe3
+anYqQuw0+GGPMKxL7wr/2hBzwLMlFt/j5N7LUbT7FkeW+w5oMqbi9nN4Zfp3zhKg
+Iw5vcxwS2Wt0ocQg42IE+tmBM1f8vjqvMLwQVrju3OZAZwcTaUBmAsHn6O9wHw5C
+R6n0vGgvWqf6hCiuDm9mJsaGHul13UEDfsqtHMtR0rXxYJOTDeeGSmLDj6oHIvR3
+FVh3OlK1AgIUY2UGrGlxKrp2rGvAC4V1E1XgHH4BAgMBAAGjggH6MIIB9jASBgNV
+HRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUd
+IAAwHQYDVR0OBBYEFO+/8uTN1ZSCwDAaZDjEAuY6jFshMB8GA1UdIwQYMBaAFEm3
+xs/oPR9/6kR7Eyn38QpwPt5kMBgGA1UdEQQRMA+BDWRpdy1jYUBkaXcuZGUwgYgG
+A1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2Eu
+ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEF
+BQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9P
+Q1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEF
+BQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAHL6FILQjeXdF/eq
+SmojN6DEH9+ozYReVdT2Xq+yc5aVTCdcXOVlUvxzNGBO/EvMmAoeB2+54sLCSEvi
+fx/tI1E0kuiSMk0O934ln9JgvY6n6nzU0JlqA0/NA+oP5IGtWJ87dxwmuXY3O9p4
+41uLEG9uYP6OWxEVIHziQUK+QbsZq4LfT6R2nLaGLOXm4JCltc7JL84Ucl/Wcafz
+ZbSYGChZNClalRPnOh/HL9C59CdUYpL24Ep6eh6DghaTv0kuG7lbHSjXDTqAPh3W
+3PvKPk8ol4jJSzkh2PwKHHcwfff42Mu1RYA6ifKVas4IUUMY9FmCFshGn503fom1
+OW0Z02M=
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Berlin/L=Berlin/O=Konrad-Zuse-Zentrum fuer Informationstechnik Berlin (ZIB)/CN=ZIB-CA/emailAddress=ca@zib.de
+serial=17AFF75F6D14A2
+-----BEGIN CERTIFICATE-----
+MIIFcjCCBFqgAwIBAgIHF6/3X20UojANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDgx
+NVoXDTE5MDcwOTIzNTkwMFowgZ4xCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCZXJs
+aW4xDzANBgNVBAcTBkJlcmxpbjFCMEAGA1UEChM5S29ucmFkLVp1c2UtWmVudHJ1
+bSBmdWVyIEluZm9ybWF0aW9uc3RlY2huaWsgQmVybGluIChaSUIpMQ8wDQYDVQQD
+EwZaSUItQ0ExGDAWBgkqhkiG9w0BCQEWCWNhQHppYi5kZTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAOCcjrYZxwe7MbbhNg350UO0gG2xEJ6EQ8UBOPsy
+VjrNgRENkT677ezFHgitfZ0PC3Nj93+J3DtOcbL2JV9H5qArLItxboMugwWlr1Cz
+ZCAcu1w/cubeWn3VFzKIAdChF7VerCNxlchUME+WQGwzoPrDsiFFKgwegh1vW0Qj
+vzE9DhXv26CQHHHiDvwTKEpOODFtEqxhEG7Tekrdel5BFwgfvBM+2wFHD4aF46z5
+0mlKPiPshN1bvwceSxzhE8LM0pmBlJw7e1eWuuNp63sZvBL/YebfcD8TMq0etDbN
+jrKm7oQBJTFaBiWSBHSSQsmaAu7/M1QeMmq65jQKlnA9/0UCAwEAAaOCAfYwggHy
+MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgw
+BgYEVR0gADAdBgNVHQ4EFgQUsYm0ae1GvKbL0BLXZqp6+Qrn9rEwHwYDVR0jBBgw
+FoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwFAYDVR0RBA0wC4EJY2FAemliLmRlMIGI
+BgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYB
+BQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUv
+T0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQBHMDdHQp9PrU6O
+98zXywD0nTh4KVFub7jF4wvnvjzpF2h74NNRfefYj1CZiPR+0xaYOwdV2CqJlKiy
+kpchefHr2mlA9SegDkUG3PqNBs+p8NVSfITNHIg6fpAwMtbYW1rt0OfWvevaj9CO
+9upwst7t7wjbRRfLluu7zBAjtgTSmtT99s+PwLOSkWtf2ahq4zYyAtTfftm3VLNh
+gpOBgTms7qiEoUSSr44ES1UEPiSNOQPqvIj2XA3PdlGtXljSCBQLGSWRmAEoBiNp
+/138fsGpJJpcTLmyaE0bwKN3Si4cnGQyudrdl9/hDVLSWu/wbVIe/yqRi+onawnp
+6/VDfM7+
+-----END CERTIFICATE-----
+
 subject= /C=FR/ST=Calvados/L=Caen/O=TBS INTERNET/OU=Terms and Conditions: http://www.tbs-internet.com/CA/repository/OU=TBS INTERNET CA/CN=TBS X509 CA SGC
 serial=56C2482B83829361B3DE94EB3A274403
 -----BEGIN CERTIFICATE-----
@@ -25254,12 +28400,12 @@
 -----END CERTIFICATE-----
 
 subject= /C=DE/ST=Thueringen/L=Ilmenau/O=Bundesanstalt fuer IT-Dienstleistungen/OU=DLZ-IT BMVBS/CN=Bundesanstalt fuer IT-Dienstleistungen CA - G01
-serial=143B3E60DFD16F
+serial=17887D0923D576
 -----BEGIN CERTIFICATE-----
-MIIFdDCCBFygAwIBAgIHFDs+YN/RbzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
+MIIFdDCCBFygAwIBAgIHF4h9CSPVdjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
 EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
-A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTEyMDgwMzEyMTUx
-MloXDTE5MDYzMDAwMDAwMFowgbYxCzAJBgNVBAYTAkRFMRMwEQYDVQQIEwpUaHVl
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUwNjE1Mjc1
+M1oXDTE5MDcwOTIzNTkwMFowgbYxCzAJBgNVBAYTAkRFMRMwEQYDVQQIEwpUaHVl
 cmluZ2VuMRAwDgYDVQQHEwdJbG1lbmF1MS8wLQYDVQQKEyZCdW5kZXNhbnN0YWx0
 IGZ1ZXIgSVQtRGllbnN0bGVpc3R1bmdlbjEVMBMGA1UECxMMRExaLUlUIEJNVkJT
 MTgwNgYDVQQDEy9CdW5kZXNhbnN0YWx0IGZ1ZXIgSVQtRGllbnN0bGVpc3R1bmdl
@@ -25279,13 +28425,188 @@
 ZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2Eu
 ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggr
 BgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9w
-dWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQEFBQADggEBAHNT+rTFdadX
-Afr6QAW94zGcz9z/mvhvqwCB0iRAdl2/puHYglbiZx/azsdbHfcJfumYSBdmYP8u
-t/5pMFolG89wiYklfTDrV7lDzEDT6Fux5ItR1+8FgUsyRPxWqD8y7ngR2B7ymkE0
-o/BRxZbqqM13+eJBFxnFs/tnEMrnpSdEk9QRAeInoTOjWMecnqQbI6vtP37duduM
-ICIFyK+e5oIkCpWML0I7FVOjLJtE0TXgg/5AM+Tv3+7j2bDQW+ItLmh54cQdjRNG
-7vy3v8jGOce4PKoPOSdVA+J1kf5E1oTVMeJ3c2eOAkKNmgrGorepMaWXPRMoyP75
-5RRwhP1jESE=
+dWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBALW5krb2OwTu
+3QWSQ8tFg7E1i7rGtMZ44xewIJCU9/HnioBO7ScnlZ4fI7+okctFXdO9mL9a4yaM
+6Dtp1J9PZIQh9egK6OjRhJxH0eHRyvyoTq2GEJTasDchdQHHZM1uuEb9JmGEtIF8
+MR/1hRWfFqb1hXEaeaoEvjcZukX+zmvhFvrVSceaMyJY2E5mXWl+JOx59l6JIFZQ
+Q9EQdd+VwPfzOWaOiO3kpRXF1xLZrtM3SLit4KxvYcNwF6Jl3PoBfpVXAsRUAwEj
+Yl/lGjWvHFtpEKzEAsrKnZ3N0EFMq6aJio4ZyzvcNBNsbq0lApxN5Fqww3ep6DVE
+is4vvaECSKU=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Fachhochschule Giessen-Friedberg/CN=Fachhochschule Giessen-Friedberg CA - G02/emailAddress=pki-gifb@fh-giessen.de
+serial=179060EF0B35B8
+-----BEGIN CERTIFICATE-----
+MIIFdDCCBFygAwIBAgIHF5Bg7ws1uDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYw
+N1oXDTE5MDcwOTIzNTkwMFowgZMxCzAJBgNVBAYTAkRFMSkwJwYDVQQKEyBGYWNo
+aG9jaHNjaHVsZSBHaWVzc2VuLUZyaWVkYmVyZzEyMDAGA1UEAxMpRmFjaGhvY2hz
+Y2h1bGUgR2llc3Nlbi1GcmllZGJlcmcgQ0EgLSBHMDIxJTAjBgkqhkiG9w0BCQEW
+FnBraS1naWZiQGZoLWdpZXNzZW4uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCygDTidhueigLG6vjJ69H+k0+5MLR0vOKY+u4AP9e7/peyx+6M42+d
+B9ghmkbqVHw9G9q89Dd5hpWywyJ7AAeOSyG4liWgD1jJFeEsIUYC9X/x95hnBlVT
++TKJDLjYxlLl1OyMQc/122nG8j1ScjPZR5e4UkyDaUmFdtr66x3Ak3MEmWqYm7Jq
+jGdl6xYQQzCIe5LWT50eTm1LBJpMjsDYsJ9doZBgbmqAp0UYG9uixWadtKuLBfyC
+zknitSO0ddD03/MfSunNWLCEL52uaCFobTN8jWJLdEZMN30WjCM9II/Ych2XaI1J
+/18Nkd+BpZ2yaFivTjICEFosTzdAJNFrAgMBAAGjggIDMIIB/zASBgNVHRMBAf8E
+CDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYD
+VR0OBBYEFDTUQsGTo7tXbAx37nyVH0ZDrzDWMB8GA1UdIwQYMBaAFEm3xs/oPR9/
+6kR7Eyn38QpwPt5kMCEGA1UdEQQaMBiBFnBraS1naWZiQGZoLWdpZXNzZW4uZGUw
+gYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2Jh
+bC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggr
+BgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5k
+ZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2Eu
+ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggr
+BgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9w
+dWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAILt65b7czMH
+s4haW9StwPyQV7CI1n3yoiyvJsnHCHc3yBRkUDQVMgLhr2ok7CKI0ZIDu3STR/UL
+DnKgJNPtSTn8dtveI8e4jXfM4CVXZE2rPwvA7q5b22e/hcDfuiJLjLsBvtOcjI0J
+/Jh2b8+UZmcZJCnO+s59sYoXaEsTkzv5YCn5ratEbD3VU3pdcCypA2KItIWFHONr
+BRuNWWkywfalVlQTsFzUmupRolklZQNr5ys6n/wQdS+E/CNIN/qQ6XzWoESVtvAZ
+IuDFOHgv3siKkj0SfiDD1DLajZu4UsV0SH9QpgH+UxeHG85Ro8U4LktiBvh0cxIK
+syZgwuV5IkA=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Hochschule fuer Technik Stuttgart/OU=Rechenzentrum/CN=HfT-Stuttgart CA-G01/emailAddress=pki@hft-stuttgart.de
+serial=17A42486DEEC72
+-----BEGIN CERTIFICATE-----
+MIIFdDCCBFygAwIBAgIHF6Qkht7scjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTM0
+MloXDTE5MDcwOTIzNTkwMFowgZUxCzAJBgNVBAYTAkRFMSowKAYDVQQKEyFIb2No
+c2NodWxlIGZ1ZXIgVGVjaG5payBTdHV0dGdhcnQxFjAUBgNVBAsTDVJlY2hlbnpl
+bnRydW0xHTAbBgNVBAMTFEhmVC1TdHV0dGdhcnQgQ0EtRzAxMSMwIQYJKoZIhvcN
+AQkBFhRwa2lAaGZ0LXN0dXR0Z2FydC5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANhYaOUEPRRuMBICWh2uUO5yFldqiU/Nda4LG4ZSmGZmnnGDvT6s
+7a1NTk/s6du3i4zJzP9+0ImjnY3beqdj30vV4pxgLBymSCr0ycK+c0n+cXtuffRz
+OK6iifD3NOoNdiKUT2Y+2qBb7/xO4mSM2iAYVvXnE5zXaeabHXoOdlRTajRCmZA4
+QV64eNWAg749PkMxT043/87GEeHfNb62ce0PODFZU4wsXTI1UIkztg6rX5RgcLhW
+pq7aL4ZxyVPkacWoStS23I+agfLn0iwFFiIqqkCZAqKrtiZGZNdGt+NRDky1DbdW
+FwrRZ4kycMoIcxqbsqnId2brEcdFp7tBXesCAwEAAaOCAgEwggH9MBIGA1UdEwEB
+/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAd
+BgNVHQ4EFgQUcbWZntYfgHFOyE9eGPu6gf6V+xMwHwYDVR0jBBgwFoAUSbfGz+g9
+H3/qRHsTKffxCnA+3mQwHwYDVR0RBBgwFoEUcGtpQGhmdC1zdHV0dGdhcnQuZGUw
+gYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2Jh
+bC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggr
+BgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5k
+ZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2Eu
+ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggr
+BgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9w
+dWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAORMDHhycGPn
+8TaNTakXgjr2BDWXX7oST/lyM6bQ/g5u0ImZycGy8+o9Z9Tusf/9iQQMvgvWOsue
+faN0LXN7Kyzgx7w747igPUO0TtV77LCZuU9srejwK98oJT8R6iRsx3eNk28gnuxC
+Dqy2x4nKm0dCgAWOxAz8LlKqwuNgS1a9ZAIePOvwX1AZo+FMSUKuIOGkHJ2z6ECS
+Ckjj7HvaGUvkOW2KnFk63rQ131FYZgDzwmBNlv8nO92FLX04pL7d/KgUz/cat6yV
++sMWuI8lKeV48MHn2UVmUYAu2mq+IF5JL3a5gGW+gsrvt2NNZxTsBZJwwwGVGn3G
+vc9GQCJjGd4=
+-----END CERTIFICATE-----
+
+subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
+serial=2766EE56EB49F38EABD770A2FC84DE22
+-----BEGIN CERTIFICATE-----
+MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci/ITeIjANBgkqhkiG9w0BAQwFADBv
+MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
+ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
+eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow
+gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
+BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD
+VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq
+hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw
+AHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsPF6c947AEYe7/EZfH9IY+Cvo+XPmT5jR6
+2RRr55yzhaCCenavcZDX7P0N+pxs+t+wgvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onr
+ayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt
+4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq
+m1y9TBsoilwie7SrmNnu4FGDwwlGTm0+mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/
+vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT
+8dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO/bTouJbt7IE
+IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa/oKMoYX9w0MOiqiwhqkfO
+KJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj/QN370EKIf6MzOi5cHkERgWPO
+GHFrK+ymircxXDpqR+DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy/
+s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTvA73g
+JMtUGjAdBgNVHQ4EFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQD
+AgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9
+MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy
+bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6
+Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS/g/FfmoXQ
+zbihKVcN6Fr30ek+8nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj
+Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o+tDb5VCViLvfhVdpfZLY
+Uspzgb8c8+a4bmYRBbMelC1/kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5
+B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI/V5eu+MtWuLt29G9Hvx
+PUsE2JOAWVrgQSQdso8VYFhH2+9uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR
+pu/xO28QOG8=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=ESO - European Organisation for Astronomical Research/OU=TEC/CN=ESO PKI - G02/emailAddress=trustmaster@eso.org
+serial=179060CF51D115
+-----BEGIN CERTIFICATE-----
+MIIFdTCCBF2gAwIBAgIHF5Bgz1HRFTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDUz
+NloXDTE5MDcwOTIzNTkwMFowgZcxCzAJBgNVBAYTAkRFMT4wPAYDVQQKEzVFU08g
+LSBFdXJvcGVhbiBPcmdhbmlzYXRpb24gZm9yIEFzdHJvbm9taWNhbCBSZXNlYXJj
+aDEMMAoGA1UECxMDVEVDMRYwFAYDVQQDEw1FU08gUEtJIC0gRzAyMSIwIAYJKoZI
+hvcNAQkBFhN0cnVzdG1hc3RlckBlc28ub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAzC8MPiRwINe6DnfT2wjvAuSeMECeZmYv5lDIXbXIb5T+u6p7
+g3Nb0NQrpoHOwIJK2ouacx6tVQ3cpMITCf4y0700cZeHvm70vMq+1ijd1l6F8w6I
+xxU259pkeP5d/g3er2TygTkPJZC38O4x05Jbz3tnqt7jGxh8uZysDH5mTECN/Utl
+yy/YS+08Dw2Yiywyjln398yoJ6mE/6xWsPYRdkU6DVwvJzaTTrlJA5vaiTznZqkW
+0ADHeDShca5ivmyPYCxlcHf5NjCp3R4vpmMtftBx3ViYUZUhkpBUEyCIJ6k9OuwS
+csjFfVJ1GtQ21aclXp5wHjHdtfgBPgmmaUzYvQIDAQABo4ICADCCAfwwEgYDVR0T
+AQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAA
+MB0GA1UdDgQWBBSxHnc03nkBsuZOGybim3eJ2Dm+fTAfBgNVHSMEGDAWgBRJt8bP
+6D0ff+pEexMp9/EKcD7eZDAeBgNVHREEFzAVgRN0cnVzdG1hc3RlckBlc28ub3Jn
+MIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIu
+cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYI
+KwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4u
+ZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYI
+KwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAqWYyeIf2s
+VCi2NCehWl/TCC9fxAMCvP2fkVnBu1ADU1YroLHRgKDky7hHn4Xkq/9r7ZtosjMN
+hNiU6uepE6HoLVCMrcqk1jzjkrkRCRrQNNR/mrNO/m8Y/ONIN4fywtIgX/VAkKB8
+Sw04WgIMrBxTkjZKQTQ+7FpCc/zZTTIxTqOyzdCN9Z0lsttxB96UnUlIZt2dlgbJ
+Rg+pc/Ob+YgTIh5mzOnJGdV3mH2lrn+sBZo5JSZv/+rWjL3ekKbbQbiGrJj+5yMx
+AFPEICNcK1Ww80kdGzyG1Q0cryA+S7tJcIPIZRXsjcUJ5hOO9b2yg4RHKtef+TkY
+VSlLXb73aKa6
+-----END CERTIFICATE-----
+
+subject= /C=DE/L=Stuttgart/O=Universitaet Stuttgart/CN=Universitaet Stuttgart CA - G01/emailAddress=ca-g01@uni-stuttgart.de
+serial=1790610927C34D
+-----BEGIN CERTIFICATE-----
+MIIFdjCCBF6gAwIBAgIHF5BhCSfDTTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYz
+M1oXDTE5MDcwOTIzNTkwMFowgZQxCzAJBgNVBAYTAkRFMRIwEAYDVQQHEwlTdHV0
+dGdhcnQxHzAdBgNVBAoTFlVuaXZlcnNpdGFldCBTdHV0dGdhcnQxKDAmBgNVBAMT
+H1VuaXZlcnNpdGFldCBTdHV0dGdhcnQgQ0EgLSBHMDExJjAkBgkqhkiG9w0BCQEW
+F2NhLWcwMUB1bmktc3R1dHRnYXJ0LmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAtGJWFj31waAepaipR9DkLB/xLwDI5JgceRHgHZk5BNvQkhzFyeVh
+h3B9k2xxyMmsa3i2wm+74tdL/iIqCBwf1pX0z4dZmJWb5jmdSozRBdVcbcAn/lrz
+yR330ct/Ir+3VcN0HLPZ6fLEGas/eyP+C7Ms7ed1gVg+6Y9b7QsYS2s1/5DIa1wQ
+jmAzwoY/ZsrAo3tSoZ3Pc9HfWSnmm6OmkRvtNKvf4/rBHvSv6xefYt5tfT+hnegm
+4Czaq2ursfP1E/yHiP+1fl993L5gMb7WamkMvsiYh5uyTRFBkLADqMS7LyQ75Xd/
+cVxSklgPtS/DrLuCwM2VAr979sbcX7NlqwIDAQABo4ICBDCCAgAwEgYDVR0TAQH/
+BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0G
+A1UdDgQWBBS9rSdaLDfPDUQfchqqtzeZES4CBDAfBgNVHSMEGDAWgBRJt8bP6D0f
+f+pEexMp9/EKcD7eZDAiBgNVHREEGzAZgRdjYS1nMDFAdW5pLXN0dXR0Z2FydC5k
+ZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xv
+YmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAy
+LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcG
+CCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZu
+LmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBj
+YS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcG
+CCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNh
+L3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEA1a4t0mtH
+3yvI1R+JhWoeVvvvE8Av+QC4hQmOFxNsiWqZm0JxaYWDt1eDIoeEEkCSv9nnWCfi
+Q2q5dxvo0cokFyLioHhFXN0bDJsY3A+Ye+GrjaueLJ+vSU+D0XWBLybs+KO+EnCq
++my5Kv2kV5iaREP6RRbo/voMpHm9k8qZLIGYfaawI/nkv5qI7WNbuIkWLS4H1V1+
+JJm0KT7VBif8CVn0tggs2L7Q5HUFRdf47nlKYn2FicH/Wa4hkTYWshIiw6GYk1gA
+s2dts10ZHYLbxgarj14vH/vZEebbS4QqwHRNIrJEGt/qBWFlcMVrJ0Hve86pKKGi
+7ClrCS9Z/0Huew==
 -----END CERTIFICATE-----
 
 subject= /C=DE/ST=Bayern/L=Hof/O=Hochschule fuer angewandte Wissenschaften Fachhochschule Hof/OU=Rechenzentrum/CN=Hochschule fuer angewandte Wissenschaften FH Hof CA - G01/emailAddress=pki@fh-hof.de
@@ -25323,6 +28644,146 @@
 AJcQWWGbwFiM1pA=
 -----END CERTIFICATE-----
 
+subject= /C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority
+serial=13EA28705BF4ECED0C36630980614336
+-----BEGIN CERTIFICATE-----
+MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv
+MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
+ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
+eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow
+gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK
+ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD
+VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sIs9CsVw127c0n00yt
+UINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnGvDoZtF+mvX2do2NC
+tnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQIjy8/hPwhxR79uQf
+jtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfbIWax1Jt4A8BQOujM
+8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0tyA9yn8iNK5+O2hm
+AUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97Exwzf4TKuzJM7UXiV
+Z4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNVicQNwZNUMBkTrNN9
+N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5D9kCnusSTJV882sF
+qV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJWBp/kjbmUZIO8yZ9
+HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ5lhCLkMaTLTwJUdZ
++gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzGKAgEJTm4Diup8kyX
+HAc/DVL17e8vgg8CAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTv
+A73gJMtUGjAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/
+BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1Ud
+HwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4
+dGVybmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0
+dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAJNl9jeD
+lQ9ew4IcH9Z35zyKwKoJ8OkLJvHgwmp1ocd5yblSYMgpEg7wrQPWCcR23+WmgZWn
+RtqCV6mVksW2jwMibDN3wXsyF24HzloUQToFJBv2FAY7qCUkDrvMKnXduXBBP3zQ
+YzYhBx9G/2CkkeFnvN4ffhkUyWNnkepnB2u0j4vAbkN9w6GAbLIevFOFfdyQoaS8
+Le9Gclc1Bb+7RrtubTeZtv8jkpHGbkD4jylW6l/VXxRTrPBPYer3IsynVgviuDQf
+Jtl7GQVoP7o81DgGotPmjw7jtHFtQELFhLRAlSv0ZaBIefYdgWOWnU914Ph85I6p
+0fKtirOMxyHNwu8=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Technische Universitaet Clausthal/OU=Rechenzentrum/CN=TU Clausthal CA - G02/emailAddress=pki@rz.tu-clausthal.de
+serial=179060F0365B6F
+-----BEGIN CERTIFICATE-----
+MIIFeTCCBGGgAwIBAgIHF5Bg8DZbbzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYw
+OVoXDTE5MDcwOTIzNTkwMFowgZgxCzAJBgNVBAYTAkRFMSowKAYDVQQKEyFUZWNo
+bmlzY2hlIFVuaXZlcnNpdGFldCBDbGF1c3RoYWwxFjAUBgNVBAsTDVJlY2hlbnpl
+bnRydW0xHjAcBgNVBAMTFVRVIENsYXVzdGhhbCBDQSAtIEcwMjElMCMGCSqGSIb3
+DQEJARYWcGtpQHJ6LnR1LWNsYXVzdGhhbC5kZTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALiTQIGm718nnhWt8IiMlFmK9AMhGYmhTWZO41XHR4PTg9fv
+FBULkpqBJzl/U9LwAtDTmvykFQ1+OdWm7qdDJhSiJnNTKZTHXYYG6aTdRLakwYNm
+B2IZNnNqeEuqS7qJzPZdiebNzRJsh11xUUbOlIfA3N8MOLS+Jj2N+R8R05jeLFoS
+GBAQqDyI9RwbqoLxf8rKlvcAzpJHDEMkA6AYcaNMjp6MTfN7xQB+VS6w/0NroT+p
+lTXts+omff1mKfNvVROpC+lKi3jVW8kVU31zrarX+l39vnoIhkb6Nb81vguc4P5x
+/r3EyddaO/3WX2KHAk7mf6ml8tJHTFi5D1XRtakCAwEAAaOCAgMwggH/MBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0g
+ADAdBgNVHQ4EFgQUYvySt+ft8x81VVvJQ99Qs170ECUwHwYDVR0jBBgwFoAUSbfG
+z+g9H3/qRHsTKffxCnA+3mQwIQYDVR0RBBowGIEWcGtpQHJ6LnR1LWNsYXVzdGhh
+bC5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
+Z2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9j
+ZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmww
+gdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2Eu
+ZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAx
+LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0
+MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEA5rWH
+HdBpXwVjMhYQGCZd06eVZXFncoemXJGtbdC+Q3Gh3apLCTJMmM5mQWvRuKrdFyyI
+7xmAiXm77w2OO0jrmT+efb2AfKo8YMF+DQoagCAznRec5eE9jOVflUaCMJ/xpNAm
+go7bsfs4eGRsWmfsTOk0dkx+2tFJB/lvTyiIIgzMzXPx4wqtQ9sGOajvMa12LY3j
+v181Le16J12whh/2qbc034cSi+ifm9z0bWEVZdjYobwWliofyLhJbGu7quoMvOTZ
+PbMSSOrC08YhhxWMA1RJsXl+SWP1ThIGo1bAIsW9kveyNROas1Rr9xcuzZT8MN/G
+2t80IXRcI3bxjTigSQ==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Otto-Friedrich-Universitaet Bamberg/OU=Rechenzentrum/CN=Uni Bamberg CA - G02/emailAddress=pki@urz.uni-bamberg.de
+serial=1790610303C574
+-----BEGIN CERTIFICATE-----
+MIIFejCCBGKgAwIBAgIHF5BhAwPFdDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYy
+N1oXDTE5MDcwOTIzNTkwMFowgZkxCzAJBgNVBAYTAkRFMSwwKgYDVQQKEyNPdHRv
+LUZyaWVkcmljaC1Vbml2ZXJzaXRhZXQgQmFtYmVyZzEWMBQGA1UECxMNUmVjaGVu
+emVudHJ1bTEdMBsGA1UEAxMUVW5pIEJhbWJlcmcgQ0EgLSBHMDIxJTAjBgkqhkiG
+9w0BCQEWFnBraUB1cnoudW5pLWJhbWJlcmcuZGUwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCvxmE2/QMzwoeQbCmVSkdCiTkyUg4Yv4SV7Hj9RRm8eP62
+AlemJbgUI+xhr7guwV/yWQEHrqNDDOThDuNXxzkJy1Sa1/xZrtNqz7sExrJTN5xz
+RjDcPQOJwqcJ6oK79oh4oMtdVs+e1RvvrefwB3v0AWjJMiznOJ3CkjOAFjPXcJrg
+a17cPuQpdLBQYcGtqXN0NoZ2muBzSbfb5LE+JUttV9LRxVd6cfolePxSy9r1ZdUt
+HNOlslwLRwJNL2VUPlQTImzQXNbpegSOr+j1laeKTn7oxyQstHo+oqRu2ucS8j5a
+Mo+evwPGaVgJw7DwOp4deIaG/I4krl1I7pWAKhDLAgMBAAGjggIDMIIB/zASBgNV
+HRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUd
+IAAwHQYDVR0OBBYEFC3MmB5JWx7XbmEHJq1TZWeYQ67lMB8GA1UdIwQYMBaAFEm3
+xs/oPR9/6kR7Eyn38QpwPt5kMCEGA1UdEQQaMBiBFnBraUB1cnoudW5pLWJhbWJl
+cmcuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRl
+L2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8v
+Y2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3Js
+MIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNh
+LmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2Rw
+MS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy
+dDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9v
+dC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAFkC
+e+eRAkPJx4khdU+cueVkxeD4vXJOkTiwZUEh+/12QIPuBa++2Hl+F97EmysA+UZU
+Kpbu/oWgqGKWObq27rWA7dWQmJy1AunZVsQnRkePyzJrHGknvbZAPWXVc4LSyi0t
+CGQKzkZtCtaY5ZWgLED5v4tlIwnrGpW8Ux6CtMa9FumlFbMs+40Mjxa/wh99nvoU
+2VdQbpo8jdbmNopvk1bkjM05whgTiz1jCC6l6AIUsvnmrU8/dIS0A8psMVtUU++p
+fdvYdTm8ZJFvNipMVvxJ94anLz99yO9pKYwHmYQBsjURxbxYFb7PCgubO54awC66
+Tp2W3sQRLzLC8xnvz0Q=
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Bayern/L=Muenchen/O=Leibniz-Rechenzentrum/OU=LRZ-CA/CN=LRZ-CA - G01/emailAddress=pki@lrz-muenchen.de
+serial=17A4247AF40721
+-----BEGIN CERTIFICATE-----
+MIIFezCCBGOgAwIBAgIHF6QkevQHITANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MDEyMzEzMDMz
+OFoXDTE5MDcwOTIzNTkwMFowgZ0xCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXll
+cm4xETAPBgNVBAcTCE11ZW5jaGVuMR4wHAYDVQQKExVMZWlibml6LVJlY2hlbnpl
+bnRydW0xDzANBgNVBAsTBkxSWi1DQTEVMBMGA1UEAxMMTFJaLUNBIC0gRzAxMSIw
+IAYJKoZIhvcNAQkBFhNwa2lAbHJ6LW11ZW5jaGVuLmRlMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAtp+3+z4SuggsvyeT/B7qdcKpdDD9fGftdAmX1F3p
+PLWZRQp9n82UGpMdmnVO8JdnIauSKeruNapkjXtzUDNXK36W1wC8n6nENfyfnkj5
+YES6GaFPpnda3MRT9GKvGEeMazyxnntNApaauDRdRPArUyCQybf+ZF3EUZeHG1KL
+cpBM2eG5x1U+xE9hU6V1CvRjHdsr1NUXOEnOrdckfWj3DZdqoOqwRvxp/bdcbl2L
+aq+hGlK6a+6hamX9Lr9s3zE1KXAdH5erC/ELzfttKTLW1YHJhcrHVqdZ1U2pPSeq
+YGU3RkVIYRne7NarloqAScBviLrPH72OuVCguCN3v9PfAwIDAQABo4ICADCCAfww
+EgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAG
+BgRVHSAAMB0GA1UdDgQWBBSWW0xwu2/8nO+1P6R6+5P/CepqdjAfBgNVHSMEGDAW
+gBRJt8bP6D0ff+pEexMp9/EKcD7eZDAeBgNVHREEFzAVgRNwa2lAbHJ6LW11ZW5j
+aGVuLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDov
+L2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNy
+bDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBj
+YS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2Nk
+cDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5j
+cnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJv
+b3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAK
+AuP9CGRlZ/9J2VGRD9M335BW6mzxr1YHSKxErKysboml6TS8siuFgWFmyHYwlkNI
+W9rglUzwFLar7hSgw32lfHLgdR0dEu/aDmDQnAE2cCAjLOOXomi+8vnOCqDk98sz
+wkqtRevR7J2NMLU1X3nngdgcRGfROc63snygpmN41ubOIAa45vdYKnBHeJjwTaaE
+2GMYdnFt+9HRUMkeCZDO3iCBV0hhxhrm9HIoPdOh2memdf4hiPLCX31Vq4lq7F9f
+HkosWlJsxab7cO8IygYVo2YID4IOpXuzHPdlxHuvc6ZQFjsrr94ve6iotX3Lpoy4
+MM1AoA7ixMHBubkUd9mG
+-----END CERTIFICATE-----
+
 subject= /C=FR/ST=Calvados/L=Caen/O=TBS INTERNET/OU=Terms and Conditions: http://www.tbs-internet.com/CA/repository/OU=TBS INTERNET CA/CN=TBS X509 CA pro hosting
 serial=611FC2C085902E39491895D9A4DC0A72
 -----BEGIN CERTIFICATE-----
@@ -25358,6 +28819,76 @@
 B0rrFW3NLXPrd85/Jij0
 -----END CERTIFICATE-----
 
+subject= /C=DE/L=Passau/O=Universitaet Passau/OU=Rechenzentrum/CN=Universitaet Passau CA - G01/emailAddress=ca@rz.uni-passau.de
+serial=179060E542154E
+-----BEGIN CERTIFICATE-----
+MIIFfTCCBGWgAwIBAgIHF5Bg5UIVTjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU1
+OFoXDTE5MDcwOTIzNTkwMFowgZ8xCzAJBgNVBAYTAkRFMQ8wDQYDVQQHEwZQYXNz
+YXUxHDAaBgNVBAoTE1VuaXZlcnNpdGFldCBQYXNzYXUxFjAUBgNVBAsTDVJlY2hl
+bnplbnRydW0xJTAjBgNVBAMTHFVuaXZlcnNpdGFldCBQYXNzYXUgQ0EgLSBHMDEx
+IjAgBgkqhkiG9w0BCQEWE2NhQHJ6LnVuaS1wYXNzYXUuZGUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCHgNE07AUUNYr1fFuo47bkmM/6R+SPTDHZxa9+
+glXCbOrBEqZwT/GumzG3Xr2IXimOX66uURF5JSZGIxi0B2QoE28g+mFSer03waQP
+BWshdB76F9FUTCgau/mVJ9DzFNk6x8h9goOchMdwbbA2uVPb/UTfnGfzE+qqI9hL
+DQS/1D750pXNJcu4CpM7ly8fYW0n8GAlq3RFNkL8ugPP9kvMxNhOzTVdOFsRhHR3
+Z+q5jh+zPB08SRmFOyJ4MMwR9wh4AqxwhoGNG5rmc6SqvNLkepgidtTfiMVjcC9d
+D7JniSe8BDVvX8cx3XsObhsJVnlbFnqlbSZbc9ylwyM1JOvPAgMBAAGjggIAMIIB
+/DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAI
+MAYGBFUdIAAwHQYDVR0OBBYEFAmx36HoYV2hzcb0g3k6LAYMjOwIMB8GA1UdIwQY
+MBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMB4GA1UdEQQXMBWBE2NhQHJ6LnVuaS1w
+YXNzYXUuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRw
+Oi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fjcmwu
+Y3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3Au
+cGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8v
+Y2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0
+LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEB
+AIHadl78I2qBdRsD0vO51Clvi3zJNYacKMJ5hQXKo97fkK3k5IbOkSAd8QMGUE75
+bkkgLOssRYRZxILTt7pMyoO4BJtO9CUNjuM1Ki2ovjgy+SnKl/ZQmKVv+lhoz90N
+biBC8Lol5sVmE0m53v5mURHqrzlbFBLPCLy64z9L58xqiqbCnVvRQXwGW/SH2S7K
+VbjhY7gTqVyPCkoiM8WMxWtWg7gsfN53RI6obYqj48lqCvwMhqX4MzJ4tAhhyjY6
+tGPNSsUVge+zTQAQ2EqZzzmXSXgR7S8w7VhoTDbqb8IqkPr2YX9qlRDxihm+mokM
+PqYc19jJ+gJqPUuX6rBfZpM=
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Bayern/L=Regensburg/O=Universitaet Regensburg/CN=Uni Regensburg CA - G01/emailAddress=pki@uni-regensburg.de
+serial=17A424BA4422E5
+-----BEGIN CERTIFICATE-----
+MIIFfTCCBGWgAwIBAgIHF6QkukQi5TANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTQz
+NVoXDTE5MDcwOTIzNTkwMFowgZ0xCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXll
+cm4xEzARBgNVBAcTClJlZ2Vuc2J1cmcxIDAeBgNVBAoTF1VuaXZlcnNpdGFldCBS
+ZWdlbnNidXJnMSAwHgYDVQQDExdVbmkgUmVnZW5zYnVyZyBDQSAtIEcwMTEkMCIG
+CSqGSIb3DQEJARYVcGtpQHVuaS1yZWdlbnNidXJnLmRlMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAzIHKVzPdLzApqKdpmJFSRa5ETrk8W0nuBK6B0dtH
+YLrA4E3IcGA4hJ/3aLc7hSSgchVsKWEXWuM4E+aiRAmxAuq9nhUq2UpCQ69+ipnw
+wl69Hvqi2JZYZskHzpu0bpMWge14RqbELxX/GTR2mnLOXC5r0KDkAT74uRC/UZeZ
+u9iZNCu5pn6dyx9y5q7QEm81Ubo7XR1b9e2ABl7llpO9zJFh18ouNjLh7OtQMTn6
+hFS3mlUUosHMB+kCePgUrOS6cihpfx6xN3euFGVIZKlGq0riA7bkH8MHzSaoivgH
+cjyNdoJ5sKFjYj8tofBo9q1BzY/YspcKr7zZzSMZpMn4OwIDAQABo4ICAjCCAf4w
+EgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAG
+BgRVHSAAMB0GA1UdDgQWBBQH1915iF9BccwW4dTH852yeLHdSDAfBgNVHSMEGDAW
+gBRJt8bP6D0ff+pEexMp9/EKcD7eZDAgBgNVHREEGTAXgRVwa2lAdW5pLXJlZ2Vu
+c2J1cmcuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRw
+Oi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fjcmwu
+Y3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3Au
+cGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8v
+Y2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0
+LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEB
+AKzHbJKQIplaAL9qb8NSmqBxdF9MqOg2i4OhCdLPVjxj2e9nkz83XunWiCithdIk
+iOizlTCEdUXMXgb9UudfwqIA12PVt56owz/VuywzIWggPziDiy3ArWbQZD3v7rKF
+Xq5Pn2UhVcDy3b0h8i01klyNn/aUNDWM2fs6O6vWxt+qQIVKdfV7b7xkOWavByPr
+buYuXE2PK/SewL66E5qgdxzThyEwosG1diEySCS62l8KtDbHXqfDSR27hdsdn6uO
+8CjjpjP1IseSXHImrMLD4QiBPx8VcCtrU0zrwTo7XS3e4jUYyyLaWqjemOc1CT/p
+w34rikz1psPTe2wWigsbaII=
+-----END CERTIFICATE-----
+
 subject= /O=TeliaSonera/CN=TeliaSonera Root CA v1
 serial=D1E03E5B48EDC79E093F40DEE161C38B
 -----BEGIN CERTIFICATE-----
@@ -25393,6 +28924,111 @@
 Ura7fBq1zGaTyRrE0S3ornM=
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Rheinland-Pfalz/L=Mainz/O=Johannes Gutenberg-Universitaet Mainz/CN=JGU CA - G01/emailAddress=jgu-ca@uni-mainz.de
+serial=17AFF7018B905E
+-----BEGIN CERTIFICATE-----
+MIIFgDCCBGigAwIBAgIHF6/3AYuQXjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDY0
+MloXDTE5MDcwOTIzNTkwMFowgaIxCzAJBgNVBAYTAkRFMRgwFgYDVQQIEw9SaGVp
+bmxhbmQtUGZhbHoxDjAMBgNVBAcTBU1haW56MS4wLAYDVQQKEyVKb2hhbm5lcyBH
+dXRlbmJlcmctVW5pdmVyc2l0YWV0IE1haW56MRUwEwYDVQQDEwxKR1UgQ0EgLSBH
+MDExIjAgBgkqhkiG9w0BCQEWE2pndS1jYUB1bmktbWFpbnouZGUwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7JMRU5G+FvjJtrLeQ0hVuh1Mzw93dZL9z
+HFg/HAx9oMM1f/VmcvmXcNvx4yWVhlZ9Qm85kmGZpCeT3JAE86enTPg9a/HLHrNW
+vp9feAxr8/CeMZao49z0naHX51QJH7SPZJEYeJN/l6/KyRxkOqatHCuAV1dO0kSq
+prnoNzUDUH2aoI1moy9p52wbwq+IH4rbTs9i4IoG0q5XY57yb/O/Ui/t1BI1I+Um
+nVzEkSbUY5/bzO/irkdMb986ZEK9cWT2piSgu2jcgG9mAfXUaI8lBwu+Ow8iXD30
+VtnfJHI0t/Upa1vw+NR2uHSLuhKaFPyCmjUZglK1/t2K+zns1JdZAgMBAAGjggIA
+MIIB/DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAE
+CjAIMAYGBFUdIAAwHQYDVR0OBBYEFDMYOT1VNFhwo6yv8Iz7mkciPU/NMB8GA1Ud
+IwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMB4GA1UdEQQXMBWBE2pndS1jYUB1
+bmktbWFpbnouZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2Eu
+ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdo
+dHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fj
+cmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29j
+c3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRw
+Oi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2Fj
+ZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQAD
+ggEBADGky0F0z/236UUCQKLByM5ZFOC2aoLjxYx1GLoWnkFRA2vciE5lXj4sViZ0
+G87ZImuW2Ivm+0ekCR3TrTF0hXX0SLWWvwEMMXFzInVQ0u7hPCrSY/wRTeoU7Id7
+DDpsSKKSxyCedOqkGFlGWlVlfhpdd1XxsOgTUBFLb2uFU2O4Bg7nV5dzNGbx2NuX
+zrg8w0AcMIHro7FVxROnLcnFHQBuNKedaQEChaCzxVFgpI1V0H+4eYWrO7liqA96
+hVqiRziBxCdEED/6gaZBLMyPigS4W3VlHDGaM3dvpsmOrTDf6xoTxtV1uvW4yxFo
+2xApeQk8takYsIf+RA0Q4KNPBpU=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Universitaet Giessen/OU=Hochschulrechenzentrum/CN=Universitaet Giessen S CA - G01/emailAddress=unigi-ca@uni-giessen.de
+serial=179060F48359B1
+-----BEGIN CERTIFICATE-----
+MIIFgTCCBGmgAwIBAgIHF5Bg9INZsTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYx
+MloXDTE5MDcwOTIzNTkwMFowgZ8xCzAJBgNVBAYTAkRFMR0wGwYDVQQKExRVbml2
+ZXJzaXRhZXQgR2llc3NlbjEfMB0GA1UECxMWSG9jaHNjaHVscmVjaGVuemVudHJ1
+bTEoMCYGA1UEAxMfVW5pdmVyc2l0YWV0IEdpZXNzZW4gUyBDQSAtIEcwMTEmMCQG
+CSqGSIb3DQEJARYXdW5pZ2ktY2FAdW5pLWdpZXNzZW4uZGUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDfcBCqGSeO2QVjqnFZ5a3Q4WkZhOv+UkVQFvMm
+XnvvXRhHtwk2cegOZYusZ48oB7l/DzKcBaRkkWMoxLguEmEeZPfBmnGyp1Z1fjBI
+MriBrPFJJBxSWoN9OUZFsQxntQKfwVm6Ov3t8Y0zRF8IOVjGRudwVXlV7LkGmTlN
+4cDtA2Eu/vbzt3eRatrcWCQER5zuOks/mJCdNiiHswRCa4h3RTZdPlps0pefumje
+OT3TkE1IZwi0pbL8+x+vXbYeBRVMDSgR9h8sla32qP+Qe2BR5ul1C1SWcol5Y0li
+dsZXufjpwdnMmLe6mqa5AwKodkzwkpvVHMBEmYf6f0gFG+7NAgMBAAGjggIEMIIC
+ADASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAI
+MAYGBFUdIAAwHQYDVR0OBBYEFA56sWEjJLS1Dg/oUtX8PohwiRkhMB8GA1UdIwQY
+MBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMCIGA1UdEQQbMBmBF3VuaWdpLWNhQHVu
+aS1naWVzc2VuLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3
+aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2Nh
+Y3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9v
+Y3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0
+cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2Nh
+Y2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xv
+YmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUA
+A4IBAQAcogRJfRZtnoTwf0k+7MrzVq7fTD/TEEQ5n4TftBysTpOJv4FNG1qSuWnm
+/WVhW0cyL4lj544++cyfI5fLPSCjXUS7Ho40FDNF/ViDbnhodO0I9RyjxEgYHNJV
+P3MxgmvS/FmuGXXvhcwWjOVZIndC5sGzoIg7mX9vd23mPobXu212tbzNmgUhwUkH
+t27qr91hVL9IFPPwiGftIru/0hXTZWpGsIMmITmrfdZqBcxHzlBS3CSPt3Ixkvqq
+Jx62ooMzQXiP5hIZaZJTIQ91EnCVyw093afIDhJHz9qd1xK18L214zIGY0O9/wpz
+fXuXsm5l+2/Y9RHL0M8C5z82qkTc
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Fachhochschule Schmalkalden/OU=Rechenzentrum/CN=Fachhochschule Schmalkalden CA - G01/emailAddress=pki@fh-schmalkalden.de
+serial=17AFF6DFEBBF04
+-----BEGIN CERTIFICATE-----
+MIIFgjCCBGqgAwIBAgIHF6/23+u/BDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDYw
+N1oXDTE5MDcwOTIzNTkwMFowgaExCzAJBgNVBAYTAkRFMSQwIgYDVQQKExtGYWNo
+aG9jaHNjaHVsZSBTY2htYWxrYWxkZW4xFjAUBgNVBAsTDVJlY2hlbnplbnRydW0x
+LTArBgNVBAMTJEZhY2hob2Noc2NodWxlIFNjaG1hbGthbGRlbiBDQSAtIEcwMTEl
+MCMGCSqGSIb3DQEJARYWcGtpQGZoLXNjaG1hbGthbGRlbi5kZTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBALR8MVXdA7ZXOSjNyg3cb16/phou+i1x8LoH
+MhkKV+5Uv/2yAs+RFSzUTOfmp2Onni8qN4yJUryXCO9WuQa2IHG2vrwW/reMj/11
+vctsAvr1Xbl1VuatQj7UUHV6bcWvVBxSEsoS685YmXBubDZMl4QfsZegENBQH7NB
+Z6gMGzISqo6qiPZ4RzoOJSKdChs+i0WoNoENBiz9cNB51UP7ARPnZDRXCvthz4FK
+Zvo0jMfxitTlZbqcqn4WZgBjCLUCWYRFFNMrXUwYvu6MpuyAlICnnvezmoKmiHTU
+sPL2EjVAW5nBkyff7R9PCanUv5Hd49+SkW/wLT2kX1wWw94pTOUCAwEAAaOCAgMw
+ggH/MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQK
+MAgwBgYEVR0gADAdBgNVHQ4EFgQUVVl4oWgAyl5arxqJhMcJAfv4Vb4wHwYDVR0j
+BBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwIQYDVR0RBBowGIEWcGtpQGZoLXNj
+aG1hbGthbGRlbi5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBj
+YS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmG
+N2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9j
+YWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8v
+b2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0
+dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9j
+YWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2ds
+b2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsF
+AAOCAQEAnylsYzv1UTEiQ2HYbbwrTIuGqkXxOdZB0nPB2ICMSKAFkRea32ZgJ9zA
+dnRdHuUYQieDCdNg+nJsTNtZU8VbCYRQjCFD/RXtsfOMjC78HOO2w2rpu9PTvX4K
+n3zzijO/aFMcrB7ySxwG/cOzTRM838hczAW+2niNUsusHG8A/rgkn6IB9IP620b3
+nrZJV/shfCyYKNoHMXkgUpo6i/XN9MVNzf/XifdvsgPErTPdpiBEVe27GLGl+Hf0
+LFvbfbGzOlQucu8ds7Jh7f/aqtdO/MrGbuhrC73LXX9eZQRK0JEDVeXhmY0iuJK4
+WjX3zB+N5bg7YuVdDU+hU2j7SP3hHA==
+-----END CERTIFICATE-----
+
 subject= /C=DE/ST=Niedersachsen/L=Braunschweig/O=Helmholtz-Zentrum fuer Infektionsforschung GmbH/OU=Rechenzentrum/CN=Helmholtz-Zentrum fuer Infektionsforschung/emailAddress=sysadmin@helmholtz-hzi.de
 serial=0AA2FAFB
 -----BEGIN CERTIFICATE-----
@@ -25428,39 +29064,74 @@
 db4QXVTMd1E2wiNHrLuS3vD04ZUF7ns=
 -----END CERTIFICATE-----
 
-subject= /C=CN/O=WoSign eCommerce Services Limited/CN=WoSign Class 3 OV Server CA
-serial=199DF868
+subject= /C=DE/ST=Hessen/L=Darmstadt/O=Technische Universitaet Darmstadt/CN=TUD CA G01/emailAddress=tud-ca@hrz.tu-darmstadt.de
+serial=17A4248095F705
 -----BEGIN CERTIFICATE-----
-MIIFhDCCA2ygAwIBAgIEGZ34aDANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJD
-TjEqMCgGA1UEChMhV29TaWduIGVDb21tZXJjZSBTZXJ2aWNlcyBMaW1pdGVkMSow
-KAYDVQQDEyFDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBvZiBXb1NpZ24wGhcLMDkw
-ODA4MDEwMFoXCzI0MDgwODAxMDBaMF8xCzAJBgNVBAYTAkNOMSowKAYDVQQKEyFX
-b1NpZ24gZUNvbW1lcmNlIFNlcnZpY2VzIExpbWl0ZWQxJDAiBgNVBAMTG1dvU2ln
-biBDbGFzcyAzIE9WIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALyJvmFRU8grlnWzWtMONP5Kwp+jGIOirOMuXpN5CxNJXpOyj4QQ7ZGP
-grqtZ98zG66E8lWwW/SznrzmBA8d7wRaqAvsEm1WGWRwSQ9XkvNfIaZNtNKWKzwy
-s++PWQsUum6innHb8og/KDvszr5HrEXHip76YZPFSRe2Rrb3mRaMHG4xrmnO7cYk
-knChy5bDbBbQ7sxPhjOzQeY9PdsOjDN0u8P8C6f80XHiwQzU97o+gJDUSOuig3DY
-2zAHKYn5gSEs/+tH9nptQ5ZnFz7z4nNRx3Ye6Ryg7BEasc8eLZxV7jvGLa7cZmWR
-omacrILxpBe110ODw4igZN7KckXcOPsCAwEAAaOCAUQwggFAMBIGA1UdEwEB/wQI
-MAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRiLoHZ40J5FKPN2VSK
-bvjelaqPmDAfBgNVHSMEGDAWgBThZs8O0fGzS7cGIBT+hxLV9v77PjBjBggrBgEF
-BQcBAQRXMFUwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLndvc2lnbi5jb20vY2Ew
-LAYIKwYBBQUHMAKGIGh0dHA6Ly9haWEud29zaWduLmNvbS93b3NpZ24uY2VyMC4G
-A1UdHwQnMCUwI6AhoB+GHWh0dHA6Ly9jcmxzLndvc2lnbi5jb20vY2EuY3JsMEUG
-A1UdIAQ+MDwwOgYLKwYBBAGCm1EBAQAwKzApBggrBgEFBQcCARYdaHR0cDovL3d3
-dy53b3NpZ24uY29tL3BvbGljeS8wDQYJKoZIhvcNAQELBQADggIBAFTnXhG4xzdb
-dNRVXKVa0sdxePC6euCc1VRyiQIt6fYWfRL/Okpbks869nAYpcZZnUHQjm/XigjZ
-Vd5B1g6mB5lx7Q72lGsMgBxTmdEXQ6fEhk2P0JiYfy+csvP+98UTRHmrNCmZLHTq
-qZgflZN9eOi58ud44homuEp2vBnxKk1hJImEZh73j2BSjcjgl0fAfhjJH1wRGNtV
-xliTEE4SySzLhsMGb2eUig1SThXgC2TW/W0JHS615XaW88Keqk0WJTqRALYS/7Nx
-r4UqUO968ICZho3B8APGryPQb7+oqc29t+kwxznxgHPuK13/ttOAV4ARbX2YSz3z
-FSNqiGDuYaw/wytH+FATBQbPDKl/+kgK81QztoNyY6uU9MZswraIp5t+TUx7Krdc
-HF8KYz0T616bJKiLseJcMnwuXSJcNXkQfb+yLruObXt2RDoPBcBESYDf/biC7Qt+
-S9BVqWwVcNpWe890KpQoIqzfoYfuN+t3nFgKFNpLNURA5DbQBCvyRjAeQxecKW9i
-SSUNfZxDk8wMQsouo6TNydINtWkhJq5SVv7ay1TlkFSJDRNqToDukGJSlvTQv8kt
-EbVThRwIIMaqfIbA5mJsPeuiHDlpaxyVisigcWajgUdJK7usS/2Eibx3qVt8TJc0
-iVfV9JkNZlIteS4/sqQSrbTJ2Lzs5yf4
+MIIFgzCCBGugAwIBAgIHF6QkgJX3BTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTMz
+NloXDTE5MDcwOTIzNTkwMFowgZ4xCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZIZXNz
+ZW4xEjAQBgNVBAcTCURhcm1zdGFkdDEqMCgGA1UEChMhVGVjaG5pc2NoZSBVbml2
+ZXJzaXRhZXQgRGFybXN0YWR0MRMwEQYDVQQDEwpUVUQgQ0EgRzAxMSkwJwYJKoZI
+hvcNAQkBFhp0dWQtY2FAaHJ6LnR1LWRhcm1zdGFkdC5kZTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAJ50CXwK7fvlBZEVJiNkmYKE5bIfUF9DI5Y8S4Jk
+eFpguwBAIpMa5ucxLAjVeHaDLfh2jkOPKlz1maOvFV+qQaJW8Xvyix73GNmmfvLZ
+7I/VT7T2+J9TP1+3wkpfk3OpsAlSlkUQTU7EVoF2ugxmrxLVPHv/8l9De+8t2qA3
+Hu78D6b6DaTO0djTVwr/aMhDH2c9tUg3xdYY8ndOuggY38bJ8MwJ7gq7lbD/6sh8
+1WvUGuWfbrVwNm+VdbCGkRTIxIHhG8G46YSQgnoYVhPUNApF8ZiGYq0oJNBWvLpT
+Mbxb7qRL0KeeEYEnCRSryKwOqGK2VCf/90f+Wtc8Iu/JuE0CAwEAAaOCAgcwggID
+MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgw
+BgYEVR0gADAdBgNVHQ4EFgQUujfIpHTGND6RJ59VG174G9mo5EEwHwYDVR0jBBgw
+FoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwJQYDVR0RBB4wHIEadHVkLWNhQGhyei50
+dS1kYXJtc3RhZHQuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5
+hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwv
+Y2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDov
+L29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjto
+dHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQv
+Y2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQEL
+BQADggEBAOKhtja6kUX7uhFTNoFAZKOXoLlY/LDPo+OCsB2fW1VRC/s2XCkW5yB1
+/nF2DbjHm3y4nL7LCcKisTOwQvspNNrtgPLk1DUhy9xz+5Xqag63b+nD2HPzxyAj
+fPpKyv8C5LjYttMw0NENsoSBgwkht95o6IQ17v3Z57+9OTtXIPH6DHxBtwW8GMeN
+RQIBQL2cd66ZbOL26m9Mc9QfQPTVH0VLhs39STmgzu/OSSDM0lYj7uQgZig9RFpQ
+3pZOxXKp0/k+Pxx65pxgcdqSnN2wloVMfWtB9TmRyscnhYQ9VtZqUBc6kmckf1da
+FwKtHeNG1txFYJc3DEHeD5fb96NFdD8=
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Brandenburg/L=Muencheberg/O=Leibniz-Zentrum fuer Agrarlandschaftsforschung (ZALF) e. V./CN=ZALF CA/emailAddress=pki@zalf.de
+serial=17AFF6965792B9
+-----BEGIN CERTIFICATE-----
+MIIFgzCCBGugAwIBAgIHF6/2lleSuTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDQ1
+NFoXDTE5MDcwOTIzNTkwMFowga0xCzAJBgNVBAYTAkRFMRQwEgYDVQQIEwtCcmFu
+ZGVuYnVyZzEUMBIGA1UEBxMLTXVlbmNoZWJlcmcxRDBCBgNVBAoTO0xlaWJuaXot
+WmVudHJ1bSBmdWVyIEFncmFybGFuZHNjaGFmdHNmb3JzY2h1bmcgKFpBTEYpIGUu
+IFYuMRAwDgYDVQQDEwdaQUxGIENBMRowGAYJKoZIhvcNAQkBFgtwa2lAemFsZi5k
+ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7nJ9biapA0fdEFQWCe
+k4QmAhdO4ys+oL95lwYxgEBtpWpdx24O0sxLPOybaaNiq7MuUNl8iZwtwdobP6GP
+zwZpZzZipibLcG7ltz5+BimBBgMUeO/6oiziorKnEMzJxMgprEs/tqXETH8TXY0E
+1HFKdc9JwHnwBHbGeFS4IXa2nxo7MBLEnoPl/6+WOwN7/+6LHaIVtW+0r3lxqjjO
++7HHJYM4p/TY2cUMLgtJv+uaiY5TuLSHCEh6O34VceJOxDAnPmqP+MmUhBLIJzI7
+tgfa77dZYBOA1t+fq0It+831aeNkF62C0gU4cUx7atUirV4i7upC0p2ZAwzZ+r5W
+xUMCAwEAAaOCAfgwggH0MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQD
+AgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQUFsRuDTv4lXZgGSNfNvyT
+k3lm9JYwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwFgYDVR0RBA8w
+DYELcGtpQHphbGYuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5
+hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwv
+Y2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDov
+L29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjto
+dHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQv
+Y2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQEL
+BQADggEBAJbFStUiA+tU/ACnvRpw7NBkgjy69w026v/jfvaNAyZop8HTGh9RTc16
+4iYPSrWv6K5uGc8tYzf7ReuvfYyX+qnP8U+8CxRQMRf3ipeH+W5LjRlhA8S22rTi
+C6oHyl6nNLucQCQx3FzUktcpL8Jw5tA80viA7t9gJULNfzs0NB5RrZ3zaHHN2zlW
+16z5BUjiQ+wR3qQE+4Ef/vVA86rt0nCcCRN+u61iTdeOqmWW3IA88n5nILuAuxJp
+hMBaajfw14A0PHYA7NsZXBFPMPkuSQuKmxKPAXfmn9Li2AJv1xWg99GUQWfRaR5P
+PwlgwPZ7IYigbR4JKEcs/IqZ3LeqCPg=
 -----END CERTIFICATE-----
 
 subject= /C=CN/O=WoSign eCommerce Services Limited/CN=WoSign Class 3 OV Server CA
@@ -25498,41 +29169,6 @@
 3j2MXP7WCHav4dl5dXDC7iKN+1TEcSLX
 -----END CERTIFICATE-----
 
-subject= /CN=ATT Wi-Fi Services Root Certificate Authority/OU=ATT Wi-Fi Services/O=ATT Services Inc/C=US
-serial=040000000001331BC2F5B9
------BEGIN CERTIFICATE-----
-MIIFhDCCBGygAwIBAgILBAAAAAABMxvC9bkwDQYJKoZIhvcNAQEFBQAwcTEoMCYG
-A1UEAxMfR2xvYmFsU2lnbiBSb290U2lnbiBQYXJ0bmVycyBDQTEdMBsGA1UECxMU
-Um9vdFNpZ24gUGFydG5lcnMgQ0ExGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
-CzAJBgNVBAYTAkJFMB4XDTExMTAxOTEwMDAwMFoXDTIxMTAxOTEwMDAwMFowfTE2
-MDQGA1UEAwwtQVRUIFdpLUZpIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0
-aG9yaXR5MRswGQYDVQQLDBJBVFQgV2ktRmkgU2VydmljZXMxGTAXBgNVBAoMEEFU
-VCBTZXJ2aWNlcyBJbmMxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAkz0TVUrWsop/D05aA7XEWifAcN70J97EPYiMGB81Lk3/LeOF
-WXQwYLBVqFiSETezQco+D+72dYZCx2lGIA1X9/A/D3Xo1DdQs6bPLKFstQQ6o0E/
-tEh1RUoyd0fzvBQ9pVHhkOjvx94kZ3+0dlJx8lERO9NMvos6ybmlb17JVy021/mC
-v+zr7MjBzVi66YcyvtDXJU0AqO/lcNLXSe3y85gXZGeqJNNkHG4RwzB3DWoEcP+U
-SGWoglnh3jCYujcbhAw1tAPtWsNP8D4LpHJfex7nkssVIA6D0q+EYhiWFI85nRqM
-GfaSRab1semGd3ULyyNGrXC+tzOCf8casNl4eQIDAQABo4ICDzCCAgswDgYDVR0P
-AQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFM9JA9+7hHBA
-rY31ons1RgVFHq7nMIIBCQYDVR0gBIIBADCB/TBvBgkrBgEEAaAyATwwYjAxBggr
-BgEFBQcCARYlaHR0cDovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAt
-BggrBgEFBQcCAjAhGh9HbG9iYWxTaWduIFRydXN0ZWQgUm9vdCBQcm9ncmFtMIGJ
-BgsrBgEEAaNIg30BATB6MC8GCCsGAQUFBwIBFiNodHRwOi8vY3JsLnBraS53YXlw
-b3J0Lm5ldC9jcHMuaHRtbDBHBggrBgEFBQcCAjA7GjlDb3B5cmlnaHQgKGMpIDIw
-MTEgQVRUIFdpLUZpIFNlcnZpY2VzIEFsbCBSaWdodHMgUmVzZXJ2ZWQwPwYDVR0f
-BDgwNjA0oDKgMIYuaHR0cDovL2NybC5nbG9iYWxzaWduLm5ldC9Sb290U2lnblBh
-cnRuZXJzLmNybDBXBggrBgEFBQcBAQRLMEkwRwYIKwYBBQUHMAKGO2h0dHA6Ly9z
-ZWN1cmUuZ2xvYmFsc2lnbi5uZXQvY2FjZXJ0L1Jvb3RTaWduUGFydG5lcnMtUjEu
-Y3J0MB8GA1UdIwQYMBaAFFaE7LVxpedj2NtRBNb65vBIUknOMA0GCSqGSIb3DQEB
-BQUAA4IBAQBK2ytW8a4h5LUd5/YmImP7CccpEeg/P0r3iFF4g/gZbiOql0KQz6yV
-SIKtJ2hGYMxkl75cRZCsoOgm8tzE0+oaaGvvdeWoCFkImFBt7mT+MnYUbWNnI3rL
-HynQlDnvcsdRpyWR44OYGc0o4PGMSplsn+1bKbvoBDgdMH+3S7245+ZhdrYHBaL0
-wa9+On7hkvz9Hyux2BYnZRpiALsqK4hM4jdnLRub10LHOKTgeG6Bl4pkcS5Ko/oA
-FRDrmedqO4A+WeeNaQp7flts9GPYMHAngtUN9gx4hCPwjaufOk9z+EH3U76RrbZk
-XECK7mvlBQsJfHEqzNOddWpDENb02llq
------END CERTIFICATE-----
-
 subject= /C=FR/O=Certinomis/OU=0002 433998903/CN=Certinomis AC 1 \xC3\xA9toile
 serial=15
 -----BEGIN CERTIFICATE-----
@@ -25568,6 +29204,76 @@
 7rs968z2T4sF2AAQcc6IkuRWDqu0pHWpBg==
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Bayern/L=Erlangen/O=Universitaet Erlangen-Nuernberg/OU=RRZE/CN=FAU-CA/emailAddress=ca@rrze.uni-erlangen.de
+serial=17A425350DC4BF
+-----BEGIN CERTIFICATE-----
+MIIFhTCCBG2gAwIBAgIHF6QlNQ3EvzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTYz
+N1oXDTE5MDcwOTIzNTkwMFowgaMxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXll
+cm4xETAPBgNVBAcTCEVybGFuZ2VuMSgwJgYDVQQKEx9Vbml2ZXJzaXRhZXQgRXJs
+YW5nZW4tTnVlcm5iZXJnMQ0wCwYDVQQLEwRSUlpFMQ8wDQYDVQQDEwZGQVUtQ0Ex
+JjAkBgkqhkiG9w0BCQEWF2NhQHJyemUudW5pLWVybGFuZ2VuLmRlMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt4zo7dRsCRRgHOL7iMEQXwWSXMbFa8Ac
+ei7z6I0pxFUxT18yK4n+fgq4f/cCDMaWjKJ4KWY6p78qUiFZRG0zCw6YPesxyVen
+2KUbt4hTvS4TzZrPULDs3ZXej22Ug+UMfrVlcrxcJA7Tm7/O5uotER46J1xX6KuW
+6vnjyG7L6JREwa6jAaAfW2b2XVffvfleqS+QXCdTNSSEWIAHC1qPEhnTbaAwIltr
+lFeP4tJm/7rsw9OpCZ2gx/dZKzzOkzznj5FJI81uKcoOjgoBGR9o2ROJvfoc8x8x
+O7lWIFHlMi5En+AAe1XdgL5RxyOmP/LhdQ34Siqyo4OUWxW/33goCQIDAQABo4IC
+BDCCAgAwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0g
+BAowCDAGBgRVHSAAMB0GA1UdDgQWBBT0c/P6xkKzxlxpwFi+dDj5YSuOYjAfBgNV
+HSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAiBgNVHREEGzAZgRdjYUBycnpl
+LnVuaS1lcmxhbmdlbi5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAx
+LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7
+oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Ny
+bC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRw
+Oi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKG
+O2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2Vy
+dC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRl
+L2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0B
+AQsFAAOCAQEAC92/m1BdLxjcPa38cIRyZjtTNwr9vxdTohjSjxvblI0hVfSqQ3IL
+qeTHY0k2lqzZwJWzk+AqYBXn2gKI26lxQEnXbrCJOXO7LjAjVhImAfA9fSsQwt58
+j/pgB/GAKofR9xHLRZLzjkJJk1jutpXDJkGOu8JiKjSLaOaeJIBPpE99YBNeysGX
+eCZ8G0ns4W3SXXMt4qGE+Ex4hQyiMZQqx3IyyUELpCblQMD83rzf94YJ+Tco7ApV
+BnTqGaVsQPB9ryPvRHdcWY5UMIpxclaVNED9MATFALPhjQBahknvo90zNC2Mgqm8
+GrYqHgvwPlrOynSUGown/xfyMPnWibHjtw==
+-----END CERTIFICATE-----
+
+subject= /C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT SSL SHA2
+serial=07279AA9
+-----BEGIN CERTIFICATE-----
+MIIFhjCCBG6gAwIBAgIEByeaqTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTEzMTIxOTIwMDczMloX
+DTE3MTIxOTIwMDY1NVowgYsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
+dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
+YXRpb24xFTATBgNVBAsTDE1pY3Jvc29mdCBJVDEeMBwGA1UEAxMVTWljcm9zb2Z0
+IElUIFNTTCBTSEEyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0eg3
+p3aKcEsZ8CA3CSQ3f+r7eOYFumqtTicN/HJq2WwhxGQRlXMQClwle4hslAT9x9uu
+e9xKCLM+FvHQrdswbdcaHlK1PfBHGQPifaa9VxM/VOo6o7F3/ELwY0lqkYAuMEnA
+iusrr/466wddBvfp/YQOkb0JICnobl0JzhXT5+/bUOtE7xhXqwQdvDH593sqE8/R
+PVGvG8W1e+ew/FO7mudj3kEztkckaV24Rqf/ravfT3p4JSchJjTKAm43UfDtWBpg
+lPbEk9jdMCQl1xzrGZQ1XZOyrqopg3PEdFkFUmed2mdROQU6NuryHnYrFK7sPfkU
+mYsHbrznDFberL6u23UykJ5jvXS/4ArK+DSWZ4TN0UI4eMeZtgzOtg/pG8v0Wb4R
+DsssMsj6gylkeTyLS/AydGzzk7iWa11XWmjBzAx5ihne9UkCXgiAAYkMMs3S1pbV
+S6Dz7L+r9H2zobl82k7X5besufIlXwHLjJaoKK7BM1r2PwiQ3Ov/OdgmyBKdHJqq
+qcAWjobtZ1KWAH8Nkj092XA25epCbx+uleVbXfjQOsfU3neG0PyeTuLiuKloNwnE
+OeOFuInzH263bR9KLxgJb95KAY8Uybem7qdjnzOkVHxCg2i4pd+/7LkaXRM72a1o
+/SAKVZEhZPnXEwGgCF1ZiRtEr6SsxwUQ+kFKqPsCAwEAAaOCASAwggEcMBIGA1Ud
+EwEB/wQIMAYBAf8CAQAwUwYDVR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEF
+BQcCARYtaHR0cDovL2N5YmVydHJ1c3Qub21uaXJvb3QuY29tL3JlcG9zaXRvcnku
+Y2ZtMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
+AwIwHwYDVR0jBBgwFoAU5Z1ZMIJHWMys+ghUNoZ7OrUETfAwQgYDVR0fBDswOTA3
+oDWgM4YxaHR0cDovL2NkcDEucHVibGljLXRydXN0LmNvbS9DUkwvT21uaXJvb3Qy
+MDI1LmNybDAdBgNVHQ4EFgQUUa8kJpz0aCJXgCYrO0ZiFXsezKUwDQYJKoZIhvcN
+AQELBQADggEBAHaFxSMxH7Rz6qC8pe3fRUNqf2kgG4Cy+xzdqn+I0zFBNvf7+2ut
+mIx4H50RZzrNS+yovJ0VGcQ7C6eTzuj8nVvoH8tWrnZDK8cTUXdBqGZMX6fR16p1
+xRspTMn0baFeoYWTFsLLO6sUfUT92iUphir+YyDK0gvCNBW7r1t/iuCq7UWm6nnb
+2DVmVEPeNzPR5ODNV8pxsH3pFndk6FmXudUu0bSR2ndx80oPSNI0mWCVN6wfAc0Q
+negqpSDHUJuzbEl4K1iSZIm4lTaoNKrwQdKVWiRUl01uBcSVrcR6ozn7eQaKm6ZP
+2SL6RE4288kPpjnngLJev7050UblVUfbvG4=
+-----END CERTIFICATE-----
+
 subject= /DC=local/DC=experian/CN=Configuration/CN=Services/CN=Public Key Services/CN=AIA/CN=Experian Root CA
 serial=4C0E818C
 -----BEGIN CERTIFICATE-----
@@ -25603,6 +29309,76 @@
 dPhMxA33XGy+AyPLr58+peC3aYG2ZqY49eam
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=Hochschule Reutlingen - Technik-Wirtschaft-Informatik-Design/CN=HS Reutlingen CA - G01/emailAddress=ca@reutlingen-university.de
+serial=16D0F41EEF61BA
+-----BEGIN CERTIFICATE-----
+MIIFhzCCBG+gAwIBAgIHFtD0Hu9hujANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTEzMTIxODEwMTg1
+NFoXDTE5MDYzMDAwMDAwMFowgaExCzAJBgNVBAYTAkRFMUUwQwYDVQQKEzxIb2No
+c2NodWxlIFJldXRsaW5nZW4gLSBUZWNobmlrLVdpcnRzY2hhZnQtSW5mb3JtYXRp
+ay1EZXNpZ24xHzAdBgNVBAMTFkhTIFJldXRsaW5nZW4gQ0EgLSBHMDExKjAoBgkq
+hkiG9w0BCQEWG2NhQHJldXRsaW5nZW4tdW5pdmVyc2l0eS5kZTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKrprc4RIjAsDdI58O+vbI8Xd3691lWQPCvW
+xYqga2/kaF6vpRZRvky4WPof4LDp9zloznQrDjlRlrcIZ8HjLby+B9g15eKjAbJS
+qs7KQ+migPCQZ4Q7xRieQcJSaInCOARX9K5ZnVFQq/SGszlW42K9DjIWXbcau8SL
+7ZxCNd+H5+u4yqL1b5KjysT3wfCSjSSJtuEmaUd2EGuzYFJXnWS6t4i+1eqHb86U
+uWEXhhSd4QyICHJx0mUz3wQDrHOXoqNgrHNItS+bb5cIG3CFqb79B7pJXQkMM3Qz
+nsxBrtwg49kqO1/zt3ok7xM432dD3NXTjex1/fjP7KHIzrWjgZsCAwEAAaOCAggw
+ggIEMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQK
+MAgwBgYEVR0gADAdBgNVHQ4EFgQUMx4QrMPjDu9Ub/BFvUqpghLGJDkwHwYDVR0j
+BBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwJgYDVR0RBB8wHYEbY2FAcmV1dGxp
+bmdlbi11bml2ZXJzaXR5LmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2Nk
+cDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9
+oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0
+dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcw
+AoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2Fj
+ZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3
+DQEBBQUAA4IBAQCKQ2OP6xpOTW1xR4b4vji+62cYXUjZdqbmp1wJJHc2v6ueuS+v
+V+8oLY5+FaTlnzyzhxYpcQ+xFkoYOnsjgqCSk/u30OeBSQqQhh7JeEfDLvfbUAao
+2BdiQHc+63lpZF3Np43huMk4GXztWH+KTHPZoayUNoyHGb8fOA7t+uvN+p24Jewz
+A0nyNJlEwbYhwawiwjzjTWR7cR7TN9vUApp1onuYCx7jtKgpT7M3qzmEpVhX2K/W
+41nMI7cflRIuwdSRUQBI1X5A7dsd/VEEMn5tE4btNETfNPkZYERCJTEVai82lYS2
+oY2atL1IDla8L2gL2H8C1YOgPtDZcTO8jJ6p
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=FZ-Borstel - Leibniz-Zentrum fuer Medizin und Biowissenschaften/OU=Netzzentrum/CN=FZ-Borstel-CA - G01/emailAddress=ca@fz-borstel.de
+serial=17AFF71B15D66C
+-----BEGIN CERTIFICATE-----
+MIIFhzCCBG+gAwIBAgIHF6/3GxXWbDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDcw
+N1oXDTE5MDcwOTIzNTkwMFowgawxCzAJBgNVBAYTAkRFMUgwRgYDVQQKEz9GWi1C
+b3JzdGVsIC0gTGVpYm5pei1aZW50cnVtIGZ1ZXIgTWVkaXppbiB1bmQgQmlvd2lz
+c2Vuc2NoYWZ0ZW4xFDASBgNVBAsTC05ldHp6ZW50cnVtMRwwGgYDVQQDExNGWi1C
+b3JzdGVsLUNBIC0gRzAxMR8wHQYJKoZIhvcNAQkBFhBjYUBmei1ib3JzdGVsLmRl
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj4qHkzlhvowxu6tQm75c
+OgosQ8XuLYvsTwMZxIOA02u7NSQixNZ1CF51sDmSGp46IfC+3R5pk7Wy0gPfjKQU
+VDaiVzEpNxcZ4/zK47ujDSNgCFkUu8C1V2j7rfe1hFGYmhSBqhRdMoNffoHkEp4l
+H6t6laJQzosWde6Dib1RekFybavvN0or1NPonGQAadRmyg+YhhvwmiGEstpnMdht
+2UuPaA0TavG5wPpzUnM0UY8FeLIYF8/slwepsP1MHDvkHOpISy+e/6ByMjyDHiui
+2Gdzgujl0ljjTw7UvXjpqggpihwpaDrcOq2yLkteJYD9VRTQyB4/DazCwG4kClPx
+UQIDAQABo4IB/TCCAfkwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMC
+AQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBTc3Hnk3LXEF/5ykOKHg4Lf
+ra/v5TAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAbBgNVHREEFDAS
+gRBjYUBmei1ib3JzdGVsLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2Nk
+cDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9
+oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0
+dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcw
+AoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2Fj
+ZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3
+DQEBCwUAA4IBAQBkj+2dkD+cv4QrM3aD9GVvO5GJWIgsia4++nLb4JFt3ckRtqS0
+lW4eOBkeI5ZxGEmJ9ooMcwMubaX6GDaL+KBPGfXw/L587oFlOGK+07rpbsf61uUP
+DjQxEtl5S8FK59RI8LXfzCVgr32xY3EM3as+sWXYJVxfEHyCOMZGkP8ZhDlWW/tQ
+QQkhqFjEgRDFScLoomWHYts78MMLG5xWjgo6zYrP8mBpGLEJujOKeHixqNJ0xbqJ
+xvybfz4a+TGaL0IVLPy6PtmOmfGroHNwrXTgSk5EieDjFHK+hEIGWNXc0xFvl2LJ
+rtQoyhz3g6SGQozRvSnLYTaR1xRUNbsoUKJB
+-----END CERTIFICATE-----
+
 subject= /C=CN/O=WoSign eCommerce Services Limited/CN=WoSign Class 1 DV Server CA
 serial=199DF888
 -----BEGIN CERTIFICATE-----
@@ -25673,6 +29449,146 @@
 yknVMe8Gtkap+uhGLKI7C9KSbprX6V7vfTsgVA==
 -----END CERTIFICATE-----
 
+subject= /C=CN/O=WoSign eCommerce Services Limited/CN=WoSign Class 4 EV Server CA
+serial=199DF89D
+-----BEGIN CERTIFICATE-----
+MIIFiDCCA3CgAwIBAgIEGZ34nTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJD
+TjEqMCgGA1UEChMhV29TaWduIGVDb21tZXJjZSBTZXJ2aWNlcyBMaW1pdGVkMSow
+KAYDVQQDEyFDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBvZiBXb1NpZ24wHhcNMDkw
+ODA4MDEwMDAxWhcNMjQwODA4MDEwMDAxWjBfMQswCQYDVQQGEwJDTjEqMCgGA1UE
+ChMhV29TaWduIGVDb21tZXJjZSBTZXJ2aWNlcyBMaW1pdGVkMSQwIgYDVQQDExtX
+b1NpZ24gQ2xhc3MgNCBFViBTZXJ2ZXIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQC1ATuYTUzRAmtZr6Of4ksiHl2V9xVZVktoBh9Yvm1JwNoIGVV/
+zqXWP2JMt6fjLZxIjJKG/1g33DRp7vQky+fuIAT9aq2JAi/FW87HXqM6gJR4l9IB
+vgEflqnP26Zpwt0jCxbesSKot5gaGk3bdLf21r54beh4loppS9xaM5dti/SZG+v9
+go7v4QrqzWe3Xy9rnTOFCZOB4Ev0/dVgSGx4jZinMXnSaCTdhET0fYZAvtR8XP3O
+oXh2drIitx7HaxCwTRXY/XVR4uPiz1tKd77+9BwVk+n0Bg7RwpHajSkp+IJEK0mg
+CQVFlBrSwKrtgkTNLL+UR0F75W45iN/OypRnAgMBAAGjggFEMIIBQDASBgNVHRMB
+Af8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUydP1JjiK8BGC
+L+9dOmxNlTHDZTIwHwYDVR0jBBgwFoAU4WbPDtHxs0u3BiAU/ocS1fb++z4wagYI
+KwYBBQUHAQEEXjBcMCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC53b3NpZ24uY29t
+L2NhMDMGCCsGAQUFBzAChidodHRwOi8vYWlhLndvc2lnbi5jb20vY2xhc3M0LXNl
+cnZlci5jZXIwLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybHMud29zaWduLmNv
+bS9jYS5jcmwwPgYDVR0gBDcwNTAzBgRVHSAAMCswKQYIKwYBBQUHAgEWHWh0dHA6
+Ly93d3cud29zaWduLmNvbS9wb2xpY3kvMA0GCSqGSIb3DQEBBQUAA4ICAQCAWU8y
+lf6Zfxj+YVhBAG/3XejH4DlyluVV18AWz/0SLL8Mp9xJNgjbKP64oISLm5nni/48
+w1bhOHZ59z3CHiyxhiVaKX5JJ4fAgD8hN2+cgJtzdTr1A6HCDMe2uILG8wIsCDax
+vbQBVRnS7kvm5ePom9uc6uUpQh7Hko4bETVP495kfCgMTyBRTM+oqjH34SQsK0wK
+6bEO3k9UYaFUqBCZm/mFGOtQBnhJTd8gh0H+ugzblpPXQYbbNBdlehiqkxwqxAd0
+cJeLt9XgpUnklM1bjGNoXlgiz6W7BbNp5q5HwwWIHCRhjQTQ7SMgcF6Ug0nIF2oU
+bzAimEW0dfhM9AtJp5BZKlc+A5WajnfC1ZNZP7SihsGEuCPUtxOEJFIrzE4T7Ovi
+8adAgn3QmnqU/GIyGqggbmMiu1RTihgDjbIeLdlocUfsme0rMofuihubqbgOAE67
+fFqFNu3Ohy+AtZKekkUktkFNoTOIH9pkCKdSlIzfQCLhNXda8yW6e9NwC1/3Cs+l
+vW0Q4h/FUQvvqpPh+MLEPU3fMUeWApSUnF8Sr2MvokOPU0KmUBExt6uaYEzSlqOr
+1+lB9+VWpKL9GrWvnPt9FRiMbMgmkLon6I7oG0XK5Qjpg0tniwLY3LPaVAptJ3HK
+ZS1MefvZZbgDYeN3FvJ5htcxihA63JCbhzUxyA==
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Niedersachsen/L=Goettingen/O=Georg-August-Universitaet Goettingen/CN=Universitaet-Goettingen CA/emailAddress=gwdg-ca@gwdg.de
+serial=17A4248924915C
+-----BEGIN CERTIFICATE-----
+MIIFiDCCBHCgAwIBAgIHF6QkiSSRXDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTM0
+NVoXDTE5MDcwOTIzNTkwMFowga4xCzAJBgNVBAYTAkRFMRYwFAYDVQQIEw1OaWVk
+ZXJzYWNoc2VuMRMwEQYDVQQHEwpHb2V0dGluZ2VuMS0wKwYDVQQKEyRHZW9yZy1B
+dWd1c3QtVW5pdmVyc2l0YWV0IEdvZXR0aW5nZW4xIzAhBgNVBAMTGlVuaXZlcnNp
+dGFldC1Hb2V0dGluZ2VuIENBMR4wHAYJKoZIhvcNAQkBFg9nd2RnLWNhQGd3ZGcu
+ZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCRUmJG8B1Cl9K3QPXO
+02pKE6AyH0x7BR4L0r6mKeTqI+sFF2C00AaYgP9Ib9XALIOP5aVjuL+p+Cau0a0Q
++Jet0DBcUrSgeQ2v68yBZCm9gJImG9l3J3SPVtV7Tqvb9YzIxE3UIRkU6dLLJeh1
+3fCX4V38FUCLlsz53+BNIb9/NU8RBLr5LA96Ep9ZEY60yBpl5Tx/oqoN1z7y4ofR
+V/4nyQuVTwdssD255yO6hp1rSb4Xsix9Sa+ZnbgapIBequQuPjn6uRpAZpRlUx+h
+aweQL3ZM4/L8/1xkUZ6ma9sf0B/k2GonxLwx7lLdP1iS8SxOtNkEqc2fX8de1ZW0
+w/dxAgMBAAGjggH8MIIB+DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQE
+AwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFB29c8xt7m4cdHDZoxs6
+uqgn3rzrMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMBoGA1UdEQQT
+MBGBD2d3ZGctY2FAZ3dkZy5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9j
+ZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmww
+PaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhido
+dHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUH
+MAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Nh
+Y2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG
+9w0BAQsFAAOCAQEABDfkCeTZVTtDMLb0BpM02XrX7O8OyBZMFbz7XIDQVYnMwC6N
+gljW3iteP9ulr3Irf+i3hL92b3Rh1KPnO0/wTiUQVd3psys403u5sRLYJYpWL5xf
+ZN8Q5JwIE5dpZTxJGW/CkQXrDY7OU10twOoA7Ode4gUPNYQmrgX7Ia5Bj7iXTVJS
+NINsxFeyrvw7ruMtxIvNrNL0YldPpvS7D2EbVtnQx11JJEd6+22IZjMjIEpDM7hS
+Zj2+TozI3gx8yRvvgIwYDgqTI8fTIgtPUxdi492MLwkiGWPcmHWrynky+qxnqBd8
+oQb9MbCrUrvmU7YXRXcacuvibLfeaqW/dsDL9A==
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Universitaet Greifswald/OU=Rechenzentrum/CN=Ernst Moritz Arndt Universitaet Greifswald - G02/emailAddress=ugca@uni-greifswald.de
+serial=179060E2E5E678
+-----BEGIN CERTIFICATE-----
+MIIFijCCBHKgAwIBAgIHF5Bg4uXmeDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU1
+NFoXDTE5MDcwOTIzNTkwMFowgakxCzAJBgNVBAYTAkRFMSAwHgYDVQQKExdVbml2
+ZXJzaXRhZXQgR3JlaWZzd2FsZDEWMBQGA1UECxMNUmVjaGVuemVudHJ1bTE5MDcG
+A1UEAxMwRXJuc3QgTW9yaXR6IEFybmR0IFVuaXZlcnNpdGFldCBHcmVpZnN3YWxk
+IC0gRzAyMSUwIwYJKoZIhvcNAQkBFhZ1Z2NhQHVuaS1ncmVpZnN3YWxkLmRlMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnHku0bk6GSDoY8EUsQU5Zsgh
+RAwcTcK38L36SX5RERfrxZKbumia7IIAkeWihGPBONfCRtNay/+z1Q7n0KtY0rm9
+Cmd6EslN2bSJ/w9lQyUMTD7+MGFOdxv27IUMT9ooZbAtTVr4s3w5dpo2MMaoaUiO
+DNV6cd5tqM42yFk4me/B0uPPrxobkRlLnlLKBVI4eLHwfTuCtL4tzw5ivVHLCmMn
+qFRbQBuZMpj6qPcDWcBpbsrhPvxx0XbN+01ibKveBbjg1BqFAbfjjAXB+75kCnC9
+cI4Xe1MQCMw63Gw9H4Zc4cmgAu4/CU2JNUmsDsE18NCDQpQzegz6+tdUrH/ZYwID
+AQABo4ICAzCCAf8wEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYw
+EQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBQw9r9CO7gFaFbyDFQ8nBBUuF74
+nzAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAhBgNVHREEGjAYgRZ1
+Z2NhQHVuaS1ncmVpZnN3YWxkLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDov
+L2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNy
+bDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9w
+dWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGG
+J2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEF
+BQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5k
+Zm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqG
+SIb3DQEBCwUAA4IBAQA4We+F5f9umBYjWkXPtVXzo48bHPilJvtSVYTy5VXLq+Qf
+3He0rZm2uc2Z/rdXG3oY9MrlpYoxEncLNNVRRxcruVpte3Rr9YGd7br5wkH28l49
+A7j5fIu5pqjDwNqiMIUKZdjyWIjy0HmhZuteXSdGwubEKWxA4SLfaeypoVp8aQku
+wnI8C1zShHmWjc2Tq6TyD6Aqni3+LtVNw9Sopzji7eIpE3O11JNpTHChC2/psce2
+KxknONkZYQaYdJkNzLF6L0U2GVSeln0LY3fxe2F4ZPblg0M7FDCIHY4WuErkHVsJ
+Uh4xFUNcyLYSlAul2odcwcDwY0AO2yDazpsP5we0
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Universitaet Kassel/OU=Hochschulrechenzentrum/CN=Uni Kassel Certification Authority (UniKassel-CA) - G02/emailAddress=ca@uni-kassel.de
+serial=179060E495B2A5
+-----BEGIN CERTIFICATE-----
+MIIFijCCBHKgAwIBAgIHF5Bg5JWypTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU1
+NloXDTE5MDcwOTIzNTkwMFowga8xCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNVbml2
+ZXJzaXRhZXQgS2Fzc2VsMR8wHQYDVQQLExZIb2Noc2NodWxyZWNoZW56ZW50cnVt
+MUAwPgYDVQQDEzdVbmkgS2Fzc2VsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IChV
+bmlLYXNzZWwtQ0EpIC0gRzAyMR8wHQYJKoZIhvcNAQkBFhBjYUB1bmkta2Fzc2Vs
+LmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtAqOOXABvwjbziGO
+EN+5pYuKYZ/l/Q7MoZFbkaMnNOzpNAyUc620tFd1VwiUI3/1R5ezvJ2YiWmn/Syt
+zPn8S7ZU29Chn+EdCIpVGpC1g0f2Oj1G8ddzcyDSRuk3fNKz8QIuGLue8ArpI3Yf
+f9kazOLjg2Krzq+6OvOPzqZRwYZ97X3UlsYnYX0OSFVK4R5OHuABWduBPGR3MFzU
+hCDXr4D4tsQj2YfNeJ1vqx2Wz0FhsTJgQEz+vez33X7t95fmKxF/pPZDR8fNxVuC
+a58kftAVCneQ8dUFvvRKbJJ7JS+aM5jXee2OD7+Nx5djawVYcunlMbB82Z5gzp1L
+PhdxdQIDAQABo4IB/TCCAfkwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8E
+BAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBQXPfKug9xhgKTokMyA
+l3k1DX0CTDAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAbBgNVHREE
+FDASgRBjYUB1bmkta2Fzc2VsLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDov
+L2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNy
+bDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9w
+dWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGG
+J2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEF
+BQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5k
+Zm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqG
+SIb3DQEBCwUAA4IBAQAieev29OMSn/1O7RbShfWduj2hrE0YEMS24c6VaI4mZqIT
+dANeEl6ZEJ9kKw31BJusq7wLZcOfwGyWnlnIAT0mI+/V2Ou3374YeN7gdpeKjzif
+v6MN35Jt8t6ptSp6c8Re8KldyWsHrF+7rFyelczK21iKPytqcInfGzRXJoBQ1Zag
+0mBIEN7n9aJkTrdPt+4YKrEdSHaKjC/9zGy+FMd8y7CeSenN706pnhW8dn0gBoH7
+CpReoa4/umx7JCojwURmq5fRcsnRQa71FcLUZKi9cVnsfvXPdQTzhcRRUMsRwdy9
+Ye7xy/OVN2ZTjIdUObd4/MPq5SSzVQ4SoVSI0h1C
+-----END CERTIFICATE-----
+
 subject= /C=US/O=Intel Corporation/CN=Intel External Basic Issuing CA 3A
 serial=611E80B7000000000007
 -----BEGIN CERTIFICATE-----
@@ -25743,6 +29659,216 @@
 XkPau/thTQCpIoDa2+c+3XA++gRTfAQ4svTO260N
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Baden-Wuerttemberg/L=Stuttgart/O=Universitaet Hohenheim/CN=Uni. Hohenheim CA - G01/emailAddress=rz-pki@uni-hohenheim.de
+serial=17AFF69201B692
+-----BEGIN CERTIFICATE-----
+MIIFizCCBHOgAwIBAgIHF6/2kgG2kjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDQ1
+MFoXDTE5MDcwOTIzNTkwMFowgakxCzAJBgNVBAYTAkRFMRswGQYDVQQIExJCYWRl
+bi1XdWVydHRlbWJlcmcxEjAQBgNVBAcTCVN0dXR0Z2FydDEfMB0GA1UEChMWVW5p
+dmVyc2l0YWV0IEhvaGVuaGVpbTEgMB4GA1UEAxMXVW5pLiBIb2hlbmhlaW0gQ0Eg
+LSBHMDExJjAkBgkqhkiG9w0BCQEWF3J6LXBraUB1bmktaG9oZW5oZWltLmRlMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxDcrHIUS2uXzg9l/fotcmp0Z
+lOhy+mOTkEQ4eR0N28xhevr/0Z1IYmR4KiUO+p6sDIE162Es6Shti+RS073jZIgJ
+rg0TVBb0jtKPpaQnr+1tsL/IM6P7UXAGizzy+0o4mtbdC42L5T4N/8hC8BUslb6L
+kepYPzBfHRNZkT1UeFC+UVU1dYDosOlJwM40hkF/DcOs7s9f8MsNR9jvGnbKKZef
+0FU9hrFIus2lEaRMifrkjEc+kRQVG9vbbQFjyXTS6Jw6ELvFoEXazDggtjIMp59t
+TvuUwfXZkNTSZmFDoaxazjcvAfSg1ieFTtybEvp6Pv9ikpSpKTMpx6h3/LeEqQID
+AQABo4ICBDCCAgAwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYw
+EQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBQltXl25oQ0xVBjnEEhAUT+/Q+b
+8TAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAiBgNVHREEGzAZgRdy
+ei1wa2lAdW5pLWhvaGVuaGVpbS5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6
+Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5j
+cmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzAB
+hidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2Eu
+ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkq
+hkiG9w0BAQsFAAOCAQEAyJ36QHBp2okp5VfanIvyr0Oy+u2ylvUmGnX1Ci4qwd6D
+TFFQa3K+mqRLmHTJCdeBVssIQM6KnSmdiqim6W4WmhkWf4TFimv4QUZYVfib2tw8
+aN2hHeECZKjeTY5bT/uWUDqW4j+Z6zB+WYRvYrluhg8zBwTp8RLu9fdV+Vnub8uI
+F0vv/stLh7bd0TCXDqMUr7cWZqNDZy1EyaWUIqJ8TJGjU2XAb2RSvUg+RsBhmswI
+MZei6tUT4Fiwn5vEQ/yFrgT4bih9mGbwFBbNAA3YIxEKyg+BEGab0Rv3GqKTY2TJ
+5+oSTZyrJb8t1OZrr7sjMzUMFpvp4Ma0g1ZDWKfWqQ==
+-----END CERTIFICATE-----
+
+subject= /DC=COM/DC=ABB/O=ABB/CN=ABB Issuing CA 4
+serial=12D96056000000000005
+-----BEGIN CERTIFICATE-----
+MIIFizCCBHOgAwIBAgIKEtlgVgAAAAAABTANBgkqhkiG9w0BAQUFADBYMRMwEQYK
+CZImiZPyLGQBGRYDQ09NMRMwEQYKCZImiZPyLGQBGRYDQUJCMQwwCgYDVQQKEwNB
+QkIxHjAcBgNVBAMTFUFCQiBJbnRlcm1lZGlhdGUgQ0EgMjAeFw0xMzA4MDgxMDAy
+NDhaFw0xODA4MDgxMDEyNDhaMFMxEzARBgoJkiaJk/IsZAEZFgNDT00xEzARBgoJ
+kiaJk/IsZAEZFgNBQkIxDDAKBgNVBAoTA0FCQjEZMBcGA1UEAxMQQUJCIElzc3Vp
+bmcgQ0EgNDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMFRvK6FC3z5
+dEeUepLiUrs4jPnGlqmnk0aOylP8OM203dsw60i5wdjWLMnELBHJzPN1RhtzvLdF
+Rx6dsvdEmizhZhIJVuasath3SkE+wGV7ZbPH+67iAr6c+v6tmdjzJhZ+0eny8qna
+OnFRGbyQDtjmJatNIzawwrWiHqBYTJ4k0m1bRjtjsHpIVUTdQNfFqhLji1UHleKM
+nyzLg01qd1M4CsjTxc3DYtHsP9lbgdvj8g37tdl8e9Ukx9OIyehrlsPzT6a1GYY+
+HNP6ia+dMGbthJDbKHPTupyi0mIRKOGrzZxyZFc7JvfORJD0sBjgugTPgeyZW1F4
+ZcwcZJHuHRMCAwEAAaOCAlowggJWMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYB
+BAGCNxUCBBYEFFWeiSPMego2U/RMlwTj+SywR54sMB0GA1UdDgQWBBRVSjPpXsyW
+xdSgkh8NyLAsjlZTejAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8E
+BAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAWgBSRqUTfxO7lTIoW
+gshq/hWUrdEufjCBvwYDVR0fBIG3MIG0MIGxoIGuoIGrhi1odHRwOi8vY3JsLnBr
+aS5hYmIuY29tL0FCQkludGVybWVkaWF0ZUNBMi5jcmyGemxkYXA6Ly9jcmwucGtp
+LmFiYi5jb20vQ049QUJCSW50ZXJtZWRpYXRlQ0EyLENOPUNEUCxDTj1QS0k/Y2Vy
+dGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3Ry
+aWJ1dGlvblBvaW50MIHJBggrBgEFBQcBAQSBvDCBuTA5BggrBgEFBQcwAoYtaHR0
+cDovL2FpYS5wa2kuYWJiLmNvbS9BQkJJbnRlcm1lZGlhdGVDQTIuY3J0MHwGCCsG
+AQUFBzAChnBsZGFwOi8vYWlhLnBraS5hYmIuY29tL0NOPUFCQkludGVybWVkaWF0
+ZUNBMixDTj1BSUEsQ049UEtJP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmplY3RDbGFz
+cz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MBEGA1UdIAQKMAgwBgYEVR0gADANBgkq
+hkiG9w0BAQUFAAOCAQEAEEzCFUokR7uWIO7M5J7J9NveB/y07UrEYZ2ciGs9/MY6
++C+5Fif54inAboyPeAbe3lKtN4a/4brVlj4P46hZs+M97NT3bt1xED3sqJuLTjLo
+qy9OEIJQmhFkrzgbsKspBUMfqF2qz6lrmxCWTgxGlL6ZRd4u+breC3lr7Ju6Lmff
+Wf+L+FabrlqwKeXtQ4/EparLfsPp08ZfssaEo7ms1GhS5M3PzWDqY283vWXZd5q3
+ruMOIZsn3oOmRtLHLN44/lNSSDKixskR35t0+L9G00pXSwO8uTYVJ4LfPw23T8vo
+vkHNu+SxENnxdQZiqCiDhdVswo5Z4swu8qPMyKfihA==
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Saarland/L=Saarbruecken/O=Universitaet des Saarlandes/CN=CA Universitaet des Saarlandes/emailAddress=ca@rz.uni-saarland.de
+serial=17AFF693C08574
+-----BEGIN CERTIFICATE-----
+MIIFjDCCBHSgAwIBAgIHF6/2k8CFdDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDQ1
+MVoXDTE5MDcwOTIzNTkwMFowgawxCzAJBgNVBAYTAkRFMREwDwYDVQQIEwhTYWFy
+bGFuZDEVMBMGA1UEBxMMU2FhcmJydWVja2VuMSQwIgYDVQQKExtVbml2ZXJzaXRh
+ZXQgZGVzIFNhYXJsYW5kZXMxJzAlBgNVBAMTHkNBIFVuaXZlcnNpdGFldCBkZXMg
+U2FhcmxhbmRlczEkMCIGCSqGSIb3DQEJARYVY2FAcnoudW5pLXNhYXJsYW5kLmRl
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3KSlL1u7b26VmdbX9Lgh
+v1HnUY4rCHwQZRVUfocemEgJJiEUMdY6XhTE+kCbPZ3NYjtSA0dIHbMTIOXCa0ph
+RxZY0Nq4wCsuPUF5rvMiwPPbd8XOAvezYbJUwv6FPmc575ksdK01mKeChdZ0DbYq
+5ENXlt66lieVxrpMhiY/V41T5OcXZmSyk/4P13BRTYn8b1mKWWT5s6I9y6RLbcw2
+tvBQEVLBZVPlNbbmZX6TdAJ7SmYrqn23v3HM8/9LFxPqD7d0MMgVCdIZvkFEUAoE
+UI0RgLEkef4gltxRW+snLwF2Yjw767j7SqmJZ6/QJqqnDh4waE+7TnK07kKEU+kc
+7wIDAQABo4ICAjCCAf4wEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMC
+AQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBT2pozwKxnIif3lj4WCxNwW
+OO1odTAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAgBgNVHREEGTAX
+gRVjYUByei51bmktc2FhcmxhbmQuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRw
+Oi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fjcmwu
+Y3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNh
+L3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcw
+AYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsG
+AQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1
+Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJ
+KoZIhvcNAQELBQADggEBABERHuP0GFHA94gLzLa9xFfV3cmq2xgZbkN1uzXBKSd9
+gkAL+xe2XdKus3lTW4DEH/Ut6jcfwFn8L/Xdb6LD6fOKcIG+YY69zjMb0KvIN3A2
+6LmJ8fPBYVaT3xUJM/D1t3k+s9/gjMKgOXZmbTMOCoILZUkm2ovSQbLwqikdRaT/
+DSPe9ielwcYzNSJLfAaNvig6A5R/fZBpYoU7KprMQmcmJegpP9IrG0VBpFLtZ9io
+FVwJTrh+y1MJycAooScUs0FFJnwAZiQv7Ew0JSZgokvbivswmooEXvz4dHweUEh8
+qhbPTXhBcD06AxMCdvCc5nhZ9ouieWRVRn1JkLNg/kU=
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Bayern/L=Augsburg/O=Universitaet Augsburg/OU=Rechenzentrum/CN=UAUX-CA/emailAddress=ca-admin@rz.uni-augsburg.de
+serial=17A424E2EC9143
+-----BEGIN CERTIFICATE-----
+MIIFjTCCBHWgAwIBAgIHF6Qk4uyRQzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTUx
+NFoXDTE5MDcwOTIzNTkwMFowgacxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXll
+cm4xETAPBgNVBAcTCEF1Z3NidXJnMR4wHAYDVQQKExVVbml2ZXJzaXRhZXQgQXVn
+c2J1cmcxFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xEDAOBgNVBAMTB1VBVVgtQ0Ex
+KjAoBgkqhkiG9w0BCQEWG2NhLWFkbWluQHJ6LnVuaS1hdWdzYnVyZy5kZTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALgkK9qxZphiYaorgK4LKR9Igo0d
+a92pNCr6aBRr3cTMJs5ZWbm9spJn/obeH26SWDkY37zKbOmp9WMm/FkYfTcExa9M
+m0gpEglaZEg3pzCk9GUXDJZvxjpfqjrbIajusE0ZvXlCOs2YCDUejyEM8swTm5fI
+yH7MNo+G5ue4hoiW2UW9BvZhL7TS5HIJFU2g22eK2pZky9DXSJH2eD+eEzEh4Bh1
+wqwRXdgxL89o03T0u2FVrHsZzqZfW7qcMq1cjR0RZFSkl37Z7muDseIMjwcqQgf7
+Wg56PJEDy+ldpHnzaWEqup/vLj+/QAtC4w09Te0brGxZ1JRfSHh/OImKRTcCAwEA
+AaOCAggwggIEMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEG
+A1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQUJd4oBUkohH8jIc8dINq+Lre+a+Yw
+HwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwJgYDVR0RBB8wHYEbY2Et
+YWRtaW5AcnoudW5pLWF1Z3NidXJnLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0
+cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3Js
+LmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUH
+MAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggr
+BgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9w
+dWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBj
+YS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0G
+CSqGSIb3DQEBCwUAA4IBAQDnQ0EQ6+TX9TvsAYoQrsBMifvOZb32YUWP38GN6EBs
+MYUKDHHCjkANgeJsE5G53PjysicZhi7QK+oDyqYcLuQbAZwJZOzU/69kUefi3aXV
+bDMipDKFqhszn5uc5I8nlALWYpUdko/B5kHe0DUA1tRDBFLcDIIwCRy3XoUuIheX
+3x7Qju2lUqriBbUHgDWftU0M1oXLvTwNZ9+uSQqit+/PV3Rv+GUncz1vGN34YlS4
+Q8xhactP7GT28lsa6BNorPzXhX416yaQnPKLT9w63UzikqaxEtHgSLar26AMclDS
+uCq8EV5BTtnM2/xi0Fg5YjapksADwUIdbQDd783cdUel
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Bayern/L=Muenchen/O=Fraunhofer/OU=Fraunhofer Corporate PKI/CN=Fraunhofer Service CA - G01/emailAddress=pki@fraunhofer.de
+serial=17AFF704D1AE73
+-----BEGIN CERTIFICATE-----
+MIIFjTCCBHWgAwIBAgIHF6/3BNGuczANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDY0
+NFoXDTE5MDcwOTIzNTkwMFowgbExCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXll
+cm4xETAPBgNVBAcTCE11ZW5jaGVuMRMwEQYDVQQKEwpGcmF1bmhvZmVyMSEwHwYD
+VQQLExhGcmF1bmhvZmVyIENvcnBvcmF0ZSBQS0kxJDAiBgNVBAMTG0ZyYXVuaG9m
+ZXIgU2VydmljZSBDQSAtIEcwMTEgMB4GCSqGSIb3DQEJARYRcGtpQGZyYXVuaG9m
+ZXIuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAiTF2SXlR2vHX
+/X9kzzpL/fcHwBm5wF8TqRQ1D+bUGlf7LlQdjyeTaHfpkclXMTIYhHgpJ9+VrVLj
+Bw1GwC6yWECvq5OCSUnFkRUkIE/dSCyKLTT83fKqE6ogxab7oNnWEYf62xfO8rTv
+23ho5/QBDu+oFJp0WZw/iEgbgW6mZsIFYOu0Djt3SCk0Ik4PscA9xd8wqmC2XKHz
+gICq1lhR+yFtUJ7nhQQujzLf03ojlF6bDfOiYpzDPhN0Eq+ojEt69Ee6qxyra1Vk
+cxfWLdHqueL0Tt1sHyvrOLDI3+JlH8s1d7gw6YWZ2GDFEtxL1Nbd6XY/XSCPzcB+
+LJoP8PFBAgMBAAGjggH+MIIB+jASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB
+/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFB6i3NYBSFVAjN7v
+9Z56grUAsmzfMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMBwGA1Ud
+EQQVMBOBEXBraUBmcmF1bmhvZmVyLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0
+cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3Js
+LmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUH
+MAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggr
+BgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9w
+dWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBj
+YS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0G
+CSqGSIb3DQEBCwUAA4IBAQAUqNLcih+0+uGRk79/w+cDgNRpWgGUMUt0w5hJd7Ln
+z9OckUBAetVxWwreUItLDuN4DXUr97QnLqhyNU7MOpPe75Y2XinE0AlX3fQYfieW
+VeZP6oZMzsOKflwfSCjZU18CA+C5+Z83pJbArikp5p9nB3yhApL7WRd7UwVIUplb
+605yrRH5KpxDejvS7V+HL3ppso9IcLGeh150ElE+QRBsXNToxxh4EAm7ChIBY/Lg
+hXzJhyOLh2vk86FRI4Hs0QWzAsLJ8WibZaFcFpX85y0oaH8VgS82ANQ44JlXT3ua
+Ybqcn3hCiFlGPSPipYU6z2e8ryvhtwthd2/VL1TniUIp
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=HAWK Fachhochschule Hildesheim/Holzminden/Goettingen/OU=Rechenzentrum/CN=HAWK-HHG-CA - G02/emailAddress=rechenzentrum@hawk-hhg.de
+serial=17A424760A21DE
+-----BEGIN CERTIFICATE-----
+MIIFjjCCBHagAwIBAgIHF6Qkdgoh3jANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTA3MDIwNTEzMjYw
+MFoXDTE5MDcwOTIzNTkwMFowgaoxCzAJBgNVBAYTAkRFMT0wOwYDVQQKEzRIQVdL
+IEZhY2hob2Noc2NodWxlIEhpbGRlc2hlaW0vSG9sem1pbmRlbi9Hb2V0dGluZ2Vu
+MRYwFAYDVQQLEw1SZWNoZW56ZW50cnVtMRowGAYDVQQDExFIQVdLLUhIRy1DQSAt
+IEcwMjEoMCYGCSqGSIb3DQEJARYZcmVjaGVuemVudHJ1bUBoYXdrLWhoZy5kZTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMZtsCpdsKMzy5HaW81zKnlu
+BmQmtL+PksibpYavFrBvU6ieISl2TriXT/fS2qZkX7EUgsBAhm39p5gxp9sz6n3Q
+JdGP5wBpEqOs0RjFEX5PEPNygjYhSpUqOx5fJ+hXU5J4AwMqkzhXDlJPZfGgmcFl
+HDZNZ8rF7kZurxdPE5Hu52Kzch8pNXyb2Taeuj5GhOtc/Sxl25QyyGEfwBjszvSQ
+Nn0b74FNBxtPDebGvGWbJRVUZvfdlG/saYzz+z5ek1fRAoVEAHq3erF6r2OqgjMD
+HfEg59rmYGM8/4PfwKhd6IoWIQMzglzot5/sgdOp6lcLAHjpOydgFkm0V98Zq0kC
+AwEAAaOCAgYwggICMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEG
+MBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQUSAoLOVqn8YFCK3WBGw881CY/
+PywwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwJAYDVR0RBB0wG4EZ
+cmVjaGVuemVudHJ1bUBoYXdrLWhoZy5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0
+dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNy
+bC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUF
+BzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYI
+KwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDAN
+BgkqhkiG9w0BAQsFAAOCAQEAAG5GazPzz+I7Tbpf27HSC5nzPzfDlErXwoIYV0aO
+vVpkpu2MblZdqLgsWEs0E2L5ZiweVPNX5nHnz4xpzz+KXKp64wR6zC0RgVAcuvGm
+q6suIYaiB9f9mVVlKwvgolmTmr38YTqDvdL1fuZtbLL05b14Aro7rTNJdw4VA0JL
+K4gHh4ARPEAExb+aHGyatLCcEzlzCsPIsL5B+gWu7ciWYmhxb/rziCWSRBAqQRYv
+ufOR3HzTwx08UsMVOEMRElpGtMq3NkUuqoX8DcnvNFblpTGD3aC1Zweus6YcL34l
+KMQ/H+yxygJ65j5WpzLxjYyjZOgmFHAee3PlJdaih9AaLg==
+-----END CERTIFICATE-----
+
 subject= /C=CN/O=WoSign eCommerce Services Limited/CN=WoSign Class 3 OV Server CA
 serial=195DF8A5
 -----BEGIN CERTIFICATE-----
@@ -25778,39 +29904,179 @@
 3B6/4sVUjunfzXjj/s4VEi24m26otKwiTlh0cunFTtOHw78=
 -----END CERTIFICATE-----
 
-subject= /C=US/O=Entrust, Inc./OU=AND ADDITIONAL TERMS GOVERNING USE AND RELIANCE/OU=CPS CONTAINS IMPORTANT LIMITATIONS OF WARRANTIES AND LIABILITY/OU=www.entrust.net/CPS is incorporated by reference/OU=(c) 2008 Entrust, Inc./CN=Entrust Certification Authority - L1B
-serial=3863C5AE
+subject= /C=DE/ST=Berlin/L=Berlin/O=Freie Universitaet Berlin/OU=ZEDAT/CN=Freie Universitaet Berlin - FU-CA - G01/emailAddress=ca@FU-Berlin.DE
+serial=179060CCF9B96E
 -----BEGIN CERTIFICATE-----
-MIIFkTCCBHmgAwIBAgIEOGPFrjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
-RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
-IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0wODA4MjUxODE0MjZaFw0xODA4
-MjUxODQ0MjZaMIIBNDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIElu
-Yy4xODA2BgNVBAsTL0FORCBBRERJVElPTkFMIFRFUk1TIEdPVkVSTklORyBVU0Ug
-QU5EIFJFTElBTkNFMUcwRQYDVQQLEz5DUFMgQ09OVEFJTlMgSU1QT1JUQU5UIExJ
-TUlUQVRJT05TIE9GIFdBUlJBTlRJRVMgQU5EIExJQUJJTElUWTE5MDcGA1UECxMw
-d3d3LmVudHJ1c3QubmV0L0NQUyBpcyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNl
-MR8wHQYDVQQLExYoYykgMjAwOCBFbnRydXN0LCBJbmMuMS4wLAYDVQQDEyVFbnRy
-dXN0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gTDFCMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA3CH1aPl6zofyeN/YO00GfcYk5KnNnQFW5PZxF6p/
-dSIY5HRtGz5W1bGmHt1ZJlPKBua6C283u6jGnBU7BhuHDMIaTdOBrttQZaU6ZE8w
-NJorqR/9K9E4cRlo8o7re8lAPEjEGbG3ECXvRKfmd5t9Ipre2F7Zw87JcSK7ru8F
-1vIX51Z44VMFSiZzuMdJZ5MjD1ayj93JWQXlYxW0h35ARum1AHsDtA3klmcs3htZ
-CxofuGNErsHXRIfEkVmcAENtxt8KsLEEzf6+MF46JXLdoj7tRjrHpFxc5CXyEwfo
-rtqbGZui2WCdzpBHamF7QOgUwv4vhFpmF8CX00k43mMCnwIDAQABo4IBJjCCASIw
-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wMwYIKwYBBQUHAQEEJzAl
-MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAyBgNVHR8EKzAp
-MCegJaAjhiFodHRwOi8vY3JsLmVudHJ1c3QubmV0LzIwNDhjYS5jcmwwOwYDVR0g
-BDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5u
-ZXQvQ1BTMB0GA1UdDgQWBBT18paIfQ3zKvlO5zSgvUZ+E9YWyDAfBgNVHSMEGDAW
-gBRV5IHREYC+2Im5CKMx+aEkCRa5cDAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIA
-gTANBgkqhkiG9w0BAQUFAAOCAQEACyU8WPqO3KJCO3ZxbmzUTyu5U1yyWLmx3G8a
-5OPEUPJBgrr0fcfB+fqMU7+5YrdJ4x0K/B/WxHZqk8t3Hix/0D8WY0xyTGdgD/iA
-1qeayqIzkQ9EsmY9jmgMQIUSN5G5gnc0WS1c34JuLLZ60gSQZ2hLcPwtuP+QZG9+
-kffRRzPzW7hYLiHYdWAbE8z4sqj6aqkqWk9FhUC03TQFt3DKAe/hgecRUNs+4tcQ
-LmoVf7fUo2KyiWlhV8Z/jp7UJHrzoUNfoHqJ3FnNfdd1p7xT1Uc1xjEwIJ+burWD
-5olVAU2RO9aJNYc8g2t6KYLUS9TmFnSwARCraQYUN3v3ZjA6xQ==
+MIIFjzCCBHegAwIBAgIHF5BgzPm5bjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDUz
+MloXDTE5MDcwOTIzNTkwMFowgbUxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCZXJs
+aW4xDzANBgNVBAcTBkJlcmxpbjEiMCAGA1UEChMZRnJlaWUgVW5pdmVyc2l0YWV0
+IEJlcmxpbjEOMAwGA1UECxMFWkVEQVQxMDAuBgNVBAMTJ0ZyZWllIFVuaXZlcnNp
+dGFldCBCZXJsaW4gLSBGVS1DQSAtIEcwMTEeMBwGCSqGSIb3DQEJARYPY2FARlUt
+QmVybGluLkRFMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjYUI0048
+zDNevkmXipCDjSpIr+sEbhiXPzWnZnCnkmLOrEMFaNDWDX6kcVQ1VP71opEfGuR5
+LtW0P6N+JM8E8y5HXdap62bD4Yfg0KQEmlh9vpMQ75BckReW7wRKH/Ntcrg8gwn9
+7d17Hs8hgRGk8cpBRAs5v5hcqRZcjR63mKCismsjld6MVdWSNYhZJhpcnb0dVzMa
+3A7Rf1OsXHwDXrhusCNph1+Pazuw2XbIKWSCsFS4qlhHOj5QA375qk5IjjsUnw2F
+qljLiziu9xB4/jhSx1fz6+5RVnTe5Tb9GMbk5RVR+dvPTnzF96T/yW5DqsFIL+xB
+YQ8juFoBQog3MwIDAQABo4IB/DCCAfgwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNV
+HQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBQG4T30b/Qw
+t3o7V7AxBYl7DVhabDAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAa
+BgNVHREEEzARgQ9jYUBGVS1CZXJsaW4uREUwgYgGA1UdHwSBgDB+MD2gO6A5hjdo
+dHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fj
+cmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEF
+BQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcG
+CCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNh
+L3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIu
+cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQw
+DQYJKoZIhvcNAQELBQADggEBADRy38buZjrfDN8mZiukEjlsx+6s/DKj5YYWaAvU
+B5kqhL2TM58bPyq4sYAVCDWALifAk11Gx4/Rp1PLNFd4tnoRcQsfgN8ywECpWBbg
+ESOC73tfa6ZSPEY8uZ4yUk0o2nwxkgU0V3/b7/51XLp5TA5gBeL3aYcjYQ17QN14
+Mh12MiXFp5VbPBDTHkinUXt316A8Qj09wJnHMOjt5M+ZDn82YYC7vFDzjNkNmw46
+PRL3hZOfZb1IS+fhVlR4eW0FBLqmGg+4Y7Y4KKrwBcBK3OzME5jN71LkdNu1lkB4
+3OfT+YOMT+pqZp1l0U6DGZa3SZy5xfWY3EL5BYVM8xAfoZg=
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Leibniz-Institut fuer Nutztierbiologie/CN=Leibniz-Institut fuer Nutztierbiologie CA - G01/emailAddress=edv-zentral@fbn-dummerstorf.de
+serial=14E94DAE17AA7C
+-----BEGIN CERTIFICATE-----
+MIIFkDCCBHigAwIBAgIHFOlNrheqfDANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTEyMTIxMzEyNTQ1
+NVoXDTE5MDYzMDAwMDAwMFowgacxCzAJBgNVBAYTAkRFMS8wLQYDVQQKEyZMZWli
+bml6LUluc3RpdHV0IGZ1ZXIgTnV0enRpZXJiaW9sb2dpZTE4MDYGA1UEAxMvTGVp
+Ym5pei1JbnN0aXR1dCBmdWVyIE51dHp0aWVyYmlvbG9naWUgQ0EgLSBHMDExLTAr
+BgkqhkiG9w0BCQEWHmVkdi16ZW50cmFsQGZibi1kdW1tZXJzdG9yZi5kZTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJYpmsP/Adi7RiJlchq2Z/rPxGgr
+JD18hQSyYN88K6vWmyjKoDvWXAZ23tsI0HueRhFaYUVlsT3MhUgWHHvduPnDUxlm
+JMZqrHKLHd+zlLwDrkdR1K4HVwrzFgFi9OAoP4ixXj5CWChLNCF0oQJTFi/JlUJB
+0OpoGJbwrUa4thaCCsfzEfn/dN4cvJJfVemHCBXDUk5exyoWvnu31q1MHy4N1Wg9
+LhvWwTT0xQvtbBptaJSVAeVcbm3yHHzSUOCVbVtMLwtlwYgXy+NNeVfdyBAMl0WG
+aeOeL5fVZkk4y6KRQwmqJP1wsVLmgqIJqf3hRlLROmTlIjXPDURRnq3hzWMCAwEA
+AaOCAgswggIHMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEG
+A1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQUXi6WIgqWwuyRE/kQJ8Ha+VXUlZkw
+HwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwKQYDVR0RBCIwIIEeZWR2
+LXplbnRyYWxAZmJuLWR1bW1lcnN0b3JmLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3
+aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2Nh
+Y3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9v
+dC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYB
+BQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBH
+BggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAy
+LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0
+MA0GCSqGSIb3DQEBBQUAA4IBAQAmLn/mch7KndDM8RU32loJjOpFIqjm1h26vccn
+4HiZex2VWflSGQj1tspxCNqGOgjIz5b0QSYLBSdT46ZXE79Xq77b7UEPMP3qMG/E
+hCpA6/0Nj2nlqssNOYk4q0sWHkCWger9o/It7NLvjE8wi15NI8goFartNOHCIZ2g
+WSqzfXw1T6qqasvRdTuTBxL6pR+QTi18iQzOidCdPKS86cKTiEhJx01zavD7mIlg
+rkb8QqPhEpEOM3EGodAW4KR71mkgNyqb5+hooju+hQCY9IlP5ZSP2g0a/Dda9eUL
+loe0b6nx24yfz9ugJYwEwniIPmYZZRPmynJOzQqB3Sk4qat2
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Hamburg/L=Hamburg/O=Universitaet Hamburg/OU=Regionales Rechenzentrum/CN=UHH CA - G02/emailAddress=uhh-ca@uni-hamburg.de
+serial=17A4248C72DE30
+-----BEGIN CERTIFICATE-----
+MIIFkDCCBHigAwIBAgIHF6QkjHLeMDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTM0
+OFoXDTE5MDcwOTIzNTkwMFowgbAxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdIYW1i
+dXJnMRAwDgYDVQQHEwdIYW1idXJnMR0wGwYDVQQKExRVbml2ZXJzaXRhZXQgSGFt
+YnVyZzEhMB8GA1UECxMYUmVnaW9uYWxlcyBSZWNoZW56ZW50cnVtMRUwEwYDVQQD
+EwxVSEggQ0EgLSBHMDIxJDAiBgkqhkiG9w0BCQEWFXVoaC1jYUB1bmktaGFtYnVy
+Zy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL1wmqAvwDxKiB/u
+7sSNszaoR03dLgkTtwd7su4FtYThzT+sHGPEKFgEpQ2VLOaXHgy6WuRO0iOqY9j6
+1fgj/a8kaHE/gSSxb6syaOb/zHPU1qcKThDsSEP1u2IYeCwRlzRJDiJZYKxX/NGG
+m2+U29qzrsgPPt93JTeWnWdmYyA7XLmWJDEwyEG1nc/EtAFqla85nm3pw5qC+N8C
+aJUALhWJZNA/DLmfsG/C2qtnk0SJf4FtEL5qSfYN6lJYTYPFpk1C1fX8nbIA6Gpk
+YzzcprOqUTfJwvSjkAqEmM63tHn/luCCAdVXGMjqobHtjo0n8w0klo7yv8fc6qUt
+FUsc0u8CAwEAAaOCAgIwggH+MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/
+BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQUJqBqAaj//BLr9xSJ
+48UwNtEuObIwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwIAYDVR0R
+BBkwF4EVdWhoLWNhQHVuaS1oYW1idXJnLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3
+aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2Nh
+Y3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9v
+dC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYB
+BQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBH
+BggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAy
+LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0
+MA0GCSqGSIb3DQEBCwUAA4IBAQBE8D2265e7n6BP3j0XOdQMLh3yhfufLKOS9k/2
+Ie5EpFmTMFTvPdkwxel48glIwO020UjaQ1MCxY5NkW78rmiVTZMSH5wFbLDrLWRT
+hvzPWNNwArStmmWkx0FCQGR4orVDGI3oaq9TJU8eAz8QnBouiWmqRo99KjdqfS31
+v2sBQHL+d7UxJD/o79syjtY2+3aMBaMpHJN2W8HQ1lROvwTFgGgfHrwE2Yju3VaE
+kdh5THSBXRDGVA9sbJYvYhCgrjHssODrvSTnrikWWXN+rUgJm+r9QDKhqd/Aht5H
+mYS4JVDAYQE9buD0D0WcpPuRbxsJqICs7qVmkB0v478sYWED
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Berlin/L=Berlin/O=STIFTUNG PREUSSISCHER KULTURBESITZ/CN=STIFTUNG PREUSSISCHER KULTURBESITZ - CA/emailAddress=ca@hv.spk-berlin.de
+serial=17AFF6952C6C2D
+-----BEGIN CERTIFICATE-----
+MIIFkDCCBHigAwIBAgIHF6/2lSxsLTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDQ1
+M1oXDTE5MDcwOTIzNTkwMFowgbIxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCZXJs
+aW4xDzANBgNVBAcTBkJlcmxpbjErMCkGA1UEChMiU1RJRlRVTkcgUFJFVVNTSVND
+SEVSIEtVTFRVUkJFU0lUWjEwMC4GA1UEAxMnU1RJRlRVTkcgUFJFVVNTSVNDSEVS
+IEtVTFRVUkJFU0lUWiAtIENBMSIwIAYJKoZIhvcNAQkBFhNjYUBodi5zcGstYmVy
+bGluLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoU5qB2kP2vlT
+Fakje28/dAZH4rHiSAOevDzbpF+rtJBE/zl2DykpBiN0YfsEQraTJfWR7irlKRSK
+42ejMd4CCw4dkDB47YcRdnsHT0Le028OsXTmgpsJ3Ky2kAp+APDZ33vZOybOTnPX
+PHoqKDMzJxzdyo7hiSZD+61pC+CkeXTS3NuZhSTJD5c7DcwnPVeLTEER4IdLsRTJ
+gibQZp+t+TgGFOprbBbRI1uARo8ghvCAgutO+bXnbS9+AgZibmZW4zNQ/YApa66H
+meYKy2YsQQwoFvuL0CZoP8BuOFWsRE0nca84iq+99b6ysvxi+SUYvJYwzurk+SNW
+tKoV4ynJFQIDAQABo4ICADCCAfwwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8B
+Af8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBTnp8hlJwW/CmNI
+RBlH2cq44OVQKTAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAeBgNV
+HREEFzAVgRNjYUBodi5zcGstYmVybGluLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3
+aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2Nh
+Y3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9v
+dC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYB
+BQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBH
+BggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAy
+LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0
+MA0GCSqGSIb3DQEBCwUAA4IBAQBZ98jdA5wfTlIb+4Ryp4wfIfFAZAzo/eEw/8tC
+9KMFPyBRgr/Q5Ckhz/nzDSuUsROE1wqOzGRd1jdyKW5A6J2P4kA7RpHDbfmvGIAJ
+/TdYPcEFGgnTlRR7gI4CN/VdR+or8wzWwk/2vOQnAWqxWsXNWDJaBZ6H6rj52xQd
+2Omwiw7v7PZRfPZWErUo94KxnT06ra07XyC+21uA0sGJVVWWs45BPNvCT4Za2MX3
+cDR5SX7GSORMpwZjhDg3DMSMyrHm5dERUwh+vvf/p1GB3Y6LzYtwZDIbxTRadtGi
+q9BayBEam4yJGB2y9zs0GR0AnwMnPgs3BJzAsmf31+nFCT4Z
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Niedersachsen/L=Braunschweig/O=Technische Universitaet Braunschweig/CN=Technische Universitaet Braunschweig CA/emailAddress=pki@tu-bs.de
+serial=179060E6219390
+-----BEGIN CERTIFICATE-----
+MIIFkTCCBHmgAwIBAgIHF5Bg5iGTkDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDU1
+OVoXDTE5MDcwOTIzNTkwMFowgboxCzAJBgNVBAYTAkRFMRYwFAYDVQQIEw1OaWVk
+ZXJzYWNoc2VuMRUwEwYDVQQHEwxCcmF1bnNjaHdlaWcxLTArBgNVBAoTJFRlY2hu
+aXNjaGUgVW5pdmVyc2l0YWV0IEJyYXVuc2Nod2VpZzEwMC4GA1UEAxMnVGVjaG5p
+c2NoZSBVbml2ZXJzaXRhZXQgQnJhdW5zY2h3ZWlnIENBMRswGQYJKoZIhvcNAQkB
+Fgxwa2lAdHUtYnMuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+wXS06Zb9UaDAO+r0y94jAvOTZR5iJouaDpWWAFUlzv4ZJaD4lRHr//uWIDt5MTfd
+U3Es1SbWF+AtuH9yvQpSelKU4ZA/NAVFM6QGCFg5s5LSuZKL0e3tBe8YrrPlFwHF
+0EN3ZUSMo0hyyz52YjusICu2Sz/E73UKeg2zO0Qa71CbdUxlLvhYwyA+4Cjj2TtG
+jSkqPAuDb/32UFw9KT55T/hjihvfJltzyV+FHkM+ZG5GmtXkV2ruhsLB0r23k1+K
+z2Gy5QUKdp+rCEELbSwEzi2TRxhO7n4f5JY/PeGqgt1YWeYXQ/ao+v7DB6/zcy0c
+aEzqhT1/4MjJWyyYZKahAgMBAAGjggH5MIIB9TASBgNVHRMBAf8ECDAGAQH/AgEB
+MA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFBSL
+yeTF1tx/z45yQGvp5+2QfHmfMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38Qpw
+Pt5kMBcGA1UdEQQQMA6BDHBraUB0dS1icy5kZTCBiAYDVR0fBIGAMH4wPaA7oDmG
+N2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9j
+YWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJv
+b3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsG
+AQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1Aw
+RwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2Rw
+Mi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy
+dDANBgkqhkiG9w0BAQsFAAOCAQEARRBrYp1hQILXjiVxxZ/JKRnwj66aGgkW33zj
+MmQzH4uVo7PRYMqioqr3BAf4yHsEIgV/0Q6xNtELrbg00LpHaFCPnZd1tDqyBGVQ
+rDPvYLZco6SKMbtCK9py1iCg/EYqgK+Fk8LfGjiqEx+WrsqlCmR8Dcs0X/U4cyqO
+BINY+7A7z+H2HGHWaSGCwEWvWa9VtX297iovxLt46mTiZ95C/39fFSFGM63DJOdD
+CT+wIoUw/MTbO9oxasRjjoV7axcy8kCZ9JZ8w3X1y2NyErYF/UdCmwa1FX7/Ddck
+AI/gXk5vHDVg3w++v3hmsTXyWWrnyOJYMfaKDKQF5ZOzYTcmiQ==
 -----END CERTIFICATE-----
 
 subject= /C=PT/O=MULTICERT - Servi\xC3\xA7os de Certifica\xC3\xA7\xC3\xA3o Electr\xC3\xB3nica S.A./OU=Entidade de Certifica\xC3\xA7\xC3\xA3o Credenciada/CN=MULTICERT - Entidade de Certifica\xC3\xA7\xC3\xA3o 001
@@ -25848,6 +30114,41 @@
 DFpd/xilJV60Ga/oA3TUrVbAvwD6CwUR6BIvlteMVq5r2xxdHGw=
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Baden-Wuerttemberg/L=Heidelberg/O=Universitaet Heidelberg/OU=uni/CN=Uni-HD2-CA/emailAddress=pki@urz.uni-heidelberg.de
+serial=17A424DDE5C8E8
+-----BEGIN CERTIFICATE-----
+MIIFkjCCBHqgAwIBAgIHF6Qk3eXI6DANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTUw
+OVoXDTE5MDcwOTIzNTkwMFowga4xCzAJBgNVBAYTAkRFMRswGQYDVQQIExJCYWRl
+bi1XdWVydHRlbWJlcmcxEzARBgNVBAcTCkhlaWRlbGJlcmcxIDAeBgNVBAoTF1Vu
+aXZlcnNpdGFldCBIZWlkZWxiZXJnMQwwCgYDVQQLEwN1bmkxEzARBgNVBAMTClVu
+aS1IRDItQ0ExKDAmBgkqhkiG9w0BCQEWGXBraUB1cnoudW5pLWhlaWRlbGJlcmcu
+ZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCk5GFVc+228OxZS92Y
+nMJ8+lp34eGJ00OZ1MzR9D5BoLxCK7hGAptllIvCyrqhXTx7Ktl7HzB5DIw4Ccww
+rtlphbm4QvkMZIjf02hT2Va0AK2/NkDPtH9jXK3+NnatbmaKLQuHMe2LsFYWpiYU
+57ptZmNZEe6ZFkOsVdi7DxmzXK7c20jWAAYQjudql8N6E7OxPQx40KrsD+QL+qjO
+08BQdflqrvB+fTy4bud0r3hoVwXmmS+65EonXz/wRLN2QUTC/evspGND1JZtpIDj
+9SU7lVEcSTE1mMw7MXGSoYrjJroTJQrpQmPEoCc74wlm7tgcbBZ1n2OHKNkDQPnj
+Mcv5AgMBAAGjggIGMIICAjASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQE
+AwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFLugO6z48GCMtNDV+biQ
+4KySFVcbMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMCQGA1UdEQQd
+MBuBGXBraUB1cnoudW5pLWhlaWRlbGJlcmcuZGUwgYgGA1UdHwSBgDB+MD2gO6A5
+hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwv
+Y2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggr
+BgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQ
+MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2Nk
+cDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5j
+cnQwDQYJKoZIhvcNAQELBQADggEBALHgNtbNQbhoLaOUMjHpFh8/TKf45fHLSv58
+5mcOJKQwLpAb0TJ5/qzFxXIAP/pRV1iMmYpQsv+jqsXGku4w+tHJvk3Gt2tjYSaP
+6t/C0MvSCpHt9uLL33LaQE7a8eFDH2RB1ez0PFT0pXCivwwAOlPYfeBFOD/m2TQt
+3O1G0GdZFr/i49osNpMQrmlpTnOp2SeoRS4Lb+bSD0EqtTfBG1BjQMzHJ/X2qe/r
+RIqi6MWxoFSMBVoFvM7yySRl65QUcYwuz8979UTxev41R9+ZmQq/ayyRuB4xWhoo
+Ggejp19Eap33YRV+Z/7H7XDWQj3M5PvYw5mzWVrY5+oWV9qcVP8=
+-----END CERTIFICATE-----
+
 subject= /C=US/ST=GA/L=Atlanta/OU=Southern Company Services, Inc./O=Southern Company Services, Inc./CN=Southern Company External Policy CA
 serial=04000000000133A777674B
 -----BEGIN CERTIFICATE-----
@@ -25883,6 +30184,76 @@
 Yx5QrXAQT4w7F0xrPiJAvBA2TItrpJF85Yb29wP0cbnbhTxIrSGB
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Baden-Wuerttemberg/L=Karlsruhe/O=Karlsruhe Institute of Technology/OU=Steinbuch Centre for Computing/CN=KIT-CA/emailAddress=ca@kit.edu
+serial=17AFF76F2322E9
+-----BEGIN CERTIFICATE-----
+MIIFlDCCBHygAwIBAgIHF6/3byMi6TANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDgz
+MVoXDTE5MDcwOTIzNTkwMFowgb8xCzAJBgNVBAYTAkRFMRswGQYDVQQIExJCYWRl
+bi1XdWVydHRlbWJlcmcxEjAQBgNVBAcTCUthcmxzcnVoZTEqMCgGA1UEChMhS2Fy
+bHNydWhlIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MScwJQYDVQQLEx5TdGVpbmJ1
+Y2ggQ2VudHJlIGZvciBDb21wdXRpbmcxDzANBgNVBAMTBktJVC1DQTEZMBcGCSqG
+SIb3DQEJARYKY2FAa2l0LmVkdTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMyyqIqJooBBUSkvbR08HQh6NNE+tqNErubDBemoGj8A803wg+1xvXqkhO1v
+nBABp5U++7xgD5uLlTcOb/F4UFrJBBy9QCnThzCb+eqG+94Iw6m8LjWqCKor9lKw
+NCUit7vzNAOCd0r0iNCYV2/xcK8tHSHw3mGXgvwfY0F9j14nUEg9nd5kPq0Aw9iQ
+HDuYnOz3A8NVTpXpTCziQTCZJQYETDsC+nynQN2svAmAV3V1HJRe/AD6idy/6HN0
+EtAIOPlE1px14NFS4SZqUk/F4vD8pxSz/YUwbCGK4IH37V9bcbQmA8NNNKBtFLqX
+19ovuQn32lRwSW/Cz3Hj+zSRP3MCAwEAAaOCAfcwggHzMBIGA1UdEwEB/wQIMAYB
+Af8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4E
+FgQUH3Rl9JodevYx6d9hG3MrDW3QM0kwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsT
+KffxCnA+3mQwFQYDVR0RBA4wDIEKY2FAa2l0LmVkdTCBiAYDVR0fBIGAMH4wPaA7
+oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Ny
+bC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFs
+LXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMG
+CCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09D
+U1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJv
+b3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8v
+Y2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0
+LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAOhYm/9RXIH2d+yjKb3Eqnxruw4trhdI9
+T/GsoXgOndR2Up3MMrYm/MLOIXnRKIfnhm4puwpRrphfAeJYc7u2xRbb6vpydt/o
+UZy/KXJ46161Cygq8HZsyEQbR+fUHj72Tki5cmlxBIeIpmFFr+Wo1Y73mEoe+G1Q
+7x2VNi2VNpISa/pEBx/DYlxgqIHYYL3uHdinCKYMLXmx/PBh2eFN1JcXngJU+DAc
+8vzlxH9gjsqVC2O8jrLPXiaZrt99g3pbtQEM89z/l6aJgiDFvAQEVnmit+S8+194
+lS5PcUjtEGYTyY+X9t61591nOoXUXfnt6aum4Yf2Blsmn3xKCu5CqA==
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=NIEDERSACHSEN/L=GOETTINGEN/O=Gesellschaft fuer wissenschaftliche Datenverarbeitung/OU=GWDG/CN=GWDG CA/emailAddress=gwdg-ca@gwdg.de
+serial=179060EC3B68AD
+-----BEGIN CERTIFICATE-----
+MIIFlTCCBH2gAwIBAgIHF5Bg7DtorTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYw
+NFoXDTE5MDcwOTIzNTkwMFowgbsxCzAJBgNVBAYTAkRFMRYwFAYDVQQIEw1OSUVE
+RVJTQUNIU0VOMRMwEQYDVQQHEwpHT0VUVElOR0VOMT4wPAYDVQQKEzVHZXNlbGxz
+Y2hhZnQgZnVlciB3aXNzZW5zY2hhZnRsaWNoZSBEYXRlbnZlcmFyYmVpdHVuZzEN
+MAsGA1UECxMER1dERzEQMA4GA1UEAxMHR1dERyBDQTEeMBwGCSqGSIb3DQEJARYP
+Z3dkZy1jYUBnd2RnLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+qy8SFJEU2LQ1x7+hklAxgal2AbcbpW+Fn9S50TuSfGB7/1erSxTdxK0S2PyJhxHy
+EAReTwTF5flCfF2HQh5I++LOja5WPyzgQUzq5TdhCYNUXqHBjWKpMApBSJ6BRsQw
+JYKhNIFh3KkyO2GqXve3QCgXVWJnTiXk5/V+zb5wSOpTHUMINO6d1zeQhkCQNCZE
+OTE7lamQV1xO6Q4jbWq8R9FlvEYhLmF5KNu8j/4bdeb4td5n62Jd1T40V8xK8f5L
+iD9NZyy9XV7quFB2OBAHqZyEZbT7v3RkZXwujkY+JMLvHVqdR2tiaRzMCUmDYHsk
+AJLbAibHMDNkUWd8tr6XewIDAQABo4IB/DCCAfgwEgYDVR0TAQH/BAgwBgEB/wIB
+ATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBSm
+5P+Y/eVJMn5cdfIWok2MdDXeIjAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EK
+cD7eZDAaBgNVHREEEzARgQ9nd2RnLWNhQGd3ZGcuZGUwgYgGA1UdHwSBgDB+MD2g
+O6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9j
+cmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2Jh
+bC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAz
+BggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9P
+Q1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0cDov
+L2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2Vy
+dC5jcnQwDQYJKoZIhvcNAQELBQADggEBABLLhlOcyZM9XtcMxCdRK1F0+aRJ5+kJ
+bBIzZ5p5KNAdEll7aXOtu3gGsZIqb8DUXPz2NprnE2L8pPweQKyM6ZYD5v445okX
+fDdB6Gma4ITgTknLm/ASO/gabZ6fQi2rzV7teuNEG0wLG5QMgBUr0uh/Jq5Sq074
+wmVQsU/c403JpJb8MWmZXCra3XZEjX5b7LG+c7HMBv1uPvT4nRcf1UnSzTM9bXv6
+n2fwZesNnn3KtERUkLM1YrMb8yVAMs6+P/YEA2cutIpgv7vbXnO5Wmlq1YbfDVWn
+hIr54lx2O22Nsonee9Y0bC2dEkm4R38CxkAYD2mkCgd4toMjC4fCaVI=
+-----END CERTIFICATE-----
+
 subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 Secure Server CA - G3
 serial=2CFEB6090EE2ADE2E9FC223724F1B6BF
 -----BEGIN CERTIFICATE-----
@@ -25918,6 +30289,251 @@
 MXA68Mb6ZdlkhGEmZYVBcOmkaKs+P+SggTofsK27BlpugAtNWjEy5JY=
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Nordrhein-Westfalen/L=Koeln/O=Rheinische Fachhochschule Koeln gGmbH/OU=Rechenzentrum/CN=RFH Koeln CA/emailAddress=pki@rfh-koeln.de
+serial=17A42496C4097A
+-----BEGIN CERTIFICATE-----
+MIIFljCCBH6gAwIBAgIHF6QklsQJejANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTM1
+OFoXDTE5MDcwOTIzNTkwMFowgbsxCzAJBgNVBAYTAkRFMRwwGgYDVQQIExNOb3Jk
+cmhlaW4tV2VzdGZhbGVuMQ4wDAYDVQQHEwVLb2VsbjEuMCwGA1UEChMlUmhlaW5p
+c2NoZSBGYWNoaG9jaHNjaHVsZSBLb2VsbiBnR21iSDEWMBQGA1UECxMNUmVjaGVu
+emVudHJ1bTEVMBMGA1UEAxMMUkZIIEtvZWxuIENBMR8wHQYJKoZIhvcNAQkBFhBw
+a2lAcmZoLWtvZWxuLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+x+Mv8JH4UEcQ/2frgG4rC7KpC5YXhdseJgoKFWOcZtivkgbZAIymgXkYkcOmk53Q
+bq3GoyFoT0m2RaxfXtGs5MXO2aLCI84Xyd8zc8c/V2aTx5eITwWanIwYKjG0YefA
+v+sXWoa/l/rlxKEX4BZXfLQ+vTFOMn+NbflTJaZe9dZ36mPOTXILwQV/Ue+Nl0z6
+722IXz7DMfxXkYiiHkYsWFz1xthcGxcJzZW5AswpbBxtiSqxWbSPrxQWBJqouU3B
+785ItfKH2O7o9m9Y01WV7pB7yrjdDuZoLxZSmKIhcjobQ8RganX3KW21NMtNof3h
+d40+ULHsYITkMPq4w+zA3QIDAQABo4IB/TCCAfkwEgYDVR0TAQH/BAgwBgEB/wIB
+ATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBQx
+IzG2TTX/YYryTVwPiZ8vS3ZrRjAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EK
+cD7eZDAbBgNVHREEFDASgRBwa2lAcmZoLWtvZWxuLmRlMIGIBgNVHR8EgYAwfjA9
+oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccw
+MwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIv
+T0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6
+Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNl
+cnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAOEY606xb+bYiz7SN6xiclu1gDvnph
+7la1rMt6MJgUVxB67WdSLhjoGsR4to/qpO34+OIotaOm7gZRyf8Tf0VBI/bD+MdH
+BajDr/2zgKQMJkc7YPymqrFITAAuuqL7YHtSerjphPBXr9xDIMHGjgUv0MrBRyl1
+5bPduQhR2TTj8jWo6HaYSCtZTQO4ax4uRihkQ8ieiD6gsQGn8dovdsMd6eXMts7G
+H+qjPfEEAbyJuFcklit9nxzrrQ7n13A3BAy513c4833UcBWtPHVbd2JonG9033tB
+fLnSNh8oaWvDWeEfdEcn/UpDlCLKwl/DzJr6DWJQmJzzXJQhfbj3strp
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Sachsen-Anhalt/L=Halle/O=Martin-Luther-Universitaet Halle-Wittenberg/OU=URZ/CN=Universitaet Halle CA/emailAddress=pki@uni-halle.de
+serial=17A42540F20FE9
+-----BEGIN CERTIFICATE-----
+MIIFljCCBH6gAwIBAgIHF6QlQPIP6TANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTY0
+OFoXDTE5MDcwOTIzNTkwMFowgbsxCzAJBgNVBAYTAkRFMRcwFQYDVQQIEw5TYWNo
+c2VuLUFuaGFsdDEOMAwGA1UEBxMFSGFsbGUxNDAyBgNVBAoTK01hcnRpbi1MdXRo
+ZXItVW5pdmVyc2l0YWV0IEhhbGxlLVdpdHRlbmJlcmcxDDAKBgNVBAsTA1VSWjEe
+MBwGA1UEAxMVVW5pdmVyc2l0YWV0IEhhbGxlIENBMR8wHQYJKoZIhvcNAQkBFhBw
+a2lAdW5pLWhhbGxlLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+oidpAaIAqAl51xl0EgBVLgz43JKG8UaKSz3R5zCGxVqdKos+yrnK2NqmIzcuR2x/
+dpSl3B1YYqcSU7tFk2KfMyq3Bb8EFFOj1mNPKjfyGz1j7NPF6kLO1PGNc8IKH66J
+irX1Q4xx10Gy0bbJHLzuJ+PbBlHJmpp614acdImzy4Edtl42UVyPdi78YJN5E54k
+c1IOWe216CJiA+j3/3cN+xH9wO6t2lnCuUYT95cf/TRduR9sBWpAZlMAucFq+iTg
+VXQ1cZXQkR9w8mcbnAcoJTZlBjL4pyAfgzopaoBn8fM2Mo1hmWPGopge+a72Iyyh
+ELA/bxJVyNr4Tj1K9bKT3QIDAQABo4IB/TCCAfkwEgYDVR0TAQH/BAgwBgEB/wIB
+ATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBQh
+E0q/cUqKiLHQw0mSe9Hgx0Nw7zAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EK
+cD7eZDAbBgNVHREEFDASgRBwa2lAdW5pLWhhbGxlLmRlMIGIBgNVHR8EgYAwfjA9
+oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIv
+Y3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccw
+MwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIv
+T0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6
+Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNl
+cnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQBYQTL+rmcnTjEfhhRJkZAtcuBdnQTz
+Cmql9A3buwGbFLMsCVHvz9pbbGFEOWNX20sfiAlMqqqbxos91sdgDBBRrF6omadk
+sxIC1feYCgCH8XVyf0h0vZqS/MGPf9O+E0MqjEMZLNsEFXXb7v/yngkMh74veZYM
+4ZGkXtqFioskXlmia25iciSg/GCOn5+R+4EYwBLIMQI5rgSypgnYYrNyWFpLl1RF
+uHmINJ3YiafsRBE8OxNgOTrc2+0zRAPYDG0rNSCXsrvdqGzzXEOU5DGJ37GzpBr6
++plxtLKnxk0guTeZ4Xt+bpkdRxgZFP4xXZZdpgLM88Hpr06WkbF/Iq+A
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Nordrhein-Westfalen/L=Bonn/O=Universitaet Bonn/OU=Hochschulrechenzentrum/CN=Universitaet Bonn CA/emailAddress=caadmin@uni-bonn.de
+serial=17A424B3ED718E
+-----BEGIN CERTIFICATE-----
+MIIFmDCCBICgAwIBAgIHF6Qks+1xjjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTQy
+N1oXDTE5MDcwOTIzNTkwMFowgboxCzAJBgNVBAYTAkRFMRwwGgYDVQQIExNOb3Jk
+cmhlaW4tV2VzdGZhbGVuMQ0wCwYDVQQHEwRCb25uMRowGAYDVQQKExFVbml2ZXJz
+aXRhZXQgQm9ubjEfMB0GA1UECxMWSG9jaHNjaHVscmVjaGVuemVudHJ1bTEdMBsG
+A1UEAxMUVW5pdmVyc2l0YWV0IEJvbm4gQ0ExIjAgBgkqhkiG9w0BCQEWE2NhYWRt
+aW5AdW5pLWJvbm4uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCS
+ZSmhDK0pc4VAteW3rHSOSs84YahhIQ12193kmm+Bqj44OmftM9s+sbvQ3yiKeFJh
+BqrATt6EHlo2wdlBkPwwwOXuFGRIfXTE1ptAvMorUjPEDn8moUfnKkUFWoOaHjEi
+Ll/wRGQAFcSk5/nmZ16QwnBs6/PdDqapDWO3y5JCj60XY0957r6Q9ZaopRHM9hxa
+OxAmXx6dnu7UEfNPBS9nVzn+P2B4bqOczVKUAqqGTDwq8rFQ1mb5aBjUSr6v8ZBH
+6qUtNMBafWCgoEg589trjZpZFnJ/kylLphA87dxUiMqRpB+HlYbaLz+MmQafajQM
+ilfKvsS1XSFmNVTed9evAgMBAAGjggIAMIIB/DASBgNVHRMBAf8ECDAGAQH/AgEB
+MA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFOs3
+0OvXhC5GnhLTsxjbjeWC5GinMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38Qpw
+Pt5kMB4GA1UdEQQXMBWBE2NhYWRtaW5AdW5pLWJvbm4uZGUwgYgGA1UdHwSBgDB+
+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1
+Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2ds
+b2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCB
+xzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZl
+ci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2Jh
+bC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0
+cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2Nh
+Y2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAOUXKUKlIQzj0up+YdxhIDbkOddZ
+ALuJGWac0re4DnOjNlrscKBzEHF00f8ZfEkd8BpSzyQKBBE2EOeF3amV2Fx05Qvt
+cAW6Y4Pr/2c64G4l73zjJ2taYcvaYq0Sn5z6OMRzMgYkPIxfeUi/LsnYCaPlJ0WW
+WOIZD9A4/Xz+BWxUgpIeOp2yVG7ODAS/2zZhA3NXCLBGNjC2paklB6cUM14OQ6SA
+jfLq/8PxmRG7CIfchgYa9KR4cKJ6sHSQimlqEVmpVx3gS5d6JI+K1r7arc8XlA69
+FJErupwqA2AifB+jhOsmrrKag9OcvlK9IeWf+a6bwE02sBSY6nBVmEOL1gk=
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Nordrhein-Westfalen/L=Muelheim an der Ruhr/O=Hochschule Ruhr West/OU=IT Service/CN=Hochschule Ruhr West CA/emailAddress=admin@hs-rw.de
+serial=17AFF6E7955C41
+-----BEGIN CERTIFICATE-----
+MIIFmDCCBICgAwIBAgIHF6/255VcQTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDYx
+NVoXDTE5MDcwOTIzNTkwMFowgb8xCzAJBgNVBAYTAkRFMRwwGgYDVQQIExNOb3Jk
+cmhlaW4tV2VzdGZhbGVuMR0wGwYDVQQHExRNdWVsaGVpbSBhbiBkZXIgUnVocjEd
+MBsGA1UEChMUSG9jaHNjaHVsZSBSdWhyIFdlc3QxEzARBgNVBAsTCklUIFNlcnZp
+Y2UxIDAeBgNVBAMTF0hvY2hzY2h1bGUgUnVociBXZXN0IENBMR0wGwYJKoZIhvcN
+AQkBFg5hZG1pbkBocy1ydy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAJ52+85zdptcvg7tNHvszA09uoYciddsB+/8jMeQe97wxkVuovV7fJou/jKG
+/D17Ic5rx6ooQUUr94eWs5d0lZgRM3N3RHkpmI5MBpaA5vmjeHNNS00aIKPO9Glc
+INK/rg8yeV9DtqIkJhMJZr0BCN0QGKiXHsChTU/bB+LWYqGUBIy8pSnbASJNYr5W
+d4F4YZuyDt2S+rVP06gYzNJyHzNtFqs4u/IrC49ANpAX7EJG/sk37qem+6DGzv1Q
+1aQ1LbLG4GCC4R56zmBrJNKmR5ZYZ7U7OLTtIpYAuZwLWhjDHdSE8XBkPpzaPfVn
+GKtrWu1d+kUGB18kBAGH971/BXUCAwEAAaOCAfswggH3MBIGA1UdEwEB/wQIMAYB
+Af8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4E
+FgQU7gxM+vyS0NqR5PrbdovffG7Z/rEwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsT
+KffxCnA+3mQwGQYDVR0RBBIwEIEOYWRtaW5AaHMtcncuZGUwgYgGA1UdHwSBgDB+
+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1
+Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2ds
+b2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSByjCB
+xzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZl
+ci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2Jh
+bC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7aHR0
+cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2Nh
+Y2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAL/mMOyWJFp6N0rsEtqk3EOzxzSq
+KT8QyB2r3JQRgPnra22B10nvLjhwxUZRSwbIJn2Bi2wwMnerbn7TYhVSsjOgCabD
+NzVIiyf2Eh/bF6QSiYsiUsNR6rv6U/AQGkVP3085rernq6TuaxwTFvpHZWehm6GZ
+6YqzzmXR5ML9oMUx7oQYMXNiaUeX55K/YN2phibxRLA4+DWglWiaBfz0PQX82lWG
+t6m382BsE9Th9wLCJryRa2qG8+Gt90OvNmfiodEVCIjr29tpmmSBlBojy+bSPLz+
+qgTON63QkQw+Bu7TNLwB1iMy8M6EYwO2HLFFbRhaCa9ZrAZBte1KiEgc0DY=
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Nordrhein-Westfalen/L=Duesseldorf/O=Heinrich-Heine-Universitaet Duesseldorf/CN=Uni Duesseldorf CA-G01/emailAddress=ca@uni-duesseldorf.de
+serial=17AFF6B5CB45BD
+-----BEGIN CERTIFICATE-----
+MIIFmjCCBIKgAwIBAgIHF6/2tctFvTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUy
+NVoXDTE5MDcwOTIzNTkwMFowgboxCzAJBgNVBAYTAkRFMRwwGgYDVQQIExNOb3Jk
+cmhlaW4tV2VzdGZhbGVuMRQwEgYDVQQHEwtEdWVzc2VsZG9yZjEwMC4GA1UEChMn
+SGVpbnJpY2gtSGVpbmUtVW5pdmVyc2l0YWV0IER1ZXNzZWxkb3JmMR8wHQYDVQQD
+ExZVbmkgRHVlc3NlbGRvcmYgQ0EtRzAxMSQwIgYJKoZIhvcNAQkBFhVjYUB1bmkt
+ZHVlc3NlbGRvcmYuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCl
+7FkFA1tnbY34LVQfRNI4VARBr76NSB+6SIaWCPvJ6bUgxWXl7Xp+Xa2V2tB+ZQdX
+1LexViCHs04paArI5Om/Dbxz2nyheNBYjtVg5ZICRXPetWQuZCUCDfRPYqqEY9fJ
+6pyAUVodqEjKyWIxdeo5v7W9TaweP9YeNl53LoeV/ryOxOv2z6JN5ZVCLKCkE+C/
+/MoEWwNukcDAsXGqcJhRtkXpa1T7xaMsd5BysSvk2hsEp3lVHnVmw7ndNK8XYw/k
+I+rc6AEzlYWpfRYqayXkJG0Duy7WaWF3jFl918QwVAzFwWOOe3+Vd8DfKtVtDWx2
+A2kLWwSKG+URZlb/QBQ7AgMBAAGjggICMIIB/jASBgNVHRMBAf8ECDAGAQH/AgEB
+MA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFGIk
+MYSir4cwAn7Nj3Fb9oS1Suw2MB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38Qpw
+Pt5kMCAGA1UdEQQZMBeBFWNhQHVuaS1kdWVzc2VsZG9yZi5kZTCBiAYDVR0fBIGA
+MH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUv
+Z2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHK
+MIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2Vy
+dmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xv
+YmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjto
+dHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQv
+Y2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEA5v4/H4YOahl2GAvPOXV9Ll15
+EX5XdKux9gjtKsVbor/9LDqYs0Cr7IQijUqiG6yJdQUMUJphyYsKSzQG2PFggrJY
+3v2tP8f4XRLUjVgVDKY3kQdFA2MKQt+8vpwaLZO0YJwxRBIEeylj0T9ShN4WEsNy
+xYaIlWnZHoiphbOMUPNHkah2xz5QRtSFPM0pcSzU8MyQfcn5SKDaoOSXvEuuzjea
+F33JDIy7OwAyr/8HuEse17HHLVmlvRjlsbzHvNaZ1L5Hl4go7DNUv3LnHWV6XT5S
+BbnxKqBjPCrSEZBdltnL4hpsiDTRegeEebrGaur/kZUnhG+i9RjYangLr3owKQ==
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Baden-Wuerttemberg/L=Heidelberg/O=Paedagogische Hochschule Heidelberg/OU=IfDI/CN=PH Heidelberg CA/emailAddress=pki@ph-heidelberg.de
+serial=17AFF6C4FD90B3
+-----BEGIN CERTIFICATE-----
+MIIFmzCCBIOgAwIBAgIHF6/2xP2QszANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDU0
+MFoXDTE5MDcwOTIzNTkwMFowgbwxCzAJBgNVBAYTAkRFMRswGQYDVQQIExJCYWRl
+bi1XdWVydHRlbWJlcmcxEzARBgNVBAcTCkhlaWRlbGJlcmcxLDAqBgNVBAoTI1Bh
+ZWRhZ29naXNjaGUgSG9jaHNjaHVsZSBIZWlkZWxiZXJnMQ0wCwYDVQQLEwRJZkRJ
+MRkwFwYDVQQDExBQSCBIZWlkZWxiZXJnIENBMSMwIQYJKoZIhvcNAQkBFhRwa2lA
+cGgtaGVpZGVsYmVyZy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AL9dnnXlg8H5+cIoB5itE+mFozO/8DQJbwNn+xnEMJyxKYxxR57vMduVQT+n8Jfi
+H0HJAHflWb97rZrdpM2Ux0fcJJSfUthm6/owqo3RY5ym7+XWENTHVR43qB85FgRX
+ngIrSZ2BCYQ6Icbjms1TIQ0NLWeI/iVq5yJcGVmZoisYuzYKj3BtIo/pJga9UlAA
+K1VBqEqqQ8WJ6W/uwvEWadYmHEboNIbAfjfvyNzXRTvd8fC4ELKFOACgZ/shEsoA
+4scn7x+AXGhnjUSB7iJgf5jYGBrucWAZF8qWlR5O+6ruzmu+yatj5SAwL76+koiv
+zSdV/po4wlqZvRr0jEjFW3cCAwEAAaOCAgEwggH9MBIGA1UdEwEB/wQIMAYBAf8C
+AQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQU
+1hg11RbbDdTZj96rLpNG4jHhQU4wHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffx
+CnA+3mQwHwYDVR0RBBgwFoEUcGtpQHBoLWhlaWRlbGJlcmcuZGUwgYgGA1UdHwSB
+gDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNh
+L3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRl
+L2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSB
+yjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNl
+cnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2ds
+b2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7
+aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0
+L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBADzlwnyp/XhzMycD9hX5VW+V
+Xd72srHdPHTi7c6yRivgbdZ2CfeTEY5MZiDaQsUa0WQ30PK6zWxYL/bjIauGiN9z
+S4l/O5q1v03kAcapzol45ymO1A+JYB6SfSvoe8MPtt5A/L0mT3rdvGzjbb+iliLE
+jGg6hbTVzHGNHEfsi1elDWQqKGslAiKQypMDKhSnhzTVstVG1fhi1sdXa4MokwLE
+aQka4ne61fMHPH+celkeQgntRytnZj8WMNBsZ4scFq2jV6/sghZjEMZUr9QSno6B
+ljl/UEEsMW8jXA2QjBKbC/ujnzKy+BTXAt43BnOJzgHoR6+ZlHGnDO7/Fou6DzQ=
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Schleswig-Holstein/L=Luebeck/O=Fachhochschule Luebeck/OU=Rechenzentrum/CN=Fachhochschule Luebeck CA - G01/emailAddress=ca@fh-luebeck.de
+serial=17AFF6CC589619
+-----BEGIN CERTIFICATE-----
+MIIFmzCCBIOgAwIBAgIHF6/2zFiWGTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDU0
+OFoXDTE5MDcwOTIzNTkwMFowgcAxCzAJBgNVBAYTAkRFMRswGQYDVQQIExJTY2hs
+ZXN3aWctSG9sc3RlaW4xEDAOBgNVBAcTB0x1ZWJlY2sxHzAdBgNVBAoTFkZhY2ho
+b2Noc2NodWxlIEx1ZWJlY2sxFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xKDAmBgNV
+BAMTH0ZhY2hob2Noc2NodWxlIEx1ZWJlY2sgQ0EgLSBHMDExHzAdBgkqhkiG9w0B
+CQEWEGNhQGZoLWx1ZWJlY2suZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwamDOYDK0iSbb41WuUsbQ3ReVpD8KHyzOPzQNtyyLIE8O6IQfOptmPxEt
+67GMLnKFB7ghgBYUIOGj3G0L5GHokpb1w0wK6W5FoiAj4rXDM3czjOevtVv9a44O
+6ujcJv3yHsUX6/3I2GPNQ6I5knR4Ex5rl9sfSLnRg/XnETku4lsVt0bwkkp77r7M
+Pl/WPoYz/G0BRXGC46QHkQ17PQ5ZvR7PBkOeyFMnu038z1J0FWoElJ5uTfBzPKlK
+n9Oh/tPlXrJopJfvRdzxwn1mFY+TT44NMxmxoZqkDLFlHFfqG5mF4eSAPSH1hTir
+t3XAkpYt7eBNEicXDxeb1v3IcHqlAgMBAAGjggH9MIIB+TASBgNVHRMBAf8ECDAG
+AQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0O
+BBYEFD219Qhl7L1+ENrtlvOw+a9Jt1dTMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7
+Eyn38QpwPt5kMBsGA1UdEQQUMBKBEGNhQGZoLWx1ZWJlY2suZGUwgYgGA1UdHwSB
+gDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNh
+L3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRl
+L2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcBAQSB
+yjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNl
+cnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2ds
+b2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcwAoY7
+aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0
+L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAADQX/zxWLHv2pUqEWCHi6Vt
+CN0mCaOXYbyWPH12Oq9/HDFblqfCdFX64iQeijLkgkkmLQ9vEerKryT+rRamFSIY
+nx2eyVnJX5+m9HI8zqGJq7ICBmneIFKqlY1Ws6edhKbgAD44s3xFamTDGhvmc3IH
+ucjNQpYuXpN4dtU2JJMDToF4vvy13PDNlPOJlo+Aj4zL36j087npfZZpvA8QxSUs
+QIXFjkBPvlHwrSPlwb0vJTsVKjVS+g+53iuMSNScLsDtGc2gyxi3ta3s637J8V4C
+JzsaJyuVQq6r/wWrsUocPOGvj0ixcjX0kvWHmyyId3yjNTg0ujQZGe8hr2IRygA=
+-----END CERTIFICATE-----
+
 subject= /C=PT/O=MULTICERT - Servi\xC3\xA7os de Certifica\xC3\xA7\xC3\xA3o Electr\xC3\xB3nica S.A./OU=Entidade de Certifica\xC3\xA7\xC3\xA3o Credenciada/CN=MULTICERT - Entidade de Certifica\xC3\xA7\xC3\xA3o 001
 serial=0727295D
 -----BEGIN CERTIFICATE-----
@@ -25953,6 +30569,256 @@
 geSy8IW45BwHlpVm5hwjWROJnIApiT4HZXLj5ZPfhbJvb1M0msAD0x0nElq2/fs=
 -----END CERTIFICATE-----
 
+subject= /C=CN/O=WoSign CA Limited/CN=WoSign Class 4 EV Server CA
+serial=153B9BE7A8047B23215F3996C6FA6DD0
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIQFTub56gEeyMhXzmWxvpt0DANBgkqhkiG9w0BAQUFADBV
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV
+BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw
+MTAwMDVaFw0yNDA4MDgwMTAwMDVaME8xCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX
+b1NpZ24gQ0EgTGltaXRlZDEkMCIGA1UEAxMbV29TaWduIENsYXNzIDQgRVYgU2Vy
+dmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtQE7mE1M0QJr
+Wa+jn+JLIh5dlfcVWVZLaAYfWL5tScDaCBlVf86l1j9iTLen4y2cSIyShv9YN9w0
+ae70JMvn7iAE/WqtiQIvxVvOx16jOoCUeJfSAb4BH5apz9umacLdIwsW3rEiqLeY
+GhpN23S39ta+eG3oeJaKaUvcWjOXbYv0mRvr/YKO7+EK6s1nt18va50zhQmTgeBL
+9P3VYEhseI2YpzF50mgk3YRE9H2GQL7UfFz9zqF4dnayIrcex2sQsE0V2P11UeLj
+4s9bSne+/vQcFZPp9AYO0cKR2o0pKfiCRCtJoAkFRZQa0sCq7YJEzSy/lEdBe+Vu
+OYjfzsqUZwIDAQABo4IBbDCCAWgwDgYDVR0PAQH/BAQDAgEGMB0GA1UdJQQWMBQG
+CCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/AgEAMDAGA1UdHwQp
+MCcwJaAjoCGGH2h0dHA6Ly9jcmxzMS53b3NpZ24uY29tL2NhMS5jcmwwcQYIKwYB
+BQUHAQEEZTBjMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcDEud29zaWduLmNvbS9j
+YTEwOAYIKwYBBQUHMAKGLGh0dHA6Ly9haWExLndvc2lnbi5jb20vY2ExLWNsYXNz
+NC1zZXJ2ZXIuY2VyMB0GA1UdDgQWBBTJ0/UmOIrwEYIv7106bE2VMcNlMjAfBgNV
+HSMEGDAWgBThZs8O0fGzS7cGIBT+hxLV9v77PjA+BgNVHSAENzA1MDMGBFUdIAAw
+KzApBggrBgEFBQcCARYdaHR0cDovL3d3dy53b3NpZ24uY29tL3BvbGljeS8wDQYJ
+KoZIhvcNAQEFBQADggIBAAQEqYblUisANL8IvPnHbdosC4OxIQaPpHNa2FdjwGfg
+sUB1pMggZLek5ATa9r/2R5rvTnpWGx+9CQkZve8rS1/1KNcLELTGKwUxqpOC+var
+f6nfAXIOBwq7/clGCdeN9c3ZcEC7v/ZyK0q3E0C/lXleX7zPHa+mi7iE25ocejST
+x6kavGeiP1fPi9e/N4wUPlKt3ah7gxds66/GfJvB4awZVmGmYMikYcDtrAIoKStk
+ssr9s9JyRi5zH7U0yCiK6ei97VcT4glzgZMZ2MqbvGXua4AV9QBV5kAWu0xjwWu7
+n0QK7ayXAZF31jz3csk5go46g9qZT82Qotc6+vrZCvg9280RSYM4HbMhJP954F1p
+4C/JAQ2xb1e7b82tJ4HxW5M13ZICjwkcbwkWy4M+o1dOhWQ4KG0lE6VUGrwHYuYA
++WGpUUi3lsJYWjReF7qwxcmaWxUypmLY66RmfIz3oc6womdfsY7Gch2Tf0xoH7l+
+uFKaxSVvjDrY4w70jOJvGVGRESTKZj+xBVkdHG/FaZSjyzPLyOoiLcGUKrMaqvr3
+pRSFsmQKCfKzcvgGmjpA8IRuIROgt3eZO37DG/KQlt1SR7ed/iuyEJh7yK2m7A45
+Oy5YU5G9OsT2LignXmJIBeNl82G9pFxIv4P3zQmnRZ4u5ehL6pWUgXbprinxRayH
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Nordrhein-Westfalen/O=Hochschule Bonn-Rhein-Sieg/CN=Hochschule Bonn-Rhein-Sieg CA - G01/emailAddress=pki@hochschule-bonn-rhein-sieg.de
+serial=17AFF6C0BDBACF
+-----BEGIN CERTIFICATE-----
+MIIFnDCCBISgAwIBAgIHF6/2wL26zzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUz
+NloXDTE5MDcwOTIzNTkwMFowgbAxCzAJBgNVBAYTAkRFMRwwGgYDVQQIExNOb3Jk
+cmhlaW4tV2VzdGZhbGVuMSMwIQYDVQQKExpIb2Noc2NodWxlIEJvbm4tUmhlaW4t
+U2llZzEsMCoGA1UEAxMjSG9jaHNjaHVsZSBCb25uLVJoZWluLVNpZWcgQ0EgLSBH
+MDExMDAuBgkqhkiG9w0BCQEWIXBraUBob2Noc2NodWxlLWJvbm4tcmhlaW4tc2ll
+Zy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALrF963LgzUfpyPs
+sFnFSZv98HGL2e7PRI1nTrqiJzxprDy0/tsb83rdw+TAX8o9mfnSPOmK2ch45XF0
+y3rYPFUBv2YcE+LqsvH+HgGDXaFI8785Do9fFb9rh1NrRuLloG3ovzx7zihKuWMw
+jQ3IjgC4hBeuV3hW2PGRQVlHNte1q6k0R42jjwZXhCjlL/pD7cWcEJraJSVYogIV
+9k2Gg9j6Gmhu57lSnMFosF8WWzUIAkn9Z34Ukx0ojnk41UWnKCsAggnuaDfFEBPz
+h62WLKZP74qUF1duUWtWj5aL38fPYWKjLeFBWorDKWwrxFgmLU4WcuTGqoyRkjD7
+YD/AefkCAwEAAaOCAg4wggIKMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/
+BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQULupUxE+5R7AgUFrU
+xyahMP1VCzIwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwLAYDVR0R
+BCUwI4EhcGtpQGhvY2hzY2h1bGUtYm9ubi1yaGVpbi1zaWVnLmRlMIGIBgNVHR8E
+gYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
+YS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEE
+gcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1T
+ZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKG
+O2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2Vy
+dC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQA/GVAh+36c/PebODKhqgoV
+IUyWF0FUswbXSNtbr7qwsoMsXViL30PquZetmvaoY/PLuxHknhTwTS+teb+nlLSi
+uSbn9qeyg7mPft6Ux/sVmyrFthUwz0tNK9nNNff73N1iMyu0Xi29DLAzJy0sT+m1
+5S+6JsQ6v36Jpo/gpuHs732vzMRQsNIbhqAI9qWc7syUttLmI5G1DsfS+LRUQ0xv
+EipYQ2oYM8njERHByeKQLCdy0b/rEl+PMjiM7Lrbp+jCGGyuazsioKA48hZFMkUI
+aajHgGBcAZfGyarCO87SMEgQbGDBD6vaf7ASepdoQtZdL8N4VwF3bZF/prcw6zjp
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Sachsen/L=Dresden/O=Freistaat Sachsen/OU=Saechsisches Staatsministerium des Innern/CN=Sachsen Global CA/emailAddress=pki@smi.sachsen.de
+serial=17AFF6B9A84C38
+-----BEGIN CERTIFICATE-----
+MIIFnTCCBIWgAwIBAgIHF6/2uahMODANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUy
+OVoXDTE5MDcwOTIzNTkwMFowgcAxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdTYWNo
+c2VuMRAwDgYDVQQHEwdEcmVzZGVuMRowGAYDVQQKExFGcmVpc3RhYXQgU2FjaHNl
+bjEyMDAGA1UECxMpU2FlY2hzaXNjaGVzIFN0YWF0c21pbmlzdGVyaXVtIGRlcyBJ
+bm5lcm4xGjAYBgNVBAMTEVNhY2hzZW4gR2xvYmFsIENBMSEwHwYJKoZIhvcNAQkB
+FhJwa2lAc21pLnNhY2hzZW4uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQC5g4mzeWClzIS+5/k6oE2EcFFwURIWynqm7hsBnaMm5O+HfJlstSs4+dMC
+b55ovhgbcYRcvOa8mIPMr/VlmWknprnSaOfqSU/ALUWd5DQuBLzaNrs494ly6/g1
+F0tH94wAFnKOOotCOIicA36rz0B/hjK+YcVka5kOrUsYudXJzzsVOehE/wJS09sT
+Y5Mx4LYVdG2nlLOn0z4wo1T/NOUVPuEKvM+/dgPLp71FpBK3c67Zv+fG6pgc+OSB
+UHHyRGrqxKuJMSwz/ZcdOgABoFlc5ABsjo8SdTuN8JNC6Q2p/BI8Sk0DYRoBM0s2
+xbCalV2te0MuQxO7TYbvfEy8RBvlAgMBAAGjggH/MIIB+zASBgNVHRMBAf8ECDAG
+AQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0O
+BBYEFM3O/rH/+S7klqn/K+MtgB2OSpj1MB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7
+Eyn38QpwPt5kMB0GA1UdEQQWMBSBEnBraUBzbWkuc2FjaHNlbi5kZTCBiAYDVR0f
+BIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEB
+BIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1At
+U2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
+Z2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAC
+hjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNl
+cnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAWsQWvSSOgxLjT1z7j7jD
+yfybPHVh6RDtiSsnl0yLLh8jn9/ZETgATWdh4VwYY7vg24wrfmWNiowmxtHCFk7K
+j/FYMDL3YlS0n5ohqWLI5Ra3fg7GxXDJuj1Wq9bCCr/cqMN3DYOor0V3oWaqJNwa
+eMqtmlDXisKgS0ybs+HNIl3nJyfCkfG31H3Xv0s67aB6kPag+TgBCIRjc6U6I6ws
+kJtHmlzgHbgJ3ehCVj0P6Zn79NH0/mGrcfCt5wOlbf2W6V4J/d81u7JO/nU2vAqK
+8CPnDFR/mdMmjTnrpavyWtWb0MtRkbrCKpq2BKNfRh8DngMFlxVoAM7s+7MGihZs
+gQ==
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Sachsen/L=Glauchau/O=Berufsakademie Sachsen - Staatliche Studienakademie Glauchau/CN=BA Glauchau CA - G01/emailAddress=admins@ba-glauchau.de
+serial=15DFAFE68EC772
+-----BEGIN CERTIFICATE-----
+MIIFnjCCBIagAwIBAgIHFd+v5o7HcjANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTEzMDYxODEwMTEz
+NFoXDTE5MDYzMDAwMDAwMFowgb4xCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdTYWNo
+c2VuMREwDwYDVQQHEwhHbGF1Y2hhdTFFMEMGA1UEChM8QmVydWZzYWthZGVtaWUg
+U2FjaHNlbiAtIFN0YWF0bGljaGUgU3R1ZGllbmFrYWRlbWllIEdsYXVjaGF1MR0w
+GwYDVQQDExRCQSBHbGF1Y2hhdSBDQSAtIEcwMTEkMCIGCSqGSIb3DQEJARYVYWRt
+aW5zQGJhLWdsYXVjaGF1LmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAkgeWq9sn4SC/BrLuIVsnxXEkd1hgiPddu+qaxrLWH+sXNw5Tjc5982Exq8bm
+LrkAOh/Jc0yylOvY+bLjxUpxPEpXXsstVqPnUVhNgAsmuqvjJYhYFYw28o4Su5Gc
+qtcHCy2FAOqKmnFeoRI4j6r2mvVNYCZN5Ngi0STyvQV8Jmk17I8xlJjDa1/INvHk
+xahxp+YcKU+O6F9kQ5qfeA2/OVYI6ePFxVC6pNGW/hsav3Hm/Vd9FhvTfviCuQ3N
+XP79pTfaL2mgVRNx6LiqTziuOdf+JC/zBb3vdm7YWWh24QRsoIzp6kl1xQau3DRd
+fey6ZKJQwt1omFX1c6KTPBUeBQIDAQABo4ICAjCCAf4wEgYDVR0TAQH/BAgwBgEB
+/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQW
+BBTxDxevDoQg7dy+Pnmdpu28pn4MrDAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp
+9/EKcD7eZDAgBgNVHREEGTAXgRVhZG1pbnNAYmEtZ2xhdWNoYXUuZGUwgYgGA1Ud
+HwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcB
+AQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQ
+LVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRl
+L2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcw
+AoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2Fj
+ZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQEFBQADggEBABZvU0x0STq9uOs2vZZ8
+vFgslYhCkp3qOgLDo99WpFi2SX5CqP8mMwJwyYQs7vAOW/RkvOKGXSOUTl7OAPf2
+I9IdZb6VhUEX5qo05RPWZe5lDDJvljCthcA4rkt/gDxquLmeLPCUL+BOl0T2YXym
+mf0ttkA4pSLr0o1cl/nPoGTbqeSz2Z+v3S3Ffusd54nd5vUWyY+lRWX9tCLhAprO
+Pj4HHe/WnpaOKdJCZ8l/CAt/uUS5b/kDechvKp3f3BTx7swt3aydjKbi4NU38M3A
+8S5kdxZ24dB+leIg8u+aMRyrUfGFBRsPUB4Igt8dJsydxY662VvR7T+m8p3xagar
+Gz8=
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Schleswig-Holstein/L=Luebeck/O=Musikhochschule Luebeck/OU=Sachgebiet EDV/CN=Musikhochschule Luebeck CA - G01/emailAddress=ca@mh-luebeck.de
+serial=17AFF6FE302727
+-----BEGIN CERTIFICATE-----
+MIIFnjCCBIagAwIBAgIHF6/2/jAnJzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDYz
+OFoXDTE5MDcwOTIzNTkwMFowgcMxCzAJBgNVBAYTAkRFMRswGQYDVQQIExJTY2hs
+ZXN3aWctSG9sc3RlaW4xEDAOBgNVBAcTB0x1ZWJlY2sxIDAeBgNVBAoTF011c2lr
+aG9jaHNjaHVsZSBMdWViZWNrMRcwFQYDVQQLEw5TYWNoZ2ViaWV0IEVEVjEpMCcG
+A1UEAxMgTXVzaWtob2Noc2NodWxlIEx1ZWJlY2sgQ0EgLSBHMDExHzAdBgkqhkiG
+9w0BCQEWEGNhQG1oLWx1ZWJlY2suZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCRVdoHIteFV321fz8n0CrbEIJz8iz8j5GlNwQuzWWE2JbQ8K0/r0rT
+lRZF+nXhK1akhTUFY1Z/N7lL5y3F4jhIt536B9fvSlwT2FzoFzhxBBVlLPJakcwr
+JkcA6nM9K2TE7BGZipJwo8serEZ+WmGelQPgmb9qAFnku7Er5+pU+IuG+DKQ2Igc
+44fIfQP05gwbuvh28scpPQfZLrPPjHaM4BVhiQsNWJ0tt9aP0gQ2RBh57PAv547x
+Bq3apIP9MoyWQalEejO5Qv76YYxMJBCtobMU1PKbhjr1fcqNqrLYt0XpjvFMg4l0
+KvnN+UVzqz9+nkDTyNAdlAi6RNUBjkx/AgMBAAGjggH9MIIB+TASBgNVHRMBAf8E
+CDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYD
+VR0OBBYEFHHKkADnhp/4iTs3rosvdbemqKx6MB8GA1UdIwQYMBaAFEm3xs/oPR9/
+6kR7Eyn38QpwPt5kMBsGA1UdEQQUMBKBEGNhQG1oLWx1ZWJlY2suZGUwgYgGA1Ud
+HwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290
+LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8vY2RwMi5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMIHXBggrBgEFBQcB
+AQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQ
+LVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2EuZGZuLmRl
+L2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcw
+AoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2Fj
+ZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAN64oOnVyVePAt8yIQ8w
+bByLKnT+4PkYCH3wUQuDVOYsncL+wD8ANFggKlHZrxUm7LIun7d0ZfQGuJLb/2WE
+uG7mW8/QbLJOntkl0dGZHnIcdm57quVwhc4SqHzehpI8rwu2DczjhcjIhcvr0j6e
+lobLgBdgfvPN+7p4qL4YF6Fu71Qg1xCVhHHk2Gew+GOigNo1W+xbLihl4YsDPMtY
+e88nVnbu75b+UdJhNvvp83fDzC4twrIM/td8TnOnpc3JuNdWLwUpDcMo0wLynjmI
+UCWO2Hj01IGHcgsNmp9w3qYcXj27VWGXlv4M+4ltGeEAheu8tyvelYeUQ2D1CjbH
+uAY=
+-----END CERTIFICATE-----
+
+subject= /C=DE/L=Potsdam-Babelsberg/O=Hochschule fuer Film und Fernsehen Konrad Wolf/CN=Hochschule fuer Film und Fernsehen Konrad Wolf CA/emailAddress=pki@hff-potsdam.de
+serial=17AFF6C1473DA0
+-----BEGIN CERTIFICATE-----
+MIIFnzCCBIegAwIBAgIHF6/2wUc9oDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUz
+N1oXDTE5MDcwOTIzNTkwMFowgcIxCzAJBgNVBAYTAkRFMRswGQYDVQQHExJQb3Rz
+ZGFtLUJhYmVsc2JlcmcxNzA1BgNVBAoTLkhvY2hzY2h1bGUgZnVlciBGaWxtIHVu
+ZCBGZXJuc2VoZW4gS29ucmFkIFdvbGYxOjA4BgNVBAMTMUhvY2hzY2h1bGUgZnVl
+ciBGaWxtIHVuZCBGZXJuc2VoZW4gS29ucmFkIFdvbGYgQ0ExITAfBgkqhkiG9w0B
+CQEWEnBraUBoZmYtcG90c2RhbS5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALT6k6qCQc1QW+V68BWKt4pF3xQk480KMk/r5LPbO7tfWZ7gq/Vwyq6j
+sPPbu83BC5qxgZwy0kVsi9PF1zyXaDAkUp4mtXaKZNaR2T4kdEoYtNe6xyQTFUH1
+/6QYAmcpGOtLoDrENMsBzUa4UEvUhy2g70IIn42fRvALXxk4R+mN+Pu85mHTwwmt
+u2x0TpuHEpS8oZeKAWLVGgaPM/LsWtrUZsohReUg9AiRrMTyGlt+53SByfnZrHTM
+XdLmpw3X8gnX7hJMHsTwLHKkztruemIygpDprEqCfPonfhWjjeP00HcYJgihfJLD
+jw+MQlkV9cOwxGhDcNkWDZuvcQGv9IMCAwEAAaOCAf8wggH7MBIGA1UdEwEB/wQI
+MAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNV
+HQ4EFgQUP1BzCklWMoA0Q4+rqfdBJ1wIZvMwHwYDVR0jBBgwFoAUSbfGz+g9H3/q
+RHsTKffxCnA+3mQwHQYDVR0RBBYwFIEScGtpQGhmZi1wb3RzZGFtLmRlMIGIBgNV
+HR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9v
+dC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUH
+AQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NT
+UC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5k
+ZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUH
+MAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Nh
+Y2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAq7WUoxZkBifmaySdv
+R0COYBsO591cKz5knIX6OXUGuf1hRVHe0m7R93Fqop4IGBqJWw1D9biLns0xZ8Tg
+V9duWga/pU6HmYK1/J61S8aS6+xQS/+tOh1zMlNTdV+oZUiWdMobyDoHTDqGpudh
+d0Z89dCbW2FjyCf/u6MdQX9AbZdBLrCEOFDJR8NNBLqgtt0bTl+aOcRU4WpfUUBa
+bbgQNGMNX5QY4bgsXkr1fy1vVTFhKUT6qT1bb+aa6NbmXWKv+Xb34fF9MDd+kEpn
+1DDgMPCZFNs+04edwtxZsSAcHD6KAnuaLl/vkKkShTP2BHD5JdC8jft7rI9xDZ6E
+ZkBq
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Mecklenburg-Vorpommern/L=Kuehlungsborn/O=Leibniz-Institut fuer Atmosphaerenphysik/OU=Rechenzentrum/CN=IAP CA - G01/emailAddress=ca@iap-kborn.de
+serial=17906101C87D8B
+-----BEGIN CERTIFICATE-----
+MIIFojCCBIqgAwIBAgIHF5BhAch9izANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUxMjE1MDYy
+NVoXDTE5MDcwOTIzNTkwMFowgcgxCzAJBgNVBAYTAkRFMR8wHQYDVQQIExZNZWNr
+bGVuYnVyZy1Wb3Jwb21tZXJuMRYwFAYDVQQHEw1LdWVobHVuZ3Nib3JuMTEwLwYD
+VQQKEyhMZWlibml6LUluc3RpdHV0IGZ1ZXIgQXRtb3NwaGFlcmVucGh5c2lrMRYw
+FAYDVQQLEw1SZWNoZW56ZW50cnVtMRUwEwYDVQQDEwxJQVAgQ0EgLSBHMDExHjAc
+BgkqhkiG9w0BCQEWD2NhQGlhcC1rYm9ybi5kZTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAMJdWgFOCbGCFpu2UaLd7s4UtzHv+FhTX1yjpw56RZ20yAPH
+5BvzQOdw58N2fToSe9Vk1oSE2s+hHPUKtnbGOd+sK/2gxYnxZuqtQY9hf5LHaMkD
+KR8YM8HoIRzKMawB7/2z0H+MnZ2WK7gvjHHkvFZlvzg6UZgr4bv1SKc0KXlVkuo1
+1XDAEgegB+DTgXYyqKpI/2L7SAogG3VDIUnCaJ5m1UnEbug6T8krCGwrLmDvRs3W
+KfZyobZbem9YYBo1VCItDpQY5e/udmZztMwcKynEHX5iPlZO0qGqgdfp3TKhH3LJ
+LtcIkUTJe5r25jSbKFpwUa9jXJhxDZtO1PV7s9cCAwEAAaOCAfwwggH4MBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0g
+ADAdBgNVHQ4EFgQUBnwf1bYf9U4zUOciEJvvL5bTNmIwHwYDVR0jBBgwFoAUSbfG
+z+g9H3/qRHsTKffxCnA+3mQwGgYDVR0RBBMwEYEPY2FAaWFwLWtib3JuLmRlMIGI
+BgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYB
+BQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUv
+T0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQAJp+e7GBG/D+dm
+XckbYAdh08kUm7geWIHL5ZvrUAK2aBOchQ3wseWOLL/bQq5gZwf0HzHB/BucgsiC
+EJZEDT6UvCQjMnpOSExjPPZux03KbOxs7V6f+HQ1mVdGXnsy5o4xkI703qrrokW3
+t8tLR5TUeOprSR/YQRcRuhq4j9KGV1YYlW9iwLnwv2pk5c/CPFy3HCN/3F0MQVCX
+jPY1pH9MMDzTJ6WbmVoZAg8eF6EUiC0VvjmLEsi9H2X7aJ5dUWFmzh2kzws+WmF5
+Vf0ripXsEXJcLEq9RnW5ffnWYiRjBx3OhF+24EEDLvvAKQRLRYlMIHXMGubm8sfS
+BVpd/VZh
+-----END CERTIFICATE-----
+
 subject= /C=CN/O=WoSign CA Limited/CN=WoSign Class 1 DV Server CA
 serial=03CBA5FE611B192C54520CE125A1FF50
 -----BEGIN CERTIFICATE-----
@@ -25989,6 +30855,42 @@
 6rGkYiiDAw==
 -----END CERTIFICATE-----
 
+subject= /C=CN/O=WoSign CA Limited/CN=WoSign Class 2 IV Server CA
+serial=50D64A86BE778040386EA9EF06FBFE30
+-----BEGIN CERTIFICATE-----
+MIIFozCCA4ugAwIBAgIQUNZKhr53gEA4bqnvBvv+MDANBgkqhkiG9w0BAQUFADBV
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV
+BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw
+MTAwMDVaFw0yNDA4MDgwMTAwMDVaME8xCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX
+b1NpZ24gQ0EgTGltaXRlZDEkMCIGA1UEAxMbV29TaWduIENsYXNzIDIgSVYgU2Vy
+dmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApAMuF1LxmVzD
+2/mgf7a3LI8+3pWsTw1JVk0pOqBFc4zWD7GvDiScpXUeVlVM54K5IH1oDLt+uPs1
+VnyecVvMMYrlWfDg6fuczMr6BL+ZvUD/f1bl+HRxfaok4g+bjHMtXWsfdxCVMy2l
+KlmBEB9U58fvE3ZZOdM/8perUaB5Ek3P4mWM1Wn7e5Rk5II6/8qDTy5KQPHDfIAN
+YggthNYK9tEE/uDnNXIi1z+z8L1jEqNFHOQTdV0iB8Qk0vo2Dy4vRN4rETFMT2O5
+uPGm7/JRQ0ti+Aitm/pJgvzDs4z5UWA+UoUySBegHZJEWDVDJzsvwi1xcRSNFTiZ
+COD6J0leCQIDAQABo4IBczCCAW8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdJQQWMBQG
+CCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/AgEAMDAGA1UdHwQp
+MCcwJaAjoCGGH2h0dHA6Ly9jcmxzMS53b3NpZ24uY29tL2NhMS5jcmwwcQYIKwYB
+BQUHAQEEZTBjMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcDEud29zaWduLmNvbS9j
+YTEwOAYIKwYBBQUHMAKGLGh0dHA6Ly9haWExLndvc2lnbi5jb20vY2ExLWNsYXNz
+Mi1zZXJ2ZXIuY2VyMB0GA1UdDgQWBBQWkSABfaxvHPXurCSjZUzFWFSJGzAfBgNV
+HSMEGDAWgBThZs8O0fGzS7cGIBT+hxLV9v77PjBFBgNVHSAEPjA8MDoGCysGAQQB
+gptRAQICMCswKQYIKwYBBQUHAgEWHWh0dHA6Ly93d3cud29zaWduLmNvbS9wb2xp
+Y3kvMA0GCSqGSIb3DQEBBQUAA4ICAQAzsOzTaiXHh2of4IEK2Yh6GjVDLQNKZTTK
+k1eEiwIjir33AXLTGq3BNMuLRvTRgOpVzNmnU/frGofO52Eu6b/pCbfiX7yzHPZX
+VPGydDa5y/fe9CwQWLca+06D7a52+xIUdDADZxzcMyqWa+c45OQoPnHtJdwtXpm8
+iI/pVhR+ZLldRJkaIibph7aE42Gd4NDhg60wfeOlP5zr2lZ+w7aybrTaidsXzM0n
+LPFZXG4rKv8LiUo0F31v5O9VT/b2Q/tOO4A+ejfk+wTHPj5VAVpCAaBHFBnsZmbr
+zassUmE7z6bw9gOx6TerJFnIRze4mcMITd1HZBnkz0wcg/oMz40FKylm8hhqRSpH
+qMQz9c689CLS6r9nhpZ9E9q7C34c/C63zyVEXjIaqhhxbVJfU1EKx39S8ImHn9EJ
+qKlEMRw8ykYpZUPoeNgzz9aaLj3kLbRoCBOgOMuCbi/jo8wBINVh/OcDYxWnJxGF
+BmlQF2MojhBXVDfBRUJ69DWKqg8Pbj2JpVdiU8zRKgClEbxs4OFTOW60fm6YzAEO
+BBi4hwapejJDh7lPIpoJgjwwQMjaNOQ4zUgIeOEBVVs5L4++Fnsv36pmrN5kFFf1
+rvWh8Kr+9BCav2/XtdP3WpuhjPFF6ek18XtUEid4r+dc3LUBuefPUvcVTApHQNpN
+dSHB9Sceyg==
+-----END CERTIFICATE-----
+
 subject= /C=CN/O=WoSign CA Limited/CN=WoSign Class 3 OV Server CA
 serial=673F334F21533652C35E15D2FDB3020F
 -----BEGIN CERTIFICATE-----
@@ -26025,76 +30927,76 @@
 WeMNbVoTNg==
 -----END CERTIFICATE-----
 
-subject= /C=US/O=Entrust/OU=Certification Authorities/CN=Entrust Managed Services Commercial Public Root CA
-serial=4C0E6212
+subject= /C=DE/ST=Niedersachsen/L=Braunschweig/O=Bundesamt fuer Verbraucherschutz und Lebensmittelsicherheit/OU=Referat Z03/CN=BVL CA/emailAddress=pki@bvl.bund.de
+serial=17AFF7001574BC
 -----BEGIN CERTIFICATE-----
-MIIFozCCBIugAwIBAgIETA5iEjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
-RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
-IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0xMDA2MzAxODM0NTRaFw0yMDA2
-MzAxOTA0NTRaMIGAMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRW50cnVzdDEiMCAG
-A1UECxMZQ2VydGlmaWNhdGlvbiBBdXRob3JpdGllczE7MDkGA1UEAxMyRW50cnVz
-dCBNYW5hZ2VkIFNlcnZpY2VzIENvbW1lcmNpYWwgUHVibGljIFJvb3QgQ0EwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMXI+wxZoiWKTiB15DT/VyF8eT
-SWED/vatNS6/Y+s9kbGo2oI8Qlk/lsWn7lv9UeJmIVeu+Pp6iNTyQ09kOAyBBmAQ
-/yKq4PRHnsrPuxgkirXZ5t3AumSPVr62v2kHVce9S94LjCR2UIov0EMvs8/qq95K
-IGxGLTgdoeDVXI/5RZeAsGTquePKvbHest1FmPQaly2pRPdnlRHEmJQ2NkaR45Ae
-QvKKn8kzpYeCoBLyCsD0HbHzlIfPaujKqEcQZIbJUyD0y++KNajSPATWImCt2eXd
-eHEUcnmcHGq9ha1EEI02oW8zT2R0xhjdLoR5Ds+xg43iGyxLPdoliIxHVPhhAgMB
-AAGjggHtMIIB6TAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBATAz
-BggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmVudHJ1c3Qu
-bmV0MIIBGAYDVR0gBIIBDzCCAQswVwYNYIZIAYb6a4FIAwoCBDBGMEQGCCsGAQUF
-BwIBFjhodHRwOi8vY29tcHViLm1hbmFnZWQuZW50cnVzdC5jb20vQ1AvRU1TQ29t
-bWVyY2lhbENQLnBkZjBXBg1ghkgBhvprgUgDCgIFMEYwRAYIKwYBBQUHAgEWOGh0
-dHA6Ly9jb21wdWIubWFuYWdlZC5lbnRydXN0LmNvbS9DUC9FTVNDb21tZXJjaWFs
-Q1AucGRmMFcGDWCGSAGG+muBSAMKAgYwRjBEBggrBgEFBQcCARY4aHR0cDovL2Nv
-bXB1Yi5tYW5hZ2VkLmVudHJ1c3QuY29tL0NQL0VNU0NvbW1lcmNpYWxDUC5wZGYw
-MgYDVR0fBCswKTAnoCWgI4YhaHR0cDovL2NybC5lbnRydXN0Lm5ldC8yMDQ4Y2Eu
-Y3JsMB0GA1UdDgQWBBTAMkkFZmaDhxlpua6DJQYZiwXXdDAfBgNVHSMEGDAWgBRV
-5IHREYC+2Im5CKMx+aEkCRa5cDANBgkqhkiG9w0BAQUFAAOCAQEAD7NwMLoCbvFz
-WEObVh724gCE6XY+xB2NpOrYpu7dlh98kzn7upnY1BMhjvLHiWDMcxIIsar/XFNI
-7AePCF4PGpvfudBtB/U5umTxFVYgLLexxsN2cUOP5yd0mJb6k3wU6NOi8mPZNtSf
-ullUs7avzGHWx787no9d97XrIKKCMV8HwJjtZCt0OKFXVCYWMNMcFqVvBX2pbqgS
-lSBtZhzTIfi3MYkEOY9Zgrtsh+2hP22OJuskImNEHqlYbM//OqlCGQz+4sK6Ai/3
-HMfKFKJ/6Oyf8j48dO123nPRMQAy/oBHEITGQQUK0hdDZyglGOzTHGWH2Ae33vrz
-s+8T9rG8Gw==
+MIIFozCCBIugAwIBAgIHF6/3ABV0vDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDY0
+MVoXDTE5MDcwOTIzNTkwMFowgckxCzAJBgNVBAYTAkRFMRYwFAYDVQQIEw1OaWVk
+ZXJzYWNoc2VuMRUwEwYDVQQHEwxCcmF1bnNjaHdlaWcxRDBCBgNVBAoTO0J1bmRl
+c2FtdCBmdWVyIFZlcmJyYXVjaGVyc2NodXR6IHVuZCBMZWJlbnNtaXR0ZWxzaWNo
+ZXJoZWl0MRQwEgYDVQQLEwtSZWZlcmF0IFowMzEPMA0GA1UEAxMGQlZMIENBMR4w
+HAYJKoZIhvcNAQkBFg9wa2lAYnZsLmJ1bmQuZGUwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCQgetkpF0qtF9HrjdWAtFiJ+5Zr2AU2qcrIOyUxpmpU8gR
+A9THlll+am1uw+T35AOvkaw5YfizFNhpLl7HbCF15F4FBBWBG8Wu/JYaRzEZg01h
+XMXdB5+v6wIpYQEu2aQ87SSO4oyr0SUp9CaiNl96B0mHB+b3ccoNTRB+Xcu//KVd
+KpxxJcc2JfZ+eqDJsYJWmhFLqyjNJhRiOulH5hZEi54O4WwbmMCaTgDAJbZpM90D
+fk2phA9q2PzRO2lj0ho0r8i7hg0uZlEAH/YjutZsH5N23i8LP/xGb+QqKY9hQRFs
+hX3+aTyHryPvQwLPNdXopi8kJJricDp+mrgu7vrzAgMBAAGjggH8MIIB+DASBgNV
+HRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUd
+IAAwHQYDVR0OBBYEFPAVuDCG36MB9in/+amXfuX3k+koMB8GA1UdIwQYMBaAFEm3
+xs/oPR9/6kR7Eyn38QpwPt5kMBoGA1UdEQQTMBGBD3BraUBidmwuYnVuZC5kZTCB
+iAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFs
+LXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBj
+YS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsG
+AQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRl
+L09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5k
+Zm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsG
+AQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1
+Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEALVAh67o5sANt
+VEvl8X920eCNtNYxHRjcWk4NHVb4da2YUv4JbdtJcDCujoGBVfQFcfzmcQsl2PuK
+HviY9f2XrK2tXtrzBVKqIYTJNEXjpB9w2HCs/xcoWFAHScAu2/9NqY5zcy9uHE0c
+jO+hdt1MPrrXZpGF7q4/wwLCNjlYAp+3bhcS4yBd4Ho5Tf/flmcFhTQGXAKlmTiM
+lliUkFdZFR2Vr+mixx2VIYwk07JdbjV5C3MLnilpEAcB1oStsIVAI04Pvl4EC2iL
+htHk9H/nMqZ6fcZQQwQz88x6fy0DUjUFAsBUpN6HISftsziwIunt8aES9Uoogy3o
+pbS7DnRPPw==
 -----END CERTIFICATE-----
 
-subject= /C=US/ST=GA/L=Atlanta/O=Southern Company Services, Inc./OU=Southern Company Services, Inc./CN=Southern Company External Issuing CA 1
-serial=19B5E68D000000000004
+subject= /C=DE/ST=Brandenburg/L=Brandenburg an der Havel/O=Fachhochschule Brandenburg/OU=ZIMK/Rechenzentrum/CN=FHB-CA/emailAddress=fhb-ca@fh-brandenburg.de
+serial=17A424D4374E1B
 -----BEGIN CERTIFICATE-----
-MIIFpjCCBI6gAwIBAgIKGbXmjQAAAAAABDANBgkqhkiG9w0BAQUFADCBrjELMAkG
-A1UEBhMCVVMxCzAJBgNVBAgTAkdBMRAwDgYDVQQHEwdBdGxhbnRhMSgwJgYDVQQL
-Ex9Tb3V0aGVybiBDb21wYW55IFNlcnZpY2VzLCBJbmMuMSgwJgYDVQQKEx9Tb3V0
-aGVybiBDb21wYW55IFNlcnZpY2VzLCBJbmMuMSwwKgYDVQQDEyNTb3V0aGVybiBD
-b21wYW55IEV4dGVybmFsIFBvbGljeSBDQTAeFw0xMTExMTYxNTM1MDBaFw0xNjEx
-MTUxMjAwMDBaMIGxMQswCQYDVQQGEwJVUzELMAkGA1UECBMCR0ExEDAOBgNVBAcT
-B0F0bGFudGExKDAmBgNVBAoTH1NvdXRoZXJuIENvbXBhbnkgU2VydmljZXMsIElu
-Yy4xKDAmBgNVBAsTH1NvdXRoZXJuIENvbXBhbnkgU2VydmljZXMsIEluYy4xLzAt
-BgNVBAMTJlNvdXRoZXJuIENvbXBhbnkgRXh0ZXJuYWwgSXNzdWluZyBDQSAxMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArb2EpfXBOixhgB/sbDu6IVYf
-oY5OE8GI6oiJII006S9LWdNpJRD49xJpm7yjh4RTKxAMbdXZaCiHxvbn6yI8wHgY
-Sa/EOQGMcfK5JcxhWL8137c5uE4p0SsrTwSkBKZAM6dypR/do4+tfiAN6XiPkEcp
-JAX8IXbg9dyOtF5ApM7c/BMBQ6auFuWnVCLDmXfY5WC+n/q4RN9HkJuKGLSpsd0u
-q6O6WpuFVNN2IQSI7Q7VEUgsdzniCPOdbDayndKMjpcjFXkLix7Z4pjToFB4jj4c
-j1WyBKxMrnC+4IHMas+Wre1bQBK+b5HnvNbqcp+t45vHNPwDsAY0DYZ7lp6UBwID
-AQABo4IBvzCCAbswEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUjWOryN1c
-Z3PPWzJZZdEI/21bVEMwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEA
-MEMGA1UdIAQ8MDowCwYJKwYBBAGgMgE8MA0GCysGAQQBiTSDfQICMA0GCysGAQQB
-iTSDfQIDMA0GCysGAQQBiTSDfQIEMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBB
-MB8GA1UdIwQYMBaAFFNCwoAdOkr2Y7sa5u5/wunVcOCwMGYGA1UdHwRfMF0wW6BZ
-oFeGVWh0dHA6Ly9jcmwuc291dGhlcm5jby5jb20vY2VydGRhdGElMjAvU291dGhl
-cm4lMjBDb21wYW55JTIwRXh0ZXJuYWwlMjBQb2xpY3klMjBDQS5jcmwwewYIKwYB
-BQUHAQEEbzBtMGsGCCsGAQUFBzAChl9odHRwOi8vY3JsLnNvdXRoZXJuY28uY29t
-L2NlcnRkYXRhJTIwL0dBWEdQQ0ExMl9Tb3V0aGVybiUyMENvbXBhbnklMjBFeHRl
-cm5hbCUyMFBvbGljeSUyMENBLmNydDANBgkqhkiG9w0BAQUFAAOCAQEABq0tiYOc
-D4eHoUOrixhssKpLFDAceWuWiMzkZ66+K4SvgUOKS0ocLzcUEfDw636sUbwe4ucG
-0BPjOCHxyJowbmpnuObcu4Q7Q3tnKcE5pJSiLQMzfgEM0ZUhdXWChvXdjV309tN7
-Cggm/bmfExCk82yZwljyvW3VcDOX2hp4s9Mm7y6tQpMUveRqXg/+u2pzSv/2TgF0
-fudlwMo8NuTDqbz6qmi13/YFZ7YzuwPeF96Iqx+Sg12KKoMsD0Y+39UQN6FPOb7f
-0O3ALZErShCu2n4Qb5DhfPwSFuBDygZ2n4wrHjvdFOgPryI4S/RgqT1X8CRkMmYD
-Fi7LPXqtPsL1MQ==
+MIIFpTCCBI2gAwIBAgIHF6Qk1DdOGzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTUw
+MFoXDTE5MDcwOTIzNTkwMFowgcIxCzAJBgNVBAYTAkRFMRQwEgYDVQQIEwtCcmFu
+ZGVuYnVyZzEhMB8GA1UEBxMYQnJhbmRlbmJ1cmcgYW4gZGVyIEhhdmVsMSMwIQYD
+VQQKExpGYWNoaG9jaHNjaHVsZSBCcmFuZGVuYnVyZzEbMBkGA1UECxMSWklNSy9S
+ZWNoZW56ZW50cnVtMQ8wDQYDVQQDEwZGSEItQ0ExJzAlBgkqhkiG9w0BCQEWGGZo
+Yi1jYUBmaC1icmFuZGVuYnVyZy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANlJAezpwj2W9kd/8tbrI0luxI9hFmWxvo9/sOK1iOiPyYriXD/CnVD5
+1s3SD62tODT7UHr1qWgrW9L6h25fDTtNEg/8dnqfgkleTi5rHCAhVwk+HtlOPmz/
+AhRVBZwJQvrrwml6mbOl+9fDf/G13F0/t4EkTFQdC7hh9YO1hZj+3ntMthkkZiN+
+DpuXlU1lgY9ONZ3yxCblfYPGsmaGXR/SDm0YFycbiZx0W7m8p3Wz04q6kYNCAXtR
+x79JtqyX4np/2hbmhgA/r22SGsHcIhDEl0U4TKz1mC+/H6+xRzw+IVIFXdGLGqlF
+7jVlMALXcn0ZHh7B6faK9DjOommMHuECAwEAAaOCAgUwggIBMBIGA1UdEwEB/wQI
+MAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNV
+HQ4EFgQUhZe0rSIymV9iqIRCDWynk/T7Ve0wHwYDVR0jBBgwFoAUSbfGz+g9H3/q
+RHsTKffxCnA+3mQwIwYDVR0RBBwwGoEYZmhiLWNhQGZoLWJyYW5kZW5idXJnLmRl
+MIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9i
+YWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIu
+cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYI
+KwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4u
+ZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNh
+LmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYI
+KwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQBggJhllCAC
+gBbA/1qoxeGxX8Qp+bhI91o8BUQJfyXzvQ3ZvIjnZEk0/nXIZDFNYX2HZBV2PWpJ
+T0apPDSNKVAmEcEktXzyLtofzuZeC4Qxl1i3PW7NjdmupgWzmStDniOH2UdFPVV+
+YaJC5otrFenkSLpzYBGRfHl7jCzBLJKiocelF5SvDG8bk/K52ju/C8MAw3JjBN2I
+e8mbu4d21nLpxnlV7yBLoxBfXQy4aFl60XOkAUImP3Hs2P/tVbQRO6ufUpECtKru
+c9Hc/jhRFDMVUS04EwScg9OyFW3ilszx5KufNej/kP4mL3wuCK4fpMV/eCj29iu4
+eW3aTMsN5Ucs
 -----END CERTIFICATE-----
 
 subject= /C=CN/O=WoSign CA Limited/CN=Certification Authority of WoSign
@@ -26133,6 +31035,42 @@
 uLjQTnJPuoiYpA==
 -----END CERTIFICATE-----
 
+subject= /C=DE/ST=Bayern/L=Aschaffenburg/O=Fachhochschule Aschaffenburg/OU=Rechenzentrum/CN=Fachhochschule Aschaffenburg/emailAddress=pki2@fh-aschaffenburg.de
+serial=17A4249830F62A
+-----BEGIN CERTIFICATE-----
+MIIFqDCCBJCgAwIBAgIHF6QkmDD2KjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTQw
+MFoXDTE5MDcwOTIzNTkwMFowgcUxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXll
+cm4xFjAUBgNVBAcTDUFzY2hhZmZlbmJ1cmcxJTAjBgNVBAoTHEZhY2hob2Noc2No
+dWxlIEFzY2hhZmZlbmJ1cmcxFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xJTAjBgNV
+BAMTHEZhY2hob2Noc2NodWxlIEFzY2hhZmZlbmJ1cmcxJzAlBgkqhkiG9w0BCQEW
+GHBraTJAZmgtYXNjaGFmZmVuYnVyZy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBALxT5KJIXypH3jTdbPdQS5uTfW7u2XIUpm+g1PODNUp/9k55Dyhc
+OgJpcKfWdKOg7xP2kNHgy6FwhiST/9l9pitxeKZM0JKieS8ER/XjqXcJXKMHQ0eH
+/Y5Db86OJGn0zalAfgn0/F5Il6kFkxFkrzcItgSO8UZWHJOX1nYyqghGnCi1grAq
+3Bi3wF6uuHWbLC/ogiwuETOahG9dMGmMq0tMGeqc+p2jDva7osR0gzzec22RBMvs
+a+Up68zuUEWk4BtJqOq1XXZseGXD1CuEZDJM1j7nk7qJ8FpBim4P0Q2hnVc+VXyK
+h4P9kYVacSt9VETgk1+0NVZnQXdodE6dnx0CAwEAAaOCAgUwggIBMBIGA1UdEwEB
+/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAd
+BgNVHQ4EFgQUkwReO8JZfrVGtkVzKrp/Vfb7hS8wHwYDVR0jBBgwFoAUSbfGz+g9
+H3/qRHsTKffxCnA+3mQwIwYDVR0RBBwwGoEYcGtpMkBmaC1hc2NoYWZmZW5idXJn
+LmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRmbi5kZS9n
+bG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0cDovL2Nk
+cDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB
+1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5k
+Zm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDEu
+cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQw
+RwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQARFfKR
+bnJ3zLhbx+Wfmp/Yf1MBkq4ovUjoORq9K7Q4URTFndbxtrQmXz6aWyip5s87ykTf
+5ZYiWVMoUI/JY9bWXezPCcflfleZvWNQ0Kp7a+bn4ip5Z8/COr4sqiuRXzw1Vg3/
+r6H0sHfRJZm0f2/Ja2RBTSw5mJdbLiFnP6Uv8XG76g11ZM+qOq3vw5dJsO/rc3gm
+2FB7CqP+c9sJac5NOudmzcKhUTTG1MZGUxwik8Ph1DZUDw/mSrwzb2MNEdkerylP
+XDIgqFupoAQFGgCcuqa0ZhTlSSRfW4nOKUoOEA1pDvJ/ysY4ryPumUHZMVde1pFA
+kXTG7A65OXdZFVKN
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=T-Systems Enterprise Services GmbH/OU=Trust Center Deutsche Telekom/CN=Shared Business CA
 serial=010A
 -----BEGIN CERTIFICATE-----
@@ -26169,40 +31107,148 @@
 uwAMLjrrbY8DmtEBXw==
 -----END CERTIFICATE-----
 
-subject= /C=US/O=Wells Fargo/OU=Wells Fargo Certificate Authorities/CN=Wells Fargo Enterprise CA 02
-serial=40B269FC
+subject= /C=DE/ST=Niedersachsen/L=Lueneburg/O=Leuphana Universitaet Lueneburg/OU=Rechen- und Medienzentrum/CN=Leuphana Universitaet Lueneburg CA/emailAddress=ca@leuphana.de
+serial=17A424A71EA3E4
 -----BEGIN CERTIFICATE-----
-MIIFrDCCBJSgAwIBAgIEQLJp/DANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v
-dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDkwNTI4MTgxNzI2WhcNMTkwNTI4
-MTgxNzI2WjB4MQswCQYDVQQGEwJVUzEUMBIGA1UEChMLV2VsbHMgRmFyZ28xLDAq
-BgNVBAsTI1dlbGxzIEZhcmdvIENlcnRpZmljYXRlIEF1dGhvcml0aWVzMSUwIwYD
-VQQDExxXZWxscyBGYXJnbyBFbnRlcnByaXNlIENBIDAyMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAm1mEVgXlHHbd4DrKFIROTf6Q5JwzJEtjFiWN4lQs
-EvKeVN1p7/ua16c0gFhizQvuD002pttUG7Tn6uUonUYxJajD2TnykAQu1m5Ks1gi
-sNgYCGzH8tluKeWYANppSRt5F1Is3YtsNOGiYtVFnZf3FejOzVWkhnT5rYXjTf9O
-su5KK1Jh7NywbFU5P2ytC4h/M9xnlHuCjy7RBmN956iG7Eb+BBrvo7ZfTfzWuFzm
-vficKovoDbZOloLHHsRzj2iQ2euY+xW/g+Zn1lHPQCZfTdLgPUcnV7qpP+1fRVy5
-hNLQTw3nBrNa5RLIZK8RBpY6kig4wWhyNKP+9Ssc2m34lQIDAQABo4ICMTCCAi0w
-DwYDVR0TAQH/BAUwAwEB/zCBgwYDVR0gBHwwejA7BgtghkgBhvt7g3QAADAsMCoG
-CCsGAQUFBwIBFh5odHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2Nwcy8wOwYLYIZI
-AYb7e4N0AAEwLDAqBggrBgEFBQcCARYeaHR0cDovL3d3dy53ZWxsc2ZhcmdvLmNv
-bS9jcHMvMHcGCCsGAQUFBwEBBGswaTAwBggrBgEFBQcwAYYkaHR0cDovL29jc3At
-cm9vdC5wa2kud2VsbHNmYXJnby5jb20vMDUGCCsGAQUFBzAChilodHRwOi8vY3Js
-LnBraS53ZWxsc2ZhcmdvLmNvbS93Zl9yb290LmNydDAOBgNVHQ8BAf8EBAMCAfYw
-gbIGA1UdIwSBqjCBp4AUFK8Y973m52vjWvrqUe/+1FpxOcChgYikgYUwgYIxCzAJ
-BgNVBAYTAlVTMRQwEgYDVQQKEwtXZWxscyBGYXJnbzEsMCoGA1UECxMjV2VsbHMg
-RmFyZ28gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJldlbGxzIEZh
-cmdvIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5ggQ55JeeMDcGA1UdHwQwMC4w
-LKAqoCiGJmh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3Jvb3QuY3JsMB0G
-A1UdDgQWBBTEq0W2OgsBHGJcyj/H480vMMRX1zANBgkqhkiG9w0BAQUFAAOCAQEA
-LUIw6yFNj7mrTSIuqtT6rsAXgKApylI3HtepbWa6qxEmmDDjCAaOxXZKShTxBQa6
-qSpYFg0KFxqKsNiot8CAEMxXcapr5OLwytTFvnDSRa9H+mlLT6jpZi8C3fbqEvbV
-eh7NjT4oj8fNbsf13UgN0xxlgiez47locWVADdYP/RucG31o+8OqJaZ/+AWsc+B6
-LoQ9jaYlYaiXXERQopLS8dxTeGp8pvmdYK4ghHG/AwLW0fEcaqQOqrBcf8A+3/RQ
-YEdJ62vZ8Q9T6HwbdPr0zToqeVM5i+DgLjy2fq1eEp6a5In0N78tkgEr8NPlpPgb
-93C6T8kNYioQY20dNklqLQ==
+MIIFrDCCBJSgAwIBAgIHF6Qkpx6j5DANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTQx
+NloXDTE5MDcwOTIzNTkwMFowgdMxCzAJBgNVBAYTAkRFMRYwFAYDVQQIEw1OaWVk
+ZXJzYWNoc2VuMRIwEAYDVQQHEwlMdWVuZWJ1cmcxKDAmBgNVBAoTH0xldXBoYW5h
+IFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcxIjAgBgNVBAsTGVJlY2hlbi0gdW5kIE1l
+ZGllbnplbnRydW0xKzApBgNVBAMTIkxldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVu
+ZWJ1cmcgQ0ExHTAbBgkqhkiG9w0BCQEWDmNhQGxldXBoYW5hLmRlMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqJ+JpHih32+icKiQ2IkbhmFLjAcnK0vr
+nyOKbn7+1xywhvL3zkraqhQlrqEltTDy711vIEadOVfhIx8xZYYJ/zg1OCwKUxNb
+IbjcsIFiOKNbWxI3/yMOsaZpXsCLW7GfHLlLADW1Cv2gUAdnjJUATcUF3a25Bgr9
+Lbv+GI+3bY9ydMkGnhFYSL96LLqLxAXzGXL/MAM5t/xK8cc8+6+mWxHAqO+85Jn+
+UvS1khVTtZfACrYZKFnAsVHOMM/WRugohq4ue6Jfp65exMM7HKWNPrKnUV0hotcI
+nKFBYywcZrIa2r/6m63nOxl1gHrewxiFWEBvpgMkQ+a7PHhXsMkPdQIDAQABo4IB
++zCCAfcwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwEQYDVR0g
+BAowCDAGBgRVHSAAMB0GA1UdDgQWBBT04WgZOxlDxwE20TRilvP1A6EHjDAfBgNV
+HSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAZBgNVHREEEjAQgQ5jYUBsZXVw
+aGFuYS5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9jZHAxLnBjYS5kZm4u
+ZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmwwPaA7oDmGN2h0dHA6
+Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5j
+cmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5w
+Y2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUHMAKGO2h0dHA6Ly9j
+ZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQu
+Y3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1y
+b290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEA
+tqgqOfw9zQP0dcdGlUeC3h6q37Z0WyIfALGW7xr3vqzgEIBb+TkEbvj1RFc0EZFD
+J/Ttb+pY0dzrgcQY2OQ6JPv46NXFqZA7wlLA3b9gCT+PJjGZwHVzP6b8XdHNCIQ/
+Gh556ANd+CByoOAfNrsJMB4KYrOr4b7djh0i8EklUWja6nVSd/rgtL4pIvqD/uDX
+M+QfFfldOPrcyE/FAa5K7OsvlkdtOjMufSanBEOpTgj5IHpLSM9qkmUFaDm5m44j
+VZ91CASQwlXDbsDBi8dYan3hkMbartLvmLUyApUxw4JnJqztI2ifOyy0WJIQfdX+
+Om7OMoK68ybwU0sKlDPMkg==
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Baden-Wuerttemberg/L=Mannheim/O=Universitaet Mannheim/OU=Rechenzentrum/CN=RUM-CA-G Zertifizierungsinstanz/emailAddress=rum-ca@rz.uni-mannheim.de
+serial=17A4253C7F3744
+-----BEGIN CERTIFICATE-----
+MIIFrTCCBJWgAwIBAgIHF6QlPH83RDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTY0
+NFoXDTE5MDcwOTIzNTkwMFowgckxCzAJBgNVBAYTAkRFMRswGQYDVQQIExJCYWRl
+bi1XdWVydHRlbWJlcmcxETAPBgNVBAcTCE1hbm5oZWltMR4wHAYDVQQKExVVbml2
+ZXJzaXRhZXQgTWFubmhlaW0xFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xKDAmBgNV
+BAMTH1JVTS1DQS1HIFplcnRpZml6aWVydW5nc2luc3RhbnoxKDAmBgkqhkiG9w0B
+CQEWGXJ1bS1jYUByei51bmktbWFubmhlaW0uZGUwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCL7B3MX12aAEOV15YWTwIfFkOCPrdDgSIBuyGwLK0Hc3PX
+CG2MbHADWOvNydC+SKT2HXlNQ4bSApUYMHTv3JKXN3XZLOmokUQb2UXU/P659xjX
+RW06cdKoQwInJ2u3zw+1UslRXM8HuWYz+2nwyvl0VERPO2I1W7Mtu2VX4yE1pPvS
+NhvVdY0BWXGYc3qQj3fT8sd829OD7IosqrzAZUSoFAif0zp7WHn6U2A8TSdG0C3g
+FZrWAckS4xOH6/CxeEUrM/Yd0PqQ4ng+GoOpHLdavAQnolztdGTcm+LxcHPMAtDv
+7buL6Ltyv17VUbW8gWryUs+p6uDesH1LrFTq8rVFAgMBAAGjggIGMIICAjASBgNV
+HRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUd
+IAAwHQYDVR0OBBYEFFkgKUBC1v6OBy66PYdPMq1kdo4MMB8GA1UdIwQYMBaAFEm3
+xs/oPR9/6kR7Eyn38QpwPt5kMCQGA1UdEQQdMBuBGXJ1bS1jYUByei51bmktbWFu
+bmhlaW0uZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRw
+Oi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fjcmwu
+Y3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3Au
+cGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8v
+Y2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0
+LmNydDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwt
+cm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEB
+ANBRgj/XpVCzyH7Hj6J9XZOGWfoF8gLABd/birCEBjiuhBGMmCObJxZUxXOl6xOi
+/or0WEBQgMQLcNLzko7ghAq3h6PnQR+MXA3gVP/U7bPsS4kNIiFUTluI9F7uOpH2
+/xue4JogazTvvhwhqWuEMadJ2XzckZjw1uR166FLh0v+QRG61jT3+U58qjur/KhS
+l66qsKBKKGEaR3PpY3M968lcRJmovUCEBPjwtoyEjYvrH2CCN/AA0vCdDmx560vf
+OF6P6n/qb5xI7TXLNEUU8KMx15QdliTW+Vk4VOLiAf4e02olThLvZexSUsU2IXei
+nLtB4bcr0aa1XeUm7Ek0UrI=
+-----END CERTIFICATE-----
+
+subject= /C=CN/O=WoSign CA Limited/CN=\xE6\xB2\x83\xE9\x80\x9A DV \xE6\x9C\x8D\xE5\x8A\xA1\xE5\x99\xA8\xE6\xA0\xB9\xE8\xAF\x81\xE4\xB9\xA6
+serial=5D32A2B7A5358DAE054478576E008399
+-----BEGIN CERTIFICATE-----
+MIIFrjCCA5agAwIBAgIQXTKit6U1ja4FRHhXbgCDmTANBgkqhkiG9w0BAQUFADBl
+MQswCQYDVQQGEwJDTjEqMCgGA1UEChMhV29TaWduIGVDb21tZXJjZSBTZXJ2aWNl
+cyBMaW1pdGVkMSowKAYDVQQDEyFDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBvZiBX
+b1NpZ24wHhcNMDkwODA4MDEwMDA1WhcNMjQwODA4MDEwMDA1WjBQMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxJTAjBgNVBAMMHOayg+mA
+miBEViDmnI3liqHlmajmoLnor4HkuaYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDRnPV+hvCqO978QSIbtspZaZeKya5m4MnNQcsEFYyKB8VGBDMvTfR2
+mA+39xlfJQ8ZzYHQXg3h2TytpHd08CtLZ5R+dHjqXZ/r1F6n4A7LRlUR/K/XVBpP
+kGqut20ObBzSwSRBH8C5EGWXBJmFuX1hhV9sHDbIs2kR2N+VsDcL1tV2ems0voXu
+MX8fGYHZovxEowbLQsVOyK5wQiCTRljamfCo3xqYFJd+lwnKbkGLZZPUryyPkhIn
+k+H3YwjLHecxah5z6AU1XGpMj3BCB9MeU79Ws28dTIjQTBpHmTP+iKjO0lojZQwa
+J+Bti4CxQ+0TboU1M7ZSIr17lmNVdvOJAgMBAAGjggFtMIIBaTAOBgNVHQ8BAf8E
+BAMCAQYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQI
+MAYBAf8CAQAwLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybHMud29zaWduLmNv
+bS9jYS5jcmwwbQYIKwYBBQUHAQEEYTBfMCUGCCsGAQUFBzABhhlodHRwOi8vb2Nz
+cC53b3NpZ24uY29tL2NhMDYGCCsGAQUFBzAChipodHRwOi8vYWlhLndvc2lnbi5j
+b20vY2EtY2xhc3MxLXNlcnZlci5jZXIwHQYDVR0OBBYEFDJlKDLWWB7GB72n6Pco
+qWjuI6IVMB8GA1UdIwQYMBaAFOFmzw7R8bNLtwYgFP6HEtX2/vs+MEUGA1UdIAQ+
+MDwwOgYLKwYBBAGCm1EDAQIwKzApBggrBgEFBQcCARYdaHR0cDovL3d3dy53b3Np
+Z24uY29tL3BvbGljeS8wDQYJKoZIhvcNAQEFBQADggIBADGH3FDzoRtQiuxzKs0r
+YEPjfvLcqbW+1+fbSLRo84G5Wc7d+azVteZFmfbCjdq9aHjSU1BzfL9hgERoFrym
+LRybADdNdKMyhAjwwKm+KZzeS6fx7KwADixDIoQFKn7PYAtU8vHVv4ryxP2yhPCv
+v0Nfehtu21fGl3Uk9+G3iQfHLb6FkPH0mcM8ZGEkOAya14q7NNZiMg4SQyZPvoF4
+mVKBnVmDA/rstvNlszbcOIS21vx/r/OlskpplrKp/JDEIAh3sBszDLTri+bHjJ9q
+MK6ZuNfRc9DBxPDvKPvt7jGlCqH037DRxeMT+ErKevnmWTPj+9Ij6t4SHzMXmhpL
+U3Ole9x+NjufSZuiezVk54K/5kNwwArXzKasBZ6QW/FHgsUuBA6ilPVxCJB3MCBQ
+Br1t2xLEhcZ0hgEOkcWE6qfPVT1d8hiKtqSLJzNTi9YcfamboDFgIAi73EJvaKU5
+99/TnIi6JmsuObEBH783QGODlGhbRSf8G3Pom8EJCjnyriL5PMVYmrRpu+TAuLdm
+S9LbB1JGA/NA8dKg6YlDWJSlJzxSaYWzrjJm3KrTHHfus4v+jpcdUIEtjMLT6eza
+v58XSo9wAZ8c1pUCOnAYvrOAqnR5XMfjCmcSRA3NZ99MMQUgyyYNKaoziMd2PRlY
+LxBxI6x015n7vY4MEvXhsOJ9
+-----END CERTIFICATE-----
+
+subject= /C=DE/O=Universitaet Duisburg-Essen/OU=Zentrum fuer Informations- und Mediendienste/CN=Universitaet Duisburg-Essen CA -G01/emailAddress=caadmin@uni-duisburg-essen.de
+serial=17A424B707E04B
+-----BEGIN CERTIFICATE-----
+MIIFrjCCBJagAwIBAgIHF6QktwfgSzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTQz
+MVoXDTE5MDcwOTIzNTkwMFowgcYxCzAJBgNVBAYTAkRFMSQwIgYDVQQKExtVbml2
+ZXJzaXRhZXQgRHVpc2J1cmctRXNzZW4xNTAzBgNVBAsTLFplbnRydW0gZnVlciBJ
+bmZvcm1hdGlvbnMtIHVuZCBNZWRpZW5kaWVuc3RlMSwwKgYDVQQDEyNVbml2ZXJz
+aXRhZXQgRHVpc2J1cmctRXNzZW4gQ0EgLUcwMTEsMCoGCSqGSIb3DQEJARYdY2Fh
+ZG1pbkB1bmktZHVpc2J1cmctZXNzZW4uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQCrlesmTmiMkKzPuHIJDUpxpjiCkPL18fopC9Cue4n1xRBxPnSE
+ssI/2XAb4kHWrJmlPjd2281P2HmIQkaj+mPOw0xGkzYan/rKRb8gvwb4v/cJhC7T
+IioPTQ7NfvfMg5hoNYW7mcykAEY0eFlO80dLHNLLMUQm8VRxPDS9sDlHgIUadmM1
+YNkgJ3PB0f0DqR7WiLoyggLdvxIZDkCncFpkhbrvfXU0kQVUcj8kMNG5F5EgNUa/
+1kTpqfOU+3jAikYMPlPhfW4NvKbSpm8p5BbRHJQlte20pTeWFGAatv6RjO10eWHo
+P88lS9qiOmH+kk/cqqP2tzPo4aE62BiGi4OJAgMBAAGjggIKMIICBjASBgNVHRMB
+Af8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAw
+HQYDVR0OBBYEFGZmvJabSE3o3bwip6Zb1ahBn5XuMB8GA1UdIwQYMBaAFEm3xs/o
+PR9/6kR7Eyn38QpwPt5kMCgGA1UdEQQhMB+BHWNhYWRtaW5AdW5pLWR1aXNidXJn
+LWVzc2VuLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEucGNhLmRm
+bi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0
+cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3Js
+LmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3Nw
+LnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBHBggrBgEFBQcwAoY7aHR0cDov
+L2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2NhY2Vy
+dC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFs
+LXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IB
+AQAmPJamEUP82r5iYWr7K9G8+7bII878sBd9RQzJYVz8SB+9K5S42fMrj0Udjx4W
+jSLrTBW8qznbJ9Gx06EBmOBrmCc6XHmXH3s6+J+fQ7xZSw+6RoZNaMXonYoQTo3r
+a2DorXNToweS16XoVosKZbpeYJYD09tiRRHNjKVg+BDLHh9Psfnsj0hdBCFk27wX
+w4qiwzcxYWwTVCEuCpXdULzMrFUFaBLkFuXDa3ganu0JakILo0CJtLO+KEPlOkPd
+lNx5wLfb34JJWRjfg6VLou24VdfEkIROLhfPJl4ufETQUY2+dvTZARlRE1HpLiWZ
+xHEHrzkUKVc1T3p6ef0u7col
 -----END CERTIFICATE-----
 
 subject= /emailAddress=igc@orion.education.fr/C=FR/O=Ministere Education Nationale (MENESR)/OU=110 043 015/CN=AC Education Nationale
@@ -26313,76 +31359,184 @@
 4/HgOD0DjGnDgdGvxLlFAUPV4v/s63RlwmA=
 -----END CERTIFICATE-----
 
-subject= /C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=Advanced e-Szigno CA3
-serial=6EAE653A2F285271079590CCB0F9BBD9
+subject= /C=CN/O=WoSign CA Limited/CN=WoSign Class 4 EV Pro Server CA
+serial=4FBB6BCDF1A7C29AD1DCE66F41EBEC25
 -----BEGIN CERTIFICATE-----
-MIIFuzCCBKOgAwIBAgIQbq5lOi8oUnEHlZDMsPm72TANBgkqhkiG9w0BAQUFADBy
-MQswCQYDVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jv
-c2VjIEx0ZC4xFDASBgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3Nl
-YyBlLVN6aWdubyBSb290IENBMB4XDTA4MTAxMzExNTgxOFoXDTE1MDUyNTExNTgx
-OFowbjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1N
-aWNyb3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEeMBwGA1UEAxMVQWR2
-YW5jZWQgZS1Temlnbm8gQ0EzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAy80MSuej7RtajozuTQSzHRqBF1wn6cepxU+5k7fqXcDXzpWgf8a8U6NEEmxV
-TI4k5zrsx4dfpu6scbUWq73BHpYvebHRAZm5L7bSnC9/UNbzMqoW5ArBN9nerE5P
-qHY0Yt1WUQ6k5BobEpNMJafYTgG/7DTyaqmeZzfxkAty59NATLbKMH5uFN5Qiyhd
-g7noUkvCj0pxwU2RMHVS1CCk7t2ua1qCgS58zGxZnG9bZi2I+YfbDFJXVnYgAPuy
-uvxPyTAk5l2efVh+FtMxqqMBp38MaUzN0Jmvv+BOu4sCXQhB2hNK4JutIcOF1saw
-TQMRlQ+JhKv7Z8w9mlL2XYm5fwIDAQABo4ICTzCCAkswPQYIKwYBBQUHAQEEMTAv
-MC0GCCsGAQUFBzAChiFodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1Jvb3RDQS5jcnQw
-HwYDVR0jBBgwFoAUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDwYDVR0TAQH/BAUwAwEB
-/zCCAXMGA1UdIASCAWowggFmMIIBYgYMKwYBBAGBqBgCAQECMIIBUDAoBggrBgEF
-BQcCARYcaHR0cDovL3d3dy5lLXN6aWduby5odS9TWlNaLzCCASIGCCsGAQUFBwIC
-MIIBFB6CARAAQQAgAHQAYQBuAPoAcwDtAHQAdgDhAG4AeQAgAOkAcgB0AGUAbABt
-AGUAegDpAHMA6QBoAGUAegAgAOkAcwAgAGUAbABmAG8AZwBhAGQA4QBzAOEAaABv
-AHoAIABhACAAUwB6AG8AbABnAOEAbAB0AGEAdADzACAAUwB6AG8AbABnAOEAbAB0
-AGEAdADhAHMAaQAgAFMAegBhAGIA4QBsAHkAegBhAHQAYQAgAHMAegBlAHIAaQBu
-AHQAIABrAGUAbABsACAAZQBsAGoA4QByAG4AaQA6ACAAaAB0AHQAcAA6AC8ALwB3
-AHcAdwAuAGUALQBzAHoAaQBnAG4AbwAuAGgAdQAvAFMAWgBTAFoALzAyBgNVHR8E
-KzApMCegJaAjhiFodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1Jvb3RDQS5jcmwwDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQilKQGq3wU5Mw2FouZhjTEWPAuejANBgkq
-hkiG9w0BAQUFAAOCAQEAPiUPPKipjPc67Gubtre6dXdhMBqS1DfFapfvB61Oce3l
-vzhslaAtyo7wQE6lhpo+mDy0Drh5oa3FXgLArnLd4di66GfveraZFzQJi4GTWu3z
-8xqHFlYhwtyRvJSYtOZvLP95pMjfSm1dP3aj6qp5RIs4s8YimSFxXSyMGpeoZI3v
-+FgZNytMuS1ecdAZMBtgBmDCKpm7LWlco32e9x9ywNk1onvCYrkIyeFTfBJ/NXsI
-s+Eab57LFu0XUG5HGWdOT6y6Lerd5AQIl/XOOgtbpjzktPCfgGCmrHEF0ntILIAP
-qQTFdYgB2nhS+DzqxUhXUiRPZl3Oj4ZxwyOg9oez0g==
+MIIFuDCCA6CgAwIBAgIQT7trzfGnwprR3OZvQevsJTANBgkqhkiG9w0BAQUFADBV
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV
+BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw
+MTAwMDVaFw0yNDA4MDgwMTAwMDVaMFMxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX
+b1NpZ24gQ0EgTGltaXRlZDEoMCYGA1UEAxMfV29TaWduIENsYXNzIDQgRVYgUHJv
+IFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANruMWzk
+gSoosbPaIpynFjqGwRHWIVtLpjy8e1kKWJL/jcJN1ECgHBAzgnBAY7+WdbNPrL2N
+/saiXYAi4bIDqdnfryhyaFVBktQFRELX4NnozbCECZpoKZMYCImBe6P/MRM29fA6
+cL9pFhOD21sr8b7sFdQmM6FLrM83NURlXM8c/vnrVdUPhHeAKgs8sh3ZBGzXpT1F
+rtZYCSEQJ6iS41KIKVYFJdrzdVNMCxtE9XxM+ILSmrKFTsJfW6gPqJixOFeaZ1hb
+Qa0GIcun9/k0xRgagPVt63Ec++bpSi9Cyw334Xmgy2I06IebwNYKqhpJ8G/qhk68
+SrG/D/z8VozOISUCAwEAAaOCAYQwggGAMA4GA1UdDwEB/wQEAwIBBjA0BgNVHSUE
+LTArBggrBgEFBQcDAgYIKwYBBQUHAwEGCisGAQQBgjcKAwMGCWCGSAGG+EIEATAS
+BgNVHRMBAf8ECDAGAQH/AgEAMDAGA1UdHwQpMCcwJaAjoCGGH2h0dHA6Ly9jcmxz
+MS53b3NpZ24uY29tL2NhMS5jcmwwcgYIKwYBBQUHAQEEZjBkMCcGCCsGAQUFBzAB
+hhtodHRwOi8vb2NzcDEud29zaWduLmNvbS9jYTEwOQYIKwYBBQUHMAKGLWh0dHA6
+Ly9haWExLndvc2lnbi5jb20vY2ExLWNsYXNzNHAtc2VydmVyLmNlcjAdBgNVHQ4E
+FgQUGhmD3tFi85F2FJ7y2Vh0LQhIwWwwHwYDVR0jBBgwFoAU4WbPDtHxs0u3BiAU
+/ocS1fb++z4wPgYDVR0gBDcwNTAzBgRVHSAAMCswKQYIKwYBBQUHAgEWHWh0dHA6
+Ly93d3cud29zaWduLmNvbS9wb2xpY3kvMA0GCSqGSIb3DQEBBQUAA4ICAQBE8VB4
+e+gdxHQHDEcB9jw7kwqPkXRejbTw8sRbRB5qnrsxcBBDTR0CDxBiCGVv6+ao4him
+TT0yzhW4fnnobV0HuUqbRtGJE0HIAb7Y9nRBD2notVnu1t2IMMPUxNdt8NqtZkOK
+QL96mZh7lj04J1kvc0Xf78zCOLGixVjYIyBFSEzAJDCa3HntwBu10v7K8byzjyHa
+2cJOD0zVRZVJivL05mc39CvzZefWT5bUisqT2w54jiZrp+Q/EBgirXulAqQkw+84
+oUbtmDvbVcI8XMaOZJw+TbB11WEXpmiax9X1OA8G1AgK8HIWlTnM/M49xFahLuBI
+jAQU1UF/Z7q/NZM+o2uH1dXVHIC4jp0fnEFxBvtGbf+yublz2akmj1gPCZLWv8I5
+DRJT8kJrYjFH+FI14FBAdjcvvDGlo3froYIGIs/U8uor+uEeVDpg7CnDRWDqAP5N
+st/CHxJylcY0Chclon1XmP1ZUe4EBLRwARTatWQM2qDahujvKpuJfA9Ry1Vezplk
+c59wuSNcJrqLZy5qSdrJb6HgUYGTuhHbZe8i+VZWmcHnIJ/MA17NQGcYUh440VUs
+akg2I0w3FFL31I0MaOLakIwRjVwhPJUGlq9lBVgWAhcg5ftie81ZPGxh0x+LG0aA
+VUsCQ3b2jb8VXXe5pVd++aXj6pcFzQgYJrHW2Q==
 -----END CERTIFICATE-----
 
-subject= /C=DE/O=Berufsakademie Sachsen - Staatliche Studienakademie Dresden/OU=Rechenzentrum/CN=BA Sachsen - Staatliche Studienakademie Dresden CA - G01/emailAddress=rechenzentrum@ba-dresden.de
-serial=14DC2F29C82307
+subject= /C=DE/O=Hochschule fuer oeffentliche Verwaltung und Finanzen Ludwigsburg/OU=Zentrum fuer Medien und Informationstechnologie/CN=HS Ludwigsburg CA - G01/emailAddress=ca@hs-ludwigsburg.de
+serial=177D94DDD5EA97
 -----BEGIN CERTIFICATE-----
-MIIFwDCCBKigAwIBAgIHFNwvKcgjBzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
+MIIFuDCCBKCgAwIBAgIHF32U3dXqlzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
 EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
-A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTEyMTIwMzE0MDUx
-NFoXDTE5MDYzMDAwMDAwMFowgdoxCzAJBgNVBAYTAkRFMUQwQgYDVQQKEztCZXJ1
-ZnNha2FkZW1pZSBTYWNoc2VuIC0gU3RhYXRsaWNoZSBTdHVkaWVuYWthZGVtaWUg
-RHJlc2RlbjEWMBQGA1UECxMNUmVjaGVuemVudHJ1bTFBMD8GA1UEAxM4QkEgU2Fj
-aHNlbiAtIFN0YWF0bGljaGUgU3R1ZGllbmFrYWRlbWllIERyZXNkZW4gQ0EgLSBH
-MDExKjAoBgkqhkiG9w0BCQEWG3JlY2hlbnplbnRydW1AYmEtZHJlc2Rlbi5kZTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukHfbYWeGkqEh5TOB8Hdpb
-tNoLq09LKT3kR01GOOWYcUN23RH4OsAlRL3ZBKCD3c30MxE2QTsYNy4pS9jdjn5r
-sUe6kyGn+WW59SPjPbbVUOQAjO+AD5qXaOFdAARLxgb4cPEBt8wppaPBsyABBvp2
-qxRc5ItV+5Z3CB3WE+r8IVctId07OHBF98ikQhLlTzV1bAD9nds1HjkResX0Dsja
-IzYEjqMzHf2Z56uqPJdfYZ2OIEwl7HGT1dTW40QEXdbSpsJT9napsuDl8Ud+Qvhw
-knLkEpKFUNVTRAM/b51Zc2xXSYnUj0Ks/6+t64vi5nuad6DS4/FgStpapM6R3j8C
-AwEAAaOCAggwggIEMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEG
-MBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQUwSb3v9+hEGCDdh47G60QzT+A
-fP8wHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwJgYDVR0RBB8wHYEb
-cmVjaGVuemVudHJ1bUBiYS1kcmVzZGVuLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3
-aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2Nh
-Y3JsLmNybDA9oDugOYY3aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9v
-dC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB1wYIKwYBBQUHAQEEgcowgccwMwYIKwYB
-BQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBH
-BggrBgEFBQcwAoY7aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1j
-YS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAy
-LnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0
-MA0GCSqGSIb3DQEBBQUAA4IBAQAYkPYZFKeKEXzWcMY59GYTDQEcoSmsAO8adDzr
-T72xZh19JQBGCFCYoFqaQDAEhZhVSKIXt0qITWbCGFMVwosAq0pgiGE8xA06LCH1
-ySITmHJiTYJlbK8OoECVmPXLuSqnty3KOSyfY2ExL9yF8HplggVnS8m284P5iOVO
-VV8dzi14YL3FbyNahm8hmx32fX3q2nwmlUk61eguWj48Hh7GGiKVlU8eABM9yDHb
-kW+YMnoalFyt2MUwhGPWkTOJAwtSxCueailTaPvEOgSljuSiu4R+BIaERD9NUnX7
-RMP2CIo9VtL1hLKAEcJAvEqysYnz5atANtU7DgRNbl5HJJ0Q
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDQyODA4NTQz
+N1oXDTE5MDcwOTAwMDAwMFowgdkxCzAJBgNVBAYTAkRFMUkwRwYDVQQKE0BIb2No
+c2NodWxlIGZ1ZXIgb2VmZmVudGxpY2hlIFZlcndhbHR1bmcgdW5kIEZpbmFuemVu
+IEx1ZHdpZ3NidXJnMTgwNgYDVQQLEy9aZW50cnVtIGZ1ZXIgTWVkaWVuIHVuZCBJ
+bmZvcm1hdGlvbnN0ZWNobm9sb2dpZTEgMB4GA1UEAxMXSFMgTHVkd2lnc2J1cmcg
+Q0EgLSBHMDExIzAhBgkqhkiG9w0BCQEWFGNhQGhzLWx1ZHdpZ3NidXJnLmRlMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmmzMI+R9I6zpgPnQqCHe+bM2
+exakIiWn7oEzQpfsLuOeTmbxiR556nG9cSGT9RlcZiWY/GF2dwE4wbq1UhFbD5bN
+qwrB9nhE+kkaDoVypnJEsO5hEMrFhn3PhoxBwlfvHEnQnYKcmAqUiW/4r3iVu7A8
+flBDDwywwogHP2v2wyHvJG7ynU+YvL8Z0Qh4a9ci0PvLkOEyKSlMcTlL9E7J94sM
+t0i2oPVXXEFU8LBhPqX2wSsIIJvoO844nXwCLvFBMUevzyFpW05+4sRcJNmy7MnW
+d4rbjtNN8i3BoJ5vl6FDCEp7Lf0ihnP8SY9pIBgaWmjMFKlI6aJfy9A4vuc+2wID
+AQABo4ICATCCAf0wEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYw
+EQYDVR0gBAowCDAGBgRVHSAAMB0GA1UdDgQWBBRB1dR/vu+6JrONZTPT6rHOFE5A
+/TAfBgNVHSMEGDAWgBRJt8bP6D0ff+pEexMp9/EKcD7eZDAfBgNVHREEGDAWgRRj
+YUBocy1sdWR3aWdzYnVyZy5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6Ly9j
+ZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5jcmww
+PaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzABhido
+dHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYBBQUH
+MAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2Nh
+Y2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2EuZGZu
+LmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG
+9w0BAQsFAAOCAQEAuWMIF/uvphuh+8aOWheI872h0knYAdp8jGYJHrS296wx9MPA
+IXKRrTakXhW0lbNMj58HeVptL1S6/3HQKwVn64+Mvjn5U2C1rzmLVJykmL0qjn1g
+pN+BT2nW20rvu6K95AzinRSt49Kka+0xYHEWCzNbkkwm2V8XJxZhBY+YDp+mox2I
+hHQfyBmubIG0pyQPxbOTMzF/tq8Q2dsgO0eiZbkKJO7i0Cbux+zLi580zT6WzBSe
+ibfQROjeQt3T+iyoWytBX7mNn66fk/6xp7bxEEuD55rFcsuVue5rA9iUCITGHe7+
+xSSys/w7eOln6R+Rmto2Jh+fcFQeK8EZozc6RQ==
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Sachsen/L=Leipzig/O=Helmholtz-Zentrum fuer Umweltforschung GmbH - UFZ/OU=WKDV/CN=Helmholtz-Zentrum fuer Umweltforschung GmbH - UFZ CA - G01/emailAddress=wkdv-pki@ufz.de
+serial=17A424ADA0F7B1
+-----BEGIN CERTIFICATE-----
+MIIFuzCCBKOgAwIBAgIHF6QkraD3sTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDUyNzE0NTQy
+MVoXDTE5MDcwOTIzNTkwMFowgeExCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdTYWNo
+c2VuMRAwDgYDVQQHEwdMZWlwemlnMTowOAYDVQQKEzFIZWxtaG9sdHotWmVudHJ1
+bSBmdWVyIFVtd2VsdGZvcnNjaHVuZyBHbWJIIC0gVUZaMQ0wCwYDVQQLEwRXS0RW
+MUMwQQYDVQQDEzpIZWxtaG9sdHotWmVudHJ1bSBmdWVyIFVtd2VsdGZvcnNjaHVu
+ZyBHbWJIIC0gVUZaIENBIC0gRzAxMR4wHAYJKoZIhvcNAQkBFg93a2R2LXBraUB1
+ZnouZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVIOCOrCHMqeV7
+/lAde0JypXb4DBI2L7+5YqPZOmZnTrenlwBVlf4e6K+SVRSJ77lQD9yjZwDVOSVj
+WvqOjszf+RHbJbQmqMQsomO8Ahfe8ee7SthgoGSIQBnyNG/gxj4N+P8ZRgOhlPZl
+s2kWq/869QUwmqIzPYUxrDRctsI3Fywa0T3ZNATvH4JQI/R5KXpjHAY/oEF6noJW
+N1Lgk6dDvPPBq8v9Vp0VtwStws0Ub7Uscuf7EHmXEMnuMyznCpa2xGIepBo+SHco
+r0kfZX53l56g8nr7dIeMVo2y4lzjsIHWFJbdxeIa2FQ3gy8Z1+6B2R3wrOE8vwlj
+9n1V+9EnAgMBAAGjggH8MIIB+DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB
+/wQEAwIBBjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFIzBJ6Dq6zDrZ5ob
+zajSMcY0wZ6oMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMBoGA1Ud
+EQQTMBGBD3drZHYtcGtpQHVmei5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0dHA6
+Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNybC5j
+cmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUFBzAB
+hidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYIKwYB
+BQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHVi
+L2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5wY2Eu
+ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkq
+hkiG9w0BAQsFAAOCAQEATOt7EOM2IPiLvVD9/K0T/tOK4TWnylmG1oR+BqsYpcK3
+OFNQjmHs0kbybAeoF9fqMt5gzxc1DIc+j72W8hlu5Kk3jmLOROReZDmC3pOYFdU/
+OyZiBJZvXx8hGHoHRCOOUmMd1Lqm9H6Au3W8Y71ixCFMUn5zfJ3ywZyVQ30fIcR2
+Z0XEtF7+HCT5tvlEXd+DAjbx3QyxAfu7B7IcA3opzfZ030taa9vt6KQimXR5rtG+
+rfGVnJ6c44rXwvfrBPAIlnv4mbdNi7jov6Z7ROy0DoExHGLL55AS1dg3IYlaj9+n
+JDCOR0vomILIKdgw0ubre+qHcIZ9ySVh/XLtr021pA==
+-----END CERTIFICATE-----
+
+subject= /C=DE/ST=Nordrhein-Westfalen/L=Hagen/O=FernUniversitaet in Hagen/OU=Zentrum fuer Medien und IT/CN=FernUniversitaet in Hagen Global CA/emailAddress=caadmin@fernuni-hagen.de
+serial=17AFF6B3C6803A
+-----BEGIN CERTIFICATE-----
+MIIFvjCCBKagAwIBAgIHF6/2s8aAOjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG
+EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG
+A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDUy
+NFoXDTE5MDcwOTIzNTkwMFowgdsxCzAJBgNVBAYTAkRFMRwwGgYDVQQIExNOb3Jk
+cmhlaW4tV2VzdGZhbGVuMQ4wDAYDVQQHEwVIYWdlbjEiMCAGA1UEChMZRmVyblVu
+aXZlcnNpdGFldCBpbiBIYWdlbjEjMCEGA1UECxMaWmVudHJ1bSBmdWVyIE1lZGll
+biB1bmQgSVQxLDAqBgNVBAMTI0Zlcm5Vbml2ZXJzaXRhZXQgaW4gSGFnZW4gR2xv
+YmFsIENBMScwJQYJKoZIhvcNAQkBFhhjYWFkbWluQGZlcm51bmktaGFnZW4uZGUw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDWoeDjX+fC3GP6YG9v8Asc
+MhFVcybiazXxLNbWGYZyvmibsPuh7TYUwh143Mm6/qCOfgaRBptGhf5E0bjAFMFf
+oWw+MpCAlnJu4R4NhSN12Wo5tpwoNGbdXHMu+bafdOAFpPbheYJMzzt05etuTzsb
+b9XgPgf7RzdGc3Zgauj1VAC2i9TlEaLXzzjJ/df8xq0hFoWdq23v+N/vf/oZbAeF
+7QScsxTpiG6gpI38swaLu5Q4mS5k0BJLaciQF2aF6ZGaTSEDbCqtyksNAoRV11um
+eUb8F9qXGi7rrabc5t3QDKL6oCavKRiEePK+NJGhZ6ItSMfNMI09Y3Sf+7ruojLX
+AgMBAAGjggIFMIICATASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIB
+BjARBgNVHSAECjAIMAYGBFUdIAAwHQYDVR0OBBYEFF6Tr5uosAx7B7/5iDR/cESX
+I5SfMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMCMGA1UdEQQcMBqB
+GGNhYWRtaW5AZmVybnVuaS1oYWdlbi5kZTCBiAYDVR0fBIGAMH4wPaA7oDmGN2h0
+dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2EvcHViL2NybC9jYWNy
+bC5jcmwwPaA7oDmGN2h0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3Qt
+Y2EvcHViL2NybC9jYWNybC5jcmwwgdcGCCsGAQUFBwEBBIHKMIHHMDMGCCsGAQUF
+BzABhidodHRwOi8vb2NzcC5wY2EuZGZuLmRlL09DU1AtU2VydmVyL09DU1AwRwYI
+KwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZ2xvYmFsLXJvb3QtY2Ev
+cHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMi5w
+Y2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDAN
+BgkqhkiG9w0BAQsFAAOCAQEAso/WihCkNVODyI1hCN34GnUWc9hJdazR+eNRMzgx
+dUQKNODr2ii6QQlzy7RUXkuq5kJIAMNculzOYC0bJeD2fCvH6YP8zNL5rFb0o572
+5cFS0xd4GFGmtwBL0sgyKMbwnNT3wETDV19QG2LOn6ZowZpoMnRqY06oo49GKSPN
++kdhCUTEnCaTlv2FHzoQi1L170cCu2/HA0duMjLMmQggk/HayOYuMrJqDgRSjTuj
+dOM8gar4TZbLpvSpBQX8VSrB45mKzvj/+EPPpavHP4FWUVvFxYMqK8T9qQm5SbkL
+Bagga6LiWRAgaCeEEQwMr1+zhIZnKp5HxXHuMGOZt1PUDA==
+-----END CERTIFICATE-----
+
+subject= /C=CN/O=WoSign CA Limited/CN=WoSign Class 3 OV Pro Server CA
+serial=0D0393F70CC882D1249C5F8B5A60AD1A
+-----BEGIN CERTIFICATE-----
+MIIFvzCCA6egAwIBAgIQDQOT9wzIgtEknF+LWmCtGjANBgkqhkiG9w0BAQUFADBV
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV
+BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw
+MTAwMDVaFw0yNDA4MDgwMTAwMDVaMFMxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX
+b1NpZ24gQ0EgTGltaXRlZDEoMCYGA1UEAxMfV29TaWduIENsYXNzIDMgT1YgUHJv
+IFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALrc6I8t
+bDuUf0gJ0Lila/1KSjKIyY7I35QDIAoisg66kTBB2hAc5E2NAUyIrqnYEJ4Ec6xF
+Mxmf/QjDKH2B8ueFDMxKQZ55mRkCxy5cYvKYT1cXlKfw8q5C/H6Af89Xsm88H+Gr
+/gWBpLquKLH9viBpAzqLg0gpZ4WoKIREujQQfaEIpG8b54TNw2vaRjjSa9PB0ZOq
+niZ68tNO3neeyR1Hs2vsM079htudKY5DQRx24Il30Ji/0jViwzeMDQHurMA/QIOd
+5hisTmXuGTb4vYni31sotYQNgHeTMv0xIQCd3BPCqDLLnq4OcmnYnPBpaAezcOY7
+O241ZJ3y8gq+KfcCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIBBjA0BgNVHSUE
+LTArBggrBgEFBQcDAgYIKwYBBQUHAwEGCisGAQQBgjcKAwMGCWCGSAGG+EIEATAS
+BgNVHRMBAf8ECDAGAQH/AgEAMDAGA1UdHwQpMCcwJaAjoCGGH2h0dHA6Ly9jcmxz
+MS53b3NpZ24uY29tL2NhMS5jcmwwcgYIKwYBBQUHAQEEZjBkMCcGCCsGAQUFBzAB
+hhtodHRwOi8vb2NzcDEud29zaWduLmNvbS9jYTEwOQYIKwYBBQUHMAKGLWh0dHA6
+Ly9haWExLndvc2lnbi5jb20vY2ExLWNsYXNzM3Atc2VydmVyLmNlcjAdBgNVHQ4E
+FgQUDVge/59kAr0reuFg9iMvIaHhpC4wHwYDVR0jBBgwFoAU4WbPDtHxs0u3BiAU
+/ocS1fb++z4wRQYDVR0gBD4wPDA6BgsrBgEEAYKbUQEDBDArMCkGCCsGAQUFBwIB
+Fh1odHRwOi8vd3d3Lndvc2lnbi5jb20vcG9saWN5LzANBgkqhkiG9w0BAQUFAAOC
+AgEAonThwJ/RWO3OXf/PehOCsiwp7FDw0jUZEOmCzAlwz/dsfJL/VwPuF5mqJdjO
+mhfllzj7M/odDObfU53wgw8dUTOfF7UKN6PC3PirIL4FPIvdDHNfXrgpPTnq8pZb
+ZZ/+UTaSHwFum70x0qe5EduSQZiKcOhz8bbcVBYAa6DZUSm36TZdL2oyqhEgJNVf
+iWEm94KFzPxig7jIWOZuqRdOLOtBD73V/3XEbk35rLsNqmMuys4OujipU37Vc9jO
+JNgrqkUjCXnVag2nV6oAWWXwGEWMDhCKwKShs/Y6pMrh5N2lIVhSi2Z5i+ovs9xL
+efkxOQ4wJfIOVCQX7fxF5X/UetAHspqR56d7YudLnPsa1X+ezrqxGDmMT83tW/8H
+hKvKhkumec6n/j27BJ1J0ed+Ywqwm/ADPHOnWXd1N4uZQZMEty8XGVXcNxVZBBfQ
+aZWTzaBTH0dgYNlSh1U6ciU5VRvbWEXbyH6HtVo0Dg98Ru+E/yT7RuO8e1Zce9/H
+mRwAa8QlmgTk9Z8BcN39o3Fj9wp35qRgENz6IhL1ef5MOC2UcKqcBsX8O+fyLxLf
+2tgfG2xRrkv+WDNyIuxgaSA5CfJwp3nz0sj8AMDWwAKH/x1oHgHKbc+1C1GVHj1B
+++O17yJ2sBmfI1VTY4FJZ4/d7JvqXyW5sUfHMvOBScCkWYA=
 -----END CERTIFICATE-----
 
 subject= /C=US/ST=GA/L=Atlanta/O=Southern Company Services, Inc./OU=Southern Company Services, Inc./CN=Southern Company External Issuing CA 1
@@ -26493,6 +31647,42 @@
 x4b22o02o6z4+keA4NAo8VuPonqM8lD+xGV6dcjsg7dyHMUh6dHA31apMxOAm4j+
 -----END CERTIFICATE-----
 
+subject= /C=US/O=Cisco Systems/CN=Cisco SSCA3
+serial=0A014142000001415C7FF11500000002
+-----BEGIN CERTIFICATE-----
+MIIFzDCCBLSgAwIBAgIQCgFBQgAAAUFcf/EVAAAAAjANBgkqhkiG9w0BAQUFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTEzMDkyNjIyNTk1MFoXDTE4MDkyNjIyNTk1MFow
+OzELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUNpc2NvIFN5c3RlbXMxFDASBgNVBAMT
+C0Npc2NvIFNTQ0EzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlPoD
+SU2Cp297a/eGs1+D9yh/5c7po+Yog/fNSvhoWxMfM2NxwiP9KxHAXFXEoCpySlG7
+KSU+lcfkEJeK0ZUHlPeuz3aSkihyETCObX8PSYslGhpRw2V5iEZNPKyVFsWC8BQN
+mGtffs7myzVBHTIHTgGdt27qsf+LI5M19bJPMs5Tih2+NhXOn5WL5V+JrTPHjCAg
+d2Qb7GjbBwUlSmA3UkXyvEmrhDIOm2k8q4oqMSYGn9Q/mc1KP448dLZExECr/wQj
+sP9Dh9bMcFRHD96bXu804wVICpsKPj9v7D5j04NfGCYJnRa9B7zUu5HbS5yZJQza
+WU/6lL/QgK2ut9pcwwIDAQABo4ICxjCCAsIwDgYDVR0PAQH/BAQDAgGGMBIGA1Ud
+EwEB/wQIMAYBAf8CAQAwXAYDVR0gBFUwUzBRBgorBgEEAQkVAQECMEMwQQYIKwYB
+BQUHAgEWNWh0dHA6Ly93d3cuY2lzY28uY29tL3NlY3VyaXR5L3BraS9wb2xpY2ll
+cy9pbmRleC5odG1sMB0GA1UdDgQWBBQs7Nc+ytYnADiWO5k0x7dhIKIg7zCBuQYD
+VR0fBIGxMIGuMC6gLKAqhihodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9P
+VENBWDMuY3JsMHygeqB4hnZsZGFwOi8vbGRhcC5pZGVudHJ1c3QuY29tL2NuPURT
+VCUyMFJvb3QlMjBDQSUyMFgzLG89RGlnaXRhbCUyMFNpZ25hdHVyZSUyMFRydXN0
+JTIwQ28uP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q7YmluYXJ5MIHuBggrBgEF
+BQcBAQSB4TCB3jAnBggrBgEFBQcwAYYbaHR0cDovL29jc3B0cy5pZGVudHJ1c3Qu
+Y29tMDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1c3QuY29tL3Jvb3Rz
+L0RTVFJPT1RDQVgzLmNlcjB2BggrBgEFBQcwAoZqbGRhcDovL2xkYXAuaWRlbnRy
+dXN0LmNvbS9jbj1EU1QlMjBSb290JTIwQ0ElMjBYMyxvPURpZ2l0YWwlMjBTaWdu
+YXR1cmUlMjBUcnVzdCUyMENvLj9jQUNlcnRpZmljYXRlO2JpbmFyeTBRBgNVHSUE
+SjBIBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMFBggrBgEFBQcDBgYIKwYB
+BQUHAwcGCCsGAQUFBwMJBgorBgEEAYI3FAIBMB8GA1UdIwQYMBaAFMSnsaR7LHH6
+2+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQBxJm5cX+ycKv/K7yAzFn42
++oQiM8I45792oPjYgoDYUwtc3sZ1/7Di3fglRHwvC1RHhD+h0LV705OSA04DY2FX
+NISmsPTcJH3VbOS3VAwV0jLzygtcc5/fbC/hX/PoYWHa6Mk+4T40i5Aw0wjQ8dqi
+q0AUdF8ETFTfM4Yk3Ns1AmGAznqU1qdtFZmre12fShW0mu804suOtBwHhjzbBesN
+D+3izTYCp0rj//vNHbUy500hGsDGN78LU96nwWXNEOCwHL1RIPXJqY6iq2J6GUpM
+syYPde6JtrC9VapvGknb6X3/XyuH8f/ygZf/WFzxMthTkjVawSiisAyK4NVjVREM
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=TC TrustCenter GmbH/OU=TC TrustCenter Class 3 L1 CA/CN=TC TrustCenter Class 3 L1 CA IX
 serial=3D43000100025AF05432D1A20B3A
 -----BEGIN CERTIFICATE-----
@@ -26530,80 +31720,6 @@
 e9wiwiZKTCjOohE=
 -----END CERTIFICATE-----
 
-subject= /C=TR/O=Elektronik Bilgi Guvenligi A.S./CN=e-Guven Nitelikli Elektronik Sertifika Hizmet Saglayicisi
-serial=E59B05B9BA27A90B0F77F8788DDCA343
------BEGIN CERTIFICATE-----
-MIIF2DCCBMCgAwIBAgIRAOWbBbm6J6kLD3f4eI3co0MwDQYJKoZIhvcNAQEFBQAw
-dTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kgR3V2ZW5s
-aWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsgU2VydGlm
-aWthIEhpem1ldCBTYWdsYXlpY2lzaTAeFw0wNzAxMDQxMTQ3NTJaFw0xNjEyMDQx
-MTM1NTJaMHsxCzAJBgNVBAYTAlRSMSgwJgYDVQQKEx9FbGVrdHJvbmlrIEJpbGdp
-IEd1dmVubGlnaSBBLlMuMUIwQAYDVQQDEzllLUd1dmVuIE5pdGVsaWtsaSBFbGVr
-dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FnbGF5aWNpc2kwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCeKO3MARYSTocR2S2Umb0LOkRaWF8VlkObtPBi
-WwODoebHBd3UeKD2FDeJDUcisAbQQ4ZpUoBCmSMLfeEOxyG7b4IojCGXloBX+PRW
-AlHXXx8GaM5pnvU9wIRXKeA87xCa+1yTm94f0aJDE8EgX4ozAm3eXRyBGPL6jgUe
-Oc7Ws3AXr1BMKvapXWUO+h3IewP75rdQU5DttJphUTbcWZ8o41hL+WrMztozaf1U
-EXZ6j9XfRWU1tVloiFcnqQH5xY4j1aAeU/a3231C11+PJdmEaVp1cJpZJdr0MqjJ
-wjnepWHbGA6Md6jRKfgKWkqkUD+MdNrG1HhpHSDpu81hvhTHAgMBAAGjggJbMIIC
-VzB1BggrBgEFBQcBAQRpMGcwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwMi5lLWd1
-dmVuLmNvbS9vY3NwLnh1ZGEwNQYIKwYBBQUHMAKGKWh0dHA6Ly93d3cuZS1ndXZl
-bi5jb20vZG9jdW1lbnRzL0tPSzIuY3J0MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
-Af8EBTADAQH/MIIBJQYDVR0gBIIBHDCCARgwggEUBglghhgDAAEBAgEwggEFMDYG
-CCsGAQUFBwIBFipodHRwOi8vd3d3LmUtZ3V2ZW4uY29tL2RvY3VtZW50cy9ORVNV
-RS5wZGYwgcoGCCsGAQUFBwICMIG9HoG6AEIAdQAgAHMAZQByAHQAaQBmAGkAawBh
-ACAAaQBsAGUAIABpAGwAZwBpAGwAaQAgAHMAZQByAHQAaQBmAGkAawBhACAAdQB5
-AGcAdQBsAGEAbQBhACAAZQBzAGEAcwBsAGEAcgExAG4BMQAgAG8AawB1AG0AYQBr
-ACAAaQDnAGkAbgAgAGIAZQBsAGkAcgB0AGkAbABlAG4AIABkAG8AawD8AG0AYQBu
-ATEAIABhAOcBMQBuATEAegAuMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9zaWwu
-ZS1ndXZlbi5jb20vRWxla3Ryb25pa0JpbGdpR3V2ZW5saWdpQVNSb290L0xhdGVz
-dENSTC5jcmwwHwYDVR0jBBgwFoAUn+5Es5TV+pFPLtlVmgRW2y3E26UwHQYDVR0O
-BBYEFON4rWvbwLxRhx5IF35ew5u+oPfrMA0GCSqGSIb3DQEBBQUAA4IBAQANIlpG
-ovl2fXjm19DersJMkSzCzelqins88kJULbQMzHAenXIAjvohS4sJRhlM7Nabvi4f
-uf6FobfdZSuvE+CxwK/QvJ5FGj3SftLo27ambf6iq+SUd++9pos9wuFj+jNjoxhK
-8C0fHU2/odkoZ++viU/BWAdQ0TDaGM/J+DYTV4TRJr8JVi7ygFYN0S4c/Xnw4ktK
-Iw51YvUcDvFp/mntLXRB1MkH1iNna87D21JrST9oMuw5oEWPd0n4eurB+1gOQ3Fp
-NHUW5YHkOdUm+psL3nxAcCaqOlSQiye5tVQPFT3+Y/5ORUgqJXIv8sDiDIm+wSE3
-tdlvzBKrP1f/TbhH
------END CERTIFICATE-----
-
-subject= /CN=Managed Device CA/OU=ATT Wi-Fi Services/O=ATT Services Inc/C=US
-serial=04E6B0BF6A0A74FD
------BEGIN CERTIFICATE-----
-MIIF2jCCBMKgAwIBAgIIBOawv2oKdP0wDQYJKoZIhvcNAQEFBQAwfTE2MDQGA1UE
-AwwtQVRUIFdpLUZpIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-MRswGQYDVQQLDBJBVFQgV2ktRmkgU2VydmljZXMxGTAXBgNVBAoMEEFUVCBTZXJ2
-aWNlcyBJbmMxCzAJBgNVBAYTAlVTMB4XDTExMTAxOTE4NDczOVoXDTIxMTAxODE4
-NDczOVowYTEaMBgGA1UEAwwRTWFuYWdlZCBEZXZpY2UgQ0ExGzAZBgNVBAsMEkFU
-VCBXaS1GaSBTZXJ2aWNlczEZMBcGA1UECgwQQVRUIFNlcnZpY2VzIEluYzELMAkG
-A1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVoLihtXBi
-UWkzrnvNdxLR3kRFCMb7hQkkBFQe4uOZ4rAlBiNuqEdYI2xHMhXDhE20A34FVUbI
-brQbazg8zpTaNyH+d4cbSdlajgkAT3Dqi54kGU9fU8GY2e8qJLGvkUNv9EVPSAl/
-XbHbORkmnj0zeUaMHeh3eDKC9DLE8wjlrYBi+vlQ1ve/jGqcU8j/z96WThACTJ5p
-kD4Z4PgxEpJWusZs5EMGbn4Ns9m35S/ntOruKVPOPdS6dVSBCqGASSj9Yk58/Jtg
-XKgr18AY0nNn8prx3bE4WMcomuXSB9gN7hD//P5WpkF+kGdz2y1NDT7GE/CUcCWk
-JDLF6B3LYYjvAgMBAAGjggJ4MIICdDBqBggrBgEFBQcBAQReMFwwMQYIKwYBBQUH
-MAKGJWh0dHA6Ly9jcmwucGtpLndheXBvcnQubmV0L3Jvb3RjYS5jcnQwJwYIKwYB
-BQUHMAGGG2h0dHA6Ly9vY3NwLnBraS53YXlwb3J0Lm5ldDAdBgNVHQ4EFgQUWGeX
-MAwerSLyco+t6ks/u9X4zLwwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAW
-gBTPSQPfu4RwQK2N9aJ7NUYFRR6u5zCB4QYDVR0gBIHZMIHWMIHEBgsrBgEEAaNI
-g30BATCBtDCBgAYIKwYBBQUHAgIwdB5yAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABj
-ACkAIAAyADAAMQAxACAAQQBUAFQAIABXAGkALQBGAGkAIABTAGUAcgB2AGkAYwBl
-AHMAIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkMC8GCCsG
-AQUFBwIBFiNodHRwOi8vY3JsLnBraS53YXlwb3J0Lm5ldC9jcHMuaHRtbDANBgsr
-BgEEAaNIg30BAjCBvQYDVR0fBIG1MIGyMIGvoCmgJ4YlaHR0cDovL2NybC5wa2ku
-d2F5cG9ydC5uZXQvcm9vdGNhLmNybKKBgaR/MH0xNjA0BgNVBAMMLUFUVCBXaS1G
-aSBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eTEbMBkGA1UECwwS
-QVRUIFdpLUZpIFNlcnZpY2VzMRkwFwYDVQQKDBBBVFQgU2VydmljZXMgSW5jMQsw
-CQYDVQQGEwJVUzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAGKg
-yJFvOTQhI8tcmSr0OvLBtuay7Z1ZXmZJTBj1EIUaw4jY98e1KZKSaQF5TEy4VmcA
-YrrItYL7FUj7RJr8Eu9GiV0u54Pho+BoU559yZHoyp+Alzz8PdBFZsGUj1JjQXLm
-9udNOwttotEUGqNeLpBjueueXY1TwKq2jgR1KHqneFdBzMeX0KXC0KABnwIL5xX2
-FQX9tKNhGXtUgloGDVWXHNJGGXsKZXbzkt1UNDKFiBQ/DReFN9ipTuYUJFwBcr6U
-ZL8ZYU8waUPxMtGkQTfvvBIUk8vA7rTbePOpRhL9pYW2cVDBnl+BlGE1GWLUP9QH
-VBCnuuXeV4cTGnUmsbA=
------END CERTIFICATE-----
-
 subject= /C=ES/emailAddress=ca1@firmaprofesional.com/L=C/ Muntaner 244 Barcelona/OU=Consulte http://www.firmaprofesional.com/OU=Jerarquia de Certificacion Firmaprofesional/O=Firmaprofesional S.A. NIF A-62634068/CN=AC Firmaprofesional - CA1
 serial=533015E09A9EB866
 -----BEGIN CERTIFICATE-----
@@ -26678,6 +31794,43 @@
 LYeKy8z9lQXkXBBpnStGGsg=
 -----END CERTIFICATE-----
 
+subject= /C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT SSL SHA2
+serial=0727AA47
+-----BEGIN CERTIFICATE-----
+MIIF4TCCBMmgAwIBAgIEByeqRzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE0MDUwNzE3MDQwOVoX
+DTE4MDUwNzE3MDMzMFowgYsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
+dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
+YXRpb24xFTATBgNVBAsTDE1pY3Jvc29mdCBJVDEeMBwGA1UEAxMVTWljcm9zb2Z0
+IElUIFNTTCBTSEEyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0eg3
+p3aKcEsZ8CA3CSQ3f+r7eOYFumqtTicN/HJq2WwhxGQRlXMQClwle4hslAT9x9uu
+e9xKCLM+FvHQrdswbdcaHlK1PfBHGQPifaa9VxM/VOo6o7F3/ELwY0lqkYAuMEnA
+iusrr/466wddBvfp/YQOkb0JICnobl0JzhXT5+/bUOtE7xhXqwQdvDH593sqE8/R
+PVGvG8W1e+ew/FO7mudj3kEztkckaV24Rqf/ravfT3p4JSchJjTKAm43UfDtWBpg
+lPbEk9jdMCQl1xzrGZQ1XZOyrqopg3PEdFkFUmed2mdROQU6NuryHnYrFK7sPfkU
+mYsHbrznDFberL6u23UykJ5jvXS/4ArK+DSWZ4TN0UI4eMeZtgzOtg/pG8v0Wb4R
+DsssMsj6gylkeTyLS/AydGzzk7iWa11XWmjBzAx5ihne9UkCXgiAAYkMMs3S1pbV
+S6Dz7L+r9H2zobl82k7X5besufIlXwHLjJaoKK7BM1r2PwiQ3Ov/OdgmyBKdHJqq
+qcAWjobtZ1KWAH8Nkj092XA25epCbx+uleVbXfjQOsfU3neG0PyeTuLiuKloNwnE
+OeOFuInzH263bR9KLxgJb95KAY8Uybem7qdjnzOkVHxCg2i4pd+/7LkaXRM72a1o
+/SAKVZEhZPnXEwGgCF1ZiRtEr6SsxwUQ+kFKqPsCAwEAAaOCAXswggF3MBIGA1Ud
+EwEB/wQIMAYBAf8CAQAwYAYDVR0gBFkwVzBIBgkrBgEEAbE+AQAwOzA5BggrBgEF
+BQcCARYtaHR0cDovL2N5YmVydHJ1c3Qub21uaXJvb3QuY29tL3JlcG9zaXRvcnku
+Y2ZtMAsGCSsGAQQBgjcqATBCBggrBgEFBQcBAQQ2MDQwMgYIKwYBBQUHMAGGJmh0
+dHA6Ly9vY3NwLm9tbmlyb290LmNvbS9iYWx0aW1vcmVyb290MA4GA1UdDwEB/wQE
+AwIBhjAnBgNVHSUEIDAeBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMJMB8G
+A1UdIwQYMBaAFOWdWTCCR1jMrPoIVDaGezq1BE3wMEIGA1UdHwQ7MDkwN6A1oDOG
+MWh0dHA6Ly9jZHAxLnB1YmxpYy10cnVzdC5jb20vQ1JML09tbmlyb290MjAyNS5j
+cmwwHQYDVR0OBBYEFFGvJCac9GgiV4AmKztGYhV7HsylMA0GCSqGSIb3DQEBCwUA
+A4IBAQBpYvaEkQDEb4J7JOFCoqWLglynxUTL51J2Y9N2nnjiaTWxOLqwlsYfrHvG
+smV3i32NrmS5pYwXylhlw62C9cWi9QETk8Z+ROXEYfoDtlbBcuHIKMVpIY+sbv1/
+Q4M2uMDWoCj+GkW+/ZOMjaRkeR8U26GfIdzATnsXIhextjzTm+IKo36ZsMGs2PSG
+3zzafRScQMF80hhv8U8mRQmVlFza0Jj49EyClhDerDDLK675kuq/eQP8Hj+sCaQ/
+Zf2RT5Ykp860TmqWKReuwKjfFyL0F+PcHDkGVhDq6rV0FzxO3X6RCqgLeAenMUQI
+MasYhA8SnOfehCzpbZNFv6jBPzTc
+-----END CERTIFICATE-----
+
 subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)06/CN=VeriSign Class 3 Extended Validation SSL CA
 serial=5B7759C61784E15EC727C0329529286B
 -----BEGIN CERTIFICATE-----
@@ -26752,6 +31905,80 @@
 t72MVoE9o7bjhPFLc4C2u3jnaFUxjdmmBzk=
 -----END CERTIFICATE-----
 
+subject= /C=US/O=SSL.com/OU=www.ssl.com/CN=SSL.com DV CA
+serial=1100C5BF2758C19969FC68ED729DFCD7
+-----BEGIN CERTIFICATE-----
+MIIF5jCCA86gAwIBAgIQEQDFvydYwZlp/Gjtcp381zANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQw
+NzA0MDAwMDAwWhcNMjQwNzAzMjM1OTU5WjBNMQswCQYDVQQGEwJVUzEQMA4GA1UE
+ChMHU1NMLmNvbTEUMBIGA1UECxMLd3d3LnNzbC5jb20xFjAUBgNVBAMTDVNTTC5j
+b20gRFYgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAJEcVY7NR
+2qmRMLzC17tObKov3Jf1AQLOfZRfCi26JM4lYzJoW7uMO6RSwBJeP6pSBYthSWLc
+R+zd0bsQW5xKGITX51HYBH3daGWQEJIWVfL59cw3qhRsMQ5XP/IMZ15BOUxqGRVV
+7NnCBBVcrWVhrEqSZbM6o61lMBU3sQQlYep/Ie3Ce6ca8oWfX5h4hrWtxuRCiBB4
+EjxMB5KYOKJnQaOLEXaRhgr8cNHhzjl2KrKx/tCMtR/9pqy/+dOCKDiQWkg+hBoT
+D/hGc/B3x7KfHAbdLJTPrRdJrFnSwMWwPcrWGIrrud3w5VxzXBjPAzQn7Dg/hpGB
+NHEHBwKsLER3AgMBAAGjggGEMIIBgDAfBgNVHSMEGDAWgBRTeb9aqitKz1SA4dib
+wJ3ysgNmyzAdBgNVHQ4EFgQURpr9/FFefFRTUuKZ47My75Maf1YwDgYDVR0PAQH/
+BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
+CCsGAQUFBwMCMCEGA1UdIAQaMBgwDAYKKwYBBAGCqTABATAIBgZngQwBAgEwVQYD
+VR0fBE4wTDBKoEigRoZEaHR0cDovL2NybC50cnVzdC1wcm92aWRlci5jb20vVVNF
+UlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwgYAGCCsGAQUFBwEB
+BHQwcjBEBggrBgEFBQcwAoY4aHR0cDovL2NydC50cnVzdC1wcm92aWRlci5jb20v
+VVNFUlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwKgYIKwYBBQUHMAGGHmh0dHA6Ly9v
+Y3NwLnRydXN0LXByb3ZpZGVyLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAB1RJZUdF
+d05ZN1SYdTZsDj9Rq9De097SCCWi0E97Ehc2MRQag98VqlZPrC2WM9q+C7Z5MvcM
+1njs15p55YRJbHjjECgiabKEPsx3xXH+oTb4kKzQjqMZV5CNC7K+5H4OaCtNcFEZ
+E2vWRI9hunFjTfTJ9VrKjGIwcYz30VtdB1vtk0Jaf0lnC4H1GOAdw3IwJgbygOeu
+ACY/1RH5U0ai2e9wWXsiADjBtHbiFPEzt5Cmu2wag9fPrX663Xs5TqjDNCPAgCLm
+ijzyrCQmlCaug332cwnYI5dA0Oa/eIV6lYZTev143bZWs+A6dQhXDJUQzfSvPsQS
+Pu/W3QAkw4vuZ97mVvgzK5LiDWps2N9Fw9b5Et4Op+cuy27I48fG3bRH0dROJwYs
+w+MrMc5Sy/TOl9a5UUmtq2jEJbEv7xU5x1bvhaFfBtxoF36sLLuPf19Aev4n2Y46
+Fou4Aup1eWVyS+XYKiaTGzxL5b4fbwhKItk8NptdrJ26YmdCl6cFNaabXHHak24W
+I0cF4+u8ATOxkdFkuLyWusWzfmfIMHX1ZHD3giYavooNnupzxnju58Tpc9AsCgyL
+rRxTbur5AscjOsHHfzeeTqflKtslTvJ9AvNkPLizR2cMk4+1h+6yDBHggsm0bZn0
+AeY5kXGfjIimFcd00xvjkVn41em3We1sghs=
+-----END CERTIFICATE-----
+
+subject= /C=FR/ST=Paris/L=Paris/O=Gandi/CN=Gandi Standard SSL CA 2
+serial=05E4DC3B9438AB3B8597CBA6A19850E3
+-----BEGIN CERTIFICATE-----
+MIIF6TCCA9GgAwIBAgIQBeTcO5Q4qzuFl8umoZhQ4zANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQw
+OTEyMDAwMDAwWhcNMjQwOTExMjM1OTU5WjBfMQswCQYDVQQGEwJGUjEOMAwGA1UE
+CBMFUGFyaXMxDjAMBgNVBAcTBVBhcmlzMQ4wDAYDVQQKEwVHYW5kaTEgMB4GA1UE
+AxMXR2FuZGkgU3RhbmRhcmQgU1NMIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQCUBC2meZV0/9UAPPWu2JSxKXzAjwsLibmCg5duNyj1ohrP0pIL
+m6jTh5RzhBCf3DXLwi2SrCG5yzv8QMHBgyHwv/j2nPqcghDA0I5O5Q1MsJFckLSk
+QFEW2uSEEi0FXKEfFxkkUap66uEHG4aNAXLy59SDIzme4OFMH2sio7QQZrDtgpbX
+bmq08j+1QvzdirWrui0dOnWbMdw+naxb00ENbLAb9Tr1eeohovj0M1JLJC0epJmx
+bUi8uBL+cnB89/sCdfSN3tbawKAyGlLfOGsuRTg/PwSWAP2h9KK71RfWJ3wbWFmV
+XooS/ZyrgT5SKEhRhWvzkbKGPym1bgNi7tYFAgMBAAGjggF1MIIBcTAfBgNVHSME
+GDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUs5Cn2MmvTs1hPJ98
+rV1/Qf1pMOowDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD
+VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCIGA1UdIAQbMBkwDQYLKwYBBAGy
+MQECAhowCAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNl
+cnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNy
+bDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRy
+dXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZ
+aHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAWGf9
+crJq13xhlhl+2UNG0SZ9yFP6ZrBrLafTqlb3OojQO3LJUP33WbKqaPWMcwO7lWUX
+zi8c3ZgTopHJ7qFAbjyY1lzzsiI8Le4bpOHeICQW8owRc5E69vrOJAKHypPstLbI
+FhfFcvwnQPYT/pOmnVHvPCvYd1ebjGU6NSU2t7WKY28HJ5OxYI2A25bUeo8tqxyI
+yW5+1mUfr13KFj8oRtygNeX56eXVlogMT8a3d2dIhCe2H7Bo26y/d7CQuKLJHDJd
+ArolQ4FCR7vY4Y8MDEZf7kYzawMUgtN+zY+vkNaOJH1AQrRqahfGlZfh8jjNp+20
+J0CT33KpuMZmYzc4ZCIwojvxuch7yPspOqsactIGEk72gtQjbz7Dk+XYtsDe3CMW
+1hMwt6CaDixVBgBwAc/qOR2A24j3pSC4W/0xJmmPLQphgzpHphNULB7j7UTKvGof
+KA5R2d4On3XNDgOVyvnFqSot/kGkoUeuDcL5OWYzSlvhhChZbH2UF3bkRYKtcCD9
+0m9jqNf6oDP6N8v3smWe2lBvP+Sn845dWDKXcCMu5/3EFZucJ48y7RetWIExKREa
+m9T8bJUox04FB6b9HbwZ4ui3uRGKLXASUoWNjDNKD/yZkuBjcNqllEdjB+dYxzFf
+BT02Vf6Dsuimrdfp5gJ0iHRc2jTbkNJtUQoj1iM=
+-----END CERTIFICATE-----
+
 subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 Extended Validation CA - T1
 serial=33F5AE11193083147E5B66F31FED1129
 -----BEGIN CERTIFICATE-----
@@ -26863,78 +32090,41 @@
 u/Nv9F+PAbbS4dM1+2YYBPxAogrYHjX0n/AjoXKkZZlV
 -----END CERTIFICATE-----
 
-subject= /C=CO/O=Sociedad Cameral de Certificaci\xC3\xB3n Digital - Certic\xC3\xA1mara S.A./CN=AC Subordinada Certic\xC3\xA1mara S.A.
-serial=3B49D0C8AA190CEC482DFF8889EC5373
+subject= /C=ES/O=IZENPE S.A./CN=Izenpe.com
+serial=06E846272F1F0A8FD1845CE369F6D5
 -----BEGIN CERTIFICATE-----
-MIIF8TCCA9mgAwIBAgIQO0nQyKoZDOxILf+IiexTczANBgkqhkiG9w0BAQUFADB7
-MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0
-aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMuQS4xIzAhBgNVBAMM
-GkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMB4XDTA4MDUxNjIxNDEyOFoXDTMw
-MDQwMTIxNDIwMlowgYExCzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBD
-YW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEg
-Uy5BLjEpMCcGA1UEAwwgQUMgU3Vib3JkaW5hZGEgQ2VydGljw6FtYXJhIFMuQS4w
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqWmJlRbI8z46Fpnwvy2jJ
-PMEtxjS+H/DfZgwXz6BSFmx3QlfZSvqBspkjFSE6oYogZUXyrXhpel8u8RPmtArB
-AV8zlwht9HDlKYZ0yFY3NCsa0bGIp/xTtmXv5c/mblSamXqrfeBU6RmfzJUoDrVt
-cT90mL3zRwd2Yb6knphOG5FvjQQ6PRhf213yd7709GwfEuarOjCjxE6RGXJfLUtc
-swOUoah6Q/swm/2UxO2vKDI72ZPwOj/i9KgADD4vwgqbwOhtn6knNiGIOIhmkc9K
-kX/lZvAkmmdnR2CrpRBJM+lDbJecYcJUFwqAvmutZD877K/PcH5YDwnXaH4k2RNt
-AgMBAAGjggFoMIIBZDASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUz8POxxPBHLNpqsU1X0+kQdOiuI8wHwYDVR0jBBgwFoAU0QnQ
-6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0gADCBiTArBggr
-BgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
-BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlm
-aWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMFsGA1UdHwRUMFIw
-UKBOoEyGSmh0dHA6Ly93d3cuY2VydGljYW1hcmEuY29tL3JlcG9zaXRvcmlvcmV2
-b2NhY2lvbmVzL2FjX3JhaXpfY2VydGljYW1hcmEuY3JsMA0GCSqGSIb3DQEBBQUA
-A4ICAQBh1T/Hb8SkzLz19TXboDB+gB6DV8ehSBMBc8blB9B9VIc9aM2waq3/ZopV
-ycdSP8T4w+nS7VsJ4OOVIzL3bo5Hrzi6aRFQidqH9fd1zL7JC4fj64E/zQ0RbJgm
-8epjwh2wSyuNfbknksYRfmkBCaeTkzt9H1jga34IX8oAn5mkx8Zl4oAKZaMGt3bV
-B8rkwk8T+6KU8irVX8/WnYRT2APjML6m5taswVSGJTJ8b7z42pESUyLDnUW/uO2L
-EHiCgpzdehCd/rMGLP9oWVg1dHHS8/KYZdenwPmVNk9r1BiBF5pgtMKJnwiVaDHa
-KrPcl3CXIpe7qfdUny6Tojp4ZfuewhpX79XkcFJcV3XNEaxjz0kRIlwgOH25q3u+
-oRIwmxzfjTJfB6IguJJDvNwIjjaf0s5WwO0Z/En0NOQR+0YPGw47y/lj4GPOgpLK
-0sWx6hsMpTbRwnHV+/NggniD+yhek+yio4sH08PvgNHgQ56RJ5YIOkrLmkPZf3SC
-ekrgsSKK8BKRcXjSe48xYUz9nik0BFi5o8/aFKZ7xVj9vF63F9g27G4BF19aJD+a
-Ouc4dkodJwIt33M39ayhs9x2mp8PyAMqYXcEFBrZU2XcOKcpgs/+ImMKB+YwRPpq
-9Wi6p+3OBwzJgghQG4U0MkgqkFv3svYHI3zGgx/nmF8yCBoAHQ==
------END CERTIFICATE-----
-
-subject= /O=Gracenote Inc/CN=Gracenote Root CA
-serial=040000000001281FCE1AA2
------BEGIN CERTIFICATE-----
-MIIF9TCCBN2gAwIBAgILBAAAAAABKB/OGqIwDQYJKoZIhvcNAQELBQAwcTEoMCYG
-A1UEAxMfR2xvYmFsU2lnbiBSb290U2lnbiBQYXJ0bmVycyBDQTEdMBsGA1UECxMU
-Um9vdFNpZ24gUGFydG5lcnMgQ0ExGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
-CzAJBgNVBAYTAkJFMB4XDTEwMDQyMTEwMDAwMFoXDTIwMDQyMTEwMDAwMFowNDEW
-MBQGA1UECgwNR3JhY2Vub3RlIEluYzEaMBgGA1UEAwwRR3JhY2Vub3RlIFJvb3Qg
-Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCFJUL1KEXLvSLHn3tC
-MCunKCLGC6yIOvXh5fQeFlPaUecIUnXt/knGAnQlbHIwbP58e56jv8XjA9Lnb0rf
-QlJDs71+4BuZsvXTUCXs8GrTYM42sisVhysNddGBFq/efSm667u7FkJfQdAGJ15s
-8bj5dR2je83N6KQsEKo4f2OY9u8uz5oc2PX8pMOOpnR3GbW6mHG22HF+rzIdhBiO
-fAhwktMj92sVMBewSUse6esgDB1za+rBrQ03alOR8V1IFJT9ZkL8pAaPWWBJjP2H
-R4pqRR0ZXm3zgTNjZhkXn40PXEmpI8DoeE7nzDjuke7qNNAzy2rB18Zad7fgEuyg
-SuaNws/fqY7APPL5dd+VTLS2ogvm9rXX+5Bs/haKyXcpczTjCH3xxtiQieY6GJf3
-qyNgFPJ68E3LkW/JXXOe/mHqMzQober3/K/Jx+WHyvEP0/7mv/tUR5lRgozdIh3y
-ae/Ds/esDgMiRhmAWoM9uXgUHATOEnbVy5kLlObHI95hWzN8w64tE701yhGi8VQ0
-GqKljqUWI2XZ+cEn8DlyxY2XO+zcqmjo5b//R0F0GdZI5O9sp24sW0PPWVQL30yu
-itK0upDnuPiLe9QnycuX14S6d8X8qAU5vryu38p+roIV4ZD72Gqef52Q+KrZu0nw
-1PRznPoZ20XTQZ0j/P0BtYcCYQIDAQABo4IByTCCAcUwDgYDVR0PAQH/BAQDAgGG
-MBIGA1UdEwEB/wQIMAYBAf8CAQIwHQYDVR0OBBYEFHbYyJcy6yF4oab5ZmURIDOn
-jiwgMIHEBgNVHSAEgbwwgbkwQAYJKwYBBAGgMgE8MDMwMQYIKwYBBQUHAgEWJWh0
-dHA6Ly93d3cuZ2xvYmFsc2lnbi5uZXQvcmVwb3NpdG9yeS8wRQYMKwYBBAGCkgWD
-fQEBMDUwMwYIKwYBBQUHAgIwJxolaHR0cDovL3d3dy5ncmFjZW5vdGUuY29tL3Br
-aS9jcHMuaHRtbDAOBgwrBgEEAYKSBYN9AQIwDgYMKwYBBAGCkgWDfQEDMA4GDCsG
-AQQBgpIFg30BBDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmdsb2JhbHNp
-Z24ubmV0L1Jvb3RTaWduUGFydG5lcnMuY3JsMFcGCCsGAQUFBwEBBEswSTBHBggr
-BgEFBQcwAoY7aHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLm5ldC9jYWNlcnQvUm9v
-dFNpZ25QYXJ0bmVycy1SMS5jcnQwHwYDVR0jBBgwFoAUVoTstXGl52PY21EE1vrm
-8EhSSc4wDQYJKoZIhvcNAQELBQADggEBAEM0vp0whVd885jiMZu8Dg4HQXqHDsPF
-fA5412E6b0uvdUCTl9BJ6ILF0iK4xYJnGEK4+OZxnJ0mKKeJU//bq4oOM7M8WzWR
-DGxKpYIaNJZ3fSEURxGwEY5LfXPKwwPgRVoPny1G3kULabQRBqmNPTeYOWGpp6oB
-sS8uKG2QztwnOpEdUga8qA/ePIg2Gr5VsiYOAZ+6YiTmV22g5SPiCBiDn/hlqH0I
-PfvdNLwfEndVuX1mE6FCI7N4M2q4qndaOB2yjMg+ZSv64D+9MjwxiZhudoXzbqMn
-9qgJcXsjIA2BwOGHuJm8aHPfMZg60zUaxiWbC54V7stGJX3OmrJMh/c=
+MIIF8DCCA9igAwIBAgIPBuhGJy8fCo/RhFzjafbVMA0GCSqGSIb3DQEBBQUAMDgx
+CzAJBgNVBAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXpl
+bnBlLmNvbTAeFw0wNzEyMTMxMzA4MjdaFw0zNzEyMTMwODI3MjVaMDgxCzAJBgNV
+BAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXplbnBlLmNv
+bTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMnTesoPHqynhugWZWqx
+whtFMnGV2f4QW8yv56V5AY+Jw8ryVXH3d753lPNypCxE2J6SmxQ6oeckkAoKVo7F
+2CaU4dlI4S0+2gpy3aOZFdqBoof0e24md4lYrdbrDLJBenNubdt6eEHpCIgSfocu
+ZhFjbFT7PJ1ywLwu/8K33Q124zrX97RovqL144FuwUZvXY3gTcZUVYkaMzEKsVe5
+o4qYw+w7NMWVQWl+dcI8IMVhulFHoCCQk6GQS/NOfIVFVJrRBSZBsLVNHTO+xAPI
+JXzBcNs79AktVCdIrC/hxKw+yMuSTFM5NyPs0wH54AlETU1kwOENWocivK0bo/4m
+tRXzp/yEGensoYi0RGmEg/OJ0XQGqcwL1sLeJ4VQJsoXuMl6h1YsGgEebL4TrRCs
+tST1OJGh1kva8bvS3ke18byB9llrzxlT6Y0Vy0rLqW9E5RtBz+GGp8rQap+8TI0G
+M1qiheWQNaBiXBZO8OOi+gMatCxxs1gs3nsL2xoP694hHwZ3BgOwye+Z/MC5TwuG
+KP7Suerj2qXDR2kS4Nvw9hmL7Xtw1wLW7YcYKCwEJEx35EiKGsY7mtQPyvp10gFA
+Wo15v4vPS8+qFsGV5K1Mij4XkdSxYuWC5YAEpAN+jb/af6IPl08M0w3719Hlcn4c
+yHf/W5oPt64FRuXxqBbsR6QXAgMBAAGjgfYwgfMwgbAGA1UdEQSBqDCBpYEPaW5m
+b0BpemVucGUuY29tpIGRMIGOMUcwRQYDVQQKDD5JWkVOUEUgUy5BLiAtIENJRiBB
+MDEzMzcyNjAtUk1lcmMuVml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFDMEEG
+A1UECQw6QXZkYSBkZWwgTWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAxNCAtIDAxMDEw
+IFZpdG9yaWEtR2FzdGVpejAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUHRxlDqjyJXu0kc/ksbHmvVV0bAUwDQYJKoZIhvcNAQEFBQAD
+ggIBAMeBRm8hGE+gBe/n1bqXUKJg7aWSFBpSm/nxiEqg3Hh10dUflU7F57dp5iL0
++CmoKom+z892j+Mxc50m0xwbRxYpB2iEitL7sRskPtKYGCwkjq/2e+pEFhsqxPqg
+l+nqbFik73WrAGLRne0TNtsiC7bw0fRue0aHwp28vb5CO7dz0JoqPLRbEhYArxk5
+ja2DUBzIgU+9Ag89njWW7u/kwgN8KRwCfr00J16vU9adF79XbOnQgxCvv11N75B7
+XSus7Op9ACYXzAJcY9cZGKfsK8eKPlgOiofmg59OsjQerFQJTx0CCzl+gQgVuaBp
+E8gyK+OtbBPWg50jLbJtooiGfqgNASYJQNntKE6MkyQP2/EeTXp6WuKlWPHcj1+Z
+ggwuz7LdmMySlD/5CbOlliVbN/UShUHiGUzGigjB3Bh6Dx4/glmimj4/+eAJn/3B
+kUtdyXvWton83x18hqrNA/ILUpLxYm9/h+qrdslsUMIZgq+qHfUgKGgu1fxkN0/P
+pUTEvnK0jHS0bKf68r10OEMr3q/53NjgnZ/cPcqlY0S/kqJPTIAcuxrDmkoEVU3K
+7iYLHL8CxWTTnn7S05EcS6L1HOUXHA0MUqORH5zwIe0ClG+poEnK6EOMxPQ02nwi
+o8ZmPrgbBYhdurz3vOXcFD2nhqi2WVIhA16L4wTtSyoeo09Q
 -----END CERTIFICATE-----
 
 subject= /CN=ACEDICOM Servidores/OU=PKI/O=EDICOM/C=ES
@@ -26974,6 +32164,43 @@
 ctr9tz4NOUOPYdg/MGQYK1+ivI2nqlAx8VZh1Pu7bhywec42c4fGGZHeafiO
 -----END CERTIFICATE-----
 
+subject= /C=US/ST=MI/L=Ann Arbor/O=Internet2/OU=InCommon/CN=InCommon RSA Server CA
+serial=25B55D4599B45D74E6DCC92100548172
+-----BEGIN CERTIFICATE-----
+MIIF+TCCA+GgAwIBAgIQJbVdRZm0XXTm3MkhAFSBcjANBgkqhkiG9w0BAQ0FADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQw
+OTE5MDAwMDAwWhcNMjQwOTE4MjM1OTU5WjB2MQswCQYDVQQGEwJVUzELMAkGA1UE
+CBMCTUkxEjAQBgNVBAcTCUFubiBBcmJvcjESMBAGA1UEChMJSW50ZXJuZXQyMREw
+DwYDVQQLEwhJbkNvbW1vbjEfMB0GA1UEAxMWSW5Db21tb24gUlNBIFNlcnZlciBD
+QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJwb8bsvf2MYFVFRVA+e
+xU5NEFj6MJsXKZDmMwysE1N8VJG06thum4ltuzM+j9INpun5uukNDBqeso7JcC7v
+HgV9lestjaKpTbOc5/MZNrun8XzmCB5hJ0R6lvSoNNviQsil2zfVtefkQnI/tBPP
+iwckRR6MkYNGuQmm/BijBgLsNI0yZpUn6uGX6Ns1oytW61fo8BBZ321wDGZq0GTl
+qKOYMa0dYtX6kuOaQ80tNfvZnjNbRX3EhigsZhLI2w8ZMA0/6fDqSl5AB8f2IHpT
+eIFken5FahZv9JNYyWL7KSd9oX8hzudPR9aKVuDjZvjs3YncJowZaDuNi+L7RyML
+fzcCAwEAAaOCAW4wggFqMB8GA1UdIwQYMBaAFFN5v1qqK0rPVIDh2JvAnfKyA2bL
+MB0GA1UdDgQWBBQeBaN3j2yW4luHS6a0hqxxAAznODAOBgNVHQ8BAf8EBAMCAYYw
+EgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
+AwIwGwYDVR0gBBQwEjAGBgRVHSAAMAgGBmeBDAECAjBQBgNVHR8ESTBHMEWgQ6BB
+hj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVNFUlRydXN0UlNBQ2VydGlmaWNh
+dGlvbkF1dGhvcml0eS5jcmwwdgYIKwYBBQUHAQEEajBoMD8GCCsGAQUFBzAChjNo
+dHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vVVNFUlRydXN0UlNBQWRkVHJ1c3RDQS5j
+cnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZI
+hvcNAQENBQADggIBAE3VdfpMw+uUkDK0VtAs3Op7bAOXhHqVbcZf+utvwT0n2Bj9
+6vp8Jp1ZDwVCEFfRiF73xp7YhPGFkOwQdG4RtUe1XpC/yVoXw4lyoYgktvn1fZZw
+Kk5aGoeQVrAlXsURWguxrplfhkU+ZNnPV+uFdc3s3aBhdQk61SrJnhswQKe1s60b
+x2UYV+DBF5AcO+c1RGmhhnniQdTqnnaLwSl3H7hyRb1wyQjmZEm3NV/3gJkR2FGk
+Bo4CBeMsIDePUa37W0iSM0t1HY4mPZqKRMRFZ34jC+misfmpgsZZhZvCxOgd8ifn
+1NZ4ejRQgJZ6bV84cjXMet/DsQmQExWA6czjdVxL3DZ7IK7b7kqCHGcH29vp/Uhi
+tIe1yZ/h/6Zc3ZgxN8uVIDwoO91XWmipxjHy32OuXXVmkBa8QQwm5fhJXxWrx2xz
+Jgd153xof+0POHx/NZRD4F0C8UEXyC5gRg6mScl+XsIHwoqfBs4p7tWsd8vCbUio
+xhVAcQPjVIPCuKnzj75TPsC3nsN0LxfvY5dSermWhiMEZL87JXRMb3+gjnm5jcyj
+2Sd+b38qxZb6IKnm20+oeKzFLMebND0skFlX/hCX1zjAb4FQjVsw48BlPA++tgI4
+7fZpHbnfbI/X8ZBKVyNbXJkVBxYmeM38IITtJRbBaKjAaXuF+UeFdGrq1dk4
+-----END CERTIFICATE-----
+
 subject= /C=IL/O=StartCom Ltd./OU=StartCom Certification Authority/CN=StartCom Extended Validation Server CA
 serial=35
 -----BEGIN CERTIFICATE-----
@@ -27085,6 +32312,44 @@
 7haq+UBTXRj4RfoeLzUmdzr3bgRzpT2RDCZ/u3ofe619la1ChlBqqYX1D3Zsns0y
 -----END CERTIFICATE-----
 
+subject= /C=US/ST=DE/L=Wilmington/O=Globe Hosting, Inc./CN=GlobeSSL DV Certification Authority 2
+serial=0DA64E43FDBCCCCB7F633C138F2F40B5
+-----BEGIN CERTIFICATE-----
+MIIGBzCCA++gAwIBAgIQDaZOQ/28zMt/YzwTjy9AtTANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQw
+OTEwMDAwMDAwWhcNMjQwOTA5MjM1OTU5WjB9MQswCQYDVQQGEwJVUzELMAkGA1UE
+CBMCREUxEzARBgNVBAcTCldpbG1pbmd0b24xHDAaBgNVBAoTE0dsb2JlIEhvc3Rp
+bmcsIEluYy4xLjAsBgNVBAMTJUdsb2JlU1NMIERWIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCSEe/0TFcs
+tqrDFxNXhHncTLRkMTg71GveKpJ3OiqHuLyrevK1Zg1YWKB3mm3t0BpYjRYXRpLg
+UBPU2fy5pu6bHaNZPw8t/Lcq/Mwqtp3eEN/kSAuIqznVY5IWrpFZvB+E4EknWQCg
+FldExf1mKMDdHsJofLuZSwK1ywXzIaPvdoxfCU1hxnMm7huA1NzFh8VaKN85SNQ2
+4+5wx+NF74kPomBYcbSn436f1VLLmN0P2eFY88BP1H2Ovb4u7P9YzflSOA6KqeO0
+pNG7agyFMsKIhgG1YmJZLcXIeTtdcfId3aCDraorvN9bL5CABChiGeWcvksh34xf
+4Y7CPg0lCvQhAgMBAAGjggF1MIIBcTAfBgNVHSMEGDAWgBRTeb9aqitKz1SA4dib
+wJ3ysgNmyzAdBgNVHQ4EFgQUxqw3y5GvyqS3LzYP8MthVPdxN+0wDgYDVR0PAQH/
+BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
+CCsGAQUFBwMCMCIGA1UdIAQbMBkwDQYLKwYBBAGyMQECAhswCAYGZ4EMAQIBMFAG
+A1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1
+c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgw
+PwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RS
+U0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRy
+dXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEACJUXr10ifJpphFWptiQaZcO9u08+
+nWSnS3+laMVY25O04YNhjWchyo/qH34gACA1+kNiLCicr2t+C8CPThli2qOpPVGu
+rpqxC3roRDWfP9On03TDOVkXrNHLhdimkhAE7j22zEWbmSLhRif4s2bLx6ZhoOJM
+Dlyzb44KezOFESYVTbmB/6yPHehQSxiCvx6ZfU389oNG9/iiS2gIIpmSQjRUwTcB
+Q33IpTMUaLF3H+TAFWKJItOsyURYv1LCnz/hbB346l5dMVoCUh2wUTCBk55XZ0+v
+PU8ucyu5hGnVumfBese0AgDS85z+iK90mxAFmAuVvlTof+wJaCmShtdpKSjPgVlO
+RNmFLD9zoedEVDgSM2EVSTYdnlQhbxyYx/juMXegHIcx+VK9SfAtnnN4nccoXxPt
+2l9zV/yPIkNhS+NHRvWiBVlxHny3iGOv4atWhqw2Lt2GkWKgbRAjiC6p1LVa7dCK
+bY9Ep8OHHS6XXIcS2ubwvsKDWu0rnLCTFPCTbt2AoMH5heXk8mexD1pqexBatjcS
+edBM02cHghlsbX6ioCU0V5882LN19si2nR+ifG9hmEreaF3VnuvIxja9Ss4HqhLt
+ryx56iZ5uPtmTgxMkNkwkQLakJXbZpUVnLUTmL5VO3KdcN8OvP+VqqQ/bGIzPFgD
+REUBSn6b6BJ50ds=
+-----END CERTIFICATE-----
+
 subject= /DC=com/DC=microsoft/DC=corp/DC=redmond/CN=MSIT Machine Auth CA 2
 serial=615DAAD2000600000040
 -----BEGIN CERTIFICATE-----
@@ -27123,6 +32388,82 @@
 GVnm4XA3OA3b7rDi
 -----END CERTIFICATE-----
 
+subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA
+serial=2B2E6EEAD975366C148A6EDBA37C8C07
+-----BEGIN CERTIFICATE-----
+MIIGCDCCA/CgAwIBAgIQKy5u6tl1NmwUim7bo3yMBzANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMjEy
+MDAwMDAwWhcNMjkwMjExMjM1OTU5WjCBkDELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxNjA0BgNVBAMTLUNPTU9ETyBSU0EgRG9tYWluIFZh
+bGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAI7CAhnhoFmk6zg1jSz9AdDTScBkxwtiBUUWOqigwAwCfx3M28Sh
+bXcDow+G+eMGnD4LgYqbSRutA776S9uMIO3Vzl5ljj4Nr0zCsLdFXlIvNN5IJGS0
+Qa4Al/e+Z96e0HqnU4A7fK31llVvl0cKfIWLIpeNs4TgllfQcBhglo/uLQeTnaG6
+ytHNe+nEKpooIZFNb5JPJaXyejXdJtxGpdCsWTWM/06RQ1A/WZMebFEh7lgUq/51
+UHg+TLAchhP6a5i84DuUHoVS3AOTJBhuyydRReZw3iVDpA3hSqXttn7IzW3uLh0n
+c13cRTCAquOyQQuvvUSH2rnlG51/ruWFgqUCAwEAAaOCAWUwggFhMB8GA1UdIwQY
+MBaAFLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBSQr2o6lFoL2JDqElZz
+30O0Oija5zAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNV
+HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGwYDVR0gBBQwEjAGBgRVHSAAMAgG
+BmeBDAECATBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNv
+bS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcB
+AQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9E
+T1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21v
+ZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAE4rdk+SHGI2ibp3wScF9BzWRJ2p
+mj6q1WZmAT7qSeaiNbz69t2Vjpk1mA42GHWx3d1Qcnyu3HeIzg/3kCDKo2cuH1Z/
+e+FE6kKVxF0NAVBGFfKBiVlsit2M8RKhjTpCipj4SzR7JzsItG8kO3KdY3RYPBps
+P0/HEZrIqPW1N+8QRcZs2eBelSaz662jue5/DJpmNXMyYE7l3YphLG5SEXdoltMY
+dVEVABt0iN3hxzgEQyjpFv3ZBdRdRydg1vs4O2xyopT4Qhrf7W8GjEXCBgCq5Ojc
+2bXhc3js9iPc0d1sjhqPpepUfJa3w/5Vjo1JXvxku88+vZbrac2/4EjxYoIQ5QxG
+V/Iz2tDIY+3GH5QFlkoakdH368+PUq4NCNk+qKBR6cGHdNXJ93SrLlP7u3r7l+L4
+HyaPs9Kg4DdbKDsx5Q5XLVq4rXmsXiBmGqW5prU5wfWYQ//u+aen/e7KJD2AFsQX
+j4rBYKEMrltDR5FL1ZoXX/nUh8HCjLfn4g8wGTeGrODcQgPmlKidrv0PJFGUzpII
+0fxQ8ANAe4hZ7Q7drNJ3gjTcBpUC2JD5Leo31Rpg0Gcg19hCC0Wvgmje3WYkN5Ap
+lBlGGSW4gNfL1IYoakRwJiNiqZ+Gb7+6kHDSVneFeO/qJakXzlByjAA6quPbYzSf
++AZxAeKCINT+b72x
+-----END CERTIFICATE-----
+
+subject= /C=GR/O=Hellenic Academic and Research Institutions Cert. Authority/CN=HEAL-LINK Hellenic Academic Libraries Link CA R1
+serial=18DD87AE1F4BB672
+-----BEGIN CERTIFICATE-----
+MIIGCTCCBPGgAwIBAgIIGN2Hrh9LtnIwDQYJKoZIhvcNAQEFBQAwgZUxCzAJBgNV
+BAYTAkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2gg
+SW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMg
+QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTAe
+Fw0xNDA2MTkwODU1MDZaFw0yMjA2MTcwODU1MDZaMIGOMQswCQYDVQQGEwJHUjFE
+MEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
+aW9ucyBDZXJ0LiBBdXRob3JpdHkxOTA3BgNVBAMTMEhFQUwtTElOSyBIZWxsZW5p
+YyBBY2FkZW1pYyBMaWJyYXJpZXMgTGluayBDQSBSMTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBALdgFG/qssx1Q+LhDsVGBCJJBehJMwP5wkg4aJb7ZHhy
+BZfvoNx2zk82lPvL10GBkQR2TiUsn4oti71nOhbsOqgtdCJyb8ngdsyx6Id3EZNT
+/oFKinqXtyI+BmQ6Qh7ZJhbPH3g0j5YhYCpZg6Myv3QU0w4zrpLWtQXt6DvZBfAB
+Mx6AbhT/A4x4NP9enOnz/ImtPatywbjsDe2qmZt6gWF4OQWZgS/00kIgNUAEH7S2
+ZdCJfb/319fH/mPZWmyIvQrMh5M0vi3wg0RGqarBDJ1Y0p+H6ZjU5o4DxE+nYwcO
+Ny7eak6HbTQDbMwJgW+s067RecSD71mUc1jBytggHY8CAwEAAaOCAmAwggJcMA8G
+A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQ1SwpWV5RB
+hnUDKZifs3plWo/jMDBGBgNVHR8EPzA9MDugOaA3hjVodHRwOi8vY3JsdjEuaGFy
+aWNhLmdyL0hhcmljYVJvb3RDQTIwMTEvY3JsdjEuZGVyLmNybDAfBgNVHSMEGDAW
+gBSmkUL9E2FKI54IpCnl2BMEI+5BJTBuBggrBgEFBQcBAQRiMGAwIQYIKwYBBQUH
+MAGGFWh0dHA6Ly9vY3NwLmhhcmljYS5ncjA7BggrBgEFBQcwAoYvaHR0cDovL3d3
+dy5oYXJpY2EuZ3IvY2VydHMvSGFyaWNhUm9vdENBMjAxMS5wZW0wggE/BgNVHSAE
+ggE2MIIBMjCCAS4GDCsGAQQBgc8RAQACBzCCARwwMgYIKwYBBQUHAgEWJmh0dHA6
+Ly93d3cuaGFyaWNhLmdyL2RvY3VtZW50cy9DUFMucGhwMIHlBggrBgEFBQcCAjCB
+2DBKFkNIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMCAQEagYlUaGlzIGNlcnRpZmljYXRl
+IGlzIHN1YmplY3QgdG8gR3JlZWsgbGF3cyBhbmQgb3VyIENQUy4gVGhpcyBDZXJ0
+aWZpY2F0ZSBtdXN0IG9ubHkgYmUgdXNlZCBmb3IgYWNhZGVtaWMsIHJlc2VhcmNo
+IG9yIGVkdWNhdGlvbmFsIHB1cnBvc2VzLjANBgkqhkiG9w0BAQUFAAOCAQEAfz7S
+WL1V9tL5mWgcBfZrP87Ns661jCgzg0Z/Ch9Tb9xVQJnhHZ7kZ2+1Jm7NZtD85YYv
+MMD2t5hrdMCJD0PNwpKysg55fyT4Aqnn/RhkNvjJBfQ9iNZfVXW10bf8T5dNEaZV
+ROtyHO3u3CSzymgkPaHZ0XDeGFmyLVly0jzlHtAzczyGJJNH3idgVumMWL1WcxRn
+SimhhDjrKaxl35WoTD+Jn9B7MaRo2gzanx2lESMZ5LXys6zyw7QVLSnyzzPxOW71
+aLKfzO74SmrQH6mI9JCc114XK/OMADYtRMaEwtZV11ZUltxPHDlsfHsDdw7lU6jh
+gANKWjF0rZPnkum1qA==
+-----END CERTIFICATE-----
+
 subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)06/CN=VeriSign Class 3 Extended Validation SSL SGC CA
 serial=112A006D37E5106FD6CA7CC3EFBACC18
 -----BEGIN CERTIFICATE-----
@@ -27161,6 +32502,82 @@
 Gh/aWKfkT8Fhrryi/ks=
 -----END CERTIFICATE-----
 
+subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Extended Validation Secure Server CA
+serial=06A74380D4EBFED435B5A3F7E16ABDD8
+-----BEGIN CERTIFICATE-----
+MIIGDjCCA/agAwIBAgIQBqdDgNTr/tQ1taP34Wq92DANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTIwMjEy
+MDAwMDAwWhcNMjcwMjExMjM1OTU5WjCBkjELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxODA2BgNVBAMTL0NPTU9ETyBSU0EgRXh0ZW5kZWQg
+VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAlVbeVLTf1QJJe9FbXKKyHo+cK2JMK40SKPMalaPGEP0p3uGf
+CzhAk9HvbpUQ/OGQF3cs7nU+e2PsYZJuTzurgElr3wDqAwB/L3XVKC/sVmePgIOj
+vdwDmZOLlJFWW6G4ajo/Br0OksxgnP214J9mMF/b5pTwlWqvyIqvgNnmiDkBfBzA
+xSr3e5Wg8narbZtyOTDr0VdVAZ1YEZ18bYSPSeidCfw8/QpKdhQhXBZzQCMZdMO6
+WAqmli7eNuWf0MLw4eDBYuPCGEUZUaoXHugjddTI0JYT/8ck0YwLJ66eetw6YWNg
+iJctXQUL5Tvrrs46R3N2qPos3cCHF+msMJn4HwIDAQABo4IBaTCCAWUwHwYDVR0j
+BBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFDna/8ooFIqodBMI
+ueQOqdL6fp1pMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMD4G
+A1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5j
+b21vZG8uY29tL0NQUzBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggr
+BgEFBQcBAQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29t
+L0NPTU9ET1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
+cC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAERCnUFRK0iIXZebeV4R
+AUpSGXtBLMeJPNBy3IX6WK/VJeQT+FhlZ58N/1eLqYVeyqZLsKeyLeCMIs37/3mk
+jCuN/gI9JN6pXV/kD0fQ22YlPodHDK4ixVAihNftSlka9pOlk7DgG4HyVsTIEFPk
+1Hax0VtpS3ey4E/EhOfUoFDuPPpE/NBXueEoU/1Tzdy5H3pAvTA/2GzS8+cHnx8i
+teoiccsq8FZ8/qyo0QYPFBRSTP5kKwxpKrgNUG4+BAe/eiCL+O5lCeHHSQgyPQ0o
+fkkdt0rvAucNgBfIXOBhYsvss2B5JdoaZXOcOBCgJjqwyBZ9kzEi7nQLiMBciUEA
+KKlHMd99SUWa9eanRRrSjhMQ34Ovmw2tfn6dNVA0BM7pINae253UqNpktNEvWS5e
+ojZh1CSggjMziqHRbO9haKPl0latxf1eYusVqHQSTC8xjOnB3xBLAer2VBvNfzu9
+XJ/B288ByvK6YBIhMe2pZLiySVgXbVrXzYxtvp5/4gJYp9vDLVj2dAZqmvZh+fYA
+tmnYOosxWd2R5nwnI4fdAw+PKowegwFOAWEMUnNt/AiiuSpm5HZNMaBWm9lTjaK2
+jwLI5jqmBNFI+8NKAnb9L9K8E7bobTQk+p0pisehKxTxlgBzuRPpwLk6R1YCcYAn
+pLwltum95OmYdBbxN4SBB7SC
+-----END CERTIFICATE-----
+
+subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
+serial=36825E7FB5A481937EF6D1736BB93CA6
+-----BEGIN CERTIFICATE-----
+MIIGDjCCA/agAwIBAgIQNoJef7WkgZN+9tFza7k8pjANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMjEy
+MDAwMDAwWhcNMjkwMjExMjM1OTU5WjCBljELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxPDA6BgNVBAMTM0NPTU9ETyBSU0EgT3JnYW5pemF0
+aW9uIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBALkU2YXyQURX/zBEHtw8RKMXuG4B+KNfwqkhHc5Z9Ozz
+iKkJMjyxi2OkPic284/5OGYuB5dBj0um3cNfnnM858ogDU98MgXPwS5IZUqF0B9W
+MW2O5cYy1Bu8n32W/JjXT/j0WFb440W+kRiC5Iq+r81SN1GHTx6Xweg6rvn/RuRl
+Pz/DR4MvzLhCXi1+91porl1LwKY1IfWGo8hJi5hjYA3JIUjCkjBlRrKGNQRCJX6t
+p05LEkAAeohoXG+fo6R4ESGuPQsOvkUUI8/rddf2oPG8RWxevKEy7PNYeEIoCzoB
+dvDFoJ7BaXDej0umed/ydrbjDxN8GDuxUWxqIDnOnmkCAwEAAaOCAWUwggFhMB8G
+A1UdIwQYMBaAFLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBSa8yvaz61P
+ti+7KkhIKhK3G0LBJDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIB
+ADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGwYDVR0gBBQwEjAGBgRV
+HSAAMAgGBmeBDAECAjBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggr
+BgEFBQcBAQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29t
+L0NPTU9ET1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
+cC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAGmKNmiaHjtlC+B8z6ar
+cTuvYaQ/5GQBSRDTHY/i1e1n055bl71CHgf50Ltt9zKVWiIpYvgMnFlWJzagIhIR
++kf0UclZeylKpUg1fMWXZuAnJTsVejJ1SpH7pmue4lP6DYwT+yO4CxIsru3bHUeQ
+1dCTaXaROBU01xjqfrxrWN4qOZADRARKVtho5fV8aX6efVRL0NiGq2dmE1deiSoX
+rS2uvUAOZu2K/1S0wQHLqeBHuhFhj62uI0gqxiV5iRxBBJXAEepXK9a0l/qx6RVi
+7Epxd/3zoZza9msAKcUy5/pO6rMqpxiXHFinQjZf7BTP+HsO993MiBWamlzI8SDH
+0YZyoRebrrr+bKgy0QB2SXP3PyeHPLbJLfqqkJDJCgmfyWkfBxmpv966+AuIgkQW
+EH8HwIAiX3+8MN66zQd5ZFbY//NPnDC7bh5RS+bNvRfExb/IP46xH4pGtwZDb2It
+z1GdRcqK6ROLwMeRvlu2+jdKif7wndoTJiIsBpA+ixOYoBnW3dpKSH89D4mdJHJL
+DntE/9Q2toN2I1iLFGy4XfdhbTl27d0SPWuHiJeRvsBGAh52HN22r1xP9QDWnE2p
+4J6ijvyxFnlcIdNFgZoMOWxtKNcl0rcRkND23m9e9Pqki2Z3ci+bkEAsUhJg+f+1
+cC6JmnkJiYEt7Fx4b4GH8fxV
+-----END CERTIFICATE-----
+
 subject= /C=PT/O=SCEE/OU=ECEstado/CN=Justica
 serial=3D6C218C41E1D27E46E8FF1BF9B02472
 -----BEGIN CERTIFICATE-----
@@ -27237,6 +32654,158 @@
 JVZOJXf0BtxdnuD9rygnLAqUxfE=
 -----END CERTIFICATE-----
 
+subject= /C=BR/ST=SP/L=S\xC3\xA3o Paulo/O=Site Blindado S.A./OU=Certifica\xC3\xA7\xC3\xA3o Digital/CN=SSL Blindado 2
+serial=3A732163F650DD67E43B15B4482949F8
+-----BEGIN CERTIFICATE-----
+MIIGETCCA/mgAwIBAgIQOnMhY/ZQ3WfkOxW0SClJ+DANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQw
+OTA5MDAwMDAwWhcNMjQwOTA4MjM1OTU5WjCBhjELMAkGA1UEBhMCQlIxCzAJBgNV
+BAgTAlNQMRMwEQYDVQQHDApTw6NvIFBhdWxvMRswGQYDVQQKExJTaXRlIEJsaW5k
+YWRvIFMuQS4xHzAdBgNVBAsMFkNlcnRpZmljYcOnw6NvIERpZ2l0YWwxFzAVBgNV
+BAMTDlNTTCBCbGluZGFkbyAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA27gLObR5F+fz/FriSBjuUoehzhhxN0pleMDOCfWYxfOypJQoK1bKMqrv68b0
+fTaTJsW5UIkUPjTw0BqlWaF9pHSwpiDp8D7VfE4q1gYvHovjhhqtyf9/9x5wDBgW
+P/Gz8FxpOyEf0cxcgYi0Dx9/YmdWMpMHv22bH9xZ7q6Swj6AlaG8xnli8C9772RZ
+TIDLSW1OU1vwIGmvZqQF02LmZejFvJVMnwvMopBCzi005p5Q4BlZkerFNHkI0+Gt
+sPL9wbzqluQhBqHdutcd5TIqxUarofq6VzcujabzbKhPotTSHFbZam7rAfI5ZMIG
+6u3hEJzknZuypkpwQooU+60LKQIDAQABo4IBdTCCAXEwHwYDVR0jBBgwFoAUU3m/
+WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFCEW+q4Y55ZzxZTyfyqWoBmAwBBv
+MA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdJQQWMBQG
+CCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAEGzAZMA0GCysGAQQBsjEBAgIoMAgG
+BmeBDAECATBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5j
+b20vVVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwdgYIKwYB
+BQUHAQEEajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20v
+VVNFUlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9v
+Y3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAH+ADUvWUlP7ah2r
+2mSROQAPa4YKz602/H5WGhLK9kQd7wKGCAPiAhHQOOQu/cb2KGp/8O4qkctoaTvR
+fXI+f8Q4HRwdqWqdnWhcY2T0qvnyji7iYdVPSNcGnlcqQM8QlUODN9nyC4t8IhxH
+sgcqCzLix3SUM/TH5BKlpsuETp7emHOcnhwIqx6O3ydph0iSySa2NopYSlur7J9u
+w1WP/clHoXVMvXAlGoERVBFoWbzRQD6WIBkM3jFj5nG1pYQkifdhhv6DLFk9h7Mo
+ag9VrDQMmIBga0pqGQ32MzLXHniOJyHlx3iChCbHFmMoDWO/2LPLhbbpb44tm6YS
+iWuTNatN3DcfSgzrg1LhnSKxfaCqxuUBvdKDdr6vI4SnQo78277zcsQQCzWbAPua
+h98PO5mDoe4Os6+q1WCydSHVyivSgFSK67+0a0hheMvBBXSUAkKczPdl0yBur42q
+PwdF1oGfrtNwHnvXHhk3Hm18SUGbIFwxSE2836iFu0cHJ5K4VZ2i7bWiI2P/y4Wq
+mY0RoKeDWkHWQ4rcOmwyiLbXhGIwK7dxWd9+aQRxRIEPCLwdlEF0T1IjUPG7j+ne
+KipXDFY5ErMh5F11QTJLCy8YUm+bZb4ylVHYbdzty6CK/GVT/p9pm11SwP92ALyH
+fPh7/vlyVklVg+ojIkngjHP06Wo5
+-----END CERTIFICATE-----
+
+subject= /C=US/ST=DE/L=Wilmington/O=Corporation Service Company/CN=Trusted Secure Certificate Authority 5
+serial=F7822277B3B5A8E10B62C3FA4E0AF91C
+-----BEGIN CERTIFICATE-----
+MIIGEjCCA/qgAwIBAgIRAPeCIneztajhC2LD+k4K+RwwDQYJKoZIhvcNAQEMBQAw
+gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK
+ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD
+VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE0
+MDkxMDAwMDAwMFoXDTI0MDkwOTIzNTk1OVowgYYxCzAJBgNVBAYTAlVTMQswCQYD
+VQQIEwJERTETMBEGA1UEBxMKV2lsbWluZ3RvbjEkMCIGA1UEChMbQ29ycG9yYXRp
+b24gU2VydmljZSBDb21wYW55MS8wLQYDVQQDEyZUcnVzdGVkIFNlY3VyZSBDZXJ0
+aWZpY2F0ZSBBdXRob3JpdHkgNTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAI0GNgsj2QI1JOdYk8aNg/0JtkcQDJ8oVyVm1qosht+fd7UJuxnE+cfbrEiV
+heNHkCTUSAgHNYPAtMvTRpTW5SoXp5ywE9vstT+QEyTCh9hXe/Ix+9rHKaYiRV+H
+vfJapC9UmXHFP0V/eQPMRcS6kFjY/kLgGkpy/NmBblvAfw+BIqW7u1l+lxkJ9qOu
+SzcetveuGLsuekM9cc0bzChx5W3lc0kAbX/1KKiaByk/oMf3qHFkDf9q2KfrpY9A
+/KE4hgLdTC5hKrQrehazl7b+Epmx8G2MvsK28Vl7m1QD35vxtKHHiuDNOQdF5Ct4
+JtXfi2Kuzi1Q6bEVQymayy1DjwcCAwEAAaOCAXUwggFxMB8GA1UdIwQYMBaAFFN5
+v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBTyu1Xu/I/P0D8UaBqVfnkOqxcw
+9DAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUEFjAU
+BggrBgEFBQcDAQYIKwYBBQUHAwIwIgYDVR0gBBswGTANBgsrBgEEAbIxAQICCDAI
+BgZngQwBAgIwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC51c2VydHJ1c3Qu
+Y29tL1VTRVJUcnVzdFJTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHYGCCsG
+AQUFBwEBBGowaDA/BggrBgEFBQcwAoYzaHR0cDovL2NydC51c2VydHJ1c3QuY29t
+L1VTRVJUcnVzdFJTQUFkZFRydXN0Q0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8v
+b2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAGsUdhGf+feSte
+4SOKj+2XtTfw4uo5t21lm1kXoRPM/ObB8yzzuVscvwnZ8Dn8PXjQXlP3ycqtc91X
+g4i63y48TUjsrK1/d6IvWAuzMN7tkEzVbBVFWlZz9jxYMmeGhrZ5HFOIjYJRRduQ
+4jTYZFjX+cm5b8baZuS43nRqsYGARFYlsxIzUGSOITM6W0QZ7s15p6Nh7nRMGR/g
+m2qShUIzj2RDEz2XXDDTsVT9NnN7b2WhbBMmsXRxY7ERL/oZ6sZLzz7g0tdP/fOx
+geY+CWp891EqIxQLd5HYdIyGXesILMu8EaX9zMY76kbahJ0HKL//f0+S2SKDaYe7
+6APSyu1jqjfEUeaBSlPlvP5pXbygHjr/gQDVPyFzre6+Di+qZSIvcWuqo/jV2jJk
+Ixd1rieFcsdkepYyAPC5GxNzHg0eWG9N669bnSxpvVDvmEl6ztbp7gxM3ciisBQz
+OLApig0V1N+0+YUXUq5f/0lenGZ9cqN3cs0/8ClTp1p3o84ErzFhjWQCIaBTODTS
+hYvB1+z6Hf2ljqD50KHs/80KO4mQBsPZjod8rQQa2KP0W3yvCBR6Z7ZUKTGGB0FV
+Q29vl2FmGkHV80dWIIgWzkU6ajnQXygkTr46jKxNXqT+G5+FaY79d0Vpf9XNg+m1
+Kw/4P1yG/5xtH6HrU2uqz3qOmM4yWg==
+-----END CERTIFICATE-----
+
+subject= /C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Domain Validation Secure Server CA
+serial=724078D4213CEA03BF14E55E3F560237
+-----BEGIN CERTIFICATE-----
+MIIGFzCCA/+gAwIBAgIQckB41CE86gO/FOVeP1YCNzANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQw
+ODIyMDAwMDAwWhcNMjkwODIxMjM1OTU5WjCBkzELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxOTA3BgNVBAMTMFVTRVJUcnVzdCBSU0EgRG9t
+YWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAMTDft1Zl+V3Koj2wygf++oaX4pvUTmt0zbGzThksBeN
+YpMzdR1ahJz9RSsMTsRMuichj06TmJbi91hvyjuX8jrq1Ep0dS27m9ZgVNToClts
+xAj8diDPs/UyAwMiLCPKldQMf4h0Gnii3pWtKJlJw09OCqiEmFdJg1DXbRFG5N5i
+SO4fyKAtD4aDEo+BY1qi+uT3X/RzO+T73WO0BpZGL6OH4sVXhKFY+z6qt22LbsTT
+2vH0rlFyYav9iZFuZlM0rUYMcLJm9yU8L659pwVdAo0YVfv3x42QsQF9W7qNGCnd
+hHNIehLGpV7j2KwaBKq9GFD8BxcpxjUAMhuESdWDa80CAwEAAaOCAW4wggFqMB8G
+A1UdIwQYMBaAFFN5v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBSmwefh9PZH
+Y9cvfY2Q+LojT2CsnjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIB
+ADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGwYDVR0gBBQwEjAGBgRV
+HSAAMAgGBmeBDAECATBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0
+cnVzdC5jb20vVVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmww
+dgYIKwYBBQUHAQEEajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVz
+dC5jb20vVVNFUlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0
+dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAELQvN4F
+o+l0anb2ajsD/Baf/7IsyDmPEmfYADO2mpz3QWmEOsuc2/jbHyLoryNQq9PHUSng
+zRmfe7N+iFfqF5p8/sbFUbwQrN4e5yXDagrFakztUlxFXR73fwIk5Rc9KmIDudq7
+yqzN68To4sbUpzopPg76AKejfkb3Y8V0yEm2TMsFP2W7d8S6O74TO4PpfR3QEf5K
+ItzX6cWubJ7e2dpRXMaocoLTzTX8ZJlP52/lUN/ALjMOga4aZkRIMY0S1X8w1ywE
+Rvkcm63QZnXROlOHmK8cGlHrKaenPnxkipEXhRWoNvlTVVBTH8CjDsaNN+jPMij+
+feO6mLvXYlNieyW2YU6/G7lMYVNIDczcFby6xUu1pHuDUAmyS0Qn2snHrevLaFzh
+60jQ/gfmWO2K2vtwhFQDnUF/dq7M8tfBvF2g/8yHDsZIJ1t4PGW6sFfqczJhwEf6
+LdNn/D/ealgg+IYdixjChRsMd1CaavxPXfD6k7U4aX91sL25B8zQn5/yTpTq0oKT
+JQgsaQSmB6OYkS8dUIW7Q9XLmSboySMzBNK6MPW24hAsYx2gGTOM1Xtlo/V515Q4
+HCaMS6OhVNGJnncATAT/a7FiMeWxe3shQ2pVT4dfiHkHB92qGrLc/aVFJ1lo+vqB
+4aqkILjAI7MLPZQY2MnnThQyv6WWAcpxZi4H
+-----END CERTIFICATE-----
+
+subject= /C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Extended Validation Secure Server CA
+serial=0F6BB751EFA7D2E8368E606407334F83
+-----BEGIN CERTIFICATE-----
+MIIGGTCCBAGgAwIBAgIQD2u3Ue+n0ug2jmBkBzNPgzANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTIw
+MjEyMDAwMDAwWhcNMjcwMjExMjM1OTU5WjCBlTELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxOzA5BgNVBAMTMlVTRVJUcnVzdCBSU0EgRXh0
+ZW5kZWQgVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAlJwjjGNzAgMFwLu05RnhYFJS1PpbcyPH6VZOij+z
+PyvCILGvwXC8A+EgBthY080+kIlSxrNyOdnrUfNj8IsBtBlmtOF9nMWgD0Cb4HB1
+Y/tCNas8IHMtKr6eI4nJa4NjPhTcST+GtC8r+bVGHk0QpX4LbT+Z8WeE7pXIOUGs
+9j66/hsMwgnBxkQ9xXN0jhTFITUZfnCuM0vOo5hRYlCNtwD8iaHJPaKxYe6qHSKH
+WCBK7GUQiQRngry+YKLx3YtC3k/NQIyhaTLY/gUFi57kPcpZoa0h3RGfS9MpPFoe
+mk3rGH3jwjVFxR1ep1FtP/kprzLaR1UL81gxENhWvZEWXQIDAQABo4IBbjCCAWow
+HwYDVR0jBBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFC+BT+Jm
++rxov5lDhFKJIDqC86SlMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/
+AgEAMDoGA1UdIAQzMDEwLwYEVR0gADAnMCUGCCsGAQUFBwIBFhlodHRwczovL2Nw
+cy51c2VydHJ1c3QuY29tMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNl
+cnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNy
+bDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRy
+dXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZ
+aHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAa2bX
+Xf22zjY/QLzzdZwJ9JO86qH/czwCFPK4o9Cb7rixQL9S7zHw1dm3n/+Lx5kT9lqx
+wB0dqoZ8o0XwFgVcksGz7QRhEBjrB0nSUNYG8kuFaMxRWa9ze6Ovov44WDrq1uyF
+npi3eeQiwMr3xHmY76b1NX0WqvlTTFw4L5DrcIohBz1zKVkRp7LH/s5vxjDECM+/
+erdy1WTILNFv09gwz4iFyfu/WmYYNUKlQJaSoUqja/KHcqY8zYKKjq5o982Ji3Ti
+/Odkx1NJA1Yf5ivDxxRFQmij6knL1pi1wgQxGjd67V3/+HfHF7MCRWk8mXnT32B9
+1Hk3jm10GL0R6y/XFsLhv0mGkmKD1vTP7vz1hdMLlVgxEs1k5dLMybtjUJ3LuENz
+avmZ/G/vOi284ZRo/gA/YjT5CeeWgI11IHbpRDAqKy4BWhmtIi11u12i9ftPxxrD
+/VwHtC0hTTOBnYgbJAK9ZLvaJUBU22EimU4Jv3ELkeV7SWedbAdfjXolI1mCcAbq
+RgzRC+RaTloSmO2dWicDBW7KlRHmKZXrkDUAExSBY/1j9HmNcYzWv4NCTtK7t0en
+gsE/OP2b7zHrHWtC/F1JwOCrH1JkbPA7c/6nNJVY2AscGM16pIU89OL0Ez1PyZYG
+4fokbdNREXoShKClNIPbB5iY+WdSzb9CKLyb96g=
+-----END CERTIFICATE-----
+
 subject= /CN=E-Tugra EBG Web Sunucu Sertifika Hizmet Sa\xC4\x9Flay\xC4\xB1c\xC4\xB1s\xC4\xB1/O=E-Tugra EBG Bili\xC5\x9Fim Teknolojileri ve Hizmetleri A.\xC5\x9E./C=TR
 serial=77F489903D402371
 -----BEGIN CERTIFICATE-----
@@ -27351,6 +32920,44 @@
 moyY31GdTkWsqNMdyBhMGUXRrSOtQVJpTpmfF0O7YjYuqKg=
 -----END CERTIFICATE-----
 
+subject= /C=IL/O=StartCom Ltd./OU=StartCom Certification Authority/CN=StartCom Extended Validation Server CA
+serial=2A
+-----BEGIN CERTIFICATE-----
+MIIGIDCCBAigAwIBAgIBKjANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDkwMTAxMDYwMDAxWhcNMTkwMTAxMDYwMDAxWjCB
+gTELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKTAnBgNVBAsT
+IFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS8wLQYDVQQDEyZTdGFy
+dENvbSBFeHRlbmRlZCBWYWxpZGF0aW9uIFNlcnZlciBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBALbD1LIPd205K+OtHnsfOYqXxWNvkrLeQuKp1XPt
+GzciyynId1iz+VDaAsMe5GfaA3PPZ798mZkQxKXDVk2idd/fb6ebsuctoY9gN5PJ
+Knor/8+P2EmYA3H28uIa8lFOtol9mYGNgiFXldY7k/XWxtoa6YF1BpS3LdRi39Y2
+sLKegVrsg3BGRobaaCmk8LZCGthYeXChbEy9KReJkY5bdiDANxVIoVb4cRSo3uM0
+EznGfezw4ITVxdzhx7HeNTnIBxlfvrjLlMd0DIYw3P7ZAgGplwjZ+U2wDy1BTefW
+u94zgylm0uiqmWLn0XXv8jDVS8Y0ny7lvDtuiQYY1RlUqw0CAwEAAaOCAaQwggGg
+MBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSh
+4Z5FJXlNBtkCF5KC1TCJciUUoDAfBgNVHSMEGDAWgBROC+8apEBbpRdphzDKNGhD
+0EGu8jBmBggrBgEFBQcBAQRaMFgwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLnN0
+YXJ0c3NsLmNvbS9jYTAtBggrBgEFBQcwAoYhaHR0cDovL3d3dy5zdGFydHNzbC5j
+b20vc2ZzY2EuY3J0MFsGA1UdHwRUMFIwJ6AloCOGIWh0dHA6Ly93d3cuc3RhcnRz
+c2wuY29tL3Nmc2NhLmNybDAnoCWgI4YhaHR0cDovL2NybC5zdGFydHNzbC5jb20v
+c2ZzY2EuY3JsMHUGA1UdIARuMGwwagYEVR0gADBiMC4GCCsGAQUFBwIBFiJodHRw
+Oi8vd3d3LnN0YXJ0c3NsLmNvbS9wb2xpY3kucGRmMDAGCCsGAQUFBwIBFiRodHRw
+Oi8vd3d3LnN0YXJ0c3NsLmNvbS9leHRlbmRlZC5wZGYwDQYJKoZIhvcNAQELBQAD
+ggIBADNPWvaYoYWWulC4GOl8oeVr5u4r7l4dmmNLsoxiBZG3N747lnq3TgZgxnGC
+AvAOVSu3ziJCWAvzDNDtMku004pLK07fZTfBY8GtO+iyMCTGixXu26ucHdqZRGtB
+5DVs6a0D8mcSIRjWHM+yiUrtc6P/CAbbmngxKVpP2GlL0yCfEfBgghzl9/av1rFe
+snsYnKhj1/M9AcapVNP/2hMzEG/dQBGMD9IjmUJcRQSKpmc2knHGzCt66lnYGj4m
+/au0xHSVnYG8SvvQ1UyZK3RC89Td7HVVndTWpX49fHffA5OL5rH3NUKmj5YOF/vF
+MS2Dnvc7ch0Xap4OxDnAsZNZlcDBDAzelCssv1bqujGAiwD4b+J9VjDt4FP2JLxf
+VrFPZ+uXgRs6A50vAd+3cPKUIC6jFVSnblT8SIdRp01VspiZInprzWQaNEk29DKI
+9xxJWxVrptaSLNkphehp2sED/jOpVucjEhB+KWR9t00PDEU0/5dYzjtfjZdIWp/u
+iElC+eBE5NQ383jhShQudm6fj9rJrS+cDB42csp9N07UaHoApAHJ4xn5/s9hUeeP
+ZhrIthc5yjcPXISUlurK0ZgXltQoOKmj7UDc+n674iefgEMJ5yEnzU5ReRDqXNem
+wqTtgNoWWbaHw4lB5RpPCjeBAnaDojFd0VJV4UYXXac5qb53
+-----END CERTIFICATE-----
+
 subject= /C=HU/L=Budapest/O=NetLock Kft./OU=Tan\xC3\xBAs\xC3\xADtv\xC3\xA1nykiad\xC3\xB3k (Certification Services)/CN=NetLock Expressz (Class C) Tan\xC3\xBAs\xC3\xADtv\xC3\xA1nykiad\xC3\xB3
 serial=49412CE40019
 -----BEGIN CERTIFICATE-----
@@ -27389,6 +32996,44 @@
 17j3ynVWWto+KwhLtVh4Vq4UNMiZo4gwJFO6UzKoYZ4lpwAT
 -----END CERTIFICATE-----
 
+subject= /C=US/ST=Texas/O=ATT Services Inc/OU=ATT Wi-Fi Services/CN=AWS Corporate CA G2
+serial=18D7E6B80EFA544B
+-----BEGIN CERTIFICATE-----
+MIIGITCCBQmgAwIBAgIIGNfmuA76VEswDQYJKoZIhvcNAQEFBQAwgZAxCzAJBgNV
+BAYTAlVTMQ4wDAYDVQQIEwVUZXhhczEZMBcGA1UEChMQQVRUIFNlcnZpY2VzIElu
+YzEbMBkGA1UECxMSQVRUIFdpLUZpIFNlcnZpY2VzMTkwNwYDVQQDEzBBVFQgV2kt
+RmkgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgRzIwHhcNMTMw
+NjA1MTgyNzU3WhcNMTgwNTMwMDAwMDAwWjBzMQswCQYDVQQGEwJVUzEOMAwGA1UE
+CBMFVGV4YXMxGTAXBgNVBAoTEEFUVCBTZXJ2aWNlcyBJbmMxGzAZBgNVBAsTEkFU
+VCBXaS1GaSBTZXJ2aWNlczEcMBoGA1UEAxMTQVdTIENvcnBvcmF0ZSBDQSBHMjCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJeLnLlXYOCPIryXxZ3WQLFU
+lLwbnOveZgTlmALqGvbSQ7SlukksydSvqlje14Mtl/7dDoGtiUN3YmWsBSblTMPd
+4iq2yY6CL/tMxxdztx9bpHc+XoSIeMR5aOScZhA5xgnczmXvbG3qQFTGAQNKA0To
+dIgtAX2XeGz0V12b1lH9rIwmcbGPQvR77IELnXqmv731V7k72Q4nWgK7h3C7K5rW
+NjNrF1RjKsIMrNe908ENtQkgaHCagVdP+G6B7l/aUxFNNNMWs05tw0BNF/iC7Nl6
+KKNZol1P7Jgl0gZpXbQzbW8ppDIPn+llhUe3Uu57s6fIC0GK6vb7q5Nftqx9yy8C
+AwEAAaOCApkwggKVMHAGCCsGAQUFBwEBBGQwYjA1BggrBgEFBQcwAoYpaHR0cDov
+L2NybC1iLnBraS53YXlwb3J0Lm5ldC9yb290Y2FnMi5jcnQwKQYIKwYBBQUHMAGG
+HWh0dHA6Ly9vY3NwLWIucGtpLndheXBvcnQubmV0MB0GA1UdDgQWBBR66UL8/8Nh
+qJNgEIRehegOyYBy2jASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFPPT
+x14sRSZ+/ebktJS4BA85OxDeMIHjBgNVHSAEgdswgdgwDQYLKwYBBAGjSIN9AQMw
+gcYGCysGAQQBo0iDfQEBMIG2MIGABggrBgEFBQcCAjB0HnIAQwBvAHAAeQByAGkA
+ZwBoAHQAIAAoAGMAKQAgADIAMAAxADMAIABBAFQAVAAgAFcAaQAtAEYAaQAgAFMA
+ZQByAHYAaQBjAGUAcwAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIA
+dgBlAGQwMQYIKwYBBQUHAgEWJWh0dHA6Ly9jcmwtYi5wa2kud2F5cG9ydC5uZXQv
+Y3BzLmh0bWwwgdYGA1UdHwSBzjCByzCByKAtoCuGKWh0dHA6Ly9jcmwtYi5wa2ku
+d2F5cG9ydC5uZXQvcm9vdGNhZzIuY3JsooGWpIGTMIGQMQswCQYDVQQGEwJVUzEO
+MAwGA1UECAwFVGV4YXMxGTAXBgNVBAoMEEFUVCBTZXJ2aWNlcyBJbmMxGzAZBgNV
+BAsMEkFUVCBXaS1GaSBTZXJ2aWNlczE5MDcGA1UEAwwwQVRUIFdpLUZpIFNlcnZp
+Y2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IEcyMA4GA1UdDwEB/wQEAwIB
+BjANBgkqhkiG9w0BAQUFAAOCAQEAZvJm7QmMmXYf9DCfru5Bggft9VgsvIS/ARj8
+NJGMVX5HWtqUxHxC1Hn62MkwOYL7C1OVplFbfHCVtKncZCmUP/t2dtwEvzrmFROV
+YBlOuz7I4CkX+8GD7HTaZGwah6ldEJYxmQuPE4ePrGSkHw8wYvEVQmKda7+qB4Mb
+WVJ818So9NIo/z8cUnTKjgYcnPd1R1DvTRdyUWuBPt8sOkaF7C2aUasuCsAVKgaE
++hLTyY/iQyz8pVRdy+JFVqpxomkmDUo55ia8VV+j4DOLUVJqH+l91ykv3sOOlhAl
+RyjdMdAlgERz3IpbVdfMudMBux6X4YjVm6gz4TXSAtKBmkT6Ww==
+-----END CERTIFICATE-----
+
 subject= /C=HU/L=Budapest/O=NetLock Kft./OU=Tan\xC3\xBAs\xC3\xADtv\xC3\xA1nykiad\xC3\xB3k (Certification Services)/CN=NetLock K\xC3\xB6zjegyz\xC5\x91i (Class A) Tan\xC3\xBAs\xC3\xADtv\xC3\xA1nykiad\xC3\xB3
 serial=49412CE40024
 -----BEGIN CERTIFICATE-----
@@ -27503,6 +33148,44 @@
 PhDsKH22azkJFcOONZy29ggpabJ+Rf6opJz2ks17jJLQQeEBY7vPNyqb
 -----END CERTIFICATE-----
 
+subject= /C=US/ST=Texas/O=ATT Services Inc/OU=ATT Wi-Fi Services/CN=AWS Managed Device CA G2
+serial=1954AA5A222C5B00
+-----BEGIN CERTIFICATE-----
+MIIGJjCCBQ6gAwIBAgIIGVSqWiIsWwAwDQYJKoZIhvcNAQEFBQAwgZAxCzAJBgNV
+BAYTAlVTMQ4wDAYDVQQIEwVUZXhhczEZMBcGA1UEChMQQVRUIFNlcnZpY2VzIElu
+YzEbMBkGA1UECxMSQVRUIFdpLUZpIFNlcnZpY2VzMTkwNwYDVQQDEzBBVFQgV2kt
+RmkgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgRzIwHhcNMTMw
+NjA1MTgzMDE1WhcNMTgwNTMwMDAwMDAwWjB4MQswCQYDVQQGEwJVUzEOMAwGA1UE
+CBMFVGV4YXMxGTAXBgNVBAoTEEFUVCBTZXJ2aWNlcyBJbmMxGzAZBgNVBAsTEkFU
+VCBXaS1GaSBTZXJ2aWNlczEhMB8GA1UEAxMYQVdTIE1hbmFnZWQgRGV2aWNlIENB
+IEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjOTrK21RHv6+uR1y
+bdkMuzBYKKKiA1uZzxKL9a2RZjDsM94t8own2UbMxTJGMcXKE5ri0l6PzTx3kXGI
+2dmhMY/aMl5hGWWA5jsM2IW8Jk+JbU//PQKNp4Em+dUv/Rsw9HtnUTfjRYgrz0lO
+3SL8k6clTt4dYQ2N9PDUZYmtwLp+tI8FAqnaSBvgngZ8wJxQ+1kWCbKRr8atfRhB
+DkGsvCL9ePb3owI0d10RR8I7qmA4BsqvGNXAHpdPltRlNyPXqvHLJ7BT/3R2Zu4l
+GuAYbP0pFa6Jhm2hVkFdgWhaxEpDMDjbYZvcmoMm9c5kSBwam+PLsYwcUWyUfIhz
+23HtVwIDAQABo4ICmTCCApUwcAYIKwYBBQUHAQEEZDBiMDUGCCsGAQUFBzAChilo
+dHRwOi8vY3JsLWIucGtpLndheXBvcnQubmV0L3Jvb3RjYWcyLmNydDApBggrBgEF
+BQcwAYYdaHR0cDovL29jc3AtYi5wa2kud2F5cG9ydC5uZXQwHQYDVR0OBBYEFIOF
+i5IFG0GeRaursuP91UTKQb3nMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgw
+FoAU89PHXixFJn795uS0lLgEDzk7EN4wgeMGA1UdIASB2zCB2DCBxgYLKwYBBAGj
+SIN9AQEwgbYwgYAGCCsGAQUFBwICMHQecgBDAG8AcAB5AHIAaQBnAGgAdAAgACgA
+YwApACAAMgAwADEAMwAgAEEAVABUACAAVwBpAC0ARgBpACAAUwBlAHIAdgBpAGMA
+ZQBzACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZDAxBggr
+BgEFBQcCARYlaHR0cDovL2NybC1iLnBraS53YXlwb3J0Lm5ldC9jcHMuaHRtbDAN
+BgsrBgEEAaNIg30BAjCB1gYDVR0fBIHOMIHLMIHIoC2gK4YpaHR0cDovL2NybC1i
+LnBraS53YXlwb3J0Lm5ldC9yb290Y2FnMi5jcmyigZakgZMwgZAxCzAJBgNVBAYT
+AlVTMQ4wDAYDVQQIDAVUZXhhczEZMBcGA1UECgwQQVRUIFNlcnZpY2VzIEluYzEb
+MBkGA1UECwwSQVRUIFdpLUZpIFNlcnZpY2VzMTkwNwYDVQQDDDBBVFQgV2ktRmkg
+U2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgRzIwDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQB555zQk5O41sVYhdTawSJzhy+XnHmb
+YcGHu6j9nwcMPaHT/BdGBB6+74uasReCdSVBaNZGE3qe+xPOAcof0j9/8fPLxfeK
+qg9jjsloMds9aUxVxjQkUnbAUfkpK7I8PJURIJIaJbgQPkWjTydRo4od7ABANT+s
+LUnQIIUBrvd9/GJOSZyqmSdqFONRnRsfqTIzTqmiVSHb/1daPceAb/F1PzgJUoDV
+Xf5thDqbp1NiSJapdbDqani0kh/E0kZZ6uAUATjXa11/szAVNBFS0fn7/yHbBtQ9
+uGmglTQgHqEx9b0YHgjYVQazKDv4WJQMuyPLnhAoZC25GYa2KSzypTZr
+-----END CERTIFICATE-----
+
 subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 Extended Validation SGC CA - T1
 serial=1A4CE18725E5C114B8C98DE0EBA99AD6
 -----BEGIN CERTIFICATE-----
@@ -27541,6 +33224,44 @@
 kFdAGxN2sAx329bwFDNNYDk71sdM9/hozmkBjViYpg7FP5YJpvO9nHv/
 -----END CERTIFICATE-----
 
+subject= /C=CH/O=Swiss Government PKI/OU=Services/OU=Certification Authorities/CN=Swiss Government SSL CA 01
+serial=0727B609
+-----BEGIN CERTIFICATE-----
+MIIGKDCCBRCgAwIBAgIEBye2CTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE0MDkxMDE4NTAzNloX
+DTE3MDkxMDE4NTAxMVowgYgxCzAJBgNVBAYTAkNIMR0wGwYDVQQKExRTd2lzcyBH
+b3Zlcm5tZW50IFBLSTERMA8GA1UECxMIU2VydmljZXMxIjAgBgNVBAsTGUNlcnRp
+ZmljYXRpb24gQXV0aG9yaXRpZXMxIzAhBgNVBAMTGlN3aXNzIEdvdmVybm1lbnQg
+U1NMIENBIDAxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA379210+W
+I6Wl63BOe93KXb9T6mw4frXZBPgN6iKcVp4KGTOHLtCfztUrFJWWhNaapDoYcZKJ
+F4vNwQsYFIPZDdYhNeaubsOsoKznei3+1PBLpNyAVTbQ2SgEZcDuVYkpoSUzu+cT
+sZ/gAKYf3K1JacCdeEYRv55FXLJ991lTvKHLNNr4+IEZuOwMCqjdMKg/JF2Lh+nm
+AoT2YoUFBJHYWNMyTUZZ4pZVB8PZPCeM76FJHf+zG+kQ2gQhDaEyMFqjuH7URRkj
+nnV6GvenzOO7uIPiigKf9Ccpt05gnuezPKGtOwzJhpjTqOfxuVSH5HhDzDGPcrce
+rfwtHRW6Rnq0ix1kHUAmC6tB6fhKwCOOnSZ04YmaKwtMsGMsEIoaZ6+h7VlllKJ/
+OpVGGmTEdPzaEuJnCPUq0BuVOPWHtSyr6UcrTw4p8C+yjbE8Y99b9VkxdGGPU3vs
+8ZSObJjEILcR3NnQhK4/V9bP6v9CVqh933W/Q7LdN6vjWr6VdwqYUn1q7USqIp2W
+p+Q7KFg1VHh0JJTAirI9PSmsVmiWv4MXdBKFmd2PaT3w/HBEDTM5Fg8w6T0IPd26
+ApQ+Yg+EAkC+GfH0JNcVR3LdnVgm/IncnNJPrq7gteN1FJ+lxsbeN0947nDpoasf
+qjCUZVNcbzjeIfJEuBxZ6tCwJnrQF6Xi55UCAwEAAaOCAcUwggHBMBIGA1UdEwEB
+/wQIMAYBAf8CAQAwgakGA1UdIASBoTCBnjBIBgkrBgEEAbE+AQAwOzA5BggrBgEF
+BQcCARYtaHR0cDovL2N5YmVydHJ1c3Qub21uaXJvb3QuY29tL3JlcG9zaXRvcnku
+Y2ZtMFIGCGCFdAERAxUCMEYwRAYIKwYBBQUHAgEWOGh0dHA6Ly93d3cucGtpLmFk
+bWluLmNoL2Nwcy9DUFNfMl8xNl83NTZfMV8xN18zXzIxXzEucGRmMEIGCCsGAQUF
+BwEBBDYwNDAyBggrBgEFBQcwAYYmaHR0cDovL29jc3Aub21uaXJvb3QuY29tL2Jh
+bHRpbW9yZXJvb3QwDgYDVR0PAQH/BAQDAgEGMCcGA1UdJQQgMB4GCCsGAQUFBwMB
+BggrBgEFBQcDAgYIKwYBBQUHAwMwHwYDVR0jBBgwFoAU5Z1ZMIJHWMys+ghUNoZ7
+OrUETfAwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NkcDEucHVibGljLXRydXN0
+LmNvbS9DUkwvT21uaXJvb3QyMDI1LmNybDAdBgNVHQ4EFgQU/DVeWB34UuAr6Kyr
+uYKtFRHW5s0wDQYJKoZIhvcNAQELBQADggEBAJwbVrtGL68v2T0QhiuIKpFvNCpi
+2VpmyUwHY1IiIKxckiX9NoQdvSqwG9SePR3Fet9LC6d0SAnkXKTwnjP7hxTMdmMt
++TK/UnJWBBQCfMjwFRs0oAEFwyxSr04R2ZWIV/8DlTSQ3hxH2LPlgJjVosQfvdSG
+nqYK0KY3c7vMRC7QbtAIrmxY4CTqtBHiPQy/CV6zdcCYxgsKl3iPxPQAHEMIG8DY
+CaMW+JsRUTtdPIaXIa559nmHbG2xw/tm7Ku4ieKsd9RNkDIbE5DEi/clf1Xn8bW4
+AiV4lLjW7oN6i5m4QrGeFtWIXZXBFiurMtplyoJ/wmNw70ArcqxbOc174n0=
+-----END CERTIFICATE-----
+
 subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
 serial=641BE820CE020813F32D4D2D95D67E67
 -----BEGIN CERTIFICATE-----
@@ -27850,6 +33571,45 @@
 Oos2rmPXSGs=
 -----END CERTIFICATE-----
 
+subject= /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 3 Primary Intermediate Server CA
+serial=1D
+-----BEGIN CERTIFICATE-----
+MIIGNDCCBBygAwIBAgIBHTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDcxMDI0MjA1ODI0WhcNMTcxMDI0MjA1ODI0WjCB
+jDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsT
+IlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNVBAMTL1N0
+YXJ0Q29tIENsYXNzIDMgUHJpbWFyeSBJbnRlcm1lZGlhdGUgU2VydmVyIENBMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxtTlmqySw6jNfvATGV+1Z3tz
+CryzboJMuKv++wEh3XwM+fi1gAH9j8X6ORJYdCJcqWOA/D+E4Sh37S7xJR9JDCfp
+Po+6yS9G0D/pOuQjUZVCdBfGym0DOFrHfgaAtN+wy/rvVULObi1AYw7cF/a59olL
+Mt5B41FNcbMCmJEBzmhc6iqttRqI0lGX72VDfcdEvOLw7rdEetvTl6hx/s/2B58j
+/NxVY5M3J/oeqY0sPOSc3RMrH1mWZ1xgS96FgeblRRxdNfRbDn1/qdrEVxxc2jWH
+RyUUbpdevcgeTynGfBLcLsW9QUREZP2wGbeJL1TkbkMfxb/MKdQQzheL/9Gc2QID
+AQABo4IBrTCCAakwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFIn4QqYcYurH8TIJK0E+e6JcrsVLMB8GA1UdIwQYMBaAFE4L7xqkQFul
+F2mHMMo0aEPQQa7yMGYGCCsGAQUFBwEBBFowWDAnBggrBgEFBQcwAYYbaHR0cDov
+L29jc3Auc3RhcnRzc2wuY29tL2NhMC0GCCsGAQUFBzAChiFodHRwOi8vd3d3LnN0
+YXJ0c3NsLmNvbS9zZnNjYS5jcnQwWwYDVR0fBFQwUjAnoCWgI4YhaHR0cDovL3d3
+dy5zdGFydHNzbC5jb20vc2ZzY2EuY3JsMCegJaAjhiFodHRwOi8vY3JsLnN0YXJ0
+c3NsLmNvbS9zZnNjYS5jcmwwgYAGA1UdIAR5MHcwdQYLKwYBBAGBtTcBAgEwZjAu
+BggrBgEFBQcCARYiaHR0cDovL3d3dy5zdGFydHNzbC5jb20vcG9saWN5LnBkZjA0
+BggrBgEFBQcCARYoaHR0cDovL3d3dy5zdGFydHNzbC5jb20vaW50ZXJtZWRpYXRl
+LnBkZjANBgkqhkiG9w0BAQsFAAOCAgEASGTXnpQAUrMhzFcGLy/B/gNWS1zJ2j72
+py8ncV/rMxwBZdPwt6EUim63VwUA29wXrH6ANWF0UOBoaYJWyqkObaHY8cJuqbNh
+El+WXGTZSqgjtgdqdICdIYvqYya0rEj1Rr4tA9MoyG+1Xp4fPClHyMPAHcED5hWZ
+9wV0B2Rn8NOlbvmOj1dAQMfubRvxbKrWfAJ/J9KP+CntK/jh+v3EKSe1Jeyzn1pf
+0bz3pInkzfcxM53R6BWO24M3iVmAm3tY8uwwXFxv/3HVVgnorPXUFOxGujXPWv4m
+2LBtth7JH9COvQwFCqYZut9vWb+0efgp3PkY2PgZtf3HEu7l51VedulrcVEiljno
+8cpDjagdb50YxNPvp6aAwxkV7wd3cgcGzS8YmbmQ8GLBCDTCcSmSIYKFIy9dTAu6
+C5s60E6WeFHEtgNUoqzAXQ1zJLyQNRadhcM6f9lbjVCmv0/BvACOpGgAEEvjm4CY
+hKxZ+ob+KsEwXXQTT2HMa+bjBKopgj6VWTnf5j295YWP+3b0921AvZSzXDTiWIld
+8wrW3d89JxX69FuP3+CE85ryMxFwbuyITBYjnxDF9aFAlJOi5w7saXeBw1TvmYsi
+lX3+fwnn5Nu4PZqw4MjxRcip15q6pz+SPjdhpYqFDQ3mgrvf4dMHImruS2dA4t8b
+Y/h8BARHrec=
+-----END CERTIFICATE-----
+
 subject= /C=NL/O=Staat der Nederlanden/CN=Staat der Nederlanden Organisatie CA - G2
 serial=9896F4
 -----BEGIN CERTIFICATE-----
@@ -28398,6 +34158,46 @@
 DOA=
 -----END CERTIFICATE-----
 
+subject= /C=HU/L=Budapest/O=Microsec Ltd./CN=e-Szigno SSL CA 2014/emailAddress=info@e-szigno.hu
+serial=535CD2A3AC13D9DC4A4B830A
+-----BEGIN CERTIFICATE-----
+MIIGXjCCBUagAwIBAgIMU1zSo6wT2dxKS4MKMA0GCSqGSIb3DQEBCwUAMIGCMQsw
+CQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2Vj
+IEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEf
+MB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0xNDA3MDgxNDM1MjFa
+Fw0yOTEyMjkxNDM1MjFaMHgxCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVz
+dDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEdMBsGA1UEAwwUZS1Temlnbm8gU1NM
+IENBIDIwMTQxHzAdBgkqhkiG9w0BCQEWEGluZm9AZS1zemlnbm8uaHUwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/z1KGU12pZR5il1tkzC8F9itEF/A5
+u3FQnzLdPqurZo4o7YTOKdkV/bzRnGf5xphe6LZHhENDZJ78LkSxUNs7jLMnMjp1
+UDoW0cREg5nstWDX7heSMD59HBrm1W8sHMvmfwch+wwGaSUhzglff2WzdzCADqaB
+YkVTgm3XoEpGaoBMYAoyTnVbs2QX40AfGbzcQUDRxm4zcTU5ovfM6c3obQkCp4+s
+1K5nsmTzO/MnH1t+eE+0mt58aMwrqTe3vjabnppgDmMN2nXDEErjb9HrD/pv9Yeq
+XmWPzKTfJ0veEi/xndoeSkQOXETDB0u8vQlu/bmTgBUs3skzWp2X0vLbAgMBAAGj
+ggLbMIIC1zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA7BgNVHSAE
+NDAyMDAGBFUdIAAwKDAmBggrBgEFBQcCARYaaHR0cDovL2NwLmUtc3ppZ25vLmh1
+L2FjcHMwHQYDVR0OBBYEFN5qsE5DqghBR3S/pYqBVEwgxXUoMB8GA1UdIwQYMBaA
+FMsPxt9CQ8w9y7VII6EaeqYquzRoMBsGA1UdEQQUMBKBEGluZm9AZS1zemlnbm8u
+aHUwgbYGA1UdHwSBrjCBqzA3oDWgM4YxaHR0cDovL3Jvb3RjYTIwMDktY3JsMS5l
+LXN6aWduby5odS9yb290Y2EyMDA5LmNybDA3oDWgM4YxaHR0cDovL3Jvb3RjYTIw
+MDktY3JsMi5lLXN6aWduby5odS9yb290Y2EyMDA5LmNybDA3oDWgM4YxaHR0cDov
+L3Jvb3RjYTIwMDktY3JsMy5lLXN6aWduby5odS9yb290Y2EyMDA5LmNybDCCAV8G
+CCsGAQUFBwEBBIIBUTCCAU0wLwYIKwYBBQUHMAGGI2h0dHA6Ly9yb290Y2EyMDA5
+LW9jc3AxLmUtc3ppZ25vLmh1MC8GCCsGAQUFBzABhiNodHRwOi8vcm9vdGNhMjAw
+OS1vY3NwMi5lLXN6aWduby5odTAvBggrBgEFBQcwAYYjaHR0cDovL3Jvb3RjYTIw
+MDktb2NzcDMuZS1zemlnbm8uaHUwPAYIKwYBBQUHMAKGMGh0dHA6Ly9yb290Y2Ey
+MDA5LWNhMS5lLXN6aWduby5odS9yb290Y2EyMDA5LmNydDA8BggrBgEFBQcwAoYw
+aHR0cDovL3Jvb3RjYTIwMDktY2EyLmUtc3ppZ25vLmh1L3Jvb3RjYTIwMDkuY3J0
+MDwGCCsGAQUFBzAChjBodHRwOi8vcm9vdGNhMjAwOS1jYTMuZS1zemlnbm8uaHUv
+cm9vdGNhMjAwOS5jcnQwDQYJKoZIhvcNAQELBQADggEBALEgpxbV/mGh1vWAO8dx
+ONwv+aP7Nb5dXTP0YjtrIE6a5zV+IpXK+inu+OJftAHV0an32ovpzpta2EvR5ci/
+C7o9h8eyforkTxMDndPwZ97ey/5qaz48t7wdz6w6YXCs5LpMzU4BmG+ubTdGNZQv
+w6cwlxRl3p2KZTZbyJj7t3fM5JcrKVwn8844bfFTKSQni90xzxiO8bz5LjFoDMii
+vCKKMZXHpZMEi4QsyEKT6sqT+RXp8dsRrdJ/klSu8kUQu4xyWTTTMVs9cCG7ZxzR
+VyNLg3Rc7vMcYCe5KOiP+H1y0pR9FRSGqMS7Rwa0A4J5nMlGKogQ5R/pp715cMbK
+mpQ=
+-----END CERTIFICATE-----
+
 subject= /C=CN/O=WoSign eCommerce Services Limited/CN=Certification Authority of WoSign
 serial=39
 -----BEGIN CERTIFICATE-----
@@ -28518,6 +34318,46 @@
 274jjFM+IWuF+A==
 -----END CERTIFICATE-----
 
+subject= /C=BR/ST=SP/L=S\xC3\xA3o Paulo/O=Site Blindado S.A./OU=Controlled by COMODO exclusively for Site Blindado S.A./OU=Certifica\xC3\xA7\xC3\xA3o Digital/CN=SSL Blindado EV 2
+serial=5E1029DAAC1BEB97AB0FF73072834A8B
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBE6gAwIBAgIQXhAp2qwb65erD/cwcoNKizANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwOTA5
+MDAwMDAwWhcNMjQwOTA4MjM1OTU5WjCByzELMAkGA1UEBhMCQlIxCzAJBgNVBAgT
+AlNQMRMwEQYDVQQHDApTw6NvIFBhdWxvMRswGQYDVQQKExJTaXRlIEJsaW5kYWRv
+IFMuQS4xQDA+BgNVBAsTN0NvbnRyb2xsZWQgYnkgQ09NT0RPIGV4Y2x1c2l2ZWx5
+IGZvciBTaXRlIEJsaW5kYWRvIFMuQS4xHzAdBgNVBAsMFkNlcnRpZmljYcOnw6Nv
+IERpZ2l0YWwxGjAYBgNVBAMTEVNTTCBCbGluZGFkbyBFViAyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsAwuQngySVT2wWgmNPFjQmbPEv3kxt0b+vIR
+8qTUkdTx7bS9+yBpdWQdGfgl8bmh8jC7b8TFA5vkvQTmwegymj4uJdpDgvfv/jX7
+qspNyGKjRgV0l3dgWa0K4gKSgcc9ewMc3edrQsGGq//T6eCHB3NKUSFKtKzZJA+T
+a7+olEQdUtFjEUOoJXWrqXpPMyugzCAjpXkVPCRw6Zr/rUuxNVug8kWZPisOdn37
+IK3uqMtyTrcZfrTIjO9NdlCjxiNE+/V7HRkmGtcYOKWzhyKOH4Hl4f4bMvaMSZlL
+JIRg7t5K1SzwVbHyuSnWbieY3dU9xm6N210Nm2X4i712bujKJQIDAQABo4IBiDCC
+AYQwHwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFAM1
+3g55AZ2hMUGG+PJt60nIs8aFMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAG
+AQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjA+BgNVHSAENzA1
+MDMGBFUdIAAwKzApBggrBgEFBQcCARYdaHR0cHM6Ly9zZWN1cmUuY29tb2RvLmNv
+bS9DUFMwTAYDVR0fBEUwQzBBoD+gPYY7aHR0cDovL2NybC5jb21vZG9jYS5jb20v
+Q09NT0RPUlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwcQYIKwYBBQUHAQEE
+ZTBjMDsGCCsGAQUFBzAChi9odHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9S
+U0FBZGRUcnVzdENBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2Rv
+Y2EuY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAQm8wapory7w6ITi/aRGoiso7iApXY
+sH00q08BQLyt9Y3b163EDWBJJZSlwnwOskJBFgm2U/qq+BwSMq4HD4hzSztfGaV0
+lLlnXa7Kv3AByS0TYWpQKzi1fshkZlMAyhXYjNQtMb+EnJ2DvRCIf5acs07hKAdY
+zWGW8StZwQWYTgrPw2n7SORrGXFyEr3tSFvPdabbQiZaJ8N+B/NBjQ8lQQcFaNNO
+eMAe/axkatz6XFZHXqJR/Fl2LU61wnuYv0TEwkqThSRDGoSzt/f+vfFFoZljr/Gz
+fEK6Rj1jMTih0GHHk2HYyLERCD47jtaOk540/HC9WhhQfLTemnNoXrhpCureLpnN
+H3nvkpcALqntlDTx8bvx6ZgVPz1g4oi6siHsb/kCHt9AQrNg1VUsEuK5fCUILxIU
+M2y/xLB+XzpXDpNdkM7tQUpDe3kgA4cmA9BCXgyRuBrrRxbcxDmh+iq7ken7tmPk
+WcIwtyeqMLKspSYlecSK4xBTmAH2U+GZkl89ZnJjE5MMaId3bnZZ97Agj01csquI
+GVvztu0+Lm+6ZVrXNiuzCxjeJtVLqJ7raDyeUX1UI3lm6YlUhBRanv8Ox5OzYOPC
+ElNdfP+5fmM9ydpXhnG/h/jWkWCH76FwmN79tFjSQSBGaxUqUZLQYG2p3AAgATaQ
+35R6Egl4TpUq9g==
+-----END CERTIFICATE-----
+
 subject= /C=ES/O=AC CAMERFIRMA S.A./L=MADRID (Ver en https://www.camerfirma.com/address)/OU=AC CAMERFIRMA/serialNumber=A82743287/CN=AC CAMERFIRMA AAPP
 serial=0D
 -----BEGIN CERTIFICATE-----
@@ -28718,6 +34558,86 @@
 T2TqAPQSMWGbI8Xv2tncNegK0TNiNe+DI6cSDsI0+aM=
 -----END CERTIFICATE-----
 
+subject= /C=FR/O=Certinomis/OU=0002 433998903/CN=Certinomis - Easy CA
+serial=21
+-----BEGIN CERTIFICATE-----
+MIIGgjCCBGqgAwIBAgIBITANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET
+MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk
+BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTE0MDIyNjEw
+MTQyOFoXDTI0MDIyNjEwMTQyOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl
+cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0
+aW5vbWlzIC0gRWFzeSBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+AK60Aj/AWny/ZAjKDh8xWSGbKR0PBi+UvpRFAQaUWkI+05a/VP2/q5vO8dLihC20
+HjLablNrrtJ6driubt9BW1I1skeQSFxi/PZukgpu3kLD/wbe1+oATGLWU8Cx2DZm
+NH8f3M921SbtTkAlPfri7H50ia/xK42MXCLVac9+0cepzejHlY0cNA6hguReiN+X
+Wi0T3bwbw1ablidU47M6zJkQ3/0E+wJJP2pLfssEw0WOjcRsvscQwq0Ey8xsYIfV
+f6QFOr4Y8TsHhQ0hKqIxdaeGpJh2uznlvtv56wlRo+EL15Ol8zFsf5u+w8mOul9K
+JoquCR2jYdqI4QizSCVLa/66ypZSrtsJLfkpeQzk2xnQ8wP8lhG3oirh7a/ZZfmC
+e24pNp26wXUTI+Q1Geuyxhq29A+ZRnwn/9DCVS9SIRdAu4GQSVtPhb/f1yjkjFY1
+bYfJMRIYDqCjCc6lNQhO4mvv4j1crNGojypk2cFLCRbthW2Qmt6cQorN7xIsZ9g1
+IgLdK4OCNgd58clSVhaJC/A4BKIuwBu0HO3ucHvVA6ty0eTQq7QJQ0k6ol3WQI7k
+skS+CEzWGM4eH+UHHRIaVe+wTzxTSwXu0n1QwOrwtm+zA8fqtdk9kEGy+uFhsuKG
+ua9CfliTH30Q4a7maWNiU+h6WFSfe2UGRBkUW2XbNvtnAgMBAAGjggFIMIIBRDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQNjLZh
+2kS40RR9w759XkjwzspqsDAdBgNVHQ4EFgQULMXjIC+rChHW9zrXUXj0bI+xAFkw
+gccGA1UdHwSBvzCBvDA3oDWgM4YxaHR0cDovL2NybC5jZXJ0aW5vbWlzLmNvbS9B
+Q19SYWNpbmUvY3JsL2NybC0xLmNybDCBgKB+oHyCE2xkYXAuY2VydGlub21pcy5j
+b22kZTBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UE
+CxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0
+w6kgUmFjaW5lMBcGA1UdIAQQMA4wDAYKKoF6AVYCAgABATANBgkqhkiG9w0BAQUF
+AAOCAgEAkRuUyk+oMv5Z0H9vICR8LUYwCZ+WCqxwsnhoOFI3BGeMJytQz4M3A1fp
+/YbpoXnbY0mBeIJZQs5Bk1R12DfChHHBHaVLp2WM14EPbrf6iewLYTAMKCSC1l20
+yA8O+p0eHff0QrzlNn6xTozVyj7XsPYG9itFDChBI8BWDteVzfPbqmU32uPlndUd
+f7h7Z4kTMDwRPPXrvKmt2A+UgSnGbbZjqef65fN0eOLSFdUNxyBlrzQTrtc235++
+2SW/TT6gWIOecoMgvSuwuI0dOCCCvgZ42sjCVoX2YFmLR/1F0/HNwGs1Bq6TiDW0
+0WeAr7lavvTMiBl41kUvug6UuzFsOHbFZf+RxA4IvGErVzcqqmr43shiEkkukWLW
+NAIWtWCNr3pPsQ9YP7Kb7BwD3KJKcf/W5+C/Mb/q7zEkXBsX6eY0eKHpXrE+hZ4I
+64ukgib6x8N3qOFFQWPTjqS+TRnX3MprCI/syn/vcdZPa2/CCYKe5CBnALHVelEb
+YWKwLdyT/FhTsr7JzamJ8apW4eHMVXRV0mlEY1gXdlM3CiNz/eyPEcqOaYhGH+eG
+0isMHfQ4xfIRZ7mZ9tihbgx/kv/7RVYW2aaCnsiMGIn3h+Pvu0cRthOoTGGpHX4k
+SAsly89LHCDuCNaqlhxKZcxSHrlStSlZj2r4noTMj1LrQK87u/k=
+-----END CERTIFICATE-----
+
+subject= /C=US/O=Digital Signature Trust Co./OU=TrustID Server/CN=TrustID Server CA A5
+serial=D50036F55837BC6A008480F6BBC93F34
+-----BEGIN CERTIFICATE-----
+MIIGiDCCBXCgAwIBAgIRANUANvVYN7xqAISA9rvJPzQwDQYJKoZIhvcNAQEFBQAw
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYMzAeFw0xMTA5MTYyMzQ5NTBaFw0xODA5MTYyMzQ5NTBa
+MGsxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVz
+dCBDby4xFzAVBgNVBAsTDlRydXN0SUQgU2VydmVyMR0wGwYDVQQDExRUcnVzdElE
+IFNlcnZlciBDQSBBNTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOae
+jyufM+mrKgTCpPm9ha5UBAORNLhAv3PFlmzA8n6lnEvBTJfeG5vUZYQrlZMMKmZl
+F1D3mYRFAhT/qFbBsTMlF9XsDNF40NB21ABTquuEB3Ji8mmC1Z2cZjwa4VeKxGIq
+kTdBypQgWekopNVvoOGLPbRXgYKW4UCc6pt7Q+We+eUuonp2XIRIOvmJQtXb/rNz
+4B1ahu3QB4HnystmQ9dW8BySSGDhZ/kzIcSU8GuHcL58SHsei07gjFzXRhMkkbJH
+MT8zS/hrjNsB8Z5kamI4QL7nLVNuCF1Sg9zgB1POdMPLEnm4uDx+BRLwVMGZMwza
+MNfEATnWTvLazzIDarMCAwEAAaOCA1EwggNNMIGvBggrBgEFBQcBAQSBojCBnzAl
+BggrBgEFBQcwAYYZaHR0cDovL29jc3AuaWRlbnRydXN0LmNvbTB2BggrBgEFBQcw
+AoZqbGRhcDovL2xkYXAuaWRlbnRydXN0LmNvbS9jbj1EU1QlMjBSb290JTIwQ0El
+MjBYMyxvPURpZ2l0YWwlMjBTaWduYXR1cmUlMjBUcnVzdCUyMENvLj9jQUNlcnRp
+ZmljYXRlO2JpbmFyeTAPBgNVHRMBAf8EBTADAQH/MIIBMQYDVR0gBIIBKDCCASQw
+ggEgBgpghkgBhvkvAAYDMIIBEDBKBggrBgEFBQcCARY+aHR0cHM6Ly9zZWN1cmUu
+aWRlbnRydXN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L3RzL2luZGV4Lmh0bWww
+gcEGCCsGAQUFBwICMIG0GoGxVGhpcyBUcnVzdElEIFNlcnZlciBDZXJ0aWZpY2F0
+ZSBoYXMgYmVlbiBpc3N1ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIElkZW5UcnVzdCdz
+IFRydXN0SUQgQ2VydGlmaWNhdGUgUG9saWN5IGZvdW5kIGF0IGh0dHBzOi8vc2Vj
+dXJlLmlkZW50cnVzdC5jb20vY2VydGlmaWNhdGVzL3BvbGljeS90cy9pbmRleC5o
+dG1sMIG5BgNVHR8EgbEwga4wLqAsoCqGKGh0dHA6Ly9jcmwuaWRlbnRydXN0LmNv
+bS9EU1RST09UQ0FYMy5jcmwwfKB6oHiGdmxkYXA6Ly9sZGFwLmlkZW50cnVzdC5j
+b20vY249RFNUJTIwUm9vdCUyMENBJTIwWDMsbz1EaWdpdGFsJTIwU2lnbmF0dXJl
+JTIwVHJ1c3QlMjBDby4/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5hcnkw
+RwYDVR0lBEAwPgYIKwYBBQUHAwEGCCsGAQUFBwMDBggrBgEFBQcDBQYIKwYBBQUH
+AwYGCCsGAQUFBwMHBgorBgEEAYI3CgMBMA4GA1UdDwEB/wQEAwIBxjAdBgNVHQ4E
+FgQUt6jLaK7cRUPS3IkRqYFmGfn7dekwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQ
+df/EFWCFiRAwDQYJKoZIhvcNAQEFBQADggEBADj1Quwn4tv15fuyNLGfOlushjY2
+13qH095OkdvXZpdhNTrQ28gkRaqWVAxH1r6t5xXPQYC9kQWzv+8/7HtLpRh1HBP1
+smCty8aMgr5lSniLI7PwViIr1mvroydyOoBO+iX6lBoaFMWsJMcGAccQf9oPUz3a
+sMVJW696sKKyMz5OkmEk4UzDN+xpRqrOqhnT/rlk4da8nvk0oTCqCgwCAE0A3IZh
+kZspVGjuD9ARwz0cf2y50I2r8+zjAlMkqm6fjPBDEM7Yim1vQYbXxZ+2MMEH3K47
+5+sSQasjKpl2Q8gAC9ft2mtxlA53UOp1c9M2qvY3ZoJDDQdarfLHubxe86o=
+-----END CERTIFICATE-----
+
 subject= /postalCode=46980/emailAddress=acedicom@edicomgroup.com/CN=ACEDICOM 01/serialNumber=B96490867/OU=PKI/O=EDICOM/L=Ronda de Auguste y Louis Lumiere 12 Paterna/ST=Valencia/C=ES
 serial=5D726090D98DF33B
 -----BEGIN CERTIFICATE-----
@@ -28963,6 +34883,47 @@
 Y5mbkvu5+9xcWGhKNBLBq/isdBPkyfLVeVWxxkQ=
 -----END CERTIFICATE-----
 
+subject= /C=DE/O=T-Systems International GmbH/OU=T-Systems Trust Center/ST=Nordrhein Westfalen/postalCode=57250/L=Netphen/street=Untere Industriestr. 20/CN=TeleSec ServerPass DE-2
+serial=C75E01582AC3BEE7
+-----BEGIN CERTIFICATE-----
+MIIGrDCCBZSgAwIBAgIJAMdeAVgqw77nMA0GCSqGSIb3DQEBCwUAMHExCzAJBgNV
+BAYTAkRFMRwwGgYDVQQKExNEZXV0c2NoZSBUZWxla29tIEFHMR8wHQYDVQQLExZU
+LVRlbGVTZWMgVHJ1c3QgQ2VudGVyMSMwIQYDVQQDExpEZXV0c2NoZSBUZWxla29t
+IFJvb3QgQ0EgMjAeFw0xNDAyMTExNDMwMTdaFw0xOTA3MDkyMzU5MDBaMIHZMQsw
+CQYDVQQGEwJERTElMCMGA1UEChMcVC1TeXN0ZW1zIEludGVybmF0aW9uYWwgR21i
+SDEfMB0GA1UECxMWVC1TeXN0ZW1zIFRydXN0IENlbnRlcjEcMBoGA1UECBMTTm9y
+ZHJoZWluIFdlc3RmYWxlbjEOMAwGA1UEERMFNTcyNTAxEDAOBgNVBAcTB05ldHBo
+ZW4xIDAeBgNVBAkTF1VudGVyZSBJbmR1c3RyaWVzdHIuIDIwMSAwHgYDVQQDExdU
+ZWxlU2VjIFNlcnZlclBhc3MgREUtMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMHWx2C9jv+zTa0ozU7UYxigVYFojomNFXgqryGQSAABlu90wJKu2W9k
+U5if512NqyiZcXrgK+V1gzBNg5VYfWM46GEkC4+tDpWuIluAExvW5qTQyyAHVVcc
+5437QpAo6n0P2l5/tJ3b3mGr+QNSczB7M+fqBlehVu8GJYU41cp/YeT4i11WPnZT
+dAojd9S183JMTtQMlgoCU2WSB3gZoaCcE5HxroX0qOGAuwpC7LxvTT7tCYZG8A7f
+7q65qtRByIEbsr+7E3xhvw2V0J/C9t1qQJtKav35kn7m96nVC2HiveJr0R3FKPWW
+29R0rylQw+XxH5yGW8mL3mx2j4l0o+8CAwEAAaOCAtwwggLYMA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQUVAQpb6KTxpAxRcA93iviCmmAkl8wHwYDVR0jBBgwFoAU
+McN5G7r1U9cX4Il6LRdsCrMrnTMwEgYDVR0TAQH/BAgwBgEB/wIBADBZBgNVHSAE
+UjBQMEQGCSsGAQQBvUcNAjA3MDUGCCsGAQUFBwIBFilodHRwOi8vd3d3LnRlbGVz
+ZWMuZGUvc2VydmVycGFzcy9jcHMuaHRtbDAIBgZngQwBAgIwge8GA1UdHwSB5zCB
+5DA6oDigNoY0aHR0cDovL2NybC5zZXJ2ZXJwYXNzLnRlbGVzZWMuZGUvcmwvRFRf
+Uk9PVF9DQV8yLmNybDCBpaCBoqCBn4aBnGxkYXA6Ly9sZGFwLnNlcnZlcnBhc3Mu
+dGVsZXNlYy5kZS9DTj1EZXV0c2NoZSUyMFRlbGVrb20lMjBSb290JTIwQ0ElMjAy
+LE9VPVQtVGVsZVNlYyUyMFRydXN0JTIwQ2VudGVyLE89RGV1dHNjaGUlMjBUZWxl
+a29tJTIwQUcsQz1ERT9BdXRob3JpdHlSZXZvY2F0aW9uTGlzdDCCASMGCCsGAQUF
+BwEBBIIBFTCCAREwKgYIKwYBBQUHMAGGHmh0dHA6Ly9vY3NwMDIudGVsZXNlYy5k
+ZS9vY3NwcjBBBggrBgEFBQcwAoY1aHR0cDovL2NybC5zZXJ2ZXJwYXNzLnRlbGVz
+ZWMuZGUvY3J0L0RUX1JPT1RfQ0FfMi5jZXIwgZ8GCCsGAQUFBzAChoGSbGRhcDov
+L2xkYXAuc2VydmVycGFzcy50ZWxlc2VjLmRlL0NOPURldXRzY2hlJTIwVGVsZWtv
+bSUyMFJvb3QlMjBDQSUyMDIsT1U9VC1UZWxlU2VjJTIwVHJ1c3QlMjBDZW50ZXIs
+Tz1EZXV0c2NoZSUyMFRlbGVrb20lMjBBRyxDPURFP2NBQ2VydGlmaWNhdGUwDQYJ
+KoZIhvcNAQELBQADggEBACxszDCOWtQ4zj/Uozfb/si6Ss5tqgfoSlQ5tTan3Ffo
+sKvuDMAIv6uUDoiXeJrS/rPLiKkDaBc/Rn1lzKI2mmWzrU15YsGGTaG7rIRlY7vq
+oXEox6sEWZxTclyP8m/fd8fZpJMH2U6GuTavXJ/AK//9fMzuvGgQsQsyxws9tm4Q
+Cd3oSVd/daUbHQ+6BIBRPyyM55S1DQDH6V4+tLFZfiZwcjZpJy2Fstd6U60P0gqJ
+WQQpZUER4nXTbAm8AH1G3xe34lFoNgS+lhuCuKKsPJ49PhhHWVAzlQFqfol1s9Bi
+s7EXLeoDyhJrvTjSqPaX87PaKt0W0+N7h/fpNgcMfhE=
+-----END CERTIFICATE-----
+
 subject= /C=US/O=IdenTrust LLC./OU=TrustID Server/CN=TrustID CA A51
 serial=0A01414100000138ED74F63900000002
 -----BEGIN CERTIFICATE-----
@@ -29127,6 +35088,47 @@
 MC7ERbt3ukcmmxcjjz6jTyQD1A20YxRj3yUEewNoRXcv4Jtu7slkCQ==
 -----END CERTIFICATE-----
 
+subject= /C=IL/O=StartCom Ltd./OU=StartCom Certification Authority/CN=StartCom Extended Validation Server CA
+serial=12
+-----BEGIN CERTIFICATE-----
+MIIGuTCCBKGgAwIBAgIBEjANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDcxMDI0MjMxNjAyWhcNMTcxMDI0MjMxNjAyWjCB
+gTELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKTAnBgNVBAsT
+IFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS8wLQYDVQQDEyZTdGFy
+dENvbSBFeHRlbmRlZCBWYWxpZGF0aW9uIFNlcnZlciBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBALbD1LIPd205K+OtHnsfOYqXxWNvkrLeQuKp1XPt
+GzciyynId1iz+VDaAsMe5GfaA3PPZ798mZkQxKXDVk2idd/fb6ebsuctoY9gN5PJ
+Knor/8+P2EmYA3H28uIa8lFOtol9mYGNgiFXldY7k/XWxtoa6YF1BpS3LdRi39Y2
+sLKegVrsg3BGRobaaCmk8LZCGthYeXChbEy9KReJkY5bdiDANxVIoVb4cRSo3uM0
+EznGfezw4ITVxdzhx7HeNTnIBxlfvrjLlMd0DIYw3P7ZAgGplwjZ+U2wDy1BTefW
+u94zgylm0uiqmWLn0XXv8jDVS8Y0ny7lvDtuiQYY1RlUqw0CAwEAAaOCAj0wggI5
+MBIGA1UdEwEB/wQIMAYBAf8CAQAwCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBSh4Z5F
+JXlNBtkCF5KC1TCJciUUoDCBqAYDVR0jBIGgMIGdgBROC+8apEBbpRdphzDKNGhD
+0EGu8qGBgaR/MH0xCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBMdGQu
+MSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMSkw
+JwYDVQQDEyBTdGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eYIBATAJBgNV
+HRIEAjAAMGYGCCsGAQUFBwEBBFowWDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3Au
+c3RhcnRzc2wuY29tL2NhMC0GCCsGAQUFBzAChiFodHRwOi8vd3d3LnN0YXJ0c3Ns
+LmNvbS9zZnNjYS5jcnQwYAYDVR0fBFkwVzAsoCqgKIYmaHR0cDovL2NlcnQuc3Rh
+cnRjb20ub3JnL3Nmc2NhLWNybC5jcmwwJ6AloCOGIWh0dHA6Ly9jcmwuc3RhcnRz
+c2wuY29tL3Nmc2NhLmNybDB3BgNVHSAEcDBuMGwGBFUdIAAwZDAvBggrBgEFBQcC
+ARYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwMQYIKwYBBQUH
+AgEWJWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9leHRlbmRlZC5wZGYwDQYJKoZI
+hvcNAQEFBQADggIBACw9M0UrEovu09TFAjpEjefMKB7sF96GbFZXvnm0z23S8bjL
+juP5IvYYPNoGR2UzqyVyyfOqFOL3ROj5h7AAoDwSaXRTRVDf7aYalr+pzMVFGIRS
+OvGdU3C0G8LvwUIMSxh33Yp0p3mwS6s+x9gRP9mH/oxYDC9FbFTglOqIXlW9PjgX
+OWJy20+9jFrPFZB1fBb5ACOG5vVVQ6i4PEMih316e8BEkB9PlO/RfqZqdgA4Thwz
+o3Iw10n4eA9pel4mn9piqH0gXsnAf6k6OhpmJ3qB8S5QiSB0BkDo2Aqzp8MQ26Me
+XsgAt9bKqc9HIjSOaLFQ8wU1Z9fQ60VuwH9OKa/ErirLFJD8mTQYV/L6hKKaysBo
++SrUm2nV8jYd5VPyQAFL7DVg5rUaFZzQKaO34efyhrh908dbzJzWq5RE8ip/ITdc
+bYtXCSwsrJ/HFGq4aemeVdIyBHM4wpmKhW51rIqOvdwr6lX5DsMOzTlwcOPZAPKr
+sNpwDAAapLRITqdo80gvBuI69oyEh13yCZTXrLU4iHiIht6/kFTQQ8ZtrEK4R8nc
+BV8xUdsKYowKp9wtcduzTje1Z+yMl9FgjAd8iC/ADrNaafedy/5vvPUVUuAdEqmJ
+v16R+hrfcM9JUxUZTKlhd+KS2OgYvnIFK3g7+GT+CG80D8TJdIiBDzfY8dbW
+-----END CERTIFICATE-----
+
 subject= /C=US/ST=CA/L=Santa Clara/O=Intel Corporation/CN=Intel External Basic Issuing CA 3A
 serial=612C37F200010000000F
 -----BEGIN CERTIFICATE-----
@@ -29334,6 +35336,90 @@
 7GmDbZOqbA==
 -----END CERTIFICATE-----
 
+subject= /C=NL/O=ESG de Electronische Signatuur B.V./CN=ESG Organisatie CA - G2
+serial=013138C5
+-----BEGIN CERTIFICATE-----
+MIIGxDCCBKygAwIBAgIEATE4xTANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMTIwMAYDVQQDDClTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gT3JnYW5pc2F0aWUgQ0EgLSBHMjAeFw0xMjEyMTkx
+MDE0MDVaFw0yMDAzMjMxMDEwMzZaMF0xCzAJBgNVBAYTAk5MMSwwKgYDVQQKDCNF
+U0cgZGUgRWxlY3Ryb25pc2NoZSBTaWduYXR1dXIgQi5WLjEgMB4GA1UEAwwXRVNH
+IE9yZ2FuaXNhdGllIENBIC0gRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQC+OUvPWOYaYs248OagsAq2+ojtsuC3mARZxwMQh5ZevwosA1N/78m5otwY
+SyiqRmQVmVQ4hAGHeUmCOkwdzrEXW6VI1QAx0x4F5Q9LFuF9SWHyauC022zDHE/D
+oTr1jFDb3iJ9tcu2eBZaN1/qhll2Gr+dpP/7mzregsrYOfsOyV7os0EFCK9YUuP0
+G8yjV1lDDSPRm4UDqzC5PZTcf23asZiYb34VjlQIJ+Q3Yy/NDh8eXvhsnumoGSQz
+4imVuxpqZMQwFZJj+7HMPAIyP1z9iG/ccSlYM2v4M6SQD4/aht13vU9m0HyATv5+
+R+SkCyhJkCyD/Jtimb6lUCZRjRBiulCmUHAmxlMSE9x4oNQJUTIaCCmjFBcMOzs9
+lSlYpWNsRmvcnLuZhsf1JLtcMjVhQw9mX5/NgY4KOg6fPIVJVM/usz+lQiGPuW7b
+F9RqHkDPw4sb0P7Z1vevY5D45A2sTCTktmHMrfTVcmT7tUdwp2FFsrEPs0R4K8q7
+eVsKbaaAdUlnzPcE5xUsLPZNeVQVfSrE6NqwZHQA4D8R0t/t+52INV5dmejWLQ5w
+PS8dN5MC1SbXaaopZ28LN5xfOTqZQCZnq29DO8dw8BwcycX5Py4PxFureNiN6u70
+IqhtxDpvjcI8Hd5rw0W7n8UT6MWS2jVvqZlneRyim+72MhBXwQIDAQABo4IBhjCC
+AYIwSQYDVR0gBEIwQDA+BgRVHSAAMDYwNAYIKwYBBQUHAgEWKGh0dHA6Ly9jcHMu
+ZGUtZWxlY3Ryb25pc2NoZS1zaWduYXR1dXIubmwwDwYDVR0TAQH/BAUwAwEB/zAi
+BgNVHREEGzAZpBcwFTETMBEGA1UEAwwKcHJ2NDA5Ni0xNDAOBgNVHQ8BAf8EBAMC
+AQYwgYUGA1UdIwR+MHyAFDkQi0mSXNthEiDNSZ0ajtqcZ0C5oV6kXDBaMQswCQYD
+VQQGEwJOTDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQD
+DCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyggQAmJb0MEkGA1Ud
+HwRCMEAwPqA8oDqGOGh0dHA6Ly9jcmwucGtpb3ZlcmhlaWQubmwvRG9tT3JnYW5p
+c2F0aWVMYXRlc3RDUkwtRzIuY3JsMB0GA1UdDgQWBBS6LHcLCPcNdB0v3F2Ao5dB
+7KgnqDANBgkqhkiG9w0BAQsFAAOCAgEAaQZycyqAje5LoJszBZ/tIfXZZI3aYR+X
+h5hytmgoSELq2iLJq/VsqL5oa64TM93h8WCojTxrwgOwYzrelZvLEq7ecNB6KOLM
+3khcT0DFwUiK35u8jhBFdNCCbdzP0Pi/P1IROk0XE9vIo5rw2wXxh+KkyehRE7+W
+r4Cv85gUqMCiMrGhOsLs4pqr/vI94ZpCV3OCEIJ9EF3EKQjZueS5bs+PSskQDmN8
+Iu/m/+HyZGkm//JfEMFIjLxTxyKAWbCJPDU5ePHD4cFdtyK4q/WL9C4iVwx6y78t
+G3Zil1mzJ6ejOqBcmOKDyyojdgm770Lo7O5MUb1sMYCEJuJG6D7GBtftlbf28ynd
+j0IW0gD+xFbdHZdM3TdJCGzSVI/Dbqmwse0OinwpF+ixRrvcQ8xkBx4733I3Ekkd
+CSkH52RHvCV1hJ0tBDgz5iW7uOhYW7oR5ZUm742rRWj6/CiEL7MsQa4WlnNJEvdX
+nolcxXz5Dw1B1oIFep+jCtpTIdCv4Ooli7ThEKMZlpySGMhT8WWUDxd5TW3FF/wV
+Dr3jTePYG5dg9vytF93IbCB61np1sWSi79Vnn/smdOalXewcMF+moXHn6bwE/J1P
+NmtLnOr23HrrbDG10V4QcbVxJJk76pVW5BfinClB8HCCOb1GSSkWsV0r8ewxzZ9d
+J6SsCicl/3E=
+-----END CERTIFICATE-----
+
+subject= /C=US/O=HydrantID (Avalanche Cloud Corporation)/CN=HydrantID SSL ICA G2
+serial=7517167783D0437EB556C357946E4563B8EBD3AC
+-----BEGIN CERTIFICATE-----
+MIIGxDCCBKygAwIBAgIUdRcWd4PQQ361VsNXlG5FY7jr06wwDQYJKoZIhvcNAQEL
+BQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZ
+BgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0xMzEyMTcxNDI1MTBaFw0yMzEy
+MTcxNDI1MTBaMF4xCzAJBgNVBAYTAlVTMTAwLgYDVQQKEydIeWRyYW50SUQgKEF2
+YWxhbmNoZSBDbG91ZCBDb3Jwb3JhdGlvbikxHTAbBgNVBAMTFEh5ZHJhbnRJRCBT
+U0wgSUNBIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9p1ZOA9+
+H+tgdln+STF7bdOxvnOERYyjo8ZbKumzigNePSwbQYVWuso76GI843yjaX2rhn0+
+Jt0NVJM41jVctf9qwacVduR7CEi0qJgpAUJyZUuB9IpFWF1Kz14O3Leh6URuRZ43
+RzHaRmNtzkxttGBuOtAg+ilOuwiGAo9VQLgdONlqQFcrbp97/fO8ZIqiPrbhLxCZ
+fXkYi3mktZVRFKXG62FHAuH1sLDXCKba3avDcUR7ykG4ZXcmp6kl14UKa8JHOHPE
+NYyr0R6oHELOGZMox1nQcFwuYMX9sJdAUU/9SQVXyA6u6YtxlpZiC8qhXM1IE00T
+Q9+q5ppffSUDMC4V/5If5A6snKVP78M8qd/RMVswcjMUMEnov+wykwCbDLD+IReM
+A57XX+HojN+8XFTL9Jwge3z3ZlMwL7E54W3cI7f6cxO5DVwoKxkdk2jRIg37oqSl
+SU3z/bA9UXjHcTl/6BoLho2p9rWm6oljANPeQuLHyGJ3hc19N8nDo2IATp70klGP
+kd1qhIgrdkki7gBpanMOK98hKMpdQgs+NY4DkaMJqfrHzWR/CYkdyUCivFaepaFS
+K78+jVu1oCMOFOnucPXL2fQa3VQn+69+7mA324frjwZj9NzrHjd0a5UP7waPpd9W
+2jZoj4b+g+l+XU1SQ+9DWiuZtvfDW++k0BMCAwEAAaOCAZEwggGNMBIGA1UdEwEB
+/wQIMAYBAf8CAQAweAYDVR0gBHEwbzAIBgZngQwBAgEwCAYGZ4EMAQICMA4GDCsG
+AQQBvlgAAmQBAjBJBgwrBgEEAb5YAAOHBAAwOTA3BggrBgEFBQcCARYraHR0cDov
+L3d3dy5oeWRyYW50aWQuY29tL3N1cHBvcnQvcmVwb3NpdG9yeTByBggrBgEFBQcB
+AQRmMGQwKgYIKwYBBQUHMAGGHmh0dHA6Ly9vY3NwLnF1b3ZhZGlzZ2xvYmFsLmNv
+bTA2BggrBgEFBQcwAoYqaHR0cDovL3RydXN0LnF1b3ZhZGlzZ2xvYmFsLmNvbS9x
+dnJjYTIuY3J0MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQahGK8SEwzJQTU
+7tD2A8QZRtGUazA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vY3JsLnF1b3ZhZGlz
+Z2xvYmFsLmNvbS9xdnJjYTIuY3JsMB0GA1UdDgQWBBSYarYtLr+nqp/299YJr9WL
+V/mKtzANBgkqhkiG9w0BAQsFAAOCAgEAlraik8EDDUkpAnIOajO9/r4dpj/Zry76
+6SH1oYPo7eTGzpDanPMeGMuSmwdjUkFUPALuWwkaDERfz9xdyFL3N8CRg9mQhdtT
+3aWQUv/iyXULXT87EgL3b8zzf8fhTS7r654m9WM2W7pFqfimx9qAlFe9XcVlZrUu
+9hph+/MfWMrUju+VPL5U7hZvUpg66mS3BaN15rsXv2+Vw6kQsQC/82iJLHvtYVL/
+LwbNio18CsinDeyRE0J9wlYDqzcg5rhD0rtX4JEmBzq8yBRvHIB/023o/vIO5oxh
+83Hic/2Xgwksf1DKS3/z5nTzhsUIpCpwkN6nHp6gmA8JBXoUlKQz4eYHJCq/ZyC+
+BuY2vHpNx6101J5dmy7ps7J7d6mZXzguP3DQN84hjtfwJPqdf+/9RgLriXeFTqwe
+snxbk2FsPhwxhiNOH98GSZVvG02v10uHLVaf9B+puYpoUiEqgm1WG5mWW1PxHstu
+Ew9jBMcJ6wjQc8He9rSUmrhBr0HyhckdC99RgEvpcZpV2XL4nPPrTI2ki/c9xQb9
+kmhVGonSXy5aP+hDC+Ht+bxmc4wN5x+vB02hak8Hh8jIUStRxOsRfJozU0R9ysyP
+EZAHFZ3Zivg2BaD4tOISO8/T2FDjG7PNUv0tgPAOKw2t94B+1evrSUhqJDU0Wf9c
+9vkaKoPvX4w=
+-----END CERTIFICATE-----
+
 subject= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID CA-1
 serial=06FDF9039603ADEA000AEB3F27BBBA1B
 -----BEGIN CERTIFICATE-----
@@ -29418,90 +35504,6 @@
 l409YpY9zs9PyeP2WLK3rIH3hQ==
 -----END CERTIFICATE-----
 
-subject= /O=Gracenote Inc/CN=Gracenote Corporate Issuing CA
-serial=4FECAA5B000100000009
------BEGIN CERTIFICATE-----
-MIIGzzCCBbegAwIBAgIKT+yqWwABAAAACTANBgkqhkiG9w0BAQsFADBAMRYwFAYD
-VQQKEw1HcmFjZW5vdGUgSW5jMSYwJAYDVQQDEx1HcmFjZW5vdGUgQ29ycG9yYXRl
-IFBvbGljeSBDQTAeFw0xMDA1MTMyMjM3MzhaFw0xNTA1MTMwNzA1MzFaMEExFjAU
-BgNVBAoTDUdyYWNlbm90ZSBJbmMxJzAlBgNVBAMTHkdyYWNlbm90ZSBDb3Jwb3Jh
-dGUgSXNzdWluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKwC
-GbGR+L5iR1xXT03sjWSLjF5ZzfGpfjH+y5dBOEVSOrj+gMtJivJuQYqa2A81sz0a
-eETi/yQZ545xQKFbtPIYDlP5I3NcpZqDI/N6GoGXlO3ZDjydX69FXnxsiIHW+MSR
-/T8OX4YMABW8m931ZQpaqPjfXrDfCCWkip4f36VexUiIlgEi+iBfHc2SmFwZz/3B
-nK/t+yKXXAv2SGpzkZcC/SKIY1gv8QqNuvu7oW0ZURor5Omhf1cMxQh5SgNtJCTM
-rEPhb+vBbBAYM1u+C2AwI+HVoM59t3GaI7N4Px+mpTztZyhAwixnz8jaFQJJmPDt
-sxNyTm4OMF2/gdaRMFUCAwEAAaOCA8gwggPEMBAGCSsGAQQBgjcVAQQDAgEBMCMG
-CSsGAQQBgjcVAgQWBBRgNZ2DX2bMLRcfMn3X0teTcEfsjTAdBgNVHQ4EFgQUUALQ
-m6f6o1/R53nCzs6P7uStfiYwgcAGA1UdIASBuDCBtTCBsgYMKwYBBAGCkgWDfQEC
-MIGhMGwGCCsGAQUFBwICMGAeXgBHAHIAYQBjAGUAbgBvAHQAZQAgAEkAbgBjACAA
-QwBlAHIAdABpAGYAaQBjAGEAdABpAG8AbgAgAFAAcgBhAGMAdABpAGMAZQBzACAA
-UwB0AGEAdABlAG0AZQBuAHQwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuZ3JhY2Vu
-b3RlLmNvbS9wa2kvY3BzLmh0bWwwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEw
-CwYDVR0PBAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUNa7A
-eRwZI4KzIIgjgQjeYSGzz5kwggElBgNVHR8EggEcMIIBGDCCARSgggEQoIIBDIYt
-aHR0cDovL3d3dy5ncmFjZW5vdGUuY29tL3BraS9jb3JwcG9saWN5Y2EuY3JshoHa
-bGRhcDovLy9DTj1HcmFjZW5vdGUlMjBDb3Jwb3JhdGUlMjBQb2xpY3klMjBDQSxD
-Tj1FVkxQS0kwNCxDTj1DRFAsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049
-U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1ncmFjZW5vdGUsREM9Z3JhY2Vu
-b3RlLGRjPWNvbT9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0P2Jhc2U/b2JqZWN0
-Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnQwggEhBggrBgEFBQcBAQSCARMwggEP
-MDkGCCsGAQUFBzAChi1odHRwOi8vd3d3LmdyYWNlbm90ZS5jb20vcGtpL2NvcnBw
-b2xpY3ljYS5jcnQwgdEGCCsGAQUFBzAChoHEbGRhcDovLy9DTj1HcmFjZW5vdGUl
-MjBDb3Jwb3JhdGUlMjBQb2xpY3klMjBDQSxDTj1BSUEsQ049UHVibGljJTIwS2V5
-JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1ncmFj
-ZW5vdGUsREM9Z3JhY2Vub3RlLGRjPWNvbT9jQUNlcnRpZmljYXRlP2Jhc2U/b2Jq
-ZWN0Q2xhc3M9Y2VydGlmaWNhdGlvbkF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOC
-AQEAb23d8Ni0rmzX7h2r6N3xtZuQxYly1TWuW3Jnks0MiRcW+JZEwDvW9GCQFoVO
-mX9dk4nLExZM9XRHTLSueajfd7LY6A/qpmFcJMdrn7zv0PKRkFYQmiUurdX8YHak
-CAIJUV3MBm3Ck76q8z6Tfo7SyZ+Wpd7tGtQ7NDCHSleGKPu1rLsXvl8yBiZfDZxv
-eRx3eGBlOnXxvIv79N6zAW9sHS5ypMGjqe/a9nfOlQr0j0EzPx+dOZ9rG3iTkpEd
-HfYJEghksfyKSCn3znxlYeYWqPBo+ZHBDMLgxD472E49Lc20o8jzok0OPAfWFmP3
-eiuwnnAHBWGOcYBNnR5+029dRw==
------END CERTIFICATE-----
-
-subject= /C=CH/O=Die Schweizerische Post/OU=PROD/CN=PKI SwissPost EXT Machine CA
-serial=9584E2414091440359AFE94E01EADB
------BEGIN CERTIFICATE-----
-MIIG1TCCBL2gAwIBAgIQAJWE4kFAkUQDWa/pTgHq2zANBgkqhkiG9w0BAQUFADBF
-MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
-d2lzc1NpZ24gR29sZCBDQSAtIEcyMB4XDTExMDQwNjEyNDAzMloXDTI2MDQwMjEy
-NDAzMlowZTELMAkGA1UEBhMCQ0gxIDAeBgNVBAoTF0RpZSBTY2h3ZWl6ZXJpc2No
-ZSBQb3N0MQ0wCwYDVQQLEwRQUk9EMSUwIwYDVQQDExxQS0kgU3dpc3NQb3N0IEVY
-VCBNYWNoaW5lIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzUZX
-pImFHO3Q9blv4cUsaqm4ZnG8jt44MY3Az8LaFcKkM4wInakx+sfbrsXRTJQuCbcj
-m9ZMUWPg64t9ORKDM7Ef8LaDyCANqjOb/zTqHkAl8IFnPwQr4C9CLglbmeh051ZD
-mwyzHDvJqlShgaqht0Q3LGnpgzL8gSUtcoZD/lCRjk1ei2vRkndHr/wkUDD8DQkT
-2LvJgEr1cR732pwFGqE+8lHZP/YOZUd/hJYlH11+2YJtpZqiYoE5HDDN+gpAGqse
-hIW2jmEThSRM/VG0zkVhvBOD7rTzH6/ByIO2stz43kfneseSxh2vtbCMHsrg3YhM
-1iqhyc3n2SAHpaoSXwIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgEGMBIGA1Ud
-EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFMPimjT7ebNjNoNftYNtFmWsEj7iMB8G
-A1UdIwQYMBaAFFsle5akZVF+uDnzwHhmXug65/DuMIH/BgNVHR8EgfcwgfQwR6BF
-oEOGQWh0dHA6Ly9jcmwuc3dpc3NzaWduLm5ldC81QjI1N0I5NkE0NjU1MTdFQjgz
-OUYzQzA3ODY2NUVFODNBRTdGMEVFMIGooIGloIGihoGfbGRhcDovL2RpcmVjdG9y
-eS5zd2lzc3NpZ24ubmV0L0NOPTVCMjU3Qjk2QTQ2NTUxN0VCODM5RjNDMDc4NjY1
-RUU4M0FFN0YwRUUlMkNPPVN3aXNzU2lnbiUyQ0M9Q0g/Y2VydGlmaWNhdGVSZXZv
-Y2F0aW9uTGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50
-MF0GA1UdIARWMFQwUgYEVR0gADBKMEgGCCsGAQUFBwIBFjxodHRwOi8vcmVwb3Np
-dG9yeS5zd2lzc3NpZ24uY29tL1N3aXNzU2lnbi1Hb2xkLUNQLUNQUy1SNS5wZGYw
-gdMGCCsGAQUFBwEBBIHGMIHDMGQGCCsGAQUFBzAChlhodHRwOi8vc3dpc3NzaWdu
-Lm5ldC9jZ2ktYmluL2F1dGhvcml0eS9kb3dubG9hZC81QjI1N0I5NkE0NjU1MTdF
-QjgzOUYzQzA3ODY2NUVFODNBRTdGMEVFMFsGCCsGAQUFBzABhk9odHRwOi8vZ29s
-ZC1yb290LWcyLm9jc3Auc3dpc3NzaWduLm5ldC81QjI1N0I5NkE0NjU1MTdFQjgz
-OUYzQzA3ODY2NUVFODNBRTdGMEVFMA0GCSqGSIb3DQEBBQUAA4ICAQBe/z8Ga7q1
-6/aVUQYLJtm0iXEUOPfN5LwyfOQI12OYqU0/kJTKdFs8sJseiJX4vHpCaVPwizic
-W1VXLelJNY5QWUUxMMRcs//78h6w1l0ykmIfKN+7BRC/0kDsNSNVWPFKC2ie/0mi
-6X+mhikFdaSq24gYCUPVxey/iTjPZwd4uT/No+oT7HwG6LUrihqIquQLDfp/RWuL
-Ov7JaA5PG5m29KazopsuloGIxOBh/tDXYTt8Rk62+GcO/qxumJPmZV/m9tLmPFKC
-267MbXm5xwvElt8Wy1otspQifgUEGkJQoE+SLusXfhJQPyaev0CFUzSFCXJzVfwD
-IKqU8hQd29Lbx9g9Jyoq0I1wX59kbKqnqxCsgEFL/WqM+He8IqXihBhLKoEnkHKk
-afsk31SVTPhEZbzfFWrLr2pilq7r2IzZk1i3nUExoF+GMCcgXfuIVEPlhS1ZzVxu
-+uxWO++QsByEsIdh2tVo5xxlaK8UeGiMZLNAjofP+8oeCtffPGbdkXT2RJ0GaZL+
-fryBnPjHoOqTf7JKLWstVpSt4URiRWXVujKxX5puYJTS9aoxnhdUeSMM+M6DssBu
-YVtmmX7DOrgkJJY3HGCiOfzqQgiNCbjKvlLYZTXAG6/tfm+InvzpvIztA1jXmMQ0
-OYqFEkQ9wm7ntjOaaujqdtJyxMoq7vnSoA==
------END CERTIFICATE-----
-
 subject= /CN=Virginia Tech Global Server CA/OU=Global Server CA/O=Virginia Tech/C=US
 serial=3C72BB91E66AFD95
 -----BEGIN CERTIFICATE-----
@@ -29714,49 +35716,6 @@
 QNCDg8bQkiXvVCKXt4cNimgdCwucmWcUIryqAUvb0m++mdFDcA==
 -----END CERTIFICATE-----
 
-subject= /C=US/O=Entrust/OU=Certification Authorities/CN=Entrust Education Shared Service Provider
-serial=4C1FA387
------BEGIN CERTIFICATE-----
-MIIHETCCBfmgAwIBAgIETB+jhzANBgkqhkiG9w0BAQUFADCBgDELMAkGA1UEBhMC
-VVMxEDAOBgNVBAoTB0VudHJ1c3QxIjAgBgNVBAsTGUNlcnRpZmljYXRpb24gQXV0
-aG9yaXRpZXMxOzA5BgNVBAMTMkVudHJ1c3QgTWFuYWdlZCBTZXJ2aWNlcyBDb21t
-ZXJjaWFsIFB1YmxpYyBSb290IENBMB4XDTEwMDcwNzIwMTQ1NFoXDTMwMDYwNzIw
-NDQ1NFowdzELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VudHJ1c3QxIjAgBgNVBAsT
-GUNlcnRpZmljYXRpb24gQXV0aG9yaXRpZXMxMjAwBgNVBAMTKUVudHJ1c3QgRWR1
-Y2F0aW9uIFNoYXJlZCBTZXJ2aWNlIFByb3ZpZGVyMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA61FCE8DNTfaRvSVAPhlu+vPjPX+4w5egBREnz/8ObdJA
-W64b6UPDITjOSTzma2aomBsawDZxA6K/vXz1UEAfGC86RzfbZGLCLlMoSs8CT+1T
-1rLZmd7VLigN4yIen0qmB17Q5yMoTt/Ho9mYH+LRBapW+boLbRyMVRyNg6zxAfv2
-WHXTDRtS69Hz+OTkUnxKzZzEOXYIgHzbqMJlbZIqxDUuVFIkgn0A5+fp+v+bloEc
-ISioCSsjTMr4JPc5O0xNHOga/KH1a/ahZVU6OWlR0Pke3G4WsOamzhnZkATf4oKl
-fQbXzeGEQrMFEgO/d4LVa/wnaYb+z5o1GpyAuZYVBwIDAQABo4IDmTCCA5UwDgYD
-VR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwPAYDVR0gBDUwMzAPBg1g
-hkgBhvprgUgDCgIEMA8GDWCGSAGG+muBSAMKAgUwDwYNYIZIAYb6a4FIAwoCBjCC
-AT8GCCsGAQUFBwEBBIIBMTCCAS0wVQYIKwYBBQUHMAKGSWh0dHA6Ly9jb21wdWJ3
-ZWIubWFuYWdlZC5lbnRydXN0LmNvbS9BSUEvQ2VydHNJc3N1ZWRUb0VNU0NvbVB1
-YlJvb3RDQS5wN2MwgdMGCCsGAQUFBzAChoHGbGRhcDovL2NvbXB1YnNoYWQubWFu
-YWdlZC5lbnRydXN0LmNvbS9vdT1FbnRydXN0JTIwTWFuYWdlZCUyMFNlcnZpY2Vz
-JTIwQ29tbWVyY2lhbCUyMFB1YmxpYyUyMFJvb3QlMjBDQSxvdT1DZXJ0aWZpY2F0
-aW9uJTIwQXV0aG9yaXRpZXMsbz1FbnRydXN0LGM9VVM/Y0FDZXJ0aWZpY2F0ZTti
-aW5hcnksY3Jvc3NDZXJ0aWZpY2F0ZVBhaXI7YmluYXJ5MIIBrAYDVR0fBIIBozCC
-AZ8wgf6ggfuggfiGPWh0dHA6Ly9jb21wdWJ3ZWIubWFuYWdlZC5lbnRydXN0LmNv
-bS9DUkxzL0VNU0NvbVB1YlJvb3RDQS5jcmyGgbZsZGFwOi8vY29tcHVic2hhZC5t
-YW5hZ2VkLmVudHJ1c3QuY29tL2NuPUVudHJ1c3QlMjBNYW5hZ2VkJTIwU2Vydmlj
-ZXMlMjBDb21tZXJjaWFsJTIwUHVibGljJTIwUm9vdCUyMENBLG91PUNlcnRpZmlj
-YXRpb24lMjBBdXRob3JpdGllcyxvPUVudHJ1c3QsYz1VUz9jZXJ0aWZpY2F0ZVJl
-dm9jYXRpb25MaXN0O2JpbmFyeTCBm6CBmKCBlaSBkjCBjzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAoTB0VudHJ1c3QxIjAgBgNVBAsTGUNlcnRpZmljYXRpb24gQXV0aG9y
-aXRpZXMxOzA5BgNVBAMTMkVudHJ1c3QgTWFuYWdlZCBTZXJ2aWNlcyBDb21tZXJj
-aWFsIFB1YmxpYyBSb290IENBMQ0wCwYDVQQDEwRDUkwxMB8GA1UdIwQYMBaAFMAy
-SQVmZoOHGWm5roMlBhmLBdd0MB0GA1UdDgQWBBQi3aL6WE6DPlOLAYATFjXUgRW2
-fzANBgkqhkiG9w0BAQUFAAOCAQEAdDiRYUbRjCUKiNQUujn8G1vGvnWo1kvnYx/l
-BUL07T1vthkTVlwBQmVjF6uEo9XrrFACGuj1yH9VRgMq7X+pMBfk4ZEfmyrmUE7Z
-Fq0Hu0TIS5jdLpJZcKwly/KLt5Ss+i/k6OjQawzKao1t1T5TL97cjnx1pDH0HNUY
-gZeDyIDG37twbg22Jd4I5dd+M96YL87G7Mf2TpIS/XrO2Wd84UElWzmMjWIoK0oN
-J3vgr+TcKC8ErzMS+AuNfMuBZL+lSoi/yOOEAUS7Sl/GxeSmfr05FPenD3vb6r4D
-auDyWKXJ30ojO9ymLTuiuiFV5edD7rs0ixxRGA0MO18VFaurdw==
------END CERTIFICATE-----
-
 subject= /O=TeliaSonera/CN=TeliaSonera Gateway CA v1
 serial=35791D8792516D61B11C4BEFAF76C1DA
 -----BEGIN CERTIFICATE-----
@@ -30015,6 +35974,50 @@
 +RTHUyFODEAEyyIV9kGrTkTTIqwQTq+sKKtk3IkqkyUEUWEnHBDiwL0rr4xjRQ==
 -----END CERTIFICATE-----
 
+subject= /C=US/ST=Texas/O=ATT Services Inc/OU=ATT Wi-Fi Services/CN=ATT Wi-Fi Services Root Certificate Authority G2
+serial=5CD7D896BAD5C97711BC14CF0ED35F2062
+-----BEGIN CERTIFICATE-----
+MIIHJTCCBg2gAwIBAgIRXNfYlrrVyXcRvBTPDtNfIGIwDQYJKoZIhvcNAQEFBQAw
+XDELMAkGA1UEBhMCQkUxFTATBgNVBAsTDFRydXN0ZWQgUm9vdDEZMBcGA1UEChMQ
+R2xvYmFsU2lnbiBudi1zYTEbMBkGA1UEAxMSVHJ1c3RlZCBSb290IENBIEcyMB4X
+DTEzMDUzMDAwMDAwMFoXDTE4MDUzMDAwMDAwMFowgZAxCzAJBgNVBAYTAlVTMQ4w
+DAYDVQQIEwVUZXhhczEZMBcGA1UEChMQQVRUIFNlcnZpY2VzIEluYzEbMBkGA1UE
+CxMSQVRUIFdpLUZpIFNlcnZpY2VzMTkwNwYDVQQDEzBBVFQgV2ktRmkgU2Vydmlj
+ZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgRzIwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCDh9LO56ZXCaAKXdO/ZiuCfrKLwjJoYTZ9xJbPKmR+
+p5w/Zzw+UG8zdRaOgXBnXDcHvdTUcNcmOzglPrS2Xs+aiUWgNd4VgzafIofq/shP
+6Gxnquy8qdqnpDrrudUxTwgVisuSG/yiXsZva6OOmkyrR6N1Bu25+tb0oSnqPeGM
+5YXPjjWBIJtoRlUPoDgHr29Prv1/mLZuBqgUzFuN3Uynx1pN+hf97HfUDaHo/zMB
+FBC8gjjv77zOjBEK/P5VpVunN9a7sl+FBvaW+yQy9FG5TR0narXSwBJLijPgxUU9
+2TjW4+8oMnfVcu6ZBmqwBUNNorFfIpLTJqwPXJFvF4UXAgMBAAGjggOrMIIDpzAO
+BgNVHQ8BAf8EBAMCAQYwggELBgNVHSAEggECMIH/MHEGCisGAQQBoDIBPAEwYzAy
+BggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9y
+eS8wLQYIKwYBBQUHAgIwIQwfR2xvYmFsU2lnbiBUcnVzdGVkIFJvb3QgUHJvZ3Jh
+bTCBiQYLKwYBBAGjSIN9AQEwejAvBggrBgEFBQcCARYjaHR0cDovL2NybC5wa2ku
+d2F5cG9ydC5uZXQvY3BzLmh0bWwwRwYIKwYBBQUHAgIwOww5Q29weXJpZ2h0IChj
+KSAyMDEzIEFUVCBXaS1GaSBTZXJ2aWNlcyBBbGwgUmlnaHRzIFJlc2VydmVkMBIG
+A1UdEwEB/wQIMAYBAf8CAQEwggFLBgNVHR4EggFCMIIBPqCCAQgwDYILd2F5cG9y
+dC5uZXQwDYILYXR0d2lmaS5jb20wEIIOc3VwZXJjbGljay5uZXQwEIIOc3VwZXJj
+bGljay5jb20wDYELd2F5cG9ydC5uZXQwDoEMLndheXBvcnQubmV0MA2BC2F0dHdp
+ZmkuY29tMA6BDC5hdHR3aWZpLmNvbTAQgQ5zdXBlcmNsaWNrLm5ldDARgQ8uc3Vw
+ZXJjbGljay5uZXQwEIEOc3VwZXJjbGljay5jb20wEYEPLnN1cGVyY2xpY2suY29t
+MDykOjA4MQswCQYDVQQGEwJVUzEOMAwGA1UECBMFVGV4YXMxGTAXBgNVBAoTEEFU
+VCBTZXJ2aWNlcyBJbmOhMDAKhwgAAAAAAAAAADAihyAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
+PQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy90
+cnVzdHJvb3RnMi5jcmwwgYQGCCsGAQUFBwEBBHgwdjAzBggrBgEFBQcwAYYnaHR0
+cDovL29jc3AyLmdsb2JhbHNpZ24uY29tL3RydXN0cm9vdGcyMD8GCCsGAQUFBzAC
+hjNodHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC90cnVzdHJvb3Rn
+Mi5jcnQwHQYDVR0OBBYEFPPTx14sRSZ+/ebktJS4BA85OxDeMB8GA1UdIwQYMBaA
+FBT25YsxtkWASkxt/MKHico2w5BiMA0GCSqGSIb3DQEBBQUAA4IBAQCF3mZKOjut
+iscy/y3TgWkdHN7lHofmM/40gB7PyPiTOBKbQsSaSYuYr1Ls1xDEROpX5qWlxFMV
+6+o9irKf8pAaA7q3yInNiCb2o/1BPHAB4QOZM/r2sZLtPPkDxSi7GNglj2wTEnD6
+OB6yyMlgUTpDhk8n760DWFLMr28D23s72vK850AN5tmMNi7qAalmyiZBcVeE4Dik
+E94FxMQKec9f447ezNiObrxPUCzUaN+2qGGACwN08/8JShOgV5YLy2IJtBj7B9KT
+F1DP/ltQA86fGWUena2hSQzAPfwf6aTvLWz6DPUNuy3KNiJbzuvET/d4zT/MzqjP
+TwsUSW6g5/Fg
+-----END CERTIFICATE-----
+
 subject= /C=FR/O=Ministere education nationale (MENESR)/OU=110 043 015/CN=AC Infrastructures
 serial=269C1B8AB1DACF0ECB7ABC4CB8B9C1B4
 -----BEGIN CERTIFICATE-----
@@ -30191,6 +36194,50 @@
 a+rBgItOZyBHvlE4dMbjp/2VQSc4kgleUjPiN3dLG8wAmnboXUTm
 -----END CERTIFICATE-----
 
+subject= /DC=com/DC=unisys/DC=uis/CN=UIS-IsuB1-CA
+serial=6111B09900030000000E
+-----BEGIN CERTIFICATE-----
+MIIHQzCCBiugAwIBAgIKYRGwmQADAAAADjANBgkqhkiG9w0BAQUFADAWMRQwEgYD
+VQQDEwtVSVMtSW50Qi1DQTAeFw0xNDAzMDcyMDQyMzhaFw0yMDAzMDcyMDUyMzha
+MFkxEzARBgoJkiaJk/IsZAEZFgNjb20xFjAUBgoJkiaJk/IsZAEZFgZ1bmlzeXMx
+EzARBgoJkiaJk/IsZAEZFgN1aXMxFTATBgNVBAMTDFVJUy1Jc3VCMS1DQTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANMBYkkPdu4TC03p/LgKLhlTGp3X
+Cl7PJgbygB1ZWsbKWUPtGpFi7OnQOzZYZBDaNOxN9saWOG3WsBj7SkE3WhIqKr+f
+SoXoG5d5/qnAl+rPXpxng/KyoF/dz0X6F04gE/5Xi/8pJ+zKI+g4+E2kWg9tHck4
+g89ur7+hcsJC2HPGLV4/vfpJIt4fih5tyIeqTidUmmg5ODevAEsoQFqhooPOBGI0
+5N4ZkiWKssm18wlMqPF3vj/67+/tVvx2tApCqcF46v2+e7zsc1433MUYCMFybcio
+6YsJ70Hs4fLCGm5xwp4sN5FcpXPJ0G3T0z+eZ3s5H9WoAc7ktELEontKmC8CAwEA
+AaOCBE4wggRKMA4GA1UdDwEB/wQEAwIBhjASBgkrBgEEAYI3FQEEBQIDBAAEMCMG
+CSsGAQQBgjcVAgQWBBQ4Nogq/urho1mOSC7hWiD9ky4lyjAdBgNVHQ4EFgQU2wDx
+HXqxkdWpFicGNQF+wo4JHncwggIgBgNVHSAEggIXMIICEzA5BgpghkgBhv0wAQEH
+MCswKQYIKwYBBQUHAgEWHWh0dHA6Ly91aXNwa2kudW5pc3lzLmNvbS9yZXAvMDkG
+CmCGSAGG/TABAT0wKzApBggrBgEFBQcCARYdaHR0cDovL3Vpc3BraS51bmlzeXMu
+Y29tL3JlcC8wOQYKYIZIAYb9MAEBAzArMCkGCCsGAQUFBwIBFh1odHRwOi8vdWlz
+cGtpLnVuaXN5cy5jb20vcmVwLzA5BgpghkgBhv0wAQECMCswKQYIKwYBBQUHAgEW
+HWh0dHA6Ly91aXNwa2kudW5pc3lzLmNvbS9yZXAvMDkGCmCGSAGG/TABAQQwKzAp
+BggrBgEFBQcCARYdaHR0cDovL3Vpc3BraS51bmlzeXMuY29tL3JlcC8wOQYKYIZI
+AYb9MAEBBTArMCkGCCsGAQUFBwIBFh1odHRwOi8vdWlzcGtpLnVuaXN5cy5jb20v
+cmVwLzA5BgpghkgBhv0wAQEOMCswKQYIKwYBBQUHAgEWHWh0dHA6Ly91aXNwa2ku
+dW5pc3lzLmNvbS9yZXAvMDkGCmCGSAGG/TABAQEwKzApBggrBgEFBQcCARYdaHR0
+cDovL3Vpc3BraS51bmlzeXMuY29tL3JlcC8wOQYKYIZIAYb9MAEBBjArMCkGCCsG
+AQUFBwIBFh1odHRwOi8vdWlzcGtpLnVuaXN5cy5jb20vcmVwLzAZBgkrBgEEAYI3
+FAIEDB4KAFMAdQBiAEMAQTASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaA
+FCKemvvbmofIBaTgbvevx0BdXg1PMIGkBgNVHR8EgZwwgZkwgZaggZOggZCGLGxk
+YXA6Ly9wa2lsZHAudW5pc3lzLmNvbS9yZXAvVUlTLUludEItQ0EuY3Jshi9odHRw
+Oi8vdWlzcGtpLnVuaXN5cy5jb20vcmVwL1VJUy1JbnRCLUNBKDMpLmNybIYvaHR0
+cDovL3BraXJlcC51bmlzeXMuY29tL3JlcC9VSVMtSW50Qi1DQSgzKS5jcmwwgcQG
+CCsGAQUFBwEBBIG3MIG0MDgGCCsGAQUFBzAChixsZGFwOi8vcGtpbGRwLnVuaXN5
+cy5jb20vcmVwL1VJUy1JbnRCLUNBLmNydDA7BggrBgEFBQcwAoYvaHR0cDovL3Vp
+c3BraS51bmlzeXMuY29tL3JlcC9VSVMtSW50Qi1DQSgzKS5jcnQwOwYIKwYBBQUH
+MAKGL2h0dHA6Ly9wa2lyZXAudW5pc3lzLmNvbS9yZXAvVUlTLUludEItQ0EoMyku
+Y3J0MA0GCSqGSIb3DQEBBQUAA4IBAQBPN0qNtANilmE3crfRzM+qU5cM+Gj4tiCx
+4LCwB1tTagUHjt3Ly4sg5Tj2U1LSpzEHy3SUJgpRgWUMG5GcT2lTKJ4VceKkqelK
+U0PicJ8FBhNnRMH6Z5YWWAHGzikOJjoBjyNyQF9sKZYEOk6ybMjwD76PyZw2r60S
+R5LeQjkvQyAJZBufr0/b0Ch7hbv/jDnl0i21ElVmVDGOMVAOFPpMcjkE0/+Dl4An
+utt7Ed+pylO3sGXcB4ktgcoN7ODUjwxBDCcEznxWjPzPi3jJYrTfANkIn45zVYZL
+J0cDy+5hsmZZkneNVK2+pC2wbXLGEs0JBB69AN+enlPUBbrNwyD8
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=DOUGLAS Holding AG/CN=DOUGLAS Group CA - G1
 serial=6815ECBF4A14DF1AA1DB19143CE8BC
 -----BEGIN CERTIFICATE-----
@@ -30279,97 +36326,6 @@
 OFcnpESVT3FNDBdcknuul+cF251+BRcPphtzoZGwvH1/w0n7ANHEr+WTdg==
 -----END CERTIFICATE-----
 
-subject= /C=ES/O=Firmaprofesional S.A./OU=Security Services/serialNumber=A62634068/CN=AC Firmaprofesional - INFRAESTRUCTURA
-serial=10EA803EF82AC6DF
------BEGIN CERTIFICATE-----
-MIIHVTCCBT2gAwIBAgIIEOqAPvgqxt8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
-BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
-cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xMzAyMjAxMDAzMTdaFw0zMDEy
-MzEwNTA1NDJaMIGNMQswCQYDVQQGEwJFUzEeMBwGA1UEChMVRmlybWFwcm9mZXNp
-b25hbCBTLkEuMRowGAYDVQQLExFTZWN1cml0eSBTZXJ2aWNlczESMBAGA1UEBRMJ
-QTYyNjM0MDY4MS4wLAYDVQQDEyVBQyBGaXJtYXByb2Zlc2lvbmFsIC0gSU5GUkFF
-U1RSVUNUVVJBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuqX7V9RP
-HmZ/SpGlhXSfREEtOiiRS8SdJC1QuOB2EYLiFEeL2QFZHIRP4HBm+CbLZ7ts+GLD
-5XOGWa84Q9BgRI2HXF4E9PeCQh+ejtnnpDRQlx/cIkX5zt750xXfjArifVS4IUHR
-fiyfZmNuyn3qqB5O/nz1K/YelKSZtbjc00qlwXU4sfrZRFJgm0PD6oxJqLoU8VVE
-jBzdbVWsG9KEc91gG0u5UJZyLWGJP2f7I/zrki2WOf9SPfrA01viYw2PSe/81Z7O
-tADKy076N6Z8ky4HaS1aNsqxx/LTylUh+9O0ccGKSQSpO87LFbrKNilGvIRQYzrj
-ItUawGsF0KuUEwIDAQABo4IC8jCCAu4wdAYIKwYBBQUHAQEEaDBmMDYGCCsGAQUF
-BzAChipodHRwOi8vY3JsLmZpcm1hcHJvZmVzaW9uYWwuY29tL2Nhcm9vdC5jcnQw
-LAYIKwYBBQUHMAGGIGh0dHA6Ly9vY3NwLmZpcm1hcHJvZmVzaW9uYWwuY29tMB0G
-A1UdDgQWBBRiFau1swh5pYf+gNki8I78jxH9eTASBgNVHRMBAf8ECDAGAQH/AgEA
-MB8GA1UdIwQYMBaAFGXN66s1HgA+ftV0wBy0c0cOGmQvMIIB0gYDVR0gBIIByTCC
-AcUwggHBBgorBgEEAeZ5CgoBMIIBsTAvBggrBgEFBQcCARYjaHR0cDovL3d3dy5m
-aXJtYXByb2Zlc2lvbmFsLmNvbS9jcHMwggF8BggrBgEFBQcCAjCCAW4eggFqAEMA
-ZQByAHQAaQBmAGkAYwBhAGQAbwAgAGQAZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAA
-ZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAuACAAQwBvAG4AcwB1AGwA
-dABlACAAbABhAHMAIABjAG8AbgBkAGkAYwBpAG8AbgBlAHMAIABkAGUAIAB1AHMA
-bwAgAGUAbgAgAC8AIABDAGUAcgB0AGkAZgBpAGMAYQB0AGkAbwBuACAAQQB1AHQA
-aABvAHIAaQB0AHkAIABjAGUAcgB0AGkAZgBpAGMAYQB0AGUALgAgAFMAZQBlACAA
-dABlAHIAbQBzACAAYQBuAGQAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQB0ACAA
-IABoAHQAdABwADoALwAvAHcAdwB3AC4AZgBpAHIAbQBhAHAAcgBvAGYAZQBzAGkA
-bwBuAGEAbAAuAGMAbwBtAC8AYwBwAHMwPAYDVR0fBDUwMzAxoC+gLYYraHR0cHM6
-Ly9jcmwuZmlybWFwcm9mZXNpb25hbC5jb20vZnByb290LmNybDAOBgNVHQ8BAf8E
-BAMCAQYwDQYJKoZIhvcNAQEFBQADggIBAGRD/ej1VKQGfWiBwL8I6plyFfvplmwO
-+N7EpzUifUgn2sDHiL2L2V5nQdN2lLL5tI83JimPKybrHbv9EwSGPsTOgY+8HWCA
-iaq9dLKVHRK93/FvI+Wj63X6pvx5YDiT2Kq7RuXQFx8AG+acwMa7WHaeravzAiSd
-pak4qW5KlZ54RxiTNtFGwuEGpHc7wakdWSH3hUYfXNLz8JC9DmNqG8ZxAf3Z8AJq
-vIeH4NRPkZ6//QG5JzPowb8eNG2v84ZYQStIAsHa0sVdq9o/zK9x2isv4Y+5GAw4
-bnfq14G23Zh1oFS2T6la7W+AR3OGhP8Y6Xt+TFhn10yfE4TrFGNr20akj2TddsMj
-SAatoB2gE3f7wTFsrXdJn0aJ/18KdlqV0NNuHrs/ZOIhnt7qswZVQfeQHHUQpwOp
-CJrveDbSDZz3Kmo0afJtkcyAnZEPdFdyq8YgqfSqyJs6PJuemsj2ipai0gWO/3f8
-EcApsll70fMRVXfOObBcO+hEO1tN0etNLlT5mlulpbMpkJ6hRgcHmVqogw1YJhmL
-/E03f6Lw8aaCT9yDunE66bFZ/gwNky0V9PvCQni4GmGSKqcM2hFPux6FIWOOokBE
-bicOgqIPCJodWamv++aE/6VKV6Th5gyYBJQ5Pjb6BRxpXtCVAVrev9ZIFcmYn6LX
-wp6ggHtX2lGF
------END CERTIFICATE-----
-
-subject= /O=Gracenote Inc/CN=Gracenote Corporate Policy CA
-serial=4C9A28AF000000000008
------BEGIN CERTIFICATE-----
-MIIHlTCCBX2gAwIBAgIKTJoorwAAAAAACDANBgkqhkiG9w0BAQsFADA0MRYwFAYD
-VQQKDA1HcmFjZW5vdGUgSW5jMRowGAYDVQQDDBFHcmFjZW5vdGUgUm9vdCBDQTAe
-Fw0xMDA1MTMwNjU1MzFaFw0xNTA1MTMwNzA1MzFaMEAxFjAUBgNVBAoTDUdyYWNl
-bm90ZSBJbmMxJjAkBgNVBAMTHUdyYWNlbm90ZSBDb3Jwb3JhdGUgUG9saWN5IENB
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlpsyNfIJ2JiKIOjqfGG1
-i2XsM7zqGV7pnMLiRS/zRJiYDpFz37N70n2cIvRM/jPWhNuUgq4q2YcJxhgOpuwU
-yCBgruAJyRMEpVO6DozJYg+4cixBb5kDN9WAm8eDuP13TQICw2yb9xPj3lOxrt/M
-Xb4avzjmvoQlbpw5Q0t/ZD1noy0hTAdr0cciu+ZlAU7C7PMGlpmqFGvyK66tTmEK
-0qdYgQRLfaW3ewzCBiKCTamVnXqvH5e1uhK4zQVirqfIL95r4R/Bl5yGWhB+YMh/
-NszOmBqyeJzN6loAY65kJo+1b0rdHi8oz12/yXO4CePGJNLAeW+Q+ahzVrkTrz0q
-gwIDAQABo4IDmzCCA5cwEAYJKwYBBAGCNxUBBAMCAQEwIwYJKwYBBAGCNxUCBBYE
-FJQm6G+hKX0xNXCZVgYbI5OfQbQrMB0GA1UdDgQWBBQ1rsB5HBkjgrMgiCOBCN5h
-IbPPmTCBwAYDVR0gBIG4MIG1MIGyBgwrBgEEAYKSBYN9AQIwgaEwbAYIKwYBBQUH
-AgIwYB5eAEcAcgBhAGMAZQBuAG8AdABlACAASQBuAGMAIABDAGUAcgB0AGkAZgBp
-AGMAYQB0AGkAbwBuACAAUAByAGEAYwB0AGkAYwBlAHMAIABTAHQAYQB0AGUAbQBl
-AG4AdDAxBggrBgEFBQcCARYlaHR0cDovL3d3dy5ncmFjZW5vdGUuY29tL3BraS9j
-cHMuaHRtbDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYw
-EgYDVR0TAQH/BAgwBgEB/wIBATAfBgNVHSMEGDAWgBR22MiXMusheKGm+WZlESAz
-p44sIDCCAQ4GA1UdHwSCAQUwggEBMIH+oIH7oIH4hidodHRwOi8vd3d3LmdyYWNl
-bm90ZS5jb20vcGtpL3Jvb3RjYS5jcmyGgcxsZGFwOi8vL0NOPUdyYWNlbm90ZSUy
-MFJvb3QlMjBDQSxDTj1FVkxQS0kwMSxDTj1DRFAsQ049UHVibGljJTIwS2V5JTIw
-U2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1ncmFjZW5v
-dGUsREM9Z3JhY2Vub3RlLGRjPWNvbT9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0
-P2Jhc2U/b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnQwggELBggrBgEF
-BQcBAQSB/jCB+zAzBggrBgEFBQcwAoYnaHR0cDovL3d3dy5ncmFjZW5vdGUuY29t
-L3BraS9yb290Y2EuY3J0MIHDBggrBgEFBQcwAoaBtmxkYXA6Ly8vQ049R3JhY2Vu
-b3RlJTIwUm9vdCUyMENBLENOPUFJQSxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNl
-cyxDTj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERDPWdyYWNlbm90ZSxEQz1n
-cmFjZW5vdGUsZGM9Y29tP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmplY3RDbGFzcz1j
-ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MA0GCSqGSIb3DQEBCwUAA4ICAQARFcnJOMaV
-NqKjLgnJQ3udnwe9eKrjgcEkHtGj8yyT9k5zs1G3tqaDQBo1x71ijAH4141kgEbL
-HYRMly0jejmod632vjed1B6rFRcrMlkZ7xYyIxd4C0SPYvY6+hppEACw4FTi+q6w
-1+LlWr+u+tIUj6tduJL/a5u+H6z0LFTP/Sg3uHZgyxmRbE4d2yME5Y5EdVuhteEo
-J8cveGRkhGF2sjuBpv0cSn/kCCVIoT66n4wHYQilkVqbDTw0q84si40Hr/wzVs3T
-URLlbj6rEIPYgvEwLNL/Nl9fgy+TOs59S2NzMn40rtj7MRiKhGZW/lgOYQI6h7ns
-CWcqttCR6z+OgsbCdnnMLd9zlyRcLb230vErb7WwrIa4d6ntec3gfULIbV8kMygp
-H2KjKnIcQAX8Qhd0I5vnTp1vnaBj7EFIB2Z0bhaEwurMEbZwV3PtuA3kOkk52qPo
-bFg3TrRhysPVx+eGrN9M6LwdZoxS+MgB9jmlR9gQswzGqNIYTVmT4d8HWosyjCCL
-5SQdmWKqEf8nTTmyB3aCwOKJbTVZ8ZQ9qpys4lDUS0EmU8ayWOb3CSlKqVCUTlm7
-frt6oi/vtplYA/6lcRFptWzlkbEYFikoMjpQsxthjNVFneH2tDFo8GCcqRWl+FBj
-hKi0Jboz2i3PgTs/Ld7LQuYfb+nBUDmUnQ==
------END CERTIFICATE-----
-
 subject= /C=DE/O=DOUGLAS Holding AG/CN=DOUGLAS Group IS CA - G1
 serial=1F331D1C000000000005
 -----BEGIN CERTIFICATE-----
@@ -30417,54 +36373,6 @@
 RF7YnoQva30WPQ+eTG/8Z2TUU48Fv+zG
 -----END CERTIFICATE-----
 
-subject= /C=US/DC=edu/DC=nau/DC=froot/ST=Arizona/L=Flagstaff/O=Northern Arizona University/CN=NAU Online Enterprise Issuing CA
-serial=1539BA93000000000004
------BEGIN CERTIFICATE-----
-MIIH8TCCBtmgAwIBAgIKFTm6kwAAAAAABDANBgkqhkiG9w0BAQUFADCByzEgMB4G
-CSqGSIb3DQEJARYRaXRzLW1lbnNhQG5hdS5lZHUxEDAOBgNVBAgMB0FyaXpvbmEx
-KDAmBgNVBAsMH0luZm9ybWF0aW9uIFRlY2hub2xvZ3kgU2VydmljZXMxJDAiBgNV
-BAoMG05vcnRoZXJuIEFyaXpvbmEgVW5pdmVyc2l0eTESMBAGA1UEBwwJRmxhZ3N0
-YWZmMQswCQYDVQQGEwJVUzEkMCIGA1UEAwwbTkFVIE9mZmxpbmUgSW50ZXJtZWRp
-YXRlIENBMB4XDTEwMDEwNTIxNTgwMFoXDTE1MDEwNTIyMDgwMFowgcUxCzAJBgNV
-BAYTAlVTMRMwEQYKCZImiZPyLGQBGRYDZWR1MRMwEQYKCZImiZPyLGQBGRYDbmF1
-MRUwEwYKCZImiZPyLGQBGRYFZnJvb3QxEDAOBgNVBAgTB0FyaXpvbmExEjAQBgNV
-BAcTCUZsYWdzdGFmZjEkMCIGA1UEChMbTm9ydGhlcm4gQXJpem9uYSBVbml2ZXJz
-aXR5MSkwJwYDVQQDEyBOQVUgT25saW5lIEVudGVycHJpc2UgSXNzdWluZyBDQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUfFztMHveDBNOPHVrzTT9r
-j4cTijRWHmpBJTJt4H2vh7jlVKKaUt9BehBzMtPN3sZ6GAQGaMWTiYiGYucfHept
-x7h+5fFGCWnqFOOj49jIa20WsR4eF/ifZWvTFi3UyHZ1c3OJzKmvsj0P1EypQNZR
-Ju22vDrK59D+zMi/cq0eZFnCpfPEoJsXmYpxXj5/KR93Vlw8/1EHj1a9k0yjZFGY
-rmLtJMpquTHhiAGD1jlheyWZKxTM+FRVGEnMq6+AUlXe6gIvSmNpT6iU6wnWCjat
-v9PGmaIiJCJTgy4qAGKpt45yD3AtPlS910hTOBRtCzMGllK3fgJldHbui9SFBSEC
-AwEAAaOCA9kwggPVMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBQysq97YbZ8
-vyBQxCFC6mEK7AVXBjAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8E
-BAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBATAfBgNVHSMEGDAWgBQHjwubLM5w7LnJ
-EVdHiPp9LhfOxDCCATkGA1UdHwSCATAwggEsMIIBKKCCASSgggEghoHcbGRhcDov
-L2Zyb290Lm5hdS5lZHUvQ049TkFVJTIwT2ZmbGluZSUyMEludGVybWVkaWF0ZSUy
-MENBLENOPUJ1Y2t0aG9ybixDTj1DRFAsQ049UHVibGljJTIwS2V5JTIwU2Vydmlj
-ZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1mcm9vdCxEQz1uYXUs
-REM9ZWR1P2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFz
-cz1jUkxEaXN0cmlidXRpb25Qb2ludIY/aHR0cDovL3BraS5uYXUuZWR1L2ludENS
-TC9OQVUlMjBPZmZsaW5lJTIwSW50ZXJtZWRpYXRlJTIwQ0EuY3JsMIICBgYIKwYB
-BQUHAQEEggH4MIIB9DCB0gYIKwYBBQUHMAKGgcVsZGFwOi8vZnJvb3QubmF1LmVk
-dS9DTj1OQVUlMjBPZmZsaW5lJTIwSW50ZXJtZWRpYXRlJTIwQ0EsQ049QUlBLENO
-PVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3Vy
-YXRpb24sREM9ZnJvb3QsREM9bmF1LERDPWVkdT9jQUNlcnRpZmljYXRlP2Jhc2U/
-b2JqZWN0Q2xhc3M9Y2VydGlmaWNhdGlvbkF1dGhvcml0eTCBxQYIKwYBBQUHMAKG
-gbhsZGFwOi8vL0NOPU5BVSUyME9mZmxpbmUlMjBJbnRlcm1lZGlhdGUlMjBDQSxD
-Tj1BSUEsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049
-Q29uZmlndXJhdGlvbixEQz1mcm9vdCxEQz1uYXUsREM9ZWR1P2NBQ2VydGlmaWNh
-dGU/YmFzZT9vYmplY3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MFUGCCsG
-AQUFBzAChklodHRwOi8vcGtpLm5hdS5lZHUvaW50Q1JML0J1Y2t0aG9ybl9OQVUl
-MjBPZmZsaW5lJTIwSW50ZXJtZWRpYXRlJTIwQ0EuY3J0MA0GCSqGSIb3DQEBBQUA
-A4IBAQB92L/ZOUMEmq6irLs8jUCz1n+7iekw0Qddn6GG7QXE2ZnDT9AakwiILPp9
-c+TfmTjBf7cUY+n+sREJEsY7ZuhHuTuerP2j28n2w/ZSR+Rg7DEH5W/DRCPZtBKr
-I1VtHlZqgslWN/5924Mv2m23BxBUha+JAq0j+autHNdxYBgUbyndnmEcgJh71BgM
-edjWvaxUBz+XlvXDZH9u+W7YkkFZvkyEN/LnLsUmphIMfi2R9cQ+dOd5qQNH1TrH
-SHcqf98nxiwb/LPBuKo9CpLXaFuqU67pb2vz6Gv/2IokOp7nBkdd7TpU4ZRecJBu
-JDXBmAaFzFxPpqC+7rVzSg58dmCp
------END CERTIFICATE-----
-
 subject= /C=CH/ST=Vaud/L=Vevey/O=Nestle/OU=IS/IT/CN=Nestle External CA/emailAddress=pki-security-ext@nestle.com
 serial=867A5AAFF875E150CF00BA36716950
 -----BEGIN CERTIFICATE-----
@@ -31018,6 +36926,62 @@
 a5X6gh50Cw+kht8jM3yeNhSzXOKj7Uigjijx10z2wJu09Tyj5ahjoiwIpdX+
 -----END CERTIFICATE-----
 
+subject= /C=US/ST=GA/L=Atlanta/O=Southern Company Services, Inc./CN=Southern Company External Issuing CA 1
+serial=4CB842C7972D74712D92B5EEAB9599D544
+-----BEGIN CERTIFICATE-----
+MIIJdDCCCFygAwIBAgIRTLhCx5ctdHEtkrXuq5WZ1UQwDQYJKoZIhvcNAQEFBQAw
+XDELMAkGA1UEBhMCQkUxFTATBgNVBAsTDFRydXN0ZWQgUm9vdDEZMBcGA1UEChMQ
+R2xvYmFsU2lnbiBudi1zYTEbMBkGA1UEAxMSVHJ1c3RlZCBSb290IENBIEcyMB4X
+DTE0MDMwNDAwMDAwMFoXDTE5MDMwNDAwMDAwMFowgYcxCzAJBgNVBAYTAlVTMQsw
+CQYDVQQIEwJHQTEQMA4GA1UEBxMHQXRsYW50YTEoMCYGA1UEChMfU291dGhlcm4g
+Q29tcGFueSBTZXJ2aWNlcywgSW5jLjEvMC0GA1UEAxMmU291dGhlcm4gQ29tcGFu
+eSBFeHRlcm5hbCBJc3N1aW5nIENBIDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQC1AedGDhdoL/UIkVpwgpqiNoh+VrOEedemEP3GMf0FvUniA8du1dU+
+PlxafCpYMlxJNABF5XjXtS01FybaKuOQJHAWlGFgEAPohYYq862fOYXG0aqc19hy
+Oq1NpnOnoQcTJVQmYcJy/icfrcGLjv65Wz25tWL7Li1VCYfHIsSIJAqQbHlGadN5
+TsFP7yQ4oWPeAFztN3PMbuwwNr0KlqPCGeAkcSWH/CR1Efp7z2O401kFNg3ZuLpW
+O7NkYo9tUOIbDrVUlfHcqwg8rm/t8nEtWrb/cRBJ7phcsRmDu97XZ6wk78BKXUjW
+UumaTUsZFHVJ/rrZUz1GS6dWmPx3RkDbAgMBAAGjggYDMIIF/zAOBgNVHQ8BAf8E
+BAMCAQYwgZUGA1UdIASBjTCBijAIBgZngQwBAgIwDAYKKwYBBAGgMgE8ATANBgsr
+BgEEAYk0g30CAjANBgsrBgEEAYk0g30CAzANBgsrBgEEAYk0g30CBDBDBgsrBgEE
+AYk0g30CBTA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNv
+bS9yZXBvc2l0b3J5LzASBgNVHRMBAf8ECDAGAQH/AgEAMIIEBgYDVR0eBIID/TCC
+A/mgggPDMBKCEGFsYWJhbWFwb3dlci5jb20wE4IRYWxhYmFtYS1wb3dlci5jb20w
+HYIbZW1wbG95ZWVhcHBsaWFuY2VjZW50ZXIuY29tMBKCEGVuZXJneWRpcmVjdC5j
+b20wFIISZW5lcmd5ZGlyZWN0cnQuY29tMAyCCmdhLWl0cy5jb20wDYILZ2Fwb3dl
+ci5jb20wEoIQZ2VvcmdpYXBvd2VyLmNvbTAJggdncGMuY29tMA+CDWd1bGZwb3dl
+ci5jb20wFoIUbWlzc2lzc2lwcGlwb3dlci5jb20wCYIHbXBjLmNvbTALgglzY2Zy
+ZC5jb20wDIIKc2NzbmV0LmNvbTATghFzZWxlY3RnZW9yZ2lhLmNvbTATghFzZWxl
+Y3RnZW9yZ2lhLm5ldDANggtzb2NvZ2VuLmNvbTAMggpzb2xpbmMuY29tMBWCE3Nv
+dXRoZWFzdGVybnJ0cC5jb20wE4IRc291dGhlYXN0aXJwcC5jb20wEIIOc291dGhl
+cm5jby5jb20wGoIYc291dGhlcm5jb2dlbmVyYXRpb24uY29tMBWCE3NvdXRoZXJu
+Y29tcGFueS5jb20wFIISc291dGhlcm5lbmVyZ3kuY29tMBiCFnNvdXRoZXJuZ2Vu
+ZXJhdGlvbi5jb20wEoIQc291dGhlcm5saW5jLmNvbTAaghhzb3V0aGVybmxpbmN3
+aXJlbGVzcy5jb20wGYIXeW91cmFwcGxpYW5jZWNlbnRlci5jb20wEIEOc291dGhl
+cm5jby5jb20wEYEPLnNvdXRoZXJuY28uY29tMFqkWDBWMQswCQYDVQQGEwJVUzEL
+MAkGA1UECBMCR0ExEDAOBgNVBAcTB0F0bGFudGExKDAmBgNVBAoTH1NvdXRoZXJu
+IENvbXBhbnkgU2VydmljZXMsIEluYy4wX6RdMFsxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdHZW9yZ2lhMRAwDgYDVQQHEwdBdGxhbnRhMSgwJgYDVQQKEx9Tb3V0aGVy
+biBDb21wYW55IFNlcnZpY2VzLCBJbmMuMFSkUjBQMQswCQYDVQQGEwJVUzELMAkG
+A1UECBMCR0ExEDAOBgNVBAcTB0F0bGFudGExIjAgBgNVBAoTGVNvdXRoZXJuIENv
+bXBhbnkgU2VydmljZXMwWaRXMFUxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdHZW9y
+Z2lhMRAwDgYDVQQHEwdBdGxhbnRhMSIwIAYDVQQKExlTb3V0aGVybiBDb21wYW55
+IFNlcnZpY2VzoTAwCocIAAAAAAAAAAAwIocgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAwMQYDVR0lBCowKAYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEF
+BQcDBAYIKwYBBQUHAwkwPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2NybC5nbG9i
+YWxzaWduLmNvbS9ncy90cnVzdHJvb3RnMi5jcmwwgYQGCCsGAQUFBwEBBHgwdjAz
+BggrBgEFBQcwAYYnaHR0cDovL29jc3AyLmdsb2JhbHNpZ24uY29tL3RydXN0cm9v
+dGcyMD8GCCsGAQUFBzAChjNodHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2Nh
+Y2VydC90cnVzdHJvb3RnMi5jcnQwHQYDVR0OBBYEFOYn/QzzohyI3Yq9iPBfTemQ
+fh3+MB8GA1UdIwQYMBaAFBT25YsxtkWASkxt/MKHico2w5BiMA0GCSqGSIb3DQEB
+BQUAA4IBAQCrazL/qj0zhNNyNxOdTf4pQwdhm1A6B0lkxhLXgYaJ0qQJ4FowbeI9
+cyU3K7NX/tmGBSd3DWZm4iBbs/57DyrqHuzPEWZCoFunbu4dZz0oMzRqPw7IDwiK
+VDxUXhy3r/YFQmmUrzabLwuTiU79SdkifpCbgrQetF7gnEkUpe4ut5pfgE35pHT0
+sMJqMmcl/rsJSjqL66abPTtHm3veoXvdtC2mPvO1PqYvXLt7DPThXRWs5WYcSr21
+ecg0BVEasPy2SLG+5WGwY4sm7Iyk1RkK8J6cpjPuxenmsYDBaD/MiihMrE4vjYSs
+vHzz0S28QkLSTR4bn1sBx51QI1NHydse
+-----END CERTIFICATE-----
+
 subject= /C=US/ST=Virginia/L=Blacksburg/OU=Global Qualified Server CA/O=Virginia Polytechnic Institute and State University/CN=Virginia Tech Global Qualified Server CA
 serial=22AA727FF6281A0BC773C1E20C0C4023CA
 -----BEGIN CERTIFICATE-----
@@ -31387,6 +37351,475 @@
 8Yaqw9aIOLwaUvCtIUB+5orZBIIWy1zfq+lX1o6bHnx3nY2Tk/s991z/ufg7GQN8
 iHyunfkp5eAFTJ8+FtpEUcWKKB1mEQBxk65af8XpScn2miiFZbPXYWg6f8bbMA==
 -----END CERTIFICATE-----
+
+subject= /C=DE/ST=Bayern/O=Freistaat Bayern/CN=Bayerische SSL-CA-2014-01
+serial=46D35E1DD1831A5E4670296C92B9F53325EC3A0C
+-----BEGIN CERTIFICATE-----
+MIIovDCCJqSgAwIBAgIURtNeHdGDGl5GcClskrn1MyXsOgwwDQYJKoZIhvcNAQEL
+BQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZ
+BgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0xNDA1MDYyMDM3NDhaFw0yNDA1
+MDYyMDM3NDhaMF0xCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4xGTAXBgNV
+BAoTEEZyZWlzdGFhdCBCYXllcm4xIjAgBgNVBAMTGUJheWVyaXNjaGUgU1NMLUNB
+LTIwMTQtMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDefJgmQDkP
+uDoHAEsr2Qi5lEw0z8NRUK5eO7Cc1Wo3K+IRTGPNVWqmyiyf3O3OVrrrl0SI/z2x
+3/+83JT5JKlHGz4eatD/KTRToD/rOYkKcK6XbJOLPUDawmluSxklvCWH5pgOoNGl
+X1eelbx2Hodm8C5hVcVVkelgvyk4SaRVo5W94xHr4Z0QbGNkCiovE6/rZsQhw5Ow
++EiYijFpDavpJgmZHo2NfXRDOPOxff1ghRSLKhd+wCjy1WQUwpHfGKRLn2DWXZM9
+Xy/Wikt5QNYT6C3FVg195cs8XkqyUq6i8uj6FUEn4C0hK8KG+tQ1wLQpB4lbc4rM
+DFDiF7oXusoRAgMBAAGjgiSKMIIkhjASBgNVHRMBAf8ECDAGAQH/AgEAMHMGCCsG
+AQUFBwEBBGcwZTArBggrBgEFBQcwAYYfaHR0cDovL29jc3AucXVvdmFkaXNnbG9i
+YWwuY29tLzA2BggrBgEFBQcwAoYqaHR0cDovL3RydXN0LnF1b3ZhZGlzZ2xvYmFs
+LmNvbS9xdnJjYTMuY3J0MGAGA1UdIARZMFcwVQYMKwYBBAGBlkIBAgMBMEUwQwYI
+KwYBBQUHAgEWN2h0dHBzOi8vd3d3LnBraS5iYXllcm4uZGUvcG9saWN5L3BvbGlj
+eV9iYXlfc3NsX3BraS5wZGYwgiLjBgNVHR4EgiLaMIIi1qCCItIwDoIMYWJlbnNi
+ZXJnLmRlMBCCDmFiZmFsbC1yb3RoLmRlMBOCEWFkYmstbnVlcm5iZXJnLmRlMBKC
+EGFnZW5kYTIxLXJvdGguZGUwDYILYWhvbGZpbmcuZGUwDYILYWhvbGZpbmcuZXUw
+D4INYWl0ZXJob2Zlbi5kZTAJggdha2RiLmRlMBGCD2FrZGIuZG9pLWRlLm5ldDAK
+gghha2RiLm5ldDAPgg1hbGxlcnNiZXJnLmRlMA+CDWFsbGVyc2JlcmcuZXUwD4IN
+YWxwLWJheWVybi5kZTAPgg1hbHRlbnRoYW5uLmRlMBKCEGFzY2hhZmZlbmJ1cmcu
+ZGUwH4IdYXNjaGFmZmVuYnVyZ2VyLWt1bHR1cnRhZ2UuZGUwH4IdYXNjaGFmZmVu
+YnVyZ2VyLXBvbXBlamFuZXIuZGUwIIIeYXNjaGFmZmVuYnVyZy1zdG9scGVyc3Rl
+aW5lLmRlMA+CDWF0dGVuaG9mZW4uZGUwC4IJYXR0aW5nLmRlMAuCCWF0dGluZy5l
+dTAUghJhdWZicnVjaC1iYXllcm4uZGUwDoIMYXVmaGF1c2VuLmV1MA2CC2F1Z3Ni
+dXJnLmRlMA+CDWJhY2gtZG9uYXUuZGUwD4INYmFkLWFiYmFjaC5kZTAUghJiYWQt
+Z3JvZW5lbmJhY2guZGUwEYIPYmFkLW5ldXN0YWR0LmRlMBKCEGJhZm9lZy1iYXll
+cm4uZGUwCoIIYmFsaXMuZGUwEYIPYmFsaXMtb25saW5lLmRlMAyCCmJhcmJpbmcu
+ZGUwEoIQYmF1YWt0ZW9ubGluZS5kZTALggliYXlkc2IuZGUwFYITYmF5ZXJpc2No
+ZWt1ZWNoZS5kZTALggliYXllcm4uZGUwE4IRYmF5ZXJuLmRvaS1kZS5uZXQwE4IR
+YmF5ZXJuLmxhbmR0YWcuZGUwFYITYmF5ZXJuLnRlc3RhLWRlLm5ldDAPgg1iYXll
+cm4taWxzLmRlMAyCCmJheWxlcm4uZGUwEYIPYmVyYXR6aGF1c2VuLmRlMA6CDGJl
+cmdzdG9yZi5ldTASghBiZXJuaGFyZHN3YWxkLmRlMA2CC2Jlcm5yaWVkLmRlMCKC
+IGJpbGR1bmdzYnVlcm8tYXNjaGFmZmVuYnVyZy5pbmZvMByCGmJpbGR1bmdzYnVl
+cm8tdW50ZXJtYWluLmRlMBiCFmJpbGR1bmdzcmVnaW9uLXJvdGguZGUwF4IVYmlz
+Y2hvZnNoZWltLXJob2VuLmRlMBeCFWJsa2FwYXRyYXMuZHluZG5zLm9yZzARgg9i
+b2NraG9ybi1vYmIuZGUwDoIMYnJlbm5iZXJnLmRlMBaCFGJ1ZWNoZXJlaS1oZWlk
+ZWNrLmRlMBeCFWJ1ZWNoZXJlaS1zdGVpbmFjaC5kZTAeghxidWVyZ2VyaW5mby1z
+Y2h3YW5zdGV0dGVuLmRlMBeCFWJ1ZXJnZXJwb3J0YWwtcm90aC5kZTASghBidXJn
+LWFiZW5iZXJnLmV1MAmCB2J5Ym4uZGUwCYIHY2hhbS5kZTAUghJjaHJpc3RpYW4t
+c2NoYWQuZGUwG4IZY2hyaXN0aWFuLXNjaGFkLW11c2V1bS5kZTAdghtjaHJpc3Rp
+YW4tc2NoYWQtc3RpZnR1bmcuZGUwE4IRY2x1c3Rlci1iYXllcm4uZGUwF4IVZGF0
+ZW5zY2h1dHotYmF5ZXJuLmRlMA+CDWRlbmtlbmRvcmYuZXUwDoIMZGlsbGluZ2Vu
+LmRlMA6CDGRpbGxpbmdlbi5ldTAaghhkaXJla3R2ZXJtYXJrdGVyLXJvdGguZGUw
+FoIUZGlzY29idXMtYmF5cmV1dGguZGUwC4IJZG9yZmVuLmRlMA6CDGR1ZXJuaGFy
+dC5ldTAPgg1kdWdnZW5kb3JmLmRlMA+CDWVjaGluZy1uZGIuZGUwH4IdZS1nb3Zl
+cm5tZW50LWFzY2hhZmZlbmJ1cmcuZGUwF4IVZWhyZW5hbXRza2FydGUtZ2FwLmRl
+MA+CDWVpY2hzdGFldHQuZGUwG4IZZWluc2F0em5hY2hiZWFyYmVpdHVuZy5kZTAe
+ghxlaXNlbmhhbW1lci1lY2tlcnNtdWVobGVuLmRlMA6CDGVsc2VuZG9yZi5kZTAR
+gg9lbHRlcm5pbW5ldHouZGUwFoIUZW5lcmdpZS1pbm5vdmF0aXYuZGUwC4IJZXJk
+aW5nLmRlMBaCFGVybGViZW5zd2VsdC1yb3RoLmRlMBWCE2ZhbWlsaWVuaGFuZGJ1
+Y2guZGUwFYITZmgtYXNjaGFmZmVuYnVyZy5kZTAQgg5maC1hdWdzYnVyZy5kZTAL
+gglmaC1ob2YuZGUwDYILZmh2ci1haXYuZGUwDIIKZmluc2luZy5kZTAOggxmbGFk
+dW5nZW4uZGUwFoIUZm9vZC1mcm9tLWJhdmFyaWEuZGUwDYILZm9yc3Rlcm4uZGUw
+GYIXZnJhZW5raXNjaGVzc2VlbmxhbmQuZGUwDoIMZnJhdW5iZXJnLmRlMBmCF2Zy
+ZWl6ZWl0YnVzLWJheXJldXRoLmRlMBKCEGZyZWl6ZWl0LXBhc3MuZGUwEoIQZnJl
+aXplaXQtcm90aC5kZTAMggpmcmV5dW5nLmRlMCWCI2Z1ZXJzdGVuZmVsZGJydWNr
+ZXItcGZsZWdlYm9lcnNlLmRlMA6CDGZ1bmRyZWljaC5kZTAbghlmdW5kcmVpY2gt
+dGhhbG1hZXNzaW5nLmRlMBSCEmdkZS1mZWxka2lyY2hlbi5kZTAUghJnZW1laW5k
+ZS1hdHRpbmcuZGUwE4IRZ2VtZWluZGUtYnJ1bm4uZGUwF4IVZ2VtZWluZGUtZGV1
+ZXJsaW5nLmRlMBSCEmdlbWVpbmRlLWhhdXNlbi5kZTATghFnZW1laW5kZS1wYWVo
+bC5kZTAZghdnZW1laW5kZS1wYXJrc3RldHRlbi5kZTASghBnZW1laW5kZS1yYWlu
+LmRlMBKCEGdlbWVpbmRlLXJvaHIuZGUwFoIUZ2VtZWluZGUtc3RlaW5hY2guZGUw
+FoIUZ2VtZWluZGUtc3RlaW5hY2guZXUwGIIWZ2VzdW5kaGVpdHNhbXQtcm90aC5k
+ZTAKgghnZXdhbi5kZTAZghdnZXdlcmJlZmxhZWNoZW4tcm90aC5kZTAOggxncS1i
+YXllcm4uZGUwEYIPZ3JlZGwtcmFkd2VnLmRlMBmCF2dydW5kc2NodWxlLXN0ZWlu
+YWNoLmRlMA2CC2d3aS1pbmZvLmRlMBuCGWd5bW5hc2l1bS1oaWxwb2x0c3RlaW4u
+ZGUwGoIYZ3ltbmFzaXVtLXdlbmRlbHN0ZWluLmRlMAmCB2gtYWIuZGUwCYIHaGRi
+Zy5ldTAMggpoZWlkZWNrLmRlMAyCCmhlaWRlY2suZXUwHoIcaGVpbXBsYXR6c3Vj
+aGUtcmVnZW5zYnVyZy5kZTAKgghoZW1hdS5kZTATghFoZXJybmdpZXJzZG9yZi5k
+ZTANggtoZXVzdHJldS5kZTAMggpoZmYtbXVjLmRlMBmCF2hpc3RvcmlzY2hlcy1o
+ZWlkZWNrLmRlMAyCCmhpLXRpZXIuZGUwD4INaG9lcmxrb2Zlbi5kZTAPgg1odW5k
+ZXJkb3JmLmRlMCGCH2ljaC1zY2hhZmZlLWRpZS1lbmVyZ2lld2VuZGUuZGUwEIIO
+aWhybGVyc3RlaW4uZGUwEIIOaWxzYXVnc2J1cmcuZGUwC4IJaWxzLWluLmRlMBmC
+F2lscy1zdGFtbWRhdGVucGZsZWdlLmRlMBCCDmlscy1zdXBwb3J0LmRlMAmCB2lz
+ZW4uZGUwDYILaXNtYW5pbmcuZGUwE4IRaXQtcGxhbnVuZ3NyYXQuZGUwG4IZamVk
+ZXItYnVlcmdlci1laW4tZXVyby5kZTATghFqdWdlbmRhbXQtcm90aC5kZTAOggxr
+YWxsbXVlbnouZGUwEIIOa2FtbWVyc3RlaW4uZGUwDoIMa2FybHNmZWxkLmRlMAyC
+CmtlbGhlaW0uZGUwDIIKa2VtcHRlbi5kZTASghBraWdhLXJlaXNzaW5nLmRlMA6C
+DGtpcmNocm90aC5kZTAVghNraXRhLWthbW1lcnN0ZWluLmRlMBiCFmtpdGEtb2Jl
+cnNjaG5laWRpbmcuZGUwDYILa2pyLXJvdGguZGUwGoIYa2xhc3NpZmlrYXRpb25z
+c2VydmVyLmRlMByCGmtsb2VwcGVsc2NodWxlLWFiZW5iZXJnLmRlMA6CDGtvZXNj
+aGluZy5kZTAfgh1rb21ibi1sYW5ka3JlaXMtcmVnZW5zYnVyZy5kZTAOggxrb21i
+bi1zdGEuZGUwDIIKa29uemVsbC5kZTAZghdrcmVpc2JpbGRzdGVsbGUtcm90aC5k
+ZTANggtrcmVpcy1idC5kZTAOggxrcmVpcy1kbGcuZGUwDYILa3JlaXMtZWkuZGUw
+DoIMa3JlaXMtZmZiLmRlMA6CDGtyZWlzLWZmYi5ldTAZghdrcmVpc2p1Z2VuZHJp
+bmctcm90aC5kZTAMggprcmVpcy1tLmRlMA6CDGtyZWlzLW5lYS5kZTAOggxrcmVp
+cy1wYWYuZGUwDYILa3JlaXMtcmguZXUwEYIPa3JlaXN0YWctZmZiLmRlMBGCD2ty
+ZWlzdGFnLW1pbC5kZTAOggxrcmVpcy10aXIuZGUwGYIXa3VsdHVyLWFzY2hhZmZl
+bmJ1cmcuZGUwHoIca3VsdHVyc3RhZHQtYXNjaGFmZmVuYnVyZy5kZTAVghNrdW5z
+dHVuZGNhcmlsbG9uLmRlMAyCCmxhbGxpbmcuZGUwFoIUbGFuZGtyZWlzLWFuc2Jh
+Y2guZGUwF4IVbGFuZGtyZWlzLWF1Z3NidXJnLmRlMBeCFWxhbmRrcmVpcy1iYXly
+ZXV0aC5kZTATghFsYW5ka3JlaXMtY2hhbS5kZTAVghNsYW5ka3JlaXMtY29idXJn
+LmRlMBWCE2xhbmRrcmVpcy1kYWNoYXUuZGUwGYIXbGFuZGtyZWlzLWRlZ2dlbmRv
+cmYuZGUwGIIWbGFuZGtyZWlzLWRpbGxpbmdlbi5kZTAYghZsYW5ka3JlaXMtZGls
+bGluZ2VuLmV1MCCCHmxhbmRrcmVpcy1kaW5nb2xmaW5nLWxhbmRhdS5kZTAZghds
+YW5ka3JlaXMtZWljaHN0YWV0dC5kZTASghBsYW5ka3JlaXMtZnJnLmRlMBKCEGxh
+bmRrcmVpcy1ob2YuZGUwFoIUbGFuZGtyZWlzLWtyb25hY2guZGUwF4IVbGFuZGty
+ZWlzLWt1bG1iYWNoLmRlMBeCFWxhbmRrcmVpcy1tdWVuY2hlbi5kZTAbghlsYW5k
+a3JlaXMtcGZhZmZlbmhvZmVuLmRlMBSCEmxhbmRrcmVpcy1yZWdlbi5kZTAZghds
+YW5ka3JlaXMtcmVnZW5zYnVyZy5kZTAYghZsYW5ka3JlaXMtcm9zZW5oZWltLmRl
+MBKCEGxhbmRrcmVpc3JvdGguZGUwE4IRbGFuZGtyZWlzLXJvdGguZGUwEoIQbGFu
+ZGtyZWlzcm90aC5ldTATghFsYW5ka3JlaXMtcm90aC5ldTAZghdsYW5kcmF0c2Ft
+dC1iYXlyZXV0aC5kZTAXghVsYW5kcmF0c2FtdC1kYWNoYXUuZGUwF4IVbGFuZHJh
+dHNhbXQtZXJkaW5nLmRlMBSCEmxhbmRyYXRzYW10LWdhcC5kZTAbghlsYW5kcmF0
+c2FtdC1yZWdlbnNidXJnLmRlMBaCFGxhbmRyYXRzYW10LXJvdGguY29tMBSCEmxh
+bmRyYXRzYW10cm90aC5kZTAVghNsYW5kcmF0c2FtdC1yb3RoLmRlMBSCEmxhbmRy
+YXRzYW10cm90aC5ldTAVghNsYW5kcmF0c2FtdC1yb3RoLmV1MA2CC2xhbmRzaHV0
+LmRlMA6CDGxhbmdxdWFpZC5kZTAQgg5sYXBwZXJzZG9yZi5kZTAaghhsZWJlbmZp
+bmRldGlubmVuc3RhZHQuZGUwHIIabGViZW4tZmluZGV0LWlubmVuc3RhZHQuZGUw
+GoIYbGViZW5maW5kZXRpbm5lbnN0YXR0LmRlMB2CG2xlYmVuLWZpbmRldC1pbm5l
+bi1zdGF0dC5kZTAOggxsZWlibGZpbmcuZGUwDYILbGVuZ2RvcmYuZGUwDIIKbGVu
+dGluZy5kZTAMggpsa3ItYmdsLmRlMAyCCmxrci1uZXQuZGUwDIIKbGtyLXRpci5k
+ZTARgg9say1zdGFybmJlcmcuZGUwEYIPbG90dG8tYmF5ZXJuLmRlMBOCEWxvdHRv
+LWV4dHJhbmV0LmRlMAuCCWxyYS1hYi5kZTAQgg5scmEtYWljLWZkYi5kZTAMggps
+cmEtYW9lLmRlMAyCCmxyYS1iZ2wuZGUwC4IJbHJhLWVkLmRlMAyCCmxyYS1lcmgu
+ZGUwDIIKbHJhLWZmYi5kZTAMggpscmEtZmZiLmV1MAyCCmxyYS1nYXAuZGUwDIIK
+bHJhLW11ZS5kZTALgglscmEtb2EuZGUwDIIKbHJhLXBhZi5kZTAMggpscmFyb3Ro
+LmRlMA2CC2xyYS1yb3RoLmRlMBKCEGxyYS1zdGFybmJlcmcuZGUwCoIIbHJhc3cu
+ZGUwDoIMbHJhLXRvZWx6LmRlMAuCCWxyYS13bS5kZTANggttYWluYnVyZy5kZTAQ
+gg5tYWxsZXJzZG9yZi5kZTARgg9tYXJrdC1sYWFiZXIuZGUwEYIPbWFya3QtbWV0
+dGVuLmRlMA+CDW1hcmt0LXJvaHIuZGUwEIIObWFya3R3aW56ZXIuZGUwDIIKbWF0
+Y2hlbi5kZTAUghJtYXgtcmVnZXItaGFsbGUuZGUwEYIPbWF4cmVnZXJ0YWdlLmRl
+MCSCIm1lZGllbnplbnRydW0tcmVnZW5zYnVyZ2VyLWxhbmQuZGUwDoIMbWVtbWlu
+Z2VuLmRlMBCCDm1pbnRyYWNoaW5nLmRlMA+CDW1pdHRlcmZlbHMuZGUwEIIObWl0
+dGVydGVpY2guZGUwFoIUbW9iaWwtcGFya3N0ZXR0ZW4uZGUwD4INbW9lcm5zaGVp
+bS5kZTAPgg1tb29zaW5uaW5nLmRlMBSCEm11c2Vlbi1hYmVuYmVyZy5kZTAZghdt
+dXNlZW4tYXNjaGFmZmVuYnVyZy5kZTAQgg5tdXNlZW4tcm90aC5kZTAbghltdXNl
+dW1zbGFuZHNjaGFmdC1yb3RoLmRlMAqCCG16LWxhLmRlMByCGm5hdHVyYmFkLW9i
+ZXJzY2huZWlkaW5nLmRlMA6CDG5ldWJpYmVyZy5kZTANggtuZXVzdGFkdC5kZTAT
+ghFuZXVzdGFkdC1kb25hdS5kZTARgg9uZXV0cmF1YmxpbmcuZGUwEoIQbmllZGVy
+bW90emluZy5ldTAPgg1uaXR0ZW5kb3JmLmRlMA+CDW5vcm1hbi1kbHIuZGUwDoIM
+bnVlcm5iZXJnLmRlMBWCE251ZXJuYmVyZ2VyLWxhbmQuZGUwDYILb2JlcmRpbmcu
+ZGUwEIIOb2JlcmVsc2JhY2guZGUwEIIOb2Jlcm1vdHppbmcuZXUwE4IRb2JlcnNj
+aG5laWRpbmcuZGUwEoIQb2JlcnRyYXVibGluZy5kZTALgglvZGRzZXQuZGUwFIIS
+b2Vrb2xhbmQtYmF5ZXJuLmRlMA6CDG9zcnotYWtkYi5kZTAPgg1vc3RhbGxnYWV1
+LmRlMA+CDW9zdGVyaG9mZW4uZGUwDIIKb3N0aGVpbS5kZTAVghNvd2EtZ3Jvc3Nt
+ZWhyaW5nLmRlMAyCCnBhaW50ZW4uZGUwEIIOcGFya3N0ZXR0ZW4uZGUwDoIMcGFz
+dGV0dGVuLmRlMAyCCnBlaXRpbmcuZGUwDYILcGVuemJlcmcuZGUwC4IJcGVya2Ft
+LmRlMAuCCXBlcmthbS5ldTAPgg1wZXR0ZW5kb3JmLmRlMA2CC3BmYWtvZmVuLmRl
+MAyCCnBmYXR0ZXIuZGUwFYITcGZsZWdlYm9lcnNlLWZmYi5kZTAbghlwZmxlZ2Vz
+dHVldHpwdW5rdC1yb3RoLmRlMBCCDnBpZWxlbmhvZmVuLmRlMAyCCnBpbGxpbmcu
+ZXUwDoIMcGxhdHRsaW5nLmRlMA2CC3B1Y2hoZWltLmRlMA2CC3JhZGxkb3JmLmV1
+MAmCB3JhaW4uZXUwG4IZcmF0c2luZm8tc2Nod2Fuc3RldHRlbi5kZTAMggpyZWFs
+cmdiLmRlMByCGnJlYWxzY2h1bGUtaGlscG9sdHN0ZWluLmRlMB6CHHJlYWxzY2h1
+bGUtbmV1c3RhZHQtYWlzY2guZGUwD4INcmVnZW5zYnVyZy5kZTAPgg1yZWdlbnN0
+YXVmLmRlMBSCEnJlZ2lvbi1iYXlyZXV0aC5kZTATghFyZWljaGVuc2Nod2FuZC5k
+ZTANggtyZWlzc2luZy5kZTAWghRyZXR1cm4tdG8tYmF2YXJpYS5kZTATghFyaG9l
+bi1ncmFiZmVsZC5kZTAPgg1yaWVkZW5idXJnLmRlMAuCCXJpbmthbS5ldTAQgg5y
+b2V0dGVuYmFjaC5kZTAJggdyb2hyLmV1MA2CC3JvaHItbWZyLmRlMB2CG3JvaHN0
+b2Zmc3RyYXRlZ2llLWJheWVybi5kZTAOggxyb3NlbmhlaW0uZGUwDIIKcm90aHNl
+ZS5kZTAMggpyb3Roc2VlLmV1MA+CDXJvdHRhbC1pbm4uZGUwC4IJcnpscmEubmV0
+MA+CDXNhYWwtZG9uYXUuZGUwDIIKc2FpbGF1Zi5kZTATghFzYW5kYmVyZy1yaG9l
+bi5kZTAWghRzY2hsb3NzLW5ldWJldWVybi5kZTAhgh9zY2huZWxsZXMtaW50ZXJu
+ZXQtaW4tYmF5ZXJuLmRlMBqCGHNjaHVlbGVyd29obmhlaW0tcm90aC5kZTAaghhz
+Y2h1bGUtb2JlcnNjaG5laWRpbmcuZGUwFYITc2Nod2FuZ2VyLWluLWZmYi5kZTAj
+giFzY2h3YW5nZXItaW4tZnVlcnN0ZW5mZWxkYnJ1Y2suZGUwFoIUc2Nod2FuZ2Vy
+LWluLXJvdGguZGUwG4IZc2Nod2FuZ2VyLWluLXNjaHdhYmFjaC5kZTASghBzY2h3
+YW5zdGV0dGVuLmRlMBCCDnNjaHdlaW5mdXJ0LmRlMBWCE3NlbGJzdGhpbGZlLXJv
+dGguZGUwEoIQc2VuaW9yZW4tcm90aC5kZTAMggpzaW56aW5nLmRlMA6CDHNvbnRo
+b2Zlbi5kZTAUghJzcGVycm11ZWxsLXJvdGguZGUwHoIcc3BlemlhbGl0YWV0ZW5s
+YW5kLWJheWVybi5kZTAPgg1zdGFhdHNvcGVyLmRlMBCCDnN0YWF0c3ByZWlzLmRl
+MBSCEnN0YWR0LWFiZW5zYmVyZy5kZTAigiBzdGFkdGJpYmxpb3RoZWstYXNjaGFm
+ZmVuYnVyZy5kZTAOggxzdGFkdC1ob2YuZGUwDoIMc3RhZHRob2Yub3JnMA+CDXN0
+YWR0LWhvZi5vcmcwH4Idc3RhZHR0aGVhdGVyLWFzY2hhZmZlbmJ1cmcuZGUwGIIW
+c3RhZHQtdGlyc2NoZW5yZXV0aC5kZTANggtzdGVpbmFjaC5ldTAaghhzdGVpbmFj
+aC1uaWVkZXJiYXllcm4uZGUwGoIYc3RlaW5hY2gtbmllZGVyYmF5ZXJuLmV1MBKC
+EHN0cmFzc2tpcmNoZW4uZGUwFIISc3RyYXViaW5nLWJvZ2VuLmRlMBeCFXN0dWRl
+bnRzLW5ldWJldWVybi5kZTAVghNzdHVkeS1pbi1iYXZhcmlhLmRlMBOCEXN0LXdv
+bGZnYW5nLW9iLmRlMA6CDHN1ZW5jaGluZy5kZTANggtzdWx6YmVyZy5kZTAVghNz
+eW5jLXRyYXVuc3RlaW4uY29tMBCCDnRhdWZraXJjaGVuLmRlMA+CDXRlZ2Vybmhl
+aW0uZGUwCoIIdGV1Z24uZGUwEIIOdGhhbG1hc3NpbmcuZGUwEIIOdHJhdW5zdGVp
+bi5jb20wEYIPdW5pLWVybGFuZ2VuLmRlMBCCDnVybGF1Yi1yb3RoLmRlMCGCH3Zl
+cndhbHR1bmdzZ2VtZWluc2NoYWZ0LXJhaW4uZGUwIYIfdmVyd2FsdHVuZ3NnZW1l
+aW5zY2hhZnQtcmFpbi5ldTAOggx2Z2VtLXJhaW4uZGUwDoIMdmdlbS1yYWluLmV1
+MBWCE3ZnLW1lbGxyaWNoc3RhZHQuZGUwE4IRdmctbWVzcGVsYnJ1bm4uZGUwFIIS
+dmctb2Jlcm5ldWNoaW5nLmRlMAyCCnZnLXJhaW4uZXUwFIISdmctc3RlaW5raXJj
+aGVuLmRlMBWCE3ZnLXN0cmFzc2tpcmNoZW4uZGUwEoIQdm9sa2Vuc2Nod2FuZC5k
+ZTAPgg12cy1oZWlkZWNrLmRlMBCCDndhaGxlbi1yb3RoLmRlMBGCD3dhbGRrcmFp
+YnVyZy5kZTAPgg13YXJ0ZW5iZXJnLmRlMBmCF3dhc3NlcnF1YWxpdGFldC1yb3Ro
+LmRlMBGCD3dlaWJlcnNicnVubi5kZTALggl3ZWlkZW4uZGUwF4IVd2VpZGVuLXRv
+dXJpc211cy5pbmZvMA2CC3dlaWxoZWltLmRlMBaCFHdlaWxoZWltLXNjaG9uZ2F1
+LmRlMBGCD3dlaXNzZW5zdGFkdC5kZTAfgh13ZWl0ZXItc3R1ZGllcmVuLWluLWJh
+eWVybi5kZTAQgg53ZW5kZWxzdGVpbi5kZTAPgg13ZW56ZW5iYWNoLmRlMA+CDXdp
+ZWxlbmJhY2guZGUwD4INd2llc2VuZG9yZi5ldTAMggp3aWVzZW50LmRlMB+CHXdp
+cnRzY2hhZnRzZm9lcmRlcnVuZy1yb3RoLmRlMB6CHHdpcnRzY2hhZnRzc2NodWxl
+LWdyZWRpbmcuZGUwEYIPd29lcnRoLWRvbmF1LmRlMCOCIXdvaGxmdWVobHJlZ2lv
+bi1maWNodGVsZ2ViaXJnZS5kZTANggt3b2xmc2VnZy5kZTAUghJ3b3JrLWluLWJh
+dmFyaWEuZGUwDoIMd3VlcnpidXJnLmRlMAyCCngtdHJhbnMuZXUwDYILemVpdGxh
+cm4uZGUwDYILemktZGF0ZW4uZGUwI4IhenVrdW5mdHNwZmFkZS1kaWdpdGFsZXMt
+YmF5ZXJuLmRlMCKHICoCECwAAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAAMCKH
+ICoCEC0AAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAAMCKHICoCEC4AAAAAAAAA
+AAAAAAD/////AAAAAAAAAAAAAAAAMCKHICoCEC8AAAAAAAAAAAAAAAD/////AAAA
+AAAAAAAAAAAAMAqHCD6ZbNj////4MAqHCMPIRgD///8AMAqHCMPIRwD///8AMAqH
+CMEizwD///8AMAqHCMEc8QD///8AMAqHCMEc8gD///8AMAqHCMEc8wD///8AMAqH
+CMEc9AD///8AMAqHCMEc9QD///8AMAqHCMEc9gD///8AMAqHCMEc9wD///8AMAqH
+CMEc+AD///8AMAqHCMEc+QD///8AMAqHCD6avcD////4MAqHCFCVpND////4MAqH
+CMBE1gD///8AMAqHCMEc8AD///8AMAqHCMPzw/j////4MAqHCMPz4Aj////4MAqH
+CNS5ZID////4MAqHCFCcC1D////4MAqHCNnz7sD////4MAqHCFCWi+D////gMAqH
+CFEbqTP///8AMAqHCD6cuHP///8AMAqHCD6d1jP///8AMAqHCFCW1Ov///8AMAqH
+CFCW9Vj////4MD2kOzA5MQswCQYDVQQGEwJERTEPMA0GA1UECBMGQmF5ZXJuMRkw
+FwYDVQQKExBGcmVpc3RhYXQgQmF5ZXJuMA4GA1UdDwEB/wQEAwIBBjAnBgNVHSUE
+IDAeBggrBgEFBQcDAQYIKwYBBQUHAwkGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFPLA
+E+CCQz777i9nMpY1XNu4ywLQMDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
+cXVvdmFkaXNnbG9iYWwuY29tL3F2cmNhMy5jcmwwHQYDVR0OBBYEFGxVmMbtlkue
+j6jwmVRXyCX4LndkMA0GCSqGSIb3DQEBCwUAA4ICAQBCPj+pCzFkZPqMN5Q5yygg
+5/P27c0AlhNRDvOs7Ab36Bu0wcG+bef6wWOAGpi/y1uMcGT6PNY3LddyqzJjIgk/
+d1eedPiZjAuPclNk6vMdKRCi+GiW6VMOPzb51eWOln1S3KnEwOZwSww9Q5RBBaz8
+7OovfQiB9vSCvD56Iv+es0tHqpAISkJpjNFX5M5fRo8C6Z2lNf+V5ntCnMHf4E/y
+vWBuYHgG0pII+UAGTvshXmynzmhxVDRsi2JbuGrwzeuodajWsBoTH64LsvR7LHNI
+ASP6aVkWqfMHghOGqBlgV3uiHBUHYvPGTW1GxQDfMK2ZWykGA8GCZ8VFLknObs8v
+XwiVEZtQ1R05cu4bcV2DWI+sIVmdElrLAQ/XcUWU4OJSoLXojKVjvlxU1426yqR3
+fyrqF3Oj9Zccf4BE5KEDVtba5ZKGMbnIhH0xwT1dGm/GioUzIpB+sM/Q+AazwF+z
+cxpun2vg0z8iSZGQ5sHDuj0rkfJjL8SSazGgsUejK5V8OrNSYuKQ1dQ+4IknQEQj
+/t3lyqtcCzStk8ht/Zj83gvG1QQyaSexsCZ6PsTNeW1OoYWPIUskx5XHJYeJXqHc
+Swd1kTOgV/iwCdIsrPkI0CYzFz04YcAS/1mEpe3w676hQH6FGg8w+D+Z2DNs2hCn
+jH/RQgReHyBJ0bEqvfvd0g==
+-----END CERTIFICATE-----
+
+subject= /C=US/ST=GA/L=Atlanta/O=Southern Company Services, Inc./CN=Southern Company External Issuing CA 1
+serial=17B3C08F0DA4D1D4D7E5EB1C3E7C95381A
+-----BEGIN CERTIFICATE-----
+MIItAjCCK+qgAwIBAgIRF7PAjw2k0dTX5escPnyVOBowDQYJKoZIhvcNAQEFBQAw
+XDELMAkGA1UEBhMCQkUxFTATBgNVBAsTDFRydXN0ZWQgUm9vdDEZMBcGA1UEChMQ
+R2xvYmFsU2lnbiBudi1zYTEbMBkGA1UEAxMSVHJ1c3RlZCBSb290IENBIEcyMB4X
+DTEzMTEyODAwMDAwMFoXDTE4MTEyODAwMDAwMFowgYcxCzAJBgNVBAYTAlVTMQsw
+CQYDVQQIEwJHQTEQMA4GA1UEBxMHQXRsYW50YTEoMCYGA1UEChMfU291dGhlcm4g
+Q29tcGFueSBTZXJ2aWNlcywgSW5jLjEvMC0GA1UEAxMmU291dGhlcm4gQ29tcGFu
+eSBFeHRlcm5hbCBJc3N1aW5nIENBIDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQC1AedGDhdoL/UIkVpwgpqiNoh+VrOEedemEP3GMf0FvUniA8du1dU+
+PlxafCpYMlxJNABF5XjXtS01FybaKuOQJHAWlGFgEAPohYYq862fOYXG0aqc19hy
+Oq1NpnOnoQcTJVQmYcJy/icfrcGLjv65Wz25tWL7Li1VCYfHIsSIJAqQbHlGadN5
+TsFP7yQ4oWPeAFztN3PMbuwwNr0KlqPCGeAkcSWH/CR1Efp7z2O401kFNg3ZuLpW
+O7NkYo9tUOIbDrVUlfHcqwg8rm/t8nEtWrb/cRBJ7phcsRmDu97XZ6wk78BKXUjW
+UumaTUsZFHVJ/rrZUz1GS6dWmPx3RkDbAgMBAAGjgimRMIIpjTAOBgNVHQ8BAf8E
+BAMCAQYwgZUGA1UdIASBjTCBijAIBgZngQwBAgIwDAYKKwYBBAGgMgE8ATANBgsr
+BgEEAYk0g30CAjANBgsrBgEEAYk0g30CAzANBgsrBgEEAYk0g30CBDBDBgsrBgEE
+AYk0g30CBTA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNv
+bS9yZXBvc2l0b3J5LzASBgNVHRMBAf8ECDAGAQH/AgEAMIInlAYDVR0eBIInizCC
+J4eggidRMBOCEWFsYWJhbWEtcG93ZXIuY29tMBOCEWFsYWJhbWEtcG93ZXIubmV0
+MCCCHmFsYWJhbWFlY29ub21pY2RldmVsb3BtZW50LmNvbTAVghNhbGFiYW1hZWxl
+Y3RyaWMuY29tMBKCEGFsYWJhbWFwb3dlci5iaXowEoIQYWxhYmFtYXBvd2VyLmNv
+bTATghFhbGFiYW1hcG93ZXIuaW5mbzASghBhbGFiYW1hcG93ZXIubmV0MCGCH2Fs
+YWJhbWFwb3dlcmFwcGxpYW5jZWNlbnRlci5jb20wHIIaYWxhYmFtYXBvd2VyZm91
+bmRhdGlvbi5jb20wGoIYYWxhYmFtYXBvd2VycHJvZHVjdHMuY29tMBGCD2FsYWJh
+bWFwd2VyLmNvbTAWghRhbGFiYW1hdXRpbGl0aWVzLmNvbTAWghRhbGFiYW1hd2ls
+ZHBvd2VyLmNvbTARgg9hbGFiYW1wb3dlci5jb20wEYIPYWxhYm1hcG93ZXIuY29t
+MA6CDGFsYWxha2VzLmNvbTAOggxhbGFwb3dlci5jb20wEYIPYWxiYW1hcG93ZXIu
+Y29tMBSCEmFtYXppbmdhbGFiYW1hLmNvbTAUghJhbWF6aW5nYWxhYmFtYS5uZXQw
+FIISYW1hemluZ2FsYWJhbWEub3JnMBWCE2FtZXJpY2FzdXRpbGl0eS5jb20wLoIs
+YXBjZW1wbG95ZWVhcHBsaWFuY2VhbmRlbGVjdHJvbmljc3ByaWNlcy5jb20wDoIM
+YXBjbGFrZXMuY29tMBeCFWFwcGxpYW5jZXJlc291cmNlLmNvbTAQgg5iYXNpY3N1
+cmdlLmNvbTARgg9idWlsdHRvZ3Jvdy5vcmcwHIIaYnVzaW5lc3NyZXNvdXJjZWNl
+bnRlci5jb20wDYILY2VwYW5ldC5jb20wEIIOY2hhcmdlbWV1cC5jb20wEIIOZWFy
+dGhjZW50cy5jb20wFIISZWZmaWNpZW5jeWhvbWUuY29tMBSCEmVsZWN0cmljYW5k
+Z2FzLmNvbTAXghVlbGVjdHJpY2l0eWFuZGdhcy5jb20wFYITZWxlY3RyaWN1dGls
+aXR5LmNvbTAZghdlbWVyZ2luZ21pc3Npc3NpcHBpLmNvbTAdghtlbXBsb3llZWFw
+cGxpYW5jZWNlbnRlci5jb20wEoIQZW5lcmd5ZGlyZWN0LmNvbTAUghJlbmVyZ3lk
+aXJlY3RydC5jb20wEYIPZW5lcmd5c2V0dXAuY29tMBKCEGVuZXJneXNwcmluZy5j
+b20wHIIaZW5lcmd5dG9zZXJ2ZXlvdXJ3b3JsZC5jb20wFYITZmxvcmlkYWVsZWN0
+cmljLmNvbTAWghRmbG9yaWRhdXRpbGl0aWVzLmNvbTAMggpnYS1pdHMuY29tMA2C
+C2dhcG93ZXIuY29tMAqCCGdhcHdyLmNvMAuCCWdhcHdyLmNvbTASghBnZWFyZ2lh
+cG93ZXIuY29tMBKCEGdlb3JnYWlwb3dlci5jb20wEYIPZ2VvcmdhcG93ZXIuY29t
+MBGCD2dlb3JnZXBvd2VyLmNvbTAVghNnZW9yZ2lhZWxlY3RyaWMuY29tMBGCD2dl
+b3JnaWFvd2VyLmNvbTARgg9nZW9yZ2lhcG93ZS5jb20wEoIQZ2VvcmdpYXBvd2Vy
+LmJpejASghBnZW9yZ2lhcG93ZXIuY29tMBOCEWdlb3JnaWFwb3dlci5pbmZvMBSC
+Emdlb3JnaWFwb3dlcmNvLmNvbTAZghdnZW9yZ2lhcG93ZXJjb21wYW55LmNvbTAV
+ghNnZW9yZ2lhcG93ZXJnYXMuY29tMBGCD2dlb3JnaWFwd2VyLmNvbTAWghRnZW9y
+Z2lhdXRpbGl0aWVzLmNvbTARgg9nZW9yZ2lwb3dlci5jb20wEoIQZ2Vvcmdpc3Bv
+d2VyLmNvbTASghBnZXJvZ2lhcG93ZXIuY29tMA6CDGdldGFsaW5jLmNvbTALggln
+bGZwd3IuY28wEoIQZ29lcmdpYXBvd2VyLmNvbTAVghNnb29kY2VudHNsaXZpbmcu
+Y29tMBGCD2dvcmdpYXBvd2VyLmNvbTAJggdncGMuY29tMA6CDGd1ZnBvd2VyLmNv
+bTAKgghndWxmLmNvbTASghBndWxmZWxlY3RyaWMuY29tMBCCDmd1bGZlbmVyZ3ku
+Y29tMA+CDWd1bGZwb3dlci5jb20wEIIOZ3VsZnBvd2VyLmluZm8wEIIOZ3VsZnBv
+d2VyLm1vYmkwFoIUZ3VsZnBvd2VyY29tcGFueS5jb20wE4IRZ3VsZnV0aWxpdGll
+cy5jb20wDoIMZ3VscG93ZXIuY29tMBGCD2luc3RhbnRsaW5jLmNvbTATghFsZWFy
+bmluZ3Bvd2VyLm9yZzASghBsaW5jY29ubmVjdHMuY29tMBKCEGxpbmN3aXJlbGVz
+cy5uZXQwGYIXbWlzc2lzc2lwcGllbGVjdHJpYy5jb20wFoIUbWlzc2lzc2lwcGlw
+b3dlci5iaXowFoIUbWlzc2lzc2lwcGlwb3dlci5jb20wF4IVbWlzc2lzc2lwcGlw
+b3dlci5pbmZvMBqCGG1pc3Npc3NpcHBpdXRpbGl0aWVzLmNvbTAUghJtb3Zpbmdt
+YWRlZWFzeS5jb20wCYIHbXBjLmNvbTANggttc3Bvd2VyLmNvbTAKgghtc3B3ci5j
+bzALgglteWdyYy5jb20wEYIPbXlndWxmcG93ZXIuY29tMA+CDW15dXRpbGl0eS5j
+b20wFIISbmF0aW9uc3V0aWxpdHkuY29tMBCCDm51Y2xlYXJwaW0uY29tMBWCE29u
+bGluZXV0aWxpdGllcy5jb20wE4IRb25saW5ldXRpbGl0eS5jb20wEYIPcGxhbmV0
+cG93ZXIuY29tMBCCDnBvd2VyY2VudHMuY29tMBqCGHBvd2VyZWRieWNvbW1vbnNl
+bnNlLmNvbTAaghhwb3dlcmVkYnljb21tb25zZW5zZS5uZXQwGoIYcG93ZXJlZGJ5
+Y29tbW9uc2Vuc2Uub3JnMBCCDnBvd2Vyc2V0dXAuY29tMBKCEHByZW1pdW1zdXJn
+ZS5jb20wCYIHc2F2LmNvbTAWghRzYXZhbm5haGVsZWN0cmljLmJpejAWghRzYXZh
+bm5haGVsZWN0cmljLmNvbTAXghVzYXZhbm5haGVsZWN0cmljLmluZm8wFIISc2F2
+YW5uYWhlbmVyZ3kuY29tMBOCEXNhdmFubmFocG93ZXIuY29tMBeCFXNhdmFubmFo
+dXRpbGl0aWVzLmNvbTALgglzY2ZyZC5jb20wDIIKc2NzbmV0LmNvbTAPgg1zZWxl
+Y3QtZ2EuY29tMA+CDXNlbGVjdC1nYS5uZXQwFIISc2VsZWN0LWdlb3JnaWEuY29t
+MBSCEnNlbGVjdC1nZW9yZ2lhLm5ldDAOggxzZWxlY3RnYS5uZXQwG4IZc2VsZWN0
+Z2VvcmdpYS1hcHBsaW5nLmNvbTAcghpzZWxlY3RnZW9yZ2lhLWF0a2luc29uLmNv
+bTAZghdzZWxlY3RnZW9yZ2lhLWJhY29uLmNvbTAZghdzZWxlY3RnZW9yZ2lhLWJh
+a2VyLmNvbTAbghlzZWxlY3RnZW9yZ2lhLWJhbGR3aW4uY29tMBmCF3NlbGVjdGdl
+b3JnaWEtYmFua3MuY29tMBqCGHNlbGVjdGdlb3JnaWEtYmFycm93LmNvbTAaghhz
+ZWxlY3RnZW9yZ2lhLWJhcnRvdy5jb20wG4IZc2VsZWN0Z2VvcmdpYS1iZW5oaWxs
+LmNvbTAbghlzZWxlY3RnZW9yZ2lhLWJlcnJpZW4uY29tMBiCFnNlbGVjdGdlb3Jn
+aWEtYmliYi5jb20wHIIac2VsZWN0Z2VvcmdpYS1ibGVja2xleS5jb20wHIIac2Vs
+ZWN0Z2VvcmdpYS1icmFudGxleS5jb20wGoIYc2VsZWN0Z2VvcmdpYS1icm9va3Mu
+Y29tMBmCF3NlbGVjdGdlb3JnaWEtYnJ5YW4uY29tMBuCGXNlbGVjdGdlb3JnaWEt
+YnVsbG9jaC5jb20wGYIXc2VsZWN0Z2VvcmdpYS1idXJrZS5jb20wGYIXc2VsZWN0
+Z2VvcmdpYS1idXR0cy5jb20wG4IZc2VsZWN0Z2VvcmdpYS1jYWxob3VuLmNvbTAa
+ghhzZWxlY3RnZW9yZ2lhLWNhbWRlbi5jb20wG4IZc2VsZWN0Z2VvcmdpYS1jYW5k
+bGVyLmNvbTAbghlzZWxlY3RnZW9yZ2lhLWNhcnJvbGwuY29tMBuCGXNlbGVjdGdl
+b3JnaWEtY2F0b29zYS5jb20wHIIac2VsZWN0Z2VvcmdpYS1jaGFybHRvbi5jb20w
+G4IZc2VsZWN0Z2VvcmdpYS1jaGF0aGFtLmNvbTAhgh9zZWxlY3RnZW9yZ2lhLWNo
+YXR0YWhvb2NoZWUuY29tMB2CG3NlbGVjdGdlb3JnaWEtY2hhdHRvb2dhLmNvbTAc
+ghpzZWxlY3RnZW9yZ2lhLWNoZXJva2VlLmNvbTAaghhzZWxlY3RnZW9yZ2lhLWNs
+YXJrZS5jb20wGIIWc2VsZWN0Z2VvcmdpYS1jbGF5LmNvbTAbghlzZWxlY3RnZW9y
+Z2lhLWNsYXl0b24uY29tMBqCGHNlbGVjdGdlb3JnaWEtY2xpbmNoLmNvbTAYghZz
+ZWxlY3RnZW9yZ2lhLWNvYmIuY29tMBqCGHNlbGVjdGdlb3JnaWEtY29mZmVlLmNv
+bTAcghpzZWxlY3RnZW9yZ2lhLWNvbHF1aXR0LmNvbTAcghpzZWxlY3RnZW9yZ2lh
+LWNvbHVtYmlhLmNvbTAYghZzZWxlY3RnZW9yZ2lhLWNvb2suY29tMBqCGHNlbGVj
+dGdlb3JnaWEtY293ZXRhLmNvbTAcghpzZWxlY3RnZW9yZ2lhLWNyYXdmb3JkLmNv
+bTAZghdzZWxlY3RnZW9yZ2lhLWNyaXNwLmNvbTAYghZzZWxlY3RnZW9yZ2lhLWRh
+ZGUuY29tMBqCGHNlbGVjdGdlb3JnaWEtZGF3c29uLmNvbTAbghlzZWxlY3RnZW9y
+Z2lhLWRlY2F0dXIuY29tMBqCGHNlbGVjdGdlb3JnaWEtZGVrYWxiLmNvbTAZghdz
+ZWxlY3RnZW9yZ2lhLWRvZGdlLmNvbTAZghdzZWxlY3RnZW9yZ2lhLWRvb2x5LmNv
+bTAdghtzZWxlY3RnZW9yZ2lhLWRvdWdoZXJ0eS5jb20wG4IZc2VsZWN0Z2Vvcmdp
+YS1kb3VnbGFzLmNvbTAZghdzZWxlY3RnZW9yZ2lhLWVhcmx5LmNvbTAaghhzZWxl
+Y3RnZW9yZ2lhLWVjaG9scy5jb20wHYIbc2VsZWN0Z2VvcmdpYS1lZmZpbmdoYW0u
+Y29tMBqCGHNlbGVjdGdlb3JnaWEtZWxiZXJ0LmNvbTAbghlzZWxlY3RnZW9yZ2lh
+LWVtYW51ZWwuY29tMBmCF3NlbGVjdGdlb3JnaWEtZXZhbnMuY29tMBqCGHNlbGVj
+dGdlb3JnaWEtZmFubmluLmNvbTAbghlzZWxlY3RnZW9yZ2lhLWZheWV0dGUuY29t
+MBmCF3NlbGVjdGdlb3JnaWEtZmxveWQuY29tMBuCGXNlbGVjdGdlb3JnaWEtZm9y
+c3l0aC5jb20wHIIac2VsZWN0Z2VvcmdpYS1mcmFua2xpbi5jb20wGoIYc2VsZWN0
+Z2VvcmdpYS1mdWx0b24uY29tMBqCGHNlbGVjdGdlb3JnaWEtZ2lsbWVyLmNvbTAc
+ghpzZWxlY3RnZW9yZ2lhLWdsYXNjb2NrLmNvbTAZghdzZWxlY3RnZW9yZ2lhLWds
+eW5uLmNvbTAaghhzZWxlY3RnZW9yZ2lhLWdvcmRvbi5jb20wGYIXc2VsZWN0Z2Vv
+cmdpYS1ncmFkeS5jb20wGoIYc2VsZWN0Z2VvcmdpYS1ncmVlbmUuY29tMByCGnNl
+bGVjdGdlb3JnaWEtZ3dpbm5ldHQuY29tMB2CG3NlbGVjdGdlb3JnaWEtaGFiZXJz
+aGFtLmNvbTAYghZzZWxlY3RnZW9yZ2lhLWhhbGwuY29tMBuCGXNlbGVjdGdlb3Jn
+aWEtaGFuY29jay5jb20wHIIac2VsZWN0Z2VvcmdpYS1oYXJhbHNvbi5jb20wGoIY
+c2VsZWN0Z2VvcmdpYS1oYXJyaXMuY29tMBiCFnNlbGVjdGdlb3JnaWEtaGFydC5j
+b20wGYIXc2VsZWN0Z2VvcmdpYS1oZWFyZC5jb20wGYIXc2VsZWN0Z2VvcmdpYS1o
+ZW5yeS5jb20wG4IZc2VsZWN0Z2VvcmdpYS1ob3VzdG9uLmNvbTAZghdzZWxlY3Rn
+ZW9yZ2lhLWlyd2luLmNvbTAbghlzZWxlY3RnZW9yZ2lhLWphY2tzb24uY29tMBqC
+GHNlbGVjdGdlb3JnaWEtamFzcGVyLmNvbTAdghtzZWxlY3RnZW9yZ2lhLWplZmZk
+YXZpcy5jb20wHYIbc2VsZWN0Z2VvcmdpYS1qZWZmZXJzb24uY29tMBuCGXNlbGVj
+dGdlb3JnaWEtamVua2lucy5jb20wG4IZc2VsZWN0Z2VvcmdpYS1qb2huc29uLmNv
+bTAZghdzZWxlY3RnZW9yZ2lhLWpvbmVzLmNvbTAZghdzZWxlY3RnZW9yZ2lhLWxh
+bWFyLmNvbTAaghhzZWxlY3RnZW9yZ2lhLWxhbmllci5jb20wG4IZc2VsZWN0Z2Vv
+cmdpYS1sYXVyZW5zLmNvbTAXghVzZWxlY3RnZW9yZ2lhLWxlZS5jb20wG4IZc2Vs
+ZWN0Z2VvcmdpYS1saWJlcnR5LmNvbTAbghlzZWxlY3RnZW9yZ2lhLWxpbmNvbG4u
+Y29tMBiCFnNlbGVjdGdlb3JnaWEtbG9uZy5jb20wG4IZc2VsZWN0Z2VvcmdpYS1s
+b3duZGVzLmNvbTAbghlzZWxlY3RnZW9yZ2lhLWx1bXBraW4uY29tMBmCF3NlbGVj
+dGdlb3JnaWEtbWFjb24uY29tMBuCGXNlbGVjdGdlb3JnaWEtbWFkaXNvbi5jb20w
+GoIYc2VsZWN0Z2VvcmdpYS1tYXJpb24uY29tMByCGnNlbGVjdGdlb3JnaWEtbWNk
+dWZmaWUuY29tMByCGnNlbGVjdGdlb3JnaWEtbWNpbnRvc2guY29tMB6CHHNlbGVj
+dGdlb3JnaWEtbWVyaXdldGhlci5jb20wGoIYc2VsZWN0Z2VvcmdpYS1taWxsZXIu
+Y29tMByCGnNlbGVjdGdlb3JnaWEtbWl0Y2hlbGwuY29tMBqCGHNlbGVjdGdlb3Jn
+aWEtbW9ucm9lLmNvbTAeghxzZWxlY3RnZW9yZ2lhLW1vbnRnb21lcnkuY29tMBqC
+GHNlbGVjdGdlb3JnaWEtbW9yZ2FuLmNvbTAaghhzZWxlY3RnZW9yZ2lhLW11cnJh
+eS5jb20wHIIac2VsZWN0Z2VvcmdpYS1tdXNjb2dlZS5jb20wGoIYc2VsZWN0Z2Vv
+cmdpYS1uZXd0b24uY29tMBqCGHNlbGVjdGdlb3JnaWEtb2NvbmVlLmNvbTAeghxz
+ZWxlY3RnZW9yZ2lhLW9nbGV0aG9ycGUuY29tMByCGnNlbGVjdGdlb3JnaWEtcGF1
+bGRpbmcuY29tMBmCF3NlbGVjdGdlb3JnaWEtcGVhY2guY29tMBuCGXNlbGVjdGdl
+b3JnaWEtcGlja2Vucy5jb20wGoIYc2VsZWN0Z2VvcmdpYS1waWVyY2UuY29tMBiC
+FnNlbGVjdGdlb3JnaWEtcGlrZS5jb20wGIIWc2VsZWN0Z2VvcmdpYS1wb2xrLmNv
+bTAbghlzZWxlY3RnZW9yZ2lhLXB1bGFza2kuY29tMBqCGHNlbGVjdGdlb3JnaWEt
+cHV0bmFtLmNvbTAbghlzZWxlY3RnZW9yZ2lhLXF1aXRtYW4uY29tMBmCF3NlbGVj
+dGdlb3JnaWEtcmFidW4uY29tMByCGnNlbGVjdGdlb3JnaWEtcmFuZG9scGguY29t
+MByCGnNlbGVjdGdlb3JnaWEtcmljaG1vbmQuY29tMByCGnNlbGVjdGdlb3JnaWEt
+cm9ja2RhbGUuY29tMBqCGHNlbGVjdGdlb3JnaWEtc2NobGV5LmNvbTAbghlzZWxl
+Y3RnZW9yZ2lhLXNjcmV2ZW4uY29tMByCGnNlbGVjdGdlb3JnaWEtc2VtaW5vbGUu
+Y29tMByCGnNlbGVjdGdlb3JnaWEtc3BhbGRpbmcuY29tMByCGnNlbGVjdGdlb3Jn
+aWEtc3RlcGhlbnMuY29tMBuCGXNlbGVjdGdlb3JnaWEtc3Rld2FydC5jb20wGoIY
+c2VsZWN0Z2VvcmdpYS1zdW10ZXIuY29tMBqCGHNlbGVjdGdlb3JnaWEtdGFsYm90
+LmNvbTAeghxzZWxlY3RnZW9yZ2lhLXRhbGlhZmVycm8uY29tMByCGnNlbGVjdGdl
+b3JnaWEtdGF0dG5hbGwuY29tMBqCGHNlbGVjdGdlb3JnaWEtdGF5bG9yLmNvbTAb
+ghlzZWxlY3RnZW9yZ2lhLXRlbGZhaXIuY29tMBuCGXNlbGVjdGdlb3JnaWEtdGVy
+cmVsbC5jb20wGoIYc2VsZWN0Z2VvcmdpYS10aG9tYXMuY29tMBiCFnNlbGVjdGdl
+b3JnaWEtdGlmdC5jb20wGoIYc2VsZWN0Z2VvcmdpYS10b29tYnMuY29tMBmCF3Nl
+bGVjdGdlb3JnaWEtdG93bnMuY29tMByCGnNlbGVjdGdlb3JnaWEtdHJldXRsZW4u
+Y29tMBmCF3NlbGVjdGdlb3JnaWEtdHJvdXAuY29tMBqCGHNlbGVjdGdlb3JnaWEt
+dHVybmVyLmNvbTAaghhzZWxlY3RnZW9yZ2lhLXR3aWdncy5jb20wGYIXc2VsZWN0
+Z2VvcmdpYS11bmlvbi5jb20wGYIXc2VsZWN0Z2VvcmdpYS11cHNvbi5jb20wGoIY
+c2VsZWN0Z2VvcmdpYS13YWxrZXIuY29tMBqCGHNlbGVjdGdlb3JnaWEtd2FsdG9u
+LmNvbTAYghZzZWxlY3RnZW9yZ2lhLXdhcmUuY29tMBqCGHNlbGVjdGdlb3JnaWEt
+d2FycmVuLmNvbTAeghxzZWxlY3RnZW9yZ2lhLXdhc2hpbmd0b24uY29tMBmCF3Nl
+bGVjdGdlb3JnaWEtd2F5bmUuY29tMBuCGXNlbGVjdGdlb3JnaWEtd2Vic3Rlci5j
+b20wG4IZc2VsZWN0Z2VvcmdpYS13aGVlbGVyLmNvbTAZghdzZWxlY3RnZW9yZ2lh
+LXdoaXRlLmNvbTAdghtzZWxlY3RnZW9yZ2lhLXdoaXRmaWVsZC5jb20wGoIYc2Vs
+ZWN0Z2VvcmdpYS13aWxjb3guY29tMBqCGHNlbGVjdGdlb3JnaWEtd2lsa2VzLmNv
+bTAdghtzZWxlY3RnZW9yZ2lhLXdpbGtpbnNvbi5jb20wGYIXc2VsZWN0Z2Vvcmdp
+YS13b3J0aC5jb20wE4IRc2VsZWN0Z2VvcmdpYS5jb20wE4IRc2VsZWN0Z2Vvcmdp
+YS5uZXQwDYILc2V0cmFucy5iaXowDoIMc2V0cmFucy5pbmZvMA2CC3NldHJhbnMu
+bmV0MA2CC3NldHJhbnMub3JnMBGCD3NldHJhbnNncmlkLmJpejARgg9zZXRyYW5z
+Z3JpZC5jb20wEoIQc2V0cmFuc2dyaWQuaW5mbzARgg9zZXRyYW5zZ3JpZC5uZXQw
+EYIPc2V0cmFuc2dyaWQub3JnMBiCFnNldHJhbnNncmlkY29tcGFueS5jb20wGIIW
+c2V0cmFuc2dyaWRjb21wYW55Lm5ldDAYghZzZXRyYW5zZ3JpZGNvbXBhbnkub3Jn
+MBSCEnNldHJhbnNtaXNzaW9uLmNvbTAUghJzZXRyYW5zbWlzc2lvbi5uZXQwFIIS
+c2V0cmFuc21pc3Npb24ub3JnMBCCDnNldHJhbnNydG8uYml6MBCCDnNldHJhbnNy
+dG8uY29tMBGCD3NldHJhbnNydG8uaW5mbzAQgg5zZXRyYW5zcnRvLm5ldDAQgg5z
+ZXRyYW5zcnRvLm9yZzANggtzbHdkYXRhLmNvbTAJggdzbmMuY29tMA2CC3NvY29n
+ZW4uY29tMAyCCnNvbGluYy5jb20wDIIKc29wb2NvLmNvbTAUghJzb3RoZXJuY29t
+cGFueS5jb20wE4IRc291cnRoZXJubGluYy5jb20wFYITc291dGhlYXN0ZXJucnRw
+LmNvbTATghFzb3V0aGVhc3RpcnBwLmNvbTAVghNzb3V0aGVhc3RzdW1taXQuY29t
+MBSCEnNvdXRoZW5jb21wYW55LmNvbTAUghJzb3V0aGVyY29tcGFueS5jb20wEYIP
+c291dGhlcmxpbmMuY29tMBaCFHNvdXRoZXJuLXRlbGVjb20uY29tMBaCFHNvdXRo
+ZXJuLXRlbGVjb20ubmV0MBaCFHNvdXRoZXJuLXRlbGVjb20ub3JnMBKCEHNvdXRo
+ZXJuYnV5cy5jb20wEIIOc291dGhlcm5jby5iaXowEIIOc291dGhlcm5jby5jb20w
+EYIPc291dGhlcm5jby5pbmZvMBiCFnNvdXRoZXJuY29lbGVjdHJpYy5jb20wE4IR
+c291dGhlcm5jb2dhcy5jb20wGoIYc291dGhlcm5jb2dlbmVyYXRpb24uY29tMBWC
+E3NvdXRoZXJuY29tcGFueS5iaXowFYITc291dGhlcm5jb21wYW55LmNvbTAWghRz
+b3V0aGVybmNvbXBhbnkuaW5mbzAVghNzb3V0aGVybmNvbXBhbnkubmV0MBWCE3Nv
+dXRoZXJuY29tcGFueS5vcmcwG4IZc291dGhlcm5jb21wYW55Y2FyZWVyLmNvbTAc
+ghpzb3V0aGVybmNvbXBhbnljYXJlZXJzLmNvbTAaghhzb3V0aGVybmNvbXBhbnll
+bWFpbC5jb20wG4IZc291dGhlcm5jb21wYW55ZW5lcmd5LmNvbTAbghlzb3V0aGVy
+bmNvbXBhbnllbmVyZ3kubmV0MBuCGXNvdXRoZXJuY29tcGFueWVuZXJneS5vcmcw
+F4IVc291dGhlcm5jb21wYW55ZXYuY29tMBiCFnNvdXRoZXJuY29tcGFueWdhcy5j
+b20wGoIYc291dGhlcm5jb21wYW55cG93ZXIuY29tMBqCGHNvdXRoZXJuY29tcGFu
+eXBvd2VyLm5ldDAaghhzb3V0aGVybmNvbXBhbnlwb3dlci5vcmcwFIISc291dGhl
+cm5jb21wYXkuY29tMBSCEnNvdXRoZXJuY29wYW55LmNvbTAXghVzb3V0aGVybmNv
+dGVsZWNvbS5jb20wFoIUc291dGhlcm5lbGVjdHJpYy5jb20wFIISc291dGhlcm5l
+bmVyZ3kuYml6MBSCEnNvdXRoZXJuZW5lcmd5LmNvbTAVghNzb3V0aGVybmVuZXJn
+eS5pbmZvMB2CG3NvdXRoZXJuZW5lcmd5c29sdXRpb25zLmNvbTAYghZzb3V0aGVy
+bmdlbmVyYXRpbmcuY29tMBiCFnNvdXRoZXJuZ2VuZXJhdGluZy5uZXQwGIIWc291
+dGhlcm5nZW5lcmF0aW5nLm9yZzAYghZzb3V0aGVybmdlbmVyYXRpb24uY29tMBSC
+EnNvdXRoZXJuaGVyb2VzLmNvbTASghBzb3V0aGVybmxpbmMuYml6MBKCEHNvdXRo
+ZXJubGluYy5jb20wE4IRc291dGhlcm5saW5jLmluZm8wEoIQc291dGhlcm5saW5j
+Lm5ldDAaghhzb3V0aGVybmxpbmN3aXJlbGVzcy5jb20wGoIYc291dGhlcm5saW5j
+d2lyZWxlc3MubmV0MBKCEHNvdXRoZXJubGluay5jb20wGoIYc291dGhlcm5saW5r
+d2lyZWxlc3MuY29tMBqCGHNvdXRoZXJubGlua3dpcmVsZXNzLm5ldDAVghNzb3V0
+aGVybm51Y2xlYXIuY29tMBWCE3NvdXRoZXJucG93ZXJjby5jb20wGoIYc291dGhl
+cm5wb3dlcmNvbXBhbnkuY29tMBqCGHNvdXRoZXJucG93ZXJjb21wYW55Lm5ldDAa
+ghhzb3V0aGVybnBvd2VyY29tcGFueS5vcmcwFoIUc291dGhlcm5wb3dlcmluYy5j
+b20wFoIUc291dGhlcm5wb3dlcmluYy5uZXQwFoIUc291dGhlcm5wb3dlcmluYy5v
+cmcwFYITc291dGhlcm50ZWxlY29tLmJpejAWghRzb3V0aGVybnRlbGVjb20uaW5m
+bzAVghNzb3V0aGVybnRlbGVjb20ub3JnMBmCF3NvdXRoZXJudHJhbm1pc3Npb24u
+Y29tMBmCF3NvdXRoZXJudHJhbm1pc3Npb24ubmV0MBmCF3NvdXRoZXJudHJhbm1p
+c3Npb24ub3JnMBqCGHNvdXRoZXJudHJhbnNtaXNzaW9uLmNvbTAaghhzb3V0aGVy
+bnRyYW5zbWlzc2lvbi5vcmcwFIISc3V0aGVybmNvbXBhbnkuY29tMBWCE3RoZWVu
+ZXJneWV4cGVydC5jb20wFIISdGhld2F0ZXJjb3Vyc2Uub3JnMBGCD3RyaXBsZXN1
+cmdlLmNvbTAVghN1dGlsaXRpZXNvbmxpbmUuY29tMBSCEnV0aWxpdGllc3NldHVw
+LmNvbTAUghJ1dGlsaXR5Y2VudHJhbC5jb20wEoIQdXRpbGl0eXNldHVwLmNvbTAV
+ghN3aXJlbGVzc2xhdGVyYWwuY29tMBWCE3dpcmVsZXNzbGF0ZXJhbC5uZXQwGYIX
+eW91cmFwcGxpYW5jZWNlbnRlci5jb20wGIIWeW91cmFwcGxpYW5jZXN0b3JlLmNv
+bTARgg95b3VydXRpbGl0eS5jb20wEIEOc291dGhlcm5jby5jb20wEYEPLnNvdXRo
+ZXJuY28uY29tMFqkWDBWMQswCQYDVQQGEwJVUzELMAkGA1UECBMCR0ExEDAOBgNV
+BAcTB0F0bGFudGExKDAmBgNVBAoTH1NvdXRoZXJuIENvbXBhbnkgU2VydmljZXMs
+IEluYy4wX6RdMFsxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdHZW9yZ2lhMRAwDgYD
+VQQHEwdBdGxhbnRhMSgwJgYDVQQKEx9Tb3V0aGVybiBDb21wYW55IFNlcnZpY2Vz
+LCBJbmMuMFSkUjBQMQswCQYDVQQGEwJVUzELMAkGA1UECBMCR0ExEDAOBgNVBAcT
+B0F0bGFudGExIjAgBgNVBAoTGVNvdXRoZXJuIENvbXBhbnkgU2VydmljZXMwWaRX
+MFUxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdHZW9yZ2lhMRAwDgYDVQQHEwdBdGxh
+bnRhMSIwIAYDVQQKExlTb3V0aGVybiBDb21wYW55IFNlcnZpY2VzoTAwCocIAAAA
+AAAAAAAwIocgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMQYDVR0l
+BCowKAYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcDBAYIKwYBBQUHAwkwPQYD
+VR0fBDYwNDAyoDCgLoYsaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy90cnVz
+dHJvb3RnMi5jcmwwgYQGCCsGAQUFBwEBBHgwdjAzBggrBgEFBQcwAYYnaHR0cDov
+L29jc3AyLmdsb2JhbHNpZ24uY29tL3RydXN0cm9vdGcyMD8GCCsGAQUFBzAChjNo
+dHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC90cnVzdHJvb3RnMi5j
+cnQwHQYDVR0OBBYEFOYn/QzzohyI3Yq9iPBfTemQfh3+MB8GA1UdIwQYMBaAFBT2
+5YsxtkWASkxt/MKHico2w5BiMA0GCSqGSIb3DQEBBQUAA4IBAQCLtbG285Th3DaI
+phM5w4JmnlF/LQXhXfVsPOiDjiU5S+ZPWAsJB8q4yxARn5I1ci/LZhhrL8kNJ82H
+w2lwCsgf4F/W+qLIcxSesw8g9noMnfyVt0RztD34OJriZB/FaOo+2IUbf316Vt3P
+KtZUH4fCTWvxLa5iffjvwb0zX9+aGcuA8SReI7WwiqxspqSRU/1C4vXE+2SfbUoO
+YMmPHmzjEqQln0H5xox7kvPbiZ76ZOJ3ZkIt5gN1uLXVp8vfwsBxUA/Q2Vo+pbJE
+y3NUgGokPXdr9m4+PCHFdHdWEiR2gOff27vQTvQQ7r3Gbs/qiX+Ua4MXXY1qt+E6
+QLFq2D7Q
+-----END CERTIFICATE-----
 # ***** BEGIN LICENSE BLOCK *****
 # This file is a collection of intermediate certificates accumulated
 # from various https downloads. See README for instructions about
@@ -32346,6 +38779,34 @@
 BKNDLdr8C2LqL19iUw==
 -----END CERTIFICATE-----
 
+subject= /C=DK/O=TDC Internet/OU=TDC Internet Root CA
+serial=3ACCA54C
+-----BEGIN CERTIFICATE-----
+MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE
+SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg
+Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV
+BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl
+cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA
+vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu
+Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a
+0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1
+4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN
+eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD
+R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG
+A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu
+dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME
+Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3
+WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw
+HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ
+KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO
+Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX
+wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89
+9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0
+jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38
+aQNiuJkFBT1reBK9sG9l
+-----END CERTIFICATE-----
+
 subject= /C=DE/O=TC TrustCenter GmbH/OU=TC TrustCenter Universal CA/CN=TC TrustCenter Universal CA II
 serial=193300010002281A9A04BCF25545
 -----BEGIN CERTIFICATE-----
@@ -33089,6 +39550,40 @@
 1cUNSa7XnkeKtBsTRj1mnk4+KAL+odzfktvRCSCYfLiY44mB2Sev4/02GkW7
 -----END CERTIFICATE-----
 
+subject= /C=HU/L=Budapest/O=NetLock Halozatbiztonsagi Kft./OU=Tanusitvanykiadok/CN=NetLock Uzleti (Class B) Tanusitvanykiado
+serial=69
+-----BEGIN CERTIFICATE-----
+MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx
+ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
+b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD
+EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05
+OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G
+A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh
+Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l
+dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG
+SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK
+gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX
+iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc
+Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E
+BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G
+SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu
+b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh
+bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv
+Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln
+aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0
+IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
+c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph
+biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo
+ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP
+UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj
+YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo
+dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA
+bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06
+sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa
+n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS
+NitjrFgBazMpUIaD8QFI
+-----END CERTIFICATE-----
+
 subject= /C=HU/L=Budapest/O=NetLock Kft./OU=Tan\xC3\xBAs\xC3\xADtv\xC3\xA1nykiad\xC3\xB3k (Certification Services)/CN=NetLock Platina (Class Platinum) F\xC5\x91tan\xC3\xBAs\xC3\xADtv\xC3\xA1ny
 serial=49412DEC0010
 -----BEGIN CERTIFICATE-----
@@ -33169,6 +39664,40 @@
 macqaJVmlaut74nLYKkGEsaUR+ko
 -----END CERTIFICATE-----
 
+subject= /C=HU/L=Budapest/O=NetLock Halozatbiztonsagi Kft./OU=Tanusitvanykiadok/CN=NetLock Expressz (Class C) Tanusitvanykiado
+serial=68
+-----BEGIN CERTIFICATE-----
+MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx
+ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
+b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD
+EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X
+DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw
+DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u
+c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr
+TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA
+OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC
+2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW
+RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P
+AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW
+ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0
+YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz
+b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO
+ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB
+IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs
+b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
+ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s
+YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg
+a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g
+SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0
+aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg
+YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg
+Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY
+ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g
+pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4
+Fp1hBWeAyNDYpQcCNJgEjTME1A==
+-----END CERTIFICATE-----
+
 subject= /DC=com/DC=microsoft/CN=Microsoft Root Certificate Authority
 serial=79AD16A14AA0A5AD4C7358F407132E65
 -----BEGIN CERTIFICATE-----
@@ -33358,43 +39887,6 @@
 UNkAAk/bg9ART6RCVmE6fhMy04Qfybo=
 -----END CERTIFICATE-----
 
-subject= /C=ES/O=IZENPE S.A./CN=Izenpe.com
-serial=06E846272F1F0A8FD1845CE369F6D5
------BEGIN CERTIFICATE-----
-MIIF8DCCA9igAwIBAgIPBuhGJy8fCo/RhFzjafbVMA0GCSqGSIb3DQEBBQUAMDgx
-CzAJBgNVBAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXpl
-bnBlLmNvbTAeFw0wNzEyMTMxMzA4MjdaFw0zNzEyMTMwODI3MjVaMDgxCzAJBgNV
-BAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXplbnBlLmNv
-bTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMnTesoPHqynhugWZWqx
-whtFMnGV2f4QW8yv56V5AY+Jw8ryVXH3d753lPNypCxE2J6SmxQ6oeckkAoKVo7F
-2CaU4dlI4S0+2gpy3aOZFdqBoof0e24md4lYrdbrDLJBenNubdt6eEHpCIgSfocu
-ZhFjbFT7PJ1ywLwu/8K33Q124zrX97RovqL144FuwUZvXY3gTcZUVYkaMzEKsVe5
-o4qYw+w7NMWVQWl+dcI8IMVhulFHoCCQk6GQS/NOfIVFVJrRBSZBsLVNHTO+xAPI
-JXzBcNs79AktVCdIrC/hxKw+yMuSTFM5NyPs0wH54AlETU1kwOENWocivK0bo/4m
-tRXzp/yEGensoYi0RGmEg/OJ0XQGqcwL1sLeJ4VQJsoXuMl6h1YsGgEebL4TrRCs
-tST1OJGh1kva8bvS3ke18byB9llrzxlT6Y0Vy0rLqW9E5RtBz+GGp8rQap+8TI0G
-M1qiheWQNaBiXBZO8OOi+gMatCxxs1gs3nsL2xoP694hHwZ3BgOwye+Z/MC5TwuG
-KP7Suerj2qXDR2kS4Nvw9hmL7Xtw1wLW7YcYKCwEJEx35EiKGsY7mtQPyvp10gFA
-Wo15v4vPS8+qFsGV5K1Mij4XkdSxYuWC5YAEpAN+jb/af6IPl08M0w3719Hlcn4c
-yHf/W5oPt64FRuXxqBbsR6QXAgMBAAGjgfYwgfMwgbAGA1UdEQSBqDCBpYEPaW5m
-b0BpemVucGUuY29tpIGRMIGOMUcwRQYDVQQKDD5JWkVOUEUgUy5BLiAtIENJRiBB
-MDEzMzcyNjAtUk1lcmMuVml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFDMEEG
-A1UECQw6QXZkYSBkZWwgTWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAxNCAtIDAxMDEw
-IFZpdG9yaWEtR2FzdGVpejAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUHRxlDqjyJXu0kc/ksbHmvVV0bAUwDQYJKoZIhvcNAQEFBQAD
-ggIBAMeBRm8hGE+gBe/n1bqXUKJg7aWSFBpSm/nxiEqg3Hh10dUflU7F57dp5iL0
-+CmoKom+z892j+Mxc50m0xwbRxYpB2iEitL7sRskPtKYGCwkjq/2e+pEFhsqxPqg
-l+nqbFik73WrAGLRne0TNtsiC7bw0fRue0aHwp28vb5CO7dz0JoqPLRbEhYArxk5
-ja2DUBzIgU+9Ag89njWW7u/kwgN8KRwCfr00J16vU9adF79XbOnQgxCvv11N75B7
-XSus7Op9ACYXzAJcY9cZGKfsK8eKPlgOiofmg59OsjQerFQJTx0CCzl+gQgVuaBp
-E8gyK+OtbBPWg50jLbJtooiGfqgNASYJQNntKE6MkyQP2/EeTXp6WuKlWPHcj1+Z
-ggwuz7LdmMySlD/5CbOlliVbN/UShUHiGUzGigjB3Bh6Dx4/glmimj4/+eAJn/3B
-kUtdyXvWton83x18hqrNA/ILUpLxYm9/h+qrdslsUMIZgq+qHfUgKGgu1fxkN0/P
-pUTEvnK0jHS0bKf68r10OEMr3q/53NjgnZ/cPcqlY0S/kqJPTIAcuxrDmkoEVU3K
-7iYLHL8CxWTTnn7S05EcS6L1HOUXHA0MUqORH5zwIe0ClG+poEnK6EOMxPQ02nwi
-o8ZmPrgbBYhdurz3vOXcFD2nhqi2WVIhA16L4wTtSyoeo09Q
------END CERTIFICATE-----
-
 subject= /C=ES/O=IZENPE S.A. - CIF A-01337260-RMerc.Vitoria-Gasteiz T1055 F62 S8/L=Avda del Mediterraneo Etorbidea 3 - 01010 Vitoria-Gasteiz/CN=Izenpe.com/emailAddress=Info@izenpe.com
 serial=01
 -----BEGIN CERTIFICATE-----
@@ -33527,6 +40019,48 @@
 SaLJiFZlZY46Z0WMjAviqrFLB/+xH7oUz3L6p3g=
 -----END CERTIFICATE-----
 
+subject= /L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 3 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com
+serial=01
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
+NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
+cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
+2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
+JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
+Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
+n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
+PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
+-----END CERTIFICATE-----
+
+subject= /L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 1 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com
+serial=01
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
+NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
+LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
+TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
+LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
+I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
+nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
+-----END CERTIFICATE-----
+
 subject= /C=SI/O=Halcom/CN=Halcom CA PO 2
 serial=0134E2
 -----BEGIN CERTIFICATE-----
@@ -35395,6 +41929,46 @@
 JtmwUa/3jFKqEqdY35KbZ/Kd8ub0aTH0Fufed1se3ZoFAa0=
 -----END CERTIFICATE-----
 
+subject= /C=CO/O=Sociedad Cameral de Certificaci\xC3\xB3n Digital - Certic\xC3\xA1mara S.A./CN=AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
+serial=077E52937BE015E357F0698CCBEC0C
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx
+CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp
+ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa
+QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw
+NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft
+ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu
+QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq
+hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG
+qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL
+fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ
+Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4
+Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ
+54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b
+MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j
+ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej
+YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt
+A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF
+rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ
+pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB
+lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy
+YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50
+7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs
+YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6
+xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc
+unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/
+Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp
+ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42
+gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0
+jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+
+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD
+W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/
+RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r
+MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk
+BYn8eNZcLCZDqQ==
+-----END CERTIFICATE-----
+
 subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)07/CN=VeriSign Class 3 Secure Server 1024-bit CA
 serial=2FE97EAD3D3B144711ACE11557D25720
 -----BEGIN CERTIFICATE-----
@@ -35559,6 +42133,41 @@
 KeiaJjWCrEelx2n3uEEUx5p4gTZjx3BvnAKpkFcAXr2Y93GX/ZwUiCNT
 -----END CERTIFICATE-----
 
+subject= /C=US/O=Entrust, Inc./OU=AND ADDITIONAL TERMS GOVERNING USE AND RELIANCE/OU=CPS CONTAINS IMPORTANT LIMITATIONS OF WARRANTIES AND LIABILITY/OU=www.entrust.net/CPS is incorporated by reference/OU=(c) 2008 Entrust, Inc./CN=Entrust Certification Authority - L1B
+serial=3863C5AE
+-----BEGIN CERTIFICATE-----
+MIIFkTCCBHmgAwIBAgIEOGPFrjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0wODA4MjUxODE0MjZaFw0xODA4
+MjUxODQ0MjZaMIIBNDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIElu
+Yy4xODA2BgNVBAsTL0FORCBBRERJVElPTkFMIFRFUk1TIEdPVkVSTklORyBVU0Ug
+QU5EIFJFTElBTkNFMUcwRQYDVQQLEz5DUFMgQ09OVEFJTlMgSU1QT1JUQU5UIExJ
+TUlUQVRJT05TIE9GIFdBUlJBTlRJRVMgQU5EIExJQUJJTElUWTE5MDcGA1UECxMw
+d3d3LmVudHJ1c3QubmV0L0NQUyBpcyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNl
+MR8wHQYDVQQLExYoYykgMjAwOCBFbnRydXN0LCBJbmMuMS4wLAYDVQQDEyVFbnRy
+dXN0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gTDFCMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA3CH1aPl6zofyeN/YO00GfcYk5KnNnQFW5PZxF6p/
+dSIY5HRtGz5W1bGmHt1ZJlPKBua6C283u6jGnBU7BhuHDMIaTdOBrttQZaU6ZE8w
+NJorqR/9K9E4cRlo8o7re8lAPEjEGbG3ECXvRKfmd5t9Ipre2F7Zw87JcSK7ru8F
+1vIX51Z44VMFSiZzuMdJZ5MjD1ayj93JWQXlYxW0h35ARum1AHsDtA3klmcs3htZ
+CxofuGNErsHXRIfEkVmcAENtxt8KsLEEzf6+MF46JXLdoj7tRjrHpFxc5CXyEwfo
+rtqbGZui2WCdzpBHamF7QOgUwv4vhFpmF8CX00k43mMCnwIDAQABo4IBJjCCASIw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wMwYIKwYBBQUHAQEEJzAl
+MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAyBgNVHR8EKzAp
+MCegJaAjhiFodHRwOi8vY3JsLmVudHJ1c3QubmV0LzIwNDhjYS5jcmwwOwYDVR0g
+BDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5u
+ZXQvQ1BTMB0GA1UdDgQWBBT18paIfQ3zKvlO5zSgvUZ+E9YWyDAfBgNVHSMEGDAW
+gBRV5IHREYC+2Im5CKMx+aEkCRa5cDAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIA
+gTANBgkqhkiG9w0BAQUFAAOCAQEACyU8WPqO3KJCO3ZxbmzUTyu5U1yyWLmx3G8a
+5OPEUPJBgrr0fcfB+fqMU7+5YrdJ4x0K/B/WxHZqk8t3Hix/0D8WY0xyTGdgD/iA
+1qeayqIzkQ9EsmY9jmgMQIUSN5G5gnc0WS1c34JuLLZ60gSQZ2hLcPwtuP+QZG9+
+kffRRzPzW7hYLiHYdWAbE8z4sqj6aqkqWk9FhUC03TQFt3DKAe/hgecRUNs+4tcQ
+LmoVf7fUo2KyiWlhV8Z/jp7UJHrzoUNfoHqJ3FnNfdd1p7xT1Uc1xjEwIJ+burWD
+5olVAU2RO9aJNYc8g2t6KYLUS9TmFnSwARCraQYUN3v3ZjA6xQ==
+-----END CERTIFICATE-----
+
 subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO EV SGC CA
 serial=1362E8EB541A108CB8A80EE59FB1D451
 -----BEGIN CERTIFICATE-----
@@ -35589,6 +42198,39 @@
 cSj43azlRd/Y5ygFoWjOwSVbhfpGnf7bZPA=
 -----END CERTIFICATE-----
 
+subject= /C=ES/O=AC Camerfirma SA/CN=CA Camerfirma Express Corporate Server/serialNumber=A82743287
+serial=08
+-----BEGIN CERTIFICATE-----
+MIIFIjCCBAqgAwIBAgIBCDANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn
+MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
+ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg
+b2YgQ29tbWVyY2UgUm9vdDAeFw0wNDA0MjAxNzA1NThaFw0zNDA0MjExNzA1NTha
+MG0xCzAJBgNVBAYTAkVTMRkwFwYDVQQKExBBQyBDYW1lcmZpcm1hIFNBMS8wLQYD
+VQQDEyZDQSBDYW1lcmZpcm1hIEV4cHJlc3MgQ29ycG9yYXRlIFNlcnZlcjESMBAG
+A1UEBRMJQTgyNzQzMjg3MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+uSy+2i/afKJtZnuCh2h01FkAoBwv+IWKxxHRW/F4rrBTxKrz5IkleQejc11S8VM+
+64maXYgzaRsodkkOQb7RSHEZV0a1SFdiyx/D0Qq4FCXUTqHdVD80f7CQ2psb/hIQ
+tN59mAVSankqsZS/hHVJwWHvcPQ0HDqE+JyB6P7Udx/8rN1PYjC7tVACkdAom0eI
+isnHg+wrlN0NuBvNig3oXmXonaiQpkTukqCmqlyZxZDNyQSWeZNz0Ln56tTQnHuG
+JU0YrAI26jqOojxEMaG9aPC7jLX+lpt/xhSsahnTKvgm9hXXjYintVCR1oIepoG3
+MFp4yYcwJJYIe/Jzf2Y+wwIDAQABo4IBuTCCAbUwEgYDVR0TAQH/BAgwBgEB/wIB
+CzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
+aGFtYmVyc3Jvb3QuY3JsMB0GA1UdDgQWBBQNfChpUp8Yr8dNnC5McgVSVtG3pTCB
+qwYDVR0jBIGjMIGggBTjlPWxTenboSlbV4tNdgZ24dGiiqGBhKSBgTB/MQswCQYD
+VQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3
+MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZ
+Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdIIBADAOBgNVHQ8BAf8EBAMCAYYwCQYD
+VR0RBAIwADAnBgNVHRIEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3Jn
+MFAGA1UdIARJMEcwRQYLKwYBBAGBhy4KCwEwNjA0BggrBgEFBQcCARYoaHR0cDov
+L2Nwcy5jYW1lcmZpcm1hLmNvbS9jcHMvY21mY3MuaHRtbDANBgkqhkiG9w0BAQUF
+AAOCAQEAVxyJ7YUCTD2zn33oOymb8RqQPgssAlXNd5/82uzjSlEL7y1nstVSdxMB
+8+J0xBR1lISn0sfFA9ZHedz3GPD3FOzmzX2ZQ31iTS6B/b7AWdh1GhY094MR3n8S
+AWTKNvrAYawXyF/HqcNdIbEqa6dRxqR3fcBNiyfb01zUdpidezHShNl8KbaokEW3
+HgRlpCBHhiu3uAXflarw7UT9OjUj04fgYSrtOy4xJoZhUCNTVOpCdVTc7YmVuLFi
+Rh5STyaMLRHkjabYM//udQicSgMrEvj+WBX2GmSmlbk5abVoYUtjDUB7gQ38UMJn
+cARUSjsyS35DKvZot0YRNcVaGXz+bg==
+-----END CERTIFICATE-----
+
 subject= /C=BR/O=ICP-Brasil/CN=Autoridade Certificadora SERPRO v2
 serial=06
 -----BEGIN CERTIFICATE-----
diff --git a/lib/docker/ChangeLog.md b/lib/docker/ChangeLog.md
index c04e195..e58f28e 100644
--- a/lib/docker/ChangeLog.md
+++ b/lib/docker/ChangeLog.md
@@ -1,10 +1,104 @@
 ChangeLog
 =========
 
+0.5.3
+-----
+
+* Fixed attaching when connecting to the daemon over a UNIX socket.
+
+0.5.2
+-----
+
+* Fixed a bug where sockets were closed immediately when attaching over
+  TLS.
+
+0.5.1
+-----
+
+* Added a `assert_hostname` option to `TLSConfig` which can be used to
+  disable verification of hostnames.
+* Fixed SSL not working due to an incorrect version comparison
+* Fixed streams not working on Windows
+
+0.5.0
+-----
+
+* **This version introduces breaking changes!**
+* Added `insecure_registry` parameter in `Client.push` and `Client.pull`.
+  *It defaults to False and code pushing to non-HTTPS private registries
+  might break as a result.*
+* Added support for adding and dropping capabilities
+* Added support for restart policy
+* Added support for string values in `Client.create_container`'s `mem_limit`
+* Added support for `.dockerignore` file in `Client.build`
+
+### Bugfixes
+
+* Fixed timeout behavior in `Client.stop`
+
+### Miscellaneous
+
+* `Client.create_container` provides better validation of the `volumes`
+  parameter
+* Improved integration tests
+
+0.4.0
+-----
+
+* **This version introduces breaking changes!**
+* The `base_url` parameter in the `Client` constructor should now allow most
+  of the `DOCKER_HOST` environment values (except for the fd:// protocol)
+    * As a result, URLs that don't specify a port are now invalid (similar
+    to the official client's behavior)
+* Added TLS support (see [documentation](https://github.com/dotcloud/docker-py#connection-to-daemon-using-https))
+
+### Bugfixes
+
+* Fixed an issue with `Client.build` streamed logs in Python 3
+
+### Miscellaneous
+
+* Added unit tests coverage
+* Various integration tests fixes
+
 0.3.2
 -----
 
-_In development._
+* Default API version is now 1.12 (support for docker 1.0)
+* Added new methods `Client.get_image` and `Client.load_image`
+  (`docker save` and `docker load`)
+* Added new method `Client.ping`
+* Added new method `Client.resize`
+* `Client.build` can now be provided with a custom context using the
+  `custom_context` parameter.
+* Added support for `memswap_limit` parameter in `create_container`
+* Added support for `force` parameter in `remove_container`
+* Added support for `force` and `noprune` parameters in `remove_image`
+* Added support for `timestamps` parameter in `logs`
+* Added support for `dns_search` parameter in `start`
+* Added support for `network_mode` parameter in `start`
+* Added support for `size` parameter in `containers`
+* Added support for `volumes_from` and `dns` parameters in `start`. As of
+  API version >= 1.10, these parameters no longer belong to `create_container`
+* `Client.logs` now uses the logs endpoint when API version is sufficient
+
+### Bugfixes
+
+* Fixed a bug in pull where the `repo:tag` notation wasn't interpreted
+  properly
+* Fixed a bug in streaming methods with python 3 (unicode, bytes/str related)
+* Fixed a bug in `Client.start` where legacy notation for volumes wasn't
+  supported anymore.
+
+### Miscellaneous
+
+* The client now raises `DockerException`s when appropriate. You can import
+  `DockerException` (and its subclasses) from the `docker.errors` module to
+  catch them if needed.
+* `docker.APIError` has been moved to the new `docker.errors` module as well.
+* `Client.insert` is deprecated in API version > 1.11
+* Improved integration tests should now run much faster.
+* There is now a single source of truth for the docker-py version number.
 
 0.3.1
 -----
diff --git a/lib/docker/README.md b/lib/docker/README.md
index 325a927..52139b2 100644
--- a/lib/docker/README.md
+++ b/lib/docker/README.md
@@ -1,7 +1,7 @@
 docker-py
 =========
 
-[![Build Status](https://travis-ci.org/dotcloud/docker-py.png)](https://travis-ci.org/dotcloud/docker-py)
+[![Build Status](https://travis-ci.org/docker/docker-py.png)](https://travis-ci.org/docker/docker-py)
 
 An API client for docker written in Python
 
@@ -20,7 +20,7 @@
 
 ```python
 c = docker.Client(base_url='unix://var/run/docker.sock',
-                  version='1.9',
+                  version='1.12',
                   timeout=10)
 ```
 
@@ -78,6 +78,17 @@
 attach options (`-a`). See "Port bindings" and "Using volumes" below for
 more information on how to create port bindings and volume mappings.
 
+`command` is the command to be run in the container. String or list types are
+accepted.
+
+The `environment` variable accepts a dictionary or a list of strings
+in the following format `["PASSWORD=xxx"]` or `{"PASSWORD": "xxx"}`.
+
+The `mem_limit` variable accepts float values (which represent the memory limit
+of the created container in bytes) or a string with a units identification char
+('100000b', 1000k', 128m', '1g'). If a string is specified without a units
+character, bytes are assumed as an intended unit.
+
 `volumes_from` and `dns` arguments raise TypeError exception if they are used
 against v1.10 of docker remote API. Those arguments should be passed to
 `start()` instead.
@@ -190,7 +201,7 @@
 Identical to the `docker pull` command.
 
 ```python
-c.push(repository, stream=False)
+c.push(repository, tag=None, stream=False)
 ```
 
 Identical to the `docker push` command.
@@ -221,7 +232,8 @@
 ```python
 c.start(container, binds=None, port_bindings=None, lxc_conf=None,
         publish_all_ports=False, links=None, privileged=False,
-        dns=None, dns_search=None, volumes_from=None, network_mode=None)
+        dns=None, dns_search=None, volumes_from=None, network_mode=None,
+        restart_policy=None, cap_add=None, cap_drop=None)
 ```
 
 Similar to the `docker start` command, but doesn't support attach
@@ -247,6 +259,36 @@
 reuses another container network stack), 'host': use the host network stack
 inside the container.
 
+`restart_policy` is available since v1.2.0 and sets the RestartPolicy for how a container should or should not be 
+restarted on exit. By default the policy is set to no meaning do not restart the container when it exits. 
+The user may specify the restart policy as a dictionary for example:
+for example: 
+```
+{
+    "MaximumRetryCount": 0, 
+    "Name": "always"
+}
+```
+for always restarting the container on exit or can specify to restart the container to restart on failure and can limit
+number of restarts. 
+for example:
+```
+{
+    "MaximumRetryCount": 5, 
+    "Name": "on-failure"
+}
+```
+
+`cap_add` and `cap_drop` are available since v1.2.0 and can be used to add or drop certain capabilities.
+The user may specify the capabilities as an array for example:
+```
+[
+    "SYS_ADMIN",
+    "MKNOD"
+]
+```
+
+ 
 ```python
 c.stop(container, timeout=10)
 ```
@@ -342,3 +384,62 @@
         }
 })
 ```
+
+Connection to daemon using HTTPS
+================================
+
+*These instructions are docker-py specific. Please refer to
+http://docs.docker.com/articles/https/ first.*
+
+*  Authenticate server based on public/default CA pool
+
+```python
+client = docker.Client(base_url='<https_url>', tls=True)
+```
+
+Equivalent CLI options: `docker --tls ...`
+
+If you want to use TLS but don't want to verify the server certificate
+(for example when testing with a self-signed certificate):
+
+```python
+tls_config = docker.tls.TLSConfig(verify=False)
+client = docker.Client(base_url='<https_url>', tls=tls_config)
+```
+
+* Authenticate server based on given CA
+
+```python
+tls_config = docker.tls.TLSConfig(ca_cert='/path/to/ca.pem')
+client = docker.Client(base_url='<https_url>', tls=tls_config)
+```
+
+Equivalent CLI options: `docker --tlsverify --tlscacert /path/to/ca.pem ...`
+
+* Authenticate with client certificate, do not authenticate server
+  based on given CA
+
+```python
+tls_config = docker.tls.TLSConfig(
+  client_cert=('/path/to/client-cert.pem', '/path/to/client-key.pem')
+)
+client = docker.Client(base_url='<https_url>', tls=tls_config)
+```
+
+Equivalent CLI options:
+`docker --tls --tlscert /path/to/client-cert.pem
+--tlskey /path/to/client-key.pem ...`
+
+* Authenticate with client certificate, authenticate server based on given CA
+
+```python
+tls_config = docker.tls.TLSConfig(
+  client_cert=('/path/to/client-cert.pem', '/path/to/client-key.pem'),
+  ca_cert='/path/to/ca.pem'
+)
+client = docker.Client(base_url='<https_url>', tls=tls_config)
+```
+
+Equivalent CLI options:
+`docker --tlsverify --tlscert /path/to/client-cert.pem
+--tlskey /path/to/client-key.pem --tlscacert /path/to/ca.pem ...`
diff --git a/lib/docker/docker/auth/auth.py b/lib/docker/docker/auth/auth.py
index 0bd386d..c13eed4 100644
--- a/lib/docker/docker/auth/auth.py
+++ b/lib/docker/docker/auth/auth.py
@@ -34,17 +34,22 @@
     return url
 
 
-def expand_registry_url(hostname):
+def expand_registry_url(hostname, insecure=False):
     if hostname.startswith('http:') or hostname.startswith('https:'):
         if '/' not in hostname[9:]:
             hostname = hostname + '/v1/'
         return hostname
     if utils.ping('https://' + hostname + '/v1/_ping'):
         return 'https://' + hostname + '/v1/'
-    return 'http://' + hostname + '/v1/'
+    elif insecure:
+        return 'http://' + hostname + '/v1/'
+    else:
+        raise errors.DockerException(
+            "HTTPS endpoint unresponsive and insecure mode isn't enabled."
+        )
 
 
-def resolve_repository_name(repo_name):
+def resolve_repository_name(repo_name, insecure=False):
     if '://' in repo_name:
         raise errors.InvalidRepository(
             'Repository name cannot contain a scheme ({0})'.format(repo_name))
@@ -56,11 +61,12 @@
         raise errors.InvalidRepository(
             'Invalid repository name ({0})'.format(repo_name))
 
-    if 'index.docker.io' in parts[0]:
+    if 'index.docker.io' in parts[0] or 'registry.hub.docker.com' in parts[0]:
         raise errors.InvalidRepository(
-            'Invalid repository name, try "{0}" instead'.format(parts[1]))
+            'Invalid repository name, try "{0}" instead'.format(parts[1])
+        )
 
-    return expand_registry_url(parts[0]), parts[1]
+    return expand_registry_url(parts[0], insecure), parts[1]
 
 
 def resolve_authconfig(authconfig, registry=None):
diff --git a/lib/docker/docker/client.py b/lib/docker/docker/client.py
index 0677c4c..4ff91d8 100644
--- a/lib/docker/docker/client.py
+++ b/lib/docker/docker/client.py
@@ -13,12 +13,11 @@
 #    limitations under the License.
 
 import json
+import os
 import re
 import shlex
-# This file uses a variable named 'socket' several times. Rename the socket
-# library to minimize changes.
-import socket as socket_lib
 import struct
+from socket import socket as socket_obj
 import warnings
 
 import requests
@@ -27,37 +26,42 @@
 
 from .auth import auth
 from .unixconn import unixconn
+from .ssladapter import ssladapter
 from .utils import utils
 from . import errors
+from .tls import TLSConfig
 
 if not six.PY3:
     import websocket
 
-DEFAULT_DOCKER_API_VERSION = '1.9'
+DEFAULT_DOCKER_API_VERSION = '1.12'
 DEFAULT_TIMEOUT_SECONDS = 60
 STREAM_HEADER_SIZE_BYTES = 8
 
 
 class Client(requests.Session):
     def __init__(self, base_url=None, version=DEFAULT_DOCKER_API_VERSION,
-                 timeout=DEFAULT_TIMEOUT_SECONDS):
+                 timeout=DEFAULT_TIMEOUT_SECONDS, tls=False):
         super(Client, self).__init__()
-        if base_url is None:
-            base_url = "http+unix://var/run/docker.sock"
-        if 'unix:///' in base_url:
+        base_url = utils.parse_host(base_url)
+        if 'http+unix:///' in base_url:
             base_url = base_url.replace('unix:/', 'unix:')
-        if base_url.startswith('unix:'):
-            base_url = "http+" + base_url
-        if base_url.startswith('tcp:'):
-            base_url = base_url.replace('tcp:', 'http:')
-        if base_url.endswith('/'):
-            base_url = base_url[:-1]
+        if tls and not base_url.startswith('https://'):
+            raise errors.TLSParameterError(
+                'If using TLS, the base_url argument must begin with '
+                '"https://".')
         self.base_url = base_url
         self._version = version
         self._timeout = timeout
         self._auth_configs = auth.load_config()
 
-        self.mount('http+unix://', unixconn.UnixAdapter(base_url, timeout))
+        # Use SSLAdapter for the ability to specify SSL version
+        if isinstance(tls, TLSConfig):
+            tls.configure_client(self)
+        elif tls:
+            self.mount('https://', ssladapter.SSLAdapter())
+        else:
+            self.mount('http+unix://', unixconn.UnixAdapter(base_url, timeout))
 
     def _set_request_timeout(self, kwargs):
         """Prepare the kwargs for an HTTP request by inserting the timeout
@@ -108,6 +112,41 @@
                 '{0}={1}'.format(k, v) for k, v in environment.items()
             ]
 
+        if isinstance(mem_limit, six.string_types):
+            if len(mem_limit) == 0:
+                mem_limit = 0
+            else:
+                units = {'b': 1,
+                         'k': 1024,
+                         'm': 1024 * 1024,
+                         'g': 1024 * 1024 * 1024}
+                suffix = mem_limit[-1].lower()
+
+                # Check if the variable is a string representation of an int
+                # without a units part. Assuming that the units are bytes.
+                if suffix.isdigit():
+                    digits_part = mem_limit
+                    suffix = 'b'
+                else:
+                    digits_part = mem_limit[:-1]
+
+                if suffix in units.keys() or suffix.isdigit():
+                    try:
+                        digits = int(digits_part)
+                    except ValueError:
+                        message = ('Failed converting the string value for'
+                                   ' mem_limit ({0}) to a number.')
+                        formatted_message = message.format(digits_part)
+                        raise errors.DockerException(formatted_message)
+
+                    mem_limit = digits * units[suffix]
+                else:
+                    message = ('The specified value for mem_limit parameter'
+                               ' ({0}) should specify the units. The postfix'
+                               ' should be one of the `b` `k` `m` `g`'
+                               ' characters')
+                    raise errors.DockerException(message.format(mem_limit))
+
         if isinstance(ports, list):
             exposed_ports = {}
             for port_definition in ports:
@@ -120,6 +159,9 @@
                 exposed_ports['{0}/{1}'.format(port, proto)] = {}
             ports = exposed_ports
 
+        if isinstance(volumes, six.string_types):
+            volumes = [volumes, ]
+
         if isinstance(volumes, list):
             volumes_dict = {}
             for vol in volumes:
@@ -217,24 +259,31 @@
     def _get_raw_response_socket(self, response):
         self._raise_for_status(response)
         if six.PY3:
-            return response.raw._fp.fp.raw._sock
+            sock = response.raw._fp.fp.raw._sock
         else:
-            return response.raw._fp.fp._sock
+            sock = response.raw._fp.fp._sock
+        try:
+            # Keep a reference to the response to stop it being garbage
+            # collected. If the response is garbage collected, it will close
+            # TLS sockets.
+            sock._response = response
+        except AttributeError:
+            # UNIX sockets can't have attributes set on them, but that's fine
+            # because we won't be doing TLS over them
+            pass
+
+        return sock
 
     def _stream_helper(self, response):
         """Generator for data coming from a chunked-encoded HTTP response."""
-        socket_fp = self._get_raw_response_socket(response)
+        socket_fp = socket_obj(_sock=self._get_raw_response_socket(response))
         socket_fp.setblocking(1)
-        # _socket.socket objects don't have a 'makefile' method on Windows.
-        # Convert to a socket._socketobject.
-        if not hasattr(socket_fp, 'makefile'):
-            socket_fp = socket_lib.socket(_sock=socket_fp)
         socket = socket_fp.makefile()
         while True:
             # Because Docker introduced newlines at the end of chunks in v0.9,
             # and only on some API endpoints, we have to cater for both cases.
             size_line = socket.readline()
-            if size_line == '\r\n':
+            if size_line == '\r\n' or size_line == '\n':
                 size_line = socket.readline()
 
             size = int(size_line, 16)
@@ -257,7 +306,7 @@
             start = walker + STREAM_HEADER_SIZE_BYTES
             end = start + length
             walker = end
-            yield str(buf[start:end])
+            yield buf[start:end]
 
     def _multiplexed_socket_stream_helper(self, response):
         """A generator of multiplexed data blocks coming from a response
@@ -318,8 +367,10 @@
             return stream_result() if stream else \
                 self._result(response, binary=True)
 
+        sep = bytes() if six.PY3 else str()
+
         return stream and self._multiplexed_socket_stream_helper(response) or \
-            ''.join([x for x in self._multiplexed_buffer_helper(response)])
+            sep.join([x for x in self._multiplexed_buffer_helper(response)])
 
     def attach_socket(self, container, params=None, ws=False):
         if params is None:
@@ -356,7 +407,12 @@
                               'git://', 'github.com/')):
             remote = path
         else:
-            context = utils.tar(path)
+            dockerignore = os.path.join(path, '.dockerignore')
+            exclude = None
+            if os.path.exists(dockerignore):
+                with open(dockerignore, 'r') as f:
+                    exclude = list(filter(bool, f.read().split('\n')))
+            context = utils.tar(path, exclude=exclude)
 
         if utils.compare_version('1.8', self._version) >= 0:
             stream = True
@@ -424,10 +480,11 @@
                             json=True)
 
     def containers(self, quiet=False, all=False, trunc=True, latest=False,
-                   since=None, before=None, limit=-1):
+                   since=None, before=None, limit=-1, size=False):
         params = {
             'limit': 1 if latest else limit,
             'all': 1 if all else 0,
+            'size': 1 if size else 0,
             'trunc_cmd': 1 if trunc else 0,
             'since': since,
             'before': before
@@ -458,6 +515,9 @@
                          cpu_shares=None, working_dir=None, domainname=None,
                          memswap_limit=0):
 
+        if isinstance(volumes, six.string_types):
+            volumes = [volumes, ]
+
         config = self._container_config(
             image, command, hostname, user, detach, stdin_open, tty, mem_limit,
             ports, environment, dns, volumes, volumes_from, network_disabled,
@@ -490,6 +550,12 @@
         self._raise_for_status(res)
         return res.raw
 
+    def get_image(self, image):
+        res = self._get(self._url("/images/{0}/get".format(image)),
+                        stream=True)
+        self._raise_for_status(res)
+        return res.raw
+
     def history(self, image):
         res = self._get(self._url("/images/{0}/history".format(image)))
         self._raise_for_status(res)
@@ -545,6 +611,10 @@
                             True)
 
     def insert(self, image, url, path):
+        if utils.compare_version('1.12', self._version) >= 0:
+            raise errors.DeprecatedMethod(
+                'insert is not available for API version >=1.12'
+            )
         api_url = self._url("/images/" + image + "/insert")
         params = {
             'url': url,
@@ -576,6 +646,10 @@
 
         self._raise_for_status(res)
 
+    def load_image(self, data):
+        res = self._post(self._url("/images/load"), data=data)
+        self._raise_for_status(res)
+
     def login(self, username, password=None, email=None, registry=None,
               reauth=False):
         # If we don't have any auth data so far, try reloading the config file
@@ -606,6 +680,8 @@
 
     def logs(self, container, stdout=True, stderr=True, stream=False,
              timestamps=False):
+        if isinstance(container, dict):
+            container = container.get('Id')
         if utils.compare_version('1.11', self._version) >= 0:
             params = {'stderr': stderr and 1 or 0,
                       'stdout': stdout and 1 or 0,
@@ -613,8 +689,16 @@
                       'follow': stream and 1 or 0}
             url = self._url("/containers/{0}/logs".format(container))
             res = self._get(url, params=params, stream=stream)
-            return stream and self._multiplexed_socket_stream_helper(res) or \
-                ''.join([x for x in self._multiplexed_buffer_helper(res)])
+            if stream:
+                return self._multiplexed_socket_stream_helper(res)
+            elif six.PY3:
+                return bytes().join(
+                    [x for x in self._multiplexed_buffer_helper(res)]
+                )
+            else:
+                return str().join(
+                    [x for x in self._multiplexed_buffer_helper(res)]
+                )
         return self.attach(
             container,
             stdout=stdout,
@@ -641,8 +725,13 @@
 
         return h_ports
 
-    def pull(self, repository, tag=None, stream=False):
-        registry, repo_name = auth.resolve_repository_name(repository)
+    def pull(self, repository, tag=None, stream=False,
+             insecure_registry=False):
+        if not tag:
+            repository, tag = utils.parse_repository_tag(repository)
+        registry, repo_name = auth.resolve_repository_name(
+            repository, insecure=insecure_registry
+        )
         if repo_name.count(":") == 1:
             repository, tag = repository.rsplit(":", 1)
 
@@ -673,9 +762,17 @@
         else:
             return self._result(response)
 
-    def push(self, repository, stream=False):
-        registry, repo_name = auth.resolve_repository_name(repository)
+    def push(self, repository, tag=None, stream=False,
+             insecure_registry=False):
+        if not tag:
+            repository, tag = utils.parse_repository_tag(repository)
+        registry, repo_name = auth.resolve_repository_name(
+            repository, insecure=insecure_registry
+        )
         u = self._url("/images/{0}/push".format(repository))
+        params = {
+            'tag': tag
+        }
         headers = {}
 
         if utils.compare_version('1.5', self._version) >= 0:
@@ -691,9 +788,10 @@
             if authcfg:
                 headers['X-Registry-Auth'] = auth.encode_header(authcfg)
 
-            response = self._post_json(u, None, headers=headers, stream=stream)
+            response = self._post_json(u, None, headers=headers,
+                                       stream=stream, params=params)
         else:
-            response = self._post_json(u, None, stream=stream)
+            response = self._post_json(u, None, stream=stream, params=params)
 
         return stream and self._stream_helper(response) \
             or self._result(response)
@@ -726,7 +824,8 @@
 
     def start(self, container, binds=None, port_bindings=None, lxc_conf=None,
               publish_all_ports=False, links=None, privileged=False,
-              dns=None, dns_search=None, volumes_from=None, network_mode=None):
+              dns=None, dns_search=None, volumes_from=None, network_mode=None,
+              restart_policy=None, cap_add=None, cap_drop=None):
         if isinstance(container, dict):
             container = container.get('Id')
 
@@ -779,24 +878,41 @@
             if volumes_from is not None:
                 warnings.warn(warning_message.format('volumes_from'),
                               DeprecationWarning)
-
         if dns_search:
             start_config['DnsSearch'] = dns_search
 
         if network_mode:
             start_config['NetworkMode'] = network_mode
 
+        if restart_policy:
+            start_config['RestartPolicy'] = restart_policy
+
+        if cap_add:
+            start_config['CapAdd'] = cap_add
+
+        if cap_drop:
+            start_config['CapDrop'] = cap_drop
+
         url = self._url("/containers/{0}/start".format(container))
         res = self._post_json(url, data=start_config)
         self._raise_for_status(res)
 
+    def resize(self, container, height, width):
+        if isinstance(container, dict):
+            container = container.get('Id')
+
+        params = {'h': height, 'w': width}
+        url = self._url("/containers/{0}/resize".format(container))
+        res = self._post(url, params=params)
+        self._raise_for_status(res)
+
     def stop(self, container, timeout=10):
         if isinstance(container, dict):
             container = container.get('Id')
         params = {'t': timeout}
         url = self._url("/containers/{0}/stop".format(container))
         res = self._post(url, params=params,
-                         timeout=max(timeout, self._timeout))
+                         timeout=(timeout + self._timeout))
         self._raise_for_status(res)
 
     def tag(self, image, repository, tag=None, force=False):
@@ -827,9 +943,3 @@
         if 'StatusCode' in json_:
             return json_['StatusCode']
         return -1
-
-    # TODO(gloom): add to public docker-py source.
-    def load_image(self, path_to_tar):
-        u = self._url("/images/load")
-        return self._result(self._post(u, data=open(path_to_tar, 'rb').read()))
-
diff --git a/lib/docker/docker/errors.py b/lib/docker/docker/errors.py
index 9aad700..749facf 100644
--- a/lib/docker/docker/errors.py
+++ b/lib/docker/docker/errors.py
@@ -59,3 +59,18 @@
 
 class InvalidConfigFile(DockerException):
     pass
+
+
+class DeprecatedMethod(DockerException):
+    pass
+
+
+class TLSParameterError(DockerException):
+    def __init__(self, msg):
+        self.msg = msg
+
+    def __str__(self):
+        return self.msg + (". TLS configurations should map the Docker CLI "
+                           "client configurations. See "
+                           "http://docs.docker.com/examples/https/ for "
+                           "API details.")
diff --git a/lib/docker/docker/ssladapter/__init__.py b/lib/docker/docker/ssladapter/__init__.py
new file mode 100644
index 0000000..1a5e1bb
--- /dev/null
+++ b/lib/docker/docker/ssladapter/__init__.py
@@ -0,0 +1 @@
+from .ssladapter import SSLAdapter # flake8: noqa
diff --git a/lib/docker/docker/ssladapter/ssladapter.py b/lib/docker/docker/ssladapter/ssladapter.py
new file mode 100644
index 0000000..e243d07
--- /dev/null
+++ b/lib/docker/docker/ssladapter/ssladapter.py
@@ -0,0 +1,41 @@
+""" Resolves OpenSSL issues in some servers:
+      https://lukasa.co.uk/2013/01/Choosing_SSL_Version_In_Requests/
+      https://github.com/kennethreitz/requests/pull/799
+"""
+from distutils.version import StrictVersion
+from requests.adapters import HTTPAdapter
+try:
+    import requests.packages.urllib3 as urllib3
+except ImportError:
+    import urllib3
+
+
+PoolManager = urllib3.poolmanager.PoolManager
+
+
+class SSLAdapter(HTTPAdapter):
+    '''An HTTPS Transport Adapter that uses an arbitrary SSL version.'''
+    def __init__(self, ssl_version=None, assert_hostname=None, **kwargs):
+        self.ssl_version = ssl_version
+        self.assert_hostname = assert_hostname
+        super(SSLAdapter, self).__init__(**kwargs)
+
+    def init_poolmanager(self, connections, maxsize, block=False):
+        kwargs = {
+            'num_pools': connections,
+            'maxsize': maxsize,
+            'block': block,
+            'assert_hostname': self.assert_hostname,
+        }
+        if self.can_override_ssl_version():
+            kwargs['ssl_version'] = self.ssl_version
+
+        self.poolmanager = PoolManager(**kwargs)
+
+    def can_override_ssl_version(self):
+        urllib_ver = urllib3.__version__.split('-')[0]
+        if urllib_ver is None:
+            return False
+        if urllib_ver == 'dev':
+            return True
+        return StrictVersion(urllib_ver) > StrictVersion('1.5')
diff --git a/lib/docker/docker/tls.py b/lib/docker/docker/tls.py
new file mode 100644
index 0000000..0e78984
--- /dev/null
+++ b/lib/docker/docker/tls.py
@@ -0,0 +1,72 @@
+import os
+
+from . import errors
+from .ssladapter import ssladapter
+
+
+class TLSConfig(object):
+    cert = None
+    verify = None
+    ssl_version = None
+
+    def __init__(self, client_cert=None, ca_cert=None, verify=None,
+                 ssl_version=None, assert_hostname=None):
+        # Argument compatibility/mapping with
+        # http://docs.docker.com/examples/https/
+        # This diverges from the Docker CLI in that users can specify 'tls'
+        # here, but also disable any public/default CA pool verification by
+        # leaving tls_verify=False
+
+        # urllib3 sets a default ssl_version if ssl_version is None
+        # http://tinyurl.com/kxga8hb
+        self.ssl_version = ssl_version
+        self.assert_hostname = assert_hostname
+
+        # "tls" and "tls_verify" must have both or neither cert/key files
+        # In either case, Alert the user when both are expected, but any are
+        # missing.
+
+        if client_cert:
+            try:
+                tls_cert, tls_key = client_cert
+            except ValueError:
+                raise errors.TLSParameterError(
+                    'client_config must be a tuple of'
+                    ' (client certificate, key file)'
+                )
+
+            if not (tls_cert and tls_key) or (not os.path.isfile(tls_cert) or
+               not os.path.isfile(tls_key)):
+                raise errors.TLSParameterError(
+                    'Path to a certificate and key files must be provided'
+                    ' through the client_config param'
+                )
+            self.cert = (tls_cert, tls_key)
+
+        # Either set verify to True (public/default CA checks) or to the
+        # path of a CA Cert file.
+        if verify is not None:
+            if not ca_cert:
+                self.verify = verify
+            elif os.path.isfile(ca_cert):
+                if not verify:
+                    raise errors.TLSParameterError(
+                        'verify can not be False when a CA cert is'
+                        ' provided.'
+                    )
+                self.verify = ca_cert
+            else:
+                raise errors.TLSParameterError(
+                    'Invalid CA certificate provided for `tls_ca_cert`.'
+                )
+
+    def configure_client(self, client):
+        client.ssl_version = self.ssl_version
+        if self.verify is not None:
+            client.verify = self.verify
+        if self.cert:
+            client.cert = self.cert
+        client.mount('https://', ssladapter.SSLAdapter(
+            ssl_version=self.ssl_version,
+            assert_hostname=self.assert_hostname,
+        ))
diff --git a/lib/docker/docker/utils/__init__.py b/lib/docker/docker/utils/__init__.py
index 86ddd35..5d2c1b8 100644
--- a/lib/docker/docker/utils/__init__.py
+++ b/lib/docker/docker/utils/__init__.py
@@ -1,4 +1,4 @@
 from .utils import (
     compare_version, convert_port_bindings, convert_volume_binds,
-    mkbuildcontext, ping, tar, parse_repository_tag
+    mkbuildcontext, ping, tar, parse_repository_tag, parse_host
 ) # flake8: noqa
diff --git a/lib/docker/docker/utils/utils.py b/lib/docker/docker/utils/utils.py
index 3735b94..fb05a1e 100644
--- a/lib/docker/docker/utils/utils.py
+++ b/lib/docker/docker/utils/utils.py
@@ -13,13 +13,20 @@
 #    limitations under the License.
 
 import io
+import os
 import tarfile
 import tempfile
 from distutils.version import StrictVersion
+from fnmatch import fnmatch
 
 import requests
 import six
 
+from .. import errors
+
+DEFAULT_HTTP_HOST = "127.0.0.1"
+DEFAULT_UNIX_SOCKET = "http+unix://var/run/docker.sock"
+
 
 def mkbuildcontext(dockerfile):
     f = tempfile.NamedTemporaryFile()
@@ -42,10 +49,29 @@
     return f
 
 
-def tar(path):
+def fnmatch_any(relpath, patterns):
+    return any([fnmatch(relpath, pattern) for pattern in patterns])
+
+
+def tar(path, exclude=None):
     f = tempfile.NamedTemporaryFile()
     t = tarfile.open(mode='w', fileobj=f)
-    t.add(path, arcname='.')
+    for dirpath, dirnames, filenames in os.walk(path):
+        relpath = os.path.relpath(dirpath, path)
+        if relpath == '.':
+            relpath = ''
+        if exclude is None:
+            fnames = filenames
+        else:
+            dirnames[:] = [d for d in dirnames
+                           if not fnmatch_any(os.path.join(relpath, d),
+                                              exclude)]
+            fnames = [name for name in filenames
+                      if not fnmatch_any(os.path.join(relpath, name),
+                                         exclude)]
+        for name in fnames:
+            arcname = os.path.join(relpath, name)
+            t.add(os.path.join(path, arcname), arcname=arcname)
     t.close()
     f.seek(0)
     return f
@@ -75,7 +101,7 @@
 
 def ping(url):
     try:
-        res = requests.get(url)
+        res = requests.get(url, timeout=3)
     except Exception:
         return False
     else:
@@ -92,6 +118,13 @@
             result['HostIp'] = binding[0]
         else:
             result['HostPort'] = binding[0]
+    elif isinstance(binding, dict):
+        if 'HostPort' in binding:
+            result['HostPort'] = binding['HostPort']
+            if 'HostIp' in binding:
+                result['HostIp'] = binding['HostIp']
+        else:
+            raise ValueError(binding)
     else:
         result['HostPort'] = binding
 
@@ -131,10 +164,72 @@
 def parse_repository_tag(repo):
     column_index = repo.rfind(':')
     if column_index < 0:
-        return repo, ""
-    tag = repo[column_index+1:]
+        return repo, None
+    tag = repo[column_index + 1:]
     slash_index = tag.find('/')
     if slash_index < 0:
         return repo[:column_index], tag
 
-    return repo, ""
+    return repo, None
+
+
+# Based on utils.go:ParseHost http://tinyurl.com/nkahcfh
+# fd:// protocol unsupported (for obvious reasons)
+# Added support for http and https
+# Protocol translation: tcp -> http, unix -> http+unix
+def parse_host(addr):
+    proto = "http+unix"
+    host = DEFAULT_HTTP_HOST
+    port = None
+    if not addr or addr.strip() == 'unix://':
+        return DEFAULT_UNIX_SOCKET
+
+    addr = addr.strip()
+    if addr.startswith('http://'):
+        addr = addr.replace('http://', 'tcp://')
+    if addr.startswith('http+unix://'):
+        addr = addr.replace('http+unix://', 'unix://')
+
+    if addr == 'tcp://':
+        raise errors.DockerException("Invalid bind address format: %s" % addr)
+    elif addr.startswith('unix://'):
+        addr = addr[7:]
+    elif addr.startswith('tcp://'):
+        proto = "http"
+        addr = addr[6:]
+    elif addr.startswith('https://'):
+        proto = "https"
+        addr = addr[8:]
+    elif addr.startswith('fd://'):
+        raise errors.DockerException("fd protocol is not implemented")
+    else:
+        if "://" in addr:
+            raise errors.DockerException(
+                "Invalid bind address protocol: %s" % addr
+            )
+        proto = "http"
+
+    if proto != "http+unix" and ":" in addr:
+        host_parts = addr.split(':')
+        if len(host_parts) != 2:
+            raise errors.DockerException(
+                "Invalid bind address format: %s" % addr
+            )
+        if host_parts[0]:
+            host = host_parts[0]
+
+        try:
+            port = int(host_parts[1])
+        except Exception:
+            raise errors.DockerException(
+                "Invalid port: %s", addr
+            )
+
+    elif proto in ("http", "https") and ':' not in addr:
+        raise errors.DockerException("Bind address needs a port: %s" % addr)
+    else:
+        host = addr
+
+    if proto == "http+unix":
+        return "%s://%s" % (proto, host)
+    return "%s://%s:%d" % (proto, host, port)
diff --git a/lib/docker/docker/version.py b/lib/docker/docker/version.py
index 77035f1..f4c4f3f 100644
--- a/lib/docker/docker/version.py
+++ b/lib/docker/docker/version.py
@@ -1 +1 @@
-version = "0.3.2-dev"
+version = "0.5.3"
diff --git a/lib/docker/setup.py b/lib/docker/setup.py
index 7c2bdd8..b63cc92 100644
--- a/lib/docker/setup.py
+++ b/lib/docker/setup.py
@@ -6,24 +6,28 @@
 ROOT_DIR = os.path.dirname(__file__)
 SOURCE_DIR = os.path.join(ROOT_DIR)
 
-if sys.version_info[0] == 3:
-    requirements_file = './requirements3.txt'
-else:
-    requirements_file = './requirements.txt'
+requirements = [
+    'requests >= 2.2.1',
+    'six >= 1.3.0',
+]
+
+if sys.version_info[0] < 3:
+    requirements.append('websocket-client >= 0.11.0')
 
 exec(open('docker/version.py').read())
 
 with open('./test-requirements.txt') as test_reqs_txt:
     test_requirements = [line for line in test_reqs_txt]
-with open(requirements_file) as requirements_txt:
-    requirements = [line for line in requirements_txt]
+
 
 setup(
     name="docker-py",
     version=version,
     description="Python client for Docker.",
-    packages=['docker', 'docker.auth', 'docker.unixconn', 'docker.utils'],
-    install_requires=requirements + test_requirements,
+    packages=['docker', 'docker.auth', 'docker.unixconn', 'docker.utils',
+              'docker.ssladapter'],
+    install_requires=requirements,
+    tests_require=test_requirements,
     zip_safe=False,
     test_suite='tests',
     classifiers=[
@@ -36,6 +40,7 @@
         'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3.2',
         'Programming Language :: Python :: 3.3',
+        'Programming Language :: Python :: 3.4',
         'Topic :: Utilities',
         'License :: OSI Approved :: Apache Software License',
     ],
diff --git a/lib/docker/test-requirements.txt b/lib/docker/test-requirements.txt
index 5857671..969f7a2 100644
--- a/lib/docker/test-requirements.txt
+++ b/lib/docker/test-requirements.txt
@@ -1 +1,2 @@
-mock==1.0.1
\ No newline at end of file
+mock==1.0.1
+coverage==3.7.1
diff --git a/lib/docker/tests/fake_api.py b/lib/docker/tests/fake_api.py
index cc729f5..861c8b3 100644
--- a/lib/docker/tests/fake_api.py
+++ b/lib/docker/tests/fake_api.py
@@ -12,7 +12,7 @@
 #    See the License for the specific language governing permissions and
 #    limitations under the License.
 
-CURRENT_VERSION = 'v1.9'
+CURRENT_VERSION = 'v1.12'
 
 FAKE_CONTAINER_ID = '3cc2351ab11b'
 FAKE_IMAGE_ID = 'e9aa60c60128'
@@ -103,6 +103,12 @@
     return status_code, response
 
 
+def post_fake_resize_container():
+    status_code = 200
+    response = {'Id': FAKE_CONTAINER_ID}
+    return status_code, response
+
+
 def post_fake_create_container():
     status_code = 200
     response = {'Id': FAKE_CONTAINER_ID}
@@ -202,7 +208,8 @@
 
 def get_fake_logs():
     status_code = 200
-    response = 'Flowering Nights (Sakuya Iyazoi)'
+    response = (b'\x01\x00\x00\x00\x00\x00\x00\x11Flowering Nights\n'
+                b'\x01\x00\x00\x00\x00\x00\x00\x10(Sakuya Iyazoi)\n')
     return status_code, response
 
 
@@ -254,6 +261,18 @@
     return status_code, response
 
 
+def get_fake_get_image():
+    status_code = 200
+    response = 'Byte Stream....'
+    return status_code, response
+
+
+def post_fake_load_image():
+    status_code = 200
+    response = {'Id': FAKE_IMAGE_ID}
+    return status_code, response
+
+
 def post_fake_commit():
     status_code = 200
     response = {'Id': FAKE_CONTAINER_ID}
@@ -297,13 +316,15 @@
     get_fake_containers,
     '{1}/{0}/containers/3cc2351ab11b/start'.format(CURRENT_VERSION, prefix):
     post_fake_start_container,
+    '{1}/{0}/containers/3cc2351ab11b/resize'.format(CURRENT_VERSION, prefix):
+    post_fake_resize_container,
     '{1}/{0}/containers/3cc2351ab11b/json'.format(CURRENT_VERSION, prefix):
     get_fake_inspect_container,
     '{1}/{0}/images/e9aa60c60128/tag'.format(CURRENT_VERSION, prefix):
     post_fake_tag_image,
     '{1}/{0}/containers/3cc2351ab11b/wait'.format(CURRENT_VERSION, prefix):
     get_fake_wait,
-    '{1}/{0}/containers/3cc2351ab11b/attach'.format(CURRENT_VERSION, prefix):
+    '{1}/{0}/containers/3cc2351ab11b/logs'.format(CURRENT_VERSION, prefix):
     get_fake_logs,
     '{1}/{0}/containers/3cc2351ab11b/changes'.format(CURRENT_VERSION, prefix):
     get_fake_diff,
@@ -323,6 +344,10 @@
     post_fake_image_create,
     '{1}/{0}/images/e9aa60c60128'.format(CURRENT_VERSION, prefix):
     delete_fake_remove_image,
+    '{1}/{0}/images/e9aa60c60128/get'.format(CURRENT_VERSION, prefix):
+    get_fake_get_image,
+    '{1}/{0}/images/load'.format(CURRENT_VERSION, prefix):
+    post_fake_load_image,
     '{1}/{0}/images/test_image/json'.format(CURRENT_VERSION, prefix):
     get_fake_inspect_image,
     '{1}/{0}/images/test_image/insert'.format(CURRENT_VERSION, prefix):
diff --git a/lib/docker/tests/integration_test.py b/lib/docker/tests/integration_test.py
index bd03642..d4900b7 100644
--- a/lib/docker/tests/integration_test.py
+++ b/lib/docker/tests/integration_test.py
@@ -17,6 +17,7 @@
 import json
 import io
 import os
+import shutil
 import signal
 import tempfile
 import unittest
@@ -24,19 +25,24 @@
 import docker
 import six
 
+from test import Cleanup
+
 # FIXME: missing tests for
-# export; history; import_image; insert; port; push; tag
+# export; history; import_image; insert; port; push; tag; get; load
+
+DEFAULT_BASE_URL = os.environ.get('DOCKER_HOST')
 
 
 class BaseTestCase(unittest.TestCase):
     tmp_imgs = []
     tmp_containers = []
+    tmp_folders = []
 
     def setUp(self):
-        self.client = docker.Client()
-        self.client.pull('busybox')
+        self.client = docker.Client(base_url=DEFAULT_BASE_URL, timeout=5)
         self.tmp_imgs = []
         self.tmp_containers = []
+        self.tmp_folders = []
 
     def tearDown(self):
         for img in self.tmp_imgs:
@@ -50,6 +56,8 @@
                 self.client.remove_container(container)
             except docker.errors.APIError:
                 pass
+        for folder in self.tmp_folders:
+            shutil.rmtree(folder)
 
 #########################
 #   INFORMATION TESTS   #
@@ -109,7 +117,7 @@
     def runTest(self):
         res0 = self.client.containers(all=True)
         size = len(res0)
-        res1 = self.client.create_container('busybox', 'true;')
+        res1 = self.client.create_container('busybox:latest', 'true')
         self.assertIn('Id', res1)
         self.client.start(res1['Id'])
         self.tmp_containers.append(res1['Id'])
@@ -119,9 +127,9 @@
         self.assertEqual(len(retrieved), 1)
         retrieved = retrieved[0]
         self.assertIn('Command', retrieved)
-        self.assertEqual(retrieved['Command'], 'true;')
+        self.assertEqual(retrieved['Command'], u'true')
         self.assertIn('Image', retrieved)
-        self.assertEqual(retrieved['Image'], 'busybox:latest')
+        self.assertRegexpMatches(retrieved['Image'], r'busybox:.*')
         self.assertIn('Status', retrieved)
 
 #####################
@@ -139,7 +147,8 @@
 class TestCreateContainerWithBinds(BaseTestCase):
     def runTest(self):
         mount_dest = '/mnt'
-        mount_origin = '/tmp'
+        mount_origin = tempfile.mkdtemp()
+        self.tmp_folders.append(mount_origin)
 
         filename = 'shared.txt'
         shared_file = os.path.join(mount_origin, filename)
@@ -186,8 +195,8 @@
         self.client.start(res['Id'])
         inspect = self.client.inspect_container(res['Id'])
         self.assertIn('Config', inspect)
-        self.assertIn('ID', inspect)
-        self.assertTrue(inspect['ID'].startswith(res['Id']))
+        self.assertIn('Id', inspect)
+        self.assertTrue(inspect['Id'].startswith(res['Id']))
         self.assertIn('Image', inspect)
         self.assertIn('State', inspect)
         self.assertIn('Running', inspect['State'])
@@ -204,8 +213,8 @@
         self.client.start(res)
         inspect = self.client.inspect_container(res['Id'])
         self.assertIn('Config', inspect)
-        self.assertIn('ID', inspect)
-        self.assertTrue(inspect['ID'].startswith(res['Id']))
+        self.assertIn('Id', inspect)
+        self.assertTrue(inspect['Id'].startswith(res['Id']))
         self.assertIn('Image', inspect)
         self.assertIn('State', inspect)
         self.assertIn('Running', inspect['State'])
@@ -222,8 +231,8 @@
         self.client.start(res['Id'], privileged=True)
         inspect = self.client.inspect_container(res['Id'])
         self.assertIn('Config', inspect)
-        self.assertIn('ID', inspect)
-        self.assertTrue(inspect['ID'].startswith(res['Id']))
+        self.assertIn('Id', inspect)
+        self.assertTrue(inspect['Id'].startswith(res['Id']))
         self.assertIn('Image', inspect)
         self.assertIn('State', inspect)
         self.assertIn('Running', inspect['State'])
@@ -233,12 +242,13 @@
         # Since Nov 2013, the Privileged flag is no longer part of the
         # container's config exposed via the API (safety concerns?).
         #
-        # self.assertEqual(inspect['Config']['Privileged'], True)
+        if 'Privileged' in inspect['Config']:
+            self.assertEqual(inspect['Config']['Privileged'], True)
 
 
 class TestWait(BaseTestCase):
     def runTest(self):
-        res = self.client.create_container('busybox', ['sleep', '10'])
+        res = self.client.create_container('busybox', ['sleep', '3'])
         id = res['Id']
         self.tmp_containers.append(id)
         self.client.start(id)
@@ -253,7 +263,7 @@
 
 class TestWaitWithDictInsteadOfId(BaseTestCase):
     def runTest(self):
-        res = self.client.create_container('busybox', ['sleep', '10'])
+        res = self.client.create_container('busybox', ['sleep', '3'])
         id = res['Id']
         self.tmp_containers.append(id)
         self.client.start(res)
@@ -278,26 +288,26 @@
         exitcode = self.client.wait(id)
         self.assertEqual(exitcode, 0)
         logs = self.client.logs(id)
-        self.assertEqual(logs, snippet + '\n')
+        self.assertEqual(logs, (snippet + '\n').encode(encoding='ascii'))
 
 
-class TestLogsStreaming(BaseTestCase):
-    def runTest(self):
-        snippet = 'Flowering Nights (Sakuya Iyazoi)'
-        container = self.client.create_container(
-            'busybox', 'echo {0}'.format(snippet)
-        )
-        id = container['Id']
-        self.client.start(id)
-        self.tmp_containers.append(id)
-        logs = ''
-        for chunk in self.client.logs(id, stream=True):
-            logs += chunk
+# class TestLogsStreaming(BaseTestCase):
+#     def runTest(self):
+#         snippet = 'Flowering Nights (Sakuya Iyazoi)'
+#         container = self.client.create_container(
+#             'busybox', 'echo {0}'.format(snippet)
+#         )
+#         id = container['Id']
+#         self.client.start(id)
+#         self.tmp_containers.append(id)
+#         logs = bytes() if six.PY3 else str()
+#         for chunk in self.client.logs(id, stream=True):
+#             logs += chunk
 
-        exitcode = self.client.wait(id)
-        self.assertEqual(exitcode, 0)
+#         exitcode = self.client.wait(id)
+#         self.assertEqual(exitcode, 0)
 
-        self.assertEqual(logs, snippet + '\n')
+#         self.assertEqual(logs, (snippet + '\n').encode(encoding='ascii'))
 
 
 class TestLogsWithDictInsteadOfId(BaseTestCase):
@@ -312,7 +322,7 @@
         exitcode = self.client.wait(id)
         self.assertEqual(exitcode, 0)
         logs = self.client.logs(container)
-        self.assertEqual(logs, snippet + '\n')
+        self.assertEqual(logs, (snippet + '\n').encode(encoding='ascii'))
 
 
 class TestDiff(BaseTestCase):
@@ -416,7 +426,7 @@
         id = container['Id']
         self.client.start(id)
         self.tmp_containers.append(id)
-        self.client.kill(id, signal=signal.SIGTERM)
+        self.client.kill(id, signal=signal.SIGKILL)
         exitcode = self.client.wait(id)
         self.assertNotEqual(exitcode, 0)
         container_info = self.client.inspect_container(id)
@@ -540,17 +550,20 @@
         container2_id = res1['Id']
         self.tmp_containers.append(container2_id)
         self.client.start(container2_id)
-
+        with self.assertRaises(docker.errors.DockerException):
+            res2 = self.client.create_container(
+                'busybox', 'cat',
+                detach=True, stdin_open=True,
+                volumes_from=vol_names)
         res2 = self.client.create_container(
             'busybox', 'cat',
-            detach=True, stdin_open=True,
-            volumes_from=vol_names)
+            detach=True, stdin_open=True)
         container3_id = res2['Id']
         self.tmp_containers.append(container3_id)
-        self.client.start(container3_id)
+        self.client.start(container3_id, volumes_from=vol_names)
 
         info = self.client.inspect_container(res2['Id'])
-        self.assertEqual(info['Config']['VolumesFrom'], ','.join(vol_names))
+        self.assertItemsEqual(info['HostConfig']['VolumesFrom'], vol_names)
 
 
 class TestStartContainerWithLinks(BaseTestCase):
@@ -599,6 +612,21 @@
         self.assertIn('{0}_NAME='.format(link_env_prefix2), logs)
         self.assertIn('{0}_ENV_FOO=1'.format(link_env_prefix2), logs)
 
+
+class TestRestartingContainer(BaseTestCase):
+    def runTest(self):
+        container = self.client.create_container('busybox', ['false'])
+        id = container['Id']
+        self.client.start(id, restart_policy={
+            "Name": "on-failure",
+            "MaximumRetryCount": 1
+        })
+        self.client.wait(id)
+        self.client.remove_container(id)
+        containers = self.client.containers(all=True)
+        res = [x for x in containers if 'Id' in x and x['Id'].startswith(id)]
+        self.assertEqual(len(res), 0)
+
 #################
 #  LINKS TESTS  #
 #################
@@ -659,7 +687,7 @@
         self.assertEqual(type(res), six.text_type)
         self.assertEqual(img_count + 3, self.client.info()['Images'])
         img_info = self.client.inspect_image('joffrey/test001')
-        self.assertIn('id', img_info)
+        self.assertIn('Id', img_info)
         self.tmp_imgs.append('joffrey/test001')
         self.tmp_imgs.append('376968a23351')
 
@@ -679,7 +707,7 @@
             json.loads(chunk)  # ensure chunk is a single, valid JSON blob
         self.assertEqual(img_count + 3, self.client.info()['Images'])
         img_info = self.client.inspect_image('joffrey/test001')
-        self.assertIn('id', img_info)
+        self.assertIn('Id', img_info)
         self.tmp_imgs.append('joffrey/test001')
         self.tmp_imgs.append('376968a23351')
 
@@ -695,14 +723,14 @@
         img_id = res['Id']
         self.tmp_imgs.append(img_id)
         img = self.client.inspect_image(img_id)
-        self.assertIn('container', img)
-        self.assertTrue(img['container'].startswith(id))
-        self.assertIn('container_config', img)
-        self.assertIn('Image', img['container_config'])
-        self.assertEqual('busybox', img['container_config']['Image'])
-        busybox_id = self.client.inspect_image('busybox')['id']
-        self.assertIn('parent', img)
-        self.assertEqual(img['parent'], busybox_id)
+        self.assertIn('Container', img)
+        self.assertTrue(img['Container'].startswith(id))
+        self.assertIn('ContainerConfig', img)
+        self.assertIn('Image', img['ContainerConfig'])
+        self.assertEqual('busybox', img['ContainerConfig']['Image'])
+        busybox_id = self.client.inspect_image('busybox')['Id']
+        self.assertIn('Parent', img)
+        self.assertEqual(img['Parent'], busybox_id)
 
 
 class TestRemoveImage(BaseTestCase):
@@ -817,6 +845,43 @@
         self.assertEqual(logs.find('HTTP code: 403'), -1)
 
 
+class TestBuildWithDockerignore(Cleanup, BaseTestCase):
+    def runTest(self):
+        if self.client._version < 1.8:
+            return
+
+        base_dir = tempfile.mkdtemp()
+        self.addCleanup(shutil.rmtree, base_dir)
+
+        with open(os.path.join(base_dir, 'Dockerfile'), 'w') as f:
+            f.write("\n".join([
+                'FROM busybox',
+                'MAINTAINER docker-py',
+                'ADD . /test',
+                'RUN ls -A /test',
+            ]))
+
+        with open(os.path.join(base_dir, '.dockerignore'), 'w') as f:
+            f.write("\n".join([
+                'node_modules',
+                '',  # empty line
+            ]))
+
+        with open(os.path.join(base_dir, 'not-ignored'), 'w') as f:
+            f.write("this file should not be ignored")
+
+        subdir = os.path.join(base_dir, 'node_modules', 'grunt-cli')
+        os.makedirs(subdir)
+        with open(os.path.join(subdir, 'grunt'), 'w') as f:
+            f.write("grunt")
+
+        stream = self.client.build(path=base_dir, stream=True)
+        logs = ''
+        for chunk in stream:
+            logs += chunk
+        self.assertFalse('node_modules' in logs)
+        self.assertTrue('not-ignored' in logs)
+
 #######################
 #  PY SPECIFIC TESTS  #
 #######################
@@ -847,6 +912,7 @@
 class TestLoadConfig(BaseTestCase):
     def runTest(self):
         folder = tempfile.mkdtemp()
+        self.tmp_folders.append(folder)
         f = open(os.path.join(folder, '.dockercfg'), 'w')
         auth_ = base64.b64encode(b'sakuya:izayoi').decode('ascii')
         f.write('auth = {0}\n'.format(auth_))
@@ -864,6 +930,7 @@
 class TestLoadJSONConfig(BaseTestCase):
     def runTest(self):
         folder = tempfile.mkdtemp()
+        self.tmp_folders.append(folder)
         f = open(os.path.join(folder, '.dockercfg'), 'w')
         auth_ = base64.b64encode(b'sakuya:izayoi').decode('ascii')
         email_ = 'sakuya@scarlet.net'
@@ -899,4 +966,6 @@
 
 
 if __name__ == '__main__':
+    c = docker.Client(base_url=DEFAULT_BASE_URL)
+    c.pull('busybox')
     unittest.main()
diff --git a/lib/docker/tests/test.py b/lib/docker/tests/test.py
index ba1cf9b..984e350 100644
--- a/lib/docker/tests/test.py
+++ b/lib/docker/tests/test.py
@@ -1,7 +1,7 @@
 # Copyright 2013 dotCloud inc.
 
-#    Licensed under the Apache License, Version 2.0 (the "License");
-#    you may not use this file except in compliance with the License.
+# 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
@@ -17,7 +17,10 @@
 import io
 import json
 import os
+import shutil
 import signal
+import sys
+import tarfile
 import tempfile
 import unittest
 import gzip
@@ -39,10 +42,8 @@
              request=None):
     res = requests.Response()
     res.status_code = status_code
-    if not isinstance(content, six.string_types):
-        content = json.dumps(content)
-    if six.PY3:
-        content = content.encode('ascii')
+    if not isinstance(content, six.binary_type):
+        content = json.dumps(content).encode('ascii')
     res._content = content
     res.headers = requests.structures.CaseInsensitiveDict(headers or {})
     res.reason = reason
@@ -51,18 +52,48 @@
     return res
 
 
+def fake_resolve_authconfig(authconfig, registry=None):
+    return None
+
+
 def fake_resp(url, data=None, **kwargs):
     status_code, content = fake_api.fake_responses[url]()
     return response(status_code=status_code, content=content)
 
+
 fake_request = mock.Mock(side_effect=fake_resp)
 url_prefix = 'http+unix://var/run/docker.sock/v{0}/'.format(
     docker.client.DEFAULT_DOCKER_API_VERSION)
 
 
+class Cleanup(object):
+    if sys.version_info < (2, 7):
+        # Provide a basic implementation of addCleanup for Python < 2.7
+        def __init__(self, *args, **kwargs):
+            super(Cleanup, self).__init__(*args, **kwargs)
+            self._cleanups = []
+
+        def tearDown(self):
+            super(Cleanup, self).tearDown()
+            ok = True
+            while self._cleanups:
+                fn, args, kwargs = self._cleanups.pop(-1)
+                try:
+                    fn(*args, **kwargs)
+                except KeyboardInterrupt:
+                    raise
+                except:
+                    ok = False
+            if not ok:
+                raise
+
+        def addCleanup(self, function, *args, **kwargs):
+            self._cleanups.append((function, args, kwargs))
+
+
 @mock.patch.multiple('docker.Client', get=fake_request, post=fake_request,
                      put=fake_request, delete=fake_request)
-class DockerClientTest(unittest.TestCase):
+class DockerClientTest(Cleanup, unittest.TestCase):
     def setUp(self):
         self.client = docker.Client()
         # Force-clear authconfig to avoid tampering with the tests
@@ -161,6 +192,7 @@
             params={
                 'all': 1,
                 'since': None,
+                'size': 0,
                 'limit': -1,
                 'trunc_cmd': 1,
                 'before': None
@@ -217,6 +249,31 @@
         self.assertEqual(args[1]['headers'],
                          {'Content-Type': 'application/json'})
 
+    def test_create_container_with_volume_string(self):
+        mount_dest = '/mnt'
+
+        try:
+            self.client.create_container('busybox', ['ls', mount_dest],
+                                         volumes=mount_dest)
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+
+        args = fake_request.call_args
+        self.assertEqual(args[0][0],
+                         url_prefix + 'containers/create')
+        self.assertEqual(json.loads(args[1]['data']),
+                         json.loads('''
+                            {"Tty": false, "Image": "busybox",
+                             "Cmd": ["ls", "/mnt"], "AttachStdin": false,
+                             "Volumes": {"/mnt": {}}, "Memory": 0,
+                             "AttachStderr": true,
+                             "AttachStdout": true, "OpenStdin": false,
+                             "StdinOnce": false,
+                             "NetworkDisabled": false,
+                             "MemorySwap": 0}'''))
+        self.assertEqual(args[1]['headers'],
+                         {'Content-Type': 'application/json'})
+
     def test_create_container_with_ports(self):
         try:
             self.client.create_container('busybox', 'ls',
@@ -341,6 +398,11 @@
         try:
             self.client.create_container('busybox', 'true',
                                          volumes_from=vol_names)
+        except docker.errors.DockerException as e:
+            self.assertTrue(
+                docker.utils.compare_version('1.10', self.client._version) >= 0
+            )
+            return
         except Exception as e:
             self.fail('Command should not raise exception: {0}'.format(e))
         args = fake_request.call_args
@@ -382,6 +444,70 @@
                          {'Content-Type': 'application/json'})
         self.assertEqual(args[1]['params'], {'name': 'marisa-kirisame'})
 
+    def test_create_container_with_mem_limit_as_int(self):
+        try:
+            self.client.create_container('busybox', 'true',
+                                         mem_limit=128.0)
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+
+        args = fake_request.call_args
+        data = json.loads(args[1]['data'])
+        self.assertEqual(data['Memory'], 128.0)
+
+    def test_create_container_with_mem_limit_as_string(self):
+        try:
+            self.client.create_container('busybox', 'true',
+                                         mem_limit='128')
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+
+        args = fake_request.call_args
+        data = json.loads(args[1]['data'])
+        self.assertEqual(data['Memory'], 128.0)
+
+    def test_create_container_with_mem_limit_as_string_with_k_unit(self):
+        try:
+            self.client.create_container('busybox', 'true',
+                                         mem_limit='128k')
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+
+        args = fake_request.call_args
+        data = json.loads(args[1]['data'])
+        self.assertEqual(data['Memory'], 128.0 * 1024)
+
+    def test_create_container_with_mem_limit_as_string_with_m_unit(self):
+        try:
+            self.client.create_container('busybox', 'true',
+                                         mem_limit='128m')
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+
+        args = fake_request.call_args
+        data = json.loads(args[1]['data'])
+        self.assertEqual(data['Memory'], 128.0 * 1024 * 1024)
+
+    def test_create_container_with_mem_limit_as_string_with_g_unit(self):
+        try:
+            self.client.create_container('busybox', 'true',
+                                         mem_limit='128g')
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+
+        args = fake_request.call_args
+        data = json.loads(args[1]['data'])
+        self.assertEqual(data['Memory'], 128.0 * 1024 * 1024 * 1024)
+
+    def test_create_container_with_mem_limit_as_string_with_wrong_value(self):
+        self.assertRaises(docker.errors.DockerException,
+                          self.client.create_container,
+                          'busybox', 'true', mem_limit='128p')
+
+        self.assertRaises(docker.errors.DockerException,
+                          self.client.create_container,
+                          'busybox', 'true', mem_limit='1f28')
+
     def test_start_container(self):
         try:
             self.client.start(fake_api.FAKE_CONTAINER_ID)
@@ -491,7 +617,7 @@
             mount_origin = '/tmp'
             self.client.start(fake_api.FAKE_CONTAINER_ID,
                               binds={mount_origin: {
-                                     "bind": mount_dest, "ro": False}})
+                                  "bind": mount_dest, "ro": False}})
         except Exception as e:
             self.fail('Command should not raise exception: {0}'.format(e))
 
@@ -687,6 +813,100 @@
             docker.client.DEFAULT_TIMEOUT_SECONDS
         )
 
+    def test_start_container_with_restart_policy(self):
+        try:
+            self.client.start(fake_api.FAKE_CONTAINER_ID,
+                              restart_policy={
+                                  "Name": "always",
+                                  "MaximumRetryCount": 0
+                              })
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+        args = fake_request.call_args
+        self.assertEqual(
+            args[0][0],
+            url_prefix + 'containers/3cc2351ab11b/start'
+        )
+        self.assertEqual(
+            json.loads(args[1]['data']),
+            {"PublishAllPorts": False, "Privileged": False,
+             "RestartPolicy": {"MaximumRetryCount": 0, "Name": "always"}}
+        )
+        self.assertEqual(
+            args[1]['headers'],
+            {'Content-Type': 'application/json'}
+        )
+        self.assertEqual(
+            args[1]['timeout'],
+            docker.client.DEFAULT_TIMEOUT_SECONDS
+        )
+
+    def test_start_container_with_added_capabilities(self):
+        try:
+            self.client.start(fake_api.FAKE_CONTAINER_ID,
+                              cap_add=['MKNOD'])
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+        args = fake_request.call_args
+        self.assertEqual(
+            args[0][0],
+            url_prefix + 'containers/3cc2351ab11b/start'
+        )
+        self.assertEqual(
+            json.loads(args[1]['data']),
+            {"PublishAllPorts": False, "Privileged": False,
+             "CapAdd": ["MKNOD"]}
+        )
+        self.assertEqual(
+            args[1]['headers'],
+            {'Content-Type': 'application/json'}
+        )
+        self.assertEqual(
+            args[1]['timeout'],
+            docker.client.DEFAULT_TIMEOUT_SECONDS
+        )
+
+    def test_start_container_with_dropped_capabilities(self):
+        try:
+            self.client.start(fake_api.FAKE_CONTAINER_ID,
+                              cap_drop=['MKNOD'])
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+        args = fake_request.call_args
+        self.assertEqual(
+            args[0][0],
+            url_prefix + 'containers/3cc2351ab11b/start'
+        )
+        self.assertEqual(
+            json.loads(args[1]['data']),
+            {"PublishAllPorts": False, "Privileged": False,
+             "CapDrop": ["MKNOD"]}
+        )
+        self.assertEqual(
+            args[1]['headers'],
+            {'Content-Type': 'application/json'}
+        )
+        self.assertEqual(
+            args[1]['timeout'],
+            docker.client.DEFAULT_TIMEOUT_SECONDS
+        )
+
+    def test_resize_container(self):
+        try:
+            self.client.resize(
+                {'Id': fake_api.FAKE_CONTAINER_ID},
+                height=15,
+                width=120
+            )
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+
+        fake_request.assert_called_with(
+            url_prefix + 'containers/3cc2351ab11b/resize',
+            params={'h': 15, 'w': 120},
+            timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
+        )
+
     def test_wait(self):
         try:
             self.client.wait(fake_api.FAKE_CONTAINER_ID)
@@ -726,41 +946,51 @@
         assert c.base_url == "http+unix://socket"
 
     def test_url_compatibility_http(self):
-        c = docker.Client(base_url="http://hostname")
+        c = docker.Client(base_url="http://hostname:1234")
 
-        assert c.base_url == "http://hostname"
+        assert c.base_url == "http://hostname:1234"
 
     def test_url_compatibility_tcp(self):
-        c = docker.Client(base_url="tcp://hostname")
+        c = docker.Client(base_url="tcp://hostname:1234")
 
-        assert c.base_url == "http://hostname"
+        assert c.base_url == "http://hostname:1234"
 
     def test_logs(self):
         try:
-            self.client.logs(fake_api.FAKE_CONTAINER_ID)
+            logs = self.client.logs(fake_api.FAKE_CONTAINER_ID)
         except Exception as e:
             self.fail('Command should not raise exception: {0}'.format(e))
 
         fake_request.assert_called_with(
-            url_prefix + 'containers/3cc2351ab11b/attach',
-            params={'stream': 0, 'logs': 1, 'stderr': 1, 'stdout': 1},
+            url_prefix + 'containers/3cc2351ab11b/logs',
+            params={'timestamps': 0, 'follow': 0, 'stderr': 1, 'stdout': 1},
             timeout=docker.client.DEFAULT_TIMEOUT_SECONDS,
             stream=False
         )
 
+        self.assertEqual(
+            logs,
+            'Flowering Nights\n(Sakuya Iyazoi)\n'.encode('ascii')
+        )
+
     def test_logs_with_dict_instead_of_id(self):
         try:
-            self.client.logs({'Id': fake_api.FAKE_CONTAINER_ID})
+            logs = self.client.logs({'Id': fake_api.FAKE_CONTAINER_ID})
         except Exception as e:
             self.fail('Command should not raise exception: {0}'.format(e))
 
         fake_request.assert_called_with(
-            url_prefix + 'containers/3cc2351ab11b/attach',
-            params={'stream': 0, 'logs': 1, 'stderr': 1, 'stdout': 1},
+            url_prefix + 'containers/3cc2351ab11b/logs',
+            params={'timestamps': 0, 'follow': 0, 'stderr': 1, 'stdout': 1},
             timeout=docker.client.DEFAULT_TIMEOUT_SECONDS,
             stream=False
         )
 
+        self.assertEqual(
+            logs,
+            'Flowering Nights\n(Sakuya Iyazoi)\n'.encode('ascii')
+        )
+
     def test_log_streaming(self):
         try:
             self.client.logs(fake_api.FAKE_CONTAINER_ID, stream=True)
@@ -768,8 +998,8 @@
             self.fail('Command should not raise exception: {0}'.format(e))
 
         fake_request.assert_called_with(
-            url_prefix + 'containers/3cc2351ab11b/attach',
-            params={'stream': 1, 'logs': 1, 'stderr': 1, 'stdout': 1},
+            url_prefix + 'containers/3cc2351ab11b/logs',
+            params={'timestamps': 0, 'follow': 1, 'stderr': 1, 'stdout': 1},
             timeout=docker.client.DEFAULT_TIMEOUT_SECONDS,
             stream=True
         )
@@ -808,27 +1038,30 @@
         )
 
     def test_stop_container(self):
+        timeout = 2
         try:
-            self.client.stop(fake_api.FAKE_CONTAINER_ID, timeout=2)
+            self.client.stop(fake_api.FAKE_CONTAINER_ID, timeout=timeout)
         except Exception as e:
             self.fail('Command should not raise exception: {0}'.format(e))
 
         fake_request.assert_called_with(
             url_prefix + 'containers/3cc2351ab11b/stop',
-            params={'t': 2},
-            timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
+            params={'t': timeout},
+            timeout=(docker.client.DEFAULT_TIMEOUT_SECONDS + timeout)
         )
 
     def test_stop_container_with_dict_instead_of_id(self):
+        timeout = 2
         try:
-            self.client.stop({'Id': fake_api.FAKE_CONTAINER_ID}, timeout=2)
+            self.client.stop({'Id': fake_api.FAKE_CONTAINER_ID},
+                             timeout=timeout)
         except Exception as e:
             self.fail('Command should not raise exception: {0}'.format(e))
 
         fake_request.assert_called_with(
             url_prefix + 'containers/3cc2351ab11b/stop',
-            params={'t': 2},
-            timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
+            params={'t': timeout},
+            timeout=(docker.client.DEFAULT_TIMEOUT_SECONDS + timeout)
         )
 
     def test_kill_container(self):
@@ -1125,6 +1358,11 @@
         try:
             self.client.insert(fake_api.FAKE_IMAGE_NAME,
                                fake_api.FAKE_URL, fake_api.FAKE_PATH)
+        except docker.errors.DeprecatedMethod as e:
+            self.assertTrue(
+                docker.utils.compare_version('1.12', self.client._version) >= 0
+            )
+            return
         except Exception as e:
             self.fail('Command should not raise exception: {0}'.format(e))
 
@@ -1139,12 +1377,38 @@
 
     def test_push_image(self):
         try:
-            self.client.push(fake_api.FAKE_IMAGE_NAME)
+            with mock.patch('docker.auth.auth.resolve_authconfig',
+                            fake_resolve_authconfig):
+                self.client.push(fake_api.FAKE_IMAGE_NAME)
         except Exception as e:
             self.fail('Command should not raise exception: {0}'.format(e))
 
         fake_request.assert_called_with(
             url_prefix + 'images/test_image/push',
+            params={
+                'tag': None
+            },
+            data='{}',
+            headers={'Content-Type': 'application/json'},
+            stream=False,
+            timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
+        )
+
+    def test_push_image_with_tag(self):
+        try:
+            with mock.patch('docker.auth.auth.resolve_authconfig',
+                            fake_resolve_authconfig):
+                self.client.push(
+                    fake_api.FAKE_IMAGE_NAME, tag=fake_api.FAKE_TAG_NAME
+                )
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+
+        fake_request.assert_called_with(
+            url_prefix + 'images/test_image/push',
+            params={
+                'tag': fake_api.FAKE_TAG_NAME,
+            },
             data='{}',
             headers={'Content-Type': 'application/json'},
             stream=False,
@@ -1153,12 +1417,17 @@
 
     def test_push_image_stream(self):
         try:
-            self.client.push(fake_api.FAKE_IMAGE_NAME, stream=True)
+            with mock.patch('docker.auth.auth.resolve_authconfig',
+                            fake_resolve_authconfig):
+                self.client.push(fake_api.FAKE_IMAGE_NAME, stream=True)
         except Exception as e:
             self.fail('Command should not raise exception: {0}'.format(e))
 
         fake_request.assert_called_with(
             url_prefix + 'images/test_image/push',
+            params={
+                'tag': None
+            },
             data='{}',
             headers={'Content-Type': 'application/json'},
             stream=True,
@@ -1218,6 +1487,30 @@
             timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
         )
 
+    def test_get_image(self):
+        try:
+            self.client.get_image(fake_api.FAKE_IMAGE_ID)
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+
+        fake_request.assert_called_with(
+            url_prefix + 'images/e9aa60c60128/get',
+            stream=True,
+            timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
+        )
+
+    def test_load_image(self):
+        try:
+            self.client.load_image('Byte Stream....')
+        except Exception as e:
+            self.fail('Command should not raise exception: {0}'.format(e))
+
+        fake_request.assert_called_with(
+            url_prefix + 'images/load',
+            data='Byte Stream....',
+            timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
+        )
+
     #################
     # BUILDER TESTS #
     #################
@@ -1291,11 +1584,13 @@
 
     def test_load_config_no_file(self):
         folder = tempfile.mkdtemp()
+        self.addCleanup(shutil.rmtree, folder)
         cfg = docker.auth.load_config(folder)
         self.assertTrue(cfg is not None)
 
     def test_load_config(self):
         folder = tempfile.mkdtemp()
+        self.addCleanup(shutil.rmtree, folder)
         f = open(os.path.join(folder, '.dockercfg'), 'w')
         auth_ = base64.b64encode(b'sakuya:izayoi').decode('ascii')
         f.write('auth = {0}\n'.format(auth_))
@@ -1310,6 +1605,26 @@
         self.assertEqual(cfg['email'], 'sakuya@scarlet.net')
         self.assertEqual(cfg.get('auth'), None)
 
+    def test_tar_with_excludes(self):
+        base = tempfile.mkdtemp()
+        self.addCleanup(shutil.rmtree, base)
+        for d in ['test/foo', 'bar']:
+            os.makedirs(os.path.join(base, d))
+            for f in ['a.txt', 'b.py', 'other.png']:
+                with open(os.path.join(base, d, f), 'w') as f:
+                    f.write("content")
+
+        for exclude, names in (
+                (['*.py'], ['bar/a.txt', 'bar/other.png',
+                            'test/foo/a.txt', 'test/foo/other.png']),
+                (['*.png', 'bar'], ['test/foo/a.txt', 'test/foo/b.py']),
+                (['test/foo', 'a.txt'], ['bar/a.txt', 'bar/b.py',
+                                         'bar/other.png']),
+        ):
+            archive = docker.utils.tar(base, exclude=exclude)
+            tar = tarfile.open(fileobj=archive)
+            self.assertEqual(sorted(tar.getnames()), names)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/lib/docker/tests/utils_test.py b/lib/docker/tests/utils_test.py
index 08b7b38..277781b 100644
--- a/lib/docker/tests/utils_test.py
+++ b/lib/docker/tests/utils_test.py
@@ -1,24 +1,57 @@
 import unittest
 
-from docker.utils import parse_repository_tag
+from docker.errors import DockerException
+from docker.utils import parse_repository_tag, parse_host
 
 
 class UtilsTest(unittest.TestCase):
+    longMessage = True
 
     def test_parse_repository_tag(self):
         self.assertEqual(parse_repository_tag("root"),
-                         ("root", ""))
+                         ("root", None))
         self.assertEqual(parse_repository_tag("root:tag"),
                          ("root", "tag"))
         self.assertEqual(parse_repository_tag("user/repo"),
-                         ("user/repo", ""))
+                         ("user/repo", None))
         self.assertEqual(parse_repository_tag("user/repo:tag"),
                          ("user/repo", "tag"))
         self.assertEqual(parse_repository_tag("url:5000/repo"),
-                         ("url:5000/repo", ""))
+                         ("url:5000/repo", None))
         self.assertEqual(parse_repository_tag("url:5000/repo:tag"),
                          ("url:5000/repo", "tag"))
 
+    def test_parse_host(self):
+        invalid_hosts = [
+            '0.0.0.0',
+            'tcp://',
+            'udp://127.0.0.1',
+            'udp://127.0.0.1:2375',
+        ]
+
+        valid_hosts = {
+            '0.0.0.1:5555': 'http://0.0.0.1:5555',
+            ':6666': 'http://127.0.0.1:6666',
+            'tcp://:7777': 'http://127.0.0.1:7777',
+            'http://:7777': 'http://127.0.0.1:7777',
+            'https://kokia.jp:2375': 'https://kokia.jp:2375',
+            '': 'http+unix://var/run/docker.sock',
+            None: 'http+unix://var/run/docker.sock',
+            'unix:///var/run/docker.sock': 'http+unix:///var/run/docker.sock',
+            'unix://': 'http+unix://var/run/docker.sock'
+        }
+
+        for host in invalid_hosts:
+            try:
+                parsed = parse_host(host)
+                self.fail('Expected to fail but success: %s -> %s' % (
+                    host, parsed
+                ))
+            except DockerException:
+                pass
+
+        for host, expected in valid_hosts.items():
+            self.assertEqual(parse_host(host), expected, msg=host)
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/lib/docker/tox.ini b/lib/docker/tox.ini
index d2507bf..77be554 100644
--- a/lib/docker/tox.ini
+++ b/lib/docker/tox.ini
@@ -1,11 +1,11 @@
 [tox]
-envlist = py26, py27, py32, py33, flake8
+envlist = py26, py27, py32, py33, py34, flake8
 skipsdist=True
 
 [testenv:py26]
 usedevelop=True
 commands =
-    {envpython} tests/test.py
+    {envbindir}/coverage run -p tests/test.py
 deps =
     -r{toxinidir}/requirements.txt
     -r{toxinidir}/test-requirements.txt
@@ -13,14 +13,18 @@
 [testenv:py27]
 usedevelop=True
 commands =
-    {envpython} tests/test.py
+    {envbindir}/coverage run -p tests/test.py
 deps =
     -r{toxinidir}/requirements.txt
     -r{toxinidir}/test-requirements.txt
+
 [testenv]
 usedevelop=True
 commands =
-    {envpython} tests/test.py
+    {envbindir}/coverage run -p tests/test.py
+    {envbindir}/coverage combine
+    {envbindir}/coverage report
+    {envbindir}/coverage html
 deps =
     -r{toxinidir}/requirements3.txt
     -r{toxinidir}/test-requirements.txt
diff --git a/lib/endpoints-1.0/endpoints/api_backend.py b/lib/endpoints-1.0/endpoints/api_backend.py
index 26ba70b..1513b3b 100644
--- a/lib/endpoints-1.0/endpoints/api_backend.py
+++ b/lib/endpoints-1.0/endpoints/api_backend.py
@@ -19,6 +19,8 @@
 """Interface to the BackendService that serves API configurations."""
 
 
+
+
 import logging
 
 from protorpc import message_types
diff --git a/lib/endpoints-1.0/endpoints/api_backend_service.py b/lib/endpoints-1.0/endpoints/api_backend_service.py
index 9b46357..da7792e 100644
--- a/lib/endpoints-1.0/endpoints/api_backend_service.py
+++ b/lib/endpoints-1.0/endpoints/api_backend_service.py
@@ -23,6 +23,8 @@
 
 
 
+
+
 try:
   import json
 except ImportError:
diff --git a/lib/endpoints-1.0/endpoints/api_config.py b/lib/endpoints-1.0/endpoints/api_config.py
index 103a075..2ba85d3 100644
--- a/lib/endpoints-1.0/endpoints/api_config.py
+++ b/lib/endpoints-1.0/endpoints/api_config.py
@@ -44,6 +44,9 @@
 
 
 
+
+
+
 try:
   import json
 except ImportError:
@@ -1876,16 +1879,15 @@
 
     return descriptor
 
-  def __method_descriptor(self, service, service_name, method_info,
-                          protorpc_method_name, protorpc_method_info):
+  def __method_descriptor(self, service, method_info,
+                          rosy_method, protorpc_method_info):
     """Describes a method.
 
     Args:
       service: endpoints.Service, Implementation of the API as a service.
-      service_name: string, Name of the service.
       method_info: _MethodInfo, Configuration for the method.
-      protorpc_method_name: string, Name of the method as given in the
-        ProtoRPC implementation.
+      rosy_method: string, ProtoRPC method name prefixed with the
+        name of the service.
       protorpc_method_info: protorpc.remote._RemoteMethodInfo, ProtoRPC
         description of the method.
 
@@ -1901,7 +1903,7 @@
 
     descriptor['path'] = method_info.get_path(service.api_info)
     descriptor['httpMethod'] = method_info.http_method
-    descriptor['rosyMethod'] = '%s.%s' % (service_name, protorpc_method_name)
+    descriptor['rosyMethod'] = rosy_method
     descriptor['request'] = self.__request_message_descriptor(
         request_kind, request_message_type,
         method_info.method_id(service.api_info),
@@ -1955,7 +1957,8 @@
     for service in services:
       protorpc_methods = service.all_remote_methods()
       for protorpc_method_name in protorpc_methods.iterkeys():
-        method_id = self.__id_from_name[protorpc_method_name]
+        rosy_method = '%s.%s' % (service.__name__, protorpc_method_name)
+        method_id = self.__id_from_name[rosy_method]
 
         request_response = {}
 
@@ -1971,7 +1974,6 @@
               '$ref': response_schema_id
               }
 
-        rosy_method = '%s.%s' % (service.__name__, protorpc_method_name)
         methods_desc[rosy_method] = request_response
 
     descriptor = {
@@ -2104,10 +2106,10 @@
         if method_info is None:
           continue
         method_id = method_info.method_id(service.api_info)
-        self.__id_from_name[protorpc_meth_name] = method_id
+        rosy_method = '%s.%s' % (service.__name__, protorpc_meth_name)
+        self.__id_from_name[rosy_method] = method_id
         method_map[method_id] = self.__method_descriptor(
-            service, service.__name__, method_info,
-            protorpc_meth_name, protorpc_meth_info)
+            service, method_info, rosy_method, protorpc_meth_info)
 
 
         if method_id in method_collision_tracker:
diff --git a/lib/endpoints-1.0/endpoints/api_exceptions.py b/lib/endpoints-1.0/endpoints/api_exceptions.py
index 283b579..26a5f27 100644
--- a/lib/endpoints-1.0/endpoints/api_exceptions.py
+++ b/lib/endpoints-1.0/endpoints/api_exceptions.py
@@ -18,6 +18,8 @@
 
 
 
+
+
 import httplib
 
 from protorpc import remote
diff --git a/lib/endpoints-1.0/endpoints/apiserving.py b/lib/endpoints-1.0/endpoints/apiserving.py
index a12648a..feee25a 100644
--- a/lib/endpoints-1.0/endpoints/apiserving.py
+++ b/lib/endpoints-1.0/endpoints/apiserving.py
@@ -61,6 +61,9 @@
 """
 
 
+
+
+
 import cgi
 import cStringIO
 import httplib
diff --git a/lib/endpoints-1.0/endpoints/message_parser.py b/lib/endpoints-1.0/endpoints/message_parser.py
index 256230d..06865d6 100644
--- a/lib/endpoints-1.0/endpoints/message_parser.py
+++ b/lib/endpoints-1.0/endpoints/message_parser.py
@@ -23,6 +23,8 @@
 """
 
 
+
+
 import re
 
 from protorpc import message_types
diff --git a/lib/endpoints-1.0/endpoints/protojson.py b/lib/endpoints-1.0/endpoints/protojson.py
index ed988be..bebbc86 100644
--- a/lib/endpoints-1.0/endpoints/protojson.py
+++ b/lib/endpoints-1.0/endpoints/protojson.py
@@ -19,6 +19,7 @@
 """Endpoints-specific implementation of ProtoRPC's ProtoJson class."""
 
 
+
 import base64
 
 from protorpc import messages
diff --git a/lib/endpoints-1.0/endpoints/users_id_token.py b/lib/endpoints-1.0/endpoints/users_id_token.py
index 8ba4b0b..111ee99 100644
--- a/lib/endpoints-1.0/endpoints/users_id_token.py
+++ b/lib/endpoints-1.0/endpoints/users_id_token.py
@@ -24,6 +24,8 @@
 """
 
 
+
+
 import base64
 
 try:
diff --git a/old_dev_appserver.py b/old_dev_appserver.py
index de775b6..833a338 100755
--- a/old_dev_appserver.py
+++ b/old_dev_appserver.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/php/sdk/google/appengine/datastore/entity_pb.php b/php/sdk/google/appengine/datastore/entity_pb.php
index 52d1c18..20a3c95 100644
--- a/php/sdk/google/appengine/datastore/entity_pb.php
+++ b/php/sdk/google/appengine/datastore/entity_pb.php
@@ -3457,7 +3457,6 @@
 }
 namespace storage_onestore_v3 {
   class SearchIndexEntry extends \google\net\ProtocolMessage {
-    private $division_family = array();
     public function getIndexId() {
       if (!isset($this->index_id)) {
         return "0";
@@ -3479,25 +3478,22 @@
     public function hasIndexId() {
       return isset($this->index_id);
     }
-    public function getDivisionFamilySize() {
-      return sizeof($this->division_family);
+    public function getWriteDivisionFamily() {
+      if (!isset($this->write_division_family)) {
+        return '';
+      }
+      return $this->write_division_family;
     }
-    public function getDivisionFamilyList() {
-      return $this->division_family;
-    }
-    public function getDivisionFamily($idx) {
-      return $this->division_family[$idx];
-    }
-    public function setDivisionFamily($idx, $val) {
-      $this->division_family[$idx] = $val;
+    public function setWriteDivisionFamily($val) {
+      $this->write_division_family = $val;
       return $this;
     }
-    public function addDivisionFamily($val) {
-      $this->division_family[] = $val;
+    public function clearWriteDivisionFamily() {
+      unset($this->write_division_family);
       return $this;
     }
-    public function clearDivisionFamily() {
-      $this->division_family = array();
+    public function hasWriteDivisionFamily() {
+      return isset($this->write_division_family);
     }
     public function getFingerprint1999() {
       if (!isset($this->fingerprint_1999)) {
@@ -3543,7 +3539,7 @@
     }
     public function clear() {
       $this->clearIndexId();
-      $this->clearDivisionFamily();
+      $this->clearWriteDivisionFamily();
       $this->clearFingerprint1999();
       $this->clearFingerprint2011();
     }
@@ -3553,10 +3549,9 @@
         $res += 1;
         $res += $this->lengthVarInt64($this->index_id);
       }
-      $this->checkProtoArray($this->division_family);
-      $res += 1 * sizeof($this->division_family);
-      foreach ($this->division_family as $value) {
-        $res += $this->lengthString(strlen($value));
+      if (isset($this->write_division_family)) {
+        $res += 1;
+        $res += $this->lengthString(strlen($this->write_division_family));
       }
       if (isset($this->fingerprint_1999)) {
         $res += 9;
@@ -3571,10 +3566,9 @@
         $out->putVarInt32(8);
         $out->putVarInt64($this->index_id);
       }
-      $this->checkProtoArray($this->division_family);
-      foreach ($this->division_family as $value) {
+      if (isset($this->write_division_family)) {
         $out->putVarInt32(18);
-        $out->putPrefixedString($value);
+        $out->putPrefixedString($this->write_division_family);
       }
       if (isset($this->fingerprint_1999)) {
         $out->putVarInt32(25);
@@ -3594,7 +3588,7 @@
             break;
           case 18:
             $length = $d->getVarInt32();
-            $this->addDivisionFamily(substr($d->buffer(), $d->pos(), $length));
+            $this->setWriteDivisionFamily(substr($d->buffer(), $d->pos(), $length));
             $d->skip($length);
             break;
           case 25:
@@ -3613,6 +3607,7 @@
     }
     public function checkInitialized() {
       if (!isset($this->index_id)) return 'index_id';
+      if (!isset($this->write_division_family)) return 'write_division_family';
       return null;
     }
     public function mergeFrom($x) {
@@ -3620,8 +3615,8 @@
       if ($x->hasIndexId()) {
         $this->setIndexId($x->getIndexId());
       }
-      foreach ($x->getDivisionFamilyList() as $v) {
-        $this->addDivisionFamily($v);
+      if ($x->hasWriteDivisionFamily()) {
+        $this->setWriteDivisionFamily($x->getWriteDivisionFamily());
       }
       if ($x->hasFingerprint1999()) {
         $this->setFingerprint1999($x->getFingerprint1999());
@@ -3634,10 +3629,8 @@
       if ($x === $this) { return true; }
       if (isset($this->index_id) !== isset($x->index_id)) return false;
       if (isset($this->index_id) && !$this->integerEquals($this->index_id, $x->index_id)) return false;
-      if (sizeof($this->division_family) !== sizeof($x->division_family)) return false;
-      foreach (array_map(null, $this->division_family, $x->division_family) as $v) {
-        if ($v[0] !== $v[1]) return false;
-      }
+      if (isset($this->write_division_family) !== isset($x->write_division_family)) return false;
+      if (isset($this->write_division_family) && $this->write_division_family !== $x->write_division_family) return false;
       if (isset($this->fingerprint_1999) !== isset($x->fingerprint_1999)) return false;
       if (isset($this->fingerprint_1999) && !$this->integerEquals($this->fingerprint_1999, $x->fingerprint_1999)) return false;
       if (isset($this->fingerprint_2011) !== isset($x->fingerprint_2011)) return false;
@@ -3649,8 +3642,8 @@
       if (isset($this->index_id)) {
         $res .= $prefix . "index_id: " . $this->debugFormatInt64($this->index_id) . "\n";
       }
-      foreach ($this->division_family as $value) {
-        $res .= $prefix . "division_family: " . $this->debugFormatString($value) . "\n";
+      if (isset($this->write_division_family)) {
+        $res .= $prefix . "write_division_family: " . $this->debugFormatString($this->write_division_family) . "\n";
       }
       if (isset($this->fingerprint_1999)) {
         $res .= $prefix . "fingerprint_1999: " . $this->debugFormatFixed64($this->fingerprint_1999) . "\n";
diff --git a/php_cli.py b/php_cli.py
index c47660d..4f1d74e 100755
--- a/php_cli.py
+++ b/php_cli.py
@@ -17,6 +17,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/remote_api_shell.py b/remote_api_shell.py
index de775b6..833a338 100755
--- a/remote_api_shell.py
+++ b/remote_api_shell.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting an appengine tool."""
 
 
+
 import os
 import sys
 
diff --git a/run_tests.py b/run_tests.py
index f05c059..0b263e9 100755
--- a/run_tests.py
+++ b/run_tests.py
@@ -17,6 +17,7 @@
 """Runs the unit test suite for devappserver2."""
 
 
+
 import argparse
 import cStringIO
 import logging
diff --git a/tools/bulkload_client.py b/tools/bulkload_client.py
index e9a71a1..0dc3808 100755
--- a/tools/bulkload_client.py
+++ b/tools/bulkload_client.py
@@ -20,6 +20,7 @@
 """Convenience wrapper for starting bulkload_client.py"""
 
 
+
 import os
 import sys